dsh-coding-subscription-oauth 0.5.0

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.
Files changed (178) hide show
  1. package/CHANGELOG.md +136 -0
  2. package/CONTRIBUTING.md +109 -0
  3. package/INSTALL.md +220 -0
  4. package/LICENSE +19 -0
  5. package/NOTICE +11 -0
  6. package/README.de.md +254 -0
  7. package/README.es.md +254 -0
  8. package/README.fr.md +254 -0
  9. package/README.ja.md +254 -0
  10. package/README.ko.md +254 -0
  11. package/README.md +286 -0
  12. package/README.pt-BR.md +254 -0
  13. package/README.ru.md +254 -0
  14. package/README.zh-CN.md +271 -0
  15. package/cordis.patch.yml +13 -0
  16. package/docs/00-project-rules.md +195 -0
  17. package/docs/02-architecture.md +132 -0
  18. package/docs/02-architecture.zh-CN.md +128 -0
  19. package/lib/adapter.d.ts +24 -0
  20. package/lib/adapter.d.ts.map +1 -0
  21. package/lib/alias-adapter.d.ts +43 -0
  22. package/lib/alias-adapter.d.ts.map +1 -0
  23. package/lib/auth-routes.d.ts +155 -0
  24. package/lib/auth-routes.d.ts.map +1 -0
  25. package/lib/auth.d.ts +29 -0
  26. package/lib/auth.d.ts.map +1 -0
  27. package/lib/bin.d.ts +6 -0
  28. package/lib/bin.d.ts.map +1 -0
  29. package/lib/bin.js +27591 -0
  30. package/lib/bin.js.map +7 -0
  31. package/lib/capability-routes.d.ts +43 -0
  32. package/lib/capability-routes.d.ts.map +1 -0
  33. package/lib/capability-runtime.d.ts +56 -0
  34. package/lib/capability-runtime.d.ts.map +1 -0
  35. package/lib/capability-settings.d.ts +263 -0
  36. package/lib/capability-settings.d.ts.map +1 -0
  37. package/lib/capability-tools.d.ts +50 -0
  38. package/lib/capability-tools.d.ts.map +1 -0
  39. package/lib/catalog.d.ts +53 -0
  40. package/lib/catalog.d.ts.map +1 -0
  41. package/lib/client.js +3 -0
  42. package/lib/client.js.map +7 -0
  43. package/lib/codex-http.d.ts +77 -0
  44. package/lib/codex-http.d.ts.map +1 -0
  45. package/lib/codex-images.d.ts +109 -0
  46. package/lib/codex-images.d.ts.map +1 -0
  47. package/lib/codex-model-capabilities.d.ts +112 -0
  48. package/lib/codex-model-capabilities.d.ts.map +1 -0
  49. package/lib/codex-search.d.ts +96 -0
  50. package/lib/codex-search.d.ts.map +1 -0
  51. package/lib/codex-usage.d.ts +79 -0
  52. package/lib/codex-usage.d.ts.map +1 -0
  53. package/lib/gateway-anthropic-messages.d.ts +8 -0
  54. package/lib/gateway-anthropic-messages.d.ts.map +1 -0
  55. package/lib/gateway-auth.d.ts +22 -0
  56. package/lib/gateway-auth.d.ts.map +1 -0
  57. package/lib/gateway-backend.d.ts +62 -0
  58. package/lib/gateway-backend.d.ts.map +1 -0
  59. package/lib/gateway-body.d.ts +9 -0
  60. package/lib/gateway-body.d.ts.map +1 -0
  61. package/lib/gateway-config.d.ts +24 -0
  62. package/lib/gateway-config.d.ts.map +1 -0
  63. package/lib/gateway-http.d.ts +16 -0
  64. package/lib/gateway-http.d.ts.map +1 -0
  65. package/lib/gateway-openai-chat.d.ts +8 -0
  66. package/lib/gateway-openai-chat.d.ts.map +1 -0
  67. package/lib/gateway-openai-responses.d.ts +8 -0
  68. package/lib/gateway-openai-responses.d.ts.map +1 -0
  69. package/lib/gateway-parse.d.ts +10 -0
  70. package/lib/gateway-parse.d.ts.map +1 -0
  71. package/lib/gateway-protocol.d.ts +47 -0
  72. package/lib/gateway-protocol.d.ts.map +1 -0
  73. package/lib/gateway-routes.d.ts +21 -0
  74. package/lib/gateway-routes.d.ts.map +1 -0
  75. package/lib/gateway.d.ts +48 -0
  76. package/lib/gateway.d.ts.map +1 -0
  77. package/lib/grok-imagine.d.ts +271 -0
  78. package/lib/grok-imagine.d.ts.map +1 -0
  79. package/lib/grok-import.d.ts +21 -0
  80. package/lib/grok-import.d.ts.map +1 -0
  81. package/lib/http-json.d.ts +10 -0
  82. package/lib/http-json.d.ts.map +1 -0
  83. package/lib/ids.d.ts +33 -0
  84. package/lib/ids.d.ts.map +1 -0
  85. package/lib/imagine-routes.d.ts +59 -0
  86. package/lib/imagine-routes.d.ts.map +1 -0
  87. package/lib/index.d.ts +69 -0
  88. package/lib/index.d.ts.map +1 -0
  89. package/lib/index.js +35355 -0
  90. package/lib/index.js.map +7 -0
  91. package/lib/invariant.d.ts +9 -0
  92. package/lib/invariant.d.ts.map +1 -0
  93. package/lib/invariant.js +14 -0
  94. package/lib/invariant.js.map +7 -0
  95. package/lib/kimi-errors.d.ts +13 -0
  96. package/lib/kimi-errors.d.ts.map +1 -0
  97. package/lib/media-store.d.ts +130 -0
  98. package/lib/media-store.d.ts.map +1 -0
  99. package/lib/oauth-import-routes.d.ts +52 -0
  100. package/lib/oauth-import-routes.d.ts.map +1 -0
  101. package/lib/oauth-providers.d.ts +26 -0
  102. package/lib/oauth-providers.d.ts.map +1 -0
  103. package/lib/oauth-session.d.ts +40 -0
  104. package/lib/oauth-session.d.ts.map +1 -0
  105. package/lib/oauth-sources.d.ts +205 -0
  106. package/lib/oauth-sources.d.ts.map +1 -0
  107. package/lib/oauth.d.ts +79 -0
  108. package/lib/oauth.d.ts.map +1 -0
  109. package/lib/provider.d.ts +38 -0
  110. package/lib/provider.d.ts.map +1 -0
  111. package/lib/proxy.d.ts +17 -0
  112. package/lib/proxy.d.ts.map +1 -0
  113. package/lib/redact.d.ts +5 -0
  114. package/lib/redact.d.ts.map +1 -0
  115. package/lib/session.d.ts +40 -0
  116. package/lib/session.d.ts.map +1 -0
  117. package/lib/store.d.ts +46 -0
  118. package/lib/store.d.ts.map +1 -0
  119. package/lib/web-origin.d.ts +10 -0
  120. package/lib/web-origin.d.ts.map +1 -0
  121. package/lib/web-routes.d.ts +20 -0
  122. package/lib/web-routes.d.ts.map +1 -0
  123. package/package.json +185 -0
  124. package/patches/dsh-agy@0.1.2.patch +25 -0
  125. package/scripts/release.mjs +166 -0
  126. package/scripts/smoke-deployed-routes.mjs +146 -0
  127. package/scripts/verify-deployed-catalog.mjs +87 -0
  128. package/src/adapter.ts +282 -0
  129. package/src/alias-adapter.ts +152 -0
  130. package/src/auth-routes.ts +871 -0
  131. package/src/auth.ts +67 -0
  132. package/src/bin.ts +350 -0
  133. package/src/capability-routes.ts +275 -0
  134. package/src/capability-runtime.ts +313 -0
  135. package/src/capability-settings.ts +657 -0
  136. package/src/capability-tools.ts +666 -0
  137. package/src/catalog.ts +271 -0
  138. package/src/client/GrokBuildSettings.tsx +2221 -0
  139. package/src/client/index.tsx +37 -0
  140. package/src/client/locales.ts +421 -0
  141. package/src/codex-http.ts +447 -0
  142. package/src/codex-images.ts +485 -0
  143. package/src/codex-model-capabilities.ts +320 -0
  144. package/src/codex-search.ts +245 -0
  145. package/src/codex-usage.ts +263 -0
  146. package/src/gateway-anthropic-messages.ts +84 -0
  147. package/src/gateway-auth.ts +100 -0
  148. package/src/gateway-backend.ts +274 -0
  149. package/src/gateway-body.ts +49 -0
  150. package/src/gateway-config.ts +76 -0
  151. package/src/gateway-http.ts +104 -0
  152. package/src/gateway-openai-chat.ts +124 -0
  153. package/src/gateway-openai-responses.ts +53 -0
  154. package/src/gateway-parse.ts +224 -0
  155. package/src/gateway-protocol.ts +52 -0
  156. package/src/gateway-routes.ts +152 -0
  157. package/src/gateway.ts +242 -0
  158. package/src/grok-imagine.ts +1627 -0
  159. package/src/grok-import.ts +151 -0
  160. package/src/http-json.ts +82 -0
  161. package/src/ids.ts +45 -0
  162. package/src/imagine-routes.ts +461 -0
  163. package/src/index.ts +598 -0
  164. package/src/invariant.ts +17 -0
  165. package/src/kimi-errors.ts +26 -0
  166. package/src/media-store.ts +927 -0
  167. package/src/oauth-import-routes.ts +314 -0
  168. package/src/oauth-providers.ts +152 -0
  169. package/src/oauth-session.ts +183 -0
  170. package/src/oauth-sources.ts +1104 -0
  171. package/src/oauth.ts +620 -0
  172. package/src/provider.ts +128 -0
  173. package/src/proxy.ts +99 -0
  174. package/src/redact.ts +72 -0
  175. package/src/session.ts +218 -0
  176. package/src/store.ts +217 -0
  177. package/src/web-origin.ts +60 -0
  178. package/src/web-routes.ts +75 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/client/index.tsx", "../../src/client/GrokBuildSettings.tsx", "../../src/client/locales.ts"],
