dsh-coding-subscription-oauth 0.6.0 → 0.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/CONTRIBUTING.md +0 -0
- package/INSTALL.md +9 -8
- package/LICENSE +0 -0
- package/NOTICE +0 -0
- package/README.de.md +7 -8
- package/README.es.md +7 -8
- package/README.fr.md +7 -8
- package/README.ja.md +7 -8
- package/README.ko.md +7 -8
- package/README.md +8 -9
- package/README.pt-BR.md +7 -8
- package/README.ru.md +7 -8
- package/README.zh-CN.md +8 -9
- package/compatibility/dsh-bom.json +17 -30
- package/cordis.patch.yml +0 -0
- package/docs/00-project-rules.md +0 -0
- package/docs/02-architecture.md +1 -1
- package/docs/02-architecture.zh-CN.md +1 -1
- package/lib/adapter.d.ts.map +1 -1
- package/lib/alias-adapter.d.ts +3 -1
- package/lib/alias-adapter.d.ts.map +1 -1
- package/lib/bin.js +3 -3
- package/lib/bin.js.map +1 -1
- package/lib/client.js +3 -3
- package/lib/client.js.map +4 -4
- package/lib/compatibility.d.ts +14 -14
- package/lib/dsh-host-adapter.d.ts.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +109 -79
- package/lib/index.js.map +3 -3
- package/media/en/settings_accounts.png +0 -0
- package/media/en/settings_capabilities.png +0 -0
- package/media/en/settings_gateway.png +0 -0
- package/media/settings_accounts.png +0 -0
- package/media/settings_capabilities.png +0 -0
- package/media/settings_gateway.png +0 -0
- package/media/settings_overview.png +0 -0
- package/media/zh-CN/settings_accounts.png +0 -0
- package/media/zh-CN/settings_capabilities.png +0 -0
- package/media/zh-CN/settings_gateway.png +0 -0
- package/package.json +38 -38
- package/patches/dsh-agy@0.1.2.patch +0 -0
- package/scripts/release.mjs +0 -0
- package/scripts/smoke-deployed-routes.mjs +0 -0
- package/scripts/verify-deployed-catalog.mjs +0 -0
- package/src/adapter.ts +75 -14
- package/src/alias-adapter.ts +17 -23
- package/src/auth-routes.ts +0 -0
- package/src/auth.ts +0 -0
- package/src/bin.ts +0 -0
- package/src/capability-routes.ts +0 -0
- package/src/capability-runtime.ts +0 -0
- package/src/capability-settings.ts +0 -0
- package/src/capability-tools.ts +0 -0
- package/src/catalog.ts +0 -0
- package/src/client/GrokBuildSettings.tsx +0 -0
- package/src/client/api.ts +0 -0
- package/src/client/components/AboutTab.tsx +0 -0
- package/src/client/components/AccountsTab.tsx +0 -0
- package/src/client/components/Badge.tsx +0 -0
- package/src/client/components/CapabilitiesTab.tsx +0 -0
- package/src/client/components/CliPullPreview.tsx +0 -0
- package/src/client/components/CopyButton.tsx +0 -0
- package/src/client/components/GatewayTab.tsx +0 -0
- package/src/client/components/NoticeBanner.tsx +0 -0
- package/src/client/components/ProgressBar.tsx +0 -0
- package/src/client/components/ProviderCard.tsx +0 -0
- package/src/client/components/SettingsTabs.tsx +0 -0
- package/src/client/components/ToggleSwitch.tsx +0 -0
- package/src/client/constants.ts +1 -1
- package/src/client/display.ts +0 -0
- package/src/client/dshClientAdapter.ts +32 -14
- package/src/client/gatewaySnippets.ts +0 -0
- package/src/client/index.tsx +3 -3
- package/src/client/locales.ts +0 -0
- package/src/client/microStyles.ts +0 -0
- package/src/client/parsers.ts +0 -0
- package/src/client/styles.ts +0 -0
- package/src/client/types.ts +0 -0
- package/src/codex-http.ts +0 -0
- package/src/codex-images.ts +0 -0
- package/src/codex-model-capabilities.ts +0 -0
- package/src/codex-search.ts +0 -0
- package/src/codex-usage.ts +0 -0
- package/src/compatibility.ts +14 -14
- package/src/dsh-host-adapter.ts +8 -6
- package/src/gateway-anthropic-messages.ts +0 -0
- package/src/gateway-auth.ts +0 -0
- package/src/gateway-backend.ts +0 -0
- package/src/gateway-body.ts +0 -0
- package/src/gateway-config.ts +0 -0
- package/src/gateway-http.ts +0 -0
- package/src/gateway-openai-chat.ts +0 -0
- package/src/gateway-openai-responses.ts +0 -0
- package/src/gateway-parse.ts +0 -0
- package/src/gateway-protocol.ts +0 -0
- package/src/gateway-routes.ts +0 -0
- package/src/gateway.ts +0 -0
- package/src/grok-errors.ts +0 -0
- package/src/grok-imagine.ts +0 -0
- package/src/grok-import.ts +0 -0
- package/src/http-json.ts +0 -0
- package/src/ids.ts +0 -0
- package/src/imagine-routes.ts +0 -0
- package/src/index.ts +26 -39
- package/src/invariant.ts +0 -0
- package/src/kimi-errors.ts +0 -0
- package/src/media-store.ts +0 -0
- package/src/oauth-import-routes.ts +0 -0
- package/src/oauth-providers.ts +0 -0
- package/src/oauth-session.ts +0 -0
- package/src/oauth-sources.ts +0 -0
- package/src/oauth.ts +0 -0
- package/src/provider.ts +0 -0
- package/src/proxy.ts +0 -0
- package/src/redact.ts +0 -0
- package/src/session.ts +0 -0
- package/src/store.ts +0 -0
- package/src/web-origin.ts +0 -0
- package/src/web-routes.ts +0 -0
package/lib/client.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../src/client/index.tsx", "../../src/client/dshClientAdapter.ts", "../../src/client/GrokBuildSettings.tsx", "../../node_modules/.pnpm/dsh-coding-oauth-core@
|
|
4
|
-
"sourcesContent": ["/** Browser half: coding-subscription account management inside dsh Settings. */\r\n\r\nimport type {} from \"@deepseek-ai/dsh-client-locale/client\";\r\nimport type { ClientContext } from \"@deepseek-ai/dsh-client-runtime/client\";\r\nimport type {} from \"@deepseek-ai/dsh-client-ui-settings/client\";\r\nimport type {} from \"@deepseek-ai/dsh-client-ui-slots\";\r\nimport { useEffect, useRef, useState } from \"react\";\r\nimport { createRoot } from \"react-dom/client\";\r\nimport { createDshClientAdapter } from \"./dshClientAdapter.ts\";\r\nimport type { GrokBuildSettingsInjected } from \"./GrokBuildSettings.tsx\";\r\nimport { GrokBuildSettings } from \"./GrokBuildSettings.tsx\";\r\nimport type { GrokBuildSettingsKey } from \"./locales.ts\";\r\nimport { en, zh } from \"./locales.ts\";\r\n\r\ndeclare module \"@deepseek-ai/dsh-client-ui-slots\" {\r\n\tinterface LocaleNamespaceMap {\r\n\t\t\"settings.grok-build\": GrokBuildSettingsKey;\r\n\t}\r\n}\r\n\r\nexport const name = \"dsh-grok-build-client\";\r\nexport const inject = [\"locale\"];\r\n\r\nfunction IndependentSettingsEntry({ t }: { readonly t: GrokBuildSettingsInjected[\"t\"] }) {\r\n\tconst [open, setOpen] = useState(false);\r\n\tconst trigger = useRef<HTMLButtonElement>(null);\r\n\tconst closeButton = useRef<HTMLButtonElement>(null);\r\n\tconst dialog = useRef<HTMLDivElement>(null);\r\n\tuseEffect(() => {\r\n\t\tif (!open) return;\r\n\t\tcloseButton.current?.focus();\r\n\t\tconst host = dialog.current?.closest(\"[data-dsh-coding-oauth]\")?.parentElement;\r\n\t\tconst inertSiblings =\r\n\t\t\thost === undefined || host === null\r\n\t\t\t\t? []\r\n\t\t\t\t: [...document.body.children]\r\n\t\t\t\t\t\t.filter((element) => element !== host)\r\n\t\t\t\t\t\t.map((element) => ({\r\n\t\t\t\t\t\t\telement,\r\n\t\t\t\t\t\t\thadInert: element.hasAttribute(\"inert\"),\r\n\t\t\t\t\t\t\tvalue: element.getAttribute(\"inert\"),\r\n\t\t\t\t\t\t}));\r\n\t\tfor (const { element } of inertSiblings) element.setAttribute(\"inert\", \"\");\r\n\t\tconst focusable = (): HTMLElement[] =>\r\n\t\t\t[\r\n\t\t\t\t...(dialog.current?.querySelectorAll<HTMLElement>(\r\n\t\t\t\t\t'button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])',\r\n\t\t\t\t) ?? []),\r\n\t\t\t].filter((element) => element.getClientRects().length > 0);\r\n\t\tconst closeOnEscape = (event: KeyboardEvent): void => {\r\n\t\t\tif (event.key === \"Escape\") setOpen(false);\r\n\t\t\tif (event.key !== \"Tab\") return;\r\n\t\t\tconst targets = focusable();\r\n\t\t\tif (targets.length === 0) {\r\n\t\t\t\tevent.preventDefault();\r\n\t\t\t\tdialog.current?.focus();\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tconst first = targets[0]!;\r\n\t\t\tconst last = targets.at(-1)!;\r\n\t\t\tif (event.shiftKey && document.activeElement === first) {\r\n\t\t\t\tevent.preventDefault();\r\n\t\t\t\tlast.focus();\r\n\t\t\t} else if (!event.shiftKey && document.activeElement === last) {\r\n\t\t\t\tevent.preventDefault();\r\n\t\t\t\tfirst.focus();\r\n\t\t\t}\r\n\t\t};\r\n\t\tdocument.addEventListener(\"keydown\", closeOnEscape);\r\n\t\treturn () => {\r\n\t\t\tdocument.removeEventListener(\"keydown\", closeOnEscape);\r\n\t\t\tfor (const { element, hadInert, value } of inertSiblings) {\r\n\t\t\t\tif (hadInert) element.setAttribute(\"inert\", value ?? \"\");\r\n\t\t\t\telse element.removeAttribute(\"inert\");\r\n\t\t\t}\r\n\t\t\tif (trigger.current?.isConnected) trigger.current.focus();\r\n\t\t};\r\n\t}, [open]);\r\n\treturn (\r\n\t\t<div data-dsh-coding-oauth>\r\n\t\t\t<button\r\n\t\t\t\tref={trigger}\r\n\t\t\t\ttype=\"button\"\r\n\t\t\t\tstyle={{ position: \"fixed\", right: 16, bottom: 16, zIndex: 30, padding: \"10px 14px\" }}\r\n\t\t\t\tonClick={() => setOpen(true)}\r\n\t\t\t>\r\n\t\t\t\t{t(\"nav\")}\r\n\t\t\t</button>\r\n\t\t\t{open ? (\r\n\t\t\t\t<div\r\n\t\t\t\t\tref={dialog}\r\n\t\t\t\t\trole=\"dialog\"\r\n\t\t\t\t\taria-modal=\"true\"\r\n\t\t\t\t\taria-labelledby=\"coding-oauth-independent-title\"\r\n\t\t\t\t\ttabIndex={-1}\r\n\t\t\t\t\tstyle={{\r\n\t\t\t\t\t\tposition: \"fixed\",\r\n\t\t\t\t\t\tinset: 0,\r\n\t\t\t\t\t\tzIndex: 31,\r\n\t\t\t\t\t\toverflow: \"auto\",\r\n\t\t\t\t\t\tpadding: 20,\r\n\t\t\t\t\t\tbackground: \"var(--dsw-alias-bg-layer-1)\",\r\n\t\t\t\t\t}}\r\n\t\t\t\t>\r\n\t\t\t\t\t<div style={{ width: \"min(780px, 100%)\", margin: \"0 auto\" }}>\r\n\t\t\t\t\t\t<div style={{ display: \"flex\", justifyContent: \"space-between\", gap: 12, marginBottom: 12 }}>\r\n\t\t\t\t\t\t\t<h2 id=\"coding-oauth-independent-title\" style={{ margin: 0 }}>\r\n\t\t\t\t\t\t\t\t{t(\"title\")}\r\n\t\t\t\t\t\t\t</h2>\r\n\t\t\t\t\t\t\t<button ref={closeButton} type=\"button\" onClick={() => setOpen(false)} aria-label={t(\"cancel\")}>\r\n\t\t\t\t\t\t\t\t\u00D7\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t<GrokBuildSettings t={t} />\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t) : null}\r\n\t\t</div>\r\n\t);\r\n}\r\n\r\nfunction mountIndependentEntry(t: GrokBuildSettingsInjected[\"t\"]): () => void {\r\n\tif (typeof document === \"undefined\") return () => undefined;\r\n\tconst host = document.createElement(\"div\");\r\n\tdocument.body.append(host);\r\n\tconst root = createRoot(host);\r\n\troot.render(<IndependentSettingsEntry t={t} />);\r\n\treturn () => {\r\n\t\troot.unmount();\r\n\t\thost.remove();\r\n\t};\r\n}\r\n\r\nexport function apply(ctx: ClientContext): void {\r\n\tconst dsh = createDshClientAdapter(ctx);\r\n\tdsh.assertCompatible();\r\n\tconst namespace = \"settings.grok-build\";\r\n\tdsh.effect(() => dsh.locale.register(namespace, { zh, en }), \"dsh-coding-subscription-oauth: settings copy\");\r\n\tconst t = dsh.locale.bind(namespace) as GrokBuildSettingsInjected[\"t\"];\r\n\tdsh.installSlots({\r\n\t\tmountFallback: () => mountIndependentEntry(t),\r\n\t\tregister: (slotContext) =>\r\n\t\t\tslotContext.slots.inject(\"settings.section\", () =>\r\n\t\t\t\tslotContext.slots.register(\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tname: \"settings.section\",\r\n\t\t\t\t\t\tid: \"grok-build\",\r\n\t\t\t\t\t\torder: 17,\r\n\t\t\t\t\t\tlabel: () => t(\"nav\"),\r\n\t\t\t\t\t\tinject: (): GrokBuildSettingsInjected => ({ t }),\r\n\t\t\t\t\t},\r\n\t\t\t\t\tGrokBuildSettings,\r\n\t\t\t\t),\r\n\t\t\t),\r\n\t});\r\n}\r\n", "/** Capability adapter for the unstable DSH browser client surface. */\r\n\r\nimport type {} from \"@deepseek-ai/dsh-client-locale/client\";\r\nimport type { ClientContext } from \"@deepseek-ai/dsh-client-runtime/client\";\r\nimport type {} from \"@deepseek-ai/dsh-client-ui-slots\";\r\n\r\nexport interface DshClientCompatibilityDiagnostic {\r\n\treadonly id: string;\r\n\treadonly level: \"warning\" | \"error\";\r\n\treadonly message: string;\r\n\treadonly expected: \"function\";\r\n\treadonly actual: string;\r\n}\r\n\r\nfunction hasSlots(context: unknown): context is ClientContext {\r\n\tif (typeof context !== \"object\" || context === null) return false;\r\n\tconst slots = (context as { readonly slots?: unknown }).slots;\r\n\treturn (\r\n\t\ttypeof slots === \"object\" &&\r\n\t\tslots !== null &&\r\n\t\ttypeof (slots as { readonly inject?: unknown }).inject === \"function\" &&\r\n\t\ttypeof (slots as { readonly register?: unknown }).register === \"function\"\r\n\t);\r\n}\r\n\r\nexport interface DshClientAdapter {\r\n\treadonly context: ClientContext;\r\n\treadonly locale: ClientContext[\"locale\"];\r\n\treadonly effect: ClientContext[\"effect\"];\r\n\tdiagnostics(): readonly DshClientCompatibilityDiagnostic[];\r\n\tassertCompatible(): void;\r\n\tinstallSlots(options: {\r\n\t\treadonly register: (context: ClientContext) => () => void;\r\n\t\treadonly mountFallback: () => () => void;\r\n\t}): void;\r\n}\r\n\r\ntype InstallSlotsOptions = Parameters<DshClientAdapter[\"installSlots\"]>[0];\r\n\r\nexport function createDshClientAdapter(context: ClientContext): DshClientAdapter {\r\n\tconst candidate = context as unknown as Record<string, unknown>;\r\n\tconst locale = candidate[\"locale\"] as Record<string, unknown> | undefined;\r\n\tconst checks: Array<[string, unknown, DshClientCompatibilityDiagnostic[\"level\"]]> = [\r\n\t\t[\"client.effect\", candidate[\"effect\"], \"error\"],\r\n\t\t[\"client.locale.register\", locale?.[\"register\"], \"error\"],\r\n\t\t[\"client.locale.bind\", locale?.[\"bind\"], \"error\"],\r\n\t\t[\"client.slots.inject\", (candidate[\"slots\"] as Record<string, unknown> | undefined)?.[\"inject\"], \"warning\"],\r\n\t];\r\n\tconst diagnostics = checks.flatMap(([id, value, level]): DshClientCompatibilityDiagnostic[] =>\r\n\t\ttypeof value === \"function\"\r\n\t\t\t? []\r\n\t\t\t: [\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tid,\r\n\t\t\t\t\t\tlevel,\r\n\t\t\t\t\t\tmessage:\r\n\t\t\t\t\t\t\tlevel === \"warning\"\r\n\t\t\t\t\t\t\t\t? `${id} is unavailable; the independent settings entry remains active`\r\n\t\t\t\t\t\t\t\t: `${id} is unavailable in the DSH client runtime`,\r\n\t\t\t\t\t\texpected: \"function\",\r\n\t\t\t\t\t\tactual: typeof value,\r\n\t\t\t\t\t},\r\n\t\t\t\t],\r\n\t);\r\n\tconst frozenDiagnostics = Object.freeze([...diagnostics]);\r\n\treturn Object.freeze({\r\n\t\tcontext,\r\n\t\tlocale: context.locale,\r\n\t\teffect: context.effect,\r\n\t\tdiagnostics: () => frozenDiagnostics,\r\n\t\tassertCompatible() {\r\n\t\t\tconst errors = diagnostics.filter((item) => item.level === \"error\");\r\n\t\t\tif (errors.length > 0) {\r\n\t\t\t\tthrow new Error(`incompatible DSH client API: ${errors.map((item) => item.id).join(\", \")}`);\r\n\t\t\t}\r\n\t\t},\r\n\t\tinstallSlots(options: InstallSlotsOptions) {\r\n\t\t\tlet disposed = false;\r\n\t\t\tlet installed = false;\r\n\t\t\tlet disposeCurrent: () => void = () => undefined;\r\n\t\t\tconst install = (slotContext: ClientContext): void => {\r\n\t\t\t\tif (disposed || installed) return;\r\n\t\t\t\tinstalled = true;\r\n\t\t\t\tdisposeCurrent();\r\n\t\t\t\tdisposeCurrent = options.register(slotContext);\r\n\t\t\t};\r\n\r\n\t\t\tif (hasSlots(context)) {\r\n\t\t\t\tinstall(context);\r\n\t\t\t} else {\r\n\t\t\t\tdisposeCurrent = options.mountFallback();\r\n\t\t\t\tconst inject = candidate[\"inject\"];\r\n\t\t\t\tif (typeof inject === \"function\") {\r\n\t\t\t\t\t(inject as ClientContext[\"inject\"]).call(context, [\"slots\"], (slotContext) => {\r\n\t\t\t\t\t\tif (hasSlots(slotContext)) install(slotContext);\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tcontext.effect(\r\n\t\t\t\t() => () => {\r\n\t\t\t\t\tdisposed = true;\r\n\t\t\t\t\tdisposeCurrent();\r\n\t\t\t\t},\r\n\t\t\t\t\"dsh-coding-subscription-oauth: independent settings entry\",\r\n\t\t\t);\r\n\t\t},\r\n\t});\r\n}\r\n", "/** Plugin-owned coding subscription account section inside the dsh Settings shell. */\r\n\r\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\r\nimport { cancelPreviewTicket, copyText, isConflictError, isConsumedPreviewError, jsonRequest } from \"./api.ts\";\r\nimport { AboutTab } from \"./components/AboutTab.tsx\";\r\nimport { AccountsTab } from \"./components/AccountsTab.tsx\";\r\nimport { CapabilitiesTab } from \"./components/CapabilitiesTab.tsx\";\r\nimport { GatewayTab } from \"./components/GatewayTab.tsx\";\r\nimport type { SettingsTabHint } from \"./components/SettingsTabs.tsx\";\r\nimport { SettingsTabs } from \"./components/SettingsTabs.tsx\";\r\nimport {\r\n\tCAPABILITIES_PATH,\r\n\tCODEX_USAGE_PATH,\r\n\tGATEWAY_PATH,\r\n\tGATEWAY_REVEAL_PATH,\r\n\tGATEWAY_ROTATE_PATH,\r\n\tIMAGINE_CREDENTIAL_PATH,\r\n\tLOGIN_CANCEL_PATH,\r\n\tLOGIN_CODE_PATH,\r\n\tLOGIN_PATH,\r\n\tLOGOUT_PATH,\r\n\tMODELS_PATH,\r\n\tPOLL_INTERVAL_MS,\r\n\tSOURCE_COMMIT_ACTION_KEY,\r\n\tSOURCES_CANCEL_PATH,\r\n\tSOURCES_COMMIT_PATH,\r\n\tSOURCES_PATH,\r\n\tSOURCES_PREVIEW_PATH,\r\n\tSTATUS_PATH,\r\n} from \"./constants.ts\";\r\nimport { ensureMicroStyles } from \"./microStyles.ts\";\r\nimport {\r\n\temptyCapabilitySettings,\r\n\tmergeSources,\r\n\tparseCapabilities,\r\n\tparseCommitAction,\r\n\tparseGateway,\r\n\tparseGatewayPort,\r\n\tparseImagineCredential,\r\n\tparsePreview,\r\n\tparseSources,\r\n\tparseUsage,\r\n} from \"./parsers.ts\";\r\nimport { bodyStyle, buttonStyle, errorStyle, pageStyle, panelStyle, titleStyle } from \"./styles.ts\";\r\nimport type {\r\n\tCapabilitySettingKey,\r\n\tCapabilitySettingsView,\r\n\tCapabilitySnapshot,\r\n\tCodingOAuthStatus,\r\n\tCopyField,\r\n\tGatewayView,\r\n\tGrokBuildSettingsProps,\r\n\tImagineCredentialView,\r\n\tLoginChallenge,\r\n\tLoginMethod,\r\n\tProviderSlug,\r\n\tSettingsTabId,\r\n\tSourceKind,\r\n\tSourcePreview,\r\n\tSourceStatus,\r\n\tUsageView,\r\n} from \"./types.ts\";\r\n\r\nexport type { GrokBuildSettingsInjected, GrokBuildSettingsProps } from \"./types.ts\";\r\n\r\nconst REMOTE_TIP_STORAGE_KEY = \"dsh-coding-oauth-remote-tip-dismissed\";\r\n\r\nfunction readRemoteTipDismissed(): boolean {\r\n\ttry {\r\n\t\treturn globalThis.sessionStorage?.getItem(REMOTE_TIP_STORAGE_KEY) === \"1\";\r\n\t} catch {\r\n\t\treturn false;\r\n\t}\r\n}\r\n\r\n/** Multi-provider coding subscription status and OAuth actions. */\r\nexport function GrokBuildSettings({ t }: GrokBuildSettingsProps) {\r\n\tif (t === undefined) throw new Error(\"Coding OAuth settings requires its translation function\");\r\n\r\n\tconst [status, setStatus] = useState<CodingOAuthStatus | undefined>(undefined);\r\n\tconst [requestError, setRequestError] = useState<string | undefined>(undefined);\r\n\tconst [busyProvider, setBusyProvider] = useState<ProviderSlug | undefined>(undefined);\r\n\tconst [codeInputs, setCodeInputs] = useState<Partial<Record<ProviderSlug, string>>>({});\r\n\tconst [popupBlocked, setPopupBlocked] = useState<Partial<Record<ProviderSlug, boolean>>>({});\r\n\tconst [sources, setSources] = useState<SourceStatus[] | undefined>(undefined);\r\n\tconst [sourcesError, setSourcesError] = useState<string | undefined>(undefined);\r\n\tconst [sourcesBusy, setSourcesBusy] = useState(false);\r\n\tconst [preview, setPreview] = useState<SourcePreview | undefined>(undefined);\r\n\tconst previewRef = useRef<SourcePreview | undefined>(undefined);\r\n\tconst previewEpochRef = useRef(0);\r\n\tconst mountedRef = useRef(true);\r\n\tconst [confirmOverwrite, setConfirmOverwrite] = useState(false);\r\n\tconst [sourcesNotice, setSourcesNotice] = useState<string | undefined>(undefined);\r\n\tconst [capabilities, setCapabilities] = useState<CapabilitySnapshot | undefined>(undefined);\r\n\tconst [capabilitiesError, setCapabilitiesError] = useState<string | undefined>(undefined);\r\n\tconst [capabilitiesBusy, setCapabilitiesBusy] = useState(false);\r\n\tconst [capabilitiesLoaded, setCapabilitiesLoaded] = useState(false);\r\n\tconst [usage, setUsage] = useState<UsageView | undefined>(undefined);\r\n\tconst [usageError, setUsageError] = useState<string | undefined>(undefined);\r\n\tconst [usageLoading, setUsageLoading] = useState(false);\r\n\tconst [imagine, setImagine] = useState<ImagineCredentialView | undefined>(undefined);\r\n\tconst [imagineError, setImagineError] = useState<string | undefined>(undefined);\r\n\tconst [gateway, setGateway] = useState<GatewayView | undefined>(undefined);\r\n\tconst [gatewayError, setGatewayError] = useState<string | undefined>(undefined);\r\n\tconst [gatewayBusy, setGatewayBusy] = useState(false);\r\n\tconst [gatewayLoaded, setGatewayLoaded] = useState(false);\r\n\tconst [gatewayOnceKey, setGatewayOnceKey] = useState<string | undefined>(undefined);\r\n\tconst [gatewayKeyVisible, setGatewayKeyVisible] = useState(false);\r\n\tconst [gatewayRotateConfirm, setGatewayRotateConfirm] = useState(false);\r\n\tconst [gatewayRevealError, setGatewayRevealError] = useState<string | undefined>(undefined);\r\n\tconst [portDraft, setPortDraft] = useState(\"\");\r\n\tconst [activeTab, setActiveTab] = useState<SettingsTabId>(\"accounts\");\r\n\tconst [copiedField, setCopiedField] = useState<CopyField | undefined>(undefined);\r\n\tconst [copyFailedField, setCopyFailedField] = useState<CopyField | undefined>(undefined);\r\n\tconst [expandedProviders, setExpandedProviders] = useState<Partial<Record<ProviderSlug, boolean>>>({});\r\n\tconst [remoteTipDismissed, setRemoteTipDismissed] = useState(readRemoteTipDismissed);\r\n\tconst copiedTimerRef = useRef<number | undefined>(undefined);\r\n\tconst remote = status?.accessMode === \"ssh-tunnel\" || status?.accessMode === \"trusted-https-proxy\";\r\n\r\n\tconst refresh = useCallback(async () => {\r\n\t\ttry {\r\n\t\t\tconst next = await jsonRequest<CodingOAuthStatus>(STATUS_PATH);\r\n\t\t\tsetStatus(next);\r\n\t\t\tsetRequestError(undefined);\r\n\t\t\treturn next;\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetRequestError(error instanceof Error ? error.message : t(\"requestFailed\"));\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\t}, [t]);\r\n\r\n\tconst refreshSources = useCallback(async () => {\r\n\t\ttry {\r\n\t\t\tsetSources(parseSources(await jsonRequest<unknown>(SOURCES_PATH)));\r\n\t\t\tsetSourcesError(undefined);\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetSources(mergeSources([]));\r\n\t\t\tsetSourcesError(error instanceof Error ? error.message : t(\"sourcesLoadFailed\"));\r\n\t\t}\r\n\t}, [t]);\r\n\r\n\tconst refreshCapabilities = useCallback(async () => {\r\n\t\ttry {\r\n\t\t\tconst parsed = parseCapabilities(await jsonRequest<unknown>(CAPABILITIES_PATH));\r\n\t\t\tsetCapabilities(parsed ?? { value: emptyCapabilitySettings(), revision: 0, writable: false });\r\n\t\t\tsetCapabilitiesError(undefined);\r\n\t\t\treturn parsed;\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetCapabilities({ value: emptyCapabilitySettings(), revision: 0, writable: false });\r\n\t\t\tsetCapabilitiesError(error instanceof Error ? error.message : t(\"capabilitiesLoadFailed\"));\r\n\t\t\treturn undefined;\r\n\t\t} finally {\r\n\t\t\tsetCapabilitiesLoaded(true);\r\n\t\t}\r\n\t}, [t]);\r\n\r\n\tconst refreshGateway = useCallback(async () => {\r\n\t\ttry {\r\n\t\t\tsetGateway(parseGateway(await jsonRequest<unknown>(GATEWAY_PATH)));\r\n\t\t\tsetGatewayError(undefined);\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetGatewayError(error instanceof Error ? error.message : t(\"gatewayLoadFailed\"));\r\n\t\t} finally {\r\n\t\t\tsetGatewayLoaded(true);\r\n\t\t}\r\n\t}, [t]);\r\n\r\n\tconst refreshImagine = useCallback(async () => {\r\n\t\ttry {\r\n\t\t\tsetImagine(parseImagineCredential(await jsonRequest<unknown>(IMAGINE_CREDENTIAL_PATH)));\r\n\t\t\tsetImagineError(undefined);\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetImagineError(error instanceof Error ? error.message : t(\"imagineLoadFailed\"));\r\n\t\t}\r\n\t}, [t]);\r\n\r\n\tconst refreshUsage = useCallback(async () => {\r\n\t\tsetUsageLoading(true);\r\n\t\ttry {\r\n\t\t\tsetUsage(parseUsage(await jsonRequest<unknown>(CODEX_USAGE_PATH)));\r\n\t\t\tsetUsageError(undefined);\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetUsage(undefined);\r\n\t\t\tsetUsageError(error instanceof Error ? error.message : t(\"usageUnavailable\"));\r\n\t\t} finally {\r\n\t\t\tsetUsageLoading(false);\r\n\t\t}\r\n\t}, [t]);\r\n\r\n\t// Accounts: status immediately; sources shortly after (non-blocking for first paint).\r\n\tuseEffect(() => {\r\n\t\tensureMicroStyles();\r\n\t\tlet active = true;\r\n\t\tlet timer: number | undefined;\r\n\t\tvoid refresh().then((next) => {\r\n\t\t\tif (!active || next?.uiOwner === \"hub\") return;\r\n\t\t\ttimer = window.setTimeout(() => void refreshSources(), 0);\r\n\t\t});\r\n\t\treturn () => {\r\n\t\t\tactive = false;\r\n\t\t\tif (timer !== undefined) window.clearTimeout(timer);\r\n\t\t};\r\n\t}, [refresh, refreshSources]);\r\n\r\n\t// Capabilities tab: load settings + Imagine status on first visit.\r\n\tuseEffect(() => {\r\n\t\tif (activeTab !== \"capabilities\") return;\r\n\t\tif (!capabilitiesLoaded) void refreshCapabilities();\r\n\t\tvoid refreshImagine();\r\n\t}, [activeTab, capabilitiesLoaded, refreshCapabilities, refreshImagine]);\r\n\r\n\t// Soft-fetch capabilities when Codex is signed in so Accounts can show quota without opening the tab.\r\n\tuseEffect(() => {\r\n\t\tif (capabilitiesLoaded) return;\r\n\t\tif (status?.providers.codex.status !== \"signed-in\") return;\r\n\t\tvoid refreshCapabilities();\r\n\t}, [capabilitiesLoaded, refreshCapabilities, status?.providers.codex.status]);\r\n\r\n\t// Gateway: load only when that tab is opened.\r\n\tuseEffect(() => {\r\n\t\tif (activeTab !== \"gateway\" || gatewayLoaded) return;\r\n\t\tvoid refreshGateway();\r\n\t}, [activeTab, gatewayLoaded, refreshGateway]);\r\n\r\n\tuseEffect(() => {\r\n\t\tpreviewRef.current = preview;\r\n\t}, [preview]);\r\n\r\n\tuseEffect(() => {\r\n\t\tmountedRef.current = true;\r\n\t\treturn () => {\r\n\t\t\tmountedRef.current = false;\r\n\t\t\tif (copiedTimerRef.current !== undefined) window.clearTimeout(copiedTimerRef.current);\r\n\t\t\tpreviewEpochRef.current += 1;\r\n\t\t\tconst active = previewRef.current;\r\n\t\t\tif (active !== undefined) cancelPreviewTicket(active.previewId, true);\r\n\t\t};\r\n\t}, []);\r\n\r\n\tuseEffect(() => {\r\n\t\tconst signingIn =\r\n\t\t\tstatus !== undefined && Object.values(status.providers).some((provider) => provider.status === \"signing-in\");\r\n\t\tif (!signingIn) return;\r\n\t\tconst timer = window.setInterval(() => {\r\n\t\t\tvoid refresh();\r\n\t\t}, POLL_INTERVAL_MS);\r\n\t\treturn () => {\r\n\t\t\twindow.clearInterval(timer);\r\n\t\t};\r\n\t}, [refresh, status]);\r\n\r\n\tuseEffect(() => {\r\n\t\tconst signedIn = status?.providers.codex.status === \"signed-in\";\r\n\t\tif (capabilities?.value.codexUsage === true && signedIn) {\r\n\t\t\tvoid refreshUsage();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tsetUsage(undefined);\r\n\t\tsetUsageError(undefined);\r\n\t\tsetUsageLoading(false);\r\n\t}, [capabilities?.value.codexUsage, refreshUsage, status?.providers.codex.status]);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (gateway !== undefined) setPortDraft(String(gateway.port));\r\n\t}, [gateway]);\r\n\r\n\tconst signIn = async (provider: ProviderSlug, method: LoginMethod): Promise<void> => {\r\n\t\tconst popup = window.open(\"about:blank\", \"_blank\");\r\n\t\tif (popup !== null) popup.opener = null;\r\n\t\tsetBusyProvider(provider);\r\n\t\tsetRequestError(undefined);\r\n\t\tsetPopupBlocked((current) => ({ ...current, [provider]: popup === null }));\r\n\t\ttry {\r\n\t\t\tconst challenge = await jsonRequest<LoginChallenge>(LOGIN_PATH, \"POST\", { provider, method });\r\n\t\t\tif (popup !== null) popup.location.replace(challenge.url);\r\n\t\t\tawait refresh();\r\n\t\t} catch (error: unknown) {\r\n\t\t\tpopup?.close();\r\n\t\t\tsetRequestError(error instanceof Error ? error.message : t(\"requestFailed\"));\r\n\t\t\tawait refresh();\r\n\t\t} finally {\r\n\t\t\tsetBusyProvider(undefined);\r\n\t\t}\r\n\t};\r\n\r\n\tconst submitCode = async (provider: ProviderSlug): Promise<void> => {\r\n\t\tconst code = codeInputs[provider]?.trim() ?? \"\";\r\n\t\tif (code.length === 0) return;\r\n\t\tsetBusyProvider(provider);\r\n\t\ttry {\r\n\t\t\tawait jsonRequest<{ ok: true }>(LOGIN_CODE_PATH, \"POST\", { provider, code });\r\n\t\t\tsetCodeInputs((current) => ({ ...current, [provider]: \"\" }));\r\n\t\t\tawait refresh();\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetRequestError(error instanceof Error ? error.message : t(\"requestFailed\"));\r\n\t\t} finally {\r\n\t\t\tsetBusyProvider(undefined);\r\n\t\t}\r\n\t};\r\n\r\n\tconst cancelLogin = async (provider: ProviderSlug): Promise<void> => {\r\n\t\tsetBusyProvider(provider);\r\n\t\ttry {\r\n\t\t\tsetStatus(await jsonRequest<CodingOAuthStatus>(LOGIN_CANCEL_PATH, \"POST\", { provider }));\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetRequestError(error instanceof Error ? error.message : t(\"requestFailed\"));\r\n\t\t} finally {\r\n\t\t\tsetBusyProvider(undefined);\r\n\t\t}\r\n\t};\r\n\r\n\tconst signOut = async (provider: ProviderSlug): Promise<void> => {\r\n\t\tsetBusyProvider(provider);\r\n\t\ttry {\r\n\t\t\tsetStatus(await jsonRequest<CodingOAuthStatus>(LOGOUT_PATH, \"POST\", { provider }));\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetRequestError(error instanceof Error ? error.message : t(\"requestFailed\"));\r\n\t\t} finally {\r\n\t\t\tsetBusyProvider(undefined);\r\n\t\t}\r\n\t};\r\n\r\n\tconst saveModels = async (provider: ProviderSlug, selected: string[]): Promise<void> => {\r\n\t\tsetBusyProvider(provider);\r\n\t\ttry {\r\n\t\t\tsetStatus(await jsonRequest<CodingOAuthStatus>(MODELS_PATH, \"POST\", { provider, selected }));\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetRequestError(error instanceof Error ? error.message : t(\"requestFailed\"));\r\n\t\t} finally {\r\n\t\t\tsetBusyProvider(undefined);\r\n\t\t}\r\n\t};\r\n\r\n\tconst previewSource = async (kind: SourceKind): Promise<void> => {\r\n\t\tconst epoch = ++previewEpochRef.current;\r\n\t\tconst previous = previewRef.current;\r\n\t\tif (previous !== undefined) {\r\n\t\t\tpreviewRef.current = undefined;\r\n\t\t\tsetPreview(undefined);\r\n\t\t\tcancelPreviewTicket(previous.previewId);\r\n\t\t}\r\n\t\tsetSourcesBusy(true);\r\n\t\tsetSourcesNotice(undefined);\r\n\t\tsetConfirmOverwrite(false);\r\n\t\ttry {\r\n\t\t\tconst next = parsePreview(await jsonRequest<unknown>(SOURCES_PREVIEW_PATH, \"POST\", { kind }));\r\n\t\t\tif (next === undefined) throw new Error(t(\"sourcesPreviewFailed\"));\r\n\t\t\tif (!mountedRef.current || epoch !== previewEpochRef.current) {\r\n\t\t\t\tcancelPreviewTicket(next.previewId, !mountedRef.current);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tpreviewRef.current = next;\r\n\t\t\tsetPreview(next);\r\n\t\t\tsetSourcesError(undefined);\r\n\t\t} catch (error: unknown) {\r\n\t\t\tif (!mountedRef.current || epoch !== previewEpochRef.current) return;\r\n\t\t\tsetPreview(undefined);\r\n\t\t\tsetSourcesError(error instanceof Error ? error.message : t(\"sourcesPreviewFailed\"));\r\n\t\t} finally {\r\n\t\t\tif (mountedRef.current && epoch === previewEpochRef.current) setSourcesBusy(false);\r\n\t\t}\r\n\t};\r\n\r\n\tconst commitSource = async (): Promise<void> => {\r\n\t\tif (preview === undefined) return;\r\n\t\tif (preview.action === \"blocked\") return;\r\n\t\tif (preview.confirmOverwriteRequired && !confirmOverwrite) return;\r\n\t\tsetSourcesBusy(true);\r\n\t\ttry {\r\n\t\t\tconst result = await jsonRequest<unknown>(SOURCES_COMMIT_PATH, \"POST\", {\r\n\t\t\t\tkind: preview.kind,\r\n\t\t\t\tpreviewId: preview.previewId,\r\n\t\t\t\tconfirmOverwrite,\r\n\t\t\t});\r\n\t\t\tconst action = parseCommitAction(result);\r\n\t\t\tpreviewRef.current = undefined;\r\n\t\t\tsetPreview(undefined);\r\n\t\t\tsetConfirmOverwrite(false);\r\n\t\t\tsetSourcesNotice(\r\n\t\t\t\tt(\"sourcesCommitSuccess\", { action: action === undefined ? \"\" : t(SOURCE_COMMIT_ACTION_KEY[action]) }),\r\n\t\t\t);\r\n\t\t\tsetSourcesError(undefined);\r\n\t\t\tawait refreshSources();\r\n\t\t\tawait refresh();\r\n\t\t} catch (error: unknown) {\r\n\t\t\tif (isConsumedPreviewError(error)) {\r\n\t\t\t\tpreviewRef.current = undefined;\r\n\t\t\t\tsetPreview(undefined);\r\n\t\t\t\tsetConfirmOverwrite(false);\r\n\t\t\t}\r\n\t\t\tsetSourcesError(error instanceof Error ? error.message : t(\"sourcesCommitFailed\"));\r\n\t\t\tawait refreshSources();\r\n\t\t} finally {\r\n\t\t\tsetSourcesBusy(false);\r\n\t\t}\r\n\t};\r\n\r\n\tconst cancelSourcePreview = async (): Promise<void> => {\r\n\t\tif (preview === undefined) return;\r\n\t\tconst previewId = preview.previewId;\r\n\t\tpreviewEpochRef.current += 1;\r\n\t\tpreviewRef.current = undefined;\r\n\t\tsetPreview(undefined);\r\n\t\tsetConfirmOverwrite(false);\r\n\t\tsetSourcesBusy(true);\r\n\t\ttry {\r\n\t\t\tawait jsonRequest<unknown>(SOURCES_CANCEL_PATH, \"POST\", { previewId });\r\n\t\t\tsetSourcesError(undefined);\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetSourcesError(error instanceof Error ? error.message : t(\"requestFailed\"));\r\n\t\t} finally {\r\n\t\t\tsetSourcesBusy(false);\r\n\t\t}\r\n\t};\r\n\r\n\tconst patchCapability = async (key: CapabilitySettingKey, value: boolean | number): Promise<boolean> => {\r\n\t\tif (capabilities === undefined || !capabilities.writable) return false;\r\n\t\tif (key === \"codexImageEdits\" && value === true && !capabilities.value.codexImages) return false;\r\n\t\tconst patch: Partial<CapabilitySettingsView> =\r\n\t\t\tkey === \"codexImages\" && value === false && capabilities.value.codexImageEdits\r\n\t\t\t\t? { codexImages: false, codexImageEdits: false }\r\n\t\t\t\t: ({ [key]: value } as Partial<CapabilitySettingsView>);\r\n\t\tsetCapabilitiesBusy(true);\r\n\t\ttry {\r\n\t\t\tconst updated = parseCapabilities(\r\n\t\t\t\tawait jsonRequest<unknown>(CAPABILITIES_PATH, \"PATCH\", {\r\n\t\t\t\t\texpectedRevision: capabilities.revision,\r\n\t\t\t\t\tpatch,\r\n\t\t\t\t}),\r\n\t\t\t);\r\n\t\t\tif (updated !== undefined) setCapabilities(updated);\r\n\t\t\telse await refreshCapabilities();\r\n\t\t\tsetCapabilitiesError(undefined);\r\n\t\t\treturn true;\r\n\t\t} catch (error: unknown) {\r\n\t\t\tawait refreshCapabilities();\r\n\t\t\tsetCapabilitiesError(\r\n\t\t\t\tisConflictError(error)\r\n\t\t\t\t\t? t(\"capabilitiesConflictRefreshed\")\r\n\t\t\t\t\t: error instanceof Error\r\n\t\t\t\t\t\t? error.message\r\n\t\t\t\t\t\t: t(\"capabilitiesSaveFailed\"),\r\n\t\t\t);\r\n\t\t\treturn false;\r\n\t\t} finally {\r\n\t\t\tsetCapabilitiesBusy(false);\r\n\t\t}\r\n\t};\r\n\r\n\tconst showUsage = capabilities?.value.codexUsage === true && status?.providers.codex.status === \"signed-in\";\r\n\tconst signedInCount =\r\n\t\tstatus === undefined\r\n\t\t\t? 0\r\n\t\t\t: Object.values(status.providers).filter((provider) => provider.status === \"signed-in\").length;\r\n\r\n\tconst tabHints = useMemo((): readonly SettingsTabHint[] => {\r\n\t\tconst hints: SettingsTabHint[] = [];\r\n\t\tif (status !== undefined) {\r\n\t\t\tconst signedInCount = Object.values(status.providers).filter(\r\n\t\t\t\t(provider) => provider.status === \"signed-in\",\r\n\t\t\t).length;\r\n\t\t\tif (signedInCount > 0) {\r\n\t\t\t\thints.push({ id: \"accounts\", suffix: String(signedInCount) });\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (gateway?.running === true) {\r\n\t\t\thints.push({ id: \"gateway\", suffix: t(\"tabGatewayActive\") });\r\n\t\t}\r\n\t\treturn hints;\r\n\t}, [gateway?.running, status, t]);\r\n\r\n\tconst markCopied = (field: CopyField): void => {\r\n\t\tif (copiedTimerRef.current !== undefined) window.clearTimeout(copiedTimerRef.current);\r\n\t\tsetCopiedField(field);\r\n\t\tsetCopyFailedField(undefined);\r\n\t\tcopiedTimerRef.current = window.setTimeout(() => {\r\n\t\t\tif (mountedRef.current) {\r\n\t\t\t\tsetCopiedField(undefined);\r\n\t\t\t\tsetCopyFailedField(undefined);\r\n\t\t\t}\r\n\t\t\tcopiedTimerRef.current = undefined;\r\n\t\t}, 2000);\r\n\t};\r\n\r\n\tconst handleCopy = async (field: CopyField, text: string): Promise<void> => {\r\n\t\tconst ok = await copyText(text);\r\n\t\tif (ok) {\r\n\t\t\tmarkCopied(field);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tsetCopiedField(undefined);\r\n\t\tsetCopyFailedField(field);\r\n\t};\r\n\r\n\tconst ensureGatewayKey = async (): Promise<string> => {\r\n\t\tif (gatewayOnceKey !== undefined) return gatewayOnceKey;\r\n\t\tconst value = await jsonRequest<{ apiKey?: string }>(GATEWAY_REVEAL_PATH, \"POST\");\r\n\t\tif (typeof value.apiKey !== \"string\" || value.apiKey.length === 0) {\r\n\t\t\tthrow new Error(t(\"gatewayRevealFailed\"));\r\n\t\t}\r\n\t\tsetGatewayOnceKey(value.apiKey);\r\n\t\treturn value.apiKey;\r\n\t};\r\n\r\n\tconst copyGatewayKey = async (): Promise<void> => {\r\n\t\ttry {\r\n\t\t\tconst key = await ensureGatewayKey();\r\n\t\t\tawait handleCopy(\"key\", key);\r\n\t\t\tsetGatewayRevealError(undefined);\r\n\t\t} catch {\r\n\t\t\tsetGatewayRevealError(t(\"gatewayRevealFailed\"));\r\n\t\t}\r\n\t};\r\n\r\n\tconst toggleGatewayKeyVisible = async (): Promise<void> => {\r\n\t\tif (gatewayKeyVisible) {\r\n\t\t\tsetGatewayKeyVisible(false);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\ttry {\r\n\t\t\tawait ensureGatewayKey();\r\n\t\t\tsetGatewayKeyVisible(true);\r\n\t\t\tsetGatewayRevealError(undefined);\r\n\t\t} catch {\r\n\t\t\tsetGatewayRevealError(t(\"gatewayRevealFailed\"));\r\n\t\t}\r\n\t};\r\n\r\n\tconst applyGatewayPort = async (): Promise<void> => {\r\n\t\tconst port = parseGatewayPort(portDraft);\r\n\t\tif (port === undefined) {\r\n\t\t\tsetGatewayError(t(\"gatewayPortInvalid\"));\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (gateway !== undefined && port === gateway.port) return;\r\n\t\tsetGatewayBusy(true);\r\n\t\ttry {\r\n\t\t\tsetGateway(parseGateway(await jsonRequest<unknown>(GATEWAY_PATH, \"PATCH\", { port })) ?? gateway);\r\n\t\t\tsetGatewayError(undefined);\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetGatewayError(error instanceof Error ? error.message : t(\"gatewaySaveFailed\"));\r\n\t\t\tif (gateway !== undefined) setPortDraft(String(gateway.port));\r\n\t\t} finally {\r\n\t\t\tsetGatewayBusy(false);\r\n\t\t}\r\n\t};\r\n\r\n\tconst rotateGatewayKey = async (): Promise<void> => {\r\n\t\tsetGatewayBusy(true);\r\n\t\ttry {\r\n\t\t\tconst value = await jsonRequest<{ apiKey?: string; keyHint?: string }>(GATEWAY_ROTATE_PATH, \"POST\");\r\n\t\t\tif (typeof value.apiKey === \"string\") setGatewayOnceKey(value.apiKey);\r\n\t\t\tsetGatewayKeyVisible(true);\r\n\t\t\tsetGatewayRotateConfirm(false);\r\n\t\t\tsetGatewayRevealError(undefined);\r\n\t\t\tawait refreshGateway();\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetGatewayError(error instanceof Error ? error.message : t(\"gatewaySaveFailed\"));\r\n\t\t} finally {\r\n\t\t\tsetGatewayBusy(false);\r\n\t\t}\r\n\t};\r\n\r\n\tconst setGatewayEnabled = (enabled: boolean): void => {\r\n\t\tsetGatewayBusy(true);\r\n\t\tvoid jsonRequest<unknown>(GATEWAY_PATH, \"PATCH\", { enabled })\r\n\t\t\t.then((value) => {\r\n\t\t\t\tsetGateway(parseGateway(value) ?? gateway);\r\n\t\t\t\tsetGatewayError(undefined);\r\n\t\t\t})\r\n\t\t\t.catch((error: unknown) => {\r\n\t\t\t\tsetGatewayError(error instanceof Error ? error.message : t(\"gatewaySaveFailed\"));\r\n\t\t\t})\r\n\t\t\t.finally(() => {\r\n\t\t\t\tsetGatewayBusy(false);\r\n\t\t\t});\r\n\t};\r\n\r\n\tconst dismissRemoteTip = (): void => {\r\n\t\tsetRemoteTipDismissed(true);\r\n\t\ttry {\r\n\t\t\tglobalThis.sessionStorage?.setItem(REMOTE_TIP_STORAGE_KEY, \"1\");\r\n\t\t} catch {\r\n\t\t\t// ignore storage failures\r\n\t\t}\r\n\t};\r\n\r\n\tconst openAccountsForCodex = (): void => {\r\n\t\tsetActiveTab(\"accounts\");\r\n\t\twindow.setTimeout(() => document.getElementById(\"coding-oauth-login-codex\")?.focus(), 0);\r\n\t};\r\n\r\n\tconst focusCapabilityDependency = (target: \"codexImages\" | \"imagineCredential\"): void => {\r\n\t\tconst id = target === \"codexImages\" ? \"cap-switch-codexImages\" : \"coding-oauth-imagine-credential\";\r\n\t\tdocument.getElementById(id)?.focus();\r\n\t};\r\n\r\n\tif (status?.uiOwner === \"hub\") {\r\n\t\treturn (\r\n\t\t\t<section data-dsh-coding-oauth=\"compact\" style={pageStyle} aria-labelledby=\"coding-oauth-settings-title\">\r\n\t\t\t\t<h2 id=\"coding-oauth-settings-title\" style={titleStyle}>\r\n\t\t\t\t\t{t(\"coinstallTitle\")}\r\n\t\t\t\t</h2>\r\n\t\t\t\t<p style={bodyStyle}>{t(\"coinstallSummary\", { count: signedInCount })}</p>\r\n\t\t\t\t<button\r\n\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\tstyle={buttonStyle}\r\n\t\t\t\t\tonClick={() => window.dispatchEvent(new CustomEvent(\"usage-stats:open-dashboard\"))}\r\n\t\t\t\t>\r\n\t\t\t\t\t{t(\"coinstallOpenHub\")}\r\n\t\t\t\t</button>\r\n\t\t\t</section>\r\n\t\t);\r\n\t}\r\n\r\n\treturn (\r\n\t\t<section data-dsh-coding-oauth=\"\" style={pageStyle} aria-labelledby=\"coding-oauth-settings-title\">\r\n\t\t\t<div>\r\n\t\t\t\t<h2 id=\"coding-oauth-settings-title\" style={titleStyle}>\r\n\t\t\t\t\t{t(\"title\")}\r\n\t\t\t\t</h2>\r\n\t\t\t\t{activeTab === \"accounts\" ? <p style={{ ...bodyStyle, marginTop: 6 }}>{t(\"intro\")}</p> : null}\r\n\t\t\t</div>\r\n\t\t\t{requestError === undefined ? null : (\r\n\t\t\t\t<div role=\"alert\" style={{ display: \"flex\", flexWrap: \"wrap\", alignItems: \"center\", gap: 8 }}>\r\n\t\t\t\t\t<p style={errorStyle}>{requestError}</p>\r\n\t\t\t\t\t{status === undefined ? (\r\n\t\t\t\t\t\t<button type=\"button\" style={buttonStyle} onClick={() => void refresh()}>\r\n\t\t\t\t\t\t\t{t(\"retry\")}\r\n\t\t\t\t\t\t</button>\r\n\t\t\t\t\t) : null}\r\n\t\t\t\t</div>\r\n\t\t\t)}\r\n\t\t\t<SettingsTabs t={t} activeTab={activeTab} onChange={setActiveTab} hints={tabHints} />\r\n\t\t\t<div\r\n\t\t\t\tid={`coding-oauth-panel-${activeTab}`}\r\n\t\t\t\trole=\"tabpanel\"\r\n\t\t\t\taria-labelledby={`coding-oauth-tab-${activeTab}`}\r\n\t\t\t\tstyle={panelStyle}\r\n\t\t\t>\r\n\t\t\t\t{activeTab === \"accounts\" && !(status === undefined && requestError !== undefined) ? (\r\n\t\t\t\t\t<AccountsTab\r\n\t\t\t\t\t\tt={t}\r\n\t\t\t\t\t\tstatus={status}\r\n\t\t\t\t\t\tremote={remote}\r\n\t\t\t\t\t\tremoteTipDismissed={remoteTipDismissed}\r\n\t\t\t\t\t\tonDismissRemoteTip={dismissRemoteTip}\r\n\t\t\t\t\t\tsources={sources}\r\n\t\t\t\t\t\tsourcesError={sourcesError}\r\n\t\t\t\t\t\tsourcesNotice={sourcesNotice}\r\n\t\t\t\t\t\tsourcesBusy={sourcesBusy}\r\n\t\t\t\t\t\tpreview={preview}\r\n\t\t\t\t\t\tconfirmOverwrite={confirmOverwrite}\r\n\t\t\t\t\t\tbusyProvider={busyProvider}\r\n\t\t\t\t\t\tcodeInputs={codeInputs}\r\n\t\t\t\t\t\tpopupBlocked={popupBlocked}\r\n\t\t\t\t\t\texpandedProviders={expandedProviders}\r\n\t\t\t\t\t\tshowUsage={showUsage === true}\r\n\t\t\t\t\t\tusage={usage}\r\n\t\t\t\t\t\tusageError={usageError}\r\n\t\t\t\t\t\tusageLoading={usageLoading}\r\n\t\t\t\t\t\tonSignIn={(slug, method) => {\r\n\t\t\t\t\t\t\tvoid signIn(slug, method);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonSignOut={(slug) => {\r\n\t\t\t\t\t\t\tvoid signOut(slug);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonCancelLogin={(slug) => {\r\n\t\t\t\t\t\t\tvoid cancelLogin(slug);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonSubmitCode={(slug) => {\r\n\t\t\t\t\t\t\tvoid submitCode(slug);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonCodeChange={(slug, value) => {\r\n\t\t\t\t\t\t\tsetCodeInputs((current) => ({ ...current, [slug]: value }));\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonToggleExpanded={(slug) => {\r\n\t\t\t\t\t\t\tsetExpandedProviders((current) => ({\r\n\t\t\t\t\t\t\t\t...current,\r\n\t\t\t\t\t\t\t\t[slug]: !(current[slug] === true),\r\n\t\t\t\t\t\t\t}));\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonPreviewSource={(slug) => {\r\n\t\t\t\t\t\t\tvoid previewSource(slug);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonSaveModels={(slug, selected) => {\r\n\t\t\t\t\t\t\tvoid saveModels(slug, selected);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonConfirmOverwriteChange={setConfirmOverwrite}\r\n\t\t\t\t\t\tonCommitSource={() => {\r\n\t\t\t\t\t\t\tvoid commitSource();\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonCancelSourcePreview={() => {\r\n\t\t\t\t\t\t\tvoid cancelSourcePreview();\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonRefreshSources={() => {\r\n\t\t\t\t\t\t\tvoid refreshSources();\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonDismissSourcesNotice={() => {\r\n\t\t\t\t\t\t\tsetSourcesNotice(undefined);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t/>\r\n\t\t\t\t) : null}\r\n\t\t\t\t{activeTab === \"capabilities\" ? (\r\n\t\t\t\t\t<CapabilitiesTab\r\n\t\t\t\t\t\tt={t}\r\n\t\t\t\t\t\tcapabilities={capabilities}\r\n\t\t\t\t\t\tcapabilitiesError={capabilitiesError}\r\n\t\t\t\t\t\tcapabilitiesBusy={capabilitiesBusy}\r\n\t\t\t\t\t\timagine={imagine}\r\n\t\t\t\t\t\timagineError={imagineError}\r\n\t\t\t\t\t\tcodexSignedIn={status?.providers.codex.status === \"signed-in\"}\r\n\t\t\t\t\t\tonRetry={() => {\r\n\t\t\t\t\t\t\tvoid refreshCapabilities();\r\n\t\t\t\t\t\t\tvoid refreshImagine();\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonOpenAccounts={openAccountsForCodex}\r\n\t\t\t\t\t\tonFocusDependency={focusCapabilityDependency}\r\n\t\t\t\t\t\tonPatchCapability={(key, value) => patchCapability(key, value)}\r\n\t\t\t\t\t/>\r\n\t\t\t\t) : null}\r\n\t\t\t\t{activeTab === \"gateway\" ? (\r\n\t\t\t\t\t<GatewayTab\r\n\t\t\t\t\t\tt={t}\r\n\t\t\t\t\t\tgateway={gateway}\r\n\t\t\t\t\t\tgatewayError={gatewayError}\r\n\t\t\t\t\t\tgatewayBusy={gatewayBusy}\r\n\t\t\t\t\t\tgatewayOnceKey={gatewayOnceKey}\r\n\t\t\t\t\t\tgatewayKeyVisible={gatewayKeyVisible}\r\n\t\t\t\t\t\tgatewayRotateConfirm={gatewayRotateConfirm}\r\n\t\t\t\t\t\tgatewayRevealError={gatewayRevealError}\r\n\t\t\t\t\t\tportDraft={portDraft}\r\n\t\t\t\t\t\tcopiedField={copiedField}\r\n\t\t\t\t\t\tcopyFailedField={copyFailedField}\r\n\t\t\t\t\t\tonRetry={() => {\r\n\t\t\t\t\t\t\tvoid refreshGateway();\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonEnabledChange={setGatewayEnabled}\r\n\t\t\t\t\t\tonPortDraftChange={setPortDraft}\r\n\t\t\t\t\t\tonApplyPort={() => {\r\n\t\t\t\t\t\t\tvoid applyGatewayPort();\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonRandomPort={(port) => {\r\n\t\t\t\t\t\t\tsetPortDraft(String(port));\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonCopy={(field, text) => {\r\n\t\t\t\t\t\t\tvoid handleCopy(field, text);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonCopyKey={() => {\r\n\t\t\t\t\t\t\tvoid copyGatewayKey();\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonToggleKeyVisible={() => {\r\n\t\t\t\t\t\t\tvoid toggleGatewayKeyVisible();\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonRotateConfirm={() => {\r\n\t\t\t\t\t\t\tsetGatewayRotateConfirm(true);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonRotateCancel={() => {\r\n\t\t\t\t\t\t\tsetGatewayRotateConfirm(false);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonRotate={() => {\r\n\t\t\t\t\t\t\tvoid rotateGatewayKey();\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t/>\r\n\t\t\t\t) : null}\r\n\t\t\t\t{activeTab === \"about\" ? <AboutTab t={t} /> : null}\r\n\t\t\t</div>\r\n\t\t</section>\r\n\t);\r\n}\r\n", null, "/** Static tables for the Coding OAuth settings UI. */\r\n\r\nimport {\r\n\tCAPABILITY_SETTINGS_PATH,\r\n\tCODING_OAUTH_LOGIN_CANCEL_PATH,\r\n\tCODING_OAUTH_LOGIN_CODE_PATH,\r\n\tCODING_OAUTH_LOGIN_PATH,\r\n\tCODING_OAUTH_LOGOUT_PATH,\r\n\tCODING_OAUTH_MODELS_PATH,\r\n\tCODING_OAUTH_STATUS_PATH,\r\n\tCODEX_USAGE_PATH as CORE_CODEX_USAGE_PATH,\r\n\tGATEWAY_REVEAL_PATH as CORE_GATEWAY_REVEAL_PATH,\r\n\tGATEWAY_ROTATE_PATH as CORE_GATEWAY_ROTATE_PATH,\r\n\tGATEWAY_SETTINGS_PATH,\r\n\tIMAGINE_CREDENTIAL_STATUS_PATH,\r\n\tOAUTH_IMPORT_CANCEL_PATH,\r\n\tOAUTH_IMPORT_COMMIT_PATH,\r\n\tOAUTH_IMPORT_PREVIEW_PATH,\r\n\tOAUTH_IMPORT_SOURCES_PATH,\r\n} from \"dsh-coding-oauth-core/contracts\";\r\nimport type { GrokBuildSettingsKey } from \"./locales.ts\";\r\nimport type {\r\n\tCapabilityFlagKey,\r\n\tCapabilityLimitKey,\r\n\tProviderCardDefinition,\r\n\tSettingsTabId,\r\n\tSourceCommitAction,\r\n\tSourceConflict,\r\n\tSourceKind,\r\n\tSourcePreviewAction,\r\n\tSourceReason,\r\n} from \"./types.ts\";\r\n\r\nexport const STATUS_PATH = CODING_OAUTH_STATUS_PATH;\r\nexport const LOGIN_PATH = CODING_OAUTH_LOGIN_PATH;\r\nexport const LOGIN_CODE_PATH = CODING_OAUTH_LOGIN_CODE_PATH;\r\nexport const LOGIN_CANCEL_PATH = CODING_OAUTH_LOGIN_CANCEL_PATH;\r\nexport const LOGOUT_PATH = CODING_OAUTH_LOGOUT_PATH;\r\nexport const MODELS_PATH = CODING_OAUTH_MODELS_PATH;\r\nexport const SOURCES_PATH = OAUTH_IMPORT_SOURCES_PATH;\r\nexport const SOURCES_PREVIEW_PATH = OAUTH_IMPORT_PREVIEW_PATH;\r\nexport const SOURCES_COMMIT_PATH = OAUTH_IMPORT_COMMIT_PATH;\r\nexport const SOURCES_CANCEL_PATH = OAUTH_IMPORT_CANCEL_PATH;\r\nexport const CAPABILITIES_PATH = CAPABILITY_SETTINGS_PATH;\r\nexport const CODEX_USAGE_PATH = CORE_CODEX_USAGE_PATH;\r\nexport const IMAGINE_CREDENTIAL_PATH = IMAGINE_CREDENTIAL_STATUS_PATH;\r\nexport const GATEWAY_PATH = GATEWAY_SETTINGS_PATH;\r\nexport const GATEWAY_REVEAL_PATH = CORE_GATEWAY_REVEAL_PATH;\r\nexport const GATEWAY_ROTATE_PATH = CORE_GATEWAY_ROTATE_PATH;\r\nexport const POLL_INTERVAL_MS = 1_000;\r\nexport const HOUR_MS = 60 * 60 * 1000;\r\n\r\nexport const SOURCE_KINDS: readonly SourceKind[] = [\"grok\", \"codex\", \"kimi\", \"claude\"];\r\nexport const SOURCE_REASONS: readonly SourceReason[] = [\"missing\", \"unsafe\", \"invalid\", \"too_large\"];\r\nexport const SOURCE_CONFLICTS: readonly SourceConflict[] = [\r\n\t\"none\",\r\n\t\"same_credential\",\r\n\t\"same_account\",\r\n\t\"different_account\",\r\n\t\"unknown_account\",\r\n\t\"unreadable_destination\",\r\n\t\"unsafe_destination\",\r\n];\r\nexport const SOURCE_PREVIEW_ACTIONS: readonly SourcePreviewAction[] = [\"import\", \"reuse\", \"overwrite\", \"blocked\"];\r\nexport const SOURCE_COMMIT_ACTIONS: readonly SourceCommitAction[] = [\"imported\", \"unchanged\", \"overwritten\"];\r\n\r\nexport const SOURCE_DEFAULT_PATH: { readonly [K in SourceKind]: string } = {\r\n\tgrok: \"~/.grok/auth.json\",\r\n\tcodex: \"~/.codex/auth.json\",\r\n\tkimi: \"~/.kimi/credentials/kimi-code.json\",\r\n\tclaude: \"~/.claude/.credentials.json\",\r\n};\r\n\r\nexport const SOURCE_KIND_KEY: { readonly [K in SourceKind]: GrokBuildSettingsKey } = {\r\n\tgrok: \"sourceKindGrok\",\r\n\tcodex: \"sourceKindCodex\",\r\n\tkimi: \"sourceKindKimi\",\r\n\tclaude: \"sourceKindClaude\",\r\n};\r\n\r\nexport const SOURCE_REASON_KEY: { readonly [K in SourceReason]: GrokBuildSettingsKey } = {\r\n\tmissing: \"sourceReasonMissing\",\r\n\tunsafe: \"sourceReasonUnsafe\",\r\n\tinvalid: \"sourceReasonInvalid\",\r\n\ttoo_large: \"sourceReasonTooLarge\",\r\n};\r\n\r\nexport const SOURCE_CONFLICT_KEY: { readonly [K in SourceConflict]: GrokBuildSettingsKey } = {\r\n\tnone: \"sourceConflictNone\",\r\n\tsame_credential: \"sourceConflictSameCredential\",\r\n\tsame_account: \"sourceConflictSameAccount\",\r\n\tdifferent_account: \"sourceConflictDifferentAccount\",\r\n\tunknown_account: \"sourceConflictUnknownAccount\",\r\n\tunreadable_destination: \"sourceConflictUnreadableDestination\",\r\n\tunsafe_destination: \"sourceConflictUnsafeDestination\",\r\n};\r\n\r\nexport const SOURCE_PREVIEW_ACTION_KEY: { readonly [K in SourcePreviewAction]: GrokBuildSettingsKey } = {\r\n\timport: \"sourceActionImport\",\r\n\treuse: \"sourceActionReuse\",\r\n\toverwrite: \"sourceActionOverwrite\",\r\n\tblocked: \"sourceActionBlocked\",\r\n};\r\n\r\nexport const SOURCE_COMMIT_ACTION_KEY: { readonly [K in SourceCommitAction]: GrokBuildSettingsKey } = {\r\n\timported: \"sourceCommitImported\",\r\n\tunchanged: \"sourceCommitUnchanged\",\r\n\toverwritten: \"sourceCommitOverwritten\",\r\n};\r\n\r\nexport const CAPABILITY_TOGGLES: readonly {\r\n\tkey: CapabilityFlagKey;\r\n\tlabel: GrokBuildSettingsKey;\r\n\thint: GrokBuildSettingsKey;\r\n\trequiresImages?: true;\r\n}[] = [\r\n\t{ key: \"codexSearch\", label: \"capCodexSearch\", hint: \"capCodexSearchHint\" },\r\n\t{ key: \"codexImages\", label: \"capCodexImages\", hint: \"capCodexImagesHint\" },\r\n\t{ key: \"codexImageEdits\", label: \"capCodexImageEdits\", hint: \"capCodexImageEditsHint\", requiresImages: true },\r\n\t{ key: \"codexUsage\", label: \"capCodexUsage\", hint: \"capCodexUsageHint\" },\r\n\t{ key: \"codexFast\", label: \"capCodexFast\", hint: \"capCodexFastHint\" },\r\n\t{ key: \"grokImagineImage\", label: \"capGrokImagineImage\", hint: \"capGrokImagineImageHint\" },\r\n\t{ key: \"grokImagineVideo\", label: \"capGrokImagineVideo\", hint: \"capGrokImagineVideoHint\" },\r\n];\r\n\r\nexport const CAPABILITY_LIMITS: readonly {\r\n\tkey: CapabilityLimitKey;\r\n\tlabel: GrokBuildSettingsKey;\r\n\thint: GrokBuildSettingsKey;\r\n\tmin: number;\r\n\tmax: number;\r\n\tscale: number;\r\n}[] = [\r\n\t{ key: \"searchResults\", label: \"capSearchResults\", hint: \"capSearchResultsHint\", min: 1, max: 20, scale: 1 },\r\n\t{ key: \"imageCount\", label: \"capImageCount\", hint: \"capImageCountHint\", min: 1, max: 4, scale: 1 },\r\n\t{\r\n\t\tkey: \"videoArtifactTtlMs\",\r\n\t\tlabel: \"capVideoTtlHours\",\r\n\t\thint: \"capVideoTtlHoursHint\",\r\n\t\tmin: 1,\r\n\t\tmax: 168,\r\n\t\tscale: HOUR_MS,\r\n\t},\r\n];\r\n\r\nexport const IMAGINE_SOURCE_KEY: { readonly [source: string]: GrokBuildSettingsKey } = {\r\n\tnone: \"imagineSourceNone\",\r\n\tenv: \"imagineSourceEnv\",\r\n\tenvironment: \"imagineSourceEnv\",\r\n\t\"xai-api-key\": \"imagineSourceEnv\",\r\n\txai_api_key: \"imagineSourceEnv\",\r\n\t\"api-key\": \"imagineSourceApiKey\",\r\n\tapi_key: \"imagineSourceApiKey\",\r\n\tapikey: \"imagineSourceApiKey\",\r\n\tkey: \"imagineSourceApiKey\",\r\n\tsettings: \"imagineSourceApiKey\",\r\n\toauth: \"imagineSourceOAuth\",\r\n\t\"oauth-access\": \"imagineSourceOAuth\",\r\n\t\"grok-cli-key\": \"imagineSourceCliKey\",\r\n\t\"cli-key\": \"imagineSourceCliKey\",\r\n};\r\n\r\nexport const PROVIDERS: readonly ProviderCardDefinition[] = [\r\n\t{\r\n\t\tslug: \"grok\",\r\n\t\troute: \"grok-build\",\r\n\t\ttitleKey: \"grokTitle\",\r\n\t\tdescriptionKey: \"grokDescription\",\r\n\t\tmethods: [\"pkce\", \"device\"],\r\n\t\trecommended: \"pkce\",\r\n\t\tremoteRecommended: \"device\",\r\n\t},\r\n\t{\r\n\t\tslug: \"codex\",\r\n\t\troute: \"codex-oauth\",\r\n\t\ttitleKey: \"codexTitle\",\r\n\t\tdescriptionKey: \"codexDescription\",\r\n\t\tmethods: [\"device\", \"browser\"],\r\n\t\trecommended: \"device\",\r\n\t\tremoteRecommended: \"device\",\r\n\t},\r\n\t{\r\n\t\tslug: \"kimi\",\r\n\t\troute: \"kimi-code-oauth\",\r\n\t\ttitleKey: \"kimiTitle\",\r\n\t\tdescriptionKey: \"kimiDescription\",\r\n\t\tmethods: [\"device\"],\r\n\t\trecommended: \"device\",\r\n\t\tremoteRecommended: \"device\",\r\n\t},\r\n\t{\r\n\t\tslug: \"claude\",\r\n\t\troute: \"claude-code-oauth\",\r\n\t\ttitleKey: \"claudeTitle\",\r\n\t\tdescriptionKey: \"claudeDescription\",\r\n\t\tmethods: [\"browser\"],\r\n\t\trecommended: \"browser\",\r\n\t\tremoteRecommended: \"browser\",\r\n\t},\r\n];\r\n\r\nexport const SETTINGS_TABS: readonly { id: SettingsTabId; label: GrokBuildSettingsKey }[] = [\r\n\t{ id: \"accounts\", label: \"tabAccounts\" },\r\n\t{ id: \"gateway\", label: \"tabGateway\" },\r\n\t{ id: \"capabilities\", label: \"tabCapabilities\" },\r\n\t{ id: \"about\", label: \"tabAbout\" },\r\n];\r\n\r\nexport const GATEWAY_PORT_MIN = 1024;\r\nexport const GATEWAY_PORT_MAX = 65_535;\r\nexport const GATEWAY_RANDOM_PORT_MIN = 18_100;\r\nexport const GATEWAY_RANDOM_PORT_MAX = 18_999;\r\nexport const GATEWAY_RANDOM_RESERVED = new Set([22, 53, 3080, 7890, 9090, 18_080]);\r\n\r\nexport const CONSUMED_PREVIEW_CODES = new Set([\r\n\t\"preview_invalid\",\r\n\t\"preview_expired\",\r\n\t\"source_changed\",\r\n\t\"destination_changed\",\r\n\t\"confirm_required\",\r\n\t\"unsafe_destination\",\r\n]);\r\n\r\nexport const PLUGIN_VERSION = \"0.6.0\";\r\n", "/** Same-origin JSON helpers for the Coding OAuth plugin HTTP API. */\r\n\r\nimport { CONSUMED_PREVIEW_CODES, SOURCES_CANCEL_PATH } from \"./constants.ts\";\r\nimport type { PluginRequestError } from \"./types.ts\";\r\n\r\nexport function isRecord(value: unknown): value is Record<string, unknown> {\r\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\r\n}\r\n\r\nexport function isPluginRequestError(error: unknown): error is PluginRequestError {\r\n\treturn error instanceof Error && error.name === \"PluginRequestError\" && \"status\" in error;\r\n}\r\n\r\nexport function isConflictError(error: unknown): boolean {\r\n\tif (!isPluginRequestError(error)) {\r\n\t\treturn (\r\n\t\t\terror instanceof Error && /SETTINGS_CONFLICT|settings-conflict|changed since it was read/iu.test(error.message)\r\n\t\t);\r\n\t}\r\n\treturn error.status === 409 || error.code === \"SETTINGS_CONFLICT\" || /conflict/iu.test(error.message);\r\n}\r\n\r\nexport function isConsumedPreviewError(error: unknown): boolean {\r\n\tif (!isPluginRequestError(error)) return false;\r\n\tif (error.code !== undefined && CONSUMED_PREVIEW_CODES.has(error.code)) return true;\r\n\treturn error.status === 404 || error.status === 410;\r\n}\r\n\r\nexport function cancelPreviewTicket(previewId: string, keepalive = false): void {\r\n\tvoid fetch(SOURCES_CANCEL_PATH, {\r\n\t\tmethod: \"POST\",\r\n\t\theaders: { accept: \"application/json\", \"content-type\": \"application/json\" },\r\n\t\tcredentials: \"same-origin\",\r\n\t\tbody: JSON.stringify({ previewId }),\r\n\t\t...(keepalive ? { keepalive: true } : {}),\r\n\t}).catch(() => undefined);\r\n}\r\n\r\nexport async function jsonRequest<T>(path: string, method = \"GET\", body?: unknown): Promise<T> {\r\n\tconst response = await fetch(path, {\r\n\t\tmethod,\r\n\t\theaders: { accept: \"application/json\", ...(body === undefined ? {} : { \"content-type\": \"application/json\" }) },\r\n\t\tcredentials: \"same-origin\",\r\n\t\t...(body === undefined ? {} : { body: JSON.stringify(body) }),\r\n\t});\r\n\tconst value: unknown = await response.json().catch(() => undefined);\r\n\tif (!response.ok) {\r\n\t\tconst record = isRecord(value) ? value : undefined;\r\n\t\tconst message =\r\n\t\t\trecord !== undefined && typeof record[\"error\"] === \"string\"\r\n\t\t\t\t? record[\"error\"]\r\n\t\t\t\t: record !== undefined && typeof record[\"message\"] === \"string\"\r\n\t\t\t\t\t? record[\"message\"]\r\n\t\t\t\t\t: `HTTP ${response.status}`;\r\n\t\tconst code = record !== undefined && typeof record[\"code\"] === \"string\" ? record[\"code\"] : undefined;\r\n\t\tconst error = new Error(message) as PluginRequestError;\r\n\t\terror.name = \"PluginRequestError\";\r\n\t\terror.status = response.status;\r\n\t\tif (code !== undefined) error.code = code;\r\n\t\tthrow error;\r\n\t}\r\n\treturn value as T;\r\n}\r\n\r\nexport async function copyText(text: string): Promise<boolean> {\r\n\ttry {\r\n\t\tif (typeof navigator !== \"undefined\" && navigator.clipboard?.writeText !== undefined) {\r\n\t\t\tawait navigator.clipboard.writeText(text);\r\n\t\t\treturn true;\r\n\t\t}\r\n\t} catch {\r\n\t\t// fall through to execCommand\r\n\t}\r\n\ttry {\r\n\t\tconst area = document.createElement(\"textarea\");\r\n\t\tarea.value = text;\r\n\t\tarea.setAttribute(\"readonly\", \"\");\r\n\t\tarea.style.position = \"fixed\";\r\n\t\tarea.style.left = \"-9999px\";\r\n\t\tdocument.body.appendChild(area);\r\n\t\tarea.select();\r\n\t\tconst ok = document.execCommand(\"copy\");\r\n\t\tdocument.body.removeChild(area);\r\n\t\treturn ok;\r\n\t} catch {\r\n\t\treturn false;\r\n\t}\r\n}\r\n", "/** Shared inline styles using DSH design tokens. */\r\n\r\nimport type { CSSProperties } from \"react\";\r\nimport type { ProviderStatus } from \"./types.ts\";\r\n\r\nexport const TRANSITION = \"all 0.15s ease\";\r\n\r\nexport const pageStyle: CSSProperties = {\r\n\tdisplay: \"flex\",\r\n\tflexDirection: \"column\",\r\n\tgap: 16,\r\n\twidth: \"100%\",\r\n\tmaxWidth: 780,\r\n\tminWidth: 0,\r\n};\r\nexport const titleStyle: CSSProperties = {\r\n\tmargin: 0,\r\n\tfontSize: 20,\r\n\tlineHeight: \"28px\",\r\n\tfontWeight: 600,\r\n\tcolor: \"var(--dsw-alias-label-primary)\",\r\n};\r\nexport const bodyStyle: CSSProperties = {\r\n\tmargin: 0,\r\n\tfontSize: 14,\r\n\tlineHeight: \"22px\",\r\n\tcolor: \"var(--dsw-alias-label-secondary)\",\r\n};\r\nexport const cardStyle: CSSProperties = {\r\n\tdisplay: \"flex\",\r\n\tflexDirection: \"column\",\r\n\tgap: 14,\r\n\tpadding: \"18px 20px\",\r\n\tborder: \"1px solid var(--dsw-alias-border-l2)\",\r\n\tborderRadius: 12,\r\n\tbackground: \"var(--dsw-alias-bg-module-platform)\",\r\n\ttransition: TRANSITION,\r\n};\r\nexport const rowStyle: CSSProperties = {\r\n\tdisplay: \"flex\",\r\n\talignItems: \"center\",\r\n\tjustifyContent: \"space-between\",\r\n\tflexWrap: \"wrap\",\r\n\tgap: 12,\r\n};\r\nexport const statusStyle: CSSProperties = {\r\n\tdisplay: \"flex\",\r\n\talignItems: \"center\",\r\n\tgap: 9,\r\n\tfontSize: 14,\r\n\tfontWeight: 500,\r\n\tcolor: \"var(--dsw-alias-label-primary)\",\r\n};\r\nexport const buttonStyle: CSSProperties = {\r\n\tboxSizing: \"border-box\",\r\n\tminHeight: 34,\r\n\tpadding: \"6px 14px\",\r\n\tborder: \"1px solid var(--dsw-alias-border-l4, rgba(127, 127, 127, 0.4))\",\r\n\tborderRadius: 18,\r\n\tbackground: \"var(--dsw-alias-button-elevated-fill, var(--dsw-alias-bg-layer-1))\",\r\n\tcolor: \"var(--dsw-alias-label-primary)\",\r\n\tboxShadow: \"0 1px 2px rgba(0, 0, 0, 0.18)\",\r\n\tfont: \"inherit\",\r\n\tfontSize: 14,\r\n\tfontWeight: 500,\r\n\tcursor: \"pointer\",\r\n\ttransition: TRANSITION,\r\n};\r\nexport const primaryButtonStyle: CSSProperties = {\r\n\t...buttonStyle,\r\n\t// DSH dark theme flips brand-primary to near-white; use the button/foreground\r\n\t// pair so primary CTAs stay readable in both light and dark mode.\r\n\tborder: \"none\",\r\n\tbackground: \"var(--dsw-alias-button-primary-fill)\",\r\n\tcolor: \"var(--dsw-alias-label-primary-foreground)\",\r\n\tboxShadow: \"0 1px 3px rgba(0, 0, 0, 0.28)\",\r\n\tfontWeight: 600,\r\n};\r\nexport const compactButtonStyle: CSSProperties = {\r\n\t...buttonStyle,\r\n\tminHeight: 28,\r\n\tpadding: \"4px 10px\",\r\n\tfontSize: 13,\r\n\tborderRadius: 8,\r\n};\r\nexport const errorStyle: CSSProperties = { ...bodyStyle, color: \"var(--dsw-alias-state-error-primary)\" };\r\nexport const successStyle: CSSProperties = { ...bodyStyle, color: \"var(--dsw-alias-state-success-primary, #22a06b)\" };\r\nexport const warningStyle: CSSProperties = {\r\n\t...bodyStyle,\r\n\tpadding: \"10px 12px\",\r\n\tborderRadius: 8,\r\n\tborder: \"1px solid color-mix(in srgb, var(--dsw-alias-state-warn-primary, #e06c00) 35%, transparent)\",\r\n\tbackground: \"color-mix(in srgb, var(--dsw-alias-state-warn-primary, #e06c00) 10%, transparent)\",\r\n\tcolor: \"var(--dsw-alias-label-primary)\",\r\n};\r\nexport const tipStyle: CSSProperties = {\r\n\t...bodyStyle,\r\n\tpadding: \"10px 12px\",\r\n\tborderRadius: 8,\r\n\tborder: \"1px solid var(--dsw-alias-border-l2)\",\r\n\tbackground: \"var(--dsw-alias-bg-layer-1)\",\r\n\tcolor: \"var(--dsw-alias-label-primary)\",\r\n};\r\nexport const noticeStyle: CSSProperties = {\r\n\t...tipStyle,\r\n\tanimation: \"dsh-coding-oauth-fade-in 0.2s ease\",\r\n};\r\nexport const codeStyle: CSSProperties = {\r\n\tfontFamily: \"ui-monospace, SFMono-Regular, Menlo, Consolas, monospace\",\r\n\tfontSize: 20,\r\n\tletterSpacing: \"0.08em\",\r\n\tfontWeight: 600,\r\n\tcolor: \"var(--dsw-alias-label-primary)\",\r\n};\r\nexport const monoStyle: CSSProperties = { fontFamily: \"ui-monospace, SFMono-Regular, Menlo, Consolas, monospace\" };\r\nexport const snippetStyle: CSSProperties = {\r\n\t...monoStyle,\r\n\tdisplay: \"block\",\r\n\tfontSize: 12,\r\n\tlineHeight: \"18px\",\r\n\tpadding: \"10px 12px\",\r\n\tborderRadius: 8,\r\n\tborder: \"1px solid var(--dsw-alias-border-l2)\",\r\n\tbackground: \"var(--dsw-alias-bg-layer-1)\",\r\n\tcolor: \"var(--dsw-alias-label-primary)\",\r\n\toverflowWrap: \"anywhere\",\r\n\twhiteSpace: \"pre-wrap\",\r\n};\r\nexport const linkStyle: CSSProperties = { color: \"var(--dsw-alias-brand-primary)\", wordBreak: \"break-all\" };\r\nexport const listStyle: CSSProperties = {\r\n\tdisplay: \"flex\",\r\n\tflexDirection: \"column\",\r\n\tgap: 8,\r\n\tmargin: 0,\r\n\tpadding: 0,\r\n\tlistStyle: \"none\",\r\n};\r\nexport const checkRowStyle: CSSProperties = {\r\n\tdisplay: \"flex\",\r\n\talignItems: \"flex-start\",\r\n\tgap: 8,\r\n\tfontSize: 14,\r\n\tcolor: \"var(--dsw-alias-label-primary)\",\r\n};\r\nexport const inputStyle: CSSProperties = {\r\n\tboxSizing: \"border-box\",\r\n\twidth: \"100%\",\r\n\tminHeight: 34,\r\n\tpadding: \"6px 12px\",\r\n\tborder: \"1px solid var(--dsw-alias-border-l2)\",\r\n\tborderRadius: 8,\r\n\tbackground: \"var(--dsw-alias-bg-layer-1)\",\r\n\tcolor: \"var(--dsw-alias-label-primary)\",\r\n\tfont: \"inherit\",\r\n\tfontSize: 13,\r\n\ttransition: TRANSITION,\r\n};\r\nexport const nestedStyle: CSSProperties = {\r\n\tdisplay: \"flex\",\r\n\tflexDirection: \"column\",\r\n\tgap: 8,\r\n\tpadding: \"12px 14px\",\r\n\tborder: \"1px solid var(--dsw-alias-border-l2)\",\r\n\tborderRadius: 8,\r\n\tbackground: \"var(--dsw-alias-bg-layer-1)\",\r\n};\r\nexport const hintStyle: CSSProperties = { ...bodyStyle, fontSize: 13 };\r\nexport const visuallyHiddenStyle: CSSProperties = {\r\n\tposition: \"absolute\",\r\n\twidth: 1,\r\n\theight: 1,\r\n\tpadding: 0,\r\n\tmargin: -1,\r\n\toverflow: \"hidden\",\r\n\tclip: \"rect(0, 0, 0, 0)\",\r\n\twhiteSpace: \"nowrap\",\r\n\tborder: 0,\r\n};\r\nexport const segmentedNavStyle: CSSProperties = {\r\n\tdisplay: \"inline-flex\",\r\n\tflexWrap: \"wrap\",\r\n\tgap: 2,\r\n\tpadding: 3,\r\n\tborderRadius: 10,\r\n\tborder: \"1px solid var(--dsw-alias-border-l2)\",\r\n\tbackground: \"var(--dsw-alias-bg-layer-1)\",\r\n};\r\nexport const segmentedTabStyle: CSSProperties = {\r\n\t...buttonStyle,\r\n\tborder: \"none\",\r\n\tborderRadius: 8,\r\n\tboxShadow: \"none\",\r\n\tbackground: \"transparent\",\r\n\tminHeight: 32,\r\n\tpadding: \"5px 12px\",\r\n\tfontSize: 13,\r\n};\r\nexport const segmentedTabActiveStyle: CSSProperties = {\r\n\t...segmentedTabStyle,\r\n\tbackground: \"var(--dsw-alias-bg-module-platform)\",\r\n\tcolor: \"var(--dsw-alias-label-primary)\",\r\n\tboxShadow: \"0 1px 2px rgba(0, 0, 0, 0.12)\",\r\n\tfontWeight: 600,\r\n};\r\nexport const panelStyle: CSSProperties = {\r\n\tdisplay: \"flex\",\r\n\tflexDirection: \"column\",\r\n\tgap: 14,\r\n\tminWidth: 0,\r\n};\r\nexport const accountGridStyle: CSSProperties = {\r\n\tdisplay: \"grid\",\r\n\tgridTemplateColumns: \"repeat(auto-fill, minmax(min(320px, 100%), 1fr))\",\r\n\tgap: 14,\r\n};\r\nexport const copyRowStyle: CSSProperties = {\r\n\tdisplay: \"flex\",\r\n\talignItems: \"center\",\r\n\tjustifyContent: \"space-between\",\r\n\tflexWrap: \"wrap\",\r\n\tgap: 8,\r\n};\r\nexport const skeletonStyle: CSSProperties = {\r\n\t...cardStyle,\r\n\tminHeight: 88,\r\n\tbackground:\r\n\t\t\"linear-gradient(90deg, var(--dsw-alias-bg-layer-1) 0%, var(--dsw-alias-bg-module-platform) 50%, var(--dsw-alias-bg-layer-1) 100%)\",\r\n\tbackgroundSize: \"200% 100%\",\r\n\tanimation: \"dsh-coding-oauth-skeleton-pulse 1.4s ease-in-out infinite\",\r\n};\r\nexport const stepRowStyle: CSSProperties = {\r\n\tdisplay: \"flex\",\r\n\talignItems: \"flex-start\",\r\n\tgap: 10,\r\n\tfontSize: 14,\r\n\tcolor: \"var(--dsw-alias-label-secondary)\",\r\n};\r\nexport const stepActiveStyle: CSSProperties = {\r\n\t...stepRowStyle,\r\n\tcolor: \"var(--dsw-alias-label-primary)\",\r\n\tfontWeight: 500,\r\n};\r\nexport const stepNumberStyle: CSSProperties = {\r\n\tdisplay: \"inline-flex\",\r\n\talignItems: \"center\",\r\n\tjustifyContent: \"center\",\r\n\twidth: 22,\r\n\theight: 22,\r\n\tborderRadius: \"50%\",\r\n\tflex: \"0 0 auto\",\r\n\tfontSize: 12,\r\n\tfontWeight: 600,\r\n\tbackground: \"var(--dsw-alias-bg-layer-1)\",\r\n\tborder: \"1px solid var(--dsw-alias-border-l2)\",\r\n\tcolor: \"var(--dsw-alias-label-secondary)\",\r\n};\r\nexport const stepNumberActiveStyle: CSSProperties = {\r\n\t...stepNumberStyle,\r\n\tbackground: \"var(--dsw-alias-button-primary-fill)\",\r\n\tborderColor: \"var(--dsw-alias-button-primary-fill)\",\r\n\tcolor: \"var(--dsw-alias-label-primary-foreground)\",\r\n};\r\n\r\nexport type StatusTone = \"success\" | \"error\" | \"warning\" | \"info\" | \"neutral\";\r\n\r\nexport function statusToneColor(tone: StatusTone): string {\r\n\tswitch (tone) {\r\n\t\tcase \"success\":\r\n\t\t\treturn \"var(--dsw-alias-state-success-primary, #22a06b)\";\r\n\t\tcase \"error\":\r\n\t\t\treturn \"var(--dsw-alias-state-error-primary, #d92d20)\";\r\n\t\tcase \"warning\":\r\n\t\t\t// DSH token is `state-warn-*` (not `state-warning-*`).\r\n\t\t\treturn \"var(--dsw-alias-state-warn-primary, #e06c00)\";\r\n\t\tcase \"info\":\r\n\t\t\t// Accent/text color (not a solid fill + white text pair).\r\n\t\t\treturn \"var(--dsw-alias-brand-primary, #1677ff)\";\r\n\t\tdefault:\r\n\t\t\t// Prefer tertiary over dimmed: dimmed is near-invisible on light cards\r\n\t\t\t// and too dark on dark cards.\r\n\t\t\treturn \"var(--dsw-alias-label-tertiary, #81858c)\";\r\n\t}\r\n}\r\n\r\nexport function badgeStyle(tone: StatusTone): CSSProperties {\r\n\tconst color = statusToneColor(tone);\r\n\treturn {\r\n\t\tdisplay: \"inline-flex\",\r\n\t\talignItems: \"center\",\r\n\t\tgap: 6,\r\n\t\tpadding: \"3px 10px\",\r\n\t\tborderRadius: 999,\r\n\t\tfontSize: 12,\r\n\t\tfontWeight: 600,\r\n\t\tlineHeight: \"18px\",\r\n\t\tcolor,\r\n\t\tbackground: `color-mix(in srgb, ${color} 14%, transparent)`,\r\n\t\tborder: `1px solid color-mix(in srgb, ${color} 28%, transparent)`,\r\n\t\twhiteSpace: \"nowrap\",\r\n\t};\r\n}\r\n\r\nexport function dotStyle(\r\n\tstatus: ProviderStatus[\"status\"] | \"loading\" | \"available\" | \"unavailable\",\r\n\tinstalled = true,\r\n): CSSProperties {\r\n\tconst color = !installed\r\n\t\t? \"var(--dsw-alias-label-tertiary, #81858c)\"\r\n\t\t: status === \"signed-in\" || status === \"available\"\r\n\t\t\t? \"var(--dsw-alias-state-success-primary, #22a06b)\"\r\n\t\t\t: status === \"error\"\r\n\t\t\t\t? \"var(--dsw-alias-state-error-primary, #d92d20)\"\r\n\t\t\t\t: status === \"signing-in\" || status === \"loading\"\r\n\t\t\t\t\t? \"var(--dsw-alias-brand-primary, #1677ff)\"\r\n\t\t\t\t\t: \"var(--dsw-alias-label-tertiary, #81858c)\";\r\n\treturn { width: 9, height: 9, borderRadius: \"50%\", flex: \"0 0 auto\", background: color };\r\n}\r\n\r\nexport function providerStatusTone(status: ProviderStatus[\"status\"], installed = true): StatusTone {\r\n\tif (!installed) return \"neutral\";\r\n\tif (status === \"signed-in\") return \"success\";\r\n\tif (status === \"error\") return \"error\";\r\n\tif (status === \"signing-in\") return \"info\";\r\n\treturn \"neutral\";\r\n}\r\n", "/** About tab: terms, remote help, and plugin version. */\r\n\r\nimport { PLUGIN_VERSION } from \"../constants.ts\";\r\nimport { bodyStyle, cardStyle, hintStyle, linkStyle, titleStyle, warningStyle } from \"../styles.ts\";\r\nimport type { GrokBuildSettingsInjected } from \"../types.ts\";\r\n\r\nconst README_URL = \"https://github.com/lninghaha/dsh-coding-subscription-oauth#readme\";\r\n\r\nexport interface AboutTabProps {\r\n\tt: GrokBuildSettingsInjected[\"t\"];\r\n}\r\n\r\nexport function AboutTab({ t }: AboutTabProps) {\r\n\treturn (\r\n\t\t<section style={cardStyle} aria-labelledby=\"coding-oauth-about-title\">\r\n\t\t\t<h3 id=\"coding-oauth-about-title\" style={{ ...titleStyle, fontSize: 16 }}>\r\n\t\t\t\t{t(\"aboutTitle\")}\r\n\t\t\t</h3>\r\n\t\t\t<p style={{ ...warningStyle, marginTop: 12 }}>{t(\"termsWarning\")}</p>\r\n\t\t\t<p style={{ ...bodyStyle, marginTop: 12 }}>{t(\"remoteLoginHelp\")}</p>\r\n\t\t\t<p style={{ ...hintStyle, marginTop: 12 }}>{t(\"pluginVersion\", { version: PLUGIN_VERSION })}</p>\r\n\t\t\t<p style={{ ...hintStyle, marginTop: 8 }}>{t(\"aboutDocsHint\")}</p>\r\n\t\t\t<p style={{ marginTop: 8 }}>\r\n\t\t\t\t<a href={README_URL} target=\"_blank\" rel=\"noreferrer\" style={linkStyle}>\r\n\t\t\t\t\t{t(\"aboutDocsLink\")}\r\n\t\t\t\t</a>\r\n\t\t\t</p>\r\n\t\t</section>\r\n\t);\r\n}\r\n", "/** Accounts tab: provider cards, CLI tips, and pull preview. */\r\n\r\nimport { Fragment, useEffect, useRef } from \"react\";\r\nimport { PROVIDERS } from \"../constants.ts\";\r\nimport { allOfficialCliMissing, anyOfficialCliAvailable } from \"../display.ts\";\r\nimport {\r\n\taccountGridStyle,\r\n\tbodyStyle,\r\n\tcardStyle,\r\n\tdotStyle,\r\n\thintStyle,\r\n\tmonoStyle,\r\n\trowStyle,\r\n\tskeletonStyle,\r\n\tstatusStyle,\r\n\ttitleStyle,\r\n} from \"../styles.ts\";\r\nimport type {\r\n\tCodingOAuthStatus,\r\n\tGrokBuildSettingsInjected,\r\n\tLoginMethod,\r\n\tProviderSlug,\r\n\tSourcePreview,\r\n\tSourceStatus,\r\n\tUsageView,\r\n} from \"../types.ts\";\r\nimport { Badge } from \"./Badge.tsx\";\r\nimport { CliPullPreview } from \"./CliPullPreview.tsx\";\r\nimport { NoticeBanner } from \"./NoticeBanner.tsx\";\r\nimport { ProviderCard } from \"./ProviderCard.tsx\";\r\n\r\nexport interface AccountsTabProps {\r\n\tt: GrokBuildSettingsInjected[\"t\"];\r\n\tstatus: CodingOAuthStatus | undefined;\r\n\tremote: boolean;\r\n\tremoteTipDismissed: boolean;\r\n\tonDismissRemoteTip: () => void;\r\n\tsources: readonly SourceStatus[] | undefined;\r\n\tsourcesError: string | undefined;\r\n\tsourcesNotice: string | undefined;\r\n\tsourcesBusy: boolean;\r\n\tpreview: SourcePreview | undefined;\r\n\tconfirmOverwrite: boolean;\r\n\tbusyProvider: ProviderSlug | undefined;\r\n\tcodeInputs: Partial<Record<ProviderSlug, string>>;\r\n\tpopupBlocked: Partial<Record<ProviderSlug, boolean>>;\r\n\texpandedProviders: Partial<Record<ProviderSlug, boolean>>;\r\n\tshowUsage: boolean;\r\n\tusage: UsageView | undefined;\r\n\tusageError: string | undefined;\r\n\tusageLoading: boolean;\r\n\tonSignIn: (slug: ProviderSlug, method: LoginMethod) => void;\r\n\tonSignOut: (slug: ProviderSlug) => void;\r\n\tonCancelLogin: (slug: ProviderSlug) => void;\r\n\tonSubmitCode: (slug: ProviderSlug) => void;\r\n\tonCodeChange: (slug: ProviderSlug, value: string) => void;\r\n\tonToggleExpanded: (slug: ProviderSlug) => void;\r\n\tonPreviewSource: (slug: ProviderSlug) => void;\r\n\tonSaveModels: (slug: ProviderSlug, selected: string[]) => void;\r\n\tonConfirmOverwriteChange: (checked: boolean) => void;\r\n\tonCommitSource: () => void;\r\n\tonCancelSourcePreview: () => void;\r\n\tonRefreshSources: () => void;\r\n\tonDismissSourcesNotice: () => void;\r\n}\r\n\r\nexport function AccountsTab({\r\n\tt,\r\n\tstatus,\r\n\tremote,\r\n\tremoteTipDismissed,\r\n\tonDismissRemoteTip,\r\n\tsources,\r\n\tsourcesError,\r\n\tsourcesNotice,\r\n\tsourcesBusy,\r\n\tpreview,\r\n\tconfirmOverwrite,\r\n\tbusyProvider,\r\n\tcodeInputs,\r\n\tpopupBlocked,\r\n\texpandedProviders,\r\n\tshowUsage,\r\n\tusage,\r\n\tusageError,\r\n\tusageLoading,\r\n\tonSignIn,\r\n\tonSignOut,\r\n\tonCancelLogin,\r\n\tonSubmitCode,\r\n\tonCodeChange,\r\n\tonToggleExpanded,\r\n\tonPreviewSource,\r\n\tonSaveModels,\r\n\tonConfirmOverwriteChange,\r\n\tonCommitSource,\r\n\tonCancelSourcePreview,\r\n\tonRefreshSources,\r\n\tonDismissSourcesNotice,\r\n}: AccountsTabProps) {\r\n\tconst previousPreviewKind = useRef<ProviderSlug | undefined>(undefined);\r\n\tuseEffect(() => {\r\n\t\tif (preview !== undefined) {\r\n\t\t\tpreviousPreviewKind.current = preview.kind;\r\n\t\t\tdocument.getElementById(`coding-oauth-source-preview-${preview.kind}`)?.focus();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst trigger = previousPreviewKind.current;\r\n\t\tif (trigger === undefined || sourcesBusy) return;\r\n\t\tpreviousPreviewKind.current = undefined;\r\n\t\tdocument.getElementById(`coding-oauth-source-pull-${trigger}`)?.focus();\r\n\t}, [preview, sourcesBusy]);\r\n\r\n\tif (status === undefined) {\r\n\t\treturn (\r\n\t\t\t<div style={skeletonStyle} role=\"status\" aria-busy=\"true\">\r\n\t\t\t\t<div style={statusStyle}>\r\n\t\t\t\t\t<span aria-hidden=\"true\" style={dotStyle(\"loading\")} />\r\n\t\t\t\t\t{t(\"loadingAccount\")}\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t);\r\n\t}\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t{remote && !remoteTipDismissed ? (\r\n\t\t\t\t<NoticeBanner\r\n\t\t\t\t\tmessage={t(\"remoteAccountsTip\")}\r\n\t\t\t\t\tdismissLabel={t(\"remoteTipDismiss\")}\r\n\t\t\t\t\tonDismiss={onDismissRemoteTip}\r\n\t\t\t\t/>\r\n\t\t\t) : null}\r\n\t\t\t{allOfficialCliMissing(sources) ? (\r\n\t\t\t\t<NoticeBanner\r\n\t\t\t\t\tmessage={t(\"sourcesAllMissingHint\")}\r\n\t\t\t\t\tdismissLabel={t(\"sourcesCheckAgain\")}\r\n\t\t\t\t\tonDismiss={() => {\r\n\t\t\t\t\t\tonRefreshSources();\r\n\t\t\t\t\t}}\r\n\t\t\t\t/>\r\n\t\t\t) : null}\r\n\t\t\t{anyOfficialCliAvailable(sources) ? <p style={hintStyle}>{t(\"sourcesAvailableHint\")}</p> : null}\r\n\t\t\t{sourcesError === undefined ? null : (\r\n\t\t\t\t<p style={{ ...bodyStyle, color: \"var(--dsw-alias-state-error-primary)\" }} role=\"alert\">\r\n\t\t\t\t\t{sourcesError}\r\n\t\t\t\t</p>\r\n\t\t\t)}\r\n\t\t\t{sourcesNotice === undefined ? null : (\r\n\t\t\t\t<NoticeBanner\r\n\t\t\t\t\tkey={sourcesNotice}\r\n\t\t\t\t\tmessage={sourcesNotice}\r\n\t\t\t\t\ttone=\"success\"\r\n\t\t\t\t\tautoHideMs={5000}\r\n\t\t\t\t\tonDismiss={onDismissSourcesNotice}\r\n\t\t\t\t/>\r\n\t\t\t)}\r\n\t\t\t<div style={accountGridStyle}>\r\n\t\t\t\t{PROVIDERS.map((definition) => {\r\n\t\t\t\t\tconst providerStatus = status.providers[definition.slug];\r\n\t\t\t\t\tconst expanded = providerStatus.status === \"signing-in\" || expandedProviders[definition.slug] === true;\r\n\t\t\t\t\treturn (\r\n\t\t\t\t\t\t<Fragment key={definition.slug}>\r\n\t\t\t\t\t\t\t<ProviderCard\r\n\t\t\t\t\t\t\t\tt={t}\r\n\t\t\t\t\t\t\t\tdefinition={definition}\r\n\t\t\t\t\t\t\t\tproviderStatus={providerStatus}\r\n\t\t\t\t\t\t\t\tbusy={busyProvider === definition.slug}\r\n\t\t\t\t\t\t\t\tsourcesBusy={sourcesBusy}\r\n\t\t\t\t\t\t\t\tremote={remote}\r\n\t\t\t\t\t\t\t\tcodeInput={codeInputs[definition.slug] ?? \"\"}\r\n\t\t\t\t\t\t\t\tpopupBlocked={popupBlocked[definition.slug] === true}\r\n\t\t\t\t\t\t\t\texpanded={expanded}\r\n\t\t\t\t\t\t\t\tsource={sources?.find((entry) => entry.kind === definition.slug)}\r\n\t\t\t\t\t\t\t\tshowUsage={showUsage}\r\n\t\t\t\t\t\t\t\tusage={usage}\r\n\t\t\t\t\t\t\t\tusageError={usageError}\r\n\t\t\t\t\t\t\t\tusageLoading={usageLoading}\r\n\t\t\t\t\t\t\t\tonSignIn={(method) => {\r\n\t\t\t\t\t\t\t\t\tonSignIn(definition.slug, method);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\tonSignOut={() => {\r\n\t\t\t\t\t\t\t\t\tonSignOut(definition.slug);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\tonCancelLogin={() => {\r\n\t\t\t\t\t\t\t\t\tonCancelLogin(definition.slug);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\tonSubmitCode={() => {\r\n\t\t\t\t\t\t\t\t\tonSubmitCode(definition.slug);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\tonCodeChange={(value) => {\r\n\t\t\t\t\t\t\t\t\tonCodeChange(definition.slug, value);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\tonToggleExpanded={() => {\r\n\t\t\t\t\t\t\t\t\tonToggleExpanded(definition.slug);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\tonPreviewSource={() => {\r\n\t\t\t\t\t\t\t\t\tonPreviewSource(definition.slug);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\tonSaveModels={(selected) => {\r\n\t\t\t\t\t\t\t\t\tonSaveModels(definition.slug, selected);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t{preview?.kind === definition.slug ? (\r\n\t\t\t\t\t\t\t\t<div style={{ gridColumn: \"1 / -1\", minWidth: 0 }}>\r\n\t\t\t\t\t\t\t\t\t<CliPullPreview\r\n\t\t\t\t\t\t\t\t\t\tt={t}\r\n\t\t\t\t\t\t\t\t\t\tpreview={preview}\r\n\t\t\t\t\t\t\t\t\t\tconfirmOverwrite={confirmOverwrite}\r\n\t\t\t\t\t\t\t\t\t\tsourcesBusy={sourcesBusy}\r\n\t\t\t\t\t\t\t\t\t\tonConfirmOverwriteChange={onConfirmOverwriteChange}\r\n\t\t\t\t\t\t\t\t\t\tonCommit={onCommitSource}\r\n\t\t\t\t\t\t\t\t\t\tonCancel={onCancelSourcePreview}\r\n\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t) : null}\r\n\t\t\t\t\t\t</Fragment>\r\n\t\t\t\t\t);\r\n\t\t\t\t})}\r\n\t\t\t\t<div style={cardStyle}>\r\n\t\t\t\t\t<div style={rowStyle}>\r\n\t\t\t\t\t\t<div>\r\n\t\t\t\t\t\t\t<h3 style={{ ...titleStyle, fontSize: 16 }}>{t(\"antigravityTitle\")}</h3>\r\n\t\t\t\t\t\t\t<p style={{ ...bodyStyle, marginTop: 4 }}>{t(\"antigravityDescription\")}</p>\r\n\t\t\t\t\t\t\t<p style={{ ...bodyStyle, marginTop: 4 }}>\r\n\t\t\t\t\t\t\t\t<span style={monoStyle}>{status.antigravity.route}</span>\r\n\t\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t<Badge\r\n\t\t\t\t\t\t\tlabel={status.antigravity.installed ? t(\"antigravityInstalled\") : t(\"antigravityMissing\")}\r\n\t\t\t\t\t\t\ttone={status.antigravity.installed ? \"success\" : \"neutral\"}\r\n\t\t\t\t\t\t\tinstalled={status.antigravity.installed}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<p style={bodyStyle}>{t(\"antigravityCliHint\")}</p>\r\n\t\t\t\t\t<code style={{ ...monoStyle, fontSize: 12, overflowWrap: \"anywhere\" }}>{t(\"antigravityCliCommand\")}</code>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</>\r\n\t);\r\n}\r\n", "/** Pure display helpers for remote UX and CLI pull noise control. */\r\n\r\nimport type { GrokBuildSettingsInjected, LoginMethod, ProviderCardDefinition, SourceStatus } from \"./types.ts\";\r\n\r\nconst LOOPBACK_HOSTS = new Set([\"localhost\", \"127.0.0.1\", \"[::1]\", \"::1\"]);\r\n\r\n/** True when the Settings page is served from a non-loopback host (typical remote DSH). */\r\nexport function isLikelyRemoteHost(hostname: string): boolean {\r\n\tconst normalized = hostname.trim().toLowerCase();\r\n\tif (normalized.length === 0) return false;\r\n\tif (LOOPBACK_HOSTS.has(normalized)) return false;\r\n\tif (normalized.endsWith(\".localhost\")) return false;\r\n\treturn true;\r\n}\r\n\r\nexport function preferredLoginMethod(definition: ProviderCardDefinition, remote: boolean): LoginMethod {\r\n\tif (\r\n\t\tremote &&\r\n\t\tdefinition.remoteRecommended !== undefined &&\r\n\t\tdefinition.methods.includes(definition.remoteRecommended)\r\n\t) {\r\n\t\treturn definition.remoteRecommended;\r\n\t}\r\n\treturn definition.recommended;\r\n}\r\n\r\n/** Put the recommended method first so the primary CTA is unambiguous. */\r\nexport function orderedLoginMethods(definition: ProviderCardDefinition, remote: boolean): LoginMethod[] {\r\n\tconst preferred = preferredLoginMethod(definition, remote);\r\n\tconst rest = definition.methods.filter((method) => method !== preferred);\r\n\treturn definition.methods.includes(preferred) ? [preferred, ...rest] : [...definition.methods];\r\n}\r\n\r\n/** Per-card CLI \u201Cmissing\u201D copy is noisy on remote hosts; keep only actionable reasons. */\r\nexport function shouldShowPerCardSourceReason(source: SourceStatus | undefined): boolean {\r\n\tif (source === undefined || source.available) return false;\r\n\tif (source.reason === undefined) return false;\r\n\treturn source.reason !== \"missing\";\r\n}\r\n\r\nexport function allOfficialCliMissing(sources: readonly SourceStatus[] | undefined): boolean {\r\n\tif (sources === undefined || sources.length === 0) return false;\r\n\treturn sources.every((source) => !source.available && (source.reason === undefined || source.reason === \"missing\"));\r\n}\r\n\r\nexport function anyOfficialCliAvailable(sources: readonly SourceStatus[] | undefined): boolean {\r\n\treturn sources?.some((source) => source.available) === true;\r\n}\r\n\r\nexport function methodLabel(\r\n\tmethod: LoginMethod,\r\n\tt: GrokBuildSettingsInjected[\"t\"],\r\n\toptions?: { remote?: boolean; primary?: boolean },\r\n): string {\r\n\tif (method === \"device\") {\r\n\t\tif (options?.remote === true && options.primary === true) return t(\"deviceLoginRemote\");\r\n\t\treturn t(\"deviceLogin\");\r\n\t}\r\n\tif (method === \"browser\") return t(\"browserLogin\");\r\n\treturn t(\"pkceLogin\");\r\n}\r\n", "/** Status capsule badge with semantic tone colors. */\r\n\r\nimport { badgeStyle, dotStyle, providerStatusTone, type StatusTone } from \"../styles.ts\";\r\nimport type { ProviderStatus } from \"../types.ts\";\r\n\r\nexport interface BadgeProps {\r\n\tlabel: string;\r\n\ttone?: StatusTone;\r\n\t/** When set, derives tone from provider login status. */\r\n\tproviderStatus?: ProviderStatus[\"status\"];\r\n\tinstalled?: boolean;\r\n\tshowDot?: boolean;\r\n}\r\n\r\nexport function Badge({ label, tone, providerStatus, installed = true, showDot = true }: BadgeProps) {\r\n\tconst resolvedTone =\r\n\t\ttone ?? (providerStatus !== undefined ? providerStatusTone(providerStatus, installed) : \"neutral\");\r\n\treturn (\r\n\t\t<span style={badgeStyle(resolvedTone)} role=\"status\">\r\n\t\t\t{showDot ? (\r\n\t\t\t\t<span\r\n\t\t\t\t\taria-hidden=\"true\"\r\n\t\t\t\t\tstyle={{\r\n\t\t\t\t\t\t...dotStyle(providerStatus ?? (resolvedTone === \"success\" ? \"signed-in\" : \"signed-out\"), installed),\r\n\t\t\t\t\t\twidth: 7,\r\n\t\t\t\t\t\theight: 7,\r\n\t\t\t\t\t}}\r\n\t\t\t\t/>\r\n\t\t\t) : null}\r\n\t\t\t<span>{label}</span>\r\n\t\t</span>\r\n\t);\r\n}\r\n", "/** Response parsers and small formatting helpers for the settings UI. */\r\n\r\nimport { isRecord } from \"./api.ts\";\r\nimport {\r\n\tGATEWAY_PORT_MAX,\r\n\tGATEWAY_PORT_MIN,\r\n\tGATEWAY_RANDOM_PORT_MAX,\r\n\tGATEWAY_RANDOM_PORT_MIN,\r\n\tGATEWAY_RANDOM_RESERVED,\r\n\tHOUR_MS,\r\n\tIMAGINE_SOURCE_KEY,\r\n\tSOURCE_COMMIT_ACTIONS,\r\n\tSOURCE_CONFLICTS,\r\n\tSOURCE_DEFAULT_PATH,\r\n\tSOURCE_KINDS,\r\n\tSOURCE_PREVIEW_ACTIONS,\r\n\tSOURCE_REASONS,\r\n} from \"./constants.ts\";\r\nimport type {\r\n\tCapabilitySettingsView,\r\n\tCapabilitySnapshot,\r\n\tGatewayView,\r\n\tGrokBuildSettingsInjected,\r\n\tImagineCredentialView,\r\n\tProviderStatus,\r\n\tSourceCommitAction,\r\n\tSourceConflict,\r\n\tSourceKind,\r\n\tSourcePreview,\r\n\tSourcePreviewAction,\r\n\tSourceReason,\r\n\tSourceStatus,\r\n\tUsageLimitView,\r\n\tUsageView,\r\n\tUsageWindowView,\r\n} from \"./types.ts\";\r\n\r\nexport function optionalString(value: unknown): string | undefined {\r\n\treturn typeof value === \"string\" && value.length > 0 && value.length < 500 ? value : undefined;\r\n}\r\n\r\nexport function optionalFiniteNumber(value: unknown): number | undefined {\r\n\treturn typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\r\n}\r\n\r\nexport function optionalBoolean(value: unknown): boolean | undefined {\r\n\treturn typeof value === \"boolean\" ? value : undefined;\r\n}\r\n\r\nexport function optionalPercent(value: unknown): number | undefined {\r\n\tconst numeric = optionalFiniteNumber(value);\r\n\treturn numeric !== undefined && numeric >= 0 && numeric <= 100 ? numeric : undefined;\r\n}\r\n\r\nexport function isSourceKind(value: string): value is SourceKind {\r\n\treturn (SOURCE_KINDS as readonly string[]).includes(value);\r\n}\r\n\r\nexport function isSourceReason(value: string): value is SourceReason {\r\n\treturn (SOURCE_REASONS as readonly string[]).includes(value);\r\n}\r\n\r\nexport function isSourceConflict(value: string): value is SourceConflict {\r\n\treturn (SOURCE_CONFLICTS as readonly string[]).includes(value);\r\n}\r\n\r\nexport function isSourcePreviewAction(value: string): value is SourcePreviewAction {\r\n\treturn (SOURCE_PREVIEW_ACTIONS as readonly string[]).includes(value);\r\n}\r\n\r\nexport function isSourceCommitAction(value: string): value is SourceCommitAction {\r\n\treturn (SOURCE_COMMIT_ACTIONS as readonly string[]).includes(value);\r\n}\r\n\r\nexport function looksSecret(value: string): boolean {\r\n\treturn /eyJ[A-Za-z0-9_-]+\\.|sk-[A-Za-z0-9_-]{8,}|Bearer\\s+\\S+/u.test(value);\r\n}\r\n\r\nexport function safeDisplayPath(value: unknown, kind: SourceKind): string {\r\n\tconst text = optionalString(value);\r\n\tif (text === undefined || looksSecret(text) || text.length > 180) return SOURCE_DEFAULT_PATH[kind];\r\n\treturn text;\r\n}\r\n\r\nexport function safeWarning(value: unknown): string | undefined {\r\n\tconst text = optionalString(value);\r\n\tif (text === undefined || looksSecret(text)) return undefined;\r\n\treturn text;\r\n}\r\n\r\nexport function formatEpoch(value: number | undefined): string | undefined {\r\n\tif (value === undefined || !Number.isFinite(value) || value <= 0) return undefined;\r\n\tconst ms = value > 1e12 ? value : value > 1e9 ? value * 1000 : undefined;\r\n\tif (ms === undefined) return undefined;\r\n\tconst formatted = new Date(ms).toLocaleString();\r\n\treturn formatted.length > 0 ? formatted : undefined;\r\n}\r\n\r\nexport function parseSource(value: unknown): SourceStatus | undefined {\r\n\tif (!isRecord(value) || typeof value[\"kind\"] !== \"string\" || !isSourceKind(value[\"kind\"])) return undefined;\r\n\tconst kind = value[\"kind\"];\r\n\tconst reasonRaw = optionalString(value[\"reason\"]);\r\n\tconst expiresAt = optionalFiniteNumber(value[\"expiresAt\"]);\r\n\treturn {\r\n\t\tkind,\r\n\t\tdisplayPath: safeDisplayPath(value[\"displayPath\"], kind),\r\n\t\tavailable: value[\"available\"] === true,\r\n\t\t...(expiresAt === undefined ? {} : { expiresAt }),\r\n\t\t...(reasonRaw !== undefined && isSourceReason(reasonRaw) ? { reason: reasonRaw } : {}),\r\n\t};\r\n}\r\n\r\nexport function mergeSources(discovered: readonly SourceStatus[]): SourceStatus[] {\r\n\treturn SOURCE_KINDS.map((kind) => {\r\n\t\tconst found = discovered.find((entry) => entry.kind === kind);\r\n\t\treturn found ?? { kind, displayPath: SOURCE_DEFAULT_PATH[kind], available: false, reason: \"missing\" };\r\n\t});\r\n}\r\n\r\nexport function parseSources(value: unknown): SourceStatus[] {\r\n\tconst rows = Array.isArray(value)\r\n\t\t? value\r\n\t\t: isRecord(value) && Array.isArray(value[\"sources\"])\r\n\t\t\t? value[\"sources\"]\r\n\t\t\t: [];\r\n\treturn mergeSources(rows.map(parseSource).filter((entry): entry is SourceStatus => entry !== undefined));\r\n}\r\n\r\nexport function parsePreview(value: unknown): SourcePreview | undefined {\r\n\tif (!isRecord(value)) return undefined;\r\n\tconst previewId = optionalString(value[\"previewId\"]);\r\n\tconst kindRaw = optionalString(value[\"kind\"]);\r\n\tif (previewId === undefined || kindRaw === undefined || !isSourceKind(kindRaw)) return undefined;\r\n\tconst conflictRaw = optionalString(value[\"conflict\"]);\r\n\tconst actionRaw = optionalString(value[\"action\"]);\r\n\tconst expiresAt = optionalFiniteNumber(value[\"expiresAt\"]);\r\n\tconst ticketExpiresAt = optionalFiniteNumber(value[\"ticketExpiresAt\"]);\r\n\tconst warnings = Array.isArray(value[\"warnings\"])\r\n\t\t? value[\"warnings\"].map(safeWarning).filter((entry): entry is string => entry !== undefined)\r\n\t\t: [];\r\n\treturn {\r\n\t\tpreviewId,\r\n\t\tkind: kindRaw,\r\n\t\tdisplayPath: safeDisplayPath(value[\"displayPath\"], kindRaw),\r\n\t\tconfirmOverwriteRequired: value[\"confirmOverwriteRequired\"] === true,\r\n\t\twarnings,\r\n\t\t...(expiresAt === undefined ? {} : { expiresAt }),\r\n\t\t...(ticketExpiresAt === undefined ? {} : { ticketExpiresAt }),\r\n\t\t...(conflictRaw !== undefined && isSourceConflict(conflictRaw) ? { conflict: conflictRaw } : {}),\r\n\t\t...(actionRaw !== undefined && isSourcePreviewAction(actionRaw) ? { action: actionRaw } : {}),\r\n\t};\r\n}\r\n\r\nexport function parseCommitAction(value: unknown): SourceCommitAction | undefined {\r\n\tif (!isRecord(value)) return undefined;\r\n\tconst action = optionalString(value[\"action\"]);\r\n\treturn action !== undefined && isSourceCommitAction(action) ? action : undefined;\r\n}\r\n\r\nexport function boundedInteger(value: unknown, min: number, max: number, fallback: number): number {\r\n\tconst numeric = optionalFiniteNumber(value);\r\n\treturn numeric !== undefined && Number.isInteger(numeric) && numeric >= min && numeric <= max ? numeric : fallback;\r\n}\r\n\r\nexport function emptyCapabilitySettings(): CapabilitySettingsView {\r\n\treturn {\r\n\t\tcodexSearch: false,\r\n\t\tcodexImages: false,\r\n\t\tcodexImageEdits: false,\r\n\t\tcodexUsage: false,\r\n\t\tcodexFast: false,\r\n\t\tgrokImagineImage: false,\r\n\t\tgrokImagineVideo: false,\r\n\t\tsearchResults: 5,\r\n\t\timageCount: 1,\r\n\t\tvideoArtifactTtlMs: 7 * 24 * HOUR_MS,\r\n\t};\r\n}\r\n\r\nexport function parseCapabilitySettings(value: unknown): CapabilitySettingsView {\r\n\tconst source = isRecord(value) ? value : {};\r\n\treturn {\r\n\t\tcodexSearch: source[\"codexSearch\"] === true,\r\n\t\tcodexImages: source[\"codexImages\"] === true,\r\n\t\tcodexImageEdits: source[\"codexImageEdits\"] === true,\r\n\t\tcodexUsage: source[\"codexUsage\"] === true,\r\n\t\tcodexFast: source[\"codexFast\"] === true,\r\n\t\tgrokImagineImage: source[\"grokImagineImage\"] === true,\r\n\t\tgrokImagineVideo: source[\"grokImagineVideo\"] === true,\r\n\t\tsearchResults: boundedInteger(source[\"searchResults\"], 1, 20, 5),\r\n\t\timageCount: boundedInteger(source[\"imageCount\"], 1, 4, 1),\r\n\t\tvideoArtifactTtlMs: boundedInteger(source[\"videoArtifactTtlMs\"], HOUR_MS, 7 * 24 * HOUR_MS, 7 * 24 * HOUR_MS),\r\n\t};\r\n}\r\n\r\nexport function parseCapabilities(value: unknown): CapabilitySnapshot | undefined {\r\n\tif (!isRecord(value)) return undefined;\r\n\tconst nested = isRecord(value[\"value\"]) ? value[\"value\"] : value;\r\n\tconst revision = optionalFiniteNumber(value[\"revision\"]);\r\n\tif (revision === undefined && !isRecord(value[\"value\"]) && value[\"writable\"] === undefined) return undefined;\r\n\treturn {\r\n\t\tvalue: parseCapabilitySettings(nested),\r\n\t\trevision: revision ?? 0,\r\n\t\twritable: value[\"writable\"] === true,\r\n\t};\r\n}\r\n\r\nfunction parseUsageWindow(value: unknown): UsageWindowView | undefined {\r\n\tif (!isRecord(value)) return undefined;\r\n\tconst usedPercent = optionalPercent(value[\"usedPercent\"] ?? value[\"used_percent\"]);\r\n\tconst remainingPercent = optionalPercent(value[\"remainingPercent\"] ?? value[\"remaining_percent\"]);\r\n\tconst windowSeconds = optionalFiniteNumber(value[\"windowSeconds\"] ?? value[\"limit_window_seconds\"]);\r\n\tconst resetsAt = optionalFiniteNumber(value[\"resetsAt\"] ?? value[\"reset_at\"]);\r\n\tif (\r\n\t\tusedPercent === undefined &&\r\n\t\tremainingPercent === undefined &&\r\n\t\twindowSeconds === undefined &&\r\n\t\tresetsAt === undefined\r\n\t) {\r\n\t\treturn undefined;\r\n\t}\r\n\treturn {\r\n\t\t...(usedPercent === undefined ? {} : { usedPercent }),\r\n\t\t...(remainingPercent === undefined ? {} : { remainingPercent }),\r\n\t\t...(windowSeconds !== undefined && windowSeconds > 0 ? { windowSeconds } : {}),\r\n\t\t...(resetsAt === undefined ? {} : { resetsAt }),\r\n\t};\r\n}\r\n\r\nfunction parseUsageLimit(value: unknown, fallbackId: string): UsageLimitView | undefined {\r\n\tif (!isRecord(value)) return undefined;\r\n\tconst id = optionalString(value[\"id\"]) ?? optionalString(value[\"metered_feature\"]) ?? fallbackId;\r\n\tconst name = optionalString(value[\"name\"]) ?? optionalString(value[\"limit_name\"]);\r\n\tconst nested = isRecord(value[\"rate_limit\"]) ? value[\"rate_limit\"] : value;\r\n\tconst windows = Array.isArray(value[\"windows\"])\r\n\t\t? value[\"windows\"].map(parseUsageWindow).filter((entry): entry is UsageWindowView => entry !== undefined)\r\n\t\t: [\r\n\t\t\t\tparseUsageWindow(nested[\"primary_window\"]),\r\n\t\t\t\tparseUsageWindow(nested[\"secondary_window\"]),\r\n\t\t\t\tparseUsageWindow(nested),\r\n\t\t\t].filter((entry): entry is UsageWindowView => entry !== undefined);\r\n\tif (windows.length === 0 && name === undefined && optionalString(value[\"id\"]) === undefined) return undefined;\r\n\treturn { id, windows, ...(name === undefined ? {} : { name }) };\r\n}\r\n\r\nexport function parseUsage(value: unknown): UsageView | undefined {\r\n\tif (!isRecord(value)) return undefined;\r\n\tconst payload = isRecord(value[\"usage\"]) ? value[\"usage\"] : value;\r\n\tconst rateLimits: UsageLimitView[] = [];\r\n\tconst seen = new Set<string>();\r\n\tconst add = (limit: UsageLimitView | undefined): void => {\r\n\t\tif (limit === undefined || seen.has(limit.id)) return;\r\n\t\tseen.add(limit.id);\r\n\t\trateLimits.push(limit);\r\n\t};\r\n\tif (Array.isArray(payload[\"rateLimits\"])) {\r\n\t\tpayload[\"rateLimits\"].forEach((entry, index) => add(parseUsageLimit(entry, `limit-${String(index)}`)));\r\n\t} else {\r\n\t\tadd(parseUsageLimit(payload[\"rate_limit\"], \"codex\"));\r\n\t\tif (Array.isArray(payload[\"additional_rate_limits\"])) {\r\n\t\t\tpayload[\"additional_rate_limits\"].forEach((entry, index) =>\r\n\t\t\t\tadd(parseUsageLimit(entry, `extra-${String(index)}`)),\r\n\t\t\t);\r\n\t\t}\r\n\t\tadd(parseUsageLimit(payload[\"code_review_rate_limit\"], \"code_review\"));\r\n\t}\r\n\tconst credits = isRecord(payload[\"credits\"]) ? payload[\"credits\"] : undefined;\r\n\tconst spend = isRecord(payload[\"individualLimit\"])\r\n\t\t? payload[\"individualLimit\"]\r\n\t\t: isRecord(payload[\"spend_control\"])\r\n\t\t\t? isRecord(payload[\"spend_control\"][\"individual_limit\"])\r\n\t\t\t\t? payload[\"spend_control\"][\"individual_limit\"]\r\n\t\t\t\t: payload[\"spend_control\"]\r\n\t\t\t: undefined;\r\n\tconst resetRaw = isRecord(payload[\"resetCredits\"])\r\n\t\t? payload[\"resetCredits\"][\"availableCount\"]\r\n\t\t: isRecord(payload[\"rate_limit_reset_credits\"])\r\n\t\t\t? payload[\"rate_limit_reset_credits\"][\"available_count\"]\r\n\t\t\t: undefined;\r\n\tconst resetCredits = optionalFiniteNumber(resetRaw);\r\n\tconst fetchedAt = optionalFiniteNumber(payload[\"fetchedAt\"]);\r\n\tconst spendControlReached =\r\n\t\toptionalBoolean(payload[\"spendControlReached\"]) ??\r\n\t\t(isRecord(payload[\"spend_control\"]) ? optionalBoolean(payload[\"spend_control\"][\"reached\"]) : undefined);\r\n\tconst creditsBalance = credits === undefined ? undefined : optionalString(credits[\"balance\"]);\r\n\tconst individualLimit = spend === undefined ? undefined : optionalString(spend[\"limit\"]);\r\n\tconst individualUsed = spend === undefined ? undefined : optionalString(spend[\"used\"]);\r\n\tconst individualRemaining = spend === undefined ? undefined : optionalString(spend[\"remaining\"]);\r\n\tconst individualRemainingPercent =\r\n\t\tspend === undefined ? undefined : optionalPercent(spend[\"remainingPercent\"] ?? spend[\"remaining_percent\"]);\r\n\tconst individualResetsAt =\r\n\t\tspend === undefined ? undefined : optionalFiniteNumber(spend[\"resetsAt\"] ?? spend[\"reset_at\"]);\r\n\treturn {\r\n\t\trateLimits,\r\n\t\t...(credits !== undefined && typeof credits[\"unlimited\"] === \"boolean\"\r\n\t\t\t? { creditsUnlimited: credits[\"unlimited\"] }\r\n\t\t\t: {}),\r\n\t\t...(creditsBalance === undefined ? {} : { creditsBalance }),\r\n\t\t...(individualLimit === undefined ? {} : { individualLimit }),\r\n\t\t...(individualUsed === undefined ? {} : { individualUsed }),\r\n\t\t...(individualRemaining === undefined ? {} : { individualRemaining }),\r\n\t\t...(individualRemainingPercent === undefined ? {} : { individualRemainingPercent }),\r\n\t\t...(individualResetsAt === undefined ? {} : { individualResetsAt }),\r\n\t\t...(spendControlReached === undefined ? {} : { spendControlReached }),\r\n\t\t...(resetCredits !== undefined && resetCredits >= 0 && Number.isSafeInteger(resetCredits) ? { resetCredits } : {}),\r\n\t\t...(fetchedAt === undefined ? {} : { fetchedAt }),\r\n\t};\r\n}\r\n\r\nexport function usageHasVisibleFields(usage: UsageView): boolean {\r\n\treturn (\r\n\t\tusage.rateLimits.some((limit) => limit.windows.length > 0 || limit.name !== undefined) ||\r\n\t\tusage.creditsUnlimited !== undefined ||\r\n\t\tusage.creditsBalance !== undefined ||\r\n\t\tusage.individualLimit !== undefined ||\r\n\t\tusage.individualUsed !== undefined ||\r\n\t\tusage.individualRemaining !== undefined ||\r\n\t\tusage.individualRemainingPercent !== undefined ||\r\n\t\tusage.spendControlReached === true ||\r\n\t\tusage.resetCredits !== undefined\r\n\t);\r\n}\r\n\r\nexport function parseGateway(value: unknown): GatewayView | undefined {\r\n\tif (!isRecord(value)) return undefined;\r\n\tconst bind = optionalString(value[\"bind\"]);\r\n\tconst port = optionalFiniteNumber(value[\"port\"]);\r\n\tif (bind === undefined || port === undefined) return undefined;\r\n\tconst models = Array.isArray(value[\"models\"])\r\n\t\t? value[\"models\"].filter((model): model is string => typeof model === \"string\" && model.length > 0)\r\n\t\t: [];\r\n\tconst model = optionalString(value[\"model\"]) ?? models[0] ?? null;\r\n\tif (models.length === 0 && model !== null) models.push(model);\r\n\tconst keyAvailable = value[\"keyAvailable\"] === true || value[\"keyConfigured\"] === true;\r\n\treturn {\r\n\t\tenabled: value[\"enabled\"] === true,\r\n\t\trunning: value[\"running\"] === true,\r\n\t\tbind,\r\n\t\tport,\r\n\t\tmodel,\r\n\t\tkeyConfigured: keyAvailable,\r\n\t\tkeyAvailable,\r\n\t\tkeyHint: optionalString(value[\"keyHint\"]) ?? \"\",\r\n\t\tmodels,\r\n\t\twarning: optionalString(value[\"warning\"]) ?? \"\",\r\n\t};\r\n}\r\n\r\nexport function formatGatewayBaseUrl(bind: string, port: number): string {\r\n\tconst host = bind.includes(\":\") && !bind.startsWith(\"[\") ? `[${bind}]` : bind;\r\n\treturn `http://${host}:${String(port)}`;\r\n}\r\n\r\nexport function randomGatewayPort(exclude?: number): number {\r\n\tfor (let attempt = 0; attempt < 32; attempt += 1) {\r\n\t\tconst span = GATEWAY_RANDOM_PORT_MAX - GATEWAY_RANDOM_PORT_MIN + 1;\r\n\t\tconst candidate = GATEWAY_RANDOM_PORT_MIN + Math.floor(Math.random() * span);\r\n\t\tif (candidate !== exclude && !GATEWAY_RANDOM_RESERVED.has(candidate)) return candidate;\r\n\t}\r\n\treturn exclude === GATEWAY_RANDOM_PORT_MIN ? GATEWAY_RANDOM_PORT_MIN + 1 : GATEWAY_RANDOM_PORT_MIN;\r\n}\r\n\r\nexport function parseGatewayPort(value: string): number | undefined {\r\n\tconst port = Number(value);\r\n\tif (!Number.isInteger(port) || port < GATEWAY_PORT_MIN || port > GATEWAY_PORT_MAX) return undefined;\r\n\treturn port;\r\n}\r\n\r\nexport function parseImagineCredential(value: unknown): ImagineCredentialView | undefined {\r\n\tif (!isRecord(value)) return undefined;\r\n\tconst configured = optionalBoolean(value[\"configured\"]);\r\n\tif (configured === undefined && value[\"source\"] === undefined && value[\"writable\"] === undefined) return undefined;\r\n\tconst source = optionalString(value[\"source\"]);\r\n\tconst writable = optionalBoolean(value[\"writable\"]);\r\n\treturn {\r\n\t\tconfigured: configured === true,\r\n\t\t...(source === undefined || looksSecret(source) ? {} : { source }),\r\n\t\t...(writable === undefined ? {} : { writable }),\r\n\t};\r\n}\r\n\r\nexport function imagineSourceLabel(source: string | undefined, t: GrokBuildSettingsInjected[\"t\"]): string {\r\n\tif (source === undefined) return t(\"imagineSourceUnknown\");\r\n\tconst mapped = IMAGINE_SOURCE_KEY[source] ?? IMAGINE_SOURCE_KEY[source.toLowerCase()];\r\n\tif (mapped !== undefined) return t(mapped);\r\n\tif (source.length <= 40 && /^[a-z0-9._-]+$/iu.test(source) && !looksSecret(source)) return source;\r\n\treturn t(\"imagineSourceUnknown\");\r\n}\r\n\r\nexport function modelFields(status: ProviderStatus): { available: string[]; selected: string[] } {\r\n\tif (status.status !== \"signed-in\") return { available: [], selected: [] };\r\n\treturn {\r\n\t\tavailable: \"available\" in status ? status.available : [],\r\n\t\tselected: \"selected\" in status ? status.selected : [],\r\n\t};\r\n}\r\n", "/** CLI credential pull preview panel. */\r\n\r\nimport { SOURCE_CONFLICT_KEY, SOURCE_KIND_KEY, SOURCE_PREVIEW_ACTION_KEY } from \"../constants.ts\";\r\nimport { formatEpoch } from \"../parsers.ts\";\r\nimport {\r\n\tbodyStyle,\r\n\tbuttonStyle,\r\n\tcardStyle,\r\n\tcheckRowStyle,\r\n\thintStyle,\r\n\tlistStyle,\r\n\tmonoStyle,\r\n\tprimaryButtonStyle,\r\n} from \"../styles.ts\";\r\nimport type { GrokBuildSettingsInjected, SourcePreview } from \"../types.ts\";\r\n\r\nexport interface CliPullPreviewProps {\r\n\tt: GrokBuildSettingsInjected[\"t\"];\r\n\tpreview: SourcePreview;\r\n\tconfirmOverwrite: boolean;\r\n\tsourcesBusy: boolean;\r\n\tonConfirmOverwriteChange: (checked: boolean) => void;\r\n\tonCommit: () => void;\r\n\tonCancel: () => void;\r\n}\r\n\r\nexport function CliPullPreview({\r\n\tt,\r\n\tpreview,\r\n\tconfirmOverwrite,\r\n\tsourcesBusy,\r\n\tonConfirmOverwriteChange,\r\n\tonCommit,\r\n\tonCancel,\r\n}: CliPullPreviewProps) {\r\n\tconst expiresAt = formatEpoch(preview.expiresAt);\r\n\tconst ticketExpiresAt = formatEpoch(preview.ticketExpiresAt);\r\n\r\n\treturn (\r\n\t\t<section\r\n\t\t\tid={`coding-oauth-source-preview-${preview.kind}`}\r\n\t\t\tstyle={cardStyle}\r\n\t\t\taria-labelledby={`coding-oauth-source-preview-title-${preview.kind}`}\r\n\t\t\taria-live=\"polite\"\r\n\t\t\ttabIndex={-1}\r\n\t\t>\r\n\t\t\t<p id={`coding-oauth-source-preview-title-${preview.kind}`} style={bodyStyle}>\r\n\t\t\t\t{t(\"sourcesPreviewTitle\")} \u00B7 {t(SOURCE_KIND_KEY[preview.kind])}\r\n\t\t\t</p>\r\n\t\t\t<p style={hintStyle}>\r\n\t\t\t\t<span style={monoStyle}>{preview.displayPath}</span>\r\n\t\t\t</p>\r\n\t\t\t<p style={bodyStyle}>\r\n\t\t\t\t{t(\"sourcesConflict\", {\r\n\t\t\t\t\tdetail: t(\r\n\t\t\t\t\t\tpreview.conflict === undefined ? \"sourceConflictUnrecognized\" : SOURCE_CONFLICT_KEY[preview.conflict],\r\n\t\t\t\t\t),\r\n\t\t\t\t})}\r\n\t\t\t</p>\r\n\t\t\t<p style={bodyStyle}>\r\n\t\t\t\t{t(\"sourcesAction\", {\r\n\t\t\t\t\tdetail: t(\r\n\t\t\t\t\t\tpreview.action === undefined ? \"sourceActionUnrecognized\" : SOURCE_PREVIEW_ACTION_KEY[preview.action],\r\n\t\t\t\t\t),\r\n\t\t\t\t})}\r\n\t\t\t</p>\r\n\t\t\t{expiresAt === undefined ? null : <p style={hintStyle}>{t(\"sourcesPreviewExpires\", { time: expiresAt })}</p>}\r\n\t\t\t{ticketExpiresAt === undefined ? null : (\r\n\t\t\t\t<p style={hintStyle}>{t(\"sourcesTicketExpires\", { time: ticketExpiresAt })}</p>\r\n\t\t\t)}\r\n\t\t\t{preview.warnings.length === 0 ? null : (\r\n\t\t\t\t<ul style={{ ...listStyle, gap: 4 }} aria-label={t(\"sourcesWarnings\")}>\r\n\t\t\t\t\t{preview.warnings.map((warning) => (\r\n\t\t\t\t\t\t<li key={warning} style={hintStyle}>\r\n\t\t\t\t\t\t\t{warning}\r\n\t\t\t\t\t\t</li>\r\n\t\t\t\t\t))}\r\n\t\t\t\t</ul>\r\n\t\t\t)}\r\n\t\t\t{preview.confirmOverwriteRequired ? (\r\n\t\t\t\t<label style={checkRowStyle}>\r\n\t\t\t\t\t<input\r\n\t\t\t\t\t\taria-describedby={`coding-oauth-source-overwrite-hint-${preview.kind}`}\r\n\t\t\t\t\t\ttype=\"checkbox\"\r\n\t\t\t\t\t\tchecked={confirmOverwrite}\r\n\t\t\t\t\t\tdisabled={sourcesBusy || preview.action === \"blocked\"}\r\n\t\t\t\t\t\tonChange={(event) => {\r\n\t\t\t\t\t\t\tonConfirmOverwriteChange(event.target.checked);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t/>\r\n\t\t\t\t\t<span>\r\n\t\t\t\t\t\t{t(\"sourcesConfirmOverwrite\")}\r\n\t\t\t\t\t\t<span id={`coding-oauth-source-overwrite-hint-${preview.kind}`} style={{ display: \"block\", ...hintStyle }}>\r\n\t\t\t\t\t\t\t{t(\"sourcesConfirmOverwriteHint\")}\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t</span>\r\n\t\t\t\t</label>\r\n\t\t\t) : null}\r\n\t\t\t<div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8 }}>\r\n\t\t\t\t<button\r\n\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\tstyle={primaryButtonStyle}\r\n\t\t\t\t\tdisabled={\r\n\t\t\t\t\t\tsourcesBusy || preview.action === \"blocked\" || (preview.confirmOverwriteRequired && !confirmOverwrite)\r\n\t\t\t\t\t}\r\n\t\t\t\t\tonClick={onCommit}\r\n\t\t\t\t>\r\n\t\t\t\t\t{t(\"sourcesCommit\")}\r\n\t\t\t\t</button>\r\n\t\t\t\t<button type=\"button\" style={buttonStyle} disabled={sourcesBusy} onClick={onCancel}>\r\n\t\t\t\t\t{t(\"sourcesCancelPreview\")}\r\n\t\t\t\t</button>\r\n\t\t\t</div>\r\n\t\t</section>\r\n\t);\r\n}\r\n", "/** Dismissible notice banner with optional auto-hide. */\r\n\r\nimport { useEffect } from \"react\";\r\nimport { bodyStyle, buttonStyle, noticeStyle } from \"../styles.ts\";\r\n\r\nexport interface NoticeBannerProps {\r\n\tmessage: string;\r\n\tdismissLabel?: string;\r\n\tonDismiss?: () => void;\r\n\tautoHideMs?: number;\r\n\ttone?: \"info\" | \"success\";\r\n}\r\n\r\nexport function NoticeBanner({ message, dismissLabel, onDismiss, autoHideMs, tone = \"info\" }: NoticeBannerProps) {\r\n\tuseEffect(() => {\r\n\t\tif (autoHideMs === undefined || onDismiss === undefined) return;\r\n\t\tconst timer = window.setTimeout(onDismiss, autoHideMs);\r\n\t\treturn () => {\r\n\t\t\twindow.clearTimeout(timer);\r\n\t\t};\r\n\t}, [autoHideMs, onDismiss]);\r\n\r\n\tconst borderColor =\r\n\t\ttone === \"success\" ? \"var(--dsw-alias-state-success-primary, #22a06b)\" : \"var(--dsw-alias-brand-primary, #1677ff)\";\r\n\r\n\treturn (\r\n\t\t<div\r\n\t\t\tstyle={{\r\n\t\t\t\t...noticeStyle,\r\n\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\talignItems: \"flex-start\",\r\n\t\t\t\tjustifyContent: \"space-between\",\r\n\t\t\t\tgap: 12,\r\n\t\t\t\tborderLeft: `3px solid ${borderColor}`,\r\n\t\t\t}}\r\n\t\t\trole=\"status\"\r\n\t\t>\r\n\t\t\t<p style={{ ...bodyStyle, margin: 0, color: \"var(--dsw-alias-label-primary)\" }}>{message}</p>\r\n\t\t\t{onDismiss === undefined || dismissLabel === undefined ? null : (\r\n\t\t\t\t<button type=\"button\" style={buttonStyle} onClick={onDismiss}>\r\n\t\t\t\t\t{dismissLabel}\r\n\t\t\t\t</button>\r\n\t\t\t)}\r\n\t\t</div>\r\n\t);\r\n}\r\n", "/** Single provider account card for the Accounts tab. */\r\n\r\nimport { useEffect, useMemo, useRef, useState } from \"react\";\r\nimport { SOURCE_REASON_KEY } from \"../constants.ts\";\r\nimport { methodLabel, orderedLoginMethods, shouldShowPerCardSourceReason } from \"../display.ts\";\r\nimport { formatEpoch, modelFields, usageHasVisibleFields } from \"../parsers.ts\";\r\nimport {\r\n\tbodyStyle,\r\n\tbuttonStyle,\r\n\tcardStyle,\r\n\tcheckRowStyle,\r\n\tcodeStyle,\r\n\tcompactButtonStyle,\r\n\thintStyle,\r\n\tinputStyle,\r\n\tlistStyle,\r\n\tmonoStyle,\r\n\tnestedStyle,\r\n\tprimaryButtonStyle,\r\n\trowStyle,\r\n\tstepActiveStyle,\r\n\tstepNumberActiveStyle,\r\n\tstepNumberStyle,\r\n\tstepRowStyle,\r\n\ttitleStyle,\r\n\tvisuallyHiddenStyle,\r\n} from \"../styles.ts\";\r\nimport type {\r\n\tGrokBuildSettingsInjected,\r\n\tGrokStatus,\r\n\tLoginMethod,\r\n\tProviderCardDefinition,\r\n\tProviderStatus,\r\n\tSourceStatus,\r\n\tUsageView,\r\n} from \"../types.ts\";\r\nimport { Badge } from \"./Badge.tsx\";\r\nimport { CopyButton } from \"./CopyButton.tsx\";\r\nimport { ProgressBar } from \"./ProgressBar.tsx\";\r\n\r\nexport interface ProviderCardProps {\r\n\tt: GrokBuildSettingsInjected[\"t\"];\r\n\tdefinition: ProviderCardDefinition;\r\n\tproviderStatus: ProviderStatus;\r\n\tbusy: boolean;\r\n\tsourcesBusy: boolean;\r\n\tremote: boolean;\r\n\tcodeInput: string;\r\n\tpopupBlocked: boolean;\r\n\texpanded: boolean;\r\n\tsource: SourceStatus | undefined;\r\n\tshowUsage: boolean;\r\n\tusage: UsageView | undefined;\r\n\tusageError: string | undefined;\r\n\tusageLoading: boolean;\r\n\tonSignIn: (method: LoginMethod) => void;\r\n\tonSignOut: () => void;\r\n\tonCancelLogin: () => void;\r\n\tonSubmitCode: () => void;\r\n\tonCodeChange: (value: string) => void;\r\n\tonToggleExpanded: () => void;\r\n\tonPreviewSource: () => void;\r\n\tonSaveModels: (selected: string[]) => void;\r\n}\r\n\r\nfunction SignInSteps({\r\n\tt,\r\n\tactiveMethod,\r\n\tuserCode,\r\n\turl,\r\n\tpopupBlocked,\r\n}: {\r\n\tt: GrokBuildSettingsInjected[\"t\"];\r\n\tactiveMethod: LoginMethod;\r\n\tuserCode: string | undefined;\r\n\turl: string | undefined;\r\n\tpopupBlocked: boolean;\r\n}) {\r\n\tconst hasCode = userCode !== undefined && userCode.length > 0;\r\n\tconst hasUrl = url !== undefined && url.length > 0;\r\n\tconst needsPaste = activeMethod !== \"device\";\r\n\r\n\treturn (\r\n\t\t<div style={{ display: \"flex\", flexDirection: \"column\", gap: 10 }}>\r\n\t\t\t<div style={hasUrl ? stepActiveStyle : stepRowStyle}>\r\n\t\t\t\t<span style={hasUrl ? stepNumberActiveStyle : stepNumberStyle} aria-hidden=\"true\">\r\n\t\t\t\t\t1\r\n\t\t\t\t</span>\r\n\t\t\t\t<span>{t(\"signInStepOpen\")}</span>\r\n\t\t\t</div>\r\n\t\t\t{hasUrl ? (\r\n\t\t\t\t<div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8, paddingLeft: 32 }}>\r\n\t\t\t\t\t<a href={url} target=\"_blank\" rel=\"noreferrer\" style={primaryButtonStyle}>\r\n\t\t\t\t\t\t{t(\"openAuthUrl\")}\r\n\t\t\t\t\t</a>\r\n\t\t\t\t\t<CopyButton text={url} idleLabel={t(\"copy\")} copiedLabel={t(\"copied\")} failedLabel={t(\"copyFailed\")} />\r\n\t\t\t\t</div>\r\n\t\t\t) : null}\r\n\t\t\t{popupBlocked && hasUrl ? <p style={hintStyle}>{t(\"popupBlocked\")}</p> : null}\r\n\t\t\t{hasCode ? (\r\n\t\t\t\t<>\r\n\t\t\t\t\t<div style={stepActiveStyle}>\r\n\t\t\t\t\t\t<span style={stepNumberActiveStyle} aria-hidden=\"true\">\r\n\t\t\t\t\t\t\t2\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t<span>{t(\"signInStepCode\")}</span>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div style={{ display: \"flex\", flexWrap: \"wrap\", alignItems: \"center\", gap: 8, paddingLeft: 32 }}>\r\n\t\t\t\t\t\t<span style={codeStyle}>{userCode}</span>\r\n\t\t\t\t\t\t<CopyButton\r\n\t\t\t\t\t\t\ttext={userCode}\r\n\t\t\t\t\t\t\tidleLabel={t(\"copyUserCode\")}\r\n\t\t\t\t\t\t\tcopiedLabel={t(\"copied\")}\r\n\t\t\t\t\t\t\tfailedLabel={t(\"copyFailed\")}\r\n\t\t\t\t\t\t\tprimary\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</>\r\n\t\t\t) : null}\r\n\t\t\t<div style={stepActiveStyle}>\r\n\t\t\t\t<span style={stepNumberActiveStyle} aria-hidden=\"true\">\r\n\t\t\t\t\t{hasCode ? 3 : 2}\r\n\t\t\t\t</span>\r\n\t\t\t\t<span style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}>\r\n\t\t\t\t\t<span\r\n\t\t\t\t\t\taria-hidden=\"true\"\r\n\t\t\t\t\t\tstyle={{\r\n\t\t\t\t\t\t\twidth: 14,\r\n\t\t\t\t\t\t\theight: 14,\r\n\t\t\t\t\t\t\tborder: \"2px solid var(--dsw-alias-brand-primary, #1677ff)\",\r\n\t\t\t\t\t\t\tborderTopColor: \"transparent\",\r\n\t\t\t\t\t\t\tborderRadius: \"50%\",\r\n\t\t\t\t\t\t\tanimation: \"dsh-coding-oauth-spin 0.8s linear infinite\",\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t/>\r\n\t\t\t\t\t{t(\"signInStepWait\")}\r\n\t\t\t\t</span>\r\n\t\t\t</div>\r\n\t\t\t{needsPaste ? (\r\n\t\t\t\t<div style={{ display: \"flex\", flexDirection: \"column\", gap: 8, paddingLeft: 32 }}>\r\n\t\t\t\t\t<p style={bodyStyle}>{t(activeMethod === \"browser\" ? \"pasteBrowserCodeHint\" : \"pasteCodeHint\")}</p>\r\n\t\t\t\t</div>\r\n\t\t\t) : null}\r\n\t\t</div>\r\n\t);\r\n}\r\n\r\nexport function ProviderCard({\r\n\tt,\r\n\tdefinition,\r\n\tproviderStatus,\r\n\tbusy,\r\n\tsourcesBusy,\r\n\tremote,\r\n\tcodeInput,\r\n\tpopupBlocked,\r\n\texpanded,\r\n\tsource,\r\n\tshowUsage,\r\n\tusage,\r\n\tusageError,\r\n\tusageLoading,\r\n\tonSignIn,\r\n\tonSignOut,\r\n\tonCancelLogin,\r\n\tonSubmitCode,\r\n\tonCodeChange,\r\n\tonToggleExpanded,\r\n\tonPreviewSource,\r\n\tonSaveModels,\r\n}: ProviderCardProps) {\r\n\tconst [showAltMethods, setShowAltMethods] = useState(false);\r\n\tconst [modelFilter, setModelFilter] = useState(\"\");\r\n\tconst [logoutConfirm, setLogoutConfirm] = useState(false);\r\n\tconst logoutTrigger = useRef<HTMLButtonElement>(null);\r\n\tconst logoutConfirmAction = useRef<HTMLButtonElement>(null);\r\n\tconst restoreLogoutFocus = useRef(false);\r\n\r\n\tconst ordered = orderedLoginMethods(definition, remote);\r\n\tconst primaryMethod: LoginMethod = ordered[0] ?? definition.recommended;\r\n\tconst altMethods = ordered.filter((method) => method !== primaryMethod);\r\n\r\n\tconst statusLabel =\r\n\t\tproviderStatus.status === \"signed-in\"\r\n\t\t\t? t(\"signedIn\")\r\n\t\t\t: providerStatus.status === \"signing-in\"\r\n\t\t\t\t? t(\"signingIn\")\r\n\t\t\t\t: providerStatus.status === \"error\"\r\n\t\t\t\t\t? t(\"requestFailed\")\r\n\t\t\t\t\t: t(\"signedOut\");\r\n\tconst activeMethod = providerStatus.status === \"signing-in\" ? providerStatus.method : primaryMethod;\r\n\tconst { available, selected } = useMemo(() => modelFields(providerStatus), [providerStatus]);\r\n\tconst [modelDraft, setModelDraft] = useState<string[]>(selected);\r\n\tuseEffect(() => {\r\n\t\tsetModelDraft(selected);\r\n\t}, [selected]);\r\n\tuseEffect(() => {\r\n\t\tif (providerStatus.status !== \"signed-in\") setLogoutConfirm(false);\r\n\t}, [providerStatus.status]);\r\n\tuseEffect(() => {\r\n\t\tif (logoutConfirm) {\r\n\t\t\tlogoutConfirmAction.current?.focus();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!restoreLogoutFocus.current) return;\r\n\t\trestoreLogoutFocus.current = false;\r\n\t\tif (providerStatus.status === \"signed-in\") {\r\n\t\t\tlogoutTrigger.current?.focus();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tdocument.getElementById(`coding-oauth-login-${definition.slug}`)?.focus();\r\n\t}, [definition.slug, logoutConfirm, providerStatus.status]);\r\n\tconst modelDraftDirty =\r\n\t\tmodelDraft.length !== selected.length || modelDraft.some((model, index) => model !== selected[index]);\r\n\tconst grokProviderStatus = definition.slug === \"grok\" ? (providerStatus as GrokStatus) : undefined;\r\n\tconst showSourceReason = shouldShowPerCardSourceReason(source);\r\n\r\n\tconst filteredModels = useMemo(() => {\r\n\t\tconst query = modelFilter.trim().toLowerCase();\r\n\t\tif (query.length === 0) return available;\r\n\t\treturn available.filter((id) => id.toLowerCase().includes(query));\r\n\t}, [available, modelFilter]);\r\n\r\n\tconst usagePercent =\r\n\t\tdefinition.slug === \"codex\" && showUsage\r\n\t\t\t? usage?.individualRemainingPercent === undefined\r\n\t\t\t\t? usage?.rateLimits[0]?.windows[0]?.usedPercent\r\n\t\t\t\t: 100 - usage.individualRemainingPercent\r\n\t\t\t: undefined;\r\n\tconst fetchedAt = formatEpoch(usage?.fetchedAt);\r\n\r\n\treturn (\r\n\t\t<div style={cardStyle}>\r\n\t\t\t<div style={rowStyle}>\r\n\t\t\t\t<div>\r\n\t\t\t\t\t<h3 style={{ ...titleStyle, fontSize: 16 }}>{t(definition.titleKey)}</h3>\r\n\t\t\t\t\t{providerStatus.status === \"signed-in\" && !expanded ? (\r\n\t\t\t\t\t\t<p style={{ ...hintStyle, marginTop: 4 }}>\r\n\t\t\t\t\t\t\t{t(\"modelsSummary\", { selected: selected.length, total: available.length })}\r\n\t\t\t\t\t\t\t{usagePercent === undefined ? \"\" : ` \u00B7 ${t(\"usageUsedShort\", { value: `${String(usagePercent)}%` })}`}\r\n\t\t\t\t\t\t</p>\r\n\t\t\t\t\t) : (\r\n\t\t\t\t\t\t<>\r\n\t\t\t\t\t\t\t<p style={{ ...bodyStyle, marginTop: 4 }}>{t(definition.descriptionKey)}</p>\r\n\t\t\t\t\t\t\t<p style={{ ...bodyStyle, marginTop: 4 }}>\r\n\t\t\t\t\t\t\t\t<span style={monoStyle}>{definition.route}</span>\r\n\t\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t</>\r\n\t\t\t\t\t)}\r\n\t\t\t\t</div>\r\n\t\t\t\t<Badge label={statusLabel} providerStatus={providerStatus.status} />\r\n\t\t\t</div>\r\n\t\t\t<div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8 }}>\r\n\t\t\t\t{providerStatus.status === \"signed-in\" ? (\r\n\t\t\t\t\t<>\r\n\t\t\t\t\t\t{logoutConfirm ? (\r\n\t\t\t\t\t\t\t<fieldset style={{ ...nestedStyle, margin: 0, minWidth: 0 }}>\r\n\t\t\t\t\t\t\t\t<legend style={visuallyHiddenStyle}>{t(\"logoutConfirmTitle\")}</legend>\r\n\t\t\t\t\t\t\t\t<p style={bodyStyle}>{t(\"logoutConfirmHint\")}</p>\r\n\t\t\t\t\t\t\t\t<div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8 }}>\r\n\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\tref={logoutConfirmAction}\r\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\t\tstyle={primaryButtonStyle}\r\n\t\t\t\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\t\trestoreLogoutFocus.current = true;\r\n\t\t\t\t\t\t\t\t\t\t\tonSignOut();\r\n\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t{busy ? t(\"working\") : t(\"logoutConfirmAction\")}\r\n\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\t\tstyle={buttonStyle}\r\n\t\t\t\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\t\trestoreLogoutFocus.current = true;\r\n\t\t\t\t\t\t\t\t\t\t\tsetLogoutConfirm(false);\r\n\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t{t(\"cancel\")}\r\n\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</fieldset>\r\n\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\tref={logoutTrigger}\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tstyle={buttonStyle}\r\n\t\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\t\tonClick={() => setLogoutConfirm(true)}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{t(\"logout\")}\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\tid={`coding-oauth-models-toggle-${definition.slug}`}\r\n\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\tstyle={buttonStyle}\r\n\t\t\t\t\t\t\taria-expanded={expanded}\r\n\t\t\t\t\t\t\taria-controls={expanded ? `coding-oauth-models-${definition.slug}` : undefined}\r\n\t\t\t\t\t\t\tonClick={onToggleExpanded}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{expanded ? t(\"collapseModels\") : t(\"expandModels\")}\r\n\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t{source?.available === true ? (\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\tid={`coding-oauth-source-pull-${definition.slug}`}\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tstyle={buttonStyle}\r\n\t\t\t\t\t\t\t\tdisabled={sourcesBusy}\r\n\t\t\t\t\t\t\t\tonClick={onPreviewSource}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{t(\"sourcesPullCopy\")}\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t) : null}\r\n\t\t\t\t\t</>\r\n\t\t\t\t) : providerStatus.status === \"signing-in\" ? (\r\n\t\t\t\t\t<>\r\n\t\t\t\t\t\t<button type=\"button\" style={buttonStyle} disabled={busy} onClick={onCancelLogin}>\r\n\t\t\t\t\t\t\t{t(\"cancelLogin\")}\r\n\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t{altMethods.length > 0 ? (\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tstyle={compactButtonStyle}\r\n\t\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\tsetShowAltMethods((current) => !current);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{showAltMethods ? t(\"hideOtherLoginMethods\") : t(\"otherLoginMethods\")}\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t) : null}\r\n\t\t\t\t\t\t{showAltMethods\r\n\t\t\t\t\t\t\t? altMethods.map((method) => (\r\n\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\tkey={method}\r\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\t\tstyle={compactButtonStyle}\r\n\t\t\t\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\t\tonSignIn(method);\r\n\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t{methodLabel(method, t, { remote, primary: false })}\r\n\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t))\r\n\t\t\t\t\t\t\t: null}\r\n\t\t\t\t\t</>\r\n\t\t\t\t) : (\r\n\t\t\t\t\t<>\r\n\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\tid={`coding-oauth-login-${definition.slug}`}\r\n\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\tstyle={primaryButtonStyle}\r\n\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\tonSignIn(primaryMethod);\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{busy ? t(\"working\") : methodLabel(primaryMethod, t, { remote, primary: true })}\r\n\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t{altMethods.length > 0 ? (\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tstyle={compactButtonStyle}\r\n\t\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\tsetShowAltMethods((current) => !current);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{showAltMethods ? t(\"hideOtherLoginMethods\") : t(\"otherLoginMethods\")}\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t) : null}\r\n\t\t\t\t\t\t{showAltMethods\r\n\t\t\t\t\t\t\t? altMethods.map((method) => (\r\n\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\tkey={method}\r\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\t\tstyle={compactButtonStyle}\r\n\t\t\t\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\t\tonSignIn(method);\r\n\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t{methodLabel(method, t, { remote, primary: false })}\r\n\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t))\r\n\t\t\t\t\t\t\t: null}\r\n\t\t\t\t\t\t{source?.available === true ? (\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\tid={`coding-oauth-source-pull-${definition.slug}`}\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tstyle={buttonStyle}\r\n\t\t\t\t\t\t\t\tdisabled={sourcesBusy}\r\n\t\t\t\t\t\t\t\tonClick={onPreviewSource}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{t(\"sourcesPullCopy\")}\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t) : showSourceReason && source?.reason !== undefined ? (\r\n\t\t\t\t\t\t\t<span style={hintStyle}>{t(SOURCE_REASON_KEY[source.reason])}</span>\r\n\t\t\t\t\t\t) : null}\r\n\t\t\t\t\t</>\r\n\t\t\t\t)}\r\n\t\t\t</div>\r\n\t\t\t{providerStatus.status === \"error\" ? (\r\n\t\t\t\t<p style={{ ...bodyStyle, color: \"var(--dsw-alias-state-error-primary)\" }}>{providerStatus.message}</p>\r\n\t\t\t) : null}\r\n\t\t\t{providerStatus.status === \"signing-in\" ? (\r\n\t\t\t\t<SignInSteps\r\n\t\t\t\t\tt={t}\r\n\t\t\t\t\tactiveMethod={activeMethod}\r\n\t\t\t\t\tuserCode={providerStatus.userCode}\r\n\t\t\t\t\turl={providerStatus.url}\r\n\t\t\t\t\tpopupBlocked={popupBlocked}\r\n\t\t\t\t/>\r\n\t\t\t) : null}\r\n\t\t\t{providerStatus.status === \"signing-in\" && activeMethod !== \"device\" ? (\r\n\t\t\t\t<div style={{ display: \"flex\", flexDirection: \"column\", gap: 8 }}>\r\n\t\t\t\t\t<div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8 }}>\r\n\t\t\t\t\t\t<label htmlFor={`coding-oauth-code-${definition.slug}`} style={visuallyHiddenStyle}>\r\n\t\t\t\t\t\t\t{t(\"pasteCodeLabel\")}\r\n\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t<input\r\n\t\t\t\t\t\t\tid={`coding-oauth-code-${definition.slug}`}\r\n\t\t\t\t\t\t\tstyle={{ ...inputStyle, flex: \"1 1 360px\" }}\r\n\t\t\t\t\t\t\tvalue={codeInput}\r\n\t\t\t\t\t\t\tplaceholder={t(\"pasteCodePlaceholder\")}\r\n\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\tonChange={(event) => {\r\n\t\t\t\t\t\t\t\tonCodeChange(event.target.value);\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\tonKeyDown={(event) => {\r\n\t\t\t\t\t\t\t\tif (event.key === \"Enter\") {\r\n\t\t\t\t\t\t\t\t\tevent.preventDefault();\r\n\t\t\t\t\t\t\t\t\tonSubmitCode();\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\tstyle={primaryButtonStyle}\r\n\t\t\t\t\t\t\tdisabled={busy || codeInput.trim().length === 0}\r\n\t\t\t\t\t\t\tonClick={onSubmitCode}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{t(\"submitCode\")}\r\n\t\t\t\t\t\t</button>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t) : null}\r\n\t\t\t{providerStatus.status === \"signed-in\" && expanded ? (\r\n\t\t\t\t<div id={`coding-oauth-models-${definition.slug}`} style={{ display: \"flex\", flexDirection: \"column\", gap: 8 }}>\r\n\t\t\t\t\t<div style={rowStyle}>\r\n\t\t\t\t\t\t<h4 style={{ ...titleStyle, fontSize: 14 }}>{t(\"models\")}</h4>\r\n\t\t\t\t\t\t<div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8 }}>\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tstyle={compactButtonStyle}\r\n\t\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\tsetModelDraft([]);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{t(\"deselectAll\")}\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tstyle={compactButtonStyle}\r\n\t\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\tsetModelDraft([...available]);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{t(\"selectAll\")}\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tstyle={compactButtonStyle}\r\n\t\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\tsetModelDraft(available.length > 0 ? [available[0]!] : []);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{t(\"resetModelsDefault\")}\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<label htmlFor={`coding-oauth-model-filter-${definition.slug}`} style={visuallyHiddenStyle}>\r\n\t\t\t\t\t\t{t(\"modelFilterLabel\", { provider: t(definition.titleKey) })}\r\n\t\t\t\t\t</label>\r\n\t\t\t\t\t<input\r\n\t\t\t\t\t\tid={`coding-oauth-model-filter-${definition.slug}`}\r\n\t\t\t\t\t\ttype=\"search\"\r\n\t\t\t\t\t\tstyle={inputStyle}\r\n\t\t\t\t\t\tvalue={modelFilter}\r\n\t\t\t\t\t\tplaceholder={t(\"modelFilterPlaceholder\")}\r\n\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\tonChange={(event) => {\r\n\t\t\t\t\t\t\tsetModelFilter(event.target.value);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t/>\r\n\t\t\t\t\t{grokProviderStatus?.status === \"signed-in\" ? (\r\n\t\t\t\t\t\t<p style={bodyStyle}>\r\n\t\t\t\t\t\t\t{grokProviderStatus.catalogSource === \"live\"\r\n\t\t\t\t\t\t\t\t? t(\"catalogLive\")\r\n\t\t\t\t\t\t\t\t: grokProviderStatus.catalogSource === \"cache\"\r\n\t\t\t\t\t\t\t\t\t? t(\"catalogCache\")\r\n\t\t\t\t\t\t\t\t\t: t(\"catalogFallback\")}\r\n\t\t\t\t\t\t</p>\r\n\t\t\t\t\t) : null}\r\n\t\t\t\t\t<p style={bodyStyle}>\r\n\t\t\t\t\t\t{t(\"modelHint\")} <span style={monoStyle}>{definition.route}/<id></span>\r\n\t\t\t\t\t</p>\r\n\t\t\t\t\t<ul style={listStyle}>\r\n\t\t\t\t\t\t{filteredModels.map((id) => {\r\n\t\t\t\t\t\t\tconst checked = modelDraft.includes(id);\r\n\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t<li key={id}>\r\n\t\t\t\t\t\t\t\t\t<label style={checkRowStyle}>\r\n\t\t\t\t\t\t\t\t\t\t<input\r\n\t\t\t\t\t\t\t\t\t\t\ttype=\"checkbox\"\r\n\t\t\t\t\t\t\t\t\t\t\tchecked={checked}\r\n\t\t\t\t\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\t\t\t\t\tonChange={() => {\r\n\t\t\t\t\t\t\t\t\t\t\t\tconst current = new Set(modelDraft);\r\n\t\t\t\t\t\t\t\t\t\t\t\tif (checked) current.delete(id);\r\n\t\t\t\t\t\t\t\t\t\t\t\telse current.add(id);\r\n\t\t\t\t\t\t\t\t\t\t\t\tsetModelDraft([...available].filter((model) => current.has(model)));\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t\t<span style={monoStyle}>{id}</span>\r\n\t\t\t\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t\t\t</li>\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t})}\r\n\t\t\t\t\t</ul>\r\n\t\t\t\t\t<div style={{ display: \"flex\", flexWrap: \"wrap\", alignItems: \"center\", gap: 8 }}>\r\n\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\tstyle={primaryButtonStyle}\r\n\t\t\t\t\t\t\tdisabled={busy || !modelDraftDirty}\r\n\t\t\t\t\t\t\tonClick={() => onSaveModels(modelDraft)}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{busy ? t(\"working\") : t(\"applyModelDraft\")}\r\n\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t{modelDraftDirty ? <span style={hintStyle}>{t(\"modelDraftPending\")}</span> : null}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t{filteredModels.length === 0 ? <p style={hintStyle}>{t(\"modelFilterPlaceholder\")}</p> : null}\r\n\t\t\t\t\t{grokProviderStatus?.status === \"signed-in\" && grokProviderStatus.catalogError !== undefined ? (\r\n\t\t\t\t\t\t<p style={{ ...bodyStyle, color: \"var(--dsw-alias-state-error-primary)\" }}>{t(\"catalogError\")}</p>\r\n\t\t\t\t\t) : null}\r\n\t\t\t\t\t{definition.slug === \"codex\" && showUsage ? (\r\n\t\t\t\t\t\t<div style={nestedStyle}>\r\n\t\t\t\t\t\t\t<p style={{ ...bodyStyle, color: \"var(--dsw-alias-label-primary)\" }}>{t(\"usageTitle\")}</p>\r\n\t\t\t\t\t\t\t{usageError === undefined ? null : (\r\n\t\t\t\t\t\t\t\t<p style={{ ...bodyStyle, color: \"var(--dsw-alias-state-error-primary)\" }} role=\"alert\">\r\n\t\t\t\t\t\t\t\t\t{usageError}\r\n\t\t\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t{usageLoading && usage === undefined ? (\r\n\t\t\t\t\t\t\t\t<p style={hintStyle}>{t(\"usageLoading\")}</p>\r\n\t\t\t\t\t\t\t) : usage === undefined || !usageHasVisibleFields(usage) ? (\r\n\t\t\t\t\t\t\t\t<p style={hintStyle}>{t(\"usageEmpty\")}</p>\r\n\t\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\t<>\r\n\t\t\t\t\t\t\t\t\t{fetchedAt === undefined ? null : <p style={hintStyle}>{t(\"usageFetchedAt\", { time: fetchedAt })}</p>}\r\n\t\t\t\t\t\t\t\t\t{usagePercent !== undefined ? (\r\n\t\t\t\t\t\t\t\t\t\t<ProgressBar\r\n\t\t\t\t\t\t\t\t\t\t\tvalue={usagePercent}\r\n\t\t\t\t\t\t\t\t\t\t\tlabel={t(\"usageRateLimit\")}\r\n\t\t\t\t\t\t\t\t\t\t\tmeta={t(\"usageUsed\", { value: `${String(usagePercent)}%` })}\r\n\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t) : null}\r\n\t\t\t\t\t\t\t\t\t{usage.rateLimits.map((limit) => {\r\n\t\t\t\t\t\t\t\t\t\tconst window = limit.windows[0];\r\n\t\t\t\t\t\t\t\t\t\tconst used = window?.usedPercent;\r\n\t\t\t\t\t\t\t\t\t\tconst resetsAt = formatEpoch(window?.resetsAt);\r\n\t\t\t\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t\t\t\t<div key={limit.id} style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{used === undefined ? (\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<p style={hintStyle}>{limit.name ?? t(\"usageRateLimit\")}</p>\r\n\t\t\t\t\t\t\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<ProgressBar\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={used}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tlabel={limit.name ?? t(\"usageRateLimit\")}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmeta={\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tresetsAt === undefined\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? t(\"usageUsed\", { value: `${String(used)}%` })\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: `${t(\"usageUsed\", { value: `${String(used)}%` })} \u00B7 ${t(\"usageResets\", { time: resetsAt })}`\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t\t\t})}\r\n\t\t\t\t\t\t\t\t</>\r\n\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t) : null}\r\n\t\t\t\t</div>\r\n\t\t\t) : null}\r\n\t\t</div>\r\n\t);\r\n}\r\n", "/** Compact copy button with copied / failed feedback. */\r\n\r\nimport { useCallback, useEffect, useRef, useState } from \"react\";\r\nimport { copyText } from \"../api.ts\";\r\nimport { compactButtonStyle, primaryButtonStyle } from \"../styles.ts\";\r\n\r\nexport interface CopyButtonProps {\r\n\ttext: string;\r\n\tidleLabel: string;\r\n\tcopiedLabel: string;\r\n\tfailedLabel: string;\r\n\tprimary?: boolean;\r\n\tdisabled?: boolean;\r\n}\r\n\r\nexport function CopyButton({\r\n\ttext,\r\n\tidleLabel,\r\n\tcopiedLabel,\r\n\tfailedLabel,\r\n\tprimary = false,\r\n\tdisabled = false,\r\n}: CopyButtonProps) {\r\n\tconst [state, setState] = useState<\"idle\" | \"copied\" | \"failed\">(\"idle\");\r\n\tconst timerRef = useRef<number | undefined>(undefined);\r\n\r\n\tuseEffect(() => {\r\n\t\treturn () => {\r\n\t\t\tif (timerRef.current !== undefined) window.clearTimeout(timerRef.current);\r\n\t\t};\r\n\t}, []);\r\n\r\n\tconst handleClick = useCallback(async () => {\r\n\t\tconst ok = await copyText(text);\r\n\t\tsetState(ok ? \"copied\" : \"failed\");\r\n\t\tif (timerRef.current !== undefined) window.clearTimeout(timerRef.current);\r\n\t\ttimerRef.current = window.setTimeout(() => {\r\n\t\t\tsetState(\"idle\");\r\n\t\t\ttimerRef.current = undefined;\r\n\t\t}, 2000);\r\n\t}, [text]);\r\n\r\n\tconst label = state === \"copied\" ? copiedLabel : state === \"failed\" ? failedLabel : idleLabel;\r\n\r\n\treturn (\r\n\t\t<button\r\n\t\t\ttype=\"button\"\r\n\t\t\tstyle={primary ? primaryButtonStyle : compactButtonStyle}\r\n\t\t\tdisabled={disabled || text.length === 0}\r\n\t\t\tonClick={() => {\r\n\t\t\t\tvoid handleClick();\r\n\t\t\t}}\r\n\t\t>\r\n\t\t\t{label}\r\n\t\t</button>\r\n\t);\r\n}\r\n", "/** Usage quota progress bar with threshold-based color. */\r\n\r\nimport { hintStyle } from \"../styles.ts\";\r\n\r\nexport interface ProgressBarProps {\r\n\t/** 0\u2013100 used percentage. */\r\n\tvalue: number;\r\n\tlabel?: string;\r\n\tmeta?: string;\r\n}\r\n\r\nfunction barColor(percent: number): string {\r\n\tif (percent >= 90) return \"var(--dsw-alias-state-error-primary, #d92d20)\";\r\n\tif (percent >= 75) return \"var(--dsw-alias-state-warn-primary, #e06c00)\";\r\n\t// Prefer info fill over brand-primary: dark theme inverts brand-primary to near-white.\r\n\treturn \"var(--dsw-alias-button-info-fill, var(--dsw-static-deepseek-500, #4f6ef7))\";\r\n}\r\n\r\nexport function ProgressBar({ value, label, meta }: ProgressBarProps) {\r\n\tconst clamped = Math.max(0, Math.min(100, value));\r\n\treturn (\r\n\t\t<div style={{ display: \"flex\", flexDirection: \"column\", gap: 6 }}>\r\n\t\t\t{label === undefined ? null : (\r\n\t\t\t\t<div style={{ display: \"flex\", justifyContent: \"space-between\", gap: 8, flexWrap: \"wrap\" }}>\r\n\t\t\t\t\t<span style={{ ...hintStyle, color: \"var(--dsw-alias-label-primary)\" }}>{label}</span>\r\n\t\t\t\t\t{meta === undefined ? null : <span style={hintStyle}>{meta}</span>}\r\n\t\t\t\t</div>\r\n\t\t\t)}\r\n\t\t\t<div\r\n\t\t\t\trole=\"progressbar\"\r\n\t\t\t\taria-valuenow={clamped}\r\n\t\t\t\taria-valuemin={0}\r\n\t\t\t\taria-valuemax={100}\r\n\t\t\t\tstyle={{\r\n\t\t\t\t\theight: 8,\r\n\t\t\t\t\tborderRadius: 4,\r\n\t\t\t\t\tbackground: \"var(--dsw-alias-border-l2)\",\r\n\t\t\t\t\toverflow: \"hidden\",\r\n\t\t\t\t}}\r\n\t\t\t>\r\n\t\t\t\t<div\r\n\t\t\t\t\tstyle={{\r\n\t\t\t\t\t\twidth: `${String(clamped)}%`,\r\n\t\t\t\t\t\theight: \"100%\",\r\n\t\t\t\t\t\tborderRadius: 4,\r\n\t\t\t\t\t\tbackground: barColor(clamped),\r\n\t\t\t\t\t\ttransition: \"width 0.3s ease, background 0.3s ease\",\r\n\t\t\t\t\t}}\r\n\t\t\t\t/>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t);\r\n}\r\n", "/** Accessible toggle switch replacing native checkboxes for capability settings. */\r\n\r\nimport type { CSSProperties } from \"react\";\r\nimport { TRANSITION } from \"../styles.ts\";\r\n\r\nexport interface ToggleSwitchProps {\r\n\tchecked: boolean;\r\n\tdisabled?: boolean;\r\n\tonChange: (checked: boolean) => void;\r\n\t/** Accessible label (visually hidden when label prop is rendered externally). */\r\n\tariaLabel?: string;\r\n\tariaDescribedBy?: string;\r\n\tid?: string;\r\n}\r\n\r\nconst trackStyle = (checked: boolean, disabled: boolean): CSSProperties => ({\r\n\tposition: \"relative\",\r\n\twidth: 40,\r\n\theight: 22,\r\n\tborderRadius: 11,\r\n\tflex: \"0 0 auto\",\r\n\tbackground: checked\r\n\t\t? \"var(--dsw-alias-button-primary-fill)\"\r\n\t\t: \"var(--dsw-alias-border-l4, rgba(127, 127, 127, 0.45))\",\r\n\topacity: disabled ? 0.5 : 1,\r\n\tcursor: disabled ? \"not-allowed\" : \"pointer\",\r\n\ttransition: TRANSITION,\r\n\tborder: \"none\",\r\n\tpadding: 0,\r\n});\r\n\r\nconst thumbStyle = (checked: boolean): CSSProperties => ({\r\n\tposition: \"absolute\",\r\n\ttop: 2,\r\n\tleft: checked ? 20 : 2,\r\n\twidth: 18,\r\n\theight: 18,\r\n\tborderRadius: \"50%\",\r\n\t// Match DSH primary fill/foreground pairing so the thumb stays visible when\r\n\t// dark theme inverts brand-primary to near-white.\r\n\tbackground: checked ? \"var(--dsw-alias-label-primary-foreground)\" : \"var(--dsw-alias-button-elevated-fill)\",\r\n\tboxShadow: \"0 1px 3px rgba(0, 0, 0, 0.25)\",\r\n\ttransition: TRANSITION,\r\n});\r\n\r\nexport function ToggleSwitch({\r\n\tchecked,\r\n\tdisabled = false,\r\n\tonChange,\r\n\tariaLabel,\r\n\tariaDescribedBy,\r\n\tid,\r\n}: ToggleSwitchProps) {\r\n\treturn (\r\n\t\t<button\r\n\t\t\tid={id}\r\n\t\t\ttype=\"button\"\r\n\t\t\trole=\"switch\"\r\n\t\t\taria-checked={checked}\r\n\t\t\taria-label={ariaLabel}\r\n\t\t\taria-describedby={ariaDescribedBy}\r\n\t\t\tdisabled={disabled}\r\n\t\t\tstyle={trackStyle(checked, disabled)}\r\n\t\t\tonClick={() => {\r\n\t\t\t\tif (!disabled) onChange(!checked);\r\n\t\t\t}}\r\n\t\t>\r\n\t\t\t<span aria-hidden=\"true\" style={thumbStyle(checked)} />\r\n\t\t</button>\r\n\t);\r\n}\r\n", "/** Capabilities tab: Codex toggles, Grok Imagine, and limits. */\r\n\r\nimport { CAPABILITY_LIMITS, CAPABILITY_TOGGLES } from \"../constants.ts\";\r\nimport { imagineSourceLabel } from \"../parsers.ts\";\r\nimport {\r\n\tbodyStyle,\r\n\tbuttonStyle,\r\n\tcardStyle,\r\n\tdotStyle,\r\n\terrorStyle,\r\n\thintStyle,\r\n\tinputStyle,\r\n\tlistStyle,\r\n\tnestedStyle,\r\n\trowStyle,\r\n\tskeletonStyle,\r\n\tstatusStyle,\r\n\ttitleStyle,\r\n} from \"../styles.ts\";\r\nimport type {\r\n\tCapabilitySettingKey,\r\n\tCapabilitySnapshot,\r\n\tGrokBuildSettingsInjected,\r\n\tImagineCredentialView,\r\n} from \"../types.ts\";\r\nimport { Badge } from \"./Badge.tsx\";\r\nimport { ToggleSwitch } from \"./ToggleSwitch.tsx\";\r\n\r\nexport interface CapabilitiesTabProps {\r\n\tt: GrokBuildSettingsInjected[\"t\"];\r\n\tcapabilities: CapabilitySnapshot | undefined;\r\n\tcapabilitiesError: string | undefined;\r\n\tcapabilitiesBusy: boolean;\r\n\timagine: ImagineCredentialView | undefined;\r\n\timagineError: string | undefined;\r\n\tcodexSignedIn: boolean;\r\n\tonRetry: () => void;\r\n\tonOpenAccounts: (provider: \"codex\") => void;\r\n\tonFocusDependency: (target: \"codexImages\" | \"imagineCredential\") => void;\r\n\tonPatchCapability: (key: CapabilitySettingKey, value: boolean | number) => Promise<boolean | undefined> | undefined;\r\n}\r\n\r\nexport function CapabilitiesTab({\r\n\tt,\r\n\tcapabilities,\r\n\tcapabilitiesError,\r\n\tcapabilitiesBusy,\r\n\timagine,\r\n\timagineError,\r\n\tcodexSignedIn,\r\n\tonRetry,\r\n\tonOpenAccounts,\r\n\tonFocusDependency,\r\n\tonPatchCapability,\r\n}: CapabilitiesTabProps) {\r\n\tconst codexToggles = CAPABILITY_TOGGLES.filter((item) => !item.key.startsWith(\"grokImagine\"));\r\n\tconst imagineToggles = CAPABILITY_TOGGLES.filter((item) => item.key.startsWith(\"grokImagine\"));\r\n\r\n\treturn (\r\n\t\t<section style={cardStyle} aria-labelledby=\"coding-oauth-capabilities-title\">\r\n\t\t\t<div>\r\n\t\t\t\t<h3 id=\"coding-oauth-capabilities-title\" style={{ ...titleStyle, fontSize: 16 }}>\r\n\t\t\t\t\t{t(\"capabilitiesTitle\")}\r\n\t\t\t\t</h3>\r\n\t\t\t\t<p style={{ ...bodyStyle, marginTop: 4 }}>{t(\"capabilitiesIntro\")}</p>\r\n\t\t\t</div>\r\n\t\t\t{imagineError === undefined ? null : (\r\n\t\t\t\t<div style={nestedStyle} role=\"alert\">\r\n\t\t\t\t\t<p style={errorStyle}>{imagineError}</p>\r\n\t\t\t\t\t<button type=\"button\" style={buttonStyle} onClick={onRetry}>\r\n\t\t\t\t\t\t{t(\"retry\")}\r\n\t\t\t\t\t</button>\r\n\t\t\t\t</div>\r\n\t\t\t)}\r\n\t\t\t{imagine === undefined && imagineError === undefined ? (\r\n\t\t\t\t<div style={skeletonStyle} role=\"status\" aria-busy=\"true\">\r\n\t\t\t\t\t<div style={statusStyle}>\r\n\t\t\t\t\t\t<span aria-hidden=\"true\" style={dotStyle(\"loading\")} />\r\n\t\t\t\t\t\t{t(\"imagineLoading\")}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t) : imagine === undefined ? null : (\r\n\t\t\t\t<div id=\"coding-oauth-imagine-credential\" style={nestedStyle} tabIndex={-1}>\r\n\t\t\t\t\t<Badge\r\n\t\t\t\t\t\tlabel={imagine.configured ? t(\"imagineConfigured\") : t(\"imagineNotConfigured\")}\r\n\t\t\t\t\t\ttone={imagine.configured ? \"success\" : \"neutral\"}\r\n\t\t\t\t\t/>\r\n\t\t\t\t\t<p style={hintStyle}>{t(\"imagineSource\", { source: imagineSourceLabel(imagine.source, t) })}</p>\r\n\t\t\t\t</div>\r\n\t\t\t)}\r\n\t\t\t{capabilitiesError === undefined ? null : (\r\n\t\t\t\t<div style={nestedStyle} role=\"alert\">\r\n\t\t\t\t\t<p style={errorStyle}>{capabilitiesError}</p>\r\n\t\t\t\t\t<button type=\"button\" style={buttonStyle} onClick={onRetry}>\r\n\t\t\t\t\t\t{t(\"retry\")}\r\n\t\t\t\t\t</button>\r\n\t\t\t\t</div>\r\n\t\t\t)}\r\n\t\t\t{capabilities === undefined && capabilitiesError === undefined ? (\r\n\t\t\t\t<div style={skeletonStyle} role=\"status\" aria-busy=\"true\">\r\n\t\t\t\t\t<div style={statusStyle}>\r\n\t\t\t\t\t\t<span aria-hidden=\"true\" style={dotStyle(\"loading\")} />\r\n\t\t\t\t\t\t{t(\"capabilitiesLoading\")}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t) : capabilities === undefined ? null : (\r\n\t\t\t\t<fieldset style={{ border: 0, margin: 0, padding: 0, minWidth: 0 }}>\r\n\t\t\t\t\t<legend style={{ ...bodyStyle, position: \"absolute\", width: 1, height: 1, overflow: \"hidden\" }}>\r\n\t\t\t\t\t\t{t(\"capabilitiesTitle\")}\r\n\t\t\t\t\t</legend>\r\n\t\t\t\t\t{capabilities.writable ? null : <p style={hintStyle}>{t(\"capabilitiesReadOnly\")}</p>}\r\n\t\t\t\t\t<ul style={listStyle}>\r\n\t\t\t\t\t\t{codexToggles.map((item) => {\r\n\t\t\t\t\t\t\tconst checked = capabilities.value[item.key];\r\n\t\t\t\t\t\t\tconst imagesOff = item.requiresImages === true && !capabilities.value.codexImages;\r\n\t\t\t\t\t\t\tconst dependencyReason = !codexSignedIn\r\n\t\t\t\t\t\t\t\t? t(\"requiresCodexSignIn\")\r\n\t\t\t\t\t\t\t\t: imagesOff\r\n\t\t\t\t\t\t\t\t\t? t(\"requiresCodexImages\")\r\n\t\t\t\t\t\t\t\t\t: undefined;\r\n\t\t\t\t\t\t\tconst disabled = capabilitiesBusy || !capabilities.writable || dependencyReason !== undefined;\r\n\t\t\t\t\t\t\tconst switchId = `cap-switch-${item.key}`;\r\n\t\t\t\t\t\t\tconst repairAction = !codexSignedIn\r\n\t\t\t\t\t\t\t\t? { label: t(\"openCodexAccount\"), action: () => onOpenAccounts(\"codex\") }\r\n\t\t\t\t\t\t\t\t: imagesOff\r\n\t\t\t\t\t\t\t\t\t? { label: t(\"focusCodexImages\"), action: () => onFocusDependency(\"codexImages\") }\r\n\t\t\t\t\t\t\t\t\t: undefined;\r\n\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t<li\r\n\t\t\t\t\t\t\t\t\tkey={item.key}\r\n\t\t\t\t\t\t\t\t\tstyle={{\r\n\t\t\t\t\t\t\t\t\t\topacity: dependencyReason === undefined ? 1 : 0.65,\r\n\t\t\t\t\t\t\t\t\t\ttransition: \"opacity 0.15s ease\",\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t<div style={{ ...rowStyle, alignItems: \"flex-start\" }}>\r\n\t\t\t\t\t\t\t\t\t\t<label htmlFor={switchId} style={{ flex: \"1 1 360px\", cursor: disabled ? \"default\" : \"pointer\" }}>\r\n\t\t\t\t\t\t\t\t\t\t\t<span style={{ display: \"block\", fontSize: 14, color: \"var(--dsw-alias-label-primary)\" }}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{t(item.label)}\r\n\t\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t\t\t<span id={`cap-hint-${item.key}`} style={{ display: \"block\", ...hintStyle }}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{dependencyReason ?? t(item.hint)}\r\n\t\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t\t\t\t\t{repairAction === undefined ? null : (\r\n\t\t\t\t\t\t\t\t\t\t\t<button type=\"button\" style={buttonStyle} onClick={repairAction.action}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{repairAction.label}\r\n\t\t\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t\t\t<ToggleSwitch\r\n\t\t\t\t\t\t\t\t\t\t\tid={switchId}\r\n\t\t\t\t\t\t\t\t\t\t\tchecked={checked}\r\n\t\t\t\t\t\t\t\t\t\t\tdisabled={disabled}\r\n\t\t\t\t\t\t\t\t\t\t\tariaLabel={t(item.label)}\r\n\t\t\t\t\t\t\t\t\t\t\tariaDescribedBy={`cap-hint-${item.key}`}\r\n\t\t\t\t\t\t\t\t\t\t\tonChange={(next) => {\r\n\t\t\t\t\t\t\t\t\t\t\t\tvoid onPatchCapability(item.key, next);\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t</li>\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t})}\r\n\t\t\t\t\t</ul>\r\n\t\t\t\t\t<h4 style={{ ...titleStyle, fontSize: 14 }}>{t(\"imagineTitle\")}</h4>\r\n\t\t\t\t\t<ul style={listStyle}>\r\n\t\t\t\t\t\t{imagineToggles.map((item) => {\r\n\t\t\t\t\t\t\tconst checked = capabilities.value[item.key];\r\n\t\t\t\t\t\t\tconst dependencyReason = imagine?.configured === true ? undefined : t(\"requiresImagineCredential\");\r\n\t\t\t\t\t\t\tconst disabled = capabilitiesBusy || !capabilities.writable || dependencyReason !== undefined;\r\n\t\t\t\t\t\t\tconst switchId = `cap-switch-${item.key}`;\r\n\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t<li key={item.key}>\r\n\t\t\t\t\t\t\t\t\t<div style={{ ...rowStyle, alignItems: \"flex-start\" }}>\r\n\t\t\t\t\t\t\t\t\t\t<label htmlFor={switchId} style={{ flex: \"1 1 360px\", cursor: disabled ? \"default\" : \"pointer\" }}>\r\n\t\t\t\t\t\t\t\t\t\t\t<span style={{ display: \"block\", fontSize: 14, color: \"var(--dsw-alias-label-primary)\" }}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{t(item.label)}\r\n\t\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t\t\t<span id={`cap-hint-${item.key}`} style={{ display: \"block\", ...hintStyle }}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{dependencyReason ?? t(item.hint)}\r\n\t\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t\t\t\t\t{dependencyReason === undefined ? null : (\r\n\t\t\t\t\t\t\t\t\t\t\t<button type=\"button\" style={buttonStyle} onClick={() => onFocusDependency(\"imagineCredential\")}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{t(\"focusImagineCredential\")}\r\n\t\t\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t\t\t<ToggleSwitch\r\n\t\t\t\t\t\t\t\t\t\t\tid={switchId}\r\n\t\t\t\t\t\t\t\t\t\t\tchecked={checked}\r\n\t\t\t\t\t\t\t\t\t\t\tdisabled={disabled}\r\n\t\t\t\t\t\t\t\t\t\t\tariaLabel={t(item.label)}\r\n\t\t\t\t\t\t\t\t\t\t\tariaDescribedBy={`cap-hint-${item.key}`}\r\n\t\t\t\t\t\t\t\t\t\t\tonChange={(next) => {\r\n\t\t\t\t\t\t\t\t\t\t\t\tvoid onPatchCapability(item.key, next);\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t</li>\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t})}\r\n\t\t\t\t\t</ul>\r\n\t\t\t\t\t<div style={nestedStyle}>\r\n\t\t\t\t\t\t<h4 style={{ ...titleStyle, fontSize: 14 }}>{t(\"capabilityLimitsTitle\")}</h4>\r\n\t\t\t\t\t\t<p style={hintStyle}>{t(\"capabilityLimitsHint\")}</p>\r\n\t\t\t\t\t\t<ul style={listStyle}>\r\n\t\t\t\t\t\t\t{CAPABILITY_LIMITS.map((item) => {\r\n\t\t\t\t\t\t\t\tconst displayValue = capabilities.value[item.key] / item.scale;\r\n\t\t\t\t\t\t\t\tconst inputId = `cap-limit-${item.key}`;\r\n\t\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t\t<li key={item.key} style={rowStyle}>\r\n\t\t\t\t\t\t\t\t\t\t<label htmlFor={inputId} style={{ ...bodyStyle, flex: \"1 1 360px\" }}>\r\n\t\t\t\t\t\t\t\t\t\t\t<span style={{ display: \"block\", color: \"var(--dsw-alias-label-primary)\" }}>{t(item.label)}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t<span id={`${inputId}-hint`} style={{ display: \"block\", ...hintStyle }}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{t(item.hint)}\r\n\t\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t\t\t\t\t<input\r\n\t\t\t\t\t\t\t\t\t\t\tkey={`${item.key}-${String(capabilities.revision)}-${String(displayValue)}`}\r\n\t\t\t\t\t\t\t\t\t\t\tid={inputId}\r\n\t\t\t\t\t\t\t\t\t\t\ttype=\"number\"\r\n\t\t\t\t\t\t\t\t\t\t\tinputMode=\"numeric\"\r\n\t\t\t\t\t\t\t\t\t\t\tmin={item.min}\r\n\t\t\t\t\t\t\t\t\t\t\tmax={item.max}\r\n\t\t\t\t\t\t\t\t\t\t\tstep={1}\r\n\t\t\t\t\t\t\t\t\t\t\tdefaultValue={displayValue}\r\n\t\t\t\t\t\t\t\t\t\t\tdisabled={capabilitiesBusy || !capabilities.writable}\r\n\t\t\t\t\t\t\t\t\t\t\taria-describedby={`${inputId}-hint`}\r\n\t\t\t\t\t\t\t\t\t\t\tstyle={{ ...inputStyle, width: 112, flex: \"0 0 112px\" }}\r\n\t\t\t\t\t\t\t\t\t\t\tonInput={(event) => {\r\n\t\t\t\t\t\t\t\t\t\t\t\tevent.currentTarget.setCustomValidity(\"\");\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\tonKeyDown={(event) => {\r\n\t\t\t\t\t\t\t\t\t\t\t\tif (event.key === \"Enter\") event.currentTarget.blur();\r\n\t\t\t\t\t\t\t\t\t\t\t\tif (event.key === \"Escape\") {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tevent.currentTarget.value = String(displayValue);\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tevent.currentTarget.setCustomValidity(\"\");\r\n\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\tonBlur={(event) => {\r\n\t\t\t\t\t\t\t\t\t\t\t\tconst target = event.currentTarget;\r\n\t\t\t\t\t\t\t\t\t\t\t\tconst next = Number(target.value);\r\n\t\t\t\t\t\t\t\t\t\t\t\tif (!Number.isInteger(next) || next < item.min || next > item.max) {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\ttarget.setCustomValidity(t(\"capabilityLimitInvalid\", { min: item.min, max: item.max }));\r\n\t\t\t\t\t\t\t\t\t\t\t\t\ttarget.reportValidity();\r\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\ttarget.setCustomValidity(\"\");\r\n\t\t\t\t\t\t\t\t\t\t\t\tconst apiValue = next * item.scale;\r\n\t\t\t\t\t\t\t\t\t\t\t\tif (apiValue === capabilities.value[item.key]) return;\r\n\t\t\t\t\t\t\t\t\t\t\t\tvoid Promise.resolve(onPatchCapability(item.key, apiValue)).then((saved) => {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (saved === false && target.isConnected) target.value = String(displayValue);\r\n\t\t\t\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t</li>\r\n\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t})}\r\n\t\t\t\t\t\t</ul>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</fieldset>\r\n\t\t\t)}\r\n\t\t</section>\r\n\t);\r\n}\r\n", "/** Local API gateway settings tab. */\r\n\r\nimport { type KeyboardEvent, useEffect, useMemo, useRef, useState } from \"react\";\r\nimport { GATEWAY_PORT_MAX, GATEWAY_PORT_MIN } from \"../constants.ts\";\r\nimport { buildGatewaySnippets, type GatewaySnippetId } from \"../gatewaySnippets.ts\";\r\nimport { formatGatewayBaseUrl, parseGatewayPort, randomGatewayPort } from \"../parsers.ts\";\r\nimport {\r\n\tbodyStyle,\r\n\tbuttonStyle,\r\n\tcardStyle,\r\n\tcopyRowStyle,\r\n\tdotStyle,\r\n\terrorStyle,\r\n\thintStyle,\r\n\tinputStyle,\r\n\tmonoStyle,\r\n\tnestedStyle,\r\n\tprimaryButtonStyle,\r\n\tsegmentedNavStyle,\r\n\tsegmentedTabActiveStyle,\r\n\tsegmentedTabStyle,\r\n\tskeletonStyle,\r\n\tsnippetStyle,\r\n\tstatusStyle,\r\n\ttitleStyle,\r\n\twarningStyle,\r\n} from \"../styles.ts\";\r\nimport type { CopyField, GatewayView, GrokBuildSettingsInjected } from \"../types.ts\";\r\nimport { Badge } from \"./Badge.tsx\";\r\nimport { CopyButton } from \"./CopyButton.tsx\";\r\nimport { ToggleSwitch } from \"./ToggleSwitch.tsx\";\r\n\r\nexport interface GatewayTabProps {\r\n\tt: GrokBuildSettingsInjected[\"t\"];\r\n\tgateway: GatewayView | undefined;\r\n\tgatewayError: string | undefined;\r\n\tgatewayBusy: boolean;\r\n\tgatewayOnceKey: string | undefined;\r\n\tgatewayKeyVisible: boolean;\r\n\tgatewayRotateConfirm: boolean;\r\n\tgatewayRevealError: string | undefined;\r\n\tportDraft: string;\r\n\tcopiedField: CopyField | undefined;\r\n\tcopyFailedField: CopyField | undefined;\r\n\tonEnabledChange: (enabled: boolean) => void;\r\n\tonRetry: () => void;\r\n\tonPortDraftChange: (value: string) => void;\r\n\tonApplyPort: () => void;\r\n\tonRandomPort: (port: number) => void;\r\n\tonCopy: (field: CopyField, text: string) => void;\r\n\tonCopyKey: () => void;\r\n\tonToggleKeyVisible: () => void;\r\n\tonRotateConfirm: () => void;\r\n\tonRotateCancel: () => void;\r\n\tonRotate: () => void;\r\n}\r\n\r\nconst SNIPPET_TABS: readonly {\r\n\tid: GatewaySnippetId;\r\n\tlabelKey: \"gatewaySnippetCurl\" | \"gatewaySnippetPython\" | \"gatewaySnippetIde\";\r\n}[] = [\r\n\t{ id: \"curl\", labelKey: \"gatewaySnippetCurl\" },\r\n\t{ id: \"python\", labelKey: \"gatewaySnippetPython\" },\r\n\t{ id: \"ide\", labelKey: \"gatewaySnippetIde\" },\r\n];\r\n\r\nexport function GatewayTab({\r\n\tt,\r\n\tgateway,\r\n\tgatewayError,\r\n\tgatewayBusy,\r\n\tgatewayOnceKey,\r\n\tgatewayKeyVisible,\r\n\tgatewayRotateConfirm,\r\n\tgatewayRevealError,\r\n\tportDraft,\r\n\tcopiedField,\r\n\tcopyFailedField,\r\n\tonEnabledChange,\r\n\tonRetry,\r\n\tonPortDraftChange,\r\n\tonApplyPort,\r\n\tonRandomPort,\r\n\tonCopyKey,\r\n\tonToggleKeyVisible,\r\n\tonRotateConfirm,\r\n\tonRotateCancel,\r\n\tonRotate,\r\n}: GatewayTabProps) {\r\n\tconst [enableConfirm, setEnableConfirm] = useState(false);\r\n\tconst [activeSnippet, setActiveSnippet] = useState<GatewaySnippetId>(\"curl\");\r\n\tconst enableConfirmAction = useRef<HTMLButtonElement>(null);\r\n\tconst rotateTrigger = useRef<HTMLButtonElement>(null);\r\n\tconst rotateConfirmAction = useRef<HTMLButtonElement>(null);\r\n\tconst restoreEnableFocus = useRef(false);\r\n\tconst restoreRotateFocus = useRef(false);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (enableConfirm) {\r\n\t\t\tenableConfirmAction.current?.focus();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!restoreEnableFocus.current) return;\r\n\t\trestoreEnableFocus.current = false;\r\n\t\tdocument.getElementById(\"coding-oauth-gateway-enabled\")?.focus();\r\n\t}, [enableConfirm]);\r\n\tuseEffect(() => {\r\n\t\tif (gatewayRotateConfirm) {\r\n\t\t\trotateConfirmAction.current?.focus();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!restoreRotateFocus.current) return;\r\n\t\trestoreRotateFocus.current = false;\r\n\t\trotateTrigger.current?.focus();\r\n\t}, [gatewayRotateConfirm]);\r\n\r\n\tconst portValid = parseGatewayPort(portDraft) !== undefined;\r\n\tconst portChanged = gateway !== undefined && portDraft !== String(gateway.port);\r\n\r\n\tconst snippets = useMemo(() => {\r\n\t\tif (gateway === undefined || !gatewayKeyVisible || gatewayOnceKey === undefined || gateway.models.length === 0) {\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\t\tconst openAi = `${formatGatewayBaseUrl(gateway.bind, gateway.port)}/v1`;\r\n\t\tconst anthropic = formatGatewayBaseUrl(gateway.bind, gateway.port);\r\n\t\t// A masked keyHint is display-only and can never produce an executable command.\r\n\t\treturn buildGatewaySnippets(openAi, anthropic, gatewayOnceKey, gateway.models[0]);\r\n\t}, [gateway, gatewayKeyVisible, gatewayOnceKey]);\r\n\r\n\tconst copyLabel = (field: CopyField, idle?: string): string => {\r\n\t\tif (copyFailedField === field) return t(\"copyFailed\");\r\n\t\tif (copiedField === field) return t(\"copied\");\r\n\t\treturn idle ?? t(\"copy\");\r\n\t};\r\n\r\n\tconst focusSnippetTab = (index: number): void => {\r\n\t\tconst tab = SNIPPET_TABS[index];\r\n\t\tif (tab === undefined) return;\r\n\t\tsetActiveSnippet(tab.id);\r\n\t\tdocument.getElementById(`coding-oauth-snippet-tab-${tab.id}`)?.focus();\r\n\t};\r\n\r\n\tconst onSnippetKeyDown = (event: KeyboardEvent<HTMLDivElement>): void => {\r\n\t\tconst current = SNIPPET_TABS.findIndex((tab) => tab.id === activeSnippet);\r\n\t\tif (current < 0) return;\r\n\t\tif (event.key === \"ArrowRight\" || event.key === \"ArrowDown\") {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tfocusSnippetTab((current + 1) % SNIPPET_TABS.length);\r\n\t\t} else if (event.key === \"ArrowLeft\" || event.key === \"ArrowUp\") {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tfocusSnippetTab((current - 1 + SNIPPET_TABS.length) % SNIPPET_TABS.length);\r\n\t\t} else if (event.key === \"Home\") {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tfocusSnippetTab(0);\r\n\t\t} else if (event.key === \"End\") {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tfocusSnippetTab(SNIPPET_TABS.length - 1);\r\n\t\t}\r\n\t};\r\n\r\n\tconst openAiUrl = gateway === undefined ? \"\" : `${formatGatewayBaseUrl(gateway.bind, gateway.port)}/v1`;\r\n\tconst anthropicUrl = gateway === undefined ? \"\" : formatGatewayBaseUrl(gateway.bind, gateway.port);\r\n\r\n\treturn (\r\n\t\t<section style={cardStyle} aria-labelledby=\"coding-oauth-gateway-title\">\r\n\t\t\t<div>\r\n\t\t\t\t<h3 id=\"coding-oauth-gateway-title\" style={{ ...titleStyle, fontSize: 16 }}>\r\n\t\t\t\t\t{t(\"gatewayTitle\")}\r\n\t\t\t\t</h3>\r\n\t\t\t\t<p style={{ ...bodyStyle, marginTop: 4 }}>{t(\"gatewayIntro\")}</p>\r\n\t\t\t\t<p style={{ ...warningStyle, marginTop: 8 }}>{t(\"gatewayWarning\")}</p>\r\n\t\t\t\t<p style={{ ...hintStyle, marginTop: 8 }}>{t(\"gatewayLoopbackHint\")}</p>\r\n\t\t\t</div>\r\n\t\t\t{gatewayError === undefined ? null : (\r\n\t\t\t\t<p style={errorStyle} role=\"alert\">\r\n\t\t\t\t\t{gatewayError}\r\n\t\t\t\t</p>\r\n\t\t\t)}\r\n\t\t\t{gatewayRevealError === undefined ? null : (\r\n\t\t\t\t<p style={errorStyle} role=\"alert\">\r\n\t\t\t\t\t{gatewayRevealError}\r\n\t\t\t\t</p>\r\n\t\t\t)}\r\n\t\t\t{gateway === undefined && gatewayError === undefined ? (\r\n\t\t\t\t<div style={skeletonStyle} role=\"status\" aria-busy=\"true\">\r\n\t\t\t\t\t<div style={statusStyle}>\r\n\t\t\t\t\t\t<span aria-hidden=\"true\" style={dotStyle(\"loading\")} />\r\n\t\t\t\t\t\t{t(\"gatewayLoading\")}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t) : gateway === undefined ? (\r\n\t\t\t\t<div style={nestedStyle} role=\"status\">\r\n\t\t\t\t\t<p style={hintStyle}>{t(\"gatewayLoadFailed\")}</p>\r\n\t\t\t\t\t<button type=\"button\" style={buttonStyle} onClick={onRetry}>\r\n\t\t\t\t\t\t{t(\"retry\")}\r\n\t\t\t\t\t</button>\r\n\t\t\t\t</div>\r\n\t\t\t) : (\r\n\t\t\t\t<div style={nestedStyle}>\r\n\t\t\t\t\t<Badge\r\n\t\t\t\t\t\tlabel={gateway.running ? t(\"gatewayRunning\") : t(\"gatewayStopped\")}\r\n\t\t\t\t\t\ttone={gateway.running ? \"success\" : \"neutral\"}\r\n\t\t\t\t\t/>\r\n\t\t\t\t\t<p style={hintStyle}>\r\n\t\t\t\t\t\t{gateway.models.length > 0\r\n\t\t\t\t\t\t\t? t(\"gatewayModelsReady\", { count: gateway.models.length, model: gateway.models[0] })\r\n\t\t\t\t\t\t\t: t(\"gatewayModelsUnavailable\")}\r\n\t\t\t\t\t</p>\r\n\t\t\t\t\t<p style={hintStyle}>{gateway.keyConfigured ? t(\"gatewayKeyConfigured\") : t(\"gatewayKeyNotConfigured\")}</p>\r\n\t\t\t\t\t{enableConfirm ? (\r\n\t\t\t\t\t\t<div style={nestedStyle}>\r\n\t\t\t\t\t\t\t<p style={bodyStyle}>{t(\"gatewayEnableConfirm\")}</p>\r\n\t\t\t\t\t\t\t<div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8 }}>\r\n\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\tref={enableConfirmAction}\r\n\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\tstyle={primaryButtonStyle}\r\n\t\t\t\t\t\t\t\t\tdisabled={gatewayBusy}\r\n\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\trestoreEnableFocus.current = true;\r\n\t\t\t\t\t\t\t\t\t\tsetEnableConfirm(false);\r\n\t\t\t\t\t\t\t\t\t\tonEnabledChange(true);\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t{t(\"gatewayEnableConfirmAction\")}\r\n\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\tstyle={buttonStyle}\r\n\t\t\t\t\t\t\t\t\tdisabled={gatewayBusy}\r\n\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\trestoreEnableFocus.current = true;\r\n\t\t\t\t\t\t\t\t\t\tsetEnableConfirm(false);\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t{t(\"gatewayEnableCancel\")}\r\n\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t) : (\r\n\t\t\t\t\t\t<label\r\n\t\t\t\t\t\t\thtmlFor=\"coding-oauth-gateway-enabled\"\r\n\t\t\t\t\t\t\tstyle={{\r\n\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\tjustifyContent: \"space-between\",\r\n\t\t\t\t\t\t\t\tgap: 12,\r\n\t\t\t\t\t\t\t\tfontSize: 14,\r\n\t\t\t\t\t\t\t\tcolor: \"var(--dsw-alias-label-primary)\",\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t<span>{t(\"gatewayEnabled\")}</span>\r\n\t\t\t\t\t\t\t<ToggleSwitch\r\n\t\t\t\t\t\t\t\tid=\"coding-oauth-gateway-enabled\"\r\n\t\t\t\t\t\t\t\tchecked={gateway.enabled}\r\n\t\t\t\t\t\t\t\tdisabled={gatewayBusy}\r\n\t\t\t\t\t\t\t\tonChange={(enabled) => {\r\n\t\t\t\t\t\t\t\t\tif (enabled) {\r\n\t\t\t\t\t\t\t\t\t\tsetEnableConfirm(true);\r\n\t\t\t\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\tonEnabledChange(false);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t</label>\r\n\t\t\t\t\t)}\r\n\t\t\t\t\t<div>\r\n\t\t\t\t\t\t<label\r\n\t\t\t\t\t\t\thtmlFor=\"coding-oauth-gateway-port\"\r\n\t\t\t\t\t\t\tstyle={{ ...bodyStyle, color: \"var(--dsw-alias-label-primary)\" }}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{t(\"gatewayPort\")}\r\n\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t<p id=\"coding-oauth-gateway-port-hint\" style={hintStyle}>\r\n\t\t\t\t\t\t\t{t(\"gatewayPortHint\")}\r\n\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t{!portValid && portDraft.length > 0 ? (\r\n\t\t\t\t\t\t\t<p style={{ ...hintStyle, color: \"var(--dsw-alias-state-error-primary)\" }} role=\"alert\">\r\n\t\t\t\t\t\t\t\t{t(\"gatewayPortInvalid\")}\r\n\t\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t) : null}\r\n\t\t\t\t\t\t<div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8, marginTop: 8 }}>\r\n\t\t\t\t\t\t\t<input\r\n\t\t\t\t\t\t\t\tid=\"coding-oauth-gateway-port\"\r\n\t\t\t\t\t\t\t\ttype=\"number\"\r\n\t\t\t\t\t\t\t\tinputMode=\"numeric\"\r\n\t\t\t\t\t\t\t\tmin={GATEWAY_PORT_MIN}\r\n\t\t\t\t\t\t\t\tmax={GATEWAY_PORT_MAX}\r\n\t\t\t\t\t\t\t\tstep={1}\r\n\t\t\t\t\t\t\t\tvalue={portDraft}\r\n\t\t\t\t\t\t\t\tdisabled={gatewayBusy}\r\n\t\t\t\t\t\t\t\taria-describedby=\"coding-oauth-gateway-port-hint\"\r\n\t\t\t\t\t\t\t\taria-invalid={!portValid && portDraft.length > 0}\r\n\t\t\t\t\t\t\t\tstyle={{\r\n\t\t\t\t\t\t\t\t\t...inputStyle,\r\n\t\t\t\t\t\t\t\t\twidth: 112,\r\n\t\t\t\t\t\t\t\t\tflex: \"0 0 112px\",\r\n\t\t\t\t\t\t\t\t\tborderColor:\r\n\t\t\t\t\t\t\t\t\t\t!portValid && portDraft.length > 0\r\n\t\t\t\t\t\t\t\t\t\t\t? \"var(--dsw-alias-state-error-primary)\"\r\n\t\t\t\t\t\t\t\t\t\t\t: \"var(--dsw-alias-border-l2)\",\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\tonChange={(event) => {\r\n\t\t\t\t\t\t\t\t\tonPortDraftChange(event.target.value);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\tonKeyDown={(event) => {\r\n\t\t\t\t\t\t\t\t\tif (event.key === \"Enter\") {\r\n\t\t\t\t\t\t\t\t\t\tevent.preventDefault();\r\n\t\t\t\t\t\t\t\t\t\tonApplyPort();\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\tif (event.key === \"Escape\") {\r\n\t\t\t\t\t\t\t\t\t\tonPortDraftChange(String(gateway.port));\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tstyle={primaryButtonStyle}\r\n\t\t\t\t\t\t\t\tdisabled={gatewayBusy || !portChanged || !portValid}\r\n\t\t\t\t\t\t\t\tonClick={onApplyPort}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{t(\"gatewayPortApply\")}\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tstyle={buttonStyle}\r\n\t\t\t\t\t\t\t\tdisabled={gatewayBusy}\r\n\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\tonRandomPort(randomGatewayPort(gateway.port));\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{t(\"gatewayPortRandom\")}\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<p style={copyRowStyle}>\r\n\t\t\t\t\t\t<span style={hintStyle}>\r\n\t\t\t\t\t\t\t{t(\"gatewayOpenAiUrl\")}\r\n\t\t\t\t\t\t\t<span style={{ display: \"block\", ...monoStyle }}>{openAiUrl}</span>\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t<CopyButton\r\n\t\t\t\t\t\t\ttext={openAiUrl}\r\n\t\t\t\t\t\t\tidleLabel={t(\"copy\")}\r\n\t\t\t\t\t\t\tcopiedLabel={t(\"copied\")}\r\n\t\t\t\t\t\t\tfailedLabel={t(\"copyFailed\")}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</p>\r\n\t\t\t\t\t<p style={copyRowStyle}>\r\n\t\t\t\t\t\t<span style={hintStyle}>\r\n\t\t\t\t\t\t\t{t(\"gatewayAnthropicUrl\")}\r\n\t\t\t\t\t\t\t<span style={{ display: \"block\", ...monoStyle }}>{anthropicUrl}</span>\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t<CopyButton\r\n\t\t\t\t\t\t\ttext={anthropicUrl}\r\n\t\t\t\t\t\t\tidleLabel={t(\"copy\")}\r\n\t\t\t\t\t\t\tcopiedLabel={t(\"copied\")}\r\n\t\t\t\t\t\t\tfailedLabel={t(\"copyFailed\")}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</p>\r\n\t\t\t\t\t<p style={copyRowStyle}>\r\n\t\t\t\t\t\t<span style={hintStyle}>\r\n\t\t\t\t\t\t\t{t(\"gatewayKeyHint\")}\r\n\t\t\t\t\t\t\t<span style={{ display: \"block\", ...monoStyle, overflowWrap: \"anywhere\" }}>\r\n\t\t\t\t\t\t\t\t{gatewayKeyVisible && gatewayOnceKey !== undefined ? gatewayOnceKey : gateway.keyHint || \"\u2014\"}\r\n\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t<span style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8 }}>\r\n\t\t\t\t\t\t\t<button type=\"button\" style={primaryButtonStyle} disabled={gatewayBusy} onClick={onCopyKey}>\r\n\t\t\t\t\t\t\t\t{copyLabel(\"key\", t(\"gatewayCopyKey\"))}\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t<button type=\"button\" style={buttonStyle} disabled={gatewayBusy} onClick={onToggleKeyVisible}>\r\n\t\t\t\t\t\t\t\t{gatewayKeyVisible ? t(\"gatewayHideKey\") : t(\"gatewayShowKey\")}\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t</p>\r\n\t\t\t\t\t<p style={hintStyle}>{t(\"gatewayKeyCopyHint\")}</p>\r\n\t\t\t\t\t{gateway.enabled && snippets !== undefined ? (\r\n\t\t\t\t\t\t<div style={{ display: \"flex\", flexDirection: \"column\", gap: 10 }}>\r\n\t\t\t\t\t\t\t<h4 style={{ ...titleStyle, fontSize: 14 }}>{t(\"gatewaySnippetsTitle\")}</h4>\r\n\t\t\t\t\t\t\t<div\r\n\t\t\t\t\t\t\t\trole=\"tablist\"\r\n\t\t\t\t\t\t\t\taria-label={t(\"gatewaySnippetsTitle\")}\r\n\t\t\t\t\t\t\t\tstyle={segmentedNavStyle}\r\n\t\t\t\t\t\t\t\tonKeyDown={onSnippetKeyDown}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{SNIPPET_TABS.map((tab) => {\r\n\t\t\t\t\t\t\t\t\tconst selected = activeSnippet === tab.id;\r\n\t\t\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\t\tkey={tab.id}\r\n\t\t\t\t\t\t\t\t\t\t\tid={`coding-oauth-snippet-tab-${tab.id}`}\r\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\t\t\trole=\"tab\"\r\n\t\t\t\t\t\t\t\t\t\t\taria-selected={selected}\r\n\t\t\t\t\t\t\t\t\t\t\taria-controls=\"coding-oauth-snippet-panel\"\r\n\t\t\t\t\t\t\t\t\t\t\ttabIndex={selected ? 0 : -1}\r\n\t\t\t\t\t\t\t\t\t\t\tstyle={selected ? segmentedTabActiveStyle : segmentedTabStyle}\r\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\t\t\tsetActiveSnippet(tab.id);\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t{t(tab.labelKey)}\r\n\t\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t\t})}\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div\r\n\t\t\t\t\t\t\t\tid=\"coding-oauth-snippet-panel\"\r\n\t\t\t\t\t\t\t\trole=\"tabpanel\"\r\n\t\t\t\t\t\t\t\taria-labelledby={`coding-oauth-snippet-tab-${activeSnippet}`}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t<code style={snippetStyle}>{snippets[activeSnippet]}</code>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<CopyButton\r\n\t\t\t\t\t\t\t\ttext={snippets[activeSnippet]}\r\n\t\t\t\t\t\t\t\tidleLabel={t(\"copy\")}\r\n\t\t\t\t\t\t\t\tcopiedLabel={t(\"copied\")}\r\n\t\t\t\t\t\t\t\tfailedLabel={t(\"copyFailed\")}\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t) : gateway.enabled ? (\r\n\t\t\t\t\t\t<p style={hintStyle}>{t(\"gatewaySnippetsUnavailable\")}</p>\r\n\t\t\t\t\t) : null}\r\n\t\t\t\t\t{gatewayRotateConfirm ? (\r\n\t\t\t\t\t\t<div style={nestedStyle}>\r\n\t\t\t\t\t\t\t<p style={bodyStyle}>{t(\"gatewayRotateConfirm\")}</p>\r\n\t\t\t\t\t\t\t<p style={hintStyle}>{t(\"gatewayRotateConfirmHint\")}</p>\r\n\t\t\t\t\t\t\t<div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8 }}>\r\n\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\tref={rotateConfirmAction}\r\n\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\tstyle={primaryButtonStyle}\r\n\t\t\t\t\t\t\t\t\tdisabled={gatewayBusy}\r\n\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\trestoreRotateFocus.current = true;\r\n\t\t\t\t\t\t\t\t\t\tonRotate();\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t{t(\"gatewayRotateConfirmAction\")}\r\n\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\tstyle={buttonStyle}\r\n\t\t\t\t\t\t\t\t\tdisabled={gatewayBusy}\r\n\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\trestoreRotateFocus.current = true;\r\n\t\t\t\t\t\t\t\t\t\tonRotateCancel();\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t{t(\"gatewayRotateCancel\")}\r\n\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t) : (\r\n\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\tref={rotateTrigger}\r\n\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\tstyle={buttonStyle}\r\n\t\t\t\t\t\t\tdisabled={gatewayBusy}\r\n\t\t\t\t\t\t\tonClick={onRotateConfirm}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{t(\"gatewayRotate\")}\r\n\t\t\t\t\t\t</button>\r\n\t\t\t\t\t)}\r\n\t\t\t\t</div>\r\n\t\t\t)}\r\n\t\t</section>\r\n\t);\r\n}\r\n", "/** Quick-setup code snippets for the local API gateway. */\r\n\r\nexport type GatewaySnippetId = \"curl\" | \"python\" | \"ide\";\r\n\r\nexport function buildGatewaySnippets(\r\n\topenAiBaseUrl: string,\r\n\tanthropicBaseUrl: string,\r\n\tapiKeyPlaceholder: string,\r\n\tmodel = \"<gateway-model>\",\r\n): Record<GatewaySnippetId, string> {\r\n\tconst key = apiKeyPlaceholder.length > 0 ? apiKeyPlaceholder : \"<your-gateway-key>\";\r\n\treturn {\r\n\t\tcurl: `curl ${openAiBaseUrl}/chat/completions \\\\\r\n -H \"Authorization: Bearer ${key}\" \\\\\r\n -H \"Content-Type: application/json\" \\\\\r\n -d '{\"model\":\"${model}\",\"messages\":[{\"role\":\"user\",\"content\":\"Hello\"}]}'`,\r\n\t\tpython: `from openai import OpenAI\r\n\r\nclient = OpenAI(\r\n base_url=\"${openAiBaseUrl}\",\r\n api_key=\"${key}\",\r\n)\r\n\r\nresponse = client.chat.completions.create(\r\n model=\"${model}\",\r\n messages=[{\"role\": \"user\", \"content\": \"Hello\"}],\r\n)\r\nprint(response.choices[0].message.content)`,\r\n\t\tide: `# OpenAI-compatible client\r\nbase_url: ${openAiBaseUrl}\r\napi_key: ${key}\r\n\r\n# Anthropic-compatible client\r\nbase_url: ${anthropicBaseUrl}\r\napi_key: ${key}`,\r\n\t};\r\n}\r\n", "/** Accessible segmented tablist for Coding OAuth settings. */\r\n\r\nimport type { KeyboardEvent } from \"react\";\r\nimport { SETTINGS_TABS } from \"../constants.ts\";\r\nimport { segmentedNavStyle, segmentedTabActiveStyle, segmentedTabStyle } from \"../styles.ts\";\r\nimport type { GrokBuildSettingsInjected, SettingsTabId } from \"../types.ts\";\r\n\r\nexport interface SettingsTabHint {\r\n\tid: SettingsTabId;\r\n\tsuffix?: string;\r\n}\r\n\r\nexport interface SettingsTabsProps {\r\n\tt: GrokBuildSettingsInjected[\"t\"];\r\n\tactiveTab: SettingsTabId;\r\n\tonChange: (tab: SettingsTabId) => void;\r\n\thints?: readonly SettingsTabHint[];\r\n}\r\n\r\nexport function SettingsTabs({ t, activeTab, onChange, hints }: SettingsTabsProps) {\r\n\tconst hintFor = (id: SettingsTabId): string | undefined => hints?.find((entry) => entry.id === id)?.suffix;\r\n\r\n\tconst focusTab = (index: number): void => {\r\n\t\tconst tab = SETTINGS_TABS[index];\r\n\t\tif (tab === undefined) return;\r\n\t\tonChange(tab.id);\r\n\t\tconst button = document.getElementById(`coding-oauth-tab-${tab.id}`);\r\n\t\tbutton?.focus();\r\n\t};\r\n\r\n\tconst onKeyDown = (event: KeyboardEvent<HTMLDivElement>): void => {\r\n\t\tconst current = SETTINGS_TABS.findIndex((tab) => tab.id === activeTab);\r\n\t\tif (current < 0) return;\r\n\t\tif (event.key === \"ArrowRight\" || event.key === \"ArrowDown\") {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tfocusTab((current + 1) % SETTINGS_TABS.length);\r\n\t\t} else if (event.key === \"ArrowLeft\" || event.key === \"ArrowUp\") {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tfocusTab((current - 1 + SETTINGS_TABS.length) % SETTINGS_TABS.length);\r\n\t\t} else if (event.key === \"Home\") {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tfocusTab(0);\r\n\t\t} else if (event.key === \"End\") {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tfocusTab(SETTINGS_TABS.length - 1);\r\n\t\t}\r\n\t};\r\n\r\n\treturn (\r\n\t\t<div role=\"tablist\" aria-label={t(\"title\")} style={segmentedNavStyle} onKeyDown={onKeyDown}>\r\n\t\t\t{SETTINGS_TABS.map((tab) => {\r\n\t\t\t\tconst selected = activeTab === tab.id;\r\n\t\t\t\tconst suffix = hintFor(tab.id);\r\n\t\t\t\tconst label = suffix === undefined ? t(tab.label) : `${t(tab.label)} (${suffix})`;\r\n\t\t\t\treturn (\r\n\t\t\t\t\t<button\r\n\t\t\t\t\t\tkey={tab.id}\r\n\t\t\t\t\t\tid={`coding-oauth-tab-${tab.id}`}\r\n\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\trole=\"tab\"\r\n\t\t\t\t\t\taria-selected={selected}\r\n\t\t\t\t\t\taria-controls={selected ? `coding-oauth-panel-${tab.id}` : undefined}\r\n\t\t\t\t\t\ttabIndex={selected ? 0 : -1}\r\n\t\t\t\t\t\tstyle={selected ? segmentedTabActiveStyle : segmentedTabStyle}\r\n\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\tonChange(tab.id);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{label}\r\n\t\t\t\t\t</button>\r\n\t\t\t\t);\r\n\t\t\t})}\r\n\t\t</div>\r\n\t);\r\n}\r\n", "/** Injects global keyframes once for skeleton pulse and spinner animations. */\r\n\r\nconst STYLE_ID = \"dsh-coding-oauth-micro-styles\";\r\n\r\nconst CSS = `\r\n@keyframes dsh-coding-oauth-skeleton-pulse {\r\n 0% { background-position: 200% 0; }\r\n 100% { background-position: -200% 0; }\r\n}\r\n@keyframes dsh-coding-oauth-spin {\r\n from { transform: rotate(0deg); }\r\n to { transform: rotate(360deg); }\r\n}\r\n@keyframes dsh-coding-oauth-fade-in {\r\n from { opacity: 0; transform: translateY(-4px); }\r\n to { opacity: 1; transform: translateY(0); }\r\n}\r\n@media (prefers-reduced-motion: reduce) {\r\n [data-dsh-coding-oauth] *, [data-dsh-coding-oauth] *::before, [data-dsh-coding-oauth] *::after {\r\n animation-duration: 0.01ms !important;\r\n animation-iteration-count: 1 !important;\r\n transition-duration: 0.01ms !important;\r\n scroll-behavior: auto !important;\r\n }\r\n}\r\n@media (max-width: 560px) {\r\n [data-dsh-coding-oauth] button,\r\n [data-dsh-coding-oauth] input,\r\n [data-dsh-coding-oauth] [role=\"switch\"] {\r\n min-height: 44px;\r\n }\r\n [data-dsh-coding-oauth] [data-responsive-row] {\r\n align-items: stretch !important;\r\n flex-direction: column;\r\n }\r\n}\r\n`;\r\n\r\nlet injected = false;\r\n\r\nexport function ensureMicroStyles(): void {\r\n\tif (injected || typeof document === \"undefined\") return;\r\n\tif (document.getElementById(STYLE_ID) !== null) {\r\n\t\tinjected = true;\r\n\t\treturn;\r\n\t}\r\n\tconst style = document.createElement(\"style\");\r\n\tstyle.id = STYLE_ID;\r\n\tstyle.textContent = CSS;\r\n\tdocument.head.appendChild(style);\r\n\tinjected = true;\r\n}\r\n", "/** English copy for the Coding OAuth settings section. */\r\nexport const en = {\r\n\tnav: \"Coding OAuth\",\r\n\ttitle: \"Coding subscriptions\",\r\n\tintro:\r\n\t\t\"Use your own Grok Build, ChatGPT Codex, Kimi Code, and Claude Code subscriptions in dsh. API-key routes remain separate.\",\r\n\ttermsWarning:\r\n\t\t\"These are unofficial third-party integrations with subscription services. Provider terms, quotas, regions, and account-risk policies still apply.\",\r\n\tloadingAccount: \"Loading accounts\u2026\",\r\n\tsignedOut: \"Not signed in\",\r\n\tsigningIn: \"Waiting for authorization\u2026\",\r\n\tsignedIn: \"Signed in\",\r\n\trequestFailed: \"The account request failed.\",\r\n\tretry: \"Try again\",\r\n\tcancel: \"Cancel\",\r\n\tlogout: \"Sign out\",\r\n\tlogoutConfirmTitle: \"Confirm sign-out\",\r\n\tlogoutConfirmHint: \"Sign out of this provider in dsh? Your provider account itself is not changed.\",\r\n\tlogoutConfirmAction: \"Confirm sign-out\",\r\n\tworking: \"Working\u2026\",\r\n\tcancelLogin: \"Cancel sign-in\",\r\n\tdeviceLogin: \"Sign in with device code\",\r\n\tdeviceLoginRemote: \"Sign in with device code (best for remote)\",\r\n\tbrowserLogin: \"Sign in in browser\",\r\n\tpkceLogin: \"Sign in with authorization code\",\r\n\tuserCode: \"Enter this code when the provider asks:\",\r\n\topenUrl: \"Complete sign-in at:\",\r\n\tpopupBlocked: \"The browser blocked the sign-in window. Open this URL manually:\",\r\n\tpasteCodeHint:\r\n\t\t\"Paste the authorization code or complete redirect URL returned by the provider. For local PKCE, use this only if the callback could not reach this DSH host:\",\r\n\tpasteBrowserCodeHint:\r\n\t\t\"Paste the authorization code or complete redirect URL returned by the provider to finish this browser sign-in:\",\r\n\tpasteCodePlaceholder: \"authorization code or complete redirect URL\",\r\n\tpasteCodeLabel: \"Authorization code or complete redirect URL\",\r\n\tsubmitCode: \"Submit code\",\r\n\timportGrok: \"Import from Grok CLI\",\r\n\timportHint: \"Copies ~/.grok/auth.json into dsh. A later dsh refresh may rotate the token and sign the Grok CLI out.\",\r\n\tmodels: \"Visible models\",\r\n\tcatalogLive: \"From your current xAI account\",\r\n\tcatalogCache: \"From the last successful xAI listing\",\r\n\tcatalogFallback: \"Built-in Grok baseline (live listing unavailable)\",\r\n\tcatalogError: \"Could not refresh the live Grok model list.\",\r\n\tselectAll: \"Show all\",\r\n\tmodelHint: \"Checked models appear in the model picker as\",\r\n\tgrokTitle: \"xAI Grok Build\",\r\n\tgrokDescription: \"SuperGrok / X Premium coding subscription through the Grok Build endpoint.\",\r\n\tcodexTitle: \"OpenAI Codex\",\r\n\tcodexDescription: \"ChatGPT Plus/Pro Codex entitlement. Device code is recommended for a remote DSH host.\",\r\n\tkimiTitle: \"Kimi Code\",\r\n\tkimiDescription:\r\n\t\t\"Kimi Code membership through auth.kimi.com and api.kimi.com/coding; this is not the Moonshot API-key platform.\",\r\n\tclaudeTitle: \"Claude Code\",\r\n\tclaudeDescription: \"Claude Pro/Max OAuth with Claude Code scopes and automatic refresh.\",\r\n\tantigravityTitle: \"Google Antigravity\",\r\n\tantigravityDescription: \"Provided by the separately pinned MIT dsh-agy plugin and exposed as the agy route.\",\r\n\tantigravityInstalled: \"Installed (CLI-managed)\",\r\n\tantigravityMissing: \"Not installed\",\r\n\tantigravityCliHint:\r\n\t\t\"The unauthenticated dsh-agy web export dashboard is disabled. Manage Google OAuth with the profile-local CLI when needed.\",\r\n\tantigravityCliCommand: \"dsh plugin --profile web exec dsh-agy login --headless\",\r\n\tsourcesTitle: \"Pull a copy from official CLI files\",\r\n\tsourcesIntro:\r\n\t\t\"dsh can discover a local official CLI login and pull a one-way copy into its own store. Official CLI files stay read-only and are never modified.\",\r\n\tsourcesReadOnlyHint:\r\n\t\t\"This is a one-way pull of a copy. dsh does not update, replace, or write back the official CLI documents.\",\r\n\tsourcesLoading: \"Looking for official CLI login files\u2026\",\r\n\tsourcesCheckAgain: \"Check again\",\r\n\tsourcesAvailable: \"A readable copy is available\",\r\n\tsourcesUnavailable: \"No usable copy found\",\r\n\tsourcesAllMissingHint:\r\n\t\t\"No official CLI login files were found on this host. That is normal on a remote DSH machine \u2014 use device-code sign-in instead, or check again after logging in on this same host.\",\r\n\tsourcesAvailableHint:\r\n\t\t\"An official CLI login was found on this host. You can pull a one-way copy into dsh from a provider card.\",\r\n\tsourcesPullCopy: \"Pull a copy\",\r\n\tremoteAccountsTip:\r\n\t\t\"This Settings page looks remote (not loopback). Prefer device-code sign-in; browser pop-ups and local PKCE callbacks often fail from another machine.\",\r\n\tremoteTipDismiss: \"Dismiss\",\r\n\tsourcesPreviewTitle: \"Review this copy before saving it in dsh\",\r\n\tsourcesPreviewExpires: \"CLI credential expiry: {time}\",\r\n\tsourcesTicketExpires: \"This preview expires at {time}\",\r\n\tsourcesConflict: \"Stored dsh credential: {detail}\",\r\n\tsourcesAction: \"If you continue: {detail}\",\r\n\tsourcesWarnings: \"Notes\",\r\n\tsourcesConfirmOverwrite: \"Replace the credential already stored in dsh with this copy\",\r\n\tsourcesConfirmOverwriteHint: \"A different credential is already stored. Check the box, then confirm the pull.\",\r\n\tsourcesCommit: \"Confirm pull\",\r\n\tsourcesCancelPreview: \"Cancel preview\",\r\n\tsourcesCommitSuccess: \"Copied into dsh ({action}).\",\r\n\tsourcesPreviewFailed: \"Could not prepare a copy from that CLI file.\",\r\n\tsourcesCommitFailed: \"Could not save the copy in dsh.\",\r\n\tsourcesLoadFailed: \"Could not look for official CLI login files.\",\r\n\tsourceKindGrok: \"Grok CLI\",\r\n\tsourceKindCodex: \"Codex CLI\",\r\n\tsourceKindKimi: \"Kimi Code CLI\",\r\n\tsourceKindClaude: \"Claude Code CLI\",\r\n\tsourceReasonMissing: \"No official CLI file was found at the expected location.\",\r\n\tsourceReasonUnsafe: \"The official CLI file is not safe to read (permissions or file type).\",\r\n\tsourceReasonInvalid: \"The official CLI file is present but is not a usable OAuth login.\",\r\n\tsourceReasonTooLarge: \"The official CLI file is larger than the allowed read limit.\",\r\n\tsourceConflictNone: \"dsh has no stored credential yet\",\r\n\tsourceConflictSameCredential: \"same credential already stored\",\r\n\tsourceConflictSameAccount: \"same account, different credential\",\r\n\tsourceConflictDifferentAccount: \"a different account is already stored\",\r\n\tsourceConflictUnknownAccount: \"an existing credential is stored (account could not be compared)\",\r\n\tsourceConflictUnreadableDestination: \"the stored dsh credential could not be read\",\r\n\tsourceConflictUnsafeDestination: \"the stored dsh credential file is not safe to replace\",\r\n\tsourceConflictUnrecognized: \"the stored credential needs a review\",\r\n\tsourceActionImport: \"save this copy in dsh\",\r\n\tsourceActionReuse: \"keep the stored dsh credential (it already matches)\",\r\n\tsourceActionOverwrite: \"replace the stored dsh credential\",\r\n\tsourceActionBlocked: \"blocked \u2014 the stored dsh file cannot be replaced from here\",\r\n\tsourceActionUnrecognized: \"needs a review\",\r\n\tsourceCommitImported: \"saved\",\r\n\tsourceCommitUnchanged: \"already matched\",\r\n\tsourceCommitOverwritten: \"replaced\",\r\n\tcapabilitiesTitle: \"Subscription capabilities\",\r\n\tcapabilitiesIntro:\r\n\t\t\"Every switch starts off. Turning one on uses that vendor\u2019s subscription quota, not a separate API-key bill.\",\r\n\tcapabilitiesQuotaHint:\r\n\t\t\"Search, images, edits, Fast, usage, and Grok Imagine all consume the matching subscription quota when they run.\",\r\n\tcapabilitiesReadOnly: \"These switches are read-only in this deployment.\",\r\n\tcapabilitiesLoading: \"Loading capability settings\u2026\",\r\n\tcapabilitiesLoadFailed: \"Could not load capability settings.\",\r\n\tcapabilitiesSaveFailed: \"Could not save that capability setting.\",\r\n\tcapabilitiesConflictRefreshed: \"Those settings changed elsewhere. The page was refreshed; try again.\",\r\n\tcapabilityLimitsTitle: \"Capability limits\",\r\n\tcapabilityLimitsHint: \"Limits apply live to newly started operations and remain within the audited safety bounds.\",\r\n\tcapSearchResults: \"Maximum search results\",\r\n\tcapSearchResultsHint: \"Codex search returns at most this many results (1\u201320).\",\r\n\tcapImageCount: \"Maximum images per call\",\r\n\tcapImageCountHint: \"Codex and Imagine image tools can return at most this many images (1\u20134).\",\r\n\tcapVideoTtlHours: \"Video artifact retention (hours)\",\r\n\tcapVideoTtlHoursHint:\r\n\t\t\"Completed Imagine video artifacts are kept for 1\u2013168 hours. Lowering retention cleans older artifacts immediately; raising it applies to new artifacts.\",\r\n\tcapabilityLimitInvalid: \"Enter a whole number from {min} through {max}.\",\r\n\tcapCodexSearch: \"Codex subscription search\",\r\n\tcapCodexSearchHint: \"Optional search using Codex quota.\",\r\n\tcapCodexImages: \"Codex images\",\r\n\tcapCodexImagesHint: \"Generate images with ChatGPT/Codex quota.\",\r\n\tcapCodexImageEdits: \"Codex image edits\",\r\n\tcapCodexImageEditsHint: \"Edit images; requires Codex images.\",\r\n\tcapCodexUsage: \"Show Codex quota\",\r\n\tcapCodexUsageHint: \"Show remaining quota on the Codex account card when available.\",\r\n\tcapCodexFast: \"Fast requested\",\r\n\tcapCodexFastHint: \"Publish the Fast route when the live catalog confirms priority eligibility.\",\r\n\tcapGrokImagineImage: \"Grok Imagine images\",\r\n\tcapGrokImagineImageHint: \"Needs a separate Imagine credential (not Grok OAuth alone).\",\r\n\tcapGrokImagineVideo: \"Grok Imagine video\",\r\n\tcapGrokImagineVideoHint: \"Needs a separate Imagine credential (not Grok OAuth alone).\",\r\n\tusageTitle: \"Codex quota\",\r\n\tusageLoading: \"Loading Codex quota\u2026\",\r\n\tusageUnavailable: \"Codex quota is not available right now.\",\r\n\tusageEmpty: \"The vendor did not return any displayable quota fields.\",\r\n\tusageFetchedAt: \"Last read: {time}\",\r\n\tusageRateLimit: \"Rate limit\",\r\n\tusageWindow: \"{seconds}s window\",\r\n\tusageUsed: \"Used {value}\",\r\n\tusageRemaining: \"Remaining {value}\",\r\n\tusageResets: \"Resets {time}\",\r\n\tusageCredits: \"Credits\",\r\n\tusageCreditsUnlimited: \"Unlimited credits\",\r\n\tusageCreditsLimited: \"Limited credits\",\r\n\tusageBalance: \"Balance {value}\",\r\n\tusageIndividualLimit: \"Individual limit\",\r\n\tusageLimit: \"Limit {value}\",\r\n\tusageUsedAmount: \"Used {value}\",\r\n\tusageRemainingAmount: \"Remaining {value}\",\r\n\tusageSpendControlReached: \"Spend control has been reached.\",\r\n\tusageResetCredits: \"Reset credits available: {value}\",\r\n\timagineTitle: \"Grok Imagine credential\",\r\n\timagineIntro:\r\n\t\t\"Official Imagine calls use an xAI API credential (for example $XAI_API_KEY). That key is separate from a Grok Build OAuth login and is never shown here.\",\r\n\timagineLoading: \"Checking the Imagine credential\u2026\",\r\n\timagineLoadFailed: \"Could not read the Imagine credential status.\",\r\n\timagineConfigured: \"An Imagine credential is configured\",\r\n\timagineNotConfigured: \"No Imagine credential is configured\",\r\n\timagineSource: \"Source: {source}\",\r\n\timagineWritable: \"This deployment can update the Imagine credential store.\",\r\n\timagineReadOnly: \"This deployment cannot update the Imagine credential store.\",\r\n\timagineSourceNone: \"none\",\r\n\timagineSourceEnv: \"environment variable\",\r\n\timagineSourceApiKey: \"stored API key\",\r\n\timagineSourceOAuth: \"OAuth access (only if Imagine accepted it)\",\r\n\timagineSourceCliKey: \"Grok CLI key field\",\r\n\timagineSourceUnknown: \"configured (details withheld)\",\r\n\ttabAccounts: \"Accounts\",\r\n\ttabCapabilities: \"Capabilities\",\r\n\ttabGateway: \"Gateway\",\r\n\ttabAbout: \"About\",\r\n\tcopy: \"Copy\",\r\n\tcopied: \"Copied\",\r\n\tcopyFailed: \"Could not copy\",\r\n\tmodelsSummary: \"{selected}/{total} models visible\",\r\n\texpandModels: \"Models\",\r\n\tcollapseModels: \"Hide models\",\r\n\tusageUsedShort: \"Used {value}\",\r\n\tgatewayTitle: \"Local API gateway\",\r\n\tgatewayIntro: \"Loopback OpenAI/Anthropic-compatible server for your own tools. Off until you enable it.\",\r\n\tgatewayWarning: \"Exposes signed-in subscriptions as a local API. Can violate provider terms and uses quota.\",\r\n\tgatewayLoopbackHint: \"Binds to loopback only. Do not port-forward or expose this gateway on a public interface.\",\r\n\tgatewayEnableConfirm:\r\n\t\t\"Enable the local API gateway? It exposes your signed-in subscriptions to tools on this host and consumes provider quota.\",\r\n\tgatewayEnableConfirmAction: \"Confirm\",\r\n\tgatewayEnableCancel: \"Cancel\",\r\n\tgatewayEnabled: \"Enable local gateway\",\r\n\tgatewayBind: \"Bind\",\r\n\tgatewayPort: \"Port\",\r\n\tgatewayPortHint: \"Integer from 1024 through 65535. Apply to save; Random fills a high port, then Apply.\",\r\n\tgatewayPortApply: \"Apply\",\r\n\tgatewayPortRandom: \"Random\",\r\n\tgatewayPortInvalid: \"Enter a whole port number from 1024 through 65535.\",\r\n\tgatewayAddress: \"Gateway address\",\r\n\tgatewayOpenAiUrl: \"OpenAI-compatible base URL\",\r\n\tgatewayAnthropicUrl: \"Anthropic-compatible base URL\",\r\n\tgatewayKeyHint: \"Bearer key\",\r\n\tgatewayKeyCopyHint: \"Copy uses the current key. Rotate only if you want to invalidate existing clients.\",\r\n\tgatewayCopyKey: \"Copy key\",\r\n\tgatewayShowKey: \"Show\",\r\n\tgatewayHideKey: \"Hide\",\r\n\tgatewayRevealFailed: \"Could not read the current key.\",\r\n\tgatewayRotateConfirm: \"Rotate the key? Existing clients will stop working.\",\r\n\tgatewayRotateConfirmHint: \"This replaces the current Bearer key.\",\r\n\tgatewayRotateConfirmAction: \"Confirm rotate\",\r\n\tgatewayRotateCancel: \"Cancel\",\r\n\tgatewayRunning: \"Listening\",\r\n\tgatewayStopped: \"Not listening\",\r\n\tgatewayRotate: \"Rotate API key\",\r\n\tgatewayRotated: \"New key (shown once): {key}\",\r\n\tgatewayLoadFailed: \"Could not load gateway settings.\",\r\n\tgatewaySaveFailed: \"Could not update the gateway.\",\r\n\tgatewayLoading: \"Loading gateway settings\u2026\",\r\n\tgatewayModelsReady: \"{count} executable model(s) available. Snippets use {model}.\",\r\n\tgatewayModelsUnavailable: \"No signed-in provider currently exposes an executable gateway model.\",\r\n\tgatewayKeyConfigured: \"A real Bearer key is configured. Reveal it before copying an executable snippet.\",\r\n\tgatewayKeyNotConfigured: \"No Bearer key is configured yet.\",\r\n\tremoteLoginHelp:\r\n\t\t\"On a remote DSH host, open Settings here and use device-code sign-in for each provider. Complete the code on any browser that can reach the provider, then return to chat and pick the provider route model.\",\r\n\tpluginVersion: \"Plugin version {version}\",\r\n\taboutTitle: \"About\",\r\n\taboutDocsHint:\r\n\t\t\"See the plugin README and INSTALL docs in the repository for setup, supported providers, and gateway safety notes.\",\r\n\taboutDocsLink: \"Open README on GitHub\",\r\n\totherLoginMethods: \"Other sign-in methods\",\r\n\thideOtherLoginMethods: \"Hide other methods\",\r\n\tsignInStepOpen: \"Open the provider authorization page\",\r\n\tsignInStepCode: \"Enter the device code when prompted\",\r\n\tsignInStepWait: \"Waiting for authorization to complete\",\r\n\tcopyUserCode: \"Copy code\",\r\n\topenAuthUrl: \"Open authorization page\",\r\n\tmodelFilterPlaceholder: \"Filter models\u2026\",\r\n\tmodelFilterLabel: \"Filter models for {provider}\",\r\n\tapplyModelDraft: \"Apply model selection\",\r\n\tmodelDraftPending: \"Selection changed locally. Apply once to save.\",\r\n\tdeselectAll: \"Hide all\",\r\n\tresetModelsDefault: \"Reset selection\",\r\n\trequiresCodexImages: \"Turn on Codex images first.\",\r\n\trequiresCodexSignIn: \"Sign in to OpenAI Codex first.\",\r\n\trequiresImagineCredential: \"Configure the separate Grok Imagine credential first.\",\r\n\topenCodexAccount: \"Open Codex account\",\r\n\tfocusCodexImages: \"Go to Codex images\",\r\n\tfocusImagineCredential: \"View Imagine credential status\",\r\n\tgatewaySnippetsTitle: \"Quick setup snippets\",\r\n\tgatewaySnippetsUnavailable: \"Reveal the real key and sign in to at least one provider before snippets are shown.\",\r\n\tgatewaySnippetCurl: \"cURL\",\r\n\tgatewaySnippetPython: \"Python (OpenAI SDK)\",\r\n\tgatewaySnippetIde: \"IDE / client\",\r\n\ttabAccountsSignedIn: \"{count} signed in\",\r\n\tcoinstallTitle: \"Managed by Usage Center\",\r\n\tcoinstallSummary: \"Usage Center is the active OAuth owner. {count} provider account(s) are currently signed in.\",\r\n\tcoinstallOpenHub: \"Open Usage Center\",\r\n\ttabGatewayActive: \"Running\",\r\n};\r\n\r\nexport type GrokBuildSettingsKey = keyof typeof en;\r\n\r\nexport const zh: { [Key in GrokBuildSettingsKey]: string } = {\r\n\tnav: \"\u7F16\u7801 OAuth\",\r\n\ttitle: \"\u7F16\u7801\u8BA2\u9605\u8D26\u6237\",\r\n\tintro:\r\n\t\t\"\u5728 dsh \u4E2D\u4F7F\u7528\u81EA\u5DF1\u7684 Grok Build\u3001ChatGPT Codex\u3001Kimi Code \u548C Claude Code \u8BA2\u9605\uFF1B\u73B0\u6709 API-key \u8DEF\u7531\u7EE7\u7EED\u72EC\u7ACB\u4FDD\u7559\u3002\",\r\n\ttermsWarning: \"\u8FD9\u4E9B\u662F\u8BA2\u9605\u670D\u52A1\u7684\u975E\u5B98\u65B9\u7B2C\u4E09\u65B9\u96C6\u6210\uFF0C\u4ECD\u53D7\u4F9B\u5E94\u5546\u6761\u6B3E\u3001\u914D\u989D\u3001\u5730\u533A\u9650\u5236\u548C\u8D26\u53F7\u98CE\u63A7\u7EA6\u675F\u3002\",\r\n\tloadingAccount: \"\u6B63\u5728\u52A0\u8F7D\u8D26\u6237\u2026\",\r\n\tsignedOut: \"\u5C1A\u672A\u767B\u5F55\",\r\n\tsigningIn: \"\u6B63\u5728\u7B49\u5F85\u6388\u6743\u2026\",\r\n\tsignedIn: \"\u5DF2\u767B\u5F55\",\r\n\trequestFailed: \"\u8D26\u6237\u8BF7\u6C42\u5931\u8D25\u3002\",\r\n\tretry: \"\u91CD\u8BD5\",\r\n\tcancel: \"\u53D6\u6D88\",\r\n\tlogout: \"\u9000\u51FA\u767B\u5F55\",\r\n\tlogoutConfirmTitle: \"\u786E\u8BA4\u9000\u51FA\u767B\u5F55\",\r\n\tlogoutConfirmHint: \"\u786E\u5B9A\u5728 dsh \u4E2D\u9000\u51FA\u6B64\u4F9B\u5E94\u5546\uFF1F\u4F9B\u5E94\u5546\u8D26\u53F7\u672C\u8EAB\u4E0D\u4F1A\u88AB\u4FEE\u6539\u3002\",\r\n\tlogoutConfirmAction: \"\u786E\u8BA4\u9000\u51FA\",\r\n\tworking: \"\u5904\u7406\u4E2D\u2026\",\r\n\tcancelLogin: \"\u53D6\u6D88\u767B\u5F55\",\r\n\tdeviceLogin: \"\u4F7F\u7528\u8BBE\u5907\u7801\u767B\u5F55\",\r\n\tdeviceLoginRemote: \"\u4F7F\u7528\u8BBE\u5907\u7801\u767B\u5F55\uFF08\u9002\u5408\u8FDC\u7A0B\uFF09\",\r\n\tbrowserLogin: \"\u5728\u6D4F\u89C8\u5668\u4E2D\u767B\u5F55\",\r\n\tpkceLogin: \"\u4F7F\u7528\u6388\u6743\u7801\u767B\u5F55\",\r\n\tuserCode: \"\u4F9B\u5E94\u5546\u8981\u6C42\u8F93\u5165\u4EE3\u7801\u65F6\uFF0C\u8BF7\u8F93\u5165\uFF1A\",\r\n\topenUrl: \"\u8BF7\u5728\u6B64\u5B8C\u6210\u767B\u5F55\uFF1A\",\r\n\tpopupBlocked: \"\u6D4F\u89C8\u5668\u963B\u6B62\u4E86\u767B\u5F55\u7A97\u53E3\uFF0C\u8BF7\u624B\u52A8\u6253\u5F00\uFF1A\",\r\n\tpasteCodeHint: \"\u8BF7\u7C98\u8D34\u4F9B\u5E94\u5546\u8FD4\u56DE\u7684\u6388\u6743 code \u6216\u5B8C\u6574\u8DF3\u8F6C\u94FE\u63A5\u3002\u672C\u5730 PKCE \u4EC5\u5728\u56DE\u8C03\u65E0\u6CD5\u5230\u8FBE\u8FD9\u53F0 DSH \u4E3B\u673A\u65F6\u4F7F\u7528\uFF1A\",\r\n\tpasteBrowserCodeHint: \"\u8BF7\u7C98\u8D34\u4F9B\u5E94\u5546\u8FD4\u56DE\u7684\u6388\u6743 code \u6216\u5B8C\u6574\u8DF3\u8F6C\u94FE\u63A5\uFF0C\u4EE5\u5B8C\u6210\u6B64\u6B21\u6D4F\u89C8\u5668\u767B\u5F55\uFF1A\",\r\n\tpasteCodePlaceholder: \"\u6388\u6743 code \u6216\u5B8C\u6574\u8DF3\u8F6C\u94FE\u63A5\",\r\n\tpasteCodeLabel: \"\u6388\u6743 code \u6216\u5B8C\u6574\u8DF3\u8F6C\u94FE\u63A5\",\r\n\tsubmitCode: \"\u63D0\u4EA4 code\",\r\n\timportGrok: \"\u4ECE Grok CLI \u5BFC\u5165\",\r\n\timportHint: \"\u628A ~/.grok/auth.json \u590D\u5236\u8FDB dsh\uFF1B\u4E4B\u540E dsh \u5237\u65B0 token \u53EF\u80FD\u8BA9 Grok CLI \u6389\u7EBF\u3002\",\r\n\tmodels: \"\u53EF\u89C1\u6A21\u578B\",\r\n\tcatalogLive: \"\u6765\u81EA\u5F53\u524D xAI \u8D26\u53F7\",\r\n\tcatalogCache: \"\u6765\u81EA\u4E0A\u4E00\u6B21\u6210\u529F\u62C9\u53D6\u7684 xAI \u5217\u8868\",\r\n\tcatalogFallback: \"\u5185\u7F6E Grok \u57FA\u7EBF\u76EE\u5F55\uFF08\u7EBF\u4E0A\u5217\u8868\u4E0D\u53EF\u7528\uFF09\",\r\n\tcatalogError: \"\u65E0\u6CD5\u5237\u65B0\u7EBF\u4E0A Grok \u6A21\u578B\u5217\u8868\u3002\",\r\n\tselectAll: \"\u5168\u90E8\u663E\u793A\",\r\n\tmodelHint: \"\u52FE\u9009\u6A21\u578B\u4F1A\u4EE5\u8BE5\u524D\u7F00\u51FA\u73B0\u5728\u6A21\u578B\u9009\u62E9\u5668\uFF1A\",\r\n\tgrokTitle: \"xAI Grok Build\",\r\n\tgrokDescription: \"\u901A\u8FC7 Grok Build \u7AEF\u70B9\u4F7F\u7528 SuperGrok / X Premium \u7F16\u7801\u8BA2\u9605\u3002\",\r\n\tcodexTitle: \"OpenAI Codex\",\r\n\tcodexDescription: \"\u4F7F\u7528 ChatGPT Plus/Pro \u7684 Codex \u6743\u76CA\uFF1B\u8FDC\u7A0B DSH \u4E3B\u673A\u63A8\u8350\u8BBE\u5907\u7801\u767B\u5F55\u3002\",\r\n\tkimiTitle: \"Kimi Code\",\r\n\tkimiDescription: \"\u901A\u8FC7 auth.kimi.com \u4E0E api.kimi.com/coding \u4F7F\u7528 Kimi Code \u4F1A\u5458\uFF1B\u4E0D\u662F Moonshot API-key \u5F00\u653E\u5E73\u53F0\u3002\",\r\n\tclaudeTitle: \"Claude Code\",\r\n\tclaudeDescription: \"Claude Pro/Max OAuth\uFF0C\u5305\u542B Claude Code scope \u548C\u81EA\u52A8\u5237\u65B0\u3002\",\r\n\tantigravityTitle: \"Google Antigravity\",\r\n\tantigravityDescription: \"\u7531\u5355\u72EC\u56FA\u5B9A\u7248\u672C\u7684 MIT \u5F00\u6E90 dsh-agy \u63D2\u4EF6\u63D0\u4F9B\uFF0C\u5BF9\u5916\u8DEF\u7531\u4E3A agy\u3002\",\r\n\tantigravityInstalled: \"\u5DF2\u5B89\u88C5\uFF08CLI \u7BA1\u7406\uFF09\",\r\n\tantigravityMissing: \"\u5C1A\u672A\u5B89\u88C5\",\r\n\tantigravityCliHint:\r\n\t\t\"\u4E3A\u907F\u514D\u66B4\u9732\u65E0\u8BA4\u8BC1\u7684\u51ED\u636E\u5BFC\u51FA\u9875\u9762\uFF0C\u9ED8\u8BA4\u7981\u7528 dsh-agy Web \u7BA1\u7406\u9875\uFF1B\u9700\u8981\u65F6\u4F7F\u7528 profile \u5185 CLI \u7BA1\u7406 Google OAuth\u3002\",\r\n\tantigravityCliCommand: \"dsh plugin --profile web exec dsh-agy login --headless\",\r\n\tsourcesTitle: \"\u4ECE\u5B98\u65B9 CLI \u6587\u4EF6\u62C9\u53D6\u526F\u672C\",\r\n\tsourcesIntro:\r\n\t\t\"dsh \u53EF\u4EE5\u81EA\u52A8\u53D1\u73B0\u672C\u673A\u5B98\u65B9 CLI \u767B\u5F55\uFF0C\u5E76\u5355\u5411\u62C9\u53D6\u4E00\u4EFD\u526F\u672C\u5230\u81EA\u5DF1\u7684\u5B58\u50A8\u3002\u5B98\u65B9 CLI \u6587\u4EF6\u4FDD\u6301\u53EA\u8BFB\uFF0C\u7EDD\u4E0D\u4F1A\u88AB\u4FEE\u6539\u3002\",\r\n\tsourcesReadOnlyHint: \"\u8FD9\u662F\u5355\u5411\u62C9\u53D6\u526F\u672C\u3002dsh \u4E0D\u4F1A\u66F4\u65B0\u3001\u8986\u76D6\u6216\u56DE\u5199\u5B98\u65B9 CLI \u6587\u6863\u3002\",\r\n\tsourcesLoading: \"\u6B63\u5728\u67E5\u627E\u5B98\u65B9 CLI \u767B\u5F55\u6587\u4EF6\u2026\",\r\n\tsourcesCheckAgain: \"\u518D\u68C0\u67E5\u4E00\u6B21\",\r\n\tsourcesAvailable: \"\u53EF\u4EE5\u8BFB\u53D6\u4E00\u4EFD\u526F\u672C\",\r\n\tsourcesUnavailable: \"\u6CA1\u6709\u53EF\u7528\u7684\u526F\u672C\",\r\n\tsourcesAllMissingHint:\r\n\t\t\"\u8FD9\u53F0\u4E3B\u673A\u4E0A\u6CA1\u6709\u627E\u5230\u5B98\u65B9 CLI \u767B\u5F55\u6587\u4EF6\u3002\u8FDC\u7A0B DSH \u4E0A\u8FD9\u5F88\u5E38\u89C1\u2014\u2014\u8BF7\u6539\u7528\u8BBE\u5907\u7801\u767B\u5F55\uFF1B\u82E5\u5DF2\u5728\u672C\u673A CLI \u767B\u5F55\uFF0C\u53EF\u518D\u68C0\u67E5\u4E00\u6B21\u3002\",\r\n\tsourcesAvailableHint: \"\u672C\u673A\u53D1\u73B0\u4E86\u5B98\u65B9 CLI \u767B\u5F55\u3002\u53EF\u5728\u5BF9\u5E94\u8D26\u6237\u5361\u7247\u91CC\u5355\u5411\u62C9\u53D6\u4E00\u4EFD\u526F\u672C\u5230 dsh\u3002\",\r\n\tsourcesPullCopy: \"\u62C9\u53D6\u526F\u672C\",\r\n\tremoteAccountsTip:\r\n\t\t\"\u5F53\u524D Settings \u9875\u9762\u770B\u8D77\u6765\u662F\u8FDC\u7A0B\u8BBF\u95EE\uFF08\u975E\u672C\u673A\u56DE\u73AF\uFF09\u3002\u8BF7\u4F18\u5148\u4F7F\u7528\u8BBE\u5907\u7801\u767B\u5F55\uFF1B\u4ECE\u53E6\u4E00\u53F0\u673A\u5668\u6253\u5F00\u65F6\uFF0C\u6D4F\u89C8\u5668\u5F39\u7A97\u548C\u672C\u5730 PKCE \u56DE\u8C03\u7ECF\u5E38\u4F1A\u5931\u8D25\u3002\",\r\n\tremoteTipDismiss: \"\u77E5\u9053\u4E86\",\r\n\tsourcesPreviewTitle: \"\u5148\u6838\u5BF9\u8FD9\u4EFD\u526F\u672C\uFF0C\u518D\u5199\u5165 dsh\",\r\n\tsourcesPreviewExpires: \"CLI \u51ED\u636E\u5230\u671F\u65F6\u95F4\uFF1A{time}\",\r\n\tsourcesTicketExpires: \"\u6B64\u6B21\u9884\u89C8\u5C06\u4E8E {time} \u5931\u6548\",\r\n\tsourcesConflict: \"dsh \u4E2D\u5DF2\u5B58\u51ED\u636E\uFF1A{detail}\",\r\n\tsourcesAction: \"\u82E5\u7EE7\u7EED\uFF1A{detail}\",\r\n\tsourcesWarnings: \"\u8BF4\u660E\",\r\n\tsourcesConfirmOverwrite: \"\u7528\u8FD9\u4EFD\u526F\u672C\u66FF\u6362 dsh \u4E2D\u5DF2\u4FDD\u5B58\u7684\u51ED\u636E\",\r\n\tsourcesConfirmOverwriteHint: \"dsh \u91CC\u5DF2\u6709\u53E6\u4E00\u4EFD\u51ED\u636E\u3002\u8BF7\u5148\u52FE\u9009\uFF0C\u518D\u786E\u8BA4\u62C9\u53D6\u3002\",\r\n\tsourcesCommit: \"\u786E\u8BA4\u62C9\u53D6\",\r\n\tsourcesCancelPreview: \"\u53D6\u6D88\u9884\u89C8\",\r\n\tsourcesCommitSuccess: \"\u5DF2\u590D\u5236\u5230 dsh\uFF08{action}\uFF09\u3002\",\r\n\tsourcesPreviewFailed: \"\u65E0\u6CD5\u4ECE\u8BE5 CLI \u6587\u4EF6\u51C6\u5907\u526F\u672C\u3002\",\r\n\tsourcesCommitFailed: \"\u65E0\u6CD5\u628A\u526F\u672C\u4FDD\u5B58\u5230 dsh\u3002\",\r\n\tsourcesLoadFailed: \"\u65E0\u6CD5\u67E5\u627E\u5B98\u65B9 CLI \u767B\u5F55\u6587\u4EF6\u3002\",\r\n\tsourceKindGrok: \"Grok CLI\",\r\n\tsourceKindCodex: \"Codex CLI\",\r\n\tsourceKindKimi: \"Kimi Code CLI\",\r\n\tsourceKindClaude: \"Claude Code CLI\",\r\n\tsourceReasonMissing: \"\u5728\u9884\u671F\u4F4D\u7F6E\u6CA1\u6709\u627E\u5230\u5B98\u65B9 CLI \u6587\u4EF6\u3002\",\r\n\tsourceReasonUnsafe: \"\u5B98\u65B9 CLI \u6587\u4EF6\u4E0D\u5B89\u5168\uFF0C\u65E0\u6CD5\u8BFB\u53D6\uFF08\u6743\u9650\u6216\u6587\u4EF6\u7C7B\u578B\uFF09\u3002\",\r\n\tsourceReasonInvalid: \"\u5B98\u65B9 CLI \u6587\u4EF6\u5B58\u5728\uFF0C\u4F46\u4E0D\u662F\u53EF\u7528\u7684 OAuth \u767B\u5F55\u3002\",\r\n\tsourceReasonTooLarge: \"\u5B98\u65B9 CLI \u6587\u4EF6\u8D85\u8FC7\u5141\u8BB8\u7684\u8BFB\u53D6\u4E0A\u9650\u3002\",\r\n\tsourceConflictNone: \"dsh \u5C1A\u672A\u4FDD\u5B58\u51ED\u636E\",\r\n\tsourceConflictSameCredential: \"\u5DF2\u4FDD\u5B58\u540C\u4E00\u4EFD\u51ED\u636E\",\r\n\tsourceConflictSameAccount: \"\u540C\u4E00\u8D26\u53F7\uFF0C\u4F46\u51ED\u636E\u4E0D\u540C\",\r\n\tsourceConflictDifferentAccount: \"\u5DF2\u4FDD\u5B58\u53E6\u4E00\u4E2A\u8D26\u53F7\",\r\n\tsourceConflictUnknownAccount: \"\u5DF2\u4FDD\u5B58\u51ED\u636E\uFF08\u65E0\u6CD5\u6BD4\u8F83\u8D26\u53F7\uFF09\",\r\n\tsourceConflictUnreadableDestination: \"\u65E0\u6CD5\u8BFB\u53D6 dsh \u4E2D\u5DF2\u5B58\u51ED\u636E\",\r\n\tsourceConflictUnsafeDestination: \"dsh \u4E2D\u7684\u51ED\u636E\u6587\u4EF6\u4E0D\u5B89\u5168\uFF0C\u4E0D\u80FD\u4ECE\u8FD9\u91CC\u66FF\u6362\",\r\n\tsourceConflictUnrecognized: \"\u5DF2\u5B58\u51ED\u636E\u9700\u8981\u6838\u5BF9\",\r\n\tsourceActionImport: \"\u628A\u8FD9\u4EFD\u526F\u672C\u4FDD\u5B58\u5230 dsh\",\r\n\tsourceActionReuse: \"\u4FDD\u7559 dsh \u4E2D\u5DF2\u5B58\u51ED\u636E\uFF08\u5185\u5BB9\u5DF2\u76F8\u540C\uFF09\",\r\n\tsourceActionOverwrite: \"\u66FF\u6362 dsh \u4E2D\u5DF2\u5B58\u51ED\u636E\",\r\n\tsourceActionBlocked: \"\u5DF2\u963B\u6B62 \u2014 \u4E0D\u80FD\u4ECE\u8FD9\u91CC\u66FF\u6362 dsh \u4E2D\u7684\u6587\u4EF6\",\r\n\tsourceActionUnrecognized: \"\u9700\u8981\u6838\u5BF9\",\r\n\tsourceCommitImported: \"\u5DF2\u4FDD\u5B58\",\r\n\tsourceCommitUnchanged: \"\u539F\u672C\u5C31\u76F8\u540C\",\r\n\tsourceCommitOverwritten: \"\u5DF2\u66FF\u6362\",\r\n\tcapabilitiesTitle: \"\u8BA2\u9605\u80FD\u529B\",\r\n\tcapabilitiesIntro: \"\u6240\u6709\u5F00\u5173\u9ED8\u8BA4\u5173\u95ED\u3002\u6253\u5F00\u540E\u6D88\u8017\u7684\u662F\u5BF9\u5E94\u4F9B\u5E94\u5546\u7684\u8BA2\u9605\u914D\u989D\uFF0C\u4E0D\u662F\u53E6\u4E00\u5957 API-key \u8D26\u5355\u3002\",\r\n\tcapabilitiesQuotaHint: \"\u641C\u7D22\u3001\u51FA\u56FE\u3001\u6539\u56FE\u3001Fast\u3001\u989D\u5EA6\u5C55\u793A\u548C Grok Imagine \u5728\u5B9E\u9645\u8C03\u7528\u65F6\u90FD\u4F1A\u6D88\u8017\u5BF9\u5E94\u8BA2\u9605\u914D\u989D\u3002\",\r\n\tcapabilitiesReadOnly: \"\u5F53\u524D\u90E8\u7F72\u4E2D\u8FD9\u4E9B\u5F00\u5173\u4E3A\u53EA\u8BFB\u3002\",\r\n\tcapabilitiesLoading: \"\u6B63\u5728\u52A0\u8F7D\u80FD\u529B\u8BBE\u7F6E\u2026\",\r\n\tcapabilitiesLoadFailed: \"\u65E0\u6CD5\u52A0\u8F7D\u80FD\u529B\u8BBE\u7F6E\u3002\",\r\n\tcapabilitiesSaveFailed: \"\u65E0\u6CD5\u4FDD\u5B58\u8BE5\u80FD\u529B\u8BBE\u7F6E\u3002\",\r\n\tcapabilitiesConflictRefreshed: \"\u8FD9\u4E9B\u8BBE\u7F6E\u5DF2\u5728\u522B\u5904\u88AB\u6539\u8FC7\u3002\u9875\u9762\u5DF2\u5237\u65B0\uFF0C\u8BF7\u518D\u8BD5\u4E00\u6B21\u3002\",\r\n\tcapabilityLimitsTitle: \"\u80FD\u529B\u9650\u5236\",\r\n\tcapabilityLimitsHint: \"\u9650\u5236\u4F1A\u5B9E\u65F6\u5E94\u7528\u4E8E\u65B0\u53D1\u8D77\u7684\u64CD\u4F5C\uFF0C\u5E76\u59CB\u7EC8\u4FDD\u6301\u5728\u5DF2\u5BA1\u8BA1\u7684\u5B89\u5168\u8303\u56F4\u5185\u3002\",\r\n\tcapSearchResults: \"\u6700\u591A\u641C\u7D22\u7ED3\u679C\u6570\",\r\n\tcapSearchResultsHint: \"Codex \u641C\u7D22\u6700\u591A\u8FD4\u56DE\u8FD9\u4E48\u591A\u6761\u7ED3\u679C\uFF081\u201320\uFF09\u3002\",\r\n\tcapImageCount: \"\u5355\u6B21\u6700\u591A\u56FE\u7247\u6570\",\r\n\tcapImageCountHint: \"Codex \u4E0E Imagine \u56FE\u7247\u5DE5\u5177\u5355\u6B21\u6700\u591A\u8FD4\u56DE\u8FD9\u4E48\u591A\u5F20\u56FE\u7247\uFF081\u20134\uFF09\u3002\",\r\n\tcapVideoTtlHours: \"\u89C6\u9891\u4EA7\u7269\u4FDD\u7559\u65F6\u95F4\uFF08\u5C0F\u65F6\uFF09\",\r\n\tcapVideoTtlHoursHint: \"Imagine \u89C6\u9891\u4EA7\u7269\u4FDD\u7559 1\u2013168 \u5C0F\u65F6\uFF1B\u964D\u4F4E\u4FDD\u7559\u65F6\u95F4\u4F1A\u7ACB\u5373\u6E05\u7406\u8FC7\u671F\u65E7\u4EA7\u7269\uFF0C\u63D0\u9AD8\u53EA\u5F71\u54CD\u65B0\u4EA7\u7269\u3002\",\r\n\tcapabilityLimitInvalid: \"\u8BF7\u8F93\u5165 {min} \u5230 {max} \u4E4B\u95F4\u7684\u6574\u6570\u3002\",\r\n\tcapCodexSearch: \"Codex \u8BA2\u9605\u641C\u7D22\",\r\n\tcapCodexSearchHint: \"\u53EF\u9009\u641C\u7D22\uFF0C\u6D88\u8017 Codex \u914D\u989D\u3002\",\r\n\tcapCodexImages: \"Codex \u51FA\u56FE\",\r\n\tcapCodexImagesHint: \"\u7528 ChatGPT/Codex \u914D\u989D\u51FA\u56FE\u3002\",\r\n\tcapCodexImageEdits: \"Codex \u6539\u56FE\",\r\n\tcapCodexImageEditsHint: \"\u6539\u56FE\uFF1B\u9700\u5148\u6253\u5F00 Codex \u51FA\u56FE\u3002\",\r\n\tcapCodexUsage: \"\u663E\u793A Codex \u989D\u5EA6\",\r\n\tcapCodexUsageHint: \"\u6709\u6570\u636E\u65F6\u5728 Codex \u8D26\u6237\u5361\u7247\u4E0A\u663E\u793A\u5269\u4F59\u989D\u5EA6\u3002\",\r\n\tcapCodexFast: \"\u5DF2\u8BF7\u6C42 Fast\",\r\n\tcapCodexFastHint: \"\u5728\u7EBF\u76EE\u5F55\u786E\u8BA4\u4F18\u5148\u8D44\u683C\u540E\u53D1\u5E03 Fast \u8DEF\u7531\u3002\",\r\n\tcapGrokImagineImage: \"Grok Imagine \u51FA\u56FE\",\r\n\tcapGrokImagineImageHint: \"\u9700\u8981\u5355\u72EC\u7684 Imagine \u51ED\u636E\uFF0C\u4EC5\u6709 Grok OAuth \u4E0D\u591F\u3002\",\r\n\tcapGrokImagineVideo: \"Grok Imagine \u51FA\u89C6\u9891\",\r\n\tcapGrokImagineVideoHint: \"\u9700\u8981\u5355\u72EC\u7684 Imagine \u51ED\u636E\uFF0C\u4EC5\u6709 Grok OAuth \u4E0D\u591F\u3002\",\r\n\tusageTitle: \"Codex \u989D\u5EA6\",\r\n\tusageLoading: \"\u6B63\u5728\u52A0\u8F7D Codex \u989D\u5EA6\u2026\",\r\n\tusageUnavailable: \"\u5F53\u524D\u65E0\u6CD5\u8BFB\u53D6 Codex \u989D\u5EA6\u3002\",\r\n\tusageEmpty: \"\u4F9B\u5E94\u5546\u6CA1\u6709\u8FD4\u56DE\u53EF\u5C55\u793A\u7684\u989D\u5EA6\u5B57\u6BB5\u3002\",\r\n\tusageFetchedAt: \"\u6700\u8FD1\u8BFB\u53D6\uFF1A{time}\",\r\n\tusageRateLimit: \"\u901F\u7387\u9650\u5236\",\r\n\tusageWindow: \"{seconds} \u79D2\u7A97\u53E3\",\r\n\tusageUsed: \"\u5DF2\u7528 {value}\",\r\n\tusageRemaining: \"\u5269\u4F59 {value}\",\r\n\tusageResets: \"\u91CD\u7F6E\u65F6\u95F4 {time}\",\r\n\tusageCredits: \"\u79EF\u5206\",\r\n\tusageCreditsUnlimited: \"\u65E0\u9650\u79EF\u5206\",\r\n\tusageCreditsLimited: \"\u6709\u9650\u79EF\u5206\",\r\n\tusageBalance: \"\u4F59\u989D {value}\",\r\n\tusageIndividualLimit: \"\u4E2A\u4EBA\u989D\u5EA6\",\r\n\tusageLimit: \"\u4E0A\u9650 {value}\",\r\n\tusageUsedAmount: \"\u5DF2\u7528 {value}\",\r\n\tusageRemainingAmount: \"\u5269\u4F59 {value}\",\r\n\tusageSpendControlReached: \"\u5DF2\u8FBE\u5230\u652F\u51FA\u63A7\u5236\u4E0A\u9650\u3002\",\r\n\tusageResetCredits: \"\u53EF\u7528\u91CD\u7F6E\u6B21\u6570\uFF1A{value}\",\r\n\timagineTitle: \"Grok Imagine \u51ED\u636E\",\r\n\timagineIntro:\r\n\t\t\"\u5B98\u65B9 Imagine \u8C03\u7528\u4F7F\u7528 xAI API \u51ED\u636E\uFF08\u4F8B\u5982 $XAI_API_KEY\uFF09\u3002\u5B83\u4E0E Grok Build OAuth \u767B\u5F55\u4E0D\u662F\u540C\u4E00\u4EFD\u51ED\u636E\uFF0C\u8FD9\u91CC\u4E5F\u4E0D\u4F1A\u663E\u793A\u5BC6\u94A5\u3002\",\r\n\timagineLoading: \"\u6B63\u5728\u68C0\u67E5 Imagine \u51ED\u636E\u2026\",\r\n\timagineLoadFailed: \"\u65E0\u6CD5\u8BFB\u53D6 Imagine \u51ED\u636E\u72B6\u6001\u3002\",\r\n\timagineConfigured: \"\u5DF2\u914D\u7F6E Imagine \u51ED\u636E\",\r\n\timagineNotConfigured: \"\u5C1A\u672A\u914D\u7F6E Imagine \u51ED\u636E\",\r\n\timagineSource: \"\u6765\u6E90\uFF1A{source}\",\r\n\timagineWritable: \"\u5F53\u524D\u90E8\u7F72\u53EF\u4EE5\u66F4\u65B0 Imagine \u51ED\u636E\u5B58\u50A8\u3002\",\r\n\timagineReadOnly: \"\u5F53\u524D\u90E8\u7F72\u4E0D\u80FD\u66F4\u65B0 Imagine \u51ED\u636E\u5B58\u50A8\u3002\",\r\n\timagineSourceNone: \"\u65E0\",\r\n\timagineSourceEnv: \"\u73AF\u5883\u53D8\u91CF\",\r\n\timagineSourceApiKey: \"\u5DF2\u4FDD\u5B58\u7684 API key\",\r\n\timagineSourceOAuth: \"OAuth access\uFF08\u4EC5\u5F53 Imagine \u63A5\u53D7\u65F6\uFF09\",\r\n\timagineSourceCliKey: \"Grok CLI \u7684 key \u5B57\u6BB5\",\r\n\timagineSourceUnknown: \"\u5DF2\u914D\u7F6E\uFF08\u7EC6\u8282\u4E0D\u5C55\u793A\uFF09\",\r\n\ttabAccounts: \"\u8D26\u6237\",\r\n\ttabCapabilities: \"\u80FD\u529B\",\r\n\ttabGateway: \"\u7F51\u5173\",\r\n\ttabAbout: \"\u5173\u4E8E\",\r\n\tcopy: \"\u590D\u5236\",\r\n\tcopied: \"\u5DF2\u590D\u5236\",\r\n\tcopyFailed: \"\u590D\u5236\u5931\u8D25\",\r\n\tmodelsSummary: \"\u5DF2\u663E\u793A {selected}/{total} \u4E2A\u6A21\u578B\",\r\n\texpandModels: \"\u6A21\u578B\",\r\n\tcollapseModels: \"\u6536\u8D77\u6A21\u578B\",\r\n\tusageUsedShort: \"\u5DF2\u7528 {value}\",\r\n\tgatewayTitle: \"\u672C\u5730 API \u7F51\u5173\",\r\n\tgatewayIntro: \"\u672C\u673A loopback \u4E0A\u7684 OpenAI/Anthropic \u517C\u5BB9\u670D\u52A1\uFF0C\u4F9B\u4F60\u81EA\u5DF1\u7684\u5DE5\u5177\u4F7F\u7528\u3002\u9ED8\u8BA4\u5173\u95ED\u3002\",\r\n\tgatewayWarning: \"\u6253\u5F00\u540E\u4F1A\u628A\u5DF2\u767B\u5F55\u8BA2\u9605\u66B4\u9732\u6210\u672C\u5730 API\u3002\u53EF\u80FD\u8FDD\u53CD\u4F9B\u5E94\u5546\u6761\u6B3E\u5E76\u6D88\u8017\u914D\u989D\u3002\",\r\n\tgatewayLoopbackHint: \"\u4EC5\u7ED1\u5B9A\u672C\u673A\u56DE\u73AF\u5730\u5740\u3002\u8BF7\u52FF\u505A\u7AEF\u53E3\u8F6C\u53D1\uFF0C\u4E5F\u4E0D\u8981\u628A\u5B83\u66B4\u9732\u5230\u516C\u7F51\u3002\",\r\n\tgatewayEnableConfirm: \"\u8981\u542F\u7528\u672C\u5730 API \u7F51\u5173\u5417\uFF1F\u5B83\u4F1A\u628A\u5DF2\u767B\u5F55\u7684\u8BA2\u9605\u66B4\u9732\u7ED9\u672C\u673A\u5DE5\u5177\uFF0C\u5E76\u6D88\u8017\u4F9B\u5E94\u5546\u914D\u989D\u3002\",\r\n\tgatewayEnableConfirmAction: \"\u786E\u8BA4\u542F\u7528\",\r\n\tgatewayEnableCancel: \"\u53D6\u6D88\",\r\n\tgatewayEnabled: \"\u542F\u7528\u672C\u5730\u7F51\u5173\",\r\n\tgatewayBind: \"\u7ED1\u5B9A\u5730\u5740\",\r\n\tgatewayPort: \"\u7AEF\u53E3\",\r\n\tgatewayPortHint: \"1024\u201365535 \u7684\u6574\u6570\u3002\u6539\u5B8C\u70B9\u786E\u5B9A\u4FDD\u5B58\uFF1B\u968F\u673A\u4F1A\u586B\u4E00\u4E2A\u9AD8\u4F4D\u7AEF\u53E3\uFF0C\u4ECD\u9700\u786E\u5B9A\u3002\",\r\n\tgatewayPortApply: \"\u786E\u5B9A\",\r\n\tgatewayPortRandom: \"\u968F\u673A\",\r\n\tgatewayPortInvalid: \"\u8BF7\u8F93\u5165 1024 \u5230 65535 \u4E4B\u95F4\u7684\u6574\u6570\u7AEF\u53E3\u3002\",\r\n\tgatewayAddress: \"\u7F51\u5173\u5730\u5740\",\r\n\tgatewayOpenAiUrl: \"OpenAI \u517C\u5BB9\u5730\u5740\",\r\n\tgatewayAnthropicUrl: \"Anthropic \u517C\u5BB9\u5730\u5740\",\r\n\tgatewayKeyHint: \"Bearer key\",\r\n\tgatewayKeyCopyHint: \"\u590D\u5236\u7684\u662F\u5F53\u524D key\u3002\u53EA\u6709\u8981\u4F5C\u5E9F\u5DF2\u6709\u5BA2\u6237\u7AEF\u65F6\u624D\u8F6E\u6362\u3002\",\r\n\tgatewayCopyKey: \"\u590D\u5236 key\",\r\n\tgatewayShowKey: \"\u663E\u793A\",\r\n\tgatewayHideKey: \"\u9690\u85CF\",\r\n\tgatewayRevealFailed: \"\u65E0\u6CD5\u8BFB\u53D6\u5F53\u524D key\u3002\",\r\n\tgatewayRotateConfirm: \"\u786E\u5B9A\u8F6E\u6362 key\uFF1F\u73B0\u6709\u5BA2\u6237\u7AEF\u5C06\u5931\u6548\u3002\",\r\n\tgatewayRotateConfirmHint: \"\u8FD9\u4F1A\u66FF\u6362\u5F53\u524D Bearer key\u3002\",\r\n\tgatewayRotateConfirmAction: \"\u786E\u8BA4\u8F6E\u6362\",\r\n\tgatewayRotateCancel: \"\u53D6\u6D88\",\r\n\tgatewayRunning: \"\u6B63\u5728\u76D1\u542C\",\r\n\tgatewayStopped: \"\u672A\u76D1\u542C\",\r\n\tgatewayRotate: \"\u8F6E\u6362 API key\",\r\n\tgatewayRotated: \"\u65B0 key\uFF08\u53EA\u663E\u793A\u4E00\u6B21\uFF09\uFF1A{key}\",\r\n\tgatewayLoadFailed: \"\u65E0\u6CD5\u52A0\u8F7D\u7F51\u5173\u8BBE\u7F6E\u3002\",\r\n\tgatewaySaveFailed: \"\u65E0\u6CD5\u66F4\u65B0\u7F51\u5173\u3002\",\r\n\tgatewayLoading: \"\u6B63\u5728\u52A0\u8F7D\u7F51\u5173\u8BBE\u7F6E\u2026\",\r\n\tgatewayModelsReady: \"\u5F53\u524D\u6709 {count} \u4E2A\u53EF\u6267\u884C\u6A21\u578B\uFF0C\u914D\u7F6E\u7247\u6BB5\u4F7F\u7528 {model}\u3002\",\r\n\tgatewayModelsUnavailable: \"\u5F53\u524D\u6CA1\u6709\u5DF2\u767B\u5F55\u4F9B\u5E94\u5546\u63D0\u4F9B\u53EF\u6267\u884C\u7684\u7F51\u5173\u6A21\u578B\u3002\",\r\n\tgatewayKeyConfigured: \"\u5DF2\u914D\u7F6E\u771F\u5B9E Bearer key\uFF1B\u590D\u5236\u53EF\u6267\u884C\u7247\u6BB5\u524D\u8BF7\u5148\u8BFB\u53D6 key\u3002\",\r\n\tgatewayKeyNotConfigured: \"\u5C1A\u672A\u914D\u7F6E Bearer key\u3002\",\r\n\tremoteLoginHelp:\r\n\t\t\"\u5728\u8FDC\u7A0B DSH \u4E3B\u673A\u4E0A\uFF0C\u6253\u5F00\u6B64\u5904 Settings\uFF0C\u5BF9\u6BCF\u4E2A\u4F9B\u5E94\u5546\u4F7F\u7528\u8BBE\u5907\u7801\u767B\u5F55\u3002\u5728\u80FD\u8BBF\u95EE\u4F9B\u5E94\u5546\u7684\u4EFB\u610F\u6D4F\u89C8\u5668\u5B8C\u6210\u9A8C\u8BC1\u7801\uFF0C\u518D\u56DE\u5230\u804A\u5929\u9009\u62E9\u5BF9\u5E94\u8DEF\u7531\u6A21\u578B\u3002\",\r\n\tpluginVersion: \"\u63D2\u4EF6\u7248\u672C {version}\",\r\n\taboutTitle: \"\u5173\u4E8E\",\r\n\taboutDocsHint: \"\u4ED3\u5E93\u4E2D\u7684 README \u4E0E INSTALL \u6587\u6863\u4ECB\u7ECD\u4E86\u5B89\u88C5\u6B65\u9AA4\u3001\u652F\u6301\u7684\u4F9B\u5E94\u5546\u4EE5\u53CA\u7F51\u5173\u5B89\u5168\u6CE8\u610F\u4E8B\u9879\u3002\",\r\n\taboutDocsLink: \"\u5728 GitHub \u6253\u5F00 README\",\r\n\totherLoginMethods: \"\u5176\u4ED6\u767B\u5F55\u65B9\u5F0F\",\r\n\thideOtherLoginMethods: \"\u6536\u8D77\u5176\u4ED6\u65B9\u5F0F\",\r\n\tsignInStepOpen: \"\u6253\u5F00\u4F9B\u5E94\u5546\u6388\u6743\u9875\u9762\",\r\n\tsignInStepCode: \"\u5728\u63D0\u793A\u5904\u8F93\u5165\u8BBE\u5907\u7801\",\r\n\tsignInStepWait: \"\u7B49\u5F85\u6388\u6743\u5B8C\u6210\",\r\n\tcopyUserCode: \"\u590D\u5236\u8BBE\u5907\u7801\",\r\n\topenAuthUrl: \"\u6253\u5F00\u6388\u6743\u9875\u9762\",\r\n\tmodelFilterPlaceholder: \"\u7B5B\u9009\u6A21\u578B\u2026\",\r\n\tmodelFilterLabel: \"\u7B5B\u9009 {provider} \u7684\u6A21\u578B\",\r\n\tapplyModelDraft: \"\u5E94\u7528\u6A21\u578B\u9009\u62E9\",\r\n\tmodelDraftPending: \"\u9009\u62E9\u4EC5\u5728\u672C\u9875\u5F62\u6210\u8349\u7A3F\uFF0C\u70B9\u51FB\u5E94\u7528\u540E\u4E00\u6B21\u4FDD\u5B58\u3002\",\r\n\tdeselectAll: \"\u5168\u90E8\u9690\u85CF\",\r\n\tresetModelsDefault: \"\u91CD\u7F6E\u9009\u62E9\",\r\n\trequiresCodexImages: \"\u9700\u5148\u5F00\u542F Codex \u51FA\u56FE\u3002\",\r\n\trequiresCodexSignIn: \"\u8BF7\u5148\u767B\u5F55 OpenAI Codex\u3002\",\r\n\trequiresImagineCredential: \"\u8BF7\u5148\u914D\u7F6E\u72EC\u7ACB\u7684 Grok Imagine \u51ED\u636E\u3002\",\r\n\topenCodexAccount: \"\u524D\u5F80 Codex \u8D26\u6237\",\r\n\tfocusCodexImages: \"\u524D\u5F80 Codex \u51FA\u56FE\u5F00\u5173\",\r\n\tfocusImagineCredential: \"\u67E5\u770B Imagine \u51ED\u636E\u72B6\u6001\",\r\n\tgatewaySnippetsTitle: \"\u5FEB\u901F\u914D\u7F6E\u7247\u6BB5\",\r\n\tgatewaySnippetsUnavailable: \"\u8BF7\u5148\u8BFB\u53D6\u771F\u5B9E key\uFF0C\u5E76\u81F3\u5C11\u767B\u5F55\u4E00\u4E2A\u4F9B\u5E94\u5546\uFF1B\u6EE1\u8DB3\u540E\u624D\u4F1A\u663E\u793A\u53EF\u6267\u884C\u914D\u7F6E\u7247\u6BB5\u3002\",\r\n\tgatewaySnippetCurl: \"cURL\",\r\n\tgatewaySnippetPython: \"Python (OpenAI SDK)\",\r\n\tgatewaySnippetIde: \"IDE / \u5BA2\u6237\u7AEF\",\r\n\ttabAccountsSignedIn: \"\u5DF2\u767B\u5F55 {count} \u4E2A\",\r\n\tcoinstallTitle: \"\u5DF2\u7531\u7528\u91CF\u4E2D\u5FC3\u7EDF\u4E00\u7BA1\u7406\",\r\n\tcoinstallSummary: \"\u7528\u91CF\u4E2D\u5FC3\u5F53\u524D\u8D1F\u8D23 OAuth \u8FD0\u884C\u65F6\uFF1B\u5DF2\u6709 {count} \u4E2A\u4F9B\u5E94\u5546\u8D26\u53F7\u767B\u5F55\u3002\",\r\n\tcoinstallOpenHub: \"\u524D\u5F80\u7528\u91CF\u4E2D\u5FC3\",\r\n\ttabGatewayActive: \"\u8FD0\u884C\u4E2D\",\r\n};\r\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["index_exports", "__export", "apply", "inject", "name", "__toCommonJS", "import_react", "import_client", "hasSlots", "context", "slots", "createDshClientAdapter", "candidate", "locale", "diagnostics", "id", "value", "level", "frozenDiagnostics", "errors", "item", "options", "disposed", "installed", "disposeCurrent", "install", "slotContext", "inject", "import_react", "GROK_BUILD_AUTH_STATUS_PATH", "GROK_BUILD_AUTH_LOGIN_PATH", "GROK_BUILD_AUTH_LOGIN_CODE_PATH", "GROK_BUILD_AUTH_LOGIN_CANCEL_PATH", "GROK_BUILD_AUTH_IMPORT_PATH", "GROK_BUILD_AUTH_LOGOUT_PATH", "GROK_BUILD_AUTH_MODELS_PATH", "CODING_OAUTH_STATUS_PATH", "CODING_OAUTH_LOGIN_PATH", "CODING_OAUTH_LOGIN_CODE_PATH", "CODING_OAUTH_LOGIN_CANCEL_PATH", "CODING_OAUTH_LOGOUT_PATH", "CODING_OAUTH_MODELS_PATH", "OAUTH_IMPORT_SOURCES_PATH", "OAUTH_IMPORT_PREVIEW_PATH", "OAUTH_IMPORT_COMMIT_PATH", "OAUTH_IMPORT_CANCEL_PATH", "CAPABILITY_SETTINGS_PATH", "CODEX_USAGE_PATH", "IMAGINE_CREDENTIAL_STATUS_PATH", "GATEWAY_SETTINGS_PATH", "GATEWAY_REVEAL_PATH", "GATEWAY_ROTATE_PATH", "CODING_OAUTH_MANAGEMENT_PATHS", "STATUS_PATH", "CODING_OAUTH_STATUS_PATH", "LOGIN_PATH", "CODING_OAUTH_LOGIN_PATH", "LOGIN_CODE_PATH", "CODING_OAUTH_LOGIN_CODE_PATH", "LOGIN_CANCEL_PATH", "CODING_OAUTH_LOGIN_CANCEL_PATH", "LOGOUT_PATH", "CODING_OAUTH_LOGOUT_PATH", "MODELS_PATH", "CODING_OAUTH_MODELS_PATH", "SOURCES_PATH", "OAUTH_IMPORT_SOURCES_PATH", "SOURCES_PREVIEW_PATH", "OAUTH_IMPORT_PREVIEW_PATH", "SOURCES_COMMIT_PATH", "OAUTH_IMPORT_COMMIT_PATH", "SOURCES_CANCEL_PATH", "OAUTH_IMPORT_CANCEL_PATH", "CAPABILITIES_PATH", "CAPABILITY_SETTINGS_PATH", "CODEX_USAGE_PATH", "IMAGINE_CREDENTIAL_PATH", "IMAGINE_CREDENTIAL_STATUS_PATH", "GATEWAY_PATH", "GATEWAY_SETTINGS_PATH", "GATEWAY_REVEAL_PATH", "GATEWAY_ROTATE_PATH", "POLL_INTERVAL_MS", "HOUR_MS", "SOURCE_KINDS", "SOURCE_REASONS", "SOURCE_CONFLICTS", "SOURCE_PREVIEW_ACTIONS", "SOURCE_COMMIT_ACTIONS", "SOURCE_DEFAULT_PATH", "SOURCE_KIND_KEY", "SOURCE_REASON_KEY", "SOURCE_CONFLICT_KEY", "SOURCE_PREVIEW_ACTION_KEY", "SOURCE_COMMIT_ACTION_KEY", "CAPABILITY_TOGGLES", "CAPABILITY_LIMITS", "IMAGINE_SOURCE_KEY", "PROVIDERS", "SETTINGS_TABS", "GATEWAY_PORT_MIN", "GATEWAY_PORT_MAX", "GATEWAY_RANDOM_PORT_MIN", "GATEWAY_RANDOM_PORT_MAX", "GATEWAY_RANDOM_RESERVED", "CONSUMED_PREVIEW_CODES", "PLUGIN_VERSION", "isRecord", "value", "isPluginRequestError", "error", "isConflictError", "isConsumedPreviewError", "CONSUMED_PREVIEW_CODES", "cancelPreviewTicket", "previewId", "keepalive", "SOURCES_CANCEL_PATH", "jsonRequest", "path", "method", "body", "response", "record", "message", "code", "copyText", "text", "area", "ok", "TRANSITION", "pageStyle", "titleStyle", "bodyStyle", "cardStyle", "rowStyle", "statusStyle", "buttonStyle", "primaryButtonStyle", "compactButtonStyle", "errorStyle", "successStyle", "warningStyle", "tipStyle", "noticeStyle", "codeStyle", "monoStyle", "snippetStyle", "linkStyle", "listStyle", "checkRowStyle", "inputStyle", "nestedStyle", "hintStyle", "visuallyHiddenStyle", "segmentedNavStyle", "segmentedTabStyle", "segmentedTabActiveStyle", "panelStyle", "accountGridStyle", "copyRowStyle", "skeletonStyle", "stepRowStyle", "stepActiveStyle", "stepNumberStyle", "stepNumberActiveStyle", "statusToneColor", "tone", "badgeStyle", "color", "dotStyle", "status", "installed", "providerStatusTone", "import_jsx_runtime", "README_URL", "AboutTab", "t", "cardStyle", "titleStyle", "warningStyle", "bodyStyle", "hintStyle", "PLUGIN_VERSION", "linkStyle", "import_react", "preferredLoginMethod", "definition", "remote", "orderedLoginMethods", "preferred", "rest", "method", "shouldShowPerCardSourceReason", "source", "allOfficialCliMissing", "sources", "anyOfficialCliAvailable", "methodLabel", "options", "import_jsx_runtime", "Badge", "label", "tone", "providerStatus", "installed", "showDot", "resolvedTone", "providerStatusTone", "badgeStyle", "dotStyle", "optionalString", "value", "optionalFiniteNumber", "optionalBoolean", "optionalPercent", "numeric", "isSourceKind", "SOURCE_KINDS", "isSourceReason", "SOURCE_REASONS", "isSourceConflict", "SOURCE_CONFLICTS", "isSourcePreviewAction", "SOURCE_PREVIEW_ACTIONS", "isSourceCommitAction", "SOURCE_COMMIT_ACTIONS", "looksSecret", "safeDisplayPath", "kind", "text", "SOURCE_DEFAULT_PATH", "safeWarning", "formatEpoch", "ms", "formatted", "parseSource", "isRecord", "reasonRaw", "expiresAt", "mergeSources", "discovered", "entry", "parseSources", "rows", "parsePreview", "previewId", "kindRaw", "conflictRaw", "actionRaw", "ticketExpiresAt", "warnings", "parseCommitAction", "action", "boundedInteger", "min", "max", "fallback", "emptyCapabilitySettings", "HOUR_MS", "parseCapabilitySettings", "source", "parseCapabilities", "nested", "revision", "parseUsageWindow", "usedPercent", "remainingPercent", "windowSeconds", "resetsAt", "parseUsageLimit", "fallbackId", "id", "name", "windows", "parseUsage", "payload", "rateLimits", "seen", "add", "limit", "index", "credits", "spend", "resetRaw", "resetCredits", "fetchedAt", "spendControlReached", "creditsBalance", "individualLimit", "individualUsed", "individualRemaining", "individualRemainingPercent", "individualResetsAt", "usageHasVisibleFields", "usage", "parseGateway", "bind", "port", "models", "model", "keyAvailable", "formatGatewayBaseUrl", "randomGatewayPort", "exclude", "attempt", "span", "GATEWAY_RANDOM_PORT_MAX", "GATEWAY_RANDOM_PORT_MIN", "candidate", "GATEWAY_RANDOM_RESERVED", "parseGatewayPort", "GATEWAY_PORT_MIN", "GATEWAY_PORT_MAX", "parseImagineCredential", "configured", "writable", "imagineSourceLabel", "mapped", "IMAGINE_SOURCE_KEY", "modelFields", "status", "import_jsx_runtime", "CliPullPreview", "t", "preview", "confirmOverwrite", "sourcesBusy", "onConfirmOverwriteChange", "onCommit", "onCancel", "expiresAt", "formatEpoch", "ticketExpiresAt", "cardStyle", "bodyStyle", "SOURCE_KIND_KEY", "hintStyle", "monoStyle", "SOURCE_CONFLICT_KEY", "SOURCE_PREVIEW_ACTION_KEY", "listStyle", "warning", "checkRowStyle", "event", "primaryButtonStyle", "buttonStyle", "import_react", "import_jsx_runtime", "NoticeBanner", "message", "dismissLabel", "onDismiss", "autoHideMs", "tone", "timer", "noticeStyle", "bodyStyle", "buttonStyle", "import_react", "import_react", "import_jsx_runtime", "CopyButton", "text", "idleLabel", "copiedLabel", "failedLabel", "primary", "disabled", "state", "setState", "timerRef", "handleClick", "ok", "copyText", "label", "primaryButtonStyle", "compactButtonStyle", "import_jsx_runtime", "barColor", "percent", "ProgressBar", "value", "label", "meta", "clamped", "hintStyle", "import_jsx_runtime", "SignInSteps", "t", "activeMethod", "userCode", "url", "popupBlocked", "hasCode", "hasUrl", "needsPaste", "stepActiveStyle", "stepRowStyle", "stepNumberActiveStyle", "stepNumberStyle", "primaryButtonStyle", "CopyButton", "hintStyle", "codeStyle", "bodyStyle", "ProviderCard", "definition", "providerStatus", "busy", "sourcesBusy", "remote", "codeInput", "expanded", "source", "showUsage", "usage", "usageError", "usageLoading", "onSignIn", "onSignOut", "onCancelLogin", "onSubmitCode", "onCodeChange", "onToggleExpanded", "onPreviewSource", "onSaveModels", "showAltMethods", "setShowAltMethods", "modelFilter", "setModelFilter", "logoutConfirm", "setLogoutConfirm", "logoutTrigger", "logoutConfirmAction", "restoreLogoutFocus", "ordered", "orderedLoginMethods", "primaryMethod", "altMethods", "method", "statusLabel", "available", "selected", "modelFields", "modelDraft", "setModelDraft", "modelDraftDirty", "model", "index", "grokProviderStatus", "showSourceReason", "shouldShowPerCardSourceReason", "filteredModels", "query", "id", "usagePercent", "fetchedAt", "formatEpoch", "cardStyle", "rowStyle", "titleStyle", "monoStyle", "Badge", "nestedStyle", "visuallyHiddenStyle", "buttonStyle", "compactButtonStyle", "current", "methodLabel", "SOURCE_REASON_KEY", "inputStyle", "event", "listStyle", "checked", "checkRowStyle", "usageHasVisibleFields", "ProgressBar", "limit", "window", "used", "resetsAt", "import_jsx_runtime", "AccountsTab", "t", "status", "remote", "remoteTipDismissed", "onDismissRemoteTip", "sources", "sourcesError", "sourcesNotice", "sourcesBusy", "preview", "confirmOverwrite", "busyProvider", "codeInputs", "popupBlocked", "expandedProviders", "showUsage", "usage", "usageError", "usageLoading", "onSignIn", "onSignOut", "onCancelLogin", "onSubmitCode", "onCodeChange", "onToggleExpanded", "onPreviewSource", "onSaveModels", "onConfirmOverwriteChange", "onCommitSource", "onCancelSourcePreview", "onRefreshSources", "onDismissSourcesNotice", "previousPreviewKind", "trigger", "skeletonStyle", "statusStyle", "dotStyle", "NoticeBanner", "allOfficialCliMissing", "anyOfficialCliAvailable", "hintStyle", "bodyStyle", "accountGridStyle", "PROVIDERS", "definition", "providerStatus", "expanded", "ProviderCard", "entry", "method", "value", "selected", "CliPullPreview", "cardStyle", "rowStyle", "titleStyle", "monoStyle", "Badge", "import_jsx_runtime", "trackStyle", "checked", "disabled", "TRANSITION", "thumbStyle", "ToggleSwitch", "onChange", "ariaLabel", "ariaDescribedBy", "id", "import_jsx_runtime", "CapabilitiesTab", "t", "capabilities", "capabilitiesError", "capabilitiesBusy", "imagine", "imagineError", "codexSignedIn", "onRetry", "onOpenAccounts", "onFocusDependency", "onPatchCapability", "codexToggles", "CAPABILITY_TOGGLES", "item", "imagineToggles", "cardStyle", "titleStyle", "bodyStyle", "nestedStyle", "errorStyle", "buttonStyle", "skeletonStyle", "statusStyle", "dotStyle", "Badge", "hintStyle", "imagineSourceLabel", "listStyle", "checked", "imagesOff", "dependencyReason", "disabled", "switchId", "repairAction", "rowStyle", "ToggleSwitch", "next", "CAPABILITY_LIMITS", "displayValue", "inputId", "inputStyle", "event", "target", "apiValue", "saved", "import_react", "buildGatewaySnippets", "openAiBaseUrl", "anthropicBaseUrl", "apiKeyPlaceholder", "model", "key", "import_jsx_runtime", "SNIPPET_TABS", "GatewayTab", "t", "gateway", "gatewayError", "gatewayBusy", "gatewayOnceKey", "gatewayKeyVisible", "gatewayRotateConfirm", "gatewayRevealError", "portDraft", "copiedField", "copyFailedField", "onEnabledChange", "onRetry", "onPortDraftChange", "onApplyPort", "onRandomPort", "onCopyKey", "onToggleKeyVisible", "onRotateConfirm", "onRotateCancel", "onRotate", "enableConfirm", "setEnableConfirm", "activeSnippet", "setActiveSnippet", "enableConfirmAction", "rotateTrigger", "rotateConfirmAction", "restoreEnableFocus", "restoreRotateFocus", "portValid", "parseGatewayPort", "portChanged", "snippets", "openAi", "formatGatewayBaseUrl", "anthropic", "buildGatewaySnippets", "copyLabel", "field", "idle", "focusSnippetTab", "index", "tab", "onSnippetKeyDown", "event", "current", "openAiUrl", "anthropicUrl", "cardStyle", "titleStyle", "bodyStyle", "warningStyle", "hintStyle", "errorStyle", "skeletonStyle", "statusStyle", "dotStyle", "nestedStyle", "buttonStyle", "Badge", "primaryButtonStyle", "ToggleSwitch", "enabled", "GATEWAY_PORT_MIN", "GATEWAY_PORT_MAX", "inputStyle", "randomGatewayPort", "copyRowStyle", "monoStyle", "CopyButton", "segmentedNavStyle", "selected", "segmentedTabActiveStyle", "segmentedTabStyle", "snippetStyle", "import_jsx_runtime", "SettingsTabs", "t", "activeTab", "onChange", "hints", "hintFor", "id", "entry", "focusTab", "index", "tab", "SETTINGS_TABS", "onKeyDown", "event", "current", "segmentedNavStyle", "selected", "suffix", "label", "segmentedTabActiveStyle", "segmentedTabStyle", "STYLE_ID", "CSS", "injected", "ensureMicroStyles", "style", "import_jsx_runtime", "REMOTE_TIP_STORAGE_KEY", "readRemoteTipDismissed", "GrokBuildSettings", "t", "status", "setStatus", "requestError", "setRequestError", "busyProvider", "setBusyProvider", "codeInputs", "setCodeInputs", "popupBlocked", "setPopupBlocked", "sources", "setSources", "sourcesError", "setSourcesError", "sourcesBusy", "setSourcesBusy", "preview", "setPreview", "previewRef", "previewEpochRef", "mountedRef", "confirmOverwrite", "setConfirmOverwrite", "sourcesNotice", "setSourcesNotice", "capabilities", "setCapabilities", "capabilitiesError", "setCapabilitiesError", "capabilitiesBusy", "setCapabilitiesBusy", "capabilitiesLoaded", "setCapabilitiesLoaded", "usage", "setUsage", "usageError", "setUsageError", "usageLoading", "setUsageLoading", "imagine", "setImagine", "imagineError", "setImagineError", "gateway", "setGateway", "gatewayError", "setGatewayError", "gatewayBusy", "setGatewayBusy", "gatewayLoaded", "setGatewayLoaded", "gatewayOnceKey", "setGatewayOnceKey", "gatewayKeyVisible", "setGatewayKeyVisible", "gatewayRotateConfirm", "setGatewayRotateConfirm", "gatewayRevealError", "setGatewayRevealError", "portDraft", "setPortDraft", "activeTab", "setActiveTab", "copiedField", "setCopiedField", "copyFailedField", "setCopyFailedField", "expandedProviders", "setExpandedProviders", "remoteTipDismissed", "setRemoteTipDismissed", "copiedTimerRef", "remote", "refresh", "next", "jsonRequest", "STATUS_PATH", "error", "refreshSources", "parseSources", "SOURCES_PATH", "mergeSources", "refreshCapabilities", "parsed", "parseCapabilities", "CAPABILITIES_PATH", "emptyCapabilitySettings", "refreshGateway", "parseGateway", "GATEWAY_PATH", "refreshImagine", "parseImagineCredential", "IMAGINE_CREDENTIAL_PATH", "refreshUsage", "parseUsage", "CODEX_USAGE_PATH", "ensureMicroStyles", "active", "timer", "cancelPreviewTicket", "provider", "POLL_INTERVAL_MS", "signedIn", "signIn", "method", "popup", "current", "challenge", "LOGIN_PATH", "submitCode", "code", "LOGIN_CODE_PATH", "cancelLogin", "LOGIN_CANCEL_PATH", "signOut", "LOGOUT_PATH", "saveModels", "selected", "MODELS_PATH", "previewSource", "kind", "epoch", "previous", "parsePreview", "SOURCES_PREVIEW_PATH", "commitSource", "result", "SOURCES_COMMIT_PATH", "action", "parseCommitAction", "SOURCE_COMMIT_ACTION_KEY", "isConsumedPreviewError", "cancelSourcePreview", "previewId", "SOURCES_CANCEL_PATH", "patchCapability", "key", "value", "patch", "updated", "isConflictError", "showUsage", "signedInCount", "tabHints", "hints", "markCopied", "field", "handleCopy", "text", "copyText", "ensureGatewayKey", "GATEWAY_REVEAL_PATH", "copyGatewayKey", "toggleGatewayKeyVisible", "applyGatewayPort", "port", "parseGatewayPort", "rotateGatewayKey", "GATEWAY_ROTATE_PATH", "setGatewayEnabled", "enabled", "dismissRemoteTip", "openAccountsForCodex", "focusCapabilityDependency", "target", "id", "pageStyle", "titleStyle", "bodyStyle", "buttonStyle", "errorStyle", "SettingsTabs", "panelStyle", "AccountsTab", "slug", "CapabilitiesTab", "GatewayTab", "AboutTab", "en", "zh", "import_jsx_runtime", "name", "inject", "IndependentSettingsEntry", "t", "open", "setOpen", "trigger", "closeButton", "dialog", "host", "inertSiblings", "element", "focusable", "closeOnEscape", "event", "targets", "first", "last", "hadInert", "value", "GrokBuildSettings", "mountIndependentEntry", "root", "apply", "ctx", "dsh", "createDshClientAdapter", "namespace", "zh", "en", "slotContext"]
|
|
3
|
+
"sources": ["../../src/client/index.tsx", "../../src/client/dshClientAdapter.ts", "../../src/client/GrokBuildSettings.tsx", "../../node_modules/.pnpm/dsh-coding-oauth-core@0.1.0/node_modules/dsh-coding-oauth-core/src/state-contract.ts", "../../src/client/constants.ts", "../../src/client/api.ts", "../../src/client/styles.ts", "../../src/client/components/AboutTab.tsx", "../../src/client/components/AccountsTab.tsx", "../../src/client/display.ts", "../../src/client/components/Badge.tsx", "../../src/client/parsers.ts", "../../src/client/components/CliPullPreview.tsx", "../../src/client/components/NoticeBanner.tsx", "../../src/client/components/ProviderCard.tsx", "../../src/client/components/CopyButton.tsx", "../../src/client/components/ProgressBar.tsx", "../../src/client/components/ToggleSwitch.tsx", "../../src/client/components/CapabilitiesTab.tsx", "../../src/client/components/GatewayTab.tsx", "../../src/client/gatewaySnippets.ts", "../../src/client/components/SettingsTabs.tsx", "../../src/client/microStyles.ts", "../../src/client/locales.ts"],
|
|
4
|
+
"sourcesContent": ["/** Browser half: coding-subscription account management inside dsh Settings. */\r\n\r\nimport type {} from \"@deepseek-ai/dsh-client-locale/client\";\r\nimport type { ClientContext } from \"@deepseek-ai/dsh-client-runtime/client\";\r\nimport type {} from \"@deepseek-ai/dsh-client-ui-settings/client\";\r\nimport type {} from \"@deepseek-ai/dsh-client-ui-slots\";\r\nimport { useEffect, useRef, useState } from \"react\";\r\nimport { createRoot } from \"react-dom/client\";\r\nimport { createDshClientAdapter } from \"./dshClientAdapter.ts\";\r\nimport type { GrokBuildSettingsInjected } from \"./GrokBuildSettings.tsx\";\r\nimport { GrokBuildSettings } from \"./GrokBuildSettings.tsx\";\r\nimport type { GrokBuildSettingsKey } from \"./locales.ts\";\r\nimport { en, zh } from \"./locales.ts\";\r\n\r\ndeclare module \"@deepseek-ai/dsh-client-ui-slots\" {\r\n\tinterface LocaleNamespaceMap {\r\n\t\t\"settings.grok-build\": GrokBuildSettingsKey;\r\n\t}\r\n}\r\n\r\nexport const name = \"dsh-grok-build-client\";\r\nexport const inject = [\"locale\"];\r\n\r\nfunction IndependentSettingsEntry({ t }: { readonly t: GrokBuildSettingsInjected[\"t\"] }) {\r\n\tconst [open, setOpen] = useState(false);\r\n\tconst trigger = useRef<HTMLButtonElement>(null);\r\n\tconst closeButton = useRef<HTMLButtonElement>(null);\r\n\tconst dialog = useRef<HTMLDivElement>(null);\r\n\tuseEffect(() => {\r\n\t\tif (!open) return;\r\n\t\tcloseButton.current?.focus();\r\n\t\tconst host = dialog.current?.closest(\"[data-dsh-coding-oauth]\")?.parentElement;\r\n\t\tconst inertSiblings =\r\n\t\t\thost === undefined || host === null\r\n\t\t\t\t? []\r\n\t\t\t\t: [...document.body.children]\r\n\t\t\t\t\t\t.filter((element) => element !== host)\r\n\t\t\t\t\t\t.map((element) => ({\r\n\t\t\t\t\t\t\telement,\r\n\t\t\t\t\t\t\thadInert: element.hasAttribute(\"inert\"),\r\n\t\t\t\t\t\t\tvalue: element.getAttribute(\"inert\"),\r\n\t\t\t\t\t\t}));\r\n\t\tfor (const { element } of inertSiblings) element.setAttribute(\"inert\", \"\");\r\n\t\tconst focusable = (): HTMLElement[] =>\r\n\t\t\t[\r\n\t\t\t\t...(dialog.current?.querySelectorAll<HTMLElement>(\r\n\t\t\t\t\t'button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])',\r\n\t\t\t\t) ?? []),\r\n\t\t\t].filter((element) => element.getClientRects().length > 0);\r\n\t\tconst closeOnEscape = (event: KeyboardEvent): void => {\r\n\t\t\tif (event.key === \"Escape\") setOpen(false);\r\n\t\t\tif (event.key !== \"Tab\") return;\r\n\t\t\tconst targets = focusable();\r\n\t\t\tif (targets.length === 0) {\r\n\t\t\t\tevent.preventDefault();\r\n\t\t\t\tdialog.current?.focus();\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tconst first = targets[0]!;\r\n\t\t\tconst last = targets.at(-1)!;\r\n\t\t\tif (event.shiftKey && document.activeElement === first) {\r\n\t\t\t\tevent.preventDefault();\r\n\t\t\t\tlast.focus();\r\n\t\t\t} else if (!event.shiftKey && document.activeElement === last) {\r\n\t\t\t\tevent.preventDefault();\r\n\t\t\t\tfirst.focus();\r\n\t\t\t}\r\n\t\t};\r\n\t\tdocument.addEventListener(\"keydown\", closeOnEscape);\r\n\t\treturn () => {\r\n\t\t\tdocument.removeEventListener(\"keydown\", closeOnEscape);\r\n\t\t\tfor (const { element, hadInert, value } of inertSiblings) {\r\n\t\t\t\tif (hadInert) element.setAttribute(\"inert\", value ?? \"\");\r\n\t\t\t\telse element.removeAttribute(\"inert\");\r\n\t\t\t}\r\n\t\t\tif (trigger.current?.isConnected) trigger.current.focus();\r\n\t\t};\r\n\t}, [open]);\r\n\treturn (\r\n\t\t<div data-dsh-coding-oauth>\r\n\t\t\t<button\r\n\t\t\t\tref={trigger}\r\n\t\t\t\ttype=\"button\"\r\n\t\t\t\tstyle={{ position: \"fixed\", right: 16, bottom: 16, zIndex: 30, padding: \"10px 14px\" }}\r\n\t\t\t\tonClick={() => setOpen(true)}\r\n\t\t\t>\r\n\t\t\t\t{t(\"nav\")}\r\n\t\t\t</button>\r\n\t\t\t{open ? (\r\n\t\t\t\t<div\r\n\t\t\t\t\tref={dialog}\r\n\t\t\t\t\trole=\"dialog\"\r\n\t\t\t\t\taria-modal=\"true\"\r\n\t\t\t\t\taria-labelledby=\"coding-oauth-independent-title\"\r\n\t\t\t\t\ttabIndex={-1}\r\n\t\t\t\t\tstyle={{\r\n\t\t\t\t\t\tposition: \"fixed\",\r\n\t\t\t\t\t\tinset: 0,\r\n\t\t\t\t\t\tzIndex: 31,\r\n\t\t\t\t\t\toverflow: \"auto\",\r\n\t\t\t\t\t\tpadding: 20,\r\n\t\t\t\t\t\tbackground: \"var(--dsw-alias-bg-layer-1)\",\r\n\t\t\t\t\t}}\r\n\t\t\t\t>\r\n\t\t\t\t\t<div style={{ width: \"min(780px, 100%)\", margin: \"0 auto\" }}>\r\n\t\t\t\t\t\t<div style={{ display: \"flex\", justifyContent: \"space-between\", gap: 12, marginBottom: 12 }}>\r\n\t\t\t\t\t\t\t<h2 id=\"coding-oauth-independent-title\" style={{ margin: 0 }}>\r\n\t\t\t\t\t\t\t\t{t(\"title\")}\r\n\t\t\t\t\t\t\t</h2>\r\n\t\t\t\t\t\t\t<button ref={closeButton} type=\"button\" onClick={() => setOpen(false)} aria-label={t(\"cancel\")}>\r\n\t\t\t\t\t\t\t\t\u00D7\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t<GrokBuildSettings t={t} />\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t) : null}\r\n\t\t</div>\r\n\t);\r\n}\r\n\r\nfunction mountIndependentEntry(t: GrokBuildSettingsInjected[\"t\"]): () => void {\r\n\tif (typeof document === \"undefined\") return () => undefined;\r\n\tconst host = document.createElement(\"div\");\r\n\tdocument.body.append(host);\r\n\tconst root = createRoot(host);\r\n\troot.render(<IndependentSettingsEntry t={t} />);\r\n\treturn () => {\r\n\t\troot.unmount();\r\n\t\thost.remove();\r\n\t};\r\n}\r\n\r\nexport function apply(ctx: ClientContext): void {\r\n\tconst dsh = createDshClientAdapter(ctx);\r\n\tdsh.assertCompatible();\r\n\tconst namespace = \"settings.grok-build\";\r\n\tdsh.effect(() => dsh.locale.register(namespace, { zh, en }), \"dsh-coding-subscription-oauth: settings copy\");\r\n\tconst t = dsh.locale.bind(namespace) as GrokBuildSettingsInjected[\"t\"];\r\n\tdsh.installSlots({\r\n\t\tmountFallback: () => mountIndependentEntry(t),\r\n\t\tregister: (slots) =>\r\n\t\t\tslots.inject(\"settings.section\", () =>\r\n\t\t\t\tslots.register(\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tname: \"settings.section\",\r\n\t\t\t\t\t\tid: \"grok-build\",\r\n\t\t\t\t\t\torder: 17,\r\n\t\t\t\t\t\tlabel: () => t(\"nav\"),\r\n\t\t\t\t\t\tinject: (): GrokBuildSettingsInjected => ({ t }),\r\n\t\t\t\t\t},\r\n\t\t\t\t\tGrokBuildSettings,\r\n\t\t\t\t),\r\n\t\t\t),\r\n\t});\r\n}\r\n", "/** Capability adapter for the unstable DSH browser client surface. */\r\n\r\nimport type {} from \"@deepseek-ai/dsh-client-locale/client\";\r\nimport type { ClientContext } from \"@deepseek-ai/dsh-client-runtime/client\";\r\nimport type {} from \"@deepseek-ai/dsh-client-ui-slots\";\r\n\r\nexport interface DshClientCompatibilityDiagnostic {\r\n\treadonly id: string;\r\n\treadonly level: \"warning\" | \"error\";\r\n\treadonly message: string;\r\n\treadonly expected: \"function\";\r\n\treadonly actual: string;\r\n}\r\n\r\ntype SlotsApi = ClientContext[\"slots\"];\r\n\r\nfunction slotsOf(context: unknown): SlotsApi | undefined {\r\n\tif (typeof context !== \"object\" || context === null) return undefined;\r\n\tlet slots: unknown;\r\n\ttry {\r\n\t\tconst get = (context as { readonly get?: unknown }).get;\r\n\t\tif (typeof get === \"function\") slots = get.call(context, \"slots\");\r\n\t} catch {\r\n\t\t// Older client runtimes may not expose the Cordis reflection helper.\r\n\t}\r\n\tif (slots === undefined) {\r\n\t\ttry {\r\n\t\t\tslots = (context as { readonly slots?: unknown }).slots;\r\n\t\t} catch {\r\n\t\t\t// Strict Cordis rejects optional service reads outside an inject scope.\r\n\t\t}\r\n\t}\r\n\tif (\r\n\t\ttypeof slots === \"object\" &&\r\n\t\tslots !== null &&\r\n\t\ttypeof (slots as { readonly inject?: unknown }).inject === \"function\" &&\r\n\t\ttypeof (slots as { readonly register?: unknown }).register === \"function\"\r\n\t)\r\n\t\treturn slots as SlotsApi;\r\n\treturn undefined;\r\n}\r\n\r\nexport interface DshClientAdapter {\r\n\treadonly context: ClientContext;\r\n\treadonly locale: ClientContext[\"locale\"];\r\n\treadonly effect: ClientContext[\"effect\"];\r\n\tdiagnostics(): readonly DshClientCompatibilityDiagnostic[];\r\n\tassertCompatible(): void;\r\n\tinstallSlots(options: {\r\n\t\treadonly register: (slots: SlotsApi) => () => void;\r\n\t\treadonly mountFallback: () => () => void;\r\n\t}): void;\r\n}\r\n\r\ntype InstallSlotsOptions = Parameters<DshClientAdapter[\"installSlots\"]>[0];\r\n\r\nexport function createDshClientAdapter(context: ClientContext): DshClientAdapter {\r\n\tconst candidate = context as unknown as Record<string, unknown>;\r\n\tconst locale = candidate[\"locale\"] as Record<string, unknown> | undefined;\r\n\tconst slots = slotsOf(context);\r\n\tconst checks: Array<[string, unknown, DshClientCompatibilityDiagnostic[\"level\"]]> = [\r\n\t\t[\"client.effect\", candidate[\"effect\"], \"error\"],\r\n\t\t[\"client.locale.register\", locale?.[\"register\"], \"error\"],\r\n\t\t[\"client.locale.bind\", locale?.[\"bind\"], \"error\"],\r\n\t\t[\"client.slots.inject\", slots?.inject, \"warning\"],\r\n\t];\r\n\tconst diagnostics = checks.flatMap(([id, value, level]): DshClientCompatibilityDiagnostic[] =>\r\n\t\ttypeof value === \"function\"\r\n\t\t\t? []\r\n\t\t\t: [\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tid,\r\n\t\t\t\t\t\tlevel,\r\n\t\t\t\t\t\tmessage:\r\n\t\t\t\t\t\t\tlevel === \"warning\"\r\n\t\t\t\t\t\t\t\t? `${id} is unavailable; the independent settings entry remains active`\r\n\t\t\t\t\t\t\t\t: `${id} is unavailable in the DSH client runtime`,\r\n\t\t\t\t\t\texpected: \"function\",\r\n\t\t\t\t\t\tactual: typeof value,\r\n\t\t\t\t\t},\r\n\t\t\t\t],\r\n\t);\r\n\tconst frozenDiagnostics = Object.freeze([...diagnostics]);\r\n\treturn Object.freeze({\r\n\t\tcontext,\r\n\t\tlocale: context.locale,\r\n\t\teffect: context.effect,\r\n\t\tdiagnostics: () => frozenDiagnostics,\r\n\t\tassertCompatible() {\r\n\t\t\tconst errors = diagnostics.filter((item) => item.level === \"error\");\r\n\t\t\tif (errors.length > 0) {\r\n\t\t\t\tthrow new Error(`incompatible DSH client API: ${errors.map((item) => item.id).join(\", \")}`);\r\n\t\t\t}\r\n\t\t},\r\n\t\tinstallSlots(options: InstallSlotsOptions) {\r\n\t\t\tlet disposed = false;\r\n\t\t\tlet installed = false;\r\n\t\t\tlet disposeCurrent: () => void = () => undefined;\r\n\t\t\tconst install = (slotContext: ClientContext): boolean => {\r\n\t\t\t\tconst slots = slotsOf(slotContext);\r\n\t\t\t\tif (disposed || installed || slots === undefined) return false;\r\n\t\t\t\tinstalled = true;\r\n\t\t\t\tdisposeCurrent();\r\n\t\t\t\tdisposeCurrent = options.register(slots);\r\n\t\t\t\treturn true;\r\n\t\t\t};\r\n\r\n\t\t\tif (!install(context)) {\r\n\t\t\t\tdisposeCurrent = options.mountFallback();\r\n\t\t\t\tconst inject = candidate[\"inject\"];\r\n\t\t\t\tif (typeof inject === \"function\") {\r\n\t\t\t\t\t(inject as ClientContext[\"inject\"]).call(context, [\"slots\"], (slotContext) => {\r\n\t\t\t\t\t\tinstall(slotContext);\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tcontext.effect(\r\n\t\t\t\t() => () => {\r\n\t\t\t\t\tdisposed = true;\r\n\t\t\t\t\tdisposeCurrent();\r\n\t\t\t\t},\r\n\t\t\t\t\"dsh-coding-subscription-oauth: independent settings entry\",\r\n\t\t\t);\r\n\t\t},\r\n\t});\r\n}\r\n", "/** Plugin-owned coding subscription account section inside the dsh Settings shell. */\r\n\r\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\r\nimport { cancelPreviewTicket, copyText, isConflictError, isConsumedPreviewError, jsonRequest } from \"./api.ts\";\r\nimport { AboutTab } from \"./components/AboutTab.tsx\";\r\nimport { AccountsTab } from \"./components/AccountsTab.tsx\";\r\nimport { CapabilitiesTab } from \"./components/CapabilitiesTab.tsx\";\r\nimport { GatewayTab } from \"./components/GatewayTab.tsx\";\r\nimport type { SettingsTabHint } from \"./components/SettingsTabs.tsx\";\r\nimport { SettingsTabs } from \"./components/SettingsTabs.tsx\";\r\nimport {\r\n\tCAPABILITIES_PATH,\r\n\tCODEX_USAGE_PATH,\r\n\tGATEWAY_PATH,\r\n\tGATEWAY_REVEAL_PATH,\r\n\tGATEWAY_ROTATE_PATH,\r\n\tIMAGINE_CREDENTIAL_PATH,\r\n\tLOGIN_CANCEL_PATH,\r\n\tLOGIN_CODE_PATH,\r\n\tLOGIN_PATH,\r\n\tLOGOUT_PATH,\r\n\tMODELS_PATH,\r\n\tPOLL_INTERVAL_MS,\r\n\tSOURCE_COMMIT_ACTION_KEY,\r\n\tSOURCES_CANCEL_PATH,\r\n\tSOURCES_COMMIT_PATH,\r\n\tSOURCES_PATH,\r\n\tSOURCES_PREVIEW_PATH,\r\n\tSTATUS_PATH,\r\n} from \"./constants.ts\";\r\nimport { ensureMicroStyles } from \"./microStyles.ts\";\r\nimport {\r\n\temptyCapabilitySettings,\r\n\tmergeSources,\r\n\tparseCapabilities,\r\n\tparseCommitAction,\r\n\tparseGateway,\r\n\tparseGatewayPort,\r\n\tparseImagineCredential,\r\n\tparsePreview,\r\n\tparseSources,\r\n\tparseUsage,\r\n} from \"./parsers.ts\";\r\nimport { bodyStyle, buttonStyle, errorStyle, pageStyle, panelStyle, titleStyle } from \"./styles.ts\";\r\nimport type {\r\n\tCapabilitySettingKey,\r\n\tCapabilitySettingsView,\r\n\tCapabilitySnapshot,\r\n\tCodingOAuthStatus,\r\n\tCopyField,\r\n\tGatewayView,\r\n\tGrokBuildSettingsProps,\r\n\tImagineCredentialView,\r\n\tLoginChallenge,\r\n\tLoginMethod,\r\n\tProviderSlug,\r\n\tSettingsTabId,\r\n\tSourceKind,\r\n\tSourcePreview,\r\n\tSourceStatus,\r\n\tUsageView,\r\n} from \"./types.ts\";\r\n\r\nexport type { GrokBuildSettingsInjected, GrokBuildSettingsProps } from \"./types.ts\";\r\n\r\nconst REMOTE_TIP_STORAGE_KEY = \"dsh-coding-oauth-remote-tip-dismissed\";\r\n\r\nfunction readRemoteTipDismissed(): boolean {\r\n\ttry {\r\n\t\treturn globalThis.sessionStorage?.getItem(REMOTE_TIP_STORAGE_KEY) === \"1\";\r\n\t} catch {\r\n\t\treturn false;\r\n\t}\r\n}\r\n\r\n/** Multi-provider coding subscription status and OAuth actions. */\r\nexport function GrokBuildSettings({ t }: GrokBuildSettingsProps) {\r\n\tif (t === undefined) throw new Error(\"Coding OAuth settings requires its translation function\");\r\n\r\n\tconst [status, setStatus] = useState<CodingOAuthStatus | undefined>(undefined);\r\n\tconst [requestError, setRequestError] = useState<string | undefined>(undefined);\r\n\tconst [busyProvider, setBusyProvider] = useState<ProviderSlug | undefined>(undefined);\r\n\tconst [codeInputs, setCodeInputs] = useState<Partial<Record<ProviderSlug, string>>>({});\r\n\tconst [popupBlocked, setPopupBlocked] = useState<Partial<Record<ProviderSlug, boolean>>>({});\r\n\tconst [sources, setSources] = useState<SourceStatus[] | undefined>(undefined);\r\n\tconst [sourcesError, setSourcesError] = useState<string | undefined>(undefined);\r\n\tconst [sourcesBusy, setSourcesBusy] = useState(false);\r\n\tconst [preview, setPreview] = useState<SourcePreview | undefined>(undefined);\r\n\tconst previewRef = useRef<SourcePreview | undefined>(undefined);\r\n\tconst previewEpochRef = useRef(0);\r\n\tconst mountedRef = useRef(true);\r\n\tconst [confirmOverwrite, setConfirmOverwrite] = useState(false);\r\n\tconst [sourcesNotice, setSourcesNotice] = useState<string | undefined>(undefined);\r\n\tconst [capabilities, setCapabilities] = useState<CapabilitySnapshot | undefined>(undefined);\r\n\tconst [capabilitiesError, setCapabilitiesError] = useState<string | undefined>(undefined);\r\n\tconst [capabilitiesBusy, setCapabilitiesBusy] = useState(false);\r\n\tconst [capabilitiesLoaded, setCapabilitiesLoaded] = useState(false);\r\n\tconst [usage, setUsage] = useState<UsageView | undefined>(undefined);\r\n\tconst [usageError, setUsageError] = useState<string | undefined>(undefined);\r\n\tconst [usageLoading, setUsageLoading] = useState(false);\r\n\tconst [imagine, setImagine] = useState<ImagineCredentialView | undefined>(undefined);\r\n\tconst [imagineError, setImagineError] = useState<string | undefined>(undefined);\r\n\tconst [gateway, setGateway] = useState<GatewayView | undefined>(undefined);\r\n\tconst [gatewayError, setGatewayError] = useState<string | undefined>(undefined);\r\n\tconst [gatewayBusy, setGatewayBusy] = useState(false);\r\n\tconst [gatewayLoaded, setGatewayLoaded] = useState(false);\r\n\tconst [gatewayOnceKey, setGatewayOnceKey] = useState<string | undefined>(undefined);\r\n\tconst [gatewayKeyVisible, setGatewayKeyVisible] = useState(false);\r\n\tconst [gatewayRotateConfirm, setGatewayRotateConfirm] = useState(false);\r\n\tconst [gatewayRevealError, setGatewayRevealError] = useState<string | undefined>(undefined);\r\n\tconst [portDraft, setPortDraft] = useState(\"\");\r\n\tconst [activeTab, setActiveTab] = useState<SettingsTabId>(\"accounts\");\r\n\tconst [copiedField, setCopiedField] = useState<CopyField | undefined>(undefined);\r\n\tconst [copyFailedField, setCopyFailedField] = useState<CopyField | undefined>(undefined);\r\n\tconst [expandedProviders, setExpandedProviders] = useState<Partial<Record<ProviderSlug, boolean>>>({});\r\n\tconst [remoteTipDismissed, setRemoteTipDismissed] = useState(readRemoteTipDismissed);\r\n\tconst copiedTimerRef = useRef<number | undefined>(undefined);\r\n\tconst remote = status?.accessMode === \"ssh-tunnel\" || status?.accessMode === \"trusted-https-proxy\";\r\n\r\n\tconst refresh = useCallback(async () => {\r\n\t\ttry {\r\n\t\t\tconst next = await jsonRequest<CodingOAuthStatus>(STATUS_PATH);\r\n\t\t\tsetStatus(next);\r\n\t\t\tsetRequestError(undefined);\r\n\t\t\treturn next;\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetRequestError(error instanceof Error ? error.message : t(\"requestFailed\"));\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\t}, [t]);\r\n\r\n\tconst refreshSources = useCallback(async () => {\r\n\t\ttry {\r\n\t\t\tsetSources(parseSources(await jsonRequest<unknown>(SOURCES_PATH)));\r\n\t\t\tsetSourcesError(undefined);\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetSources(mergeSources([]));\r\n\t\t\tsetSourcesError(error instanceof Error ? error.message : t(\"sourcesLoadFailed\"));\r\n\t\t}\r\n\t}, [t]);\r\n\r\n\tconst refreshCapabilities = useCallback(async () => {\r\n\t\ttry {\r\n\t\t\tconst parsed = parseCapabilities(await jsonRequest<unknown>(CAPABILITIES_PATH));\r\n\t\t\tsetCapabilities(parsed ?? { value: emptyCapabilitySettings(), revision: 0, writable: false });\r\n\t\t\tsetCapabilitiesError(undefined);\r\n\t\t\treturn parsed;\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetCapabilities({ value: emptyCapabilitySettings(), revision: 0, writable: false });\r\n\t\t\tsetCapabilitiesError(error instanceof Error ? error.message : t(\"capabilitiesLoadFailed\"));\r\n\t\t\treturn undefined;\r\n\t\t} finally {\r\n\t\t\tsetCapabilitiesLoaded(true);\r\n\t\t}\r\n\t}, [t]);\r\n\r\n\tconst refreshGateway = useCallback(async () => {\r\n\t\ttry {\r\n\t\t\tsetGateway(parseGateway(await jsonRequest<unknown>(GATEWAY_PATH)));\r\n\t\t\tsetGatewayError(undefined);\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetGatewayError(error instanceof Error ? error.message : t(\"gatewayLoadFailed\"));\r\n\t\t} finally {\r\n\t\t\tsetGatewayLoaded(true);\r\n\t\t}\r\n\t}, [t]);\r\n\r\n\tconst refreshImagine = useCallback(async () => {\r\n\t\ttry {\r\n\t\t\tsetImagine(parseImagineCredential(await jsonRequest<unknown>(IMAGINE_CREDENTIAL_PATH)));\r\n\t\t\tsetImagineError(undefined);\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetImagineError(error instanceof Error ? error.message : t(\"imagineLoadFailed\"));\r\n\t\t}\r\n\t}, [t]);\r\n\r\n\tconst refreshUsage = useCallback(async () => {\r\n\t\tsetUsageLoading(true);\r\n\t\ttry {\r\n\t\t\tsetUsage(parseUsage(await jsonRequest<unknown>(CODEX_USAGE_PATH)));\r\n\t\t\tsetUsageError(undefined);\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetUsage(undefined);\r\n\t\t\tsetUsageError(error instanceof Error ? error.message : t(\"usageUnavailable\"));\r\n\t\t} finally {\r\n\t\t\tsetUsageLoading(false);\r\n\t\t}\r\n\t}, [t]);\r\n\r\n\t// Accounts: status immediately; sources shortly after (non-blocking for first paint).\r\n\tuseEffect(() => {\r\n\t\tensureMicroStyles();\r\n\t\tlet active = true;\r\n\t\tlet timer: number | undefined;\r\n\t\tvoid refresh().then((next) => {\r\n\t\t\tif (!active || next?.uiOwner === \"hub\") return;\r\n\t\t\ttimer = window.setTimeout(() => void refreshSources(), 0);\r\n\t\t});\r\n\t\treturn () => {\r\n\t\t\tactive = false;\r\n\t\t\tif (timer !== undefined) window.clearTimeout(timer);\r\n\t\t};\r\n\t}, [refresh, refreshSources]);\r\n\r\n\t// Capabilities tab: load settings + Imagine status on first visit.\r\n\tuseEffect(() => {\r\n\t\tif (activeTab !== \"capabilities\") return;\r\n\t\tif (!capabilitiesLoaded) void refreshCapabilities();\r\n\t\tvoid refreshImagine();\r\n\t}, [activeTab, capabilitiesLoaded, refreshCapabilities, refreshImagine]);\r\n\r\n\t// Soft-fetch capabilities when Codex is signed in so Accounts can show quota without opening the tab.\r\n\tuseEffect(() => {\r\n\t\tif (capabilitiesLoaded) return;\r\n\t\tif (status?.providers.codex.status !== \"signed-in\") return;\r\n\t\tvoid refreshCapabilities();\r\n\t}, [capabilitiesLoaded, refreshCapabilities, status?.providers.codex.status]);\r\n\r\n\t// Gateway: load only when that tab is opened.\r\n\tuseEffect(() => {\r\n\t\tif (activeTab !== \"gateway\" || gatewayLoaded) return;\r\n\t\tvoid refreshGateway();\r\n\t}, [activeTab, gatewayLoaded, refreshGateway]);\r\n\r\n\tuseEffect(() => {\r\n\t\tpreviewRef.current = preview;\r\n\t}, [preview]);\r\n\r\n\tuseEffect(() => {\r\n\t\tmountedRef.current = true;\r\n\t\treturn () => {\r\n\t\t\tmountedRef.current = false;\r\n\t\t\tif (copiedTimerRef.current !== undefined) window.clearTimeout(copiedTimerRef.current);\r\n\t\t\tpreviewEpochRef.current += 1;\r\n\t\t\tconst active = previewRef.current;\r\n\t\t\tif (active !== undefined) cancelPreviewTicket(active.previewId, true);\r\n\t\t};\r\n\t}, []);\r\n\r\n\tuseEffect(() => {\r\n\t\tconst signingIn =\r\n\t\t\tstatus !== undefined && Object.values(status.providers).some((provider) => provider.status === \"signing-in\");\r\n\t\tif (!signingIn) return;\r\n\t\tconst timer = window.setInterval(() => {\r\n\t\t\tvoid refresh();\r\n\t\t}, POLL_INTERVAL_MS);\r\n\t\treturn () => {\r\n\t\t\twindow.clearInterval(timer);\r\n\t\t};\r\n\t}, [refresh, status]);\r\n\r\n\tuseEffect(() => {\r\n\t\tconst signedIn = status?.providers.codex.status === \"signed-in\";\r\n\t\tif (capabilities?.value.codexUsage === true && signedIn) {\r\n\t\t\tvoid refreshUsage();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tsetUsage(undefined);\r\n\t\tsetUsageError(undefined);\r\n\t\tsetUsageLoading(false);\r\n\t}, [capabilities?.value.codexUsage, refreshUsage, status?.providers.codex.status]);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (gateway !== undefined) setPortDraft(String(gateway.port));\r\n\t}, [gateway]);\r\n\r\n\tconst signIn = async (provider: ProviderSlug, method: LoginMethod): Promise<void> => {\r\n\t\tconst popup = window.open(\"about:blank\", \"_blank\");\r\n\t\tif (popup !== null) popup.opener = null;\r\n\t\tsetBusyProvider(provider);\r\n\t\tsetRequestError(undefined);\r\n\t\tsetPopupBlocked((current) => ({ ...current, [provider]: popup === null }));\r\n\t\ttry {\r\n\t\t\tconst challenge = await jsonRequest<LoginChallenge>(LOGIN_PATH, \"POST\", { provider, method });\r\n\t\t\tif (popup !== null) popup.location.replace(challenge.url);\r\n\t\t\tawait refresh();\r\n\t\t} catch (error: unknown) {\r\n\t\t\tpopup?.close();\r\n\t\t\tsetRequestError(error instanceof Error ? error.message : t(\"requestFailed\"));\r\n\t\t\tawait refresh();\r\n\t\t} finally {\r\n\t\t\tsetBusyProvider(undefined);\r\n\t\t}\r\n\t};\r\n\r\n\tconst submitCode = async (provider: ProviderSlug): Promise<void> => {\r\n\t\tconst code = codeInputs[provider]?.trim() ?? \"\";\r\n\t\tif (code.length === 0) return;\r\n\t\tsetBusyProvider(provider);\r\n\t\ttry {\r\n\t\t\tawait jsonRequest<{ ok: true }>(LOGIN_CODE_PATH, \"POST\", { provider, code });\r\n\t\t\tsetCodeInputs((current) => ({ ...current, [provider]: \"\" }));\r\n\t\t\tawait refresh();\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetRequestError(error instanceof Error ? error.message : t(\"requestFailed\"));\r\n\t\t} finally {\r\n\t\t\tsetBusyProvider(undefined);\r\n\t\t}\r\n\t};\r\n\r\n\tconst cancelLogin = async (provider: ProviderSlug): Promise<void> => {\r\n\t\tsetBusyProvider(provider);\r\n\t\ttry {\r\n\t\t\tsetStatus(await jsonRequest<CodingOAuthStatus>(LOGIN_CANCEL_PATH, \"POST\", { provider }));\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetRequestError(error instanceof Error ? error.message : t(\"requestFailed\"));\r\n\t\t} finally {\r\n\t\t\tsetBusyProvider(undefined);\r\n\t\t}\r\n\t};\r\n\r\n\tconst signOut = async (provider: ProviderSlug): Promise<void> => {\r\n\t\tsetBusyProvider(provider);\r\n\t\ttry {\r\n\t\t\tsetStatus(await jsonRequest<CodingOAuthStatus>(LOGOUT_PATH, \"POST\", { provider }));\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetRequestError(error instanceof Error ? error.message : t(\"requestFailed\"));\r\n\t\t} finally {\r\n\t\t\tsetBusyProvider(undefined);\r\n\t\t}\r\n\t};\r\n\r\n\tconst saveModels = async (provider: ProviderSlug, selected: string[]): Promise<void> => {\r\n\t\tsetBusyProvider(provider);\r\n\t\ttry {\r\n\t\t\tsetStatus(await jsonRequest<CodingOAuthStatus>(MODELS_PATH, \"POST\", { provider, selected }));\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetRequestError(error instanceof Error ? error.message : t(\"requestFailed\"));\r\n\t\t} finally {\r\n\t\t\tsetBusyProvider(undefined);\r\n\t\t}\r\n\t};\r\n\r\n\tconst previewSource = async (kind: SourceKind): Promise<void> => {\r\n\t\tconst epoch = ++previewEpochRef.current;\r\n\t\tconst previous = previewRef.current;\r\n\t\tif (previous !== undefined) {\r\n\t\t\tpreviewRef.current = undefined;\r\n\t\t\tsetPreview(undefined);\r\n\t\t\tcancelPreviewTicket(previous.previewId);\r\n\t\t}\r\n\t\tsetSourcesBusy(true);\r\n\t\tsetSourcesNotice(undefined);\r\n\t\tsetConfirmOverwrite(false);\r\n\t\ttry {\r\n\t\t\tconst next = parsePreview(await jsonRequest<unknown>(SOURCES_PREVIEW_PATH, \"POST\", { kind }));\r\n\t\t\tif (next === undefined) throw new Error(t(\"sourcesPreviewFailed\"));\r\n\t\t\tif (!mountedRef.current || epoch !== previewEpochRef.current) {\r\n\t\t\t\tcancelPreviewTicket(next.previewId, !mountedRef.current);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tpreviewRef.current = next;\r\n\t\t\tsetPreview(next);\r\n\t\t\tsetSourcesError(undefined);\r\n\t\t} catch (error: unknown) {\r\n\t\t\tif (!mountedRef.current || epoch !== previewEpochRef.current) return;\r\n\t\t\tsetPreview(undefined);\r\n\t\t\tsetSourcesError(error instanceof Error ? error.message : t(\"sourcesPreviewFailed\"));\r\n\t\t} finally {\r\n\t\t\tif (mountedRef.current && epoch === previewEpochRef.current) setSourcesBusy(false);\r\n\t\t}\r\n\t};\r\n\r\n\tconst commitSource = async (): Promise<void> => {\r\n\t\tif (preview === undefined) return;\r\n\t\tif (preview.action === \"blocked\") return;\r\n\t\tif (preview.confirmOverwriteRequired && !confirmOverwrite) return;\r\n\t\tsetSourcesBusy(true);\r\n\t\ttry {\r\n\t\t\tconst result = await jsonRequest<unknown>(SOURCES_COMMIT_PATH, \"POST\", {\r\n\t\t\t\tkind: preview.kind,\r\n\t\t\t\tpreviewId: preview.previewId,\r\n\t\t\t\tconfirmOverwrite,\r\n\t\t\t});\r\n\t\t\tconst action = parseCommitAction(result);\r\n\t\t\tpreviewRef.current = undefined;\r\n\t\t\tsetPreview(undefined);\r\n\t\t\tsetConfirmOverwrite(false);\r\n\t\t\tsetSourcesNotice(\r\n\t\t\t\tt(\"sourcesCommitSuccess\", { action: action === undefined ? \"\" : t(SOURCE_COMMIT_ACTION_KEY[action]) }),\r\n\t\t\t);\r\n\t\t\tsetSourcesError(undefined);\r\n\t\t\tawait refreshSources();\r\n\t\t\tawait refresh();\r\n\t\t} catch (error: unknown) {\r\n\t\t\tif (isConsumedPreviewError(error)) {\r\n\t\t\t\tpreviewRef.current = undefined;\r\n\t\t\t\tsetPreview(undefined);\r\n\t\t\t\tsetConfirmOverwrite(false);\r\n\t\t\t}\r\n\t\t\tsetSourcesError(error instanceof Error ? error.message : t(\"sourcesCommitFailed\"));\r\n\t\t\tawait refreshSources();\r\n\t\t} finally {\r\n\t\t\tsetSourcesBusy(false);\r\n\t\t}\r\n\t};\r\n\r\n\tconst cancelSourcePreview = async (): Promise<void> => {\r\n\t\tif (preview === undefined) return;\r\n\t\tconst previewId = preview.previewId;\r\n\t\tpreviewEpochRef.current += 1;\r\n\t\tpreviewRef.current = undefined;\r\n\t\tsetPreview(undefined);\r\n\t\tsetConfirmOverwrite(false);\r\n\t\tsetSourcesBusy(true);\r\n\t\ttry {\r\n\t\t\tawait jsonRequest<unknown>(SOURCES_CANCEL_PATH, \"POST\", { previewId });\r\n\t\t\tsetSourcesError(undefined);\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetSourcesError(error instanceof Error ? error.message : t(\"requestFailed\"));\r\n\t\t} finally {\r\n\t\t\tsetSourcesBusy(false);\r\n\t\t}\r\n\t};\r\n\r\n\tconst patchCapability = async (key: CapabilitySettingKey, value: boolean | number): Promise<boolean> => {\r\n\t\tif (capabilities === undefined || !capabilities.writable) return false;\r\n\t\tif (key === \"codexImageEdits\" && value === true && !capabilities.value.codexImages) return false;\r\n\t\tconst patch: Partial<CapabilitySettingsView> =\r\n\t\t\tkey === \"codexImages\" && value === false && capabilities.value.codexImageEdits\r\n\t\t\t\t? { codexImages: false, codexImageEdits: false }\r\n\t\t\t\t: ({ [key]: value } as Partial<CapabilitySettingsView>);\r\n\t\tsetCapabilitiesBusy(true);\r\n\t\ttry {\r\n\t\t\tconst updated = parseCapabilities(\r\n\t\t\t\tawait jsonRequest<unknown>(CAPABILITIES_PATH, \"PATCH\", {\r\n\t\t\t\t\texpectedRevision: capabilities.revision,\r\n\t\t\t\t\tpatch,\r\n\t\t\t\t}),\r\n\t\t\t);\r\n\t\t\tif (updated !== undefined) setCapabilities(updated);\r\n\t\t\telse await refreshCapabilities();\r\n\t\t\tsetCapabilitiesError(undefined);\r\n\t\t\treturn true;\r\n\t\t} catch (error: unknown) {\r\n\t\t\tawait refreshCapabilities();\r\n\t\t\tsetCapabilitiesError(\r\n\t\t\t\tisConflictError(error)\r\n\t\t\t\t\t? t(\"capabilitiesConflictRefreshed\")\r\n\t\t\t\t\t: error instanceof Error\r\n\t\t\t\t\t\t? error.message\r\n\t\t\t\t\t\t: t(\"capabilitiesSaveFailed\"),\r\n\t\t\t);\r\n\t\t\treturn false;\r\n\t\t} finally {\r\n\t\t\tsetCapabilitiesBusy(false);\r\n\t\t}\r\n\t};\r\n\r\n\tconst showUsage = capabilities?.value.codexUsage === true && status?.providers.codex.status === \"signed-in\";\r\n\tconst signedInCount =\r\n\t\tstatus === undefined\r\n\t\t\t? 0\r\n\t\t\t: Object.values(status.providers).filter((provider) => provider.status === \"signed-in\").length;\r\n\r\n\tconst tabHints = useMemo((): readonly SettingsTabHint[] => {\r\n\t\tconst hints: SettingsTabHint[] = [];\r\n\t\tif (status !== undefined) {\r\n\t\t\tconst signedInCount = Object.values(status.providers).filter(\r\n\t\t\t\t(provider) => provider.status === \"signed-in\",\r\n\t\t\t).length;\r\n\t\t\tif (signedInCount > 0) {\r\n\t\t\t\thints.push({ id: \"accounts\", suffix: String(signedInCount) });\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (gateway?.running === true) {\r\n\t\t\thints.push({ id: \"gateway\", suffix: t(\"tabGatewayActive\") });\r\n\t\t}\r\n\t\treturn hints;\r\n\t}, [gateway?.running, status, t]);\r\n\r\n\tconst markCopied = (field: CopyField): void => {\r\n\t\tif (copiedTimerRef.current !== undefined) window.clearTimeout(copiedTimerRef.current);\r\n\t\tsetCopiedField(field);\r\n\t\tsetCopyFailedField(undefined);\r\n\t\tcopiedTimerRef.current = window.setTimeout(() => {\r\n\t\t\tif (mountedRef.current) {\r\n\t\t\t\tsetCopiedField(undefined);\r\n\t\t\t\tsetCopyFailedField(undefined);\r\n\t\t\t}\r\n\t\t\tcopiedTimerRef.current = undefined;\r\n\t\t}, 2000);\r\n\t};\r\n\r\n\tconst handleCopy = async (field: CopyField, text: string): Promise<void> => {\r\n\t\tconst ok = await copyText(text);\r\n\t\tif (ok) {\r\n\t\t\tmarkCopied(field);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tsetCopiedField(undefined);\r\n\t\tsetCopyFailedField(field);\r\n\t};\r\n\r\n\tconst ensureGatewayKey = async (): Promise<string> => {\r\n\t\tif (gatewayOnceKey !== undefined) return gatewayOnceKey;\r\n\t\tconst value = await jsonRequest<{ apiKey?: string }>(GATEWAY_REVEAL_PATH, \"POST\");\r\n\t\tif (typeof value.apiKey !== \"string\" || value.apiKey.length === 0) {\r\n\t\t\tthrow new Error(t(\"gatewayRevealFailed\"));\r\n\t\t}\r\n\t\tsetGatewayOnceKey(value.apiKey);\r\n\t\treturn value.apiKey;\r\n\t};\r\n\r\n\tconst copyGatewayKey = async (): Promise<void> => {\r\n\t\ttry {\r\n\t\t\tconst key = await ensureGatewayKey();\r\n\t\t\tawait handleCopy(\"key\", key);\r\n\t\t\tsetGatewayRevealError(undefined);\r\n\t\t} catch {\r\n\t\t\tsetGatewayRevealError(t(\"gatewayRevealFailed\"));\r\n\t\t}\r\n\t};\r\n\r\n\tconst toggleGatewayKeyVisible = async (): Promise<void> => {\r\n\t\tif (gatewayKeyVisible) {\r\n\t\t\tsetGatewayKeyVisible(false);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\ttry {\r\n\t\t\tawait ensureGatewayKey();\r\n\t\t\tsetGatewayKeyVisible(true);\r\n\t\t\tsetGatewayRevealError(undefined);\r\n\t\t} catch {\r\n\t\t\tsetGatewayRevealError(t(\"gatewayRevealFailed\"));\r\n\t\t}\r\n\t};\r\n\r\n\tconst applyGatewayPort = async (): Promise<void> => {\r\n\t\tconst port = parseGatewayPort(portDraft);\r\n\t\tif (port === undefined) {\r\n\t\t\tsetGatewayError(t(\"gatewayPortInvalid\"));\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (gateway !== undefined && port === gateway.port) return;\r\n\t\tsetGatewayBusy(true);\r\n\t\ttry {\r\n\t\t\tsetGateway(parseGateway(await jsonRequest<unknown>(GATEWAY_PATH, \"PATCH\", { port })) ?? gateway);\r\n\t\t\tsetGatewayError(undefined);\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetGatewayError(error instanceof Error ? error.message : t(\"gatewaySaveFailed\"));\r\n\t\t\tif (gateway !== undefined) setPortDraft(String(gateway.port));\r\n\t\t} finally {\r\n\t\t\tsetGatewayBusy(false);\r\n\t\t}\r\n\t};\r\n\r\n\tconst rotateGatewayKey = async (): Promise<void> => {\r\n\t\tsetGatewayBusy(true);\r\n\t\ttry {\r\n\t\t\tconst value = await jsonRequest<{ apiKey?: string; keyHint?: string }>(GATEWAY_ROTATE_PATH, \"POST\");\r\n\t\t\tif (typeof value.apiKey === \"string\") setGatewayOnceKey(value.apiKey);\r\n\t\t\tsetGatewayKeyVisible(true);\r\n\t\t\tsetGatewayRotateConfirm(false);\r\n\t\t\tsetGatewayRevealError(undefined);\r\n\t\t\tawait refreshGateway();\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetGatewayError(error instanceof Error ? error.message : t(\"gatewaySaveFailed\"));\r\n\t\t} finally {\r\n\t\t\tsetGatewayBusy(false);\r\n\t\t}\r\n\t};\r\n\r\n\tconst setGatewayEnabled = (enabled: boolean): void => {\r\n\t\tsetGatewayBusy(true);\r\n\t\tvoid jsonRequest<unknown>(GATEWAY_PATH, \"PATCH\", { enabled })\r\n\t\t\t.then((value) => {\r\n\t\t\t\tsetGateway(parseGateway(value) ?? gateway);\r\n\t\t\t\tsetGatewayError(undefined);\r\n\t\t\t})\r\n\t\t\t.catch((error: unknown) => {\r\n\t\t\t\tsetGatewayError(error instanceof Error ? error.message : t(\"gatewaySaveFailed\"));\r\n\t\t\t})\r\n\t\t\t.finally(() => {\r\n\t\t\t\tsetGatewayBusy(false);\r\n\t\t\t});\r\n\t};\r\n\r\n\tconst dismissRemoteTip = (): void => {\r\n\t\tsetRemoteTipDismissed(true);\r\n\t\ttry {\r\n\t\t\tglobalThis.sessionStorage?.setItem(REMOTE_TIP_STORAGE_KEY, \"1\");\r\n\t\t} catch {\r\n\t\t\t// ignore storage failures\r\n\t\t}\r\n\t};\r\n\r\n\tconst openAccountsForCodex = (): void => {\r\n\t\tsetActiveTab(\"accounts\");\r\n\t\twindow.setTimeout(() => document.getElementById(\"coding-oauth-login-codex\")?.focus(), 0);\r\n\t};\r\n\r\n\tconst focusCapabilityDependency = (target: \"codexImages\" | \"imagineCredential\"): void => {\r\n\t\tconst id = target === \"codexImages\" ? \"cap-switch-codexImages\" : \"coding-oauth-imagine-credential\";\r\n\t\tdocument.getElementById(id)?.focus();\r\n\t};\r\n\r\n\tif (status?.uiOwner === \"hub\") {\r\n\t\treturn (\r\n\t\t\t<section data-dsh-coding-oauth=\"compact\" style={pageStyle} aria-labelledby=\"coding-oauth-settings-title\">\r\n\t\t\t\t<h2 id=\"coding-oauth-settings-title\" style={titleStyle}>\r\n\t\t\t\t\t{t(\"coinstallTitle\")}\r\n\t\t\t\t</h2>\r\n\t\t\t\t<p style={bodyStyle}>{t(\"coinstallSummary\", { count: signedInCount })}</p>\r\n\t\t\t\t<button\r\n\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\tstyle={buttonStyle}\r\n\t\t\t\t\tonClick={() => window.dispatchEvent(new CustomEvent(\"usage-stats:open-dashboard\"))}\r\n\t\t\t\t>\r\n\t\t\t\t\t{t(\"coinstallOpenHub\")}\r\n\t\t\t\t</button>\r\n\t\t\t</section>\r\n\t\t);\r\n\t}\r\n\r\n\treturn (\r\n\t\t<section data-dsh-coding-oauth=\"\" style={pageStyle} aria-labelledby=\"coding-oauth-settings-title\">\r\n\t\t\t<div>\r\n\t\t\t\t<h2 id=\"coding-oauth-settings-title\" style={titleStyle}>\r\n\t\t\t\t\t{t(\"title\")}\r\n\t\t\t\t</h2>\r\n\t\t\t\t{activeTab === \"accounts\" ? <p style={{ ...bodyStyle, marginTop: 6 }}>{t(\"intro\")}</p> : null}\r\n\t\t\t</div>\r\n\t\t\t{requestError === undefined ? null : (\r\n\t\t\t\t<div role=\"alert\" style={{ display: \"flex\", flexWrap: \"wrap\", alignItems: \"center\", gap: 8 }}>\r\n\t\t\t\t\t<p style={errorStyle}>{requestError}</p>\r\n\t\t\t\t\t{status === undefined ? (\r\n\t\t\t\t\t\t<button type=\"button\" style={buttonStyle} onClick={() => void refresh()}>\r\n\t\t\t\t\t\t\t{t(\"retry\")}\r\n\t\t\t\t\t\t</button>\r\n\t\t\t\t\t) : null}\r\n\t\t\t\t</div>\r\n\t\t\t)}\r\n\t\t\t<SettingsTabs t={t} activeTab={activeTab} onChange={setActiveTab} hints={tabHints} />\r\n\t\t\t<div\r\n\t\t\t\tid={`coding-oauth-panel-${activeTab}`}\r\n\t\t\t\trole=\"tabpanel\"\r\n\t\t\t\taria-labelledby={`coding-oauth-tab-${activeTab}`}\r\n\t\t\t\tstyle={panelStyle}\r\n\t\t\t>\r\n\t\t\t\t{activeTab === \"accounts\" && !(status === undefined && requestError !== undefined) ? (\r\n\t\t\t\t\t<AccountsTab\r\n\t\t\t\t\t\tt={t}\r\n\t\t\t\t\t\tstatus={status}\r\n\t\t\t\t\t\tremote={remote}\r\n\t\t\t\t\t\tremoteTipDismissed={remoteTipDismissed}\r\n\t\t\t\t\t\tonDismissRemoteTip={dismissRemoteTip}\r\n\t\t\t\t\t\tsources={sources}\r\n\t\t\t\t\t\tsourcesError={sourcesError}\r\n\t\t\t\t\t\tsourcesNotice={sourcesNotice}\r\n\t\t\t\t\t\tsourcesBusy={sourcesBusy}\r\n\t\t\t\t\t\tpreview={preview}\r\n\t\t\t\t\t\tconfirmOverwrite={confirmOverwrite}\r\n\t\t\t\t\t\tbusyProvider={busyProvider}\r\n\t\t\t\t\t\tcodeInputs={codeInputs}\r\n\t\t\t\t\t\tpopupBlocked={popupBlocked}\r\n\t\t\t\t\t\texpandedProviders={expandedProviders}\r\n\t\t\t\t\t\tshowUsage={showUsage === true}\r\n\t\t\t\t\t\tusage={usage}\r\n\t\t\t\t\t\tusageError={usageError}\r\n\t\t\t\t\t\tusageLoading={usageLoading}\r\n\t\t\t\t\t\tonSignIn={(slug, method) => {\r\n\t\t\t\t\t\t\tvoid signIn(slug, method);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonSignOut={(slug) => {\r\n\t\t\t\t\t\t\tvoid signOut(slug);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonCancelLogin={(slug) => {\r\n\t\t\t\t\t\t\tvoid cancelLogin(slug);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonSubmitCode={(slug) => {\r\n\t\t\t\t\t\t\tvoid submitCode(slug);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonCodeChange={(slug, value) => {\r\n\t\t\t\t\t\t\tsetCodeInputs((current) => ({ ...current, [slug]: value }));\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonToggleExpanded={(slug) => {\r\n\t\t\t\t\t\t\tsetExpandedProviders((current) => ({\r\n\t\t\t\t\t\t\t\t...current,\r\n\t\t\t\t\t\t\t\t[slug]: !(current[slug] === true),\r\n\t\t\t\t\t\t\t}));\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonPreviewSource={(slug) => {\r\n\t\t\t\t\t\t\tvoid previewSource(slug);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonSaveModels={(slug, selected) => {\r\n\t\t\t\t\t\t\tvoid saveModels(slug, selected);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonConfirmOverwriteChange={setConfirmOverwrite}\r\n\t\t\t\t\t\tonCommitSource={() => {\r\n\t\t\t\t\t\t\tvoid commitSource();\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonCancelSourcePreview={() => {\r\n\t\t\t\t\t\t\tvoid cancelSourcePreview();\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonRefreshSources={() => {\r\n\t\t\t\t\t\t\tvoid refreshSources();\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonDismissSourcesNotice={() => {\r\n\t\t\t\t\t\t\tsetSourcesNotice(undefined);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t/>\r\n\t\t\t\t) : null}\r\n\t\t\t\t{activeTab === \"capabilities\" ? (\r\n\t\t\t\t\t<CapabilitiesTab\r\n\t\t\t\t\t\tt={t}\r\n\t\t\t\t\t\tcapabilities={capabilities}\r\n\t\t\t\t\t\tcapabilitiesError={capabilitiesError}\r\n\t\t\t\t\t\tcapabilitiesBusy={capabilitiesBusy}\r\n\t\t\t\t\t\timagine={imagine}\r\n\t\t\t\t\t\timagineError={imagineError}\r\n\t\t\t\t\t\tcodexSignedIn={status?.providers.codex.status === \"signed-in\"}\r\n\t\t\t\t\t\tonRetry={() => {\r\n\t\t\t\t\t\t\tvoid refreshCapabilities();\r\n\t\t\t\t\t\t\tvoid refreshImagine();\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonOpenAccounts={openAccountsForCodex}\r\n\t\t\t\t\t\tonFocusDependency={focusCapabilityDependency}\r\n\t\t\t\t\t\tonPatchCapability={(key, value) => patchCapability(key, value)}\r\n\t\t\t\t\t/>\r\n\t\t\t\t) : null}\r\n\t\t\t\t{activeTab === \"gateway\" ? (\r\n\t\t\t\t\t<GatewayTab\r\n\t\t\t\t\t\tt={t}\r\n\t\t\t\t\t\tgateway={gateway}\r\n\t\t\t\t\t\tgatewayError={gatewayError}\r\n\t\t\t\t\t\tgatewayBusy={gatewayBusy}\r\n\t\t\t\t\t\tgatewayOnceKey={gatewayOnceKey}\r\n\t\t\t\t\t\tgatewayKeyVisible={gatewayKeyVisible}\r\n\t\t\t\t\t\tgatewayRotateConfirm={gatewayRotateConfirm}\r\n\t\t\t\t\t\tgatewayRevealError={gatewayRevealError}\r\n\t\t\t\t\t\tportDraft={portDraft}\r\n\t\t\t\t\t\tcopiedField={copiedField}\r\n\t\t\t\t\t\tcopyFailedField={copyFailedField}\r\n\t\t\t\t\t\tonRetry={() => {\r\n\t\t\t\t\t\t\tvoid refreshGateway();\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonEnabledChange={setGatewayEnabled}\r\n\t\t\t\t\t\tonPortDraftChange={setPortDraft}\r\n\t\t\t\t\t\tonApplyPort={() => {\r\n\t\t\t\t\t\t\tvoid applyGatewayPort();\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonRandomPort={(port) => {\r\n\t\t\t\t\t\t\tsetPortDraft(String(port));\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonCopy={(field, text) => {\r\n\t\t\t\t\t\t\tvoid handleCopy(field, text);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonCopyKey={() => {\r\n\t\t\t\t\t\t\tvoid copyGatewayKey();\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonToggleKeyVisible={() => {\r\n\t\t\t\t\t\t\tvoid toggleGatewayKeyVisible();\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonRotateConfirm={() => {\r\n\t\t\t\t\t\t\tsetGatewayRotateConfirm(true);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonRotateCancel={() => {\r\n\t\t\t\t\t\t\tsetGatewayRotateConfirm(false);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonRotate={() => {\r\n\t\t\t\t\t\t\tvoid rotateGatewayKey();\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t/>\r\n\t\t\t\t) : null}\r\n\t\t\t\t{activeTab === \"about\" ? <AboutTab t={t} /> : null}\r\n\t\t\t</div>\r\n\t\t</section>\r\n\t);\r\n}\r\n", null, "/** Static tables for the Coding OAuth settings UI. */\r\n\r\nimport {\r\n\tCAPABILITY_SETTINGS_PATH,\r\n\tCODING_OAUTH_LOGIN_CANCEL_PATH,\r\n\tCODING_OAUTH_LOGIN_CODE_PATH,\r\n\tCODING_OAUTH_LOGIN_PATH,\r\n\tCODING_OAUTH_LOGOUT_PATH,\r\n\tCODING_OAUTH_MODELS_PATH,\r\n\tCODING_OAUTH_STATUS_PATH,\r\n\tCODEX_USAGE_PATH as CORE_CODEX_USAGE_PATH,\r\n\tGATEWAY_REVEAL_PATH as CORE_GATEWAY_REVEAL_PATH,\r\n\tGATEWAY_ROTATE_PATH as CORE_GATEWAY_ROTATE_PATH,\r\n\tGATEWAY_SETTINGS_PATH,\r\n\tIMAGINE_CREDENTIAL_STATUS_PATH,\r\n\tOAUTH_IMPORT_CANCEL_PATH,\r\n\tOAUTH_IMPORT_COMMIT_PATH,\r\n\tOAUTH_IMPORT_PREVIEW_PATH,\r\n\tOAUTH_IMPORT_SOURCES_PATH,\r\n} from \"dsh-coding-oauth-core/contracts\";\r\nimport type { GrokBuildSettingsKey } from \"./locales.ts\";\r\nimport type {\r\n\tCapabilityFlagKey,\r\n\tCapabilityLimitKey,\r\n\tProviderCardDefinition,\r\n\tSettingsTabId,\r\n\tSourceCommitAction,\r\n\tSourceConflict,\r\n\tSourceKind,\r\n\tSourcePreviewAction,\r\n\tSourceReason,\r\n} from \"./types.ts\";\r\n\r\nexport const STATUS_PATH = CODING_OAUTH_STATUS_PATH;\r\nexport const LOGIN_PATH = CODING_OAUTH_LOGIN_PATH;\r\nexport const LOGIN_CODE_PATH = CODING_OAUTH_LOGIN_CODE_PATH;\r\nexport const LOGIN_CANCEL_PATH = CODING_OAUTH_LOGIN_CANCEL_PATH;\r\nexport const LOGOUT_PATH = CODING_OAUTH_LOGOUT_PATH;\r\nexport const MODELS_PATH = CODING_OAUTH_MODELS_PATH;\r\nexport const SOURCES_PATH = OAUTH_IMPORT_SOURCES_PATH;\r\nexport const SOURCES_PREVIEW_PATH = OAUTH_IMPORT_PREVIEW_PATH;\r\nexport const SOURCES_COMMIT_PATH = OAUTH_IMPORT_COMMIT_PATH;\r\nexport const SOURCES_CANCEL_PATH = OAUTH_IMPORT_CANCEL_PATH;\r\nexport const CAPABILITIES_PATH = CAPABILITY_SETTINGS_PATH;\r\nexport const CODEX_USAGE_PATH = CORE_CODEX_USAGE_PATH;\r\nexport const IMAGINE_CREDENTIAL_PATH = IMAGINE_CREDENTIAL_STATUS_PATH;\r\nexport const GATEWAY_PATH = GATEWAY_SETTINGS_PATH;\r\nexport const GATEWAY_REVEAL_PATH = CORE_GATEWAY_REVEAL_PATH;\r\nexport const GATEWAY_ROTATE_PATH = CORE_GATEWAY_ROTATE_PATH;\r\nexport const POLL_INTERVAL_MS = 1_000;\r\nexport const HOUR_MS = 60 * 60 * 1000;\r\n\r\nexport const SOURCE_KINDS: readonly SourceKind[] = [\"grok\", \"codex\", \"kimi\", \"claude\"];\r\nexport const SOURCE_REASONS: readonly SourceReason[] = [\"missing\", \"unsafe\", \"invalid\", \"too_large\"];\r\nexport const SOURCE_CONFLICTS: readonly SourceConflict[] = [\r\n\t\"none\",\r\n\t\"same_credential\",\r\n\t\"same_account\",\r\n\t\"different_account\",\r\n\t\"unknown_account\",\r\n\t\"unreadable_destination\",\r\n\t\"unsafe_destination\",\r\n];\r\nexport const SOURCE_PREVIEW_ACTIONS: readonly SourcePreviewAction[] = [\"import\", \"reuse\", \"overwrite\", \"blocked\"];\r\nexport const SOURCE_COMMIT_ACTIONS: readonly SourceCommitAction[] = [\"imported\", \"unchanged\", \"overwritten\"];\r\n\r\nexport const SOURCE_DEFAULT_PATH: { readonly [K in SourceKind]: string } = {\r\n\tgrok: \"~/.grok/auth.json\",\r\n\tcodex: \"~/.codex/auth.json\",\r\n\tkimi: \"~/.kimi/credentials/kimi-code.json\",\r\n\tclaude: \"~/.claude/.credentials.json\",\r\n};\r\n\r\nexport const SOURCE_KIND_KEY: { readonly [K in SourceKind]: GrokBuildSettingsKey } = {\r\n\tgrok: \"sourceKindGrok\",\r\n\tcodex: \"sourceKindCodex\",\r\n\tkimi: \"sourceKindKimi\",\r\n\tclaude: \"sourceKindClaude\",\r\n};\r\n\r\nexport const SOURCE_REASON_KEY: { readonly [K in SourceReason]: GrokBuildSettingsKey } = {\r\n\tmissing: \"sourceReasonMissing\",\r\n\tunsafe: \"sourceReasonUnsafe\",\r\n\tinvalid: \"sourceReasonInvalid\",\r\n\ttoo_large: \"sourceReasonTooLarge\",\r\n};\r\n\r\nexport const SOURCE_CONFLICT_KEY: { readonly [K in SourceConflict]: GrokBuildSettingsKey } = {\r\n\tnone: \"sourceConflictNone\",\r\n\tsame_credential: \"sourceConflictSameCredential\",\r\n\tsame_account: \"sourceConflictSameAccount\",\r\n\tdifferent_account: \"sourceConflictDifferentAccount\",\r\n\tunknown_account: \"sourceConflictUnknownAccount\",\r\n\tunreadable_destination: \"sourceConflictUnreadableDestination\",\r\n\tunsafe_destination: \"sourceConflictUnsafeDestination\",\r\n};\r\n\r\nexport const SOURCE_PREVIEW_ACTION_KEY: { readonly [K in SourcePreviewAction]: GrokBuildSettingsKey } = {\r\n\timport: \"sourceActionImport\",\r\n\treuse: \"sourceActionReuse\",\r\n\toverwrite: \"sourceActionOverwrite\",\r\n\tblocked: \"sourceActionBlocked\",\r\n};\r\n\r\nexport const SOURCE_COMMIT_ACTION_KEY: { readonly [K in SourceCommitAction]: GrokBuildSettingsKey } = {\r\n\timported: \"sourceCommitImported\",\r\n\tunchanged: \"sourceCommitUnchanged\",\r\n\toverwritten: \"sourceCommitOverwritten\",\r\n};\r\n\r\nexport const CAPABILITY_TOGGLES: readonly {\r\n\tkey: CapabilityFlagKey;\r\n\tlabel: GrokBuildSettingsKey;\r\n\thint: GrokBuildSettingsKey;\r\n\trequiresImages?: true;\r\n}[] = [\r\n\t{ key: \"codexSearch\", label: \"capCodexSearch\", hint: \"capCodexSearchHint\" },\r\n\t{ key: \"codexImages\", label: \"capCodexImages\", hint: \"capCodexImagesHint\" },\r\n\t{ key: \"codexImageEdits\", label: \"capCodexImageEdits\", hint: \"capCodexImageEditsHint\", requiresImages: true },\r\n\t{ key: \"codexUsage\", label: \"capCodexUsage\", hint: \"capCodexUsageHint\" },\r\n\t{ key: \"codexFast\", label: \"capCodexFast\", hint: \"capCodexFastHint\" },\r\n\t{ key: \"grokImagineImage\", label: \"capGrokImagineImage\", hint: \"capGrokImagineImageHint\" },\r\n\t{ key: \"grokImagineVideo\", label: \"capGrokImagineVideo\", hint: \"capGrokImagineVideoHint\" },\r\n];\r\n\r\nexport const CAPABILITY_LIMITS: readonly {\r\n\tkey: CapabilityLimitKey;\r\n\tlabel: GrokBuildSettingsKey;\r\n\thint: GrokBuildSettingsKey;\r\n\tmin: number;\r\n\tmax: number;\r\n\tscale: number;\r\n}[] = [\r\n\t{ key: \"searchResults\", label: \"capSearchResults\", hint: \"capSearchResultsHint\", min: 1, max: 20, scale: 1 },\r\n\t{ key: \"imageCount\", label: \"capImageCount\", hint: \"capImageCountHint\", min: 1, max: 4, scale: 1 },\r\n\t{\r\n\t\tkey: \"videoArtifactTtlMs\",\r\n\t\tlabel: \"capVideoTtlHours\",\r\n\t\thint: \"capVideoTtlHoursHint\",\r\n\t\tmin: 1,\r\n\t\tmax: 168,\r\n\t\tscale: HOUR_MS,\r\n\t},\r\n];\r\n\r\nexport const IMAGINE_SOURCE_KEY: { readonly [source: string]: GrokBuildSettingsKey } = {\r\n\tnone: \"imagineSourceNone\",\r\n\tenv: \"imagineSourceEnv\",\r\n\tenvironment: \"imagineSourceEnv\",\r\n\t\"xai-api-key\": \"imagineSourceEnv\",\r\n\txai_api_key: \"imagineSourceEnv\",\r\n\t\"api-key\": \"imagineSourceApiKey\",\r\n\tapi_key: \"imagineSourceApiKey\",\r\n\tapikey: \"imagineSourceApiKey\",\r\n\tkey: \"imagineSourceApiKey\",\r\n\tsettings: \"imagineSourceApiKey\",\r\n\toauth: \"imagineSourceOAuth\",\r\n\t\"oauth-access\": \"imagineSourceOAuth\",\r\n\t\"grok-cli-key\": \"imagineSourceCliKey\",\r\n\t\"cli-key\": \"imagineSourceCliKey\",\r\n};\r\n\r\nexport const PROVIDERS: readonly ProviderCardDefinition[] = [\r\n\t{\r\n\t\tslug: \"grok\",\r\n\t\troute: \"grok-build\",\r\n\t\ttitleKey: \"grokTitle\",\r\n\t\tdescriptionKey: \"grokDescription\",\r\n\t\tmethods: [\"pkce\", \"device\"],\r\n\t\trecommended: \"pkce\",\r\n\t\tremoteRecommended: \"device\",\r\n\t},\r\n\t{\r\n\t\tslug: \"codex\",\r\n\t\troute: \"codex-oauth\",\r\n\t\ttitleKey: \"codexTitle\",\r\n\t\tdescriptionKey: \"codexDescription\",\r\n\t\tmethods: [\"device\", \"browser\"],\r\n\t\trecommended: \"device\",\r\n\t\tremoteRecommended: \"device\",\r\n\t},\r\n\t{\r\n\t\tslug: \"kimi\",\r\n\t\troute: \"kimi-code-oauth\",\r\n\t\ttitleKey: \"kimiTitle\",\r\n\t\tdescriptionKey: \"kimiDescription\",\r\n\t\tmethods: [\"device\"],\r\n\t\trecommended: \"device\",\r\n\t\tremoteRecommended: \"device\",\r\n\t},\r\n\t{\r\n\t\tslug: \"claude\",\r\n\t\troute: \"claude-code-oauth\",\r\n\t\ttitleKey: \"claudeTitle\",\r\n\t\tdescriptionKey: \"claudeDescription\",\r\n\t\tmethods: [\"browser\"],\r\n\t\trecommended: \"browser\",\r\n\t\tremoteRecommended: \"browser\",\r\n\t},\r\n];\r\n\r\nexport const SETTINGS_TABS: readonly { id: SettingsTabId; label: GrokBuildSettingsKey }[] = [\r\n\t{ id: \"accounts\", label: \"tabAccounts\" },\r\n\t{ id: \"gateway\", label: \"tabGateway\" },\r\n\t{ id: \"capabilities\", label: \"tabCapabilities\" },\r\n\t{ id: \"about\", label: \"tabAbout\" },\r\n];\r\n\r\nexport const GATEWAY_PORT_MIN = 1024;\r\nexport const GATEWAY_PORT_MAX = 65_535;\r\nexport const GATEWAY_RANDOM_PORT_MIN = 18_100;\r\nexport const GATEWAY_RANDOM_PORT_MAX = 18_999;\r\nexport const GATEWAY_RANDOM_RESERVED = new Set([22, 53, 3080, 7890, 9090, 18_080]);\r\n\r\nexport const CONSUMED_PREVIEW_CODES = new Set([\r\n\t\"preview_invalid\",\r\n\t\"preview_expired\",\r\n\t\"source_changed\",\r\n\t\"destination_changed\",\r\n\t\"confirm_required\",\r\n\t\"unsafe_destination\",\r\n]);\r\n\r\nexport const PLUGIN_VERSION = \"0.6.2\";\n", "/** Same-origin JSON helpers for the Coding OAuth plugin HTTP API. */\r\n\r\nimport { CONSUMED_PREVIEW_CODES, SOURCES_CANCEL_PATH } from \"./constants.ts\";\r\nimport type { PluginRequestError } from \"./types.ts\";\r\n\r\nexport function isRecord(value: unknown): value is Record<string, unknown> {\r\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\r\n}\r\n\r\nexport function isPluginRequestError(error: unknown): error is PluginRequestError {\r\n\treturn error instanceof Error && error.name === \"PluginRequestError\" && \"status\" in error;\r\n}\r\n\r\nexport function isConflictError(error: unknown): boolean {\r\n\tif (!isPluginRequestError(error)) {\r\n\t\treturn (\r\n\t\t\terror instanceof Error && /SETTINGS_CONFLICT|settings-conflict|changed since it was read/iu.test(error.message)\r\n\t\t);\r\n\t}\r\n\treturn error.status === 409 || error.code === \"SETTINGS_CONFLICT\" || /conflict/iu.test(error.message);\r\n}\r\n\r\nexport function isConsumedPreviewError(error: unknown): boolean {\r\n\tif (!isPluginRequestError(error)) return false;\r\n\tif (error.code !== undefined && CONSUMED_PREVIEW_CODES.has(error.code)) return true;\r\n\treturn error.status === 404 || error.status === 410;\r\n}\r\n\r\nexport function cancelPreviewTicket(previewId: string, keepalive = false): void {\r\n\tvoid fetch(SOURCES_CANCEL_PATH, {\r\n\t\tmethod: \"POST\",\r\n\t\theaders: { accept: \"application/json\", \"content-type\": \"application/json\" },\r\n\t\tcredentials: \"same-origin\",\r\n\t\tbody: JSON.stringify({ previewId }),\r\n\t\t...(keepalive ? { keepalive: true } : {}),\r\n\t}).catch(() => undefined);\r\n}\r\n\r\nexport async function jsonRequest<T>(path: string, method = \"GET\", body?: unknown): Promise<T> {\r\n\tconst response = await fetch(path, {\r\n\t\tmethod,\r\n\t\theaders: { accept: \"application/json\", ...(body === undefined ? {} : { \"content-type\": \"application/json\" }) },\r\n\t\tcredentials: \"same-origin\",\r\n\t\t...(body === undefined ? {} : { body: JSON.stringify(body) }),\r\n\t});\r\n\tconst value: unknown = await response.json().catch(() => undefined);\r\n\tif (!response.ok) {\r\n\t\tconst record = isRecord(value) ? value : undefined;\r\n\t\tconst message =\r\n\t\t\trecord !== undefined && typeof record[\"error\"] === \"string\"\r\n\t\t\t\t? record[\"error\"]\r\n\t\t\t\t: record !== undefined && typeof record[\"message\"] === \"string\"\r\n\t\t\t\t\t? record[\"message\"]\r\n\t\t\t\t\t: `HTTP ${response.status}`;\r\n\t\tconst code = record !== undefined && typeof record[\"code\"] === \"string\" ? record[\"code\"] : undefined;\r\n\t\tconst error = new Error(message) as PluginRequestError;\r\n\t\terror.name = \"PluginRequestError\";\r\n\t\terror.status = response.status;\r\n\t\tif (code !== undefined) error.code = code;\r\n\t\tthrow error;\r\n\t}\r\n\treturn value as T;\r\n}\r\n\r\nexport async function copyText(text: string): Promise<boolean> {\r\n\ttry {\r\n\t\tif (typeof navigator !== \"undefined\" && navigator.clipboard?.writeText !== undefined) {\r\n\t\t\tawait navigator.clipboard.writeText(text);\r\n\t\t\treturn true;\r\n\t\t}\r\n\t} catch {\r\n\t\t// fall through to execCommand\r\n\t}\r\n\ttry {\r\n\t\tconst area = document.createElement(\"textarea\");\r\n\t\tarea.value = text;\r\n\t\tarea.setAttribute(\"readonly\", \"\");\r\n\t\tarea.style.position = \"fixed\";\r\n\t\tarea.style.left = \"-9999px\";\r\n\t\tdocument.body.appendChild(area);\r\n\t\tarea.select();\r\n\t\tconst ok = document.execCommand(\"copy\");\r\n\t\tdocument.body.removeChild(area);\r\n\t\treturn ok;\r\n\t} catch {\r\n\t\treturn false;\r\n\t}\r\n}\r\n", "/** Shared inline styles using DSH design tokens. */\r\n\r\nimport type { CSSProperties } from \"react\";\r\nimport type { ProviderStatus } from \"./types.ts\";\r\n\r\nexport const TRANSITION = \"all 0.15s ease\";\r\n\r\nexport const pageStyle: CSSProperties = {\r\n\tdisplay: \"flex\",\r\n\tflexDirection: \"column\",\r\n\tgap: 16,\r\n\twidth: \"100%\",\r\n\tmaxWidth: 780,\r\n\tminWidth: 0,\r\n};\r\nexport const titleStyle: CSSProperties = {\r\n\tmargin: 0,\r\n\tfontSize: 20,\r\n\tlineHeight: \"28px\",\r\n\tfontWeight: 600,\r\n\tcolor: \"var(--dsw-alias-label-primary)\",\r\n};\r\nexport const bodyStyle: CSSProperties = {\r\n\tmargin: 0,\r\n\tfontSize: 14,\r\n\tlineHeight: \"22px\",\r\n\tcolor: \"var(--dsw-alias-label-secondary)\",\r\n};\r\nexport const cardStyle: CSSProperties = {\r\n\tdisplay: \"flex\",\r\n\tflexDirection: \"column\",\r\n\tgap: 14,\r\n\tpadding: \"18px 20px\",\r\n\tborder: \"1px solid var(--dsw-alias-border-l2)\",\r\n\tborderRadius: 12,\r\n\tbackground: \"var(--dsw-alias-bg-module-platform)\",\r\n\ttransition: TRANSITION,\r\n};\r\nexport const rowStyle: CSSProperties = {\r\n\tdisplay: \"flex\",\r\n\talignItems: \"center\",\r\n\tjustifyContent: \"space-between\",\r\n\tflexWrap: \"wrap\",\r\n\tgap: 12,\r\n};\r\nexport const statusStyle: CSSProperties = {\r\n\tdisplay: \"flex\",\r\n\talignItems: \"center\",\r\n\tgap: 9,\r\n\tfontSize: 14,\r\n\tfontWeight: 500,\r\n\tcolor: \"var(--dsw-alias-label-primary)\",\r\n};\r\nexport const buttonStyle: CSSProperties = {\r\n\tboxSizing: \"border-box\",\r\n\tminHeight: 34,\r\n\tpadding: \"6px 14px\",\r\n\tborder: \"1px solid var(--dsw-alias-border-l4, rgba(127, 127, 127, 0.4))\",\r\n\tborderRadius: 18,\r\n\tbackground: \"var(--dsw-alias-button-elevated-fill, var(--dsw-alias-bg-layer-1))\",\r\n\tcolor: \"var(--dsw-alias-label-primary)\",\r\n\tboxShadow: \"0 1px 2px rgba(0, 0, 0, 0.18)\",\r\n\tfont: \"inherit\",\r\n\tfontSize: 14,\r\n\tfontWeight: 500,\r\n\tcursor: \"pointer\",\r\n\ttransition: TRANSITION,\r\n};\r\nexport const primaryButtonStyle: CSSProperties = {\r\n\t...buttonStyle,\r\n\t// DSH dark theme flips brand-primary to near-white; use the button/foreground\r\n\t// pair so primary CTAs stay readable in both light and dark mode.\r\n\tborder: \"none\",\r\n\tbackground: \"var(--dsw-alias-button-primary-fill)\",\r\n\tcolor: \"var(--dsw-alias-label-primary-foreground)\",\r\n\tboxShadow: \"0 1px 3px rgba(0, 0, 0, 0.28)\",\r\n\tfontWeight: 600,\r\n};\r\nexport const compactButtonStyle: CSSProperties = {\r\n\t...buttonStyle,\r\n\tminHeight: 28,\r\n\tpadding: \"4px 10px\",\r\n\tfontSize: 13,\r\n\tborderRadius: 8,\r\n};\r\nexport const errorStyle: CSSProperties = { ...bodyStyle, color: \"var(--dsw-alias-state-error-primary)\" };\r\nexport const successStyle: CSSProperties = { ...bodyStyle, color: \"var(--dsw-alias-state-success-primary, #22a06b)\" };\r\nexport const warningStyle: CSSProperties = {\r\n\t...bodyStyle,\r\n\tpadding: \"10px 12px\",\r\n\tborderRadius: 8,\r\n\tborder: \"1px solid color-mix(in srgb, var(--dsw-alias-state-warn-primary, #e06c00) 35%, transparent)\",\r\n\tbackground: \"color-mix(in srgb, var(--dsw-alias-state-warn-primary, #e06c00) 10%, transparent)\",\r\n\tcolor: \"var(--dsw-alias-label-primary)\",\r\n};\r\nexport const tipStyle: CSSProperties = {\r\n\t...bodyStyle,\r\n\tpadding: \"10px 12px\",\r\n\tborderRadius: 8,\r\n\tborder: \"1px solid var(--dsw-alias-border-l2)\",\r\n\tbackground: \"var(--dsw-alias-bg-layer-1)\",\r\n\tcolor: \"var(--dsw-alias-label-primary)\",\r\n};\r\nexport const noticeStyle: CSSProperties = {\r\n\t...tipStyle,\r\n\tanimation: \"dsh-coding-oauth-fade-in 0.2s ease\",\r\n};\r\nexport const codeStyle: CSSProperties = {\r\n\tfontFamily: \"ui-monospace, SFMono-Regular, Menlo, Consolas, monospace\",\r\n\tfontSize: 20,\r\n\tletterSpacing: \"0.08em\",\r\n\tfontWeight: 600,\r\n\tcolor: \"var(--dsw-alias-label-primary)\",\r\n};\r\nexport const monoStyle: CSSProperties = { fontFamily: \"ui-monospace, SFMono-Regular, Menlo, Consolas, monospace\" };\r\nexport const snippetStyle: CSSProperties = {\r\n\t...monoStyle,\r\n\tdisplay: \"block\",\r\n\tfontSize: 12,\r\n\tlineHeight: \"18px\",\r\n\tpadding: \"10px 12px\",\r\n\tborderRadius: 8,\r\n\tborder: \"1px solid var(--dsw-alias-border-l2)\",\r\n\tbackground: \"var(--dsw-alias-bg-layer-1)\",\r\n\tcolor: \"var(--dsw-alias-label-primary)\",\r\n\toverflowWrap: \"anywhere\",\r\n\twhiteSpace: \"pre-wrap\",\r\n};\r\nexport const linkStyle: CSSProperties = { color: \"var(--dsw-alias-brand-primary)\", wordBreak: \"break-all\" };\r\nexport const listStyle: CSSProperties = {\r\n\tdisplay: \"flex\",\r\n\tflexDirection: \"column\",\r\n\tgap: 8,\r\n\tmargin: 0,\r\n\tpadding: 0,\r\n\tlistStyle: \"none\",\r\n};\r\nexport const checkRowStyle: CSSProperties = {\r\n\tdisplay: \"flex\",\r\n\talignItems: \"flex-start\",\r\n\tgap: 8,\r\n\tfontSize: 14,\r\n\tcolor: \"var(--dsw-alias-label-primary)\",\r\n};\r\nexport const inputStyle: CSSProperties = {\r\n\tboxSizing: \"border-box\",\r\n\twidth: \"100%\",\r\n\tminHeight: 34,\r\n\tpadding: \"6px 12px\",\r\n\tborder: \"1px solid var(--dsw-alias-border-l2)\",\r\n\tborderRadius: 8,\r\n\tbackground: \"var(--dsw-alias-bg-layer-1)\",\r\n\tcolor: \"var(--dsw-alias-label-primary)\",\r\n\tfont: \"inherit\",\r\n\tfontSize: 13,\r\n\ttransition: TRANSITION,\r\n};\r\nexport const nestedStyle: CSSProperties = {\r\n\tdisplay: \"flex\",\r\n\tflexDirection: \"column\",\r\n\tgap: 8,\r\n\tpadding: \"12px 14px\",\r\n\tborder: \"1px solid var(--dsw-alias-border-l2)\",\r\n\tborderRadius: 8,\r\n\tbackground: \"var(--dsw-alias-bg-layer-1)\",\r\n};\r\nexport const hintStyle: CSSProperties = { ...bodyStyle, fontSize: 13 };\r\nexport const visuallyHiddenStyle: CSSProperties = {\r\n\tposition: \"absolute\",\r\n\twidth: 1,\r\n\theight: 1,\r\n\tpadding: 0,\r\n\tmargin: -1,\r\n\toverflow: \"hidden\",\r\n\tclip: \"rect(0, 0, 0, 0)\",\r\n\twhiteSpace: \"nowrap\",\r\n\tborder: 0,\r\n};\r\nexport const segmentedNavStyle: CSSProperties = {\r\n\tdisplay: \"inline-flex\",\r\n\tflexWrap: \"wrap\",\r\n\tgap: 2,\r\n\tpadding: 3,\r\n\tborderRadius: 10,\r\n\tborder: \"1px solid var(--dsw-alias-border-l2)\",\r\n\tbackground: \"var(--dsw-alias-bg-layer-1)\",\r\n};\r\nexport const segmentedTabStyle: CSSProperties = {\r\n\t...buttonStyle,\r\n\tborder: \"none\",\r\n\tborderRadius: 8,\r\n\tboxShadow: \"none\",\r\n\tbackground: \"transparent\",\r\n\tminHeight: 32,\r\n\tpadding: \"5px 12px\",\r\n\tfontSize: 13,\r\n};\r\nexport const segmentedTabActiveStyle: CSSProperties = {\r\n\t...segmentedTabStyle,\r\n\tbackground: \"var(--dsw-alias-bg-module-platform)\",\r\n\tcolor: \"var(--dsw-alias-label-primary)\",\r\n\tboxShadow: \"0 1px 2px rgba(0, 0, 0, 0.12)\",\r\n\tfontWeight: 600,\r\n};\r\nexport const panelStyle: CSSProperties = {\r\n\tdisplay: \"flex\",\r\n\tflexDirection: \"column\",\r\n\tgap: 14,\r\n\tminWidth: 0,\r\n};\r\nexport const accountGridStyle: CSSProperties = {\r\n\tdisplay: \"grid\",\r\n\tgridTemplateColumns: \"repeat(auto-fill, minmax(min(320px, 100%), 1fr))\",\r\n\tgap: 14,\r\n};\r\nexport const copyRowStyle: CSSProperties = {\r\n\tdisplay: \"flex\",\r\n\talignItems: \"center\",\r\n\tjustifyContent: \"space-between\",\r\n\tflexWrap: \"wrap\",\r\n\tgap: 8,\r\n};\r\nexport const skeletonStyle: CSSProperties = {\r\n\t...cardStyle,\r\n\tminHeight: 88,\r\n\tbackground:\r\n\t\t\"linear-gradient(90deg, var(--dsw-alias-bg-layer-1) 0%, var(--dsw-alias-bg-module-platform) 50%, var(--dsw-alias-bg-layer-1) 100%)\",\r\n\tbackgroundSize: \"200% 100%\",\r\n\tanimation: \"dsh-coding-oauth-skeleton-pulse 1.4s ease-in-out infinite\",\r\n};\r\nexport const stepRowStyle: CSSProperties = {\r\n\tdisplay: \"flex\",\r\n\talignItems: \"flex-start\",\r\n\tgap: 10,\r\n\tfontSize: 14,\r\n\tcolor: \"var(--dsw-alias-label-secondary)\",\r\n};\r\nexport const stepActiveStyle: CSSProperties = {\r\n\t...stepRowStyle,\r\n\tcolor: \"var(--dsw-alias-label-primary)\",\r\n\tfontWeight: 500,\r\n};\r\nexport const stepNumberStyle: CSSProperties = {\r\n\tdisplay: \"inline-flex\",\r\n\talignItems: \"center\",\r\n\tjustifyContent: \"center\",\r\n\twidth: 22,\r\n\theight: 22,\r\n\tborderRadius: \"50%\",\r\n\tflex: \"0 0 auto\",\r\n\tfontSize: 12,\r\n\tfontWeight: 600,\r\n\tbackground: \"var(--dsw-alias-bg-layer-1)\",\r\n\tborder: \"1px solid var(--dsw-alias-border-l2)\",\r\n\tcolor: \"var(--dsw-alias-label-secondary)\",\r\n};\r\nexport const stepNumberActiveStyle: CSSProperties = {\r\n\t...stepNumberStyle,\r\n\tbackground: \"var(--dsw-alias-button-primary-fill)\",\r\n\tborderColor: \"var(--dsw-alias-button-primary-fill)\",\r\n\tcolor: \"var(--dsw-alias-label-primary-foreground)\",\r\n};\r\n\r\nexport type StatusTone = \"success\" | \"error\" | \"warning\" | \"info\" | \"neutral\";\r\n\r\nexport function statusToneColor(tone: StatusTone): string {\r\n\tswitch (tone) {\r\n\t\tcase \"success\":\r\n\t\t\treturn \"var(--dsw-alias-state-success-primary, #22a06b)\";\r\n\t\tcase \"error\":\r\n\t\t\treturn \"var(--dsw-alias-state-error-primary, #d92d20)\";\r\n\t\tcase \"warning\":\r\n\t\t\t// DSH token is `state-warn-*` (not `state-warning-*`).\r\n\t\t\treturn \"var(--dsw-alias-state-warn-primary, #e06c00)\";\r\n\t\tcase \"info\":\r\n\t\t\t// Accent/text color (not a solid fill + white text pair).\r\n\t\t\treturn \"var(--dsw-alias-brand-primary, #1677ff)\";\r\n\t\tdefault:\r\n\t\t\t// Prefer tertiary over dimmed: dimmed is near-invisible on light cards\r\n\t\t\t// and too dark on dark cards.\r\n\t\t\treturn \"var(--dsw-alias-label-tertiary, #81858c)\";\r\n\t}\r\n}\r\n\r\nexport function badgeStyle(tone: StatusTone): CSSProperties {\r\n\tconst color = statusToneColor(tone);\r\n\treturn {\r\n\t\tdisplay: \"inline-flex\",\r\n\t\talignItems: \"center\",\r\n\t\tgap: 6,\r\n\t\tpadding: \"3px 10px\",\r\n\t\tborderRadius: 999,\r\n\t\tfontSize: 12,\r\n\t\tfontWeight: 600,\r\n\t\tlineHeight: \"18px\",\r\n\t\tcolor,\r\n\t\tbackground: `color-mix(in srgb, ${color} 14%, transparent)`,\r\n\t\tborder: `1px solid color-mix(in srgb, ${color} 28%, transparent)`,\r\n\t\twhiteSpace: \"nowrap\",\r\n\t};\r\n}\r\n\r\nexport function dotStyle(\r\n\tstatus: ProviderStatus[\"status\"] | \"loading\" | \"available\" | \"unavailable\",\r\n\tinstalled = true,\r\n): CSSProperties {\r\n\tconst color = !installed\r\n\t\t? \"var(--dsw-alias-label-tertiary, #81858c)\"\r\n\t\t: status === \"signed-in\" || status === \"available\"\r\n\t\t\t? \"var(--dsw-alias-state-success-primary, #22a06b)\"\r\n\t\t\t: status === \"error\"\r\n\t\t\t\t? \"var(--dsw-alias-state-error-primary, #d92d20)\"\r\n\t\t\t\t: status === \"signing-in\" || status === \"loading\"\r\n\t\t\t\t\t? \"var(--dsw-alias-brand-primary, #1677ff)\"\r\n\t\t\t\t\t: \"var(--dsw-alias-label-tertiary, #81858c)\";\r\n\treturn { width: 9, height: 9, borderRadius: \"50%\", flex: \"0 0 auto\", background: color };\r\n}\r\n\r\nexport function providerStatusTone(status: ProviderStatus[\"status\"], installed = true): StatusTone {\r\n\tif (!installed) return \"neutral\";\r\n\tif (status === \"signed-in\") return \"success\";\r\n\tif (status === \"error\") return \"error\";\r\n\tif (status === \"signing-in\") return \"info\";\r\n\treturn \"neutral\";\r\n}\r\n", "/** About tab: terms, remote help, and plugin version. */\r\n\r\nimport { PLUGIN_VERSION } from \"../constants.ts\";\r\nimport { bodyStyle, cardStyle, hintStyle, linkStyle, titleStyle, warningStyle } from \"../styles.ts\";\r\nimport type { GrokBuildSettingsInjected } from \"../types.ts\";\r\n\r\nconst README_URL = \"https://github.com/lninghaha/dsh-coding-subscription-oauth#readme\";\r\n\r\nexport interface AboutTabProps {\r\n\tt: GrokBuildSettingsInjected[\"t\"];\r\n}\r\n\r\nexport function AboutTab({ t }: AboutTabProps) {\r\n\treturn (\r\n\t\t<section style={cardStyle} aria-labelledby=\"coding-oauth-about-title\">\r\n\t\t\t<h3 id=\"coding-oauth-about-title\" style={{ ...titleStyle, fontSize: 16 }}>\r\n\t\t\t\t{t(\"aboutTitle\")}\r\n\t\t\t</h3>\r\n\t\t\t<p style={{ ...warningStyle, marginTop: 12 }}>{t(\"termsWarning\")}</p>\r\n\t\t\t<p style={{ ...bodyStyle, marginTop: 12 }}>{t(\"remoteLoginHelp\")}</p>\r\n\t\t\t<p style={{ ...hintStyle, marginTop: 12 }}>{t(\"pluginVersion\", { version: PLUGIN_VERSION })}</p>\r\n\t\t\t<p style={{ ...hintStyle, marginTop: 8 }}>{t(\"aboutDocsHint\")}</p>\r\n\t\t\t<p style={{ marginTop: 8 }}>\r\n\t\t\t\t<a href={README_URL} target=\"_blank\" rel=\"noreferrer\" style={linkStyle}>\r\n\t\t\t\t\t{t(\"aboutDocsLink\")}\r\n\t\t\t\t</a>\r\n\t\t\t</p>\r\n\t\t</section>\r\n\t);\r\n}\r\n", "/** Accounts tab: provider cards, CLI tips, and pull preview. */\r\n\r\nimport { Fragment, useEffect, useRef } from \"react\";\r\nimport { PROVIDERS } from \"../constants.ts\";\r\nimport { allOfficialCliMissing, anyOfficialCliAvailable } from \"../display.ts\";\r\nimport {\r\n\taccountGridStyle,\r\n\tbodyStyle,\r\n\tcardStyle,\r\n\tdotStyle,\r\n\thintStyle,\r\n\tmonoStyle,\r\n\trowStyle,\r\n\tskeletonStyle,\r\n\tstatusStyle,\r\n\ttitleStyle,\r\n} from \"../styles.ts\";\r\nimport type {\r\n\tCodingOAuthStatus,\r\n\tGrokBuildSettingsInjected,\r\n\tLoginMethod,\r\n\tProviderSlug,\r\n\tSourcePreview,\r\n\tSourceStatus,\r\n\tUsageView,\r\n} from \"../types.ts\";\r\nimport { Badge } from \"./Badge.tsx\";\r\nimport { CliPullPreview } from \"./CliPullPreview.tsx\";\r\nimport { NoticeBanner } from \"./NoticeBanner.tsx\";\r\nimport { ProviderCard } from \"./ProviderCard.tsx\";\r\n\r\nexport interface AccountsTabProps {\r\n\tt: GrokBuildSettingsInjected[\"t\"];\r\n\tstatus: CodingOAuthStatus | undefined;\r\n\tremote: boolean;\r\n\tremoteTipDismissed: boolean;\r\n\tonDismissRemoteTip: () => void;\r\n\tsources: readonly SourceStatus[] | undefined;\r\n\tsourcesError: string | undefined;\r\n\tsourcesNotice: string | undefined;\r\n\tsourcesBusy: boolean;\r\n\tpreview: SourcePreview | undefined;\r\n\tconfirmOverwrite: boolean;\r\n\tbusyProvider: ProviderSlug | undefined;\r\n\tcodeInputs: Partial<Record<ProviderSlug, string>>;\r\n\tpopupBlocked: Partial<Record<ProviderSlug, boolean>>;\r\n\texpandedProviders: Partial<Record<ProviderSlug, boolean>>;\r\n\tshowUsage: boolean;\r\n\tusage: UsageView | undefined;\r\n\tusageError: string | undefined;\r\n\tusageLoading: boolean;\r\n\tonSignIn: (slug: ProviderSlug, method: LoginMethod) => void;\r\n\tonSignOut: (slug: ProviderSlug) => void;\r\n\tonCancelLogin: (slug: ProviderSlug) => void;\r\n\tonSubmitCode: (slug: ProviderSlug) => void;\r\n\tonCodeChange: (slug: ProviderSlug, value: string) => void;\r\n\tonToggleExpanded: (slug: ProviderSlug) => void;\r\n\tonPreviewSource: (slug: ProviderSlug) => void;\r\n\tonSaveModels: (slug: ProviderSlug, selected: string[]) => void;\r\n\tonConfirmOverwriteChange: (checked: boolean) => void;\r\n\tonCommitSource: () => void;\r\n\tonCancelSourcePreview: () => void;\r\n\tonRefreshSources: () => void;\r\n\tonDismissSourcesNotice: () => void;\r\n}\r\n\r\nexport function AccountsTab({\r\n\tt,\r\n\tstatus,\r\n\tremote,\r\n\tremoteTipDismissed,\r\n\tonDismissRemoteTip,\r\n\tsources,\r\n\tsourcesError,\r\n\tsourcesNotice,\r\n\tsourcesBusy,\r\n\tpreview,\r\n\tconfirmOverwrite,\r\n\tbusyProvider,\r\n\tcodeInputs,\r\n\tpopupBlocked,\r\n\texpandedProviders,\r\n\tshowUsage,\r\n\tusage,\r\n\tusageError,\r\n\tusageLoading,\r\n\tonSignIn,\r\n\tonSignOut,\r\n\tonCancelLogin,\r\n\tonSubmitCode,\r\n\tonCodeChange,\r\n\tonToggleExpanded,\r\n\tonPreviewSource,\r\n\tonSaveModels,\r\n\tonConfirmOverwriteChange,\r\n\tonCommitSource,\r\n\tonCancelSourcePreview,\r\n\tonRefreshSources,\r\n\tonDismissSourcesNotice,\r\n}: AccountsTabProps) {\r\n\tconst previousPreviewKind = useRef<ProviderSlug | undefined>(undefined);\r\n\tuseEffect(() => {\r\n\t\tif (preview !== undefined) {\r\n\t\t\tpreviousPreviewKind.current = preview.kind;\r\n\t\t\tdocument.getElementById(`coding-oauth-source-preview-${preview.kind}`)?.focus();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst trigger = previousPreviewKind.current;\r\n\t\tif (trigger === undefined || sourcesBusy) return;\r\n\t\tpreviousPreviewKind.current = undefined;\r\n\t\tdocument.getElementById(`coding-oauth-source-pull-${trigger}`)?.focus();\r\n\t}, [preview, sourcesBusy]);\r\n\r\n\tif (status === undefined) {\r\n\t\treturn (\r\n\t\t\t<div style={skeletonStyle} role=\"status\" aria-busy=\"true\">\r\n\t\t\t\t<div style={statusStyle}>\r\n\t\t\t\t\t<span aria-hidden=\"true\" style={dotStyle(\"loading\")} />\r\n\t\t\t\t\t{t(\"loadingAccount\")}\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t);\r\n\t}\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t{remote && !remoteTipDismissed ? (\r\n\t\t\t\t<NoticeBanner\r\n\t\t\t\t\tmessage={t(\"remoteAccountsTip\")}\r\n\t\t\t\t\tdismissLabel={t(\"remoteTipDismiss\")}\r\n\t\t\t\t\tonDismiss={onDismissRemoteTip}\r\n\t\t\t\t/>\r\n\t\t\t) : null}\r\n\t\t\t{allOfficialCliMissing(sources) ? (\r\n\t\t\t\t<NoticeBanner\r\n\t\t\t\t\tmessage={t(\"sourcesAllMissingHint\")}\r\n\t\t\t\t\tdismissLabel={t(\"sourcesCheckAgain\")}\r\n\t\t\t\t\tonDismiss={() => {\r\n\t\t\t\t\t\tonRefreshSources();\r\n\t\t\t\t\t}}\r\n\t\t\t\t/>\r\n\t\t\t) : null}\r\n\t\t\t{anyOfficialCliAvailable(sources) ? <p style={hintStyle}>{t(\"sourcesAvailableHint\")}</p> : null}\r\n\t\t\t{sourcesError === undefined ? null : (\r\n\t\t\t\t<p style={{ ...bodyStyle, color: \"var(--dsw-alias-state-error-primary)\" }} role=\"alert\">\r\n\t\t\t\t\t{sourcesError}\r\n\t\t\t\t</p>\r\n\t\t\t)}\r\n\t\t\t{sourcesNotice === undefined ? null : (\r\n\t\t\t\t<NoticeBanner\r\n\t\t\t\t\tkey={sourcesNotice}\r\n\t\t\t\t\tmessage={sourcesNotice}\r\n\t\t\t\t\ttone=\"success\"\r\n\t\t\t\t\tautoHideMs={5000}\r\n\t\t\t\t\tonDismiss={onDismissSourcesNotice}\r\n\t\t\t\t/>\r\n\t\t\t)}\r\n\t\t\t<div style={accountGridStyle}>\r\n\t\t\t\t{PROVIDERS.map((definition) => {\r\n\t\t\t\t\tconst providerStatus = status.providers[definition.slug];\r\n\t\t\t\t\tconst expanded = providerStatus.status === \"signing-in\" || expandedProviders[definition.slug] === true;\r\n\t\t\t\t\treturn (\r\n\t\t\t\t\t\t<Fragment key={definition.slug}>\r\n\t\t\t\t\t\t\t<ProviderCard\r\n\t\t\t\t\t\t\t\tt={t}\r\n\t\t\t\t\t\t\t\tdefinition={definition}\r\n\t\t\t\t\t\t\t\tproviderStatus={providerStatus}\r\n\t\t\t\t\t\t\t\tbusy={busyProvider === definition.slug}\r\n\t\t\t\t\t\t\t\tsourcesBusy={sourcesBusy}\r\n\t\t\t\t\t\t\t\tremote={remote}\r\n\t\t\t\t\t\t\t\tcodeInput={codeInputs[definition.slug] ?? \"\"}\r\n\t\t\t\t\t\t\t\tpopupBlocked={popupBlocked[definition.slug] === true}\r\n\t\t\t\t\t\t\t\texpanded={expanded}\r\n\t\t\t\t\t\t\t\tsource={sources?.find((entry) => entry.kind === definition.slug)}\r\n\t\t\t\t\t\t\t\tshowUsage={showUsage}\r\n\t\t\t\t\t\t\t\tusage={usage}\r\n\t\t\t\t\t\t\t\tusageError={usageError}\r\n\t\t\t\t\t\t\t\tusageLoading={usageLoading}\r\n\t\t\t\t\t\t\t\tonSignIn={(method) => {\r\n\t\t\t\t\t\t\t\t\tonSignIn(definition.slug, method);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\tonSignOut={() => {\r\n\t\t\t\t\t\t\t\t\tonSignOut(definition.slug);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\tonCancelLogin={() => {\r\n\t\t\t\t\t\t\t\t\tonCancelLogin(definition.slug);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\tonSubmitCode={() => {\r\n\t\t\t\t\t\t\t\t\tonSubmitCode(definition.slug);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\tonCodeChange={(value) => {\r\n\t\t\t\t\t\t\t\t\tonCodeChange(definition.slug, value);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\tonToggleExpanded={() => {\r\n\t\t\t\t\t\t\t\t\tonToggleExpanded(definition.slug);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\tonPreviewSource={() => {\r\n\t\t\t\t\t\t\t\t\tonPreviewSource(definition.slug);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\tonSaveModels={(selected) => {\r\n\t\t\t\t\t\t\t\t\tonSaveModels(definition.slug, selected);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t{preview?.kind === definition.slug ? (\r\n\t\t\t\t\t\t\t\t<div style={{ gridColumn: \"1 / -1\", minWidth: 0 }}>\r\n\t\t\t\t\t\t\t\t\t<CliPullPreview\r\n\t\t\t\t\t\t\t\t\t\tt={t}\r\n\t\t\t\t\t\t\t\t\t\tpreview={preview}\r\n\t\t\t\t\t\t\t\t\t\tconfirmOverwrite={confirmOverwrite}\r\n\t\t\t\t\t\t\t\t\t\tsourcesBusy={sourcesBusy}\r\n\t\t\t\t\t\t\t\t\t\tonConfirmOverwriteChange={onConfirmOverwriteChange}\r\n\t\t\t\t\t\t\t\t\t\tonCommit={onCommitSource}\r\n\t\t\t\t\t\t\t\t\t\tonCancel={onCancelSourcePreview}\r\n\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t) : null}\r\n\t\t\t\t\t\t</Fragment>\r\n\t\t\t\t\t);\r\n\t\t\t\t})}\r\n\t\t\t\t<div style={cardStyle}>\r\n\t\t\t\t\t<div style={rowStyle}>\r\n\t\t\t\t\t\t<div>\r\n\t\t\t\t\t\t\t<h3 style={{ ...titleStyle, fontSize: 16 }}>{t(\"antigravityTitle\")}</h3>\r\n\t\t\t\t\t\t\t<p style={{ ...bodyStyle, marginTop: 4 }}>{t(\"antigravityDescription\")}</p>\r\n\t\t\t\t\t\t\t<p style={{ ...bodyStyle, marginTop: 4 }}>\r\n\t\t\t\t\t\t\t\t<span style={monoStyle}>{status.antigravity.route}</span>\r\n\t\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t<Badge\r\n\t\t\t\t\t\t\tlabel={status.antigravity.installed ? t(\"antigravityInstalled\") : t(\"antigravityMissing\")}\r\n\t\t\t\t\t\t\ttone={status.antigravity.installed ? \"success\" : \"neutral\"}\r\n\t\t\t\t\t\t\tinstalled={status.antigravity.installed}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<p style={bodyStyle}>{t(\"antigravityCliHint\")}</p>\r\n\t\t\t\t\t<code style={{ ...monoStyle, fontSize: 12, overflowWrap: \"anywhere\" }}>{t(\"antigravityCliCommand\")}</code>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</>\r\n\t);\r\n}\r\n", "/** Pure display helpers for remote UX and CLI pull noise control. */\r\n\r\nimport type { GrokBuildSettingsInjected, LoginMethod, ProviderCardDefinition, SourceStatus } from \"./types.ts\";\r\n\r\nconst LOOPBACK_HOSTS = new Set([\"localhost\", \"127.0.0.1\", \"[::1]\", \"::1\"]);\r\n\r\n/** True when the Settings page is served from a non-loopback host (typical remote DSH). */\r\nexport function isLikelyRemoteHost(hostname: string): boolean {\r\n\tconst normalized = hostname.trim().toLowerCase();\r\n\tif (normalized.length === 0) return false;\r\n\tif (LOOPBACK_HOSTS.has(normalized)) return false;\r\n\tif (normalized.endsWith(\".localhost\")) return false;\r\n\treturn true;\r\n}\r\n\r\nexport function preferredLoginMethod(definition: ProviderCardDefinition, remote: boolean): LoginMethod {\r\n\tif (\r\n\t\tremote &&\r\n\t\tdefinition.remoteRecommended !== undefined &&\r\n\t\tdefinition.methods.includes(definition.remoteRecommended)\r\n\t) {\r\n\t\treturn definition.remoteRecommended;\r\n\t}\r\n\treturn definition.recommended;\r\n}\r\n\r\n/** Put the recommended method first so the primary CTA is unambiguous. */\r\nexport function orderedLoginMethods(definition: ProviderCardDefinition, remote: boolean): LoginMethod[] {\r\n\tconst preferred = preferredLoginMethod(definition, remote);\r\n\tconst rest = definition.methods.filter((method) => method !== preferred);\r\n\treturn definition.methods.includes(preferred) ? [preferred, ...rest] : [...definition.methods];\r\n}\r\n\r\n/** Per-card CLI \u201Cmissing\u201D copy is noisy on remote hosts; keep only actionable reasons. */\r\nexport function shouldShowPerCardSourceReason(source: SourceStatus | undefined): boolean {\r\n\tif (source === undefined || source.available) return false;\r\n\tif (source.reason === undefined) return false;\r\n\treturn source.reason !== \"missing\";\r\n}\r\n\r\nexport function allOfficialCliMissing(sources: readonly SourceStatus[] | undefined): boolean {\r\n\tif (sources === undefined || sources.length === 0) return false;\r\n\treturn sources.every((source) => !source.available && (source.reason === undefined || source.reason === \"missing\"));\r\n}\r\n\r\nexport function anyOfficialCliAvailable(sources: readonly SourceStatus[] | undefined): boolean {\r\n\treturn sources?.some((source) => source.available) === true;\r\n}\r\n\r\nexport function methodLabel(\r\n\tmethod: LoginMethod,\r\n\tt: GrokBuildSettingsInjected[\"t\"],\r\n\toptions?: { remote?: boolean; primary?: boolean },\r\n): string {\r\n\tif (method === \"device\") {\r\n\t\tif (options?.remote === true && options.primary === true) return t(\"deviceLoginRemote\");\r\n\t\treturn t(\"deviceLogin\");\r\n\t}\r\n\tif (method === \"browser\") return t(\"browserLogin\");\r\n\treturn t(\"pkceLogin\");\r\n}\r\n", "/** Status capsule badge with semantic tone colors. */\r\n\r\nimport { badgeStyle, dotStyle, providerStatusTone, type StatusTone } from \"../styles.ts\";\r\nimport type { ProviderStatus } from \"../types.ts\";\r\n\r\nexport interface BadgeProps {\r\n\tlabel: string;\r\n\ttone?: StatusTone;\r\n\t/** When set, derives tone from provider login status. */\r\n\tproviderStatus?: ProviderStatus[\"status\"];\r\n\tinstalled?: boolean;\r\n\tshowDot?: boolean;\r\n}\r\n\r\nexport function Badge({ label, tone, providerStatus, installed = true, showDot = true }: BadgeProps) {\r\n\tconst resolvedTone =\r\n\t\ttone ?? (providerStatus !== undefined ? providerStatusTone(providerStatus, installed) : \"neutral\");\r\n\treturn (\r\n\t\t<span style={badgeStyle(resolvedTone)} role=\"status\">\r\n\t\t\t{showDot ? (\r\n\t\t\t\t<span\r\n\t\t\t\t\taria-hidden=\"true\"\r\n\t\t\t\t\tstyle={{\r\n\t\t\t\t\t\t...dotStyle(providerStatus ?? (resolvedTone === \"success\" ? \"signed-in\" : \"signed-out\"), installed),\r\n\t\t\t\t\t\twidth: 7,\r\n\t\t\t\t\t\theight: 7,\r\n\t\t\t\t\t}}\r\n\t\t\t\t/>\r\n\t\t\t) : null}\r\n\t\t\t<span>{label}</span>\r\n\t\t</span>\r\n\t);\r\n}\r\n", "/** Response parsers and small formatting helpers for the settings UI. */\r\n\r\nimport { isRecord } from \"./api.ts\";\r\nimport {\r\n\tGATEWAY_PORT_MAX,\r\n\tGATEWAY_PORT_MIN,\r\n\tGATEWAY_RANDOM_PORT_MAX,\r\n\tGATEWAY_RANDOM_PORT_MIN,\r\n\tGATEWAY_RANDOM_RESERVED,\r\n\tHOUR_MS,\r\n\tIMAGINE_SOURCE_KEY,\r\n\tSOURCE_COMMIT_ACTIONS,\r\n\tSOURCE_CONFLICTS,\r\n\tSOURCE_DEFAULT_PATH,\r\n\tSOURCE_KINDS,\r\n\tSOURCE_PREVIEW_ACTIONS,\r\n\tSOURCE_REASONS,\r\n} from \"./constants.ts\";\r\nimport type {\r\n\tCapabilitySettingsView,\r\n\tCapabilitySnapshot,\r\n\tGatewayView,\r\n\tGrokBuildSettingsInjected,\r\n\tImagineCredentialView,\r\n\tProviderStatus,\r\n\tSourceCommitAction,\r\n\tSourceConflict,\r\n\tSourceKind,\r\n\tSourcePreview,\r\n\tSourcePreviewAction,\r\n\tSourceReason,\r\n\tSourceStatus,\r\n\tUsageLimitView,\r\n\tUsageView,\r\n\tUsageWindowView,\r\n} from \"./types.ts\";\r\n\r\nexport function optionalString(value: unknown): string | undefined {\r\n\treturn typeof value === \"string\" && value.length > 0 && value.length < 500 ? value : undefined;\r\n}\r\n\r\nexport function optionalFiniteNumber(value: unknown): number | undefined {\r\n\treturn typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\r\n}\r\n\r\nexport function optionalBoolean(value: unknown): boolean | undefined {\r\n\treturn typeof value === \"boolean\" ? value : undefined;\r\n}\r\n\r\nexport function optionalPercent(value: unknown): number | undefined {\r\n\tconst numeric = optionalFiniteNumber(value);\r\n\treturn numeric !== undefined && numeric >= 0 && numeric <= 100 ? numeric : undefined;\r\n}\r\n\r\nexport function isSourceKind(value: string): value is SourceKind {\r\n\treturn (SOURCE_KINDS as readonly string[]).includes(value);\r\n}\r\n\r\nexport function isSourceReason(value: string): value is SourceReason {\r\n\treturn (SOURCE_REASONS as readonly string[]).includes(value);\r\n}\r\n\r\nexport function isSourceConflict(value: string): value is SourceConflict {\r\n\treturn (SOURCE_CONFLICTS as readonly string[]).includes(value);\r\n}\r\n\r\nexport function isSourcePreviewAction(value: string): value is SourcePreviewAction {\r\n\treturn (SOURCE_PREVIEW_ACTIONS as readonly string[]).includes(value);\r\n}\r\n\r\nexport function isSourceCommitAction(value: string): value is SourceCommitAction {\r\n\treturn (SOURCE_COMMIT_ACTIONS as readonly string[]).includes(value);\r\n}\r\n\r\nexport function looksSecret(value: string): boolean {\r\n\treturn /eyJ[A-Za-z0-9_-]+\\.|sk-[A-Za-z0-9_-]{8,}|Bearer\\s+\\S+/u.test(value);\r\n}\r\n\r\nexport function safeDisplayPath(value: unknown, kind: SourceKind): string {\r\n\tconst text = optionalString(value);\r\n\tif (text === undefined || looksSecret(text) || text.length > 180) return SOURCE_DEFAULT_PATH[kind];\r\n\treturn text;\r\n}\r\n\r\nexport function safeWarning(value: unknown): string | undefined {\r\n\tconst text = optionalString(value);\r\n\tif (text === undefined || looksSecret(text)) return undefined;\r\n\treturn text;\r\n}\r\n\r\nexport function formatEpoch(value: number | undefined): string | undefined {\r\n\tif (value === undefined || !Number.isFinite(value) || value <= 0) return undefined;\r\n\tconst ms = value > 1e12 ? value : value > 1e9 ? value * 1000 : undefined;\r\n\tif (ms === undefined) return undefined;\r\n\tconst formatted = new Date(ms).toLocaleString();\r\n\treturn formatted.length > 0 ? formatted : undefined;\r\n}\r\n\r\nexport function parseSource(value: unknown): SourceStatus | undefined {\r\n\tif (!isRecord(value) || typeof value[\"kind\"] !== \"string\" || !isSourceKind(value[\"kind\"])) return undefined;\r\n\tconst kind = value[\"kind\"];\r\n\tconst reasonRaw = optionalString(value[\"reason\"]);\r\n\tconst expiresAt = optionalFiniteNumber(value[\"expiresAt\"]);\r\n\treturn {\r\n\t\tkind,\r\n\t\tdisplayPath: safeDisplayPath(value[\"displayPath\"], kind),\r\n\t\tavailable: value[\"available\"] === true,\r\n\t\t...(expiresAt === undefined ? {} : { expiresAt }),\r\n\t\t...(reasonRaw !== undefined && isSourceReason(reasonRaw) ? { reason: reasonRaw } : {}),\r\n\t};\r\n}\r\n\r\nexport function mergeSources(discovered: readonly SourceStatus[]): SourceStatus[] {\r\n\treturn SOURCE_KINDS.map((kind) => {\r\n\t\tconst found = discovered.find((entry) => entry.kind === kind);\r\n\t\treturn found ?? { kind, displayPath: SOURCE_DEFAULT_PATH[kind], available: false, reason: \"missing\" };\r\n\t});\r\n}\r\n\r\nexport function parseSources(value: unknown): SourceStatus[] {\r\n\tconst rows = Array.isArray(value)\r\n\t\t? value\r\n\t\t: isRecord(value) && Array.isArray(value[\"sources\"])\r\n\t\t\t? value[\"sources\"]\r\n\t\t\t: [];\r\n\treturn mergeSources(rows.map(parseSource).filter((entry): entry is SourceStatus => entry !== undefined));\r\n}\r\n\r\nexport function parsePreview(value: unknown): SourcePreview | undefined {\r\n\tif (!isRecord(value)) return undefined;\r\n\tconst previewId = optionalString(value[\"previewId\"]);\r\n\tconst kindRaw = optionalString(value[\"kind\"]);\r\n\tif (previewId === undefined || kindRaw === undefined || !isSourceKind(kindRaw)) return undefined;\r\n\tconst conflictRaw = optionalString(value[\"conflict\"]);\r\n\tconst actionRaw = optionalString(value[\"action\"]);\r\n\tconst expiresAt = optionalFiniteNumber(value[\"expiresAt\"]);\r\n\tconst ticketExpiresAt = optionalFiniteNumber(value[\"ticketExpiresAt\"]);\r\n\tconst warnings = Array.isArray(value[\"warnings\"])\r\n\t\t? value[\"warnings\"].map(safeWarning).filter((entry): entry is string => entry !== undefined)\r\n\t\t: [];\r\n\treturn {\r\n\t\tpreviewId,\r\n\t\tkind: kindRaw,\r\n\t\tdisplayPath: safeDisplayPath(value[\"displayPath\"], kindRaw),\r\n\t\tconfirmOverwriteRequired: value[\"confirmOverwriteRequired\"] === true,\r\n\t\twarnings,\r\n\t\t...(expiresAt === undefined ? {} : { expiresAt }),\r\n\t\t...(ticketExpiresAt === undefined ? {} : { ticketExpiresAt }),\r\n\t\t...(conflictRaw !== undefined && isSourceConflict(conflictRaw) ? { conflict: conflictRaw } : {}),\r\n\t\t...(actionRaw !== undefined && isSourcePreviewAction(actionRaw) ? { action: actionRaw } : {}),\r\n\t};\r\n}\r\n\r\nexport function parseCommitAction(value: unknown): SourceCommitAction | undefined {\r\n\tif (!isRecord(value)) return undefined;\r\n\tconst action = optionalString(value[\"action\"]);\r\n\treturn action !== undefined && isSourceCommitAction(action) ? action : undefined;\r\n}\r\n\r\nexport function boundedInteger(value: unknown, min: number, max: number, fallback: number): number {\r\n\tconst numeric = optionalFiniteNumber(value);\r\n\treturn numeric !== undefined && Number.isInteger(numeric) && numeric >= min && numeric <= max ? numeric : fallback;\r\n}\r\n\r\nexport function emptyCapabilitySettings(): CapabilitySettingsView {\r\n\treturn {\r\n\t\tcodexSearch: false,\r\n\t\tcodexImages: false,\r\n\t\tcodexImageEdits: false,\r\n\t\tcodexUsage: false,\r\n\t\tcodexFast: false,\r\n\t\tgrokImagineImage: false,\r\n\t\tgrokImagineVideo: false,\r\n\t\tsearchResults: 5,\r\n\t\timageCount: 1,\r\n\t\tvideoArtifactTtlMs: 7 * 24 * HOUR_MS,\r\n\t};\r\n}\r\n\r\nexport function parseCapabilitySettings(value: unknown): CapabilitySettingsView {\r\n\tconst source = isRecord(value) ? value : {};\r\n\treturn {\r\n\t\tcodexSearch: source[\"codexSearch\"] === true,\r\n\t\tcodexImages: source[\"codexImages\"] === true,\r\n\t\tcodexImageEdits: source[\"codexImageEdits\"] === true,\r\n\t\tcodexUsage: source[\"codexUsage\"] === true,\r\n\t\tcodexFast: source[\"codexFast\"] === true,\r\n\t\tgrokImagineImage: source[\"grokImagineImage\"] === true,\r\n\t\tgrokImagineVideo: source[\"grokImagineVideo\"] === true,\r\n\t\tsearchResults: boundedInteger(source[\"searchResults\"], 1, 20, 5),\r\n\t\timageCount: boundedInteger(source[\"imageCount\"], 1, 4, 1),\r\n\t\tvideoArtifactTtlMs: boundedInteger(source[\"videoArtifactTtlMs\"], HOUR_MS, 7 * 24 * HOUR_MS, 7 * 24 * HOUR_MS),\r\n\t};\r\n}\r\n\r\nexport function parseCapabilities(value: unknown): CapabilitySnapshot | undefined {\r\n\tif (!isRecord(value)) return undefined;\r\n\tconst nested = isRecord(value[\"value\"]) ? value[\"value\"] : value;\r\n\tconst revision = optionalFiniteNumber(value[\"revision\"]);\r\n\tif (revision === undefined && !isRecord(value[\"value\"]) && value[\"writable\"] === undefined) return undefined;\r\n\treturn {\r\n\t\tvalue: parseCapabilitySettings(nested),\r\n\t\trevision: revision ?? 0,\r\n\t\twritable: value[\"writable\"] === true,\r\n\t};\r\n}\r\n\r\nfunction parseUsageWindow(value: unknown): UsageWindowView | undefined {\r\n\tif (!isRecord(value)) return undefined;\r\n\tconst usedPercent = optionalPercent(value[\"usedPercent\"] ?? value[\"used_percent\"]);\r\n\tconst remainingPercent = optionalPercent(value[\"remainingPercent\"] ?? value[\"remaining_percent\"]);\r\n\tconst windowSeconds = optionalFiniteNumber(value[\"windowSeconds\"] ?? value[\"limit_window_seconds\"]);\r\n\tconst resetsAt = optionalFiniteNumber(value[\"resetsAt\"] ?? value[\"reset_at\"]);\r\n\tif (\r\n\t\tusedPercent === undefined &&\r\n\t\tremainingPercent === undefined &&\r\n\t\twindowSeconds === undefined &&\r\n\t\tresetsAt === undefined\r\n\t) {\r\n\t\treturn undefined;\r\n\t}\r\n\treturn {\r\n\t\t...(usedPercent === undefined ? {} : { usedPercent }),\r\n\t\t...(remainingPercent === undefined ? {} : { remainingPercent }),\r\n\t\t...(windowSeconds !== undefined && windowSeconds > 0 ? { windowSeconds } : {}),\r\n\t\t...(resetsAt === undefined ? {} : { resetsAt }),\r\n\t};\r\n}\r\n\r\nfunction parseUsageLimit(value: unknown, fallbackId: string): UsageLimitView | undefined {\r\n\tif (!isRecord(value)) return undefined;\r\n\tconst id = optionalString(value[\"id\"]) ?? optionalString(value[\"metered_feature\"]) ?? fallbackId;\r\n\tconst name = optionalString(value[\"name\"]) ?? optionalString(value[\"limit_name\"]);\r\n\tconst nested = isRecord(value[\"rate_limit\"]) ? value[\"rate_limit\"] : value;\r\n\tconst windows = Array.isArray(value[\"windows\"])\r\n\t\t? value[\"windows\"].map(parseUsageWindow).filter((entry): entry is UsageWindowView => entry !== undefined)\r\n\t\t: [\r\n\t\t\t\tparseUsageWindow(nested[\"primary_window\"]),\r\n\t\t\t\tparseUsageWindow(nested[\"secondary_window\"]),\r\n\t\t\t\tparseUsageWindow(nested),\r\n\t\t\t].filter((entry): entry is UsageWindowView => entry !== undefined);\r\n\tif (windows.length === 0 && name === undefined && optionalString(value[\"id\"]) === undefined) return undefined;\r\n\treturn { id, windows, ...(name === undefined ? {} : { name }) };\r\n}\r\n\r\nexport function parseUsage(value: unknown): UsageView | undefined {\r\n\tif (!isRecord(value)) return undefined;\r\n\tconst payload = isRecord(value[\"usage\"]) ? value[\"usage\"] : value;\r\n\tconst rateLimits: UsageLimitView[] = [];\r\n\tconst seen = new Set<string>();\r\n\tconst add = (limit: UsageLimitView | undefined): void => {\r\n\t\tif (limit === undefined || seen.has(limit.id)) return;\r\n\t\tseen.add(limit.id);\r\n\t\trateLimits.push(limit);\r\n\t};\r\n\tif (Array.isArray(payload[\"rateLimits\"])) {\r\n\t\tpayload[\"rateLimits\"].forEach((entry, index) => add(parseUsageLimit(entry, `limit-${String(index)}`)));\r\n\t} else {\r\n\t\tadd(parseUsageLimit(payload[\"rate_limit\"], \"codex\"));\r\n\t\tif (Array.isArray(payload[\"additional_rate_limits\"])) {\r\n\t\t\tpayload[\"additional_rate_limits\"].forEach((entry, index) =>\r\n\t\t\t\tadd(parseUsageLimit(entry, `extra-${String(index)}`)),\r\n\t\t\t);\r\n\t\t}\r\n\t\tadd(parseUsageLimit(payload[\"code_review_rate_limit\"], \"code_review\"));\r\n\t}\r\n\tconst credits = isRecord(payload[\"credits\"]) ? payload[\"credits\"] : undefined;\r\n\tconst spend = isRecord(payload[\"individualLimit\"])\r\n\t\t? payload[\"individualLimit\"]\r\n\t\t: isRecord(payload[\"spend_control\"])\r\n\t\t\t? isRecord(payload[\"spend_control\"][\"individual_limit\"])\r\n\t\t\t\t? payload[\"spend_control\"][\"individual_limit\"]\r\n\t\t\t\t: payload[\"spend_control\"]\r\n\t\t\t: undefined;\r\n\tconst resetRaw = isRecord(payload[\"resetCredits\"])\r\n\t\t? payload[\"resetCredits\"][\"availableCount\"]\r\n\t\t: isRecord(payload[\"rate_limit_reset_credits\"])\r\n\t\t\t? payload[\"rate_limit_reset_credits\"][\"available_count\"]\r\n\t\t\t: undefined;\r\n\tconst resetCredits = optionalFiniteNumber(resetRaw);\r\n\tconst fetchedAt = optionalFiniteNumber(payload[\"fetchedAt\"]);\r\n\tconst spendControlReached =\r\n\t\toptionalBoolean(payload[\"spendControlReached\"]) ??\r\n\t\t(isRecord(payload[\"spend_control\"]) ? optionalBoolean(payload[\"spend_control\"][\"reached\"]) : undefined);\r\n\tconst creditsBalance = credits === undefined ? undefined : optionalString(credits[\"balance\"]);\r\n\tconst individualLimit = spend === undefined ? undefined : optionalString(spend[\"limit\"]);\r\n\tconst individualUsed = spend === undefined ? undefined : optionalString(spend[\"used\"]);\r\n\tconst individualRemaining = spend === undefined ? undefined : optionalString(spend[\"remaining\"]);\r\n\tconst individualRemainingPercent =\r\n\t\tspend === undefined ? undefined : optionalPercent(spend[\"remainingPercent\"] ?? spend[\"remaining_percent\"]);\r\n\tconst individualResetsAt =\r\n\t\tspend === undefined ? undefined : optionalFiniteNumber(spend[\"resetsAt\"] ?? spend[\"reset_at\"]);\r\n\treturn {\r\n\t\trateLimits,\r\n\t\t...(credits !== undefined && typeof credits[\"unlimited\"] === \"boolean\"\r\n\t\t\t? { creditsUnlimited: credits[\"unlimited\"] }\r\n\t\t\t: {}),\r\n\t\t...(creditsBalance === undefined ? {} : { creditsBalance }),\r\n\t\t...(individualLimit === undefined ? {} : { individualLimit }),\r\n\t\t...(individualUsed === undefined ? {} : { individualUsed }),\r\n\t\t...(individualRemaining === undefined ? {} : { individualRemaining }),\r\n\t\t...(individualRemainingPercent === undefined ? {} : { individualRemainingPercent }),\r\n\t\t...(individualResetsAt === undefined ? {} : { individualResetsAt }),\r\n\t\t...(spendControlReached === undefined ? {} : { spendControlReached }),\r\n\t\t...(resetCredits !== undefined && resetCredits >= 0 && Number.isSafeInteger(resetCredits) ? { resetCredits } : {}),\r\n\t\t...(fetchedAt === undefined ? {} : { fetchedAt }),\r\n\t};\r\n}\r\n\r\nexport function usageHasVisibleFields(usage: UsageView): boolean {\r\n\treturn (\r\n\t\tusage.rateLimits.some((limit) => limit.windows.length > 0 || limit.name !== undefined) ||\r\n\t\tusage.creditsUnlimited !== undefined ||\r\n\t\tusage.creditsBalance !== undefined ||\r\n\t\tusage.individualLimit !== undefined ||\r\n\t\tusage.individualUsed !== undefined ||\r\n\t\tusage.individualRemaining !== undefined ||\r\n\t\tusage.individualRemainingPercent !== undefined ||\r\n\t\tusage.spendControlReached === true ||\r\n\t\tusage.resetCredits !== undefined\r\n\t);\r\n}\r\n\r\nexport function parseGateway(value: unknown): GatewayView | undefined {\r\n\tif (!isRecord(value)) return undefined;\r\n\tconst bind = optionalString(value[\"bind\"]);\r\n\tconst port = optionalFiniteNumber(value[\"port\"]);\r\n\tif (bind === undefined || port === undefined) return undefined;\r\n\tconst models = Array.isArray(value[\"models\"])\r\n\t\t? value[\"models\"].filter((model): model is string => typeof model === \"string\" && model.length > 0)\r\n\t\t: [];\r\n\tconst model = optionalString(value[\"model\"]) ?? models[0] ?? null;\r\n\tif (models.length === 0 && model !== null) models.push(model);\r\n\tconst keyAvailable = value[\"keyAvailable\"] === true || value[\"keyConfigured\"] === true;\r\n\treturn {\r\n\t\tenabled: value[\"enabled\"] === true,\r\n\t\trunning: value[\"running\"] === true,\r\n\t\tbind,\r\n\t\tport,\r\n\t\tmodel,\r\n\t\tkeyConfigured: keyAvailable,\r\n\t\tkeyAvailable,\r\n\t\tkeyHint: optionalString(value[\"keyHint\"]) ?? \"\",\r\n\t\tmodels,\r\n\t\twarning: optionalString(value[\"warning\"]) ?? \"\",\r\n\t};\r\n}\r\n\r\nexport function formatGatewayBaseUrl(bind: string, port: number): string {\r\n\tconst host = bind.includes(\":\") && !bind.startsWith(\"[\") ? `[${bind}]` : bind;\r\n\treturn `http://${host}:${String(port)}`;\r\n}\r\n\r\nexport function randomGatewayPort(exclude?: number): number {\r\n\tfor (let attempt = 0; attempt < 32; attempt += 1) {\r\n\t\tconst span = GATEWAY_RANDOM_PORT_MAX - GATEWAY_RANDOM_PORT_MIN + 1;\r\n\t\tconst candidate = GATEWAY_RANDOM_PORT_MIN + Math.floor(Math.random() * span);\r\n\t\tif (candidate !== exclude && !GATEWAY_RANDOM_RESERVED.has(candidate)) return candidate;\r\n\t}\r\n\treturn exclude === GATEWAY_RANDOM_PORT_MIN ? GATEWAY_RANDOM_PORT_MIN + 1 : GATEWAY_RANDOM_PORT_MIN;\r\n}\r\n\r\nexport function parseGatewayPort(value: string): number | undefined {\r\n\tconst port = Number(value);\r\n\tif (!Number.isInteger(port) || port < GATEWAY_PORT_MIN || port > GATEWAY_PORT_MAX) return undefined;\r\n\treturn port;\r\n}\r\n\r\nexport function parseImagineCredential(value: unknown): ImagineCredentialView | undefined {\r\n\tif (!isRecord(value)) return undefined;\r\n\tconst configured = optionalBoolean(value[\"configured\"]);\r\n\tif (configured === undefined && value[\"source\"] === undefined && value[\"writable\"] === undefined) return undefined;\r\n\tconst source = optionalString(value[\"source\"]);\r\n\tconst writable = optionalBoolean(value[\"writable\"]);\r\n\treturn {\r\n\t\tconfigured: configured === true,\r\n\t\t...(source === undefined || looksSecret(source) ? {} : { source }),\r\n\t\t...(writable === undefined ? {} : { writable }),\r\n\t};\r\n}\r\n\r\nexport function imagineSourceLabel(source: string | undefined, t: GrokBuildSettingsInjected[\"t\"]): string {\r\n\tif (source === undefined) return t(\"imagineSourceUnknown\");\r\n\tconst mapped = IMAGINE_SOURCE_KEY[source] ?? IMAGINE_SOURCE_KEY[source.toLowerCase()];\r\n\tif (mapped !== undefined) return t(mapped);\r\n\tif (source.length <= 40 && /^[a-z0-9._-]+$/iu.test(source) && !looksSecret(source)) return source;\r\n\treturn t(\"imagineSourceUnknown\");\r\n}\r\n\r\nexport function modelFields(status: ProviderStatus): { available: string[]; selected: string[] } {\r\n\tif (status.status !== \"signed-in\") return { available: [], selected: [] };\r\n\treturn {\r\n\t\tavailable: \"available\" in status ? status.available : [],\r\n\t\tselected: \"selected\" in status ? status.selected : [],\r\n\t};\r\n}\r\n", "/** CLI credential pull preview panel. */\r\n\r\nimport { SOURCE_CONFLICT_KEY, SOURCE_KIND_KEY, SOURCE_PREVIEW_ACTION_KEY } from \"../constants.ts\";\r\nimport { formatEpoch } from \"../parsers.ts\";\r\nimport {\r\n\tbodyStyle,\r\n\tbuttonStyle,\r\n\tcardStyle,\r\n\tcheckRowStyle,\r\n\thintStyle,\r\n\tlistStyle,\r\n\tmonoStyle,\r\n\tprimaryButtonStyle,\r\n} from \"../styles.ts\";\r\nimport type { GrokBuildSettingsInjected, SourcePreview } from \"../types.ts\";\r\n\r\nexport interface CliPullPreviewProps {\r\n\tt: GrokBuildSettingsInjected[\"t\"];\r\n\tpreview: SourcePreview;\r\n\tconfirmOverwrite: boolean;\r\n\tsourcesBusy: boolean;\r\n\tonConfirmOverwriteChange: (checked: boolean) => void;\r\n\tonCommit: () => void;\r\n\tonCancel: () => void;\r\n}\r\n\r\nexport function CliPullPreview({\r\n\tt,\r\n\tpreview,\r\n\tconfirmOverwrite,\r\n\tsourcesBusy,\r\n\tonConfirmOverwriteChange,\r\n\tonCommit,\r\n\tonCancel,\r\n}: CliPullPreviewProps) {\r\n\tconst expiresAt = formatEpoch(preview.expiresAt);\r\n\tconst ticketExpiresAt = formatEpoch(preview.ticketExpiresAt);\r\n\r\n\treturn (\r\n\t\t<section\r\n\t\t\tid={`coding-oauth-source-preview-${preview.kind}`}\r\n\t\t\tstyle={cardStyle}\r\n\t\t\taria-labelledby={`coding-oauth-source-preview-title-${preview.kind}`}\r\n\t\t\taria-live=\"polite\"\r\n\t\t\ttabIndex={-1}\r\n\t\t>\r\n\t\t\t<p id={`coding-oauth-source-preview-title-${preview.kind}`} style={bodyStyle}>\r\n\t\t\t\t{t(\"sourcesPreviewTitle\")} \u00B7 {t(SOURCE_KIND_KEY[preview.kind])}\r\n\t\t\t</p>\r\n\t\t\t<p style={hintStyle}>\r\n\t\t\t\t<span style={monoStyle}>{preview.displayPath}</span>\r\n\t\t\t</p>\r\n\t\t\t<p style={bodyStyle}>\r\n\t\t\t\t{t(\"sourcesConflict\", {\r\n\t\t\t\t\tdetail: t(\r\n\t\t\t\t\t\tpreview.conflict === undefined ? \"sourceConflictUnrecognized\" : SOURCE_CONFLICT_KEY[preview.conflict],\r\n\t\t\t\t\t),\r\n\t\t\t\t})}\r\n\t\t\t</p>\r\n\t\t\t<p style={bodyStyle}>\r\n\t\t\t\t{t(\"sourcesAction\", {\r\n\t\t\t\t\tdetail: t(\r\n\t\t\t\t\t\tpreview.action === undefined ? \"sourceActionUnrecognized\" : SOURCE_PREVIEW_ACTION_KEY[preview.action],\r\n\t\t\t\t\t),\r\n\t\t\t\t})}\r\n\t\t\t</p>\r\n\t\t\t{expiresAt === undefined ? null : <p style={hintStyle}>{t(\"sourcesPreviewExpires\", { time: expiresAt })}</p>}\r\n\t\t\t{ticketExpiresAt === undefined ? null : (\r\n\t\t\t\t<p style={hintStyle}>{t(\"sourcesTicketExpires\", { time: ticketExpiresAt })}</p>\r\n\t\t\t)}\r\n\t\t\t{preview.warnings.length === 0 ? null : (\r\n\t\t\t\t<ul style={{ ...listStyle, gap: 4 }} aria-label={t(\"sourcesWarnings\")}>\r\n\t\t\t\t\t{preview.warnings.map((warning) => (\r\n\t\t\t\t\t\t<li key={warning} style={hintStyle}>\r\n\t\t\t\t\t\t\t{warning}\r\n\t\t\t\t\t\t</li>\r\n\t\t\t\t\t))}\r\n\t\t\t\t</ul>\r\n\t\t\t)}\r\n\t\t\t{preview.confirmOverwriteRequired ? (\r\n\t\t\t\t<label style={checkRowStyle}>\r\n\t\t\t\t\t<input\r\n\t\t\t\t\t\taria-describedby={`coding-oauth-source-overwrite-hint-${preview.kind}`}\r\n\t\t\t\t\t\ttype=\"checkbox\"\r\n\t\t\t\t\t\tchecked={confirmOverwrite}\r\n\t\t\t\t\t\tdisabled={sourcesBusy || preview.action === \"blocked\"}\r\n\t\t\t\t\t\tonChange={(event) => {\r\n\t\t\t\t\t\t\tonConfirmOverwriteChange(event.target.checked);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t/>\r\n\t\t\t\t\t<span>\r\n\t\t\t\t\t\t{t(\"sourcesConfirmOverwrite\")}\r\n\t\t\t\t\t\t<span id={`coding-oauth-source-overwrite-hint-${preview.kind}`} style={{ display: \"block\", ...hintStyle }}>\r\n\t\t\t\t\t\t\t{t(\"sourcesConfirmOverwriteHint\")}\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t</span>\r\n\t\t\t\t</label>\r\n\t\t\t) : null}\r\n\t\t\t<div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8 }}>\r\n\t\t\t\t<button\r\n\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\tstyle={primaryButtonStyle}\r\n\t\t\t\t\tdisabled={\r\n\t\t\t\t\t\tsourcesBusy || preview.action === \"blocked\" || (preview.confirmOverwriteRequired && !confirmOverwrite)\r\n\t\t\t\t\t}\r\n\t\t\t\t\tonClick={onCommit}\r\n\t\t\t\t>\r\n\t\t\t\t\t{t(\"sourcesCommit\")}\r\n\t\t\t\t</button>\r\n\t\t\t\t<button type=\"button\" style={buttonStyle} disabled={sourcesBusy} onClick={onCancel}>\r\n\t\t\t\t\t{t(\"sourcesCancelPreview\")}\r\n\t\t\t\t</button>\r\n\t\t\t</div>\r\n\t\t</section>\r\n\t);\r\n}\r\n", "/** Dismissible notice banner with optional auto-hide. */\r\n\r\nimport { useEffect } from \"react\";\r\nimport { bodyStyle, buttonStyle, noticeStyle } from \"../styles.ts\";\r\n\r\nexport interface NoticeBannerProps {\r\n\tmessage: string;\r\n\tdismissLabel?: string;\r\n\tonDismiss?: () => void;\r\n\tautoHideMs?: number;\r\n\ttone?: \"info\" | \"success\";\r\n}\r\n\r\nexport function NoticeBanner({ message, dismissLabel, onDismiss, autoHideMs, tone = \"info\" }: NoticeBannerProps) {\r\n\tuseEffect(() => {\r\n\t\tif (autoHideMs === undefined || onDismiss === undefined) return;\r\n\t\tconst timer = window.setTimeout(onDismiss, autoHideMs);\r\n\t\treturn () => {\r\n\t\t\twindow.clearTimeout(timer);\r\n\t\t};\r\n\t}, [autoHideMs, onDismiss]);\r\n\r\n\tconst borderColor =\r\n\t\ttone === \"success\" ? \"var(--dsw-alias-state-success-primary, #22a06b)\" : \"var(--dsw-alias-brand-primary, #1677ff)\";\r\n\r\n\treturn (\r\n\t\t<div\r\n\t\t\tstyle={{\r\n\t\t\t\t...noticeStyle,\r\n\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\talignItems: \"flex-start\",\r\n\t\t\t\tjustifyContent: \"space-between\",\r\n\t\t\t\tgap: 12,\r\n\t\t\t\tborderLeft: `3px solid ${borderColor}`,\r\n\t\t\t}}\r\n\t\t\trole=\"status\"\r\n\t\t>\r\n\t\t\t<p style={{ ...bodyStyle, margin: 0, color: \"var(--dsw-alias-label-primary)\" }}>{message}</p>\r\n\t\t\t{onDismiss === undefined || dismissLabel === undefined ? null : (\r\n\t\t\t\t<button type=\"button\" style={buttonStyle} onClick={onDismiss}>\r\n\t\t\t\t\t{dismissLabel}\r\n\t\t\t\t</button>\r\n\t\t\t)}\r\n\t\t</div>\r\n\t);\r\n}\r\n", "/** Single provider account card for the Accounts tab. */\r\n\r\nimport { useEffect, useMemo, useRef, useState } from \"react\";\r\nimport { SOURCE_REASON_KEY } from \"../constants.ts\";\r\nimport { methodLabel, orderedLoginMethods, shouldShowPerCardSourceReason } from \"../display.ts\";\r\nimport { formatEpoch, modelFields, usageHasVisibleFields } from \"../parsers.ts\";\r\nimport {\r\n\tbodyStyle,\r\n\tbuttonStyle,\r\n\tcardStyle,\r\n\tcheckRowStyle,\r\n\tcodeStyle,\r\n\tcompactButtonStyle,\r\n\thintStyle,\r\n\tinputStyle,\r\n\tlistStyle,\r\n\tmonoStyle,\r\n\tnestedStyle,\r\n\tprimaryButtonStyle,\r\n\trowStyle,\r\n\tstepActiveStyle,\r\n\tstepNumberActiveStyle,\r\n\tstepNumberStyle,\r\n\tstepRowStyle,\r\n\ttitleStyle,\r\n\tvisuallyHiddenStyle,\r\n} from \"../styles.ts\";\r\nimport type {\r\n\tGrokBuildSettingsInjected,\r\n\tGrokStatus,\r\n\tLoginMethod,\r\n\tProviderCardDefinition,\r\n\tProviderStatus,\r\n\tSourceStatus,\r\n\tUsageView,\r\n} from \"../types.ts\";\r\nimport { Badge } from \"./Badge.tsx\";\r\nimport { CopyButton } from \"./CopyButton.tsx\";\r\nimport { ProgressBar } from \"./ProgressBar.tsx\";\r\n\r\nexport interface ProviderCardProps {\r\n\tt: GrokBuildSettingsInjected[\"t\"];\r\n\tdefinition: ProviderCardDefinition;\r\n\tproviderStatus: ProviderStatus;\r\n\tbusy: boolean;\r\n\tsourcesBusy: boolean;\r\n\tremote: boolean;\r\n\tcodeInput: string;\r\n\tpopupBlocked: boolean;\r\n\texpanded: boolean;\r\n\tsource: SourceStatus | undefined;\r\n\tshowUsage: boolean;\r\n\tusage: UsageView | undefined;\r\n\tusageError: string | undefined;\r\n\tusageLoading: boolean;\r\n\tonSignIn: (method: LoginMethod) => void;\r\n\tonSignOut: () => void;\r\n\tonCancelLogin: () => void;\r\n\tonSubmitCode: () => void;\r\n\tonCodeChange: (value: string) => void;\r\n\tonToggleExpanded: () => void;\r\n\tonPreviewSource: () => void;\r\n\tonSaveModels: (selected: string[]) => void;\r\n}\r\n\r\nfunction SignInSteps({\r\n\tt,\r\n\tactiveMethod,\r\n\tuserCode,\r\n\turl,\r\n\tpopupBlocked,\r\n}: {\r\n\tt: GrokBuildSettingsInjected[\"t\"];\r\n\tactiveMethod: LoginMethod;\r\n\tuserCode: string | undefined;\r\n\turl: string | undefined;\r\n\tpopupBlocked: boolean;\r\n}) {\r\n\tconst hasCode = userCode !== undefined && userCode.length > 0;\r\n\tconst hasUrl = url !== undefined && url.length > 0;\r\n\tconst needsPaste = activeMethod !== \"device\";\r\n\r\n\treturn (\r\n\t\t<div style={{ display: \"flex\", flexDirection: \"column\", gap: 10 }}>\r\n\t\t\t<div style={hasUrl ? stepActiveStyle : stepRowStyle}>\r\n\t\t\t\t<span style={hasUrl ? stepNumberActiveStyle : stepNumberStyle} aria-hidden=\"true\">\r\n\t\t\t\t\t1\r\n\t\t\t\t</span>\r\n\t\t\t\t<span>{t(\"signInStepOpen\")}</span>\r\n\t\t\t</div>\r\n\t\t\t{hasUrl ? (\r\n\t\t\t\t<div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8, paddingLeft: 32 }}>\r\n\t\t\t\t\t<a href={url} target=\"_blank\" rel=\"noreferrer\" style={primaryButtonStyle}>\r\n\t\t\t\t\t\t{t(\"openAuthUrl\")}\r\n\t\t\t\t\t</a>\r\n\t\t\t\t\t<CopyButton text={url} idleLabel={t(\"copy\")} copiedLabel={t(\"copied\")} failedLabel={t(\"copyFailed\")} />\r\n\t\t\t\t</div>\r\n\t\t\t) : null}\r\n\t\t\t{popupBlocked && hasUrl ? <p style={hintStyle}>{t(\"popupBlocked\")}</p> : null}\r\n\t\t\t{hasCode ? (\r\n\t\t\t\t<>\r\n\t\t\t\t\t<div style={stepActiveStyle}>\r\n\t\t\t\t\t\t<span style={stepNumberActiveStyle} aria-hidden=\"true\">\r\n\t\t\t\t\t\t\t2\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t<span>{t(\"signInStepCode\")}</span>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div style={{ display: \"flex\", flexWrap: \"wrap\", alignItems: \"center\", gap: 8, paddingLeft: 32 }}>\r\n\t\t\t\t\t\t<span style={codeStyle}>{userCode}</span>\r\n\t\t\t\t\t\t<CopyButton\r\n\t\t\t\t\t\t\ttext={userCode}\r\n\t\t\t\t\t\t\tidleLabel={t(\"copyUserCode\")}\r\n\t\t\t\t\t\t\tcopiedLabel={t(\"copied\")}\r\n\t\t\t\t\t\t\tfailedLabel={t(\"copyFailed\")}\r\n\t\t\t\t\t\t\tprimary\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</>\r\n\t\t\t) : null}\r\n\t\t\t<div style={stepActiveStyle}>\r\n\t\t\t\t<span style={stepNumberActiveStyle} aria-hidden=\"true\">\r\n\t\t\t\t\t{hasCode ? 3 : 2}\r\n\t\t\t\t</span>\r\n\t\t\t\t<span style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}>\r\n\t\t\t\t\t<span\r\n\t\t\t\t\t\taria-hidden=\"true\"\r\n\t\t\t\t\t\tstyle={{\r\n\t\t\t\t\t\t\twidth: 14,\r\n\t\t\t\t\t\t\theight: 14,\r\n\t\t\t\t\t\t\tborder: \"2px solid var(--dsw-alias-brand-primary, #1677ff)\",\r\n\t\t\t\t\t\t\tborderTopColor: \"transparent\",\r\n\t\t\t\t\t\t\tborderRadius: \"50%\",\r\n\t\t\t\t\t\t\tanimation: \"dsh-coding-oauth-spin 0.8s linear infinite\",\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t/>\r\n\t\t\t\t\t{t(\"signInStepWait\")}\r\n\t\t\t\t</span>\r\n\t\t\t</div>\r\n\t\t\t{needsPaste ? (\r\n\t\t\t\t<div style={{ display: \"flex\", flexDirection: \"column\", gap: 8, paddingLeft: 32 }}>\r\n\t\t\t\t\t<p style={bodyStyle}>{t(activeMethod === \"browser\" ? \"pasteBrowserCodeHint\" : \"pasteCodeHint\")}</p>\r\n\t\t\t\t</div>\r\n\t\t\t) : null}\r\n\t\t</div>\r\n\t);\r\n}\r\n\r\nexport function ProviderCard({\r\n\tt,\r\n\tdefinition,\r\n\tproviderStatus,\r\n\tbusy,\r\n\tsourcesBusy,\r\n\tremote,\r\n\tcodeInput,\r\n\tpopupBlocked,\r\n\texpanded,\r\n\tsource,\r\n\tshowUsage,\r\n\tusage,\r\n\tusageError,\r\n\tusageLoading,\r\n\tonSignIn,\r\n\tonSignOut,\r\n\tonCancelLogin,\r\n\tonSubmitCode,\r\n\tonCodeChange,\r\n\tonToggleExpanded,\r\n\tonPreviewSource,\r\n\tonSaveModels,\r\n}: ProviderCardProps) {\r\n\tconst [showAltMethods, setShowAltMethods] = useState(false);\r\n\tconst [modelFilter, setModelFilter] = useState(\"\");\r\n\tconst [logoutConfirm, setLogoutConfirm] = useState(false);\r\n\tconst logoutTrigger = useRef<HTMLButtonElement>(null);\r\n\tconst logoutConfirmAction = useRef<HTMLButtonElement>(null);\r\n\tconst restoreLogoutFocus = useRef(false);\r\n\r\n\tconst ordered = orderedLoginMethods(definition, remote);\r\n\tconst primaryMethod: LoginMethod = ordered[0] ?? definition.recommended;\r\n\tconst altMethods = ordered.filter((method) => method !== primaryMethod);\r\n\r\n\tconst statusLabel =\r\n\t\tproviderStatus.status === \"signed-in\"\r\n\t\t\t? t(\"signedIn\")\r\n\t\t\t: providerStatus.status === \"signing-in\"\r\n\t\t\t\t? t(\"signingIn\")\r\n\t\t\t\t: providerStatus.status === \"error\"\r\n\t\t\t\t\t? t(\"requestFailed\")\r\n\t\t\t\t\t: t(\"signedOut\");\r\n\tconst activeMethod = providerStatus.status === \"signing-in\" ? providerStatus.method : primaryMethod;\r\n\tconst { available, selected } = useMemo(() => modelFields(providerStatus), [providerStatus]);\r\n\tconst [modelDraft, setModelDraft] = useState<string[]>(selected);\r\n\tuseEffect(() => {\r\n\t\tsetModelDraft(selected);\r\n\t}, [selected]);\r\n\tuseEffect(() => {\r\n\t\tif (providerStatus.status !== \"signed-in\") setLogoutConfirm(false);\r\n\t}, [providerStatus.status]);\r\n\tuseEffect(() => {\r\n\t\tif (logoutConfirm) {\r\n\t\t\tlogoutConfirmAction.current?.focus();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!restoreLogoutFocus.current) return;\r\n\t\trestoreLogoutFocus.current = false;\r\n\t\tif (providerStatus.status === \"signed-in\") {\r\n\t\t\tlogoutTrigger.current?.focus();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tdocument.getElementById(`coding-oauth-login-${definition.slug}`)?.focus();\r\n\t}, [definition.slug, logoutConfirm, providerStatus.status]);\r\n\tconst modelDraftDirty =\r\n\t\tmodelDraft.length !== selected.length || modelDraft.some((model, index) => model !== selected[index]);\r\n\tconst grokProviderStatus = definition.slug === \"grok\" ? (providerStatus as GrokStatus) : undefined;\r\n\tconst showSourceReason = shouldShowPerCardSourceReason(source);\r\n\r\n\tconst filteredModels = useMemo(() => {\r\n\t\tconst query = modelFilter.trim().toLowerCase();\r\n\t\tif (query.length === 0) return available;\r\n\t\treturn available.filter((id) => id.toLowerCase().includes(query));\r\n\t}, [available, modelFilter]);\r\n\r\n\tconst usagePercent =\r\n\t\tdefinition.slug === \"codex\" && showUsage\r\n\t\t\t? usage?.individualRemainingPercent === undefined\r\n\t\t\t\t? usage?.rateLimits[0]?.windows[0]?.usedPercent\r\n\t\t\t\t: 100 - usage.individualRemainingPercent\r\n\t\t\t: undefined;\r\n\tconst fetchedAt = formatEpoch(usage?.fetchedAt);\r\n\r\n\treturn (\r\n\t\t<div style={cardStyle}>\r\n\t\t\t<div style={rowStyle}>\r\n\t\t\t\t<div>\r\n\t\t\t\t\t<h3 style={{ ...titleStyle, fontSize: 16 }}>{t(definition.titleKey)}</h3>\r\n\t\t\t\t\t{providerStatus.status === \"signed-in\" && !expanded ? (\r\n\t\t\t\t\t\t<p style={{ ...hintStyle, marginTop: 4 }}>\r\n\t\t\t\t\t\t\t{t(\"modelsSummary\", { selected: selected.length, total: available.length })}\r\n\t\t\t\t\t\t\t{usagePercent === undefined ? \"\" : ` \u00B7 ${t(\"usageUsedShort\", { value: `${String(usagePercent)}%` })}`}\r\n\t\t\t\t\t\t</p>\r\n\t\t\t\t\t) : (\r\n\t\t\t\t\t\t<>\r\n\t\t\t\t\t\t\t<p style={{ ...bodyStyle, marginTop: 4 }}>{t(definition.descriptionKey)}</p>\r\n\t\t\t\t\t\t\t<p style={{ ...bodyStyle, marginTop: 4 }}>\r\n\t\t\t\t\t\t\t\t<span style={monoStyle}>{definition.route}</span>\r\n\t\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t</>\r\n\t\t\t\t\t)}\r\n\t\t\t\t</div>\r\n\t\t\t\t<Badge label={statusLabel} providerStatus={providerStatus.status} />\r\n\t\t\t</div>\r\n\t\t\t<div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8 }}>\r\n\t\t\t\t{providerStatus.status === \"signed-in\" ? (\r\n\t\t\t\t\t<>\r\n\t\t\t\t\t\t{logoutConfirm ? (\r\n\t\t\t\t\t\t\t<fieldset style={{ ...nestedStyle, margin: 0, minWidth: 0 }}>\r\n\t\t\t\t\t\t\t\t<legend style={visuallyHiddenStyle}>{t(\"logoutConfirmTitle\")}</legend>\r\n\t\t\t\t\t\t\t\t<p style={bodyStyle}>{t(\"logoutConfirmHint\")}</p>\r\n\t\t\t\t\t\t\t\t<div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8 }}>\r\n\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\tref={logoutConfirmAction}\r\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\t\tstyle={primaryButtonStyle}\r\n\t\t\t\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\t\trestoreLogoutFocus.current = true;\r\n\t\t\t\t\t\t\t\t\t\t\tonSignOut();\r\n\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t{busy ? t(\"working\") : t(\"logoutConfirmAction\")}\r\n\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\t\tstyle={buttonStyle}\r\n\t\t\t\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\t\trestoreLogoutFocus.current = true;\r\n\t\t\t\t\t\t\t\t\t\t\tsetLogoutConfirm(false);\r\n\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t{t(\"cancel\")}\r\n\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</fieldset>\r\n\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\tref={logoutTrigger}\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tstyle={buttonStyle}\r\n\t\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\t\tonClick={() => setLogoutConfirm(true)}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{t(\"logout\")}\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\tid={`coding-oauth-models-toggle-${definition.slug}`}\r\n\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\tstyle={buttonStyle}\r\n\t\t\t\t\t\t\taria-expanded={expanded}\r\n\t\t\t\t\t\t\taria-controls={expanded ? `coding-oauth-models-${definition.slug}` : undefined}\r\n\t\t\t\t\t\t\tonClick={onToggleExpanded}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{expanded ? t(\"collapseModels\") : t(\"expandModels\")}\r\n\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t{source?.available === true ? (\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\tid={`coding-oauth-source-pull-${definition.slug}`}\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tstyle={buttonStyle}\r\n\t\t\t\t\t\t\t\tdisabled={sourcesBusy}\r\n\t\t\t\t\t\t\t\tonClick={onPreviewSource}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{t(\"sourcesPullCopy\")}\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t) : null}\r\n\t\t\t\t\t</>\r\n\t\t\t\t) : providerStatus.status === \"signing-in\" ? (\r\n\t\t\t\t\t<>\r\n\t\t\t\t\t\t<button type=\"button\" style={buttonStyle} disabled={busy} onClick={onCancelLogin}>\r\n\t\t\t\t\t\t\t{t(\"cancelLogin\")}\r\n\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t{altMethods.length > 0 ? (\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tstyle={compactButtonStyle}\r\n\t\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\tsetShowAltMethods((current) => !current);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{showAltMethods ? t(\"hideOtherLoginMethods\") : t(\"otherLoginMethods\")}\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t) : null}\r\n\t\t\t\t\t\t{showAltMethods\r\n\t\t\t\t\t\t\t? altMethods.map((method) => (\r\n\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\tkey={method}\r\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\t\tstyle={compactButtonStyle}\r\n\t\t\t\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\t\tonSignIn(method);\r\n\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t{methodLabel(method, t, { remote, primary: false })}\r\n\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t))\r\n\t\t\t\t\t\t\t: null}\r\n\t\t\t\t\t</>\r\n\t\t\t\t) : (\r\n\t\t\t\t\t<>\r\n\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\tid={`coding-oauth-login-${definition.slug}`}\r\n\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\tstyle={primaryButtonStyle}\r\n\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\tonSignIn(primaryMethod);\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{busy ? t(\"working\") : methodLabel(primaryMethod, t, { remote, primary: true })}\r\n\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t{altMethods.length > 0 ? (\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tstyle={compactButtonStyle}\r\n\t\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\tsetShowAltMethods((current) => !current);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{showAltMethods ? t(\"hideOtherLoginMethods\") : t(\"otherLoginMethods\")}\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t) : null}\r\n\t\t\t\t\t\t{showAltMethods\r\n\t\t\t\t\t\t\t? altMethods.map((method) => (\r\n\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\tkey={method}\r\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\t\tstyle={compactButtonStyle}\r\n\t\t\t\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\t\tonSignIn(method);\r\n\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t{methodLabel(method, t, { remote, primary: false })}\r\n\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t))\r\n\t\t\t\t\t\t\t: null}\r\n\t\t\t\t\t\t{source?.available === true ? (\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\tid={`coding-oauth-source-pull-${definition.slug}`}\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tstyle={buttonStyle}\r\n\t\t\t\t\t\t\t\tdisabled={sourcesBusy}\r\n\t\t\t\t\t\t\t\tonClick={onPreviewSource}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{t(\"sourcesPullCopy\")}\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t) : showSourceReason && source?.reason !== undefined ? (\r\n\t\t\t\t\t\t\t<span style={hintStyle}>{t(SOURCE_REASON_KEY[source.reason])}</span>\r\n\t\t\t\t\t\t) : null}\r\n\t\t\t\t\t</>\r\n\t\t\t\t)}\r\n\t\t\t</div>\r\n\t\t\t{providerStatus.status === \"error\" ? (\r\n\t\t\t\t<p style={{ ...bodyStyle, color: \"var(--dsw-alias-state-error-primary)\" }}>{providerStatus.message}</p>\r\n\t\t\t) : null}\r\n\t\t\t{providerStatus.status === \"signing-in\" ? (\r\n\t\t\t\t<SignInSteps\r\n\t\t\t\t\tt={t}\r\n\t\t\t\t\tactiveMethod={activeMethod}\r\n\t\t\t\t\tuserCode={providerStatus.userCode}\r\n\t\t\t\t\turl={providerStatus.url}\r\n\t\t\t\t\tpopupBlocked={popupBlocked}\r\n\t\t\t\t/>\r\n\t\t\t) : null}\r\n\t\t\t{providerStatus.status === \"signing-in\" && activeMethod !== \"device\" ? (\r\n\t\t\t\t<div style={{ display: \"flex\", flexDirection: \"column\", gap: 8 }}>\r\n\t\t\t\t\t<div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8 }}>\r\n\t\t\t\t\t\t<label htmlFor={`coding-oauth-code-${definition.slug}`} style={visuallyHiddenStyle}>\r\n\t\t\t\t\t\t\t{t(\"pasteCodeLabel\")}\r\n\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t<input\r\n\t\t\t\t\t\t\tid={`coding-oauth-code-${definition.slug}`}\r\n\t\t\t\t\t\t\tstyle={{ ...inputStyle, flex: \"1 1 360px\" }}\r\n\t\t\t\t\t\t\tvalue={codeInput}\r\n\t\t\t\t\t\t\tplaceholder={t(\"pasteCodePlaceholder\")}\r\n\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\tonChange={(event) => {\r\n\t\t\t\t\t\t\t\tonCodeChange(event.target.value);\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\tonKeyDown={(event) => {\r\n\t\t\t\t\t\t\t\tif (event.key === \"Enter\") {\r\n\t\t\t\t\t\t\t\t\tevent.preventDefault();\r\n\t\t\t\t\t\t\t\t\tonSubmitCode();\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\tstyle={primaryButtonStyle}\r\n\t\t\t\t\t\t\tdisabled={busy || codeInput.trim().length === 0}\r\n\t\t\t\t\t\t\tonClick={onSubmitCode}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{t(\"submitCode\")}\r\n\t\t\t\t\t\t</button>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t) : null}\r\n\t\t\t{providerStatus.status === \"signed-in\" && expanded ? (\r\n\t\t\t\t<div id={`coding-oauth-models-${definition.slug}`} style={{ display: \"flex\", flexDirection: \"column\", gap: 8 }}>\r\n\t\t\t\t\t<div style={rowStyle}>\r\n\t\t\t\t\t\t<h4 style={{ ...titleStyle, fontSize: 14 }}>{t(\"models\")}</h4>\r\n\t\t\t\t\t\t<div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8 }}>\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tstyle={compactButtonStyle}\r\n\t\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\tsetModelDraft([]);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{t(\"deselectAll\")}\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tstyle={compactButtonStyle}\r\n\t\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\tsetModelDraft([...available]);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{t(\"selectAll\")}\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tstyle={compactButtonStyle}\r\n\t\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\tsetModelDraft(available.length > 0 ? [available[0]!] : []);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{t(\"resetModelsDefault\")}\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<label htmlFor={`coding-oauth-model-filter-${definition.slug}`} style={visuallyHiddenStyle}>\r\n\t\t\t\t\t\t{t(\"modelFilterLabel\", { provider: t(definition.titleKey) })}\r\n\t\t\t\t\t</label>\r\n\t\t\t\t\t<input\r\n\t\t\t\t\t\tid={`coding-oauth-model-filter-${definition.slug}`}\r\n\t\t\t\t\t\ttype=\"search\"\r\n\t\t\t\t\t\tstyle={inputStyle}\r\n\t\t\t\t\t\tvalue={modelFilter}\r\n\t\t\t\t\t\tplaceholder={t(\"modelFilterPlaceholder\")}\r\n\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\tonChange={(event) => {\r\n\t\t\t\t\t\t\tsetModelFilter(event.target.value);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t/>\r\n\t\t\t\t\t{grokProviderStatus?.status === \"signed-in\" ? (\r\n\t\t\t\t\t\t<p style={bodyStyle}>\r\n\t\t\t\t\t\t\t{grokProviderStatus.catalogSource === \"live\"\r\n\t\t\t\t\t\t\t\t? t(\"catalogLive\")\r\n\t\t\t\t\t\t\t\t: grokProviderStatus.catalogSource === \"cache\"\r\n\t\t\t\t\t\t\t\t\t? t(\"catalogCache\")\r\n\t\t\t\t\t\t\t\t\t: t(\"catalogFallback\")}\r\n\t\t\t\t\t\t</p>\r\n\t\t\t\t\t) : null}\r\n\t\t\t\t\t<p style={bodyStyle}>\r\n\t\t\t\t\t\t{t(\"modelHint\")} <span style={monoStyle}>{definition.route}/<id></span>\r\n\t\t\t\t\t</p>\r\n\t\t\t\t\t<ul style={listStyle}>\r\n\t\t\t\t\t\t{filteredModels.map((id) => {\r\n\t\t\t\t\t\t\tconst checked = modelDraft.includes(id);\r\n\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t<li key={id}>\r\n\t\t\t\t\t\t\t\t\t<label style={checkRowStyle}>\r\n\t\t\t\t\t\t\t\t\t\t<input\r\n\t\t\t\t\t\t\t\t\t\t\ttype=\"checkbox\"\r\n\t\t\t\t\t\t\t\t\t\t\tchecked={checked}\r\n\t\t\t\t\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\t\t\t\t\tonChange={() => {\r\n\t\t\t\t\t\t\t\t\t\t\t\tconst current = new Set(modelDraft);\r\n\t\t\t\t\t\t\t\t\t\t\t\tif (checked) current.delete(id);\r\n\t\t\t\t\t\t\t\t\t\t\t\telse current.add(id);\r\n\t\t\t\t\t\t\t\t\t\t\t\tsetModelDraft([...available].filter((model) => current.has(model)));\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t\t<span style={monoStyle}>{id}</span>\r\n\t\t\t\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t\t\t</li>\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t})}\r\n\t\t\t\t\t</ul>\r\n\t\t\t\t\t<div style={{ display: \"flex\", flexWrap: \"wrap\", alignItems: \"center\", gap: 8 }}>\r\n\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\tstyle={primaryButtonStyle}\r\n\t\t\t\t\t\t\tdisabled={busy || !modelDraftDirty}\r\n\t\t\t\t\t\t\tonClick={() => onSaveModels(modelDraft)}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{busy ? t(\"working\") : t(\"applyModelDraft\")}\r\n\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t{modelDraftDirty ? <span style={hintStyle}>{t(\"modelDraftPending\")}</span> : null}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t{filteredModels.length === 0 ? <p style={hintStyle}>{t(\"modelFilterPlaceholder\")}</p> : null}\r\n\t\t\t\t\t{grokProviderStatus?.status === \"signed-in\" && grokProviderStatus.catalogError !== undefined ? (\r\n\t\t\t\t\t\t<p style={{ ...bodyStyle, color: \"var(--dsw-alias-state-error-primary)\" }}>{t(\"catalogError\")}</p>\r\n\t\t\t\t\t) : null}\r\n\t\t\t\t\t{definition.slug === \"codex\" && showUsage ? (\r\n\t\t\t\t\t\t<div style={nestedStyle}>\r\n\t\t\t\t\t\t\t<p style={{ ...bodyStyle, color: \"var(--dsw-alias-label-primary)\" }}>{t(\"usageTitle\")}</p>\r\n\t\t\t\t\t\t\t{usageError === undefined ? null : (\r\n\t\t\t\t\t\t\t\t<p style={{ ...bodyStyle, color: \"var(--dsw-alias-state-error-primary)\" }} role=\"alert\">\r\n\t\t\t\t\t\t\t\t\t{usageError}\r\n\t\t\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t{usageLoading && usage === undefined ? (\r\n\t\t\t\t\t\t\t\t<p style={hintStyle}>{t(\"usageLoading\")}</p>\r\n\t\t\t\t\t\t\t) : usage === undefined || !usageHasVisibleFields(usage) ? (\r\n\t\t\t\t\t\t\t\t<p style={hintStyle}>{t(\"usageEmpty\")}</p>\r\n\t\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\t<>\r\n\t\t\t\t\t\t\t\t\t{fetchedAt === undefined ? null : <p style={hintStyle}>{t(\"usageFetchedAt\", { time: fetchedAt })}</p>}\r\n\t\t\t\t\t\t\t\t\t{usagePercent !== undefined ? (\r\n\t\t\t\t\t\t\t\t\t\t<ProgressBar\r\n\t\t\t\t\t\t\t\t\t\t\tvalue={usagePercent}\r\n\t\t\t\t\t\t\t\t\t\t\tlabel={t(\"usageRateLimit\")}\r\n\t\t\t\t\t\t\t\t\t\t\tmeta={t(\"usageUsed\", { value: `${String(usagePercent)}%` })}\r\n\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t) : null}\r\n\t\t\t\t\t\t\t\t\t{usage.rateLimits.map((limit) => {\r\n\t\t\t\t\t\t\t\t\t\tconst window = limit.windows[0];\r\n\t\t\t\t\t\t\t\t\t\tconst used = window?.usedPercent;\r\n\t\t\t\t\t\t\t\t\t\tconst resetsAt = formatEpoch(window?.resetsAt);\r\n\t\t\t\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t\t\t\t<div key={limit.id} style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{used === undefined ? (\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<p style={hintStyle}>{limit.name ?? t(\"usageRateLimit\")}</p>\r\n\t\t\t\t\t\t\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<ProgressBar\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={used}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tlabel={limit.name ?? t(\"usageRateLimit\")}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmeta={\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tresetsAt === undefined\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? t(\"usageUsed\", { value: `${String(used)}%` })\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: `${t(\"usageUsed\", { value: `${String(used)}%` })} \u00B7 ${t(\"usageResets\", { time: resetsAt })}`\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t\t\t})}\r\n\t\t\t\t\t\t\t\t</>\r\n\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t) : null}\r\n\t\t\t\t</div>\r\n\t\t\t) : null}\r\n\t\t</div>\r\n\t);\r\n}\r\n", "/** Compact copy button with copied / failed feedback. */\r\n\r\nimport { useCallback, useEffect, useRef, useState } from \"react\";\r\nimport { copyText } from \"../api.ts\";\r\nimport { compactButtonStyle, primaryButtonStyle } from \"../styles.ts\";\r\n\r\nexport interface CopyButtonProps {\r\n\ttext: string;\r\n\tidleLabel: string;\r\n\tcopiedLabel: string;\r\n\tfailedLabel: string;\r\n\tprimary?: boolean;\r\n\tdisabled?: boolean;\r\n}\r\n\r\nexport function CopyButton({\r\n\ttext,\r\n\tidleLabel,\r\n\tcopiedLabel,\r\n\tfailedLabel,\r\n\tprimary = false,\r\n\tdisabled = false,\r\n}: CopyButtonProps) {\r\n\tconst [state, setState] = useState<\"idle\" | \"copied\" | \"failed\">(\"idle\");\r\n\tconst timerRef = useRef<number | undefined>(undefined);\r\n\r\n\tuseEffect(() => {\r\n\t\treturn () => {\r\n\t\t\tif (timerRef.current !== undefined) window.clearTimeout(timerRef.current);\r\n\t\t};\r\n\t}, []);\r\n\r\n\tconst handleClick = useCallback(async () => {\r\n\t\tconst ok = await copyText(text);\r\n\t\tsetState(ok ? \"copied\" : \"failed\");\r\n\t\tif (timerRef.current !== undefined) window.clearTimeout(timerRef.current);\r\n\t\ttimerRef.current = window.setTimeout(() => {\r\n\t\t\tsetState(\"idle\");\r\n\t\t\ttimerRef.current = undefined;\r\n\t\t}, 2000);\r\n\t}, [text]);\r\n\r\n\tconst label = state === \"copied\" ? copiedLabel : state === \"failed\" ? failedLabel : idleLabel;\r\n\r\n\treturn (\r\n\t\t<button\r\n\t\t\ttype=\"button\"\r\n\t\t\tstyle={primary ? primaryButtonStyle : compactButtonStyle}\r\n\t\t\tdisabled={disabled || text.length === 0}\r\n\t\t\tonClick={() => {\r\n\t\t\t\tvoid handleClick();\r\n\t\t\t}}\r\n\t\t>\r\n\t\t\t{label}\r\n\t\t</button>\r\n\t);\r\n}\r\n", "/** Usage quota progress bar with threshold-based color. */\r\n\r\nimport { hintStyle } from \"../styles.ts\";\r\n\r\nexport interface ProgressBarProps {\r\n\t/** 0\u2013100 used percentage. */\r\n\tvalue: number;\r\n\tlabel?: string;\r\n\tmeta?: string;\r\n}\r\n\r\nfunction barColor(percent: number): string {\r\n\tif (percent >= 90) return \"var(--dsw-alias-state-error-primary, #d92d20)\";\r\n\tif (percent >= 75) return \"var(--dsw-alias-state-warn-primary, #e06c00)\";\r\n\t// Prefer info fill over brand-primary: dark theme inverts brand-primary to near-white.\r\n\treturn \"var(--dsw-alias-button-info-fill, var(--dsw-static-deepseek-500, #4f6ef7))\";\r\n}\r\n\r\nexport function ProgressBar({ value, label, meta }: ProgressBarProps) {\r\n\tconst clamped = Math.max(0, Math.min(100, value));\r\n\treturn (\r\n\t\t<div style={{ display: \"flex\", flexDirection: \"column\", gap: 6 }}>\r\n\t\t\t{label === undefined ? null : (\r\n\t\t\t\t<div style={{ display: \"flex\", justifyContent: \"space-between\", gap: 8, flexWrap: \"wrap\" }}>\r\n\t\t\t\t\t<span style={{ ...hintStyle, color: \"var(--dsw-alias-label-primary)\" }}>{label}</span>\r\n\t\t\t\t\t{meta === undefined ? null : <span style={hintStyle}>{meta}</span>}\r\n\t\t\t\t</div>\r\n\t\t\t)}\r\n\t\t\t<div\r\n\t\t\t\trole=\"progressbar\"\r\n\t\t\t\taria-valuenow={clamped}\r\n\t\t\t\taria-valuemin={0}\r\n\t\t\t\taria-valuemax={100}\r\n\t\t\t\tstyle={{\r\n\t\t\t\t\theight: 8,\r\n\t\t\t\t\tborderRadius: 4,\r\n\t\t\t\t\tbackground: \"var(--dsw-alias-border-l2)\",\r\n\t\t\t\t\toverflow: \"hidden\",\r\n\t\t\t\t}}\r\n\t\t\t>\r\n\t\t\t\t<div\r\n\t\t\t\t\tstyle={{\r\n\t\t\t\t\t\twidth: `${String(clamped)}%`,\r\n\t\t\t\t\t\theight: \"100%\",\r\n\t\t\t\t\t\tborderRadius: 4,\r\n\t\t\t\t\t\tbackground: barColor(clamped),\r\n\t\t\t\t\t\ttransition: \"width 0.3s ease, background 0.3s ease\",\r\n\t\t\t\t\t}}\r\n\t\t\t\t/>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t);\r\n}\r\n", "/** Accessible toggle switch replacing native checkboxes for capability settings. */\r\n\r\nimport type { CSSProperties } from \"react\";\r\nimport { TRANSITION } from \"../styles.ts\";\r\n\r\nexport interface ToggleSwitchProps {\r\n\tchecked: boolean;\r\n\tdisabled?: boolean;\r\n\tonChange: (checked: boolean) => void;\r\n\t/** Accessible label (visually hidden when label prop is rendered externally). */\r\n\tariaLabel?: string;\r\n\tariaDescribedBy?: string;\r\n\tid?: string;\r\n}\r\n\r\nconst trackStyle = (checked: boolean, disabled: boolean): CSSProperties => ({\r\n\tposition: \"relative\",\r\n\twidth: 40,\r\n\theight: 22,\r\n\tborderRadius: 11,\r\n\tflex: \"0 0 auto\",\r\n\tbackground: checked\r\n\t\t? \"var(--dsw-alias-button-primary-fill)\"\r\n\t\t: \"var(--dsw-alias-border-l4, rgba(127, 127, 127, 0.45))\",\r\n\topacity: disabled ? 0.5 : 1,\r\n\tcursor: disabled ? \"not-allowed\" : \"pointer\",\r\n\ttransition: TRANSITION,\r\n\tborder: \"none\",\r\n\tpadding: 0,\r\n});\r\n\r\nconst thumbStyle = (checked: boolean): CSSProperties => ({\r\n\tposition: \"absolute\",\r\n\ttop: 2,\r\n\tleft: checked ? 20 : 2,\r\n\twidth: 18,\r\n\theight: 18,\r\n\tborderRadius: \"50%\",\r\n\t// Match DSH primary fill/foreground pairing so the thumb stays visible when\r\n\t// dark theme inverts brand-primary to near-white.\r\n\tbackground: checked ? \"var(--dsw-alias-label-primary-foreground)\" : \"var(--dsw-alias-button-elevated-fill)\",\r\n\tboxShadow: \"0 1px 3px rgba(0, 0, 0, 0.25)\",\r\n\ttransition: TRANSITION,\r\n});\r\n\r\nexport function ToggleSwitch({\r\n\tchecked,\r\n\tdisabled = false,\r\n\tonChange,\r\n\tariaLabel,\r\n\tariaDescribedBy,\r\n\tid,\r\n}: ToggleSwitchProps) {\r\n\treturn (\r\n\t\t<button\r\n\t\t\tid={id}\r\n\t\t\ttype=\"button\"\r\n\t\t\trole=\"switch\"\r\n\t\t\taria-checked={checked}\r\n\t\t\taria-label={ariaLabel}\r\n\t\t\taria-describedby={ariaDescribedBy}\r\n\t\t\tdisabled={disabled}\r\n\t\t\tstyle={trackStyle(checked, disabled)}\r\n\t\t\tonClick={() => {\r\n\t\t\t\tif (!disabled) onChange(!checked);\r\n\t\t\t}}\r\n\t\t>\r\n\t\t\t<span aria-hidden=\"true\" style={thumbStyle(checked)} />\r\n\t\t</button>\r\n\t);\r\n}\r\n", "/** Capabilities tab: Codex toggles, Grok Imagine, and limits. */\r\n\r\nimport { CAPABILITY_LIMITS, CAPABILITY_TOGGLES } from \"../constants.ts\";\r\nimport { imagineSourceLabel } from \"../parsers.ts\";\r\nimport {\r\n\tbodyStyle,\r\n\tbuttonStyle,\r\n\tcardStyle,\r\n\tdotStyle,\r\n\terrorStyle,\r\n\thintStyle,\r\n\tinputStyle,\r\n\tlistStyle,\r\n\tnestedStyle,\r\n\trowStyle,\r\n\tskeletonStyle,\r\n\tstatusStyle,\r\n\ttitleStyle,\r\n} from \"../styles.ts\";\r\nimport type {\r\n\tCapabilitySettingKey,\r\n\tCapabilitySnapshot,\r\n\tGrokBuildSettingsInjected,\r\n\tImagineCredentialView,\r\n} from \"../types.ts\";\r\nimport { Badge } from \"./Badge.tsx\";\r\nimport { ToggleSwitch } from \"./ToggleSwitch.tsx\";\r\n\r\nexport interface CapabilitiesTabProps {\r\n\tt: GrokBuildSettingsInjected[\"t\"];\r\n\tcapabilities: CapabilitySnapshot | undefined;\r\n\tcapabilitiesError: string | undefined;\r\n\tcapabilitiesBusy: boolean;\r\n\timagine: ImagineCredentialView | undefined;\r\n\timagineError: string | undefined;\r\n\tcodexSignedIn: boolean;\r\n\tonRetry: () => void;\r\n\tonOpenAccounts: (provider: \"codex\") => void;\r\n\tonFocusDependency: (target: \"codexImages\" | \"imagineCredential\") => void;\r\n\tonPatchCapability: (key: CapabilitySettingKey, value: boolean | number) => Promise<boolean | undefined> | undefined;\r\n}\r\n\r\nexport function CapabilitiesTab({\r\n\tt,\r\n\tcapabilities,\r\n\tcapabilitiesError,\r\n\tcapabilitiesBusy,\r\n\timagine,\r\n\timagineError,\r\n\tcodexSignedIn,\r\n\tonRetry,\r\n\tonOpenAccounts,\r\n\tonFocusDependency,\r\n\tonPatchCapability,\r\n}: CapabilitiesTabProps) {\r\n\tconst codexToggles = CAPABILITY_TOGGLES.filter((item) => !item.key.startsWith(\"grokImagine\"));\r\n\tconst imagineToggles = CAPABILITY_TOGGLES.filter((item) => item.key.startsWith(\"grokImagine\"));\r\n\r\n\treturn (\r\n\t\t<section style={cardStyle} aria-labelledby=\"coding-oauth-capabilities-title\">\r\n\t\t\t<div>\r\n\t\t\t\t<h3 id=\"coding-oauth-capabilities-title\" style={{ ...titleStyle, fontSize: 16 }}>\r\n\t\t\t\t\t{t(\"capabilitiesTitle\")}\r\n\t\t\t\t</h3>\r\n\t\t\t\t<p style={{ ...bodyStyle, marginTop: 4 }}>{t(\"capabilitiesIntro\")}</p>\r\n\t\t\t</div>\r\n\t\t\t{imagineError === undefined ? null : (\r\n\t\t\t\t<div style={nestedStyle} role=\"alert\">\r\n\t\t\t\t\t<p style={errorStyle}>{imagineError}</p>\r\n\t\t\t\t\t<button type=\"button\" style={buttonStyle} onClick={onRetry}>\r\n\t\t\t\t\t\t{t(\"retry\")}\r\n\t\t\t\t\t</button>\r\n\t\t\t\t</div>\r\n\t\t\t)}\r\n\t\t\t{imagine === undefined && imagineError === undefined ? (\r\n\t\t\t\t<div style={skeletonStyle} role=\"status\" aria-busy=\"true\">\r\n\t\t\t\t\t<div style={statusStyle}>\r\n\t\t\t\t\t\t<span aria-hidden=\"true\" style={dotStyle(\"loading\")} />\r\n\t\t\t\t\t\t{t(\"imagineLoading\")}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t) : imagine === undefined ? null : (\r\n\t\t\t\t<div id=\"coding-oauth-imagine-credential\" style={nestedStyle} tabIndex={-1}>\r\n\t\t\t\t\t<Badge\r\n\t\t\t\t\t\tlabel={imagine.configured ? t(\"imagineConfigured\") : t(\"imagineNotConfigured\")}\r\n\t\t\t\t\t\ttone={imagine.configured ? \"success\" : \"neutral\"}\r\n\t\t\t\t\t/>\r\n\t\t\t\t\t<p style={hintStyle}>{t(\"imagineSource\", { source: imagineSourceLabel(imagine.source, t) })}</p>\r\n\t\t\t\t</div>\r\n\t\t\t)}\r\n\t\t\t{capabilitiesError === undefined ? null : (\r\n\t\t\t\t<div style={nestedStyle} role=\"alert\">\r\n\t\t\t\t\t<p style={errorStyle}>{capabilitiesError}</p>\r\n\t\t\t\t\t<button type=\"button\" style={buttonStyle} onClick={onRetry}>\r\n\t\t\t\t\t\t{t(\"retry\")}\r\n\t\t\t\t\t</button>\r\n\t\t\t\t</div>\r\n\t\t\t)}\r\n\t\t\t{capabilities === undefined && capabilitiesError === undefined ? (\r\n\t\t\t\t<div style={skeletonStyle} role=\"status\" aria-busy=\"true\">\r\n\t\t\t\t\t<div style={statusStyle}>\r\n\t\t\t\t\t\t<span aria-hidden=\"true\" style={dotStyle(\"loading\")} />\r\n\t\t\t\t\t\t{t(\"capabilitiesLoading\")}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t) : capabilities === undefined ? null : (\r\n\t\t\t\t<fieldset style={{ border: 0, margin: 0, padding: 0, minWidth: 0 }}>\r\n\t\t\t\t\t<legend style={{ ...bodyStyle, position: \"absolute\", width: 1, height: 1, overflow: \"hidden\" }}>\r\n\t\t\t\t\t\t{t(\"capabilitiesTitle\")}\r\n\t\t\t\t\t</legend>\r\n\t\t\t\t\t{capabilities.writable ? null : <p style={hintStyle}>{t(\"capabilitiesReadOnly\")}</p>}\r\n\t\t\t\t\t<ul style={listStyle}>\r\n\t\t\t\t\t\t{codexToggles.map((item) => {\r\n\t\t\t\t\t\t\tconst checked = capabilities.value[item.key];\r\n\t\t\t\t\t\t\tconst imagesOff = item.requiresImages === true && !capabilities.value.codexImages;\r\n\t\t\t\t\t\t\tconst dependencyReason = !codexSignedIn\r\n\t\t\t\t\t\t\t\t? t(\"requiresCodexSignIn\")\r\n\t\t\t\t\t\t\t\t: imagesOff\r\n\t\t\t\t\t\t\t\t\t? t(\"requiresCodexImages\")\r\n\t\t\t\t\t\t\t\t\t: undefined;\r\n\t\t\t\t\t\t\tconst disabled = capabilitiesBusy || !capabilities.writable || dependencyReason !== undefined;\r\n\t\t\t\t\t\t\tconst switchId = `cap-switch-${item.key}`;\r\n\t\t\t\t\t\t\tconst repairAction = !codexSignedIn\r\n\t\t\t\t\t\t\t\t? { label: t(\"openCodexAccount\"), action: () => onOpenAccounts(\"codex\") }\r\n\t\t\t\t\t\t\t\t: imagesOff\r\n\t\t\t\t\t\t\t\t\t? { label: t(\"focusCodexImages\"), action: () => onFocusDependency(\"codexImages\") }\r\n\t\t\t\t\t\t\t\t\t: undefined;\r\n\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t<li\r\n\t\t\t\t\t\t\t\t\tkey={item.key}\r\n\t\t\t\t\t\t\t\t\tstyle={{\r\n\t\t\t\t\t\t\t\t\t\topacity: dependencyReason === undefined ? 1 : 0.65,\r\n\t\t\t\t\t\t\t\t\t\ttransition: \"opacity 0.15s ease\",\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t<div style={{ ...rowStyle, alignItems: \"flex-start\" }}>\r\n\t\t\t\t\t\t\t\t\t\t<label htmlFor={switchId} style={{ flex: \"1 1 360px\", cursor: disabled ? \"default\" : \"pointer\" }}>\r\n\t\t\t\t\t\t\t\t\t\t\t<span style={{ display: \"block\", fontSize: 14, color: \"var(--dsw-alias-label-primary)\" }}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{t(item.label)}\r\n\t\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t\t\t<span id={`cap-hint-${item.key}`} style={{ display: \"block\", ...hintStyle }}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{dependencyReason ?? t(item.hint)}\r\n\t\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t\t\t\t\t{repairAction === undefined ? null : (\r\n\t\t\t\t\t\t\t\t\t\t\t<button type=\"button\" style={buttonStyle} onClick={repairAction.action}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{repairAction.label}\r\n\t\t\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t\t\t<ToggleSwitch\r\n\t\t\t\t\t\t\t\t\t\t\tid={switchId}\r\n\t\t\t\t\t\t\t\t\t\t\tchecked={checked}\r\n\t\t\t\t\t\t\t\t\t\t\tdisabled={disabled}\r\n\t\t\t\t\t\t\t\t\t\t\tariaLabel={t(item.label)}\r\n\t\t\t\t\t\t\t\t\t\t\tariaDescribedBy={`cap-hint-${item.key}`}\r\n\t\t\t\t\t\t\t\t\t\t\tonChange={(next) => {\r\n\t\t\t\t\t\t\t\t\t\t\t\tvoid onPatchCapability(item.key, next);\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t</li>\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t})}\r\n\t\t\t\t\t</ul>\r\n\t\t\t\t\t<h4 style={{ ...titleStyle, fontSize: 14 }}>{t(\"imagineTitle\")}</h4>\r\n\t\t\t\t\t<ul style={listStyle}>\r\n\t\t\t\t\t\t{imagineToggles.map((item) => {\r\n\t\t\t\t\t\t\tconst checked = capabilities.value[item.key];\r\n\t\t\t\t\t\t\tconst dependencyReason = imagine?.configured === true ? undefined : t(\"requiresImagineCredential\");\r\n\t\t\t\t\t\t\tconst disabled = capabilitiesBusy || !capabilities.writable || dependencyReason !== undefined;\r\n\t\t\t\t\t\t\tconst switchId = `cap-switch-${item.key}`;\r\n\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t<li key={item.key}>\r\n\t\t\t\t\t\t\t\t\t<div style={{ ...rowStyle, alignItems: \"flex-start\" }}>\r\n\t\t\t\t\t\t\t\t\t\t<label htmlFor={switchId} style={{ flex: \"1 1 360px\", cursor: disabled ? \"default\" : \"pointer\" }}>\r\n\t\t\t\t\t\t\t\t\t\t\t<span style={{ display: \"block\", fontSize: 14, color: \"var(--dsw-alias-label-primary)\" }}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{t(item.label)}\r\n\t\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t\t\t<span id={`cap-hint-${item.key}`} style={{ display: \"block\", ...hintStyle }}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{dependencyReason ?? t(item.hint)}\r\n\t\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t\t\t\t\t{dependencyReason === undefined ? null : (\r\n\t\t\t\t\t\t\t\t\t\t\t<button type=\"button\" style={buttonStyle} onClick={() => onFocusDependency(\"imagineCredential\")}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{t(\"focusImagineCredential\")}\r\n\t\t\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t\t\t<ToggleSwitch\r\n\t\t\t\t\t\t\t\t\t\t\tid={switchId}\r\n\t\t\t\t\t\t\t\t\t\t\tchecked={checked}\r\n\t\t\t\t\t\t\t\t\t\t\tdisabled={disabled}\r\n\t\t\t\t\t\t\t\t\t\t\tariaLabel={t(item.label)}\r\n\t\t\t\t\t\t\t\t\t\t\tariaDescribedBy={`cap-hint-${item.key}`}\r\n\t\t\t\t\t\t\t\t\t\t\tonChange={(next) => {\r\n\t\t\t\t\t\t\t\t\t\t\t\tvoid onPatchCapability(item.key, next);\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t</li>\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t})}\r\n\t\t\t\t\t</ul>\r\n\t\t\t\t\t<div style={nestedStyle}>\r\n\t\t\t\t\t\t<h4 style={{ ...titleStyle, fontSize: 14 }}>{t(\"capabilityLimitsTitle\")}</h4>\r\n\t\t\t\t\t\t<p style={hintStyle}>{t(\"capabilityLimitsHint\")}</p>\r\n\t\t\t\t\t\t<ul style={listStyle}>\r\n\t\t\t\t\t\t\t{CAPABILITY_LIMITS.map((item) => {\r\n\t\t\t\t\t\t\t\tconst displayValue = capabilities.value[item.key] / item.scale;\r\n\t\t\t\t\t\t\t\tconst inputId = `cap-limit-${item.key}`;\r\n\t\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t\t<li key={item.key} style={rowStyle}>\r\n\t\t\t\t\t\t\t\t\t\t<label htmlFor={inputId} style={{ ...bodyStyle, flex: \"1 1 360px\" }}>\r\n\t\t\t\t\t\t\t\t\t\t\t<span style={{ display: \"block\", color: \"var(--dsw-alias-label-primary)\" }}>{t(item.label)}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t<span id={`${inputId}-hint`} style={{ display: \"block\", ...hintStyle }}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{t(item.hint)}\r\n\t\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t\t\t\t\t<input\r\n\t\t\t\t\t\t\t\t\t\t\tkey={`${item.key}-${String(capabilities.revision)}-${String(displayValue)}`}\r\n\t\t\t\t\t\t\t\t\t\t\tid={inputId}\r\n\t\t\t\t\t\t\t\t\t\t\ttype=\"number\"\r\n\t\t\t\t\t\t\t\t\t\t\tinputMode=\"numeric\"\r\n\t\t\t\t\t\t\t\t\t\t\tmin={item.min}\r\n\t\t\t\t\t\t\t\t\t\t\tmax={item.max}\r\n\t\t\t\t\t\t\t\t\t\t\tstep={1}\r\n\t\t\t\t\t\t\t\t\t\t\tdefaultValue={displayValue}\r\n\t\t\t\t\t\t\t\t\t\t\tdisabled={capabilitiesBusy || !capabilities.writable}\r\n\t\t\t\t\t\t\t\t\t\t\taria-describedby={`${inputId}-hint`}\r\n\t\t\t\t\t\t\t\t\t\t\tstyle={{ ...inputStyle, width: 112, flex: \"0 0 112px\" }}\r\n\t\t\t\t\t\t\t\t\t\t\tonInput={(event) => {\r\n\t\t\t\t\t\t\t\t\t\t\t\tevent.currentTarget.setCustomValidity(\"\");\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\tonKeyDown={(event) => {\r\n\t\t\t\t\t\t\t\t\t\t\t\tif (event.key === \"Enter\") event.currentTarget.blur();\r\n\t\t\t\t\t\t\t\t\t\t\t\tif (event.key === \"Escape\") {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tevent.currentTarget.value = String(displayValue);\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tevent.currentTarget.setCustomValidity(\"\");\r\n\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\tonBlur={(event) => {\r\n\t\t\t\t\t\t\t\t\t\t\t\tconst target = event.currentTarget;\r\n\t\t\t\t\t\t\t\t\t\t\t\tconst next = Number(target.value);\r\n\t\t\t\t\t\t\t\t\t\t\t\tif (!Number.isInteger(next) || next < item.min || next > item.max) {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\ttarget.setCustomValidity(t(\"capabilityLimitInvalid\", { min: item.min, max: item.max }));\r\n\t\t\t\t\t\t\t\t\t\t\t\t\ttarget.reportValidity();\r\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\ttarget.setCustomValidity(\"\");\r\n\t\t\t\t\t\t\t\t\t\t\t\tconst apiValue = next * item.scale;\r\n\t\t\t\t\t\t\t\t\t\t\t\tif (apiValue === capabilities.value[item.key]) return;\r\n\t\t\t\t\t\t\t\t\t\t\t\tvoid Promise.resolve(onPatchCapability(item.key, apiValue)).then((saved) => {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (saved === false && target.isConnected) target.value = String(displayValue);\r\n\t\t\t\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t</li>\r\n\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t})}\r\n\t\t\t\t\t\t</ul>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</fieldset>\r\n\t\t\t)}\r\n\t\t</section>\r\n\t);\r\n}\r\n", "/** Local API gateway settings tab. */\r\n\r\nimport { type KeyboardEvent, useEffect, useMemo, useRef, useState } from \"react\";\r\nimport { GATEWAY_PORT_MAX, GATEWAY_PORT_MIN } from \"../constants.ts\";\r\nimport { buildGatewaySnippets, type GatewaySnippetId } from \"../gatewaySnippets.ts\";\r\nimport { formatGatewayBaseUrl, parseGatewayPort, randomGatewayPort } from \"../parsers.ts\";\r\nimport {\r\n\tbodyStyle,\r\n\tbuttonStyle,\r\n\tcardStyle,\r\n\tcopyRowStyle,\r\n\tdotStyle,\r\n\terrorStyle,\r\n\thintStyle,\r\n\tinputStyle,\r\n\tmonoStyle,\r\n\tnestedStyle,\r\n\tprimaryButtonStyle,\r\n\tsegmentedNavStyle,\r\n\tsegmentedTabActiveStyle,\r\n\tsegmentedTabStyle,\r\n\tskeletonStyle,\r\n\tsnippetStyle,\r\n\tstatusStyle,\r\n\ttitleStyle,\r\n\twarningStyle,\r\n} from \"../styles.ts\";\r\nimport type { CopyField, GatewayView, GrokBuildSettingsInjected } from \"../types.ts\";\r\nimport { Badge } from \"./Badge.tsx\";\r\nimport { CopyButton } from \"./CopyButton.tsx\";\r\nimport { ToggleSwitch } from \"./ToggleSwitch.tsx\";\r\n\r\nexport interface GatewayTabProps {\r\n\tt: GrokBuildSettingsInjected[\"t\"];\r\n\tgateway: GatewayView | undefined;\r\n\tgatewayError: string | undefined;\r\n\tgatewayBusy: boolean;\r\n\tgatewayOnceKey: string | undefined;\r\n\tgatewayKeyVisible: boolean;\r\n\tgatewayRotateConfirm: boolean;\r\n\tgatewayRevealError: string | undefined;\r\n\tportDraft: string;\r\n\tcopiedField: CopyField | undefined;\r\n\tcopyFailedField: CopyField | undefined;\r\n\tonEnabledChange: (enabled: boolean) => void;\r\n\tonRetry: () => void;\r\n\tonPortDraftChange: (value: string) => void;\r\n\tonApplyPort: () => void;\r\n\tonRandomPort: (port: number) => void;\r\n\tonCopy: (field: CopyField, text: string) => void;\r\n\tonCopyKey: () => void;\r\n\tonToggleKeyVisible: () => void;\r\n\tonRotateConfirm: () => void;\r\n\tonRotateCancel: () => void;\r\n\tonRotate: () => void;\r\n}\r\n\r\nconst SNIPPET_TABS: readonly {\r\n\tid: GatewaySnippetId;\r\n\tlabelKey: \"gatewaySnippetCurl\" | \"gatewaySnippetPython\" | \"gatewaySnippetIde\";\r\n}[] = [\r\n\t{ id: \"curl\", labelKey: \"gatewaySnippetCurl\" },\r\n\t{ id: \"python\", labelKey: \"gatewaySnippetPython\" },\r\n\t{ id: \"ide\", labelKey: \"gatewaySnippetIde\" },\r\n];\r\n\r\nexport function GatewayTab({\r\n\tt,\r\n\tgateway,\r\n\tgatewayError,\r\n\tgatewayBusy,\r\n\tgatewayOnceKey,\r\n\tgatewayKeyVisible,\r\n\tgatewayRotateConfirm,\r\n\tgatewayRevealError,\r\n\tportDraft,\r\n\tcopiedField,\r\n\tcopyFailedField,\r\n\tonEnabledChange,\r\n\tonRetry,\r\n\tonPortDraftChange,\r\n\tonApplyPort,\r\n\tonRandomPort,\r\n\tonCopyKey,\r\n\tonToggleKeyVisible,\r\n\tonRotateConfirm,\r\n\tonRotateCancel,\r\n\tonRotate,\r\n}: GatewayTabProps) {\r\n\tconst [enableConfirm, setEnableConfirm] = useState(false);\r\n\tconst [activeSnippet, setActiveSnippet] = useState<GatewaySnippetId>(\"curl\");\r\n\tconst enableConfirmAction = useRef<HTMLButtonElement>(null);\r\n\tconst rotateTrigger = useRef<HTMLButtonElement>(null);\r\n\tconst rotateConfirmAction = useRef<HTMLButtonElement>(null);\r\n\tconst restoreEnableFocus = useRef(false);\r\n\tconst restoreRotateFocus = useRef(false);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (enableConfirm) {\r\n\t\t\tenableConfirmAction.current?.focus();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!restoreEnableFocus.current) return;\r\n\t\trestoreEnableFocus.current = false;\r\n\t\tdocument.getElementById(\"coding-oauth-gateway-enabled\")?.focus();\r\n\t}, [enableConfirm]);\r\n\tuseEffect(() => {\r\n\t\tif (gatewayRotateConfirm) {\r\n\t\t\trotateConfirmAction.current?.focus();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!restoreRotateFocus.current) return;\r\n\t\trestoreRotateFocus.current = false;\r\n\t\trotateTrigger.current?.focus();\r\n\t}, [gatewayRotateConfirm]);\r\n\r\n\tconst portValid = parseGatewayPort(portDraft) !== undefined;\r\n\tconst portChanged = gateway !== undefined && portDraft !== String(gateway.port);\r\n\r\n\tconst snippets = useMemo(() => {\r\n\t\tif (gateway === undefined || !gatewayKeyVisible || gatewayOnceKey === undefined || gateway.models.length === 0) {\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\t\tconst openAi = `${formatGatewayBaseUrl(gateway.bind, gateway.port)}/v1`;\r\n\t\tconst anthropic = formatGatewayBaseUrl(gateway.bind, gateway.port);\r\n\t\t// A masked keyHint is display-only and can never produce an executable command.\r\n\t\treturn buildGatewaySnippets(openAi, anthropic, gatewayOnceKey, gateway.models[0]);\r\n\t}, [gateway, gatewayKeyVisible, gatewayOnceKey]);\r\n\r\n\tconst copyLabel = (field: CopyField, idle?: string): string => {\r\n\t\tif (copyFailedField === field) return t(\"copyFailed\");\r\n\t\tif (copiedField === field) return t(\"copied\");\r\n\t\treturn idle ?? t(\"copy\");\r\n\t};\r\n\r\n\tconst focusSnippetTab = (index: number): void => {\r\n\t\tconst tab = SNIPPET_TABS[index];\r\n\t\tif (tab === undefined) return;\r\n\t\tsetActiveSnippet(tab.id);\r\n\t\tdocument.getElementById(`coding-oauth-snippet-tab-${tab.id}`)?.focus();\r\n\t};\r\n\r\n\tconst onSnippetKeyDown = (event: KeyboardEvent<HTMLDivElement>): void => {\r\n\t\tconst current = SNIPPET_TABS.findIndex((tab) => tab.id === activeSnippet);\r\n\t\tif (current < 0) return;\r\n\t\tif (event.key === \"ArrowRight\" || event.key === \"ArrowDown\") {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tfocusSnippetTab((current + 1) % SNIPPET_TABS.length);\r\n\t\t} else if (event.key === \"ArrowLeft\" || event.key === \"ArrowUp\") {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tfocusSnippetTab((current - 1 + SNIPPET_TABS.length) % SNIPPET_TABS.length);\r\n\t\t} else if (event.key === \"Home\") {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tfocusSnippetTab(0);\r\n\t\t} else if (event.key === \"End\") {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tfocusSnippetTab(SNIPPET_TABS.length - 1);\r\n\t\t}\r\n\t};\r\n\r\n\tconst openAiUrl = gateway === undefined ? \"\" : `${formatGatewayBaseUrl(gateway.bind, gateway.port)}/v1`;\r\n\tconst anthropicUrl = gateway === undefined ? \"\" : formatGatewayBaseUrl(gateway.bind, gateway.port);\r\n\r\n\treturn (\r\n\t\t<section style={cardStyle} aria-labelledby=\"coding-oauth-gateway-title\">\r\n\t\t\t<div>\r\n\t\t\t\t<h3 id=\"coding-oauth-gateway-title\" style={{ ...titleStyle, fontSize: 16 }}>\r\n\t\t\t\t\t{t(\"gatewayTitle\")}\r\n\t\t\t\t</h3>\r\n\t\t\t\t<p style={{ ...bodyStyle, marginTop: 4 }}>{t(\"gatewayIntro\")}</p>\r\n\t\t\t\t<p style={{ ...warningStyle, marginTop: 8 }}>{t(\"gatewayWarning\")}</p>\r\n\t\t\t\t<p style={{ ...hintStyle, marginTop: 8 }}>{t(\"gatewayLoopbackHint\")}</p>\r\n\t\t\t</div>\r\n\t\t\t{gatewayError === undefined ? null : (\r\n\t\t\t\t<p style={errorStyle} role=\"alert\">\r\n\t\t\t\t\t{gatewayError}\r\n\t\t\t\t</p>\r\n\t\t\t)}\r\n\t\t\t{gatewayRevealError === undefined ? null : (\r\n\t\t\t\t<p style={errorStyle} role=\"alert\">\r\n\t\t\t\t\t{gatewayRevealError}\r\n\t\t\t\t</p>\r\n\t\t\t)}\r\n\t\t\t{gateway === undefined && gatewayError === undefined ? (\r\n\t\t\t\t<div style={skeletonStyle} role=\"status\" aria-busy=\"true\">\r\n\t\t\t\t\t<div style={statusStyle}>\r\n\t\t\t\t\t\t<span aria-hidden=\"true\" style={dotStyle(\"loading\")} />\r\n\t\t\t\t\t\t{t(\"gatewayLoading\")}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t) : gateway === undefined ? (\r\n\t\t\t\t<div style={nestedStyle} role=\"status\">\r\n\t\t\t\t\t<p style={hintStyle}>{t(\"gatewayLoadFailed\")}</p>\r\n\t\t\t\t\t<button type=\"button\" style={buttonStyle} onClick={onRetry}>\r\n\t\t\t\t\t\t{t(\"retry\")}\r\n\t\t\t\t\t</button>\r\n\t\t\t\t</div>\r\n\t\t\t) : (\r\n\t\t\t\t<div style={nestedStyle}>\r\n\t\t\t\t\t<Badge\r\n\t\t\t\t\t\tlabel={gateway.running ? t(\"gatewayRunning\") : t(\"gatewayStopped\")}\r\n\t\t\t\t\t\ttone={gateway.running ? \"success\" : \"neutral\"}\r\n\t\t\t\t\t/>\r\n\t\t\t\t\t<p style={hintStyle}>\r\n\t\t\t\t\t\t{gateway.models.length > 0\r\n\t\t\t\t\t\t\t? t(\"gatewayModelsReady\", { count: gateway.models.length, model: gateway.models[0] })\r\n\t\t\t\t\t\t\t: t(\"gatewayModelsUnavailable\")}\r\n\t\t\t\t\t</p>\r\n\t\t\t\t\t<p style={hintStyle}>{gateway.keyConfigured ? t(\"gatewayKeyConfigured\") : t(\"gatewayKeyNotConfigured\")}</p>\r\n\t\t\t\t\t{enableConfirm ? (\r\n\t\t\t\t\t\t<div style={nestedStyle}>\r\n\t\t\t\t\t\t\t<p style={bodyStyle}>{t(\"gatewayEnableConfirm\")}</p>\r\n\t\t\t\t\t\t\t<div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8 }}>\r\n\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\tref={enableConfirmAction}\r\n\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\tstyle={primaryButtonStyle}\r\n\t\t\t\t\t\t\t\t\tdisabled={gatewayBusy}\r\n\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\trestoreEnableFocus.current = true;\r\n\t\t\t\t\t\t\t\t\t\tsetEnableConfirm(false);\r\n\t\t\t\t\t\t\t\t\t\tonEnabledChange(true);\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t{t(\"gatewayEnableConfirmAction\")}\r\n\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\tstyle={buttonStyle}\r\n\t\t\t\t\t\t\t\t\tdisabled={gatewayBusy}\r\n\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\trestoreEnableFocus.current = true;\r\n\t\t\t\t\t\t\t\t\t\tsetEnableConfirm(false);\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t{t(\"gatewayEnableCancel\")}\r\n\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t) : (\r\n\t\t\t\t\t\t<label\r\n\t\t\t\t\t\t\thtmlFor=\"coding-oauth-gateway-enabled\"\r\n\t\t\t\t\t\t\tstyle={{\r\n\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\tjustifyContent: \"space-between\",\r\n\t\t\t\t\t\t\t\tgap: 12,\r\n\t\t\t\t\t\t\t\tfontSize: 14,\r\n\t\t\t\t\t\t\t\tcolor: \"var(--dsw-alias-label-primary)\",\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t<span>{t(\"gatewayEnabled\")}</span>\r\n\t\t\t\t\t\t\t<ToggleSwitch\r\n\t\t\t\t\t\t\t\tid=\"coding-oauth-gateway-enabled\"\r\n\t\t\t\t\t\t\t\tchecked={gateway.enabled}\r\n\t\t\t\t\t\t\t\tdisabled={gatewayBusy}\r\n\t\t\t\t\t\t\t\tonChange={(enabled) => {\r\n\t\t\t\t\t\t\t\t\tif (enabled) {\r\n\t\t\t\t\t\t\t\t\t\tsetEnableConfirm(true);\r\n\t\t\t\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\tonEnabledChange(false);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t</label>\r\n\t\t\t\t\t)}\r\n\t\t\t\t\t<div>\r\n\t\t\t\t\t\t<label\r\n\t\t\t\t\t\t\thtmlFor=\"coding-oauth-gateway-port\"\r\n\t\t\t\t\t\t\tstyle={{ ...bodyStyle, color: \"var(--dsw-alias-label-primary)\" }}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{t(\"gatewayPort\")}\r\n\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t<p id=\"coding-oauth-gateway-port-hint\" style={hintStyle}>\r\n\t\t\t\t\t\t\t{t(\"gatewayPortHint\")}\r\n\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t{!portValid && portDraft.length > 0 ? (\r\n\t\t\t\t\t\t\t<p style={{ ...hintStyle, color: \"var(--dsw-alias-state-error-primary)\" }} role=\"alert\">\r\n\t\t\t\t\t\t\t\t{t(\"gatewayPortInvalid\")}\r\n\t\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t) : null}\r\n\t\t\t\t\t\t<div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8, marginTop: 8 }}>\r\n\t\t\t\t\t\t\t<input\r\n\t\t\t\t\t\t\t\tid=\"coding-oauth-gateway-port\"\r\n\t\t\t\t\t\t\t\ttype=\"number\"\r\n\t\t\t\t\t\t\t\tinputMode=\"numeric\"\r\n\t\t\t\t\t\t\t\tmin={GATEWAY_PORT_MIN}\r\n\t\t\t\t\t\t\t\tmax={GATEWAY_PORT_MAX}\r\n\t\t\t\t\t\t\t\tstep={1}\r\n\t\t\t\t\t\t\t\tvalue={portDraft}\r\n\t\t\t\t\t\t\t\tdisabled={gatewayBusy}\r\n\t\t\t\t\t\t\t\taria-describedby=\"coding-oauth-gateway-port-hint\"\r\n\t\t\t\t\t\t\t\taria-invalid={!portValid && portDraft.length > 0}\r\n\t\t\t\t\t\t\t\tstyle={{\r\n\t\t\t\t\t\t\t\t\t...inputStyle,\r\n\t\t\t\t\t\t\t\t\twidth: 112,\r\n\t\t\t\t\t\t\t\t\tflex: \"0 0 112px\",\r\n\t\t\t\t\t\t\t\t\tborderColor:\r\n\t\t\t\t\t\t\t\t\t\t!portValid && portDraft.length > 0\r\n\t\t\t\t\t\t\t\t\t\t\t? \"var(--dsw-alias-state-error-primary)\"\r\n\t\t\t\t\t\t\t\t\t\t\t: \"var(--dsw-alias-border-l2)\",\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\tonChange={(event) => {\r\n\t\t\t\t\t\t\t\t\tonPortDraftChange(event.target.value);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\tonKeyDown={(event) => {\r\n\t\t\t\t\t\t\t\t\tif (event.key === \"Enter\") {\r\n\t\t\t\t\t\t\t\t\t\tevent.preventDefault();\r\n\t\t\t\t\t\t\t\t\t\tonApplyPort();\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\tif (event.key === \"Escape\") {\r\n\t\t\t\t\t\t\t\t\t\tonPortDraftChange(String(gateway.port));\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tstyle={primaryButtonStyle}\r\n\t\t\t\t\t\t\t\tdisabled={gatewayBusy || !portChanged || !portValid}\r\n\t\t\t\t\t\t\t\tonClick={onApplyPort}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{t(\"gatewayPortApply\")}\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tstyle={buttonStyle}\r\n\t\t\t\t\t\t\t\tdisabled={gatewayBusy}\r\n\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\tonRandomPort(randomGatewayPort(gateway.port));\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{t(\"gatewayPortRandom\")}\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<p style={copyRowStyle}>\r\n\t\t\t\t\t\t<span style={hintStyle}>\r\n\t\t\t\t\t\t\t{t(\"gatewayOpenAiUrl\")}\r\n\t\t\t\t\t\t\t<span style={{ display: \"block\", ...monoStyle }}>{openAiUrl}</span>\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t<CopyButton\r\n\t\t\t\t\t\t\ttext={openAiUrl}\r\n\t\t\t\t\t\t\tidleLabel={t(\"copy\")}\r\n\t\t\t\t\t\t\tcopiedLabel={t(\"copied\")}\r\n\t\t\t\t\t\t\tfailedLabel={t(\"copyFailed\")}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</p>\r\n\t\t\t\t\t<p style={copyRowStyle}>\r\n\t\t\t\t\t\t<span style={hintStyle}>\r\n\t\t\t\t\t\t\t{t(\"gatewayAnthropicUrl\")}\r\n\t\t\t\t\t\t\t<span style={{ display: \"block\", ...monoStyle }}>{anthropicUrl}</span>\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t<CopyButton\r\n\t\t\t\t\t\t\ttext={anthropicUrl}\r\n\t\t\t\t\t\t\tidleLabel={t(\"copy\")}\r\n\t\t\t\t\t\t\tcopiedLabel={t(\"copied\")}\r\n\t\t\t\t\t\t\tfailedLabel={t(\"copyFailed\")}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</p>\r\n\t\t\t\t\t<p style={copyRowStyle}>\r\n\t\t\t\t\t\t<span style={hintStyle}>\r\n\t\t\t\t\t\t\t{t(\"gatewayKeyHint\")}\r\n\t\t\t\t\t\t\t<span style={{ display: \"block\", ...monoStyle, overflowWrap: \"anywhere\" }}>\r\n\t\t\t\t\t\t\t\t{gatewayKeyVisible && gatewayOnceKey !== undefined ? gatewayOnceKey : gateway.keyHint || \"\u2014\"}\r\n\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t<span style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8 }}>\r\n\t\t\t\t\t\t\t<button type=\"button\" style={primaryButtonStyle} disabled={gatewayBusy} onClick={onCopyKey}>\r\n\t\t\t\t\t\t\t\t{copyLabel(\"key\", t(\"gatewayCopyKey\"))}\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t<button type=\"button\" style={buttonStyle} disabled={gatewayBusy} onClick={onToggleKeyVisible}>\r\n\t\t\t\t\t\t\t\t{gatewayKeyVisible ? t(\"gatewayHideKey\") : t(\"gatewayShowKey\")}\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t</p>\r\n\t\t\t\t\t<p style={hintStyle}>{t(\"gatewayKeyCopyHint\")}</p>\r\n\t\t\t\t\t{gateway.enabled && snippets !== undefined ? (\r\n\t\t\t\t\t\t<div style={{ display: \"flex\", flexDirection: \"column\", gap: 10 }}>\r\n\t\t\t\t\t\t\t<h4 style={{ ...titleStyle, fontSize: 14 }}>{t(\"gatewaySnippetsTitle\")}</h4>\r\n\t\t\t\t\t\t\t<div\r\n\t\t\t\t\t\t\t\trole=\"tablist\"\r\n\t\t\t\t\t\t\t\taria-label={t(\"gatewaySnippetsTitle\")}\r\n\t\t\t\t\t\t\t\tstyle={segmentedNavStyle}\r\n\t\t\t\t\t\t\t\tonKeyDown={onSnippetKeyDown}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{SNIPPET_TABS.map((tab) => {\r\n\t\t\t\t\t\t\t\t\tconst selected = activeSnippet === tab.id;\r\n\t\t\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\t\tkey={tab.id}\r\n\t\t\t\t\t\t\t\t\t\t\tid={`coding-oauth-snippet-tab-${tab.id}`}\r\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\t\t\trole=\"tab\"\r\n\t\t\t\t\t\t\t\t\t\t\taria-selected={selected}\r\n\t\t\t\t\t\t\t\t\t\t\taria-controls=\"coding-oauth-snippet-panel\"\r\n\t\t\t\t\t\t\t\t\t\t\ttabIndex={selected ? 0 : -1}\r\n\t\t\t\t\t\t\t\t\t\t\tstyle={selected ? segmentedTabActiveStyle : segmentedTabStyle}\r\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\t\t\tsetActiveSnippet(tab.id);\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t{t(tab.labelKey)}\r\n\t\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t\t})}\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div\r\n\t\t\t\t\t\t\t\tid=\"coding-oauth-snippet-panel\"\r\n\t\t\t\t\t\t\t\trole=\"tabpanel\"\r\n\t\t\t\t\t\t\t\taria-labelledby={`coding-oauth-snippet-tab-${activeSnippet}`}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t<code style={snippetStyle}>{snippets[activeSnippet]}</code>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<CopyButton\r\n\t\t\t\t\t\t\t\ttext={snippets[activeSnippet]}\r\n\t\t\t\t\t\t\t\tidleLabel={t(\"copy\")}\r\n\t\t\t\t\t\t\t\tcopiedLabel={t(\"copied\")}\r\n\t\t\t\t\t\t\t\tfailedLabel={t(\"copyFailed\")}\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t) : gateway.enabled ? (\r\n\t\t\t\t\t\t<p style={hintStyle}>{t(\"gatewaySnippetsUnavailable\")}</p>\r\n\t\t\t\t\t) : null}\r\n\t\t\t\t\t{gatewayRotateConfirm ? (\r\n\t\t\t\t\t\t<div style={nestedStyle}>\r\n\t\t\t\t\t\t\t<p style={bodyStyle}>{t(\"gatewayRotateConfirm\")}</p>\r\n\t\t\t\t\t\t\t<p style={hintStyle}>{t(\"gatewayRotateConfirmHint\")}</p>\r\n\t\t\t\t\t\t\t<div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8 }}>\r\n\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\tref={rotateConfirmAction}\r\n\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\tstyle={primaryButtonStyle}\r\n\t\t\t\t\t\t\t\t\tdisabled={gatewayBusy}\r\n\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\trestoreRotateFocus.current = true;\r\n\t\t\t\t\t\t\t\t\t\tonRotate();\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t{t(\"gatewayRotateConfirmAction\")}\r\n\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\tstyle={buttonStyle}\r\n\t\t\t\t\t\t\t\t\tdisabled={gatewayBusy}\r\n\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\trestoreRotateFocus.current = true;\r\n\t\t\t\t\t\t\t\t\t\tonRotateCancel();\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t{t(\"gatewayRotateCancel\")}\r\n\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t) : (\r\n\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\tref={rotateTrigger}\r\n\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\tstyle={buttonStyle}\r\n\t\t\t\t\t\t\tdisabled={gatewayBusy}\r\n\t\t\t\t\t\t\tonClick={onRotateConfirm}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{t(\"gatewayRotate\")}\r\n\t\t\t\t\t\t</button>\r\n\t\t\t\t\t)}\r\n\t\t\t\t</div>\r\n\t\t\t)}\r\n\t\t</section>\r\n\t);\r\n}\r\n", "/** Quick-setup code snippets for the local API gateway. */\r\n\r\nexport type GatewaySnippetId = \"curl\" | \"python\" | \"ide\";\r\n\r\nexport function buildGatewaySnippets(\r\n\topenAiBaseUrl: string,\r\n\tanthropicBaseUrl: string,\r\n\tapiKeyPlaceholder: string,\r\n\tmodel = \"<gateway-model>\",\r\n): Record<GatewaySnippetId, string> {\r\n\tconst key = apiKeyPlaceholder.length > 0 ? apiKeyPlaceholder : \"<your-gateway-key>\";\r\n\treturn {\r\n\t\tcurl: `curl ${openAiBaseUrl}/chat/completions \\\\\r\n -H \"Authorization: Bearer ${key}\" \\\\\r\n -H \"Content-Type: application/json\" \\\\\r\n -d '{\"model\":\"${model}\",\"messages\":[{\"role\":\"user\",\"content\":\"Hello\"}]}'`,\r\n\t\tpython: `from openai import OpenAI\r\n\r\nclient = OpenAI(\r\n base_url=\"${openAiBaseUrl}\",\r\n api_key=\"${key}\",\r\n)\r\n\r\nresponse = client.chat.completions.create(\r\n model=\"${model}\",\r\n messages=[{\"role\": \"user\", \"content\": \"Hello\"}],\r\n)\r\nprint(response.choices[0].message.content)`,\r\n\t\tide: `# OpenAI-compatible client\r\nbase_url: ${openAiBaseUrl}\r\napi_key: ${key}\r\n\r\n# Anthropic-compatible client\r\nbase_url: ${anthropicBaseUrl}\r\napi_key: ${key}`,\r\n\t};\r\n}\r\n", "/** Accessible segmented tablist for Coding OAuth settings. */\r\n\r\nimport type { KeyboardEvent } from \"react\";\r\nimport { SETTINGS_TABS } from \"../constants.ts\";\r\nimport { segmentedNavStyle, segmentedTabActiveStyle, segmentedTabStyle } from \"../styles.ts\";\r\nimport type { GrokBuildSettingsInjected, SettingsTabId } from \"../types.ts\";\r\n\r\nexport interface SettingsTabHint {\r\n\tid: SettingsTabId;\r\n\tsuffix?: string;\r\n}\r\n\r\nexport interface SettingsTabsProps {\r\n\tt: GrokBuildSettingsInjected[\"t\"];\r\n\tactiveTab: SettingsTabId;\r\n\tonChange: (tab: SettingsTabId) => void;\r\n\thints?: readonly SettingsTabHint[];\r\n}\r\n\r\nexport function SettingsTabs({ t, activeTab, onChange, hints }: SettingsTabsProps) {\r\n\tconst hintFor = (id: SettingsTabId): string | undefined => hints?.find((entry) => entry.id === id)?.suffix;\r\n\r\n\tconst focusTab = (index: number): void => {\r\n\t\tconst tab = SETTINGS_TABS[index];\r\n\t\tif (tab === undefined) return;\r\n\t\tonChange(tab.id);\r\n\t\tconst button = document.getElementById(`coding-oauth-tab-${tab.id}`);\r\n\t\tbutton?.focus();\r\n\t};\r\n\r\n\tconst onKeyDown = (event: KeyboardEvent<HTMLDivElement>): void => {\r\n\t\tconst current = SETTINGS_TABS.findIndex((tab) => tab.id === activeTab);\r\n\t\tif (current < 0) return;\r\n\t\tif (event.key === \"ArrowRight\" || event.key === \"ArrowDown\") {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tfocusTab((current + 1) % SETTINGS_TABS.length);\r\n\t\t} else if (event.key === \"ArrowLeft\" || event.key === \"ArrowUp\") {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tfocusTab((current - 1 + SETTINGS_TABS.length) % SETTINGS_TABS.length);\r\n\t\t} else if (event.key === \"Home\") {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tfocusTab(0);\r\n\t\t} else if (event.key === \"End\") {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tfocusTab(SETTINGS_TABS.length - 1);\r\n\t\t}\r\n\t};\r\n\r\n\treturn (\r\n\t\t<div role=\"tablist\" aria-label={t(\"title\")} style={segmentedNavStyle} onKeyDown={onKeyDown}>\r\n\t\t\t{SETTINGS_TABS.map((tab) => {\r\n\t\t\t\tconst selected = activeTab === tab.id;\r\n\t\t\t\tconst suffix = hintFor(tab.id);\r\n\t\t\t\tconst label = suffix === undefined ? t(tab.label) : `${t(tab.label)} (${suffix})`;\r\n\t\t\t\treturn (\r\n\t\t\t\t\t<button\r\n\t\t\t\t\t\tkey={tab.id}\r\n\t\t\t\t\t\tid={`coding-oauth-tab-${tab.id}`}\r\n\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\trole=\"tab\"\r\n\t\t\t\t\t\taria-selected={selected}\r\n\t\t\t\t\t\taria-controls={selected ? `coding-oauth-panel-${tab.id}` : undefined}\r\n\t\t\t\t\t\ttabIndex={selected ? 0 : -1}\r\n\t\t\t\t\t\tstyle={selected ? segmentedTabActiveStyle : segmentedTabStyle}\r\n\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\tonChange(tab.id);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{label}\r\n\t\t\t\t\t</button>\r\n\t\t\t\t);\r\n\t\t\t})}\r\n\t\t</div>\r\n\t);\r\n}\r\n", "/** Injects global keyframes once for skeleton pulse and spinner animations. */\r\n\r\nconst STYLE_ID = \"dsh-coding-oauth-micro-styles\";\r\n\r\nconst CSS = `\r\n@keyframes dsh-coding-oauth-skeleton-pulse {\r\n 0% { background-position: 200% 0; }\r\n 100% { background-position: -200% 0; }\r\n}\r\n@keyframes dsh-coding-oauth-spin {\r\n from { transform: rotate(0deg); }\r\n to { transform: rotate(360deg); }\r\n}\r\n@keyframes dsh-coding-oauth-fade-in {\r\n from { opacity: 0; transform: translateY(-4px); }\r\n to { opacity: 1; transform: translateY(0); }\r\n}\r\n@media (prefers-reduced-motion: reduce) {\r\n [data-dsh-coding-oauth] *, [data-dsh-coding-oauth] *::before, [data-dsh-coding-oauth] *::after {\r\n animation-duration: 0.01ms !important;\r\n animation-iteration-count: 1 !important;\r\n transition-duration: 0.01ms !important;\r\n scroll-behavior: auto !important;\r\n }\r\n}\r\n@media (max-width: 560px) {\r\n [data-dsh-coding-oauth] button,\r\n [data-dsh-coding-oauth] input,\r\n [data-dsh-coding-oauth] [role=\"switch\"] {\r\n min-height: 44px;\r\n }\r\n [data-dsh-coding-oauth] [data-responsive-row] {\r\n align-items: stretch !important;\r\n flex-direction: column;\r\n }\r\n}\r\n`;\r\n\r\nlet injected = false;\r\n\r\nexport function ensureMicroStyles(): void {\r\n\tif (injected || typeof document === \"undefined\") return;\r\n\tif (document.getElementById(STYLE_ID) !== null) {\r\n\t\tinjected = true;\r\n\t\treturn;\r\n\t}\r\n\tconst style = document.createElement(\"style\");\r\n\tstyle.id = STYLE_ID;\r\n\tstyle.textContent = CSS;\r\n\tdocument.head.appendChild(style);\r\n\tinjected = true;\r\n}\r\n", "/** English copy for the Coding OAuth settings section. */\r\nexport const en = {\r\n\tnav: \"Coding OAuth\",\r\n\ttitle: \"Coding subscriptions\",\r\n\tintro:\r\n\t\t\"Use your own Grok Build, ChatGPT Codex, Kimi Code, and Claude Code subscriptions in dsh. API-key routes remain separate.\",\r\n\ttermsWarning:\r\n\t\t\"These are unofficial third-party integrations with subscription services. Provider terms, quotas, regions, and account-risk policies still apply.\",\r\n\tloadingAccount: \"Loading accounts\u2026\",\r\n\tsignedOut: \"Not signed in\",\r\n\tsigningIn: \"Waiting for authorization\u2026\",\r\n\tsignedIn: \"Signed in\",\r\n\trequestFailed: \"The account request failed.\",\r\n\tretry: \"Try again\",\r\n\tcancel: \"Cancel\",\r\n\tlogout: \"Sign out\",\r\n\tlogoutConfirmTitle: \"Confirm sign-out\",\r\n\tlogoutConfirmHint: \"Sign out of this provider in dsh? Your provider account itself is not changed.\",\r\n\tlogoutConfirmAction: \"Confirm sign-out\",\r\n\tworking: \"Working\u2026\",\r\n\tcancelLogin: \"Cancel sign-in\",\r\n\tdeviceLogin: \"Sign in with device code\",\r\n\tdeviceLoginRemote: \"Sign in with device code (best for remote)\",\r\n\tbrowserLogin: \"Sign in in browser\",\r\n\tpkceLogin: \"Sign in with authorization code\",\r\n\tuserCode: \"Enter this code when the provider asks:\",\r\n\topenUrl: \"Complete sign-in at:\",\r\n\tpopupBlocked: \"The browser blocked the sign-in window. Open this URL manually:\",\r\n\tpasteCodeHint:\r\n\t\t\"Paste the authorization code or complete redirect URL returned by the provider. For local PKCE, use this only if the callback could not reach this DSH host:\",\r\n\tpasteBrowserCodeHint:\r\n\t\t\"Paste the authorization code or complete redirect URL returned by the provider to finish this browser sign-in:\",\r\n\tpasteCodePlaceholder: \"authorization code or complete redirect URL\",\r\n\tpasteCodeLabel: \"Authorization code or complete redirect URL\",\r\n\tsubmitCode: \"Submit code\",\r\n\timportGrok: \"Import from Grok CLI\",\r\n\timportHint: \"Copies ~/.grok/auth.json into dsh. A later dsh refresh may rotate the token and sign the Grok CLI out.\",\r\n\tmodels: \"Visible models\",\r\n\tcatalogLive: \"From your current xAI account\",\r\n\tcatalogCache: \"From the last successful xAI listing\",\r\n\tcatalogFallback: \"Built-in Grok baseline (live listing unavailable)\",\r\n\tcatalogError: \"Could not refresh the live Grok model list.\",\r\n\tselectAll: \"Show all\",\r\n\tmodelHint: \"Checked models appear in the model picker as\",\r\n\tgrokTitle: \"xAI Grok Build\",\r\n\tgrokDescription: \"SuperGrok / X Premium coding subscription through the Grok Build endpoint.\",\r\n\tcodexTitle: \"OpenAI Codex\",\r\n\tcodexDescription: \"ChatGPT Plus/Pro Codex entitlement. Device code is recommended for a remote DSH host.\",\r\n\tkimiTitle: \"Kimi Code\",\r\n\tkimiDescription:\r\n\t\t\"Kimi Code membership through auth.kimi.com and api.kimi.com/coding; this is not the Moonshot API-key platform.\",\r\n\tclaudeTitle: \"Claude Code\",\r\n\tclaudeDescription: \"Claude Pro/Max OAuth with Claude Code scopes and automatic refresh.\",\r\n\tantigravityTitle: \"Google Antigravity\",\r\n\tantigravityDescription: \"Provided by the separately pinned MIT dsh-agy plugin and exposed as the agy route.\",\r\n\tantigravityInstalled: \"Installed (CLI-managed)\",\r\n\tantigravityMissing: \"Not installed\",\r\n\tantigravityCliHint:\r\n\t\t\"The unauthenticated dsh-agy web export dashboard is disabled. Manage Google OAuth with the profile-local CLI when needed.\",\r\n\tantigravityCliCommand: \"dsh plugin --profile web exec dsh-agy login --headless\",\r\n\tsourcesTitle: \"Pull a copy from official CLI files\",\r\n\tsourcesIntro:\r\n\t\t\"dsh can discover a local official CLI login and pull a one-way copy into its own store. Official CLI files stay read-only and are never modified.\",\r\n\tsourcesReadOnlyHint:\r\n\t\t\"This is a one-way pull of a copy. dsh does not update, replace, or write back the official CLI documents.\",\r\n\tsourcesLoading: \"Looking for official CLI login files\u2026\",\r\n\tsourcesCheckAgain: \"Check again\",\r\n\tsourcesAvailable: \"A readable copy is available\",\r\n\tsourcesUnavailable: \"No usable copy found\",\r\n\tsourcesAllMissingHint:\r\n\t\t\"No official CLI login files were found on this host. That is normal on a remote DSH machine \u2014 use device-code sign-in instead, or check again after logging in on this same host.\",\r\n\tsourcesAvailableHint:\r\n\t\t\"An official CLI login was found on this host. You can pull a one-way copy into dsh from a provider card.\",\r\n\tsourcesPullCopy: \"Pull a copy\",\r\n\tremoteAccountsTip:\r\n\t\t\"This Settings page looks remote (not loopback). Prefer device-code sign-in; browser pop-ups and local PKCE callbacks often fail from another machine.\",\r\n\tremoteTipDismiss: \"Dismiss\",\r\n\tsourcesPreviewTitle: \"Review this copy before saving it in dsh\",\r\n\tsourcesPreviewExpires: \"CLI credential expiry: {time}\",\r\n\tsourcesTicketExpires: \"This preview expires at {time}\",\r\n\tsourcesConflict: \"Stored dsh credential: {detail}\",\r\n\tsourcesAction: \"If you continue: {detail}\",\r\n\tsourcesWarnings: \"Notes\",\r\n\tsourcesConfirmOverwrite: \"Replace the credential already stored in dsh with this copy\",\r\n\tsourcesConfirmOverwriteHint: \"A different credential is already stored. Check the box, then confirm the pull.\",\r\n\tsourcesCommit: \"Confirm pull\",\r\n\tsourcesCancelPreview: \"Cancel preview\",\r\n\tsourcesCommitSuccess: \"Copied into dsh ({action}).\",\r\n\tsourcesPreviewFailed: \"Could not prepare a copy from that CLI file.\",\r\n\tsourcesCommitFailed: \"Could not save the copy in dsh.\",\r\n\tsourcesLoadFailed: \"Could not look for official CLI login files.\",\r\n\tsourceKindGrok: \"Grok CLI\",\r\n\tsourceKindCodex: \"Codex CLI\",\r\n\tsourceKindKimi: \"Kimi Code CLI\",\r\n\tsourceKindClaude: \"Claude Code CLI\",\r\n\tsourceReasonMissing: \"No official CLI file was found at the expected location.\",\r\n\tsourceReasonUnsafe: \"The official CLI file is not safe to read (permissions or file type).\",\r\n\tsourceReasonInvalid: \"The official CLI file is present but is not a usable OAuth login.\",\r\n\tsourceReasonTooLarge: \"The official CLI file is larger than the allowed read limit.\",\r\n\tsourceConflictNone: \"dsh has no stored credential yet\",\r\n\tsourceConflictSameCredential: \"same credential already stored\",\r\n\tsourceConflictSameAccount: \"same account, different credential\",\r\n\tsourceConflictDifferentAccount: \"a different account is already stored\",\r\n\tsourceConflictUnknownAccount: \"an existing credential is stored (account could not be compared)\",\r\n\tsourceConflictUnreadableDestination: \"the stored dsh credential could not be read\",\r\n\tsourceConflictUnsafeDestination: \"the stored dsh credential file is not safe to replace\",\r\n\tsourceConflictUnrecognized: \"the stored credential needs a review\",\r\n\tsourceActionImport: \"save this copy in dsh\",\r\n\tsourceActionReuse: \"keep the stored dsh credential (it already matches)\",\r\n\tsourceActionOverwrite: \"replace the stored dsh credential\",\r\n\tsourceActionBlocked: \"blocked \u2014 the stored dsh file cannot be replaced from here\",\r\n\tsourceActionUnrecognized: \"needs a review\",\r\n\tsourceCommitImported: \"saved\",\r\n\tsourceCommitUnchanged: \"already matched\",\r\n\tsourceCommitOverwritten: \"replaced\",\r\n\tcapabilitiesTitle: \"Subscription capabilities\",\r\n\tcapabilitiesIntro:\r\n\t\t\"Every switch starts off. Turning one on uses that vendor\u2019s subscription quota, not a separate API-key bill.\",\r\n\tcapabilitiesQuotaHint:\r\n\t\t\"Search, images, edits, Fast, usage, and Grok Imagine all consume the matching subscription quota when they run.\",\r\n\tcapabilitiesReadOnly: \"These switches are read-only in this deployment.\",\r\n\tcapabilitiesLoading: \"Loading capability settings\u2026\",\r\n\tcapabilitiesLoadFailed: \"Could not load capability settings.\",\r\n\tcapabilitiesSaveFailed: \"Could not save that capability setting.\",\r\n\tcapabilitiesConflictRefreshed: \"Those settings changed elsewhere. The page was refreshed; try again.\",\r\n\tcapabilityLimitsTitle: \"Capability limits\",\r\n\tcapabilityLimitsHint: \"Limits apply live to newly started operations and remain within the audited safety bounds.\",\r\n\tcapSearchResults: \"Maximum search results\",\r\n\tcapSearchResultsHint: \"Codex search returns at most this many results (1\u201320).\",\r\n\tcapImageCount: \"Maximum images per call\",\r\n\tcapImageCountHint: \"Codex and Imagine image tools can return at most this many images (1\u20134).\",\r\n\tcapVideoTtlHours: \"Video artifact retention (hours)\",\r\n\tcapVideoTtlHoursHint:\r\n\t\t\"Completed Imagine video artifacts are kept for 1\u2013168 hours. Lowering retention cleans older artifacts immediately; raising it applies to new artifacts.\",\r\n\tcapabilityLimitInvalid: \"Enter a whole number from {min} through {max}.\",\r\n\tcapCodexSearch: \"Codex subscription search\",\r\n\tcapCodexSearchHint: \"Optional search using Codex quota.\",\r\n\tcapCodexImages: \"Codex images\",\r\n\tcapCodexImagesHint: \"Generate images with ChatGPT/Codex quota.\",\r\n\tcapCodexImageEdits: \"Codex image edits\",\r\n\tcapCodexImageEditsHint: \"Edit images; requires Codex images.\",\r\n\tcapCodexUsage: \"Show Codex quota\",\r\n\tcapCodexUsageHint: \"Show remaining quota on the Codex account card when available.\",\r\n\tcapCodexFast: \"Fast requested\",\r\n\tcapCodexFastHint: \"Publish the Fast route when the live catalog confirms priority eligibility.\",\r\n\tcapGrokImagineImage: \"Grok Imagine images\",\r\n\tcapGrokImagineImageHint: \"Needs a separate Imagine credential (not Grok OAuth alone).\",\r\n\tcapGrokImagineVideo: \"Grok Imagine video\",\r\n\tcapGrokImagineVideoHint: \"Needs a separate Imagine credential (not Grok OAuth alone).\",\r\n\tusageTitle: \"Codex quota\",\r\n\tusageLoading: \"Loading Codex quota\u2026\",\r\n\tusageUnavailable: \"Codex quota is not available right now.\",\r\n\tusageEmpty: \"The vendor did not return any displayable quota fields.\",\r\n\tusageFetchedAt: \"Last read: {time}\",\r\n\tusageRateLimit: \"Rate limit\",\r\n\tusageWindow: \"{seconds}s window\",\r\n\tusageUsed: \"Used {value}\",\r\n\tusageRemaining: \"Remaining {value}\",\r\n\tusageResets: \"Resets {time}\",\r\n\tusageCredits: \"Credits\",\r\n\tusageCreditsUnlimited: \"Unlimited credits\",\r\n\tusageCreditsLimited: \"Limited credits\",\r\n\tusageBalance: \"Balance {value}\",\r\n\tusageIndividualLimit: \"Individual limit\",\r\n\tusageLimit: \"Limit {value}\",\r\n\tusageUsedAmount: \"Used {value}\",\r\n\tusageRemainingAmount: \"Remaining {value}\",\r\n\tusageSpendControlReached: \"Spend control has been reached.\",\r\n\tusageResetCredits: \"Reset credits available: {value}\",\r\n\timagineTitle: \"Grok Imagine credential\",\r\n\timagineIntro:\r\n\t\t\"Official Imagine calls use an xAI API credential (for example $XAI_API_KEY). That key is separate from a Grok Build OAuth login and is never shown here.\",\r\n\timagineLoading: \"Checking the Imagine credential\u2026\",\r\n\timagineLoadFailed: \"Could not read the Imagine credential status.\",\r\n\timagineConfigured: \"An Imagine credential is configured\",\r\n\timagineNotConfigured: \"No Imagine credential is configured\",\r\n\timagineSource: \"Source: {source}\",\r\n\timagineWritable: \"This deployment can update the Imagine credential store.\",\r\n\timagineReadOnly: \"This deployment cannot update the Imagine credential store.\",\r\n\timagineSourceNone: \"none\",\r\n\timagineSourceEnv: \"environment variable\",\r\n\timagineSourceApiKey: \"stored API key\",\r\n\timagineSourceOAuth: \"OAuth access (only if Imagine accepted it)\",\r\n\timagineSourceCliKey: \"Grok CLI key field\",\r\n\timagineSourceUnknown: \"configured (details withheld)\",\r\n\ttabAccounts: \"Accounts\",\r\n\ttabCapabilities: \"Capabilities\",\r\n\ttabGateway: \"Gateway\",\r\n\ttabAbout: \"About\",\r\n\tcopy: \"Copy\",\r\n\tcopied: \"Copied\",\r\n\tcopyFailed: \"Could not copy\",\r\n\tmodelsSummary: \"{selected}/{total} models visible\",\r\n\texpandModels: \"Models\",\r\n\tcollapseModels: \"Hide models\",\r\n\tusageUsedShort: \"Used {value}\",\r\n\tgatewayTitle: \"Local API gateway\",\r\n\tgatewayIntro: \"Loopback OpenAI/Anthropic-compatible server for your own tools. Off until you enable it.\",\r\n\tgatewayWarning: \"Exposes signed-in subscriptions as a local API. Can violate provider terms and uses quota.\",\r\n\tgatewayLoopbackHint: \"Binds to loopback only. Do not port-forward or expose this gateway on a public interface.\",\r\n\tgatewayEnableConfirm:\r\n\t\t\"Enable the local API gateway? It exposes your signed-in subscriptions to tools on this host and consumes provider quota.\",\r\n\tgatewayEnableConfirmAction: \"Confirm\",\r\n\tgatewayEnableCancel: \"Cancel\",\r\n\tgatewayEnabled: \"Enable local gateway\",\r\n\tgatewayBind: \"Bind\",\r\n\tgatewayPort: \"Port\",\r\n\tgatewayPortHint: \"Integer from 1024 through 65535. Apply to save; Random fills a high port, then Apply.\",\r\n\tgatewayPortApply: \"Apply\",\r\n\tgatewayPortRandom: \"Random\",\r\n\tgatewayPortInvalid: \"Enter a whole port number from 1024 through 65535.\",\r\n\tgatewayAddress: \"Gateway address\",\r\n\tgatewayOpenAiUrl: \"OpenAI-compatible base URL\",\r\n\tgatewayAnthropicUrl: \"Anthropic-compatible base URL\",\r\n\tgatewayKeyHint: \"Bearer key\",\r\n\tgatewayKeyCopyHint: \"Copy uses the current key. Rotate only if you want to invalidate existing clients.\",\r\n\tgatewayCopyKey: \"Copy key\",\r\n\tgatewayShowKey: \"Show\",\r\n\tgatewayHideKey: \"Hide\",\r\n\tgatewayRevealFailed: \"Could not read the current key.\",\r\n\tgatewayRotateConfirm: \"Rotate the key? Existing clients will stop working.\",\r\n\tgatewayRotateConfirmHint: \"This replaces the current Bearer key.\",\r\n\tgatewayRotateConfirmAction: \"Confirm rotate\",\r\n\tgatewayRotateCancel: \"Cancel\",\r\n\tgatewayRunning: \"Listening\",\r\n\tgatewayStopped: \"Not listening\",\r\n\tgatewayRotate: \"Rotate API key\",\r\n\tgatewayRotated: \"New key (shown once): {key}\",\r\n\tgatewayLoadFailed: \"Could not load gateway settings.\",\r\n\tgatewaySaveFailed: \"Could not update the gateway.\",\r\n\tgatewayLoading: \"Loading gateway settings\u2026\",\r\n\tgatewayModelsReady: \"{count} executable model(s) available. Snippets use {model}.\",\r\n\tgatewayModelsUnavailable: \"No signed-in provider currently exposes an executable gateway model.\",\r\n\tgatewayKeyConfigured: \"A real Bearer key is configured. Reveal it before copying an executable snippet.\",\r\n\tgatewayKeyNotConfigured: \"No Bearer key is configured yet.\",\r\n\tremoteLoginHelp:\r\n\t\t\"On a remote DSH host, open Settings here and use device-code sign-in for each provider. Complete the code on any browser that can reach the provider, then return to chat and pick the provider route model.\",\r\n\tpluginVersion: \"Plugin version {version}\",\r\n\taboutTitle: \"About\",\r\n\taboutDocsHint:\r\n\t\t\"See the plugin README and INSTALL docs in the repository for setup, supported providers, and gateway safety notes.\",\r\n\taboutDocsLink: \"Open README on GitHub\",\r\n\totherLoginMethods: \"Other sign-in methods\",\r\n\thideOtherLoginMethods: \"Hide other methods\",\r\n\tsignInStepOpen: \"Open the provider authorization page\",\r\n\tsignInStepCode: \"Enter the device code when prompted\",\r\n\tsignInStepWait: \"Waiting for authorization to complete\",\r\n\tcopyUserCode: \"Copy code\",\r\n\topenAuthUrl: \"Open authorization page\",\r\n\tmodelFilterPlaceholder: \"Filter models\u2026\",\r\n\tmodelFilterLabel: \"Filter models for {provider}\",\r\n\tapplyModelDraft: \"Apply model selection\",\r\n\tmodelDraftPending: \"Selection changed locally. Apply once to save.\",\r\n\tdeselectAll: \"Hide all\",\r\n\tresetModelsDefault: \"Reset selection\",\r\n\trequiresCodexImages: \"Turn on Codex images first.\",\r\n\trequiresCodexSignIn: \"Sign in to OpenAI Codex first.\",\r\n\trequiresImagineCredential: \"Configure the separate Grok Imagine credential first.\",\r\n\topenCodexAccount: \"Open Codex account\",\r\n\tfocusCodexImages: \"Go to Codex images\",\r\n\tfocusImagineCredential: \"View Imagine credential status\",\r\n\tgatewaySnippetsTitle: \"Quick setup snippets\",\r\n\tgatewaySnippetsUnavailable: \"Reveal the real key and sign in to at least one provider before snippets are shown.\",\r\n\tgatewaySnippetCurl: \"cURL\",\r\n\tgatewaySnippetPython: \"Python (OpenAI SDK)\",\r\n\tgatewaySnippetIde: \"IDE / client\",\r\n\ttabAccountsSignedIn: \"{count} signed in\",\r\n\tcoinstallTitle: \"Managed by Usage Center\",\r\n\tcoinstallSummary: \"Usage Center is the active OAuth owner. {count} provider account(s) are currently signed in.\",\r\n\tcoinstallOpenHub: \"Open Usage Center\",\r\n\ttabGatewayActive: \"Running\",\r\n};\r\n\r\nexport type GrokBuildSettingsKey = keyof typeof en;\r\n\r\nexport const zh: { [Key in GrokBuildSettingsKey]: string } = {\r\n\tnav: \"\u7F16\u7801 OAuth\",\r\n\ttitle: \"\u7F16\u7801\u8BA2\u9605\u8D26\u6237\",\r\n\tintro:\r\n\t\t\"\u5728 dsh \u4E2D\u4F7F\u7528\u81EA\u5DF1\u7684 Grok Build\u3001ChatGPT Codex\u3001Kimi Code \u548C Claude Code \u8BA2\u9605\uFF1B\u73B0\u6709 API-key \u8DEF\u7531\u7EE7\u7EED\u72EC\u7ACB\u4FDD\u7559\u3002\",\r\n\ttermsWarning: \"\u8FD9\u4E9B\u662F\u8BA2\u9605\u670D\u52A1\u7684\u975E\u5B98\u65B9\u7B2C\u4E09\u65B9\u96C6\u6210\uFF0C\u4ECD\u53D7\u4F9B\u5E94\u5546\u6761\u6B3E\u3001\u914D\u989D\u3001\u5730\u533A\u9650\u5236\u548C\u8D26\u53F7\u98CE\u63A7\u7EA6\u675F\u3002\",\r\n\tloadingAccount: \"\u6B63\u5728\u52A0\u8F7D\u8D26\u6237\u2026\",\r\n\tsignedOut: \"\u5C1A\u672A\u767B\u5F55\",\r\n\tsigningIn: \"\u6B63\u5728\u7B49\u5F85\u6388\u6743\u2026\",\r\n\tsignedIn: \"\u5DF2\u767B\u5F55\",\r\n\trequestFailed: \"\u8D26\u6237\u8BF7\u6C42\u5931\u8D25\u3002\",\r\n\tretry: \"\u91CD\u8BD5\",\r\n\tcancel: \"\u53D6\u6D88\",\r\n\tlogout: \"\u9000\u51FA\u767B\u5F55\",\r\n\tlogoutConfirmTitle: \"\u786E\u8BA4\u9000\u51FA\u767B\u5F55\",\r\n\tlogoutConfirmHint: \"\u786E\u5B9A\u5728 dsh \u4E2D\u9000\u51FA\u6B64\u4F9B\u5E94\u5546\uFF1F\u4F9B\u5E94\u5546\u8D26\u53F7\u672C\u8EAB\u4E0D\u4F1A\u88AB\u4FEE\u6539\u3002\",\r\n\tlogoutConfirmAction: \"\u786E\u8BA4\u9000\u51FA\",\r\n\tworking: \"\u5904\u7406\u4E2D\u2026\",\r\n\tcancelLogin: \"\u53D6\u6D88\u767B\u5F55\",\r\n\tdeviceLogin: \"\u4F7F\u7528\u8BBE\u5907\u7801\u767B\u5F55\",\r\n\tdeviceLoginRemote: \"\u4F7F\u7528\u8BBE\u5907\u7801\u767B\u5F55\uFF08\u9002\u5408\u8FDC\u7A0B\uFF09\",\r\n\tbrowserLogin: \"\u5728\u6D4F\u89C8\u5668\u4E2D\u767B\u5F55\",\r\n\tpkceLogin: \"\u4F7F\u7528\u6388\u6743\u7801\u767B\u5F55\",\r\n\tuserCode: \"\u4F9B\u5E94\u5546\u8981\u6C42\u8F93\u5165\u4EE3\u7801\u65F6\uFF0C\u8BF7\u8F93\u5165\uFF1A\",\r\n\topenUrl: \"\u8BF7\u5728\u6B64\u5B8C\u6210\u767B\u5F55\uFF1A\",\r\n\tpopupBlocked: \"\u6D4F\u89C8\u5668\u963B\u6B62\u4E86\u767B\u5F55\u7A97\u53E3\uFF0C\u8BF7\u624B\u52A8\u6253\u5F00\uFF1A\",\r\n\tpasteCodeHint: \"\u8BF7\u7C98\u8D34\u4F9B\u5E94\u5546\u8FD4\u56DE\u7684\u6388\u6743 code \u6216\u5B8C\u6574\u8DF3\u8F6C\u94FE\u63A5\u3002\u672C\u5730 PKCE \u4EC5\u5728\u56DE\u8C03\u65E0\u6CD5\u5230\u8FBE\u8FD9\u53F0 DSH \u4E3B\u673A\u65F6\u4F7F\u7528\uFF1A\",\r\n\tpasteBrowserCodeHint: \"\u8BF7\u7C98\u8D34\u4F9B\u5E94\u5546\u8FD4\u56DE\u7684\u6388\u6743 code \u6216\u5B8C\u6574\u8DF3\u8F6C\u94FE\u63A5\uFF0C\u4EE5\u5B8C\u6210\u6B64\u6B21\u6D4F\u89C8\u5668\u767B\u5F55\uFF1A\",\r\n\tpasteCodePlaceholder: \"\u6388\u6743 code \u6216\u5B8C\u6574\u8DF3\u8F6C\u94FE\u63A5\",\r\n\tpasteCodeLabel: \"\u6388\u6743 code \u6216\u5B8C\u6574\u8DF3\u8F6C\u94FE\u63A5\",\r\n\tsubmitCode: \"\u63D0\u4EA4 code\",\r\n\timportGrok: \"\u4ECE Grok CLI \u5BFC\u5165\",\r\n\timportHint: \"\u628A ~/.grok/auth.json \u590D\u5236\u8FDB dsh\uFF1B\u4E4B\u540E dsh \u5237\u65B0 token \u53EF\u80FD\u8BA9 Grok CLI \u6389\u7EBF\u3002\",\r\n\tmodels: \"\u53EF\u89C1\u6A21\u578B\",\r\n\tcatalogLive: \"\u6765\u81EA\u5F53\u524D xAI \u8D26\u53F7\",\r\n\tcatalogCache: \"\u6765\u81EA\u4E0A\u4E00\u6B21\u6210\u529F\u62C9\u53D6\u7684 xAI \u5217\u8868\",\r\n\tcatalogFallback: \"\u5185\u7F6E Grok \u57FA\u7EBF\u76EE\u5F55\uFF08\u7EBF\u4E0A\u5217\u8868\u4E0D\u53EF\u7528\uFF09\",\r\n\tcatalogError: \"\u65E0\u6CD5\u5237\u65B0\u7EBF\u4E0A Grok \u6A21\u578B\u5217\u8868\u3002\",\r\n\tselectAll: \"\u5168\u90E8\u663E\u793A\",\r\n\tmodelHint: \"\u52FE\u9009\u6A21\u578B\u4F1A\u4EE5\u8BE5\u524D\u7F00\u51FA\u73B0\u5728\u6A21\u578B\u9009\u62E9\u5668\uFF1A\",\r\n\tgrokTitle: \"xAI Grok Build\",\r\n\tgrokDescription: \"\u901A\u8FC7 Grok Build \u7AEF\u70B9\u4F7F\u7528 SuperGrok / X Premium \u7F16\u7801\u8BA2\u9605\u3002\",\r\n\tcodexTitle: \"OpenAI Codex\",\r\n\tcodexDescription: \"\u4F7F\u7528 ChatGPT Plus/Pro \u7684 Codex \u6743\u76CA\uFF1B\u8FDC\u7A0B DSH \u4E3B\u673A\u63A8\u8350\u8BBE\u5907\u7801\u767B\u5F55\u3002\",\r\n\tkimiTitle: \"Kimi Code\",\r\n\tkimiDescription: \"\u901A\u8FC7 auth.kimi.com \u4E0E api.kimi.com/coding \u4F7F\u7528 Kimi Code \u4F1A\u5458\uFF1B\u4E0D\u662F Moonshot API-key \u5F00\u653E\u5E73\u53F0\u3002\",\r\n\tclaudeTitle: \"Claude Code\",\r\n\tclaudeDescription: \"Claude Pro/Max OAuth\uFF0C\u5305\u542B Claude Code scope \u548C\u81EA\u52A8\u5237\u65B0\u3002\",\r\n\tantigravityTitle: \"Google Antigravity\",\r\n\tantigravityDescription: \"\u7531\u5355\u72EC\u56FA\u5B9A\u7248\u672C\u7684 MIT \u5F00\u6E90 dsh-agy \u63D2\u4EF6\u63D0\u4F9B\uFF0C\u5BF9\u5916\u8DEF\u7531\u4E3A agy\u3002\",\r\n\tantigravityInstalled: \"\u5DF2\u5B89\u88C5\uFF08CLI \u7BA1\u7406\uFF09\",\r\n\tantigravityMissing: \"\u5C1A\u672A\u5B89\u88C5\",\r\n\tantigravityCliHint:\r\n\t\t\"\u4E3A\u907F\u514D\u66B4\u9732\u65E0\u8BA4\u8BC1\u7684\u51ED\u636E\u5BFC\u51FA\u9875\u9762\uFF0C\u9ED8\u8BA4\u7981\u7528 dsh-agy Web \u7BA1\u7406\u9875\uFF1B\u9700\u8981\u65F6\u4F7F\u7528 profile \u5185 CLI \u7BA1\u7406 Google OAuth\u3002\",\r\n\tantigravityCliCommand: \"dsh plugin --profile web exec dsh-agy login --headless\",\r\n\tsourcesTitle: \"\u4ECE\u5B98\u65B9 CLI \u6587\u4EF6\u62C9\u53D6\u526F\u672C\",\r\n\tsourcesIntro:\r\n\t\t\"dsh \u53EF\u4EE5\u81EA\u52A8\u53D1\u73B0\u672C\u673A\u5B98\u65B9 CLI \u767B\u5F55\uFF0C\u5E76\u5355\u5411\u62C9\u53D6\u4E00\u4EFD\u526F\u672C\u5230\u81EA\u5DF1\u7684\u5B58\u50A8\u3002\u5B98\u65B9 CLI \u6587\u4EF6\u4FDD\u6301\u53EA\u8BFB\uFF0C\u7EDD\u4E0D\u4F1A\u88AB\u4FEE\u6539\u3002\",\r\n\tsourcesReadOnlyHint: \"\u8FD9\u662F\u5355\u5411\u62C9\u53D6\u526F\u672C\u3002dsh \u4E0D\u4F1A\u66F4\u65B0\u3001\u8986\u76D6\u6216\u56DE\u5199\u5B98\u65B9 CLI \u6587\u6863\u3002\",\r\n\tsourcesLoading: \"\u6B63\u5728\u67E5\u627E\u5B98\u65B9 CLI \u767B\u5F55\u6587\u4EF6\u2026\",\r\n\tsourcesCheckAgain: \"\u518D\u68C0\u67E5\u4E00\u6B21\",\r\n\tsourcesAvailable: \"\u53EF\u4EE5\u8BFB\u53D6\u4E00\u4EFD\u526F\u672C\",\r\n\tsourcesUnavailable: \"\u6CA1\u6709\u53EF\u7528\u7684\u526F\u672C\",\r\n\tsourcesAllMissingHint:\r\n\t\t\"\u8FD9\u53F0\u4E3B\u673A\u4E0A\u6CA1\u6709\u627E\u5230\u5B98\u65B9 CLI \u767B\u5F55\u6587\u4EF6\u3002\u8FDC\u7A0B DSH \u4E0A\u8FD9\u5F88\u5E38\u89C1\u2014\u2014\u8BF7\u6539\u7528\u8BBE\u5907\u7801\u767B\u5F55\uFF1B\u82E5\u5DF2\u5728\u672C\u673A CLI \u767B\u5F55\uFF0C\u53EF\u518D\u68C0\u67E5\u4E00\u6B21\u3002\",\r\n\tsourcesAvailableHint: \"\u672C\u673A\u53D1\u73B0\u4E86\u5B98\u65B9 CLI \u767B\u5F55\u3002\u53EF\u5728\u5BF9\u5E94\u8D26\u6237\u5361\u7247\u91CC\u5355\u5411\u62C9\u53D6\u4E00\u4EFD\u526F\u672C\u5230 dsh\u3002\",\r\n\tsourcesPullCopy: \"\u62C9\u53D6\u526F\u672C\",\r\n\tremoteAccountsTip:\r\n\t\t\"\u5F53\u524D Settings \u9875\u9762\u770B\u8D77\u6765\u662F\u8FDC\u7A0B\u8BBF\u95EE\uFF08\u975E\u672C\u673A\u56DE\u73AF\uFF09\u3002\u8BF7\u4F18\u5148\u4F7F\u7528\u8BBE\u5907\u7801\u767B\u5F55\uFF1B\u4ECE\u53E6\u4E00\u53F0\u673A\u5668\u6253\u5F00\u65F6\uFF0C\u6D4F\u89C8\u5668\u5F39\u7A97\u548C\u672C\u5730 PKCE \u56DE\u8C03\u7ECF\u5E38\u4F1A\u5931\u8D25\u3002\",\r\n\tremoteTipDismiss: \"\u77E5\u9053\u4E86\",\r\n\tsourcesPreviewTitle: \"\u5148\u6838\u5BF9\u8FD9\u4EFD\u526F\u672C\uFF0C\u518D\u5199\u5165 dsh\",\r\n\tsourcesPreviewExpires: \"CLI \u51ED\u636E\u5230\u671F\u65F6\u95F4\uFF1A{time}\",\r\n\tsourcesTicketExpires: \"\u6B64\u6B21\u9884\u89C8\u5C06\u4E8E {time} \u5931\u6548\",\r\n\tsourcesConflict: \"dsh \u4E2D\u5DF2\u5B58\u51ED\u636E\uFF1A{detail}\",\r\n\tsourcesAction: \"\u82E5\u7EE7\u7EED\uFF1A{detail}\",\r\n\tsourcesWarnings: \"\u8BF4\u660E\",\r\n\tsourcesConfirmOverwrite: \"\u7528\u8FD9\u4EFD\u526F\u672C\u66FF\u6362 dsh \u4E2D\u5DF2\u4FDD\u5B58\u7684\u51ED\u636E\",\r\n\tsourcesConfirmOverwriteHint: \"dsh \u91CC\u5DF2\u6709\u53E6\u4E00\u4EFD\u51ED\u636E\u3002\u8BF7\u5148\u52FE\u9009\uFF0C\u518D\u786E\u8BA4\u62C9\u53D6\u3002\",\r\n\tsourcesCommit: \"\u786E\u8BA4\u62C9\u53D6\",\r\n\tsourcesCancelPreview: \"\u53D6\u6D88\u9884\u89C8\",\r\n\tsourcesCommitSuccess: \"\u5DF2\u590D\u5236\u5230 dsh\uFF08{action}\uFF09\u3002\",\r\n\tsourcesPreviewFailed: \"\u65E0\u6CD5\u4ECE\u8BE5 CLI \u6587\u4EF6\u51C6\u5907\u526F\u672C\u3002\",\r\n\tsourcesCommitFailed: \"\u65E0\u6CD5\u628A\u526F\u672C\u4FDD\u5B58\u5230 dsh\u3002\",\r\n\tsourcesLoadFailed: \"\u65E0\u6CD5\u67E5\u627E\u5B98\u65B9 CLI \u767B\u5F55\u6587\u4EF6\u3002\",\r\n\tsourceKindGrok: \"Grok CLI\",\r\n\tsourceKindCodex: \"Codex CLI\",\r\n\tsourceKindKimi: \"Kimi Code CLI\",\r\n\tsourceKindClaude: \"Claude Code CLI\",\r\n\tsourceReasonMissing: \"\u5728\u9884\u671F\u4F4D\u7F6E\u6CA1\u6709\u627E\u5230\u5B98\u65B9 CLI \u6587\u4EF6\u3002\",\r\n\tsourceReasonUnsafe: \"\u5B98\u65B9 CLI \u6587\u4EF6\u4E0D\u5B89\u5168\uFF0C\u65E0\u6CD5\u8BFB\u53D6\uFF08\u6743\u9650\u6216\u6587\u4EF6\u7C7B\u578B\uFF09\u3002\",\r\n\tsourceReasonInvalid: \"\u5B98\u65B9 CLI \u6587\u4EF6\u5B58\u5728\uFF0C\u4F46\u4E0D\u662F\u53EF\u7528\u7684 OAuth \u767B\u5F55\u3002\",\r\n\tsourceReasonTooLarge: \"\u5B98\u65B9 CLI \u6587\u4EF6\u8D85\u8FC7\u5141\u8BB8\u7684\u8BFB\u53D6\u4E0A\u9650\u3002\",\r\n\tsourceConflictNone: \"dsh \u5C1A\u672A\u4FDD\u5B58\u51ED\u636E\",\r\n\tsourceConflictSameCredential: \"\u5DF2\u4FDD\u5B58\u540C\u4E00\u4EFD\u51ED\u636E\",\r\n\tsourceConflictSameAccount: \"\u540C\u4E00\u8D26\u53F7\uFF0C\u4F46\u51ED\u636E\u4E0D\u540C\",\r\n\tsourceConflictDifferentAccount: \"\u5DF2\u4FDD\u5B58\u53E6\u4E00\u4E2A\u8D26\u53F7\",\r\n\tsourceConflictUnknownAccount: \"\u5DF2\u4FDD\u5B58\u51ED\u636E\uFF08\u65E0\u6CD5\u6BD4\u8F83\u8D26\u53F7\uFF09\",\r\n\tsourceConflictUnreadableDestination: \"\u65E0\u6CD5\u8BFB\u53D6 dsh \u4E2D\u5DF2\u5B58\u51ED\u636E\",\r\n\tsourceConflictUnsafeDestination: \"dsh \u4E2D\u7684\u51ED\u636E\u6587\u4EF6\u4E0D\u5B89\u5168\uFF0C\u4E0D\u80FD\u4ECE\u8FD9\u91CC\u66FF\u6362\",\r\n\tsourceConflictUnrecognized: \"\u5DF2\u5B58\u51ED\u636E\u9700\u8981\u6838\u5BF9\",\r\n\tsourceActionImport: \"\u628A\u8FD9\u4EFD\u526F\u672C\u4FDD\u5B58\u5230 dsh\",\r\n\tsourceActionReuse: \"\u4FDD\u7559 dsh \u4E2D\u5DF2\u5B58\u51ED\u636E\uFF08\u5185\u5BB9\u5DF2\u76F8\u540C\uFF09\",\r\n\tsourceActionOverwrite: \"\u66FF\u6362 dsh \u4E2D\u5DF2\u5B58\u51ED\u636E\",\r\n\tsourceActionBlocked: \"\u5DF2\u963B\u6B62 \u2014 \u4E0D\u80FD\u4ECE\u8FD9\u91CC\u66FF\u6362 dsh \u4E2D\u7684\u6587\u4EF6\",\r\n\tsourceActionUnrecognized: \"\u9700\u8981\u6838\u5BF9\",\r\n\tsourceCommitImported: \"\u5DF2\u4FDD\u5B58\",\r\n\tsourceCommitUnchanged: \"\u539F\u672C\u5C31\u76F8\u540C\",\r\n\tsourceCommitOverwritten: \"\u5DF2\u66FF\u6362\",\r\n\tcapabilitiesTitle: \"\u8BA2\u9605\u80FD\u529B\",\r\n\tcapabilitiesIntro: \"\u6240\u6709\u5F00\u5173\u9ED8\u8BA4\u5173\u95ED\u3002\u6253\u5F00\u540E\u6D88\u8017\u7684\u662F\u5BF9\u5E94\u4F9B\u5E94\u5546\u7684\u8BA2\u9605\u914D\u989D\uFF0C\u4E0D\u662F\u53E6\u4E00\u5957 API-key \u8D26\u5355\u3002\",\r\n\tcapabilitiesQuotaHint: \"\u641C\u7D22\u3001\u51FA\u56FE\u3001\u6539\u56FE\u3001Fast\u3001\u989D\u5EA6\u5C55\u793A\u548C Grok Imagine \u5728\u5B9E\u9645\u8C03\u7528\u65F6\u90FD\u4F1A\u6D88\u8017\u5BF9\u5E94\u8BA2\u9605\u914D\u989D\u3002\",\r\n\tcapabilitiesReadOnly: \"\u5F53\u524D\u90E8\u7F72\u4E2D\u8FD9\u4E9B\u5F00\u5173\u4E3A\u53EA\u8BFB\u3002\",\r\n\tcapabilitiesLoading: \"\u6B63\u5728\u52A0\u8F7D\u80FD\u529B\u8BBE\u7F6E\u2026\",\r\n\tcapabilitiesLoadFailed: \"\u65E0\u6CD5\u52A0\u8F7D\u80FD\u529B\u8BBE\u7F6E\u3002\",\r\n\tcapabilitiesSaveFailed: \"\u65E0\u6CD5\u4FDD\u5B58\u8BE5\u80FD\u529B\u8BBE\u7F6E\u3002\",\r\n\tcapabilitiesConflictRefreshed: \"\u8FD9\u4E9B\u8BBE\u7F6E\u5DF2\u5728\u522B\u5904\u88AB\u6539\u8FC7\u3002\u9875\u9762\u5DF2\u5237\u65B0\uFF0C\u8BF7\u518D\u8BD5\u4E00\u6B21\u3002\",\r\n\tcapabilityLimitsTitle: \"\u80FD\u529B\u9650\u5236\",\r\n\tcapabilityLimitsHint: \"\u9650\u5236\u4F1A\u5B9E\u65F6\u5E94\u7528\u4E8E\u65B0\u53D1\u8D77\u7684\u64CD\u4F5C\uFF0C\u5E76\u59CB\u7EC8\u4FDD\u6301\u5728\u5DF2\u5BA1\u8BA1\u7684\u5B89\u5168\u8303\u56F4\u5185\u3002\",\r\n\tcapSearchResults: \"\u6700\u591A\u641C\u7D22\u7ED3\u679C\u6570\",\r\n\tcapSearchResultsHint: \"Codex \u641C\u7D22\u6700\u591A\u8FD4\u56DE\u8FD9\u4E48\u591A\u6761\u7ED3\u679C\uFF081\u201320\uFF09\u3002\",\r\n\tcapImageCount: \"\u5355\u6B21\u6700\u591A\u56FE\u7247\u6570\",\r\n\tcapImageCountHint: \"Codex \u4E0E Imagine \u56FE\u7247\u5DE5\u5177\u5355\u6B21\u6700\u591A\u8FD4\u56DE\u8FD9\u4E48\u591A\u5F20\u56FE\u7247\uFF081\u20134\uFF09\u3002\",\r\n\tcapVideoTtlHours: \"\u89C6\u9891\u4EA7\u7269\u4FDD\u7559\u65F6\u95F4\uFF08\u5C0F\u65F6\uFF09\",\r\n\tcapVideoTtlHoursHint: \"Imagine \u89C6\u9891\u4EA7\u7269\u4FDD\u7559 1\u2013168 \u5C0F\u65F6\uFF1B\u964D\u4F4E\u4FDD\u7559\u65F6\u95F4\u4F1A\u7ACB\u5373\u6E05\u7406\u8FC7\u671F\u65E7\u4EA7\u7269\uFF0C\u63D0\u9AD8\u53EA\u5F71\u54CD\u65B0\u4EA7\u7269\u3002\",\r\n\tcapabilityLimitInvalid: \"\u8BF7\u8F93\u5165 {min} \u5230 {max} \u4E4B\u95F4\u7684\u6574\u6570\u3002\",\r\n\tcapCodexSearch: \"Codex \u8BA2\u9605\u641C\u7D22\",\r\n\tcapCodexSearchHint: \"\u53EF\u9009\u641C\u7D22\uFF0C\u6D88\u8017 Codex \u914D\u989D\u3002\",\r\n\tcapCodexImages: \"Codex \u51FA\u56FE\",\r\n\tcapCodexImagesHint: \"\u7528 ChatGPT/Codex \u914D\u989D\u51FA\u56FE\u3002\",\r\n\tcapCodexImageEdits: \"Codex \u6539\u56FE\",\r\n\tcapCodexImageEditsHint: \"\u6539\u56FE\uFF1B\u9700\u5148\u6253\u5F00 Codex \u51FA\u56FE\u3002\",\r\n\tcapCodexUsage: \"\u663E\u793A Codex \u989D\u5EA6\",\r\n\tcapCodexUsageHint: \"\u6709\u6570\u636E\u65F6\u5728 Codex \u8D26\u6237\u5361\u7247\u4E0A\u663E\u793A\u5269\u4F59\u989D\u5EA6\u3002\",\r\n\tcapCodexFast: \"\u5DF2\u8BF7\u6C42 Fast\",\r\n\tcapCodexFastHint: \"\u5728\u7EBF\u76EE\u5F55\u786E\u8BA4\u4F18\u5148\u8D44\u683C\u540E\u53D1\u5E03 Fast \u8DEF\u7531\u3002\",\r\n\tcapGrokImagineImage: \"Grok Imagine \u51FA\u56FE\",\r\n\tcapGrokImagineImageHint: \"\u9700\u8981\u5355\u72EC\u7684 Imagine \u51ED\u636E\uFF0C\u4EC5\u6709 Grok OAuth \u4E0D\u591F\u3002\",\r\n\tcapGrokImagineVideo: \"Grok Imagine \u51FA\u89C6\u9891\",\r\n\tcapGrokImagineVideoHint: \"\u9700\u8981\u5355\u72EC\u7684 Imagine \u51ED\u636E\uFF0C\u4EC5\u6709 Grok OAuth \u4E0D\u591F\u3002\",\r\n\tusageTitle: \"Codex \u989D\u5EA6\",\r\n\tusageLoading: \"\u6B63\u5728\u52A0\u8F7D Codex \u989D\u5EA6\u2026\",\r\n\tusageUnavailable: \"\u5F53\u524D\u65E0\u6CD5\u8BFB\u53D6 Codex \u989D\u5EA6\u3002\",\r\n\tusageEmpty: \"\u4F9B\u5E94\u5546\u6CA1\u6709\u8FD4\u56DE\u53EF\u5C55\u793A\u7684\u989D\u5EA6\u5B57\u6BB5\u3002\",\r\n\tusageFetchedAt: \"\u6700\u8FD1\u8BFB\u53D6\uFF1A{time}\",\r\n\tusageRateLimit: \"\u901F\u7387\u9650\u5236\",\r\n\tusageWindow: \"{seconds} \u79D2\u7A97\u53E3\",\r\n\tusageUsed: \"\u5DF2\u7528 {value}\",\r\n\tusageRemaining: \"\u5269\u4F59 {value}\",\r\n\tusageResets: \"\u91CD\u7F6E\u65F6\u95F4 {time}\",\r\n\tusageCredits: \"\u79EF\u5206\",\r\n\tusageCreditsUnlimited: \"\u65E0\u9650\u79EF\u5206\",\r\n\tusageCreditsLimited: \"\u6709\u9650\u79EF\u5206\",\r\n\tusageBalance: \"\u4F59\u989D {value}\",\r\n\tusageIndividualLimit: \"\u4E2A\u4EBA\u989D\u5EA6\",\r\n\tusageLimit: \"\u4E0A\u9650 {value}\",\r\n\tusageUsedAmount: \"\u5DF2\u7528 {value}\",\r\n\tusageRemainingAmount: \"\u5269\u4F59 {value}\",\r\n\tusageSpendControlReached: \"\u5DF2\u8FBE\u5230\u652F\u51FA\u63A7\u5236\u4E0A\u9650\u3002\",\r\n\tusageResetCredits: \"\u53EF\u7528\u91CD\u7F6E\u6B21\u6570\uFF1A{value}\",\r\n\timagineTitle: \"Grok Imagine \u51ED\u636E\",\r\n\timagineIntro:\r\n\t\t\"\u5B98\u65B9 Imagine \u8C03\u7528\u4F7F\u7528 xAI API \u51ED\u636E\uFF08\u4F8B\u5982 $XAI_API_KEY\uFF09\u3002\u5B83\u4E0E Grok Build OAuth \u767B\u5F55\u4E0D\u662F\u540C\u4E00\u4EFD\u51ED\u636E\uFF0C\u8FD9\u91CC\u4E5F\u4E0D\u4F1A\u663E\u793A\u5BC6\u94A5\u3002\",\r\n\timagineLoading: \"\u6B63\u5728\u68C0\u67E5 Imagine \u51ED\u636E\u2026\",\r\n\timagineLoadFailed: \"\u65E0\u6CD5\u8BFB\u53D6 Imagine \u51ED\u636E\u72B6\u6001\u3002\",\r\n\timagineConfigured: \"\u5DF2\u914D\u7F6E Imagine \u51ED\u636E\",\r\n\timagineNotConfigured: \"\u5C1A\u672A\u914D\u7F6E Imagine \u51ED\u636E\",\r\n\timagineSource: \"\u6765\u6E90\uFF1A{source}\",\r\n\timagineWritable: \"\u5F53\u524D\u90E8\u7F72\u53EF\u4EE5\u66F4\u65B0 Imagine \u51ED\u636E\u5B58\u50A8\u3002\",\r\n\timagineReadOnly: \"\u5F53\u524D\u90E8\u7F72\u4E0D\u80FD\u66F4\u65B0 Imagine \u51ED\u636E\u5B58\u50A8\u3002\",\r\n\timagineSourceNone: \"\u65E0\",\r\n\timagineSourceEnv: \"\u73AF\u5883\u53D8\u91CF\",\r\n\timagineSourceApiKey: \"\u5DF2\u4FDD\u5B58\u7684 API key\",\r\n\timagineSourceOAuth: \"OAuth access\uFF08\u4EC5\u5F53 Imagine \u63A5\u53D7\u65F6\uFF09\",\r\n\timagineSourceCliKey: \"Grok CLI \u7684 key \u5B57\u6BB5\",\r\n\timagineSourceUnknown: \"\u5DF2\u914D\u7F6E\uFF08\u7EC6\u8282\u4E0D\u5C55\u793A\uFF09\",\r\n\ttabAccounts: \"\u8D26\u6237\",\r\n\ttabCapabilities: \"\u80FD\u529B\",\r\n\ttabGateway: \"\u7F51\u5173\",\r\n\ttabAbout: \"\u5173\u4E8E\",\r\n\tcopy: \"\u590D\u5236\",\r\n\tcopied: \"\u5DF2\u590D\u5236\",\r\n\tcopyFailed: \"\u590D\u5236\u5931\u8D25\",\r\n\tmodelsSummary: \"\u5DF2\u663E\u793A {selected}/{total} \u4E2A\u6A21\u578B\",\r\n\texpandModels: \"\u6A21\u578B\",\r\n\tcollapseModels: \"\u6536\u8D77\u6A21\u578B\",\r\n\tusageUsedShort: \"\u5DF2\u7528 {value}\",\r\n\tgatewayTitle: \"\u672C\u5730 API \u7F51\u5173\",\r\n\tgatewayIntro: \"\u672C\u673A loopback \u4E0A\u7684 OpenAI/Anthropic \u517C\u5BB9\u670D\u52A1\uFF0C\u4F9B\u4F60\u81EA\u5DF1\u7684\u5DE5\u5177\u4F7F\u7528\u3002\u9ED8\u8BA4\u5173\u95ED\u3002\",\r\n\tgatewayWarning: \"\u6253\u5F00\u540E\u4F1A\u628A\u5DF2\u767B\u5F55\u8BA2\u9605\u66B4\u9732\u6210\u672C\u5730 API\u3002\u53EF\u80FD\u8FDD\u53CD\u4F9B\u5E94\u5546\u6761\u6B3E\u5E76\u6D88\u8017\u914D\u989D\u3002\",\r\n\tgatewayLoopbackHint: \"\u4EC5\u7ED1\u5B9A\u672C\u673A\u56DE\u73AF\u5730\u5740\u3002\u8BF7\u52FF\u505A\u7AEF\u53E3\u8F6C\u53D1\uFF0C\u4E5F\u4E0D\u8981\u628A\u5B83\u66B4\u9732\u5230\u516C\u7F51\u3002\",\r\n\tgatewayEnableConfirm: \"\u8981\u542F\u7528\u672C\u5730 API \u7F51\u5173\u5417\uFF1F\u5B83\u4F1A\u628A\u5DF2\u767B\u5F55\u7684\u8BA2\u9605\u66B4\u9732\u7ED9\u672C\u673A\u5DE5\u5177\uFF0C\u5E76\u6D88\u8017\u4F9B\u5E94\u5546\u914D\u989D\u3002\",\r\n\tgatewayEnableConfirmAction: \"\u786E\u8BA4\u542F\u7528\",\r\n\tgatewayEnableCancel: \"\u53D6\u6D88\",\r\n\tgatewayEnabled: \"\u542F\u7528\u672C\u5730\u7F51\u5173\",\r\n\tgatewayBind: \"\u7ED1\u5B9A\u5730\u5740\",\r\n\tgatewayPort: \"\u7AEF\u53E3\",\r\n\tgatewayPortHint: \"1024\u201365535 \u7684\u6574\u6570\u3002\u6539\u5B8C\u70B9\u786E\u5B9A\u4FDD\u5B58\uFF1B\u968F\u673A\u4F1A\u586B\u4E00\u4E2A\u9AD8\u4F4D\u7AEF\u53E3\uFF0C\u4ECD\u9700\u786E\u5B9A\u3002\",\r\n\tgatewayPortApply: \"\u786E\u5B9A\",\r\n\tgatewayPortRandom: \"\u968F\u673A\",\r\n\tgatewayPortInvalid: \"\u8BF7\u8F93\u5165 1024 \u5230 65535 \u4E4B\u95F4\u7684\u6574\u6570\u7AEF\u53E3\u3002\",\r\n\tgatewayAddress: \"\u7F51\u5173\u5730\u5740\",\r\n\tgatewayOpenAiUrl: \"OpenAI \u517C\u5BB9\u5730\u5740\",\r\n\tgatewayAnthropicUrl: \"Anthropic \u517C\u5BB9\u5730\u5740\",\r\n\tgatewayKeyHint: \"Bearer key\",\r\n\tgatewayKeyCopyHint: \"\u590D\u5236\u7684\u662F\u5F53\u524D key\u3002\u53EA\u6709\u8981\u4F5C\u5E9F\u5DF2\u6709\u5BA2\u6237\u7AEF\u65F6\u624D\u8F6E\u6362\u3002\",\r\n\tgatewayCopyKey: \"\u590D\u5236 key\",\r\n\tgatewayShowKey: \"\u663E\u793A\",\r\n\tgatewayHideKey: \"\u9690\u85CF\",\r\n\tgatewayRevealFailed: \"\u65E0\u6CD5\u8BFB\u53D6\u5F53\u524D key\u3002\",\r\n\tgatewayRotateConfirm: \"\u786E\u5B9A\u8F6E\u6362 key\uFF1F\u73B0\u6709\u5BA2\u6237\u7AEF\u5C06\u5931\u6548\u3002\",\r\n\tgatewayRotateConfirmHint: \"\u8FD9\u4F1A\u66FF\u6362\u5F53\u524D Bearer key\u3002\",\r\n\tgatewayRotateConfirmAction: \"\u786E\u8BA4\u8F6E\u6362\",\r\n\tgatewayRotateCancel: \"\u53D6\u6D88\",\r\n\tgatewayRunning: \"\u6B63\u5728\u76D1\u542C\",\r\n\tgatewayStopped: \"\u672A\u76D1\u542C\",\r\n\tgatewayRotate: \"\u8F6E\u6362 API key\",\r\n\tgatewayRotated: \"\u65B0 key\uFF08\u53EA\u663E\u793A\u4E00\u6B21\uFF09\uFF1A{key}\",\r\n\tgatewayLoadFailed: \"\u65E0\u6CD5\u52A0\u8F7D\u7F51\u5173\u8BBE\u7F6E\u3002\",\r\n\tgatewaySaveFailed: \"\u65E0\u6CD5\u66F4\u65B0\u7F51\u5173\u3002\",\r\n\tgatewayLoading: \"\u6B63\u5728\u52A0\u8F7D\u7F51\u5173\u8BBE\u7F6E\u2026\",\r\n\tgatewayModelsReady: \"\u5F53\u524D\u6709 {count} \u4E2A\u53EF\u6267\u884C\u6A21\u578B\uFF0C\u914D\u7F6E\u7247\u6BB5\u4F7F\u7528 {model}\u3002\",\r\n\tgatewayModelsUnavailable: \"\u5F53\u524D\u6CA1\u6709\u5DF2\u767B\u5F55\u4F9B\u5E94\u5546\u63D0\u4F9B\u53EF\u6267\u884C\u7684\u7F51\u5173\u6A21\u578B\u3002\",\r\n\tgatewayKeyConfigured: \"\u5DF2\u914D\u7F6E\u771F\u5B9E Bearer key\uFF1B\u590D\u5236\u53EF\u6267\u884C\u7247\u6BB5\u524D\u8BF7\u5148\u8BFB\u53D6 key\u3002\",\r\n\tgatewayKeyNotConfigured: \"\u5C1A\u672A\u914D\u7F6E Bearer key\u3002\",\r\n\tremoteLoginHelp:\r\n\t\t\"\u5728\u8FDC\u7A0B DSH \u4E3B\u673A\u4E0A\uFF0C\u6253\u5F00\u6B64\u5904 Settings\uFF0C\u5BF9\u6BCF\u4E2A\u4F9B\u5E94\u5546\u4F7F\u7528\u8BBE\u5907\u7801\u767B\u5F55\u3002\u5728\u80FD\u8BBF\u95EE\u4F9B\u5E94\u5546\u7684\u4EFB\u610F\u6D4F\u89C8\u5668\u5B8C\u6210\u9A8C\u8BC1\u7801\uFF0C\u518D\u56DE\u5230\u804A\u5929\u9009\u62E9\u5BF9\u5E94\u8DEF\u7531\u6A21\u578B\u3002\",\r\n\tpluginVersion: \"\u63D2\u4EF6\u7248\u672C {version}\",\r\n\taboutTitle: \"\u5173\u4E8E\",\r\n\taboutDocsHint: \"\u4ED3\u5E93\u4E2D\u7684 README \u4E0E INSTALL \u6587\u6863\u4ECB\u7ECD\u4E86\u5B89\u88C5\u6B65\u9AA4\u3001\u652F\u6301\u7684\u4F9B\u5E94\u5546\u4EE5\u53CA\u7F51\u5173\u5B89\u5168\u6CE8\u610F\u4E8B\u9879\u3002\",\r\n\taboutDocsLink: \"\u5728 GitHub \u6253\u5F00 README\",\r\n\totherLoginMethods: \"\u5176\u4ED6\u767B\u5F55\u65B9\u5F0F\",\r\n\thideOtherLoginMethods: \"\u6536\u8D77\u5176\u4ED6\u65B9\u5F0F\",\r\n\tsignInStepOpen: \"\u6253\u5F00\u4F9B\u5E94\u5546\u6388\u6743\u9875\u9762\",\r\n\tsignInStepCode: \"\u5728\u63D0\u793A\u5904\u8F93\u5165\u8BBE\u5907\u7801\",\r\n\tsignInStepWait: \"\u7B49\u5F85\u6388\u6743\u5B8C\u6210\",\r\n\tcopyUserCode: \"\u590D\u5236\u8BBE\u5907\u7801\",\r\n\topenAuthUrl: \"\u6253\u5F00\u6388\u6743\u9875\u9762\",\r\n\tmodelFilterPlaceholder: \"\u7B5B\u9009\u6A21\u578B\u2026\",\r\n\tmodelFilterLabel: \"\u7B5B\u9009 {provider} \u7684\u6A21\u578B\",\r\n\tapplyModelDraft: \"\u5E94\u7528\u6A21\u578B\u9009\u62E9\",\r\n\tmodelDraftPending: \"\u9009\u62E9\u4EC5\u5728\u672C\u9875\u5F62\u6210\u8349\u7A3F\uFF0C\u70B9\u51FB\u5E94\u7528\u540E\u4E00\u6B21\u4FDD\u5B58\u3002\",\r\n\tdeselectAll: \"\u5168\u90E8\u9690\u85CF\",\r\n\tresetModelsDefault: \"\u91CD\u7F6E\u9009\u62E9\",\r\n\trequiresCodexImages: \"\u9700\u5148\u5F00\u542F Codex \u51FA\u56FE\u3002\",\r\n\trequiresCodexSignIn: \"\u8BF7\u5148\u767B\u5F55 OpenAI Codex\u3002\",\r\n\trequiresImagineCredential: \"\u8BF7\u5148\u914D\u7F6E\u72EC\u7ACB\u7684 Grok Imagine \u51ED\u636E\u3002\",\r\n\topenCodexAccount: \"\u524D\u5F80 Codex \u8D26\u6237\",\r\n\tfocusCodexImages: \"\u524D\u5F80 Codex \u51FA\u56FE\u5F00\u5173\",\r\n\tfocusImagineCredential: \"\u67E5\u770B Imagine \u51ED\u636E\u72B6\u6001\",\r\n\tgatewaySnippetsTitle: \"\u5FEB\u901F\u914D\u7F6E\u7247\u6BB5\",\r\n\tgatewaySnippetsUnavailable: \"\u8BF7\u5148\u8BFB\u53D6\u771F\u5B9E key\uFF0C\u5E76\u81F3\u5C11\u767B\u5F55\u4E00\u4E2A\u4F9B\u5E94\u5546\uFF1B\u6EE1\u8DB3\u540E\u624D\u4F1A\u663E\u793A\u53EF\u6267\u884C\u914D\u7F6E\u7247\u6BB5\u3002\",\r\n\tgatewaySnippetCurl: \"cURL\",\r\n\tgatewaySnippetPython: \"Python (OpenAI SDK)\",\r\n\tgatewaySnippetIde: \"IDE / \u5BA2\u6237\u7AEF\",\r\n\ttabAccountsSignedIn: \"\u5DF2\u767B\u5F55 {count} \u4E2A\",\r\n\tcoinstallTitle: \"\u5DF2\u7531\u7528\u91CF\u4E2D\u5FC3\u7EDF\u4E00\u7BA1\u7406\",\r\n\tcoinstallSummary: \"\u7528\u91CF\u4E2D\u5FC3\u5F53\u524D\u8D1F\u8D23 OAuth \u8FD0\u884C\u65F6\uFF1B\u5DF2\u6709 {count} \u4E2A\u4F9B\u5E94\u5546\u8D26\u53F7\u767B\u5F55\u3002\",\r\n\tcoinstallOpenHub: \"\u524D\u5F80\u7528\u91CF\u4E2D\u5FC3\",\r\n\ttabGatewayActive: \"\u8FD0\u884C\u4E2D\",\r\n};\r\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["index_exports", "__export", "apply", "inject", "name", "__toCommonJS", "import_react", "import_client", "slotsOf", "context", "slots", "get", "createDshClientAdapter", "candidate", "locale", "diagnostics", "id", "value", "level", "frozenDiagnostics", "errors", "item", "options", "disposed", "installed", "disposeCurrent", "install", "slotContext", "inject", "import_react", "GROK_BUILD_AUTH_STATUS_PATH", "GROK_BUILD_AUTH_LOGIN_PATH", "GROK_BUILD_AUTH_LOGIN_CODE_PATH", "GROK_BUILD_AUTH_LOGIN_CANCEL_PATH", "GROK_BUILD_AUTH_IMPORT_PATH", "GROK_BUILD_AUTH_LOGOUT_PATH", "GROK_BUILD_AUTH_MODELS_PATH", "CODING_OAUTH_STATUS_PATH", "CODING_OAUTH_LOGIN_PATH", "CODING_OAUTH_LOGIN_CODE_PATH", "CODING_OAUTH_LOGIN_CANCEL_PATH", "CODING_OAUTH_LOGOUT_PATH", "CODING_OAUTH_MODELS_PATH", "OAUTH_IMPORT_SOURCES_PATH", "OAUTH_IMPORT_PREVIEW_PATH", "OAUTH_IMPORT_COMMIT_PATH", "OAUTH_IMPORT_CANCEL_PATH", "CAPABILITY_SETTINGS_PATH", "CODEX_USAGE_PATH", "IMAGINE_CREDENTIAL_STATUS_PATH", "GATEWAY_SETTINGS_PATH", "GATEWAY_REVEAL_PATH", "GATEWAY_ROTATE_PATH", "CODING_OAUTH_MANAGEMENT_PATHS", "STATUS_PATH", "CODING_OAUTH_STATUS_PATH", "LOGIN_PATH", "CODING_OAUTH_LOGIN_PATH", "LOGIN_CODE_PATH", "CODING_OAUTH_LOGIN_CODE_PATH", "LOGIN_CANCEL_PATH", "CODING_OAUTH_LOGIN_CANCEL_PATH", "LOGOUT_PATH", "CODING_OAUTH_LOGOUT_PATH", "MODELS_PATH", "CODING_OAUTH_MODELS_PATH", "SOURCES_PATH", "OAUTH_IMPORT_SOURCES_PATH", "SOURCES_PREVIEW_PATH", "OAUTH_IMPORT_PREVIEW_PATH", "SOURCES_COMMIT_PATH", "OAUTH_IMPORT_COMMIT_PATH", "SOURCES_CANCEL_PATH", "OAUTH_IMPORT_CANCEL_PATH", "CAPABILITIES_PATH", "CAPABILITY_SETTINGS_PATH", "CODEX_USAGE_PATH", "IMAGINE_CREDENTIAL_PATH", "IMAGINE_CREDENTIAL_STATUS_PATH", "GATEWAY_PATH", "GATEWAY_SETTINGS_PATH", "GATEWAY_REVEAL_PATH", "GATEWAY_ROTATE_PATH", "POLL_INTERVAL_MS", "HOUR_MS", "SOURCE_KINDS", "SOURCE_REASONS", "SOURCE_CONFLICTS", "SOURCE_PREVIEW_ACTIONS", "SOURCE_COMMIT_ACTIONS", "SOURCE_DEFAULT_PATH", "SOURCE_KIND_KEY", "SOURCE_REASON_KEY", "SOURCE_CONFLICT_KEY", "SOURCE_PREVIEW_ACTION_KEY", "SOURCE_COMMIT_ACTION_KEY", "CAPABILITY_TOGGLES", "CAPABILITY_LIMITS", "IMAGINE_SOURCE_KEY", "PROVIDERS", "SETTINGS_TABS", "GATEWAY_PORT_MIN", "GATEWAY_PORT_MAX", "GATEWAY_RANDOM_PORT_MIN", "GATEWAY_RANDOM_PORT_MAX", "GATEWAY_RANDOM_RESERVED", "CONSUMED_PREVIEW_CODES", "PLUGIN_VERSION", "isRecord", "value", "isPluginRequestError", "error", "isConflictError", "isConsumedPreviewError", "CONSUMED_PREVIEW_CODES", "cancelPreviewTicket", "previewId", "keepalive", "SOURCES_CANCEL_PATH", "jsonRequest", "path", "method", "body", "response", "record", "message", "code", "copyText", "text", "area", "ok", "TRANSITION", "pageStyle", "titleStyle", "bodyStyle", "cardStyle", "rowStyle", "statusStyle", "buttonStyle", "primaryButtonStyle", "compactButtonStyle", "errorStyle", "successStyle", "warningStyle", "tipStyle", "noticeStyle", "codeStyle", "monoStyle", "snippetStyle", "linkStyle", "listStyle", "checkRowStyle", "inputStyle", "nestedStyle", "hintStyle", "visuallyHiddenStyle", "segmentedNavStyle", "segmentedTabStyle", "segmentedTabActiveStyle", "panelStyle", "accountGridStyle", "copyRowStyle", "skeletonStyle", "stepRowStyle", "stepActiveStyle", "stepNumberStyle", "stepNumberActiveStyle", "statusToneColor", "tone", "badgeStyle", "color", "dotStyle", "status", "installed", "providerStatusTone", "import_jsx_runtime", "README_URL", "AboutTab", "t", "cardStyle", "titleStyle", "warningStyle", "bodyStyle", "hintStyle", "PLUGIN_VERSION", "linkStyle", "import_react", "preferredLoginMethod", "definition", "remote", "orderedLoginMethods", "preferred", "rest", "method", "shouldShowPerCardSourceReason", "source", "allOfficialCliMissing", "sources", "anyOfficialCliAvailable", "methodLabel", "options", "import_jsx_runtime", "Badge", "label", "tone", "providerStatus", "installed", "showDot", "resolvedTone", "providerStatusTone", "badgeStyle", "dotStyle", "optionalString", "value", "optionalFiniteNumber", "optionalBoolean", "optionalPercent", "numeric", "isSourceKind", "SOURCE_KINDS", "isSourceReason", "SOURCE_REASONS", "isSourceConflict", "SOURCE_CONFLICTS", "isSourcePreviewAction", "SOURCE_PREVIEW_ACTIONS", "isSourceCommitAction", "SOURCE_COMMIT_ACTIONS", "looksSecret", "safeDisplayPath", "kind", "text", "SOURCE_DEFAULT_PATH", "safeWarning", "formatEpoch", "ms", "formatted", "parseSource", "isRecord", "reasonRaw", "expiresAt", "mergeSources", "discovered", "entry", "parseSources", "rows", "parsePreview", "previewId", "kindRaw", "conflictRaw", "actionRaw", "ticketExpiresAt", "warnings", "parseCommitAction", "action", "boundedInteger", "min", "max", "fallback", "emptyCapabilitySettings", "HOUR_MS", "parseCapabilitySettings", "source", "parseCapabilities", "nested", "revision", "parseUsageWindow", "usedPercent", "remainingPercent", "windowSeconds", "resetsAt", "parseUsageLimit", "fallbackId", "id", "name", "windows", "parseUsage", "payload", "rateLimits", "seen", "add", "limit", "index", "credits", "spend", "resetRaw", "resetCredits", "fetchedAt", "spendControlReached", "creditsBalance", "individualLimit", "individualUsed", "individualRemaining", "individualRemainingPercent", "individualResetsAt", "usageHasVisibleFields", "usage", "parseGateway", "bind", "port", "models", "model", "keyAvailable", "formatGatewayBaseUrl", "randomGatewayPort", "exclude", "attempt", "span", "GATEWAY_RANDOM_PORT_MAX", "GATEWAY_RANDOM_PORT_MIN", "candidate", "GATEWAY_RANDOM_RESERVED", "parseGatewayPort", "GATEWAY_PORT_MIN", "GATEWAY_PORT_MAX", "parseImagineCredential", "configured", "writable", "imagineSourceLabel", "mapped", "IMAGINE_SOURCE_KEY", "modelFields", "status", "import_jsx_runtime", "CliPullPreview", "t", "preview", "confirmOverwrite", "sourcesBusy", "onConfirmOverwriteChange", "onCommit", "onCancel", "expiresAt", "formatEpoch", "ticketExpiresAt", "cardStyle", "bodyStyle", "SOURCE_KIND_KEY", "hintStyle", "monoStyle", "SOURCE_CONFLICT_KEY", "SOURCE_PREVIEW_ACTION_KEY", "listStyle", "warning", "checkRowStyle", "event", "primaryButtonStyle", "buttonStyle", "import_react", "import_jsx_runtime", "NoticeBanner", "message", "dismissLabel", "onDismiss", "autoHideMs", "tone", "timer", "noticeStyle", "bodyStyle", "buttonStyle", "import_react", "import_react", "import_jsx_runtime", "CopyButton", "text", "idleLabel", "copiedLabel", "failedLabel", "primary", "disabled", "state", "setState", "timerRef", "handleClick", "ok", "copyText", "label", "primaryButtonStyle", "compactButtonStyle", "import_jsx_runtime", "barColor", "percent", "ProgressBar", "value", "label", "meta", "clamped", "hintStyle", "import_jsx_runtime", "SignInSteps", "t", "activeMethod", "userCode", "url", "popupBlocked", "hasCode", "hasUrl", "needsPaste", "stepActiveStyle", "stepRowStyle", "stepNumberActiveStyle", "stepNumberStyle", "primaryButtonStyle", "CopyButton", "hintStyle", "codeStyle", "bodyStyle", "ProviderCard", "definition", "providerStatus", "busy", "sourcesBusy", "remote", "codeInput", "expanded", "source", "showUsage", "usage", "usageError", "usageLoading", "onSignIn", "onSignOut", "onCancelLogin", "onSubmitCode", "onCodeChange", "onToggleExpanded", "onPreviewSource", "onSaveModels", "showAltMethods", "setShowAltMethods", "modelFilter", "setModelFilter", "logoutConfirm", "setLogoutConfirm", "logoutTrigger", "logoutConfirmAction", "restoreLogoutFocus", "ordered", "orderedLoginMethods", "primaryMethod", "altMethods", "method", "statusLabel", "available", "selected", "modelFields", "modelDraft", "setModelDraft", "modelDraftDirty", "model", "index", "grokProviderStatus", "showSourceReason", "shouldShowPerCardSourceReason", "filteredModels", "query", "id", "usagePercent", "fetchedAt", "formatEpoch", "cardStyle", "rowStyle", "titleStyle", "monoStyle", "Badge", "nestedStyle", "visuallyHiddenStyle", "buttonStyle", "compactButtonStyle", "current", "methodLabel", "SOURCE_REASON_KEY", "inputStyle", "event", "listStyle", "checked", "checkRowStyle", "usageHasVisibleFields", "ProgressBar", "limit", "window", "used", "resetsAt", "import_jsx_runtime", "AccountsTab", "t", "status", "remote", "remoteTipDismissed", "onDismissRemoteTip", "sources", "sourcesError", "sourcesNotice", "sourcesBusy", "preview", "confirmOverwrite", "busyProvider", "codeInputs", "popupBlocked", "expandedProviders", "showUsage", "usage", "usageError", "usageLoading", "onSignIn", "onSignOut", "onCancelLogin", "onSubmitCode", "onCodeChange", "onToggleExpanded", "onPreviewSource", "onSaveModels", "onConfirmOverwriteChange", "onCommitSource", "onCancelSourcePreview", "onRefreshSources", "onDismissSourcesNotice", "previousPreviewKind", "trigger", "skeletonStyle", "statusStyle", "dotStyle", "NoticeBanner", "allOfficialCliMissing", "anyOfficialCliAvailable", "hintStyle", "bodyStyle", "accountGridStyle", "PROVIDERS", "definition", "providerStatus", "expanded", "ProviderCard", "entry", "method", "value", "selected", "CliPullPreview", "cardStyle", "rowStyle", "titleStyle", "monoStyle", "Badge", "import_jsx_runtime", "trackStyle", "checked", "disabled", "TRANSITION", "thumbStyle", "ToggleSwitch", "onChange", "ariaLabel", "ariaDescribedBy", "id", "import_jsx_runtime", "CapabilitiesTab", "t", "capabilities", "capabilitiesError", "capabilitiesBusy", "imagine", "imagineError", "codexSignedIn", "onRetry", "onOpenAccounts", "onFocusDependency", "onPatchCapability", "codexToggles", "CAPABILITY_TOGGLES", "item", "imagineToggles", "cardStyle", "titleStyle", "bodyStyle", "nestedStyle", "errorStyle", "buttonStyle", "skeletonStyle", "statusStyle", "dotStyle", "Badge", "hintStyle", "imagineSourceLabel", "listStyle", "checked", "imagesOff", "dependencyReason", "disabled", "switchId", "repairAction", "rowStyle", "ToggleSwitch", "next", "CAPABILITY_LIMITS", "displayValue", "inputId", "inputStyle", "event", "target", "apiValue", "saved", "import_react", "buildGatewaySnippets", "openAiBaseUrl", "anthropicBaseUrl", "apiKeyPlaceholder", "model", "key", "import_jsx_runtime", "SNIPPET_TABS", "GatewayTab", "t", "gateway", "gatewayError", "gatewayBusy", "gatewayOnceKey", "gatewayKeyVisible", "gatewayRotateConfirm", "gatewayRevealError", "portDraft", "copiedField", "copyFailedField", "onEnabledChange", "onRetry", "onPortDraftChange", "onApplyPort", "onRandomPort", "onCopyKey", "onToggleKeyVisible", "onRotateConfirm", "onRotateCancel", "onRotate", "enableConfirm", "setEnableConfirm", "activeSnippet", "setActiveSnippet", "enableConfirmAction", "rotateTrigger", "rotateConfirmAction", "restoreEnableFocus", "restoreRotateFocus", "portValid", "parseGatewayPort", "portChanged", "snippets", "openAi", "formatGatewayBaseUrl", "anthropic", "buildGatewaySnippets", "copyLabel", "field", "idle", "focusSnippetTab", "index", "tab", "onSnippetKeyDown", "event", "current", "openAiUrl", "anthropicUrl", "cardStyle", "titleStyle", "bodyStyle", "warningStyle", "hintStyle", "errorStyle", "skeletonStyle", "statusStyle", "dotStyle", "nestedStyle", "buttonStyle", "Badge", "primaryButtonStyle", "ToggleSwitch", "enabled", "GATEWAY_PORT_MIN", "GATEWAY_PORT_MAX", "inputStyle", "randomGatewayPort", "copyRowStyle", "monoStyle", "CopyButton", "segmentedNavStyle", "selected", "segmentedTabActiveStyle", "segmentedTabStyle", "snippetStyle", "import_jsx_runtime", "SettingsTabs", "t", "activeTab", "onChange", "hints", "hintFor", "id", "entry", "focusTab", "index", "tab", "SETTINGS_TABS", "onKeyDown", "event", "current", "segmentedNavStyle", "selected", "suffix", "label", "segmentedTabActiveStyle", "segmentedTabStyle", "STYLE_ID", "CSS", "injected", "ensureMicroStyles", "style", "import_jsx_runtime", "REMOTE_TIP_STORAGE_KEY", "readRemoteTipDismissed", "GrokBuildSettings", "t", "status", "setStatus", "requestError", "setRequestError", "busyProvider", "setBusyProvider", "codeInputs", "setCodeInputs", "popupBlocked", "setPopupBlocked", "sources", "setSources", "sourcesError", "setSourcesError", "sourcesBusy", "setSourcesBusy", "preview", "setPreview", "previewRef", "previewEpochRef", "mountedRef", "confirmOverwrite", "setConfirmOverwrite", "sourcesNotice", "setSourcesNotice", "capabilities", "setCapabilities", "capabilitiesError", "setCapabilitiesError", "capabilitiesBusy", "setCapabilitiesBusy", "capabilitiesLoaded", "setCapabilitiesLoaded", "usage", "setUsage", "usageError", "setUsageError", "usageLoading", "setUsageLoading", "imagine", "setImagine", "imagineError", "setImagineError", "gateway", "setGateway", "gatewayError", "setGatewayError", "gatewayBusy", "setGatewayBusy", "gatewayLoaded", "setGatewayLoaded", "gatewayOnceKey", "setGatewayOnceKey", "gatewayKeyVisible", "setGatewayKeyVisible", "gatewayRotateConfirm", "setGatewayRotateConfirm", "gatewayRevealError", "setGatewayRevealError", "portDraft", "setPortDraft", "activeTab", "setActiveTab", "copiedField", "setCopiedField", "copyFailedField", "setCopyFailedField", "expandedProviders", "setExpandedProviders", "remoteTipDismissed", "setRemoteTipDismissed", "copiedTimerRef", "remote", "refresh", "next", "jsonRequest", "STATUS_PATH", "error", "refreshSources", "parseSources", "SOURCES_PATH", "mergeSources", "refreshCapabilities", "parsed", "parseCapabilities", "CAPABILITIES_PATH", "emptyCapabilitySettings", "refreshGateway", "parseGateway", "GATEWAY_PATH", "refreshImagine", "parseImagineCredential", "IMAGINE_CREDENTIAL_PATH", "refreshUsage", "parseUsage", "CODEX_USAGE_PATH", "ensureMicroStyles", "active", "timer", "cancelPreviewTicket", "provider", "POLL_INTERVAL_MS", "signedIn", "signIn", "method", "popup", "current", "challenge", "LOGIN_PATH", "submitCode", "code", "LOGIN_CODE_PATH", "cancelLogin", "LOGIN_CANCEL_PATH", "signOut", "LOGOUT_PATH", "saveModels", "selected", "MODELS_PATH", "previewSource", "kind", "epoch", "previous", "parsePreview", "SOURCES_PREVIEW_PATH", "commitSource", "result", "SOURCES_COMMIT_PATH", "action", "parseCommitAction", "SOURCE_COMMIT_ACTION_KEY", "isConsumedPreviewError", "cancelSourcePreview", "previewId", "SOURCES_CANCEL_PATH", "patchCapability", "key", "value", "patch", "updated", "isConflictError", "showUsage", "signedInCount", "tabHints", "hints", "markCopied", "field", "handleCopy", "text", "copyText", "ensureGatewayKey", "GATEWAY_REVEAL_PATH", "copyGatewayKey", "toggleGatewayKeyVisible", "applyGatewayPort", "port", "parseGatewayPort", "rotateGatewayKey", "GATEWAY_ROTATE_PATH", "setGatewayEnabled", "enabled", "dismissRemoteTip", "openAccountsForCodex", "focusCapabilityDependency", "target", "id", "pageStyle", "titleStyle", "bodyStyle", "buttonStyle", "errorStyle", "SettingsTabs", "panelStyle", "AccountsTab", "slug", "CapabilitiesTab", "GatewayTab", "AboutTab", "en", "zh", "import_jsx_runtime", "name", "inject", "IndependentSettingsEntry", "t", "open", "setOpen", "trigger", "closeButton", "dialog", "host", "inertSiblings", "element", "focusable", "closeOnEscape", "event", "targets", "first", "last", "hadInert", "value", "GrokBuildSettings", "mountIndependentEntry", "root", "apply", "ctx", "dsh", "createDshClientAdapter", "namespace", "zh", "en", "slots"]
|
|
7
7
|
}
|