All checks were successful
CI / Format (push) Successful in 32s
CI / CUDA type-check (push) Successful in 1m37s
CI / Clippy (push) Successful in 3m22s
CI / Test (push) Successful in 7m4s
CI / Build cortex SRPM (push) Has been skipped
CI / Publish cortex to COPR (push) Has been skipped
CI / Build neuron SRPM (push) Has been skipped
CI / Publish neuron to COPR (push) Has been skipped
CI / Bump version in source (push) Has been skipped
Signing in upgrades the chat workspace from anonymous to account-scoped. - Auth context exposes accountId (resolved on login and on reload for an existing token) so the chat can scope its Dexie owner and the dashboard can query. - Chat: when authed, owner switches to the account id (anon history was already re-owned via claimAnonymousData on login), the anon message cap is lifted (budget is enforced upstream by the account allocation), the full default model (VITE_DEFAULT_MODEL) is used, and the user's API key is sent as the bearer. - The bearer is the raw key the user stored locally via "use for chat on this device" in the key-creation modal (client-side only — consistent with no server-side secrets). Signed in without a stored key → a banner prompts creating/enabling one (sending is disabled until then). - Error mapping: insufficient_quota → top-up link (/account) when authed, sign-up (/register) when anon; rate_limit_exceeded → a wait-and-retry hint; both distinct from generic errors. - New chat (topUp/rateLimited/needsKey/manageKeysLink) and account (keys.useForChat/usedForChat) i18n keys across all languages. Validated: lint, typecheck, build, i18n:check all green. Explicit-path commit; no node_modules/dist. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F6o3ddqmYNh9kzdwq6eowh
72 lines
2.0 KiB
JSON
72 lines
2.0 KiB
JSON
{
|
|
"login": {
|
|
"title": "Sign in",
|
|
"email": "Email",
|
|
"password": "Password",
|
|
"submit": "Sign in",
|
|
"noAccount": "No account? Sign up"
|
|
},
|
|
"register": {
|
|
"title": "Create your account",
|
|
"email": "Email",
|
|
"password": "Password",
|
|
"submit": "Sign up",
|
|
"haveAccount": "Already have an account? Sign in",
|
|
"checkEmail": "Almost there — check your email to verify your account."
|
|
},
|
|
"verify": {
|
|
"verifying": "Verifying…",
|
|
"ok": "Email verified. You can now sign in.",
|
|
"failed": "This verification link is invalid or has expired.",
|
|
"toLogin": "Go to sign in"
|
|
},
|
|
"reset": {
|
|
"requestTitle": "Reset your password",
|
|
"email": "Email",
|
|
"requestSubmit": "Send reset link",
|
|
"requestDone": "If that email has an account, a reset link is on its way.",
|
|
"confirmTitle": "Choose a new password",
|
|
"newPassword": "New password",
|
|
"confirmSubmit": "Set password",
|
|
"ok": "Password updated. You can now sign in."
|
|
},
|
|
"dashboard": {
|
|
"title": "Account",
|
|
"balance": "Allocation",
|
|
"total": "Total",
|
|
"spent": "Spent",
|
|
"reserved": "Reserved",
|
|
"remaining": "Remaining",
|
|
"manageKeys": "Manage API keys",
|
|
"redeemTitle": "Redeem a top-up code",
|
|
"redeemPlaceholder": "helexa-topup-…",
|
|
"redeem": "Redeem",
|
|
"redeemed": "Code redeemed.",
|
|
"logout": "Sign out"
|
|
},
|
|
"keys": {
|
|
"title": "API keys",
|
|
"create": "Create key",
|
|
"label": "Label",
|
|
"limitKind": "Limit",
|
|
"percent": "% of allocation",
|
|
"hardcap": "Hard cap (tokens)",
|
|
"value": "Value",
|
|
"none": "No keys yet.",
|
|
"createdTitle": "Your new API key",
|
|
"createdWarn": "Copy it now — you won't see it again.",
|
|
"copy": "Copy",
|
|
"copied": "Copied",
|
|
"archive": "Archive",
|
|
"save": "Save",
|
|
"status": "Status",
|
|
"usage": "Used",
|
|
"useForChat": "Use for chat on this device",
|
|
"usedForChat": "Enabled for chat ✓"
|
|
},
|
|
"error": {
|
|
"generic": "Something went wrong.",
|
|
"unauthorized": "Please sign in again."
|
|
}
|
|
}
|