4
+ "sourcesContent": ["/** Browser half: coding-subscription account management inside dsh Settings. */\n\nimport type {} from \"@deepseek-ai/dsh-client-locale/client\";\nimport type { ClientContext } from \"@deepseek-ai/dsh-client-runtime/client\";\nimport type {} from \"@deepseek-ai/dsh-client-ui-settings/client\";\nimport type {} from \"@deepseek-ai/dsh-client-ui-slots\";\nimport type { GrokBuildSettingsInjected } from \"./GrokBuildSettings.tsx\";\nimport { GrokBuildSettings } from \"./GrokBuildSettings.tsx\";\nimport type { GrokBuildSettingsKey } from \"./locales.ts\";\nimport { en, zh } from \"./locales.ts\";\n\ndeclare module \"@deepseek-ai/dsh-client-ui-slots\" {\n\tinterface LocaleNamespaceMap {\n\t\t\"settings.grok-build\": GrokBuildSettingsKey;\n\t}\n}\n\nexport const name = \"dsh-grok-build-client\";\nexport const inject = [\"slots\", \"locale\"];\n\nexport function apply(ctx: ClientContext): void {\n\tconst namespace = \"settings.grok-build\";\n\tctx.effect(() => ctx.locale.register(namespace, { zh, en }), \"dsh-coding-subscription-oauth: settings copy\");\n\tconst t = ctx.locale.bind(namespace) as GrokBuildSettingsInjected[\"t\"];\n\tctx.slots.inject(\"settings.section\", () =>\n\t\tctx.slots.register(\n\t\t\t{\n\t\t\t\tname: \"settings.section\",\n\t\t\t\tid: \"grok-build\",\n\t\t\t\torder: 17,\n\t\t\t\tlabel: () => t(\"nav\"),\n\t\t\t\tinject: (): GrokBuildSettingsInjected => ({ t }),\n\t\t\t},\n\t\t\tGrokBuildSettings,\n\t\t),\n\t);\n}\n", "/** Plugin-owned coding subscription account section inside the dsh Settings shell. */\n\nimport type { CSSProperties } from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { GrokBuildSettingsKey } from \"./locales.ts\";\n\nconst STATUS_PATH = \"/plugins/dsh-grok-build/oauth/status\";\nconst LOGIN_PATH = \"/plugins/dsh-grok-build/oauth/login\";\nconst LOGIN_CODE_PATH = \"/plugins/dsh-grok-build/oauth/code\";\nconst LOGIN_CANCEL_PATH = \"/plugins/dsh-grok-build/oauth/cancel\";\nconst LOGOUT_PATH = \"/plugins/dsh-grok-build/oauth/logout\";\nconst MODELS_PATH = \"/plugins/dsh-grok-build/oauth/models\";\nconst SOURCES_PATH = \"/plugins/dsh-grok-build/oauth/sources\";\nconst SOURCES_PREVIEW_PATH = \"/plugins/dsh-grok-build/oauth/sources/preview\";\nconst SOURCES_COMMIT_PATH = \"/plugins/dsh-grok-build/oauth/sources/commit\";\nconst SOURCES_CANCEL_PATH = \"/plugins/dsh-grok-build/oauth/sources/cancel\";\nconst CAPABILITIES_PATH = \"/plugins/dsh-grok-build/capabilities\";\nconst CODEX_USAGE_PATH = \"/plugins/dsh-grok-build/codex/usage\";\nconst IMAGINE_CREDENTIAL_PATH = \"/plugins/dsh-grok-build/imagine/credential-status\";\nconst GATEWAY_PATH = \"/plugins/dsh-grok-build/gateway\";\nconst GATEWAY_REVEAL_PATH = \"/plugins/dsh-grok-build/gateway/reveal\";\nconst GATEWAY_ROTATE_PATH = \"/plugins/dsh-grok-build/gateway/rotate\";\nconst POLL_INTERVAL_MS = 1_000;\n\ntype ProviderSlug = \"grok\" | \"codex\" | \"kimi\" | \"claude\";\ntype LoginMethod = \"pkce\" | \"device\" | \"browser\";\ntype CatalogSource = \"live\" | \"cache\" | \"fallback\";\ntype SourceKind = ProviderSlug;\ntype SourceReason = \"missing\" | \"unsafe\" | \"invalid\" | \"too_large\";\ntype SourceConflict =\n\t| \"none\"\n\t| \"same_credential\"\n\t| \"same_account\"\n\t| \"different_account\"\n\t| \"unknown_account\"\n\t| \"unreadable_destination\"\n\t| \"unsafe_destination\";\ntype SourcePreviewAction = \"import\" | \"reuse\" | \"overwrite\" | \"blocked\";\ntype SourceCommitAction = \"imported\" | \"unchanged\" | \"overwritten\";\ntype CapabilityFlagKey =\n\t| \"codexSearch\"\n\t| \"codexImages\"\n\t| \"codexImageEdits\"\n\t| \"codexUsage\"\n\t| \"codexFast\"\n\t| \"grokImagineImage\"\n\t| \"grokImagineVideo\";\ntype CapabilityLimitKey = \"searchResults\" | \"imageCount\" | \"videoArtifactTtlMs\";\ntype CapabilitySettingKey = CapabilityFlagKey | CapabilityLimitKey;\n\ntype GrokStatus =\n\t| { status: \"signed-out\"; grokImportAvailable: boolean }\n\t| { status: \"signing-in\"; method: \"pkce\" | \"device\"; url?: string; userCode?: string; grokImportAvailable: boolean }\n\t| {\n\t\t\tstatus: \"signed-in\";\n\t\t\tmodels: string[];\n\t\t\tavailable: string[];\n\t\t\tselected: string[];\n\t\t\tcatalogSource: CatalogSource;\n\t\t\tcatalogError?: string;\n\t\t\tgrokImportAvailable: boolean;\n\t }\n\t| { status: \"error\"; message: string; grokImportAvailable: boolean };\n\ntype SubscriptionStatus = {\n\tprovider: Exclude<ProviderSlug, \"grok\">;\n\troute: string;\n\tdisplayName: string;\n\tloginMethods: readonly (\"browser\" | \"device\")[];\n\trecommendedLoginMethod: \"browser\" | \"device\";\n\tmodels: string[];\n\tavailable: string[];\n\tselected: string[];\n} & (\n\t| { status: \"signed-out\" }\n\t| { status: \"signing-in\"; method: \"browser\" | \"device\"; url?: string; userCode?: string }\n\t| { status: \"signed-in\"; expiresAt?: number }\n\t| { status: \"error\"; message: string }\n);\n\ntype ProviderStatus = GrokStatus | SubscriptionStatus;\n\ninterface CodingOAuthStatus {\n\tproviders: {\n\t\tgrok: GrokStatus;\n\t\tcodex: SubscriptionStatus;\n\t\tkimi: SubscriptionStatus;\n\t\tclaude: SubscriptionStatus;\n\t};\n\tantigravity: { installed: boolean; route: \"agy\"; management: \"cli\" };\n}\n\ninterface LoginChallenge {\n\tmethod: LoginMethod;\n\turl: string;\n\tuserCode?: string;\n}\n\ninterface ProviderCardDefinition {\n\tslug: ProviderSlug;\n\troute: string;\n\ttitleKey: GrokBuildSettingsKey;\n\tdescriptionKey: GrokBuildSettingsKey;\n\tmethods: readonly LoginMethod[];\n\trecommended: LoginMethod;\n}\n\ninterface SourceStatus {\n\tkind: SourceKind;\n\tdisplayPath: string;\n\tavailable: boolean;\n\texpiresAt?: number;\n\treason?: SourceReason;\n}\n\ninterface SourcePreview {\n\tpreviewId: string;\n\tkind: SourceKind;\n\tdisplayPath: string;\n\texpiresAt?: number;\n\tticketExpiresAt?: number;\n\tconflict?: SourceConflict;\n\taction?: SourcePreviewAction;\n\twarnings: string[];\n\tconfirmOverwriteRequired: boolean;\n}\n\ninterface CapabilityFlags {\n\tcodexSearch: boolean;\n\tcodexImages: boolean;\n\tcodexImageEdits: boolean;\n\tcodexUsage: boolean;\n\tcodexFast: boolean;\n\tgrokImagineImage: boolean;\n\tgrokImagineVideo: boolean;\n}\n\ninterface CapabilitySettingsView extends CapabilityFlags {\n\tsearchResults: number;\n\timageCount: number;\n\tvideoArtifactTtlMs: number;\n}\n\ninterface CapabilitySnapshot {\n\tvalue: CapabilitySettingsView;\n\trevision: number;\n\twritable: boolean;\n}\n\ninterface UsageWindowView {\n\tusedPercent?: number;\n\tremainingPercent?: number;\n\twindowSeconds?: number;\n\tresetsAt?: number;\n}\n\ninterface UsageLimitView {\n\tid: string;\n\tname?: string;\n\twindows: UsageWindowView[];\n}\n\ninterface UsageView {\n\trateLimits: UsageLimitView[];\n\tcreditsUnlimited?: boolean;\n\tcreditsBalance?: string;\n\tindividualLimit?: string;\n\tindividualUsed?: string;\n\tindividualRemaining?: string;\n\tindividualRemainingPercent?: number;\n\tindividualResetsAt?: number;\n\tspendControlReached?: boolean;\n\tresetCredits?: number;\n\tfetchedAt?: number;\n}\n\ninterface ImagineCredentialView {\n\tconfigured: boolean;\n\tsource?: string;\n\twritable?: boolean;\n}\n\ninterface PluginRequestError extends Error {\n\tstatus: number;\n\tcode?: string;\n}\n\nconst SOURCE_KINDS: readonly SourceKind[] = [\"grok\", \"codex\", \"kimi\", \"claude\"];\nconst SOURCE_REASONS: readonly SourceReason[] = [\"missing\", \"unsafe\", \"invalid\", \"too_large\"];\nconst SOURCE_CONFLICTS: readonly SourceConflict[] = [\n\t\"none\",\n\t\"same_credential\",\n\t\"same_account\",\n\t\"different_account\",\n\t\"unknown_account\",\n\t\"unreadable_destination\",\n\t\"unsafe_destination\",\n];\nconst SOURCE_PREVIEW_ACTIONS: readonly SourcePreviewAction[] = [\"import\", \"reuse\", \"overwrite\", \"blocked\"];\nconst SOURCE_COMMIT_ACTIONS: readonly SourceCommitAction[] = [\"imported\", \"unchanged\", \"overwritten\"];\nconst SOURCE_DEFAULT_PATH: { readonly [K in SourceKind]: string } = {\n\tgrok: \"~/.grok/auth.json\",\n\tcodex: \"~/.codex/auth.json\",\n\tkimi: \"~/.kimi/credentials/kimi-code.json\",\n\tclaude: \"~/.claude/.credentials.json\",\n};\nconst SOURCE_KIND_KEY: { readonly [K in SourceKind]: GrokBuildSettingsKey } = {\n\tgrok: \"sourceKindGrok\",\n\tcodex: \"sourceKindCodex\",\n\tkimi: \"sourceKindKimi\",\n\tclaude: \"sourceKindClaude\",\n};\nconst SOURCE_REASON_KEY: { readonly [K in SourceReason]: GrokBuildSettingsKey } = {\n\tmissing: \"sourceReasonMissing\",\n\tunsafe: \"sourceReasonUnsafe\",\n\tinvalid: \"sourceReasonInvalid\",\n\ttoo_large: \"sourceReasonTooLarge\",\n};\nconst SOURCE_CONFLICT_KEY: { readonly [K in SourceConflict]: GrokBuildSettingsKey } = {\n\tnone: \"sourceConflictNone\",\n\tsame_credential: \"sourceConflictSameCredential\",\n\tsame_account: \"sourceConflictSameAccount\",\n\tdifferent_account: \"sourceConflictDifferentAccount\",\n\tunknown_account: \"sourceConflictUnknownAccount\",\n\tunreadable_destination: \"sourceConflictUnreadableDestination\",\n\tunsafe_destination: \"sourceConflictUnsafeDestination\",\n};\nconst SOURCE_PREVIEW_ACTION_KEY: { readonly [K in SourcePreviewAction]: GrokBuildSettingsKey } = {\n\timport: \"sourceActionImport\",\n\treuse: \"sourceActionReuse\",\n\toverwrite: \"sourceActionOverwrite\",\n\tblocked: \"sourceActionBlocked\",\n};\nconst SOURCE_COMMIT_ACTION_KEY: { readonly [K in SourceCommitAction]: GrokBuildSettingsKey } = {\n\timported: \"sourceCommitImported\",\n\tunchanged: \"sourceCommitUnchanged\",\n\toverwritten: \"sourceCommitOverwritten\",\n};\nconst CAPABILITY_TOGGLES: readonly {\n\tkey: CapabilityFlagKey;\n\tlabel: GrokBuildSettingsKey;\n\thint: GrokBuildSettingsKey;\n\trequiresImages?: true;\n}[] = [\n\t{ key: \"codexSearch\", label: \"capCodexSearch\", hint: \"capCodexSearchHint\" },\n\t{ key: \"codexImages\", label: \"capCodexImages\", hint: \"capCodexImagesHint\" },\n\t{ key: \"codexImageEdits\", label: \"capCodexImageEdits\", hint: \"capCodexImageEditsHint\", requiresImages: true },\n\t{ key: \"codexUsage\", label: \"capCodexUsage\", hint: \"capCodexUsageHint\" },\n\t{ key: \"codexFast\", label: \"capCodexFast\", hint: \"capCodexFastHint\" },\n\t{ key: \"grokImagineImage\", label: \"capGrokImagineImage\", hint: \"capGrokImagineImageHint\" },\n\t{ key: \"grokImagineVideo\", label: \"capGrokImagineVideo\", hint: \"capGrokImagineVideoHint\" },\n];\nconst HOUR_MS = 60 * 60 * 1000;\nconst CAPABILITY_LIMITS: readonly {\n\tkey: CapabilityLimitKey;\n\tlabel: GrokBuildSettingsKey;\n\thint: GrokBuildSettingsKey;\n\tmin: number;\n\tmax: number;\n\tscale: number;\n}[] = [\n\t{ key: \"searchResults\", label: \"capSearchResults\", hint: \"capSearchResultsHint\", min: 1, max: 20, scale: 1 },\n\t{ key: \"imageCount\", label: \"capImageCount\", hint: \"capImageCountHint\", min: 1, max: 4, scale: 1 },\n\t{\n\t\tkey: \"videoArtifactTtlMs\",\n\t\tlabel: \"capVideoTtlHours\",\n\t\thint: \"capVideoTtlHoursHint\",\n\t\tmin: 1,\n\t\tmax: 168,\n\t\tscale: HOUR_MS,\n\t},\n];\nconst IMAGINE_SOURCE_KEY: { readonly [source: string]: GrokBuildSettingsKey } = {\n\tnone: \"imagineSourceNone\",\n\tenv: \"imagineSourceEnv\",\n\tenvironment: \"imagineSourceEnv\",\n\t\"xai-api-key\": \"imagineSourceEnv\",\n\txai_api_key: \"imagineSourceEnv\",\n\t\"api-key\": \"imagineSourceApiKey\",\n\tapi_key: \"imagineSourceApiKey\",\n\tapikey: \"imagineSourceApiKey\",\n\tkey: \"imagineSourceApiKey\",\n\tsettings: \"imagineSourceApiKey\",\n\toauth: \"imagineSourceOAuth\",\n\t\"oauth-access\": \"imagineSourceOAuth\",\n\t\"grok-cli-key\": \"imagineSourceCliKey\",\n\t\"cli-key\": \"imagineSourceCliKey\",\n};\n\nconst PROVIDERS: readonly ProviderCardDefinition[] = [\n\t{\n\t\tslug: \"grok\",\n\t\troute: \"grok-build\",\n\t\ttitleKey: \"grokTitle\",\n\t\tdescriptionKey: \"grokDescription\",\n\t\tmethods: [\"pkce\", \"device\"],\n\t\trecommended: \"pkce\",\n\t},\n\t{\n\t\tslug: \"codex\",\n\t\troute: \"codex-oauth\",\n\t\ttitleKey: \"codexTitle\",\n\t\tdescriptionKey: \"codexDescription\",\n\t\tmethods: [\"device\", \"browser\"],\n\t\trecommended: \"device\",\n\t},\n\t{\n\t\tslug: \"kimi\",\n\t\troute: \"kimi-code-oauth\",\n\t\ttitleKey: \"kimiTitle\",\n\t\tdescriptionKey: \"kimiDescription\",\n\t\tmethods: [\"device\"],\n\t\trecommended: \"device\",\n\t},\n\t{\n\t\tslug: \"claude\",\n\t\troute: \"claude-code-oauth\",\n\t\ttitleKey: \"claudeTitle\",\n\t\tdescriptionKey: \"claudeDescription\",\n\t\tmethods: [\"browser\"],\n\t\trecommended: \"browser\",\n\t},\n];\n\ntype SettingsTabId = \"accounts\" | \"capabilities\" | \"gateway\" | \"about\";\ntype CopyField = \"openai\" | \"anthropic\" | \"key\";\n\nconst SETTINGS_TABS: readonly { id: SettingsTabId; label: GrokBuildSettingsKey }[] = [\n\t{ id: \"accounts\", label: \"tabAccounts\" },\n\t{ id: \"gateway\", label: \"tabGateway\" },\n\t{ id: \"capabilities\", label: \"tabCapabilities\" },\n\t{ id: \"about\", label: \"tabAbout\" },\n];\n\nexport interface GrokBuildSettingsInjected {\n\tt: (key: GrokBuildSettingsKey, params?: Record<string, unknown>) => string;\n}\n\nexport type GrokBuildSettingsProps = Partial<GrokBuildSettingsInjected>;\n\nconst pageStyle: CSSProperties = { display: \"flex\", flexDirection: \"column\", gap: 16, maxWidth: 780 };\nconst titleStyle: CSSProperties = {\n\tmargin: 0,\n\tfontSize: 20,\n\tlineHeight: \"28px\",\n\tfontWeight: 600,\n\tcolor: \"var(--dsw-alias-label-primary)\",\n};\nconst bodyStyle: CSSProperties = {\n\tmargin: 0,\n\tfontSize: 14,\n\tlineHeight: \"22px\",\n\tcolor: \"var(--dsw-alias-label-secondary)\",\n};\nconst cardStyle: CSSProperties = {\n\tdisplay: \"flex\",\n\tflexDirection: \"column\",\n\tgap: 14,\n\tpadding: \"18px 20px\",\n\tborder: \"1px solid var(--dsw-alias-border-l2)\",\n\tborderRadius: 12,\n\tbackground: \"var(--dsw-alias-bg-module-platform)\",\n};\nconst rowStyle: CSSProperties = {\n\tdisplay: \"flex\",\n\talignItems: \"center\",\n\tjustifyContent: \"space-between\",\n\tflexWrap: \"wrap\",\n\tgap: 12,\n};\nconst statusStyle: CSSProperties = {\n\tdisplay: \"flex\",\n\talignItems: \"center\",\n\tgap: 9,\n\tfontSize: 14,\n\tfontWeight: 500,\n\tcolor: \"var(--dsw-alias-label-primary)\",\n};\nconst buttonStyle: CSSProperties = {\n\tboxSizing: \"border-box\",\n\tminHeight: 34,\n\tpadding: \"6px 14px\",\n\tborder: \"1px solid var(--dsw-alias-border-l4, rgba(127, 127, 127, 0.4))\",\n\tborderRadius: 18,\n\tbackground: \"var(--dsw-alias-button-elevated-fill, var(--dsw-alias-bg-layer-1))\",\n\tcolor: \"var(--dsw-alias-label-primary)\",\n\tboxShadow: \"0 1px 2px rgba(0, 0, 0, 0.18)\",\n\tfont: \"inherit\",\n\tfontSize: 14,\n\tfontWeight: 500,\n\tcursor: \"pointer\",\n};\nconst primaryButtonStyle: CSSProperties = {\n\t...buttonStyle,\n\tborderColor: \"#315fc7\",\n\tbackground: \"#315fc7\",\n\tcolor: \"#ffffff\",\n\tboxShadow: \"0 1px 3px rgba(0, 0, 0, 0.28)\",\n\tfontWeight: 600,\n};\nconst errorStyle: CSSProperties = { ...bodyStyle, color: \"var(--dsw-alias-state-error-primary)\" };\nconst warningStyle: CSSProperties = {\n\t...bodyStyle,\n\tpadding: \"10px 12px\",\n\tborderRadius: 8,\n\tbackground: \"var(--dsw-alias-bg-layer-1)\",\n};\nconst codeStyle: CSSProperties = {\n\tfontFamily: \"ui-monospace, SFMono-Regular, Menlo, Consolas, monospace\",\n\tfontSize: 20,\n\tletterSpacing: \"0.08em\",\n\tfontWeight: 600,\n\tcolor: \"var(--dsw-alias-label-primary)\",\n};\nconst monoStyle: CSSProperties = { fontFamily: \"ui-monospace, SFMono-Regular, Menlo, Consolas, monospace\" };\nconst linkStyle: CSSProperties = { color: \"var(--dsw-alias-brand-primary)\", wordBreak: \"break-all\" };\nconst listStyle: CSSProperties = {\n\tdisplay: \"flex\",\n\tflexDirection: \"column\",\n\tgap: 8,\n\tmargin: 0,\n\tpadding: 0,\n\tlistStyle: \"none\",\n};\nconst checkRowStyle: CSSProperties = {\n\tdisplay: \"flex\",\n\talignItems: \"flex-start\",\n\tgap: 8,\n\tfontSize: 14,\n\tcolor: \"var(--dsw-alias-label-primary)\",\n};\nconst inputStyle: CSSProperties = {\n\tboxSizing: \"border-box\",\n\twidth: \"100%\",\n\tminHeight: 34,\n\tpadding: \"6px 12px\",\n\tborder: \"1px solid var(--dsw-alias-border-l2)\",\n\tborderRadius: 8,\n\tbackground: \"var(--dsw-alias-bg-layer-1)\",\n\tcolor: \"var(--dsw-alias-label-primary)\",\n\tfont: \"inherit\",\n\tfontSize: 13,\n};\nconst nestedStyle: CSSProperties = {\n\tdisplay: \"flex\",\n\tflexDirection: \"column\",\n\tgap: 8,\n\tpadding: \"12px 14px\",\n\tborder: \"1px solid var(--dsw-alias-border-l2)\",\n\tborderRadius: 8,\n\tbackground: \"var(--dsw-alias-bg-layer-1)\",\n};\nconst hintStyle: CSSProperties = { ...bodyStyle, fontSize: 13 };\nconst tabNavStyle: CSSProperties = {\n\tdisplay: \"flex\",\n\tflexWrap: \"wrap\",\n\tgap: 8,\n};\nconst tabButtonStyle: CSSProperties = {\n\t...buttonStyle,\n\tborderRadius: 10,\n};\nconst tabButtonActiveStyle: CSSProperties = {\n\t...primaryButtonStyle,\n\tborderRadius: 10,\n};\nconst panelStyle: CSSProperties = {\n\tdisplay: \"flex\",\n\tflexDirection: \"column\",\n\tgap: 14,\n\tminWidth: 0,\n};\nconst accountGridStyle: CSSProperties = {\n\tdisplay: \"grid\",\n\tgridTemplateColumns: \"repeat(auto-fill, minmax(320px, 1fr))\",\n\tgap: 14,\n};\nconst copyRowStyle: CSSProperties = {\n\tdisplay: \"flex\",\n\talignItems: \"center\",\n\tjustifyContent: \"space-between\",\n\tflexWrap: \"wrap\",\n\tgap: 8,\n};\n\nfunction dotStyle(\n\tstatus: ProviderStatus[\"status\"] | \"loading\" | \"available\" | \"unavailable\",\n\tinstalled = true,\n): CSSProperties {\n\tconst color = !installed\n\t\t? \"var(--dsw-alias-label-dimmed, #9aa0a6)\"\n\t\t: status === \"signed-in\" || status === \"available\"\n\t\t\t? \"var(--dsw-alias-state-success-primary, #22a06b)\"\n\t\t\t: status === \"error\"\n\t\t\t\t? \"var(--dsw-alias-state-error-primary, #d92d20)\"\n\t\t\t\t: status === \"signing-in\" || status === \"loading\"\n\t\t\t\t\t? \"var(--dsw-alias-brand-primary, #1677ff)\"\n\t\t\t\t\t: \"var(--dsw-alias-label-dimmed, #9aa0a6)\";\n\treturn { width: 9, height: 9, borderRadius: \"50%\", flex: \"0 0 auto\", background: color };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction optionalString(value: unknown): string | undefined {\n\treturn typeof value === \"string\" && value.length > 0 && value.length < 500 ? value : undefined;\n}\n\nfunction optionalFiniteNumber(value: unknown): number | undefined {\n\treturn typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction optionalBoolean(value: unknown): boolean | undefined {\n\treturn typeof value === \"boolean\" ? value : undefined;\n}\n\nfunction optionalPercent(value: unknown): number | undefined {\n\tconst numeric = optionalFiniteNumber(value);\n\treturn numeric !== undefined && numeric >= 0 && numeric <= 100 ? numeric : undefined;\n}\n\nfunction isSourceKind(value: string): value is SourceKind {\n\treturn (SOURCE_KINDS as readonly string[]).includes(value);\n}\n\nfunction isSourceReason(value: string): value is SourceReason {\n\treturn (SOURCE_REASONS as readonly string[]).includes(value);\n}\n\nfunction isSourceConflict(value: string): value is SourceConflict {\n\treturn (SOURCE_CONFLICTS as readonly string[]).includes(value);\n}\n\nfunction isSourcePreviewAction(value: string): value is SourcePreviewAction {\n\treturn (SOURCE_PREVIEW_ACTIONS as readonly string[]).includes(value);\n}\n\nfunction isSourceCommitAction(value: string): value is SourceCommitAction {\n\treturn (SOURCE_COMMIT_ACTIONS as readonly string[]).includes(value);\n}\n\nfunction looksSecret(value: string): boolean {\n\treturn /eyJ[A-Za-z0-9_-]+\\.|sk-[A-Za-z0-9_-]{8,}|Bearer\\s+\\S+/u.test(value);\n}\n\nfunction safeDisplayPath(value: unknown, kind: SourceKind): string {\n\tconst text = optionalString(value);\n\tif (text === undefined || looksSecret(text) || text.length > 180) return SOURCE_DEFAULT_PATH[kind];\n\treturn text;\n}\n\nfunction safeWarning(value: unknown): string | undefined {\n\tconst text = optionalString(value);\n\tif (text === undefined || looksSecret(text)) return undefined;\n\treturn text;\n}\n\nfunction formatEpoch(value: number | undefined): string | undefined {\n\tif (value === undefined || !Number.isFinite(value) || value <= 0) return undefined;\n\tconst ms = value > 1e12 ? value : value > 1e9 ? value * 1000 : undefined;\n\tif (ms === undefined) return undefined;\n\tconst formatted = new Date(ms).toLocaleString();\n\treturn formatted.length > 0 ? formatted : undefined;\n}\n\nfunction isPluginRequestError(error: unknown): error is PluginRequestError {\n\treturn error instanceof Error && error.name === \"PluginRequestError\" && \"status\" in error;\n}\n\nfunction isConflictError(error: unknown): boolean {\n\tif (!isPluginRequestError(error)) {\n\t\treturn (\n\t\t\terror instanceof Error && /SETTINGS_CONFLICT|settings-conflict|changed since it was read/iu.test(error.message)\n\t\t);\n\t}\n\treturn error.status === 409 || error.code === \"SETTINGS_CONFLICT\" || /conflict/iu.test(error.message);\n}\n\nconst CONSUMED_PREVIEW_CODES = new Set([\n\t\"preview_invalid\",\n\t\"preview_expired\",\n\t\"source_changed\",\n\t\"destination_changed\",\n\t\"confirm_required\",\n\t\"unsafe_destination\",\n]);\n\nfunction isConsumedPreviewError(error: unknown): boolean {\n\tif (!isPluginRequestError(error)) return false;\n\tif (error.code !== undefined && CONSUMED_PREVIEW_CODES.has(error.code)) return true;\n\treturn error.status === 404 || error.status === 410;\n}\n\nfunction cancelPreviewTicket(previewId: string, keepalive = false): void {\n\tvoid fetch(SOURCES_CANCEL_PATH, {\n\t\tmethod: \"POST\",\n\t\theaders: { accept: \"application/json\", \"content-type\": \"application/json\" },\n\t\tcredentials: \"same-origin\",\n\t\tbody: JSON.stringify({ previewId }),\n\t\t...(keepalive ? { keepalive: true } : {}),\n\t}).catch(() => undefined);\n}\n\nasync function jsonRequest<T>(path: string, method = \"GET\", body?: unknown): Promise<T> {\n\tconst response = await fetch(path, {\n\t\tmethod,\n\t\theaders: { accept: \"application/json\", ...(body === undefined ? {} : { \"content-type\": \"application/json\" }) },\n\t\tcredentials: \"same-origin\",\n\t\t...(body === undefined ? {} : { body: JSON.stringify(body) }),\n\t});\n\tconst value: unknown = await response.json().catch(() => undefined);\n\tif (!response.ok) {\n\t\tconst record = isRecord(value) ? value : undefined;\n\t\tconst message =\n\t\t\trecord !== undefined && typeof record[\"error\"] === \"string\"\n\t\t\t\t? record[\"error\"]\n\t\t\t\t: record !== undefined && typeof record[\"message\"] === \"string\"\n\t\t\t\t\t? record[\"message\"]\n\t\t\t\t\t: `HTTP ${response.status}`;\n\t\tconst code = record !== undefined && typeof record[\"code\"] === \"string\" ? record[\"code\"] : undefined;\n\t\tconst error = new Error(message) as PluginRequestError;\n\t\terror.name = \"PluginRequestError\";\n\t\terror.status = response.status;\n\t\tif (code !== undefined) error.code = code;\n\t\tthrow error;\n\t}\n\treturn value as T;\n}\n\nfunction parseSource(value: unknown): SourceStatus | undefined {\n\tif (!isRecord(value) || typeof value[\"kind\"] !== \"string\" || !isSourceKind(value[\"kind\"])) return undefined;\n\tconst kind = value[\"kind\"];\n\tconst reasonRaw = optionalString(value[\"reason\"]);\n\tconst expiresAt = optionalFiniteNumber(value[\"expiresAt\"]);\n\treturn {\n\t\tkind,\n\t\tdisplayPath: safeDisplayPath(value[\"displayPath\"], kind),\n\t\tavailable: value[\"available\"] === true,\n\t\t...(expiresAt === undefined ? {} : { expiresAt }),\n\t\t...(reasonRaw !== undefined && isSourceReason(reasonRaw) ? { reason: reasonRaw } : {}),\n\t};\n}\n\nfunction mergeSources(discovered: readonly SourceStatus[]): SourceStatus[] {\n\treturn SOURCE_KINDS.map((kind) => {\n\t\tconst found = discovered.find((entry) => entry.kind === kind);\n\t\treturn found ?? { kind, displayPath: SOURCE_DEFAULT_PATH[kind], available: false, reason: \"missing\" };\n\t});\n}\n\nfunction parseSources(value: unknown): SourceStatus[] {\n\tconst rows = Array.isArray(value)\n\t\t? value\n\t\t: isRecord(value) && Array.isArray(value[\"sources\"])\n\t\t\t? value[\"sources\"]\n\t\t\t: [];\n\treturn mergeSources(rows.map(parseSource).filter((entry): entry is SourceStatus => entry !== undefined));\n}\n\nfunction parsePreview(value: unknown): SourcePreview | undefined {\n\tif (!isRecord(value)) return undefined;\n\tconst previewId = optionalString(value[\"previewId\"]);\n\tconst kindRaw = optionalString(value[\"kind\"]);\n\tif (previewId === undefined || kindRaw === undefined || !isSourceKind(kindRaw)) return undefined;\n\tconst conflictRaw = optionalString(value[\"conflict\"]);\n\tconst actionRaw = optionalString(value[\"action\"]);\n\tconst expiresAt = optionalFiniteNumber(value[\"expiresAt\"]);\n\tconst ticketExpiresAt = optionalFiniteNumber(value[\"ticketExpiresAt\"]);\n\tconst warnings = Array.isArray(value[\"warnings\"])\n\t\t? value[\"warnings\"].map(safeWarning).filter((entry): entry is string => entry !== undefined)\n\t\t: [];\n\treturn {\n\t\tpreviewId,\n\t\tkind: kindRaw,\n\t\tdisplayPath: safeDisplayPath(value[\"displayPath\"], kindRaw),\n\t\tconfirmOverwriteRequired: value[\"confirmOverwriteRequired\"] === true,\n\t\twarnings,\n\t\t...(expiresAt === undefined ? {} : { expiresAt }),\n\t\t...(ticketExpiresAt === undefined ? {} : { ticketExpiresAt }),\n\t\t...(conflictRaw !== undefined && isSourceConflict(conflictRaw) ? { conflict: conflictRaw } : {}),\n\t\t...(actionRaw !== undefined && isSourcePreviewAction(actionRaw) ? { action: actionRaw } : {}),\n\t};\n}\n\nfunction parseCommitAction(value: unknown): SourceCommitAction | undefined {\n\tif (!isRecord(value)) return undefined;\n\tconst action = optionalString(value[\"action\"]);\n\treturn action !== undefined && isSourceCommitAction(action) ? action : undefined;\n}\n\nfunction boundedInteger(value: unknown, min: number, max: number, fallback: number): number {\n\tconst numeric = optionalFiniteNumber(value);\n\treturn numeric !== undefined && Number.isInteger(numeric) && numeric >= min && numeric <= max ? numeric : fallback;\n}\n\nfunction emptyCapabilitySettings(): CapabilitySettingsView {\n\treturn {\n\t\tcodexSearch: false,\n\t\tcodexImages: false,\n\t\tcodexImageEdits: false,\n\t\tcodexUsage: false,\n\t\tcodexFast: false,\n\t\tgrokImagineImage: false,\n\t\tgrokImagineVideo: false,\n\t\tsearchResults: 5,\n\t\timageCount: 1,\n\t\tvideoArtifactTtlMs: 7 * 24 * HOUR_MS,\n\t};\n}\n\nfunction parseCapabilitySettings(value: unknown): CapabilitySettingsView {\n\tconst source = isRecord(value) ? value : {};\n\treturn {\n\t\tcodexSearch: source[\"codexSearch\"] === true,\n\t\tcodexImages: source[\"codexImages\"] === true,\n\t\tcodexImageEdits: source[\"codexImageEdits\"] === true,\n\t\tcodexUsage: source[\"codexUsage\"] === true,\n\t\tcodexFast: source[\"codexFast\"] === true,\n\t\tgrokImagineImage: source[\"grokImagineImage\"] === true,\n\t\tgrokImagineVideo: source[\"grokImagineVideo\"] === true,\n\t\tsearchResults: boundedInteger(source[\"searchResults\"], 1, 20, 5),\n\t\timageCount: boundedInteger(source[\"imageCount\"], 1, 4, 1),\n\t\tvideoArtifactTtlMs: boundedInteger(source[\"videoArtifactTtlMs\"], HOUR_MS, 7 * 24 * HOUR_MS, 7 * 24 * HOUR_MS),\n\t};\n}\n\nfunction parseCapabilities(value: unknown): CapabilitySnapshot | undefined {\n\tif (!isRecord(value)) return undefined;\n\tconst nested = isRecord(value[\"value\"]) ? value[\"value\"] : value;\n\tconst revision = optionalFiniteNumber(value[\"revision\"]);\n\tif (revision === undefined && !isRecord(value[\"value\"]) && value[\"writable\"] === undefined) return undefined;\n\treturn {\n\t\tvalue: parseCapabilitySettings(nested),\n\t\trevision: revision ?? 0,\n\t\twritable: value[\"writable\"] === true,\n\t};\n}\n\nfunction parseUsageWindow(value: unknown): UsageWindowView | undefined {\n\tif (!isRecord(value)) return undefined;\n\tconst usedPercent = optionalPercent(value[\"usedPercent\"] ?? value[\"used_percent\"]);\n\tconst remainingPercent = optionalPercent(value[\"remainingPercent\"] ?? value[\"remaining_percent\"]);\n\tconst windowSeconds = optionalFiniteNumber(value[\"windowSeconds\"] ?? value[\"limit_window_seconds\"]);\n\tconst resetsAt = optionalFiniteNumber(value[\"resetsAt\"] ?? value[\"reset_at\"]);\n\tif (\n\t\tusedPercent === undefined &&\n\t\tremainingPercent === undefined &&\n\t\twindowSeconds === undefined &&\n\t\tresetsAt === undefined\n\t) {\n\t\treturn undefined;\n\t}\n\treturn {\n\t\t...(usedPercent === undefined ? {} : { usedPercent }),\n\t\t...(remainingPercent === undefined ? {} : { remainingPercent }),\n\t\t...(windowSeconds !== undefined && windowSeconds > 0 ? { windowSeconds } : {}),\n\t\t...(resetsAt === undefined ? {} : { resetsAt }),\n\t};\n}\n\nfunction parseUsageLimit(value: unknown, fallbackId: string): UsageLimitView | undefined {\n\tif (!isRecord(value)) return undefined;\n\tconst id = optionalString(value[\"id\"]) ?? optionalString(value[\"metered_feature\"]) ?? fallbackId;\n\tconst name = optionalString(value[\"name\"]) ?? optionalString(value[\"limit_name\"]);\n\tconst nested = isRecord(value[\"rate_limit\"]) ? value[\"rate_limit\"] : value;\n\tconst windows = Array.isArray(value[\"windows\"])\n\t\t? value[\"windows\"].map(parseUsageWindow).filter((entry): entry is UsageWindowView => entry !== undefined)\n\t\t: [\n\t\t\t\tparseUsageWindow(nested[\"primary_window\"]),\n\t\t\t\tparseUsageWindow(nested[\"secondary_window\"]),\n\t\t\t\tparseUsageWindow(nested),\n\t\t\t].filter((entry): entry is UsageWindowView => entry !== undefined);\n\tif (windows.length === 0 && name === undefined && optionalString(value[\"id\"]) === undefined) return undefined;\n\treturn { id, windows, ...(name === undefined ? {} : { name }) };\n}\n\nfunction parseUsage(value: unknown): UsageView | undefined {\n\tif (!isRecord(value)) return undefined;\n\tconst payload = isRecord(value[\"usage\"]) ? value[\"usage\"] : value;\n\tconst rateLimits: UsageLimitView[] = [];\n\tconst seen = new Set<string>();\n\tconst add = (limit: UsageLimitView | undefined): void => {\n\t\tif (limit === undefined || seen.has(limit.id)) return;\n\t\tseen.add(limit.id);\n\t\trateLimits.push(limit);\n\t};\n\tif (Array.isArray(payload[\"rateLimits\"])) {\n\t\tpayload[\"rateLimits\"].forEach((entry, index) => add(parseUsageLimit(entry, `limit-${String(index)}`)));\n\t} else {\n\t\tadd(parseUsageLimit(payload[\"rate_limit\"], \"codex\"));\n\t\tif (Array.isArray(payload[\"additional_rate_limits\"])) {\n\t\t\tpayload[\"additional_rate_limits\"].forEach((entry, index) =>\n\t\t\t\tadd(parseUsageLimit(entry, `extra-${String(index)}`)),\n\t\t\t);\n\t\t}\n\t\tadd(parseUsageLimit(payload[\"code_review_rate_limit\"], \"code_review\"));\n\t}\n\tconst credits = isRecord(payload[\"credits\"]) ? payload[\"credits\"] : undefined;\n\tconst spend = isRecord(payload[\"individualLimit\"])\n\t\t? payload[\"individualLimit\"]\n\t\t: isRecord(payload[\"spend_control\"])\n\t\t\t? isRecord(payload[\"spend_control\"][\"individual_limit\"])\n\t\t\t\t? payload[\"spend_control\"][\"individual_limit\"]\n\t\t\t\t: payload[\"spend_control\"]\n\t\t\t: undefined;\n\tconst resetRaw = isRecord(payload[\"resetCredits\"])\n\t\t? payload[\"resetCredits\"][\"availableCount\"]\n\t\t: isRecord(payload[\"rate_limit_reset_credits\"])\n\t\t\t? payload[\"rate_limit_reset_credits\"][\"available_count\"]\n\t\t\t: undefined;\n\tconst resetCredits = optionalFiniteNumber(resetRaw);\n\tconst fetchedAt = optionalFiniteNumber(payload[\"fetchedAt\"]);\n\tconst spendControlReached =\n\t\toptionalBoolean(payload[\"spendControlReached\"]) ??\n\t\t(isRecord(payload[\"spend_control\"]) ? optionalBoolean(payload[\"spend_control\"][\"reached\"]) : undefined);\n\tconst creditsBalance = credits === undefined ? undefined : optionalString(credits[\"balance\"]);\n\tconst individualLimit = spend === undefined ? undefined : optionalString(spend[\"limit\"]);\n\tconst individualUsed = spend === undefined ? undefined : optionalString(spend[\"used\"]);\n\tconst individualRemaining = spend === undefined ? undefined : optionalString(spend[\"remaining\"]);\n\tconst individualRemainingPercent =\n\t\tspend === undefined ? undefined : optionalPercent(spend[\"remainingPercent\"] ?? spend[\"remaining_percent\"]);\n\tconst individualResetsAt =\n\t\tspend === undefined ? undefined : optionalFiniteNumber(spend[\"resetsAt\"] ?? spend[\"reset_at\"]);\n\treturn {\n\t\trateLimits,\n\t\t...(credits !== undefined && typeof credits[\"unlimited\"] === \"boolean\"\n\t\t\t? { creditsUnlimited: credits[\"unlimited\"] }\n\t\t\t: {}),\n\t\t...(creditsBalance === undefined ? {} : { creditsBalance }),\n\t\t...(individualLimit === undefined ? {} : { individualLimit }),\n\t\t...(individualUsed === undefined ? {} : { individualUsed }),\n\t\t...(individualRemaining === undefined ? {} : { individualRemaining }),\n\t\t...(individualRemainingPercent === undefined ? {} : { individualRemainingPercent }),\n\t\t...(individualResetsAt === undefined ? {} : { individualResetsAt }),\n\t\t...(spendControlReached === undefined ? {} : { spendControlReached }),\n\t\t...(resetCredits !== undefined && resetCredits >= 0 && Number.isSafeInteger(resetCredits) ? { resetCredits } : {}),\n\t\t...(fetchedAt === undefined ? {} : { fetchedAt }),\n\t};\n}\n\nfunction usageHasVisibleFields(usage: UsageView): boolean {\n\treturn (\n\t\tusage.rateLimits.some((limit) => limit.windows.length > 0 || limit.name !== undefined) ||\n\t\tusage.creditsUnlimited !== undefined ||\n\t\tusage.creditsBalance !== undefined ||\n\t\tusage.individualLimit !== undefined ||\n\t\tusage.individualUsed !== undefined ||\n\t\tusage.individualRemaining !== undefined ||\n\t\tusage.individualRemainingPercent !== undefined ||\n\t\tusage.spendControlReached === true ||\n\t\tusage.resetCredits !== undefined\n\t);\n}\n\ninterface GatewayView {\n\tenabled: boolean;\n\trunning: boolean;\n\tbind: string;\n\tport: number;\n\tkeyHint: string;\n\twarning: string;\n}\n\nfunction parseGateway(value: unknown): GatewayView | undefined {\n\tif (!isRecord(value)) return undefined;\n\tconst bind = optionalString(value[\"bind\"]);\n\tconst port = optionalFiniteNumber(value[\"port\"]);\n\tif (bind === undefined || port === undefined) return undefined;\n\treturn {\n\t\tenabled: value[\"enabled\"] === true,\n\t\trunning: value[\"running\"] === true,\n\t\tbind,\n\t\tport,\n\t\tkeyHint: optionalString(value[\"keyHint\"]) ?? \"\",\n\t\twarning: optionalString(value[\"warning\"]) ?? \"\",\n\t};\n}\n\nfunction formatGatewayBaseUrl(bind: string, port: number): string {\n\tconst host = bind.includes(\":\") && !bind.startsWith(\"[\") ? `[${bind}]` : bind;\n\treturn `http://${host}:${String(port)}`;\n}\n\nconst GATEWAY_PORT_MIN = 1024;\nconst GATEWAY_PORT_MAX = 65_535;\nconst GATEWAY_RANDOM_PORT_MIN = 18_100;\nconst GATEWAY_RANDOM_PORT_MAX = 18_999;\nconst GATEWAY_RANDOM_RESERVED = new Set([22, 53, 3080, 7890, 9090, 18_080]);\n\nfunction randomGatewayPort(exclude?: number): number {\n\tfor (let attempt = 0; attempt < 32; attempt += 1) {\n\t\tconst span = GATEWAY_RANDOM_PORT_MAX - GATEWAY_RANDOM_PORT_MIN + 1;\n\t\tconst candidate = GATEWAY_RANDOM_PORT_MIN + Math.floor(Math.random() * span);\n\t\tif (candidate !== exclude && !GATEWAY_RANDOM_RESERVED.has(candidate)) return candidate;\n\t}\n\treturn exclude === GATEWAY_RANDOM_PORT_MIN ? GATEWAY_RANDOM_PORT_MIN + 1 : GATEWAY_RANDOM_PORT_MIN;\n}\n\nfunction parseGatewayPort(value: string): number | undefined {\n\tconst port = Number(value);\n\tif (!Number.isInteger(port) || port < GATEWAY_PORT_MIN || port > GATEWAY_PORT_MAX) return undefined;\n\treturn port;\n}\n\nasync function copyText(text: string): Promise<boolean> {\n\ttry {\n\t\tif (typeof navigator !== \"undefined\" && navigator.clipboard?.writeText !== undefined) {\n\t\t\tawait navigator.clipboard.writeText(text);\n\t\t\treturn true;\n\t\t}\n\t} catch {\n\t\t// fall through to execCommand\n\t}\n\ttry {\n\t\tconst area = document.createElement(\"textarea\");\n\t\tarea.value = text;\n\t\tarea.setAttribute(\"readonly\", \"\");\n\t\tarea.style.position = \"fixed\";\n\t\tarea.style.left = \"-9999px\";\n\t\tdocument.body.appendChild(area);\n\t\tarea.select();\n\t\tconst ok = document.execCommand(\"copy\");\n\t\tdocument.body.removeChild(area);\n\t\treturn ok;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction parseImagineCredential(value: unknown): ImagineCredentialView | undefined {\n\tif (!isRecord(value)) return undefined;\n\tconst configured = optionalBoolean(value[\"configured\"]);\n\tif (configured === undefined && value[\"source\"] === undefined && value[\"writable\"] === undefined) return undefined;\n\tconst source = optionalString(value[\"source\"]);\n\tconst writable = optionalBoolean(value[\"writable\"]);\n\treturn {\n\t\tconfigured: configured === true,\n\t\t...(source === undefined || looksSecret(source) ? {} : { source }),\n\t\t...(writable === undefined ? {} : { writable }),\n\t};\n}\n\nfunction imagineSourceLabel(source: string | undefined, t: GrokBuildSettingsInjected[\"t\"]): string {\n\tif (source === undefined) return t(\"imagineSourceUnknown\");\n\tconst mapped = IMAGINE_SOURCE_KEY[source] ?? IMAGINE_SOURCE_KEY[source.toLowerCase()];\n\tif (mapped !== undefined) return t(mapped);\n\tif (source.length <= 40 && /^[a-z0-9._-]+$/iu.test(source) && !looksSecret(source)) return source;\n\treturn t(\"imagineSourceUnknown\");\n}\n\nfunction methodLabel(method: LoginMethod, t: GrokBuildSettingsInjected[\"t\"]): string {\n\tif (method === \"device\") return t(\"deviceLogin\");\n\tif (method === \"browser\") return t(\"browserLogin\");\n\treturn t(\"pkceLogin\");\n}\n\nfunction modelFields(status: ProviderStatus): { available: string[]; selected: string[] } {\n\tif (status.status !== \"signed-in\") return { available: [], selected: [] };\n\treturn {\n\t\tavailable: \"available\" in status ? status.available : [],\n\t\tselected: \"selected\" in status ? status.selected : [],\n\t};\n}\n\n/** Multi-provider coding subscription status and OAuth actions. */\nexport function GrokBuildSettings({ t }: GrokBuildSettingsProps) {\n\tif (t === undefined) throw new Error(\"Coding OAuth settings requires its translation function\");\n\tconst [status, setStatus] = useState<CodingOAuthStatus | undefined>(undefined);\n\tconst [requestError, setRequestError] = useState<string | undefined>(undefined);\n\tconst [busyProvider, setBusyProvider] = useState<ProviderSlug | undefined>(undefined);\n\tconst [codeInputs, setCodeInputs] = useState<Partial<Record<ProviderSlug, string>>>({});\n\tconst [popupBlocked, setPopupBlocked] = useState<Partial<Record<ProviderSlug, boolean>>>({});\n\tconst [sources, setSources] = useState<SourceStatus[] | undefined>(undefined);\n\tconst [sourcesError, setSourcesError] = useState<string | undefined>(undefined);\n\tconst [sourcesBusy, setSourcesBusy] = useState(false);\n\tconst [preview, setPreview] = useState<SourcePreview | undefined>(undefined);\n\tconst previewRef = useRef<SourcePreview | undefined>(undefined);\n\tconst previewEpochRef = useRef(0);\n\tconst mountedRef = useRef(true);\n\tconst [confirmOverwrite, setConfirmOverwrite] = useState(false);\n\tconst [sourcesNotice, setSourcesNotice] = useState<string | undefined>(undefined);\n\tconst [capabilities, setCapabilities] = useState<CapabilitySnapshot | undefined>(undefined);\n\tconst [capabilitiesError, setCapabilitiesError] = useState<string | undefined>(undefined);\n\tconst [capabilitiesBusy, setCapabilitiesBusy] = useState(false);\n\tconst [usage, setUsage] = useState<UsageView | undefined>(undefined);\n\tconst [usageError, setUsageError] = useState<string | undefined>(undefined);\n\tconst [usageLoading, setUsageLoading] = useState(false);\n\tconst [imagine, setImagine] = useState<ImagineCredentialView | undefined>(undefined);\n\tconst [imagineError, setImagineError] = useState<string | undefined>(undefined);\n\tconst [gateway, setGateway] = useState<GatewayView | undefined>(undefined);\n\tconst [gatewayError, setGatewayError] = useState<string | undefined>(undefined);\n\tconst [gatewayBusy, setGatewayBusy] = useState(false);\n\tconst [gatewayOnceKey, setGatewayOnceKey] = useState<string | undefined>(undefined);\n\tconst [gatewayKeyVisible, setGatewayKeyVisible] = useState(false);\n\tconst [gatewayRotateConfirm, setGatewayRotateConfirm] = useState(false);\n\tconst [gatewayRevealError, setGatewayRevealError] = useState<string | undefined>(undefined);\n\tconst [portDraft, setPortDraft] = useState(\"\");\n\tconst [activeTab, setActiveTab] = useState<SettingsTabId>(\"accounts\");\n\tconst [copiedField, setCopiedField] = useState<CopyField | undefined>(undefined);\n\tconst [copyFailedField, setCopyFailedField] = useState<CopyField | undefined>(undefined);\n\tconst [expandedProviders, setExpandedProviders] = useState<Partial<Record<ProviderSlug, boolean>>>({});\n\tconst copiedTimerRef = useRef<number | undefined>(undefined);\n\n\tconst refresh = useCallback(async () => {\n\t\ttry {\n\t\t\tsetStatus(await jsonRequest<CodingOAuthStatus>(STATUS_PATH));\n\t\t\tsetRequestError(undefined);\n\t\t} catch (error: unknown) {\n\t\t\tsetRequestError(error instanceof Error ? error.message : t(\"requestFailed\"));\n\t\t}\n\t}, [t]);\n\n\tconst refreshSources = useCallback(async () => {\n\t\ttry {\n\t\t\tsetSources(parseSources(await jsonRequest<unknown>(SOURCES_PATH)));\n\t\t\tsetSourcesError(undefined);\n\t\t} catch (error: unknown) {\n\t\t\tsetSources(mergeSources([]));\n\t\t\tsetSourcesError(error instanceof Error ? error.message : t(\"sourcesLoadFailed\"));\n\t\t}\n\t}, [t]);\n\n\tconst refreshCapabilities = useCallback(async () => {\n\t\ttry {\n\t\t\tconst parsed = parseCapabilities(await jsonRequest<unknown>(CAPABILITIES_PATH));\n\t\t\tsetCapabilities(parsed ?? { value: emptyCapabilitySettings(), revision: 0, writable: false });\n\t\t\tsetCapabilitiesError(undefined);\n\t\t\treturn parsed;\n\t\t} catch (error: unknown) {\n\t\t\tsetCapabilities({ value: emptyCapabilitySettings(), revision: 0, writable: false });\n\t\t\tsetCapabilitiesError(error instanceof Error ? error.message : t(\"capabilitiesLoadFailed\"));\n\t\t\treturn undefined;\n\t\t}\n\t}, [t]);\n\n\tconst refreshGateway = useCallback(async () => {\n\t\ttry {\n\t\t\tsetGateway(parseGateway(await jsonRequest<unknown>(GATEWAY_PATH)));\n\t\t\tsetGatewayError(undefined);\n\t\t} catch (error: unknown) {\n\t\t\tsetGatewayError(error instanceof Error ? error.message : t(\"gatewayLoadFailed\"));\n\t\t}\n\t}, [t]);\n\n\tconst refreshImagine = useCallback(async () => {\n\t\ttry {\n\t\t\tsetImagine(parseImagineCredential(await jsonRequest<unknown>(IMAGINE_CREDENTIAL_PATH)));\n\t\t\tsetImagineError(undefined);\n\t\t} catch (error: unknown) {\n\t\t\tsetImagineError(error instanceof Error ? error.message : t(\"imagineLoadFailed\"));\n\t\t}\n\t}, [t]);\n\n\tconst refreshUsage = useCallback(async () => {\n\t\tsetUsageLoading(true);\n\t\ttry {\n\t\t\tsetUsage(parseUsage(await jsonRequest<unknown>(CODEX_USAGE_PATH)));\n\t\t\tsetUsageError(undefined);\n\t\t} catch (error: unknown) {\n\t\t\tsetUsage(undefined);\n\t\t\tsetUsageError(error instanceof Error ? error.message : t(\"usageUnavailable\"));\n\t\t} finally {\n\t\t\tsetUsageLoading(false);\n\t\t}\n\t}, [t]);\n\n\tuseEffect(() => {\n\t\tvoid refresh();\n\t\tvoid refreshSources();\n\t\tvoid refreshCapabilities();\n\t\tvoid refreshImagine();\n\t\tvoid refreshGateway();\n\t}, [refresh, refreshSources, refreshCapabilities, refreshImagine, refreshGateway]);\n\tuseEffect(() => {\n\t\tpreviewRef.current = preview;\n\t}, [preview]);\n\tuseEffect(() => {\n\t\tmountedRef.current = true;\n\t\treturn () => {\n\t\t\tmountedRef.current = false;\n\t\t\tif (copiedTimerRef.current !== undefined) window.clearTimeout(copiedTimerRef.current);\n\t\t\tpreviewEpochRef.current += 1;\n\t\t\tconst active = previewRef.current;\n\t\t\tif (active !== undefined) cancelPreviewTicket(active.previewId, true);\n\t\t};\n\t}, []);\n\tuseEffect(() => {\n\t\tconst signingIn =\n\t\t\tstatus !== undefined && Object.values(status.providers).some((provider) => provider.status === \"signing-in\");\n\t\tif (!signingIn) return;\n\t\tconst timer = window.setInterval(() => {\n\t\t\tvoid refresh();\n\t\t}, POLL_INTERVAL_MS);\n\t\treturn () => {\n\t\t\twindow.clearInterval(timer);\n\t\t};\n\t}, [refresh, status]);\n\tuseEffect(() => {\n\t\tconst signedIn = status?.providers.codex.status === \"signed-in\";\n\t\tif (capabilities?.value.codexUsage === true && signedIn) {\n\t\t\tvoid refreshUsage();\n\t\t\treturn;\n\t\t}\n\t\tsetUsage(undefined);\n\t\tsetUsageError(undefined);\n\t\tsetUsageLoading(false);\n\t}, [capabilities?.value.codexUsage, refreshUsage, status?.providers.codex.status]);\n\n\tconst signIn = async (provider: ProviderSlug, method: LoginMethod): Promise<void> => {\n\t\tconst popup = window.open(\"about:blank\", \"_blank\");\n\t\tif (popup !== null) popup.opener = null;\n\t\tsetBusyProvider(provider);\n\t\tsetRequestError(undefined);\n\t\tsetPopupBlocked((current) => ({ ...current, [provider]: popup === null }));\n\t\ttry {\n\t\t\tconst challenge = await jsonRequest<LoginChallenge>(LOGIN_PATH, \"POST\", { provider, method });\n\t\t\tif (popup !== null) popup.location.replace(challenge.url);\n\t\t\tawait refresh();\n\t\t} catch (error: unknown) {\n\t\t\tpopup?.close();\n\t\t\tsetRequestError(error instanceof Error ? error.message : t(\"requestFailed\"));\n\t\t\tawait refresh();\n\t\t} finally {\n\t\t\tsetBusyProvider(undefined);\n\t\t}\n\t};\n\n\tconst submitCode = async (provider: ProviderSlug): Promise<void> => {\n\t\tconst code = codeInputs[provider]?.trim() ?? \"\";\n\t\tif (code.length === 0) return;\n\t\tsetBusyProvider(provider);\n\t\ttry {\n\t\t\tawait jsonRequest<{ ok: true }>(LOGIN_CODE_PATH, \"POST\", { provider, code });\n\t\t\tsetCodeInputs((current) => ({ ...current, [provider]: \"\" }));\n\t\t\tawait refresh();\n\t\t} catch (error: unknown) {\n\t\t\tsetRequestError(error instanceof Error ? error.message : t(\"requestFailed\"));\n\t\t} finally {\n\t\t\tsetBusyProvider(undefined);\n\t\t}\n\t};\n\n\tconst cancelLogin = async (provider: ProviderSlug): Promise<void> => {\n\t\tsetBusyProvider(provider);\n\t\ttry {\n\t\t\tsetStatus(await jsonRequest<CodingOAuthStatus>(LOGIN_CANCEL_PATH, \"POST\", { provider }));\n\t\t} catch (error: unknown) {\n\t\t\tsetRequestError(error instanceof Error ? error.message : t(\"requestFailed\"));\n\t\t} finally {\n\t\t\tsetBusyProvider(undefined);\n\t\t}\n\t};\n\n\tconst signOut = async (provider: ProviderSlug): Promise<void> => {\n\t\tsetBusyProvider(provider);\n\t\ttry {\n\t\t\tsetStatus(await jsonRequest<CodingOAuthStatus>(LOGOUT_PATH, \"POST\", { provider }));\n\t\t} catch (error: unknown) {\n\t\t\tsetRequestError(error instanceof Error ? error.message : t(\"requestFailed\"));\n\t\t} finally {\n\t\t\tsetBusyProvider(undefined);\n\t\t}\n\t};\n\n\tconst saveModels = async (provider: ProviderSlug, selected: string[]): Promise<void> => {\n\t\tsetBusyProvider(provider);\n\t\ttry {\n\t\t\tsetStatus(await jsonRequest<CodingOAuthStatus>(MODELS_PATH, \"POST\", { provider, selected }));\n\t\t} catch (error: unknown) {\n\t\t\tsetRequestError(error instanceof Error ? error.message : t(\"requestFailed\"));\n\t\t} finally {\n\t\t\tsetBusyProvider(undefined);\n\t\t}\n\t};\n\n\tconst previewSource = async (kind: SourceKind): Promise<void> => {\n\t\tconst epoch = ++previewEpochRef.current;\n\t\tconst previous = previewRef.current;\n\t\tif (previous !== undefined) {\n\t\t\tpreviewRef.current = undefined;\n\t\t\tsetPreview(undefined);\n\t\t\tcancelPreviewTicket(previous.previewId);\n\t\t}\n\t\tsetSourcesBusy(true);\n\t\tsetSourcesNotice(undefined);\n\t\tsetConfirmOverwrite(false);\n\t\ttry {\n\t\t\tconst next = parsePreview(await jsonRequest<unknown>(SOURCES_PREVIEW_PATH, \"POST\", { kind }));\n\t\t\tif (next === undefined) throw new Error(t(\"sourcesPreviewFailed\"));\n\t\t\tif (!mountedRef.current || epoch !== previewEpochRef.current) {\n\t\t\t\tcancelPreviewTicket(next.previewId, !mountedRef.current);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tpreviewRef.current = next;\n\t\t\tsetPreview(next);\n\t\t\tsetSourcesError(undefined);\n\t\t} catch (error: unknown) {\n\t\t\tif (!mountedRef.current || epoch !== previewEpochRef.current) return;\n\t\t\tsetPreview(undefined);\n\t\t\tsetSourcesError(error instanceof Error ? error.message : t(\"sourcesPreviewFailed\"));\n\t\t} finally {\n\t\t\tif (mountedRef.current && epoch === previewEpochRef.current) setSourcesBusy(false);\n\t\t}\n\t};\n\n\tconst commitSource = async (): Promise<void> => {\n\t\tif (preview === undefined) return;\n\t\tif (preview.action === \"blocked\") return;\n\t\tif (preview.confirmOverwriteRequired && !confirmOverwrite) return;\n\t\tsetSourcesBusy(true);\n\t\ttry {\n\t\t\tconst result = await jsonRequest<unknown>(SOURCES_COMMIT_PATH, \"POST\", {\n\t\t\t\tkind: preview.kind,\n\t\t\t\tpreviewId: preview.previewId,\n\t\t\t\tconfirmOverwrite,\n\t\t\t});\n\t\t\tconst action = parseCommitAction(result);\n\t\t\tpreviewRef.current = undefined;\n\t\t\tsetPreview(undefined);\n\t\t\tsetConfirmOverwrite(false);\n\t\t\tsetSourcesNotice(\n\t\t\t\tt(\"sourcesCommitSuccess\", { action: action === undefined ? \"\" : t(SOURCE_COMMIT_ACTION_KEY[action]) }),\n\t\t\t);\n\t\t\tsetSourcesError(undefined);\n\t\t\tawait refreshSources();\n\t\t\tawait refresh();\n\t\t} catch (error: unknown) {\n\t\t\tif (isConsumedPreviewError(error)) {\n\t\t\t\tpreviewRef.current = undefined;\n\t\t\t\tsetPreview(undefined);\n\t\t\t\tsetConfirmOverwrite(false);\n\t\t\t}\n\t\t\tsetSourcesError(error instanceof Error ? error.message : t(\"sourcesCommitFailed\"));\n\t\t\tawait refreshSources();\n\t\t} finally {\n\t\t\tsetSourcesBusy(false);\n\t\t}\n\t};\n\n\tconst cancelSourcePreview = async (): Promise<void> => {\n\t\tif (preview === undefined) return;\n\t\tconst previewId = preview.previewId;\n\t\tpreviewEpochRef.current += 1;\n\t\tpreviewRef.current = undefined;\n\t\tsetPreview(undefined);\n\t\tsetConfirmOverwrite(false);\n\t\tsetSourcesBusy(true);\n\t\ttry {\n\t\t\tawait jsonRequest<unknown>(SOURCES_CANCEL_PATH, \"POST\", { previewId });\n\t\t\tsetSourcesError(undefined);\n\t\t} catch (error: unknown) {\n\t\t\tsetSourcesError(error instanceof Error ? error.message : t(\"requestFailed\"));\n\t\t} finally {\n\t\t\tsetSourcesBusy(false);\n\t\t}\n\t};\n\n\tconst patchCapability = async (key: CapabilitySettingKey, value: boolean | number): Promise<boolean> => {\n\t\tif (capabilities === undefined || !capabilities.writable) return false;\n\t\tif (key === \"codexImageEdits\" && value === true && !capabilities.value.codexImages) return false;\n\t\tconst patch: Partial<CapabilitySettingsView> =\n\t\t\tkey === \"codexImages\" && value === false && capabilities.value.codexImageEdits\n\t\t\t\t? { codexImages: false, codexImageEdits: false }\n\t\t\t\t: ({ [key]: value } as Partial<CapabilitySettingsView>);\n\t\tsetCapabilitiesBusy(true);\n\t\ttry {\n\t\t\tconst updated = parseCapabilities(\n\t\t\t\tawait jsonRequest<unknown>(CAPABILITIES_PATH, \"PATCH\", {\n\t\t\t\t\texpectedRevision: capabilities.revision,\n\t\t\t\t\tpatch,\n\t\t\t\t}),\n\t\t\t);\n\t\t\tif (updated !== undefined) setCapabilities(updated);\n\t\t\telse await refreshCapabilities();\n\t\t\tsetCapabilitiesError(undefined);\n\t\t\treturn true;\n\t\t} catch (error: unknown) {\n\t\t\tawait refreshCapabilities();\n\t\t\tsetCapabilitiesError(\n\t\t\t\tisConflictError(error)\n\t\t\t\t\t? t(\"capabilitiesConflictRefreshed\")\n\t\t\t\t\t: error instanceof Error\n\t\t\t\t\t\t? error.message\n\t\t\t\t\t\t: t(\"capabilitiesSaveFailed\"),\n\t\t\t);\n\t\t\treturn false;\n\t\t} finally {\n\t\t\tsetCapabilitiesBusy(false);\n\t\t}\n\t};\n\n\tconst showUsage = capabilities?.value.codexUsage === true && status?.providers.codex.status === \"signed-in\";\n\n\tconst markCopied = (field: CopyField): void => {\n\t\tif (copiedTimerRef.current !== undefined) window.clearTimeout(copiedTimerRef.current);\n\t\tsetCopiedField(field);\n\t\tsetCopyFailedField(undefined);\n\t\tcopiedTimerRef.current = window.setTimeout(() => {\n\t\t\tif (mountedRef.current) {\n\t\t\t\tsetCopiedField(undefined);\n\t\t\t\tsetCopyFailedField(undefined);\n\t\t\t}\n\t\t\tcopiedTimerRef.current = undefined;\n\t\t}, 2000);\n\t};\n\n\tconst handleCopy = async (field: CopyField, text: string): Promise<void> => {\n\t\tconst ok = await copyText(text);\n\t\tif (ok) {\n\t\t\tmarkCopied(field);\n\t\t\treturn;\n\t\t}\n\t\tsetCopiedField(undefined);\n\t\tsetCopyFailedField(field);\n\t};\n\n\tconst copyLabel = (field: CopyField, idle?: string): string => {\n\t\tif (copiedField === field) return t(\"copied\");\n\t\tif (copyFailedField === field) return t(\"copyFailed\");\n\t\treturn idle ?? t(\"copy\");\n\t};\n\n\tconst ensureGatewayKey = async (): Promise<string> => {\n\t\tif (gatewayOnceKey !== undefined) return gatewayOnceKey;\n\t\tconst value = await jsonRequest<{ apiKey?: string }>(GATEWAY_REVEAL_PATH, \"POST\");\n\t\tif (typeof value.apiKey !== \"string\" || value.apiKey.length === 0) {\n\t\t\tthrow new Error(t(\"gatewayRevealFailed\"));\n\t\t}\n\t\tsetGatewayOnceKey(value.apiKey);\n\t\treturn value.apiKey;\n\t};\n\n\tconst copyGatewayKey = async (): Promise<void> => {\n\t\ttry {\n\t\t\tconst key = await ensureGatewayKey();\n\t\t\tawait handleCopy(\"key\", key);\n\t\t\tsetGatewayRevealError(undefined);\n\t\t} catch {\n\t\t\tsetGatewayRevealError(t(\"gatewayRevealFailed\"));\n\t\t}\n\t};\n\n\tconst toggleGatewayKeyVisible = async (): Promise<void> => {\n\t\tif (gatewayKeyVisible) {\n\t\t\tsetGatewayKeyVisible(false);\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tawait ensureGatewayKey();\n\t\t\tsetGatewayKeyVisible(true);\n\t\t\tsetGatewayRevealError(undefined);\n\t\t} catch {\n\t\t\tsetGatewayRevealError(t(\"gatewayRevealFailed\"));\n\t\t}\n\t};\n\n\tuseEffect(() => {\n\t\tif (gateway !== undefined) setPortDraft(String(gateway.port));\n\t}, [gateway]);\n\n\tconst applyGatewayPort = async (): Promise<void> => {\n\t\tconst port = parseGatewayPort(portDraft);\n\t\tif (port === undefined) {\n\t\t\tsetGatewayError(t(\"gatewayPortInvalid\"));\n\t\t\treturn;\n\t\t}\n\t\tif (gateway !== undefined && port === gateway.port) return;\n\t\tsetGatewayBusy(true);\n\t\ttry {\n\t\t\tsetGateway(parseGateway(await jsonRequest<unknown>(GATEWAY_PATH, \"PATCH\", { port })) ?? gateway);\n\t\t\tsetGatewayError(undefined);\n\t\t} catch (error: unknown) {\n\t\t\tsetGatewayError(error instanceof Error ? error.message : t(\"gatewaySaveFailed\"));\n\t\t\tif (gateway !== undefined) setPortDraft(String(gateway.port));\n\t\t} finally {\n\t\t\tsetGatewayBusy(false);\n\t\t}\n\t};\n\n\tconst rotateGatewayKey = async (): Promise<void> => {\n\t\tsetGatewayBusy(true);\n\t\ttry {\n\t\t\tconst value = await jsonRequest<{ apiKey?: string; keyHint?: string }>(GATEWAY_ROTATE_PATH, \"POST\");\n\t\t\tif (typeof value.apiKey === \"string\") setGatewayOnceKey(value.apiKey);\n\t\t\tsetGatewayKeyVisible(true);\n\t\t\tsetGatewayRotateConfirm(false);\n\t\t\tsetGatewayRevealError(undefined);\n\t\t\tawait refreshGateway();\n\t\t} catch (error: unknown) {\n\t\t\tsetGatewayError(error instanceof Error ? error.message : t(\"gatewaySaveFailed\"));\n\t\t} finally {\n\t\t\tsetGatewayBusy(false);\n\t\t}\n\t};\n\n\treturn (\n\t\t<section style={pageStyle} aria-labelledby=\"coding-oauth-settings-title\">\n\t\t\t<div>\n\t\t\t\t<h2 id=\"coding-oauth-settings-title\" style={titleStyle}>\n\t\t\t\t\t{t(\"title\")}\n\t\t\t\t</h2>\n\t\t\t\t<p style={{ ...bodyStyle, marginTop: 6 }}>{t(\"intro\")}</p>\n\t\t\t</div>\n\t\t\t{requestError === undefined ? null : (\n\t\t\t\t<p style={errorStyle} role=\"alert\">\n\t\t\t\t\t{requestError}\n\t\t\t\t</p>\n\t\t\t)}\n\t\t\t<nav style={tabNavStyle} aria-label={t(\"title\")}>\n\t\t\t\t{SETTINGS_TABS.map((tab) => (\n\t\t\t\t\t<button\n\t\t\t\t\t\tkey={tab.id}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tstyle={activeTab === tab.id ? tabButtonActiveStyle : tabButtonStyle}\n\t\t\t\t\t\taria-current={activeTab === tab.id ? \"page\" : undefined}\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tsetActiveTab(tab.id);\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{t(tab.label)}\n\t\t\t\t\t</button>\n\t\t\t\t))}\n\t\t\t</nav>\n\t\t\t<div style={panelStyle}>\n\t\t\t\t{activeTab === \"accounts\" ? (\n\t\t\t\t\tstatus === undefined ? (\n\t\t\t\t\t\t<div style={cardStyle}>\n\t\t\t\t\t\t\t<div style={statusStyle}>\n\t\t\t\t\t\t\t\t<span aria-hidden=\"true\" style={dotStyle(\"loading\")} />\n\t\t\t\t\t\t\t\t{t(\"loadingAccount\")}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t{sourcesError === undefined ? null : (\n\t\t\t\t\t\t\t\t<p style={errorStyle} role=\"alert\">\n\t\t\t\t\t\t\t\t\t{sourcesError}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{sourcesNotice === undefined ? null : (\n\t\t\t\t\t\t\t\t<p style={bodyStyle} role=\"status\">\n\t\t\t\t\t\t\t\t\t{sourcesNotice}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t<div style={accountGridStyle}>\n\t\t\t\t\t\t\t\t{PROVIDERS.map((definition) => {\n\t\t\t\t\t\t\t\t\tconst providerStatus = status.providers[definition.slug];\n\t\t\t\t\t\t\t\t\tconst grokProviderStatus = definition.slug === \"grok\" ? (providerStatus as GrokStatus) : undefined;\n\t\t\t\t\t\t\t\t\tconst busy = busyProvider === definition.slug;\n\t\t\t\t\t\t\t\t\tconst statusLabel =\n\t\t\t\t\t\t\t\t\t\tproviderStatus.status === \"signed-in\"\n\t\t\t\t\t\t\t\t\t\t\t? t(\"signedIn\")\n\t\t\t\t\t\t\t\t\t\t\t: providerStatus.status === \"signing-in\"\n\t\t\t\t\t\t\t\t\t\t\t\t? t(\"signingIn\")\n\t\t\t\t\t\t\t\t\t\t\t\t: providerStatus.status === \"error\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t? t(\"requestFailed\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t: t(\"signedOut\");\n\t\t\t\t\t\t\t\t\tconst activeMethod =\n\t\t\t\t\t\t\t\t\t\tproviderStatus.status === \"signing-in\" ? providerStatus.method : definition.recommended;\n\t\t\t\t\t\t\t\t\tconst { available, selected } = modelFields(providerStatus);\n\t\t\t\t\t\t\t\t\tconst localCode = codeInputs[definition.slug] ?? \"\";\n\t\t\t\t\t\t\t\t\tconst source = sources?.find((entry) => entry.kind === definition.slug);\n\t\t\t\t\t\t\t\t\tconst expanded =\n\t\t\t\t\t\t\t\t\t\tproviderStatus.status === \"signing-in\" || expandedProviders[definition.slug] === true;\n\t\t\t\t\t\t\t\t\tconst usagePercent =\n\t\t\t\t\t\t\t\t\t\tdefinition.slug === \"codex\" && showUsage\n\t\t\t\t\t\t\t\t\t\t\t? usage?.individualRemainingPercent === undefined\n\t\t\t\t\t\t\t\t\t\t\t\t? usage?.rateLimits[0]?.windows[0]?.usedPercent\n\t\t\t\t\t\t\t\t\t\t\t\t: 100 - usage.individualRemainingPercent\n\t\t\t\t\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<div key={definition.slug} style={cardStyle}>\n\t\t\t\t\t\t\t\t\t\t\t<div style={rowStyle}>\n\t\t\t\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<h3 style={{ ...titleStyle, fontSize: 16 }}>{t(definition.titleKey)}</h3>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{providerStatus.status === \"signed-in\" && !expanded ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p style={{ ...hintStyle, marginTop: 4 }}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{t(\"modelsSummary\", { selected: selected.length, total: available.length })}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{usagePercent === undefined\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? \"\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: ` \u00B7 ${t(\"usageUsedShort\", { value: `${String(usagePercent)}%` })}`}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p style={{ ...bodyStyle, marginTop: 4 }}>{t(definition.descriptionKey)}</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p style={{ ...bodyStyle, marginTop: 4 }}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span style={monoStyle}>{definition.route}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t<div style={statusStyle} role=\"status\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span aria-hidden=\"true\" style={dotStyle(providerStatus.status)} />\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span>{statusLabel}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t<div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8 }}>\n\t\t\t\t\t\t\t\t\t\t\t\t{providerStatus.status === \"signed-in\" ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={buttonStyle}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={busy}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvoid signOut(definition.slug);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{busy ? t(\"working\") : t(\"logout\")}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={buttonStyle}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsetExpandedProviders((current) => ({\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t...current,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t[definition.slug]: !expanded,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{expanded ? t(\"collapseModels\") : t(\"expandModels\")}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{source?.available === true ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={buttonStyle}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={sourcesBusy}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvoid previewSource(definition.slug);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{t(\"sourcesPullCopy\")}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t\t\t\t\t) : providerStatus.status === \"signing-in\" ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{definition.methods\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t.filter((method) => method !== activeMethod)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t.map((method) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={method}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={buttonStyle}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={busy}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvoid signIn(definition.slug, method);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{methodLabel(method, t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={buttonStyle}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={busy}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvoid cancelLogin(definition.slug);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{t(\"cancelLogin\")}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{definition.methods.map((method, index) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={method}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={index === 0 ? primaryButtonStyle : buttonStyle}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={busy}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvoid signIn(definition.slug, method);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{busy ? t(\"working\") : methodLabel(method, t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{source?.available === true ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={buttonStyle}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={sourcesBusy}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvoid previewSource(definition.slug);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{t(\"sourcesPullCopy\")}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t) : source !== undefined && source.reason !== undefined ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span style={hintStyle}>{t(SOURCE_REASON_KEY[source.reason])}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t{providerStatus.status === \"error\" ? <p style={errorStyle}>{providerStatus.message}</p> : null}\n\t\t\t\t\t\t\t\t\t\t\t{providerStatus.status === \"signing-in\" && providerStatus.userCode !== undefined ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<p style={bodyStyle}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{t(\"userCode\")} <span style={codeStyle}>{providerStatus.userCode}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t\t{providerStatus.status === \"signing-in\" && providerStatus.url !== undefined ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<p style={bodyStyle}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{popupBlocked[definition.slug] === true ? t(\"popupBlocked\") : t(\"openUrl\")}{\" \"}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<a href={providerStatus.url} target=\"_blank\" rel=\"noreferrer\" style={linkStyle}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{providerStatus.url}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t\t{providerStatus.status === \"signing-in\" && activeMethod !== \"device\" ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<div style={{ display: \"flex\", flexDirection: \"column\", gap: 8 }}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<p style={bodyStyle}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{t(activeMethod === \"browser\" ? \"pasteBrowserCodeHint\" : \"pasteCodeHint\")}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8 }}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={{ ...inputStyle, flex: \"1 1 360px\" }}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={localCode}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tplaceholder={t(\"pasteCodePlaceholder\")}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={busy}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonChange={(event) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsetCodeInputs((current) => ({ ...current, [definition.slug]: event.target.value }))\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonKeyDown={(event) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (event.key === \"Enter\") {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvoid submitCode(definition.slug);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={primaryButtonStyle}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={busy || localCode.trim().length === 0}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvoid submitCode(definition.slug);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{t(\"submitCode\")}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t\t{providerStatus.status === \"signed-in\" && expanded ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<div style={{ display: \"flex\", flexDirection: \"column\", gap: 8 }}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div style={rowStyle}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<h4 style={{ ...titleStyle, fontSize: 14 }}>{t(\"models\")}</h4>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={buttonStyle}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={busy}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvoid saveModels(definition.slug, []);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{t(\"selectAll\")}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{grokProviderStatus?.status === \"signed-in\" ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p style={bodyStyle}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{grokProviderStatus.catalogSource === \"live\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? t(\"catalogLive\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: grokProviderStatus.catalogSource === \"cache\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? t(\"catalogCache\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: t(\"catalogFallback\")}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<p style={bodyStyle}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{t(\"modelHint\")} <span style={monoStyle}>{definition.route}/&lt;id&gt;</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<ul style={listStyle}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{available.map((id) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst checked = selected.includes(id);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<li key={id}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<label style={checkRowStyle}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tchecked={checked}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={busy}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonChange={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst current = new Set(selected);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (checked) current.delete(id);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\telse current.add(id);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvoid saveModels(definition.slug, [...current]);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span style={monoStyle}>{id}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{grokProviderStatus?.status === \"signed-in\" &&\n\t\t\t\t\t\t\t\t\t\t\t\t\tgrokProviderStatus.catalogError !== undefined ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p style={errorStyle}>{t(\"catalogError\")}</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t\t\t\t{definition.slug === \"codex\" && showUsage ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div style={nestedStyle}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p style={{ ...bodyStyle, color: \"var(--dsw-alias-label-primary)\" }}>{t(\"usageTitle\")}</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{usageError === undefined ? null : (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p style={errorStyle} role=\"alert\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{usageError}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{usageLoading && usage === undefined ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p style={hintStyle}>{t(\"usageLoading\")}</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t) : usage === undefined || !usageHasVisibleFields(usage) ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p style={hintStyle}>{t(\"usageEmpty\")}</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{formatEpoch(usage.fetchedAt) === undefined ? null : (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p style={hintStyle}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{t(\"usageFetchedAt\", { time: formatEpoch(usage.fetchedAt) })}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{usage.rateLimits.map((limit) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p key={limit.id} style={hintStyle}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{limit.name ?? t(\"usageRateLimit\")}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{limit.windows[0]?.usedPercent === undefined\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? \"\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: ` \u00B7 ${t(\"usageUsed\", { value: `${String(limit.windows[0].usedPercent)}%` })}`}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{formatEpoch(limit.windows[0]?.resetsAt) === undefined\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? \"\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: ` \u00B7 ${t(\"usageResets\", { time: formatEpoch(limit.windows[0]?.resetsAt) })}`}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{preview === undefined ? null : (\n\t\t\t\t\t\t\t\t<div style={cardStyle} aria-live=\"polite\">\n\t\t\t\t\t\t\t\t\t<p style={bodyStyle}>\n\t\t\t\t\t\t\t\t\t\t{t(\"sourcesPreviewTitle\")} \u00B7 {t(SOURCE_KIND_KEY[preview.kind])}\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t<p style={hintStyle}>\n\t\t\t\t\t\t\t\t\t\t<span style={monoStyle}>{preview.displayPath}</span>\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t<p style={bodyStyle}>\n\t\t\t\t\t\t\t\t\t\t{t(\"sourcesConflict\", {\n\t\t\t\t\t\t\t\t\t\t\tdetail: t(\n\t\t\t\t\t\t\t\t\t\t\t\tpreview.conflict === undefined\n\t\t\t\t\t\t\t\t\t\t\t\t\t? \"sourceConflictUnrecognized\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t: SOURCE_CONFLICT_KEY[preview.conflict],\n\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t<p style={bodyStyle}>\n\t\t\t\t\t\t\t\t\t\t{t(\"sourcesAction\", {\n\t\t\t\t\t\t\t\t\t\t\tdetail: t(\n\t\t\t\t\t\t\t\t\t\t\t\tpreview.action === undefined\n\t\t\t\t\t\t\t\t\t\t\t\t\t? \"sourceActionUnrecognized\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t: SOURCE_PREVIEW_ACTION_KEY[preview.action],\n\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t{formatEpoch(preview.expiresAt) === undefined ? null : (\n\t\t\t\t\t\t\t\t\t\t<p style={hintStyle}>{t(\"sourcesPreviewExpires\", { time: formatEpoch(preview.expiresAt) })}</p>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t{formatEpoch(preview.ticketExpiresAt) === undefined ? null : (\n\t\t\t\t\t\t\t\t\t\t<p style={hintStyle}>{t(\"sourcesTicketExpires\", { time: formatEpoch(preview.ticketExpiresAt) })}</p>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t{preview.warnings.length === 0 ? null : (\n\t\t\t\t\t\t\t\t\t\t<ul style={{ ...listStyle, gap: 4 }} aria-label={t(\"sourcesWarnings\")}>\n\t\t\t\t\t\t\t\t\t\t\t{preview.warnings.map((warning) => (\n\t\t\t\t\t\t\t\t\t\t\t\t<li key={warning} style={hintStyle}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{warning}\n\t\t\t\t\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t{preview.confirmOverwriteRequired ? (\n\t\t\t\t\t\t\t\t\t\t<label style={checkRowStyle}>\n\t\t\t\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\t\t\t\t\t\tchecked={confirmOverwrite}\n\t\t\t\t\t\t\t\t\t\t\t\tdisabled={sourcesBusy || preview.action === \"blocked\"}\n\t\t\t\t\t\t\t\t\t\t\t\tonChange={(event) => setConfirmOverwrite(event.target.checked)}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t\t\t\t{t(\"sourcesConfirmOverwrite\")}\n\t\t\t\t\t\t\t\t\t\t\t\t<span style={{ display: \"block\", ...hintStyle }}>{t(\"sourcesConfirmOverwriteHint\")}</span>\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t<div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8 }}>\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tstyle={primaryButtonStyle}\n\t\t\t\t\t\t\t\t\t\t\tdisabled={\n\t\t\t\t\t\t\t\t\t\t\t\tsourcesBusy ||\n\t\t\t\t\t\t\t\t\t\t\t\tpreview.action === \"blocked\" ||\n\t\t\t\t\t\t\t\t\t\t\t\t(preview.confirmOverwriteRequired && !confirmOverwrite)\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\tvoid commitSource();\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{t(\"sourcesCommit\")}\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tstyle={buttonStyle}\n\t\t\t\t\t\t\t\t\t\t\tdisabled={sourcesBusy}\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\tvoid cancelSourcePreview();\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{t(\"sourcesCancelPreview\")}\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</>\n\t\t\t\t\t)\n\t\t\t\t) : null}\n\t\t\t\t{activeTab === \"capabilities\" ? (\n\t\t\t\t\t<section style={cardStyle} aria-labelledby=\"coding-oauth-capabilities-title\">\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<h3 id=\"coding-oauth-capabilities-title\" style={{ ...titleStyle, fontSize: 16 }}>\n\t\t\t\t\t\t\t\t{t(\"capabilitiesTitle\")}\n\t\t\t\t\t\t\t</h3>\n\t\t\t\t\t\t\t<p style={{ ...bodyStyle, marginTop: 4 }}>{t(\"capabilitiesIntro\")}</p>\n\t\t\t\t\t\t\t<p style={{ ...hintStyle, marginTop: 4 }}>{t(\"capabilitiesQuotaHint\")}</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{imagineError === undefined ? null : (\n\t\t\t\t\t\t\t<p style={errorStyle} role=\"alert\">\n\t\t\t\t\t\t\t\t{imagineError}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{imagine === undefined && imagineError === undefined ? (\n\t\t\t\t\t\t\t<div style={statusStyle} role=\"status\">\n\t\t\t\t\t\t\t\t<span aria-hidden=\"true\" style={dotStyle(\"loading\")} />\n\t\t\t\t\t\t\t\t{t(\"imagineLoading\")}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : imagine === undefined ? null : (\n\t\t\t\t\t\t\t<div style={nestedStyle}>\n\t\t\t\t\t\t\t\t<p style={statusStyle} role=\"status\">\n\t\t\t\t\t\t\t\t\t<span aria-hidden=\"true\" style={dotStyle(imagine.configured ? \"available\" : \"unavailable\")} />\n\t\t\t\t\t\t\t\t\t<span>{imagine.configured ? t(\"imagineConfigured\") : t(\"imagineNotConfigured\")}</span>\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t<p style={hintStyle}>{t(\"imagineSource\", { source: imagineSourceLabel(imagine.source, t) })}</p>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{capabilitiesError === undefined ? null : (\n\t\t\t\t\t\t\t<p style={errorStyle} role=\"alert\">\n\t\t\t\t\t\t\t\t{capabilitiesError}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{capabilities === undefined ? (\n\t\t\t\t\t\t\t<div style={statusStyle} role=\"status\">\n\t\t\t\t\t\t\t\t<span aria-hidden=\"true\" style={dotStyle(\"loading\")} />\n\t\t\t\t\t\t\t\t{t(\"capabilitiesLoading\")}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<fieldset style={{ border: 0, margin: 0, padding: 0, minWidth: 0 }}>\n\t\t\t\t\t\t\t\t<legend style={{ ...bodyStyle, position: \"absolute\", width: 1, height: 1, overflow: \"hidden\" }}>\n\t\t\t\t\t\t\t\t\t{t(\"capabilitiesTitle\")}\n\t\t\t\t\t\t\t\t</legend>\n\t\t\t\t\t\t\t\t{capabilities.writable ? null : <p style={hintStyle}>{t(\"capabilitiesReadOnly\")}</p>}\n\t\t\t\t\t\t\t\t<ul style={listStyle}>\n\t\t\t\t\t\t\t\t\t{CAPABILITY_TOGGLES.filter((item) => !item.key.startsWith(\"grokImagine\")).map((item) => {\n\t\t\t\t\t\t\t\t\t\tconst checked = capabilities.value[item.key];\n\t\t\t\t\t\t\t\t\t\tconst imagesOff = item.requiresImages === true && !capabilities.value.codexImages;\n\t\t\t\t\t\t\t\t\t\tconst disabled = capabilitiesBusy || !capabilities.writable || imagesOff;\n\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t<li key={item.key}>\n\t\t\t\t\t\t\t\t\t\t\t\t<label style={checkRowStyle}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tchecked={checked}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-describedby={`cap-hint-${item.key}`}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonChange={(event) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvoid patchCapability(item.key, event.target.checked);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span style={{ display: \"block\" }}>{t(item.label)}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span id={`cap-hint-${item.key}`} style={{ display: \"block\", ...hintStyle }}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{t(item.hint)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t\t\t<h4 style={{ ...titleStyle, fontSize: 14 }}>{t(\"imagineTitle\")}</h4>\n\t\t\t\t\t\t\t\t<ul style={listStyle}>\n\t\t\t\t\t\t\t\t\t{CAPABILITY_TOGGLES.filter((item) => item.key.startsWith(\"grokImagine\")).map((item) => {\n\t\t\t\t\t\t\t\t\t\tconst checked = capabilities.value[item.key];\n\t\t\t\t\t\t\t\t\t\tconst disabled = capabilitiesBusy || !capabilities.writable;\n\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t<li key={item.key}>\n\t\t\t\t\t\t\t\t\t\t\t\t<label style={checkRowStyle}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tchecked={checked}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-describedby={`cap-hint-${item.key}`}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonChange={(event) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvoid patchCapability(item.key, event.target.checked);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span style={{ display: \"block\" }}>{t(item.label)}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span id={`cap-hint-${item.key}`} style={{ display: \"block\", ...hintStyle }}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{t(item.hint)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t\t\t<div style={nestedStyle}>\n\t\t\t\t\t\t\t\t\t<h4 style={{ ...titleStyle, fontSize: 14 }}>{t(\"capabilityLimitsTitle\")}</h4>\n\t\t\t\t\t\t\t\t\t<p style={hintStyle}>{t(\"capabilityLimitsHint\")}</p>\n\t\t\t\t\t\t\t\t\t<ul style={listStyle}>\n\t\t\t\t\t\t\t\t\t\t{CAPABILITY_LIMITS.map((item) => {\n\t\t\t\t\t\t\t\t\t\t\tconst displayValue = capabilities.value[item.key] / item.scale;\n\t\t\t\t\t\t\t\t\t\t\tconst inputId = `cap-limit-${item.key}`;\n\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t<li key={item.key} style={rowStyle}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<label htmlFor={inputId} style={{ ...bodyStyle, flex: \"1 1 360px\" }}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span style={{ display: \"block\", color: \"var(--dsw-alias-label-primary)\" }}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{t(item.label)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span id={`${inputId}-hint`} style={{ display: \"block\", ...hintStyle }}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{t(item.hint)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={`${item.key}-${String(capabilities.revision)}-${String(displayValue)}`}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tid={inputId}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tinputMode=\"numeric\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmin={item.min}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmax={item.max}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstep={1}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdefaultValue={displayValue}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={capabilitiesBusy || !capabilities.writable}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-describedby={`${inputId}-hint`}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={{ ...inputStyle, width: 112, flex: \"0 0 112px\" }}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonInput={(event) => event.currentTarget.setCustomValidity(\"\")}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonKeyDown={(event) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (event.key === \"Enter\") event.currentTarget.blur();\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (event.key === \"Escape\") {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tevent.currentTarget.value = String(displayValue);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tevent.currentTarget.setCustomValidity(\"\");\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonBlur={(event) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst target = event.currentTarget;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst next = Number(target.value);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (!Number.isInteger(next) || next < item.min || next > item.max) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttarget.setCustomValidity(t(\"capabilityLimitInvalid\", { min: item.min, max: item.max }));\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttarget.reportValidity();\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttarget.setCustomValidity(\"\");\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst apiValue = next * item.scale;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (apiValue === capabilities.value[item.key]) return;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvoid patchCapability(item.key, apiValue).then((saved) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (!saved && target.isConnected) target.value = String(displayValue);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</fieldset>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</section>\n\t\t\t\t) : null}\n\t\t\t\t{activeTab === \"about\" ? <p style={warningStyle}>{t(\"termsWarning\")}</p> : null}\n\t\t\t\t{activeTab === \"gateway\" ? (\n\t\t\t\t\t<section style={cardStyle} aria-labelledby=\"coding-oauth-gateway-title\">\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<h3 id=\"coding-oauth-gateway-title\" style={{ ...titleStyle, fontSize: 16 }}>\n\t\t\t\t\t\t\t\t{t(\"gatewayTitle\")}\n\t\t\t\t\t\t\t</h3>\n\t\t\t\t\t\t\t<p style={{ ...bodyStyle, marginTop: 4 }}>{t(\"gatewayIntro\")}</p>\n\t\t\t\t\t\t\t<p style={{ ...hintStyle, marginTop: 8 }}>{t(\"gatewayWarning\")}</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{gatewayError === undefined ? null : (\n\t\t\t\t\t\t\t<p style={errorStyle} role=\"alert\">\n\t\t\t\t\t\t\t\t{gatewayError}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{gatewayRevealError === undefined ? null : (\n\t\t\t\t\t\t\t<p style={errorStyle} role=\"alert\">\n\t\t\t\t\t\t\t\t{gatewayRevealError}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{gateway === undefined && gatewayError === undefined ? (\n\t\t\t\t\t\t\t<div style={statusStyle} role=\"status\">\n\t\t\t\t\t\t\t\t<span aria-hidden=\"true\" style={dotStyle(\"loading\")} />\n\t\t\t\t\t\t\t\t{t(\"gatewayLoading\")}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : gateway === undefined ? null : (\n\t\t\t\t\t\t\t<div style={nestedStyle}>\n\t\t\t\t\t\t\t\t<p style={statusStyle} role=\"status\">\n\t\t\t\t\t\t\t\t\t<span aria-hidden=\"true\" style={dotStyle(gateway.running ? \"available\" : \"unavailable\")} />\n\t\t\t\t\t\t\t\t\t<span>{gateway.running ? t(\"gatewayRunning\") : t(\"gatewayStopped\")}</span>\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t<label style={checkRowStyle}>\n\t\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\t\t\t\tchecked={gateway.enabled}\n\t\t\t\t\t\t\t\t\t\tdisabled={gatewayBusy}\n\t\t\t\t\t\t\t\t\t\tonChange={(event) => {\n\t\t\t\t\t\t\t\t\t\t\tconst enabled = event.target.checked;\n\t\t\t\t\t\t\t\t\t\t\tsetGatewayBusy(true);\n\t\t\t\t\t\t\t\t\t\t\tvoid jsonRequest<unknown>(GATEWAY_PATH, \"PATCH\", { enabled })\n\t\t\t\t\t\t\t\t\t\t\t\t.then((value) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tsetGateway(parseGateway(value) ?? gateway);\n\t\t\t\t\t\t\t\t\t\t\t\t\tsetGatewayError(undefined);\n\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t.catch((error: unknown) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tsetGatewayError(error instanceof Error ? error.message : t(\"gatewaySaveFailed\"));\n\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t.finally(() => setGatewayBusy(false));\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<span>{t(\"gatewayEnabled\")}</span>\n\t\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t<label\n\t\t\t\t\t\t\t\t\t\thtmlFor=\"coding-oauth-gateway-port\"\n\t\t\t\t\t\t\t\t\t\tstyle={{ ...bodyStyle, color: \"var(--dsw-alias-label-primary)\" }}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{t(\"gatewayPort\")}\n\t\t\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t\t\t<p id=\"coding-oauth-gateway-port-hint\" style={hintStyle}>\n\t\t\t\t\t\t\t\t\t\t{t(\"gatewayPortHint\")}\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t<div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8, marginTop: 8 }}>\n\t\t\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\t\t\tid=\"coding-oauth-gateway-port\"\n\t\t\t\t\t\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\t\t\t\t\t\tinputMode=\"numeric\"\n\t\t\t\t\t\t\t\t\t\t\tmin={GATEWAY_PORT_MIN}\n\t\t\t\t\t\t\t\t\t\t\tmax={GATEWAY_PORT_MAX}\n\t\t\t\t\t\t\t\t\t\t\tstep={1}\n\t\t\t\t\t\t\t\t\t\t\tvalue={portDraft}\n\t\t\t\t\t\t\t\t\t\t\tdisabled={gatewayBusy}\n\t\t\t\t\t\t\t\t\t\t\taria-describedby=\"coding-oauth-gateway-port-hint\"\n\t\t\t\t\t\t\t\t\t\t\tstyle={{ ...inputStyle, width: 112, flex: \"0 0 112px\" }}\n\t\t\t\t\t\t\t\t\t\t\tonChange={(event) => setPortDraft(event.target.value)}\n\t\t\t\t\t\t\t\t\t\t\tonKeyDown={(event) => {\n\t\t\t\t\t\t\t\t\t\t\t\tif (event.key === \"Enter\") {\n\t\t\t\t\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\t\t\t\t\tvoid applyGatewayPort();\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tif (event.key === \"Escape\" && gateway !== undefined) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tsetPortDraft(String(gateway.port));\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tstyle={primaryButtonStyle}\n\t\t\t\t\t\t\t\t\t\t\tdisabled={\n\t\t\t\t\t\t\t\t\t\t\t\tgatewayBusy || portDraft === String(gateway.port) || parseGatewayPort(portDraft) === undefined\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\tvoid applyGatewayPort();\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{t(\"gatewayPortApply\")}\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tstyle={buttonStyle}\n\t\t\t\t\t\t\t\t\t\t\tdisabled={gatewayBusy}\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\tsetPortDraft(String(randomGatewayPort(gateway.port)));\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{t(\"gatewayPortRandom\")}\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<p style={copyRowStyle}>\n\t\t\t\t\t\t\t\t\t<span style={hintStyle}>\n\t\t\t\t\t\t\t\t\t\t{t(\"gatewayOpenAiUrl\")}\n\t\t\t\t\t\t\t\t\t\t<span style={{ display: \"block\", ...monoStyle }}>\n\t\t\t\t\t\t\t\t\t\t\t{`${formatGatewayBaseUrl(gateway.bind, gateway.port)}/v1`}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tstyle={primaryButtonStyle}\n\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\tvoid handleCopy(\"openai\", `${formatGatewayBaseUrl(gateway.bind, gateway.port)}/v1`);\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{copyLabel(\"openai\")}\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t<p style={copyRowStyle}>\n\t\t\t\t\t\t\t\t\t<span style={hintStyle}>\n\t\t\t\t\t\t\t\t\t\t{t(\"gatewayAnthropicUrl\")}\n\t\t\t\t\t\t\t\t\t\t<span style={{ display: \"block\", ...monoStyle }}>\n\t\t\t\t\t\t\t\t\t\t\t{formatGatewayBaseUrl(gateway.bind, gateway.port)}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tstyle={buttonStyle}\n\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\tvoid handleCopy(\"anthropic\", formatGatewayBaseUrl(gateway.bind, gateway.port));\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{copyLabel(\"anthropic\")}\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t<p style={copyRowStyle}>\n\t\t\t\t\t\t\t\t\t<span style={hintStyle}>\n\t\t\t\t\t\t\t\t\t\t{t(\"gatewayKeyHint\")}\n\t\t\t\t\t\t\t\t\t\t<span style={{ display: \"block\", ...monoStyle, overflowWrap: \"anywhere\" }}>\n\t\t\t\t\t\t\t\t\t\t\t{gatewayKeyVisible && gatewayOnceKey !== undefined ? gatewayOnceKey : gateway.keyHint || \"\u2014\"}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t<span style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8 }}>\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tstyle={primaryButtonStyle}\n\t\t\t\t\t\t\t\t\t\t\tdisabled={gatewayBusy}\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\tvoid copyGatewayKey();\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{copyLabel(\"key\", t(\"gatewayCopyKey\"))}\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tstyle={buttonStyle}\n\t\t\t\t\t\t\t\t\t\t\tdisabled={gatewayBusy}\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\tvoid toggleGatewayKeyVisible();\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{gatewayKeyVisible ? t(\"gatewayHideKey\") : t(\"gatewayShowKey\")}\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t<p style={hintStyle}>{t(\"gatewayKeyCopyHint\")}</p>\n\t\t\t\t\t\t\t\t{gatewayRotateConfirm ? (\n\t\t\t\t\t\t\t\t\t<div style={nestedStyle}>\n\t\t\t\t\t\t\t\t\t\t<p style={bodyStyle}>{t(\"gatewayRotateConfirm\")}</p>\n\t\t\t\t\t\t\t\t\t\t<p style={hintStyle}>{t(\"gatewayRotateConfirmHint\")}</p>\n\t\t\t\t\t\t\t\t\t\t<div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8 }}>\n\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\tstyle={buttonStyle}\n\t\t\t\t\t\t\t\t\t\t\t\tdisabled={gatewayBusy}\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tvoid rotateGatewayKey();\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{t(\"gatewayRotateConfirmAction\")}\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\tstyle={buttonStyle}\n\t\t\t\t\t\t\t\t\t\t\t\tdisabled={gatewayBusy}\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => setGatewayRotateConfirm(false)}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{t(\"gatewayRotateCancel\")}\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tstyle={buttonStyle}\n\t\t\t\t\t\t\t\t\t\tdisabled={gatewayBusy}\n\t\t\t\t\t\t\t\t\t\tonClick={() => setGatewayRotateConfirm(true)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{t(\"gatewayRotate\")}\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</section>\n\t\t\t\t) : null}\n\t\t\t\t{activeTab === \"about\" && status !== undefined ? (\n\t\t\t\t\t<div style={cardStyle}>\n\t\t\t\t\t\t<div style={rowStyle}>\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t<h3 style={{ ...titleStyle, fontSize: 16 }}>{t(\"antigravityTitle\")}</h3>\n\t\t\t\t\t\t\t\t<p style={{ ...bodyStyle, marginTop: 4 }}>{t(\"antigravityDescription\")}</p>\n\t\t\t\t\t\t\t\t<p style={{ ...bodyStyle, marginTop: 4 }}>\n\t\t\t\t\t\t\t\t\t<span style={monoStyle}>{status.antigravity.route}</span>\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div style={statusStyle} role=\"status\">\n\t\t\t\t\t\t\t\t<span aria-hidden=\"true\" style={dotStyle(\"signed-out\", status.antigravity.installed)} />\n\t\t\t\t\t\t\t\t<span>{status.antigravity.installed ? t(\"antigravityInstalled\") : t(\"antigravityMissing\")}</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<p style={bodyStyle}>{t(\"antigravityCliHint\")}</p>\n\t\t\t\t\t\t<code style={{ ...monoStyle, fontSize: 12, overflowWrap: \"anywhere\" }}>{t(\"antigravityCliCommand\")}</code>\n\t\t\t\t\t</div>\n\t\t\t\t) : null}\n\t\t\t</div>\n\t\t</section>\n\t);\n}\n", "/** English copy for the Coding OAuth settings section. */\nexport const en = {\n\tnav: \"Coding OAuth\",\n\ttitle: \"Coding subscriptions\",\n\tintro:\n\t\t\"Use your own Grok Build, ChatGPT Codex, Kimi Code, and Claude Code subscriptions in dsh. API-key routes remain separate.\",\n\ttermsWarning:\n\t\t\"These are unofficial third-party integrations with subscription services. Provider terms, quotas, regions, and account-risk policies still apply.\",\n\tloadingAccount: \"Loading accounts\u2026\",\n\tsignedOut: \"Not signed in\",\n\tsigningIn: \"Waiting for authorization\u2026\",\n\tsignedIn: \"Signed in\",\n\trequestFailed: \"The account request failed.\",\n\tlogout: \"Sign out\",\n\tworking: \"Working\u2026\",\n\tcancelLogin: \"Cancel sign-in\",\n\tdeviceLogin: \"Sign in with device code\",\n\tbrowserLogin: \"Sign in in browser\",\n\tpkceLogin: \"Sign in with authorization code\",\n\tuserCode: \"Enter this code when the provider asks:\",\n\topenUrl: \"Complete sign-in at:\",\n\tpopupBlocked: \"The browser blocked the sign-in window. Open this URL manually:\",\n\tpasteCodeHint:\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:\",\n\tpasteBrowserCodeHint:\n\t\t\"Paste the authorization code or complete redirect URL returned by the provider to finish this browser sign-in:\",\n\tpasteCodePlaceholder: \"authorization code or complete redirect URL\",\n\tsubmitCode: \"Submit code\",\n\timportGrok: \"Import from Grok CLI\",\n\timportHint: \"Copies ~/.grok/auth.json into dsh. A later dsh refresh may rotate the token and sign the Grok CLI out.\",\n\tmodels: \"Visible models\",\n\tcatalogLive: \"From your current xAI account\",\n\tcatalogCache: \"From the last successful xAI listing\",\n\tcatalogFallback: \"Built-in Grok baseline (live listing unavailable)\",\n\tcatalogError: \"Could not refresh the live Grok model list.\",\n\tselectAll: \"Show all\",\n\tmodelHint: \"Checked models appear in the model picker as\",\n\tgrokTitle: \"xAI Grok Build\",\n\tgrokDescription: \"SuperGrok / X Premium coding subscription through the Grok Build endpoint.\",\n\tcodexTitle: \"OpenAI Codex\",\n\tcodexDescription: \"ChatGPT Plus/Pro Codex entitlement. Device code is recommended for a remote DSH host.\",\n\tkimiTitle: \"Kimi Code\",\n\tkimiDescription:\n\t\t\"Kimi Code membership through auth.kimi.com and api.kimi.com/coding; this is not the Moonshot API-key platform.\",\n\tclaudeTitle: \"Claude Code\",\n\tclaudeDescription: \"Claude Pro/Max OAuth with Claude Code scopes and automatic refresh.\",\n\tantigravityTitle: \"Google Antigravity\",\n\tantigravityDescription: \"Provided by the separately pinned MIT dsh-agy plugin and exposed as the agy route.\",\n\tantigravityInstalled: \"Installed (CLI-managed)\",\n\tantigravityMissing: \"Not installed\",\n\tantigravityCliHint:\n\t\t\"The unauthenticated dsh-agy web export dashboard is disabled. Manage Google OAuth with the profile-local CLI when needed.\",\n\tantigravityCliCommand: \"dsh plugin --profile web exec dsh-agy login --headless\",\n\tsourcesTitle: \"Pull a copy from official CLI files\",\n\tsourcesIntro:\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.\",\n\tsourcesReadOnlyHint:\n\t\t\"This is a one-way pull of a copy. dsh does not update, replace, or write back the official CLI documents.\",\n\tsourcesLoading: \"Looking for official CLI login files\u2026\",\n\tsourcesCheckAgain: \"Check again\",\n\tsourcesAvailable: \"A readable copy is available\",\n\tsourcesUnavailable: \"No usable copy found\",\n\tsourcesPullCopy: \"Pull a copy\",\n\tsourcesPreviewTitle: \"Review this copy before saving it in dsh\",\n\tsourcesPreviewExpires: \"CLI credential expiry: {time}\",\n\tsourcesTicketExpires: \"This preview expires at {time}\",\n\tsourcesConflict: \"Stored dsh credential: {detail}\",\n\tsourcesAction: \"If you continue: {detail}\",\n\tsourcesWarnings: \"Notes\",\n\tsourcesConfirmOverwrite: \"Replace the credential already stored in dsh with this copy\",\n\tsourcesConfirmOverwriteHint: \"A different credential is already stored. Check the box, then confirm the pull.\",\n\tsourcesCommit: \"Confirm pull\",\n\tsourcesCancelPreview: \"Cancel preview\",\n\tsourcesCommitSuccess: \"Copied into dsh ({action}).\",\n\tsourcesPreviewFailed: \"Could not prepare a copy from that CLI file.\",\n\tsourcesCommitFailed: \"Could not save the copy in dsh.\",\n\tsourcesLoadFailed: \"Could not look for official CLI login files.\",\n\tsourceKindGrok: \"Grok CLI\",\n\tsourceKindCodex: \"Codex CLI\",\n\tsourceKindKimi: \"Kimi Code CLI\",\n\tsourceKindClaude: \"Claude Code CLI\",\n\tsourceReasonMissing: \"No official CLI file was found at the expected location.\",\n\tsourceReasonUnsafe: \"The official CLI file is not safe to read (permissions or file type).\",\n\tsourceReasonInvalid: \"The official CLI file is present but is not a usable OAuth login.\",\n\tsourceReasonTooLarge: \"The official CLI file is larger than the allowed read limit.\",\n\tsourceConflictNone: \"dsh has no stored credential yet\",\n\tsourceConflictSameCredential: \"same credential already stored\",\n\tsourceConflictSameAccount: \"same account, different credential\",\n\tsourceConflictDifferentAccount: \"a different account is already stored\",\n\tsourceConflictUnknownAccount: \"an existing credential is stored (account could not be compared)\",\n\tsourceConflictUnreadableDestination: \"the stored dsh credential could not be read\",\n\tsourceConflictUnsafeDestination: \"the stored dsh credential file is not safe to replace\",\n\tsourceConflictUnrecognized: \"the stored credential needs a review\",\n\tsourceActionImport: \"save this copy in dsh\",\n\tsourceActionReuse: \"keep the stored dsh credential (it already matches)\",\n\tsourceActionOverwrite: \"replace the stored dsh credential\",\n\tsourceActionBlocked: \"blocked \u2014 the stored dsh file cannot be replaced from here\",\n\tsourceActionUnrecognized: \"needs a review\",\n\tsourceCommitImported: \"saved\",\n\tsourceCommitUnchanged: \"already matched\",\n\tsourceCommitOverwritten: \"replaced\",\n\tcapabilitiesTitle: \"Subscription capabilities\",\n\tcapabilitiesIntro:\n\t\t\"Every switch starts off. Turning one on uses that vendor\u2019s subscription quota, not a separate API-key bill.\",\n\tcapabilitiesQuotaHint:\n\t\t\"Search, images, edits, Fast, usage, and Grok Imagine all consume the matching subscription quota when they run.\",\n\tcapabilitiesReadOnly: \"These switches are read-only in this deployment.\",\n\tcapabilitiesLoading: \"Loading capability settings\u2026\",\n\tcapabilitiesLoadFailed: \"Could not load capability settings.\",\n\tcapabilitiesSaveFailed: \"Could not save that capability setting.\",\n\tcapabilitiesConflictRefreshed: \"Those settings changed elsewhere. The page was refreshed; try again.\",\n\tcapabilityLimitsTitle: \"Capability limits\",\n\tcapabilityLimitsHint: \"Limits apply live to newly started operations and remain within the audited safety bounds.\",\n\tcapSearchResults: \"Maximum search results\",\n\tcapSearchResultsHint: \"Codex search returns at most this many results (1\u201320).\",\n\tcapImageCount: \"Maximum images per call\",\n\tcapImageCountHint: \"Codex and Imagine image tools can return at most this many images (1\u20134).\",\n\tcapVideoTtlHours: \"Video artifact retention (hours)\",\n\tcapVideoTtlHoursHint:\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.\",\n\tcapabilityLimitInvalid: \"Enter a whole number from {min} through {max}.\",\n\tcapCodexSearch: \"Codex subscription search\",\n\tcapCodexSearchHint: \"Optional Codex search. It does not become the default search provider.\",\n\tcapCodexImages: \"Codex images\",\n\tcapCodexImagesHint: \"Optional Codex image generation. Uses ChatGPT/Codex quota.\",\n\tcapCodexImageEdits: \"Codex image edits\",\n\tcapCodexImageEditsHint: \"Optional Codex image edits. Available only when Codex images is on.\",\n\tcapCodexUsage: \"Show Codex quota\",\n\tcapCodexUsageHint: \"Best-effort remaining-quota card. Hidden if the vendor does not return usable numbers.\",\n\tcapCodexFast: \"Fast requested\",\n\tcapCodexFastHint:\n\t\t\"Publishes the codex-oauth-fast route only after a fresh private model catalog confirms a priority-eligible model; failures withdraw it.\",\n\tcapGrokImagineImage: \"Grok Imagine images\",\n\tcapGrokImagineImageHint: \"Optional official xAI Imagine images. Requires an Imagine credential, not only Grok OAuth.\",\n\tcapGrokImagineVideo: \"Grok Imagine video\",\n\tcapGrokImagineVideoHint: \"Optional official xAI Imagine video. Requires an Imagine credential, not only Grok OAuth.\",\n\tusageTitle: \"Codex quota\",\n\tusageLoading: \"Loading Codex quota\u2026\",\n\tusageUnavailable: \"Codex quota is not available right now.\",\n\tusageEmpty: \"The vendor did not return any displayable quota fields.\",\n\tusageFetchedAt: \"Last read: {time}\",\n\tusageRateLimit: \"Rate limit\",\n\tusageWindow: \"{seconds}s window\",\n\tusageUsed: \"Used {value}\",\n\tusageRemaining: \"Remaining {value}\",\n\tusageResets: \"Resets {time}\",\n\tusageCredits: \"Credits\",\n\tusageCreditsUnlimited: \"Unlimited credits\",\n\tusageCreditsLimited: \"Limited credits\",\n\tusageBalance: \"Balance {value}\",\n\tusageIndividualLimit: \"Individual limit\",\n\tusageLimit: \"Limit {value}\",\n\tusageUsedAmount: \"Used {value}\",\n\tusageRemainingAmount: \"Remaining {value}\",\n\tusageSpendControlReached: \"Spend control has been reached.\",\n\tusageResetCredits: \"Reset credits available: {value}\",\n\timagineTitle: \"Grok Imagine credential\",\n\timagineIntro:\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.\",\n\timagineLoading: \"Checking the Imagine credential\u2026\",\n\timagineLoadFailed: \"Could not read the Imagine credential status.\",\n\timagineConfigured: \"An Imagine credential is configured\",\n\timagineNotConfigured: \"No Imagine credential is configured\",\n\timagineSource: \"Source: {source}\",\n\timagineWritable: \"This deployment can update the Imagine credential store.\",\n\timagineReadOnly: \"This deployment cannot update the Imagine credential store.\",\n\timagineSourceNone: \"none\",\n\timagineSourceEnv: \"environment variable\",\n\timagineSourceApiKey: \"stored API key\",\n\timagineSourceOAuth: \"OAuth access (only if Imagine accepted it)\",\n\timagineSourceCliKey: \"Grok CLI key field\",\n\timagineSourceUnknown: \"configured (details withheld)\",\n\ttabAccounts: \"Accounts\",\n\ttabCapabilities: \"Capabilities\",\n\ttabGateway: \"Gateway\",\n\ttabAbout: \"About\",\n\tcopy: \"Copy\",\n\tcopied: \"Copied\",\n\tcopyFailed: \"Could not copy\",\n\tmodelsSummary: \"{selected}/{total} models visible\",\n\texpandModels: \"Models\",\n\tcollapseModels: \"Hide models\",\n\tusageUsedShort: \"Used {value}\",\n\tgatewayTitle: \"Local API gateway\",\n\tgatewayIntro: \"Loopback OpenAI/Anthropic-compatible server for your own tools. Off until you enable it.\",\n\tgatewayWarning: \"Exposes signed-in subscriptions as a local API. Can violate provider terms and uses quota.\",\n\tgatewayEnabled: \"Enable local gateway\",\n\tgatewayBind: \"Bind\",\n\tgatewayPort: \"Port\",\n\tgatewayPortHint: \"Integer from 1024 through 65535. Apply to save; Random fills a high port, then Apply.\",\n\tgatewayPortApply: \"Apply\",\n\tgatewayPortRandom: \"Random\",\n\tgatewayPortInvalid: \"Enter a whole port number from 1024 through 65535.\",\n\tgatewayAddress: \"Gateway address\",\n\tgatewayOpenAiUrl: \"OpenAI-compatible base URL\",\n\tgatewayAnthropicUrl: \"Anthropic-compatible base URL\",\n\tgatewayKeyHint: \"Bearer key\",\n\tgatewayKeyCopyHint: \"Copy uses the current key. Rotate only if you want to invalidate existing clients.\",\n\tgatewayCopyKey: \"Copy key\",\n\tgatewayShowKey: \"Show\",\n\tgatewayHideKey: \"Hide\",\n\tgatewayRevealFailed: \"Could not read the current key.\",\n\tgatewayRotateConfirm: \"Rotate the key? Existing clients will stop working.\",\n\tgatewayRotateConfirmHint: \"This replaces the current Bearer key.\",\n\tgatewayRotateConfirmAction: \"Confirm rotate\",\n\tgatewayRotateCancel: \"Cancel\",\n\tgatewayRunning: \"Listening\",\n\tgatewayStopped: \"Not listening\",\n\tgatewayRotate: \"Rotate API key\",\n\tgatewayRotated: \"New key (shown once): {key}\",\n\tgatewayLoadFailed: \"Could not load gateway settings.\",\n\tgatewaySaveFailed: \"Could not update the gateway.\",\n\tgatewayLoading: \"Loading gateway settings\u2026\",\n};\n\nexport type GrokBuildSettingsKey = keyof typeof en;\n\nexport const zh: { [Key in GrokBuildSettingsKey]: string } = {\n\tnav: \"\u7F16\u7801 OAuth\",\n\ttitle: \"\u7F16\u7801\u8BA2\u9605\u8D26\u6237\",\n\tintro:\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\",\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\",\n\tloadingAccount: \"\u6B63\u5728\u52A0\u8F7D\u8D26\u6237\u2026\",\n\tsignedOut: \"\u5C1A\u672A\u767B\u5F55\",\n\tsigningIn: \"\u6B63\u5728\u7B49\u5F85\u6388\u6743\u2026\",\n\tsignedIn: \"\u5DF2\u767B\u5F55\",\n\trequestFailed: \"\u8D26\u6237\u8BF7\u6C42\u5931\u8D25\u3002\",\n\tlogout: \"\u9000\u51FA\u767B\u5F55\",\n\tworking: \"\u5904\u7406\u4E2D\u2026\",\n\tcancelLogin: \"\u53D6\u6D88\u767B\u5F55\",\n\tdeviceLogin: \"\u4F7F\u7528\u8BBE\u5907\u7801\u767B\u5F55\",\n\tbrowserLogin: \"\u5728\u6D4F\u89C8\u5668\u4E2D\u767B\u5F55\",\n\tpkceLogin: \"\u4F7F\u7528\u6388\u6743\u7801\u767B\u5F55\",\n\tuserCode: \"\u4F9B\u5E94\u5546\u8981\u6C42\u8F93\u5165\u4EE3\u7801\u65F6\uFF0C\u8BF7\u8F93\u5165\uFF1A\",\n\topenUrl: \"\u8BF7\u5728\u6B64\u5B8C\u6210\u767B\u5F55\uFF1A\",\n\tpopupBlocked: \"\u6D4F\u89C8\u5668\u963B\u6B62\u4E86\u767B\u5F55\u7A97\u53E3\uFF0C\u8BF7\u624B\u52A8\u6253\u5F00\uFF1A\",\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\",\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\",\n\tpasteCodePlaceholder: \"\u6388\u6743 code \u6216\u5B8C\u6574\u8DF3\u8F6C\u94FE\u63A5\",\n\tsubmitCode: \"\u63D0\u4EA4 code\",\n\timportGrok: \"\u4ECE Grok CLI \u5BFC\u5165\",\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\",\n\tmodels: \"\u53EF\u89C1\u6A21\u578B\",\n\tcatalogLive: \"\u6765\u81EA\u5F53\u524D xAI \u8D26\u53F7\",\n\tcatalogCache: \"\u6765\u81EA\u4E0A\u4E00\u6B21\u6210\u529F\u62C9\u53D6\u7684 xAI \u5217\u8868\",\n\tcatalogFallback: \"\u5185\u7F6E Grok \u57FA\u7EBF\u76EE\u5F55\uFF08\u7EBF\u4E0A\u5217\u8868\u4E0D\u53EF\u7528\uFF09\",\n\tcatalogError: \"\u65E0\u6CD5\u5237\u65B0\u7EBF\u4E0A Grok \u6A21\u578B\u5217\u8868\u3002\",\n\tselectAll: \"\u5168\u90E8\u663E\u793A\",\n\tmodelHint: \"\u52FE\u9009\u6A21\u578B\u4F1A\u4EE5\u8BE5\u524D\u7F00\u51FA\u73B0\u5728\u6A21\u578B\u9009\u62E9\u5668\uFF1A\",\n\tgrokTitle: \"xAI Grok Build\",\n\tgrokDescription: \"\u901A\u8FC7 Grok Build \u7AEF\u70B9\u4F7F\u7528 SuperGrok / X Premium \u7F16\u7801\u8BA2\u9605\u3002\",\n\tcodexTitle: \"OpenAI Codex\",\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\",\n\tkimiTitle: \"Kimi Code\",\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\",\n\tclaudeTitle: \"Claude Code\",\n\tclaudeDescription: \"Claude Pro/Max OAuth\uFF0C\u5305\u542B Claude Code scope \u548C\u81EA\u52A8\u5237\u65B0\u3002\",\n\tantigravityTitle: \"Google Antigravity\",\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\",\n\tantigravityInstalled: \"\u5DF2\u5B89\u88C5\uFF08CLI \u7BA1\u7406\uFF09\",\n\tantigravityMissing: \"\u5C1A\u672A\u5B89\u88C5\",\n\tantigravityCliHint:\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\",\n\tantigravityCliCommand: \"dsh plugin --profile web exec dsh-agy login --headless\",\n\tsourcesTitle: \"\u4ECE\u5B98\u65B9 CLI \u6587\u4EF6\u62C9\u53D6\u526F\u672C\",\n\tsourcesIntro:\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\",\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\",\n\tsourcesLoading: \"\u6B63\u5728\u67E5\u627E\u5B98\u65B9 CLI \u767B\u5F55\u6587\u4EF6\u2026\",\n\tsourcesCheckAgain: \"\u518D\u68C0\u67E5\u4E00\u6B21\",\n\tsourcesAvailable: \"\u53EF\u4EE5\u8BFB\u53D6\u4E00\u4EFD\u526F\u672C\",\n\tsourcesUnavailable: \"\u6CA1\u6709\u53EF\u7528\u7684\u526F\u672C\",\n\tsourcesPullCopy: \"\u62C9\u53D6\u526F\u672C\",\n\tsourcesPreviewTitle: \"\u5148\u6838\u5BF9\u8FD9\u4EFD\u526F\u672C\uFF0C\u518D\u5199\u5165 dsh\",\n\tsourcesPreviewExpires: \"CLI \u51ED\u636E\u5230\u671F\u65F6\u95F4\uFF1A{time}\",\n\tsourcesTicketExpires: \"\u6B64\u6B21\u9884\u89C8\u5C06\u4E8E {time} \u5931\u6548\",\n\tsourcesConflict: \"dsh \u4E2D\u5DF2\u5B58\u51ED\u636E\uFF1A{detail}\",\n\tsourcesAction: \"\u82E5\u7EE7\u7EED\uFF1A{detail}\",\n\tsourcesWarnings: \"\u8BF4\u660E\",\n\tsourcesConfirmOverwrite: \"\u7528\u8FD9\u4EFD\u526F\u672C\u66FF\u6362 dsh \u4E2D\u5DF2\u4FDD\u5B58\u7684\u51ED\u636E\",\n\tsourcesConfirmOverwriteHint: \"dsh \u91CC\u5DF2\u6709\u53E6\u4E00\u4EFD\u51ED\u636E\u3002\u8BF7\u5148\u52FE\u9009\uFF0C\u518D\u786E\u8BA4\u62C9\u53D6\u3002\",\n\tsourcesCommit: \"\u786E\u8BA4\u62C9\u53D6\",\n\tsourcesCancelPreview: \"\u53D6\u6D88\u9884\u89C8\",\n\tsourcesCommitSuccess: \"\u5DF2\u590D\u5236\u5230 dsh\uFF08{action}\uFF09\u3002\",\n\tsourcesPreviewFailed: \"\u65E0\u6CD5\u4ECE\u8BE5 CLI \u6587\u4EF6\u51C6\u5907\u526F\u672C\u3002\",\n\tsourcesCommitFailed: \"\u65E0\u6CD5\u628A\u526F\u672C\u4FDD\u5B58\u5230 dsh\u3002\",\n\tsourcesLoadFailed: \"\u65E0\u6CD5\u67E5\u627E\u5B98\u65B9 CLI \u767B\u5F55\u6587\u4EF6\u3002\",\n\tsourceKindGrok: \"Grok CLI\",\n\tsourceKindCodex: \"Codex CLI\",\n\tsourceKindKimi: \"Kimi Code CLI\",\n\tsourceKindClaude: \"Claude Code CLI\",\n\tsourceReasonMissing: \"\u5728\u9884\u671F\u4F4D\u7F6E\u6CA1\u6709\u627E\u5230\u5B98\u65B9 CLI \u6587\u4EF6\u3002\",\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\",\n\tsourceReasonInvalid: \"\u5B98\u65B9 CLI \u6587\u4EF6\u5B58\u5728\uFF0C\u4F46\u4E0D\u662F\u53EF\u7528\u7684 OAuth \u767B\u5F55\u3002\",\n\tsourceReasonTooLarge: \"\u5B98\u65B9 CLI \u6587\u4EF6\u8D85\u8FC7\u5141\u8BB8\u7684\u8BFB\u53D6\u4E0A\u9650\u3002\",\n\tsourceConflictNone: \"dsh \u5C1A\u672A\u4FDD\u5B58\u51ED\u636E\",\n\tsourceConflictSameCredential: \"\u5DF2\u4FDD\u5B58\u540C\u4E00\u4EFD\u51ED\u636E\",\n\tsourceConflictSameAccount: \"\u540C\u4E00\u8D26\u53F7\uFF0C\u4F46\u51ED\u636E\u4E0D\u540C\",\n\tsourceConflictDifferentAccount: \"\u5DF2\u4FDD\u5B58\u53E6\u4E00\u4E2A\u8D26\u53F7\",\n\tsourceConflictUnknownAccount: \"\u5DF2\u4FDD\u5B58\u51ED\u636E\uFF08\u65E0\u6CD5\u6BD4\u8F83\u8D26\u53F7\uFF09\",\n\tsourceConflictUnreadableDestination: \"\u65E0\u6CD5\u8BFB\u53D6 dsh \u4E2D\u5DF2\u5B58\u51ED\u636E\",\n\tsourceConflictUnsafeDestination: \"dsh \u4E2D\u7684\u51ED\u636E\u6587\u4EF6\u4E0D\u5B89\u5168\uFF0C\u4E0D\u80FD\u4ECE\u8FD9\u91CC\u66FF\u6362\",\n\tsourceConflictUnrecognized: \"\u5DF2\u5B58\u51ED\u636E\u9700\u8981\u6838\u5BF9\",\n\tsourceActionImport: \"\u628A\u8FD9\u4EFD\u526F\u672C\u4FDD\u5B58\u5230 dsh\",\n\tsourceActionReuse: \"\u4FDD\u7559 dsh \u4E2D\u5DF2\u5B58\u51ED\u636E\uFF08\u5185\u5BB9\u5DF2\u76F8\u540C\uFF09\",\n\tsourceActionOverwrite: \"\u66FF\u6362 dsh \u4E2D\u5DF2\u5B58\u51ED\u636E\",\n\tsourceActionBlocked: \"\u5DF2\u963B\u6B62 \u2014 \u4E0D\u80FD\u4ECE\u8FD9\u91CC\u66FF\u6362 dsh \u4E2D\u7684\u6587\u4EF6\",\n\tsourceActionUnrecognized: \"\u9700\u8981\u6838\u5BF9\",\n\tsourceCommitImported: \"\u5DF2\u4FDD\u5B58\",\n\tsourceCommitUnchanged: \"\u539F\u672C\u5C31\u76F8\u540C\",\n\tsourceCommitOverwritten: \"\u5DF2\u66FF\u6362\",\n\tcapabilitiesTitle: \"\u8BA2\u9605\u80FD\u529B\",\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\",\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\",\n\tcapabilitiesReadOnly: \"\u5F53\u524D\u90E8\u7F72\u4E2D\u8FD9\u4E9B\u5F00\u5173\u4E3A\u53EA\u8BFB\u3002\",\n\tcapabilitiesLoading: \"\u6B63\u5728\u52A0\u8F7D\u80FD\u529B\u8BBE\u7F6E\u2026\",\n\tcapabilitiesLoadFailed: \"\u65E0\u6CD5\u52A0\u8F7D\u80FD\u529B\u8BBE\u7F6E\u3002\",\n\tcapabilitiesSaveFailed: \"\u65E0\u6CD5\u4FDD\u5B58\u8BE5\u80FD\u529B\u8BBE\u7F6E\u3002\",\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\",\n\tcapabilityLimitsTitle: \"\u80FD\u529B\u9650\u5236\",\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\",\n\tcapSearchResults: \"\u6700\u591A\u641C\u7D22\u7ED3\u679C\u6570\",\n\tcapSearchResultsHint: \"Codex \u641C\u7D22\u6700\u591A\u8FD4\u56DE\u8FD9\u4E48\u591A\u6761\u7ED3\u679C\uFF081\u201320\uFF09\u3002\",\n\tcapImageCount: \"\u5355\u6B21\u6700\u591A\u56FE\u7247\u6570\",\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\",\n\tcapVideoTtlHours: \"\u89C6\u9891\u4EA7\u7269\u4FDD\u7559\u65F6\u95F4\uFF08\u5C0F\u65F6\uFF09\",\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\",\n\tcapabilityLimitInvalid: \"\u8BF7\u8F93\u5165 {min} \u5230 {max} \u4E4B\u95F4\u7684\u6574\u6570\u3002\",\n\tcapCodexSearch: \"Codex \u8BA2\u9605\u641C\u7D22\",\n\tcapCodexSearchHint: \"\u53EF\u9009\u7684 Codex \u641C\u7D22\u3002\u4E0D\u4F1A\u81EA\u52A8\u53D8\u6210\u9ED8\u8BA4\u641C\u7D22\u63D0\u4F9B\u65B9\u3002\",\n\tcapCodexImages: \"Codex \u51FA\u56FE\",\n\tcapCodexImagesHint: \"\u53EF\u9009\u7684 Codex \u51FA\u56FE\u3002\u6D88\u8017 ChatGPT/Codex \u914D\u989D\u3002\",\n\tcapCodexImageEdits: \"Codex \u6539\u56FE\",\n\tcapCodexImageEditsHint: \"\u53EF\u9009\u7684 Codex \u6539\u56FE\u3002\u4EC5\u5728\u6253\u5F00 Codex \u51FA\u56FE\u540E\u53EF\u7F16\u8F91\u3002\",\n\tcapCodexUsage: \"\u663E\u793A Codex \u989D\u5EA6\",\n\tcapCodexUsageHint: \"\u5C3D\u529B\u5C55\u793A\u5269\u4F59\u989D\u5EA6\u3002\u4F9B\u5E94\u5546\u672A\u8FD4\u56DE\u53EF\u7528\u6570\u5B57\u65F6\u4F1A\u9690\u85CF\u5BF9\u5E94\u9879\u3002\",\n\tcapCodexFast: \"\u5DF2\u8BF7\u6C42 Fast\",\n\tcapCodexFastHint: \"\u4EC5\u5728\u6700\u65B0\u79C1\u6709\u6A21\u578B\u76EE\u5F55\u786E\u8BA4\u5B58\u5728\u53EF\u7528\u4F18\u5148\u6A21\u578B\u540E\u53D1\u5E03 codex-oauth-fast \u8DEF\u7531\uFF1B\u5237\u65B0\u5931\u8D25\u4F1A\u64A4\u56DE\u8BE5\u8DEF\u7531\u3002\",\n\tcapGrokImagineImage: \"Grok Imagine \u51FA\u56FE\",\n\tcapGrokImagineImageHint: \"\u53EF\u9009\u7684\u5B98\u65B9 xAI Imagine \u51FA\u56FE\u3002\u9700\u8981 Imagine \u51ED\u636E\uFF0C\u4EC5\u6709 Grok OAuth \u4E0D\u591F\u3002\",\n\tcapGrokImagineVideo: \"Grok Imagine \u51FA\u89C6\u9891\",\n\tcapGrokImagineVideoHint: \"\u53EF\u9009\u7684\u5B98\u65B9 xAI Imagine \u51FA\u89C6\u9891\u3002\u9700\u8981 Imagine \u51ED\u636E\uFF0C\u4EC5\u6709 Grok OAuth \u4E0D\u591F\u3002\",\n\tusageTitle: \"Codex \u989D\u5EA6\",\n\tusageLoading: \"\u6B63\u5728\u52A0\u8F7D Codex \u989D\u5EA6\u2026\",\n\tusageUnavailable: \"\u5F53\u524D\u65E0\u6CD5\u8BFB\u53D6 Codex \u989D\u5EA6\u3002\",\n\tusageEmpty: \"\u4F9B\u5E94\u5546\u6CA1\u6709\u8FD4\u56DE\u53EF\u5C55\u793A\u7684\u989D\u5EA6\u5B57\u6BB5\u3002\",\n\tusageFetchedAt: \"\u6700\u8FD1\u8BFB\u53D6\uFF1A{time}\",\n\tusageRateLimit: \"\u901F\u7387\u9650\u5236\",\n\tusageWindow: \"{seconds} \u79D2\u7A97\u53E3\",\n\tusageUsed: \"\u5DF2\u7528 {value}\",\n\tusageRemaining: \"\u5269\u4F59 {value}\",\n\tusageResets: \"\u91CD\u7F6E\u65F6\u95F4 {time}\",\n\tusageCredits: \"\u79EF\u5206\",\n\tusageCreditsUnlimited: \"\u65E0\u9650\u79EF\u5206\",\n\tusageCreditsLimited: \"\u6709\u9650\u79EF\u5206\",\n\tusageBalance: \"\u4F59\u989D {value}\",\n\tusageIndividualLimit: \"\u4E2A\u4EBA\u989D\u5EA6\",\n\tusageLimit: \"\u4E0A\u9650 {value}\",\n\tusageUsedAmount: \"\u5DF2\u7528 {value}\",\n\tusageRemainingAmount: \"\u5269\u4F59 {value}\",\n\tusageSpendControlReached: \"\u5DF2\u8FBE\u5230\u652F\u51FA\u63A7\u5236\u4E0A\u9650\u3002\",\n\tusageResetCredits: \"\u53EF\u7528\u91CD\u7F6E\u6B21\u6570\uFF1A{value}\",\n\timagineTitle: \"Grok Imagine \u51ED\u636E\",\n\timagineIntro:\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\",\n\timagineLoading: \"\u6B63\u5728\u68C0\u67E5 Imagine \u51ED\u636E\u2026\",\n\timagineLoadFailed: \"\u65E0\u6CD5\u8BFB\u53D6 Imagine \u51ED\u636E\u72B6\u6001\u3002\",\n\timagineConfigured: \"\u5DF2\u914D\u7F6E Imagine \u51ED\u636E\",\n\timagineNotConfigured: \"\u5C1A\u672A\u914D\u7F6E Imagine \u51ED\u636E\",\n\timagineSource: \"\u6765\u6E90\uFF1A{source}\",\n\timagineWritable: \"\u5F53\u524D\u90E8\u7F72\u53EF\u4EE5\u66F4\u65B0 Imagine \u51ED\u636E\u5B58\u50A8\u3002\",\n\timagineReadOnly: \"\u5F53\u524D\u90E8\u7F72\u4E0D\u80FD\u66F4\u65B0 Imagine \u51ED\u636E\u5B58\u50A8\u3002\",\n\timagineSourceNone: \"\u65E0\",\n\timagineSourceEnv: \"\u73AF\u5883\u53D8\u91CF\",\n\timagineSourceApiKey: \"\u5DF2\u4FDD\u5B58\u7684 API key\",\n\timagineSourceOAuth: \"OAuth access\uFF08\u4EC5\u5F53 Imagine \u63A5\u53D7\u65F6\uFF09\",\n\timagineSourceCliKey: \"Grok CLI \u7684 key \u5B57\u6BB5\",\n\timagineSourceUnknown: \"\u5DF2\u914D\u7F6E\uFF08\u7EC6\u8282\u4E0D\u5C55\u793A\uFF09\",\n\ttabAccounts: \"\u8D26\u6237\",\n\ttabCapabilities: \"\u80FD\u529B\",\n\ttabGateway: \"\u7F51\u5173\",\n\ttabAbout: \"\u5173\u4E8E\",\n\tcopy: \"\u590D\u5236\",\n\tcopied: \"\u5DF2\u590D\u5236\",\n\tcopyFailed: \"\u590D\u5236\u5931\u8D25\",\n\tmodelsSummary: \"\u5DF2\u663E\u793A {selected}/{total} \u4E2A\u6A21\u578B\",\n\texpandModels: \"\u6A21\u578B\",\n\tcollapseModels: \"\u6536\u8D77\u6A21\u578B\",\n\tusageUsedShort: \"\u5DF2\u7528 {value}\",\n\tgatewayTitle: \"\u672C\u5730 API \u7F51\u5173\",\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\",\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\",\n\tgatewayEnabled: \"\u542F\u7528\u672C\u5730\u7F51\u5173\",\n\tgatewayBind: \"\u7ED1\u5B9A\u5730\u5740\",\n\tgatewayPort: \"\u7AEF\u53E3\",\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\",\n\tgatewayPortApply: \"\u786E\u5B9A\",\n\tgatewayPortRandom: \"\u968F\u673A\",\n\tgatewayPortInvalid: \"\u8BF7\u8F93\u5165 1024 \u5230 65535 \u4E4B\u95F4\u7684\u6574\u6570\u7AEF\u53E3\u3002\",\n\tgatewayAddress: \"\u7F51\u5173\u5730\u5740\",\n\tgatewayOpenAiUrl: \"OpenAI \u517C\u5BB9\u5730\u5740\",\n\tgatewayAnthropicUrl: \"Anthropic \u517C\u5BB9\u5730\u5740\",\n\tgatewayKeyHint: \"Bearer key\",\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\",\n\tgatewayCopyKey: \"\u590D\u5236 key\",\n\tgatewayShowKey: \"\u663E\u793A\",\n\tgatewayHideKey: \"\u9690\u85CF\",\n\tgatewayRevealFailed: \"\u65E0\u6CD5\u8BFB\u53D6\u5F53\u524D key\u3002\",\n\tgatewayRotateConfirm: \"\u786E\u5B9A\u8F6E\u6362 key\uFF1F\u73B0\u6709\u5BA2\u6237\u7AEF\u5C06\u5931\u6548\u3002\",\n\tgatewayRotateConfirmHint: \"\u8FD9\u4F1A\u66FF\u6362\u5F53\u524D Bearer key\u3002\",\n\tgatewayRotateConfirmAction: \"\u786E\u8BA4\u8F6E\u6362\",\n\tgatewayRotateCancel: \"\u53D6\u6D88\",\n\tgatewayRunning: \"\u6B63\u5728\u76D1\u542C\",\n\tgatewayStopped: \"\u672A\u76D1\u542C\",\n\tgatewayRotate: \"\u8F6E\u6362 API key\",\n\tgatewayRotated: \"\u65B0 key\uFF08\u53EA\u663E\u793A\u4E00\u6B21\uFF09\uFF1A{key}\",\n\tgatewayLoadFailed: \"\u65E0\u6CD5\u52A0\u8F7D\u7F51\u5173\u8BBE\u7F6E\u3002\",\n\tgatewaySaveFailed: \"\u65E0\u6CD5\u66F4\u65B0\u7F51\u5173\u3002\",\n\tgatewayLoading: \"\u6B63\u5728\u52A0\u8F7D\u7F51\u5173\u8BBE\u7F6E\u2026\",\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["index_exports", "__export", "apply", "inject", "name", "__toCommonJS", "import_react", "import_jsx_runtime", "STATUS_PATH", "LOGIN_PATH", "LOGIN_CODE_PATH", "LOGIN_CANCEL_PATH", "LOGOUT_PATH", "MODELS_PATH", "SOURCES_PATH", "SOURCES_PREVIEW_PATH", "SOURCES_COMMIT_PATH", "SOURCES_CANCEL_PATH", "CAPABILITIES_PATH", "CODEX_USAGE_PATH", "IMAGINE_CREDENTIAL_PATH", "GATEWAY_PATH", "GATEWAY_REVEAL_PATH", "GATEWAY_ROTATE_PATH", "POLL_INTERVAL_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", "HOUR_MS", "CAPABILITY_LIMITS", "IMAGINE_SOURCE_KEY", "PROVIDERS", "SETTINGS_TABS", "pageStyle", "titleStyle", "bodyStyle", "cardStyle", "rowStyle", "statusStyle", "buttonStyle", "primaryButtonStyle", "errorStyle", "warningStyle", "codeStyle", "monoStyle", "linkStyle", "listStyle", "checkRowStyle", "inputStyle", "nestedStyle", "hintStyle", "tabNavStyle", "tabButtonStyle", "tabButtonActiveStyle", "panelStyle", "accountGridStyle", "copyRowStyle", "dotStyle", "status", "installed", "isRecord", "value", "optionalString", "optionalFiniteNumber", "optionalBoolean", "optionalPercent", "numeric", "isSourceKind", "isSourceReason", "isSourceConflict", "isSourcePreviewAction", "isSourceCommitAction", "looksSecret", "safeDisplayPath", "kind", "text", "safeWarning", "formatEpoch", "ms", "formatted", "isPluginRequestError", "error", "isConflictError", "CONSUMED_PREVIEW_CODES", "isConsumedPreviewError", "cancelPreviewTicket", "previewId", "keepalive", "jsonRequest", "path", "method", "body", "response", "record", "message", "code", "parseSource", "reasonRaw", "expiresAt", "mergeSources", "discovered", "entry", "parseSources", "rows", "parsePreview", "kindRaw", "conflictRaw", "actionRaw", "ticketExpiresAt", "warnings", "parseCommitAction", "action", "boundedInteger", "min", "max", "fallback", "emptyCapabilitySettings", "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", "formatGatewayBaseUrl", "GATEWAY_PORT_MIN", "GATEWAY_PORT_MAX", "GATEWAY_RANDOM_PORT_MIN", "GATEWAY_RANDOM_PORT_MAX", "GATEWAY_RANDOM_RESERVED", "randomGatewayPort", "exclude", "attempt", "span", "candidate", "parseGatewayPort", "copyText", "area", "ok", "parseImagineCredential", "configured", "writable", "imagineSourceLabel", "mapped", "methodLabel", "modelFields", "GrokBuildSettings", "t", "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", "setUsage", "usageError", "setUsageError", "usageLoading", "setUsageLoading", "imagine", "setImagine", "imagineError", "setImagineError", "gateway", "setGateway", "gatewayError", "setGatewayError", "gatewayBusy", "setGatewayBusy", "gatewayOnceKey", "setGatewayOnceKey", "gatewayKeyVisible", "setGatewayKeyVisible", "gatewayRotateConfirm", "setGatewayRotateConfirm", "gatewayRevealError", "setGatewayRevealError", "portDraft", "setPortDraft", "activeTab", "setActiveTab", "copiedField", "setCopiedField", "copyFailedField", "setCopyFailedField", "expandedProviders", "setExpandedProviders", "copiedTimerRef", "refresh", "refreshSources", "refreshCapabilities", "parsed", "refreshGateway", "refreshImagine", "refreshUsage", "active", "provider", "timer", "signedIn", "signIn", "popup", "current", "challenge", "submitCode", "cancelLogin", "signOut", "saveModels", "selected", "previewSource", "epoch", "previous", "next", "commitSource", "result", "cancelSourcePreview", "patchCapability", "key", "patch", "updated", "showUsage", "markCopied", "field", "handleCopy", "copyLabel", "idle", "ensureGatewayKey", "copyGatewayKey", "toggleGatewayKeyVisible", "applyGatewayPort", "rotateGatewayKey", "tab", "definition", "providerStatus", "grokProviderStatus", "busy", "statusLabel", "activeMethod", "available", "localCode", "expanded", "usagePercent", "event", "checked", "warning", "item", "imagesOff", "disabled", "displayValue", "inputId", "target", "apiValue", "saved", "enabled", "en", "zh", "name", "inject", "apply", "ctx", "namespace", "zh", "en", "t", "GrokBuildSettings"]
7
+ }
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Shared ChatGPT Codex backend HTTP client.
3
+ *
4
+ * Token and account identity are injected by the plugin-owned OAuth resolver.
5
+ * The JWT `chatgpt_account_id` claim is used in full (never truncated).
6
+ * Status policy: 401 invalidate+refresh once; 403 entitlement; 429 rate;
7
+ * limited 5xx/transport retries. Only private chatgpt.com backend-api URLs.
8
+ *
9
+ * @module dsh-coding-subscription-oauth/codex-http
10
+ */
11
+ /** First-party ChatGPT host for every Codex optional-capability request. */
12
+ export declare const CODEX_CHATGPT_ORIGIN = "https://chatgpt.com";
13
+ /** Path prefix that every Codex backend URL must stay under. */
14
+ export declare const CODEX_BACKEND_API_PREFIX = "/backend-api/";
15
+ export declare const DEFAULT_CODEX_REQUEST_TIMEOUT_MS = 60000;
16
+ export type CodexHttpMethod = "GET" | "POST";
17
+ /** One resolved Codex access token plus the full ChatGPT account id. */
18
+ export interface CodexAccess {
19
+ readonly accessToken: string;
20
+ readonly accountId: string;
21
+ }
22
+ /**
23
+ * Plugin-owned OAuth seam. Parent typically wraps `OAuthProviderSession`:
24
+ * `resolve` calls `resolveAccessToken()` (which refreshes under the store lock);
25
+ * `invalidate` calls `invalidateAccessToken()` after an upstream 401.
26
+ */
27
+ export interface CodexAuthSession {
28
+ resolve(): Promise<{
29
+ accessToken: string;
30
+ accountId?: string;
31
+ } | undefined>;
32
+ invalidate(): Promise<void>;
33
+ }
34
+ export interface CodexHttpRequest {
35
+ readonly url: string;
36
+ readonly method?: CodexHttpMethod;
37
+ readonly body?: unknown;
38
+ readonly headers?: Readonly<Record<string, string>>;
39
+ readonly signal?: AbortSignal;
40
+ readonly maxBytes?: number;
41
+ /** Skip the one-shot 401 invalidate/refresh (used by the retry itself). */
42
+ readonly skipAuthRetry?: boolean;
43
+ }
44
+ /** Injected fetch. Tests must pass a mock; production defaults to global fetch. */
45
+ export type CodexFetch = (input: string, init?: RequestInit) => Promise<Response>;
46
+ export interface CodexHttpClientOptions {
47
+ readonly auth: CodexAuthSession;
48
+ readonly fetchImpl?: CodexFetch;
49
+ readonly originator?: string;
50
+ readonly userAgent?: string;
51
+ readonly now?: () => number;
52
+ readonly sleep?: (ms: number, signal?: AbortSignal) => Promise<void>;
53
+ readonly maxServerRetries?: number;
54
+ /** Per-attempt wall-clock ceiling, including response-body streaming. */
55
+ readonly requestTimeoutMs?: number;
56
+ }
57
+ export interface CodexHttpClient {
58
+ requestJson(request: CodexHttpRequest): Promise<unknown>;
59
+ resolveAccess(): Promise<CodexAccess>;
60
+ }
61
+ /** Adapt an `OAuthProviderSession`-shaped object without importing that class. */
62
+ export declare function codexAuthFromSession(session: {
63
+ resolveAccessToken(): Promise<string | undefined>;
64
+ invalidateAccessToken(): Promise<void>;
65
+ }): CodexAuthSession;
66
+ export declare function isRecord(value: unknown): value is Record<string, unknown>;
67
+ export declare function optionalNonEmptyString(value: unknown): string | undefined;
68
+ /** Decode the full ChatGPT account id from a Codex access JWT. Never truncates. */
69
+ export declare function chatgptAccountIdFromAccessToken(accessToken: string): string | undefined;
70
+ /** Reject anything that is not a first-party ChatGPT backend-api URL. */
71
+ export declare function assertCodexBackendUrl(url: string): URL;
72
+ export declare function parseRetryAfterMs(value: string | null, now: () => number): number | undefined;
73
+ /** Redact every provider error body through {@link safeMessage}. */
74
+ export declare function providerDetail(value: unknown): string | undefined;
75
+ /** Create a ChatGPT-backend-only client with injected OAuth resolve/invalidate. */
76
+ export declare function createCodexHttpClient(options: CodexHttpClientOptions): CodexHttpClient;
77
+ //# sourceMappingURL=codex-http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-http.d.ts","sourceRoot":"","sources":["../../src/codex-http.ts"],"names":[],"mappings":"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"}