dsh-coding-subscription-oauth 0.6.2 → 0.6.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +51 -27
- package/CONTRIBUTING.md +17 -8
- package/INSTALL.md +45 -44
- package/README.de.md +20 -20
- package/README.es.md +20 -20
- package/README.fr.md +20 -20
- package/README.ja.md +20 -20
- package/README.ko.md +20 -20
- package/README.md +23 -23
- package/README.pt-BR.md +20 -20
- package/README.ru.md +20 -20
- package/README.zh-CN.md +23 -23
- package/compatibility/dsh-bom.json +30 -30
- package/docs/00-project-rules.md +17 -0
- package/docs/02-architecture.md +11 -11
- package/docs/02-architecture.zh-CN.md +11 -11
- package/lib/bin.js +1333 -569
- package/lib/bin.js.map +4 -4
- package/lib/capability-settings.d.ts +8 -2
- package/lib/capability-settings.d.ts.map +1 -1
- package/lib/capability-tools.d.ts +7 -2
- package/lib/capability-tools.d.ts.map +1 -1
- package/lib/client.js +3 -3
- package/lib/client.js.map +3 -3
- package/lib/codex-images.d.ts +8 -0
- package/lib/codex-images.d.ts.map +1 -1
- package/lib/index.js +721 -25499
- package/lib/index.js.map +4 -4
- package/package.json +77 -77
- package/src/adapter.ts +75 -75
- package/src/alias-adapter.ts +17 -17
- package/src/capability-runtime.ts +1 -0
- package/src/capability-settings.ts +14 -1
- package/src/capability-tools.ts +23 -4
- package/src/client/GrokBuildSettings.tsx +3 -2
- package/src/client/constants.ts +7 -1
- package/src/client/locales.ts +5 -0
- package/src/client/parsers.ts +2 -0
- package/src/client/types.ts +2 -0
- package/src/codex-images.ts +19 -1
- package/src/compatibility.ts +14 -14
- package/src/index.ts +26 -26
package/lib/client.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../src/client/index.tsx", "../../src/client/dshClientAdapter.ts", "../../src/client/GrokBuildSettings.tsx", "../../node_modules/.pnpm/dsh-coding-oauth-core@0.1.
|
|
4
|
-
"sourcesContent": ["/** Browser half: coding-subscription account management inside dsh Settings. */\r\n\r\nimport type {} from \"@deepseek-ai/dsh-client-locale/client\";\r\nimport type { ClientContext } from \"@deepseek-ai/dsh-client-runtime/client\";\r\nimport type {} from \"@deepseek-ai/dsh-client-ui-settings/client\";\r\nimport type {} from \"@deepseek-ai/dsh-client-ui-slots\";\r\nimport { useEffect, useRef, useState } from \"react\";\r\nimport { createRoot } from \"react-dom/client\";\r\nimport { createDshClientAdapter } from \"./dshClientAdapter.ts\";\r\nimport type { GrokBuildSettingsInjected } from \"./GrokBuildSettings.tsx\";\r\nimport { GrokBuildSettings } from \"./GrokBuildSettings.tsx\";\r\nimport type { GrokBuildSettingsKey } from \"./locales.ts\";\r\nimport { en, zh } from \"./locales.ts\";\r\n\r\ndeclare module \"@deepseek-ai/dsh-client-ui-slots\" {\r\n\tinterface LocaleNamespaceMap {\r\n\t\t\"settings.grok-build\": GrokBuildSettingsKey;\r\n\t}\r\n}\r\n\r\nexport const name = \"dsh-grok-build-client\";\r\nexport const inject = [\"locale\"];\r\n\r\nfunction IndependentSettingsEntry({ t }: { readonly t: GrokBuildSettingsInjected[\"t\"] }) {\r\n\tconst [open, setOpen] = useState(false);\r\n\tconst trigger = useRef<HTMLButtonElement>(null);\r\n\tconst closeButton = useRef<HTMLButtonElement>(null);\r\n\tconst dialog = useRef<HTMLDivElement>(null);\r\n\tuseEffect(() => {\r\n\t\tif (!open) return;\r\n\t\tcloseButton.current?.focus();\r\n\t\tconst host = dialog.current?.closest(\"[data-dsh-coding-oauth]\")?.parentElement;\r\n\t\tconst inertSiblings =\r\n\t\t\thost === undefined || host === null\r\n\t\t\t\t? []\r\n\t\t\t\t: [...document.body.children]\r\n\t\t\t\t\t\t.filter((element) => element !== host)\r\n\t\t\t\t\t\t.map((element) => ({\r\n\t\t\t\t\t\t\telement,\r\n\t\t\t\t\t\t\thadInert: element.hasAttribute(\"inert\"),\r\n\t\t\t\t\t\t\tvalue: element.getAttribute(\"inert\"),\r\n\t\t\t\t\t\t}));\r\n\t\tfor (const { element } of inertSiblings) element.setAttribute(\"inert\", \"\");\r\n\t\tconst focusable = (): HTMLElement[] =>\r\n\t\t\t[\r\n\t\t\t\t...(dialog.current?.querySelectorAll<HTMLElement>(\r\n\t\t\t\t\t'button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])',\r\n\t\t\t\t) ?? []),\r\n\t\t\t].filter((element) => element.getClientRects().length > 0);\r\n\t\tconst closeOnEscape = (event: KeyboardEvent): void => {\r\n\t\t\tif (event.key === \"Escape\") setOpen(false);\r\n\t\t\tif (event.key !== \"Tab\") return;\r\n\t\t\tconst targets = focusable();\r\n\t\t\tif (targets.length === 0) {\r\n\t\t\t\tevent.preventDefault();\r\n\t\t\t\tdialog.current?.focus();\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tconst first = targets[0]!;\r\n\t\t\tconst last = targets.at(-1)!;\r\n\t\t\tif (event.shiftKey && document.activeElement === first) {\r\n\t\t\t\tevent.preventDefault();\r\n\t\t\t\tlast.focus();\r\n\t\t\t} else if (!event.shiftKey && document.activeElement === last) {\r\n\t\t\t\tevent.preventDefault();\r\n\t\t\t\tfirst.focus();\r\n\t\t\t}\r\n\t\t};\r\n\t\tdocument.addEventListener(\"keydown\", closeOnEscape);\r\n\t\treturn () => {\r\n\t\t\tdocument.removeEventListener(\"keydown\", closeOnEscape);\r\n\t\t\tfor (const { element, hadInert, value } of inertSiblings) {\r\n\t\t\t\tif (hadInert) element.setAttribute(\"inert\", value ?? \"\");\r\n\t\t\t\telse element.removeAttribute(\"inert\");\r\n\t\t\t}\r\n\t\t\tif (trigger.current?.isConnected) trigger.current.focus();\r\n\t\t};\r\n\t}, [open]);\r\n\treturn (\r\n\t\t<div data-dsh-coding-oauth>\r\n\t\t\t<button\r\n\t\t\t\tref={trigger}\r\n\t\t\t\ttype=\"button\"\r\n\t\t\t\tstyle={{ position: \"fixed\", right: 16, bottom: 16, zIndex: 30, padding: \"10px 14px\" }}\r\n\t\t\t\tonClick={() => setOpen(true)}\r\n\t\t\t>\r\n\t\t\t\t{t(\"nav\")}\r\n\t\t\t</button>\r\n\t\t\t{open ? (\r\n\t\t\t\t<div\r\n\t\t\t\t\tref={dialog}\r\n\t\t\t\t\trole=\"dialog\"\r\n\t\t\t\t\taria-modal=\"true\"\r\n\t\t\t\t\taria-labelledby=\"coding-oauth-independent-title\"\r\n\t\t\t\t\ttabIndex={-1}\r\n\t\t\t\t\tstyle={{\r\n\t\t\t\t\t\tposition: \"fixed\",\r\n\t\t\t\t\t\tinset: 0,\r\n\t\t\t\t\t\tzIndex: 31,\r\n\t\t\t\t\t\toverflow: \"auto\",\r\n\t\t\t\t\t\tpadding: 20,\r\n\t\t\t\t\t\tbackground: \"var(--dsw-alias-bg-layer-1)\",\r\n\t\t\t\t\t}}\r\n\t\t\t\t>\r\n\t\t\t\t\t<div style={{ width: \"min(780px, 100%)\", margin: \"0 auto\" }}>\r\n\t\t\t\t\t\t<div style={{ display: \"flex\", justifyContent: \"space-between\", gap: 12, marginBottom: 12 }}>\r\n\t\t\t\t\t\t\t<h2 id=\"coding-oauth-independent-title\" style={{ margin: 0 }}>\r\n\t\t\t\t\t\t\t\t{t(\"title\")}\r\n\t\t\t\t\t\t\t</h2>\r\n\t\t\t\t\t\t\t<button ref={closeButton} type=\"button\" onClick={() => setOpen(false)} aria-label={t(\"cancel\")}>\r\n\t\t\t\t\t\t\t\t\u00D7\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t<GrokBuildSettings t={t} />\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t) : null}\r\n\t\t</div>\r\n\t);\r\n}\r\n\r\nfunction mountIndependentEntry(t: GrokBuildSettingsInjected[\"t\"]): () => void {\r\n\tif (typeof document === \"undefined\") return () => undefined;\r\n\tconst host = document.createElement(\"div\");\r\n\tdocument.body.append(host);\r\n\tconst root = createRoot(host);\r\n\troot.render(<IndependentSettingsEntry t={t} />);\r\n\treturn () => {\r\n\t\troot.unmount();\r\n\t\thost.remove();\r\n\t};\r\n}\r\n\r\nexport function apply(ctx: ClientContext): void {\r\n\tconst dsh = createDshClientAdapter(ctx);\r\n\tdsh.assertCompatible();\r\n\tconst namespace = \"settings.grok-build\";\r\n\tdsh.effect(() => dsh.locale.register(namespace, { zh, en }), \"dsh-coding-subscription-oauth: settings copy\");\r\n\tconst t = dsh.locale.bind(namespace) as GrokBuildSettingsInjected[\"t\"];\r\n\tdsh.installSlots({\r\n\t\tmountFallback: () => mountIndependentEntry(t),\r\n\t\tregister: (slots) =>\r\n\t\t\tslots.inject(\"settings.section\", () =>\r\n\t\t\t\tslots.register(\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tname: \"settings.section\",\r\n\t\t\t\t\t\tid: \"grok-build\",\r\n\t\t\t\t\t\torder: 17,\r\n\t\t\t\t\t\tlabel: () => t(\"nav\"),\r\n\t\t\t\t\t\tinject: (): GrokBuildSettingsInjected => ({ t }),\r\n\t\t\t\t\t},\r\n\t\t\t\t\tGrokBuildSettings,\r\n\t\t\t\t),\r\n\t\t\t),\r\n\t});\r\n}\r\n", "/** Capability adapter for the unstable DSH browser client surface. */\r\n\r\nimport type {} from \"@deepseek-ai/dsh-client-locale/client\";\r\nimport type { ClientContext } from \"@deepseek-ai/dsh-client-runtime/client\";\r\nimport type {} from \"@deepseek-ai/dsh-client-ui-slots\";\r\n\r\nexport interface DshClientCompatibilityDiagnostic {\r\n\treadonly id: string;\r\n\treadonly level: \"warning\" | \"error\";\r\n\treadonly message: string;\r\n\treadonly expected: \"function\";\r\n\treadonly actual: string;\r\n}\r\n\r\ntype SlotsApi = ClientContext[\"slots\"];\r\n\r\nfunction slotsOf(context: unknown): SlotsApi | undefined {\r\n\tif (typeof context !== \"object\" || context === null) return undefined;\r\n\tlet slots: unknown;\r\n\ttry {\r\n\t\tconst get = (context as { readonly get?: unknown }).get;\r\n\t\tif (typeof get === \"function\") slots = get.call(context, \"slots\");\r\n\t} catch {\r\n\t\t// Older client runtimes may not expose the Cordis reflection helper.\r\n\t}\r\n\tif (slots === undefined) {\r\n\t\ttry {\r\n\t\t\tslots = (context as { readonly slots?: unknown }).slots;\r\n\t\t} catch {\r\n\t\t\t// Strict Cordis rejects optional service reads outside an inject scope.\r\n\t\t}\r\n\t}\r\n\tif (\r\n\t\ttypeof slots === \"object\" &&\r\n\t\tslots !== null &&\r\n\t\ttypeof (slots as { readonly inject?: unknown }).inject === \"function\" &&\r\n\t\ttypeof (slots as { readonly register?: unknown }).register === \"function\"\r\n\t)\r\n\t\treturn slots as SlotsApi;\r\n\treturn undefined;\r\n}\r\n\r\nexport interface DshClientAdapter {\r\n\treadonly context: ClientContext;\r\n\treadonly locale: ClientContext[\"locale\"];\r\n\treadonly effect: ClientContext[\"effect\"];\r\n\tdiagnostics(): readonly DshClientCompatibilityDiagnostic[];\r\n\tassertCompatible(): void;\r\n\tinstallSlots(options: {\r\n\t\treadonly register: (slots: SlotsApi) => () => void;\r\n\t\treadonly mountFallback: () => () => void;\r\n\t}): void;\r\n}\r\n\r\ntype InstallSlotsOptions = Parameters<DshClientAdapter[\"installSlots\"]>[0];\r\n\r\nexport function createDshClientAdapter(context: ClientContext): DshClientAdapter {\r\n\tconst candidate = context as unknown as Record<string, unknown>;\r\n\tconst locale = candidate[\"locale\"] as Record<string, unknown> | undefined;\r\n\tconst slots = slotsOf(context);\r\n\tconst checks: Array<[string, unknown, DshClientCompatibilityDiagnostic[\"level\"]]> = [\r\n\t\t[\"client.effect\", candidate[\"effect\"], \"error\"],\r\n\t\t[\"client.locale.register\", locale?.[\"register\"], \"error\"],\r\n\t\t[\"client.locale.bind\", locale?.[\"bind\"], \"error\"],\r\n\t\t[\"client.slots.inject\", slots?.inject, \"warning\"],\r\n\t];\r\n\tconst diagnostics = checks.flatMap(([id, value, level]): DshClientCompatibilityDiagnostic[] =>\r\n\t\ttypeof value === \"function\"\r\n\t\t\t? []\r\n\t\t\t: [\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tid,\r\n\t\t\t\t\t\tlevel,\r\n\t\t\t\t\t\tmessage:\r\n\t\t\t\t\t\t\tlevel === \"warning\"\r\n\t\t\t\t\t\t\t\t? `${id} is unavailable; the independent settings entry remains active`\r\n\t\t\t\t\t\t\t\t: `${id} is unavailable in the DSH client runtime`,\r\n\t\t\t\t\t\texpected: \"function\",\r\n\t\t\t\t\t\tactual: typeof value,\r\n\t\t\t\t\t},\r\n\t\t\t\t],\r\n\t);\r\n\tconst frozenDiagnostics = Object.freeze([...diagnostics]);\r\n\treturn Object.freeze({\r\n\t\tcontext,\r\n\t\tlocale: context.locale,\r\n\t\teffect: context.effect,\r\n\t\tdiagnostics: () => frozenDiagnostics,\r\n\t\tassertCompatible() {\r\n\t\t\tconst errors = diagnostics.filter((item) => item.level === \"error\");\r\n\t\t\tif (errors.length > 0) {\r\n\t\t\t\tthrow new Error(`incompatible DSH client API: ${errors.map((item) => item.id).join(\", \")}`);\r\n\t\t\t}\r\n\t\t},\r\n\t\tinstallSlots(options: InstallSlotsOptions) {\r\n\t\t\tlet disposed = false;\r\n\t\t\tlet installed = false;\r\n\t\t\tlet disposeCurrent: () => void = () => undefined;\r\n\t\t\tconst install = (slotContext: ClientContext): boolean => {\r\n\t\t\t\tconst slots = slotsOf(slotContext);\r\n\t\t\t\tif (disposed || installed || slots === undefined) return false;\r\n\t\t\t\tinstalled = true;\r\n\t\t\t\tdisposeCurrent();\r\n\t\t\t\tdisposeCurrent = options.register(slots);\r\n\t\t\t\treturn true;\r\n\t\t\t};\r\n\r\n\t\t\tif (!install(context)) {\r\n\t\t\t\tdisposeCurrent = options.mountFallback();\r\n\t\t\t\tconst inject = candidate[\"inject\"];\r\n\t\t\t\tif (typeof inject === \"function\") {\r\n\t\t\t\t\t(inject as ClientContext[\"inject\"]).call(context, [\"slots\"], (slotContext) => {\r\n\t\t\t\t\t\tinstall(slotContext);\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tcontext.effect(\r\n\t\t\t\t() => () => {\r\n\t\t\t\t\tdisposed = true;\r\n\t\t\t\t\tdisposeCurrent();\r\n\t\t\t\t},\r\n\t\t\t\t\"dsh-coding-subscription-oauth: independent settings entry\",\r\n\t\t\t);\r\n\t\t},\r\n\t});\r\n}\r\n", "/** Plugin-owned coding subscription account section inside the dsh Settings shell. */\r\n\r\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\r\nimport { cancelPreviewTicket, copyText, isConflictError, isConsumedPreviewError, jsonRequest } from \"./api.ts\";\r\nimport { AboutTab } from \"./components/AboutTab.tsx\";\r\nimport { AccountsTab } from \"./components/AccountsTab.tsx\";\r\nimport { CapabilitiesTab } from \"./components/CapabilitiesTab.tsx\";\r\nimport { GatewayTab } from \"./components/GatewayTab.tsx\";\r\nimport type { SettingsTabHint } from \"./components/SettingsTabs.tsx\";\r\nimport { SettingsTabs } from \"./components/SettingsTabs.tsx\";\r\nimport {\r\n\tCAPABILITIES_PATH,\r\n\tCODEX_USAGE_PATH,\r\n\tGATEWAY_PATH,\r\n\tGATEWAY_REVEAL_PATH,\r\n\tGATEWAY_ROTATE_PATH,\r\n\tIMAGINE_CREDENTIAL_PATH,\r\n\tLOGIN_CANCEL_PATH,\r\n\tLOGIN_CODE_PATH,\r\n\tLOGIN_PATH,\r\n\tLOGOUT_PATH,\r\n\tMODELS_PATH,\r\n\tPOLL_INTERVAL_MS,\r\n\tSOURCE_COMMIT_ACTION_KEY,\r\n\tSOURCES_CANCEL_PATH,\r\n\tSOURCES_COMMIT_PATH,\r\n\tSOURCES_PATH,\r\n\tSOURCES_PREVIEW_PATH,\r\n\tSTATUS_PATH,\r\n} from \"./constants.ts\";\r\nimport { ensureMicroStyles } from \"./microStyles.ts\";\r\nimport {\r\n\temptyCapabilitySettings,\r\n\tmergeSources,\r\n\tparseCapabilities,\r\n\tparseCommitAction,\r\n\tparseGateway,\r\n\tparseGatewayPort,\r\n\tparseImagineCredential,\r\n\tparsePreview,\r\n\tparseSources,\r\n\tparseUsage,\r\n} from \"./parsers.ts\";\r\nimport { bodyStyle, buttonStyle, errorStyle, pageStyle, panelStyle, titleStyle } from \"./styles.ts\";\r\nimport type {\r\n\tCapabilitySettingKey,\r\n\tCapabilitySettingsView,\r\n\tCapabilitySnapshot,\r\n\tCodingOAuthStatus,\r\n\tCopyField,\r\n\tGatewayView,\r\n\tGrokBuildSettingsProps,\r\n\tImagineCredentialView,\r\n\tLoginChallenge,\r\n\tLoginMethod,\r\n\tProviderSlug,\r\n\tSettingsTabId,\r\n\tSourceKind,\r\n\tSourcePreview,\r\n\tSourceStatus,\r\n\tUsageView,\r\n} from \"./types.ts\";\r\n\r\nexport type { GrokBuildSettingsInjected, GrokBuildSettingsProps } from \"./types.ts\";\r\n\r\nconst REMOTE_TIP_STORAGE_KEY = \"dsh-coding-oauth-remote-tip-dismissed\";\r\n\r\nfunction readRemoteTipDismissed(): boolean {\r\n\ttry {\r\n\t\treturn globalThis.sessionStorage?.getItem(REMOTE_TIP_STORAGE_KEY) === \"1\";\r\n\t} catch {\r\n\t\treturn false;\r\n\t}\r\n}\r\n\r\n/** Multi-provider coding subscription status and OAuth actions. */\r\nexport function GrokBuildSettings({ t }: GrokBuildSettingsProps) {\r\n\tif (t === undefined) throw new Error(\"Coding OAuth settings requires its translation function\");\r\n\r\n\tconst [status, setStatus] = useState<CodingOAuthStatus | undefined>(undefined);\r\n\tconst [requestError, setRequestError] = useState<string | undefined>(undefined);\r\n\tconst [busyProvider, setBusyProvider] = useState<ProviderSlug | undefined>(undefined);\r\n\tconst [codeInputs, setCodeInputs] = useState<Partial<Record<ProviderSlug, string>>>({});\r\n\tconst [popupBlocked, setPopupBlocked] = useState<Partial<Record<ProviderSlug, boolean>>>({});\r\n\tconst [sources, setSources] = useState<SourceStatus[] | undefined>(undefined);\r\n\tconst [sourcesError, setSourcesError] = useState<string | undefined>(undefined);\r\n\tconst [sourcesBusy, setSourcesBusy] = useState(false);\r\n\tconst [preview, setPreview] = useState<SourcePreview | undefined>(undefined);\r\n\tconst previewRef = useRef<SourcePreview | undefined>(undefined);\r\n\tconst previewEpochRef = useRef(0);\r\n\tconst mountedRef = useRef(true);\r\n\tconst [confirmOverwrite, setConfirmOverwrite] = useState(false);\r\n\tconst [sourcesNotice, setSourcesNotice] = useState<string | undefined>(undefined);\r\n\tconst [capabilities, setCapabilities] = useState<CapabilitySnapshot | undefined>(undefined);\r\n\tconst [capabilitiesError, setCapabilitiesError] = useState<string | undefined>(undefined);\r\n\tconst [capabilitiesBusy, setCapabilitiesBusy] = useState(false);\r\n\tconst [capabilitiesLoaded, setCapabilitiesLoaded] = useState(false);\r\n\tconst [usage, setUsage] = useState<UsageView | undefined>(undefined);\r\n\tconst [usageError, setUsageError] = useState<string | undefined>(undefined);\r\n\tconst [usageLoading, setUsageLoading] = useState(false);\r\n\tconst [imagine, setImagine] = useState<ImagineCredentialView | undefined>(undefined);\r\n\tconst [imagineError, setImagineError] = useState<string | undefined>(undefined);\r\n\tconst [gateway, setGateway] = useState<GatewayView | undefined>(undefined);\r\n\tconst [gatewayError, setGatewayError] = useState<string | undefined>(undefined);\r\n\tconst [gatewayBusy, setGatewayBusy] = useState(false);\r\n\tconst [gatewayLoaded, setGatewayLoaded] = useState(false);\r\n\tconst [gatewayOnceKey, setGatewayOnceKey] = useState<string | undefined>(undefined);\r\n\tconst [gatewayKeyVisible, setGatewayKeyVisible] = useState(false);\r\n\tconst [gatewayRotateConfirm, setGatewayRotateConfirm] = useState(false);\r\n\tconst [gatewayRevealError, setGatewayRevealError] = useState<string | undefined>(undefined);\r\n\tconst [portDraft, setPortDraft] = useState(\"\");\r\n\tconst [activeTab, setActiveTab] = useState<SettingsTabId>(\"accounts\");\r\n\tconst [copiedField, setCopiedField] = useState<CopyField | undefined>(undefined);\r\n\tconst [copyFailedField, setCopyFailedField] = useState<CopyField | undefined>(undefined);\r\n\tconst [expandedProviders, setExpandedProviders] = useState<Partial<Record<ProviderSlug, boolean>>>({});\r\n\tconst [remoteTipDismissed, setRemoteTipDismissed] = useState(readRemoteTipDismissed);\r\n\tconst copiedTimerRef = useRef<number | undefined>(undefined);\r\n\tconst remote = status?.accessMode === \"ssh-tunnel\" || status?.accessMode === \"trusted-https-proxy\";\r\n\r\n\tconst refresh = useCallback(async () => {\r\n\t\ttry {\r\n\t\t\tconst next = await jsonRequest<CodingOAuthStatus>(STATUS_PATH);\r\n\t\t\tsetStatus(next);\r\n\t\t\tsetRequestError(undefined);\r\n\t\t\treturn next;\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetRequestError(error instanceof Error ? error.message : t(\"requestFailed\"));\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\t}, [t]);\r\n\r\n\tconst refreshSources = useCallback(async () => {\r\n\t\ttry {\r\n\t\t\tsetSources(parseSources(await jsonRequest<unknown>(SOURCES_PATH)));\r\n\t\t\tsetSourcesError(undefined);\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetSources(mergeSources([]));\r\n\t\t\tsetSourcesError(error instanceof Error ? error.message : t(\"sourcesLoadFailed\"));\r\n\t\t}\r\n\t}, [t]);\r\n\r\n\tconst refreshCapabilities = useCallback(async () => {\r\n\t\ttry {\r\n\t\t\tconst parsed = parseCapabilities(await jsonRequest<unknown>(CAPABILITIES_PATH));\r\n\t\t\tsetCapabilities(parsed ?? { value: emptyCapabilitySettings(), revision: 0, writable: false });\r\n\t\t\tsetCapabilitiesError(undefined);\r\n\t\t\treturn parsed;\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetCapabilities({ value: emptyCapabilitySettings(), revision: 0, writable: false });\r\n\t\t\tsetCapabilitiesError(error instanceof Error ? error.message : t(\"capabilitiesLoadFailed\"));\r\n\t\t\treturn undefined;\r\n\t\t} finally {\r\n\t\t\tsetCapabilitiesLoaded(true);\r\n\t\t}\r\n\t}, [t]);\r\n\r\n\tconst refreshGateway = useCallback(async () => {\r\n\t\ttry {\r\n\t\t\tsetGateway(parseGateway(await jsonRequest<unknown>(GATEWAY_PATH)));\r\n\t\t\tsetGatewayError(undefined);\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetGatewayError(error instanceof Error ? error.message : t(\"gatewayLoadFailed\"));\r\n\t\t} finally {\r\n\t\t\tsetGatewayLoaded(true);\r\n\t\t}\r\n\t}, [t]);\r\n\r\n\tconst refreshImagine = useCallback(async () => {\r\n\t\ttry {\r\n\t\t\tsetImagine(parseImagineCredential(await jsonRequest<unknown>(IMAGINE_CREDENTIAL_PATH)));\r\n\t\t\tsetImagineError(undefined);\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetImagineError(error instanceof Error ? error.message : t(\"imagineLoadFailed\"));\r\n\t\t}\r\n\t}, [t]);\r\n\r\n\tconst refreshUsage = useCallback(async () => {\r\n\t\tsetUsageLoading(true);\r\n\t\ttry {\r\n\t\t\tsetUsage(parseUsage(await jsonRequest<unknown>(CODEX_USAGE_PATH)));\r\n\t\t\tsetUsageError(undefined);\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetUsage(undefined);\r\n\t\t\tsetUsageError(error instanceof Error ? error.message : t(\"usageUnavailable\"));\r\n\t\t} finally {\r\n\t\t\tsetUsageLoading(false);\r\n\t\t}\r\n\t}, [t]);\r\n\r\n\t// Accounts: status immediately; sources shortly after (non-blocking for first paint).\r\n\tuseEffect(() => {\r\n\t\tensureMicroStyles();\r\n\t\tlet active = true;\r\n\t\tlet timer: number | undefined;\r\n\t\tvoid refresh().then((next) => {\r\n\t\t\tif (!active || next?.uiOwner === \"hub\") return;\r\n\t\t\ttimer = window.setTimeout(() => void refreshSources(), 0);\r\n\t\t});\r\n\t\treturn () => {\r\n\t\t\tactive = false;\r\n\t\t\tif (timer !== undefined) window.clearTimeout(timer);\r\n\t\t};\r\n\t}, [refresh, refreshSources]);\r\n\r\n\t// Capabilities tab: load settings + Imagine status on first visit.\r\n\tuseEffect(() => {\r\n\t\tif (activeTab !== \"capabilities\") return;\r\n\t\tif (!capabilitiesLoaded) void refreshCapabilities();\r\n\t\tvoid refreshImagine();\r\n\t}, [activeTab, capabilitiesLoaded, refreshCapabilities, refreshImagine]);\r\n\r\n\t// Soft-fetch capabilities when Codex is signed in so Accounts can show quota without opening the tab.\r\n\tuseEffect(() => {\r\n\t\tif (capabilitiesLoaded) return;\r\n\t\tif (status?.providers.codex.status !== \"signed-in\") return;\r\n\t\tvoid refreshCapabilities();\r\n\t}, [capabilitiesLoaded, refreshCapabilities, status?.providers.codex.status]);\r\n\r\n\t// Gateway: load only when that tab is opened.\r\n\tuseEffect(() => {\r\n\t\tif (activeTab !== \"gateway\" || gatewayLoaded) return;\r\n\t\tvoid refreshGateway();\r\n\t}, [activeTab, gatewayLoaded, refreshGateway]);\r\n\r\n\tuseEffect(() => {\r\n\t\tpreviewRef.current = preview;\r\n\t}, [preview]);\r\n\r\n\tuseEffect(() => {\r\n\t\tmountedRef.current = true;\r\n\t\treturn () => {\r\n\t\t\tmountedRef.current = false;\r\n\t\t\tif (copiedTimerRef.current !== undefined) window.clearTimeout(copiedTimerRef.current);\r\n\t\t\tpreviewEpochRef.current += 1;\r\n\t\t\tconst active = previewRef.current;\r\n\t\t\tif (active !== undefined) cancelPreviewTicket(active.previewId, true);\r\n\t\t};\r\n\t}, []);\r\n\r\n\tuseEffect(() => {\r\n\t\tconst signingIn =\r\n\t\t\tstatus !== undefined && Object.values(status.providers).some((provider) => provider.status === \"signing-in\");\r\n\t\tif (!signingIn) return;\r\n\t\tconst timer = window.setInterval(() => {\r\n\t\t\tvoid refresh();\r\n\t\t}, POLL_INTERVAL_MS);\r\n\t\treturn () => {\r\n\t\t\twindow.clearInterval(timer);\r\n\t\t};\r\n\t}, [refresh, status]);\r\n\r\n\tuseEffect(() => {\r\n\t\tconst signedIn = status?.providers.codex.status === \"signed-in\";\r\n\t\tif (capabilities?.value.codexUsage === true && signedIn) {\r\n\t\t\tvoid refreshUsage();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tsetUsage(undefined);\r\n\t\tsetUsageError(undefined);\r\n\t\tsetUsageLoading(false);\r\n\t}, [capabilities?.value.codexUsage, refreshUsage, status?.providers.codex.status]);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (gateway !== undefined) setPortDraft(String(gateway.port));\r\n\t}, [gateway]);\r\n\r\n\tconst signIn = async (provider: ProviderSlug, method: LoginMethod): Promise<void> => {\r\n\t\tconst popup = window.open(\"about:blank\", \"_blank\");\r\n\t\tif (popup !== null) popup.opener = null;\r\n\t\tsetBusyProvider(provider);\r\n\t\tsetRequestError(undefined);\r\n\t\tsetPopupBlocked((current) => ({ ...current, [provider]: popup === null }));\r\n\t\ttry {\r\n\t\t\tconst challenge = await jsonRequest<LoginChallenge>(LOGIN_PATH, \"POST\", { provider, method });\r\n\t\t\tif (popup !== null) popup.location.replace(challenge.url);\r\n\t\t\tawait refresh();\r\n\t\t} catch (error: unknown) {\r\n\t\t\tpopup?.close();\r\n\t\t\tsetRequestError(error instanceof Error ? error.message : t(\"requestFailed\"));\r\n\t\t\tawait refresh();\r\n\t\t} finally {\r\n\t\t\tsetBusyProvider(undefined);\r\n\t\t}\r\n\t};\r\n\r\n\tconst submitCode = async (provider: ProviderSlug): Promise<void> => {\r\n\t\tconst code = codeInputs[provider]?.trim() ?? \"\";\r\n\t\tif (code.length === 0) return;\r\n\t\tsetBusyProvider(provider);\r\n\t\ttry {\r\n\t\t\tawait jsonRequest<{ ok: true }>(LOGIN_CODE_PATH, \"POST\", { provider, code });\r\n\t\t\tsetCodeInputs((current) => ({ ...current, [provider]: \"\" }));\r\n\t\t\tawait refresh();\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetRequestError(error instanceof Error ? error.message : t(\"requestFailed\"));\r\n\t\t} finally {\r\n\t\t\tsetBusyProvider(undefined);\r\n\t\t}\r\n\t};\r\n\r\n\tconst cancelLogin = async (provider: ProviderSlug): Promise<void> => {\r\n\t\tsetBusyProvider(provider);\r\n\t\ttry {\r\n\t\t\tsetStatus(await jsonRequest<CodingOAuthStatus>(LOGIN_CANCEL_PATH, \"POST\", { provider }));\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetRequestError(error instanceof Error ? error.message : t(\"requestFailed\"));\r\n\t\t} finally {\r\n\t\t\tsetBusyProvider(undefined);\r\n\t\t}\r\n\t};\r\n\r\n\tconst signOut = async (provider: ProviderSlug): Promise<void> => {\r\n\t\tsetBusyProvider(provider);\r\n\t\ttry {\r\n\t\t\tsetStatus(await jsonRequest<CodingOAuthStatus>(LOGOUT_PATH, \"POST\", { provider }));\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetRequestError(error instanceof Error ? error.message : t(\"requestFailed\"));\r\n\t\t} finally {\r\n\t\t\tsetBusyProvider(undefined);\r\n\t\t}\r\n\t};\r\n\r\n\tconst saveModels = async (provider: ProviderSlug, selected: string[]): Promise<void> => {\r\n\t\tsetBusyProvider(provider);\r\n\t\ttry {\r\n\t\t\tsetStatus(await jsonRequest<CodingOAuthStatus>(MODELS_PATH, \"POST\", { provider, selected }));\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetRequestError(error instanceof Error ? error.message : t(\"requestFailed\"));\r\n\t\t} finally {\r\n\t\t\tsetBusyProvider(undefined);\r\n\t\t}\r\n\t};\r\n\r\n\tconst previewSource = async (kind: SourceKind): Promise<void> => {\r\n\t\tconst epoch = ++previewEpochRef.current;\r\n\t\tconst previous = previewRef.current;\r\n\t\tif (previous !== undefined) {\r\n\t\t\tpreviewRef.current = undefined;\r\n\t\t\tsetPreview(undefined);\r\n\t\t\tcancelPreviewTicket(previous.previewId);\r\n\t\t}\r\n\t\tsetSourcesBusy(true);\r\n\t\tsetSourcesNotice(undefined);\r\n\t\tsetConfirmOverwrite(false);\r\n\t\ttry {\r\n\t\t\tconst next = parsePreview(await jsonRequest<unknown>(SOURCES_PREVIEW_PATH, \"POST\", { kind }));\r\n\t\t\tif (next === undefined) throw new Error(t(\"sourcesPreviewFailed\"));\r\n\t\t\tif (!mountedRef.current || epoch !== previewEpochRef.current) {\r\n\t\t\t\tcancelPreviewTicket(next.previewId, !mountedRef.current);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tpreviewRef.current = next;\r\n\t\t\tsetPreview(next);\r\n\t\t\tsetSourcesError(undefined);\r\n\t\t} catch (error: unknown) {\r\n\t\t\tif (!mountedRef.current || epoch !== previewEpochRef.current) return;\r\n\t\t\tsetPreview(undefined);\r\n\t\t\tsetSourcesError(error instanceof Error ? error.message : t(\"sourcesPreviewFailed\"));\r\n\t\t} finally {\r\n\t\t\tif (mountedRef.current && epoch === previewEpochRef.current) setSourcesBusy(false);\r\n\t\t}\r\n\t};\r\n\r\n\tconst commitSource = async (): Promise<void> => {\r\n\t\tif (preview === undefined) return;\r\n\t\tif (preview.action === \"blocked\") return;\r\n\t\tif (preview.confirmOverwriteRequired && !confirmOverwrite) return;\r\n\t\tsetSourcesBusy(true);\r\n\t\ttry {\r\n\t\t\tconst result = await jsonRequest<unknown>(SOURCES_COMMIT_PATH, \"POST\", {\r\n\t\t\t\tkind: preview.kind,\r\n\t\t\t\tpreviewId: preview.previewId,\r\n\t\t\t\tconfirmOverwrite,\r\n\t\t\t});\r\n\t\t\tconst action = parseCommitAction(result);\r\n\t\t\tpreviewRef.current = undefined;\r\n\t\t\tsetPreview(undefined);\r\n\t\t\tsetConfirmOverwrite(false);\r\n\t\t\tsetSourcesNotice(\r\n\t\t\t\tt(\"sourcesCommitSuccess\", { action: action === undefined ? \"\" : t(SOURCE_COMMIT_ACTION_KEY[action]) }),\r\n\t\t\t);\r\n\t\t\tsetSourcesError(undefined);\r\n\t\t\tawait refreshSources();\r\n\t\t\tawait refresh();\r\n\t\t} catch (error: unknown) {\r\n\t\t\tif (isConsumedPreviewError(error)) {\r\n\t\t\t\tpreviewRef.current = undefined;\r\n\t\t\t\tsetPreview(undefined);\r\n\t\t\t\tsetConfirmOverwrite(false);\r\n\t\t\t}\r\n\t\t\tsetSourcesError(error instanceof Error ? error.message : t(\"sourcesCommitFailed\"));\r\n\t\t\tawait refreshSources();\r\n\t\t} finally {\r\n\t\t\tsetSourcesBusy(false);\r\n\t\t}\r\n\t};\r\n\r\n\tconst cancelSourcePreview = async (): Promise<void> => {\r\n\t\tif (preview === undefined) return;\r\n\t\tconst previewId = preview.previewId;\r\n\t\tpreviewEpochRef.current += 1;\r\n\t\tpreviewRef.current = undefined;\r\n\t\tsetPreview(undefined);\r\n\t\tsetConfirmOverwrite(false);\r\n\t\tsetSourcesBusy(true);\r\n\t\ttry {\r\n\t\t\tawait jsonRequest<unknown>(SOURCES_CANCEL_PATH, \"POST\", { previewId });\r\n\t\t\tsetSourcesError(undefined);\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetSourcesError(error instanceof Error ? error.message : t(\"requestFailed\"));\r\n\t\t} finally {\r\n\t\t\tsetSourcesBusy(false);\r\n\t\t}\r\n\t};\r\n\r\n\tconst patchCapability = async (key: CapabilitySettingKey, value: boolean | number): Promise<boolean> => {\r\n\t\tif (capabilities === undefined || !capabilities.writable) return false;\r\n\t\tif (key === \"codexImageEdits\" && value === true && !capabilities.value.codexImages) return false;\r\n\t\tconst patch: Partial<CapabilitySettingsView> =\r\n\t\t\tkey === \"codexImages\" && value === false && capabilities.value.codexImageEdits\r\n\t\t\t\t? { codexImages: false, codexImageEdits: false }\r\n\t\t\t\t: ({ [key]: value } as Partial<CapabilitySettingsView>);\r\n\t\tsetCapabilitiesBusy(true);\r\n\t\ttry {\r\n\t\t\tconst updated = parseCapabilities(\r\n\t\t\t\tawait jsonRequest<unknown>(CAPABILITIES_PATH, \"PATCH\", {\r\n\t\t\t\t\texpectedRevision: capabilities.revision,\r\n\t\t\t\t\tpatch,\r\n\t\t\t\t}),\r\n\t\t\t);\r\n\t\t\tif (updated !== undefined) setCapabilities(updated);\r\n\t\t\telse await refreshCapabilities();\r\n\t\t\tsetCapabilitiesError(undefined);\r\n\t\t\treturn true;\r\n\t\t} catch (error: unknown) {\r\n\t\t\tawait refreshCapabilities();\r\n\t\t\tsetCapabilitiesError(\r\n\t\t\t\tisConflictError(error)\r\n\t\t\t\t\t? t(\"capabilitiesConflictRefreshed\")\r\n\t\t\t\t\t: error instanceof Error\r\n\t\t\t\t\t\t? error.message\r\n\t\t\t\t\t\t: t(\"capabilitiesSaveFailed\"),\r\n\t\t\t);\r\n\t\t\treturn false;\r\n\t\t} finally {\r\n\t\t\tsetCapabilitiesBusy(false);\r\n\t\t}\r\n\t};\r\n\r\n\tconst showUsage = capabilities?.value.codexUsage === true && status?.providers.codex.status === \"signed-in\";\r\n\tconst signedInCount =\r\n\t\tstatus === undefined\r\n\t\t\t? 0\r\n\t\t\t: Object.values(status.providers).filter((provider) => provider.status === \"signed-in\").length;\r\n\r\n\tconst tabHints = useMemo((): readonly SettingsTabHint[] => {\r\n\t\tconst hints: SettingsTabHint[] = [];\r\n\t\tif (status !== undefined) {\r\n\t\t\tconst signedInCount = Object.values(status.providers).filter(\r\n\t\t\t\t(provider) => provider.status === \"signed-in\",\r\n\t\t\t).length;\r\n\t\t\tif (signedInCount > 0) {\r\n\t\t\t\thints.push({ id: \"accounts\", suffix: String(signedInCount) });\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (gateway?.running === true) {\r\n\t\t\thints.push({ id: \"gateway\", suffix: t(\"tabGatewayActive\") });\r\n\t\t}\r\n\t\treturn hints;\r\n\t}, [gateway?.running, status, t]);\r\n\r\n\tconst markCopied = (field: CopyField): void => {\r\n\t\tif (copiedTimerRef.current !== undefined) window.clearTimeout(copiedTimerRef.current);\r\n\t\tsetCopiedField(field);\r\n\t\tsetCopyFailedField(undefined);\r\n\t\tcopiedTimerRef.current = window.setTimeout(() => {\r\n\t\t\tif (mountedRef.current) {\r\n\t\t\t\tsetCopiedField(undefined);\r\n\t\t\t\tsetCopyFailedField(undefined);\r\n\t\t\t}\r\n\t\t\tcopiedTimerRef.current = undefined;\r\n\t\t}, 2000);\r\n\t};\r\n\r\n\tconst handleCopy = async (field: CopyField, text: string): Promise<void> => {\r\n\t\tconst ok = await copyText(text);\r\n\t\tif (ok) {\r\n\t\t\tmarkCopied(field);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tsetCopiedField(undefined);\r\n\t\tsetCopyFailedField(field);\r\n\t};\r\n\r\n\tconst ensureGatewayKey = async (): Promise<string> => {\r\n\t\tif (gatewayOnceKey !== undefined) return gatewayOnceKey;\r\n\t\tconst value = await jsonRequest<{ apiKey?: string }>(GATEWAY_REVEAL_PATH, \"POST\");\r\n\t\tif (typeof value.apiKey !== \"string\" || value.apiKey.length === 0) {\r\n\t\t\tthrow new Error(t(\"gatewayRevealFailed\"));\r\n\t\t}\r\n\t\tsetGatewayOnceKey(value.apiKey);\r\n\t\treturn value.apiKey;\r\n\t};\r\n\r\n\tconst copyGatewayKey = async (): Promise<void> => {\r\n\t\ttry {\r\n\t\t\tconst key = await ensureGatewayKey();\r\n\t\t\tawait handleCopy(\"key\", key);\r\n\t\t\tsetGatewayRevealError(undefined);\r\n\t\t} catch {\r\n\t\t\tsetGatewayRevealError(t(\"gatewayRevealFailed\"));\r\n\t\t}\r\n\t};\r\n\r\n\tconst toggleGatewayKeyVisible = async (): Promise<void> => {\r\n\t\tif (gatewayKeyVisible) {\r\n\t\t\tsetGatewayKeyVisible(false);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\ttry {\r\n\t\t\tawait ensureGatewayKey();\r\n\t\t\tsetGatewayKeyVisible(true);\r\n\t\t\tsetGatewayRevealError(undefined);\r\n\t\t} catch {\r\n\t\t\tsetGatewayRevealError(t(\"gatewayRevealFailed\"));\r\n\t\t}\r\n\t};\r\n\r\n\tconst applyGatewayPort = async (): Promise<void> => {\r\n\t\tconst port = parseGatewayPort(portDraft);\r\n\t\tif (port === undefined) {\r\n\t\t\tsetGatewayError(t(\"gatewayPortInvalid\"));\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (gateway !== undefined && port === gateway.port) return;\r\n\t\tsetGatewayBusy(true);\r\n\t\ttry {\r\n\t\t\tsetGateway(parseGateway(await jsonRequest<unknown>(GATEWAY_PATH, \"PATCH\", { port })) ?? gateway);\r\n\t\t\tsetGatewayError(undefined);\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetGatewayError(error instanceof Error ? error.message : t(\"gatewaySaveFailed\"));\r\n\t\t\tif (gateway !== undefined) setPortDraft(String(gateway.port));\r\n\t\t} finally {\r\n\t\t\tsetGatewayBusy(false);\r\n\t\t}\r\n\t};\r\n\r\n\tconst rotateGatewayKey = async (): Promise<void> => {\r\n\t\tsetGatewayBusy(true);\r\n\t\ttry {\r\n\t\t\tconst value = await jsonRequest<{ apiKey?: string; keyHint?: string }>(GATEWAY_ROTATE_PATH, \"POST\");\r\n\t\t\tif (typeof value.apiKey === \"string\") setGatewayOnceKey(value.apiKey);\r\n\t\t\tsetGatewayKeyVisible(true);\r\n\t\t\tsetGatewayRotateConfirm(false);\r\n\t\t\tsetGatewayRevealError(undefined);\r\n\t\t\tawait refreshGateway();\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetGatewayError(error instanceof Error ? error.message : t(\"gatewaySaveFailed\"));\r\n\t\t} finally {\r\n\t\t\tsetGatewayBusy(false);\r\n\t\t}\r\n\t};\r\n\r\n\tconst setGatewayEnabled = (enabled: boolean): void => {\r\n\t\tsetGatewayBusy(true);\r\n\t\tvoid jsonRequest<unknown>(GATEWAY_PATH, \"PATCH\", { enabled })\r\n\t\t\t.then((value) => {\r\n\t\t\t\tsetGateway(parseGateway(value) ?? gateway);\r\n\t\t\t\tsetGatewayError(undefined);\r\n\t\t\t})\r\n\t\t\t.catch((error: unknown) => {\r\n\t\t\t\tsetGatewayError(error instanceof Error ? error.message : t(\"gatewaySaveFailed\"));\r\n\t\t\t})\r\n\t\t\t.finally(() => {\r\n\t\t\t\tsetGatewayBusy(false);\r\n\t\t\t});\r\n\t};\r\n\r\n\tconst dismissRemoteTip = (): void => {\r\n\t\tsetRemoteTipDismissed(true);\r\n\t\ttry {\r\n\t\t\tglobalThis.sessionStorage?.setItem(REMOTE_TIP_STORAGE_KEY, \"1\");\r\n\t\t} catch {\r\n\t\t\t// ignore storage failures\r\n\t\t}\r\n\t};\r\n\r\n\tconst openAccountsForCodex = (): void => {\r\n\t\tsetActiveTab(\"accounts\");\r\n\t\twindow.setTimeout(() => document.getElementById(\"coding-oauth-login-codex\")?.focus(), 0);\r\n\t};\r\n\r\n\tconst focusCapabilityDependency = (target: \"codexImages\" | \"imagineCredential\"): void => {\r\n\t\tconst id = target === \"codexImages\" ? \"cap-switch-codexImages\" : \"coding-oauth-imagine-credential\";\r\n\t\tdocument.getElementById(id)?.focus();\r\n\t};\r\n\r\n\tif (status?.uiOwner === \"hub\") {\r\n\t\treturn (\r\n\t\t\t<section data-dsh-coding-oauth=\"compact\" style={pageStyle} aria-labelledby=\"coding-oauth-settings-title\">\r\n\t\t\t\t<h2 id=\"coding-oauth-settings-title\" style={titleStyle}>\r\n\t\t\t\t\t{t(\"coinstallTitle\")}\r\n\t\t\t\t</h2>\r\n\t\t\t\t<p style={bodyStyle}>{t(\"coinstallSummary\", { count: signedInCount })}</p>\r\n\t\t\t\t<button\r\n\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\tstyle={buttonStyle}\r\n\t\t\t\t\tonClick={() => window.dispatchEvent(new CustomEvent(\"usage-stats:open-dashboard\"))}\r\n\t\t\t\t>\r\n\t\t\t\t\t{t(\"coinstallOpenHub\")}\r\n\t\t\t\t</button>\r\n\t\t\t</section>\r\n\t\t);\r\n\t}\r\n\r\n\treturn (\r\n\t\t<section data-dsh-coding-oauth=\"\" style={pageStyle} aria-labelledby=\"coding-oauth-settings-title\">\r\n\t\t\t<div>\r\n\t\t\t\t<h2 id=\"coding-oauth-settings-title\" style={titleStyle}>\r\n\t\t\t\t\t{t(\"title\")}\r\n\t\t\t\t</h2>\r\n\t\t\t\t{activeTab === \"accounts\" ? <p style={{ ...bodyStyle, marginTop: 6 }}>{t(\"intro\")}</p> : null}\r\n\t\t\t</div>\r\n\t\t\t{requestError === undefined ? null : (\r\n\t\t\t\t<div role=\"alert\" style={{ display: \"flex\", flexWrap: \"wrap\", alignItems: \"center\", gap: 8 }}>\r\n\t\t\t\t\t<p style={errorStyle}>{requestError}</p>\r\n\t\t\t\t\t{status === undefined ? (\r\n\t\t\t\t\t\t<button type=\"button\" style={buttonStyle} onClick={() => void refresh()}>\r\n\t\t\t\t\t\t\t{t(\"retry\")}\r\n\t\t\t\t\t\t</button>\r\n\t\t\t\t\t) : null}\r\n\t\t\t\t</div>\r\n\t\t\t)}\r\n\t\t\t<SettingsTabs t={t} activeTab={activeTab} onChange={setActiveTab} hints={tabHints} />\r\n\t\t\t<div\r\n\t\t\t\tid={`coding-oauth-panel-${activeTab}`}\r\n\t\t\t\trole=\"tabpanel\"\r\n\t\t\t\taria-labelledby={`coding-oauth-tab-${activeTab}`}\r\n\t\t\t\tstyle={panelStyle}\r\n\t\t\t>\r\n\t\t\t\t{activeTab === \"accounts\" && !(status === undefined && requestError !== undefined) ? (\r\n\t\t\t\t\t<AccountsTab\r\n\t\t\t\t\t\tt={t}\r\n\t\t\t\t\t\tstatus={status}\r\n\t\t\t\t\t\tremote={remote}\r\n\t\t\t\t\t\tremoteTipDismissed={remoteTipDismissed}\r\n\t\t\t\t\t\tonDismissRemoteTip={dismissRemoteTip}\r\n\t\t\t\t\t\tsources={sources}\r\n\t\t\t\t\t\tsourcesError={sourcesError}\r\n\t\t\t\t\t\tsourcesNotice={sourcesNotice}\r\n\t\t\t\t\t\tsourcesBusy={sourcesBusy}\r\n\t\t\t\t\t\tpreview={preview}\r\n\t\t\t\t\t\tconfirmOverwrite={confirmOverwrite}\r\n\t\t\t\t\t\tbusyProvider={busyProvider}\r\n\t\t\t\t\t\tcodeInputs={codeInputs}\r\n\t\t\t\t\t\tpopupBlocked={popupBlocked}\r\n\t\t\t\t\t\texpandedProviders={expandedProviders}\r\n\t\t\t\t\t\tshowUsage={showUsage === true}\r\n\t\t\t\t\t\tusage={usage}\r\n\t\t\t\t\t\tusageError={usageError}\r\n\t\t\t\t\t\tusageLoading={usageLoading}\r\n\t\t\t\t\t\tonSignIn={(slug, method) => {\r\n\t\t\t\t\t\t\tvoid signIn(slug, method);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonSignOut={(slug) => {\r\n\t\t\t\t\t\t\tvoid signOut(slug);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonCancelLogin={(slug) => {\r\n\t\t\t\t\t\t\tvoid cancelLogin(slug);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonSubmitCode={(slug) => {\r\n\t\t\t\t\t\t\tvoid submitCode(slug);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonCodeChange={(slug, value) => {\r\n\t\t\t\t\t\t\tsetCodeInputs((current) => ({ ...current, [slug]: value }));\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonToggleExpanded={(slug) => {\r\n\t\t\t\t\t\t\tsetExpandedProviders((current) => ({\r\n\t\t\t\t\t\t\t\t...current,\r\n\t\t\t\t\t\t\t\t[slug]: !(current[slug] === true),\r\n\t\t\t\t\t\t\t}));\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonPreviewSource={(slug) => {\r\n\t\t\t\t\t\t\tvoid previewSource(slug);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonSaveModels={(slug, selected) => {\r\n\t\t\t\t\t\t\tvoid saveModels(slug, selected);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonConfirmOverwriteChange={setConfirmOverwrite}\r\n\t\t\t\t\t\tonCommitSource={() => {\r\n\t\t\t\t\t\t\tvoid commitSource();\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonCancelSourcePreview={() => {\r\n\t\t\t\t\t\t\tvoid cancelSourcePreview();\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonRefreshSources={() => {\r\n\t\t\t\t\t\t\tvoid refreshSources();\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonDismissSourcesNotice={() => {\r\n\t\t\t\t\t\t\tsetSourcesNotice(undefined);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t/>\r\n\t\t\t\t) : null}\r\n\t\t\t\t{activeTab === \"capabilities\" ? (\r\n\t\t\t\t\t<CapabilitiesTab\r\n\t\t\t\t\t\tt={t}\r\n\t\t\t\t\t\tcapabilities={capabilities}\r\n\t\t\t\t\t\tcapabilitiesError={capabilitiesError}\r\n\t\t\t\t\t\tcapabilitiesBusy={capabilitiesBusy}\r\n\t\t\t\t\t\timagine={imagine}\r\n\t\t\t\t\t\timagineError={imagineError}\r\n\t\t\t\t\t\tcodexSignedIn={status?.providers.codex.status === \"signed-in\"}\r\n\t\t\t\t\t\tonRetry={() => {\r\n\t\t\t\t\t\t\tvoid refreshCapabilities();\r\n\t\t\t\t\t\t\tvoid refreshImagine();\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonOpenAccounts={openAccountsForCodex}\r\n\t\t\t\t\t\tonFocusDependency={focusCapabilityDependency}\r\n\t\t\t\t\t\tonPatchCapability={(key, value) => patchCapability(key, value)}\r\n\t\t\t\t\t/>\r\n\t\t\t\t) : null}\r\n\t\t\t\t{activeTab === \"gateway\" ? (\r\n\t\t\t\t\t<GatewayTab\r\n\t\t\t\t\t\tt={t}\r\n\t\t\t\t\t\tgateway={gateway}\r\n\t\t\t\t\t\tgatewayError={gatewayError}\r\n\t\t\t\t\t\tgatewayBusy={gatewayBusy}\r\n\t\t\t\t\t\tgatewayOnceKey={gatewayOnceKey}\r\n\t\t\t\t\t\tgatewayKeyVisible={gatewayKeyVisible}\r\n\t\t\t\t\t\tgatewayRotateConfirm={gatewayRotateConfirm}\r\n\t\t\t\t\t\tgatewayRevealError={gatewayRevealError}\r\n\t\t\t\t\t\tportDraft={portDraft}\r\n\t\t\t\t\t\tcopiedField={copiedField}\r\n\t\t\t\t\t\tcopyFailedField={copyFailedField}\r\n\t\t\t\t\t\tonRetry={() => {\r\n\t\t\t\t\t\t\tvoid refreshGateway();\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonEnabledChange={setGatewayEnabled}\r\n\t\t\t\t\t\tonPortDraftChange={setPortDraft}\r\n\t\t\t\t\t\tonApplyPort={() => {\r\n\t\t\t\t\t\t\tvoid applyGatewayPort();\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonRandomPort={(port) => {\r\n\t\t\t\t\t\t\tsetPortDraft(String(port));\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonCopy={(field, text) => {\r\n\t\t\t\t\t\t\tvoid handleCopy(field, text);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonCopyKey={() => {\r\n\t\t\t\t\t\t\tvoid copyGatewayKey();\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonToggleKeyVisible={() => {\r\n\t\t\t\t\t\t\tvoid toggleGatewayKeyVisible();\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonRotateConfirm={() => {\r\n\t\t\t\t\t\t\tsetGatewayRotateConfirm(true);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonRotateCancel={() => {\r\n\t\t\t\t\t\t\tsetGatewayRotateConfirm(false);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonRotate={() => {\r\n\t\t\t\t\t\t\tvoid rotateGatewayKey();\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t/>\r\n\t\t\t\t) : null}\r\n\t\t\t\t{activeTab === \"about\" ? <AboutTab t={t} /> : null}\r\n\t\t\t</div>\r\n\t\t</section>\r\n\t);\r\n}\r\n", null, "/** Static tables for the Coding OAuth settings UI. */\r\n\r\nimport {\r\n\tCAPABILITY_SETTINGS_PATH,\r\n\tCODING_OAUTH_LOGIN_CANCEL_PATH,\r\n\tCODING_OAUTH_LOGIN_CODE_PATH,\r\n\tCODING_OAUTH_LOGIN_PATH,\r\n\tCODING_OAUTH_LOGOUT_PATH,\r\n\tCODING_OAUTH_MODELS_PATH,\r\n\tCODING_OAUTH_STATUS_PATH,\r\n\tCODEX_USAGE_PATH as CORE_CODEX_USAGE_PATH,\r\n\tGATEWAY_REVEAL_PATH as CORE_GATEWAY_REVEAL_PATH,\r\n\tGATEWAY_ROTATE_PATH as CORE_GATEWAY_ROTATE_PATH,\r\n\tGATEWAY_SETTINGS_PATH,\r\n\tIMAGINE_CREDENTIAL_STATUS_PATH,\r\n\tOAUTH_IMPORT_CANCEL_PATH,\r\n\tOAUTH_IMPORT_COMMIT_PATH,\r\n\tOAUTH_IMPORT_PREVIEW_PATH,\r\n\tOAUTH_IMPORT_SOURCES_PATH,\r\n} from \"dsh-coding-oauth-core/contracts\";\r\nimport type { GrokBuildSettingsKey } from \"./locales.ts\";\r\nimport type {\r\n\tCapabilityFlagKey,\r\n\tCapabilityLimitKey,\r\n\tProviderCardDefinition,\r\n\tSettingsTabId,\r\n\tSourceCommitAction,\r\n\tSourceConflict,\r\n\tSourceKind,\r\n\tSourcePreviewAction,\r\n\tSourceReason,\r\n} from \"./types.ts\";\r\n\r\nexport const STATUS_PATH = CODING_OAUTH_STATUS_PATH;\r\nexport const LOGIN_PATH = CODING_OAUTH_LOGIN_PATH;\r\nexport const LOGIN_CODE_PATH = CODING_OAUTH_LOGIN_CODE_PATH;\r\nexport const LOGIN_CANCEL_PATH = CODING_OAUTH_LOGIN_CANCEL_PATH;\r\nexport const LOGOUT_PATH = CODING_OAUTH_LOGOUT_PATH;\r\nexport const MODELS_PATH = CODING_OAUTH_MODELS_PATH;\r\nexport const SOURCES_PATH = OAUTH_IMPORT_SOURCES_PATH;\r\nexport const SOURCES_PREVIEW_PATH = OAUTH_IMPORT_PREVIEW_PATH;\r\nexport const SOURCES_COMMIT_PATH = OAUTH_IMPORT_COMMIT_PATH;\r\nexport const SOURCES_CANCEL_PATH = OAUTH_IMPORT_CANCEL_PATH;\r\nexport const CAPABILITIES_PATH = CAPABILITY_SETTINGS_PATH;\r\nexport const CODEX_USAGE_PATH = CORE_CODEX_USAGE_PATH;\r\nexport const IMAGINE_CREDENTIAL_PATH = IMAGINE_CREDENTIAL_STATUS_PATH;\r\nexport const GATEWAY_PATH = GATEWAY_SETTINGS_PATH;\r\nexport const GATEWAY_REVEAL_PATH = CORE_GATEWAY_REVEAL_PATH;\r\nexport const GATEWAY_ROTATE_PATH = CORE_GATEWAY_ROTATE_PATH;\r\nexport const POLL_INTERVAL_MS = 1_000;\r\nexport const HOUR_MS = 60 * 60 * 1000;\r\n\r\nexport const SOURCE_KINDS: readonly SourceKind[] = [\"grok\", \"codex\", \"kimi\", \"claude\"];\r\nexport const SOURCE_REASONS: readonly SourceReason[] = [\"missing\", \"unsafe\", \"invalid\", \"too_large\"];\r\nexport const SOURCE_CONFLICTS: readonly SourceConflict[] = [\r\n\t\"none\",\r\n\t\"same_credential\",\r\n\t\"same_account\",\r\n\t\"different_account\",\r\n\t\"unknown_account\",\r\n\t\"unreadable_destination\",\r\n\t\"unsafe_destination\",\r\n];\r\nexport const SOURCE_PREVIEW_ACTIONS: readonly SourcePreviewAction[] = [\"import\", \"reuse\", \"overwrite\", \"blocked\"];\r\nexport const SOURCE_COMMIT_ACTIONS: readonly SourceCommitAction[] = [\"imported\", \"unchanged\", \"overwritten\"];\r\n\r\nexport const SOURCE_DEFAULT_PATH: { readonly [K in SourceKind]: string } = {\r\n\tgrok: \"~/.grok/auth.json\",\r\n\tcodex: \"~/.codex/auth.json\",\r\n\tkimi: \"~/.kimi/credentials/kimi-code.json\",\r\n\tclaude: \"~/.claude/.credentials.json\",\r\n};\r\n\r\nexport const SOURCE_KIND_KEY: { readonly [K in SourceKind]: GrokBuildSettingsKey } = {\r\n\tgrok: \"sourceKindGrok\",\r\n\tcodex: \"sourceKindCodex\",\r\n\tkimi: \"sourceKindKimi\",\r\n\tclaude: \"sourceKindClaude\",\r\n};\r\n\r\nexport const SOURCE_REASON_KEY: { readonly [K in SourceReason]: GrokBuildSettingsKey } = {\r\n\tmissing: \"sourceReasonMissing\",\r\n\tunsafe: \"sourceReasonUnsafe\",\r\n\tinvalid: \"sourceReasonInvalid\",\r\n\ttoo_large: \"sourceReasonTooLarge\",\r\n};\r\n\r\nexport const SOURCE_CONFLICT_KEY: { readonly [K in SourceConflict]: GrokBuildSettingsKey } = {\r\n\tnone: \"sourceConflictNone\",\r\n\tsame_credential: \"sourceConflictSameCredential\",\r\n\tsame_account: \"sourceConflictSameAccount\",\r\n\tdifferent_account: \"sourceConflictDifferentAccount\",\r\n\tunknown_account: \"sourceConflictUnknownAccount\",\r\n\tunreadable_destination: \"sourceConflictUnreadableDestination\",\r\n\tunsafe_destination: \"sourceConflictUnsafeDestination\",\r\n};\r\n\r\nexport const SOURCE_PREVIEW_ACTION_KEY: { readonly [K in SourcePreviewAction]: GrokBuildSettingsKey } = {\r\n\timport: \"sourceActionImport\",\r\n\treuse: \"sourceActionReuse\",\r\n\toverwrite: \"sourceActionOverwrite\",\r\n\tblocked: \"sourceActionBlocked\",\r\n};\r\n\r\nexport const SOURCE_COMMIT_ACTION_KEY: { readonly [K in SourceCommitAction]: GrokBuildSettingsKey } = {\r\n\timported: \"sourceCommitImported\",\r\n\tunchanged: \"sourceCommitUnchanged\",\r\n\toverwritten: \"sourceCommitOverwritten\",\r\n};\r\n\r\nexport const CAPABILITY_TOGGLES: readonly {\r\n\tkey: CapabilityFlagKey;\r\n\tlabel: GrokBuildSettingsKey;\r\n\thint: GrokBuildSettingsKey;\r\n\trequiresImages?: true;\r\n}[] = [\r\n\t{ key: \"codexSearch\", label: \"capCodexSearch\", hint: \"capCodexSearchHint\" },\r\n\t{ key: \"codexImages\", label: \"capCodexImages\", hint: \"capCodexImagesHint\" },\r\n\t{ key: \"codexImageEdits\", label: \"capCodexImageEdits\", hint: \"capCodexImageEditsHint\", requiresImages: true },\r\n\t{ key: \"codexUsage\", label: \"capCodexUsage\", hint: \"capCodexUsageHint\" },\r\n\t{ key: \"codexFast\", label: \"capCodexFast\", hint: \"capCodexFastHint\" },\r\n\t{ key: \"grokImagineImage\", label: \"capGrokImagineImage\", hint: \"capGrokImagineImageHint\" },\r\n\t{ key: \"grokImagineVideo\", label: \"capGrokImagineVideo\", hint: \"capGrokImagineVideoHint\" },\r\n];\r\n\r\nexport const CAPABILITY_LIMITS: readonly {\r\n\tkey: CapabilityLimitKey;\r\n\tlabel: GrokBuildSettingsKey;\r\n\thint: GrokBuildSettingsKey;\r\n\tmin: number;\r\n\tmax: number;\r\n\tscale: number;\r\n}[] = [\r\n\t{ key: \"searchResults\", label: \"capSearchResults\", hint: \"capSearchResultsHint\", min: 1, max: 20, scale: 1 },\r\n\t{ key: \"imageCount\", label: \"capImageCount\", hint: \"capImageCountHint\", min: 1, max: 4, scale: 1 },\r\n\t{\r\n\t\tkey: \"videoArtifactTtlMs\",\r\n\t\tlabel: \"capVideoTtlHours\",\r\n\t\thint: \"capVideoTtlHoursHint\",\r\n\t\tmin: 1,\r\n\t\tmax: 168,\r\n\t\tscale: HOUR_MS,\r\n\t},\r\n];\r\n\r\nexport const IMAGINE_SOURCE_KEY: { readonly [source: string]: GrokBuildSettingsKey } = {\r\n\tnone: \"imagineSourceNone\",\r\n\tenv: \"imagineSourceEnv\",\r\n\tenvironment: \"imagineSourceEnv\",\r\n\t\"xai-api-key\": \"imagineSourceEnv\",\r\n\txai_api_key: \"imagineSourceEnv\",\r\n\t\"api-key\": \"imagineSourceApiKey\",\r\n\tapi_key: \"imagineSourceApiKey\",\r\n\tapikey: \"imagineSourceApiKey\",\r\n\tkey: \"imagineSourceApiKey\",\r\n\tsettings: \"imagineSourceApiKey\",\r\n\toauth: \"imagineSourceOAuth\",\r\n\t\"oauth-access\": \"imagineSourceOAuth\",\r\n\t\"grok-cli-key\": \"imagineSourceCliKey\",\r\n\t\"cli-key\": \"imagineSourceCliKey\",\r\n};\r\n\r\nexport const PROVIDERS: readonly ProviderCardDefinition[] = [\r\n\t{\r\n\t\tslug: \"grok\",\r\n\t\troute: \"grok-build\",\r\n\t\ttitleKey: \"grokTitle\",\r\n\t\tdescriptionKey: \"grokDescription\",\r\n\t\tmethods: [\"pkce\", \"device\"],\r\n\t\trecommended: \"pkce\",\r\n\t\tremoteRecommended: \"device\",\r\n\t},\r\n\t{\r\n\t\tslug: \"codex\",\r\n\t\troute: \"codex-oauth\",\r\n\t\ttitleKey: \"codexTitle\",\r\n\t\tdescriptionKey: \"codexDescription\",\r\n\t\tmethods: [\"device\", \"browser\"],\r\n\t\trecommended: \"device\",\r\n\t\tremoteRecommended: \"device\",\r\n\t},\r\n\t{\r\n\t\tslug: \"kimi\",\r\n\t\troute: \"kimi-code-oauth\",\r\n\t\ttitleKey: \"kimiTitle\",\r\n\t\tdescriptionKey: \"kimiDescription\",\r\n\t\tmethods: [\"device\"],\r\n\t\trecommended: \"device\",\r\n\t\tremoteRecommended: \"device\",\r\n\t},\r\n\t{\r\n\t\tslug: \"claude\",\r\n\t\troute: \"claude-code-oauth\",\r\n\t\ttitleKey: \"claudeTitle\",\r\n\t\tdescriptionKey: \"claudeDescription\",\r\n\t\tmethods: [\"browser\"],\r\n\t\trecommended: \"browser\",\r\n\t\tremoteRecommended: \"browser\",\r\n\t},\r\n];\r\n\r\nexport const SETTINGS_TABS: readonly { id: SettingsTabId; label: GrokBuildSettingsKey }[] = [\r\n\t{ id: \"accounts\", label: \"tabAccounts\" },\r\n\t{ id: \"gateway\", label: \"tabGateway\" },\r\n\t{ id: \"capabilities\", label: \"tabCapabilities\" },\r\n\t{ id: \"about\", label: \"tabAbout\" },\r\n];\r\n\r\nexport const GATEWAY_PORT_MIN = 1024;\r\nexport const GATEWAY_PORT_MAX = 65_535;\r\nexport const GATEWAY_RANDOM_PORT_MIN = 18_100;\r\nexport const GATEWAY_RANDOM_PORT_MAX = 18_999;\r\nexport const GATEWAY_RANDOM_RESERVED = new Set([22, 53, 3080, 7890, 9090, 18_080]);\r\n\r\nexport const CONSUMED_PREVIEW_CODES = new Set([\r\n\t\"preview_invalid\",\r\n\t\"preview_expired\",\r\n\t\"source_changed\",\r\n\t\"destination_changed\",\r\n\t\"confirm_required\",\r\n\t\"unsafe_destination\",\r\n]);\r\n\r\nexport const PLUGIN_VERSION = \"0.6.2\";\n", "/** Same-origin JSON helpers for the Coding OAuth plugin HTTP API. */\r\n\r\nimport { CONSUMED_PREVIEW_CODES, SOURCES_CANCEL_PATH } from \"./constants.ts\";\r\nimport type { PluginRequestError } from \"./types.ts\";\r\n\r\nexport function isRecord(value: unknown): value is Record<string, unknown> {\r\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\r\n}\r\n\r\nexport function isPluginRequestError(error: unknown): error is PluginRequestError {\r\n\treturn error instanceof Error && error.name === \"PluginRequestError\" && \"status\" in error;\r\n}\r\n\r\nexport function isConflictError(error: unknown): boolean {\r\n\tif (!isPluginRequestError(error)) {\r\n\t\treturn (\r\n\t\t\terror instanceof Error && /SETTINGS_CONFLICT|settings-conflict|changed since it was read/iu.test(error.message)\r\n\t\t);\r\n\t}\r\n\treturn error.status === 409 || error.code === \"SETTINGS_CONFLICT\" || /conflict/iu.test(error.message);\r\n}\r\n\r\nexport function isConsumedPreviewError(error: unknown): boolean {\r\n\tif (!isPluginRequestError(error)) return false;\r\n\tif (error.code !== undefined && CONSUMED_PREVIEW_CODES.has(error.code)) return true;\r\n\treturn error.status === 404 || error.status === 410;\r\n}\r\n\r\nexport function cancelPreviewTicket(previewId: string, keepalive = false): void {\r\n\tvoid fetch(SOURCES_CANCEL_PATH, {\r\n\t\tmethod: \"POST\",\r\n\t\theaders: { accept: \"application/json\", \"content-type\": \"application/json\" },\r\n\t\tcredentials: \"same-origin\",\r\n\t\tbody: JSON.stringify({ previewId }),\r\n\t\t...(keepalive ? { keepalive: true } : {}),\r\n\t}).catch(() => undefined);\r\n}\r\n\r\nexport async function jsonRequest<T>(path: string, method = \"GET\", body?: unknown): Promise<T> {\r\n\tconst response = await fetch(path, {\r\n\t\tmethod,\r\n\t\theaders: { accept: \"application/json\", ...(body === undefined ? {} : { \"content-type\": \"application/json\" }) },\r\n\t\tcredentials: \"same-origin\",\r\n\t\t...(body === undefined ? {} : { body: JSON.stringify(body) }),\r\n\t});\r\n\tconst value: unknown = await response.json().catch(() => undefined);\r\n\tif (!response.ok) {\r\n\t\tconst record = isRecord(value) ? value : undefined;\r\n\t\tconst message =\r\n\t\t\trecord !== undefined && typeof record[\"error\"] === \"string\"\r\n\t\t\t\t? record[\"error\"]\r\n\t\t\t\t: record !== undefined && typeof record[\"message\"] === \"string\"\r\n\t\t\t\t\t? record[\"message\"]\r\n\t\t\t\t\t: `HTTP ${response.status}`;\r\n\t\tconst code = record !== undefined && typeof record[\"code\"] === \"string\" ? record[\"code\"] : undefined;\r\n\t\tconst error = new Error(message) as PluginRequestError;\r\n\t\terror.name = \"PluginRequestError\";\r\n\t\terror.status = response.status;\r\n\t\tif (code !== undefined) error.code = code;\r\n\t\tthrow error;\r\n\t}\r\n\treturn value as T;\r\n}\r\n\r\nexport async function copyText(text: string): Promise<boolean> {\r\n\ttry {\r\n\t\tif (typeof navigator !== \"undefined\" && navigator.clipboard?.writeText !== undefined) {\r\n\t\t\tawait navigator.clipboard.writeText(text);\r\n\t\t\treturn true;\r\n\t\t}\r\n\t} catch {\r\n\t\t// fall through to execCommand\r\n\t}\r\n\ttry {\r\n\t\tconst area = document.createElement(\"textarea\");\r\n\t\tarea.value = text;\r\n\t\tarea.setAttribute(\"readonly\", \"\");\r\n\t\tarea.style.position = \"fixed\";\r\n\t\tarea.style.left = \"-9999px\";\r\n\t\tdocument.body.appendChild(area);\r\n\t\tarea.select();\r\n\t\tconst ok = document.execCommand(\"copy\");\r\n\t\tdocument.body.removeChild(area);\r\n\t\treturn ok;\r\n\t} catch {\r\n\t\treturn false;\r\n\t}\r\n}\r\n", "/** Shared inline styles using DSH design tokens. */\r\n\r\nimport type { CSSProperties } from \"react\";\r\nimport type { ProviderStatus } from \"./types.ts\";\r\n\r\nexport const TRANSITION = \"all 0.15s ease\";\r\n\r\nexport const pageStyle: CSSProperties = {\r\n\tdisplay: \"flex\",\r\n\tflexDirection: \"column\",\r\n\tgap: 16,\r\n\twidth: \"100%\",\r\n\tmaxWidth: 780,\r\n\tminWidth: 0,\r\n};\r\nexport const titleStyle: CSSProperties = {\r\n\tmargin: 0,\r\n\tfontSize: 20,\r\n\tlineHeight: \"28px\",\r\n\tfontWeight: 600,\r\n\tcolor: \"var(--dsw-alias-label-primary)\",\r\n};\r\nexport const bodyStyle: CSSProperties = {\r\n\tmargin: 0,\r\n\tfontSize: 14,\r\n\tlineHeight: \"22px\",\r\n\tcolor: \"var(--dsw-alias-label-secondary)\",\r\n};\r\nexport const cardStyle: CSSProperties = {\r\n\tdisplay: \"flex\",\r\n\tflexDirection: \"column\",\r\n\tgap: 14,\r\n\tpadding: \"18px 20px\",\r\n\tborder: \"1px solid var(--dsw-alias-border-l2)\",\r\n\tborderRadius: 12,\r\n\tbackground: \"var(--dsw-alias-bg-module-platform)\",\r\n\ttransition: TRANSITION,\r\n};\r\nexport const rowStyle: CSSProperties = {\r\n\tdisplay: \"flex\",\r\n\talignItems: \"center\",\r\n\tjustifyContent: \"space-between\",\r\n\tflexWrap: \"wrap\",\r\n\tgap: 12,\r\n};\r\nexport const statusStyle: CSSProperties = {\r\n\tdisplay: \"flex\",\r\n\talignItems: \"center\",\r\n\tgap: 9,\r\n\tfontSize: 14,\r\n\tfontWeight: 500,\r\n\tcolor: \"var(--dsw-alias-label-primary)\",\r\n};\r\nexport const buttonStyle: CSSProperties = {\r\n\tboxSizing: \"border-box\",\r\n\tminHeight: 34,\r\n\tpadding: \"6px 14px\",\r\n\tborder: \"1px solid var(--dsw-alias-border-l4, rgba(127, 127, 127, 0.4))\",\r\n\tborderRadius: 18,\r\n\tbackground: \"var(--dsw-alias-button-elevated-fill, var(--dsw-alias-bg-layer-1))\",\r\n\tcolor: \"var(--dsw-alias-label-primary)\",\r\n\tboxShadow: \"0 1px 2px rgba(0, 0, 0, 0.18)\",\r\n\tfont: \"inherit\",\r\n\tfontSize: 14,\r\n\tfontWeight: 500,\r\n\tcursor: \"pointer\",\r\n\ttransition: TRANSITION,\r\n};\r\nexport const primaryButtonStyle: CSSProperties = {\r\n\t...buttonStyle,\r\n\t// DSH dark theme flips brand-primary to near-white; use the button/foreground\r\n\t// pair so primary CTAs stay readable in both light and dark mode.\r\n\tborder: \"none\",\r\n\tbackground: \"var(--dsw-alias-button-primary-fill)\",\r\n\tcolor: \"var(--dsw-alias-label-primary-foreground)\",\r\n\tboxShadow: \"0 1px 3px rgba(0, 0, 0, 0.28)\",\r\n\tfontWeight: 600,\r\n};\r\nexport const compactButtonStyle: CSSProperties = {\r\n\t...buttonStyle,\r\n\tminHeight: 28,\r\n\tpadding: \"4px 10px\",\r\n\tfontSize: 13,\r\n\tborderRadius: 8,\r\n};\r\nexport const errorStyle: CSSProperties = { ...bodyStyle, color: \"var(--dsw-alias-state-error-primary)\" };\r\nexport const successStyle: CSSProperties = { ...bodyStyle, color: \"var(--dsw-alias-state-success-primary, #22a06b)\" };\r\nexport const warningStyle: CSSProperties = {\r\n\t...bodyStyle,\r\n\tpadding: \"10px 12px\",\r\n\tborderRadius: 8,\r\n\tborder: \"1px solid color-mix(in srgb, var(--dsw-alias-state-warn-primary, #e06c00) 35%, transparent)\",\r\n\tbackground: \"color-mix(in srgb, var(--dsw-alias-state-warn-primary, #e06c00) 10%, transparent)\",\r\n\tcolor: \"var(--dsw-alias-label-primary)\",\r\n};\r\nexport const tipStyle: CSSProperties = {\r\n\t...bodyStyle,\r\n\tpadding: \"10px 12px\",\r\n\tborderRadius: 8,\r\n\tborder: \"1px solid var(--dsw-alias-border-l2)\",\r\n\tbackground: \"var(--dsw-alias-bg-layer-1)\",\r\n\tcolor: \"var(--dsw-alias-label-primary)\",\r\n};\r\nexport const noticeStyle: CSSProperties = {\r\n\t...tipStyle,\r\n\tanimation: \"dsh-coding-oauth-fade-in 0.2s ease\",\r\n};\r\nexport const codeStyle: CSSProperties = {\r\n\tfontFamily: \"ui-monospace, SFMono-Regular, Menlo, Consolas, monospace\",\r\n\tfontSize: 20,\r\n\tletterSpacing: \"0.08em\",\r\n\tfontWeight: 600,\r\n\tcolor: \"var(--dsw-alias-label-primary)\",\r\n};\r\nexport const monoStyle: CSSProperties = { fontFamily: \"ui-monospace, SFMono-Regular, Menlo, Consolas, monospace\" };\r\nexport const snippetStyle: CSSProperties = {\r\n\t...monoStyle,\r\n\tdisplay: \"block\",\r\n\tfontSize: 12,\r\n\tlineHeight: \"18px\",\r\n\tpadding: \"10px 12px\",\r\n\tborderRadius: 8,\r\n\tborder: \"1px solid var(--dsw-alias-border-l2)\",\r\n\tbackground: \"var(--dsw-alias-bg-layer-1)\",\r\n\tcolor: \"var(--dsw-alias-label-primary)\",\r\n\toverflowWrap: \"anywhere\",\r\n\twhiteSpace: \"pre-wrap\",\r\n};\r\nexport const linkStyle: CSSProperties = { color: \"var(--dsw-alias-brand-primary)\", wordBreak: \"break-all\" };\r\nexport const listStyle: CSSProperties = {\r\n\tdisplay: \"flex\",\r\n\tflexDirection: \"column\",\r\n\tgap: 8,\r\n\tmargin: 0,\r\n\tpadding: 0,\r\n\tlistStyle: \"none\",\r\n};\r\nexport const checkRowStyle: CSSProperties = {\r\n\tdisplay: \"flex\",\r\n\talignItems: \"flex-start\",\r\n\tgap: 8,\r\n\tfontSize: 14,\r\n\tcolor: \"var(--dsw-alias-label-primary)\",\r\n};\r\nexport const inputStyle: CSSProperties = {\r\n\tboxSizing: \"border-box\",\r\n\twidth: \"100%\",\r\n\tminHeight: 34,\r\n\tpadding: \"6px 12px\",\r\n\tborder: \"1px solid var(--dsw-alias-border-l2)\",\r\n\tborderRadius: 8,\r\n\tbackground: \"var(--dsw-alias-bg-layer-1)\",\r\n\tcolor: \"var(--dsw-alias-label-primary)\",\r\n\tfont: \"inherit\",\r\n\tfontSize: 13,\r\n\ttransition: TRANSITION,\r\n};\r\nexport const nestedStyle: CSSProperties = {\r\n\tdisplay: \"flex\",\r\n\tflexDirection: \"column\",\r\n\tgap: 8,\r\n\tpadding: \"12px 14px\",\r\n\tborder: \"1px solid var(--dsw-alias-border-l2)\",\r\n\tborderRadius: 8,\r\n\tbackground: \"var(--dsw-alias-bg-layer-1)\",\r\n};\r\nexport const hintStyle: CSSProperties = { ...bodyStyle, fontSize: 13 };\r\nexport const visuallyHiddenStyle: CSSProperties = {\r\n\tposition: \"absolute\",\r\n\twidth: 1,\r\n\theight: 1,\r\n\tpadding: 0,\r\n\tmargin: -1,\r\n\toverflow: \"hidden\",\r\n\tclip: \"rect(0, 0, 0, 0)\",\r\n\twhiteSpace: \"nowrap\",\r\n\tborder: 0,\r\n};\r\nexport const segmentedNavStyle: CSSProperties = {\r\n\tdisplay: \"inline-flex\",\r\n\tflexWrap: \"wrap\",\r\n\tgap: 2,\r\n\tpadding: 3,\r\n\tborderRadius: 10,\r\n\tborder: \"1px solid var(--dsw-alias-border-l2)\",\r\n\tbackground: \"var(--dsw-alias-bg-layer-1)\",\r\n};\r\nexport const segmentedTabStyle: CSSProperties = {\r\n\t...buttonStyle,\r\n\tborder: \"none\",\r\n\tborderRadius: 8,\r\n\tboxShadow: \"none\",\r\n\tbackground: \"transparent\",\r\n\tminHeight: 32,\r\n\tpadding: \"5px 12px\",\r\n\tfontSize: 13,\r\n};\r\nexport const segmentedTabActiveStyle: CSSProperties = {\r\n\t...segmentedTabStyle,\r\n\tbackground: \"var(--dsw-alias-bg-module-platform)\",\r\n\tcolor: \"var(--dsw-alias-label-primary)\",\r\n\tboxShadow: \"0 1px 2px rgba(0, 0, 0, 0.12)\",\r\n\tfontWeight: 600,\r\n};\r\nexport const panelStyle: CSSProperties = {\r\n\tdisplay: \"flex\",\r\n\tflexDirection: \"column\",\r\n\tgap: 14,\r\n\tminWidth: 0,\r\n};\r\nexport const accountGridStyle: CSSProperties = {\r\n\tdisplay: \"grid\",\r\n\tgridTemplateColumns: \"repeat(auto-fill, minmax(min(320px, 100%), 1fr))\",\r\n\tgap: 14,\r\n};\r\nexport const copyRowStyle: CSSProperties = {\r\n\tdisplay: \"flex\",\r\n\talignItems: \"center\",\r\n\tjustifyContent: \"space-between\",\r\n\tflexWrap: \"wrap\",\r\n\tgap: 8,\r\n};\r\nexport const skeletonStyle: CSSProperties = {\r\n\t...cardStyle,\r\n\tminHeight: 88,\r\n\tbackground:\r\n\t\t\"linear-gradient(90deg, var(--dsw-alias-bg-layer-1) 0%, var(--dsw-alias-bg-module-platform) 50%, var(--dsw-alias-bg-layer-1) 100%)\",\r\n\tbackgroundSize: \"200% 100%\",\r\n\tanimation: \"dsh-coding-oauth-skeleton-pulse 1.4s ease-in-out infinite\",\r\n};\r\nexport const stepRowStyle: CSSProperties = {\r\n\tdisplay: \"flex\",\r\n\talignItems: \"flex-start\",\r\n\tgap: 10,\r\n\tfontSize: 14,\r\n\tcolor: \"var(--dsw-alias-label-secondary)\",\r\n};\r\nexport const stepActiveStyle: CSSProperties = {\r\n\t...stepRowStyle,\r\n\tcolor: \"var(--dsw-alias-label-primary)\",\r\n\tfontWeight: 500,\r\n};\r\nexport const stepNumberStyle: CSSProperties = {\r\n\tdisplay: \"inline-flex\",\r\n\talignItems: \"center\",\r\n\tjustifyContent: \"center\",\r\n\twidth: 22,\r\n\theight: 22,\r\n\tborderRadius: \"50%\",\r\n\tflex: \"0 0 auto\",\r\n\tfontSize: 12,\r\n\tfontWeight: 600,\r\n\tbackground: \"var(--dsw-alias-bg-layer-1)\",\r\n\tborder: \"1px solid var(--dsw-alias-border-l2)\",\r\n\tcolor: \"var(--dsw-alias-label-secondary)\",\r\n};\r\nexport const stepNumberActiveStyle: CSSProperties = {\r\n\t...stepNumberStyle,\r\n\tbackground: \"var(--dsw-alias-button-primary-fill)\",\r\n\tborderColor: \"var(--dsw-alias-button-primary-fill)\",\r\n\tcolor: \"var(--dsw-alias-label-primary-foreground)\",\r\n};\r\n\r\nexport type StatusTone = \"success\" | \"error\" | \"warning\" | \"info\" | \"neutral\";\r\n\r\nexport function statusToneColor(tone: StatusTone): string {\r\n\tswitch (tone) {\r\n\t\tcase \"success\":\r\n\t\t\treturn \"var(--dsw-alias-state-success-primary, #22a06b)\";\r\n\t\tcase \"error\":\r\n\t\t\treturn \"var(--dsw-alias-state-error-primary, #d92d20)\";\r\n\t\tcase \"warning\":\r\n\t\t\t// DSH token is `state-warn-*` (not `state-warning-*`).\r\n\t\t\treturn \"var(--dsw-alias-state-warn-primary, #e06c00)\";\r\n\t\tcase \"info\":\r\n\t\t\t// Accent/text color (not a solid fill + white text pair).\r\n\t\t\treturn \"var(--dsw-alias-brand-primary, #1677ff)\";\r\n\t\tdefault:\r\n\t\t\t// Prefer tertiary over dimmed: dimmed is near-invisible on light cards\r\n\t\t\t// and too dark on dark cards.\r\n\t\t\treturn \"var(--dsw-alias-label-tertiary, #81858c)\";\r\n\t}\r\n}\r\n\r\nexport function badgeStyle(tone: StatusTone): CSSProperties {\r\n\tconst color = statusToneColor(tone);\r\n\treturn {\r\n\t\tdisplay: \"inline-flex\",\r\n\t\talignItems: \"center\",\r\n\t\tgap: 6,\r\n\t\tpadding: \"3px 10px\",\r\n\t\tborderRadius: 999,\r\n\t\tfontSize: 12,\r\n\t\tfontWeight: 600,\r\n\t\tlineHeight: \"18px\",\r\n\t\tcolor,\r\n\t\tbackground: `color-mix(in srgb, ${color} 14%, transparent)`,\r\n\t\tborder: `1px solid color-mix(in srgb, ${color} 28%, transparent)`,\r\n\t\twhiteSpace: \"nowrap\",\r\n\t};\r\n}\r\n\r\nexport function dotStyle(\r\n\tstatus: ProviderStatus[\"status\"] | \"loading\" | \"available\" | \"unavailable\",\r\n\tinstalled = true,\r\n): CSSProperties {\r\n\tconst color = !installed\r\n\t\t? \"var(--dsw-alias-label-tertiary, #81858c)\"\r\n\t\t: status === \"signed-in\" || status === \"available\"\r\n\t\t\t? \"var(--dsw-alias-state-success-primary, #22a06b)\"\r\n\t\t\t: status === \"error\"\r\n\t\t\t\t? \"var(--dsw-alias-state-error-primary, #d92d20)\"\r\n\t\t\t\t: status === \"signing-in\" || status === \"loading\"\r\n\t\t\t\t\t? \"var(--dsw-alias-brand-primary, #1677ff)\"\r\n\t\t\t\t\t: \"var(--dsw-alias-label-tertiary, #81858c)\";\r\n\treturn { width: 9, height: 9, borderRadius: \"50%\", flex: \"0 0 auto\", background: color };\r\n}\r\n\r\nexport function providerStatusTone(status: ProviderStatus[\"status\"], installed = true): StatusTone {\r\n\tif (!installed) return \"neutral\";\r\n\tif (status === \"signed-in\") return \"success\";\r\n\tif (status === \"error\") return \"error\";\r\n\tif (status === \"signing-in\") return \"info\";\r\n\treturn \"neutral\";\r\n}\r\n", "/** About tab: terms, remote help, and plugin version. */\r\n\r\nimport { PLUGIN_VERSION } from \"../constants.ts\";\r\nimport { bodyStyle, cardStyle, hintStyle, linkStyle, titleStyle, warningStyle } from \"../styles.ts\";\r\nimport type { GrokBuildSettingsInjected } from \"../types.ts\";\r\n\r\nconst README_URL = \"https://github.com/lninghaha/dsh-coding-subscription-oauth#readme\";\r\n\r\nexport interface AboutTabProps {\r\n\tt: GrokBuildSettingsInjected[\"t\"];\r\n}\r\n\r\nexport function AboutTab({ t }: AboutTabProps) {\r\n\treturn (\r\n\t\t<section style={cardStyle} aria-labelledby=\"coding-oauth-about-title\">\r\n\t\t\t<h3 id=\"coding-oauth-about-title\" style={{ ...titleStyle, fontSize: 16 }}>\r\n\t\t\t\t{t(\"aboutTitle\")}\r\n\t\t\t</h3>\r\n\t\t\t<p style={{ ...warningStyle, marginTop: 12 }}>{t(\"termsWarning\")}</p>\r\n\t\t\t<p style={{ ...bodyStyle, marginTop: 12 }}>{t(\"remoteLoginHelp\")}</p>\r\n\t\t\t<p style={{ ...hintStyle, marginTop: 12 }}>{t(\"pluginVersion\", { version: PLUGIN_VERSION })}</p>\r\n\t\t\t<p style={{ ...hintStyle, marginTop: 8 }}>{t(\"aboutDocsHint\")}</p>\r\n\t\t\t<p style={{ marginTop: 8 }}>\r\n\t\t\t\t<a href={README_URL} target=\"_blank\" rel=\"noreferrer\" style={linkStyle}>\r\n\t\t\t\t\t{t(\"aboutDocsLink\")}\r\n\t\t\t\t</a>\r\n\t\t\t</p>\r\n\t\t</section>\r\n\t);\r\n}\r\n", "/** Accounts tab: provider cards, CLI tips, and pull preview. */\r\n\r\nimport { Fragment, useEffect, useRef } from \"react\";\r\nimport { PROVIDERS } from \"../constants.ts\";\r\nimport { allOfficialCliMissing, anyOfficialCliAvailable } from \"../display.ts\";\r\nimport {\r\n\taccountGridStyle,\r\n\tbodyStyle,\r\n\tcardStyle,\r\n\tdotStyle,\r\n\thintStyle,\r\n\tmonoStyle,\r\n\trowStyle,\r\n\tskeletonStyle,\r\n\tstatusStyle,\r\n\ttitleStyle,\r\n} from \"../styles.ts\";\r\nimport type {\r\n\tCodingOAuthStatus,\r\n\tGrokBuildSettingsInjected,\r\n\tLoginMethod,\r\n\tProviderSlug,\r\n\tSourcePreview,\r\n\tSourceStatus,\r\n\tUsageView,\r\n} from \"../types.ts\";\r\nimport { Badge } from \"./Badge.tsx\";\r\nimport { CliPullPreview } from \"./CliPullPreview.tsx\";\r\nimport { NoticeBanner } from \"./NoticeBanner.tsx\";\r\nimport { ProviderCard } from \"./ProviderCard.tsx\";\r\n\r\nexport interface AccountsTabProps {\r\n\tt: GrokBuildSettingsInjected[\"t\"];\r\n\tstatus: CodingOAuthStatus | undefined;\r\n\tremote: boolean;\r\n\tremoteTipDismissed: boolean;\r\n\tonDismissRemoteTip: () => void;\r\n\tsources: readonly SourceStatus[] | undefined;\r\n\tsourcesError: string | undefined;\r\n\tsourcesNotice: string | undefined;\r\n\tsourcesBusy: boolean;\r\n\tpreview: SourcePreview | undefined;\r\n\tconfirmOverwrite: boolean;\r\n\tbusyProvider: ProviderSlug | undefined;\r\n\tcodeInputs: Partial<Record<ProviderSlug, string>>;\r\n\tpopupBlocked: Partial<Record<ProviderSlug, boolean>>;\r\n\texpandedProviders: Partial<Record<ProviderSlug, boolean>>;\r\n\tshowUsage: boolean;\r\n\tusage: UsageView | undefined;\r\n\tusageError: string | undefined;\r\n\tusageLoading: boolean;\r\n\tonSignIn: (slug: ProviderSlug, method: LoginMethod) => void;\r\n\tonSignOut: (slug: ProviderSlug) => void;\r\n\tonCancelLogin: (slug: ProviderSlug) => void;\r\n\tonSubmitCode: (slug: ProviderSlug) => void;\r\n\tonCodeChange: (slug: ProviderSlug, value: string) => void;\r\n\tonToggleExpanded: (slug: ProviderSlug) => void;\r\n\tonPreviewSource: (slug: ProviderSlug) => void;\r\n\tonSaveModels: (slug: ProviderSlug, selected: string[]) => void;\r\n\tonConfirmOverwriteChange: (checked: boolean) => void;\r\n\tonCommitSource: () => void;\r\n\tonCancelSourcePreview: () => void;\r\n\tonRefreshSources: () => void;\r\n\tonDismissSourcesNotice: () => void;\r\n}\r\n\r\nexport function AccountsTab({\r\n\tt,\r\n\tstatus,\r\n\tremote,\r\n\tremoteTipDismissed,\r\n\tonDismissRemoteTip,\r\n\tsources,\r\n\tsourcesError,\r\n\tsourcesNotice,\r\n\tsourcesBusy,\r\n\tpreview,\r\n\tconfirmOverwrite,\r\n\tbusyProvider,\r\n\tcodeInputs,\r\n\tpopupBlocked,\r\n\texpandedProviders,\r\n\tshowUsage,\r\n\tusage,\r\n\tusageError,\r\n\tusageLoading,\r\n\tonSignIn,\r\n\tonSignOut,\r\n\tonCancelLogin,\r\n\tonSubmitCode,\r\n\tonCodeChange,\r\n\tonToggleExpanded,\r\n\tonPreviewSource,\r\n\tonSaveModels,\r\n\tonConfirmOverwriteChange,\r\n\tonCommitSource,\r\n\tonCancelSourcePreview,\r\n\tonRefreshSources,\r\n\tonDismissSourcesNotice,\r\n}: AccountsTabProps) {\r\n\tconst previousPreviewKind = useRef<ProviderSlug | undefined>(undefined);\r\n\tuseEffect(() => {\r\n\t\tif (preview !== undefined) {\r\n\t\t\tpreviousPreviewKind.current = preview.kind;\r\n\t\t\tdocument.getElementById(`coding-oauth-source-preview-${preview.kind}`)?.focus();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst trigger = previousPreviewKind.current;\r\n\t\tif (trigger === undefined || sourcesBusy) return;\r\n\t\tpreviousPreviewKind.current = undefined;\r\n\t\tdocument.getElementById(`coding-oauth-source-pull-${trigger}`)?.focus();\r\n\t}, [preview, sourcesBusy]);\r\n\r\n\tif (status === undefined) {\r\n\t\treturn (\r\n\t\t\t<div style={skeletonStyle} role=\"status\" aria-busy=\"true\">\r\n\t\t\t\t<div style={statusStyle}>\r\n\t\t\t\t\t<span aria-hidden=\"true\" style={dotStyle(\"loading\")} />\r\n\t\t\t\t\t{t(\"loadingAccount\")}\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t);\r\n\t}\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t{remote && !remoteTipDismissed ? (\r\n\t\t\t\t<NoticeBanner\r\n\t\t\t\t\tmessage={t(\"remoteAccountsTip\")}\r\n\t\t\t\t\tdismissLabel={t(\"remoteTipDismiss\")}\r\n\t\t\t\t\tonDismiss={onDismissRemoteTip}\r\n\t\t\t\t/>\r\n\t\t\t) : null}\r\n\t\t\t{allOfficialCliMissing(sources) ? (\r\n\t\t\t\t<NoticeBanner\r\n\t\t\t\t\tmessage={t(\"sourcesAllMissingHint\")}\r\n\t\t\t\t\tdismissLabel={t(\"sourcesCheckAgain\")}\r\n\t\t\t\t\tonDismiss={() => {\r\n\t\t\t\t\t\tonRefreshSources();\r\n\t\t\t\t\t}}\r\n\t\t\t\t/>\r\n\t\t\t) : null}\r\n\t\t\t{anyOfficialCliAvailable(sources) ? <p style={hintStyle}>{t(\"sourcesAvailableHint\")}</p> : null}\r\n\t\t\t{sourcesError === undefined ? null : (\r\n\t\t\t\t<p style={{ ...bodyStyle, color: \"var(--dsw-alias-state-error-primary)\" }} role=\"alert\">\r\n\t\t\t\t\t{sourcesError}\r\n\t\t\t\t</p>\r\n\t\t\t)}\r\n\t\t\t{sourcesNotice === undefined ? null : (\r\n\t\t\t\t<NoticeBanner\r\n\t\t\t\t\tkey={sourcesNotice}\r\n\t\t\t\t\tmessage={sourcesNotice}\r\n\t\t\t\t\ttone=\"success\"\r\n\t\t\t\t\tautoHideMs={5000}\r\n\t\t\t\t\tonDismiss={onDismissSourcesNotice}\r\n\t\t\t\t/>\r\n\t\t\t)}\r\n\t\t\t<div style={accountGridStyle}>\r\n\t\t\t\t{PROVIDERS.map((definition) => {\r\n\t\t\t\t\tconst providerStatus = status.providers[definition.slug];\r\n\t\t\t\t\tconst expanded = providerStatus.status === \"signing-in\" || expandedProviders[definition.slug] === true;\r\n\t\t\t\t\treturn (\r\n\t\t\t\t\t\t<Fragment key={definition.slug}>\r\n\t\t\t\t\t\t\t<ProviderCard\r\n\t\t\t\t\t\t\t\tt={t}\r\n\t\t\t\t\t\t\t\tdefinition={definition}\r\n\t\t\t\t\t\t\t\tproviderStatus={providerStatus}\r\n\t\t\t\t\t\t\t\tbusy={busyProvider === definition.slug}\r\n\t\t\t\t\t\t\t\tsourcesBusy={sourcesBusy}\r\n\t\t\t\t\t\t\t\tremote={remote}\r\n\t\t\t\t\t\t\t\tcodeInput={codeInputs[definition.slug] ?? \"\"}\r\n\t\t\t\t\t\t\t\tpopupBlocked={popupBlocked[definition.slug] === true}\r\n\t\t\t\t\t\t\t\texpanded={expanded}\r\n\t\t\t\t\t\t\t\tsource={sources?.find((entry) => entry.kind === definition.slug)}\r\n\t\t\t\t\t\t\t\tshowUsage={showUsage}\r\n\t\t\t\t\t\t\t\tusage={usage}\r\n\t\t\t\t\t\t\t\tusageError={usageError}\r\n\t\t\t\t\t\t\t\tusageLoading={usageLoading}\r\n\t\t\t\t\t\t\t\tonSignIn={(method) => {\r\n\t\t\t\t\t\t\t\t\tonSignIn(definition.slug, method);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\tonSignOut={() => {\r\n\t\t\t\t\t\t\t\t\tonSignOut(definition.slug);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\tonCancelLogin={() => {\r\n\t\t\t\t\t\t\t\t\tonCancelLogin(definition.slug);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\tonSubmitCode={() => {\r\n\t\t\t\t\t\t\t\t\tonSubmitCode(definition.slug);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\tonCodeChange={(value) => {\r\n\t\t\t\t\t\t\t\t\tonCodeChange(definition.slug, value);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\tonToggleExpanded={() => {\r\n\t\t\t\t\t\t\t\t\tonToggleExpanded(definition.slug);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\tonPreviewSource={() => {\r\n\t\t\t\t\t\t\t\t\tonPreviewSource(definition.slug);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\tonSaveModels={(selected) => {\r\n\t\t\t\t\t\t\t\t\tonSaveModels(definition.slug, selected);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t{preview?.kind === definition.slug ? (\r\n\t\t\t\t\t\t\t\t<div style={{ gridColumn: \"1 / -1\", minWidth: 0 }}>\r\n\t\t\t\t\t\t\t\t\t<CliPullPreview\r\n\t\t\t\t\t\t\t\t\t\tt={t}\r\n\t\t\t\t\t\t\t\t\t\tpreview={preview}\r\n\t\t\t\t\t\t\t\t\t\tconfirmOverwrite={confirmOverwrite}\r\n\t\t\t\t\t\t\t\t\t\tsourcesBusy={sourcesBusy}\r\n\t\t\t\t\t\t\t\t\t\tonConfirmOverwriteChange={onConfirmOverwriteChange}\r\n\t\t\t\t\t\t\t\t\t\tonCommit={onCommitSource}\r\n\t\t\t\t\t\t\t\t\t\tonCancel={onCancelSourcePreview}\r\n\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t) : null}\r\n\t\t\t\t\t\t</Fragment>\r\n\t\t\t\t\t);\r\n\t\t\t\t})}\r\n\t\t\t\t<div style={cardStyle}>\r\n\t\t\t\t\t<div style={rowStyle}>\r\n\t\t\t\t\t\t<div>\r\n\t\t\t\t\t\t\t<h3 style={{ ...titleStyle, fontSize: 16 }}>{t(\"antigravityTitle\")}</h3>\r\n\t\t\t\t\t\t\t<p style={{ ...bodyStyle, marginTop: 4 }}>{t(\"antigravityDescription\")}</p>\r\n\t\t\t\t\t\t\t<p style={{ ...bodyStyle, marginTop: 4 }}>\r\n\t\t\t\t\t\t\t\t<span style={monoStyle}>{status.antigravity.route}</span>\r\n\t\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t<Badge\r\n\t\t\t\t\t\t\tlabel={status.antigravity.installed ? t(\"antigravityInstalled\") : t(\"antigravityMissing\")}\r\n\t\t\t\t\t\t\ttone={status.antigravity.installed ? \"success\" : \"neutral\"}\r\n\t\t\t\t\t\t\tinstalled={status.antigravity.installed}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<p style={bodyStyle}>{t(\"antigravityCliHint\")}</p>\r\n\t\t\t\t\t<code style={{ ...monoStyle, fontSize: 12, overflowWrap: \"anywhere\" }}>{t(\"antigravityCliCommand\")}</code>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</>\r\n\t);\r\n}\r\n", "/** Pure display helpers for remote UX and CLI pull noise control. */\r\n\r\nimport type { GrokBuildSettingsInjected, LoginMethod, ProviderCardDefinition, SourceStatus } from \"./types.ts\";\r\n\r\nconst LOOPBACK_HOSTS = new Set([\"localhost\", \"127.0.0.1\", \"[::1]\", \"::1\"]);\r\n\r\n/** True when the Settings page is served from a non-loopback host (typical remote DSH). */\r\nexport function isLikelyRemoteHost(hostname: string): boolean {\r\n\tconst normalized = hostname.trim().toLowerCase();\r\n\tif (normalized.length === 0) return false;\r\n\tif (LOOPBACK_HOSTS.has(normalized)) return false;\r\n\tif (normalized.endsWith(\".localhost\")) return false;\r\n\treturn true;\r\n}\r\n\r\nexport function preferredLoginMethod(definition: ProviderCardDefinition, remote: boolean): LoginMethod {\r\n\tif (\r\n\t\tremote &&\r\n\t\tdefinition.remoteRecommended !== undefined &&\r\n\t\tdefinition.methods.includes(definition.remoteRecommended)\r\n\t) {\r\n\t\treturn definition.remoteRecommended;\r\n\t}\r\n\treturn definition.recommended;\r\n}\r\n\r\n/** Put the recommended method first so the primary CTA is unambiguous. */\r\nexport function orderedLoginMethods(definition: ProviderCardDefinition, remote: boolean): LoginMethod[] {\r\n\tconst preferred = preferredLoginMethod(definition, remote);\r\n\tconst rest = definition.methods.filter((method) => method !== preferred);\r\n\treturn definition.methods.includes(preferred) ? [preferred, ...rest] : [...definition.methods];\r\n}\r\n\r\n/** Per-card CLI \u201Cmissing\u201D copy is noisy on remote hosts; keep only actionable reasons. */\r\nexport function shouldShowPerCardSourceReason(source: SourceStatus | undefined): boolean {\r\n\tif (source === undefined || source.available) return false;\r\n\tif (source.reason === undefined) return false;\r\n\treturn source.reason !== \"missing\";\r\n}\r\n\r\nexport function allOfficialCliMissing(sources: readonly SourceStatus[] | undefined): boolean {\r\n\tif (sources === undefined || sources.length === 0) return false;\r\n\treturn sources.every((source) => !source.available && (source.reason === undefined || source.reason === \"missing\"));\r\n}\r\n\r\nexport function anyOfficialCliAvailable(sources: readonly SourceStatus[] | undefined): boolean {\r\n\treturn sources?.some((source) => source.available) === true;\r\n}\r\n\r\nexport function methodLabel(\r\n\tmethod: LoginMethod,\r\n\tt: GrokBuildSettingsInjected[\"t\"],\r\n\toptions?: { remote?: boolean; primary?: boolean },\r\n): string {\r\n\tif (method === \"device\") {\r\n\t\tif (options?.remote === true && options.primary === true) return t(\"deviceLoginRemote\");\r\n\t\treturn t(\"deviceLogin\");\r\n\t}\r\n\tif (method === \"browser\") return t(\"browserLogin\");\r\n\treturn t(\"pkceLogin\");\r\n}\r\n", "/** Status capsule badge with semantic tone colors. */\r\n\r\nimport { badgeStyle, dotStyle, providerStatusTone, type StatusTone } from \"../styles.ts\";\r\nimport type { ProviderStatus } from \"../types.ts\";\r\n\r\nexport interface BadgeProps {\r\n\tlabel: string;\r\n\ttone?: StatusTone;\r\n\t/** When set, derives tone from provider login status. */\r\n\tproviderStatus?: ProviderStatus[\"status\"];\r\n\tinstalled?: boolean;\r\n\tshowDot?: boolean;\r\n}\r\n\r\nexport function Badge({ label, tone, providerStatus, installed = true, showDot = true }: BadgeProps) {\r\n\tconst resolvedTone =\r\n\t\ttone ?? (providerStatus !== undefined ? providerStatusTone(providerStatus, installed) : \"neutral\");\r\n\treturn (\r\n\t\t<span style={badgeStyle(resolvedTone)} role=\"status\">\r\n\t\t\t{showDot ? (\r\n\t\t\t\t<span\r\n\t\t\t\t\taria-hidden=\"true\"\r\n\t\t\t\t\tstyle={{\r\n\t\t\t\t\t\t...dotStyle(providerStatus ?? (resolvedTone === \"success\" ? \"signed-in\" : \"signed-out\"), installed),\r\n\t\t\t\t\t\twidth: 7,\r\n\t\t\t\t\t\theight: 7,\r\n\t\t\t\t\t}}\r\n\t\t\t\t/>\r\n\t\t\t) : null}\r\n\t\t\t<span>{label}</span>\r\n\t\t</span>\r\n\t);\r\n}\r\n", "/** Response parsers and small formatting helpers for the settings UI. */\r\n\r\nimport { isRecord } from \"./api.ts\";\r\nimport {\r\n\tGATEWAY_PORT_MAX,\r\n\tGATEWAY_PORT_MIN,\r\n\tGATEWAY_RANDOM_PORT_MAX,\r\n\tGATEWAY_RANDOM_PORT_MIN,\r\n\tGATEWAY_RANDOM_RESERVED,\r\n\tHOUR_MS,\r\n\tIMAGINE_SOURCE_KEY,\r\n\tSOURCE_COMMIT_ACTIONS,\r\n\tSOURCE_CONFLICTS,\r\n\tSOURCE_DEFAULT_PATH,\r\n\tSOURCE_KINDS,\r\n\tSOURCE_PREVIEW_ACTIONS,\r\n\tSOURCE_REASONS,\r\n} from \"./constants.ts\";\r\nimport type {\r\n\tCapabilitySettingsView,\r\n\tCapabilitySnapshot,\r\n\tGatewayView,\r\n\tGrokBuildSettingsInjected,\r\n\tImagineCredentialView,\r\n\tProviderStatus,\r\n\tSourceCommitAction,\r\n\tSourceConflict,\r\n\tSourceKind,\r\n\tSourcePreview,\r\n\tSourcePreviewAction,\r\n\tSourceReason,\r\n\tSourceStatus,\r\n\tUsageLimitView,\r\n\tUsageView,\r\n\tUsageWindowView,\r\n} from \"./types.ts\";\r\n\r\nexport function optionalString(value: unknown): string | undefined {\r\n\treturn typeof value === \"string\" && value.length > 0 && value.length < 500 ? value : undefined;\r\n}\r\n\r\nexport function optionalFiniteNumber(value: unknown): number | undefined {\r\n\treturn typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\r\n}\r\n\r\nexport function optionalBoolean(value: unknown): boolean | undefined {\r\n\treturn typeof value === \"boolean\" ? value : undefined;\r\n}\r\n\r\nexport function optionalPercent(value: unknown): number | undefined {\r\n\tconst numeric = optionalFiniteNumber(value);\r\n\treturn numeric !== undefined && numeric >= 0 && numeric <= 100 ? numeric : undefined;\r\n}\r\n\r\nexport function isSourceKind(value: string): value is SourceKind {\r\n\treturn (SOURCE_KINDS as readonly string[]).includes(value);\r\n}\r\n\r\nexport function isSourceReason(value: string): value is SourceReason {\r\n\treturn (SOURCE_REASONS as readonly string[]).includes(value);\r\n}\r\n\r\nexport function isSourceConflict(value: string): value is SourceConflict {\r\n\treturn (SOURCE_CONFLICTS as readonly string[]).includes(value);\r\n}\r\n\r\nexport function isSourcePreviewAction(value: string): value is SourcePreviewAction {\r\n\treturn (SOURCE_PREVIEW_ACTIONS as readonly string[]).includes(value);\r\n}\r\n\r\nexport function isSourceCommitAction(value: string): value is SourceCommitAction {\r\n\treturn (SOURCE_COMMIT_ACTIONS as readonly string[]).includes(value);\r\n}\r\n\r\nexport function looksSecret(value: string): boolean {\r\n\treturn /eyJ[A-Za-z0-9_-]+\\.|sk-[A-Za-z0-9_-]{8,}|Bearer\\s+\\S+/u.test(value);\r\n}\r\n\r\nexport function safeDisplayPath(value: unknown, kind: SourceKind): string {\r\n\tconst text = optionalString(value);\r\n\tif (text === undefined || looksSecret(text) || text.length > 180) return SOURCE_DEFAULT_PATH[kind];\r\n\treturn text;\r\n}\r\n\r\nexport function safeWarning(value: unknown): string | undefined {\r\n\tconst text = optionalString(value);\r\n\tif (text === undefined || looksSecret(text)) return undefined;\r\n\treturn text;\r\n}\r\n\r\nexport function formatEpoch(value: number | undefined): string | undefined {\r\n\tif (value === undefined || !Number.isFinite(value) || value <= 0) return undefined;\r\n\tconst ms = value > 1e12 ? value : value > 1e9 ? value * 1000 : undefined;\r\n\tif (ms === undefined) return undefined;\r\n\tconst formatted = new Date(ms).toLocaleString();\r\n\treturn formatted.length > 0 ? formatted : undefined;\r\n}\r\n\r\nexport function parseSource(value: unknown): SourceStatus | undefined {\r\n\tif (!isRecord(value) || typeof value[\"kind\"] !== \"string\" || !isSourceKind(value[\"kind\"])) return undefined;\r\n\tconst kind = value[\"kind\"];\r\n\tconst reasonRaw = optionalString(value[\"reason\"]);\r\n\tconst expiresAt = optionalFiniteNumber(value[\"expiresAt\"]);\r\n\treturn {\r\n\t\tkind,\r\n\t\tdisplayPath: safeDisplayPath(value[\"displayPath\"], kind),\r\n\t\tavailable: value[\"available\"] === true,\r\n\t\t...(expiresAt === undefined ? {} : { expiresAt }),\r\n\t\t...(reasonRaw !== undefined && isSourceReason(reasonRaw) ? { reason: reasonRaw } : {}),\r\n\t};\r\n}\r\n\r\nexport function mergeSources(discovered: readonly SourceStatus[]): SourceStatus[] {\r\n\treturn SOURCE_KINDS.map((kind) => {\r\n\t\tconst found = discovered.find((entry) => entry.kind === kind);\r\n\t\treturn found ?? { kind, displayPath: SOURCE_DEFAULT_PATH[kind], available: false, reason: \"missing\" };\r\n\t});\r\n}\r\n\r\nexport function parseSources(value: unknown): SourceStatus[] {\r\n\tconst rows = Array.isArray(value)\r\n\t\t? value\r\n\t\t: isRecord(value) && Array.isArray(value[\"sources\"])\r\n\t\t\t? value[\"sources\"]\r\n\t\t\t: [];\r\n\treturn mergeSources(rows.map(parseSource).filter((entry): entry is SourceStatus => entry !== undefined));\r\n}\r\n\r\nexport function parsePreview(value: unknown): SourcePreview | undefined {\r\n\tif (!isRecord(value)) return undefined;\r\n\tconst previewId = optionalString(value[\"previewId\"]);\r\n\tconst kindRaw = optionalString(value[\"kind\"]);\r\n\tif (previewId === undefined || kindRaw === undefined || !isSourceKind(kindRaw)) return undefined;\r\n\tconst conflictRaw = optionalString(value[\"conflict\"]);\r\n\tconst actionRaw = optionalString(value[\"action\"]);\r\n\tconst expiresAt = optionalFiniteNumber(value[\"expiresAt\"]);\r\n\tconst ticketExpiresAt = optionalFiniteNumber(value[\"ticketExpiresAt\"]);\r\n\tconst warnings = Array.isArray(value[\"warnings\"])\r\n\t\t? value[\"warnings\"].map(safeWarning).filter((entry): entry is string => entry !== undefined)\r\n\t\t: [];\r\n\treturn {\r\n\t\tpreviewId,\r\n\t\tkind: kindRaw,\r\n\t\tdisplayPath: safeDisplayPath(value[\"displayPath\"], kindRaw),\r\n\t\tconfirmOverwriteRequired: value[\"confirmOverwriteRequired\"] === true,\r\n\t\twarnings,\r\n\t\t...(expiresAt === undefined ? {} : { expiresAt }),\r\n\t\t...(ticketExpiresAt === undefined ? {} : { ticketExpiresAt }),\r\n\t\t...(conflictRaw !== undefined && isSourceConflict(conflictRaw) ? { conflict: conflictRaw } : {}),\r\n\t\t...(actionRaw !== undefined && isSourcePreviewAction(actionRaw) ? { action: actionRaw } : {}),\r\n\t};\r\n}\r\n\r\nexport function parseCommitAction(value: unknown): SourceCommitAction | undefined {\r\n\tif (!isRecord(value)) return undefined;\r\n\tconst action = optionalString(value[\"action\"]);\r\n\treturn action !== undefined && isSourceCommitAction(action) ? action : undefined;\r\n}\r\n\r\nexport function boundedInteger(value: unknown, min: number, max: number, fallback: number): number {\r\n\tconst numeric = optionalFiniteNumber(value);\r\n\treturn numeric !== undefined && Number.isInteger(numeric) && numeric >= min && numeric <= max ? numeric : fallback;\r\n}\r\n\r\nexport function emptyCapabilitySettings(): CapabilitySettingsView {\r\n\treturn {\r\n\t\tcodexSearch: false,\r\n\t\tcodexImages: false,\r\n\t\tcodexImageEdits: false,\r\n\t\tcodexUsage: false,\r\n\t\tcodexFast: false,\r\n\t\tgrokImagineImage: false,\r\n\t\tgrokImagineVideo: false,\r\n\t\tsearchResults: 5,\r\n\t\timageCount: 1,\r\n\t\tvideoArtifactTtlMs: 7 * 24 * HOUR_MS,\r\n\t};\r\n}\r\n\r\nexport function parseCapabilitySettings(value: unknown): CapabilitySettingsView {\r\n\tconst source = isRecord(value) ? value : {};\r\n\treturn {\r\n\t\tcodexSearch: source[\"codexSearch\"] === true,\r\n\t\tcodexImages: source[\"codexImages\"] === true,\r\n\t\tcodexImageEdits: source[\"codexImageEdits\"] === true,\r\n\t\tcodexUsage: source[\"codexUsage\"] === true,\r\n\t\tcodexFast: source[\"codexFast\"] === true,\r\n\t\tgrokImagineImage: source[\"grokImagineImage\"] === true,\r\n\t\tgrokImagineVideo: source[\"grokImagineVideo\"] === true,\r\n\t\tsearchResults: boundedInteger(source[\"searchResults\"], 1, 20, 5),\r\n\t\timageCount: boundedInteger(source[\"imageCount\"], 1, 4, 1),\r\n\t\tvideoArtifactTtlMs: boundedInteger(source[\"videoArtifactTtlMs\"], HOUR_MS, 7 * 24 * HOUR_MS, 7 * 24 * HOUR_MS),\r\n\t};\r\n}\r\n\r\nexport function parseCapabilities(value: unknown): CapabilitySnapshot | undefined {\r\n\tif (!isRecord(value)) return undefined;\r\n\tconst nested = isRecord(value[\"value\"]) ? value[\"value\"] : value;\r\n\tconst revision = optionalFiniteNumber(value[\"revision\"]);\r\n\tif (revision === undefined && !isRecord(value[\"value\"]) && value[\"writable\"] === undefined) return undefined;\r\n\treturn {\r\n\t\tvalue: parseCapabilitySettings(nested),\r\n\t\trevision: revision ?? 0,\r\n\t\twritable: value[\"writable\"] === true,\r\n\t};\r\n}\r\n\r\nfunction parseUsageWindow(value: unknown): UsageWindowView | undefined {\r\n\tif (!isRecord(value)) return undefined;\r\n\tconst usedPercent = optionalPercent(value[\"usedPercent\"] ?? value[\"used_percent\"]);\r\n\tconst remainingPercent = optionalPercent(value[\"remainingPercent\"] ?? value[\"remaining_percent\"]);\r\n\tconst windowSeconds = optionalFiniteNumber(value[\"windowSeconds\"] ?? value[\"limit_window_seconds\"]);\r\n\tconst resetsAt = optionalFiniteNumber(value[\"resetsAt\"] ?? value[\"reset_at\"]);\r\n\tif (\r\n\t\tusedPercent === undefined &&\r\n\t\tremainingPercent === undefined &&\r\n\t\twindowSeconds === undefined &&\r\n\t\tresetsAt === undefined\r\n\t) {\r\n\t\treturn undefined;\r\n\t}\r\n\treturn {\r\n\t\t...(usedPercent === undefined ? {} : { usedPercent }),\r\n\t\t...(remainingPercent === undefined ? {} : { remainingPercent }),\r\n\t\t...(windowSeconds !== undefined && windowSeconds > 0 ? { windowSeconds } : {}),\r\n\t\t...(resetsAt === undefined ? {} : { resetsAt }),\r\n\t};\r\n}\r\n\r\nfunction parseUsageLimit(value: unknown, fallbackId: string): UsageLimitView | undefined {\r\n\tif (!isRecord(value)) return undefined;\r\n\tconst id = optionalString(value[\"id\"]) ?? optionalString(value[\"metered_feature\"]) ?? fallbackId;\r\n\tconst name = optionalString(value[\"name\"]) ?? optionalString(value[\"limit_name\"]);\r\n\tconst nested = isRecord(value[\"rate_limit\"]) ? value[\"rate_limit\"] : value;\r\n\tconst windows = Array.isArray(value[\"windows\"])\r\n\t\t? value[\"windows\"].map(parseUsageWindow).filter((entry): entry is UsageWindowView => entry !== undefined)\r\n\t\t: [\r\n\t\t\t\tparseUsageWindow(nested[\"primary_window\"]),\r\n\t\t\t\tparseUsageWindow(nested[\"secondary_window\"]),\r\n\t\t\t\tparseUsageWindow(nested),\r\n\t\t\t].filter((entry): entry is UsageWindowView => entry !== undefined);\r\n\tif (windows.length === 0 && name === undefined && optionalString(value[\"id\"]) === undefined) return undefined;\r\n\treturn { id, windows, ...(name === undefined ? {} : { name }) };\r\n}\r\n\r\nexport function parseUsage(value: unknown): UsageView | undefined {\r\n\tif (!isRecord(value)) return undefined;\r\n\tconst payload = isRecord(value[\"usage\"]) ? value[\"usage\"] : value;\r\n\tconst rateLimits: UsageLimitView[] = [];\r\n\tconst seen = new Set<string>();\r\n\tconst add = (limit: UsageLimitView | undefined): void => {\r\n\t\tif (limit === undefined || seen.has(limit.id)) return;\r\n\t\tseen.add(limit.id);\r\n\t\trateLimits.push(limit);\r\n\t};\r\n\tif (Array.isArray(payload[\"rateLimits\"])) {\r\n\t\tpayload[\"rateLimits\"].forEach((entry, index) => add(parseUsageLimit(entry, `limit-${String(index)}`)));\r\n\t} else {\r\n\t\tadd(parseUsageLimit(payload[\"rate_limit\"], \"codex\"));\r\n\t\tif (Array.isArray(payload[\"additional_rate_limits\"])) {\r\n\t\t\tpayload[\"additional_rate_limits\"].forEach((entry, index) =>\r\n\t\t\t\tadd(parseUsageLimit(entry, `extra-${String(index)}`)),\r\n\t\t\t);\r\n\t\t}\r\n\t\tadd(parseUsageLimit(payload[\"code_review_rate_limit\"], \"code_review\"));\r\n\t}\r\n\tconst credits = isRecord(payload[\"credits\"]) ? payload[\"credits\"] : undefined;\r\n\tconst spend = isRecord(payload[\"individualLimit\"])\r\n\t\t? payload[\"individualLimit\"]\r\n\t\t: isRecord(payload[\"spend_control\"])\r\n\t\t\t? isRecord(payload[\"spend_control\"][\"individual_limit\"])\r\n\t\t\t\t? payload[\"spend_control\"][\"individual_limit\"]\r\n\t\t\t\t: payload[\"spend_control\"]\r\n\t\t\t: undefined;\r\n\tconst resetRaw = isRecord(payload[\"resetCredits\"])\r\n\t\t? payload[\"resetCredits\"][\"availableCount\"]\r\n\t\t: isRecord(payload[\"rate_limit_reset_credits\"])\r\n\t\t\t? payload[\"rate_limit_reset_credits\"][\"available_count\"]\r\n\t\t\t: undefined;\r\n\tconst resetCredits = optionalFiniteNumber(resetRaw);\r\n\tconst fetchedAt = optionalFiniteNumber(payload[\"fetchedAt\"]);\r\n\tconst spendControlReached =\r\n\t\toptionalBoolean(payload[\"spendControlReached\"]) ??\r\n\t\t(isRecord(payload[\"spend_control\"]) ? optionalBoolean(payload[\"spend_control\"][\"reached\"]) : undefined);\r\n\tconst creditsBalance = credits === undefined ? undefined : optionalString(credits[\"balance\"]);\r\n\tconst individualLimit = spend === undefined ? undefined : optionalString(spend[\"limit\"]);\r\n\tconst individualUsed = spend === undefined ? undefined : optionalString(spend[\"used\"]);\r\n\tconst individualRemaining = spend === undefined ? undefined : optionalString(spend[\"remaining\"]);\r\n\tconst individualRemainingPercent =\r\n\t\tspend === undefined ? undefined : optionalPercent(spend[\"remainingPercent\"] ?? spend[\"remaining_percent\"]);\r\n\tconst individualResetsAt =\r\n\t\tspend === undefined ? undefined : optionalFiniteNumber(spend[\"resetsAt\"] ?? spend[\"reset_at\"]);\r\n\treturn {\r\n\t\trateLimits,\r\n\t\t...(credits !== undefined && typeof credits[\"unlimited\"] === \"boolean\"\r\n\t\t\t? { creditsUnlimited: credits[\"unlimited\"] }\r\n\t\t\t: {}),\r\n\t\t...(creditsBalance === undefined ? {} : { creditsBalance }),\r\n\t\t...(individualLimit === undefined ? {} : { individualLimit }),\r\n\t\t...(individualUsed === undefined ? {} : { individualUsed }),\r\n\t\t...(individualRemaining === undefined ? {} : { individualRemaining }),\r\n\t\t...(individualRemainingPercent === undefined ? {} : { individualRemainingPercent }),\r\n\t\t...(individualResetsAt === undefined ? {} : { individualResetsAt }),\r\n\t\t...(spendControlReached === undefined ? {} : { spendControlReached }),\r\n\t\t...(resetCredits !== undefined && resetCredits >= 0 && Number.isSafeInteger(resetCredits) ? { resetCredits } : {}),\r\n\t\t...(fetchedAt === undefined ? {} : { fetchedAt }),\r\n\t};\r\n}\r\n\r\nexport function usageHasVisibleFields(usage: UsageView): boolean {\r\n\treturn (\r\n\t\tusage.rateLimits.some((limit) => limit.windows.length > 0 || limit.name !== undefined) ||\r\n\t\tusage.creditsUnlimited !== undefined ||\r\n\t\tusage.creditsBalance !== undefined ||\r\n\t\tusage.individualLimit !== undefined ||\r\n\t\tusage.individualUsed !== undefined ||\r\n\t\tusage.individualRemaining !== undefined ||\r\n\t\tusage.individualRemainingPercent !== undefined ||\r\n\t\tusage.spendControlReached === true ||\r\n\t\tusage.resetCredits !== undefined\r\n\t);\r\n}\r\n\r\nexport function parseGateway(value: unknown): GatewayView | undefined {\r\n\tif (!isRecord(value)) return undefined;\r\n\tconst bind = optionalString(value[\"bind\"]);\r\n\tconst port = optionalFiniteNumber(value[\"port\"]);\r\n\tif (bind === undefined || port === undefined) return undefined;\r\n\tconst models = Array.isArray(value[\"models\"])\r\n\t\t? value[\"models\"].filter((model): model is string => typeof model === \"string\" && model.length > 0)\r\n\t\t: [];\r\n\tconst model = optionalString(value[\"model\"]) ?? models[0] ?? null;\r\n\tif (models.length === 0 && model !== null) models.push(model);\r\n\tconst keyAvailable = value[\"keyAvailable\"] === true || value[\"keyConfigured\"] === true;\r\n\treturn {\r\n\t\tenabled: value[\"enabled\"] === true,\r\n\t\trunning: value[\"running\"] === true,\r\n\t\tbind,\r\n\t\tport,\r\n\t\tmodel,\r\n\t\tkeyConfigured: keyAvailable,\r\n\t\tkeyAvailable,\r\n\t\tkeyHint: optionalString(value[\"keyHint\"]) ?? \"\",\r\n\t\tmodels,\r\n\t\twarning: optionalString(value[\"warning\"]) ?? \"\",\r\n\t};\r\n}\r\n\r\nexport function formatGatewayBaseUrl(bind: string, port: number): string {\r\n\tconst host = bind.includes(\":\") && !bind.startsWith(\"[\") ? `[${bind}]` : bind;\r\n\treturn `http://${host}:${String(port)}`;\r\n}\r\n\r\nexport function randomGatewayPort(exclude?: number): number {\r\n\tfor (let attempt = 0; attempt < 32; attempt += 1) {\r\n\t\tconst span = GATEWAY_RANDOM_PORT_MAX - GATEWAY_RANDOM_PORT_MIN + 1;\r\n\t\tconst candidate = GATEWAY_RANDOM_PORT_MIN + Math.floor(Math.random() * span);\r\n\t\tif (candidate !== exclude && !GATEWAY_RANDOM_RESERVED.has(candidate)) return candidate;\r\n\t}\r\n\treturn exclude === GATEWAY_RANDOM_PORT_MIN ? GATEWAY_RANDOM_PORT_MIN + 1 : GATEWAY_RANDOM_PORT_MIN;\r\n}\r\n\r\nexport function parseGatewayPort(value: string): number | undefined {\r\n\tconst port = Number(value);\r\n\tif (!Number.isInteger(port) || port < GATEWAY_PORT_MIN || port > GATEWAY_PORT_MAX) return undefined;\r\n\treturn port;\r\n}\r\n\r\nexport function parseImagineCredential(value: unknown): ImagineCredentialView | undefined {\r\n\tif (!isRecord(value)) return undefined;\r\n\tconst configured = optionalBoolean(value[\"configured\"]);\r\n\tif (configured === undefined && value[\"source\"] === undefined && value[\"writable\"] === undefined) return undefined;\r\n\tconst source = optionalString(value[\"source\"]);\r\n\tconst writable = optionalBoolean(value[\"writable\"]);\r\n\treturn {\r\n\t\tconfigured: configured === true,\r\n\t\t...(source === undefined || looksSecret(source) ? {} : { source }),\r\n\t\t...(writable === undefined ? {} : { writable }),\r\n\t};\r\n}\r\n\r\nexport function imagineSourceLabel(source: string | undefined, t: GrokBuildSettingsInjected[\"t\"]): string {\r\n\tif (source === undefined) return t(\"imagineSourceUnknown\");\r\n\tconst mapped = IMAGINE_SOURCE_KEY[source] ?? IMAGINE_SOURCE_KEY[source.toLowerCase()];\r\n\tif (mapped !== undefined) return t(mapped);\r\n\tif (source.length <= 40 && /^[a-z0-9._-]+$/iu.test(source) && !looksSecret(source)) return source;\r\n\treturn t(\"imagineSourceUnknown\");\r\n}\r\n\r\nexport function modelFields(status: ProviderStatus): { available: string[]; selected: string[] } {\r\n\tif (status.status !== \"signed-in\") return { available: [], selected: [] };\r\n\treturn {\r\n\t\tavailable: \"available\" in status ? status.available : [],\r\n\t\tselected: \"selected\" in status ? status.selected : [],\r\n\t};\r\n}\r\n", "/** CLI credential pull preview panel. */\r\n\r\nimport { SOURCE_CONFLICT_KEY, SOURCE_KIND_KEY, SOURCE_PREVIEW_ACTION_KEY } from \"../constants.ts\";\r\nimport { formatEpoch } from \"../parsers.ts\";\r\nimport {\r\n\tbodyStyle,\r\n\tbuttonStyle,\r\n\tcardStyle,\r\n\tcheckRowStyle,\r\n\thintStyle,\r\n\tlistStyle,\r\n\tmonoStyle,\r\n\tprimaryButtonStyle,\r\n} from \"../styles.ts\";\r\nimport type { GrokBuildSettingsInjected, SourcePreview } from \"../types.ts\";\r\n\r\nexport interface CliPullPreviewProps {\r\n\tt: GrokBuildSettingsInjected[\"t\"];\r\n\tpreview: SourcePreview;\r\n\tconfirmOverwrite: boolean;\r\n\tsourcesBusy: boolean;\r\n\tonConfirmOverwriteChange: (checked: boolean) => void;\r\n\tonCommit: () => void;\r\n\tonCancel: () => void;\r\n}\r\n\r\nexport function CliPullPreview({\r\n\tt,\r\n\tpreview,\r\n\tconfirmOverwrite,\r\n\tsourcesBusy,\r\n\tonConfirmOverwriteChange,\r\n\tonCommit,\r\n\tonCancel,\r\n}: CliPullPreviewProps) {\r\n\tconst expiresAt = formatEpoch(preview.expiresAt);\r\n\tconst ticketExpiresAt = formatEpoch(preview.ticketExpiresAt);\r\n\r\n\treturn (\r\n\t\t<section\r\n\t\t\tid={`coding-oauth-source-preview-${preview.kind}`}\r\n\t\t\tstyle={cardStyle}\r\n\t\t\taria-labelledby={`coding-oauth-source-preview-title-${preview.kind}`}\r\n\t\t\taria-live=\"polite\"\r\n\t\t\ttabIndex={-1}\r\n\t\t>\r\n\t\t\t<p id={`coding-oauth-source-preview-title-${preview.kind}`} style={bodyStyle}>\r\n\t\t\t\t{t(\"sourcesPreviewTitle\")} \u00B7 {t(SOURCE_KIND_KEY[preview.kind])}\r\n\t\t\t</p>\r\n\t\t\t<p style={hintStyle}>\r\n\t\t\t\t<span style={monoStyle}>{preview.displayPath}</span>\r\n\t\t\t</p>\r\n\t\t\t<p style={bodyStyle}>\r\n\t\t\t\t{t(\"sourcesConflict\", {\r\n\t\t\t\t\tdetail: t(\r\n\t\t\t\t\t\tpreview.conflict === undefined ? \"sourceConflictUnrecognized\" : SOURCE_CONFLICT_KEY[preview.conflict],\r\n\t\t\t\t\t),\r\n\t\t\t\t})}\r\n\t\t\t</p>\r\n\t\t\t<p style={bodyStyle}>\r\n\t\t\t\t{t(\"sourcesAction\", {\r\n\t\t\t\t\tdetail: t(\r\n\t\t\t\t\t\tpreview.action === undefined ? \"sourceActionUnrecognized\" : SOURCE_PREVIEW_ACTION_KEY[preview.action],\r\n\t\t\t\t\t),\r\n\t\t\t\t})}\r\n\t\t\t</p>\r\n\t\t\t{expiresAt === undefined ? null : <p style={hintStyle}>{t(\"sourcesPreviewExpires\", { time: expiresAt })}</p>}\r\n\t\t\t{ticketExpiresAt === undefined ? null : (\r\n\t\t\t\t<p style={hintStyle}>{t(\"sourcesTicketExpires\", { time: ticketExpiresAt })}</p>\r\n\t\t\t)}\r\n\t\t\t{preview.warnings.length === 0 ? null : (\r\n\t\t\t\t<ul style={{ ...listStyle, gap: 4 }} aria-label={t(\"sourcesWarnings\")}>\r\n\t\t\t\t\t{preview.warnings.map((warning) => (\r\n\t\t\t\t\t\t<li key={warning} style={hintStyle}>\r\n\t\t\t\t\t\t\t{warning}\r\n\t\t\t\t\t\t</li>\r\n\t\t\t\t\t))}\r\n\t\t\t\t</ul>\r\n\t\t\t)}\r\n\t\t\t{preview.confirmOverwriteRequired ? (\r\n\t\t\t\t<label style={checkRowStyle}>\r\n\t\t\t\t\t<input\r\n\t\t\t\t\t\taria-describedby={`coding-oauth-source-overwrite-hint-${preview.kind}`}\r\n\t\t\t\t\t\ttype=\"checkbox\"\r\n\t\t\t\t\t\tchecked={confirmOverwrite}\r\n\t\t\t\t\t\tdisabled={sourcesBusy || preview.action === \"blocked\"}\r\n\t\t\t\t\t\tonChange={(event) => {\r\n\t\t\t\t\t\t\tonConfirmOverwriteChange(event.target.checked);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t/>\r\n\t\t\t\t\t<span>\r\n\t\t\t\t\t\t{t(\"sourcesConfirmOverwrite\")}\r\n\t\t\t\t\t\t<span id={`coding-oauth-source-overwrite-hint-${preview.kind}`} style={{ display: \"block\", ...hintStyle }}>\r\n\t\t\t\t\t\t\t{t(\"sourcesConfirmOverwriteHint\")}\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t</span>\r\n\t\t\t\t</label>\r\n\t\t\t) : null}\r\n\t\t\t<div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8 }}>\r\n\t\t\t\t<button\r\n\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\tstyle={primaryButtonStyle}\r\n\t\t\t\t\tdisabled={\r\n\t\t\t\t\t\tsourcesBusy || preview.action === \"blocked\" || (preview.confirmOverwriteRequired && !confirmOverwrite)\r\n\t\t\t\t\t}\r\n\t\t\t\t\tonClick={onCommit}\r\n\t\t\t\t>\r\n\t\t\t\t\t{t(\"sourcesCommit\")}\r\n\t\t\t\t</button>\r\n\t\t\t\t<button type=\"button\" style={buttonStyle} disabled={sourcesBusy} onClick={onCancel}>\r\n\t\t\t\t\t{t(\"sourcesCancelPreview\")}\r\n\t\t\t\t</button>\r\n\t\t\t</div>\r\n\t\t</section>\r\n\t);\r\n}\r\n", "/** Dismissible notice banner with optional auto-hide. */\r\n\r\nimport { useEffect } from \"react\";\r\nimport { bodyStyle, buttonStyle, noticeStyle } from \"../styles.ts\";\r\n\r\nexport interface NoticeBannerProps {\r\n\tmessage: string;\r\n\tdismissLabel?: string;\r\n\tonDismiss?: () => void;\r\n\tautoHideMs?: number;\r\n\ttone?: \"info\" | \"success\";\r\n}\r\n\r\nexport function NoticeBanner({ message, dismissLabel, onDismiss, autoHideMs, tone = \"info\" }: NoticeBannerProps) {\r\n\tuseEffect(() => {\r\n\t\tif (autoHideMs === undefined || onDismiss === undefined) return;\r\n\t\tconst timer = window.setTimeout(onDismiss, autoHideMs);\r\n\t\treturn () => {\r\n\t\t\twindow.clearTimeout(timer);\r\n\t\t};\r\n\t}, [autoHideMs, onDismiss]);\r\n\r\n\tconst borderColor =\r\n\t\ttone === \"success\" ? \"var(--dsw-alias-state-success-primary, #22a06b)\" : \"var(--dsw-alias-brand-primary, #1677ff)\";\r\n\r\n\treturn (\r\n\t\t<div\r\n\t\t\tstyle={{\r\n\t\t\t\t...noticeStyle,\r\n\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\talignItems: \"flex-start\",\r\n\t\t\t\tjustifyContent: \"space-between\",\r\n\t\t\t\tgap: 12,\r\n\t\t\t\tborderLeft: `3px solid ${borderColor}`,\r\n\t\t\t}}\r\n\t\t\trole=\"status\"\r\n\t\t>\r\n\t\t\t<p style={{ ...bodyStyle, margin: 0, color: \"var(--dsw-alias-label-primary)\" }}>{message}</p>\r\n\t\t\t{onDismiss === undefined || dismissLabel === undefined ? null : (\r\n\t\t\t\t<button type=\"button\" style={buttonStyle} onClick={onDismiss}>\r\n\t\t\t\t\t{dismissLabel}\r\n\t\t\t\t</button>\r\n\t\t\t)}\r\n\t\t</div>\r\n\t);\r\n}\r\n", "/** Single provider account card for the Accounts tab. */\r\n\r\nimport { useEffect, useMemo, useRef, useState } from \"react\";\r\nimport { SOURCE_REASON_KEY } from \"../constants.ts\";\r\nimport { methodLabel, orderedLoginMethods, shouldShowPerCardSourceReason } from \"../display.ts\";\r\nimport { formatEpoch, modelFields, usageHasVisibleFields } from \"../parsers.ts\";\r\nimport {\r\n\tbodyStyle,\r\n\tbuttonStyle,\r\n\tcardStyle,\r\n\tcheckRowStyle,\r\n\tcodeStyle,\r\n\tcompactButtonStyle,\r\n\thintStyle,\r\n\tinputStyle,\r\n\tlistStyle,\r\n\tmonoStyle,\r\n\tnestedStyle,\r\n\tprimaryButtonStyle,\r\n\trowStyle,\r\n\tstepActiveStyle,\r\n\tstepNumberActiveStyle,\r\n\tstepNumberStyle,\r\n\tstepRowStyle,\r\n\ttitleStyle,\r\n\tvisuallyHiddenStyle,\r\n} from \"../styles.ts\";\r\nimport type {\r\n\tGrokBuildSettingsInjected,\r\n\tGrokStatus,\r\n\tLoginMethod,\r\n\tProviderCardDefinition,\r\n\tProviderStatus,\r\n\tSourceStatus,\r\n\tUsageView,\r\n} from \"../types.ts\";\r\nimport { Badge } from \"./Badge.tsx\";\r\nimport { CopyButton } from \"./CopyButton.tsx\";\r\nimport { ProgressBar } from \"./ProgressBar.tsx\";\r\n\r\nexport interface ProviderCardProps {\r\n\tt: GrokBuildSettingsInjected[\"t\"];\r\n\tdefinition: ProviderCardDefinition;\r\n\tproviderStatus: ProviderStatus;\r\n\tbusy: boolean;\r\n\tsourcesBusy: boolean;\r\n\tremote: boolean;\r\n\tcodeInput: string;\r\n\tpopupBlocked: boolean;\r\n\texpanded: boolean;\r\n\tsource: SourceStatus | undefined;\r\n\tshowUsage: boolean;\r\n\tusage: UsageView | undefined;\r\n\tusageError: string | undefined;\r\n\tusageLoading: boolean;\r\n\tonSignIn: (method: LoginMethod) => void;\r\n\tonSignOut: () => void;\r\n\tonCancelLogin: () => void;\r\n\tonSubmitCode: () => void;\r\n\tonCodeChange: (value: string) => void;\r\n\tonToggleExpanded: () => void;\r\n\tonPreviewSource: () => void;\r\n\tonSaveModels: (selected: string[]) => void;\r\n}\r\n\r\nfunction SignInSteps({\r\n\tt,\r\n\tactiveMethod,\r\n\tuserCode,\r\n\turl,\r\n\tpopupBlocked,\r\n}: {\r\n\tt: GrokBuildSettingsInjected[\"t\"];\r\n\tactiveMethod: LoginMethod;\r\n\tuserCode: string | undefined;\r\n\turl: string | undefined;\r\n\tpopupBlocked: boolean;\r\n}) {\r\n\tconst hasCode = userCode !== undefined && userCode.length > 0;\r\n\tconst hasUrl = url !== undefined && url.length > 0;\r\n\tconst needsPaste = activeMethod !== \"device\";\r\n\r\n\treturn (\r\n\t\t<div style={{ display: \"flex\", flexDirection: \"column\", gap: 10 }}>\r\n\t\t\t<div style={hasUrl ? stepActiveStyle : stepRowStyle}>\r\n\t\t\t\t<span style={hasUrl ? stepNumberActiveStyle : stepNumberStyle} aria-hidden=\"true\">\r\n\t\t\t\t\t1\r\n\t\t\t\t</span>\r\n\t\t\t\t<span>{t(\"signInStepOpen\")}</span>\r\n\t\t\t</div>\r\n\t\t\t{hasUrl ? (\r\n\t\t\t\t<div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8, paddingLeft: 32 }}>\r\n\t\t\t\t\t<a href={url} target=\"_blank\" rel=\"noreferrer\" style={primaryButtonStyle}>\r\n\t\t\t\t\t\t{t(\"openAuthUrl\")}\r\n\t\t\t\t\t</a>\r\n\t\t\t\t\t<CopyButton text={url} idleLabel={t(\"copy\")} copiedLabel={t(\"copied\")} failedLabel={t(\"copyFailed\")} />\r\n\t\t\t\t</div>\r\n\t\t\t) : null}\r\n\t\t\t{popupBlocked && hasUrl ? <p style={hintStyle}>{t(\"popupBlocked\")}</p> : null}\r\n\t\t\t{hasCode ? (\r\n\t\t\t\t<>\r\n\t\t\t\t\t<div style={stepActiveStyle}>\r\n\t\t\t\t\t\t<span style={stepNumberActiveStyle} aria-hidden=\"true\">\r\n\t\t\t\t\t\t\t2\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t<span>{t(\"signInStepCode\")}</span>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div style={{ display: \"flex\", flexWrap: \"wrap\", alignItems: \"center\", gap: 8, paddingLeft: 32 }}>\r\n\t\t\t\t\t\t<span style={codeStyle}>{userCode}</span>\r\n\t\t\t\t\t\t<CopyButton\r\n\t\t\t\t\t\t\ttext={userCode}\r\n\t\t\t\t\t\t\tidleLabel={t(\"copyUserCode\")}\r\n\t\t\t\t\t\t\tcopiedLabel={t(\"copied\")}\r\n\t\t\t\t\t\t\tfailedLabel={t(\"copyFailed\")}\r\n\t\t\t\t\t\t\tprimary\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</>\r\n\t\t\t) : null}\r\n\t\t\t<div style={stepActiveStyle}>\r\n\t\t\t\t<span style={stepNumberActiveStyle} aria-hidden=\"true\">\r\n\t\t\t\t\t{hasCode ? 3 : 2}\r\n\t\t\t\t</span>\r\n\t\t\t\t<span style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}>\r\n\t\t\t\t\t<span\r\n\t\t\t\t\t\taria-hidden=\"true\"\r\n\t\t\t\t\t\tstyle={{\r\n\t\t\t\t\t\t\twidth: 14,\r\n\t\t\t\t\t\t\theight: 14,\r\n\t\t\t\t\t\t\tborder: \"2px solid var(--dsw-alias-brand-primary, #1677ff)\",\r\n\t\t\t\t\t\t\tborderTopColor: \"transparent\",\r\n\t\t\t\t\t\t\tborderRadius: \"50%\",\r\n\t\t\t\t\t\t\tanimation: \"dsh-coding-oauth-spin 0.8s linear infinite\",\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t/>\r\n\t\t\t\t\t{t(\"signInStepWait\")}\r\n\t\t\t\t</span>\r\n\t\t\t</div>\r\n\t\t\t{needsPaste ? (\r\n\t\t\t\t<div style={{ display: \"flex\", flexDirection: \"column\", gap: 8, paddingLeft: 32 }}>\r\n\t\t\t\t\t<p style={bodyStyle}>{t(activeMethod === \"browser\" ? \"pasteBrowserCodeHint\" : \"pasteCodeHint\")}</p>\r\n\t\t\t\t</div>\r\n\t\t\t) : null}\r\n\t\t</div>\r\n\t);\r\n}\r\n\r\nexport function ProviderCard({\r\n\tt,\r\n\tdefinition,\r\n\tproviderStatus,\r\n\tbusy,\r\n\tsourcesBusy,\r\n\tremote,\r\n\tcodeInput,\r\n\tpopupBlocked,\r\n\texpanded,\r\n\tsource,\r\n\tshowUsage,\r\n\tusage,\r\n\tusageError,\r\n\tusageLoading,\r\n\tonSignIn,\r\n\tonSignOut,\r\n\tonCancelLogin,\r\n\tonSubmitCode,\r\n\tonCodeChange,\r\n\tonToggleExpanded,\r\n\tonPreviewSource,\r\n\tonSaveModels,\r\n}: ProviderCardProps) {\r\n\tconst [showAltMethods, setShowAltMethods] = useState(false);\r\n\tconst [modelFilter, setModelFilter] = useState(\"\");\r\n\tconst [logoutConfirm, setLogoutConfirm] = useState(false);\r\n\tconst logoutTrigger = useRef<HTMLButtonElement>(null);\r\n\tconst logoutConfirmAction = useRef<HTMLButtonElement>(null);\r\n\tconst restoreLogoutFocus = useRef(false);\r\n\r\n\tconst ordered = orderedLoginMethods(definition, remote);\r\n\tconst primaryMethod: LoginMethod = ordered[0] ?? definition.recommended;\r\n\tconst altMethods = ordered.filter((method) => method !== primaryMethod);\r\n\r\n\tconst statusLabel =\r\n\t\tproviderStatus.status === \"signed-in\"\r\n\t\t\t? t(\"signedIn\")\r\n\t\t\t: providerStatus.status === \"signing-in\"\r\n\t\t\t\t? t(\"signingIn\")\r\n\t\t\t\t: providerStatus.status === \"error\"\r\n\t\t\t\t\t? t(\"requestFailed\")\r\n\t\t\t\t\t: t(\"signedOut\");\r\n\tconst activeMethod = providerStatus.status === \"signing-in\" ? providerStatus.method : primaryMethod;\r\n\tconst { available, selected } = useMemo(() => modelFields(providerStatus), [providerStatus]);\r\n\tconst [modelDraft, setModelDraft] = useState<string[]>(selected);\r\n\tuseEffect(() => {\r\n\t\tsetModelDraft(selected);\r\n\t}, [selected]);\r\n\tuseEffect(() => {\r\n\t\tif (providerStatus.status !== \"signed-in\") setLogoutConfirm(false);\r\n\t}, [providerStatus.status]);\r\n\tuseEffect(() => {\r\n\t\tif (logoutConfirm) {\r\n\t\t\tlogoutConfirmAction.current?.focus();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!restoreLogoutFocus.current) return;\r\n\t\trestoreLogoutFocus.current = false;\r\n\t\tif (providerStatus.status === \"signed-in\") {\r\n\t\t\tlogoutTrigger.current?.focus();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tdocument.getElementById(`coding-oauth-login-${definition.slug}`)?.focus();\r\n\t}, [definition.slug, logoutConfirm, providerStatus.status]);\r\n\tconst modelDraftDirty =\r\n\t\tmodelDraft.length !== selected.length || modelDraft.some((model, index) => model !== selected[index]);\r\n\tconst grokProviderStatus = definition.slug === \"grok\" ? (providerStatus as GrokStatus) : undefined;\r\n\tconst showSourceReason = shouldShowPerCardSourceReason(source);\r\n\r\n\tconst filteredModels = useMemo(() => {\r\n\t\tconst query = modelFilter.trim().toLowerCase();\r\n\t\tif (query.length === 0) return available;\r\n\t\treturn available.filter((id) => id.toLowerCase().includes(query));\r\n\t}, [available, modelFilter]);\r\n\r\n\tconst usagePercent =\r\n\t\tdefinition.slug === \"codex\" && showUsage\r\n\t\t\t? usage?.individualRemainingPercent === undefined\r\n\t\t\t\t? usage?.rateLimits[0]?.windows[0]?.usedPercent\r\n\t\t\t\t: 100 - usage.individualRemainingPercent\r\n\t\t\t: undefined;\r\n\tconst fetchedAt = formatEpoch(usage?.fetchedAt);\r\n\r\n\treturn (\r\n\t\t<div style={cardStyle}>\r\n\t\t\t<div style={rowStyle}>\r\n\t\t\t\t<div>\r\n\t\t\t\t\t<h3 style={{ ...titleStyle, fontSize: 16 }}>{t(definition.titleKey)}</h3>\r\n\t\t\t\t\t{providerStatus.status === \"signed-in\" && !expanded ? (\r\n\t\t\t\t\t\t<p style={{ ...hintStyle, marginTop: 4 }}>\r\n\t\t\t\t\t\t\t{t(\"modelsSummary\", { selected: selected.length, total: available.length })}\r\n\t\t\t\t\t\t\t{usagePercent === undefined ? \"\" : ` \u00B7 ${t(\"usageUsedShort\", { value: `${String(usagePercent)}%` })}`}\r\n\t\t\t\t\t\t</p>\r\n\t\t\t\t\t) : (\r\n\t\t\t\t\t\t<>\r\n\t\t\t\t\t\t\t<p style={{ ...bodyStyle, marginTop: 4 }}>{t(definition.descriptionKey)}</p>\r\n\t\t\t\t\t\t\t<p style={{ ...bodyStyle, marginTop: 4 }}>\r\n\t\t\t\t\t\t\t\t<span style={monoStyle}>{definition.route}</span>\r\n\t\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t</>\r\n\t\t\t\t\t)}\r\n\t\t\t\t</div>\r\n\t\t\t\t<Badge label={statusLabel} providerStatus={providerStatus.status} />\r\n\t\t\t</div>\r\n\t\t\t<div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8 }}>\r\n\t\t\t\t{providerStatus.status === \"signed-in\" ? (\r\n\t\t\t\t\t<>\r\n\t\t\t\t\t\t{logoutConfirm ? (\r\n\t\t\t\t\t\t\t<fieldset style={{ ...nestedStyle, margin: 0, minWidth: 0 }}>\r\n\t\t\t\t\t\t\t\t<legend style={visuallyHiddenStyle}>{t(\"logoutConfirmTitle\")}</legend>\r\n\t\t\t\t\t\t\t\t<p style={bodyStyle}>{t(\"logoutConfirmHint\")}</p>\r\n\t\t\t\t\t\t\t\t<div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8 }}>\r\n\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\tref={logoutConfirmAction}\r\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\t\tstyle={primaryButtonStyle}\r\n\t\t\t\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\t\trestoreLogoutFocus.current = true;\r\n\t\t\t\t\t\t\t\t\t\t\tonSignOut();\r\n\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t{busy ? t(\"working\") : t(\"logoutConfirmAction\")}\r\n\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\t\tstyle={buttonStyle}\r\n\t\t\t\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\t\trestoreLogoutFocus.current = true;\r\n\t\t\t\t\t\t\t\t\t\t\tsetLogoutConfirm(false);\r\n\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t{t(\"cancel\")}\r\n\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</fieldset>\r\n\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\tref={logoutTrigger}\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tstyle={buttonStyle}\r\n\t\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\t\tonClick={() => setLogoutConfirm(true)}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{t(\"logout\")}\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\tid={`coding-oauth-models-toggle-${definition.slug}`}\r\n\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\tstyle={buttonStyle}\r\n\t\t\t\t\t\t\taria-expanded={expanded}\r\n\t\t\t\t\t\t\taria-controls={expanded ? `coding-oauth-models-${definition.slug}` : undefined}\r\n\t\t\t\t\t\t\tonClick={onToggleExpanded}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{expanded ? t(\"collapseModels\") : t(\"expandModels\")}\r\n\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t{source?.available === true ? (\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\tid={`coding-oauth-source-pull-${definition.slug}`}\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tstyle={buttonStyle}\r\n\t\t\t\t\t\t\t\tdisabled={sourcesBusy}\r\n\t\t\t\t\t\t\t\tonClick={onPreviewSource}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{t(\"sourcesPullCopy\")}\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t) : null}\r\n\t\t\t\t\t</>\r\n\t\t\t\t) : providerStatus.status === \"signing-in\" ? (\r\n\t\t\t\t\t<>\r\n\t\t\t\t\t\t<button type=\"button\" style={buttonStyle} disabled={busy} onClick={onCancelLogin}>\r\n\t\t\t\t\t\t\t{t(\"cancelLogin\")}\r\n\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t{altMethods.length > 0 ? (\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tstyle={compactButtonStyle}\r\n\t\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\tsetShowAltMethods((current) => !current);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{showAltMethods ? t(\"hideOtherLoginMethods\") : t(\"otherLoginMethods\")}\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t) : null}\r\n\t\t\t\t\t\t{showAltMethods\r\n\t\t\t\t\t\t\t? altMethods.map((method) => (\r\n\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\tkey={method}\r\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\t\tstyle={compactButtonStyle}\r\n\t\t\t\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\t\tonSignIn(method);\r\n\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t{methodLabel(method, t, { remote, primary: false })}\r\n\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t))\r\n\t\t\t\t\t\t\t: null}\r\n\t\t\t\t\t</>\r\n\t\t\t\t) : (\r\n\t\t\t\t\t<>\r\n\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\tid={`coding-oauth-login-${definition.slug}`}\r\n\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\tstyle={primaryButtonStyle}\r\n\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\tonSignIn(primaryMethod);\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{busy ? t(\"working\") : methodLabel(primaryMethod, t, { remote, primary: true })}\r\n\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t{altMethods.length > 0 ? (\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tstyle={compactButtonStyle}\r\n\t\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\tsetShowAltMethods((current) => !current);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{showAltMethods ? t(\"hideOtherLoginMethods\") : t(\"otherLoginMethods\")}\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t) : null}\r\n\t\t\t\t\t\t{showAltMethods\r\n\t\t\t\t\t\t\t? altMethods.map((method) => (\r\n\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\tkey={method}\r\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\t\tstyle={compactButtonStyle}\r\n\t\t\t\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\t\tonSignIn(method);\r\n\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t{methodLabel(method, t, { remote, primary: false })}\r\n\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t))\r\n\t\t\t\t\t\t\t: null}\r\n\t\t\t\t\t\t{source?.available === true ? (\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\tid={`coding-oauth-source-pull-${definition.slug}`}\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tstyle={buttonStyle}\r\n\t\t\t\t\t\t\t\tdisabled={sourcesBusy}\r\n\t\t\t\t\t\t\t\tonClick={onPreviewSource}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{t(\"sourcesPullCopy\")}\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t) : showSourceReason && source?.reason !== undefined ? (\r\n\t\t\t\t\t\t\t<span style={hintStyle}>{t(SOURCE_REASON_KEY[source.reason])}</span>\r\n\t\t\t\t\t\t) : null}\r\n\t\t\t\t\t</>\r\n\t\t\t\t)}\r\n\t\t\t</div>\r\n\t\t\t{providerStatus.status === \"error\" ? (\r\n\t\t\t\t<p style={{ ...bodyStyle, color: \"var(--dsw-alias-state-error-primary)\" }}>{providerStatus.message}</p>\r\n\t\t\t) : null}\r\n\t\t\t{providerStatus.status === \"signing-in\" ? (\r\n\t\t\t\t<SignInSteps\r\n\t\t\t\t\tt={t}\r\n\t\t\t\t\tactiveMethod={activeMethod}\r\n\t\t\t\t\tuserCode={providerStatus.userCode}\r\n\t\t\t\t\turl={providerStatus.url}\r\n\t\t\t\t\tpopupBlocked={popupBlocked}\r\n\t\t\t\t/>\r\n\t\t\t) : null}\r\n\t\t\t{providerStatus.status === \"signing-in\" && activeMethod !== \"device\" ? (\r\n\t\t\t\t<div style={{ display: \"flex\", flexDirection: \"column\", gap: 8 }}>\r\n\t\t\t\t\t<div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8 }}>\r\n\t\t\t\t\t\t<label htmlFor={`coding-oauth-code-${definition.slug}`} style={visuallyHiddenStyle}>\r\n\t\t\t\t\t\t\t{t(\"pasteCodeLabel\")}\r\n\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t<input\r\n\t\t\t\t\t\t\tid={`coding-oauth-code-${definition.slug}`}\r\n\t\t\t\t\t\t\tstyle={{ ...inputStyle, flex: \"1 1 360px\" }}\r\n\t\t\t\t\t\t\tvalue={codeInput}\r\n\t\t\t\t\t\t\tplaceholder={t(\"pasteCodePlaceholder\")}\r\n\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\tonChange={(event) => {\r\n\t\t\t\t\t\t\t\tonCodeChange(event.target.value);\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\tonKeyDown={(event) => {\r\n\t\t\t\t\t\t\t\tif (event.key === \"Enter\") {\r\n\t\t\t\t\t\t\t\t\tevent.preventDefault();\r\n\t\t\t\t\t\t\t\t\tonSubmitCode();\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\tstyle={primaryButtonStyle}\r\n\t\t\t\t\t\t\tdisabled={busy || codeInput.trim().length === 0}\r\n\t\t\t\t\t\t\tonClick={onSubmitCode}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{t(\"submitCode\")}\r\n\t\t\t\t\t\t</button>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t) : null}\r\n\t\t\t{providerStatus.status === \"signed-in\" && expanded ? (\r\n\t\t\t\t<div id={`coding-oauth-models-${definition.slug}`} style={{ display: \"flex\", flexDirection: \"column\", gap: 8 }}>\r\n\t\t\t\t\t<div style={rowStyle}>\r\n\t\t\t\t\t\t<h4 style={{ ...titleStyle, fontSize: 14 }}>{t(\"models\")}</h4>\r\n\t\t\t\t\t\t<div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8 }}>\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tstyle={compactButtonStyle}\r\n\t\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\tsetModelDraft([]);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{t(\"deselectAll\")}\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tstyle={compactButtonStyle}\r\n\t\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\tsetModelDraft([...available]);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{t(\"selectAll\")}\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tstyle={compactButtonStyle}\r\n\t\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\tsetModelDraft(available.length > 0 ? [available[0]!] : []);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{t(\"resetModelsDefault\")}\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<label htmlFor={`coding-oauth-model-filter-${definition.slug}`} style={visuallyHiddenStyle}>\r\n\t\t\t\t\t\t{t(\"modelFilterLabel\", { provider: t(definition.titleKey) })}\r\n\t\t\t\t\t</label>\r\n\t\t\t\t\t<input\r\n\t\t\t\t\t\tid={`coding-oauth-model-filter-${definition.slug}`}\r\n\t\t\t\t\t\ttype=\"search\"\r\n\t\t\t\t\t\tstyle={inputStyle}\r\n\t\t\t\t\t\tvalue={modelFilter}\r\n\t\t\t\t\t\tplaceholder={t(\"modelFilterPlaceholder\")}\r\n\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\tonChange={(event) => {\r\n\t\t\t\t\t\t\tsetModelFilter(event.target.value);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t/>\r\n\t\t\t\t\t{grokProviderStatus?.status === \"signed-in\" ? (\r\n\t\t\t\t\t\t<p style={bodyStyle}>\r\n\t\t\t\t\t\t\t{grokProviderStatus.catalogSource === \"live\"\r\n\t\t\t\t\t\t\t\t? t(\"catalogLive\")\r\n\t\t\t\t\t\t\t\t: grokProviderStatus.catalogSource === \"cache\"\r\n\t\t\t\t\t\t\t\t\t? t(\"catalogCache\")\r\n\t\t\t\t\t\t\t\t\t: t(\"catalogFallback\")}\r\n\t\t\t\t\t\t</p>\r\n\t\t\t\t\t) : null}\r\n\t\t\t\t\t<p style={bodyStyle}>\r\n\t\t\t\t\t\t{t(\"modelHint\")} <span style={monoStyle}>{definition.route}/<id></span>\r\n\t\t\t\t\t</p>\r\n\t\t\t\t\t<ul style={listStyle}>\r\n\t\t\t\t\t\t{filteredModels.map((id) => {\r\n\t\t\t\t\t\t\tconst checked = modelDraft.includes(id);\r\n\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t<li key={id}>\r\n\t\t\t\t\t\t\t\t\t<label style={checkRowStyle}>\r\n\t\t\t\t\t\t\t\t\t\t<input\r\n\t\t\t\t\t\t\t\t\t\t\ttype=\"checkbox\"\r\n\t\t\t\t\t\t\t\t\t\t\tchecked={checked}\r\n\t\t\t\t\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\t\t\t\t\tonChange={() => {\r\n\t\t\t\t\t\t\t\t\t\t\t\tconst current = new Set(modelDraft);\r\n\t\t\t\t\t\t\t\t\t\t\t\tif (checked) current.delete(id);\r\n\t\t\t\t\t\t\t\t\t\t\t\telse current.add(id);\r\n\t\t\t\t\t\t\t\t\t\t\t\tsetModelDraft([...available].filter((model) => current.has(model)));\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t\t<span style={monoStyle}>{id}</span>\r\n\t\t\t\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t\t\t</li>\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t})}\r\n\t\t\t\t\t</ul>\r\n\t\t\t\t\t<div style={{ display: \"flex\", flexWrap: \"wrap\", alignItems: \"center\", gap: 8 }}>\r\n\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\tstyle={primaryButtonStyle}\r\n\t\t\t\t\t\t\tdisabled={busy || !modelDraftDirty}\r\n\t\t\t\t\t\t\tonClick={() => onSaveModels(modelDraft)}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{busy ? t(\"working\") : t(\"applyModelDraft\")}\r\n\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t{modelDraftDirty ? <span style={hintStyle}>{t(\"modelDraftPending\")}</span> : null}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t{filteredModels.length === 0 ? <p style={hintStyle}>{t(\"modelFilterPlaceholder\")}</p> : null}\r\n\t\t\t\t\t{grokProviderStatus?.status === \"signed-in\" && grokProviderStatus.catalogError !== undefined ? (\r\n\t\t\t\t\t\t<p style={{ ...bodyStyle, color: \"var(--dsw-alias-state-error-primary)\" }}>{t(\"catalogError\")}</p>\r\n\t\t\t\t\t) : null}\r\n\t\t\t\t\t{definition.slug === \"codex\" && showUsage ? (\r\n\t\t\t\t\t\t<div style={nestedStyle}>\r\n\t\t\t\t\t\t\t<p style={{ ...bodyStyle, color: \"var(--dsw-alias-label-primary)\" }}>{t(\"usageTitle\")}</p>\r\n\t\t\t\t\t\t\t{usageError === undefined ? null : (\r\n\t\t\t\t\t\t\t\t<p style={{ ...bodyStyle, color: \"var(--dsw-alias-state-error-primary)\" }} role=\"alert\">\r\n\t\t\t\t\t\t\t\t\t{usageError}\r\n\t\t\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t{usageLoading && usage === undefined ? (\r\n\t\t\t\t\t\t\t\t<p style={hintStyle}>{t(\"usageLoading\")}</p>\r\n\t\t\t\t\t\t\t) : usage === undefined || !usageHasVisibleFields(usage) ? (\r\n\t\t\t\t\t\t\t\t<p style={hintStyle}>{t(\"usageEmpty\")}</p>\r\n\t\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\t<>\r\n\t\t\t\t\t\t\t\t\t{fetchedAt === undefined ? null : <p style={hintStyle}>{t(\"usageFetchedAt\", { time: fetchedAt })}</p>}\r\n\t\t\t\t\t\t\t\t\t{usagePercent !== undefined ? (\r\n\t\t\t\t\t\t\t\t\t\t<ProgressBar\r\n\t\t\t\t\t\t\t\t\t\t\tvalue={usagePercent}\r\n\t\t\t\t\t\t\t\t\t\t\tlabel={t(\"usageRateLimit\")}\r\n\t\t\t\t\t\t\t\t\t\t\tmeta={t(\"usageUsed\", { value: `${String(usagePercent)}%` })}\r\n\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t) : null}\r\n\t\t\t\t\t\t\t\t\t{usage.rateLimits.map((limit) => {\r\n\t\t\t\t\t\t\t\t\t\tconst window = limit.windows[0];\r\n\t\t\t\t\t\t\t\t\t\tconst used = window?.usedPercent;\r\n\t\t\t\t\t\t\t\t\t\tconst resetsAt = formatEpoch(window?.resetsAt);\r\n\t\t\t\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t\t\t\t<div key={limit.id} style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{used === undefined ? (\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<p style={hintStyle}>{limit.name ?? t(\"usageRateLimit\")}</p>\r\n\t\t\t\t\t\t\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<ProgressBar\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={used}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tlabel={limit.name ?? t(\"usageRateLimit\")}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmeta={\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tresetsAt === undefined\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? t(\"usageUsed\", { value: `${String(used)}%` })\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: `${t(\"usageUsed\", { value: `${String(used)}%` })} \u00B7 ${t(\"usageResets\", { time: resetsAt })}`\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t\t\t})}\r\n\t\t\t\t\t\t\t\t</>\r\n\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t) : null}\r\n\t\t\t\t</div>\r\n\t\t\t) : null}\r\n\t\t</div>\r\n\t);\r\n}\r\n", "/** Compact copy button with copied / failed feedback. */\r\n\r\nimport { useCallback, useEffect, useRef, useState } from \"react\";\r\nimport { copyText } from \"../api.ts\";\r\nimport { compactButtonStyle, primaryButtonStyle } from \"../styles.ts\";\r\n\r\nexport interface CopyButtonProps {\r\n\ttext: string;\r\n\tidleLabel: string;\r\n\tcopiedLabel: string;\r\n\tfailedLabel: string;\r\n\tprimary?: boolean;\r\n\tdisabled?: boolean;\r\n}\r\n\r\nexport function CopyButton({\r\n\ttext,\r\n\tidleLabel,\r\n\tcopiedLabel,\r\n\tfailedLabel,\r\n\tprimary = false,\r\n\tdisabled = false,\r\n}: CopyButtonProps) {\r\n\tconst [state, setState] = useState<\"idle\" | \"copied\" | \"failed\">(\"idle\");\r\n\tconst timerRef = useRef<number | undefined>(undefined);\r\n\r\n\tuseEffect(() => {\r\n\t\treturn () => {\r\n\t\t\tif (timerRef.current !== undefined) window.clearTimeout(timerRef.current);\r\n\t\t};\r\n\t}, []);\r\n\r\n\tconst handleClick = useCallback(async () => {\r\n\t\tconst ok = await copyText(text);\r\n\t\tsetState(ok ? \"copied\" : \"failed\");\r\n\t\tif (timerRef.current !== undefined) window.clearTimeout(timerRef.current);\r\n\t\ttimerRef.current = window.setTimeout(() => {\r\n\t\t\tsetState(\"idle\");\r\n\t\t\ttimerRef.current = undefined;\r\n\t\t}, 2000);\r\n\t}, [text]);\r\n\r\n\tconst label = state === \"copied\" ? copiedLabel : state === \"failed\" ? failedLabel : idleLabel;\r\n\r\n\treturn (\r\n\t\t<button\r\n\t\t\ttype=\"button\"\r\n\t\t\tstyle={primary ? primaryButtonStyle : compactButtonStyle}\r\n\t\t\tdisabled={disabled || text.length === 0}\r\n\t\t\tonClick={() => {\r\n\t\t\t\tvoid handleClick();\r\n\t\t\t}}\r\n\t\t>\r\n\t\t\t{label}\r\n\t\t</button>\r\n\t);\r\n}\r\n", "/** Usage quota progress bar with threshold-based color. */\r\n\r\nimport { hintStyle } from \"../styles.ts\";\r\n\r\nexport interface ProgressBarProps {\r\n\t/** 0\u2013100 used percentage. */\r\n\tvalue: number;\r\n\tlabel?: string;\r\n\tmeta?: string;\r\n}\r\n\r\nfunction barColor(percent: number): string {\r\n\tif (percent >= 90) return \"var(--dsw-alias-state-error-primary, #d92d20)\";\r\n\tif (percent >= 75) return \"var(--dsw-alias-state-warn-primary, #e06c00)\";\r\n\t// Prefer info fill over brand-primary: dark theme inverts brand-primary to near-white.\r\n\treturn \"var(--dsw-alias-button-info-fill, var(--dsw-static-deepseek-500, #4f6ef7))\";\r\n}\r\n\r\nexport function ProgressBar({ value, label, meta }: ProgressBarProps) {\r\n\tconst clamped = Math.max(0, Math.min(100, value));\r\n\treturn (\r\n\t\t<div style={{ display: \"flex\", flexDirection: \"column\", gap: 6 }}>\r\n\t\t\t{label === undefined ? null : (\r\n\t\t\t\t<div style={{ display: \"flex\", justifyContent: \"space-between\", gap: 8, flexWrap: \"wrap\" }}>\r\n\t\t\t\t\t<span style={{ ...hintStyle, color: \"var(--dsw-alias-label-primary)\" }}>{label}</span>\r\n\t\t\t\t\t{meta === undefined ? null : <span style={hintStyle}>{meta}</span>}\r\n\t\t\t\t</div>\r\n\t\t\t)}\r\n\t\t\t<div\r\n\t\t\t\trole=\"progressbar\"\r\n\t\t\t\taria-valuenow={clamped}\r\n\t\t\t\taria-valuemin={0}\r\n\t\t\t\taria-valuemax={100}\r\n\t\t\t\tstyle={{\r\n\t\t\t\t\theight: 8,\r\n\t\t\t\t\tborderRadius: 4,\r\n\t\t\t\t\tbackground: \"var(--dsw-alias-border-l2)\",\r\n\t\t\t\t\toverflow: \"hidden\",\r\n\t\t\t\t}}\r\n\t\t\t>\r\n\t\t\t\t<div\r\n\t\t\t\t\tstyle={{\r\n\t\t\t\t\t\twidth: `${String(clamped)}%`,\r\n\t\t\t\t\t\theight: \"100%\",\r\n\t\t\t\t\t\tborderRadius: 4,\r\n\t\t\t\t\t\tbackground: barColor(clamped),\r\n\t\t\t\t\t\ttransition: \"width 0.3s ease, background 0.3s ease\",\r\n\t\t\t\t\t}}\r\n\t\t\t\t/>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t);\r\n}\r\n", "/** Accessible toggle switch replacing native checkboxes for capability settings. */\r\n\r\nimport type { CSSProperties } from \"react\";\r\nimport { TRANSITION } from \"../styles.ts\";\r\n\r\nexport interface ToggleSwitchProps {\r\n\tchecked: boolean;\r\n\tdisabled?: boolean;\r\n\tonChange: (checked: boolean) => void;\r\n\t/** Accessible label (visually hidden when label prop is rendered externally). */\r\n\tariaLabel?: string;\r\n\tariaDescribedBy?: string;\r\n\tid?: string;\r\n}\r\n\r\nconst trackStyle = (checked: boolean, disabled: boolean): CSSProperties => ({\r\n\tposition: \"relative\",\r\n\twidth: 40,\r\n\theight: 22,\r\n\tborderRadius: 11,\r\n\tflex: \"0 0 auto\",\r\n\tbackground: checked\r\n\t\t? \"var(--dsw-alias-button-primary-fill)\"\r\n\t\t: \"var(--dsw-alias-border-l4, rgba(127, 127, 127, 0.45))\",\r\n\topacity: disabled ? 0.5 : 1,\r\n\tcursor: disabled ? \"not-allowed\" : \"pointer\",\r\n\ttransition: TRANSITION,\r\n\tborder: \"none\",\r\n\tpadding: 0,\r\n});\r\n\r\nconst thumbStyle = (checked: boolean): CSSProperties => ({\r\n\tposition: \"absolute\",\r\n\ttop: 2,\r\n\tleft: checked ? 20 : 2,\r\n\twidth: 18,\r\n\theight: 18,\r\n\tborderRadius: \"50%\",\r\n\t// Match DSH primary fill/foreground pairing so the thumb stays visible when\r\n\t// dark theme inverts brand-primary to near-white.\r\n\tbackground: checked ? \"var(--dsw-alias-label-primary-foreground)\" : \"var(--dsw-alias-button-elevated-fill)\",\r\n\tboxShadow: \"0 1px 3px rgba(0, 0, 0, 0.25)\",\r\n\ttransition: TRANSITION,\r\n});\r\n\r\nexport function ToggleSwitch({\r\n\tchecked,\r\n\tdisabled = false,\r\n\tonChange,\r\n\tariaLabel,\r\n\tariaDescribedBy,\r\n\tid,\r\n}: ToggleSwitchProps) {\r\n\treturn (\r\n\t\t<button\r\n\t\t\tid={id}\r\n\t\t\ttype=\"button\"\r\n\t\t\trole=\"switch\"\r\n\t\t\taria-checked={checked}\r\n\t\t\taria-label={ariaLabel}\r\n\t\t\taria-describedby={ariaDescribedBy}\r\n\t\t\tdisabled={disabled}\r\n\t\t\tstyle={trackStyle(checked, disabled)}\r\n\t\t\tonClick={() => {\r\n\t\t\t\tif (!disabled) onChange(!checked);\r\n\t\t\t}}\r\n\t\t>\r\n\t\t\t<span aria-hidden=\"true\" style={thumbStyle(checked)} />\r\n\t\t</button>\r\n\t);\r\n}\r\n", "/** Capabilities tab: Codex toggles, Grok Imagine, and limits. */\r\n\r\nimport { CAPABILITY_LIMITS, CAPABILITY_TOGGLES } from \"../constants.ts\";\r\nimport { imagineSourceLabel } from \"../parsers.ts\";\r\nimport {\r\n\tbodyStyle,\r\n\tbuttonStyle,\r\n\tcardStyle,\r\n\tdotStyle,\r\n\terrorStyle,\r\n\thintStyle,\r\n\tinputStyle,\r\n\tlistStyle,\r\n\tnestedStyle,\r\n\trowStyle,\r\n\tskeletonStyle,\r\n\tstatusStyle,\r\n\ttitleStyle,\r\n} from \"../styles.ts\";\r\nimport type {\r\n\tCapabilitySettingKey,\r\n\tCapabilitySnapshot,\r\n\tGrokBuildSettingsInjected,\r\n\tImagineCredentialView,\r\n} from \"../types.ts\";\r\nimport { Badge } from \"./Badge.tsx\";\r\nimport { ToggleSwitch } from \"./ToggleSwitch.tsx\";\r\n\r\nexport interface CapabilitiesTabProps {\r\n\tt: GrokBuildSettingsInjected[\"t\"];\r\n\tcapabilities: CapabilitySnapshot | undefined;\r\n\tcapabilitiesError: string | undefined;\r\n\tcapabilitiesBusy: boolean;\r\n\timagine: ImagineCredentialView | undefined;\r\n\timagineError: string | undefined;\r\n\tcodexSignedIn: boolean;\r\n\tonRetry: () => void;\r\n\tonOpenAccounts: (provider: \"codex\") => void;\r\n\tonFocusDependency: (target: \"codexImages\" | \"imagineCredential\") => void;\r\n\tonPatchCapability: (key: CapabilitySettingKey, value: boolean | number) => Promise<boolean | undefined> | undefined;\r\n}\r\n\r\nexport function CapabilitiesTab({\r\n\tt,\r\n\tcapabilities,\r\n\tcapabilitiesError,\r\n\tcapabilitiesBusy,\r\n\timagine,\r\n\timagineError,\r\n\tcodexSignedIn,\r\n\tonRetry,\r\n\tonOpenAccounts,\r\n\tonFocusDependency,\r\n\tonPatchCapability,\r\n}: CapabilitiesTabProps) {\r\n\tconst codexToggles = CAPABILITY_TOGGLES.filter((item) => !item.key.startsWith(\"grokImagine\"));\r\n\tconst imagineToggles = CAPABILITY_TOGGLES.filter((item) => item.key.startsWith(\"grokImagine\"));\r\n\r\n\treturn (\r\n\t\t<section style={cardStyle} aria-labelledby=\"coding-oauth-capabilities-title\">\r\n\t\t\t<div>\r\n\t\t\t\t<h3 id=\"coding-oauth-capabilities-title\" style={{ ...titleStyle, fontSize: 16 }}>\r\n\t\t\t\t\t{t(\"capabilitiesTitle\")}\r\n\t\t\t\t</h3>\r\n\t\t\t\t<p style={{ ...bodyStyle, marginTop: 4 }}>{t(\"capabilitiesIntro\")}</p>\r\n\t\t\t</div>\r\n\t\t\t{imagineError === undefined ? null : (\r\n\t\t\t\t<div style={nestedStyle} role=\"alert\">\r\n\t\t\t\t\t<p style={errorStyle}>{imagineError}</p>\r\n\t\t\t\t\t<button type=\"button\" style={buttonStyle} onClick={onRetry}>\r\n\t\t\t\t\t\t{t(\"retry\")}\r\n\t\t\t\t\t</button>\r\n\t\t\t\t</div>\r\n\t\t\t)}\r\n\t\t\t{imagine === undefined && imagineError === undefined ? (\r\n\t\t\t\t<div style={skeletonStyle} role=\"status\" aria-busy=\"true\">\r\n\t\t\t\t\t<div style={statusStyle}>\r\n\t\t\t\t\t\t<span aria-hidden=\"true\" style={dotStyle(\"loading\")} />\r\n\t\t\t\t\t\t{t(\"imagineLoading\")}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t) : imagine === undefined ? null : (\r\n\t\t\t\t<div id=\"coding-oauth-imagine-credential\" style={nestedStyle} tabIndex={-1}>\r\n\t\t\t\t\t<Badge\r\n\t\t\t\t\t\tlabel={imagine.configured ? t(\"imagineConfigured\") : t(\"imagineNotConfigured\")}\r\n\t\t\t\t\t\ttone={imagine.configured ? \"success\" : \"neutral\"}\r\n\t\t\t\t\t/>\r\n\t\t\t\t\t<p style={hintStyle}>{t(\"imagineSource\", { source: imagineSourceLabel(imagine.source, t) })}</p>\r\n\t\t\t\t</div>\r\n\t\t\t)}\r\n\t\t\t{capabilitiesError === undefined ? null : (\r\n\t\t\t\t<div style={nestedStyle} role=\"alert\">\r\n\t\t\t\t\t<p style={errorStyle}>{capabilitiesError}</p>\r\n\t\t\t\t\t<button type=\"button\" style={buttonStyle} onClick={onRetry}>\r\n\t\t\t\t\t\t{t(\"retry\")}\r\n\t\t\t\t\t</button>\r\n\t\t\t\t</div>\r\n\t\t\t)}\r\n\t\t\t{capabilities === undefined && capabilitiesError === undefined ? (\r\n\t\t\t\t<div style={skeletonStyle} role=\"status\" aria-busy=\"true\">\r\n\t\t\t\t\t<div style={statusStyle}>\r\n\t\t\t\t\t\t<span aria-hidden=\"true\" style={dotStyle(\"loading\")} />\r\n\t\t\t\t\t\t{t(\"capabilitiesLoading\")}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t) : capabilities === undefined ? null : (\r\n\t\t\t\t<fieldset style={{ border: 0, margin: 0, padding: 0, minWidth: 0 }}>\r\n\t\t\t\t\t<legend style={{ ...bodyStyle, position: \"absolute\", width: 1, height: 1, overflow: \"hidden\" }}>\r\n\t\t\t\t\t\t{t(\"capabilitiesTitle\")}\r\n\t\t\t\t\t</legend>\r\n\t\t\t\t\t{capabilities.writable ? null : <p style={hintStyle}>{t(\"capabilitiesReadOnly\")}</p>}\r\n\t\t\t\t\t<ul style={listStyle}>\r\n\t\t\t\t\t\t{codexToggles.map((item) => {\r\n\t\t\t\t\t\t\tconst checked = capabilities.value[item.key];\r\n\t\t\t\t\t\t\tconst imagesOff = item.requiresImages === true && !capabilities.value.codexImages;\r\n\t\t\t\t\t\t\tconst dependencyReason = !codexSignedIn\r\n\t\t\t\t\t\t\t\t? t(\"requiresCodexSignIn\")\r\n\t\t\t\t\t\t\t\t: imagesOff\r\n\t\t\t\t\t\t\t\t\t? t(\"requiresCodexImages\")\r\n\t\t\t\t\t\t\t\t\t: undefined;\r\n\t\t\t\t\t\t\tconst disabled = capabilitiesBusy || !capabilities.writable || dependencyReason !== undefined;\r\n\t\t\t\t\t\t\tconst switchId = `cap-switch-${item.key}`;\r\n\t\t\t\t\t\t\tconst repairAction = !codexSignedIn\r\n\t\t\t\t\t\t\t\t? { label: t(\"openCodexAccount\"), action: () => onOpenAccounts(\"codex\") }\r\n\t\t\t\t\t\t\t\t: imagesOff\r\n\t\t\t\t\t\t\t\t\t? { label: t(\"focusCodexImages\"), action: () => onFocusDependency(\"codexImages\") }\r\n\t\t\t\t\t\t\t\t\t: undefined;\r\n\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t<li\r\n\t\t\t\t\t\t\t\t\tkey={item.key}\r\n\t\t\t\t\t\t\t\t\tstyle={{\r\n\t\t\t\t\t\t\t\t\t\topacity: dependencyReason === undefined ? 1 : 0.65,\r\n\t\t\t\t\t\t\t\t\t\ttransition: \"opacity 0.15s ease\",\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t<div style={{ ...rowStyle, alignItems: \"flex-start\" }}>\r\n\t\t\t\t\t\t\t\t\t\t<label htmlFor={switchId} style={{ flex: \"1 1 360px\", cursor: disabled ? \"default\" : \"pointer\" }}>\r\n\t\t\t\t\t\t\t\t\t\t\t<span style={{ display: \"block\", fontSize: 14, color: \"var(--dsw-alias-label-primary)\" }}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{t(item.label)}\r\n\t\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t\t\t<span id={`cap-hint-${item.key}`} style={{ display: \"block\", ...hintStyle }}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{dependencyReason ?? t(item.hint)}\r\n\t\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t\t\t\t\t{repairAction === undefined ? null : (\r\n\t\t\t\t\t\t\t\t\t\t\t<button type=\"button\" style={buttonStyle} onClick={repairAction.action}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{repairAction.label}\r\n\t\t\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t\t\t<ToggleSwitch\r\n\t\t\t\t\t\t\t\t\t\t\tid={switchId}\r\n\t\t\t\t\t\t\t\t\t\t\tchecked={checked}\r\n\t\t\t\t\t\t\t\t\t\t\tdisabled={disabled}\r\n\t\t\t\t\t\t\t\t\t\t\tariaLabel={t(item.label)}\r\n\t\t\t\t\t\t\t\t\t\t\tariaDescribedBy={`cap-hint-${item.key}`}\r\n\t\t\t\t\t\t\t\t\t\t\tonChange={(next) => {\r\n\t\t\t\t\t\t\t\t\t\t\t\tvoid onPatchCapability(item.key, next);\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t</li>\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t})}\r\n\t\t\t\t\t</ul>\r\n\t\t\t\t\t<h4 style={{ ...titleStyle, fontSize: 14 }}>{t(\"imagineTitle\")}</h4>\r\n\t\t\t\t\t<ul style={listStyle}>\r\n\t\t\t\t\t\t{imagineToggles.map((item) => {\r\n\t\t\t\t\t\t\tconst checked = capabilities.value[item.key];\r\n\t\t\t\t\t\t\tconst dependencyReason = imagine?.configured === true ? undefined : t(\"requiresImagineCredential\");\r\n\t\t\t\t\t\t\tconst disabled = capabilitiesBusy || !capabilities.writable || dependencyReason !== undefined;\r\n\t\t\t\t\t\t\tconst switchId = `cap-switch-${item.key}`;\r\n\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t<li key={item.key}>\r\n\t\t\t\t\t\t\t\t\t<div style={{ ...rowStyle, alignItems: \"flex-start\" }}>\r\n\t\t\t\t\t\t\t\t\t\t<label htmlFor={switchId} style={{ flex: \"1 1 360px\", cursor: disabled ? \"default\" : \"pointer\" }}>\r\n\t\t\t\t\t\t\t\t\t\t\t<span style={{ display: \"block\", fontSize: 14, color: \"var(--dsw-alias-label-primary)\" }}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{t(item.label)}\r\n\t\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t\t\t<span id={`cap-hint-${item.key}`} style={{ display: \"block\", ...hintStyle }}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{dependencyReason ?? t(item.hint)}\r\n\t\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t\t\t\t\t{dependencyReason === undefined ? null : (\r\n\t\t\t\t\t\t\t\t\t\t\t<button type=\"button\" style={buttonStyle} onClick={() => onFocusDependency(\"imagineCredential\")}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{t(\"focusImagineCredential\")}\r\n\t\t\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t\t\t<ToggleSwitch\r\n\t\t\t\t\t\t\t\t\t\t\tid={switchId}\r\n\t\t\t\t\t\t\t\t\t\t\tchecked={checked}\r\n\t\t\t\t\t\t\t\t\t\t\tdisabled={disabled}\r\n\t\t\t\t\t\t\t\t\t\t\tariaLabel={t(item.label)}\r\n\t\t\t\t\t\t\t\t\t\t\tariaDescribedBy={`cap-hint-${item.key}`}\r\n\t\t\t\t\t\t\t\t\t\t\tonChange={(next) => {\r\n\t\t\t\t\t\t\t\t\t\t\t\tvoid onPatchCapability(item.key, next);\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t</li>\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t})}\r\n\t\t\t\t\t</ul>\r\n\t\t\t\t\t<div style={nestedStyle}>\r\n\t\t\t\t\t\t<h4 style={{ ...titleStyle, fontSize: 14 }}>{t(\"capabilityLimitsTitle\")}</h4>\r\n\t\t\t\t\t\t<p style={hintStyle}>{t(\"capabilityLimitsHint\")}</p>\r\n\t\t\t\t\t\t<ul style={listStyle}>\r\n\t\t\t\t\t\t\t{CAPABILITY_LIMITS.map((item) => {\r\n\t\t\t\t\t\t\t\tconst displayValue = capabilities.value[item.key] / item.scale;\r\n\t\t\t\t\t\t\t\tconst inputId = `cap-limit-${item.key}`;\r\n\t\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t\t<li key={item.key} style={rowStyle}>\r\n\t\t\t\t\t\t\t\t\t\t<label htmlFor={inputId} style={{ ...bodyStyle, flex: \"1 1 360px\" }}>\r\n\t\t\t\t\t\t\t\t\t\t\t<span style={{ display: \"block\", color: \"var(--dsw-alias-label-primary)\" }}>{t(item.label)}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t<span id={`${inputId}-hint`} style={{ display: \"block\", ...hintStyle }}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{t(item.hint)}\r\n\t\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t\t\t\t\t<input\r\n\t\t\t\t\t\t\t\t\t\t\tkey={`${item.key}-${String(capabilities.revision)}-${String(displayValue)}`}\r\n\t\t\t\t\t\t\t\t\t\t\tid={inputId}\r\n\t\t\t\t\t\t\t\t\t\t\ttype=\"number\"\r\n\t\t\t\t\t\t\t\t\t\t\tinputMode=\"numeric\"\r\n\t\t\t\t\t\t\t\t\t\t\tmin={item.min}\r\n\t\t\t\t\t\t\t\t\t\t\tmax={item.max}\r\n\t\t\t\t\t\t\t\t\t\t\tstep={1}\r\n\t\t\t\t\t\t\t\t\t\t\tdefaultValue={displayValue}\r\n\t\t\t\t\t\t\t\t\t\t\tdisabled={capabilitiesBusy || !capabilities.writable}\r\n\t\t\t\t\t\t\t\t\t\t\taria-describedby={`${inputId}-hint`}\r\n\t\t\t\t\t\t\t\t\t\t\tstyle={{ ...inputStyle, width: 112, flex: \"0 0 112px\" }}\r\n\t\t\t\t\t\t\t\t\t\t\tonInput={(event) => {\r\n\t\t\t\t\t\t\t\t\t\t\t\tevent.currentTarget.setCustomValidity(\"\");\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\tonKeyDown={(event) => {\r\n\t\t\t\t\t\t\t\t\t\t\t\tif (event.key === \"Enter\") event.currentTarget.blur();\r\n\t\t\t\t\t\t\t\t\t\t\t\tif (event.key === \"Escape\") {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tevent.currentTarget.value = String(displayValue);\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tevent.currentTarget.setCustomValidity(\"\");\r\n\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\tonBlur={(event) => {\r\n\t\t\t\t\t\t\t\t\t\t\t\tconst target = event.currentTarget;\r\n\t\t\t\t\t\t\t\t\t\t\t\tconst next = Number(target.value);\r\n\t\t\t\t\t\t\t\t\t\t\t\tif (!Number.isInteger(next) || next < item.min || next > item.max) {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\ttarget.setCustomValidity(t(\"capabilityLimitInvalid\", { min: item.min, max: item.max }));\r\n\t\t\t\t\t\t\t\t\t\t\t\t\ttarget.reportValidity();\r\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\ttarget.setCustomValidity(\"\");\r\n\t\t\t\t\t\t\t\t\t\t\t\tconst apiValue = next * item.scale;\r\n\t\t\t\t\t\t\t\t\t\t\t\tif (apiValue === capabilities.value[item.key]) return;\r\n\t\t\t\t\t\t\t\t\t\t\t\tvoid Promise.resolve(onPatchCapability(item.key, apiValue)).then((saved) => {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (saved === false && target.isConnected) target.value = String(displayValue);\r\n\t\t\t\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t</li>\r\n\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t})}\r\n\t\t\t\t\t\t</ul>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</fieldset>\r\n\t\t\t)}\r\n\t\t</section>\r\n\t);\r\n}\r\n", "/** Local API gateway settings tab. */\r\n\r\nimport { type KeyboardEvent, useEffect, useMemo, useRef, useState } from \"react\";\r\nimport { GATEWAY_PORT_MAX, GATEWAY_PORT_MIN } from \"../constants.ts\";\r\nimport { buildGatewaySnippets, type GatewaySnippetId } from \"../gatewaySnippets.ts\";\r\nimport { formatGatewayBaseUrl, parseGatewayPort, randomGatewayPort } from \"../parsers.ts\";\r\nimport {\r\n\tbodyStyle,\r\n\tbuttonStyle,\r\n\tcardStyle,\r\n\tcopyRowStyle,\r\n\tdotStyle,\r\n\terrorStyle,\r\n\thintStyle,\r\n\tinputStyle,\r\n\tmonoStyle,\r\n\tnestedStyle,\r\n\tprimaryButtonStyle,\r\n\tsegmentedNavStyle,\r\n\tsegmentedTabActiveStyle,\r\n\tsegmentedTabStyle,\r\n\tskeletonStyle,\r\n\tsnippetStyle,\r\n\tstatusStyle,\r\n\ttitleStyle,\r\n\twarningStyle,\r\n} from \"../styles.ts\";\r\nimport type { CopyField, GatewayView, GrokBuildSettingsInjected } from \"../types.ts\";\r\nimport { Badge } from \"./Badge.tsx\";\r\nimport { CopyButton } from \"./CopyButton.tsx\";\r\nimport { ToggleSwitch } from \"./ToggleSwitch.tsx\";\r\n\r\nexport interface GatewayTabProps {\r\n\tt: GrokBuildSettingsInjected[\"t\"];\r\n\tgateway: GatewayView | undefined;\r\n\tgatewayError: string | undefined;\r\n\tgatewayBusy: boolean;\r\n\tgatewayOnceKey: string | undefined;\r\n\tgatewayKeyVisible: boolean;\r\n\tgatewayRotateConfirm: boolean;\r\n\tgatewayRevealError: string | undefined;\r\n\tportDraft: string;\r\n\tcopiedField: CopyField | undefined;\r\n\tcopyFailedField: CopyField | undefined;\r\n\tonEnabledChange: (enabled: boolean) => void;\r\n\tonRetry: () => void;\r\n\tonPortDraftChange: (value: string) => void;\r\n\tonApplyPort: () => void;\r\n\tonRandomPort: (port: number) => void;\r\n\tonCopy: (field: CopyField, text: string) => void;\r\n\tonCopyKey: () => void;\r\n\tonToggleKeyVisible: () => void;\r\n\tonRotateConfirm: () => void;\r\n\tonRotateCancel: () => void;\r\n\tonRotate: () => void;\r\n}\r\n\r\nconst SNIPPET_TABS: readonly {\r\n\tid: GatewaySnippetId;\r\n\tlabelKey: \"gatewaySnippetCurl\" | \"gatewaySnippetPython\" | \"gatewaySnippetIde\";\r\n}[] = [\r\n\t{ id: \"curl\", labelKey: \"gatewaySnippetCurl\" },\r\n\t{ id: \"python\", labelKey: \"gatewaySnippetPython\" },\r\n\t{ id: \"ide\", labelKey: \"gatewaySnippetIde\" },\r\n];\r\n\r\nexport function GatewayTab({\r\n\tt,\r\n\tgateway,\r\n\tgatewayError,\r\n\tgatewayBusy,\r\n\tgatewayOnceKey,\r\n\tgatewayKeyVisible,\r\n\tgatewayRotateConfirm,\r\n\tgatewayRevealError,\r\n\tportDraft,\r\n\tcopiedField,\r\n\tcopyFailedField,\r\n\tonEnabledChange,\r\n\tonRetry,\r\n\tonPortDraftChange,\r\n\tonApplyPort,\r\n\tonRandomPort,\r\n\tonCopyKey,\r\n\tonToggleKeyVisible,\r\n\tonRotateConfirm,\r\n\tonRotateCancel,\r\n\tonRotate,\r\n}: GatewayTabProps) {\r\n\tconst [enableConfirm, setEnableConfirm] = useState(false);\r\n\tconst [activeSnippet, setActiveSnippet] = useState<GatewaySnippetId>(\"curl\");\r\n\tconst enableConfirmAction = useRef<HTMLButtonElement>(null);\r\n\tconst rotateTrigger = useRef<HTMLButtonElement>(null);\r\n\tconst rotateConfirmAction = useRef<HTMLButtonElement>(null);\r\n\tconst restoreEnableFocus = useRef(false);\r\n\tconst restoreRotateFocus = useRef(false);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (enableConfirm) {\r\n\t\t\tenableConfirmAction.current?.focus();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!restoreEnableFocus.current) return;\r\n\t\trestoreEnableFocus.current = false;\r\n\t\tdocument.getElementById(\"coding-oauth-gateway-enabled\")?.focus();\r\n\t}, [enableConfirm]);\r\n\tuseEffect(() => {\r\n\t\tif (gatewayRotateConfirm) {\r\n\t\t\trotateConfirmAction.current?.focus();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!restoreRotateFocus.current) return;\r\n\t\trestoreRotateFocus.current = false;\r\n\t\trotateTrigger.current?.focus();\r\n\t}, [gatewayRotateConfirm]);\r\n\r\n\tconst portValid = parseGatewayPort(portDraft) !== undefined;\r\n\tconst portChanged = gateway !== undefined && portDraft !== String(gateway.port);\r\n\r\n\tconst snippets = useMemo(() => {\r\n\t\tif (gateway === undefined || !gatewayKeyVisible || gatewayOnceKey === undefined || gateway.models.length === 0) {\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\t\tconst openAi = `${formatGatewayBaseUrl(gateway.bind, gateway.port)}/v1`;\r\n\t\tconst anthropic = formatGatewayBaseUrl(gateway.bind, gateway.port);\r\n\t\t// A masked keyHint is display-only and can never produce an executable command.\r\n\t\treturn buildGatewaySnippets(openAi, anthropic, gatewayOnceKey, gateway.models[0]);\r\n\t}, [gateway, gatewayKeyVisible, gatewayOnceKey]);\r\n\r\n\tconst copyLabel = (field: CopyField, idle?: string): string => {\r\n\t\tif (copyFailedField === field) return t(\"copyFailed\");\r\n\t\tif (copiedField === field) return t(\"copied\");\r\n\t\treturn idle ?? t(\"copy\");\r\n\t};\r\n\r\n\tconst focusSnippetTab = (index: number): void => {\r\n\t\tconst tab = SNIPPET_TABS[index];\r\n\t\tif (tab === undefined) return;\r\n\t\tsetActiveSnippet(tab.id);\r\n\t\tdocument.getElementById(`coding-oauth-snippet-tab-${tab.id}`)?.focus();\r\n\t};\r\n\r\n\tconst onSnippetKeyDown = (event: KeyboardEvent<HTMLDivElement>): void => {\r\n\t\tconst current = SNIPPET_TABS.findIndex((tab) => tab.id === activeSnippet);\r\n\t\tif (current < 0) return;\r\n\t\tif (event.key === \"ArrowRight\" || event.key === \"ArrowDown\") {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tfocusSnippetTab((current + 1) % SNIPPET_TABS.length);\r\n\t\t} else if (event.key === \"ArrowLeft\" || event.key === \"ArrowUp\") {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tfocusSnippetTab((current - 1 + SNIPPET_TABS.length) % SNIPPET_TABS.length);\r\n\t\t} else if (event.key === \"Home\") {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tfocusSnippetTab(0);\r\n\t\t} else if (event.key === \"End\") {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tfocusSnippetTab(SNIPPET_TABS.length - 1);\r\n\t\t}\r\n\t};\r\n\r\n\tconst openAiUrl = gateway === undefined ? \"\" : `${formatGatewayBaseUrl(gateway.bind, gateway.port)}/v1`;\r\n\tconst anthropicUrl = gateway === undefined ? \"\" : formatGatewayBaseUrl(gateway.bind, gateway.port);\r\n\r\n\treturn (\r\n\t\t<section style={cardStyle} aria-labelledby=\"coding-oauth-gateway-title\">\r\n\t\t\t<div>\r\n\t\t\t\t<h3 id=\"coding-oauth-gateway-title\" style={{ ...titleStyle, fontSize: 16 }}>\r\n\t\t\t\t\t{t(\"gatewayTitle\")}\r\n\t\t\t\t</h3>\r\n\t\t\t\t<p style={{ ...bodyStyle, marginTop: 4 }}>{t(\"gatewayIntro\")}</p>\r\n\t\t\t\t<p style={{ ...warningStyle, marginTop: 8 }}>{t(\"gatewayWarning\")}</p>\r\n\t\t\t\t<p style={{ ...hintStyle, marginTop: 8 }}>{t(\"gatewayLoopbackHint\")}</p>\r\n\t\t\t</div>\r\n\t\t\t{gatewayError === undefined ? null : (\r\n\t\t\t\t<p style={errorStyle} role=\"alert\">\r\n\t\t\t\t\t{gatewayError}\r\n\t\t\t\t</p>\r\n\t\t\t)}\r\n\t\t\t{gatewayRevealError === undefined ? null : (\r\n\t\t\t\t<p style={errorStyle} role=\"alert\">\r\n\t\t\t\t\t{gatewayRevealError}\r\n\t\t\t\t</p>\r\n\t\t\t)}\r\n\t\t\t{gateway === undefined && gatewayError === undefined ? (\r\n\t\t\t\t<div style={skeletonStyle} role=\"status\" aria-busy=\"true\">\r\n\t\t\t\t\t<div style={statusStyle}>\r\n\t\t\t\t\t\t<span aria-hidden=\"true\" style={dotStyle(\"loading\")} />\r\n\t\t\t\t\t\t{t(\"gatewayLoading\")}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t) : gateway === undefined ? (\r\n\t\t\t\t<div style={nestedStyle} role=\"status\">\r\n\t\t\t\t\t<p style={hintStyle}>{t(\"gatewayLoadFailed\")}</p>\r\n\t\t\t\t\t<button type=\"button\" style={buttonStyle} onClick={onRetry}>\r\n\t\t\t\t\t\t{t(\"retry\")}\r\n\t\t\t\t\t</button>\r\n\t\t\t\t</div>\r\n\t\t\t) : (\r\n\t\t\t\t<div style={nestedStyle}>\r\n\t\t\t\t\t<Badge\r\n\t\t\t\t\t\tlabel={gateway.running ? t(\"gatewayRunning\") : t(\"gatewayStopped\")}\r\n\t\t\t\t\t\ttone={gateway.running ? \"success\" : \"neutral\"}\r\n\t\t\t\t\t/>\r\n\t\t\t\t\t<p style={hintStyle}>\r\n\t\t\t\t\t\t{gateway.models.length > 0\r\n\t\t\t\t\t\t\t? t(\"gatewayModelsReady\", { count: gateway.models.length, model: gateway.models[0] })\r\n\t\t\t\t\t\t\t: t(\"gatewayModelsUnavailable\")}\r\n\t\t\t\t\t</p>\r\n\t\t\t\t\t<p style={hintStyle}>{gateway.keyConfigured ? t(\"gatewayKeyConfigured\") : t(\"gatewayKeyNotConfigured\")}</p>\r\n\t\t\t\t\t{enableConfirm ? (\r\n\t\t\t\t\t\t<div style={nestedStyle}>\r\n\t\t\t\t\t\t\t<p style={bodyStyle}>{t(\"gatewayEnableConfirm\")}</p>\r\n\t\t\t\t\t\t\t<div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8 }}>\r\n\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\tref={enableConfirmAction}\r\n\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\tstyle={primaryButtonStyle}\r\n\t\t\t\t\t\t\t\t\tdisabled={gatewayBusy}\r\n\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\trestoreEnableFocus.current = true;\r\n\t\t\t\t\t\t\t\t\t\tsetEnableConfirm(false);\r\n\t\t\t\t\t\t\t\t\t\tonEnabledChange(true);\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t{t(\"gatewayEnableConfirmAction\")}\r\n\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\tstyle={buttonStyle}\r\n\t\t\t\t\t\t\t\t\tdisabled={gatewayBusy}\r\n\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\trestoreEnableFocus.current = true;\r\n\t\t\t\t\t\t\t\t\t\tsetEnableConfirm(false);\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t{t(\"gatewayEnableCancel\")}\r\n\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t) : (\r\n\t\t\t\t\t\t<label\r\n\t\t\t\t\t\t\thtmlFor=\"coding-oauth-gateway-enabled\"\r\n\t\t\t\t\t\t\tstyle={{\r\n\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\tjustifyContent: \"space-between\",\r\n\t\t\t\t\t\t\t\tgap: 12,\r\n\t\t\t\t\t\t\t\tfontSize: 14,\r\n\t\t\t\t\t\t\t\tcolor: \"var(--dsw-alias-label-primary)\",\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t<span>{t(\"gatewayEnabled\")}</span>\r\n\t\t\t\t\t\t\t<ToggleSwitch\r\n\t\t\t\t\t\t\t\tid=\"coding-oauth-gateway-enabled\"\r\n\t\t\t\t\t\t\t\tchecked={gateway.enabled}\r\n\t\t\t\t\t\t\t\tdisabled={gatewayBusy}\r\n\t\t\t\t\t\t\t\tonChange={(enabled) => {\r\n\t\t\t\t\t\t\t\t\tif (enabled) {\r\n\t\t\t\t\t\t\t\t\t\tsetEnableConfirm(true);\r\n\t\t\t\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\tonEnabledChange(false);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t</label>\r\n\t\t\t\t\t)}\r\n\t\t\t\t\t<div>\r\n\t\t\t\t\t\t<label\r\n\t\t\t\t\t\t\thtmlFor=\"coding-oauth-gateway-port\"\r\n\t\t\t\t\t\t\tstyle={{ ...bodyStyle, color: \"var(--dsw-alias-label-primary)\" }}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{t(\"gatewayPort\")}\r\n\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t<p id=\"coding-oauth-gateway-port-hint\" style={hintStyle}>\r\n\t\t\t\t\t\t\t{t(\"gatewayPortHint\")}\r\n\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t{!portValid && portDraft.length > 0 ? (\r\n\t\t\t\t\t\t\t<p style={{ ...hintStyle, color: \"var(--dsw-alias-state-error-primary)\" }} role=\"alert\">\r\n\t\t\t\t\t\t\t\t{t(\"gatewayPortInvalid\")}\r\n\t\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t) : null}\r\n\t\t\t\t\t\t<div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8, marginTop: 8 }}>\r\n\t\t\t\t\t\t\t<input\r\n\t\t\t\t\t\t\t\tid=\"coding-oauth-gateway-port\"\r\n\t\t\t\t\t\t\t\ttype=\"number\"\r\n\t\t\t\t\t\t\t\tinputMode=\"numeric\"\r\n\t\t\t\t\t\t\t\tmin={GATEWAY_PORT_MIN}\r\n\t\t\t\t\t\t\t\tmax={GATEWAY_PORT_MAX}\r\n\t\t\t\t\t\t\t\tstep={1}\r\n\t\t\t\t\t\t\t\tvalue={portDraft}\r\n\t\t\t\t\t\t\t\tdisabled={gatewayBusy}\r\n\t\t\t\t\t\t\t\taria-describedby=\"coding-oauth-gateway-port-hint\"\r\n\t\t\t\t\t\t\t\taria-invalid={!portValid && portDraft.length > 0}\r\n\t\t\t\t\t\t\t\tstyle={{\r\n\t\t\t\t\t\t\t\t\t...inputStyle,\r\n\t\t\t\t\t\t\t\t\twidth: 112,\r\n\t\t\t\t\t\t\t\t\tflex: \"0 0 112px\",\r\n\t\t\t\t\t\t\t\t\tborderColor:\r\n\t\t\t\t\t\t\t\t\t\t!portValid && portDraft.length > 0\r\n\t\t\t\t\t\t\t\t\t\t\t? \"var(--dsw-alias-state-error-primary)\"\r\n\t\t\t\t\t\t\t\t\t\t\t: \"var(--dsw-alias-border-l2)\",\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\tonChange={(event) => {\r\n\t\t\t\t\t\t\t\t\tonPortDraftChange(event.target.value);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\tonKeyDown={(event) => {\r\n\t\t\t\t\t\t\t\t\tif (event.key === \"Enter\") {\r\n\t\t\t\t\t\t\t\t\t\tevent.preventDefault();\r\n\t\t\t\t\t\t\t\t\t\tonApplyPort();\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\tif (event.key === \"Escape\") {\r\n\t\t\t\t\t\t\t\t\t\tonPortDraftChange(String(gateway.port));\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tstyle={primaryButtonStyle}\r\n\t\t\t\t\t\t\t\tdisabled={gatewayBusy || !portChanged || !portValid}\r\n\t\t\t\t\t\t\t\tonClick={onApplyPort}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{t(\"gatewayPortApply\")}\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tstyle={buttonStyle}\r\n\t\t\t\t\t\t\t\tdisabled={gatewayBusy}\r\n\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\tonRandomPort(randomGatewayPort(gateway.port));\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{t(\"gatewayPortRandom\")}\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<p style={copyRowStyle}>\r\n\t\t\t\t\t\t<span style={hintStyle}>\r\n\t\t\t\t\t\t\t{t(\"gatewayOpenAiUrl\")}\r\n\t\t\t\t\t\t\t<span style={{ display: \"block\", ...monoStyle }}>{openAiUrl}</span>\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t<CopyButton\r\n\t\t\t\t\t\t\ttext={openAiUrl}\r\n\t\t\t\t\t\t\tidleLabel={t(\"copy\")}\r\n\t\t\t\t\t\t\tcopiedLabel={t(\"copied\")}\r\n\t\t\t\t\t\t\tfailedLabel={t(\"copyFailed\")}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</p>\r\n\t\t\t\t\t<p style={copyRowStyle}>\r\n\t\t\t\t\t\t<span style={hintStyle}>\r\n\t\t\t\t\t\t\t{t(\"gatewayAnthropicUrl\")}\r\n\t\t\t\t\t\t\t<span style={{ display: \"block\", ...monoStyle }}>{anthropicUrl}</span>\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t<CopyButton\r\n\t\t\t\t\t\t\ttext={anthropicUrl}\r\n\t\t\t\t\t\t\tidleLabel={t(\"copy\")}\r\n\t\t\t\t\t\t\tcopiedLabel={t(\"copied\")}\r\n\t\t\t\t\t\t\tfailedLabel={t(\"copyFailed\")}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</p>\r\n\t\t\t\t\t<p style={copyRowStyle}>\r\n\t\t\t\t\t\t<span style={hintStyle}>\r\n\t\t\t\t\t\t\t{t(\"gatewayKeyHint\")}\r\n\t\t\t\t\t\t\t<span style={{ display: \"block\", ...monoStyle, overflowWrap: \"anywhere\" }}>\r\n\t\t\t\t\t\t\t\t{gatewayKeyVisible && gatewayOnceKey !== undefined ? gatewayOnceKey : gateway.keyHint || \"\u2014\"}\r\n\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t<span style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8 }}>\r\n\t\t\t\t\t\t\t<button type=\"button\" style={primaryButtonStyle} disabled={gatewayBusy} onClick={onCopyKey}>\r\n\t\t\t\t\t\t\t\t{copyLabel(\"key\", t(\"gatewayCopyKey\"))}\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t<button type=\"button\" style={buttonStyle} disabled={gatewayBusy} onClick={onToggleKeyVisible}>\r\n\t\t\t\t\t\t\t\t{gatewayKeyVisible ? t(\"gatewayHideKey\") : t(\"gatewayShowKey\")}\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t</p>\r\n\t\t\t\t\t<p style={hintStyle}>{t(\"gatewayKeyCopyHint\")}</p>\r\n\t\t\t\t\t{gateway.enabled && snippets !== undefined ? (\r\n\t\t\t\t\t\t<div style={{ display: \"flex\", flexDirection: \"column\", gap: 10 }}>\r\n\t\t\t\t\t\t\t<h4 style={{ ...titleStyle, fontSize: 14 }}>{t(\"gatewaySnippetsTitle\")}</h4>\r\n\t\t\t\t\t\t\t<div\r\n\t\t\t\t\t\t\t\trole=\"tablist\"\r\n\t\t\t\t\t\t\t\taria-label={t(\"gatewaySnippetsTitle\")}\r\n\t\t\t\t\t\t\t\tstyle={segmentedNavStyle}\r\n\t\t\t\t\t\t\t\tonKeyDown={onSnippetKeyDown}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{SNIPPET_TABS.map((tab) => {\r\n\t\t\t\t\t\t\t\t\tconst selected = activeSnippet === tab.id;\r\n\t\t\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\t\tkey={tab.id}\r\n\t\t\t\t\t\t\t\t\t\t\tid={`coding-oauth-snippet-tab-${tab.id}`}\r\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\t\t\trole=\"tab\"\r\n\t\t\t\t\t\t\t\t\t\t\taria-selected={selected}\r\n\t\t\t\t\t\t\t\t\t\t\taria-controls=\"coding-oauth-snippet-panel\"\r\n\t\t\t\t\t\t\t\t\t\t\ttabIndex={selected ? 0 : -1}\r\n\t\t\t\t\t\t\t\t\t\t\tstyle={selected ? segmentedTabActiveStyle : segmentedTabStyle}\r\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\t\t\tsetActiveSnippet(tab.id);\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t{t(tab.labelKey)}\r\n\t\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t\t})}\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div\r\n\t\t\t\t\t\t\t\tid=\"coding-oauth-snippet-panel\"\r\n\t\t\t\t\t\t\t\trole=\"tabpanel\"\r\n\t\t\t\t\t\t\t\taria-labelledby={`coding-oauth-snippet-tab-${activeSnippet}`}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t<code style={snippetStyle}>{snippets[activeSnippet]}</code>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<CopyButton\r\n\t\t\t\t\t\t\t\ttext={snippets[activeSnippet]}\r\n\t\t\t\t\t\t\t\tidleLabel={t(\"copy\")}\r\n\t\t\t\t\t\t\t\tcopiedLabel={t(\"copied\")}\r\n\t\t\t\t\t\t\t\tfailedLabel={t(\"copyFailed\")}\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t) : gateway.enabled ? (\r\n\t\t\t\t\t\t<p style={hintStyle}>{t(\"gatewaySnippetsUnavailable\")}</p>\r\n\t\t\t\t\t) : null}\r\n\t\t\t\t\t{gatewayRotateConfirm ? (\r\n\t\t\t\t\t\t<div style={nestedStyle}>\r\n\t\t\t\t\t\t\t<p style={bodyStyle}>{t(\"gatewayRotateConfirm\")}</p>\r\n\t\t\t\t\t\t\t<p style={hintStyle}>{t(\"gatewayRotateConfirmHint\")}</p>\r\n\t\t\t\t\t\t\t<div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8 }}>\r\n\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\tref={rotateConfirmAction}\r\n\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\tstyle={primaryButtonStyle}\r\n\t\t\t\t\t\t\t\t\tdisabled={gatewayBusy}\r\n\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\trestoreRotateFocus.current = true;\r\n\t\t\t\t\t\t\t\t\t\tonRotate();\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t{t(\"gatewayRotateConfirmAction\")}\r\n\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\tstyle={buttonStyle}\r\n\t\t\t\t\t\t\t\t\tdisabled={gatewayBusy}\r\n\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\trestoreRotateFocus.current = true;\r\n\t\t\t\t\t\t\t\t\t\tonRotateCancel();\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t{t(\"gatewayRotateCancel\")}\r\n\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t) : (\r\n\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\tref={rotateTrigger}\r\n\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\tstyle={buttonStyle}\r\n\t\t\t\t\t\t\tdisabled={gatewayBusy}\r\n\t\t\t\t\t\t\tonClick={onRotateConfirm}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{t(\"gatewayRotate\")}\r\n\t\t\t\t\t\t</button>\r\n\t\t\t\t\t)}\r\n\t\t\t\t</div>\r\n\t\t\t)}\r\n\t\t</section>\r\n\t);\r\n}\r\n", "/** Quick-setup code snippets for the local API gateway. */\r\n\r\nexport type GatewaySnippetId = \"curl\" | \"python\" | \"ide\";\r\n\r\nexport function buildGatewaySnippets(\r\n\topenAiBaseUrl: string,\r\n\tanthropicBaseUrl: string,\r\n\tapiKeyPlaceholder: string,\r\n\tmodel = \"<gateway-model>\",\r\n): Record<GatewaySnippetId, string> {\r\n\tconst key = apiKeyPlaceholder.length > 0 ? apiKeyPlaceholder : \"<your-gateway-key>\";\r\n\treturn {\r\n\t\tcurl: `curl ${openAiBaseUrl}/chat/completions \\\\\r\n -H \"Authorization: Bearer ${key}\" \\\\\r\n -H \"Content-Type: application/json\" \\\\\r\n -d '{\"model\":\"${model}\",\"messages\":[{\"role\":\"user\",\"content\":\"Hello\"}]}'`,\r\n\t\tpython: `from openai import OpenAI\r\n\r\nclient = OpenAI(\r\n base_url=\"${openAiBaseUrl}\",\r\n api_key=\"${key}\",\r\n)\r\n\r\nresponse = client.chat.completions.create(\r\n model=\"${model}\",\r\n messages=[{\"role\": \"user\", \"content\": \"Hello\"}],\r\n)\r\nprint(response.choices[0].message.content)`,\r\n\t\tide: `# OpenAI-compatible client\r\nbase_url: ${openAiBaseUrl}\r\napi_key: ${key}\r\n\r\n# Anthropic-compatible client\r\nbase_url: ${anthropicBaseUrl}\r\napi_key: ${key}`,\r\n\t};\r\n}\r\n", "/** Accessible segmented tablist for Coding OAuth settings. */\r\n\r\nimport type { KeyboardEvent } from \"react\";\r\nimport { SETTINGS_TABS } from \"../constants.ts\";\r\nimport { segmentedNavStyle, segmentedTabActiveStyle, segmentedTabStyle } from \"../styles.ts\";\r\nimport type { GrokBuildSettingsInjected, SettingsTabId } from \"../types.ts\";\r\n\r\nexport interface SettingsTabHint {\r\n\tid: SettingsTabId;\r\n\tsuffix?: string;\r\n}\r\n\r\nexport interface SettingsTabsProps {\r\n\tt: GrokBuildSettingsInjected[\"t\"];\r\n\tactiveTab: SettingsTabId;\r\n\tonChange: (tab: SettingsTabId) => void;\r\n\thints?: readonly SettingsTabHint[];\r\n}\r\n\r\nexport function SettingsTabs({ t, activeTab, onChange, hints }: SettingsTabsProps) {\r\n\tconst hintFor = (id: SettingsTabId): string | undefined => hints?.find((entry) => entry.id === id)?.suffix;\r\n\r\n\tconst focusTab = (index: number): void => {\r\n\t\tconst tab = SETTINGS_TABS[index];\r\n\t\tif (tab === undefined) return;\r\n\t\tonChange(tab.id);\r\n\t\tconst button = document.getElementById(`coding-oauth-tab-${tab.id}`);\r\n\t\tbutton?.focus();\r\n\t};\r\n\r\n\tconst onKeyDown = (event: KeyboardEvent<HTMLDivElement>): void => {\r\n\t\tconst current = SETTINGS_TABS.findIndex((tab) => tab.id === activeTab);\r\n\t\tif (current < 0) return;\r\n\t\tif (event.key === \"ArrowRight\" || event.key === \"ArrowDown\") {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tfocusTab((current + 1) % SETTINGS_TABS.length);\r\n\t\t} else if (event.key === \"ArrowLeft\" || event.key === \"ArrowUp\") {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tfocusTab((current - 1 + SETTINGS_TABS.length) % SETTINGS_TABS.length);\r\n\t\t} else if (event.key === \"Home\") {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tfocusTab(0);\r\n\t\t} else if (event.key === \"End\") {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tfocusTab(SETTINGS_TABS.length - 1);\r\n\t\t}\r\n\t};\r\n\r\n\treturn (\r\n\t\t<div role=\"tablist\" aria-label={t(\"title\")} style={segmentedNavStyle} onKeyDown={onKeyDown}>\r\n\t\t\t{SETTINGS_TABS.map((tab) => {\r\n\t\t\t\tconst selected = activeTab === tab.id;\r\n\t\t\t\tconst suffix = hintFor(tab.id);\r\n\t\t\t\tconst label = suffix === undefined ? t(tab.label) : `${t(tab.label)} (${suffix})`;\r\n\t\t\t\treturn (\r\n\t\t\t\t\t<button\r\n\t\t\t\t\t\tkey={tab.id}\r\n\t\t\t\t\t\tid={`coding-oauth-tab-${tab.id}`}\r\n\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\trole=\"tab\"\r\n\t\t\t\t\t\taria-selected={selected}\r\n\t\t\t\t\t\taria-controls={selected ? `coding-oauth-panel-${tab.id}` : undefined}\r\n\t\t\t\t\t\ttabIndex={selected ? 0 : -1}\r\n\t\t\t\t\t\tstyle={selected ? segmentedTabActiveStyle : segmentedTabStyle}\r\n\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\tonChange(tab.id);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{label}\r\n\t\t\t\t\t</button>\r\n\t\t\t\t);\r\n\t\t\t})}\r\n\t\t</div>\r\n\t);\r\n}\r\n", "/** Injects global keyframes once for skeleton pulse and spinner animations. */\r\n\r\nconst STYLE_ID = \"dsh-coding-oauth-micro-styles\";\r\n\r\nconst CSS = `\r\n@keyframes dsh-coding-oauth-skeleton-pulse {\r\n 0% { background-position: 200% 0; }\r\n 100% { background-position: -200% 0; }\r\n}\r\n@keyframes dsh-coding-oauth-spin {\r\n from { transform: rotate(0deg); }\r\n to { transform: rotate(360deg); }\r\n}\r\n@keyframes dsh-coding-oauth-fade-in {\r\n from { opacity: 0; transform: translateY(-4px); }\r\n to { opacity: 1; transform: translateY(0); }\r\n}\r\n@media (prefers-reduced-motion: reduce) {\r\n [data-dsh-coding-oauth] *, [data-dsh-coding-oauth] *::before, [data-dsh-coding-oauth] *::after {\r\n animation-duration: 0.01ms !important;\r\n animation-iteration-count: 1 !important;\r\n transition-duration: 0.01ms !important;\r\n scroll-behavior: auto !important;\r\n }\r\n}\r\n@media (max-width: 560px) {\r\n [data-dsh-coding-oauth] button,\r\n [data-dsh-coding-oauth] input,\r\n [data-dsh-coding-oauth] [role=\"switch\"] {\r\n min-height: 44px;\r\n }\r\n [data-dsh-coding-oauth] [data-responsive-row] {\r\n align-items: stretch !important;\r\n flex-direction: column;\r\n }\r\n}\r\n`;\r\n\r\nlet injected = false;\r\n\r\nexport function ensureMicroStyles(): void {\r\n\tif (injected || typeof document === \"undefined\") return;\r\n\tif (document.getElementById(STYLE_ID) !== null) {\r\n\t\tinjected = true;\r\n\t\treturn;\r\n\t}\r\n\tconst style = document.createElement(\"style\");\r\n\tstyle.id = STYLE_ID;\r\n\tstyle.textContent = CSS;\r\n\tdocument.head.appendChild(style);\r\n\tinjected = true;\r\n}\r\n", "/** English copy for the Coding OAuth settings section. */\r\nexport const en = {\r\n\tnav: \"Coding OAuth\",\r\n\ttitle: \"Coding subscriptions\",\r\n\tintro:\r\n\t\t\"Use your own Grok Build, ChatGPT Codex, Kimi Code, and Claude Code subscriptions in dsh. API-key routes remain separate.\",\r\n\ttermsWarning:\r\n\t\t\"These are unofficial third-party integrations with subscription services. Provider terms, quotas, regions, and account-risk policies still apply.\",\r\n\tloadingAccount: \"Loading accounts\u2026\",\r\n\tsignedOut: \"Not signed in\",\r\n\tsigningIn: \"Waiting for authorization\u2026\",\r\n\tsignedIn: \"Signed in\",\r\n\trequestFailed: \"The account request failed.\",\r\n\tretry: \"Try again\",\r\n\tcancel: \"Cancel\",\r\n\tlogout: \"Sign out\",\r\n\tlogoutConfirmTitle: \"Confirm sign-out\",\r\n\tlogoutConfirmHint: \"Sign out of this provider in dsh? Your provider account itself is not changed.\",\r\n\tlogoutConfirmAction: \"Confirm sign-out\",\r\n\tworking: \"Working\u2026\",\r\n\tcancelLogin: \"Cancel sign-in\",\r\n\tdeviceLogin: \"Sign in with device code\",\r\n\tdeviceLoginRemote: \"Sign in with device code (best for remote)\",\r\n\tbrowserLogin: \"Sign in in browser\",\r\n\tpkceLogin: \"Sign in with authorization code\",\r\n\tuserCode: \"Enter this code when the provider asks:\",\r\n\topenUrl: \"Complete sign-in at:\",\r\n\tpopupBlocked: \"The browser blocked the sign-in window. Open this URL manually:\",\r\n\tpasteCodeHint:\r\n\t\t\"Paste the authorization code or complete redirect URL returned by the provider. For local PKCE, use this only if the callback could not reach this DSH host:\",\r\n\tpasteBrowserCodeHint:\r\n\t\t\"Paste the authorization code or complete redirect URL returned by the provider to finish this browser sign-in:\",\r\n\tpasteCodePlaceholder: \"authorization code or complete redirect URL\",\r\n\tpasteCodeLabel: \"Authorization code or complete redirect URL\",\r\n\tsubmitCode: \"Submit code\",\r\n\timportGrok: \"Import from Grok CLI\",\r\n\timportHint: \"Copies ~/.grok/auth.json into dsh. A later dsh refresh may rotate the token and sign the Grok CLI out.\",\r\n\tmodels: \"Visible models\",\r\n\tcatalogLive: \"From your current xAI account\",\r\n\tcatalogCache: \"From the last successful xAI listing\",\r\n\tcatalogFallback: \"Built-in Grok baseline (live listing unavailable)\",\r\n\tcatalogError: \"Could not refresh the live Grok model list.\",\r\n\tselectAll: \"Show all\",\r\n\tmodelHint: \"Checked models appear in the model picker as\",\r\n\tgrokTitle: \"xAI Grok Build\",\r\n\tgrokDescription: \"SuperGrok / X Premium coding subscription through the Grok Build endpoint.\",\r\n\tcodexTitle: \"OpenAI Codex\",\r\n\tcodexDescription: \"ChatGPT Plus/Pro Codex entitlement. Device code is recommended for a remote DSH host.\",\r\n\tkimiTitle: \"Kimi Code\",\r\n\tkimiDescription:\r\n\t\t\"Kimi Code membership through auth.kimi.com and api.kimi.com/coding; this is not the Moonshot API-key platform.\",\r\n\tclaudeTitle: \"Claude Code\",\r\n\tclaudeDescription: \"Claude Pro/Max OAuth with Claude Code scopes and automatic refresh.\",\r\n\tantigravityTitle: \"Google Antigravity\",\r\n\tantigravityDescription: \"Provided by the separately pinned MIT dsh-agy plugin and exposed as the agy route.\",\r\n\tantigravityInstalled: \"Installed (CLI-managed)\",\r\n\tantigravityMissing: \"Not installed\",\r\n\tantigravityCliHint:\r\n\t\t\"The unauthenticated dsh-agy web export dashboard is disabled. Manage Google OAuth with the profile-local CLI when needed.\",\r\n\tantigravityCliCommand: \"dsh plugin --profile web exec dsh-agy login --headless\",\r\n\tsourcesTitle: \"Pull a copy from official CLI files\",\r\n\tsourcesIntro:\r\n\t\t\"dsh can discover a local official CLI login and pull a one-way copy into its own store. Official CLI files stay read-only and are never modified.\",\r\n\tsourcesReadOnlyHint:\r\n\t\t\"This is a one-way pull of a copy. dsh does not update, replace, or write back the official CLI documents.\",\r\n\tsourcesLoading: \"Looking for official CLI login files\u2026\",\r\n\tsourcesCheckAgain: \"Check again\",\r\n\tsourcesAvailable: \"A readable copy is available\",\r\n\tsourcesUnavailable: \"No usable copy found\",\r\n\tsourcesAllMissingHint:\r\n\t\t\"No official CLI login files were found on this host. That is normal on a remote DSH machine \u2014 use device-code sign-in instead, or check again after logging in on this same host.\",\r\n\tsourcesAvailableHint:\r\n\t\t\"An official CLI login was found on this host. You can pull a one-way copy into dsh from a provider card.\",\r\n\tsourcesPullCopy: \"Pull a copy\",\r\n\tremoteAccountsTip:\r\n\t\t\"This Settings page looks remote (not loopback). Prefer device-code sign-in; browser pop-ups and local PKCE callbacks often fail from another machine.\",\r\n\tremoteTipDismiss: \"Dismiss\",\r\n\tsourcesPreviewTitle: \"Review this copy before saving it in dsh\",\r\n\tsourcesPreviewExpires: \"CLI credential expiry: {time}\",\r\n\tsourcesTicketExpires: \"This preview expires at {time}\",\r\n\tsourcesConflict: \"Stored dsh credential: {detail}\",\r\n\tsourcesAction: \"If you continue: {detail}\",\r\n\tsourcesWarnings: \"Notes\",\r\n\tsourcesConfirmOverwrite: \"Replace the credential already stored in dsh with this copy\",\r\n\tsourcesConfirmOverwriteHint: \"A different credential is already stored. Check the box, then confirm the pull.\",\r\n\tsourcesCommit: \"Confirm pull\",\r\n\tsourcesCancelPreview: \"Cancel preview\",\r\n\tsourcesCommitSuccess: \"Copied into dsh ({action}).\",\r\n\tsourcesPreviewFailed: \"Could not prepare a copy from that CLI file.\",\r\n\tsourcesCommitFailed: \"Could not save the copy in dsh.\",\r\n\tsourcesLoadFailed: \"Could not look for official CLI login files.\",\r\n\tsourceKindGrok: \"Grok CLI\",\r\n\tsourceKindCodex: \"Codex CLI\",\r\n\tsourceKindKimi: \"Kimi Code CLI\",\r\n\tsourceKindClaude: \"Claude Code CLI\",\r\n\tsourceReasonMissing: \"No official CLI file was found at the expected location.\",\r\n\tsourceReasonUnsafe: \"The official CLI file is not safe to read (permissions or file type).\",\r\n\tsourceReasonInvalid: \"The official CLI file is present but is not a usable OAuth login.\",\r\n\tsourceReasonTooLarge: \"The official CLI file is larger than the allowed read limit.\",\r\n\tsourceConflictNone: \"dsh has no stored credential yet\",\r\n\tsourceConflictSameCredential: \"same credential already stored\",\r\n\tsourceConflictSameAccount: \"same account, different credential\",\r\n\tsourceConflictDifferentAccount: \"a different account is already stored\",\r\n\tsourceConflictUnknownAccount: \"an existing credential is stored (account could not be compared)\",\r\n\tsourceConflictUnreadableDestination: \"the stored dsh credential could not be read\",\r\n\tsourceConflictUnsafeDestination: \"the stored dsh credential file is not safe to replace\",\r\n\tsourceConflictUnrecognized: \"the stored credential needs a review\",\r\n\tsourceActionImport: \"save this copy in dsh\",\r\n\tsourceActionReuse: \"keep the stored dsh credential (it already matches)\",\r\n\tsourceActionOverwrite: \"replace the stored dsh credential\",\r\n\tsourceActionBlocked: \"blocked \u2014 the stored dsh file cannot be replaced from here\",\r\n\tsourceActionUnrecognized: \"needs a review\",\r\n\tsourceCommitImported: \"saved\",\r\n\tsourceCommitUnchanged: \"already matched\",\r\n\tsourceCommitOverwritten: \"replaced\",\r\n\tcapabilitiesTitle: \"Subscription capabilities\",\r\n\tcapabilitiesIntro:\r\n\t\t\"Every switch starts off. Turning one on uses that vendor\u2019s subscription quota, not a separate API-key bill.\",\r\n\tcapabilitiesQuotaHint:\r\n\t\t\"Search, images, edits, Fast, usage, and Grok Imagine all consume the matching subscription quota when they run.\",\r\n\tcapabilitiesReadOnly: \"These switches are read-only in this deployment.\",\r\n\tcapabilitiesLoading: \"Loading capability settings\u2026\",\r\n\tcapabilitiesLoadFailed: \"Could not load capability settings.\",\r\n\tcapabilitiesSaveFailed: \"Could not save that capability setting.\",\r\n\tcapabilitiesConflictRefreshed: \"Those settings changed elsewhere. The page was refreshed; try again.\",\r\n\tcapabilityLimitsTitle: \"Capability limits\",\r\n\tcapabilityLimitsHint: \"Limits apply live to newly started operations and remain within the audited safety bounds.\",\r\n\tcapSearchResults: \"Maximum search results\",\r\n\tcapSearchResultsHint: \"Codex search returns at most this many results (1\u201320).\",\r\n\tcapImageCount: \"Maximum images per call\",\r\n\tcapImageCountHint: \"Codex and Imagine image tools can return at most this many images (1\u20134).\",\r\n\tcapVideoTtlHours: \"Video artifact retention (hours)\",\r\n\tcapVideoTtlHoursHint:\r\n\t\t\"Completed Imagine video artifacts are kept for 1\u2013168 hours. Lowering retention cleans older artifacts immediately; raising it applies to new artifacts.\",\r\n\tcapabilityLimitInvalid: \"Enter a whole number from {min} through {max}.\",\r\n\tcapCodexSearch: \"Codex subscription search\",\r\n\tcapCodexSearchHint: \"Optional search using Codex quota.\",\r\n\tcapCodexImages: \"Codex images\",\r\n\tcapCodexImagesHint: \"Generate images with ChatGPT/Codex quota.\",\r\n\tcapCodexImageEdits: \"Codex image edits\",\r\n\tcapCodexImageEditsHint: \"Edit images; requires Codex images.\",\r\n\tcapCodexUsage: \"Show Codex quota\",\r\n\tcapCodexUsageHint: \"Show remaining quota on the Codex account card when available.\",\r\n\tcapCodexFast: \"Fast requested\",\r\n\tcapCodexFastHint: \"Publish the Fast route when the live catalog confirms priority eligibility.\",\r\n\tcapGrokImagineImage: \"Grok Imagine images\",\r\n\tcapGrokImagineImageHint: \"Needs a separate Imagine credential (not Grok OAuth alone).\",\r\n\tcapGrokImagineVideo: \"Grok Imagine video\",\r\n\tcapGrokImagineVideoHint: \"Needs a separate Imagine credential (not Grok OAuth alone).\",\r\n\tusageTitle: \"Codex quota\",\r\n\tusageLoading: \"Loading Codex quota\u2026\",\r\n\tusageUnavailable: \"Codex quota is not available right now.\",\r\n\tusageEmpty: \"The vendor did not return any displayable quota fields.\",\r\n\tusageFetchedAt: \"Last read: {time}\",\r\n\tusageRateLimit: \"Rate limit\",\r\n\tusageWindow: \"{seconds}s window\",\r\n\tusageUsed: \"Used {value}\",\r\n\tusageRemaining: \"Remaining {value}\",\r\n\tusageResets: \"Resets {time}\",\r\n\tusageCredits: \"Credits\",\r\n\tusageCreditsUnlimited: \"Unlimited credits\",\r\n\tusageCreditsLimited: \"Limited credits\",\r\n\tusageBalance: \"Balance {value}\",\r\n\tusageIndividualLimit: \"Individual limit\",\r\n\tusageLimit: \"Limit {value}\",\r\n\tusageUsedAmount: \"Used {value}\",\r\n\tusageRemainingAmount: \"Remaining {value}\",\r\n\tusageSpendControlReached: \"Spend control has been reached.\",\r\n\tusageResetCredits: \"Reset credits available: {value}\",\r\n\timagineTitle: \"Grok Imagine credential\",\r\n\timagineIntro:\r\n\t\t\"Official Imagine calls use an xAI API credential (for example $XAI_API_KEY). That key is separate from a Grok Build OAuth login and is never shown here.\",\r\n\timagineLoading: \"Checking the Imagine credential\u2026\",\r\n\timagineLoadFailed: \"Could not read the Imagine credential status.\",\r\n\timagineConfigured: \"An Imagine credential is configured\",\r\n\timagineNotConfigured: \"No Imagine credential is configured\",\r\n\timagineSource: \"Source: {source}\",\r\n\timagineWritable: \"This deployment can update the Imagine credential store.\",\r\n\timagineReadOnly: \"This deployment cannot update the Imagine credential store.\",\r\n\timagineSourceNone: \"none\",\r\n\timagineSourceEnv: \"environment variable\",\r\n\timagineSourceApiKey: \"stored API key\",\r\n\timagineSourceOAuth: \"OAuth access (only if Imagine accepted it)\",\r\n\timagineSourceCliKey: \"Grok CLI key field\",\r\n\timagineSourceUnknown: \"configured (details withheld)\",\r\n\ttabAccounts: \"Accounts\",\r\n\ttabCapabilities: \"Capabilities\",\r\n\ttabGateway: \"Gateway\",\r\n\ttabAbout: \"About\",\r\n\tcopy: \"Copy\",\r\n\tcopied: \"Copied\",\r\n\tcopyFailed: \"Could not copy\",\r\n\tmodelsSummary: \"{selected}/{total} models visible\",\r\n\texpandModels: \"Models\",\r\n\tcollapseModels: \"Hide models\",\r\n\tusageUsedShort: \"Used {value}\",\r\n\tgatewayTitle: \"Local API gateway\",\r\n\tgatewayIntro: \"Loopback OpenAI/Anthropic-compatible server for your own tools. Off until you enable it.\",\r\n\tgatewayWarning: \"Exposes signed-in subscriptions as a local API. Can violate provider terms and uses quota.\",\r\n\tgatewayLoopbackHint: \"Binds to loopback only. Do not port-forward or expose this gateway on a public interface.\",\r\n\tgatewayEnableConfirm:\r\n\t\t\"Enable the local API gateway? It exposes your signed-in subscriptions to tools on this host and consumes provider quota.\",\r\n\tgatewayEnableConfirmAction: \"Confirm\",\r\n\tgatewayEnableCancel: \"Cancel\",\r\n\tgatewayEnabled: \"Enable local gateway\",\r\n\tgatewayBind: \"Bind\",\r\n\tgatewayPort: \"Port\",\r\n\tgatewayPortHint: \"Integer from 1024 through 65535. Apply to save; Random fills a high port, then Apply.\",\r\n\tgatewayPortApply: \"Apply\",\r\n\tgatewayPortRandom: \"Random\",\r\n\tgatewayPortInvalid: \"Enter a whole port number from 1024 through 65535.\",\r\n\tgatewayAddress: \"Gateway address\",\r\n\tgatewayOpenAiUrl: \"OpenAI-compatible base URL\",\r\n\tgatewayAnthropicUrl: \"Anthropic-compatible base URL\",\r\n\tgatewayKeyHint: \"Bearer key\",\r\n\tgatewayKeyCopyHint: \"Copy uses the current key. Rotate only if you want to invalidate existing clients.\",\r\n\tgatewayCopyKey: \"Copy key\",\r\n\tgatewayShowKey: \"Show\",\r\n\tgatewayHideKey: \"Hide\",\r\n\tgatewayRevealFailed: \"Could not read the current key.\",\r\n\tgatewayRotateConfirm: \"Rotate the key? Existing clients will stop working.\",\r\n\tgatewayRotateConfirmHint: \"This replaces the current Bearer key.\",\r\n\tgatewayRotateConfirmAction: \"Confirm rotate\",\r\n\tgatewayRotateCancel: \"Cancel\",\r\n\tgatewayRunning: \"Listening\",\r\n\tgatewayStopped: \"Not listening\",\r\n\tgatewayRotate: \"Rotate API key\",\r\n\tgatewayRotated: \"New key (shown once): {key}\",\r\n\tgatewayLoadFailed: \"Could not load gateway settings.\",\r\n\tgatewaySaveFailed: \"Could not update the gateway.\",\r\n\tgatewayLoading: \"Loading gateway settings\u2026\",\r\n\tgatewayModelsReady: \"{count} executable model(s) available. Snippets use {model}.\",\r\n\tgatewayModelsUnavailable: \"No signed-in provider currently exposes an executable gateway model.\",\r\n\tgatewayKeyConfigured: \"A real Bearer key is configured. Reveal it before copying an executable snippet.\",\r\n\tgatewayKeyNotConfigured: \"No Bearer key is configured yet.\",\r\n\tremoteLoginHelp:\r\n\t\t\"On a remote DSH host, open Settings here and use device-code sign-in for each provider. Complete the code on any browser that can reach the provider, then return to chat and pick the provider route model.\",\r\n\tpluginVersion: \"Plugin version {version}\",\r\n\taboutTitle: \"About\",\r\n\taboutDocsHint:\r\n\t\t\"See the plugin README and INSTALL docs in the repository for setup, supported providers, and gateway safety notes.\",\r\n\taboutDocsLink: \"Open README on GitHub\",\r\n\totherLoginMethods: \"Other sign-in methods\",\r\n\thideOtherLoginMethods: \"Hide other methods\",\r\n\tsignInStepOpen: \"Open the provider authorization page\",\r\n\tsignInStepCode: \"Enter the device code when prompted\",\r\n\tsignInStepWait: \"Waiting for authorization to complete\",\r\n\tcopyUserCode: \"Copy code\",\r\n\topenAuthUrl: \"Open authorization page\",\r\n\tmodelFilterPlaceholder: \"Filter models\u2026\",\r\n\tmodelFilterLabel: \"Filter models for {provider}\",\r\n\tapplyModelDraft: \"Apply model selection\",\r\n\tmodelDraftPending: \"Selection changed locally. Apply once to save.\",\r\n\tdeselectAll: \"Hide all\",\r\n\tresetModelsDefault: \"Reset selection\",\r\n\trequiresCodexImages: \"Turn on Codex images first.\",\r\n\trequiresCodexSignIn: \"Sign in to OpenAI Codex first.\",\r\n\trequiresImagineCredential: \"Configure the separate Grok Imagine credential first.\",\r\n\topenCodexAccount: \"Open Codex account\",\r\n\tfocusCodexImages: \"Go to Codex images\",\r\n\tfocusImagineCredential: \"View Imagine credential status\",\r\n\tgatewaySnippetsTitle: \"Quick setup snippets\",\r\n\tgatewaySnippetsUnavailable: \"Reveal the real key and sign in to at least one provider before snippets are shown.\",\r\n\tgatewaySnippetCurl: \"cURL\",\r\n\tgatewaySnippetPython: \"Python (OpenAI SDK)\",\r\n\tgatewaySnippetIde: \"IDE / client\",\r\n\ttabAccountsSignedIn: \"{count} signed in\",\r\n\tcoinstallTitle: \"Managed by Usage Center\",\r\n\tcoinstallSummary: \"Usage Center is the active OAuth owner. {count} provider account(s) are currently signed in.\",\r\n\tcoinstallOpenHub: \"Open Usage Center\",\r\n\ttabGatewayActive: \"Running\",\r\n};\r\n\r\nexport type GrokBuildSettingsKey = keyof typeof en;\r\n\r\nexport const zh: { [Key in GrokBuildSettingsKey]: string } = {\r\n\tnav: \"\u7F16\u7801 OAuth\",\r\n\ttitle: \"\u7F16\u7801\u8BA2\u9605\u8D26\u6237\",\r\n\tintro:\r\n\t\t\"\u5728 dsh \u4E2D\u4F7F\u7528\u81EA\u5DF1\u7684 Grok Build\u3001ChatGPT Codex\u3001Kimi Code \u548C Claude Code \u8BA2\u9605\uFF1B\u73B0\u6709 API-key \u8DEF\u7531\u7EE7\u7EED\u72EC\u7ACB\u4FDD\u7559\u3002\",\r\n\ttermsWarning: \"\u8FD9\u4E9B\u662F\u8BA2\u9605\u670D\u52A1\u7684\u975E\u5B98\u65B9\u7B2C\u4E09\u65B9\u96C6\u6210\uFF0C\u4ECD\u53D7\u4F9B\u5E94\u5546\u6761\u6B3E\u3001\u914D\u989D\u3001\u5730\u533A\u9650\u5236\u548C\u8D26\u53F7\u98CE\u63A7\u7EA6\u675F\u3002\",\r\n\tloadingAccount: \"\u6B63\u5728\u52A0\u8F7D\u8D26\u6237\u2026\",\r\n\tsignedOut: \"\u5C1A\u672A\u767B\u5F55\",\r\n\tsigningIn: \"\u6B63\u5728\u7B49\u5F85\u6388\u6743\u2026\",\r\n\tsignedIn: \"\u5DF2\u767B\u5F55\",\r\n\trequestFailed: \"\u8D26\u6237\u8BF7\u6C42\u5931\u8D25\u3002\",\r\n\tretry: \"\u91CD\u8BD5\",\r\n\tcancel: \"\u53D6\u6D88\",\r\n\tlogout: \"\u9000\u51FA\u767B\u5F55\",\r\n\tlogoutConfirmTitle: \"\u786E\u8BA4\u9000\u51FA\u767B\u5F55\",\r\n\tlogoutConfirmHint: \"\u786E\u5B9A\u5728 dsh \u4E2D\u9000\u51FA\u6B64\u4F9B\u5E94\u5546\uFF1F\u4F9B\u5E94\u5546\u8D26\u53F7\u672C\u8EAB\u4E0D\u4F1A\u88AB\u4FEE\u6539\u3002\",\r\n\tlogoutConfirmAction: \"\u786E\u8BA4\u9000\u51FA\",\r\n\tworking: \"\u5904\u7406\u4E2D\u2026\",\r\n\tcancelLogin: \"\u53D6\u6D88\u767B\u5F55\",\r\n\tdeviceLogin: \"\u4F7F\u7528\u8BBE\u5907\u7801\u767B\u5F55\",\r\n\tdeviceLoginRemote: \"\u4F7F\u7528\u8BBE\u5907\u7801\u767B\u5F55\uFF08\u9002\u5408\u8FDC\u7A0B\uFF09\",\r\n\tbrowserLogin: \"\u5728\u6D4F\u89C8\u5668\u4E2D\u767B\u5F55\",\r\n\tpkceLogin: \"\u4F7F\u7528\u6388\u6743\u7801\u767B\u5F55\",\r\n\tuserCode: \"\u4F9B\u5E94\u5546\u8981\u6C42\u8F93\u5165\u4EE3\u7801\u65F6\uFF0C\u8BF7\u8F93\u5165\uFF1A\",\r\n\topenUrl: \"\u8BF7\u5728\u6B64\u5B8C\u6210\u767B\u5F55\uFF1A\",\r\n\tpopupBlocked: \"\u6D4F\u89C8\u5668\u963B\u6B62\u4E86\u767B\u5F55\u7A97\u53E3\uFF0C\u8BF7\u624B\u52A8\u6253\u5F00\uFF1A\",\r\n\tpasteCodeHint: \"\u8BF7\u7C98\u8D34\u4F9B\u5E94\u5546\u8FD4\u56DE\u7684\u6388\u6743 code \u6216\u5B8C\u6574\u8DF3\u8F6C\u94FE\u63A5\u3002\u672C\u5730 PKCE \u4EC5\u5728\u56DE\u8C03\u65E0\u6CD5\u5230\u8FBE\u8FD9\u53F0 DSH \u4E3B\u673A\u65F6\u4F7F\u7528\uFF1A\",\r\n\tpasteBrowserCodeHint: \"\u8BF7\u7C98\u8D34\u4F9B\u5E94\u5546\u8FD4\u56DE\u7684\u6388\u6743 code \u6216\u5B8C\u6574\u8DF3\u8F6C\u94FE\u63A5\uFF0C\u4EE5\u5B8C\u6210\u6B64\u6B21\u6D4F\u89C8\u5668\u767B\u5F55\uFF1A\",\r\n\tpasteCodePlaceholder: \"\u6388\u6743 code \u6216\u5B8C\u6574\u8DF3\u8F6C\u94FE\u63A5\",\r\n\tpasteCodeLabel: \"\u6388\u6743 code \u6216\u5B8C\u6574\u8DF3\u8F6C\u94FE\u63A5\",\r\n\tsubmitCode: \"\u63D0\u4EA4 code\",\r\n\timportGrok: \"\u4ECE Grok CLI \u5BFC\u5165\",\r\n\timportHint: \"\u628A ~/.grok/auth.json \u590D\u5236\u8FDB dsh\uFF1B\u4E4B\u540E dsh \u5237\u65B0 token \u53EF\u80FD\u8BA9 Grok CLI \u6389\u7EBF\u3002\",\r\n\tmodels: \"\u53EF\u89C1\u6A21\u578B\",\r\n\tcatalogLive: \"\u6765\u81EA\u5F53\u524D xAI \u8D26\u53F7\",\r\n\tcatalogCache: \"\u6765\u81EA\u4E0A\u4E00\u6B21\u6210\u529F\u62C9\u53D6\u7684 xAI \u5217\u8868\",\r\n\tcatalogFallback: \"\u5185\u7F6E Grok \u57FA\u7EBF\u76EE\u5F55\uFF08\u7EBF\u4E0A\u5217\u8868\u4E0D\u53EF\u7528\uFF09\",\r\n\tcatalogError: \"\u65E0\u6CD5\u5237\u65B0\u7EBF\u4E0A Grok \u6A21\u578B\u5217\u8868\u3002\",\r\n\tselectAll: \"\u5168\u90E8\u663E\u793A\",\r\n\tmodelHint: \"\u52FE\u9009\u6A21\u578B\u4F1A\u4EE5\u8BE5\u524D\u7F00\u51FA\u73B0\u5728\u6A21\u578B\u9009\u62E9\u5668\uFF1A\",\r\n\tgrokTitle: \"xAI Grok Build\",\r\n\tgrokDescription: \"\u901A\u8FC7 Grok Build \u7AEF\u70B9\u4F7F\u7528 SuperGrok / X Premium \u7F16\u7801\u8BA2\u9605\u3002\",\r\n\tcodexTitle: \"OpenAI Codex\",\r\n\tcodexDescription: \"\u4F7F\u7528 ChatGPT Plus/Pro \u7684 Codex \u6743\u76CA\uFF1B\u8FDC\u7A0B DSH \u4E3B\u673A\u63A8\u8350\u8BBE\u5907\u7801\u767B\u5F55\u3002\",\r\n\tkimiTitle: \"Kimi Code\",\r\n\tkimiDescription: \"\u901A\u8FC7 auth.kimi.com \u4E0E api.kimi.com/coding \u4F7F\u7528 Kimi Code \u4F1A\u5458\uFF1B\u4E0D\u662F Moonshot API-key \u5F00\u653E\u5E73\u53F0\u3002\",\r\n\tclaudeTitle: \"Claude Code\",\r\n\tclaudeDescription: \"Claude Pro/Max OAuth\uFF0C\u5305\u542B Claude Code scope \u548C\u81EA\u52A8\u5237\u65B0\u3002\",\r\n\tantigravityTitle: \"Google Antigravity\",\r\n\tantigravityDescription: \"\u7531\u5355\u72EC\u56FA\u5B9A\u7248\u672C\u7684 MIT \u5F00\u6E90 dsh-agy \u63D2\u4EF6\u63D0\u4F9B\uFF0C\u5BF9\u5916\u8DEF\u7531\u4E3A agy\u3002\",\r\n\tantigravityInstalled: \"\u5DF2\u5B89\u88C5\uFF08CLI \u7BA1\u7406\uFF09\",\r\n\tantigravityMissing: \"\u5C1A\u672A\u5B89\u88C5\",\r\n\tantigravityCliHint:\r\n\t\t\"\u4E3A\u907F\u514D\u66B4\u9732\u65E0\u8BA4\u8BC1\u7684\u51ED\u636E\u5BFC\u51FA\u9875\u9762\uFF0C\u9ED8\u8BA4\u7981\u7528 dsh-agy Web \u7BA1\u7406\u9875\uFF1B\u9700\u8981\u65F6\u4F7F\u7528 profile \u5185 CLI \u7BA1\u7406 Google OAuth\u3002\",\r\n\tantigravityCliCommand: \"dsh plugin --profile web exec dsh-agy login --headless\",\r\n\tsourcesTitle: \"\u4ECE\u5B98\u65B9 CLI \u6587\u4EF6\u62C9\u53D6\u526F\u672C\",\r\n\tsourcesIntro:\r\n\t\t\"dsh \u53EF\u4EE5\u81EA\u52A8\u53D1\u73B0\u672C\u673A\u5B98\u65B9 CLI \u767B\u5F55\uFF0C\u5E76\u5355\u5411\u62C9\u53D6\u4E00\u4EFD\u526F\u672C\u5230\u81EA\u5DF1\u7684\u5B58\u50A8\u3002\u5B98\u65B9 CLI \u6587\u4EF6\u4FDD\u6301\u53EA\u8BFB\uFF0C\u7EDD\u4E0D\u4F1A\u88AB\u4FEE\u6539\u3002\",\r\n\tsourcesReadOnlyHint: \"\u8FD9\u662F\u5355\u5411\u62C9\u53D6\u526F\u672C\u3002dsh \u4E0D\u4F1A\u66F4\u65B0\u3001\u8986\u76D6\u6216\u56DE\u5199\u5B98\u65B9 CLI \u6587\u6863\u3002\",\r\n\tsourcesLoading: \"\u6B63\u5728\u67E5\u627E\u5B98\u65B9 CLI \u767B\u5F55\u6587\u4EF6\u2026\",\r\n\tsourcesCheckAgain: \"\u518D\u68C0\u67E5\u4E00\u6B21\",\r\n\tsourcesAvailable: \"\u53EF\u4EE5\u8BFB\u53D6\u4E00\u4EFD\u526F\u672C\",\r\n\tsourcesUnavailable: \"\u6CA1\u6709\u53EF\u7528\u7684\u526F\u672C\",\r\n\tsourcesAllMissingHint:\r\n\t\t\"\u8FD9\u53F0\u4E3B\u673A\u4E0A\u6CA1\u6709\u627E\u5230\u5B98\u65B9 CLI \u767B\u5F55\u6587\u4EF6\u3002\u8FDC\u7A0B DSH \u4E0A\u8FD9\u5F88\u5E38\u89C1\u2014\u2014\u8BF7\u6539\u7528\u8BBE\u5907\u7801\u767B\u5F55\uFF1B\u82E5\u5DF2\u5728\u672C\u673A CLI \u767B\u5F55\uFF0C\u53EF\u518D\u68C0\u67E5\u4E00\u6B21\u3002\",\r\n\tsourcesAvailableHint: \"\u672C\u673A\u53D1\u73B0\u4E86\u5B98\u65B9 CLI \u767B\u5F55\u3002\u53EF\u5728\u5BF9\u5E94\u8D26\u6237\u5361\u7247\u91CC\u5355\u5411\u62C9\u53D6\u4E00\u4EFD\u526F\u672C\u5230 dsh\u3002\",\r\n\tsourcesPullCopy: \"\u62C9\u53D6\u526F\u672C\",\r\n\tremoteAccountsTip:\r\n\t\t\"\u5F53\u524D Settings \u9875\u9762\u770B\u8D77\u6765\u662F\u8FDC\u7A0B\u8BBF\u95EE\uFF08\u975E\u672C\u673A\u56DE\u73AF\uFF09\u3002\u8BF7\u4F18\u5148\u4F7F\u7528\u8BBE\u5907\u7801\u767B\u5F55\uFF1B\u4ECE\u53E6\u4E00\u53F0\u673A\u5668\u6253\u5F00\u65F6\uFF0C\u6D4F\u89C8\u5668\u5F39\u7A97\u548C\u672C\u5730 PKCE \u56DE\u8C03\u7ECF\u5E38\u4F1A\u5931\u8D25\u3002\",\r\n\tremoteTipDismiss: \"\u77E5\u9053\u4E86\",\r\n\tsourcesPreviewTitle: \"\u5148\u6838\u5BF9\u8FD9\u4EFD\u526F\u672C\uFF0C\u518D\u5199\u5165 dsh\",\r\n\tsourcesPreviewExpires: \"CLI \u51ED\u636E\u5230\u671F\u65F6\u95F4\uFF1A{time}\",\r\n\tsourcesTicketExpires: \"\u6B64\u6B21\u9884\u89C8\u5C06\u4E8E {time} \u5931\u6548\",\r\n\tsourcesConflict: \"dsh \u4E2D\u5DF2\u5B58\u51ED\u636E\uFF1A{detail}\",\r\n\tsourcesAction: \"\u82E5\u7EE7\u7EED\uFF1A{detail}\",\r\n\tsourcesWarnings: \"\u8BF4\u660E\",\r\n\tsourcesConfirmOverwrite: \"\u7528\u8FD9\u4EFD\u526F\u672C\u66FF\u6362 dsh \u4E2D\u5DF2\u4FDD\u5B58\u7684\u51ED\u636E\",\r\n\tsourcesConfirmOverwriteHint: \"dsh \u91CC\u5DF2\u6709\u53E6\u4E00\u4EFD\u51ED\u636E\u3002\u8BF7\u5148\u52FE\u9009\uFF0C\u518D\u786E\u8BA4\u62C9\u53D6\u3002\",\r\n\tsourcesCommit: \"\u786E\u8BA4\u62C9\u53D6\",\r\n\tsourcesCancelPreview: \"\u53D6\u6D88\u9884\u89C8\",\r\n\tsourcesCommitSuccess: \"\u5DF2\u590D\u5236\u5230 dsh\uFF08{action}\uFF09\u3002\",\r\n\tsourcesPreviewFailed: \"\u65E0\u6CD5\u4ECE\u8BE5 CLI \u6587\u4EF6\u51C6\u5907\u526F\u672C\u3002\",\r\n\tsourcesCommitFailed: \"\u65E0\u6CD5\u628A\u526F\u672C\u4FDD\u5B58\u5230 dsh\u3002\",\r\n\tsourcesLoadFailed: \"\u65E0\u6CD5\u67E5\u627E\u5B98\u65B9 CLI \u767B\u5F55\u6587\u4EF6\u3002\",\r\n\tsourceKindGrok: \"Grok CLI\",\r\n\tsourceKindCodex: \"Codex CLI\",\r\n\tsourceKindKimi: \"Kimi Code CLI\",\r\n\tsourceKindClaude: \"Claude Code CLI\",\r\n\tsourceReasonMissing: \"\u5728\u9884\u671F\u4F4D\u7F6E\u6CA1\u6709\u627E\u5230\u5B98\u65B9 CLI \u6587\u4EF6\u3002\",\r\n\tsourceReasonUnsafe: \"\u5B98\u65B9 CLI \u6587\u4EF6\u4E0D\u5B89\u5168\uFF0C\u65E0\u6CD5\u8BFB\u53D6\uFF08\u6743\u9650\u6216\u6587\u4EF6\u7C7B\u578B\uFF09\u3002\",\r\n\tsourceReasonInvalid: \"\u5B98\u65B9 CLI \u6587\u4EF6\u5B58\u5728\uFF0C\u4F46\u4E0D\u662F\u53EF\u7528\u7684 OAuth \u767B\u5F55\u3002\",\r\n\tsourceReasonTooLarge: \"\u5B98\u65B9 CLI \u6587\u4EF6\u8D85\u8FC7\u5141\u8BB8\u7684\u8BFB\u53D6\u4E0A\u9650\u3002\",\r\n\tsourceConflictNone: \"dsh \u5C1A\u672A\u4FDD\u5B58\u51ED\u636E\",\r\n\tsourceConflictSameCredential: \"\u5DF2\u4FDD\u5B58\u540C\u4E00\u4EFD\u51ED\u636E\",\r\n\tsourceConflictSameAccount: \"\u540C\u4E00\u8D26\u53F7\uFF0C\u4F46\u51ED\u636E\u4E0D\u540C\",\r\n\tsourceConflictDifferentAccount: \"\u5DF2\u4FDD\u5B58\u53E6\u4E00\u4E2A\u8D26\u53F7\",\r\n\tsourceConflictUnknownAccount: \"\u5DF2\u4FDD\u5B58\u51ED\u636E\uFF08\u65E0\u6CD5\u6BD4\u8F83\u8D26\u53F7\uFF09\",\r\n\tsourceConflictUnreadableDestination: \"\u65E0\u6CD5\u8BFB\u53D6 dsh \u4E2D\u5DF2\u5B58\u51ED\u636E\",\r\n\tsourceConflictUnsafeDestination: \"dsh \u4E2D\u7684\u51ED\u636E\u6587\u4EF6\u4E0D\u5B89\u5168\uFF0C\u4E0D\u80FD\u4ECE\u8FD9\u91CC\u66FF\u6362\",\r\n\tsourceConflictUnrecognized: \"\u5DF2\u5B58\u51ED\u636E\u9700\u8981\u6838\u5BF9\",\r\n\tsourceActionImport: \"\u628A\u8FD9\u4EFD\u526F\u672C\u4FDD\u5B58\u5230 dsh\",\r\n\tsourceActionReuse: \"\u4FDD\u7559 dsh \u4E2D\u5DF2\u5B58\u51ED\u636E\uFF08\u5185\u5BB9\u5DF2\u76F8\u540C\uFF09\",\r\n\tsourceActionOverwrite: \"\u66FF\u6362 dsh \u4E2D\u5DF2\u5B58\u51ED\u636E\",\r\n\tsourceActionBlocked: \"\u5DF2\u963B\u6B62 \u2014 \u4E0D\u80FD\u4ECE\u8FD9\u91CC\u66FF\u6362 dsh \u4E2D\u7684\u6587\u4EF6\",\r\n\tsourceActionUnrecognized: \"\u9700\u8981\u6838\u5BF9\",\r\n\tsourceCommitImported: \"\u5DF2\u4FDD\u5B58\",\r\n\tsourceCommitUnchanged: \"\u539F\u672C\u5C31\u76F8\u540C\",\r\n\tsourceCommitOverwritten: \"\u5DF2\u66FF\u6362\",\r\n\tcapabilitiesTitle: \"\u8BA2\u9605\u80FD\u529B\",\r\n\tcapabilitiesIntro: \"\u6240\u6709\u5F00\u5173\u9ED8\u8BA4\u5173\u95ED\u3002\u6253\u5F00\u540E\u6D88\u8017\u7684\u662F\u5BF9\u5E94\u4F9B\u5E94\u5546\u7684\u8BA2\u9605\u914D\u989D\uFF0C\u4E0D\u662F\u53E6\u4E00\u5957 API-key \u8D26\u5355\u3002\",\r\n\tcapabilitiesQuotaHint: \"\u641C\u7D22\u3001\u51FA\u56FE\u3001\u6539\u56FE\u3001Fast\u3001\u989D\u5EA6\u5C55\u793A\u548C Grok Imagine \u5728\u5B9E\u9645\u8C03\u7528\u65F6\u90FD\u4F1A\u6D88\u8017\u5BF9\u5E94\u8BA2\u9605\u914D\u989D\u3002\",\r\n\tcapabilitiesReadOnly: \"\u5F53\u524D\u90E8\u7F72\u4E2D\u8FD9\u4E9B\u5F00\u5173\u4E3A\u53EA\u8BFB\u3002\",\r\n\tcapabilitiesLoading: \"\u6B63\u5728\u52A0\u8F7D\u80FD\u529B\u8BBE\u7F6E\u2026\",\r\n\tcapabilitiesLoadFailed: \"\u65E0\u6CD5\u52A0\u8F7D\u80FD\u529B\u8BBE\u7F6E\u3002\",\r\n\tcapabilitiesSaveFailed: \"\u65E0\u6CD5\u4FDD\u5B58\u8BE5\u80FD\u529B\u8BBE\u7F6E\u3002\",\r\n\tcapabilitiesConflictRefreshed: \"\u8FD9\u4E9B\u8BBE\u7F6E\u5DF2\u5728\u522B\u5904\u88AB\u6539\u8FC7\u3002\u9875\u9762\u5DF2\u5237\u65B0\uFF0C\u8BF7\u518D\u8BD5\u4E00\u6B21\u3002\",\r\n\tcapabilityLimitsTitle: \"\u80FD\u529B\u9650\u5236\",\r\n\tcapabilityLimitsHint: \"\u9650\u5236\u4F1A\u5B9E\u65F6\u5E94\u7528\u4E8E\u65B0\u53D1\u8D77\u7684\u64CD\u4F5C\uFF0C\u5E76\u59CB\u7EC8\u4FDD\u6301\u5728\u5DF2\u5BA1\u8BA1\u7684\u5B89\u5168\u8303\u56F4\u5185\u3002\",\r\n\tcapSearchResults: \"\u6700\u591A\u641C\u7D22\u7ED3\u679C\u6570\",\r\n\tcapSearchResultsHint: \"Codex \u641C\u7D22\u6700\u591A\u8FD4\u56DE\u8FD9\u4E48\u591A\u6761\u7ED3\u679C\uFF081\u201320\uFF09\u3002\",\r\n\tcapImageCount: \"\u5355\u6B21\u6700\u591A\u56FE\u7247\u6570\",\r\n\tcapImageCountHint: \"Codex \u4E0E Imagine \u56FE\u7247\u5DE5\u5177\u5355\u6B21\u6700\u591A\u8FD4\u56DE\u8FD9\u4E48\u591A\u5F20\u56FE\u7247\uFF081\u20134\uFF09\u3002\",\r\n\tcapVideoTtlHours: \"\u89C6\u9891\u4EA7\u7269\u4FDD\u7559\u65F6\u95F4\uFF08\u5C0F\u65F6\uFF09\",\r\n\tcapVideoTtlHoursHint: \"Imagine \u89C6\u9891\u4EA7\u7269\u4FDD\u7559 1\u2013168 \u5C0F\u65F6\uFF1B\u964D\u4F4E\u4FDD\u7559\u65F6\u95F4\u4F1A\u7ACB\u5373\u6E05\u7406\u8FC7\u671F\u65E7\u4EA7\u7269\uFF0C\u63D0\u9AD8\u53EA\u5F71\u54CD\u65B0\u4EA7\u7269\u3002\",\r\n\tcapabilityLimitInvalid: \"\u8BF7\u8F93\u5165 {min} \u5230 {max} \u4E4B\u95F4\u7684\u6574\u6570\u3002\",\r\n\tcapCodexSearch: \"Codex \u8BA2\u9605\u641C\u7D22\",\r\n\tcapCodexSearchHint: \"\u53EF\u9009\u641C\u7D22\uFF0C\u6D88\u8017 Codex \u914D\u989D\u3002\",\r\n\tcapCodexImages: \"Codex \u51FA\u56FE\",\r\n\tcapCodexImagesHint: \"\u7528 ChatGPT/Codex \u914D\u989D\u51FA\u56FE\u3002\",\r\n\tcapCodexImageEdits: \"Codex \u6539\u56FE\",\r\n\tcapCodexImageEditsHint: \"\u6539\u56FE\uFF1B\u9700\u5148\u6253\u5F00 Codex \u51FA\u56FE\u3002\",\r\n\tcapCodexUsage: \"\u663E\u793A Codex \u989D\u5EA6\",\r\n\tcapCodexUsageHint: \"\u6709\u6570\u636E\u65F6\u5728 Codex \u8D26\u6237\u5361\u7247\u4E0A\u663E\u793A\u5269\u4F59\u989D\u5EA6\u3002\",\r\n\tcapCodexFast: \"\u5DF2\u8BF7\u6C42 Fast\",\r\n\tcapCodexFastHint: \"\u5728\u7EBF\u76EE\u5F55\u786E\u8BA4\u4F18\u5148\u8D44\u683C\u540E\u53D1\u5E03 Fast \u8DEF\u7531\u3002\",\r\n\tcapGrokImagineImage: \"Grok Imagine \u51FA\u56FE\",\r\n\tcapGrokImagineImageHint: \"\u9700\u8981\u5355\u72EC\u7684 Imagine \u51ED\u636E\uFF0C\u4EC5\u6709 Grok OAuth \u4E0D\u591F\u3002\",\r\n\tcapGrokImagineVideo: \"Grok Imagine \u51FA\u89C6\u9891\",\r\n\tcapGrokImagineVideoHint: \"\u9700\u8981\u5355\u72EC\u7684 Imagine \u51ED\u636E\uFF0C\u4EC5\u6709 Grok OAuth \u4E0D\u591F\u3002\",\r\n\tusageTitle: \"Codex \u989D\u5EA6\",\r\n\tusageLoading: \"\u6B63\u5728\u52A0\u8F7D Codex \u989D\u5EA6\u2026\",\r\n\tusageUnavailable: \"\u5F53\u524D\u65E0\u6CD5\u8BFB\u53D6 Codex \u989D\u5EA6\u3002\",\r\n\tusageEmpty: \"\u4F9B\u5E94\u5546\u6CA1\u6709\u8FD4\u56DE\u53EF\u5C55\u793A\u7684\u989D\u5EA6\u5B57\u6BB5\u3002\",\r\n\tusageFetchedAt: \"\u6700\u8FD1\u8BFB\u53D6\uFF1A{time}\",\r\n\tusageRateLimit: \"\u901F\u7387\u9650\u5236\",\r\n\tusageWindow: \"{seconds} \u79D2\u7A97\u53E3\",\r\n\tusageUsed: \"\u5DF2\u7528 {value}\",\r\n\tusageRemaining: \"\u5269\u4F59 {value}\",\r\n\tusageResets: \"\u91CD\u7F6E\u65F6\u95F4 {time}\",\r\n\tusageCredits: \"\u79EF\u5206\",\r\n\tusageCreditsUnlimited: \"\u65E0\u9650\u79EF\u5206\",\r\n\tusageCreditsLimited: \"\u6709\u9650\u79EF\u5206\",\r\n\tusageBalance: \"\u4F59\u989D {value}\",\r\n\tusageIndividualLimit: \"\u4E2A\u4EBA\u989D\u5EA6\",\r\n\tusageLimit: \"\u4E0A\u9650 {value}\",\r\n\tusageUsedAmount: \"\u5DF2\u7528 {value}\",\r\n\tusageRemainingAmount: \"\u5269\u4F59 {value}\",\r\n\tusageSpendControlReached: \"\u5DF2\u8FBE\u5230\u652F\u51FA\u63A7\u5236\u4E0A\u9650\u3002\",\r\n\tusageResetCredits: \"\u53EF\u7528\u91CD\u7F6E\u6B21\u6570\uFF1A{value}\",\r\n\timagineTitle: \"Grok Imagine \u51ED\u636E\",\r\n\timagineIntro:\r\n\t\t\"\u5B98\u65B9 Imagine \u8C03\u7528\u4F7F\u7528 xAI API \u51ED\u636E\uFF08\u4F8B\u5982 $XAI_API_KEY\uFF09\u3002\u5B83\u4E0E Grok Build OAuth \u767B\u5F55\u4E0D\u662F\u540C\u4E00\u4EFD\u51ED\u636E\uFF0C\u8FD9\u91CC\u4E5F\u4E0D\u4F1A\u663E\u793A\u5BC6\u94A5\u3002\",\r\n\timagineLoading: \"\u6B63\u5728\u68C0\u67E5 Imagine \u51ED\u636E\u2026\",\r\n\timagineLoadFailed: \"\u65E0\u6CD5\u8BFB\u53D6 Imagine \u51ED\u636E\u72B6\u6001\u3002\",\r\n\timagineConfigured: \"\u5DF2\u914D\u7F6E Imagine \u51ED\u636E\",\r\n\timagineNotConfigured: \"\u5C1A\u672A\u914D\u7F6E Imagine \u51ED\u636E\",\r\n\timagineSource: \"\u6765\u6E90\uFF1A{source}\",\r\n\timagineWritable: \"\u5F53\u524D\u90E8\u7F72\u53EF\u4EE5\u66F4\u65B0 Imagine \u51ED\u636E\u5B58\u50A8\u3002\",\r\n\timagineReadOnly: \"\u5F53\u524D\u90E8\u7F72\u4E0D\u80FD\u66F4\u65B0 Imagine \u51ED\u636E\u5B58\u50A8\u3002\",\r\n\timagineSourceNone: \"\u65E0\",\r\n\timagineSourceEnv: \"\u73AF\u5883\u53D8\u91CF\",\r\n\timagineSourceApiKey: \"\u5DF2\u4FDD\u5B58\u7684 API key\",\r\n\timagineSourceOAuth: \"OAuth access\uFF08\u4EC5\u5F53 Imagine \u63A5\u53D7\u65F6\uFF09\",\r\n\timagineSourceCliKey: \"Grok CLI \u7684 key \u5B57\u6BB5\",\r\n\timagineSourceUnknown: \"\u5DF2\u914D\u7F6E\uFF08\u7EC6\u8282\u4E0D\u5C55\u793A\uFF09\",\r\n\ttabAccounts: \"\u8D26\u6237\",\r\n\ttabCapabilities: \"\u80FD\u529B\",\r\n\ttabGateway: \"\u7F51\u5173\",\r\n\ttabAbout: \"\u5173\u4E8E\",\r\n\tcopy: \"\u590D\u5236\",\r\n\tcopied: \"\u5DF2\u590D\u5236\",\r\n\tcopyFailed: \"\u590D\u5236\u5931\u8D25\",\r\n\tmodelsSummary: \"\u5DF2\u663E\u793A {selected}/{total} \u4E2A\u6A21\u578B\",\r\n\texpandModels: \"\u6A21\u578B\",\r\n\tcollapseModels: \"\u6536\u8D77\u6A21\u578B\",\r\n\tusageUsedShort: \"\u5DF2\u7528 {value}\",\r\n\tgatewayTitle: \"\u672C\u5730 API \u7F51\u5173\",\r\n\tgatewayIntro: \"\u672C\u673A loopback \u4E0A\u7684 OpenAI/Anthropic \u517C\u5BB9\u670D\u52A1\uFF0C\u4F9B\u4F60\u81EA\u5DF1\u7684\u5DE5\u5177\u4F7F\u7528\u3002\u9ED8\u8BA4\u5173\u95ED\u3002\",\r\n\tgatewayWarning: \"\u6253\u5F00\u540E\u4F1A\u628A\u5DF2\u767B\u5F55\u8BA2\u9605\u66B4\u9732\u6210\u672C\u5730 API\u3002\u53EF\u80FD\u8FDD\u53CD\u4F9B\u5E94\u5546\u6761\u6B3E\u5E76\u6D88\u8017\u914D\u989D\u3002\",\r\n\tgatewayLoopbackHint: \"\u4EC5\u7ED1\u5B9A\u672C\u673A\u56DE\u73AF\u5730\u5740\u3002\u8BF7\u52FF\u505A\u7AEF\u53E3\u8F6C\u53D1\uFF0C\u4E5F\u4E0D\u8981\u628A\u5B83\u66B4\u9732\u5230\u516C\u7F51\u3002\",\r\n\tgatewayEnableConfirm: \"\u8981\u542F\u7528\u672C\u5730 API \u7F51\u5173\u5417\uFF1F\u5B83\u4F1A\u628A\u5DF2\u767B\u5F55\u7684\u8BA2\u9605\u66B4\u9732\u7ED9\u672C\u673A\u5DE5\u5177\uFF0C\u5E76\u6D88\u8017\u4F9B\u5E94\u5546\u914D\u989D\u3002\",\r\n\tgatewayEnableConfirmAction: \"\u786E\u8BA4\u542F\u7528\",\r\n\tgatewayEnableCancel: \"\u53D6\u6D88\",\r\n\tgatewayEnabled: \"\u542F\u7528\u672C\u5730\u7F51\u5173\",\r\n\tgatewayBind: \"\u7ED1\u5B9A\u5730\u5740\",\r\n\tgatewayPort: \"\u7AEF\u53E3\",\r\n\tgatewayPortHint: \"1024\u201365535 \u7684\u6574\u6570\u3002\u6539\u5B8C\u70B9\u786E\u5B9A\u4FDD\u5B58\uFF1B\u968F\u673A\u4F1A\u586B\u4E00\u4E2A\u9AD8\u4F4D\u7AEF\u53E3\uFF0C\u4ECD\u9700\u786E\u5B9A\u3002\",\r\n\tgatewayPortApply: \"\u786E\u5B9A\",\r\n\tgatewayPortRandom: \"\u968F\u673A\",\r\n\tgatewayPortInvalid: \"\u8BF7\u8F93\u5165 1024 \u5230 65535 \u4E4B\u95F4\u7684\u6574\u6570\u7AEF\u53E3\u3002\",\r\n\tgatewayAddress: \"\u7F51\u5173\u5730\u5740\",\r\n\tgatewayOpenAiUrl: \"OpenAI \u517C\u5BB9\u5730\u5740\",\r\n\tgatewayAnthropicUrl: \"Anthropic \u517C\u5BB9\u5730\u5740\",\r\n\tgatewayKeyHint: \"Bearer key\",\r\n\tgatewayKeyCopyHint: \"\u590D\u5236\u7684\u662F\u5F53\u524D key\u3002\u53EA\u6709\u8981\u4F5C\u5E9F\u5DF2\u6709\u5BA2\u6237\u7AEF\u65F6\u624D\u8F6E\u6362\u3002\",\r\n\tgatewayCopyKey: \"\u590D\u5236 key\",\r\n\tgatewayShowKey: \"\u663E\u793A\",\r\n\tgatewayHideKey: \"\u9690\u85CF\",\r\n\tgatewayRevealFailed: \"\u65E0\u6CD5\u8BFB\u53D6\u5F53\u524D key\u3002\",\r\n\tgatewayRotateConfirm: \"\u786E\u5B9A\u8F6E\u6362 key\uFF1F\u73B0\u6709\u5BA2\u6237\u7AEF\u5C06\u5931\u6548\u3002\",\r\n\tgatewayRotateConfirmHint: \"\u8FD9\u4F1A\u66FF\u6362\u5F53\u524D Bearer key\u3002\",\r\n\tgatewayRotateConfirmAction: \"\u786E\u8BA4\u8F6E\u6362\",\r\n\tgatewayRotateCancel: \"\u53D6\u6D88\",\r\n\tgatewayRunning: \"\u6B63\u5728\u76D1\u542C\",\r\n\tgatewayStopped: \"\u672A\u76D1\u542C\",\r\n\tgatewayRotate: \"\u8F6E\u6362 API key\",\r\n\tgatewayRotated: \"\u65B0 key\uFF08\u53EA\u663E\u793A\u4E00\u6B21\uFF09\uFF1A{key}\",\r\n\tgatewayLoadFailed: \"\u65E0\u6CD5\u52A0\u8F7D\u7F51\u5173\u8BBE\u7F6E\u3002\",\r\n\tgatewaySaveFailed: \"\u65E0\u6CD5\u66F4\u65B0\u7F51\u5173\u3002\",\r\n\tgatewayLoading: \"\u6B63\u5728\u52A0\u8F7D\u7F51\u5173\u8BBE\u7F6E\u2026\",\r\n\tgatewayModelsReady: \"\u5F53\u524D\u6709 {count} \u4E2A\u53EF\u6267\u884C\u6A21\u578B\uFF0C\u914D\u7F6E\u7247\u6BB5\u4F7F\u7528 {model}\u3002\",\r\n\tgatewayModelsUnavailable: \"\u5F53\u524D\u6CA1\u6709\u5DF2\u767B\u5F55\u4F9B\u5E94\u5546\u63D0\u4F9B\u53EF\u6267\u884C\u7684\u7F51\u5173\u6A21\u578B\u3002\",\r\n\tgatewayKeyConfigured: \"\u5DF2\u914D\u7F6E\u771F\u5B9E Bearer key\uFF1B\u590D\u5236\u53EF\u6267\u884C\u7247\u6BB5\u524D\u8BF7\u5148\u8BFB\u53D6 key\u3002\",\r\n\tgatewayKeyNotConfigured: \"\u5C1A\u672A\u914D\u7F6E Bearer key\u3002\",\r\n\tremoteLoginHelp:\r\n\t\t\"\u5728\u8FDC\u7A0B DSH \u4E3B\u673A\u4E0A\uFF0C\u6253\u5F00\u6B64\u5904 Settings\uFF0C\u5BF9\u6BCF\u4E2A\u4F9B\u5E94\u5546\u4F7F\u7528\u8BBE\u5907\u7801\u767B\u5F55\u3002\u5728\u80FD\u8BBF\u95EE\u4F9B\u5E94\u5546\u7684\u4EFB\u610F\u6D4F\u89C8\u5668\u5B8C\u6210\u9A8C\u8BC1\u7801\uFF0C\u518D\u56DE\u5230\u804A\u5929\u9009\u62E9\u5BF9\u5E94\u8DEF\u7531\u6A21\u578B\u3002\",\r\n\tpluginVersion: \"\u63D2\u4EF6\u7248\u672C {version}\",\r\n\taboutTitle: \"\u5173\u4E8E\",\r\n\taboutDocsHint: \"\u4ED3\u5E93\u4E2D\u7684 README \u4E0E INSTALL \u6587\u6863\u4ECB\u7ECD\u4E86\u5B89\u88C5\u6B65\u9AA4\u3001\u652F\u6301\u7684\u4F9B\u5E94\u5546\u4EE5\u53CA\u7F51\u5173\u5B89\u5168\u6CE8\u610F\u4E8B\u9879\u3002\",\r\n\taboutDocsLink: \"\u5728 GitHub \u6253\u5F00 README\",\r\n\totherLoginMethods: \"\u5176\u4ED6\u767B\u5F55\u65B9\u5F0F\",\r\n\thideOtherLoginMethods: \"\u6536\u8D77\u5176\u4ED6\u65B9\u5F0F\",\r\n\tsignInStepOpen: \"\u6253\u5F00\u4F9B\u5E94\u5546\u6388\u6743\u9875\u9762\",\r\n\tsignInStepCode: \"\u5728\u63D0\u793A\u5904\u8F93\u5165\u8BBE\u5907\u7801\",\r\n\tsignInStepWait: \"\u7B49\u5F85\u6388\u6743\u5B8C\u6210\",\r\n\tcopyUserCode: \"\u590D\u5236\u8BBE\u5907\u7801\",\r\n\topenAuthUrl: \"\u6253\u5F00\u6388\u6743\u9875\u9762\",\r\n\tmodelFilterPlaceholder: \"\u7B5B\u9009\u6A21\u578B\u2026\",\r\n\tmodelFilterLabel: \"\u7B5B\u9009 {provider} \u7684\u6A21\u578B\",\r\n\tapplyModelDraft: \"\u5E94\u7528\u6A21\u578B\u9009\u62E9\",\r\n\tmodelDraftPending: \"\u9009\u62E9\u4EC5\u5728\u672C\u9875\u5F62\u6210\u8349\u7A3F\uFF0C\u70B9\u51FB\u5E94\u7528\u540E\u4E00\u6B21\u4FDD\u5B58\u3002\",\r\n\tdeselectAll: \"\u5168\u90E8\u9690\u85CF\",\r\n\tresetModelsDefault: \"\u91CD\u7F6E\u9009\u62E9\",\r\n\trequiresCodexImages: \"\u9700\u5148\u5F00\u542F Codex \u51FA\u56FE\u3002\",\r\n\trequiresCodexSignIn: \"\u8BF7\u5148\u767B\u5F55 OpenAI Codex\u3002\",\r\n\trequiresImagineCredential: \"\u8BF7\u5148\u914D\u7F6E\u72EC\u7ACB\u7684 Grok Imagine \u51ED\u636E\u3002\",\r\n\topenCodexAccount: \"\u524D\u5F80 Codex \u8D26\u6237\",\r\n\tfocusCodexImages: \"\u524D\u5F80 Codex \u51FA\u56FE\u5F00\u5173\",\r\n\tfocusImagineCredential: \"\u67E5\u770B Imagine \u51ED\u636E\u72B6\u6001\",\r\n\tgatewaySnippetsTitle: \"\u5FEB\u901F\u914D\u7F6E\u7247\u6BB5\",\r\n\tgatewaySnippetsUnavailable: \"\u8BF7\u5148\u8BFB\u53D6\u771F\u5B9E key\uFF0C\u5E76\u81F3\u5C11\u767B\u5F55\u4E00\u4E2A\u4F9B\u5E94\u5546\uFF1B\u6EE1\u8DB3\u540E\u624D\u4F1A\u663E\u793A\u53EF\u6267\u884C\u914D\u7F6E\u7247\u6BB5\u3002\",\r\n\tgatewaySnippetCurl: \"cURL\",\r\n\tgatewaySnippetPython: \"Python (OpenAI SDK)\",\r\n\tgatewaySnippetIde: \"IDE / \u5BA2\u6237\u7AEF\",\r\n\ttabAccountsSignedIn: \"\u5DF2\u767B\u5F55 {count} \u4E2A\",\r\n\tcoinstallTitle: \"\u5DF2\u7531\u7528\u91CF\u4E2D\u5FC3\u7EDF\u4E00\u7BA1\u7406\",\r\n\tcoinstallSummary: \"\u7528\u91CF\u4E2D\u5FC3\u5F53\u524D\u8D1F\u8D23 OAuth \u8FD0\u884C\u65F6\uFF1B\u5DF2\u6709 {count} \u4E2A\u4F9B\u5E94\u5546\u8D26\u53F7\u767B\u5F55\u3002\",\r\n\tcoinstallOpenHub: \"\u524D\u5F80\u7528\u91CF\u4E2D\u5FC3\",\r\n\ttabGatewayActive: \"\u8FD0\u884C\u4E2D\",\r\n};\r\n"],
|
|
5
|
-
"mappings": ";0aAAA,IAAAA,GAAA,GAAAC,GAAAD,GAAA,WAAAE,GAAA,WAAAC,GAAA,SAAAC,KAAA,eAAAC,GAAAL,IAMA,IAAAM,GAA4C,iBAC5CC,GAA2B,4BCS3B,SAASC,GAAQC,EAAwC,CACxD,GAAI,OAAOA,GAAY,UAAYA,IAAY,KAAM,OACrD,IAAIC,EACJ,GAAI,CACH,IAAMC,EAAOF,EAAuC,IAChD,OAAOE,GAAQ,aAAYD,EAAQC,EAAI,KAAKF,EAAS,OAAO,EACjE,MAAQ,CAER,CACA,GAAIC,IAAU,OACb,GAAI,CACHA,EAASD,EAAyC,KACnD,MAAQ,CAER,CAED,GACC,OAAOC,GAAU,UACjBA,IAAU,MACV,OAAQA,EAAwC,QAAW,YAC3D,OAAQA,EAA0C,UAAa,WAE/D,OAAOA,CAET,CAgBO,SAASE,GAAuBH,EAA0C,CAChF,IAAMI,EAAYJ,EACZK,EAASD,EAAU,OACnBH,EAAQF,GAAQC,CAAO,EAOvBM,EAN8E,CACnF,CAAC,gBAAiBF,EAAU,OAAW,OAAO,EAC9C,CAAC,yBAA0BC,GAAS,SAAa,OAAO,EACxD,CAAC,qBAAsBA,GAAS,KAAS,OAAO,EAChD,CAAC,sBAAuBJ,GAAO,OAAQ,SAAS,CACjD,EAC2B,QAAQ,CAAC,CAACM,EAAIC,EAAOC,CAAK,IACpD,OAAOD,GAAU,WACd,CAAC,EACD,CACA,CACC,GAAAD,EACA,MAAAE,EACA,QACCA,IAAU,UACP,GAAGF,CAAE,iEACL,GAAGA,CAAE,4CACT,SAAU,WACV,OAAQ,OAAOC,CAChB,CACD,CACH,EACME,EAAoB,OAAO,OAAO,CAAC,GAAGJ,CAAW,CAAC,EACxD,OAAO,OAAO,OAAO,CACpB,QAAAN,EACA,OAAQA,EAAQ,OAChB,OAAQA,EAAQ,OAChB,YAAa,IAAMU,EACnB,kBAAmB,CAClB,IAAMC,EAASL,EAAY,OAAQM,GAASA,EAAK,QAAU,OAAO,EAClE,GAAID,EAAO,OAAS,EACnB,MAAM,IAAI,MAAM,gCAAgCA,EAAO,IAAKC,GAASA,EAAK,EAAE,EAAE,KAAK,IAAI,CAAC,EAAE,CAE5F,EACA,aAAaC,EAA8B,CAC1C,IAAIC,EAAW,GACXC,EAAY,GACZC,EAA6B,IAAG,GAC9BC,EAAWC,GAAwC,CACxD,IAAMjB,EAAQF,GAAQmB,CAAW,EACjC,OAAIJ,GAAYC,GAAad,IAAU,OAAkB,IACzDc,EAAY,GACZC,EAAe,EACfA,EAAiBH,EAAQ,SAASZ,CAAK,EAChC,GACR,EAEA,GAAI,CAACgB,EAAQjB,CAAO,EAAG,CACtBgB,EAAiBH,EAAQ,cAAc,EACvC,IAAMM,EAASf,EAAU,OACrB,OAAOe,GAAW,YACpBA,EAAmC,KAAKnB,EAAS,CAAC,OAAO,EAAIkB,GAAgB,CAC7ED,EAAQC,CAAW,CACpB,CAAC,CAEH,CAEAlB,EAAQ,OACP,IAAM,IAAM,CACXc,EAAW,GACXE,EAAe,CAChB,EACA,2DACD,CACD,CACD,CAAC,CACF,CC5HA,IAAAI,EAAkE,iBCK3D,IAAMC,GAA8B,sCAC9BC,GAA6B,qCAC7BC,GAAkC,0CAClCC,GAAoC,4CACpCC,GAA8B,sCAC9BC,GAA8B,sCAC9BC,GAA8B,sCAE9BC,GAA2B,uCAC3BC,GAA0B,sCAC1BC,GAA+B,qCAC/BC,GAAiC,uCACjCC,GAA2B,uCAC3BC,GAA2B,uCAE3BC,GAA4B,wCAC5BC,GAA4B,gDAC5BC,GAA2B,+CAC3BC,GAA2B,+CAE3BC,GAA2B,uCAC3BC,GAAmB,sCACnBC,GAAiC,oDAEjCC,GAAwB,kCACxBC,GAAsB,yCACtBC,GAAsB,yCAEtBC,GAAgC,OAAO,OAAO,CAC1DvB,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACS,EC1BH,IAAME,GAAcC,GACdC,GAAaC,GACbC,GAAkBC,GAClBC,GAAoBC,GACpBC,GAAcC,GACdC,GAAcC,GACdC,GAAeC,GACfC,GAAuBC,GACvBC,GAAsBC,GACtBC,GAAsBC,GACtBC,GAAoBC,GACpBC,GAAmBA,GACnBC,GAA0BC,GAC1BC,GAAeC,GACfC,GAAsBA,GACtBC,GAAsBA,GACtBC,GAAmB,IACnBC,GAAU,KAAU,IAEpBC,GAAsC,CAAC,OAAQ,QAAS,OAAQ,QAAQ,EACxEC,GAA0C,CAAC,UAAW,SAAU,UAAW,WAAW,EACtFC,GAA8C,CAC1D,OACA,kBACA,eACA,oBACA,kBACA,yBACA,oBACD,EACaC,GAAyD,CAAC,SAAU,QAAS,YAAa,SAAS,EACnGC,GAAuD,CAAC,WAAY,YAAa,aAAa,EAE9FC,GAA8D,CAC1E,KAAM,oBACN,MAAO,qBACP,KAAM,qCACN,OAAQ,6BACT,EAEaC,GAAwE,CACpF,KAAM,iBACN,MAAO,kBACP,KAAM,iBACN,OAAQ,kBACT,EAEaC,GAA4E,CACxF,QAAS,sBACT,OAAQ,qBACR,QAAS,sBACT,UAAW,sBACZ,EAEaC,GAAgF,CAC5F,KAAM,qBACN,gBAAiB,+BACjB,aAAc,4BACd,kBAAmB,iCACnB,gBAAiB,+BACjB,uBAAwB,sCACxB,mBAAoB,iCACrB,EAEaC,GAA2F,CACvG,OAAQ,qBACR,MAAO,oBACP,UAAW,wBACX,QAAS,qBACV,EAEaC,GAAyF,CACrG,SAAU,uBACV,UAAW,wBACX,YAAa,yBACd,EAEaC,GAKP,CACL,CAAE,IAAK,cAAe,MAAO,iBAAkB,KAAM,oBAAqB,EAC1E,CAAE,IAAK,cAAe,MAAO,iBAAkB,KAAM,oBAAqB,EAC1E,CAAE,IAAK,kBAAmB,MAAO,qBAAsB,KAAM,yBAA0B,eAAgB,EAAK,EAC5G,CAAE,IAAK,aAAc,MAAO,gBAAiB,KAAM,mBAAoB,EACvE,CAAE,IAAK,YAAa,MAAO,eAAgB,KAAM,kBAAmB,EACpE,CAAE,IAAK,mBAAoB,MAAO,sBAAuB,KAAM,yBAA0B,EACzF,CAAE,IAAK,mBAAoB,MAAO,sBAAuB,KAAM,yBAA0B,CAC1F,EAEaC,GAOP,CACL,CAAE,IAAK,gBAAiB,MAAO,mBAAoB,KAAM,uBAAwB,IAAK,EAAG,IAAK,GAAI,MAAO,CAAE,EAC3G,CAAE,IAAK,aAAc,MAAO,gBAAiB,KAAM,oBAAqB,IAAK,EAAG,IAAK,EAAG,MAAO,CAAE,EACjG,CACC,IAAK,qBACL,MAAO,mBACP,KAAM,uBACN,IAAK,EACL,IAAK,IACL,MAAOb,EACR,CACD,EAEac,GAA0E,CACtF,KAAM,oBACN,IAAK,mBACL,YAAa,mBACb,cAAe,mBACf,YAAa,mBACb,UAAW,sBACX,QAAS,sBACT,OAAQ,sBACR,IAAK,sBACL,SAAU,sBACV,MAAO,qBACP,eAAgB,qBAChB,eAAgB,sBAChB,UAAW,qBACZ,EAEaC,GAA+C,CAC3D,CACC,KAAM,OACN,MAAO,aACP,SAAU,YACV,eAAgB,kBAChB,QAAS,CAAC,OAAQ,QAAQ,EAC1B,YAAa,OACb,kBAAmB,QACpB,EACA,CACC,KAAM,QACN,MAAO,cACP,SAAU,aACV,eAAgB,mBAChB,QAAS,CAAC,SAAU,SAAS,EAC7B,YAAa,SACb,kBAAmB,QACpB,EACA,CACC,KAAM,OACN,MAAO,kBACP,SAAU,YACV,eAAgB,kBAChB,QAAS,CAAC,QAAQ,EAClB,YAAa,SACb,kBAAmB,QACpB,EACA,CACC,KAAM,SACN,MAAO,oBACP,SAAU,cACV,eAAgB,oBAChB,QAAS,CAAC,SAAS,EACnB,YAAa,UACb,kBAAmB,SACpB,CACD,EAEaC,GAA+E,CAC3F,CAAE,GAAI,WAAY,MAAO,aAAc,EACvC,CAAE,GAAI,UAAW,MAAO,YAAa,EACrC,CAAE,GAAI,eAAgB,MAAO,iBAAkB,EAC/C,CAAE,GAAI,QAAS,MAAO,UAAW,CAClC,EAEaC,GAAmB,KACnBC,GAAmB,MACnBC,GAA0B,MAC1BC,GAA0B,MAC1BC,GAA0B,IAAI,IAAI,CAAC,GAAI,GAAI,KAAM,KAAM,KAAM,KAAM,CAAC,EAEpEC,GAAyB,IAAI,IAAI,CAC7C,kBACA,kBACA,iBACA,sBACA,mBACA,oBACD,CAAC,EAEYC,GAAiB,QC1NvB,SAASC,EAASC,EAAkD,CAC1E,OAAO,OAAOA,GAAU,UAAYA,IAAU,MAAQ,CAAC,MAAM,QAAQA,CAAK,CAC3E,CAEO,SAASC,GAAqBC,EAA6C,CACjF,OAAOA,aAAiB,OAASA,EAAM,OAAS,sBAAwB,WAAYA,CACrF,CAEO,SAASC,GAAgBD,EAAyB,CACxD,OAAKD,GAAqBC,CAAK,EAKxBA,EAAM,SAAW,KAAOA,EAAM,OAAS,qBAAuB,aAAa,KAAKA,EAAM,OAAO,EAHlGA,aAAiB,OAAS,kEAAkE,KAAKA,EAAM,OAAO,CAIjH,CAEO,SAASE,GAAuBF,EAAyB,CAC/D,OAAKD,GAAqBC,CAAK,EAC3BA,EAAM,OAAS,QAAaG,GAAuB,IAAIH,EAAM,IAAI,EAAU,GACxEA,EAAM,SAAW,KAAOA,EAAM,SAAW,IAFP,EAG1C,CAEO,SAASI,GAAoBC,EAAmBC,EAAY,GAAa,CAC1E,MAAMC,GAAqB,CAC/B,OAAQ,OACR,QAAS,CAAE,OAAQ,mBAAoB,eAAgB,kBAAmB,EAC1E,YAAa,cACb,KAAM,KAAK,UAAU,CAAE,UAAAF,CAAU,CAAC,EAClC,GAAIC,EAAY,CAAE,UAAW,EAAK,EAAI,CAAC,CACxC,CAAC,EAAE,MAAM,IAAG,EAAY,CACzB,CAEA,eAAsBE,EAAeC,EAAcC,EAAS,MAAOC,EAA4B,CAC9F,IAAMC,EAAW,MAAM,MAAMH,EAAM,CAClC,OAAAC,EACA,QAAS,CAAE,OAAQ,mBAAoB,GAAIC,IAAS,OAAY,CAAC,EAAI,CAAE,eAAgB,kBAAmB,CAAG,EAC7G,YAAa,cACb,GAAIA,IAAS,OAAY,CAAC,EAAI,CAAE,KAAM,KAAK,UAAUA,CAAI,CAAE,CAC5D,CAAC,EACKb,EAAiB,MAAMc,EAAS,KAAK,EAAE,MAAM,IAAG,EAAY,EAClE,GAAI,CAACA,EAAS,GAAI,CACjB,IAAMC,EAAShB,EAASC,CAAK,EAAIA,EAAQ,OACnCgB,EACLD,IAAW,QAAa,OAAOA,EAAO,OAAa,SAChDA,EAAO,MACPA,IAAW,QAAa,OAAOA,EAAO,SAAe,SACpDA,EAAO,QACP,QAAQD,EAAS,MAAM,GACtBG,EAAOF,IAAW,QAAa,OAAOA,EAAO,MAAY,SAAWA,EAAO,KAAU,OACrFb,EAAQ,IAAI,MAAMc,CAAO,EAC/B,MAAAd,EAAM,KAAO,qBACbA,EAAM,OAASY,EAAS,OACpBG,IAAS,SAAWf,EAAM,KAAOe,GAC/Bf,CACP,CACA,OAAOF,CACR,CAEA,eAAsBkB,GAASC,EAAgC,CAC9D,GAAI,CACH,GAAI,OAAO,UAAc,KAAe,UAAU,WAAW,YAAc,OAC1E,aAAM,UAAU,UAAU,UAAUA,CAAI,EACjC,EAET,MAAQ,CAER,CACA,GAAI,CACH,IAAMC,EAAO,SAAS,cAAc,UAAU,EAC9CA,EAAK,MAAQD,EACbC,EAAK,aAAa,WAAY,EAAE,EAChCA,EAAK,MAAM,SAAW,QACtBA,EAAK,MAAM,KAAO,UAClB,SAAS,KAAK,YAAYA,CAAI,EAC9BA,EAAK,OAAO,EACZ,IAAMC,EAAK,SAAS,YAAY,MAAM,EACtC,gBAAS,KAAK,YAAYD,CAAI,EACvBC,CACR,MAAQ,CACP,MAAO,EACR,CACD,CClFO,IAAMC,GAAa,iBAEbC,GAA2B,CACvC,QAAS,OACT,cAAe,SACf,IAAK,GACL,MAAO,OACP,SAAU,IACV,SAAU,CACX,EACaC,EAA4B,CACxC,OAAQ,EACR,SAAU,GACV,WAAY,OACZ,WAAY,IACZ,MAAO,gCACR,EACaC,EAA2B,CACvC,OAAQ,EACR,SAAU,GACV,WAAY,OACZ,MAAO,kCACR,EACaC,GAA2B,CACvC,QAAS,OACT,cAAe,SACf,IAAK,GACL,QAAS,YACT,OAAQ,uCACR,aAAc,GACd,WAAY,sCACZ,WAAYJ,EACb,EACaK,GAA0B,CACtC,QAAS,OACT,WAAY,SACZ,eAAgB,gBAChB,SAAU,OACV,IAAK,EACN,EACaC,GAA6B,CACzC,QAAS,OACT,WAAY,SACZ,IAAK,EACL,SAAU,GACV,WAAY,IACZ,MAAO,gCACR,EACaC,EAA6B,CACzC,UAAW,aACX,UAAW,GACX,QAAS,WACT,OAAQ,iEACR,aAAc,GACd,WAAY,qEACZ,MAAO,iCACP,UAAW,gCACX,KAAM,UACN,SAAU,GACV,WAAY,IACZ,OAAQ,UACR,WAAYP,EACb,EACaQ,EAAoC,CAChD,GAAGD,EAGH,OAAQ,OACR,WAAY,uCACZ,MAAO,4CACP,UAAW,gCACX,WAAY,GACb,EACaE,GAAoC,CAChD,GAAGF,EACH,UAAW,GACX,QAAS,WACT,SAAU,GACV,aAAc,CACf,EACaG,GAA4B,CAAE,GAAGP,EAAW,MAAO,sCAAuC,EAC1FQ,GAA8B,CAAE,GAAGR,EAAW,MAAO,iDAAkD,EACvGS,GAA8B,CAC1C,GAAGT,EACH,QAAS,YACT,aAAc,EACd,OAAQ,8FACR,WAAY,oFACZ,MAAO,gCACR,EACaU,GAA0B,CACtC,GAAGV,EACH,QAAS,YACT,aAAc,EACd,OAAQ,uCACR,WAAY,8BACZ,MAAO,gCACR,EACaW,GAA6B,CACzC,GAAGD,GACH,UAAW,oCACZ,EACaE,GAA2B,CACvC,WAAY,2DACZ,SAAU,GACV,cAAe,SACf,WAAY,IACZ,MAAO,gCACR,EACaC,GAA2B,CAAE,WAAY,0DAA2D,EACpGC,GAA8B,CAC1C,GAAGD,GACH,QAAS,QACT,SAAU,GACV,WAAY,OACZ,QAAS,YACT,aAAc,EACd,OAAQ,uCACR,WAAY,8BACZ,MAAO,iCACP,aAAc,WACd,WAAY,UACb,EACaE,GAA2B,CAAE,MAAO,iCAAkC,UAAW,WAAY,EAC7FC,GAA2B,CACvC,QAAS,OACT,cAAe,SACf,IAAK,EACL,OAAQ,EACR,QAAS,EACT,UAAW,MACZ,EACaC,GAA+B,CAC3C,QAAS,OACT,WAAY,aACZ,IAAK,EACL,SAAU,GACV,MAAO,gCACR,EACaC,GAA4B,CACxC,UAAW,aACX,MAAO,OACP,UAAW,GACX,QAAS,WACT,OAAQ,uCACR,aAAc,EACd,WAAY,8BACZ,MAAO,iCACP,KAAM,UACN,SAAU,GACV,WAAYrB,EACb,EACasB,GAA6B,CACzC,QAAS,OACT,cAAe,SACf,IAAK,EACL,QAAS,YACT,OAAQ,uCACR,aAAc,EACd,WAAY,6BACb,EACaC,EAA2B,CAAE,GAAGpB,EAAW,SAAU,EAAG,EACxDqB,GAAqC,CACjD,SAAU,WACV,MAAO,EACP,OAAQ,EACR,QAAS,EACT,OAAQ,GACR,SAAU,SACV,KAAM,mBACN,WAAY,SACZ,OAAQ,CACT,EACaC,GAAmC,CAC/C,QAAS,cACT,SAAU,OACV,IAAK,EACL,QAAS,EACT,aAAc,GACd,OAAQ,uCACR,WAAY,6BACb,EACaC,GAAmC,CAC/C,GAAGnB,EACH,OAAQ,OACR,aAAc,EACd,UAAW,OACX,WAAY,cACZ,UAAW,GACX,QAAS,WACT,SAAU,EACX,EACaoB,GAAyC,CACrD,GAAGD,GACH,WAAY,sCACZ,MAAO,iCACP,UAAW,gCACX,WAAY,GACb,EACaE,GAA4B,CACxC,QAAS,OACT,cAAe,SACf,IAAK,GACL,SAAU,CACX,EACaC,GAAkC,CAC9C,QAAS,OACT,oBAAqB,mDACrB,IAAK,EACN,EACaC,GAA8B,CAC1C,QAAS,OACT,WAAY,SACZ,eAAgB,gBAChB,SAAU,OACV,IAAK,CACN,EACaC,GAA+B,CAC3C,GAAG3B,GACH,UAAW,GACX,WACC,oIACD,eAAgB,YAChB,UAAW,2DACZ,EACa4B,GAA8B,CAC1C,QAAS,OACT,WAAY,aACZ,IAAK,GACL,SAAU,GACV,MAAO,kCACR,EACaC,GAAiC,CAC7C,GAAGD,GACH,MAAO,iCACP,WAAY,GACb,EACaE,GAAiC,CAC7C,QAAS,cACT,WAAY,SACZ,eAAgB,SAChB,MAAO,GACP,OAAQ,GACR,aAAc,MACd,KAAM,WACN,SAAU,GACV,WAAY,IACZ,WAAY,8BACZ,OAAQ,uCACR,MAAO,kCACR,EACaC,GAAuC,CACnD,GAAGD,GACH,WAAY,uCACZ,YAAa,uCACb,MAAO,2CACR,EAIO,SAASE,GAAgBC,EAA0B,CACzD,OAAQA,EAAM,CACb,IAAK,UACJ,MAAO,kDACR,IAAK,QACJ,MAAO,gDACR,IAAK,UAEJ,MAAO,+CACR,IAAK,OAEJ,MAAO,0CACR,QAGC,MAAO,0CACT,CACD,CAEO,SAASC,GAAWD,EAAiC,CAC3D,IAAME,EAAQH,GAAgBC,CAAI,EAClC,MAAO,CACN,QAAS,cACT,WAAY,SACZ,IAAK,EACL,QAAS,WACT,aAAc,IACd,SAAU,GACV,WAAY,IACZ,WAAY,OACZ,MAAAE,EACA,WAAY,sBAAsBA,CAAK,qBACvC,OAAQ,gCAAgCA,CAAK,qBAC7C,WAAY,QACb,CACD,CAEO,SAASC,GACfC,EACAC,EAAY,GACI,CAUhB,MAAO,CAAE,MAAO,EAAG,OAAQ,EAAG,aAAc,MAAO,KAAM,WAAY,WATtDA,EAEZD,IAAW,aAAeA,IAAW,YACpC,kDACAA,IAAW,QACV,gDACAA,IAAW,cAAgBA,IAAW,UACrC,0CACA,2CAPH,0CAQoF,CACxF,CAEO,SAASE,GAAmBF,EAAkCC,EAAY,GAAkB,CAClG,OAAKA,EACDD,IAAW,YAAoB,UAC/BA,IAAW,QAAgB,QAC3BA,IAAW,aAAqB,OAC7B,UAJgB,SAKxB,CCtTE,IAAAG,GAAA,6BARIC,GAAa,oEAMZ,SAASC,GAAS,CAAE,EAAAC,CAAE,EAAkB,CAC9C,SACC,SAAC,WAAQ,MAAOC,GAAW,kBAAgB,2BAC1C,qBAAC,MAAG,GAAG,2BAA2B,MAAO,CAAE,GAAGC,EAAY,SAAU,EAAG,EACrE,SAAAF,EAAE,YAAY,EAChB,KACA,QAAC,KAAE,MAAO,CAAE,GAAGG,GAAc,UAAW,EAAG,EAAI,SAAAH,EAAE,cAAc,EAAE,KACjE,QAAC,KAAE,MAAO,CAAE,GAAGI,EAAW,UAAW,EAAG,EAAI,SAAAJ,EAAE,iBAAiB,EAAE,KACjE,QAAC,KAAE,MAAO,CAAE,GAAGK,EAAW,UAAW,EAAG,EAAI,SAAAL,EAAE,gBAAiB,CAAE,QAASM,EAAe,CAAC,EAAE,KAC5F,QAAC,KAAE,MAAO,CAAE,GAAGD,EAAW,UAAW,CAAE,EAAI,SAAAL,EAAE,eAAe,EAAE,KAC9D,QAAC,KAAE,MAAO,CAAE,UAAW,CAAE,EACxB,oBAAC,KAAE,KAAMF,GAAY,OAAO,SAAS,IAAI,aAAa,MAAOS,GAC3D,SAAAP,EAAE,eAAe,EACnB,EACD,GACD,CAEF,CC3BA,IAAAQ,GAA4C,iBCarC,SAASC,GAAqBC,EAAoCC,EAA8B,CACtG,OACCA,GACAD,EAAW,oBAAsB,QACjCA,EAAW,QAAQ,SAASA,EAAW,iBAAiB,EAEjDA,EAAW,kBAEZA,EAAW,WACnB,CAGO,SAASE,GAAoBF,EAAoCC,EAAgC,CACvG,IAAME,EAAYJ,GAAqBC,EAAYC,CAAM,EACnDG,EAAOJ,EAAW,QAAQ,OAAQK,GAAWA,IAAWF,CAAS,EACvE,OAAOH,EAAW,QAAQ,SAASG,CAAS,EAAI,CAACA,EAAW,GAAGC,CAAI,EAAI,CAAC,GAAGJ,EAAW,OAAO,CAC9F,CAGO,SAASM,GAA8BC,EAA2C,CAExF,OADIA,IAAW,QAAaA,EAAO,WAC/BA,EAAO,SAAW,OAAkB,GACjCA,EAAO,SAAW,SAC1B,CAEO,SAASC,GAAsBC,EAAuD,CAC5F,OAAIA,IAAY,QAAaA,EAAQ,SAAW,EAAU,GACnDA,EAAQ,MAAOF,GAAW,CAACA,EAAO,YAAcA,EAAO,SAAW,QAAaA,EAAO,SAAW,UAAU,CACnH,CAEO,SAASG,GAAwBD,EAAuD,CAC9F,OAAOA,GAAS,KAAMF,GAAWA,EAAO,SAAS,IAAM,EACxD,CAEO,SAASI,GACfN,EACA,EACAO,EACS,CACT,OAAIP,IAAW,SACVO,GAAS,SAAW,IAAQA,EAAQ,UAAY,GAAa,EAAE,mBAAmB,EAC/E,EAAE,aAAa,EAEU,EAA7BP,IAAW,UAAoB,eAC1B,WADwC,CAElD,CC1CE,IAAAQ,GAAA,6BAJK,SAASC,GAAM,CAAE,MAAAC,EAAO,KAAAC,EAAM,eAAAC,EAAgB,UAAAC,EAAY,GAAM,QAAAC,EAAU,EAAK,EAAe,CACpG,IAAMC,EACLJ,IAASC,IAAmB,OAAYI,GAAmBJ,EAAgBC,CAAS,EAAI,WACzF,SACC,SAAC,QAAK,MAAOI,GAAWF,CAAY,EAAG,KAAK,SAC1C,UAAAD,KACA,QAAC,QACA,cAAY,OACZ,MAAO,CACN,GAAGI,GAASN,IAAmBG,IAAiB,UAAY,YAAc,cAAeF,CAAS,EAClG,MAAO,EACP,OAAQ,CACT,EACD,EACG,QACJ,QAAC,QAAM,SAAAH,EAAM,GACd,CAEF,CCKO,SAASS,EAAeC,EAAoC,CAClE,OAAO,OAAOA,GAAU,UAAYA,EAAM,OAAS,GAAKA,EAAM,OAAS,IAAMA,EAAQ,MACtF,CAEO,SAASC,GAAqBD,EAAoC,CACxE,OAAO,OAAOA,GAAU,UAAY,OAAO,SAASA,CAAK,EAAIA,EAAQ,MACtE,CAEO,SAASE,GAAgBF,EAAqC,CACpE,OAAO,OAAOA,GAAU,UAAYA,EAAQ,MAC7C,CAEO,SAASG,GAAgBH,EAAoC,CACnE,IAAMI,EAAUH,GAAqBD,CAAK,EAC1C,OAAOI,IAAY,QAAaA,GAAW,GAAKA,GAAW,IAAMA,EAAU,MAC5E,CAEO,SAASC,GAAaL,EAAoC,CAChE,OAAQM,GAAmC,SAASN,CAAK,CAC1D,CAEO,SAASO,GAAeP,EAAsC,CACpE,OAAQQ,GAAqC,SAASR,CAAK,CAC5D,CAEO,SAASS,GAAiBT,EAAwC,CACxE,OAAQU,GAAuC,SAASV,CAAK,CAC9D,CAEO,SAASW,GAAsBX,EAA6C,CAClF,OAAQY,GAA6C,SAASZ,CAAK,CACpE,CAEO,SAASa,GAAqBb,EAA4C,CAChF,OAAQc,GAA4C,SAASd,CAAK,CACnE,CAEO,SAASe,GAAYf,EAAwB,CACnD,MAAO,yDAAyD,KAAKA,CAAK,CAC3E,CAEO,SAASgB,GAAgBhB,EAAgBiB,EAA0B,CACzE,IAAMC,EAAOnB,EAAeC,CAAK,EACjC,OAAIkB,IAAS,QAAaH,GAAYG,CAAI,GAAKA,EAAK,OAAS,IAAYC,GAAoBF,CAAI,EAC1FC,CACR,CAEO,SAASE,GAAYpB,EAAoC,CAC/D,IAAMkB,EAAOnB,EAAeC,CAAK,EACjC,GAAI,EAAAkB,IAAS,QAAaH,GAAYG,CAAI,GAC1C,OAAOA,CACR,CAEO,SAASG,GAAYrB,EAA+C,CAC1E,GAAIA,IAAU,QAAa,CAAC,OAAO,SAASA,CAAK,GAAKA,GAAS,EAAG,OAClE,IAAMsB,EAAKtB,EAAQ,KAAOA,EAAQA,EAAQ,IAAMA,EAAQ,IAAO,OAC/D,GAAIsB,IAAO,OAAW,OACtB,IAAMC,EAAY,IAAI,KAAKD,CAAE,EAAE,eAAe,EAC9C,OAAOC,EAAU,OAAS,EAAIA,EAAY,MAC3C,CAEO,SAASC,GAAYxB,EAA0C,CACrE,GAAI,CAACyB,EAASzB,CAAK,GAAK,OAAOA,EAAM,MAAY,UAAY,CAACK,GAAaL,EAAM,IAAO,EAAG,OAC3F,IAAMiB,EAAOjB,EAAM,KACb0B,EAAY3B,EAAeC,EAAM,MAAS,EAC1C2B,EAAY1B,GAAqBD,EAAM,SAAY,EACzD,MAAO,CACN,KAAAiB,EACA,YAAaD,GAAgBhB,EAAM,YAAgBiB,CAAI,EACvD,UAAWjB,EAAM,YAAiB,GAClC,GAAI2B,IAAc,OAAY,CAAC,EAAI,CAAE,UAAAA,CAAU,EAC/C,GAAID,IAAc,QAAanB,GAAemB,CAAS,EAAI,CAAE,OAAQA,CAAU,EAAI,CAAC,CACrF,CACD,CAEO,SAASE,GAAaC,EAAqD,CACjF,OAAOvB,GAAa,IAAKW,GACVY,EAAW,KAAMC,GAAUA,EAAM,OAASb,CAAI,GAC5C,CAAE,KAAAA,EAAM,YAAaE,GAAoBF,CAAI,EAAG,UAAW,GAAO,OAAQ,SAAU,CACpG,CACF,CAEO,SAASc,GAAa/B,EAAgC,CAC5D,IAAMgC,EAAO,MAAM,QAAQhC,CAAK,EAC7BA,EACAyB,EAASzB,CAAK,GAAK,MAAM,QAAQA,EAAM,OAAU,EAChDA,EAAM,QACN,CAAC,EACL,OAAO4B,GAAaI,EAAK,IAAIR,EAAW,EAAE,OAAQM,GAAiCA,IAAU,MAAS,CAAC,CACxG,CAEO,SAASG,GAAajC,EAA2C,CACvE,GAAI,CAACyB,EAASzB,CAAK,EAAG,OACtB,IAAMkC,EAAYnC,EAAeC,EAAM,SAAY,EAC7CmC,EAAUpC,EAAeC,EAAM,IAAO,EAC5C,GAAIkC,IAAc,QAAaC,IAAY,QAAa,CAAC9B,GAAa8B,CAAO,EAAG,OAChF,IAAMC,EAAcrC,EAAeC,EAAM,QAAW,EAC9CqC,EAAYtC,EAAeC,EAAM,MAAS,EAC1C2B,EAAY1B,GAAqBD,EAAM,SAAY,EACnDsC,EAAkBrC,GAAqBD,EAAM,eAAkB,EAC/DuC,EAAW,MAAM,QAAQvC,EAAM,QAAW,EAC7CA,EAAM,SAAY,IAAIoB,EAAW,EAAE,OAAQU,GAA2BA,IAAU,MAAS,EACzF,CAAC,EACJ,MAAO,CACN,UAAAI,EACA,KAAMC,EACN,YAAanB,GAAgBhB,EAAM,YAAgBmC,CAAO,EAC1D,yBAA0BnC,EAAM,2BAAgC,GAChE,SAAAuC,EACA,GAAIZ,IAAc,OAAY,CAAC,EAAI,CAAE,UAAAA,CAAU,EAC/C,GAAIW,IAAoB,OAAY,CAAC,EAAI,CAAE,gBAAAA,CAAgB,EAC3D,GAAIF,IAAgB,QAAa3B,GAAiB2B,CAAW,EAAI,CAAE,SAAUA,CAAY,EAAI,CAAC,EAC9F,GAAIC,IAAc,QAAa1B,GAAsB0B,CAAS,EAAI,CAAE,OAAQA,CAAU,EAAI,CAAC,CAC5F,CACD,CAEO,SAASG,GAAkBxC,EAAgD,CACjF,GAAI,CAACyB,EAASzB,CAAK,EAAG,OACtB,IAAMyC,EAAS1C,EAAeC,EAAM,MAAS,EAC7C,OAAOyC,IAAW,QAAa5B,GAAqB4B,CAAM,EAAIA,EAAS,MACxE,CAEO,SAASC,GAAe1C,EAAgB2C,EAAaC,EAAaC,EAA0B,CAClG,IAAMzC,EAAUH,GAAqBD,CAAK,EAC1C,OAAOI,IAAY,QAAa,OAAO,UAAUA,CAAO,GAAKA,GAAWuC,GAAOvC,GAAWwC,EAAMxC,EAAUyC,CAC3G,CAEO,SAASC,IAAkD,CACjE,MAAO,CACN,YAAa,GACb,YAAa,GACb,gBAAiB,GACjB,WAAY,GACZ,UAAW,GACX,iBAAkB,GAClB,iBAAkB,GAClB,cAAe,EACf,WAAY,EACZ,mBAAoB,IAASC,EAC9B,CACD,CAEO,SAASC,GAAwBhD,EAAwC,CAC/E,IAAMiD,EAASxB,EAASzB,CAAK,EAAIA,EAAQ,CAAC,EAC1C,MAAO,CACN,YAAaiD,EAAO,cAAmB,GACvC,YAAaA,EAAO,cAAmB,GACvC,gBAAiBA,EAAO,kBAAuB,GAC/C,WAAYA,EAAO,aAAkB,GACrC,UAAWA,EAAO,YAAiB,GACnC,iBAAkBA,EAAO,mBAAwB,GACjD,iBAAkBA,EAAO,mBAAwB,GACjD,cAAeP,GAAeO,EAAO,cAAkB,EAAG,GAAI,CAAC,EAC/D,WAAYP,GAAeO,EAAO,WAAe,EAAG,EAAG,CAAC,EACxD,mBAAoBP,GAAeO,EAAO,mBAAuBF,GAAS,IAASA,GAAS,IAASA,EAAO,CAC7G,CACD,CAEO,SAASG,GAAkBlD,EAAgD,CACjF,GAAI,CAACyB,EAASzB,CAAK,EAAG,OACtB,IAAMmD,EAAS1B,EAASzB,EAAM,KAAQ,EAAIA,EAAM,MAAWA,EACrDoD,EAAWnD,GAAqBD,EAAM,QAAW,EACvD,GAAI,EAAAoD,IAAa,QAAa,CAAC3B,EAASzB,EAAM,KAAQ,GAAKA,EAAM,WAAgB,QACjF,MAAO,CACN,MAAOgD,GAAwBG,CAAM,EACrC,SAAUC,GAAY,EACtB,SAAUpD,EAAM,WAAgB,EACjC,CACD,CAEA,SAASqD,GAAiBrD,EAA6C,CACtE,GAAI,CAACyB,EAASzB,CAAK,EAAG,OACtB,IAAMsD,EAAcnD,GAAgBH,EAAM,aAAkBA,EAAM,YAAe,EAC3EuD,EAAmBpD,GAAgBH,EAAM,kBAAuBA,EAAM,iBAAoB,EAC1FwD,EAAgBvD,GAAqBD,EAAM,eAAoBA,EAAM,oBAAuB,EAC5FyD,EAAWxD,GAAqBD,EAAM,UAAeA,EAAM,QAAW,EAC5E,GACC,EAAAsD,IAAgB,QAChBC,IAAqB,QACrBC,IAAkB,QAClBC,IAAa,QAId,MAAO,CACN,GAAIH,IAAgB,OAAY,CAAC,EAAI,CAAE,YAAAA,CAAY,EACnD,GAAIC,IAAqB,OAAY,CAAC,EAAI,CAAE,iBAAAA,CAAiB,EAC7D,GAAIC,IAAkB,QAAaA,EAAgB,EAAI,CAAE,cAAAA,CAAc,EAAI,CAAC,EAC5E,GAAIC,IAAa,OAAY,CAAC,EAAI,CAAE,SAAAA,CAAS,CAC9C,CACD,CAEA,SAASC,GAAgB1D,EAAgB2D,EAAgD,CACxF,GAAI,CAAClC,EAASzB,CAAK,EAAG,OACtB,IAAM4D,EAAK7D,EAAeC,EAAM,EAAK,GAAKD,EAAeC,EAAM,eAAkB,GAAK2D,EAChFE,EAAO9D,EAAeC,EAAM,IAAO,GAAKD,EAAeC,EAAM,UAAa,EAC1EmD,EAAS1B,EAASzB,EAAM,UAAa,EAAIA,EAAM,WAAgBA,EAC/D8D,EAAU,MAAM,QAAQ9D,EAAM,OAAU,EAC3CA,EAAM,QAAW,IAAIqD,EAAgB,EAAE,OAAQvB,GAAoCA,IAAU,MAAS,EACtG,CACAuB,GAAiBF,EAAO,cAAiB,EACzCE,GAAiBF,EAAO,gBAAmB,EAC3CE,GAAiBF,CAAM,CACxB,EAAE,OAAQrB,GAAoCA,IAAU,MAAS,EACnE,GAAI,EAAAgC,EAAQ,SAAW,GAAKD,IAAS,QAAa9D,EAAeC,EAAM,EAAK,IAAM,QAClF,MAAO,CAAE,GAAA4D,EAAI,QAAAE,EAAS,GAAID,IAAS,OAAY,CAAC,EAAI,CAAE,KAAAA,CAAK,CAAG,CAC/D,CAEO,SAASE,GAAW/D,EAAuC,CACjE,GAAI,CAACyB,EAASzB,CAAK,EAAG,OACtB,IAAMgE,EAAUvC,EAASzB,EAAM,KAAQ,EAAIA,EAAM,MAAWA,EACtDiE,EAA+B,CAAC,EAChCC,EAAO,IAAI,IACXC,EAAOC,GAA4C,CACpDA,IAAU,QAAaF,EAAK,IAAIE,EAAM,EAAE,IAC5CF,EAAK,IAAIE,EAAM,EAAE,EACjBH,EAAW,KAAKG,CAAK,EACtB,EACI,MAAM,QAAQJ,EAAQ,UAAa,EACtCA,EAAQ,WAAc,QAAQ,CAAClC,EAAOuC,IAAUF,EAAIT,GAAgB5B,EAAO,SAAS,OAAOuC,CAAK,CAAC,EAAE,CAAC,CAAC,GAErGF,EAAIT,GAAgBM,EAAQ,WAAe,OAAO,CAAC,EAC/C,MAAM,QAAQA,EAAQ,sBAAyB,GAClDA,EAAQ,uBAA0B,QAAQ,CAAClC,EAAOuC,IACjDF,EAAIT,GAAgB5B,EAAO,SAAS,OAAOuC,CAAK,CAAC,EAAE,CAAC,CACrD,EAEDF,EAAIT,GAAgBM,EAAQ,uBAA2B,aAAa,CAAC,GAEtE,IAAMM,EAAU7C,EAASuC,EAAQ,OAAU,EAAIA,EAAQ,QAAa,OAC9DO,EAAQ9C,EAASuC,EAAQ,eAAkB,EAC9CA,EAAQ,gBACRvC,EAASuC,EAAQ,aAAgB,EAChCvC,EAASuC,EAAQ,cAAiB,gBAAmB,EACpDA,EAAQ,cAAiB,iBACzBA,EAAQ,cACT,OACEQ,EAAW/C,EAASuC,EAAQ,YAAe,EAC9CA,EAAQ,aAAgB,eACxBvC,EAASuC,EAAQ,wBAA2B,EAC3CA,EAAQ,yBAA4B,gBACpC,OACES,EAAexE,GAAqBuE,CAAQ,EAC5CE,EAAYzE,GAAqB+D,EAAQ,SAAY,EACrDW,EACLzE,GAAgB8D,EAAQ,mBAAsB,IAC7CvC,EAASuC,EAAQ,aAAgB,EAAI9D,GAAgB8D,EAAQ,cAAiB,OAAU,EAAI,QACxFY,EAAiBN,IAAY,OAAY,OAAYvE,EAAeuE,EAAQ,OAAU,EACtFO,EAAkBN,IAAU,OAAY,OAAYxE,EAAewE,EAAM,KAAQ,EACjFO,EAAiBP,IAAU,OAAY,OAAYxE,EAAewE,EAAM,IAAO,EAC/EQ,EAAsBR,IAAU,OAAY,OAAYxE,EAAewE,EAAM,SAAY,EACzFS,EACLT,IAAU,OAAY,OAAYpE,GAAgBoE,EAAM,kBAAuBA,EAAM,iBAAoB,EACpGU,EACLV,IAAU,OAAY,OAAYtE,GAAqBsE,EAAM,UAAeA,EAAM,QAAW,EAC9F,MAAO,CACN,WAAAN,EACA,GAAIK,IAAY,QAAa,OAAOA,EAAQ,WAAiB,UAC1D,CAAE,iBAAkBA,EAAQ,SAAa,EACzC,CAAC,EACJ,GAAIM,IAAmB,OAAY,CAAC,EAAI,CAAE,eAAAA,CAAe,EACzD,GAAIC,IAAoB,OAAY,CAAC,EAAI,CAAE,gBAAAA,CAAgB,EAC3D,GAAIC,IAAmB,OAAY,CAAC,EAAI,CAAE,eAAAA,CAAe,EACzD,GAAIC,IAAwB,OAAY,CAAC,EAAI,CAAE,oBAAAA,CAAoB,EACnE,GAAIC,IAA+B,OAAY,CAAC,EAAI,CAAE,2BAAAA,CAA2B,EACjF,GAAIC,IAAuB,OAAY,CAAC,EAAI,CAAE,mBAAAA,CAAmB,EACjE,GAAIN,IAAwB,OAAY,CAAC,EAAI,CAAE,oBAAAA,CAAoB,EACnE,GAAIF,IAAiB,QAAaA,GAAgB,GAAK,OAAO,cAAcA,CAAY,EAAI,CAAE,aAAAA,CAAa,EAAI,CAAC,EAChH,GAAIC,IAAc,OAAY,CAAC,EAAI,CAAE,UAAAA,CAAU,CAChD,CACD,CAEO,SAASQ,GAAsBC,EAA2B,CAChE,OACCA,EAAM,WAAW,KAAMf,GAAUA,EAAM,QAAQ,OAAS,GAAKA,EAAM,OAAS,MAAS,GACrFe,EAAM,mBAAqB,QAC3BA,EAAM,iBAAmB,QACzBA,EAAM,kBAAoB,QAC1BA,EAAM,iBAAmB,QACzBA,EAAM,sBAAwB,QAC9BA,EAAM,6BAA+B,QACrCA,EAAM,sBAAwB,IAC9BA,EAAM,eAAiB,MAEzB,CAEO,SAASC,GAAapF,EAAyC,CACrE,GAAI,CAACyB,EAASzB,CAAK,EAAG,OACtB,IAAMqF,EAAOtF,EAAeC,EAAM,IAAO,EACnCsF,EAAOrF,GAAqBD,EAAM,IAAO,EAC/C,GAAIqF,IAAS,QAAaC,IAAS,OAAW,OAC9C,IAAMC,EAAS,MAAM,QAAQvF,EAAM,MAAS,EACzCA,EAAM,OAAU,OAAQwF,GAA2B,OAAOA,GAAU,UAAYA,EAAM,OAAS,CAAC,EAChG,CAAC,EACEA,EAAQzF,EAAeC,EAAM,KAAQ,GAAKuF,EAAO,CAAC,GAAK,KACzDA,EAAO,SAAW,GAAKC,IAAU,MAAMD,EAAO,KAAKC,CAAK,EAC5D,IAAMC,EAAezF,EAAM,eAAoB,IAAQA,EAAM,gBAAqB,GAClF,MAAO,CACN,QAASA,EAAM,UAAe,GAC9B,QAASA,EAAM,UAAe,GAC9B,KAAAqF,EACA,KAAAC,EACA,MAAAE,EACA,cAAeC,EACf,aAAAA,EACA,QAAS1F,EAAeC,EAAM,OAAU,GAAK,GAC7C,OAAAuF,EACA,QAASxF,EAAeC,EAAM,OAAU,GAAK,EAC9C,CACD,CAEO,SAAS0F,GAAqBL,EAAcC,EAAsB,CAExE,MAAO,UADMD,EAAK,SAAS,GAAG,GAAK,CAACA,EAAK,WAAW,GAAG,EAAI,IAAIA,CAAI,IAAMA,CACpD,IAAI,OAAOC,CAAI,CAAC,EACtC,CAEO,SAASK,GAAkBC,EAA0B,CAC3D,QAASC,EAAU,EAAGA,EAAU,GAAIA,GAAW,EAAG,CACjD,IAAMC,EAAOC,GAA0BC,GAA0B,EAC3DC,EAAYD,GAA0B,KAAK,MAAM,KAAK,OAAO,EAAIF,CAAI,EAC3E,GAAIG,IAAcL,GAAW,CAACM,GAAwB,IAAID,CAAS,EAAG,OAAOA,CAC9E,CACA,OAAOL,IAAYI,GAA0BA,GAA0B,EAAIA,EAC5E,CAEO,SAASG,GAAiBnG,EAAmC,CACnE,IAAMsF,EAAO,OAAOtF,CAAK,EACzB,GAAI,GAAC,OAAO,UAAUsF,CAAI,GAAKA,EAAOc,IAAoBd,EAAOe,IACjE,OAAOf,CACR,CAEO,SAASgB,GAAuBtG,EAAmD,CACzF,GAAI,CAACyB,EAASzB,CAAK,EAAG,OACtB,IAAMuG,EAAarG,GAAgBF,EAAM,UAAa,EACtD,GAAIuG,IAAe,QAAavG,EAAM,SAAc,QAAaA,EAAM,WAAgB,OAAW,OAClG,IAAMiD,EAASlD,EAAeC,EAAM,MAAS,EACvCwG,EAAWtG,GAAgBF,EAAM,QAAW,EAClD,MAAO,CACN,WAAYuG,IAAe,GAC3B,GAAItD,IAAW,QAAalC,GAAYkC,CAAM,EAAI,CAAC,EAAI,CAAE,OAAAA,CAAO,EAChE,GAAIuD,IAAa,OAAY,CAAC,EAAI,CAAE,SAAAA,CAAS,CAC9C,CACD,CAEO,SAASC,GAAmBxD,EAA4B,EAA2C,CACzG,GAAIA,IAAW,OAAW,OAAO,EAAE,sBAAsB,EACzD,IAAMyD,EAASC,GAAmB1D,CAAM,GAAK0D,GAAmB1D,EAAO,YAAY,CAAC,EACpF,OAAIyD,IAAW,OAAkB,EAAEA,CAAM,EACrCzD,EAAO,QAAU,IAAM,mBAAmB,KAAKA,CAAM,GAAK,CAAClC,GAAYkC,CAAM,EAAUA,EACpF,EAAE,sBAAsB,CAChC,CAEO,SAAS2D,GAAYC,EAAqE,CAChG,OAAIA,EAAO,SAAW,YAAoB,CAAE,UAAW,CAAC,EAAG,SAAU,CAAC,CAAE,EACjE,CACN,UAAW,cAAeA,EAASA,EAAO,UAAY,CAAC,EACvD,SAAU,aAAcA,EAASA,EAAO,SAAW,CAAC,CACrD,CACD,CC7VG,IAAAC,EAAA,6BApBI,SAASC,GAAe,CAC9B,EAAAC,EACA,QAAAC,EACA,iBAAAC,EACA,YAAAC,EACA,yBAAAC,EACA,SAAAC,EACA,SAAAC,CACD,EAAwB,CACvB,IAAMC,EAAYC,GAAYP,EAAQ,SAAS,EACzCQ,EAAkBD,GAAYP,EAAQ,eAAe,EAE3D,SACC,QAAC,WACA,GAAI,+BAA+BA,EAAQ,IAAI,GAC/C,MAAOS,GACP,kBAAiB,qCAAqCT,EAAQ,IAAI,GAClE,YAAU,SACV,SAAU,GAEV,qBAAC,KAAE,GAAI,qCAAqCA,EAAQ,IAAI,GAAI,MAAOU,EACjE,UAAAX,EAAE,qBAAqB,EAAE,SAAIA,EAAEY,GAAgBX,EAAQ,IAAI,CAAC,GAC9D,KACA,OAAC,KAAE,MAAOY,EACT,mBAAC,QAAK,MAAOC,GAAY,SAAAb,EAAQ,YAAY,EAC9C,KACA,OAAC,KAAE,MAAOU,EACR,SAAAX,EAAE,kBAAmB,CACrB,OAAQA,EACPC,EAAQ,WAAa,OAAY,6BAA+Bc,GAAoBd,EAAQ,QAAQ,CACrG,CACD,CAAC,EACF,KACA,OAAC,KAAE,MAAOU,EACR,SAAAX,EAAE,gBAAiB,CACnB,OAAQA,EACPC,EAAQ,SAAW,OAAY,2BAA6Be,GAA0Bf,EAAQ,MAAM,CACrG,CACD,CAAC,EACF,EACCM,IAAc,OAAY,QAAO,OAAC,KAAE,MAAOM,EAAY,SAAAb,EAAE,wBAAyB,CAAE,KAAMO,CAAU,CAAC,EAAE,EACvGE,IAAoB,OAAY,QAChC,OAAC,KAAE,MAAOI,EAAY,SAAAb,EAAE,uBAAwB,CAAE,KAAMS,CAAgB,CAAC,EAAE,EAE3ER,EAAQ,SAAS,SAAW,EAAI,QAChC,OAAC,MAAG,MAAO,CAAE,GAAGgB,GAAW,IAAK,CAAE,EAAG,aAAYjB,EAAE,iBAAiB,EAClE,SAAAC,EAAQ,SAAS,IAAKiB,MACtB,OAAC,MAAiB,MAAOL,EACvB,SAAAK,GADOA,CAET,CACA,EACF,EAEAjB,EAAQ,4BACR,QAAC,SAAM,MAAOkB,GACb,oBAAC,SACA,mBAAkB,sCAAsClB,EAAQ,IAAI,GACpE,KAAK,WACL,QAASC,EACT,SAAUC,GAAeF,EAAQ,SAAW,UAC5C,SAAWmB,GAAU,CACpBhB,EAAyBgB,EAAM,OAAO,OAAO,CAC9C,EACD,KACA,QAAC,QACC,UAAApB,EAAE,yBAAyB,KAC5B,OAAC,QAAK,GAAI,sCAAsCC,EAAQ,IAAI,GAAI,MAAO,CAAE,QAAS,QAAS,GAAGY,CAAU,EACtG,SAAAb,EAAE,6BAA6B,EACjC,GACD,GACD,EACG,QACJ,QAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,SAAU,OAAQ,IAAK,CAAE,EACvD,oBAAC,UACA,KAAK,SACL,MAAOqB,EACP,SACClB,GAAeF,EAAQ,SAAW,WAAcA,EAAQ,0BAA4B,CAACC,EAEtF,QAASG,EAER,SAAAL,EAAE,eAAe,EACnB,KACA,OAAC,UAAO,KAAK,SAAS,MAAOsB,EAAa,SAAUnB,EAAa,QAASG,EACxE,SAAAN,EAAE,sBAAsB,EAC1B,GACD,GACD,CAEF,CCjHA,IAAAuB,GAA0B,iBAwBxB,IAAAC,GAAA,6BAbK,SAASC,GAAa,CAAE,QAAAC,EAAS,aAAAC,EAAc,UAAAC,EAAW,WAAAC,EAAY,KAAAC,EAAO,MAAO,EAAsB,CAChH,uBAAU,IAAM,CACf,GAAID,IAAe,QAAaD,IAAc,OAAW,OACzD,IAAMG,EAAQ,OAAO,WAAWH,EAAWC,CAAU,EACrD,MAAO,IAAM,CACZ,OAAO,aAAaE,CAAK,CAC1B,CACD,EAAG,CAACF,EAAYD,CAAS,CAAC,KAMzB,SAAC,OACA,MAAO,CACN,GAAGI,GACH,QAAS,OACT,WAAY,aACZ,eAAgB,gBAChB,IAAK,GACL,WAAY,aAVdF,IAAS,UAAY,kDAAoD,yCAUnC,EACrC,EACA,KAAK,SAEL,qBAAC,KAAE,MAAO,CAAE,GAAGG,EAAW,OAAQ,EAAG,MAAO,gCAAiC,EAAI,SAAAP,EAAQ,EACxFE,IAAc,QAAaD,IAAiB,OAAY,QACxD,QAAC,UAAO,KAAK,SAAS,MAAOO,EAAa,QAASN,EACjD,SAAAD,EACF,GAEF,CAEF,CC3CA,IAAAQ,EAAqD,iBCArD,IAAAC,GAAyD,iBA2CvD,IAAAC,GAAA,6BA9BK,SAASC,GAAW,CAC1B,KAAAC,EACA,UAAAC,EACA,YAAAC,EACA,YAAAC,EACA,QAAAC,EAAU,GACV,SAAAC,EAAW,EACZ,EAAoB,CACnB,GAAM,CAACC,EAAOC,CAAQ,KAAI,aAAuC,MAAM,EACjEC,KAAW,WAA2B,MAAS,KAErD,cAAU,IACF,IAAM,CACRA,EAAS,UAAY,QAAW,OAAO,aAAaA,EAAS,OAAO,CACzE,EACE,CAAC,CAAC,EAEL,IAAMC,KAAc,gBAAY,SAAY,CAC3C,IAAMC,EAAK,MAAMC,GAASX,CAAI,EAC9BO,EAASG,EAAK,SAAW,QAAQ,EAC7BF,EAAS,UAAY,QAAW,OAAO,aAAaA,EAAS,OAAO,EACxEA,EAAS,QAAU,OAAO,WAAW,IAAM,CAC1CD,EAAS,MAAM,EACfC,EAAS,QAAU,MACpB,EAAG,GAAI,CACR,EAAG,CAACR,CAAI,CAAC,EAEHY,EAAQN,IAAU,SAAWJ,EAAcI,IAAU,SAAWH,EAAcF,EAEpF,SACC,QAAC,UACA,KAAK,SACL,MAAOG,EAAUS,EAAqBC,GACtC,SAAUT,GAAYL,EAAK,SAAW,EACtC,QAAS,IAAM,CACTS,EAAY,CAClB,EAEC,SAAAG,EACF,CAEF,CCjCI,IAAAG,GAAA,6BAZJ,SAASC,GAASC,EAAyB,CAC1C,OAAIA,GAAW,GAAW,gDACtBA,GAAW,GAAW,+CAEnB,4EACR,CAEO,SAASC,GAAY,CAAE,MAAAC,EAAO,MAAAC,EAAO,KAAAC,CAAK,EAAqB,CACrE,IAAMC,EAAU,KAAK,IAAI,EAAG,KAAK,IAAI,IAAKH,CAAK,CAAC,EAChD,SACC,SAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,cAAe,SAAU,IAAK,CAAE,EAC7D,UAAAC,IAAU,OAAY,QACtB,SAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,eAAgB,gBAAiB,IAAK,EAAG,SAAU,MAAO,EACxF,qBAAC,QAAK,MAAO,CAAE,GAAGG,EAAW,MAAO,gCAAiC,EAAI,SAAAH,EAAM,EAC9EC,IAAS,OAAY,QAAO,QAAC,QAAK,MAAOE,EAAY,SAAAF,EAAK,GAC5D,KAED,QAAC,OACA,KAAK,cACL,gBAAeC,EACf,gBAAe,EACf,gBAAe,IACf,MAAO,CACN,OAAQ,EACR,aAAc,EACd,WAAY,6BACZ,SAAU,QACX,EAEA,oBAAC,OACA,MAAO,CACN,MAAO,GAAG,OAAOA,CAAO,CAAC,IACzB,OAAQ,OACR,aAAc,EACd,WAAYN,GAASM,CAAO,EAC5B,WAAY,uCACb,EACD,EACD,GACD,CAEF,CFgCG,IAAAE,EAAA,6BAnBH,SAASC,GAAY,CACpB,EAAAC,EACA,aAAAC,EACA,SAAAC,EACA,IAAAC,EACA,aAAAC,CACD,EAMG,CACF,IAAMC,EAAUH,IAAa,QAAaA,EAAS,OAAS,EACtDI,EAASH,IAAQ,QAAaA,EAAI,OAAS,EAC3CI,EAAaN,IAAiB,SAEpC,SACC,QAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,cAAe,SAAU,IAAK,EAAG,EAC/D,qBAAC,OAAI,MAAOK,EAASE,GAAkBC,GACtC,oBAAC,QAAK,MAAOH,EAASI,GAAwBC,GAAiB,cAAY,OAAO,aAElF,KACA,OAAC,QAAM,SAAAX,EAAE,gBAAgB,EAAE,GAC5B,EACCM,KACA,QAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,SAAU,OAAQ,IAAK,EAAG,YAAa,EAAG,EACxE,oBAAC,KAAE,KAAMH,EAAK,OAAO,SAAS,IAAI,aAAa,MAAOS,EACpD,SAAAZ,EAAE,aAAa,EACjB,KACA,OAACa,GAAA,CAAW,KAAMV,EAAK,UAAWH,EAAE,MAAM,EAAG,YAAaA,EAAE,QAAQ,EAAG,YAAaA,EAAE,YAAY,EAAG,GACtG,EACG,KACHI,GAAgBE,KAAS,OAAC,KAAE,MAAOQ,EAAY,SAAAd,EAAE,cAAc,EAAE,EAAO,KACxEK,KACA,oBACC,qBAAC,OAAI,MAAOG,GACX,oBAAC,QAAK,MAAOE,GAAuB,cAAY,OAAO,aAEvD,KACA,OAAC,QAAM,SAAAV,EAAE,gBAAgB,EAAE,GAC5B,KACA,QAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,SAAU,OAAQ,WAAY,SAAU,IAAK,EAAG,YAAa,EAAG,EAC9F,oBAAC,QAAK,MAAOe,GAAY,SAAAb,EAAS,KAClC,OAACW,GAAA,CACA,KAAMX,EACN,UAAWF,EAAE,cAAc,EAC3B,YAAaA,EAAE,QAAQ,EACvB,YAAaA,EAAE,YAAY,EAC3B,QAAO,GACR,GACD,GACD,EACG,QACJ,QAAC,OAAI,MAAOQ,GACX,oBAAC,QAAK,MAAOE,GAAuB,cAAY,OAC9C,SAAAL,EAAU,EAAI,EAChB,KACA,QAAC,QAAK,MAAO,CAAE,QAAS,cAAe,WAAY,SAAU,IAAK,CAAE,EACnE,oBAAC,QACA,cAAY,OACZ,MAAO,CACN,MAAO,GACP,OAAQ,GACR,OAAQ,oDACR,eAAgB,cAChB,aAAc,MACd,UAAW,4CACZ,EACD,EACCL,EAAE,gBAAgB,GACpB,GACD,EACCO,KACA,OAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,cAAe,SAAU,IAAK,EAAG,YAAa,EAAG,EAC/E,mBAAC,KAAE,MAAOS,EAAY,SAAAhB,EAAEC,IAAiB,UAAY,uBAAyB,eAAe,EAAE,EAChG,EACG,MACL,CAEF,CAEO,SAASgB,GAAa,CAC5B,EAAAjB,EACA,WAAAkB,EACA,eAAAC,EACA,KAAAC,EACA,YAAAC,EACA,OAAAC,EACA,UAAAC,EACA,aAAAnB,EACA,SAAAoB,EACA,OAAAC,EACA,UAAAC,EACA,MAAAC,EACA,WAAAC,EACA,aAAAC,EACA,SAAAC,EACA,UAAAC,EACA,cAAAC,EACA,aAAAC,EACA,aAAAC,EACA,iBAAAC,EACA,gBAAAC,EACA,aAAAC,CACD,EAAsB,CACrB,GAAM,CAACC,EAAgBC,CAAiB,KAAI,YAAS,EAAK,EACpD,CAACC,GAAaC,EAAc,KAAI,YAAS,EAAE,EAC3C,CAACC,EAAeC,EAAgB,KAAI,YAAS,EAAK,EAClDC,MAAgB,UAA0B,IAAI,EAC9CC,KAAsB,UAA0B,IAAI,EACpDC,MAAqB,UAAO,EAAK,EAEjCC,GAAUC,GAAoB9B,EAAYI,CAAM,EAChD2B,EAA6BF,GAAQ,CAAC,GAAK7B,EAAW,YACtDgC,EAAaH,GAAQ,OAAQI,GAAWA,IAAWF,CAAa,EAEhEG,GACLjC,EAAe,SAAW,YACvBnB,EAAE,UAAU,EACZmB,EAAe,SAAW,aACzBnB,EAAE,WAAW,EACbmB,EAAe,SAAW,QACzBnB,EAAE,eAAe,EACjBA,EAAE,WAAW,EACbC,GAAekB,EAAe,SAAW,aAAeA,EAAe,OAAS8B,EAChF,CAAE,UAAAI,EAAW,SAAAC,EAAS,KAAI,WAAQ,IAAMC,GAAYpC,CAAc,EAAG,CAACA,CAAc,CAAC,EACrF,CAACqC,EAAYC,CAAa,KAAI,YAAmBH,EAAQ,KAC/D,aAAU,IAAM,CACfG,EAAcH,EAAQ,CACvB,EAAG,CAACA,EAAQ,CAAC,KACb,aAAU,IAAM,CACXnC,EAAe,SAAW,aAAawB,GAAiB,EAAK,CAClE,EAAG,CAACxB,EAAe,MAAM,CAAC,KAC1B,aAAU,IAAM,CACf,GAAIuB,EAAe,CAClBG,EAAoB,SAAS,MAAM,EACnC,MACD,CACA,GAAKC,GAAmB,QAExB,IADAA,GAAmB,QAAU,GACzB3B,EAAe,SAAW,YAAa,CAC1CyB,GAAc,SAAS,MAAM,EAC7B,MACD,CACA,SAAS,eAAe,sBAAsB1B,EAAW,IAAI,EAAE,GAAG,MAAM,EACzE,EAAG,CAACA,EAAW,KAAMwB,EAAevB,EAAe,MAAM,CAAC,EAC1D,IAAMuC,GACLF,EAAW,SAAWF,GAAS,QAAUE,EAAW,KAAK,CAACG,EAAOC,IAAUD,IAAUL,GAASM,CAAK,CAAC,EAC/FC,GAAqB3C,EAAW,OAAS,OAAUC,EAAgC,OACnF2C,GAAmBC,GAA8BtC,CAAM,EAEvDuC,MAAiB,WAAQ,IAAM,CACpC,IAAMC,EAAQzB,GAAY,KAAK,EAAE,YAAY,EAC7C,OAAIyB,EAAM,SAAW,EAAUZ,EACxBA,EAAU,OAAQa,GAAOA,EAAG,YAAY,EAAE,SAASD,CAAK,CAAC,CACjE,EAAG,CAACZ,EAAWb,EAAW,CAAC,EAErB2B,EACLjD,EAAW,OAAS,SAAWQ,EAC5BC,GAAO,6BAA+B,OACrCA,GAAO,WAAW,CAAC,GAAG,QAAQ,CAAC,GAAG,YAClC,IAAMA,EAAM,2BACb,OACEyC,GAAYC,GAAY1C,GAAO,SAAS,EAE9C,SACC,QAAC,OAAI,MAAO2C,GACX,qBAAC,OAAI,MAAOC,GACX,qBAAC,OACA,oBAAC,MAAG,MAAO,CAAE,GAAGC,EAAY,SAAU,EAAG,EAAI,SAAAxE,EAAEkB,EAAW,QAAQ,EAAE,EACnEC,EAAe,SAAW,aAAe,CAACK,KAC1C,QAAC,KAAE,MAAO,CAAE,GAAGV,EAAW,UAAW,CAAE,EACrC,UAAAd,EAAE,gBAAiB,CAAE,SAAUsD,GAAS,OAAQ,MAAOD,EAAU,MAAO,CAAC,EACzEc,IAAiB,OAAY,GAAK,SAAMnE,EAAE,iBAAkB,CAAE,MAAO,GAAG,OAAOmE,CAAY,CAAC,GAAI,CAAC,CAAC,IACpG,KAEA,oBACC,oBAAC,KAAE,MAAO,CAAE,GAAGnD,EAAW,UAAW,CAAE,EAAI,SAAAhB,EAAEkB,EAAW,cAAc,EAAE,KACxE,OAAC,KAAE,MAAO,CAAE,GAAGF,EAAW,UAAW,CAAE,EACtC,mBAAC,QAAK,MAAOyD,GAAY,SAAAvD,EAAW,MAAM,EAC3C,GACD,GAEF,KACA,OAACwD,GAAA,CAAM,MAAOtB,GAAa,eAAgBjC,EAAe,OAAQ,GACnE,KACA,OAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,SAAU,OAAQ,IAAK,CAAE,EACtD,SAAAA,EAAe,SAAW,eAC1B,oBACE,UAAAuB,KACA,QAAC,YAAS,MAAO,CAAE,GAAGiC,GAAa,OAAQ,EAAG,SAAU,CAAE,EACzD,oBAAC,UAAO,MAAOC,GAAsB,SAAA5E,EAAE,oBAAoB,EAAE,KAC7D,OAAC,KAAE,MAAOgB,EAAY,SAAAhB,EAAE,mBAAmB,EAAE,KAC7C,QAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,SAAU,OAAQ,IAAK,CAAE,EACvD,oBAAC,UACA,IAAK6C,EACL,KAAK,SACL,MAAOjC,EACP,SAAUQ,EACV,QAAS,IAAM,CACd0B,GAAmB,QAAU,GAC7Bf,EAAU,CACX,EAEC,SAAO/B,EAAPoB,EAAS,UAAe,qBAAN,EACpB,KACA,OAAC,UACA,KAAK,SACL,MAAOyD,EACP,SAAUzD,EACV,QAAS,IAAM,CACd0B,GAAmB,QAAU,GAC7BH,GAAiB,EAAK,CACvB,EAEC,SAAA3C,EAAE,QAAQ,EACZ,GACD,GACD,KAEA,OAAC,UACA,IAAK4C,GACL,KAAK,SACL,MAAOiC,EACP,SAAUzD,EACV,QAAS,IAAMuB,GAAiB,EAAI,EAEnC,SAAA3C,EAAE,QAAQ,EACZ,KAED,OAAC,UACA,GAAI,8BAA8BkB,EAAW,IAAI,GACjD,KAAK,SACL,MAAO2D,EACP,gBAAerD,EACf,gBAAeA,EAAW,uBAAuBN,EAAW,IAAI,GAAK,OACrE,QAASiB,EAER,SAAWnC,EAAXwB,EAAa,iBAAsB,cAAN,EAC/B,EACCC,GAAQ,YAAc,MACtB,OAAC,UACA,GAAI,4BAA4BP,EAAW,IAAI,GAC/C,KAAK,SACL,MAAO2D,EACP,SAAUxD,EACV,QAASe,EAER,SAAApC,EAAE,iBAAiB,EACrB,EACG,MACL,EACGmB,EAAe,SAAW,gBAC7B,oBACC,oBAAC,UAAO,KAAK,SAAS,MAAO0D,EAAa,SAAUzD,EAAM,QAASY,EACjE,SAAAhC,EAAE,aAAa,EACjB,EACCkD,EAAW,OAAS,KACpB,OAAC,UACA,KAAK,SACL,MAAO4B,GACP,SAAU1D,EACV,QAAS,IAAM,CACdmB,EAAmBwC,GAAY,CAACA,CAAO,CACxC,EAEC,SAAiB/E,EAAjBsC,EAAmB,wBAA6B,mBAAN,EAC5C,EACG,KACHA,EACEY,EAAW,IAAKC,MAChB,OAAC,UAEA,KAAK,SACL,MAAO2B,GACP,SAAU1D,EACV,QAAS,IAAM,CACdU,EAASqB,CAAM,CAChB,EAEC,SAAA6B,GAAY7B,EAAQnD,EAAG,CAAE,OAAAsB,EAAQ,QAAS,EAAM,CAAC,GAR7C6B,CASN,CACA,EACA,MACJ,KAEA,oBACC,oBAAC,UACA,GAAI,sBAAsBjC,EAAW,IAAI,GACzC,KAAK,SACL,MAAON,EACP,SAAUQ,EACV,QAAS,IAAM,CACdU,EAASmB,CAAa,CACvB,EAEC,SAAA7B,EAAOpB,EAAE,SAAS,EAAIgF,GAAY/B,EAAejD,EAAG,CAAE,OAAAsB,EAAQ,QAAS,EAAK,CAAC,EAC/E,EACC4B,EAAW,OAAS,KACpB,OAAC,UACA,KAAK,SACL,MAAO4B,GACP,SAAU1D,EACV,QAAS,IAAM,CACdmB,EAAmBwC,GAAY,CAACA,CAAO,CACxC,EAEC,SAAiB/E,EAAjBsC,EAAmB,wBAA6B,mBAAN,EAC5C,EACG,KACHA,EACEY,EAAW,IAAKC,MAChB,OAAC,UAEA,KAAK,SACL,MAAO2B,GACP,SAAU1D,EACV,QAAS,IAAM,CACdU,EAASqB,CAAM,CAChB,EAEC,SAAA6B,GAAY7B,EAAQnD,EAAG,CAAE,OAAAsB,EAAQ,QAAS,EAAM,CAAC,GAR7C6B,CASN,CACA,EACA,KACF1B,GAAQ,YAAc,MACtB,OAAC,UACA,GAAI,4BAA4BP,EAAW,IAAI,GAC/C,KAAK,SACL,MAAO2D,EACP,SAAUxD,EACV,QAASe,EAER,SAAApC,EAAE,iBAAiB,EACrB,EACG8D,IAAoBrC,GAAQ,SAAW,UAC1C,OAAC,QAAK,MAAOX,EAAY,SAAAd,EAAEiF,GAAkBxD,EAAO,MAAM,CAAC,EAAE,EAC1D,MACL,EAEF,EACCN,EAAe,SAAW,WAC1B,OAAC,KAAE,MAAO,CAAE,GAAGH,EAAW,MAAO,sCAAuC,EAAI,SAAAG,EAAe,QAAQ,EAChG,KACHA,EAAe,SAAW,gBAC1B,OAACpB,GAAA,CACA,EAAGC,EACH,aAAcC,GACd,SAAUkB,EAAe,SACzB,IAAKA,EAAe,IACpB,aAAcf,EACf,EACG,KACHe,EAAe,SAAW,cAAgBlB,KAAiB,YAC3D,OAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,cAAe,SAAU,IAAK,CAAE,EAC9D,oBAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,SAAU,OAAQ,IAAK,CAAE,EACvD,oBAAC,SAAM,QAAS,qBAAqBiB,EAAW,IAAI,GAAI,MAAO0D,GAC7D,SAAA5E,EAAE,gBAAgB,EACpB,KACA,OAAC,SACA,GAAI,qBAAqBkB,EAAW,IAAI,GACxC,MAAO,CAAE,GAAGgE,GAAY,KAAM,WAAY,EAC1C,MAAO3D,EACP,YAAavB,EAAE,sBAAsB,EACrC,SAAUoB,EACV,SAAW+D,GAAU,CACpBjD,EAAaiD,EAAM,OAAO,KAAK,CAChC,EACA,UAAYA,GAAU,CACjBA,EAAM,MAAQ,UACjBA,EAAM,eAAe,EACrBlD,EAAa,EAEf,EACD,KACA,OAAC,UACA,KAAK,SACL,MAAOrB,EACP,SAAUQ,GAAQG,EAAU,KAAK,EAAE,SAAW,EAC9C,QAASU,EAER,SAAAjC,EAAE,YAAY,EAChB,GACD,EACD,EACG,KACHmB,EAAe,SAAW,aAAeK,KACzC,QAAC,OAAI,GAAI,uBAAuBN,EAAW,IAAI,GAAI,MAAO,CAAE,QAAS,OAAQ,cAAe,SAAU,IAAK,CAAE,EAC5G,qBAAC,OAAI,MAAOqD,GACX,oBAAC,MAAG,MAAO,CAAE,GAAGC,EAAY,SAAU,EAAG,EAAI,SAAAxE,EAAE,QAAQ,EAAE,KACzD,QAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,SAAU,OAAQ,IAAK,CAAE,EACvD,oBAAC,UACA,KAAK,SACL,MAAO8E,GACP,SAAU1D,EACV,QAAS,IAAM,CACdqC,EAAc,CAAC,CAAC,CACjB,EAEC,SAAAzD,EAAE,aAAa,EACjB,KACA,OAAC,UACA,KAAK,SACL,MAAO8E,GACP,SAAU1D,EACV,QAAS,IAAM,CACdqC,EAAc,CAAC,GAAGJ,CAAS,CAAC,CAC7B,EAEC,SAAArD,EAAE,WAAW,EACf,KACA,OAAC,UACA,KAAK,SACL,MAAO8E,GACP,SAAU1D,EACV,QAAS,IAAM,CACdqC,EAAcJ,EAAU,OAAS,EAAI,CAACA,EAAU,CAAC,CAAE,EAAI,CAAC,CAAC,CAC1D,EAEC,SAAArD,EAAE,oBAAoB,EACxB,GACD,GACD,KACA,OAAC,SAAM,QAAS,6BAA6BkB,EAAW,IAAI,GAAI,MAAO0D,GACrE,SAAA5E,EAAE,mBAAoB,CAAE,SAAUA,EAAEkB,EAAW,QAAQ,CAAE,CAAC,EAC5D,KACA,OAAC,SACA,GAAI,6BAA6BA,EAAW,IAAI,GAChD,KAAK,SACL,MAAOgE,GACP,MAAO1C,GACP,YAAaxC,EAAE,wBAAwB,EACvC,SAAUoB,EACV,SAAW+D,GAAU,CACpB1C,GAAe0C,EAAM,OAAO,KAAK,CAClC,EACD,EACCtB,IAAoB,SAAW,eAC/B,OAAC,KAAE,MAAO7C,EACR,SAAA6C,GAAmB,gBAAkB,OACnC7D,EAAE,aAAa,EACf6D,GAAmB,gBAAkB,QACpC7D,EAAE,cAAc,EAChBA,EAAE,iBAAiB,EACxB,EACG,QACJ,QAAC,KAAE,MAAOgB,EACR,UAAAhB,EAAE,WAAW,EAAE,OAAC,QAAC,QAAK,MAAOyE,GAAY,UAAAvD,EAAW,MAAM,SAAW,GACvE,KACA,OAAC,MAAG,MAAOkE,GACT,SAAApB,GAAe,IAAKE,GAAO,CAC3B,IAAMmB,EAAU7B,EAAW,SAASU,CAAE,EACtC,SACC,OAAC,MACA,oBAAC,SAAM,MAAOoB,GACb,oBAAC,SACA,KAAK,WACL,QAASD,EACT,SAAUjE,EACV,SAAU,IAAM,CACf,IAAM2D,GAAU,IAAI,IAAIvB,CAAU,EAC9B6B,EAASN,GAAQ,OAAOb,CAAE,EACzBa,GAAQ,IAAIb,CAAE,EACnBT,EAAc,CAAC,GAAGJ,CAAS,EAAE,OAAQM,IAAUoB,GAAQ,IAAIpB,EAAK,CAAC,CAAC,CACnE,EACD,KACA,OAAC,QAAK,MAAOc,GAAY,SAAAP,EAAG,GAC7B,GAdQA,CAeT,CAEF,CAAC,EACF,KACA,QAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,SAAU,OAAQ,WAAY,SAAU,IAAK,CAAE,EAC7E,oBAAC,UACA,KAAK,SACL,MAAOtD,EACP,SAAUQ,GAAQ,CAACsC,GACnB,QAAS,IAAMrB,EAAamB,CAAU,EAErC,SAAOxD,EAAPoB,EAAS,UAAe,iBAAN,EACpB,EACCsC,MAAkB,OAAC,QAAK,MAAO5C,EAAY,SAAAd,EAAE,mBAAmB,EAAE,EAAU,MAC9E,EACCgE,GAAe,SAAW,KAAI,OAAC,KAAE,MAAOlD,EAAY,SAAAd,EAAE,wBAAwB,EAAE,EAAO,KACvF6D,IAAoB,SAAW,aAAeA,GAAmB,eAAiB,UAClF,OAAC,KAAE,MAAO,CAAE,GAAG7C,EAAW,MAAO,sCAAuC,EAAI,SAAAhB,EAAE,cAAc,EAAE,EAC3F,KACHkB,EAAW,OAAS,SAAWQ,KAC/B,QAAC,OAAI,MAAOiD,GACX,oBAAC,KAAE,MAAO,CAAE,GAAG3D,EAAW,MAAO,gCAAiC,EAAI,SAAAhB,EAAE,YAAY,EAAE,EACrF4B,IAAe,OAAY,QAC3B,OAAC,KAAE,MAAO,CAAE,GAAGZ,EAAW,MAAO,sCAAuC,EAAG,KAAK,QAC9E,SAAAY,EACF,EAEAC,GAAgBF,IAAU,UAC1B,OAAC,KAAE,MAAOb,EAAY,SAAAd,EAAE,cAAc,EAAE,EACrC2B,IAAU,QAAa,CAAC4D,GAAsB5D,CAAK,KACtD,OAAC,KAAE,MAAOb,EAAY,SAAAd,EAAE,YAAY,EAAE,KAEtC,oBACE,UAAAoE,KAAc,OAAY,QAAO,OAAC,KAAE,MAAOtD,EAAY,SAAAd,EAAE,iBAAkB,CAAE,KAAMoE,EAAU,CAAC,EAAE,EAChGD,IAAiB,UACjB,OAACqB,GAAA,CACA,MAAOrB,EACP,MAAOnE,EAAE,gBAAgB,EACzB,KAAMA,EAAE,YAAa,CAAE,MAAO,GAAG,OAAOmE,CAAY,CAAC,GAAI,CAAC,EAC3D,EACG,KACHxC,EAAM,WAAW,IAAK8D,GAAU,CAChC,IAAMC,EAASD,EAAM,QAAQ,CAAC,EACxBE,GAAOD,GAAQ,YACfE,GAAWvB,GAAYqB,GAAQ,QAAQ,EAC7C,SACC,OAAC,OAAmB,MAAO,CAAE,QAAS,OAAQ,cAAe,SAAU,IAAK,CAAE,EAC5E,SAAAC,KAAS,UACT,OAAC,KAAE,MAAO7E,EAAY,SAAA2E,EAAM,MAAQzF,EAAE,gBAAgB,EAAE,KAExD,OAACwF,GAAA,CACA,MAAOG,GACP,MAAOF,EAAM,MAAQzF,EAAE,gBAAgB,EACvC,KACC4F,KAAa,OACV5F,EAAE,YAAa,CAAE,MAAO,GAAG,OAAO2F,EAAI,CAAC,GAAI,CAAC,EAC5C,GAAG3F,EAAE,YAAa,CAAE,MAAO,GAAG,OAAO2F,EAAI,CAAC,GAAI,CAAC,CAAC,SAAM3F,EAAE,cAAe,CAAE,KAAM4F,EAAS,CAAC,CAAC,GAE/F,GAZQH,EAAM,EAchB,CAEF,CAAC,GACF,GAEF,EACG,MACL,EACG,MACL,CAEF,CNzeI,IAAAI,EAAA,6BAlDG,SAASC,GAAY,CAC3B,EAAAC,EACA,OAAAC,EACA,OAAAC,EACA,mBAAAC,EACA,mBAAAC,EACA,QAAAC,EACA,aAAAC,EACA,cAAAC,EACA,YAAAC,EACA,QAAAC,EACA,iBAAAC,EACA,aAAAC,EACA,WAAAC,EACA,aAAAC,EACA,kBAAAC,EACA,UAAAC,EACA,MAAAC,EACA,WAAAC,EACA,aAAAC,EACA,SAAAC,EACA,UAAAC,EACA,cAAAC,EACA,aAAAC,EACA,aAAAC,EACA,iBAAAC,GACA,gBAAAC,GACA,aAAAC,EACA,yBAAAC,GACA,eAAAC,GACA,sBAAAC,EACA,iBAAAC,GACA,uBAAAC,EACD,EAAqB,CACpB,IAAMC,KAAsB,WAAiC,MAAS,EAatE,SAZA,cAAU,IAAM,CACf,GAAIvB,IAAY,OAAW,CAC1BuB,EAAoB,QAAUvB,EAAQ,KACtC,SAAS,eAAe,+BAA+BA,EAAQ,IAAI,EAAE,GAAG,MAAM,EAC9E,MACD,CACA,IAAMwB,EAAUD,EAAoB,QAChCC,IAAY,QAAazB,IAC7BwB,EAAoB,QAAU,OAC9B,SAAS,eAAe,4BAA4BC,CAAO,EAAE,GAAG,MAAM,EACvE,EAAG,CAACxB,EAASD,CAAW,CAAC,EAErBP,IAAW,UAEb,OAAC,OAAI,MAAOiC,GAAe,KAAK,SAAS,YAAU,OAClD,oBAAC,OAAI,MAAOC,GACX,oBAAC,QAAK,cAAY,OAAO,MAAOC,GAAS,SAAS,EAAG,EACpDpC,EAAE,gBAAgB,GACpB,EACD,KAKD,oBACE,UAAAE,GAAU,CAACC,KACX,OAACkC,GAAA,CACA,QAASrC,EAAE,mBAAmB,EAC9B,aAAcA,EAAE,kBAAkB,EAClC,UAAWI,EACZ,EACG,KACHkC,GAAsBjC,CAAO,KAC7B,OAACgC,GAAA,CACA,QAASrC,EAAE,uBAAuB,EAClC,aAAcA,EAAE,mBAAmB,EACnC,UAAW,IAAM,CAChB8B,GAAiB,CAClB,EACD,EACG,KACHS,GAAwBlC,CAAO,KAAI,OAAC,KAAE,MAAOmC,EAAY,SAAAxC,EAAE,sBAAsB,EAAE,EAAO,KAC1FM,IAAiB,OAAY,QAC7B,OAAC,KAAE,MAAO,CAAE,GAAGmC,EAAW,MAAO,sCAAuC,EAAG,KAAK,QAC9E,SAAAnC,EACF,EAEAC,IAAkB,OAAY,QAC9B,OAAC8B,GAAA,CAEA,QAAS9B,EACT,KAAK,UACL,WAAY,IACZ,UAAWwB,IAJNxB,CAKN,KAED,QAAC,OAAI,MAAOmC,GACV,UAAAC,GAAU,IAAKC,GAAe,CAC9B,IAAMC,GAAiB5C,EAAO,UAAU2C,EAAW,IAAI,EACjDE,GAAWD,GAAe,SAAW,cAAgB/B,EAAkB8B,EAAW,IAAI,IAAM,GAClG,SACC,QAAC,aACA,oBAACG,GAAA,CACA,EAAG/C,EACH,WAAY4C,EACZ,eAAgBC,GAChB,KAAMlC,IAAiBiC,EAAW,KAClC,YAAapC,EACb,OAAQN,EACR,UAAWU,EAAWgC,EAAW,IAAI,GAAK,GAC1C,aAAc/B,EAAa+B,EAAW,IAAI,IAAM,GAChD,SAAUE,GACV,OAAQzC,GAAS,KAAM2C,GAAUA,EAAM,OAASJ,EAAW,IAAI,EAC/D,UAAW7B,EACX,MAAOC,EACP,WAAYC,EACZ,aAAcC,EACd,SAAW+B,GAAW,CACrB9B,EAASyB,EAAW,KAAMK,CAAM,CACjC,EACA,UAAW,IAAM,CAChB7B,EAAUwB,EAAW,IAAI,CAC1B,EACA,cAAe,IAAM,CACpBvB,EAAcuB,EAAW,IAAI,CAC9B,EACA,aAAc,IAAM,CACnBtB,EAAasB,EAAW,IAAI,CAC7B,EACA,aAAeM,GAAU,CACxB3B,EAAaqB,EAAW,KAAMM,CAAK,CACpC,EACA,iBAAkB,IAAM,CACvB1B,GAAiBoB,EAAW,IAAI,CACjC,EACA,gBAAiB,IAAM,CACtBnB,GAAgBmB,EAAW,IAAI,CAChC,EACA,aAAeO,GAAa,CAC3BzB,EAAakB,EAAW,KAAMO,CAAQ,CACvC,EACD,EACC1C,GAAS,OAASmC,EAAW,QAC7B,OAAC,OAAI,MAAO,CAAE,WAAY,SAAU,SAAU,CAAE,EAC/C,mBAACQ,GAAA,CACA,EAAGpD,EACH,QAASS,EACT,iBAAkBC,EAClB,YAAaF,EACb,yBAA0BmB,GAC1B,SAAUC,GACV,SAAUC,EACX,EACD,EACG,OArDUe,EAAW,IAsD1B,CAEF,CAAC,KACD,QAAC,OAAI,MAAOS,GACX,qBAAC,OAAI,MAAOC,GACX,qBAAC,OACA,oBAAC,MAAG,MAAO,CAAE,GAAGC,EAAY,SAAU,EAAG,EAAI,SAAAvD,EAAE,kBAAkB,EAAE,KACnE,OAAC,KAAE,MAAO,CAAE,GAAGyC,EAAW,UAAW,CAAE,EAAI,SAAAzC,EAAE,wBAAwB,EAAE,KACvE,OAAC,KAAE,MAAO,CAAE,GAAGyC,EAAW,UAAW,CAAE,EACtC,mBAAC,QAAK,MAAOe,GAAY,SAAAvD,EAAO,YAAY,MAAM,EACnD,GACD,KACA,OAACwD,GAAA,CACA,MAAOxD,EAAO,YAAY,UAAYD,EAAE,sBAAsB,EAAIA,EAAE,oBAAoB,EACxF,KAAMC,EAAO,YAAY,UAAY,UAAY,UACjD,UAAWA,EAAO,YAAY,UAC/B,GACD,KACA,OAAC,KAAE,MAAOwC,EAAY,SAAAzC,EAAE,oBAAoB,EAAE,KAC9C,OAAC,QAAK,MAAO,CAAE,GAAGwD,GAAW,SAAU,GAAI,aAAc,UAAW,EAAI,SAAAxD,EAAE,uBAAuB,EAAE,GACpG,GACD,GACD,CAEF,CS7KG,IAAA0D,GAAA,6BApDGC,GAAa,CAACC,EAAkBC,KAAsC,CAC3E,SAAU,WACV,MAAO,GACP,OAAQ,GACR,aAAc,GACd,KAAM,WACN,WAAYD,EACT,uCACA,wDACH,QAASC,EAAW,GAAM,EAC1B,OAAQA,EAAW,cAAgB,UACnC,WAAYC,GACZ,OAAQ,OACR,QAAS,CACV,GAEMC,GAAcH,IAAqC,CACxD,SAAU,WACV,IAAK,EACL,KAAMA,EAAU,GAAK,EACrB,MAAO,GACP,OAAQ,GACR,aAAc,MAGd,WAAYA,EAAU,4CAA8C,wCACpE,UAAW,gCACX,WAAYE,EACb,GAEO,SAASE,GAAa,CAC5B,QAAAJ,EACA,SAAAC,EAAW,GACX,SAAAI,EACA,UAAAC,EACA,gBAAAC,EACA,GAAAC,CACD,EAAsB,CACrB,SACC,QAAC,UACA,GAAIA,EACJ,KAAK,SACL,KAAK,SACL,eAAcR,EACd,aAAYM,EACZ,mBAAkBC,EAClB,SAAUN,EACV,MAAOF,GAAWC,EAASC,CAAQ,EACnC,QAAS,IAAM,CACTA,GAAUI,EAAS,CAACL,CAAO,CACjC,EAEA,oBAAC,QAAK,cAAY,OAAO,MAAOG,GAAWH,CAAO,EAAG,EACtD,CAEF,CCVG,IAAAS,EAAA,6BAlBI,SAASC,GAAgB,CAC/B,EAAAC,EACA,aAAAC,EACA,kBAAAC,EACA,iBAAAC,EACA,QAAAC,EACA,aAAAC,EACA,cAAAC,EACA,QAAAC,EACA,eAAAC,EACA,kBAAAC,EACA,kBAAAC,CACD,EAAyB,CACxB,IAAMC,EAAeC,GAAmB,OAAQC,GAAS,CAACA,EAAK,IAAI,WAAW,aAAa,CAAC,EACtFC,EAAiBF,GAAmB,OAAQC,GAASA,EAAK,IAAI,WAAW,aAAa,CAAC,EAE7F,SACC,QAAC,WAAQ,MAAOE,GAAW,kBAAgB,kCAC1C,qBAAC,OACA,oBAAC,MAAG,GAAG,kCAAkC,MAAO,CAAE,GAAGC,EAAY,SAAU,EAAG,EAC5E,SAAAhB,EAAE,mBAAmB,EACvB,KACA,OAAC,KAAE,MAAO,CAAE,GAAGiB,EAAW,UAAW,CAAE,EAAI,SAAAjB,EAAE,mBAAmB,EAAE,GACnE,EACCK,IAAiB,OAAY,QAC7B,QAAC,OAAI,MAAOa,GAAa,KAAK,QAC7B,oBAAC,KAAE,MAAOC,GAAa,SAAAd,EAAa,KACpC,OAAC,UAAO,KAAK,SAAS,MAAOe,EAAa,QAASb,EACjD,SAAAP,EAAE,OAAO,EACX,GACD,EAEAI,IAAY,QAAaC,IAAiB,UAC1C,OAAC,OAAI,MAAOgB,GAAe,KAAK,SAAS,YAAU,OAClD,oBAAC,OAAI,MAAOC,GACX,oBAAC,QAAK,cAAY,OAAO,MAAOC,GAAS,SAAS,EAAG,EACpDvB,EAAE,gBAAgB,GACpB,EACD,EACGI,IAAY,OAAY,QAC3B,QAAC,OAAI,GAAG,kCAAkC,MAAOc,GAAa,SAAU,GACvE,oBAACM,GAAA,CACA,MAAOpB,EAAQ,WAAaJ,EAAE,mBAAmB,EAAIA,EAAE,sBAAsB,EAC7E,KAAMI,EAAQ,WAAa,UAAY,UACxC,KACA,OAAC,KAAE,MAAOqB,EAAY,SAAAzB,EAAE,gBAAiB,CAAE,OAAQ0B,GAAmBtB,EAAQ,OAAQJ,CAAC,CAAE,CAAC,EAAE,GAC7F,EAEAE,IAAsB,OAAY,QAClC,QAAC,OAAI,MAAOgB,GAAa,KAAK,QAC7B,oBAAC,KAAE,MAAOC,GAAa,SAAAjB,EAAkB,KACzC,OAAC,UAAO,KAAK,SAAS,MAAOkB,EAAa,QAASb,EACjD,SAAAP,EAAE,OAAO,EACX,GACD,EAEAC,IAAiB,QAAaC,IAAsB,UACpD,OAAC,OAAI,MAAOmB,GAAe,KAAK,SAAS,YAAU,OAClD,oBAAC,OAAI,MAAOC,GACX,oBAAC,QAAK,cAAY,OAAO,MAAOC,GAAS,SAAS,EAAG,EACpDvB,EAAE,qBAAqB,GACzB,EACD,EACGC,IAAiB,OAAY,QAChC,QAAC,YAAS,MAAO,CAAE,OAAQ,EAAG,OAAQ,EAAG,QAAS,EAAG,SAAU,CAAE,EAChE,oBAAC,UAAO,MAAO,CAAE,GAAGgB,EAAW,SAAU,WAAY,MAAO,EAAG,OAAQ,EAAG,SAAU,QAAS,EAC3F,SAAAjB,EAAE,mBAAmB,EACvB,EACCC,EAAa,SAAW,QAAO,OAAC,KAAE,MAAOwB,EAAY,SAAAzB,EAAE,sBAAsB,EAAE,KAChF,OAAC,MAAG,MAAO2B,GACT,SAAAhB,EAAa,IAAKE,GAAS,CAC3B,IAAMe,EAAU3B,EAAa,MAAMY,EAAK,GAAG,EACrCgB,EAAYhB,EAAK,iBAAmB,IAAQ,CAACZ,EAAa,MAAM,YAChE6B,EAAoBxB,EAEvBuB,EACC7B,EAAE,qBAAqB,EACvB,OAHDA,EAAE,qBAAqB,EAIpB+B,EAAW5B,GAAoB,CAACF,EAAa,UAAY6B,IAAqB,OAC9EE,EAAW,cAAcnB,EAAK,GAAG,GACjCoB,EAAgB3B,EAEnBuB,EACC,CAAE,MAAO7B,EAAE,kBAAkB,EAAG,OAAQ,IAAMS,EAAkB,aAAa,CAAE,EAC/E,OAHD,CAAE,MAAOT,EAAE,kBAAkB,EAAG,OAAQ,IAAMQ,EAAe,OAAO,CAAE,EAIzE,SACC,OAAC,MAEA,MAAO,CACN,QAASsB,IAAqB,OAAY,EAAI,IAC9C,WAAY,oBACb,EAEA,oBAAC,OAAI,MAAO,CAAE,GAAGI,GAAU,WAAY,YAAa,EACnD,qBAAC,SAAM,QAASF,EAAU,MAAO,CAAE,KAAM,YAAa,OAAQD,EAAW,UAAY,SAAU,EAC9F,oBAAC,QAAK,MAAO,CAAE,QAAS,QAAS,SAAU,GAAI,MAAO,gCAAiC,EACrF,SAAA/B,EAAEa,EAAK,KAAK,EACd,KACA,OAAC,QAAK,GAAI,YAAYA,EAAK,GAAG,GAAI,MAAO,CAAE,QAAS,QAAS,GAAGY,CAAU,EACxE,SAAAK,GAAoB9B,EAAEa,EAAK,IAAI,EACjC,GACD,EACCoB,IAAiB,OAAY,QAC7B,OAAC,UAAO,KAAK,SAAS,MAAOb,EAAa,QAASa,EAAa,OAC9D,SAAAA,EAAa,MACf,KAED,OAACE,GAAA,CACA,GAAIH,EACJ,QAASJ,EACT,SAAUG,EACV,UAAW/B,EAAEa,EAAK,KAAK,EACvB,gBAAiB,YAAYA,EAAK,GAAG,GACrC,SAAWuB,GAAS,CACd1B,EAAkBG,EAAK,IAAKuB,CAAI,CACtC,EACD,GACD,GA9BKvB,EAAK,GA+BX,CAEF,CAAC,EACF,KACA,OAAC,MAAG,MAAO,CAAE,GAAGG,EAAY,SAAU,EAAG,EAAI,SAAAhB,EAAE,cAAc,EAAE,KAC/D,OAAC,MAAG,MAAO2B,GACT,SAAAb,EAAe,IAAKD,GAAS,CAC7B,IAAMe,EAAU3B,EAAa,MAAMY,EAAK,GAAG,EACrCiB,EAAmB1B,GAAS,aAAe,GAAO,OAAYJ,EAAE,2BAA2B,EAC3F+B,EAAW5B,GAAoB,CAACF,EAAa,UAAY6B,IAAqB,OAC9EE,EAAW,cAAcnB,EAAK,GAAG,GACvC,SACC,OAAC,MACA,oBAAC,OAAI,MAAO,CAAE,GAAGqB,GAAU,WAAY,YAAa,EACnD,qBAAC,SAAM,QAASF,EAAU,MAAO,CAAE,KAAM,YAAa,OAAQD,EAAW,UAAY,SAAU,EAC9F,oBAAC,QAAK,MAAO,CAAE,QAAS,QAAS,SAAU,GAAI,MAAO,gCAAiC,EACrF,SAAA/B,EAAEa,EAAK,KAAK,EACd,KACA,OAAC,QAAK,GAAI,YAAYA,EAAK,GAAG,GAAI,MAAO,CAAE,QAAS,QAAS,GAAGY,CAAU,EACxE,SAAAK,GAAoB9B,EAAEa,EAAK,IAAI,EACjC,GACD,EACCiB,IAAqB,OAAY,QACjC,OAAC,UAAO,KAAK,SAAS,MAAOV,EAAa,QAAS,IAAMX,EAAkB,mBAAmB,EAC5F,SAAAT,EAAE,wBAAwB,EAC5B,KAED,OAACmC,GAAA,CACA,GAAIH,EACJ,QAASJ,EACT,SAAUG,EACV,UAAW/B,EAAEa,EAAK,KAAK,EACvB,gBAAiB,YAAYA,EAAK,GAAG,GACrC,SAAWuB,GAAS,CACd1B,EAAkBG,EAAK,IAAKuB,CAAI,CACtC,EACD,GACD,GAzBQvB,EAAK,GA0Bd,CAEF,CAAC,EACF,KACA,QAAC,OAAI,MAAOK,GACX,oBAAC,MAAG,MAAO,CAAE,GAAGF,EAAY,SAAU,EAAG,EAAI,SAAAhB,EAAE,uBAAuB,EAAE,KACxE,OAAC,KAAE,MAAOyB,EAAY,SAAAzB,EAAE,sBAAsB,EAAE,KAChD,OAAC,MAAG,MAAO2B,GACT,SAAAU,GAAkB,IAAKxB,GAAS,CAChC,IAAMyB,EAAerC,EAAa,MAAMY,EAAK,GAAG,EAAIA,EAAK,MACnD0B,EAAU,aAAa1B,EAAK,GAAG,GACrC,SACC,QAAC,MAAkB,MAAOqB,GACzB,qBAAC,SAAM,QAASK,EAAS,MAAO,CAAE,GAAGtB,EAAW,KAAM,WAAY,EACjE,oBAAC,QAAK,MAAO,CAAE,QAAS,QAAS,MAAO,gCAAiC,EAAI,SAAAjB,EAAEa,EAAK,KAAK,EAAE,KAC3F,OAAC,QAAK,GAAI,GAAG0B,CAAO,QAAS,MAAO,CAAE,QAAS,QAAS,GAAGd,CAAU,EACnE,SAAAzB,EAAEa,EAAK,IAAI,EACb,GACD,KACA,OAAC,SAEA,GAAI0B,EACJ,KAAK,SACL,UAAU,UACV,IAAK1B,EAAK,IACV,IAAKA,EAAK,IACV,KAAM,EACN,aAAcyB,EACd,SAAUnC,GAAoB,CAACF,EAAa,SAC5C,mBAAkB,GAAGsC,CAAO,QAC5B,MAAO,CAAE,GAAGC,GAAY,MAAO,IAAK,KAAM,WAAY,EACtD,QAAUC,GAAU,CACnBA,EAAM,cAAc,kBAAkB,EAAE,CACzC,EACA,UAAYA,GAAU,CACjBA,EAAM,MAAQ,SAASA,EAAM,cAAc,KAAK,EAChDA,EAAM,MAAQ,WACjBA,EAAM,cAAc,MAAQ,OAAOH,CAAY,EAC/CG,EAAM,cAAc,kBAAkB,EAAE,EAE1C,EACA,OAASA,GAAU,CAClB,IAAMC,EAASD,EAAM,cACfL,EAAO,OAAOM,EAAO,KAAK,EAChC,GAAI,CAAC,OAAO,UAAUN,CAAI,GAAKA,EAAOvB,EAAK,KAAOuB,EAAOvB,EAAK,IAAK,CAClE6B,EAAO,kBAAkB1C,EAAE,yBAA0B,CAAE,IAAKa,EAAK,IAAK,IAAKA,EAAK,GAAI,CAAC,CAAC,EACtF6B,EAAO,eAAe,EACtB,MACD,CACAA,EAAO,kBAAkB,EAAE,EAC3B,IAAMC,EAAWP,EAAOvB,EAAK,MACzB8B,IAAa1C,EAAa,MAAMY,EAAK,GAAG,GACvC,QAAQ,QAAQH,EAAkBG,EAAK,IAAK8B,CAAQ,CAAC,EAAE,KAAMC,GAAU,CACvEA,IAAU,IAASF,EAAO,cAAaA,EAAO,MAAQ,OAAOJ,CAAY,EAC9E,CAAC,CACF,GAnCK,GAAGzB,EAAK,GAAG,IAAI,OAAOZ,EAAa,QAAQ,CAAC,IAAI,OAAOqC,CAAY,CAAC,EAoC1E,IA5CQzB,EAAK,GA6Cd,CAEF,CAAC,EACF,GACD,GACD,GAEF,CAEF,CCtQA,IAAAgC,GAAyE,iBCElE,SAASC,GACfC,EACAC,EACAC,EACAC,EAAQ,kBAC2B,CACnC,IAAMC,EAAMF,EAAkB,OAAS,EAAIA,EAAoB,qBAC/D,MAAO,CACN,KAAM,QAAQF,CAAa;AAAA,8BACCI,CAAG;AAAA;AAAA,kBAEfD,CAAK,qDACrB,OAAQ;AAAA;AAAA;AAAA,gBAGMH,CAAa;AAAA,eACdI,CAAG;AAAA;AAAA;AAAA;AAAA,aAILD,CAAK;AAAA;AAAA;AAAA,4CAIhB,IAAK;AAAA,YACKH,CAAa;AAAA,WACdI,CAAG;AAAA;AAAA;AAAA,YAGFH,CAAgB;AAAA,WACjBG,CAAG,EACb,CACD,CDiIG,IAAAC,EAAA,6BA5GGC,GAGA,CACL,CAAE,GAAI,OAAQ,SAAU,oBAAqB,EAC7C,CAAE,GAAI,SAAU,SAAU,sBAAuB,EACjD,CAAE,GAAI,MAAO,SAAU,mBAAoB,CAC5C,EAEO,SAASC,GAAW,CAC1B,EAAAC,EACA,QAAAC,EACA,aAAAC,EACA,YAAAC,EACA,eAAAC,EACA,kBAAAC,EACA,qBAAAC,EACA,mBAAAC,EACA,UAAAC,EACA,YAAAC,EACA,gBAAAC,EACA,gBAAAC,EACA,QAAAC,EACA,kBAAAC,EACA,YAAAC,EACA,aAAAC,EACA,UAAAC,EACA,mBAAAC,EACA,gBAAAC,EACA,eAAAC,EACA,SAAAC,CACD,EAAoB,CACnB,GAAM,CAACC,EAAeC,CAAgB,KAAI,aAAS,EAAK,EAClD,CAACC,EAAeC,EAAgB,KAAI,aAA2B,MAAM,EACrEC,MAAsB,WAA0B,IAAI,EACpDC,KAAgB,WAA0B,IAAI,EAC9CC,MAAsB,WAA0B,IAAI,EACpDC,MAAqB,WAAO,EAAK,EACjCC,KAAqB,WAAO,EAAK,KAEvC,cAAU,IAAM,CACf,GAAIR,EAAe,CAClBI,GAAoB,SAAS,MAAM,EACnC,MACD,CACKG,GAAmB,UACxBA,GAAmB,QAAU,GAC7B,SAAS,eAAe,8BAA8B,GAAG,MAAM,EAChE,EAAG,CAACP,CAAa,CAAC,KAClB,cAAU,IAAM,CACf,GAAIf,EAAsB,CACzBqB,GAAoB,SAAS,MAAM,EACnC,MACD,CACKE,EAAmB,UACxBA,EAAmB,QAAU,GAC7BH,EAAc,SAAS,MAAM,EAC9B,EAAG,CAACpB,CAAoB,CAAC,EAEzB,IAAMwB,GAAYC,GAAiBvB,CAAS,IAAM,OAC5CwB,GAAc/B,IAAY,QAAaO,IAAc,OAAOP,EAAQ,IAAI,EAExEgC,KAAW,YAAQ,IAAM,CAC9B,GAAIhC,IAAY,QAAa,CAACI,GAAqBD,IAAmB,QAAaH,EAAQ,OAAO,SAAW,EAC5G,OAED,IAAMiC,EAAS,GAAGC,GAAqBlC,EAAQ,KAAMA,EAAQ,IAAI,CAAC,MAC5DmC,EAAYD,GAAqBlC,EAAQ,KAAMA,EAAQ,IAAI,EAEjE,OAAOoC,GAAqBH,EAAQE,EAAWhC,EAAgBH,EAAQ,OAAO,CAAC,CAAC,CACjF,EAAG,CAACA,EAASI,EAAmBD,CAAc,CAAC,EAEzCkC,EAAY,CAACC,EAAkBC,IAChC9B,IAAoB6B,EAAcvC,EAAE,YAAY,EAChDS,IAAgB8B,EAAcvC,EAAE,QAAQ,EACrCwC,GAAQxC,EAAE,MAAM,EAGlByC,GAAmBC,GAAwB,CAChD,IAAMC,EAAM7C,GAAa4C,CAAK,EAC1BC,IAAQ,SACZnB,GAAiBmB,EAAI,EAAE,EACvB,SAAS,eAAe,4BAA4BA,EAAI,EAAE,EAAE,GAAG,MAAM,EACtE,EAEMC,GAAoBC,GAA+C,CACxE,IAAMC,EAAUhD,GAAa,UAAW6C,IAAQA,GAAI,KAAOpB,CAAa,EACpEuB,EAAU,IACVD,EAAM,MAAQ,cAAgBA,EAAM,MAAQ,aAC/CA,EAAM,eAAe,EACrBJ,IAAiBK,EAAU,GAAKhD,GAAa,MAAM,GACzC+C,EAAM,MAAQ,aAAeA,EAAM,MAAQ,WACrDA,EAAM,eAAe,EACrBJ,IAAiBK,EAAU,EAAIhD,GAAa,QAAUA,GAAa,MAAM,GAC/D+C,EAAM,MAAQ,QACxBA,EAAM,eAAe,EACrBJ,GAAgB,CAAC,GACPI,EAAM,MAAQ,QACxBA,EAAM,eAAe,EACrBJ,GAAgB3C,GAAa,OAAS,CAAC,GAEzC,EAEMiD,EAAY9C,IAAY,OAAY,GAAK,GAAGkC,GAAqBlC,EAAQ,KAAMA,EAAQ,IAAI,CAAC,MAC5F+C,GAAe/C,IAAY,OAAY,GAAKkC,GAAqBlC,EAAQ,KAAMA,EAAQ,IAAI,EAEjG,SACC,QAAC,WAAQ,MAAOgD,GAAW,kBAAgB,6BAC1C,qBAAC,OACA,oBAAC,MAAG,GAAG,6BAA6B,MAAO,CAAE,GAAGC,EAAY,SAAU,EAAG,EACvE,SAAAlD,EAAE,cAAc,EAClB,KACA,OAAC,KAAE,MAAO,CAAE,GAAGmD,EAAW,UAAW,CAAE,EAAI,SAAAnD,EAAE,cAAc,EAAE,KAC7D,OAAC,KAAE,MAAO,CAAE,GAAGoD,GAAc,UAAW,CAAE,EAAI,SAAApD,EAAE,gBAAgB,EAAE,KAClE,OAAC,KAAE,MAAO,CAAE,GAAGqD,EAAW,UAAW,CAAE,EAAI,SAAArD,EAAE,qBAAqB,EAAE,GACrE,EACCE,IAAiB,OAAY,QAC7B,OAAC,KAAE,MAAOoD,GAAY,KAAK,QACzB,SAAApD,EACF,EAEAK,IAAuB,OAAY,QACnC,OAAC,KAAE,MAAO+C,GAAY,KAAK,QACzB,SAAA/C,EACF,EAEAN,IAAY,QAAaC,IAAiB,UAC1C,OAAC,OAAI,MAAOqD,GAAe,KAAK,SAAS,YAAU,OAClD,oBAAC,OAAI,MAAOC,GACX,oBAAC,QAAK,cAAY,OAAO,MAAOC,GAAS,SAAS,EAAG,EACpDzD,EAAE,gBAAgB,GACpB,EACD,EACGC,IAAY,UACf,QAAC,OAAI,MAAOyD,GAAa,KAAK,SAC7B,oBAAC,KAAE,MAAOL,EAAY,SAAArD,EAAE,mBAAmB,EAAE,KAC7C,OAAC,UAAO,KAAK,SAAS,MAAO2D,EAAa,QAAS/C,EACjD,SAAAZ,EAAE,OAAO,EACX,GACD,KAEA,QAAC,OAAI,MAAO0D,GACX,oBAACE,GAAA,CACA,MAAO3D,EAAQ,QAAUD,EAAE,gBAAgB,EAAIA,EAAE,gBAAgB,EACjE,KAAMC,EAAQ,QAAU,UAAY,UACrC,KACA,OAAC,KAAE,MAAOoD,EACR,SAAApD,EAAQ,OAAO,OAAS,EACtBD,EAAE,qBAAsB,CAAE,MAAOC,EAAQ,OAAO,OAAQ,MAAOA,EAAQ,OAAO,CAAC,CAAE,CAAC,EAClFD,EAAE,0BAA0B,EAChC,KACA,OAAC,KAAE,MAAOqD,EAAY,SAAApD,EAAQ,cAAgBD,EAAE,sBAAsB,EAAIA,EAAE,yBAAyB,EAAE,EACtGqB,KACA,QAAC,OAAI,MAAOqC,GACX,oBAAC,KAAE,MAAOP,EAAY,SAAAnD,EAAE,sBAAsB,EAAE,KAChD,QAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,SAAU,OAAQ,IAAK,CAAE,EACvD,oBAAC,UACA,IAAKyB,GACL,KAAK,SACL,MAAOoC,EACP,SAAU1D,EACV,QAAS,IAAM,CACdyB,GAAmB,QAAU,GAC7BN,EAAiB,EAAK,EACtBX,EAAgB,EAAI,CACrB,EAEC,SAAAX,EAAE,4BAA4B,EAChC,KACA,OAAC,UACA,KAAK,SACL,MAAO2D,EACP,SAAUxD,EACV,QAAS,IAAM,CACdyB,GAAmB,QAAU,GAC7BN,EAAiB,EAAK,CACvB,EAEC,SAAAtB,EAAE,qBAAqB,EACzB,GACD,GACD,KAEA,QAAC,SACA,QAAQ,+BACR,MAAO,CACN,QAAS,OACT,WAAY,SACZ,eAAgB,gBAChB,IAAK,GACL,SAAU,GACV,MAAO,gCACR,EAEA,oBAAC,QAAM,SAAAA,EAAE,gBAAgB,EAAE,KAC3B,OAAC8D,GAAA,CACA,GAAG,+BACH,QAAS7D,EAAQ,QACjB,SAAUE,EACV,SAAW4D,GAAY,CACtB,GAAIA,EAAS,CACZzC,EAAiB,EAAI,EACrB,MACD,CACAX,EAAgB,EAAK,CACtB,EACD,GACD,KAED,QAAC,OACA,oBAAC,SACA,QAAQ,4BACR,MAAO,CAAE,GAAGwC,EAAW,MAAO,gCAAiC,EAE9D,SAAAnD,EAAE,aAAa,EACjB,KACA,OAAC,KAAE,GAAG,iCAAiC,MAAOqD,EAC5C,SAAArD,EAAE,iBAAiB,EACrB,EACC,CAAC8B,IAAatB,EAAU,OAAS,KACjC,OAAC,KAAE,MAAO,CAAE,GAAG6C,EAAW,MAAO,sCAAuC,EAAG,KAAK,QAC9E,SAAArD,EAAE,oBAAoB,EACxB,EACG,QACJ,QAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,SAAU,OAAQ,IAAK,EAAG,UAAW,CAAE,EACrE,oBAAC,SACA,GAAG,4BACH,KAAK,SACL,UAAU,UACV,IAAKgE,GACL,IAAKC,GACL,KAAM,EACN,MAAOzD,EACP,SAAUL,EACV,mBAAiB,iCACjB,eAAc,CAAC2B,IAAatB,EAAU,OAAS,EAC/C,MAAO,CACN,GAAG0D,GACH,MAAO,IACP,KAAM,YACN,YACC,CAACpC,IAAatB,EAAU,OAAS,EAC9B,uCACA,4BACL,EACA,SAAWqC,GAAU,CACpBhC,EAAkBgC,EAAM,OAAO,KAAK,CACrC,EACA,UAAYA,GAAU,CACjBA,EAAM,MAAQ,UACjBA,EAAM,eAAe,EACrB/B,EAAY,GAET+B,EAAM,MAAQ,UACjBhC,EAAkB,OAAOZ,EAAQ,IAAI,CAAC,CAExC,EACD,KACA,OAAC,UACA,KAAK,SACL,MAAO4D,EACP,SAAU1D,GAAe,CAAC6B,IAAe,CAACF,GAC1C,QAAShB,EAER,SAAAd,EAAE,kBAAkB,EACtB,KACA,OAAC,UACA,KAAK,SACL,MAAO2D,EACP,SAAUxD,EACV,QAAS,IAAM,CACdY,EAAaoD,GAAkBlE,EAAQ,IAAI,CAAC,CAC7C,EAEC,SAAAD,EAAE,mBAAmB,EACvB,GACD,GACD,KACA,QAAC,KAAE,MAAOoE,GACT,qBAAC,QAAK,MAAOf,EACX,UAAArD,EAAE,kBAAkB,KACrB,OAAC,QAAK,MAAO,CAAE,QAAS,QAAS,GAAGqE,EAAU,EAAI,SAAAtB,EAAU,GAC7D,KACA,OAACuB,GAAA,CACA,KAAMvB,EACN,UAAW/C,EAAE,MAAM,EACnB,YAAaA,EAAE,QAAQ,EACvB,YAAaA,EAAE,YAAY,EAC5B,GACD,KACA,QAAC,KAAE,MAAOoE,GACT,qBAAC,QAAK,MAAOf,EACX,UAAArD,EAAE,qBAAqB,KACxB,OAAC,QAAK,MAAO,CAAE,QAAS,QAAS,GAAGqE,EAAU,EAAI,SAAArB,GAAa,GAChE,KACA,OAACsB,GAAA,CACA,KAAMtB,GACN,UAAWhD,EAAE,MAAM,EACnB,YAAaA,EAAE,QAAQ,EACvB,YAAaA,EAAE,YAAY,EAC5B,GACD,KACA,QAAC,KAAE,MAAOoE,GACT,qBAAC,QAAK,MAAOf,EACX,UAAArD,EAAE,gBAAgB,KACnB,OAAC,QAAK,MAAO,CAAE,QAAS,QAAS,GAAGqE,GAAW,aAAc,UAAW,EACtE,SAAAhE,GAAqBD,IAAmB,OAAYA,EAAiBH,EAAQ,SAAW,SAC1F,GACD,KACA,QAAC,QAAK,MAAO,CAAE,QAAS,OAAQ,SAAU,OAAQ,IAAK,CAAE,EACxD,oBAAC,UAAO,KAAK,SAAS,MAAO4D,EAAoB,SAAU1D,EAAa,QAASa,EAC/E,SAAAsB,EAAU,MAAOtC,EAAE,gBAAgB,CAAC,EACtC,KACA,OAAC,UAAO,KAAK,SAAS,MAAO2D,EAAa,SAAUxD,EAAa,QAASc,EACxE,SAAoBjB,EAApBK,EAAsB,iBAAsB,gBAAN,EACxC,GACD,GACD,KACA,OAAC,KAAE,MAAOgD,EAAY,SAAArD,EAAE,oBAAoB,EAAE,EAC7CC,EAAQ,SAAWgC,IAAa,UAChC,QAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,cAAe,SAAU,IAAK,EAAG,EAC/D,oBAAC,MAAG,MAAO,CAAE,GAAGiB,EAAY,SAAU,EAAG,EAAI,SAAAlD,EAAE,sBAAsB,EAAE,KACvE,OAAC,OACA,KAAK,UACL,aAAYA,EAAE,sBAAsB,EACpC,MAAOuE,GACP,UAAW3B,GAEV,SAAA9C,GAAa,IAAK6C,GAAQ,CAC1B,IAAM6B,EAAWjD,IAAkBoB,EAAI,GACvC,SACC,OAAC,UAEA,GAAI,4BAA4BA,EAAI,EAAE,GACtC,KAAK,SACL,KAAK,MACL,gBAAe6B,EACf,gBAAc,6BACd,SAAUA,EAAW,EAAI,GACzB,MAAOA,EAAWC,GAA0BC,GAC5C,QAAS,IAAM,CACdlD,GAAiBmB,EAAI,EAAE,CACxB,EAEC,SAAA3C,EAAE2C,EAAI,QAAQ,GAZVA,EAAI,EAaV,CAEF,CAAC,EACF,KACA,OAAC,OACA,GAAG,6BACH,KAAK,WACL,kBAAiB,4BAA4BpB,CAAa,GAE1D,mBAAC,QAAK,MAAOoD,GAAe,SAAA1C,EAASV,CAAa,EAAE,EACrD,KACA,OAAC+C,GAAA,CACA,KAAMrC,EAASV,CAAa,EAC5B,UAAWvB,EAAE,MAAM,EACnB,YAAaA,EAAE,QAAQ,EACvB,YAAaA,EAAE,YAAY,EAC5B,GACD,EACGC,EAAQ,WACX,OAAC,KAAE,MAAOoD,EAAY,SAAArD,EAAE,4BAA4B,EAAE,EACnD,KACHM,KACA,QAAC,OAAI,MAAOoD,GACX,oBAAC,KAAE,MAAOP,EAAY,SAAAnD,EAAE,sBAAsB,EAAE,KAChD,OAAC,KAAE,MAAOqD,EAAY,SAAArD,EAAE,0BAA0B,EAAE,KACpD,QAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,SAAU,OAAQ,IAAK,CAAE,EACvD,oBAAC,UACA,IAAK2B,GACL,KAAK,SACL,MAAOkC,EACP,SAAU1D,EACV,QAAS,IAAM,CACd0B,EAAmB,QAAU,GAC7BT,EAAS,CACV,EAEC,SAAApB,EAAE,4BAA4B,EAChC,KACA,OAAC,UACA,KAAK,SACL,MAAO2D,EACP,SAAUxD,EACV,QAAS,IAAM,CACd0B,EAAmB,QAAU,GAC7BV,EAAe,CAChB,EAEC,SAAAnB,EAAE,qBAAqB,EACzB,GACD,GACD,KAEA,OAAC,UACA,IAAK0B,EACL,KAAK,SACL,MAAOiC,EACP,SAAUxD,EACV,QAASe,EAER,SAAAlB,EAAE,eAAe,EACnB,GAEF,GAEF,CAEF,CE7ZK,IAAA4E,GAAA,6BApCE,SAASC,GAAa,CAAE,EAAAC,EAAG,UAAAC,EAAW,SAAAC,EAAU,MAAAC,CAAM,EAAsB,CAClF,IAAMC,EAAWC,GAA0CF,GAAO,KAAMG,GAAUA,EAAM,KAAOD,CAAE,GAAG,OAE9FE,EAAYC,GAAwB,CACzC,IAAMC,EAAMC,GAAcF,CAAK,EAC/B,GAAIC,IAAQ,OAAW,OACvBP,EAASO,EAAI,EAAE,EACA,SAAS,eAAe,oBAAoBA,EAAI,EAAE,EAAE,GAC3D,MAAM,CACf,EAEME,EAAaC,GAA+C,CACjE,IAAMC,EAAUH,GAAc,UAAWD,GAAQA,EAAI,KAAOR,CAAS,EACjEY,EAAU,IACVD,EAAM,MAAQ,cAAgBA,EAAM,MAAQ,aAC/CA,EAAM,eAAe,EACrBL,GAAUM,EAAU,GAAKH,GAAc,MAAM,GACnCE,EAAM,MAAQ,aAAeA,EAAM,MAAQ,WACrDA,EAAM,eAAe,EACrBL,GAAUM,EAAU,EAAIH,GAAc,QAAUA,GAAc,MAAM,GAC1DE,EAAM,MAAQ,QACxBA,EAAM,eAAe,EACrBL,EAAS,CAAC,GACAK,EAAM,MAAQ,QACxBA,EAAM,eAAe,EACrBL,EAASG,GAAc,OAAS,CAAC,GAEnC,EAEA,SACC,QAAC,OAAI,KAAK,UAAU,aAAYV,EAAE,OAAO,EAAG,MAAOc,GAAmB,UAAWH,EAC/E,SAAAD,GAAc,IAAKD,GAAQ,CAC3B,IAAMM,EAAWd,IAAcQ,EAAI,GAC7BO,EAASZ,EAAQK,EAAI,EAAE,EACvBQ,EAAQD,IAAW,OAAYhB,EAAES,EAAI,KAAK,EAAI,GAAGT,EAAES,EAAI,KAAK,CAAC,KAAKO,CAAM,IAC9E,SACC,QAAC,UAEA,GAAI,oBAAoBP,EAAI,EAAE,GAC9B,KAAK,SACL,KAAK,MACL,gBAAeM,EACf,gBAAeA,EAAW,sBAAsBN,EAAI,EAAE,GAAK,OAC3D,SAAUM,EAAW,EAAI,GACzB,MAAOA,EAAWG,GAA0BC,GAC5C,QAAS,IAAM,CACdjB,EAASO,EAAI,EAAE,CAChB,EAEC,SAAAQ,GAZIR,EAAI,EAaV,CAEF,CAAC,EACF,CAEF,CCxEA,IAAMW,GAAW,gCAEXC,GAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkCRC,GAAW,GAER,SAASC,IAA0B,CACzC,GAAID,IAAY,OAAO,SAAa,IAAa,OACjD,GAAI,SAAS,eAAeF,EAAQ,IAAM,KAAM,CAC/CE,GAAW,GACX,MACD,CACA,IAAME,EAAQ,SAAS,cAAc,OAAO,EAC5CA,EAAM,GAAKJ,GACXI,EAAM,YAAcH,GACpB,SAAS,KAAK,YAAYG,CAAK,EAC/BF,GAAW,EACZ,CpBoiBG,IAAAG,EAAA,6BAthBGC,GAAyB,wCAE/B,SAASC,IAAkC,CAC1C,GAAI,CACH,OAAO,WAAW,gBAAgB,QAAQD,EAAsB,IAAM,GACvE,MAAQ,CACP,MAAO,EACR,CACD,CAGO,SAASE,GAAkB,CAAE,EAAAC,CAAE,EAA2B,CAChE,GAAIA,IAAM,OAAW,MAAM,IAAI,MAAM,yDAAyD,EAE9F,GAAM,CAACC,EAAQC,CAAS,KAAI,YAAwC,MAAS,EACvE,CAACC,EAAcC,CAAe,KAAI,YAA6B,MAAS,EACxE,CAACC,EAAcC,CAAe,KAAI,YAAmC,MAAS,EAC9E,CAACC,EAAYC,CAAa,KAAI,YAAgD,CAAC,CAAC,EAChF,CAACC,EAAcC,CAAe,KAAI,YAAiD,CAAC,CAAC,EACrF,CAACC,EAASC,CAAU,KAAI,YAAqC,MAAS,EACtE,CAACC,EAAcC,CAAe,KAAI,YAA6B,MAAS,EACxE,CAACC,EAAaC,CAAc,KAAI,YAAS,EAAK,EAC9C,CAACC,EAASC,CAAU,KAAI,YAAoC,MAAS,EACrEC,KAAa,UAAkC,MAAS,EACxDC,KAAkB,UAAO,CAAC,EAC1BC,KAAa,UAAO,EAAI,EACxB,CAACC,EAAkBC,CAAmB,KAAI,YAAS,EAAK,EACxD,CAACC,GAAeC,EAAgB,KAAI,YAA6B,MAAS,EAC1E,CAACC,EAAcC,EAAe,KAAI,YAAyC,MAAS,EACpF,CAACC,GAAmBC,CAAoB,KAAI,YAA6B,MAAS,EAClF,CAACC,GAAkBC,EAAmB,KAAI,YAAS,EAAK,EACxD,CAACC,EAAoBC,CAAqB,KAAI,YAAS,EAAK,EAC5D,CAACC,GAAOC,EAAQ,KAAI,YAAgC,MAAS,EAC7D,CAACC,EAAYC,EAAa,KAAI,YAA6B,MAAS,EACpE,CAACC,EAAcC,CAAe,KAAI,YAAS,EAAK,EAChD,CAACC,GAASC,EAAU,KAAI,YAA4C,MAAS,EAC7E,CAACC,GAAcC,EAAe,KAAI,YAA6B,MAAS,EACxE,CAACC,EAASC,EAAU,KAAI,YAAkC,MAAS,EACnE,CAACC,EAAcC,CAAe,KAAI,YAA6B,MAAS,EACxE,CAACC,GAAaC,EAAc,KAAI,YAAS,EAAK,EAC9C,CAACC,GAAeC,EAAgB,KAAI,YAAS,EAAK,EAClD,CAACC,GAAgBC,EAAiB,KAAI,YAA6B,MAAS,EAC5E,CAACC,GAAmBC,EAAoB,KAAI,YAAS,EAAK,EAC1D,CAACC,GAAsBC,EAAuB,KAAI,YAAS,EAAK,EAChE,CAACC,GAAoBC,EAAqB,KAAI,YAA6B,MAAS,EACpF,CAACC,GAAWC,EAAY,KAAI,YAAS,EAAE,EACvC,CAACC,GAAWC,EAAY,KAAI,YAAwB,UAAU,EAC9D,CAACC,GAAaC,EAAc,KAAI,YAAgC,MAAS,EACzE,CAACC,GAAiBC,EAAkB,KAAI,YAAgC,MAAS,EACjF,CAACC,GAAmBC,EAAoB,KAAI,YAAiD,CAAC,CAAC,EAC/F,CAACC,GAAoBC,EAAqB,KAAI,YAASzE,EAAsB,EAC7E0E,MAAiB,UAA2B,MAAS,EACrDC,GAASxE,GAAQ,aAAe,cAAgBA,GAAQ,aAAe,sBAEvEyE,MAAU,eAAY,SAAY,CACvC,GAAI,CACH,IAAMC,EAAO,MAAMC,EAA+BC,EAAW,EAC7D,OAAA3E,EAAUyE,CAAI,EACdvE,EAAgB,MAAS,EAClBuE,CACR,OAASG,EAAgB,CACxB1E,EAAgB0E,aAAiB,MAAQA,EAAM,QAAU9E,EAAE,eAAe,CAAC,EAC3E,MACD,CACD,EAAG,CAACA,CAAC,CAAC,EAEA+E,MAAiB,eAAY,SAAY,CAC9C,GAAI,CACHnE,EAAWoE,GAAa,MAAMJ,EAAqBK,EAAY,CAAC,CAAC,EACjEnE,EAAgB,MAAS,CAC1B,OAASgE,EAAgB,CACxBlE,EAAWsE,GAAa,CAAC,CAAC,CAAC,EAC3BpE,EAAgBgE,aAAiB,MAAQA,EAAM,QAAU9E,EAAE,mBAAmB,CAAC,CAChF,CACD,EAAG,CAACA,CAAC,CAAC,EAEAmF,MAAsB,eAAY,SAAY,CACnD,GAAI,CACH,IAAMC,EAASC,GAAkB,MAAMT,EAAqBU,EAAiB,CAAC,EAC9E,OAAA3D,GAAgByD,GAAU,CAAE,MAAOG,GAAwB,EAAG,SAAU,EAAG,SAAU,EAAM,CAAC,EAC5F1D,EAAqB,MAAS,EACvBuD,CACR,OAASN,EAAgB,CACxBnD,GAAgB,CAAE,MAAO4D,GAAwB,EAAG,SAAU,EAAG,SAAU,EAAM,CAAC,EAClF1D,EAAqBiD,aAAiB,MAAQA,EAAM,QAAU9E,EAAE,wBAAwB,CAAC,EACzF,MACD,QAAE,CACDiC,EAAsB,EAAI,CAC3B,CACD,EAAG,CAACjC,CAAC,CAAC,EAEAwF,MAAiB,eAAY,SAAY,CAC9C,GAAI,CACH3C,GAAW4C,GAAa,MAAMb,EAAqBc,EAAY,CAAC,CAAC,EACjE3C,EAAgB,MAAS,CAC1B,OAAS+B,EAAgB,CACxB/B,EAAgB+B,aAAiB,MAAQA,EAAM,QAAU9E,EAAE,mBAAmB,CAAC,CAChF,QAAE,CACDmD,GAAiB,EAAI,CACtB,CACD,EAAG,CAACnD,CAAC,CAAC,EAEA2F,MAAiB,eAAY,SAAY,CAC9C,GAAI,CACHlD,GAAWmD,GAAuB,MAAMhB,EAAqBiB,EAAuB,CAAC,CAAC,EACtFlD,GAAgB,MAAS,CAC1B,OAASmC,EAAgB,CACxBnC,GAAgBmC,aAAiB,MAAQA,EAAM,QAAU9E,EAAE,mBAAmB,CAAC,CAChF,CACD,EAAG,CAACA,CAAC,CAAC,EAEA8F,MAAe,eAAY,SAAY,CAC5CvD,EAAgB,EAAI,EACpB,GAAI,CACHJ,GAAS4D,GAAW,MAAMnB,EAAqBoB,EAAgB,CAAC,CAAC,EACjE3D,GAAc,MAAS,CACxB,OAASyC,EAAgB,CACxB3C,GAAS,MAAS,EAClBE,GAAcyC,aAAiB,MAAQA,EAAM,QAAU9E,EAAE,kBAAkB,CAAC,CAC7E,QAAE,CACDuC,EAAgB,EAAK,CACtB,CACD,EAAG,CAACvC,CAAC,CAAC,KAGN,aAAU,IAAM,CACfiG,GAAkB,EAClB,IAAIC,EAAS,GACTC,EACJ,OAAKzB,GAAQ,EAAE,KAAMC,GAAS,CACzB,CAACuB,GAAUvB,GAAM,UAAY,QACjCwB,EAAQ,OAAO,WAAW,IAAG,CAAQpB,GAAe,GAAG,CAAC,EACzD,CAAC,EACM,IAAM,CACZmB,EAAS,GACLC,IAAU,QAAW,OAAO,aAAaA,CAAK,CACnD,CACD,EAAG,CAACzB,GAASK,EAAc,CAAC,KAG5B,aAAU,IAAM,CACXjB,KAAc,iBACb9B,GAAyBmD,GAAoB,EAC7CQ,GAAe,EACrB,EAAG,CAAC7B,GAAW9B,EAAoBmD,GAAqBQ,EAAc,CAAC,KAGvE,aAAU,IAAM,CACX3D,GACA/B,GAAQ,UAAU,MAAM,SAAW,aAClCkF,GAAoB,CAC1B,EAAG,CAACnD,EAAoBmD,GAAqBlF,GAAQ,UAAU,MAAM,MAAM,CAAC,KAG5E,aAAU,IAAM,CACX6D,KAAc,WAAaZ,IAC1BsC,GAAe,CACrB,EAAG,CAAC1B,GAAWZ,GAAesC,EAAc,CAAC,KAE7C,aAAU,IAAM,CACfrE,EAAW,QAAUF,CACtB,EAAG,CAACA,CAAO,CAAC,KAEZ,aAAU,KACTI,EAAW,QAAU,GACd,IAAM,CACZA,EAAW,QAAU,GACjBmD,GAAe,UAAY,QAAW,OAAO,aAAaA,GAAe,OAAO,EACpFpD,EAAgB,SAAW,EAC3B,IAAM8E,EAAS/E,EAAW,QACtB+E,IAAW,QAAWE,GAAoBF,EAAO,UAAW,EAAI,CACrE,GACE,CAAC,CAAC,KAEL,aAAU,IAAM,CAGf,GAAI,EADHjG,IAAW,QAAa,OAAO,OAAOA,EAAO,SAAS,EAAE,KAAMoG,GAAaA,EAAS,SAAW,YAAY,GAC5F,OAChB,IAAMF,EAAQ,OAAO,YAAY,IAAM,CACjCzB,GAAQ,CACd,EAAG4B,EAAgB,EACnB,MAAO,IAAM,CACZ,OAAO,cAAcH,CAAK,CAC3B,CACD,EAAG,CAACzB,GAASzE,CAAM,CAAC,KAEpB,aAAU,IAAM,CACf,IAAMsG,EAAWtG,GAAQ,UAAU,MAAM,SAAW,YACpD,GAAIyB,GAAc,MAAM,aAAe,IAAQ6E,EAAU,CACnDT,GAAa,EAClB,MACD,CACA3D,GAAS,MAAS,EAClBE,GAAc,MAAS,EACvBE,EAAgB,EAAK,CACtB,EAAG,CAACb,GAAc,MAAM,WAAYoE,GAAc7F,GAAQ,UAAU,MAAM,MAAM,CAAC,KAEjF,aAAU,IAAM,CACX2C,IAAY,QAAWiB,GAAa,OAAOjB,EAAQ,IAAI,CAAC,CAC7D,EAAG,CAACA,CAAO,CAAC,EAEZ,IAAM4D,GAAS,MAAOH,EAAwBI,IAAuC,CACpF,IAAMC,EAAQ,OAAO,KAAK,cAAe,QAAQ,EAC7CA,IAAU,OAAMA,EAAM,OAAS,MACnCpG,EAAgB+F,CAAQ,EACxBjG,EAAgB,MAAS,EACzBM,EAAiBiG,IAAa,CAAE,GAAGA,EAAS,CAACN,CAAQ,EAAGK,IAAU,IAAK,EAAE,EACzE,GAAI,CACH,IAAME,EAAY,MAAMhC,EAA4BiC,GAAY,OAAQ,CAAE,SAAAR,EAAU,OAAAI,CAAO,CAAC,EACxFC,IAAU,MAAMA,EAAM,SAAS,QAAQE,EAAU,GAAG,EACxD,MAAMlC,GAAQ,CACf,OAASI,EAAgB,CACxB4B,GAAO,MAAM,EACbtG,EAAgB0E,aAAiB,MAAQA,EAAM,QAAU9E,EAAE,eAAe,CAAC,EAC3E,MAAM0E,GAAQ,CACf,QAAE,CACDpE,EAAgB,MAAS,CAC1B,CACD,EAEMwG,GAAa,MAAOT,GAA0C,CACnE,IAAMU,EAAOxG,EAAW8F,CAAQ,GAAG,KAAK,GAAK,GAC7C,GAAIU,EAAK,SAAW,EACpB,CAAAzG,EAAgB+F,CAAQ,EACxB,GAAI,CACH,MAAMzB,EAA0BoC,GAAiB,OAAQ,CAAE,SAAAX,EAAU,KAAAU,CAAK,CAAC,EAC3EvG,EAAemG,IAAa,CAAE,GAAGA,EAAS,CAACN,CAAQ,EAAG,EAAG,EAAE,EAC3D,MAAM3B,GAAQ,CACf,OAASI,EAAgB,CACxB1E,EAAgB0E,aAAiB,MAAQA,EAAM,QAAU9E,EAAE,eAAe,CAAC,CAC5E,QAAE,CACDM,EAAgB,MAAS,CAC1B,EACD,EAEM2G,GAAc,MAAOZ,GAA0C,CACpE/F,EAAgB+F,CAAQ,EACxB,GAAI,CACHnG,EAAU,MAAM0E,EAA+BsC,GAAmB,OAAQ,CAAE,SAAAb,CAAS,CAAC,CAAC,CACxF,OAASvB,EAAgB,CACxB1E,EAAgB0E,aAAiB,MAAQA,EAAM,QAAU9E,EAAE,eAAe,CAAC,CAC5E,QAAE,CACDM,EAAgB,MAAS,CAC1B,CACD,EAEM6G,GAAU,MAAOd,GAA0C,CAChE/F,EAAgB+F,CAAQ,EACxB,GAAI,CACHnG,EAAU,MAAM0E,EAA+BwC,GAAa,OAAQ,CAAE,SAAAf,CAAS,CAAC,CAAC,CAClF,OAASvB,EAAgB,CACxB1E,EAAgB0E,aAAiB,MAAQA,EAAM,QAAU9E,EAAE,eAAe,CAAC,CAC5E,QAAE,CACDM,EAAgB,MAAS,CAC1B,CACD,EAEM+G,GAAa,MAAOhB,EAAwBiB,IAAsC,CACvFhH,EAAgB+F,CAAQ,EACxB,GAAI,CACHnG,EAAU,MAAM0E,EAA+B2C,GAAa,OAAQ,CAAE,SAAAlB,EAAU,SAAAiB,CAAS,CAAC,CAAC,CAC5F,OAASxC,EAAgB,CACxB1E,EAAgB0E,aAAiB,MAAQA,EAAM,QAAU9E,EAAE,eAAe,CAAC,CAC5E,QAAE,CACDM,EAAgB,MAAS,CAC1B,CACD,EAEMkH,GAAgB,MAAOC,GAAoC,CAChE,IAAMC,EAAQ,EAAEtG,EAAgB,QAC1BuG,EAAWxG,EAAW,QACxBwG,IAAa,SAChBxG,EAAW,QAAU,OACrBD,EAAW,MAAS,EACpBkF,GAAoBuB,EAAS,SAAS,GAEvC3G,EAAe,EAAI,EACnBS,GAAiB,MAAS,EAC1BF,EAAoB,EAAK,EACzB,GAAI,CACH,IAAMoD,EAAOiD,GAAa,MAAMhD,EAAqBiD,GAAsB,OAAQ,CAAE,KAAAJ,CAAK,CAAC,CAAC,EAC5F,GAAI9C,IAAS,OAAW,MAAM,IAAI,MAAM3E,EAAE,sBAAsB,CAAC,EACjE,GAAI,CAACqB,EAAW,SAAWqG,IAAUtG,EAAgB,QAAS,CAC7DgF,GAAoBzB,EAAK,UAAW,CAACtD,EAAW,OAAO,EACvD,MACD,CACAF,EAAW,QAAUwD,EACrBzD,EAAWyD,CAAI,EACf7D,EAAgB,MAAS,CAC1B,OAASgE,EAAgB,CACxB,GAAI,CAACzD,EAAW,SAAWqG,IAAUtG,EAAgB,QAAS,OAC9DF,EAAW,MAAS,EACpBJ,EAAgBgE,aAAiB,MAAQA,EAAM,QAAU9E,EAAE,sBAAsB,CAAC,CACnF,QAAE,CACGqB,EAAW,SAAWqG,IAAUtG,EAAgB,SAASJ,EAAe,EAAK,CAClF,CACD,EAEM8G,GAAe,SAA2B,CAC/C,GAAI7G,IAAY,QACZA,EAAQ,SAAW,WACnB,EAAAA,EAAQ,0BAA4B,CAACK,GACzC,CAAAN,EAAe,EAAI,EACnB,GAAI,CACH,IAAM+G,EAAS,MAAMnD,EAAqBoD,GAAqB,OAAQ,CACtE,KAAM/G,EAAQ,KACd,UAAWA,EAAQ,UACnB,iBAAAK,CACD,CAAC,EACK2G,EAASC,GAAkBH,CAAM,EACvC5G,EAAW,QAAU,OACrBD,EAAW,MAAS,EACpBK,EAAoB,EAAK,EACzBE,GACCzB,EAAE,uBAAwB,CAAE,OAAQiI,IAAW,OAAY,GAAKjI,EAAEmI,GAAyBF,CAAM,CAAC,CAAE,CAAC,CACtG,EACAnH,EAAgB,MAAS,EACzB,MAAMiE,GAAe,EACrB,MAAML,GAAQ,CACf,OAASI,EAAgB,CACpBsD,GAAuBtD,CAAK,IAC/B3D,EAAW,QAAU,OACrBD,EAAW,MAAS,EACpBK,EAAoB,EAAK,GAE1BT,EAAgBgE,aAAiB,MAAQA,EAAM,QAAU9E,EAAE,qBAAqB,CAAC,EACjF,MAAM+E,GAAe,CACtB,QAAE,CACD/D,EAAe,EAAK,CACrB,EACD,EAEMqH,GAAsB,SAA2B,CACtD,GAAIpH,IAAY,OAAW,OAC3B,IAAMqH,EAAYrH,EAAQ,UAC1BG,EAAgB,SAAW,EAC3BD,EAAW,QAAU,OACrBD,EAAW,MAAS,EACpBK,EAAoB,EAAK,EACzBP,EAAe,EAAI,EACnB,GAAI,CACH,MAAM4D,EAAqB2D,GAAqB,OAAQ,CAAE,UAAAD,CAAU,CAAC,EACrExH,EAAgB,MAAS,CAC1B,OAASgE,EAAgB,CACxBhE,EAAgBgE,aAAiB,MAAQA,EAAM,QAAU9E,EAAE,eAAe,CAAC,CAC5E,QAAE,CACDgB,EAAe,EAAK,CACrB,CACD,EAEMwH,GAAkB,MAAOC,EAA2BC,IAA8C,CAEvG,GADIhH,IAAiB,QAAa,CAACA,EAAa,UAC5C+G,IAAQ,mBAAqBC,IAAU,IAAQ,CAAChH,EAAa,MAAM,YAAa,MAAO,GAC3F,IAAMiH,EACLF,IAAQ,eAAiBC,IAAU,IAAShH,EAAa,MAAM,gBAC5D,CAAE,YAAa,GAAO,gBAAiB,EAAM,EAC5C,CAAE,CAAC+G,CAAG,EAAGC,CAAM,EACpB3G,GAAoB,EAAI,EACxB,GAAI,CACH,IAAM6G,EAAUvD,GACf,MAAMT,EAAqBU,GAAmB,QAAS,CACtD,iBAAkB5D,EAAa,SAC/B,MAAAiH,CACD,CAAC,CACF,EACA,OAAIC,IAAY,OAAWjH,GAAgBiH,CAAO,EAC7C,MAAMzD,GAAoB,EAC/BtD,EAAqB,MAAS,EACvB,EACR,OAASiD,EAAgB,CACxB,aAAMK,GAAoB,EAC1BtD,EACCgH,GAAgB/D,CAAK,EAClB9E,EAAE,+BAA+B,EACjC8E,aAAiB,MAChBA,EAAM,QACN9E,EAAE,wBAAwB,CAC/B,EACO,EACR,QAAE,CACD+B,GAAoB,EAAK,CAC1B,CACD,EAEM+G,GAAYpH,GAAc,MAAM,aAAe,IAAQzB,GAAQ,UAAU,MAAM,SAAW,YAC1F8I,GACL9I,IAAW,OACR,EACA,OAAO,OAAOA,EAAO,SAAS,EAAE,OAAQoG,GAAaA,EAAS,SAAW,WAAW,EAAE,OAEpF2C,MAAW,WAAQ,IAAkC,CAC1D,IAAMC,EAA2B,CAAC,EAClC,GAAIhJ,IAAW,OAAW,CACzB,IAAM8I,EAAgB,OAAO,OAAO9I,EAAO,SAAS,EAAE,OACpDoG,GAAaA,EAAS,SAAW,WACnC,EAAE,OACE0C,EAAgB,GACnBE,EAAM,KAAK,CAAE,GAAI,WAAY,OAAQ,OAAOF,CAAa,CAAE,CAAC,CAE9D,CACA,OAAInG,GAAS,UAAY,IACxBqG,EAAM,KAAK,CAAE,GAAI,UAAW,OAAQjJ,EAAE,kBAAkB,CAAE,CAAC,EAErDiJ,CACR,EAAG,CAACrG,GAAS,QAAS3C,EAAQD,CAAC,CAAC,EAE1BkJ,GAAcC,GAA2B,CAC1C3E,GAAe,UAAY,QAAW,OAAO,aAAaA,GAAe,OAAO,EACpFP,GAAekF,CAAK,EACpBhF,GAAmB,MAAS,EAC5BK,GAAe,QAAU,OAAO,WAAW,IAAM,CAC5CnD,EAAW,UACd4C,GAAe,MAAS,EACxBE,GAAmB,MAAS,GAE7BK,GAAe,QAAU,MAC1B,EAAG,GAAI,CACR,EAEM4E,GAAa,MAAOD,EAAkBE,IAAgC,CAE3E,GADW,MAAMC,GAASD,CAAI,EACtB,CACPH,GAAWC,CAAK,EAChB,MACD,CACAlF,GAAe,MAAS,EACxBE,GAAmBgF,CAAK,CACzB,EAEMI,GAAmB,SAA6B,CACrD,GAAInG,KAAmB,OAAW,OAAOA,GACzC,IAAMsF,EAAQ,MAAM9D,EAAiC4E,GAAqB,MAAM,EAChF,GAAI,OAAOd,EAAM,QAAW,UAAYA,EAAM,OAAO,SAAW,EAC/D,MAAM,IAAI,MAAM1I,EAAE,qBAAqB,CAAC,EAEzC,OAAAqD,GAAkBqF,EAAM,MAAM,EACvBA,EAAM,MACd,EAEMe,GAAiB,SAA2B,CACjD,GAAI,CACH,IAAMhB,EAAM,MAAMc,GAAiB,EACnC,MAAMH,GAAW,MAAOX,CAAG,EAC3B9E,GAAsB,MAAS,CAChC,MAAQ,CACPA,GAAsB3D,EAAE,qBAAqB,CAAC,CAC/C,CACD,EAEM0J,GAA0B,SAA2B,CAC1D,GAAIpG,GAAmB,CACtBC,GAAqB,EAAK,EAC1B,MACD,CACA,GAAI,CACH,MAAMgG,GAAiB,EACvBhG,GAAqB,EAAI,EACzBI,GAAsB,MAAS,CAChC,MAAQ,CACPA,GAAsB3D,EAAE,qBAAqB,CAAC,CAC/C,CACD,EAEM2J,GAAmB,SAA2B,CACnD,IAAMC,EAAOC,GAAiBjG,EAAS,EACvC,GAAIgG,IAAS,OAAW,CACvB7G,EAAgB/C,EAAE,oBAAoB,CAAC,EACvC,MACD,CACA,GAAI,EAAA4C,IAAY,QAAagH,IAAShH,EAAQ,MAC9C,CAAAK,GAAe,EAAI,EACnB,GAAI,CACHJ,GAAW4C,GAAa,MAAMb,EAAqBc,GAAc,QAAS,CAAE,KAAAkE,CAAK,CAAC,CAAC,GAAKhH,CAAO,EAC/FG,EAAgB,MAAS,CAC1B,OAAS+B,EAAgB,CACxB/B,EAAgB+B,aAAiB,MAAQA,EAAM,QAAU9E,EAAE,mBAAmB,CAAC,EAC3E4C,IAAY,QAAWiB,GAAa,OAAOjB,EAAQ,IAAI,CAAC,CAC7D,QAAE,CACDK,GAAe,EAAK,CACrB,EACD,EAEM6G,GAAmB,SAA2B,CACnD7G,GAAe,EAAI,EACnB,GAAI,CACH,IAAMyF,EAAQ,MAAM9D,EAAmDmF,GAAqB,MAAM,EAC9F,OAAOrB,EAAM,QAAW,UAAUrF,GAAkBqF,EAAM,MAAM,EACpEnF,GAAqB,EAAI,EACzBE,GAAwB,EAAK,EAC7BE,GAAsB,MAAS,EAC/B,MAAM6B,GAAe,CACtB,OAASV,EAAgB,CACxB/B,EAAgB+B,aAAiB,MAAQA,EAAM,QAAU9E,EAAE,mBAAmB,CAAC,CAChF,QAAE,CACDiD,GAAe,EAAK,CACrB,CACD,EAEM+G,GAAqBC,GAA2B,CACrDhH,GAAe,EAAI,EACd2B,EAAqBc,GAAc,QAAS,CAAE,QAAAuE,CAAQ,CAAC,EAC1D,KAAMvB,GAAU,CAChB7F,GAAW4C,GAAaiD,CAAK,GAAK9F,CAAO,EACzCG,EAAgB,MAAS,CAC1B,CAAC,EACA,MAAO+B,GAAmB,CAC1B/B,EAAgB+B,aAAiB,MAAQA,EAAM,QAAU9E,EAAE,mBAAmB,CAAC,CAChF,CAAC,EACA,QAAQ,IAAM,CACdiD,GAAe,EAAK,CACrB,CAAC,CACH,EAEMiH,GAAmB,IAAY,CACpC3F,GAAsB,EAAI,EAC1B,GAAI,CACH,WAAW,gBAAgB,QAAQ1E,GAAwB,GAAG,CAC/D,MAAQ,CAER,CACD,EAEMsK,GAAuB,IAAY,CACxCpG,GAAa,UAAU,EACvB,OAAO,WAAW,IAAM,SAAS,eAAe,0BAA0B,GAAG,MAAM,EAAG,CAAC,CACxF,EAEMqG,GAA6BC,GAAsD,CACxF,IAAMC,EAAKD,IAAW,cAAgB,yBAA2B,kCACjE,SAAS,eAAeC,CAAE,GAAG,MAAM,CACpC,EAEA,OAAIrK,GAAQ,UAAY,SAEtB,QAAC,WAAQ,wBAAsB,UAAU,MAAOsK,GAAW,kBAAgB,8BAC1E,oBAAC,MAAG,GAAG,8BAA8B,MAAOC,EAC1C,SAAAxK,EAAE,gBAAgB,EACpB,KACA,OAAC,KAAE,MAAOyK,EAAY,SAAAzK,EAAE,mBAAoB,CAAE,MAAO+I,EAAc,CAAC,EAAE,KACtE,OAAC,UACA,KAAK,SACL,MAAO2B,EACP,QAAS,IAAM,OAAO,cAAc,IAAI,YAAY,4BAA4B,CAAC,EAEhF,SAAA1K,EAAE,kBAAkB,EACtB,GACD,KAKD,QAAC,WAAQ,wBAAsB,GAAG,MAAOuK,GAAW,kBAAgB,8BACnE,qBAAC,OACA,oBAAC,MAAG,GAAG,8BAA8B,MAAOC,EAC1C,SAAAxK,EAAE,OAAO,EACX,EACC8D,KAAc,cAAa,OAAC,KAAE,MAAO,CAAE,GAAG2G,EAAW,UAAW,CAAE,EAAI,SAAAzK,EAAE,OAAO,EAAE,EAAO,MAC1F,EACCG,IAAiB,OAAY,QAC7B,QAAC,OAAI,KAAK,QAAQ,MAAO,CAAE,QAAS,OAAQ,SAAU,OAAQ,WAAY,SAAU,IAAK,CAAE,EAC1F,oBAAC,KAAE,MAAOwK,GAAa,SAAAxK,EAAa,EACnCF,IAAW,UACX,OAAC,UAAO,KAAK,SAAS,MAAOyK,EAAa,QAAS,IAAG,CAAQhG,GAAQ,GACpE,SAAA1E,EAAE,OAAO,EACX,EACG,MACL,KAED,OAAC4K,GAAA,CAAa,EAAG5K,EAAG,UAAW8D,GAAW,SAAUC,GAAc,MAAOiF,GAAU,KACnF,QAAC,OACA,GAAI,sBAAsBlF,EAAS,GACnC,KAAK,WACL,kBAAiB,oBAAoBA,EAAS,GAC9C,MAAO+G,GAEN,UAAA/G,KAAc,YAAc,EAAE7D,IAAW,QAAaE,IAAiB,WACvE,OAAC2K,GAAA,CACA,EAAG9K,EACH,OAAQC,EACR,OAAQwE,GACR,mBAAoBH,GACpB,mBAAoB4F,GACpB,QAASvJ,EACT,aAAcE,EACd,cAAeW,GACf,YAAaT,EACb,QAASE,EACT,iBAAkBK,EAClB,aAAcjB,EACd,WAAYE,EACZ,aAAcE,EACd,kBAAmB2D,GACnB,UAAW0E,KAAc,GACzB,MAAO5G,GACP,WAAYE,EACZ,aAAcE,EACd,SAAU,CAACyI,EAAMtE,IAAW,CACtBD,GAAOuE,EAAMtE,CAAM,CACzB,EACA,UAAYsE,GAAS,CACf5D,GAAQ4D,CAAI,CAClB,EACA,cAAgBA,GAAS,CACnB9D,GAAY8D,CAAI,CACtB,EACA,aAAeA,GAAS,CAClBjE,GAAWiE,CAAI,CACrB,EACA,aAAc,CAACA,EAAMrC,IAAU,CAC9BlI,EAAemG,IAAa,CAAE,GAAGA,EAAS,CAACoE,CAAI,EAAGrC,CAAM,EAAE,CAC3D,EACA,iBAAmBqC,GAAS,CAC3B1G,GAAsBsC,IAAa,CAClC,GAAGA,EACH,CAACoE,CAAI,EAAKpE,EAAQoE,CAAI,IAAM,EAC7B,EAAE,CACH,EACA,gBAAkBA,GAAS,CACrBvD,GAAcuD,CAAI,CACxB,EACA,aAAc,CAACA,EAAMzD,IAAa,CAC5BD,GAAW0D,EAAMzD,CAAQ,CAC/B,EACA,yBAA0B/F,EAC1B,eAAgB,IAAM,CAChBuG,GAAa,CACnB,EACA,sBAAuB,IAAM,CACvBO,GAAoB,CAC1B,EACA,iBAAkB,IAAM,CAClBtD,GAAe,CACrB,EACA,uBAAwB,IAAM,CAC7BtD,GAAiB,MAAS,CAC3B,EACD,EACG,KACHqC,KAAc,kBACd,OAACkH,GAAA,CACA,EAAGhL,EACH,aAAc0B,EACd,kBAAmBE,GACnB,iBAAkBE,GAClB,QAASU,GACT,aAAcE,GACd,cAAezC,GAAQ,UAAU,MAAM,SAAW,YAClD,QAAS,IAAM,CACTkF,GAAoB,EACpBQ,GAAe,CACrB,EACA,eAAgBwE,GAChB,kBAAmBC,GACnB,kBAAmB,CAAC3B,EAAKC,IAAUF,GAAgBC,EAAKC,CAAK,EAC9D,EACG,KACH5E,KAAc,aACd,OAACmH,GAAA,CACA,EAAGjL,EACH,QAAS4C,EACT,aAAcE,EACd,YAAaE,GACb,eAAgBI,GAChB,kBAAmBE,GACnB,qBAAsBE,GACtB,mBAAoBE,GACpB,UAAWE,GACX,YAAaI,GACb,gBAAiBE,GACjB,QAAS,IAAM,CACTsB,GAAe,CACrB,EACA,gBAAiBwE,GACjB,kBAAmBnG,GACnB,YAAa,IAAM,CACb8F,GAAiB,CACvB,EACA,aAAeC,GAAS,CACvB/F,GAAa,OAAO+F,CAAI,CAAC,CAC1B,EACA,OAAQ,CAACT,EAAOE,IAAS,CACnBD,GAAWD,EAAOE,CAAI,CAC5B,EACA,UAAW,IAAM,CACXI,GAAe,CACrB,EACA,mBAAoB,IAAM,CACpBC,GAAwB,CAC9B,EACA,gBAAiB,IAAM,CACtBjG,GAAwB,EAAI,CAC7B,EACA,eAAgB,IAAM,CACrBA,GAAwB,EAAK,CAC9B,EACA,SAAU,IAAM,CACVqG,GAAiB,CACvB,EACD,EACG,KACHhG,KAAc,WAAU,OAACoH,GAAA,CAAS,EAAGlL,EAAG,EAAK,MAC/C,GACD,CAEF,CqBhwBO,IAAMmL,GAAK,CACjB,IAAK,eACL,MAAO,uBACP,MACC,2HACD,aACC,oJACD,eAAgB,yBAChB,UAAW,gBACX,UAAW,kCACX,SAAU,YACV,cAAe,8BACf,MAAO,YACP,OAAQ,SACR,OAAQ,WACR,mBAAoB,mBACpB,kBAAmB,iFACnB,oBAAqB,mBACrB,QAAS,gBACT,YAAa,iBACb,YAAa,2BACb,kBAAmB,6CACnB,aAAc,qBACd,UAAW,kCACX,SAAU,0CACV,QAAS,uBACT,aAAc,kEACd,cACC,+JACD,qBACC,iHACD,qBAAsB,8CACtB,eAAgB,8CAChB,WAAY,cACZ,WAAY,uBACZ,WAAY,yGACZ,OAAQ,iBACR,YAAa,gCACb,aAAc,uCACd,gBAAiB,oDACjB,aAAc,8CACd,UAAW,WACX,UAAW,+CACX,UAAW,iBACX,gBAAiB,6EACjB,WAAY,eACZ,iBAAkB,wFAClB,UAAW,YACX,gBACC,iHACD,YAAa,cACb,kBAAmB,sEACnB,iBAAkB,qBAClB,uBAAwB,qFACxB,qBAAsB,0BACtB,mBAAoB,gBACpB,mBACC,4HACD,sBAAuB,yDACvB,aAAc,sCACd,aACC,oJACD,oBACC,4GACD,eAAgB,6CAChB,kBAAmB,cACnB,iBAAkB,+BAClB,mBAAoB,uBACpB,sBACC,yLACD,qBACC,2GACD,gBAAiB,cACjB,kBACC,wJACD,iBAAkB,UAClB,oBAAqB,2CACrB,sBAAuB,gCACvB,qBAAsB,iCACtB,gBAAiB,kCACjB,cAAe,4BACf,gBAAiB,QACjB,wBAAyB,8DACzB,4BAA6B,kFAC7B,cAAe,eACf,qBAAsB,iBACtB,qBAAsB,8BACtB,qBAAsB,+CACtB,oBAAqB,kCACrB,kBAAmB,+CACnB,eAAgB,WAChB,gBAAiB,YACjB,eAAgB,gBAChB,iBAAkB,kBAClB,oBAAqB,2DACrB,mBAAoB,wEACpB,oBAAqB,oEACrB,qBAAsB,+DACtB,mBAAoB,mCACpB,6BAA8B,iCAC9B,0BAA2B,qCAC3B,+BAAgC,wCAChC,6BAA8B,mEAC9B,oCAAqC,8CACrC,gCAAiC,wDACjC,2BAA4B,uCAC5B,mBAAoB,wBACpB,kBAAmB,sDACnB,sBAAuB,oCACvB,oBAAqB,kEACrB,yBAA0B,iBAC1B,qBAAsB,QACtB,sBAAuB,kBACvB,wBAAyB,WACzB,kBAAmB,4BACnB,kBACC,mHACD,sBACC,kHACD,qBAAsB,mDACtB,oBAAqB,oCACrB,uBAAwB,sCACxB,uBAAwB,0CACxB,8BAA+B,uEAC/B,sBAAuB,oBACvB,qBAAsB,6FACtB,iBAAkB,yBAClB,qBAAsB,8DACtB,cAAe,0BACf,kBAAmB,gFACnB,iBAAkB,mCAClB,qBACC,+JACD,uBAAwB,iDACxB,eAAgB,4BAChB,mBAAoB,qCACpB,eAAgB,eAChB,mBAAoB,4CACpB,mBAAoB,oBACpB,uBAAwB,sCACxB,cAAe,mBACf,kBAAmB,iEACnB,aAAc,iBACd,iBAAkB,8EAClB,oBAAqB,sBACrB,wBAAyB,8DACzB,oBAAqB,qBACrB,wBAAyB,8DACzB,WAAY,cACZ,aAAc,4BACd,iBAAkB,0CAClB,WAAY,0DACZ,eAAgB,oBAChB,eAAgB,aAChB,YAAa,oBACb,UAAW,eACX,eAAgB,oBAChB,YAAa,gBACb,aAAc,UACd,sBAAuB,oBACvB,oBAAqB,kBACrB,aAAc,kBACd,qBAAsB,mBACtB,WAAY,gBACZ,gBAAiB,eACjB,qBAAsB,oBACtB,yBAA0B,kCAC1B,kBAAmB,mCACnB,aAAc,0BACd,aACC,2JACD,eAAgB,wCAChB,kBAAmB,gDACnB,kBAAmB,sCACnB,qBAAsB,sCACtB,cAAe,mBACf,gBAAiB,2DACjB,gBAAiB,8DACjB,kBAAmB,OACnB,iBAAkB,uBAClB,oBAAqB,iBACrB,mBAAoB,6CACpB,oBAAqB,qBACrB,qBAAsB,gCACtB,YAAa,WACb,gBAAiB,eACjB,WAAY,UACZ,SAAU,QACV,KAAM,OACN,OAAQ,SACR,WAAY,iBACZ,cAAe,oCACf,aAAc,SACd,eAAgB,cAChB,eAAgB,eAChB,aAAc,oBACd,aAAc,2FACd,eAAgB,6FAChB,oBAAqB,4FACrB,qBACC,2HACD,2BAA4B,UAC5B,oBAAqB,SACrB,eAAgB,uBAChB,YAAa,OACb,YAAa,OACb,gBAAiB,wFACjB,iBAAkB,QAClB,kBAAmB,SACnB,mBAAoB,qDACpB,eAAgB,kBAChB,iBAAkB,6BAClB,oBAAqB,gCACrB,eAAgB,aAChB,mBAAoB,qFACpB,eAAgB,WAChB,eAAgB,OAChB,eAAgB,OAChB,oBAAqB,kCACrB,qBAAsB,sDACtB,yBAA0B,wCAC1B,2BAA4B,iBAC5B,oBAAqB,SACrB,eAAgB,YAChB,eAAgB,gBAChB,cAAe,iBACf,eAAgB,8BAChB,kBAAmB,mCACnB,kBAAmB,gCACnB,eAAgB,iCAChB,mBAAoB,+DACpB,yBAA0B,uEAC1B,qBAAsB,mFACtB,wBAAyB,mCACzB,gBACC,+MACD,cAAe,2BACf,WAAY,QACZ,cACC,qHACD,cAAe,wBACf,kBAAmB,wBACnB,sBAAuB,qBACvB,eAAgB,uCAChB,eAAgB,sCAChB,eAAgB,wCAChB,aAAc,YACd,YAAa,0BACb,uBAAwB,sBACxB,iBAAkB,+BAClB,gBAAiB,wBACjB,kBAAmB,iDACnB,YAAa,WACb,mBAAoB,kBACpB,oBAAqB,8BACrB,oBAAqB,iCACrB,0BAA2B,wDAC3B,iBAAkB,qBAClB,iBAAkB,qBAClB,uBAAwB,iCACxB,qBAAsB,uBACtB,2BAA4B,sFAC5B,mBAAoB,OACpB,qBAAsB,sBACtB,kBAAmB,eACnB,oBAAqB,oBACrB,eAAgB,0BAChB,iBAAkB,+FAClB,iBAAkB,oBAClB,iBAAkB,SACnB,EAIaC,GAAgD,CAC5D,IAAK,qBACL,MAAO,uCACP,MACC,gNACD,aAAc,mPACd,eAAgB,6CAChB,UAAW,2BACX,UAAW,6CACX,SAAU,qBACV,cAAe,6CACf,MAAO,eACP,OAAQ,eACR,OAAQ,2BACR,mBAAoB,uCACpB,kBAAmB,wJACnB,oBAAqB,2BACrB,QAAS,2BACT,YAAa,2BACb,YAAa,6CACb,kBAAmB,iFACnB,aAAc,6CACd,UAAW,6CACX,SAAU,6FACV,QAAS,mDACT,aAAc,yGACd,cAAe,kPACf,qBAAsB,6LACtB,qBAAsB,+DACtB,eAAgB,+DAChB,WAAY,oBACZ,WAAY,+BACZ,WAAY,0IACZ,OAAQ,2BACR,YAAa,4CACb,aAAc,gFACd,gBAAiB,mGACjB,aAAc,2EACd,UAAW,2BACX,UAAW,+GACX,UAAW,iBACX,gBAAiB,wGACjB,WAAY,eACZ,iBAAkB,6IAClB,UAAW,YACX,gBAAiB,8JACjB,YAAa,cACb,kBAAmB,gGACnB,iBAAkB,qBAClB,uBAAwB,mJACxB,qBAAsB,iDACtB,mBAAoB,2BACpB,mBACC,iPACD,sBAAuB,yDACvB,aAAc,8DACd,aACC,+RACD,oBAAqB,4JACrB,eAAgB,0EAChB,kBAAmB,iCACnB,iBAAkB,mDAClB,mBAAoB,6CACpB,sBACC,wTACD,qBAAsB,0LACtB,gBAAiB,2BACjB,kBACC,yWACD,iBAAkB,qBAClB,oBAAqB,yEACrB,sBAAuB,uDACvB,qBAAsB,2DACtB,gBAAiB,mDACjB,cAAe,mCACf,gBAAiB,eACjB,wBAAyB,4FACzB,4BAA6B,+HAC7B,cAAe,2BACf,qBAAsB,2BACtB,qBAAsB,yDACtB,qBAAsB,0EACtB,oBAAqB,6DACrB,kBAAmB,0EACnB,eAAgB,WAChB,gBAAiB,YACjB,eAAgB,gBAChB,iBAAkB,kBAClB,oBAAqB,4FACrB,mBAAoB,4IACpB,oBAAqB,+GACrB,qBAAsB,4FACtB,mBAAoB,2CACpB,6BAA8B,mDAC9B,0BAA2B,+DAC3B,+BAAgC,mDAChC,6BAA8B,iFAC9B,oCAAqC,8DACrC,gCAAiC,6GACjC,2BAA4B,mDAC5B,mBAAoB,uDACpB,kBAAmB,4FACnB,sBAAuB,kDACvB,oBAAqB,oGACrB,yBAA0B,2BAC1B,qBAAsB,qBACtB,sBAAuB,iCACvB,wBAAyB,qBACzB,kBAAmB,2BACnB,kBAAmB,8NACnB,sBAAuB,qNACvB,qBAAsB,iFACtB,oBAAqB,yDACrB,uBAAwB,yDACxB,uBAAwB,+DACxB,8BAA+B,mJAC/B,sBAAuB,2BACvB,qBAAsB,6LACtB,iBAAkB,6CAClB,qBAAsB,4GACtB,cAAe,6CACf,kBAAmB,kJACnB,iBAAkB,2EAClB,qBAAsB,yOACtB,uBAAwB,6EACxB,eAAgB,iCAChB,mBAAoB,sEACpB,eAAgB,qBAChB,mBAAoB,sDACpB,mBAAoB,qBACpB,uBAAwB,sEACxB,cAAe,kCACf,kBAAmB,gHACnB,aAAc,0BACd,iBAAkB,yGAClB,oBAAqB,4BACrB,wBAAyB,sGACzB,oBAAqB,kCACrB,wBAAyB,sGACzB,WAAY,qBACZ,aAAc,oDACd,iBAAkB,gEAClB,WAAY,mGACZ,eAAgB,uCAChB,eAAgB,2BAChB,YAAa,+BACb,UAAW,uBACX,eAAgB,uBAChB,YAAa,kCACb,aAAc,eACd,sBAAuB,2BACvB,oBAAqB,2BACrB,aAAc,uBACd,qBAAsB,2BACtB,WAAY,uBACZ,gBAAiB,uBACjB,qBAAsB,uBACtB,yBAA0B,+DAC1B,kBAAmB,oDACnB,aAAc,4BACd,aACC,sQACD,eAAgB,sDAChB,kBAAmB,kEACnB,kBAAmB,0CACnB,qBAAsB,gDACtB,cAAe,6BACf,gBAAiB,0FACjB,gBAAiB,0FACjB,kBAAmB,SACnB,iBAAkB,2BAClB,oBAAqB,mCACrB,mBAAoB,kEACpB,oBAAqB,mCACrB,qBAAsB,+DACtB,YAAa,eACb,gBAAiB,eACjB,WAAY,eACZ,SAAU,eACV,KAAM,eACN,OAAQ,qBACR,WAAY,2BACZ,cAAe,2DACf,aAAc,eACd,eAAgB,2BAChB,eAAgB,uBAChB,aAAc,gCACd,aAAc,+KACd,eAAgB,iMAChB,oBAAqB,iLACrB,qBAAsB,0NACtB,2BAA4B,2BAC5B,oBAAqB,eACrB,eAAgB,uCAChB,YAAa,2BACb,YAAa,eACb,gBAAiB,2LACjB,iBAAkB,eAClB,kBAAmB,eACnB,mBAAoB,wFACpB,eAAgB,2BAChB,iBAAkB,kCAClB,oBAAqB,qCACrB,eAAgB,aAChB,mBAAoB,2IACpB,eAAgB,mBAChB,eAAgB,eAChB,eAAgB,eAChB,oBAAqB,iDACrB,qBAAsB,2FACtB,yBAA0B,wDAC1B,2BAA4B,2BAC5B,oBAAqB,eACrB,eAAgB,2BAChB,eAAgB,qBAChB,cAAe,uBACf,eAAgB,kEAChB,kBAAmB,yDACnB,kBAAmB,6CACnB,eAAgB,yDAChB,mBAAoB,0HACpB,yBAA0B,iIAC1B,qBAAsB,oIACtB,wBAAyB,4CACzB,gBACC,mXACD,cAAe,qCACf,WAAY,eACZ,cAAe,oNACf,cAAe,oCACf,kBAAmB,uCACnB,sBAAuB,uCACvB,eAAgB,yDAChB,eAAgB,yDAChB,eAAgB,uCAChB,aAAc,iCACd,YAAa,uCACb,uBAAwB,iCACxB,iBAAkB,6CAClB,gBAAiB,uCACjB,kBAAmB,iIACnB,YAAa,2BACb,mBAAoB,2BACpB,oBAAqB,oDACrB,oBAAqB,8CACrB,0BAA2B,6EAC3B,iBAAkB,kCAClB,iBAAkB,8CAClB,uBAAwB,gDACxB,qBAAsB,uCACtB,2BAA4B,6MAC5B,mBAAoB,OACpB,qBAAsB,sBACtB,kBAAmB,2BACnB,oBAAqB,oCACrB,eAAgB,+DAChB,iBAAkB,6JAClB,iBAAkB,uCAClB,iBAAkB,oBACnB,EvBtcG,IAAAC,GAAA,6BA5DUC,GAAO,wBACPC,GAAS,CAAC,QAAQ,EAE/B,SAASC,GAAyB,CAAE,EAAAC,CAAE,EAAmD,CACxF,GAAM,CAACC,EAAMC,CAAO,KAAI,aAAS,EAAK,EAChCC,KAAU,WAA0B,IAAI,EACxCC,KAAc,WAA0B,IAAI,EAC5CC,KAAS,WAAuB,IAAI,EAC1C,uBAAU,IAAM,CACf,GAAI,CAACJ,EAAM,OACXG,EAAY,SAAS,MAAM,EAC3B,IAAME,EAAOD,EAAO,SAAS,QAAQ,yBAAyB,GAAG,cAC3DE,EACiBD,GAAS,KAC5B,CAAC,EACD,CAAC,GAAG,SAAS,KAAK,QAAQ,EACzB,OAAQE,GAAYA,IAAYF,CAAI,EACpC,IAAKE,IAAa,CAClB,QAAAA,EACA,SAAUA,EAAQ,aAAa,OAAO,EACtC,MAAOA,EAAQ,aAAa,OAAO,CACpC,EAAE,EACN,OAAW,CAAE,QAAAA,CAAQ,IAAKD,EAAeC,EAAQ,aAAa,QAAS,EAAE,EACzE,IAAMC,EAAY,IACjB,CACC,GAAIJ,EAAO,SAAS,iBACnB,0IACD,GAAK,CAAC,CACP,EAAE,OAAQG,GAAYA,EAAQ,eAAe,EAAE,OAAS,CAAC,EACpDE,EAAiBC,GAA+B,CAErD,GADIA,EAAM,MAAQ,UAAUT,EAAQ,EAAK,EACrCS,EAAM,MAAQ,MAAO,OACzB,IAAMC,EAAUH,EAAU,EAC1B,GAAIG,EAAQ,SAAW,EAAG,CACzBD,EAAM,eAAe,EACrBN,EAAO,SAAS,MAAM,EACtB,MACD,CACA,IAAMQ,EAAQD,EAAQ,CAAC,EACjBE,EAAOF,EAAQ,GAAG,EAAE,EACtBD,EAAM,UAAY,SAAS,gBAAkBE,GAChDF,EAAM,eAAe,EACrBG,EAAK,MAAM,GACD,CAACH,EAAM,UAAY,SAAS,gBAAkBG,IACxDH,EAAM,eAAe,EACrBE,EAAM,MAAM,EAEd,EACA,gBAAS,iBAAiB,UAAWH,CAAa,EAC3C,IAAM,CACZ,SAAS,oBAAoB,UAAWA,CAAa,EACrD,OAAW,CAAE,QAAAF,EAAS,SAAAO,EAAU,MAAAC,CAAM,IAAKT,EACtCQ,EAAUP,EAAQ,aAAa,QAASQ,GAAS,EAAE,EAClDR,EAAQ,gBAAgB,OAAO,EAEjCL,EAAQ,SAAS,aAAaA,EAAQ,QAAQ,MAAM,CACzD,CACD,EAAG,CAACF,CAAI,CAAC,KAER,SAAC,OAAI,wBAAqB,GACzB,qBAAC,UACA,IAAKE,EACL,KAAK,SACL,MAAO,CAAE,SAAU,QAAS,MAAO,GAAI,OAAQ,GAAI,OAAQ,GAAI,QAAS,WAAY,EACpF,QAAS,IAAMD,EAAQ,EAAI,EAE1B,SAAAF,EAAE,KAAK,EACT,EACCC,KACA,QAAC,OACA,IAAKI,EACL,KAAK,SACL,aAAW,OACX,kBAAgB,iCAChB,SAAU,GACV,MAAO,CACN,SAAU,QACV,MAAO,EACP,OAAQ,GACR,SAAU,OACV,QAAS,GACT,WAAY,6BACb,EAEA,qBAAC,OAAI,MAAO,CAAE,MAAO,mBAAoB,OAAQ,QAAS,EACzD,sBAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,eAAgB,gBAAiB,IAAK,GAAI,aAAc,EAAG,EACzF,qBAAC,MAAG,GAAG,iCAAiC,MAAO,CAAE,OAAQ,CAAE,EACzD,SAAAL,EAAE,OAAO,EACX,KACA,QAAC,UAAO,IAAKI,EAAa,KAAK,SAAS,QAAS,IAAMF,EAAQ,EAAK,EAAG,aAAYF,EAAE,QAAQ,EAAG,gBAEhG,GACD,KACA,QAACiB,GAAA,CAAkB,EAAGjB,EAAG,GAC1B,EACD,EACG,MACL,CAEF,CAEA,SAASkB,GAAsBlB,EAA+C,CAC7E,GAAI,OAAO,SAAa,IAAa,MAAO,IAAG,GAC/C,IAAMM,EAAO,SAAS,cAAc,KAAK,EACzC,SAAS,KAAK,OAAOA,CAAI,EACzB,IAAMa,KAAO,eAAWb,CAAI,EAC5B,OAAAa,EAAK,UAAO,QAACpB,GAAA,CAAyB,EAAGC,EAAG,CAAE,EACvC,IAAM,CACZmB,EAAK,QAAQ,EACbb,EAAK,OAAO,CACb,CACD,CAEO,SAASc,GAAMC,EAA0B,CAC/C,IAAMC,EAAMC,GAAuBF,CAAG,EACtCC,EAAI,iBAAiB,EACrB,IAAME,EAAY,sBAClBF,EAAI,OAAO,IAAMA,EAAI,OAAO,SAASE,EAAW,CAAE,GAAAC,GAAI,GAAAC,EAAG,CAAC,EAAG,8CAA8C,EAC3G,IAAM1B,EAAIsB,EAAI,OAAO,KAAKE,CAAS,EACnCF,EAAI,aAAa,CAChB,cAAe,IAAMJ,GAAsBlB,CAAC,EAC5C,SAAW2B,GACVA,EAAM,OAAO,mBAAoB,IAChCA,EAAM,SACL,CACC,KAAM,mBACN,GAAI,aACJ,MAAO,GACP,MAAO,IAAM3B,EAAE,KAAK,EACpB,OAAQ,KAAkC,CAAE,EAAAA,CAAE,EAC/C,EACAiB,EACD,CACD,CACF,CAAC,CACF",
|
|
3
|
+
"sources": ["../../src/client/index.tsx", "../../src/client/dshClientAdapter.ts", "../../src/client/GrokBuildSettings.tsx", "../../node_modules/.pnpm/dsh-coding-oauth-core@0.1.1/node_modules/dsh-coding-oauth-core/src/state-contract.ts", "../../src/client/constants.ts", "../../src/client/api.ts", "../../src/client/styles.ts", "../../src/client/components/AboutTab.tsx", "../../src/client/components/AccountsTab.tsx", "../../src/client/display.ts", "../../src/client/components/Badge.tsx", "../../src/client/parsers.ts", "../../src/client/components/CliPullPreview.tsx", "../../src/client/components/NoticeBanner.tsx", "../../src/client/components/ProviderCard.tsx", "../../src/client/components/CopyButton.tsx", "../../src/client/components/ProgressBar.tsx", "../../src/client/components/ToggleSwitch.tsx", "../../src/client/components/CapabilitiesTab.tsx", "../../src/client/components/GatewayTab.tsx", "../../src/client/gatewaySnippets.ts", "../../src/client/components/SettingsTabs.tsx", "../../src/client/microStyles.ts", "../../src/client/locales.ts"],
|
|
4
|
+
"sourcesContent": ["/** Browser half: coding-subscription account management inside dsh Settings. */\r\n\r\nimport type {} from \"@deepseek-ai/dsh-client-locale/client\";\r\nimport type { ClientContext } from \"@deepseek-ai/dsh-client-runtime/client\";\r\nimport type {} from \"@deepseek-ai/dsh-client-ui-settings/client\";\r\nimport type {} from \"@deepseek-ai/dsh-client-ui-slots\";\r\nimport { useEffect, useRef, useState } from \"react\";\r\nimport { createRoot } from \"react-dom/client\";\r\nimport { createDshClientAdapter } from \"./dshClientAdapter.ts\";\r\nimport type { GrokBuildSettingsInjected } from \"./GrokBuildSettings.tsx\";\r\nimport { GrokBuildSettings } from \"./GrokBuildSettings.tsx\";\r\nimport type { GrokBuildSettingsKey } from \"./locales.ts\";\r\nimport { en, zh } from \"./locales.ts\";\r\n\r\ndeclare module \"@deepseek-ai/dsh-client-ui-slots\" {\r\n\tinterface LocaleNamespaceMap {\r\n\t\t\"settings.grok-build\": GrokBuildSettingsKey;\r\n\t}\r\n}\r\n\r\nexport const name = \"dsh-grok-build-client\";\r\nexport const inject = [\"locale\"];\r\n\r\nfunction IndependentSettingsEntry({ t }: { readonly t: GrokBuildSettingsInjected[\"t\"] }) {\r\n\tconst [open, setOpen] = useState(false);\r\n\tconst trigger = useRef<HTMLButtonElement>(null);\r\n\tconst closeButton = useRef<HTMLButtonElement>(null);\r\n\tconst dialog = useRef<HTMLDivElement>(null);\r\n\tuseEffect(() => {\r\n\t\tif (!open) return;\r\n\t\tcloseButton.current?.focus();\r\n\t\tconst host = dialog.current?.closest(\"[data-dsh-coding-oauth]\")?.parentElement;\r\n\t\tconst inertSiblings =\r\n\t\t\thost === undefined || host === null\r\n\t\t\t\t? []\r\n\t\t\t\t: [...document.body.children]\r\n\t\t\t\t\t\t.filter((element) => element !== host)\r\n\t\t\t\t\t\t.map((element) => ({\r\n\t\t\t\t\t\t\telement,\r\n\t\t\t\t\t\t\thadInert: element.hasAttribute(\"inert\"),\r\n\t\t\t\t\t\t\tvalue: element.getAttribute(\"inert\"),\r\n\t\t\t\t\t\t}));\r\n\t\tfor (const { element } of inertSiblings) element.setAttribute(\"inert\", \"\");\r\n\t\tconst focusable = (): HTMLElement[] =>\r\n\t\t\t[\r\n\t\t\t\t...(dialog.current?.querySelectorAll<HTMLElement>(\r\n\t\t\t\t\t'button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])',\r\n\t\t\t\t) ?? []),\r\n\t\t\t].filter((element) => element.getClientRects().length > 0);\r\n\t\tconst closeOnEscape = (event: KeyboardEvent): void => {\r\n\t\t\tif (event.key === \"Escape\") setOpen(false);\r\n\t\t\tif (event.key !== \"Tab\") return;\r\n\t\t\tconst targets = focusable();\r\n\t\t\tif (targets.length === 0) {\r\n\t\t\t\tevent.preventDefault();\r\n\t\t\t\tdialog.current?.focus();\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tconst first = targets[0]!;\r\n\t\t\tconst last = targets.at(-1)!;\r\n\t\t\tif (event.shiftKey && document.activeElement === first) {\r\n\t\t\t\tevent.preventDefault();\r\n\t\t\t\tlast.focus();\r\n\t\t\t} else if (!event.shiftKey && document.activeElement === last) {\r\n\t\t\t\tevent.preventDefault();\r\n\t\t\t\tfirst.focus();\r\n\t\t\t}\r\n\t\t};\r\n\t\tdocument.addEventListener(\"keydown\", closeOnEscape);\r\n\t\treturn () => {\r\n\t\t\tdocument.removeEventListener(\"keydown\", closeOnEscape);\r\n\t\t\tfor (const { element, hadInert, value } of inertSiblings) {\r\n\t\t\t\tif (hadInert) element.setAttribute(\"inert\", value ?? \"\");\r\n\t\t\t\telse element.removeAttribute(\"inert\");\r\n\t\t\t}\r\n\t\t\tif (trigger.current?.isConnected) trigger.current.focus();\r\n\t\t};\r\n\t}, [open]);\r\n\treturn (\r\n\t\t<div data-dsh-coding-oauth>\r\n\t\t\t<button\r\n\t\t\t\tref={trigger}\r\n\t\t\t\ttype=\"button\"\r\n\t\t\t\tstyle={{ position: \"fixed\", right: 16, bottom: 16, zIndex: 30, padding: \"10px 14px\" }}\r\n\t\t\t\tonClick={() => setOpen(true)}\r\n\t\t\t>\r\n\t\t\t\t{t(\"nav\")}\r\n\t\t\t</button>\r\n\t\t\t{open ? (\r\n\t\t\t\t<div\r\n\t\t\t\t\tref={dialog}\r\n\t\t\t\t\trole=\"dialog\"\r\n\t\t\t\t\taria-modal=\"true\"\r\n\t\t\t\t\taria-labelledby=\"coding-oauth-independent-title\"\r\n\t\t\t\t\ttabIndex={-1}\r\n\t\t\t\t\tstyle={{\r\n\t\t\t\t\t\tposition: \"fixed\",\r\n\t\t\t\t\t\tinset: 0,\r\n\t\t\t\t\t\tzIndex: 31,\r\n\t\t\t\t\t\toverflow: \"auto\",\r\n\t\t\t\t\t\tpadding: 20,\r\n\t\t\t\t\t\tbackground: \"var(--dsw-alias-bg-layer-1)\",\r\n\t\t\t\t\t}}\r\n\t\t\t\t>\r\n\t\t\t\t\t<div style={{ width: \"min(780px, 100%)\", margin: \"0 auto\" }}>\r\n\t\t\t\t\t\t<div style={{ display: \"flex\", justifyContent: \"space-between\", gap: 12, marginBottom: 12 }}>\r\n\t\t\t\t\t\t\t<h2 id=\"coding-oauth-independent-title\" style={{ margin: 0 }}>\r\n\t\t\t\t\t\t\t\t{t(\"title\")}\r\n\t\t\t\t\t\t\t</h2>\r\n\t\t\t\t\t\t\t<button ref={closeButton} type=\"button\" onClick={() => setOpen(false)} aria-label={t(\"cancel\")}>\r\n\t\t\t\t\t\t\t\t\u00D7\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t<GrokBuildSettings t={t} />\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t) : null}\r\n\t\t</div>\r\n\t);\r\n}\r\n\r\nfunction mountIndependentEntry(t: GrokBuildSettingsInjected[\"t\"]): () => void {\r\n\tif (typeof document === \"undefined\") return () => undefined;\r\n\tconst host = document.createElement(\"div\");\r\n\tdocument.body.append(host);\r\n\tconst root = createRoot(host);\r\n\troot.render(<IndependentSettingsEntry t={t} />);\r\n\treturn () => {\r\n\t\troot.unmount();\r\n\t\thost.remove();\r\n\t};\r\n}\r\n\r\nexport function apply(ctx: ClientContext): void {\r\n\tconst dsh = createDshClientAdapter(ctx);\r\n\tdsh.assertCompatible();\r\n\tconst namespace = \"settings.grok-build\";\r\n\tdsh.effect(() => dsh.locale.register(namespace, { zh, en }), \"dsh-coding-subscription-oauth: settings copy\");\r\n\tconst t = dsh.locale.bind(namespace) as GrokBuildSettingsInjected[\"t\"];\r\n\tdsh.installSlots({\r\n\t\tmountFallback: () => mountIndependentEntry(t),\r\n\t\tregister: (slots) =>\r\n\t\t\tslots.inject(\"settings.section\", () =>\r\n\t\t\t\tslots.register(\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tname: \"settings.section\",\r\n\t\t\t\t\t\tid: \"grok-build\",\r\n\t\t\t\t\t\torder: 17,\r\n\t\t\t\t\t\tlabel: () => t(\"nav\"),\r\n\t\t\t\t\t\tinject: (): GrokBuildSettingsInjected => ({ t }),\r\n\t\t\t\t\t},\r\n\t\t\t\t\tGrokBuildSettings,\r\n\t\t\t\t),\r\n\t\t\t),\r\n\t});\r\n}\r\n", "/** Capability adapter for the unstable DSH browser client surface. */\r\n\r\nimport type {} from \"@deepseek-ai/dsh-client-locale/client\";\r\nimport type { ClientContext } from \"@deepseek-ai/dsh-client-runtime/client\";\r\nimport type {} from \"@deepseek-ai/dsh-client-ui-slots\";\r\n\r\nexport interface DshClientCompatibilityDiagnostic {\r\n\treadonly id: string;\r\n\treadonly level: \"warning\" | \"error\";\r\n\treadonly message: string;\r\n\treadonly expected: \"function\";\r\n\treadonly actual: string;\r\n}\r\n\r\ntype SlotsApi = ClientContext[\"slots\"];\r\n\r\nfunction slotsOf(context: unknown): SlotsApi | undefined {\r\n\tif (typeof context !== \"object\" || context === null) return undefined;\r\n\tlet slots: unknown;\r\n\ttry {\r\n\t\tconst get = (context as { readonly get?: unknown }).get;\r\n\t\tif (typeof get === \"function\") slots = get.call(context, \"slots\");\r\n\t} catch {\r\n\t\t// Older client runtimes may not expose the Cordis reflection helper.\r\n\t}\r\n\tif (slots === undefined) {\r\n\t\ttry {\r\n\t\t\tslots = (context as { readonly slots?: unknown }).slots;\r\n\t\t} catch {\r\n\t\t\t// Strict Cordis rejects optional service reads outside an inject scope.\r\n\t\t}\r\n\t}\r\n\tif (\r\n\t\ttypeof slots === \"object\" &&\r\n\t\tslots !== null &&\r\n\t\ttypeof (slots as { readonly inject?: unknown }).inject === \"function\" &&\r\n\t\ttypeof (slots as { readonly register?: unknown }).register === \"function\"\r\n\t)\r\n\t\treturn slots as SlotsApi;\r\n\treturn undefined;\r\n}\r\n\r\nexport interface DshClientAdapter {\r\n\treadonly context: ClientContext;\r\n\treadonly locale: ClientContext[\"locale\"];\r\n\treadonly effect: ClientContext[\"effect\"];\r\n\tdiagnostics(): readonly DshClientCompatibilityDiagnostic[];\r\n\tassertCompatible(): void;\r\n\tinstallSlots(options: {\r\n\t\treadonly register: (slots: SlotsApi) => () => void;\r\n\t\treadonly mountFallback: () => () => void;\r\n\t}): void;\r\n}\r\n\r\ntype InstallSlotsOptions = Parameters<DshClientAdapter[\"installSlots\"]>[0];\r\n\r\nexport function createDshClientAdapter(context: ClientContext): DshClientAdapter {\r\n\tconst candidate = context as unknown as Record<string, unknown>;\r\n\tconst locale = candidate[\"locale\"] as Record<string, unknown> | undefined;\r\n\tconst slots = slotsOf(context);\r\n\tconst checks: Array<[string, unknown, DshClientCompatibilityDiagnostic[\"level\"]]> = [\r\n\t\t[\"client.effect\", candidate[\"effect\"], \"error\"],\r\n\t\t[\"client.locale.register\", locale?.[\"register\"], \"error\"],\r\n\t\t[\"client.locale.bind\", locale?.[\"bind\"], \"error\"],\r\n\t\t[\"client.slots.inject\", slots?.inject, \"warning\"],\r\n\t];\r\n\tconst diagnostics = checks.flatMap(([id, value, level]): DshClientCompatibilityDiagnostic[] =>\r\n\t\ttypeof value === \"function\"\r\n\t\t\t? []\r\n\t\t\t: [\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tid,\r\n\t\t\t\t\t\tlevel,\r\n\t\t\t\t\t\tmessage:\r\n\t\t\t\t\t\t\tlevel === \"warning\"\r\n\t\t\t\t\t\t\t\t? `${id} is unavailable; the independent settings entry remains active`\r\n\t\t\t\t\t\t\t\t: `${id} is unavailable in the DSH client runtime`,\r\n\t\t\t\t\t\texpected: \"function\",\r\n\t\t\t\t\t\tactual: typeof value,\r\n\t\t\t\t\t},\r\n\t\t\t\t],\r\n\t);\r\n\tconst frozenDiagnostics = Object.freeze([...diagnostics]);\r\n\treturn Object.freeze({\r\n\t\tcontext,\r\n\t\tlocale: context.locale,\r\n\t\teffect: context.effect,\r\n\t\tdiagnostics: () => frozenDiagnostics,\r\n\t\tassertCompatible() {\r\n\t\t\tconst errors = diagnostics.filter((item) => item.level === \"error\");\r\n\t\t\tif (errors.length > 0) {\r\n\t\t\t\tthrow new Error(`incompatible DSH client API: ${errors.map((item) => item.id).join(\", \")}`);\r\n\t\t\t}\r\n\t\t},\r\n\t\tinstallSlots(options: InstallSlotsOptions) {\r\n\t\t\tlet disposed = false;\r\n\t\t\tlet installed = false;\r\n\t\t\tlet disposeCurrent: () => void = () => undefined;\r\n\t\t\tconst install = (slotContext: ClientContext): boolean => {\r\n\t\t\t\tconst slots = slotsOf(slotContext);\r\n\t\t\t\tif (disposed || installed || slots === undefined) return false;\r\n\t\t\t\tinstalled = true;\r\n\t\t\t\tdisposeCurrent();\r\n\t\t\t\tdisposeCurrent = options.register(slots);\r\n\t\t\t\treturn true;\r\n\t\t\t};\r\n\r\n\t\t\tif (!install(context)) {\r\n\t\t\t\tdisposeCurrent = options.mountFallback();\r\n\t\t\t\tconst inject = candidate[\"inject\"];\r\n\t\t\t\tif (typeof inject === \"function\") {\r\n\t\t\t\t\t(inject as ClientContext[\"inject\"]).call(context, [\"slots\"], (slotContext) => {\r\n\t\t\t\t\t\tinstall(slotContext);\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tcontext.effect(\r\n\t\t\t\t() => () => {\r\n\t\t\t\t\tdisposed = true;\r\n\t\t\t\t\tdisposeCurrent();\r\n\t\t\t\t},\r\n\t\t\t\t\"dsh-coding-subscription-oauth: independent settings entry\",\r\n\t\t\t);\r\n\t\t},\r\n\t});\r\n}\r\n", "/** Plugin-owned coding subscription account section inside the dsh Settings shell. */\r\n\r\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\r\nimport { cancelPreviewTicket, copyText, isConflictError, isConsumedPreviewError, jsonRequest } from \"./api.ts\";\r\nimport { AboutTab } from \"./components/AboutTab.tsx\";\r\nimport { AccountsTab } from \"./components/AccountsTab.tsx\";\r\nimport { CapabilitiesTab } from \"./components/CapabilitiesTab.tsx\";\r\nimport { GatewayTab } from \"./components/GatewayTab.tsx\";\r\nimport type { SettingsTabHint } from \"./components/SettingsTabs.tsx\";\r\nimport { SettingsTabs } from \"./components/SettingsTabs.tsx\";\r\nimport {\r\n\tCAPABILITIES_PATH,\r\n\tCODEX_USAGE_PATH,\r\n\tGATEWAY_PATH,\r\n\tGATEWAY_REVEAL_PATH,\r\n\tGATEWAY_ROTATE_PATH,\r\n\tIMAGINE_CREDENTIAL_PATH,\r\n\tLOGIN_CANCEL_PATH,\r\n\tLOGIN_CODE_PATH,\r\n\tLOGIN_PATH,\r\n\tLOGOUT_PATH,\r\n\tMODELS_PATH,\r\n\tPOLL_INTERVAL_MS,\r\n\tSOURCE_COMMIT_ACTION_KEY,\r\n\tSOURCES_CANCEL_PATH,\r\n\tSOURCES_COMMIT_PATH,\r\n\tSOURCES_PATH,\r\n\tSOURCES_PREVIEW_PATH,\r\n\tSTATUS_PATH,\r\n} from \"./constants.ts\";\r\nimport { ensureMicroStyles } from \"./microStyles.ts\";\r\nimport {\r\n\temptyCapabilitySettings,\r\n\tmergeSources,\r\n\tparseCapabilities,\r\n\tparseCommitAction,\r\n\tparseGateway,\r\n\tparseGatewayPort,\r\n\tparseImagineCredential,\r\n\tparsePreview,\r\n\tparseSources,\r\n\tparseUsage,\r\n} from \"./parsers.ts\";\r\nimport { bodyStyle, buttonStyle, errorStyle, pageStyle, panelStyle, titleStyle } from \"./styles.ts\";\r\nimport type {\r\n\tCapabilitySettingKey,\r\n\tCapabilitySettingsView,\r\n\tCapabilitySnapshot,\r\n\tCodingOAuthStatus,\r\n\tCopyField,\r\n\tGatewayView,\r\n\tGrokBuildSettingsProps,\r\n\tImagineCredentialView,\r\n\tLoginChallenge,\r\n\tLoginMethod,\r\n\tProviderSlug,\r\n\tSettingsTabId,\r\n\tSourceKind,\r\n\tSourcePreview,\r\n\tSourceStatus,\r\n\tUsageView,\r\n} from \"./types.ts\";\r\n\r\nexport type { GrokBuildSettingsInjected, GrokBuildSettingsProps } from \"./types.ts\";\r\n\r\nconst REMOTE_TIP_STORAGE_KEY = \"dsh-coding-oauth-remote-tip-dismissed\";\r\n\r\nfunction readRemoteTipDismissed(): boolean {\r\n\ttry {\r\n\t\treturn globalThis.sessionStorage?.getItem(REMOTE_TIP_STORAGE_KEY) === \"1\";\r\n\t} catch {\r\n\t\treturn false;\r\n\t}\r\n}\r\n\r\n/** Multi-provider coding subscription status and OAuth actions. */\r\nexport function GrokBuildSettings({ t }: GrokBuildSettingsProps) {\r\n\tif (t === undefined) throw new Error(\"Coding OAuth settings requires its translation function\");\r\n\r\n\tconst [status, setStatus] = useState<CodingOAuthStatus | undefined>(undefined);\r\n\tconst [requestError, setRequestError] = useState<string | undefined>(undefined);\r\n\tconst [busyProvider, setBusyProvider] = useState<ProviderSlug | undefined>(undefined);\r\n\tconst [codeInputs, setCodeInputs] = useState<Partial<Record<ProviderSlug, string>>>({});\r\n\tconst [popupBlocked, setPopupBlocked] = useState<Partial<Record<ProviderSlug, boolean>>>({});\r\n\tconst [sources, setSources] = useState<SourceStatus[] | undefined>(undefined);\r\n\tconst [sourcesError, setSourcesError] = useState<string | undefined>(undefined);\r\n\tconst [sourcesBusy, setSourcesBusy] = useState(false);\r\n\tconst [preview, setPreview] = useState<SourcePreview | undefined>(undefined);\r\n\tconst previewRef = useRef<SourcePreview | undefined>(undefined);\r\n\tconst previewEpochRef = useRef(0);\r\n\tconst mountedRef = useRef(true);\r\n\tconst [confirmOverwrite, setConfirmOverwrite] = useState(false);\r\n\tconst [sourcesNotice, setSourcesNotice] = useState<string | undefined>(undefined);\r\n\tconst [capabilities, setCapabilities] = useState<CapabilitySnapshot | undefined>(undefined);\r\n\tconst [capabilitiesError, setCapabilitiesError] = useState<string | undefined>(undefined);\r\n\tconst [capabilitiesBusy, setCapabilitiesBusy] = useState(false);\r\n\tconst [capabilitiesLoaded, setCapabilitiesLoaded] = useState(false);\r\n\tconst [usage, setUsage] = useState<UsageView | undefined>(undefined);\r\n\tconst [usageError, setUsageError] = useState<string | undefined>(undefined);\r\n\tconst [usageLoading, setUsageLoading] = useState(false);\r\n\tconst [imagine, setImagine] = useState<ImagineCredentialView | undefined>(undefined);\r\n\tconst [imagineError, setImagineError] = useState<string | undefined>(undefined);\r\n\tconst [gateway, setGateway] = useState<GatewayView | undefined>(undefined);\r\n\tconst [gatewayError, setGatewayError] = useState<string | undefined>(undefined);\r\n\tconst [gatewayBusy, setGatewayBusy] = useState(false);\r\n\tconst [gatewayLoaded, setGatewayLoaded] = useState(false);\r\n\tconst [gatewayOnceKey, setGatewayOnceKey] = useState<string | undefined>(undefined);\r\n\tconst [gatewayKeyVisible, setGatewayKeyVisible] = useState(false);\r\n\tconst [gatewayRotateConfirm, setGatewayRotateConfirm] = useState(false);\r\n\tconst [gatewayRevealError, setGatewayRevealError] = useState<string | undefined>(undefined);\r\n\tconst [portDraft, setPortDraft] = useState(\"\");\r\n\tconst [activeTab, setActiveTab] = useState<SettingsTabId>(\"accounts\");\r\n\tconst [copiedField, setCopiedField] = useState<CopyField | undefined>(undefined);\r\n\tconst [copyFailedField, setCopyFailedField] = useState<CopyField | undefined>(undefined);\r\n\tconst [expandedProviders, setExpandedProviders] = useState<Partial<Record<ProviderSlug, boolean>>>({});\r\n\tconst [remoteTipDismissed, setRemoteTipDismissed] = useState(readRemoteTipDismissed);\r\n\tconst copiedTimerRef = useRef<number | undefined>(undefined);\r\n\tconst remote = status?.accessMode === \"ssh-tunnel\" || status?.accessMode === \"trusted-https-proxy\";\r\n\r\n\tconst refresh = useCallback(async () => {\r\n\t\ttry {\r\n\t\t\tconst next = await jsonRequest<CodingOAuthStatus>(STATUS_PATH);\r\n\t\t\tsetStatus(next);\r\n\t\t\tsetRequestError(undefined);\r\n\t\t\treturn next;\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetRequestError(error instanceof Error ? error.message : t(\"requestFailed\"));\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\t}, [t]);\r\n\r\n\tconst refreshSources = useCallback(async () => {\r\n\t\ttry {\r\n\t\t\tsetSources(parseSources(await jsonRequest<unknown>(SOURCES_PATH)));\r\n\t\t\tsetSourcesError(undefined);\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetSources(mergeSources([]));\r\n\t\t\tsetSourcesError(error instanceof Error ? error.message : t(\"sourcesLoadFailed\"));\r\n\t\t}\r\n\t}, [t]);\r\n\r\n\tconst refreshCapabilities = useCallback(async () => {\r\n\t\ttry {\r\n\t\t\tconst parsed = parseCapabilities(await jsonRequest<unknown>(CAPABILITIES_PATH));\r\n\t\t\tsetCapabilities(parsed ?? { value: emptyCapabilitySettings(), revision: 0, writable: false });\r\n\t\t\tsetCapabilitiesError(undefined);\r\n\t\t\treturn parsed;\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetCapabilities({ value: emptyCapabilitySettings(), revision: 0, writable: false });\r\n\t\t\tsetCapabilitiesError(error instanceof Error ? error.message : t(\"capabilitiesLoadFailed\"));\r\n\t\t\treturn undefined;\r\n\t\t} finally {\r\n\t\t\tsetCapabilitiesLoaded(true);\r\n\t\t}\r\n\t}, [t]);\r\n\r\n\tconst refreshGateway = useCallback(async () => {\r\n\t\ttry {\r\n\t\t\tsetGateway(parseGateway(await jsonRequest<unknown>(GATEWAY_PATH)));\r\n\t\t\tsetGatewayError(undefined);\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetGatewayError(error instanceof Error ? error.message : t(\"gatewayLoadFailed\"));\r\n\t\t} finally {\r\n\t\t\tsetGatewayLoaded(true);\r\n\t\t}\r\n\t}, [t]);\r\n\r\n\tconst refreshImagine = useCallback(async () => {\r\n\t\ttry {\r\n\t\t\tsetImagine(parseImagineCredential(await jsonRequest<unknown>(IMAGINE_CREDENTIAL_PATH)));\r\n\t\t\tsetImagineError(undefined);\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetImagineError(error instanceof Error ? error.message : t(\"imagineLoadFailed\"));\r\n\t\t}\r\n\t}, [t]);\r\n\r\n\tconst refreshUsage = useCallback(async () => {\r\n\t\tsetUsageLoading(true);\r\n\t\ttry {\r\n\t\t\tsetUsage(parseUsage(await jsonRequest<unknown>(CODEX_USAGE_PATH)));\r\n\t\t\tsetUsageError(undefined);\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetUsage(undefined);\r\n\t\t\tsetUsageError(error instanceof Error ? error.message : t(\"usageUnavailable\"));\r\n\t\t} finally {\r\n\t\t\tsetUsageLoading(false);\r\n\t\t}\r\n\t}, [t]);\r\n\r\n\t// Accounts: status immediately; sources shortly after (non-blocking for first paint).\r\n\tuseEffect(() => {\r\n\t\tensureMicroStyles();\r\n\t\tlet active = true;\r\n\t\tlet timer: number | undefined;\r\n\t\tvoid refresh().then((next) => {\r\n\t\t\tif (!active || next?.uiOwner === \"hub\") return;\r\n\t\t\ttimer = window.setTimeout(() => void refreshSources(), 0);\r\n\t\t});\r\n\t\treturn () => {\r\n\t\t\tactive = false;\r\n\t\t\tif (timer !== undefined) window.clearTimeout(timer);\r\n\t\t};\r\n\t}, [refresh, refreshSources]);\r\n\r\n\t// Capabilities tab: load settings + Imagine status on first visit.\r\n\tuseEffect(() => {\r\n\t\tif (activeTab !== \"capabilities\") return;\r\n\t\tif (!capabilitiesLoaded) void refreshCapabilities();\r\n\t\tvoid refreshImagine();\r\n\t}, [activeTab, capabilitiesLoaded, refreshCapabilities, refreshImagine]);\r\n\r\n\t// Soft-fetch capabilities when Codex is signed in so Accounts can show quota without opening the tab.\r\n\tuseEffect(() => {\r\n\t\tif (capabilitiesLoaded) return;\r\n\t\tif (status?.providers.codex.status !== \"signed-in\") return;\r\n\t\tvoid refreshCapabilities();\r\n\t}, [capabilitiesLoaded, refreshCapabilities, status?.providers.codex.status]);\r\n\r\n\t// Gateway: load only when that tab is opened.\r\n\tuseEffect(() => {\r\n\t\tif (activeTab !== \"gateway\" || gatewayLoaded) return;\r\n\t\tvoid refreshGateway();\r\n\t}, [activeTab, gatewayLoaded, refreshGateway]);\r\n\r\n\tuseEffect(() => {\r\n\t\tpreviewRef.current = preview;\r\n\t}, [preview]);\r\n\r\n\tuseEffect(() => {\r\n\t\tmountedRef.current = true;\r\n\t\treturn () => {\r\n\t\t\tmountedRef.current = false;\r\n\t\t\tif (copiedTimerRef.current !== undefined) window.clearTimeout(copiedTimerRef.current);\r\n\t\t\tpreviewEpochRef.current += 1;\r\n\t\t\tconst active = previewRef.current;\r\n\t\t\tif (active !== undefined) cancelPreviewTicket(active.previewId, true);\r\n\t\t};\r\n\t}, []);\r\n\r\n\tuseEffect(() => {\r\n\t\tconst signingIn =\r\n\t\t\tstatus !== undefined && Object.values(status.providers).some((provider) => provider.status === \"signing-in\");\r\n\t\tif (!signingIn) return;\r\n\t\tconst timer = window.setInterval(() => {\r\n\t\t\tvoid refresh();\r\n\t\t}, POLL_INTERVAL_MS);\r\n\t\treturn () => {\r\n\t\t\twindow.clearInterval(timer);\r\n\t\t};\r\n\t}, [refresh, status]);\r\n\r\n\tuseEffect(() => {\r\n\t\tconst signedIn = status?.providers.codex.status === \"signed-in\";\r\n\t\tif (capabilities?.value.codexUsage === true && signedIn) {\r\n\t\t\tvoid refreshUsage();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tsetUsage(undefined);\r\n\t\tsetUsageError(undefined);\r\n\t\tsetUsageLoading(false);\r\n\t}, [capabilities?.value.codexUsage, refreshUsage, status?.providers.codex.status]);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (gateway !== undefined) setPortDraft(String(gateway.port));\r\n\t}, [gateway]);\r\n\r\n\tconst signIn = async (provider: ProviderSlug, method: LoginMethod): Promise<void> => {\r\n\t\tconst popup = window.open(\"about:blank\", \"_blank\");\r\n\t\tif (popup !== null) popup.opener = null;\r\n\t\tsetBusyProvider(provider);\r\n\t\tsetRequestError(undefined);\r\n\t\tsetPopupBlocked((current) => ({ ...current, [provider]: popup === null }));\r\n\t\ttry {\r\n\t\t\tconst challenge = await jsonRequest<LoginChallenge>(LOGIN_PATH, \"POST\", { provider, method });\r\n\t\t\tif (popup !== null) popup.location.replace(challenge.url);\r\n\t\t\tawait refresh();\r\n\t\t} catch (error: unknown) {\r\n\t\t\tpopup?.close();\r\n\t\t\tsetRequestError(error instanceof Error ? error.message : t(\"requestFailed\"));\r\n\t\t\tawait refresh();\r\n\t\t} finally {\r\n\t\t\tsetBusyProvider(undefined);\r\n\t\t}\r\n\t};\r\n\r\n\tconst submitCode = async (provider: ProviderSlug): Promise<void> => {\r\n\t\tconst code = codeInputs[provider]?.trim() ?? \"\";\r\n\t\tif (code.length === 0) return;\r\n\t\tsetBusyProvider(provider);\r\n\t\ttry {\r\n\t\t\tawait jsonRequest<{ ok: true }>(LOGIN_CODE_PATH, \"POST\", { provider, code });\r\n\t\t\tsetCodeInputs((current) => ({ ...current, [provider]: \"\" }));\r\n\t\t\tawait refresh();\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetRequestError(error instanceof Error ? error.message : t(\"requestFailed\"));\r\n\t\t} finally {\r\n\t\t\tsetBusyProvider(undefined);\r\n\t\t}\r\n\t};\r\n\r\n\tconst cancelLogin = async (provider: ProviderSlug): Promise<void> => {\r\n\t\tsetBusyProvider(provider);\r\n\t\ttry {\r\n\t\t\tsetStatus(await jsonRequest<CodingOAuthStatus>(LOGIN_CANCEL_PATH, \"POST\", { provider }));\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetRequestError(error instanceof Error ? error.message : t(\"requestFailed\"));\r\n\t\t} finally {\r\n\t\t\tsetBusyProvider(undefined);\r\n\t\t}\r\n\t};\r\n\r\n\tconst signOut = async (provider: ProviderSlug): Promise<void> => {\r\n\t\tsetBusyProvider(provider);\r\n\t\ttry {\r\n\t\t\tsetStatus(await jsonRequest<CodingOAuthStatus>(LOGOUT_PATH, \"POST\", { provider }));\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetRequestError(error instanceof Error ? error.message : t(\"requestFailed\"));\r\n\t\t} finally {\r\n\t\t\tsetBusyProvider(undefined);\r\n\t\t}\r\n\t};\r\n\r\n\tconst saveModels = async (provider: ProviderSlug, selected: string[]): Promise<void> => {\r\n\t\tsetBusyProvider(provider);\r\n\t\ttry {\r\n\t\t\tsetStatus(await jsonRequest<CodingOAuthStatus>(MODELS_PATH, \"POST\", { provider, selected }));\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetRequestError(error instanceof Error ? error.message : t(\"requestFailed\"));\r\n\t\t} finally {\r\n\t\t\tsetBusyProvider(undefined);\r\n\t\t}\r\n\t};\r\n\r\n\tconst previewSource = async (kind: SourceKind): Promise<void> => {\r\n\t\tconst epoch = ++previewEpochRef.current;\r\n\t\tconst previous = previewRef.current;\r\n\t\tif (previous !== undefined) {\r\n\t\t\tpreviewRef.current = undefined;\r\n\t\t\tsetPreview(undefined);\r\n\t\t\tcancelPreviewTicket(previous.previewId);\r\n\t\t}\r\n\t\tsetSourcesBusy(true);\r\n\t\tsetSourcesNotice(undefined);\r\n\t\tsetConfirmOverwrite(false);\r\n\t\ttry {\r\n\t\t\tconst next = parsePreview(await jsonRequest<unknown>(SOURCES_PREVIEW_PATH, \"POST\", { kind }));\r\n\t\t\tif (next === undefined) throw new Error(t(\"sourcesPreviewFailed\"));\r\n\t\t\tif (!mountedRef.current || epoch !== previewEpochRef.current) {\r\n\t\t\t\tcancelPreviewTicket(next.previewId, !mountedRef.current);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tpreviewRef.current = next;\r\n\t\t\tsetPreview(next);\r\n\t\t\tsetSourcesError(undefined);\r\n\t\t} catch (error: unknown) {\r\n\t\t\tif (!mountedRef.current || epoch !== previewEpochRef.current) return;\r\n\t\t\tsetPreview(undefined);\r\n\t\t\tsetSourcesError(error instanceof Error ? error.message : t(\"sourcesPreviewFailed\"));\r\n\t\t} finally {\r\n\t\t\tif (mountedRef.current && epoch === previewEpochRef.current) setSourcesBusy(false);\r\n\t\t}\r\n\t};\r\n\r\n\tconst commitSource = async (): Promise<void> => {\r\n\t\tif (preview === undefined) return;\r\n\t\tif (preview.action === \"blocked\") return;\r\n\t\tif (preview.confirmOverwriteRequired && !confirmOverwrite) return;\r\n\t\tsetSourcesBusy(true);\r\n\t\ttry {\r\n\t\t\tconst result = await jsonRequest<unknown>(SOURCES_COMMIT_PATH, \"POST\", {\r\n\t\t\t\tkind: preview.kind,\r\n\t\t\t\tpreviewId: preview.previewId,\r\n\t\t\t\tconfirmOverwrite,\r\n\t\t\t});\r\n\t\t\tconst action = parseCommitAction(result);\r\n\t\t\tpreviewRef.current = undefined;\r\n\t\t\tsetPreview(undefined);\r\n\t\t\tsetConfirmOverwrite(false);\r\n\t\t\tsetSourcesNotice(\r\n\t\t\t\tt(\"sourcesCommitSuccess\", { action: action === undefined ? \"\" : t(SOURCE_COMMIT_ACTION_KEY[action]) }),\r\n\t\t\t);\r\n\t\t\tsetSourcesError(undefined);\r\n\t\t\tawait refreshSources();\r\n\t\t\tawait refresh();\r\n\t\t} catch (error: unknown) {\r\n\t\t\tif (isConsumedPreviewError(error)) {\r\n\t\t\t\tpreviewRef.current = undefined;\r\n\t\t\t\tsetPreview(undefined);\r\n\t\t\t\tsetConfirmOverwrite(false);\r\n\t\t\t}\r\n\t\t\tsetSourcesError(error instanceof Error ? error.message : t(\"sourcesCommitFailed\"));\r\n\t\t\tawait refreshSources();\r\n\t\t} finally {\r\n\t\t\tsetSourcesBusy(false);\r\n\t\t}\r\n\t};\r\n\r\n\tconst cancelSourcePreview = async (): Promise<void> => {\r\n\t\tif (preview === undefined) return;\r\n\t\tconst previewId = preview.previewId;\r\n\t\tpreviewEpochRef.current += 1;\r\n\t\tpreviewRef.current = undefined;\r\n\t\tsetPreview(undefined);\r\n\t\tsetConfirmOverwrite(false);\r\n\t\tsetSourcesBusy(true);\r\n\t\ttry {\r\n\t\t\tawait jsonRequest<unknown>(SOURCES_CANCEL_PATH, \"POST\", { previewId });\r\n\t\t\tsetSourcesError(undefined);\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetSourcesError(error instanceof Error ? error.message : t(\"requestFailed\"));\r\n\t\t} finally {\r\n\t\t\tsetSourcesBusy(false);\r\n\t\t}\r\n\t};\r\n\r\n\tconst patchCapability = async (key: CapabilitySettingKey, value: boolean | number): Promise<boolean> => {\r\n\t\tif (capabilities === undefined || !capabilities.writable) return false;\r\n\t\tif (key === \"codexImageEdits\" && value === true && !capabilities.value.codexImages) return false;\r\n\t\tif (key === \"codexImagesAnyModel\" && value === true && !capabilities.value.codexImages) return false;\r\n\t\tconst patch: Partial<CapabilitySettingsView> =\r\n\t\t\tkey === \"codexImages\" && value === false\r\n\t\t\t\t? { codexImages: false, codexImageEdits: false, codexImagesAnyModel: false }\r\n\t\t\t\t: ({ [key]: value } as Partial<CapabilitySettingsView>);\r\n\t\tsetCapabilitiesBusy(true);\r\n\t\ttry {\r\n\t\t\tconst updated = parseCapabilities(\r\n\t\t\t\tawait jsonRequest<unknown>(CAPABILITIES_PATH, \"PATCH\", {\r\n\t\t\t\t\texpectedRevision: capabilities.revision,\r\n\t\t\t\t\tpatch,\r\n\t\t\t\t}),\r\n\t\t\t);\r\n\t\t\tif (updated !== undefined) setCapabilities(updated);\r\n\t\t\telse await refreshCapabilities();\r\n\t\t\tsetCapabilitiesError(undefined);\r\n\t\t\treturn true;\r\n\t\t} catch (error: unknown) {\r\n\t\t\tawait refreshCapabilities();\r\n\t\t\tsetCapabilitiesError(\r\n\t\t\t\tisConflictError(error)\r\n\t\t\t\t\t? t(\"capabilitiesConflictRefreshed\")\r\n\t\t\t\t\t: error instanceof Error\r\n\t\t\t\t\t\t? error.message\r\n\t\t\t\t\t\t: t(\"capabilitiesSaveFailed\"),\r\n\t\t\t);\r\n\t\t\treturn false;\r\n\t\t} finally {\r\n\t\t\tsetCapabilitiesBusy(false);\r\n\t\t}\r\n\t};\r\n\r\n\tconst showUsage = capabilities?.value.codexUsage === true && status?.providers.codex.status === \"signed-in\";\r\n\tconst signedInCount =\r\n\t\tstatus === undefined\r\n\t\t\t? 0\r\n\t\t\t: Object.values(status.providers).filter((provider) => provider.status === \"signed-in\").length;\r\n\r\n\tconst tabHints = useMemo((): readonly SettingsTabHint[] => {\r\n\t\tconst hints: SettingsTabHint[] = [];\r\n\t\tif (status !== undefined) {\r\n\t\t\tconst signedInCount = Object.values(status.providers).filter(\r\n\t\t\t\t(provider) => provider.status === \"signed-in\",\r\n\t\t\t).length;\r\n\t\t\tif (signedInCount > 0) {\r\n\t\t\t\thints.push({ id: \"accounts\", suffix: String(signedInCount) });\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (gateway?.running === true) {\r\n\t\t\thints.push({ id: \"gateway\", suffix: t(\"tabGatewayActive\") });\r\n\t\t}\r\n\t\treturn hints;\r\n\t}, [gateway?.running, status, t]);\r\n\r\n\tconst markCopied = (field: CopyField): void => {\r\n\t\tif (copiedTimerRef.current !== undefined) window.clearTimeout(copiedTimerRef.current);\r\n\t\tsetCopiedField(field);\r\n\t\tsetCopyFailedField(undefined);\r\n\t\tcopiedTimerRef.current = window.setTimeout(() => {\r\n\t\t\tif (mountedRef.current) {\r\n\t\t\t\tsetCopiedField(undefined);\r\n\t\t\t\tsetCopyFailedField(undefined);\r\n\t\t\t}\r\n\t\t\tcopiedTimerRef.current = undefined;\r\n\t\t}, 2000);\r\n\t};\r\n\r\n\tconst handleCopy = async (field: CopyField, text: string): Promise<void> => {\r\n\t\tconst ok = await copyText(text);\r\n\t\tif (ok) {\r\n\t\t\tmarkCopied(field);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tsetCopiedField(undefined);\r\n\t\tsetCopyFailedField(field);\r\n\t};\r\n\r\n\tconst ensureGatewayKey = async (): Promise<string> => {\r\n\t\tif (gatewayOnceKey !== undefined) return gatewayOnceKey;\r\n\t\tconst value = await jsonRequest<{ apiKey?: string }>(GATEWAY_REVEAL_PATH, \"POST\");\r\n\t\tif (typeof value.apiKey !== \"string\" || value.apiKey.length === 0) {\r\n\t\t\tthrow new Error(t(\"gatewayRevealFailed\"));\r\n\t\t}\r\n\t\tsetGatewayOnceKey(value.apiKey);\r\n\t\treturn value.apiKey;\r\n\t};\r\n\r\n\tconst copyGatewayKey = async (): Promise<void> => {\r\n\t\ttry {\r\n\t\t\tconst key = await ensureGatewayKey();\r\n\t\t\tawait handleCopy(\"key\", key);\r\n\t\t\tsetGatewayRevealError(undefined);\r\n\t\t} catch {\r\n\t\t\tsetGatewayRevealError(t(\"gatewayRevealFailed\"));\r\n\t\t}\r\n\t};\r\n\r\n\tconst toggleGatewayKeyVisible = async (): Promise<void> => {\r\n\t\tif (gatewayKeyVisible) {\r\n\t\t\tsetGatewayKeyVisible(false);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\ttry {\r\n\t\t\tawait ensureGatewayKey();\r\n\t\t\tsetGatewayKeyVisible(true);\r\n\t\t\tsetGatewayRevealError(undefined);\r\n\t\t} catch {\r\n\t\t\tsetGatewayRevealError(t(\"gatewayRevealFailed\"));\r\n\t\t}\r\n\t};\r\n\r\n\tconst applyGatewayPort = async (): Promise<void> => {\r\n\t\tconst port = parseGatewayPort(portDraft);\r\n\t\tif (port === undefined) {\r\n\t\t\tsetGatewayError(t(\"gatewayPortInvalid\"));\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (gateway !== undefined && port === gateway.port) return;\r\n\t\tsetGatewayBusy(true);\r\n\t\ttry {\r\n\t\t\tsetGateway(parseGateway(await jsonRequest<unknown>(GATEWAY_PATH, \"PATCH\", { port })) ?? gateway);\r\n\t\t\tsetGatewayError(undefined);\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetGatewayError(error instanceof Error ? error.message : t(\"gatewaySaveFailed\"));\r\n\t\t\tif (gateway !== undefined) setPortDraft(String(gateway.port));\r\n\t\t} finally {\r\n\t\t\tsetGatewayBusy(false);\r\n\t\t}\r\n\t};\r\n\r\n\tconst rotateGatewayKey = async (): Promise<void> => {\r\n\t\tsetGatewayBusy(true);\r\n\t\ttry {\r\n\t\t\tconst value = await jsonRequest<{ apiKey?: string; keyHint?: string }>(GATEWAY_ROTATE_PATH, \"POST\");\r\n\t\t\tif (typeof value.apiKey === \"string\") setGatewayOnceKey(value.apiKey);\r\n\t\t\tsetGatewayKeyVisible(true);\r\n\t\t\tsetGatewayRotateConfirm(false);\r\n\t\t\tsetGatewayRevealError(undefined);\r\n\t\t\tawait refreshGateway();\r\n\t\t} catch (error: unknown) {\r\n\t\t\tsetGatewayError(error instanceof Error ? error.message : t(\"gatewaySaveFailed\"));\r\n\t\t} finally {\r\n\t\t\tsetGatewayBusy(false);\r\n\t\t}\r\n\t};\r\n\r\n\tconst setGatewayEnabled = (enabled: boolean): void => {\r\n\t\tsetGatewayBusy(true);\r\n\t\tvoid jsonRequest<unknown>(GATEWAY_PATH, \"PATCH\", { enabled })\r\n\t\t\t.then((value) => {\r\n\t\t\t\tsetGateway(parseGateway(value) ?? gateway);\r\n\t\t\t\tsetGatewayError(undefined);\r\n\t\t\t})\r\n\t\t\t.catch((error: unknown) => {\r\n\t\t\t\tsetGatewayError(error instanceof Error ? error.message : t(\"gatewaySaveFailed\"));\r\n\t\t\t})\r\n\t\t\t.finally(() => {\r\n\t\t\t\tsetGatewayBusy(false);\r\n\t\t\t});\r\n\t};\r\n\r\n\tconst dismissRemoteTip = (): void => {\r\n\t\tsetRemoteTipDismissed(true);\r\n\t\ttry {\r\n\t\t\tglobalThis.sessionStorage?.setItem(REMOTE_TIP_STORAGE_KEY, \"1\");\r\n\t\t} catch {\r\n\t\t\t// ignore storage failures\r\n\t\t}\r\n\t};\r\n\r\n\tconst openAccountsForCodex = (): void => {\r\n\t\tsetActiveTab(\"accounts\");\r\n\t\twindow.setTimeout(() => document.getElementById(\"coding-oauth-login-codex\")?.focus(), 0);\r\n\t};\r\n\r\n\tconst focusCapabilityDependency = (target: \"codexImages\" | \"imagineCredential\"): void => {\r\n\t\tconst id = target === \"codexImages\" ? \"cap-switch-codexImages\" : \"coding-oauth-imagine-credential\";\r\n\t\tdocument.getElementById(id)?.focus();\r\n\t};\r\n\r\n\tif (status?.uiOwner === \"hub\") {\r\n\t\treturn (\r\n\t\t\t<section data-dsh-coding-oauth=\"compact\" style={pageStyle} aria-labelledby=\"coding-oauth-settings-title\">\r\n\t\t\t\t<h2 id=\"coding-oauth-settings-title\" style={titleStyle}>\r\n\t\t\t\t\t{t(\"coinstallTitle\")}\r\n\t\t\t\t</h2>\r\n\t\t\t\t<p style={bodyStyle}>{t(\"coinstallSummary\", { count: signedInCount })}</p>\r\n\t\t\t\t<button\r\n\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\tstyle={buttonStyle}\r\n\t\t\t\t\tonClick={() => window.dispatchEvent(new CustomEvent(\"usage-stats:open-dashboard\"))}\r\n\t\t\t\t>\r\n\t\t\t\t\t{t(\"coinstallOpenHub\")}\r\n\t\t\t\t</button>\r\n\t\t\t</section>\r\n\t\t);\r\n\t}\r\n\r\n\treturn (\r\n\t\t<section data-dsh-coding-oauth=\"\" style={pageStyle} aria-labelledby=\"coding-oauth-settings-title\">\r\n\t\t\t<div>\r\n\t\t\t\t<h2 id=\"coding-oauth-settings-title\" style={titleStyle}>\r\n\t\t\t\t\t{t(\"title\")}\r\n\t\t\t\t</h2>\r\n\t\t\t\t{activeTab === \"accounts\" ? <p style={{ ...bodyStyle, marginTop: 6 }}>{t(\"intro\")}</p> : null}\r\n\t\t\t</div>\r\n\t\t\t{requestError === undefined ? null : (\r\n\t\t\t\t<div role=\"alert\" style={{ display: \"flex\", flexWrap: \"wrap\", alignItems: \"center\", gap: 8 }}>\r\n\t\t\t\t\t<p style={errorStyle}>{requestError}</p>\r\n\t\t\t\t\t{status === undefined ? (\r\n\t\t\t\t\t\t<button type=\"button\" style={buttonStyle} onClick={() => void refresh()}>\r\n\t\t\t\t\t\t\t{t(\"retry\")}\r\n\t\t\t\t\t\t</button>\r\n\t\t\t\t\t) : null}\r\n\t\t\t\t</div>\r\n\t\t\t)}\r\n\t\t\t<SettingsTabs t={t} activeTab={activeTab} onChange={setActiveTab} hints={tabHints} />\r\n\t\t\t<div\r\n\t\t\t\tid={`coding-oauth-panel-${activeTab}`}\r\n\t\t\t\trole=\"tabpanel\"\r\n\t\t\t\taria-labelledby={`coding-oauth-tab-${activeTab}`}\r\n\t\t\t\tstyle={panelStyle}\r\n\t\t\t>\r\n\t\t\t\t{activeTab === \"accounts\" && !(status === undefined && requestError !== undefined) ? (\r\n\t\t\t\t\t<AccountsTab\r\n\t\t\t\t\t\tt={t}\r\n\t\t\t\t\t\tstatus={status}\r\n\t\t\t\t\t\tremote={remote}\r\n\t\t\t\t\t\tremoteTipDismissed={remoteTipDismissed}\r\n\t\t\t\t\t\tonDismissRemoteTip={dismissRemoteTip}\r\n\t\t\t\t\t\tsources={sources}\r\n\t\t\t\t\t\tsourcesError={sourcesError}\r\n\t\t\t\t\t\tsourcesNotice={sourcesNotice}\r\n\t\t\t\t\t\tsourcesBusy={sourcesBusy}\r\n\t\t\t\t\t\tpreview={preview}\r\n\t\t\t\t\t\tconfirmOverwrite={confirmOverwrite}\r\n\t\t\t\t\t\tbusyProvider={busyProvider}\r\n\t\t\t\t\t\tcodeInputs={codeInputs}\r\n\t\t\t\t\t\tpopupBlocked={popupBlocked}\r\n\t\t\t\t\t\texpandedProviders={expandedProviders}\r\n\t\t\t\t\t\tshowUsage={showUsage === true}\r\n\t\t\t\t\t\tusage={usage}\r\n\t\t\t\t\t\tusageError={usageError}\r\n\t\t\t\t\t\tusageLoading={usageLoading}\r\n\t\t\t\t\t\tonSignIn={(slug, method) => {\r\n\t\t\t\t\t\t\tvoid signIn(slug, method);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonSignOut={(slug) => {\r\n\t\t\t\t\t\t\tvoid signOut(slug);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonCancelLogin={(slug) => {\r\n\t\t\t\t\t\t\tvoid cancelLogin(slug);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonSubmitCode={(slug) => {\r\n\t\t\t\t\t\t\tvoid submitCode(slug);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonCodeChange={(slug, value) => {\r\n\t\t\t\t\t\t\tsetCodeInputs((current) => ({ ...current, [slug]: value }));\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonToggleExpanded={(slug) => {\r\n\t\t\t\t\t\t\tsetExpandedProviders((current) => ({\r\n\t\t\t\t\t\t\t\t...current,\r\n\t\t\t\t\t\t\t\t[slug]: !(current[slug] === true),\r\n\t\t\t\t\t\t\t}));\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonPreviewSource={(slug) => {\r\n\t\t\t\t\t\t\tvoid previewSource(slug);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonSaveModels={(slug, selected) => {\r\n\t\t\t\t\t\t\tvoid saveModels(slug, selected);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonConfirmOverwriteChange={setConfirmOverwrite}\r\n\t\t\t\t\t\tonCommitSource={() => {\r\n\t\t\t\t\t\t\tvoid commitSource();\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonCancelSourcePreview={() => {\r\n\t\t\t\t\t\t\tvoid cancelSourcePreview();\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonRefreshSources={() => {\r\n\t\t\t\t\t\t\tvoid refreshSources();\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonDismissSourcesNotice={() => {\r\n\t\t\t\t\t\t\tsetSourcesNotice(undefined);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t/>\r\n\t\t\t\t) : null}\r\n\t\t\t\t{activeTab === \"capabilities\" ? (\r\n\t\t\t\t\t<CapabilitiesTab\r\n\t\t\t\t\t\tt={t}\r\n\t\t\t\t\t\tcapabilities={capabilities}\r\n\t\t\t\t\t\tcapabilitiesError={capabilitiesError}\r\n\t\t\t\t\t\tcapabilitiesBusy={capabilitiesBusy}\r\n\t\t\t\t\t\timagine={imagine}\r\n\t\t\t\t\t\timagineError={imagineError}\r\n\t\t\t\t\t\tcodexSignedIn={status?.providers.codex.status === \"signed-in\"}\r\n\t\t\t\t\t\tonRetry={() => {\r\n\t\t\t\t\t\t\tvoid refreshCapabilities();\r\n\t\t\t\t\t\t\tvoid refreshImagine();\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonOpenAccounts={openAccountsForCodex}\r\n\t\t\t\t\t\tonFocusDependency={focusCapabilityDependency}\r\n\t\t\t\t\t\tonPatchCapability={(key, value) => patchCapability(key, value)}\r\n\t\t\t\t\t/>\r\n\t\t\t\t) : null}\r\n\t\t\t\t{activeTab === \"gateway\" ? (\r\n\t\t\t\t\t<GatewayTab\r\n\t\t\t\t\t\tt={t}\r\n\t\t\t\t\t\tgateway={gateway}\r\n\t\t\t\t\t\tgatewayError={gatewayError}\r\n\t\t\t\t\t\tgatewayBusy={gatewayBusy}\r\n\t\t\t\t\t\tgatewayOnceKey={gatewayOnceKey}\r\n\t\t\t\t\t\tgatewayKeyVisible={gatewayKeyVisible}\r\n\t\t\t\t\t\tgatewayRotateConfirm={gatewayRotateConfirm}\r\n\t\t\t\t\t\tgatewayRevealError={gatewayRevealError}\r\n\t\t\t\t\t\tportDraft={portDraft}\r\n\t\t\t\t\t\tcopiedField={copiedField}\r\n\t\t\t\t\t\tcopyFailedField={copyFailedField}\r\n\t\t\t\t\t\tonRetry={() => {\r\n\t\t\t\t\t\t\tvoid refreshGateway();\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonEnabledChange={setGatewayEnabled}\r\n\t\t\t\t\t\tonPortDraftChange={setPortDraft}\r\n\t\t\t\t\t\tonApplyPort={() => {\r\n\t\t\t\t\t\t\tvoid applyGatewayPort();\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonRandomPort={(port) => {\r\n\t\t\t\t\t\t\tsetPortDraft(String(port));\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonCopy={(field, text) => {\r\n\t\t\t\t\t\t\tvoid handleCopy(field, text);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonCopyKey={() => {\r\n\t\t\t\t\t\t\tvoid copyGatewayKey();\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonToggleKeyVisible={() => {\r\n\t\t\t\t\t\t\tvoid toggleGatewayKeyVisible();\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonRotateConfirm={() => {\r\n\t\t\t\t\t\t\tsetGatewayRotateConfirm(true);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonRotateCancel={() => {\r\n\t\t\t\t\t\t\tsetGatewayRotateConfirm(false);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonRotate={() => {\r\n\t\t\t\t\t\t\tvoid rotateGatewayKey();\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t/>\r\n\t\t\t\t) : null}\r\n\t\t\t\t{activeTab === \"about\" ? <AboutTab t={t} /> : null}\r\n\t\t\t</div>\r\n\t\t</section>\r\n\t);\r\n}\r\n", null, "/** Static tables for the Coding OAuth settings UI. */\r\n\r\nimport {\r\n\tCAPABILITY_SETTINGS_PATH,\r\n\tCODING_OAUTH_LOGIN_CANCEL_PATH,\r\n\tCODING_OAUTH_LOGIN_CODE_PATH,\r\n\tCODING_OAUTH_LOGIN_PATH,\r\n\tCODING_OAUTH_LOGOUT_PATH,\r\n\tCODING_OAUTH_MODELS_PATH,\r\n\tCODING_OAUTH_STATUS_PATH,\r\n\tCODEX_USAGE_PATH as CORE_CODEX_USAGE_PATH,\r\n\tGATEWAY_REVEAL_PATH as CORE_GATEWAY_REVEAL_PATH,\r\n\tGATEWAY_ROTATE_PATH as CORE_GATEWAY_ROTATE_PATH,\r\n\tGATEWAY_SETTINGS_PATH,\r\n\tIMAGINE_CREDENTIAL_STATUS_PATH,\r\n\tOAUTH_IMPORT_CANCEL_PATH,\r\n\tOAUTH_IMPORT_COMMIT_PATH,\r\n\tOAUTH_IMPORT_PREVIEW_PATH,\r\n\tOAUTH_IMPORT_SOURCES_PATH,\r\n} from \"dsh-coding-oauth-core/contracts\";\r\nimport type { GrokBuildSettingsKey } from \"./locales.ts\";\r\nimport type {\r\n\tCapabilityFlagKey,\r\n\tCapabilityLimitKey,\r\n\tProviderCardDefinition,\r\n\tSettingsTabId,\r\n\tSourceCommitAction,\r\n\tSourceConflict,\r\n\tSourceKind,\r\n\tSourcePreviewAction,\r\n\tSourceReason,\r\n} from \"./types.ts\";\r\n\r\nexport const STATUS_PATH = CODING_OAUTH_STATUS_PATH;\r\nexport const LOGIN_PATH = CODING_OAUTH_LOGIN_PATH;\r\nexport const LOGIN_CODE_PATH = CODING_OAUTH_LOGIN_CODE_PATH;\r\nexport const LOGIN_CANCEL_PATH = CODING_OAUTH_LOGIN_CANCEL_PATH;\r\nexport const LOGOUT_PATH = CODING_OAUTH_LOGOUT_PATH;\r\nexport const MODELS_PATH = CODING_OAUTH_MODELS_PATH;\r\nexport const SOURCES_PATH = OAUTH_IMPORT_SOURCES_PATH;\r\nexport const SOURCES_PREVIEW_PATH = OAUTH_IMPORT_PREVIEW_PATH;\r\nexport const SOURCES_COMMIT_PATH = OAUTH_IMPORT_COMMIT_PATH;\r\nexport const SOURCES_CANCEL_PATH = OAUTH_IMPORT_CANCEL_PATH;\r\nexport const CAPABILITIES_PATH = CAPABILITY_SETTINGS_PATH;\r\nexport const CODEX_USAGE_PATH = CORE_CODEX_USAGE_PATH;\r\nexport const IMAGINE_CREDENTIAL_PATH = IMAGINE_CREDENTIAL_STATUS_PATH;\r\nexport const GATEWAY_PATH = GATEWAY_SETTINGS_PATH;\r\nexport const GATEWAY_REVEAL_PATH = CORE_GATEWAY_REVEAL_PATH;\r\nexport const GATEWAY_ROTATE_PATH = CORE_GATEWAY_ROTATE_PATH;\r\nexport const POLL_INTERVAL_MS = 1_000;\r\nexport const HOUR_MS = 60 * 60 * 1000;\r\n\r\nexport const SOURCE_KINDS: readonly SourceKind[] = [\"grok\", \"codex\", \"kimi\", \"claude\"];\r\nexport const SOURCE_REASONS: readonly SourceReason[] = [\"missing\", \"unsafe\", \"invalid\", \"too_large\"];\r\nexport const SOURCE_CONFLICTS: readonly SourceConflict[] = [\r\n\t\"none\",\r\n\t\"same_credential\",\r\n\t\"same_account\",\r\n\t\"different_account\",\r\n\t\"unknown_account\",\r\n\t\"unreadable_destination\",\r\n\t\"unsafe_destination\",\r\n];\r\nexport const SOURCE_PREVIEW_ACTIONS: readonly SourcePreviewAction[] = [\"import\", \"reuse\", \"overwrite\", \"blocked\"];\r\nexport const SOURCE_COMMIT_ACTIONS: readonly SourceCommitAction[] = [\"imported\", \"unchanged\", \"overwritten\"];\r\n\r\nexport const SOURCE_DEFAULT_PATH: { readonly [K in SourceKind]: string } = {\r\n\tgrok: \"~/.grok/auth.json\",\r\n\tcodex: \"~/.codex/auth.json\",\r\n\tkimi: \"~/.kimi/credentials/kimi-code.json\",\r\n\tclaude: \"~/.claude/.credentials.json\",\r\n};\r\n\r\nexport const SOURCE_KIND_KEY: { readonly [K in SourceKind]: GrokBuildSettingsKey } = {\r\n\tgrok: \"sourceKindGrok\",\r\n\tcodex: \"sourceKindCodex\",\r\n\tkimi: \"sourceKindKimi\",\r\n\tclaude: \"sourceKindClaude\",\r\n};\r\n\r\nexport const SOURCE_REASON_KEY: { readonly [K in SourceReason]: GrokBuildSettingsKey } = {\r\n\tmissing: \"sourceReasonMissing\",\r\n\tunsafe: \"sourceReasonUnsafe\",\r\n\tinvalid: \"sourceReasonInvalid\",\r\n\ttoo_large: \"sourceReasonTooLarge\",\r\n};\r\n\r\nexport const SOURCE_CONFLICT_KEY: { readonly [K in SourceConflict]: GrokBuildSettingsKey } = {\r\n\tnone: \"sourceConflictNone\",\r\n\tsame_credential: \"sourceConflictSameCredential\",\r\n\tsame_account: \"sourceConflictSameAccount\",\r\n\tdifferent_account: \"sourceConflictDifferentAccount\",\r\n\tunknown_account: \"sourceConflictUnknownAccount\",\r\n\tunreadable_destination: \"sourceConflictUnreadableDestination\",\r\n\tunsafe_destination: \"sourceConflictUnsafeDestination\",\r\n};\r\n\r\nexport const SOURCE_PREVIEW_ACTION_KEY: { readonly [K in SourcePreviewAction]: GrokBuildSettingsKey } = {\r\n\timport: \"sourceActionImport\",\r\n\treuse: \"sourceActionReuse\",\r\n\toverwrite: \"sourceActionOverwrite\",\r\n\tblocked: \"sourceActionBlocked\",\r\n};\r\n\r\nexport const SOURCE_COMMIT_ACTION_KEY: { readonly [K in SourceCommitAction]: GrokBuildSettingsKey } = {\r\n\timported: \"sourceCommitImported\",\r\n\tunchanged: \"sourceCommitUnchanged\",\r\n\toverwritten: \"sourceCommitOverwritten\",\r\n};\r\n\r\nexport const CAPABILITY_TOGGLES: readonly {\r\n\tkey: CapabilityFlagKey;\r\n\tlabel: GrokBuildSettingsKey;\r\n\thint: GrokBuildSettingsKey;\r\n\trequiresImages?: true;\r\n}[] = [\r\n\t{ key: \"codexSearch\", label: \"capCodexSearch\", hint: \"capCodexSearchHint\" },\r\n\t{ key: \"codexImages\", label: \"capCodexImages\", hint: \"capCodexImagesHint\" },\r\n\t{ key: \"codexImageEdits\", label: \"capCodexImageEdits\", hint: \"capCodexImageEditsHint\", requiresImages: true },\r\n\t{\r\n\t\tkey: \"codexImagesAnyModel\",\r\n\t\tlabel: \"capCodexImagesAnyModel\",\r\n\t\thint: \"capCodexImagesAnyModelHint\",\r\n\t\trequiresImages: true,\r\n\t},\r\n\t{ key: \"codexUsage\", label: \"capCodexUsage\", hint: \"capCodexUsageHint\" },\r\n\t{ key: \"codexFast\", label: \"capCodexFast\", hint: \"capCodexFastHint\" },\r\n\t{ key: \"grokImagineImage\", label: \"capGrokImagineImage\", hint: \"capGrokImagineImageHint\" },\r\n\t{ key: \"grokImagineVideo\", label: \"capGrokImagineVideo\", hint: \"capGrokImagineVideoHint\" },\r\n];\r\n\r\nexport const CAPABILITY_LIMITS: readonly {\r\n\tkey: CapabilityLimitKey;\r\n\tlabel: GrokBuildSettingsKey;\r\n\thint: GrokBuildSettingsKey;\r\n\tmin: number;\r\n\tmax: number;\r\n\tscale: number;\r\n}[] = [\r\n\t{ key: \"searchResults\", label: \"capSearchResults\", hint: \"capSearchResultsHint\", min: 1, max: 20, scale: 1 },\r\n\t{ key: \"imageCount\", label: \"capImageCount\", hint: \"capImageCountHint\", min: 1, max: 4, scale: 1 },\r\n\t{\r\n\t\tkey: \"videoArtifactTtlMs\",\r\n\t\tlabel: \"capVideoTtlHours\",\r\n\t\thint: \"capVideoTtlHoursHint\",\r\n\t\tmin: 1,\r\n\t\tmax: 168,\r\n\t\tscale: HOUR_MS,\r\n\t},\r\n];\r\n\r\nexport const IMAGINE_SOURCE_KEY: { readonly [source: string]: GrokBuildSettingsKey } = {\r\n\tnone: \"imagineSourceNone\",\r\n\tenv: \"imagineSourceEnv\",\r\n\tenvironment: \"imagineSourceEnv\",\r\n\t\"xai-api-key\": \"imagineSourceEnv\",\r\n\txai_api_key: \"imagineSourceEnv\",\r\n\t\"api-key\": \"imagineSourceApiKey\",\r\n\tapi_key: \"imagineSourceApiKey\",\r\n\tapikey: \"imagineSourceApiKey\",\r\n\tkey: \"imagineSourceApiKey\",\r\n\tsettings: \"imagineSourceApiKey\",\r\n\toauth: \"imagineSourceOAuth\",\r\n\t\"oauth-access\": \"imagineSourceOAuth\",\r\n\t\"grok-cli-key\": \"imagineSourceCliKey\",\r\n\t\"cli-key\": \"imagineSourceCliKey\",\r\n};\r\n\r\nexport const PROVIDERS: readonly ProviderCardDefinition[] = [\r\n\t{\r\n\t\tslug: \"grok\",\r\n\t\troute: \"grok-build\",\r\n\t\ttitleKey: \"grokTitle\",\r\n\t\tdescriptionKey: \"grokDescription\",\r\n\t\tmethods: [\"pkce\", \"device\"],\r\n\t\trecommended: \"pkce\",\r\n\t\tremoteRecommended: \"device\",\r\n\t},\r\n\t{\r\n\t\tslug: \"codex\",\r\n\t\troute: \"codex-oauth\",\r\n\t\ttitleKey: \"codexTitle\",\r\n\t\tdescriptionKey: \"codexDescription\",\r\n\t\tmethods: [\"device\", \"browser\"],\r\n\t\trecommended: \"device\",\r\n\t\tremoteRecommended: \"device\",\r\n\t},\r\n\t{\r\n\t\tslug: \"kimi\",\r\n\t\troute: \"kimi-code-oauth\",\r\n\t\ttitleKey: \"kimiTitle\",\r\n\t\tdescriptionKey: \"kimiDescription\",\r\n\t\tmethods: [\"device\"],\r\n\t\trecommended: \"device\",\r\n\t\tremoteRecommended: \"device\",\r\n\t},\r\n\t{\r\n\t\tslug: \"claude\",\r\n\t\troute: \"claude-code-oauth\",\r\n\t\ttitleKey: \"claudeTitle\",\r\n\t\tdescriptionKey: \"claudeDescription\",\r\n\t\tmethods: [\"browser\"],\r\n\t\trecommended: \"browser\",\r\n\t\tremoteRecommended: \"browser\",\r\n\t},\r\n];\r\n\r\nexport const SETTINGS_TABS: readonly { id: SettingsTabId; label: GrokBuildSettingsKey }[] = [\r\n\t{ id: \"accounts\", label: \"tabAccounts\" },\r\n\t{ id: \"gateway\", label: \"tabGateway\" },\r\n\t{ id: \"capabilities\", label: \"tabCapabilities\" },\r\n\t{ id: \"about\", label: \"tabAbout\" },\r\n];\r\n\r\nexport const GATEWAY_PORT_MIN = 1024;\r\nexport const GATEWAY_PORT_MAX = 65_535;\r\nexport const GATEWAY_RANDOM_PORT_MIN = 18_100;\r\nexport const GATEWAY_RANDOM_PORT_MAX = 18_999;\r\nexport const GATEWAY_RANDOM_RESERVED = new Set([22, 53, 3080, 7890, 9090, 18_080]);\r\n\r\nexport const CONSUMED_PREVIEW_CODES = new Set([\r\n\t\"preview_invalid\",\r\n\t\"preview_expired\",\r\n\t\"source_changed\",\r\n\t\"destination_changed\",\r\n\t\"confirm_required\",\r\n\t\"unsafe_destination\",\r\n]);\r\n\r\nexport const PLUGIN_VERSION = \"0.6.4\";\n", "/** Same-origin JSON helpers for the Coding OAuth plugin HTTP API. */\r\n\r\nimport { CONSUMED_PREVIEW_CODES, SOURCES_CANCEL_PATH } from \"./constants.ts\";\r\nimport type { PluginRequestError } from \"./types.ts\";\r\n\r\nexport function isRecord(value: unknown): value is Record<string, unknown> {\r\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\r\n}\r\n\r\nexport function isPluginRequestError(error: unknown): error is PluginRequestError {\r\n\treturn error instanceof Error && error.name === \"PluginRequestError\" && \"status\" in error;\r\n}\r\n\r\nexport function isConflictError(error: unknown): boolean {\r\n\tif (!isPluginRequestError(error)) {\r\n\t\treturn (\r\n\t\t\terror instanceof Error && /SETTINGS_CONFLICT|settings-conflict|changed since it was read/iu.test(error.message)\r\n\t\t);\r\n\t}\r\n\treturn error.status === 409 || error.code === \"SETTINGS_CONFLICT\" || /conflict/iu.test(error.message);\r\n}\r\n\r\nexport function isConsumedPreviewError(error: unknown): boolean {\r\n\tif (!isPluginRequestError(error)) return false;\r\n\tif (error.code !== undefined && CONSUMED_PREVIEW_CODES.has(error.code)) return true;\r\n\treturn error.status === 404 || error.status === 410;\r\n}\r\n\r\nexport function cancelPreviewTicket(previewId: string, keepalive = false): void {\r\n\tvoid fetch(SOURCES_CANCEL_PATH, {\r\n\t\tmethod: \"POST\",\r\n\t\theaders: { accept: \"application/json\", \"content-type\": \"application/json\" },\r\n\t\tcredentials: \"same-origin\",\r\n\t\tbody: JSON.stringify({ previewId }),\r\n\t\t...(keepalive ? { keepalive: true } : {}),\r\n\t}).catch(() => undefined);\r\n}\r\n\r\nexport async function jsonRequest<T>(path: string, method = \"GET\", body?: unknown): Promise<T> {\r\n\tconst response = await fetch(path, {\r\n\t\tmethod,\r\n\t\theaders: { accept: \"application/json\", ...(body === undefined ? {} : { \"content-type\": \"application/json\" }) },\r\n\t\tcredentials: \"same-origin\",\r\n\t\t...(body === undefined ? {} : { body: JSON.stringify(body) }),\r\n\t});\r\n\tconst value: unknown = await response.json().catch(() => undefined);\r\n\tif (!response.ok) {\r\n\t\tconst record = isRecord(value) ? value : undefined;\r\n\t\tconst message =\r\n\t\t\trecord !== undefined && typeof record[\"error\"] === \"string\"\r\n\t\t\t\t? record[\"error\"]\r\n\t\t\t\t: record !== undefined && typeof record[\"message\"] === \"string\"\r\n\t\t\t\t\t? record[\"message\"]\r\n\t\t\t\t\t: `HTTP ${response.status}`;\r\n\t\tconst code = record !== undefined && typeof record[\"code\"] === \"string\" ? record[\"code\"] : undefined;\r\n\t\tconst error = new Error(message) as PluginRequestError;\r\n\t\terror.name = \"PluginRequestError\";\r\n\t\terror.status = response.status;\r\n\t\tif (code !== undefined) error.code = code;\r\n\t\tthrow error;\r\n\t}\r\n\treturn value as T;\r\n}\r\n\r\nexport async function copyText(text: string): Promise<boolean> {\r\n\ttry {\r\n\t\tif (typeof navigator !== \"undefined\" && navigator.clipboard?.writeText !== undefined) {\r\n\t\t\tawait navigator.clipboard.writeText(text);\r\n\t\t\treturn true;\r\n\t\t}\r\n\t} catch {\r\n\t\t// fall through to execCommand\r\n\t}\r\n\ttry {\r\n\t\tconst area = document.createElement(\"textarea\");\r\n\t\tarea.value = text;\r\n\t\tarea.setAttribute(\"readonly\", \"\");\r\n\t\tarea.style.position = \"fixed\";\r\n\t\tarea.style.left = \"-9999px\";\r\n\t\tdocument.body.appendChild(area);\r\n\t\tarea.select();\r\n\t\tconst ok = document.execCommand(\"copy\");\r\n\t\tdocument.body.removeChild(area);\r\n\t\treturn ok;\r\n\t} catch {\r\n\t\treturn false;\r\n\t}\r\n}\r\n", "/** Shared inline styles using DSH design tokens. */\r\n\r\nimport type { CSSProperties } from \"react\";\r\nimport type { ProviderStatus } from \"./types.ts\";\r\n\r\nexport const TRANSITION = \"all 0.15s ease\";\r\n\r\nexport const pageStyle: CSSProperties = {\r\n\tdisplay: \"flex\",\r\n\tflexDirection: \"column\",\r\n\tgap: 16,\r\n\twidth: \"100%\",\r\n\tmaxWidth: 780,\r\n\tminWidth: 0,\r\n};\r\nexport const titleStyle: CSSProperties = {\r\n\tmargin: 0,\r\n\tfontSize: 20,\r\n\tlineHeight: \"28px\",\r\n\tfontWeight: 600,\r\n\tcolor: \"var(--dsw-alias-label-primary)\",\r\n};\r\nexport const bodyStyle: CSSProperties = {\r\n\tmargin: 0,\r\n\tfontSize: 14,\r\n\tlineHeight: \"22px\",\r\n\tcolor: \"var(--dsw-alias-label-secondary)\",\r\n};\r\nexport const cardStyle: CSSProperties = {\r\n\tdisplay: \"flex\",\r\n\tflexDirection: \"column\",\r\n\tgap: 14,\r\n\tpadding: \"18px 20px\",\r\n\tborder: \"1px solid var(--dsw-alias-border-l2)\",\r\n\tborderRadius: 12,\r\n\tbackground: \"var(--dsw-alias-bg-module-platform)\",\r\n\ttransition: TRANSITION,\r\n};\r\nexport const rowStyle: CSSProperties = {\r\n\tdisplay: \"flex\",\r\n\talignItems: \"center\",\r\n\tjustifyContent: \"space-between\",\r\n\tflexWrap: \"wrap\",\r\n\tgap: 12,\r\n};\r\nexport const statusStyle: CSSProperties = {\r\n\tdisplay: \"flex\",\r\n\talignItems: \"center\",\r\n\tgap: 9,\r\n\tfontSize: 14,\r\n\tfontWeight: 500,\r\n\tcolor: \"var(--dsw-alias-label-primary)\",\r\n};\r\nexport const buttonStyle: CSSProperties = {\r\n\tboxSizing: \"border-box\",\r\n\tminHeight: 34,\r\n\tpadding: \"6px 14px\",\r\n\tborder: \"1px solid var(--dsw-alias-border-l4, rgba(127, 127, 127, 0.4))\",\r\n\tborderRadius: 18,\r\n\tbackground: \"var(--dsw-alias-button-elevated-fill, var(--dsw-alias-bg-layer-1))\",\r\n\tcolor: \"var(--dsw-alias-label-primary)\",\r\n\tboxShadow: \"0 1px 2px rgba(0, 0, 0, 0.18)\",\r\n\tfont: \"inherit\",\r\n\tfontSize: 14,\r\n\tfontWeight: 500,\r\n\tcursor: \"pointer\",\r\n\ttransition: TRANSITION,\r\n};\r\nexport const primaryButtonStyle: CSSProperties = {\r\n\t...buttonStyle,\r\n\t// DSH dark theme flips brand-primary to near-white; use the button/foreground\r\n\t// pair so primary CTAs stay readable in both light and dark mode.\r\n\tborder: \"none\",\r\n\tbackground: \"var(--dsw-alias-button-primary-fill)\",\r\n\tcolor: \"var(--dsw-alias-label-primary-foreground)\",\r\n\tboxShadow: \"0 1px 3px rgba(0, 0, 0, 0.28)\",\r\n\tfontWeight: 600,\r\n};\r\nexport const compactButtonStyle: CSSProperties = {\r\n\t...buttonStyle,\r\n\tminHeight: 28,\r\n\tpadding: \"4px 10px\",\r\n\tfontSize: 13,\r\n\tborderRadius: 8,\r\n};\r\nexport const errorStyle: CSSProperties = { ...bodyStyle, color: \"var(--dsw-alias-state-error-primary)\" };\r\nexport const successStyle: CSSProperties = { ...bodyStyle, color: \"var(--dsw-alias-state-success-primary, #22a06b)\" };\r\nexport const warningStyle: CSSProperties = {\r\n\t...bodyStyle,\r\n\tpadding: \"10px 12px\",\r\n\tborderRadius: 8,\r\n\tborder: \"1px solid color-mix(in srgb, var(--dsw-alias-state-warn-primary, #e06c00) 35%, transparent)\",\r\n\tbackground: \"color-mix(in srgb, var(--dsw-alias-state-warn-primary, #e06c00) 10%, transparent)\",\r\n\tcolor: \"var(--dsw-alias-label-primary)\",\r\n};\r\nexport const tipStyle: CSSProperties = {\r\n\t...bodyStyle,\r\n\tpadding: \"10px 12px\",\r\n\tborderRadius: 8,\r\n\tborder: \"1px solid var(--dsw-alias-border-l2)\",\r\n\tbackground: \"var(--dsw-alias-bg-layer-1)\",\r\n\tcolor: \"var(--dsw-alias-label-primary)\",\r\n};\r\nexport const noticeStyle: CSSProperties = {\r\n\t...tipStyle,\r\n\tanimation: \"dsh-coding-oauth-fade-in 0.2s ease\",\r\n};\r\nexport const codeStyle: CSSProperties = {\r\n\tfontFamily: \"ui-monospace, SFMono-Regular, Menlo, Consolas, monospace\",\r\n\tfontSize: 20,\r\n\tletterSpacing: \"0.08em\",\r\n\tfontWeight: 600,\r\n\tcolor: \"var(--dsw-alias-label-primary)\",\r\n};\r\nexport const monoStyle: CSSProperties = { fontFamily: \"ui-monospace, SFMono-Regular, Menlo, Consolas, monospace\" };\r\nexport const snippetStyle: CSSProperties = {\r\n\t...monoStyle,\r\n\tdisplay: \"block\",\r\n\tfontSize: 12,\r\n\tlineHeight: \"18px\",\r\n\tpadding: \"10px 12px\",\r\n\tborderRadius: 8,\r\n\tborder: \"1px solid var(--dsw-alias-border-l2)\",\r\n\tbackground: \"var(--dsw-alias-bg-layer-1)\",\r\n\tcolor: \"var(--dsw-alias-label-primary)\",\r\n\toverflowWrap: \"anywhere\",\r\n\twhiteSpace: \"pre-wrap\",\r\n};\r\nexport const linkStyle: CSSProperties = { color: \"var(--dsw-alias-brand-primary)\", wordBreak: \"break-all\" };\r\nexport const listStyle: CSSProperties = {\r\n\tdisplay: \"flex\",\r\n\tflexDirection: \"column\",\r\n\tgap: 8,\r\n\tmargin: 0,\r\n\tpadding: 0,\r\n\tlistStyle: \"none\",\r\n};\r\nexport const checkRowStyle: CSSProperties = {\r\n\tdisplay: \"flex\",\r\n\talignItems: \"flex-start\",\r\n\tgap: 8,\r\n\tfontSize: 14,\r\n\tcolor: \"var(--dsw-alias-label-primary)\",\r\n};\r\nexport const inputStyle: CSSProperties = {\r\n\tboxSizing: \"border-box\",\r\n\twidth: \"100%\",\r\n\tminHeight: 34,\r\n\tpadding: \"6px 12px\",\r\n\tborder: \"1px solid var(--dsw-alias-border-l2)\",\r\n\tborderRadius: 8,\r\n\tbackground: \"var(--dsw-alias-bg-layer-1)\",\r\n\tcolor: \"var(--dsw-alias-label-primary)\",\r\n\tfont: \"inherit\",\r\n\tfontSize: 13,\r\n\ttransition: TRANSITION,\r\n};\r\nexport const nestedStyle: CSSProperties = {\r\n\tdisplay: \"flex\",\r\n\tflexDirection: \"column\",\r\n\tgap: 8,\r\n\tpadding: \"12px 14px\",\r\n\tborder: \"1px solid var(--dsw-alias-border-l2)\",\r\n\tborderRadius: 8,\r\n\tbackground: \"var(--dsw-alias-bg-layer-1)\",\r\n};\r\nexport const hintStyle: CSSProperties = { ...bodyStyle, fontSize: 13 };\r\nexport const visuallyHiddenStyle: CSSProperties = {\r\n\tposition: \"absolute\",\r\n\twidth: 1,\r\n\theight: 1,\r\n\tpadding: 0,\r\n\tmargin: -1,\r\n\toverflow: \"hidden\",\r\n\tclip: \"rect(0, 0, 0, 0)\",\r\n\twhiteSpace: \"nowrap\",\r\n\tborder: 0,\r\n};\r\nexport const segmentedNavStyle: CSSProperties = {\r\n\tdisplay: \"inline-flex\",\r\n\tflexWrap: \"wrap\",\r\n\tgap: 2,\r\n\tpadding: 3,\r\n\tborderRadius: 10,\r\n\tborder: \"1px solid var(--dsw-alias-border-l2)\",\r\n\tbackground: \"var(--dsw-alias-bg-layer-1)\",\r\n};\r\nexport const segmentedTabStyle: CSSProperties = {\r\n\t...buttonStyle,\r\n\tborder: \"none\",\r\n\tborderRadius: 8,\r\n\tboxShadow: \"none\",\r\n\tbackground: \"transparent\",\r\n\tminHeight: 32,\r\n\tpadding: \"5px 12px\",\r\n\tfontSize: 13,\r\n};\r\nexport const segmentedTabActiveStyle: CSSProperties = {\r\n\t...segmentedTabStyle,\r\n\tbackground: \"var(--dsw-alias-bg-module-platform)\",\r\n\tcolor: \"var(--dsw-alias-label-primary)\",\r\n\tboxShadow: \"0 1px 2px rgba(0, 0, 0, 0.12)\",\r\n\tfontWeight: 600,\r\n};\r\nexport const panelStyle: CSSProperties = {\r\n\tdisplay: \"flex\",\r\n\tflexDirection: \"column\",\r\n\tgap: 14,\r\n\tminWidth: 0,\r\n};\r\nexport const accountGridStyle: CSSProperties = {\r\n\tdisplay: \"grid\",\r\n\tgridTemplateColumns: \"repeat(auto-fill, minmax(min(320px, 100%), 1fr))\",\r\n\tgap: 14,\r\n};\r\nexport const copyRowStyle: CSSProperties = {\r\n\tdisplay: \"flex\",\r\n\talignItems: \"center\",\r\n\tjustifyContent: \"space-between\",\r\n\tflexWrap: \"wrap\",\r\n\tgap: 8,\r\n};\r\nexport const skeletonStyle: CSSProperties = {\r\n\t...cardStyle,\r\n\tminHeight: 88,\r\n\tbackground:\r\n\t\t\"linear-gradient(90deg, var(--dsw-alias-bg-layer-1) 0%, var(--dsw-alias-bg-module-platform) 50%, var(--dsw-alias-bg-layer-1) 100%)\",\r\n\tbackgroundSize: \"200% 100%\",\r\n\tanimation: \"dsh-coding-oauth-skeleton-pulse 1.4s ease-in-out infinite\",\r\n};\r\nexport const stepRowStyle: CSSProperties = {\r\n\tdisplay: \"flex\",\r\n\talignItems: \"flex-start\",\r\n\tgap: 10,\r\n\tfontSize: 14,\r\n\tcolor: \"var(--dsw-alias-label-secondary)\",\r\n};\r\nexport const stepActiveStyle: CSSProperties = {\r\n\t...stepRowStyle,\r\n\tcolor: \"var(--dsw-alias-label-primary)\",\r\n\tfontWeight: 500,\r\n};\r\nexport const stepNumberStyle: CSSProperties = {\r\n\tdisplay: \"inline-flex\",\r\n\talignItems: \"center\",\r\n\tjustifyContent: \"center\",\r\n\twidth: 22,\r\n\theight: 22,\r\n\tborderRadius: \"50%\",\r\n\tflex: \"0 0 auto\",\r\n\tfontSize: 12,\r\n\tfontWeight: 600,\r\n\tbackground: \"var(--dsw-alias-bg-layer-1)\",\r\n\tborder: \"1px solid var(--dsw-alias-border-l2)\",\r\n\tcolor: \"var(--dsw-alias-label-secondary)\",\r\n};\r\nexport const stepNumberActiveStyle: CSSProperties = {\r\n\t...stepNumberStyle,\r\n\tbackground: \"var(--dsw-alias-button-primary-fill)\",\r\n\tborderColor: \"var(--dsw-alias-button-primary-fill)\",\r\n\tcolor: \"var(--dsw-alias-label-primary-foreground)\",\r\n};\r\n\r\nexport type StatusTone = \"success\" | \"error\" | \"warning\" | \"info\" | \"neutral\";\r\n\r\nexport function statusToneColor(tone: StatusTone): string {\r\n\tswitch (tone) {\r\n\t\tcase \"success\":\r\n\t\t\treturn \"var(--dsw-alias-state-success-primary, #22a06b)\";\r\n\t\tcase \"error\":\r\n\t\t\treturn \"var(--dsw-alias-state-error-primary, #d92d20)\";\r\n\t\tcase \"warning\":\r\n\t\t\t// DSH token is `state-warn-*` (not `state-warning-*`).\r\n\t\t\treturn \"var(--dsw-alias-state-warn-primary, #e06c00)\";\r\n\t\tcase \"info\":\r\n\t\t\t// Accent/text color (not a solid fill + white text pair).\r\n\t\t\treturn \"var(--dsw-alias-brand-primary, #1677ff)\";\r\n\t\tdefault:\r\n\t\t\t// Prefer tertiary over dimmed: dimmed is near-invisible on light cards\r\n\t\t\t// and too dark on dark cards.\r\n\t\t\treturn \"var(--dsw-alias-label-tertiary, #81858c)\";\r\n\t}\r\n}\r\n\r\nexport function badgeStyle(tone: StatusTone): CSSProperties {\r\n\tconst color = statusToneColor(tone);\r\n\treturn {\r\n\t\tdisplay: \"inline-flex\",\r\n\t\talignItems: \"center\",\r\n\t\tgap: 6,\r\n\t\tpadding: \"3px 10px\",\r\n\t\tborderRadius: 999,\r\n\t\tfontSize: 12,\r\n\t\tfontWeight: 600,\r\n\t\tlineHeight: \"18px\",\r\n\t\tcolor,\r\n\t\tbackground: `color-mix(in srgb, ${color} 14%, transparent)`,\r\n\t\tborder: `1px solid color-mix(in srgb, ${color} 28%, transparent)`,\r\n\t\twhiteSpace: \"nowrap\",\r\n\t};\r\n}\r\n\r\nexport function dotStyle(\r\n\tstatus: ProviderStatus[\"status\"] | \"loading\" | \"available\" | \"unavailable\",\r\n\tinstalled = true,\r\n): CSSProperties {\r\n\tconst color = !installed\r\n\t\t? \"var(--dsw-alias-label-tertiary, #81858c)\"\r\n\t\t: status === \"signed-in\" || status === \"available\"\r\n\t\t\t? \"var(--dsw-alias-state-success-primary, #22a06b)\"\r\n\t\t\t: status === \"error\"\r\n\t\t\t\t? \"var(--dsw-alias-state-error-primary, #d92d20)\"\r\n\t\t\t\t: status === \"signing-in\" || status === \"loading\"\r\n\t\t\t\t\t? \"var(--dsw-alias-brand-primary, #1677ff)\"\r\n\t\t\t\t\t: \"var(--dsw-alias-label-tertiary, #81858c)\";\r\n\treturn { width: 9, height: 9, borderRadius: \"50%\", flex: \"0 0 auto\", background: color };\r\n}\r\n\r\nexport function providerStatusTone(status: ProviderStatus[\"status\"], installed = true): StatusTone {\r\n\tif (!installed) return \"neutral\";\r\n\tif (status === \"signed-in\") return \"success\";\r\n\tif (status === \"error\") return \"error\";\r\n\tif (status === \"signing-in\") return \"info\";\r\n\treturn \"neutral\";\r\n}\r\n", "/** About tab: terms, remote help, and plugin version. */\r\n\r\nimport { PLUGIN_VERSION } from \"../constants.ts\";\r\nimport { bodyStyle, cardStyle, hintStyle, linkStyle, titleStyle, warningStyle } from \"../styles.ts\";\r\nimport type { GrokBuildSettingsInjected } from \"../types.ts\";\r\n\r\nconst README_URL = \"https://github.com/lninghaha/dsh-coding-subscription-oauth#readme\";\r\n\r\nexport interface AboutTabProps {\r\n\tt: GrokBuildSettingsInjected[\"t\"];\r\n}\r\n\r\nexport function AboutTab({ t }: AboutTabProps) {\r\n\treturn (\r\n\t\t<section style={cardStyle} aria-labelledby=\"coding-oauth-about-title\">\r\n\t\t\t<h3 id=\"coding-oauth-about-title\" style={{ ...titleStyle, fontSize: 16 }}>\r\n\t\t\t\t{t(\"aboutTitle\")}\r\n\t\t\t</h3>\r\n\t\t\t<p style={{ ...warningStyle, marginTop: 12 }}>{t(\"termsWarning\")}</p>\r\n\t\t\t<p style={{ ...bodyStyle, marginTop: 12 }}>{t(\"remoteLoginHelp\")}</p>\r\n\t\t\t<p style={{ ...hintStyle, marginTop: 12 }}>{t(\"pluginVersion\", { version: PLUGIN_VERSION })}</p>\r\n\t\t\t<p style={{ ...hintStyle, marginTop: 8 }}>{t(\"aboutDocsHint\")}</p>\r\n\t\t\t<p style={{ marginTop: 8 }}>\r\n\t\t\t\t<a href={README_URL} target=\"_blank\" rel=\"noreferrer\" style={linkStyle}>\r\n\t\t\t\t\t{t(\"aboutDocsLink\")}\r\n\t\t\t\t</a>\r\n\t\t\t</p>\r\n\t\t</section>\r\n\t);\r\n}\r\n", "/** Accounts tab: provider cards, CLI tips, and pull preview. */\r\n\r\nimport { Fragment, useEffect, useRef } from \"react\";\r\nimport { PROVIDERS } from \"../constants.ts\";\r\nimport { allOfficialCliMissing, anyOfficialCliAvailable } from \"../display.ts\";\r\nimport {\r\n\taccountGridStyle,\r\n\tbodyStyle,\r\n\tcardStyle,\r\n\tdotStyle,\r\n\thintStyle,\r\n\tmonoStyle,\r\n\trowStyle,\r\n\tskeletonStyle,\r\n\tstatusStyle,\r\n\ttitleStyle,\r\n} from \"../styles.ts\";\r\nimport type {\r\n\tCodingOAuthStatus,\r\n\tGrokBuildSettingsInjected,\r\n\tLoginMethod,\r\n\tProviderSlug,\r\n\tSourcePreview,\r\n\tSourceStatus,\r\n\tUsageView,\r\n} from \"../types.ts\";\r\nimport { Badge } from \"./Badge.tsx\";\r\nimport { CliPullPreview } from \"./CliPullPreview.tsx\";\r\nimport { NoticeBanner } from \"./NoticeBanner.tsx\";\r\nimport { ProviderCard } from \"./ProviderCard.tsx\";\r\n\r\nexport interface AccountsTabProps {\r\n\tt: GrokBuildSettingsInjected[\"t\"];\r\n\tstatus: CodingOAuthStatus | undefined;\r\n\tremote: boolean;\r\n\tremoteTipDismissed: boolean;\r\n\tonDismissRemoteTip: () => void;\r\n\tsources: readonly SourceStatus[] | undefined;\r\n\tsourcesError: string | undefined;\r\n\tsourcesNotice: string | undefined;\r\n\tsourcesBusy: boolean;\r\n\tpreview: SourcePreview | undefined;\r\n\tconfirmOverwrite: boolean;\r\n\tbusyProvider: ProviderSlug | undefined;\r\n\tcodeInputs: Partial<Record<ProviderSlug, string>>;\r\n\tpopupBlocked: Partial<Record<ProviderSlug, boolean>>;\r\n\texpandedProviders: Partial<Record<ProviderSlug, boolean>>;\r\n\tshowUsage: boolean;\r\n\tusage: UsageView | undefined;\r\n\tusageError: string | undefined;\r\n\tusageLoading: boolean;\r\n\tonSignIn: (slug: ProviderSlug, method: LoginMethod) => void;\r\n\tonSignOut: (slug: ProviderSlug) => void;\r\n\tonCancelLogin: (slug: ProviderSlug) => void;\r\n\tonSubmitCode: (slug: ProviderSlug) => void;\r\n\tonCodeChange: (slug: ProviderSlug, value: string) => void;\r\n\tonToggleExpanded: (slug: ProviderSlug) => void;\r\n\tonPreviewSource: (slug: ProviderSlug) => void;\r\n\tonSaveModels: (slug: ProviderSlug, selected: string[]) => void;\r\n\tonConfirmOverwriteChange: (checked: boolean) => void;\r\n\tonCommitSource: () => void;\r\n\tonCancelSourcePreview: () => void;\r\n\tonRefreshSources: () => void;\r\n\tonDismissSourcesNotice: () => void;\r\n}\r\n\r\nexport function AccountsTab({\r\n\tt,\r\n\tstatus,\r\n\tremote,\r\n\tremoteTipDismissed,\r\n\tonDismissRemoteTip,\r\n\tsources,\r\n\tsourcesError,\r\n\tsourcesNotice,\r\n\tsourcesBusy,\r\n\tpreview,\r\n\tconfirmOverwrite,\r\n\tbusyProvider,\r\n\tcodeInputs,\r\n\tpopupBlocked,\r\n\texpandedProviders,\r\n\tshowUsage,\r\n\tusage,\r\n\tusageError,\r\n\tusageLoading,\r\n\tonSignIn,\r\n\tonSignOut,\r\n\tonCancelLogin,\r\n\tonSubmitCode,\r\n\tonCodeChange,\r\n\tonToggleExpanded,\r\n\tonPreviewSource,\r\n\tonSaveModels,\r\n\tonConfirmOverwriteChange,\r\n\tonCommitSource,\r\n\tonCancelSourcePreview,\r\n\tonRefreshSources,\r\n\tonDismissSourcesNotice,\r\n}: AccountsTabProps) {\r\n\tconst previousPreviewKind = useRef<ProviderSlug | undefined>(undefined);\r\n\tuseEffect(() => {\r\n\t\tif (preview !== undefined) {\r\n\t\t\tpreviousPreviewKind.current = preview.kind;\r\n\t\t\tdocument.getElementById(`coding-oauth-source-preview-${preview.kind}`)?.focus();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst trigger = previousPreviewKind.current;\r\n\t\tif (trigger === undefined || sourcesBusy) return;\r\n\t\tpreviousPreviewKind.current = undefined;\r\n\t\tdocument.getElementById(`coding-oauth-source-pull-${trigger}`)?.focus();\r\n\t}, [preview, sourcesBusy]);\r\n\r\n\tif (status === undefined) {\r\n\t\treturn (\r\n\t\t\t<div style={skeletonStyle} role=\"status\" aria-busy=\"true\">\r\n\t\t\t\t<div style={statusStyle}>\r\n\t\t\t\t\t<span aria-hidden=\"true\" style={dotStyle(\"loading\")} />\r\n\t\t\t\t\t{t(\"loadingAccount\")}\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t);\r\n\t}\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t{remote && !remoteTipDismissed ? (\r\n\t\t\t\t<NoticeBanner\r\n\t\t\t\t\tmessage={t(\"remoteAccountsTip\")}\r\n\t\t\t\t\tdismissLabel={t(\"remoteTipDismiss\")}\r\n\t\t\t\t\tonDismiss={onDismissRemoteTip}\r\n\t\t\t\t/>\r\n\t\t\t) : null}\r\n\t\t\t{allOfficialCliMissing(sources) ? (\r\n\t\t\t\t<NoticeBanner\r\n\t\t\t\t\tmessage={t(\"sourcesAllMissingHint\")}\r\n\t\t\t\t\tdismissLabel={t(\"sourcesCheckAgain\")}\r\n\t\t\t\t\tonDismiss={() => {\r\n\t\t\t\t\t\tonRefreshSources();\r\n\t\t\t\t\t}}\r\n\t\t\t\t/>\r\n\t\t\t) : null}\r\n\t\t\t{anyOfficialCliAvailable(sources) ? <p style={hintStyle}>{t(\"sourcesAvailableHint\")}</p> : null}\r\n\t\t\t{sourcesError === undefined ? null : (\r\n\t\t\t\t<p style={{ ...bodyStyle, color: \"var(--dsw-alias-state-error-primary)\" }} role=\"alert\">\r\n\t\t\t\t\t{sourcesError}\r\n\t\t\t\t</p>\r\n\t\t\t)}\r\n\t\t\t{sourcesNotice === undefined ? null : (\r\n\t\t\t\t<NoticeBanner\r\n\t\t\t\t\tkey={sourcesNotice}\r\n\t\t\t\t\tmessage={sourcesNotice}\r\n\t\t\t\t\ttone=\"success\"\r\n\t\t\t\t\tautoHideMs={5000}\r\n\t\t\t\t\tonDismiss={onDismissSourcesNotice}\r\n\t\t\t\t/>\r\n\t\t\t)}\r\n\t\t\t<div style={accountGridStyle}>\r\n\t\t\t\t{PROVIDERS.map((definition) => {\r\n\t\t\t\t\tconst providerStatus = status.providers[definition.slug];\r\n\t\t\t\t\tconst expanded = providerStatus.status === \"signing-in\" || expandedProviders[definition.slug] === true;\r\n\t\t\t\t\treturn (\r\n\t\t\t\t\t\t<Fragment key={definition.slug}>\r\n\t\t\t\t\t\t\t<ProviderCard\r\n\t\t\t\t\t\t\t\tt={t}\r\n\t\t\t\t\t\t\t\tdefinition={definition}\r\n\t\t\t\t\t\t\t\tproviderStatus={providerStatus}\r\n\t\t\t\t\t\t\t\tbusy={busyProvider === definition.slug}\r\n\t\t\t\t\t\t\t\tsourcesBusy={sourcesBusy}\r\n\t\t\t\t\t\t\t\tremote={remote}\r\n\t\t\t\t\t\t\t\tcodeInput={codeInputs[definition.slug] ?? \"\"}\r\n\t\t\t\t\t\t\t\tpopupBlocked={popupBlocked[definition.slug] === true}\r\n\t\t\t\t\t\t\t\texpanded={expanded}\r\n\t\t\t\t\t\t\t\tsource={sources?.find((entry) => entry.kind === definition.slug)}\r\n\t\t\t\t\t\t\t\tshowUsage={showUsage}\r\n\t\t\t\t\t\t\t\tusage={usage}\r\n\t\t\t\t\t\t\t\tusageError={usageError}\r\n\t\t\t\t\t\t\t\tusageLoading={usageLoading}\r\n\t\t\t\t\t\t\t\tonSignIn={(method) => {\r\n\t\t\t\t\t\t\t\t\tonSignIn(definition.slug, method);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\tonSignOut={() => {\r\n\t\t\t\t\t\t\t\t\tonSignOut(definition.slug);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\tonCancelLogin={() => {\r\n\t\t\t\t\t\t\t\t\tonCancelLogin(definition.slug);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\tonSubmitCode={() => {\r\n\t\t\t\t\t\t\t\t\tonSubmitCode(definition.slug);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\tonCodeChange={(value) => {\r\n\t\t\t\t\t\t\t\t\tonCodeChange(definition.slug, value);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\tonToggleExpanded={() => {\r\n\t\t\t\t\t\t\t\t\tonToggleExpanded(definition.slug);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\tonPreviewSource={() => {\r\n\t\t\t\t\t\t\t\t\tonPreviewSource(definition.slug);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\tonSaveModels={(selected) => {\r\n\t\t\t\t\t\t\t\t\tonSaveModels(definition.slug, selected);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t{preview?.kind === definition.slug ? (\r\n\t\t\t\t\t\t\t\t<div style={{ gridColumn: \"1 / -1\", minWidth: 0 }}>\r\n\t\t\t\t\t\t\t\t\t<CliPullPreview\r\n\t\t\t\t\t\t\t\t\t\tt={t}\r\n\t\t\t\t\t\t\t\t\t\tpreview={preview}\r\n\t\t\t\t\t\t\t\t\t\tconfirmOverwrite={confirmOverwrite}\r\n\t\t\t\t\t\t\t\t\t\tsourcesBusy={sourcesBusy}\r\n\t\t\t\t\t\t\t\t\t\tonConfirmOverwriteChange={onConfirmOverwriteChange}\r\n\t\t\t\t\t\t\t\t\t\tonCommit={onCommitSource}\r\n\t\t\t\t\t\t\t\t\t\tonCancel={onCancelSourcePreview}\r\n\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t) : null}\r\n\t\t\t\t\t\t</Fragment>\r\n\t\t\t\t\t);\r\n\t\t\t\t})}\r\n\t\t\t\t<div style={cardStyle}>\r\n\t\t\t\t\t<div style={rowStyle}>\r\n\t\t\t\t\t\t<div>\r\n\t\t\t\t\t\t\t<h3 style={{ ...titleStyle, fontSize: 16 }}>{t(\"antigravityTitle\")}</h3>\r\n\t\t\t\t\t\t\t<p style={{ ...bodyStyle, marginTop: 4 }}>{t(\"antigravityDescription\")}</p>\r\n\t\t\t\t\t\t\t<p style={{ ...bodyStyle, marginTop: 4 }}>\r\n\t\t\t\t\t\t\t\t<span style={monoStyle}>{status.antigravity.route}</span>\r\n\t\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t<Badge\r\n\t\t\t\t\t\t\tlabel={status.antigravity.installed ? t(\"antigravityInstalled\") : t(\"antigravityMissing\")}\r\n\t\t\t\t\t\t\ttone={status.antigravity.installed ? \"success\" : \"neutral\"}\r\n\t\t\t\t\t\t\tinstalled={status.antigravity.installed}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<p style={bodyStyle}>{t(\"antigravityCliHint\")}</p>\r\n\t\t\t\t\t<code style={{ ...monoStyle, fontSize: 12, overflowWrap: \"anywhere\" }}>{t(\"antigravityCliCommand\")}</code>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</>\r\n\t);\r\n}\r\n", "/** Pure display helpers for remote UX and CLI pull noise control. */\r\n\r\nimport type { GrokBuildSettingsInjected, LoginMethod, ProviderCardDefinition, SourceStatus } from \"./types.ts\";\r\n\r\nconst LOOPBACK_HOSTS = new Set([\"localhost\", \"127.0.0.1\", \"[::1]\", \"::1\"]);\r\n\r\n/** True when the Settings page is served from a non-loopback host (typical remote DSH). */\r\nexport function isLikelyRemoteHost(hostname: string): boolean {\r\n\tconst normalized = hostname.trim().toLowerCase();\r\n\tif (normalized.length === 0) return false;\r\n\tif (LOOPBACK_HOSTS.has(normalized)) return false;\r\n\tif (normalized.endsWith(\".localhost\")) return false;\r\n\treturn true;\r\n}\r\n\r\nexport function preferredLoginMethod(definition: ProviderCardDefinition, remote: boolean): LoginMethod {\r\n\tif (\r\n\t\tremote &&\r\n\t\tdefinition.remoteRecommended !== undefined &&\r\n\t\tdefinition.methods.includes(definition.remoteRecommended)\r\n\t) {\r\n\t\treturn definition.remoteRecommended;\r\n\t}\r\n\treturn definition.recommended;\r\n}\r\n\r\n/** Put the recommended method first so the primary CTA is unambiguous. */\r\nexport function orderedLoginMethods(definition: ProviderCardDefinition, remote: boolean): LoginMethod[] {\r\n\tconst preferred = preferredLoginMethod(definition, remote);\r\n\tconst rest = definition.methods.filter((method) => method !== preferred);\r\n\treturn definition.methods.includes(preferred) ? [preferred, ...rest] : [...definition.methods];\r\n}\r\n\r\n/** Per-card CLI \u201Cmissing\u201D copy is noisy on remote hosts; keep only actionable reasons. */\r\nexport function shouldShowPerCardSourceReason(source: SourceStatus | undefined): boolean {\r\n\tif (source === undefined || source.available) return false;\r\n\tif (source.reason === undefined) return false;\r\n\treturn source.reason !== \"missing\";\r\n}\r\n\r\nexport function allOfficialCliMissing(sources: readonly SourceStatus[] | undefined): boolean {\r\n\tif (sources === undefined || sources.length === 0) return false;\r\n\treturn sources.every((source) => !source.available && (source.reason === undefined || source.reason === \"missing\"));\r\n}\r\n\r\nexport function anyOfficialCliAvailable(sources: readonly SourceStatus[] | undefined): boolean {\r\n\treturn sources?.some((source) => source.available) === true;\r\n}\r\n\r\nexport function methodLabel(\r\n\tmethod: LoginMethod,\r\n\tt: GrokBuildSettingsInjected[\"t\"],\r\n\toptions?: { remote?: boolean; primary?: boolean },\r\n): string {\r\n\tif (method === \"device\") {\r\n\t\tif (options?.remote === true && options.primary === true) return t(\"deviceLoginRemote\");\r\n\t\treturn t(\"deviceLogin\");\r\n\t}\r\n\tif (method === \"browser\") return t(\"browserLogin\");\r\n\treturn t(\"pkceLogin\");\r\n}\r\n", "/** Status capsule badge with semantic tone colors. */\r\n\r\nimport { badgeStyle, dotStyle, providerStatusTone, type StatusTone } from \"../styles.ts\";\r\nimport type { ProviderStatus } from \"../types.ts\";\r\n\r\nexport interface BadgeProps {\r\n\tlabel: string;\r\n\ttone?: StatusTone;\r\n\t/** When set, derives tone from provider login status. */\r\n\tproviderStatus?: ProviderStatus[\"status\"];\r\n\tinstalled?: boolean;\r\n\tshowDot?: boolean;\r\n}\r\n\r\nexport function Badge({ label, tone, providerStatus, installed = true, showDot = true }: BadgeProps) {\r\n\tconst resolvedTone =\r\n\t\ttone ?? (providerStatus !== undefined ? providerStatusTone(providerStatus, installed) : \"neutral\");\r\n\treturn (\r\n\t\t<span style={badgeStyle(resolvedTone)} role=\"status\">\r\n\t\t\t{showDot ? (\r\n\t\t\t\t<span\r\n\t\t\t\t\taria-hidden=\"true\"\r\n\t\t\t\t\tstyle={{\r\n\t\t\t\t\t\t...dotStyle(providerStatus ?? (resolvedTone === \"success\" ? \"signed-in\" : \"signed-out\"), installed),\r\n\t\t\t\t\t\twidth: 7,\r\n\t\t\t\t\t\theight: 7,\r\n\t\t\t\t\t}}\r\n\t\t\t\t/>\r\n\t\t\t) : null}\r\n\t\t\t<span>{label}</span>\r\n\t\t</span>\r\n\t);\r\n}\r\n", "/** Response parsers and small formatting helpers for the settings UI. */\r\n\r\nimport { isRecord } from \"./api.ts\";\r\nimport {\r\n\tGATEWAY_PORT_MAX,\r\n\tGATEWAY_PORT_MIN,\r\n\tGATEWAY_RANDOM_PORT_MAX,\r\n\tGATEWAY_RANDOM_PORT_MIN,\r\n\tGATEWAY_RANDOM_RESERVED,\r\n\tHOUR_MS,\r\n\tIMAGINE_SOURCE_KEY,\r\n\tSOURCE_COMMIT_ACTIONS,\r\n\tSOURCE_CONFLICTS,\r\n\tSOURCE_DEFAULT_PATH,\r\n\tSOURCE_KINDS,\r\n\tSOURCE_PREVIEW_ACTIONS,\r\n\tSOURCE_REASONS,\r\n} from \"./constants.ts\";\r\nimport type {\r\n\tCapabilitySettingsView,\r\n\tCapabilitySnapshot,\r\n\tGatewayView,\r\n\tGrokBuildSettingsInjected,\r\n\tImagineCredentialView,\r\n\tProviderStatus,\r\n\tSourceCommitAction,\r\n\tSourceConflict,\r\n\tSourceKind,\r\n\tSourcePreview,\r\n\tSourcePreviewAction,\r\n\tSourceReason,\r\n\tSourceStatus,\r\n\tUsageLimitView,\r\n\tUsageView,\r\n\tUsageWindowView,\r\n} from \"./types.ts\";\r\n\r\nexport function optionalString(value: unknown): string | undefined {\r\n\treturn typeof value === \"string\" && value.length > 0 && value.length < 500 ? value : undefined;\r\n}\r\n\r\nexport function optionalFiniteNumber(value: unknown): number | undefined {\r\n\treturn typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\r\n}\r\n\r\nexport function optionalBoolean(value: unknown): boolean | undefined {\r\n\treturn typeof value === \"boolean\" ? value : undefined;\r\n}\r\n\r\nexport function optionalPercent(value: unknown): number | undefined {\r\n\tconst numeric = optionalFiniteNumber(value);\r\n\treturn numeric !== undefined && numeric >= 0 && numeric <= 100 ? numeric : undefined;\r\n}\r\n\r\nexport function isSourceKind(value: string): value is SourceKind {\r\n\treturn (SOURCE_KINDS as readonly string[]).includes(value);\r\n}\r\n\r\nexport function isSourceReason(value: string): value is SourceReason {\r\n\treturn (SOURCE_REASONS as readonly string[]).includes(value);\r\n}\r\n\r\nexport function isSourceConflict(value: string): value is SourceConflict {\r\n\treturn (SOURCE_CONFLICTS as readonly string[]).includes(value);\r\n}\r\n\r\nexport function isSourcePreviewAction(value: string): value is SourcePreviewAction {\r\n\treturn (SOURCE_PREVIEW_ACTIONS as readonly string[]).includes(value);\r\n}\r\n\r\nexport function isSourceCommitAction(value: string): value is SourceCommitAction {\r\n\treturn (SOURCE_COMMIT_ACTIONS as readonly string[]).includes(value);\r\n}\r\n\r\nexport function looksSecret(value: string): boolean {\r\n\treturn /eyJ[A-Za-z0-9_-]+\\.|sk-[A-Za-z0-9_-]{8,}|Bearer\\s+\\S+/u.test(value);\r\n}\r\n\r\nexport function safeDisplayPath(value: unknown, kind: SourceKind): string {\r\n\tconst text = optionalString(value);\r\n\tif (text === undefined || looksSecret(text) || text.length > 180) return SOURCE_DEFAULT_PATH[kind];\r\n\treturn text;\r\n}\r\n\r\nexport function safeWarning(value: unknown): string | undefined {\r\n\tconst text = optionalString(value);\r\n\tif (text === undefined || looksSecret(text)) return undefined;\r\n\treturn text;\r\n}\r\n\r\nexport function formatEpoch(value: number | undefined): string | undefined {\r\n\tif (value === undefined || !Number.isFinite(value) || value <= 0) return undefined;\r\n\tconst ms = value > 1e12 ? value : value > 1e9 ? value * 1000 : undefined;\r\n\tif (ms === undefined) return undefined;\r\n\tconst formatted = new Date(ms).toLocaleString();\r\n\treturn formatted.length > 0 ? formatted : undefined;\r\n}\r\n\r\nexport function parseSource(value: unknown): SourceStatus | undefined {\r\n\tif (!isRecord(value) || typeof value[\"kind\"] !== \"string\" || !isSourceKind(value[\"kind\"])) return undefined;\r\n\tconst kind = value[\"kind\"];\r\n\tconst reasonRaw = optionalString(value[\"reason\"]);\r\n\tconst expiresAt = optionalFiniteNumber(value[\"expiresAt\"]);\r\n\treturn {\r\n\t\tkind,\r\n\t\tdisplayPath: safeDisplayPath(value[\"displayPath\"], kind),\r\n\t\tavailable: value[\"available\"] === true,\r\n\t\t...(expiresAt === undefined ? {} : { expiresAt }),\r\n\t\t...(reasonRaw !== undefined && isSourceReason(reasonRaw) ? { reason: reasonRaw } : {}),\r\n\t};\r\n}\r\n\r\nexport function mergeSources(discovered: readonly SourceStatus[]): SourceStatus[] {\r\n\treturn SOURCE_KINDS.map((kind) => {\r\n\t\tconst found = discovered.find((entry) => entry.kind === kind);\r\n\t\treturn found ?? { kind, displayPath: SOURCE_DEFAULT_PATH[kind], available: false, reason: \"missing\" };\r\n\t});\r\n}\r\n\r\nexport function parseSources(value: unknown): SourceStatus[] {\r\n\tconst rows = Array.isArray(value)\r\n\t\t? value\r\n\t\t: isRecord(value) && Array.isArray(value[\"sources\"])\r\n\t\t\t? value[\"sources\"]\r\n\t\t\t: [];\r\n\treturn mergeSources(rows.map(parseSource).filter((entry): entry is SourceStatus => entry !== undefined));\r\n}\r\n\r\nexport function parsePreview(value: unknown): SourcePreview | undefined {\r\n\tif (!isRecord(value)) return undefined;\r\n\tconst previewId = optionalString(value[\"previewId\"]);\r\n\tconst kindRaw = optionalString(value[\"kind\"]);\r\n\tif (previewId === undefined || kindRaw === undefined || !isSourceKind(kindRaw)) return undefined;\r\n\tconst conflictRaw = optionalString(value[\"conflict\"]);\r\n\tconst actionRaw = optionalString(value[\"action\"]);\r\n\tconst expiresAt = optionalFiniteNumber(value[\"expiresAt\"]);\r\n\tconst ticketExpiresAt = optionalFiniteNumber(value[\"ticketExpiresAt\"]);\r\n\tconst warnings = Array.isArray(value[\"warnings\"])\r\n\t\t? value[\"warnings\"].map(safeWarning).filter((entry): entry is string => entry !== undefined)\r\n\t\t: [];\r\n\treturn {\r\n\t\tpreviewId,\r\n\t\tkind: kindRaw,\r\n\t\tdisplayPath: safeDisplayPath(value[\"displayPath\"], kindRaw),\r\n\t\tconfirmOverwriteRequired: value[\"confirmOverwriteRequired\"] === true,\r\n\t\twarnings,\r\n\t\t...(expiresAt === undefined ? {} : { expiresAt }),\r\n\t\t...(ticketExpiresAt === undefined ? {} : { ticketExpiresAt }),\r\n\t\t...(conflictRaw !== undefined && isSourceConflict(conflictRaw) ? { conflict: conflictRaw } : {}),\r\n\t\t...(actionRaw !== undefined && isSourcePreviewAction(actionRaw) ? { action: actionRaw } : {}),\r\n\t};\r\n}\r\n\r\nexport function parseCommitAction(value: unknown): SourceCommitAction | undefined {\r\n\tif (!isRecord(value)) return undefined;\r\n\tconst action = optionalString(value[\"action\"]);\r\n\treturn action !== undefined && isSourceCommitAction(action) ? action : undefined;\r\n}\r\n\r\nexport function boundedInteger(value: unknown, min: number, max: number, fallback: number): number {\r\n\tconst numeric = optionalFiniteNumber(value);\r\n\treturn numeric !== undefined && Number.isInteger(numeric) && numeric >= min && numeric <= max ? numeric : fallback;\r\n}\r\n\r\nexport function emptyCapabilitySettings(): CapabilitySettingsView {\r\n\treturn {\r\n\t\tcodexSearch: false,\r\n\t\tcodexImages: false,\r\n\t\tcodexImageEdits: false,\r\n\t\tcodexImagesAnyModel: false,\r\n\t\tcodexUsage: false,\r\n\t\tcodexFast: false,\r\n\t\tgrokImagineImage: false,\r\n\t\tgrokImagineVideo: false,\r\n\t\tsearchResults: 5,\r\n\t\timageCount: 1,\r\n\t\tvideoArtifactTtlMs: 7 * 24 * HOUR_MS,\r\n\t};\r\n}\r\n\r\nexport function parseCapabilitySettings(value: unknown): CapabilitySettingsView {\r\n\tconst source = isRecord(value) ? value : {};\r\n\treturn {\r\n\t\tcodexSearch: source[\"codexSearch\"] === true,\r\n\t\tcodexImages: source[\"codexImages\"] === true,\r\n\t\tcodexImageEdits: source[\"codexImageEdits\"] === true,\r\n\t\tcodexImagesAnyModel: source[\"codexImagesAnyModel\"] === true,\r\n\t\tcodexUsage: source[\"codexUsage\"] === true,\r\n\t\tcodexFast: source[\"codexFast\"] === true,\r\n\t\tgrokImagineImage: source[\"grokImagineImage\"] === true,\r\n\t\tgrokImagineVideo: source[\"grokImagineVideo\"] === true,\r\n\t\tsearchResults: boundedInteger(source[\"searchResults\"], 1, 20, 5),\r\n\t\timageCount: boundedInteger(source[\"imageCount\"], 1, 4, 1),\r\n\t\tvideoArtifactTtlMs: boundedInteger(source[\"videoArtifactTtlMs\"], HOUR_MS, 7 * 24 * HOUR_MS, 7 * 24 * HOUR_MS),\r\n\t};\r\n}\r\n\r\nexport function parseCapabilities(value: unknown): CapabilitySnapshot | undefined {\r\n\tif (!isRecord(value)) return undefined;\r\n\tconst nested = isRecord(value[\"value\"]) ? value[\"value\"] : value;\r\n\tconst revision = optionalFiniteNumber(value[\"revision\"]);\r\n\tif (revision === undefined && !isRecord(value[\"value\"]) && value[\"writable\"] === undefined) return undefined;\r\n\treturn {\r\n\t\tvalue: parseCapabilitySettings(nested),\r\n\t\trevision: revision ?? 0,\r\n\t\twritable: value[\"writable\"] === true,\r\n\t};\r\n}\r\n\r\nfunction parseUsageWindow(value: unknown): UsageWindowView | undefined {\r\n\tif (!isRecord(value)) return undefined;\r\n\tconst usedPercent = optionalPercent(value[\"usedPercent\"] ?? value[\"used_percent\"]);\r\n\tconst remainingPercent = optionalPercent(value[\"remainingPercent\"] ?? value[\"remaining_percent\"]);\r\n\tconst windowSeconds = optionalFiniteNumber(value[\"windowSeconds\"] ?? value[\"limit_window_seconds\"]);\r\n\tconst resetsAt = optionalFiniteNumber(value[\"resetsAt\"] ?? value[\"reset_at\"]);\r\n\tif (\r\n\t\tusedPercent === undefined &&\r\n\t\tremainingPercent === undefined &&\r\n\t\twindowSeconds === undefined &&\r\n\t\tresetsAt === undefined\r\n\t) {\r\n\t\treturn undefined;\r\n\t}\r\n\treturn {\r\n\t\t...(usedPercent === undefined ? {} : { usedPercent }),\r\n\t\t...(remainingPercent === undefined ? {} : { remainingPercent }),\r\n\t\t...(windowSeconds !== undefined && windowSeconds > 0 ? { windowSeconds } : {}),\r\n\t\t...(resetsAt === undefined ? {} : { resetsAt }),\r\n\t};\r\n}\r\n\r\nfunction parseUsageLimit(value: unknown, fallbackId: string): UsageLimitView | undefined {\r\n\tif (!isRecord(value)) return undefined;\r\n\tconst id = optionalString(value[\"id\"]) ?? optionalString(value[\"metered_feature\"]) ?? fallbackId;\r\n\tconst name = optionalString(value[\"name\"]) ?? optionalString(value[\"limit_name\"]);\r\n\tconst nested = isRecord(value[\"rate_limit\"]) ? value[\"rate_limit\"] : value;\r\n\tconst windows = Array.isArray(value[\"windows\"])\r\n\t\t? value[\"windows\"].map(parseUsageWindow).filter((entry): entry is UsageWindowView => entry !== undefined)\r\n\t\t: [\r\n\t\t\t\tparseUsageWindow(nested[\"primary_window\"]),\r\n\t\t\t\tparseUsageWindow(nested[\"secondary_window\"]),\r\n\t\t\t\tparseUsageWindow(nested),\r\n\t\t\t].filter((entry): entry is UsageWindowView => entry !== undefined);\r\n\tif (windows.length === 0 && name === undefined && optionalString(value[\"id\"]) === undefined) return undefined;\r\n\treturn { id, windows, ...(name === undefined ? {} : { name }) };\r\n}\r\n\r\nexport function parseUsage(value: unknown): UsageView | undefined {\r\n\tif (!isRecord(value)) return undefined;\r\n\tconst payload = isRecord(value[\"usage\"]) ? value[\"usage\"] : value;\r\n\tconst rateLimits: UsageLimitView[] = [];\r\n\tconst seen = new Set<string>();\r\n\tconst add = (limit: UsageLimitView | undefined): void => {\r\n\t\tif (limit === undefined || seen.has(limit.id)) return;\r\n\t\tseen.add(limit.id);\r\n\t\trateLimits.push(limit);\r\n\t};\r\n\tif (Array.isArray(payload[\"rateLimits\"])) {\r\n\t\tpayload[\"rateLimits\"].forEach((entry, index) => add(parseUsageLimit(entry, `limit-${String(index)}`)));\r\n\t} else {\r\n\t\tadd(parseUsageLimit(payload[\"rate_limit\"], \"codex\"));\r\n\t\tif (Array.isArray(payload[\"additional_rate_limits\"])) {\r\n\t\t\tpayload[\"additional_rate_limits\"].forEach((entry, index) =>\r\n\t\t\t\tadd(parseUsageLimit(entry, `extra-${String(index)}`)),\r\n\t\t\t);\r\n\t\t}\r\n\t\tadd(parseUsageLimit(payload[\"code_review_rate_limit\"], \"code_review\"));\r\n\t}\r\n\tconst credits = isRecord(payload[\"credits\"]) ? payload[\"credits\"] : undefined;\r\n\tconst spend = isRecord(payload[\"individualLimit\"])\r\n\t\t? payload[\"individualLimit\"]\r\n\t\t: isRecord(payload[\"spend_control\"])\r\n\t\t\t? isRecord(payload[\"spend_control\"][\"individual_limit\"])\r\n\t\t\t\t? payload[\"spend_control\"][\"individual_limit\"]\r\n\t\t\t\t: payload[\"spend_control\"]\r\n\t\t\t: undefined;\r\n\tconst resetRaw = isRecord(payload[\"resetCredits\"])\r\n\t\t? payload[\"resetCredits\"][\"availableCount\"]\r\n\t\t: isRecord(payload[\"rate_limit_reset_credits\"])\r\n\t\t\t? payload[\"rate_limit_reset_credits\"][\"available_count\"]\r\n\t\t\t: undefined;\r\n\tconst resetCredits = optionalFiniteNumber(resetRaw);\r\n\tconst fetchedAt = optionalFiniteNumber(payload[\"fetchedAt\"]);\r\n\tconst spendControlReached =\r\n\t\toptionalBoolean(payload[\"spendControlReached\"]) ??\r\n\t\t(isRecord(payload[\"spend_control\"]) ? optionalBoolean(payload[\"spend_control\"][\"reached\"]) : undefined);\r\n\tconst creditsBalance = credits === undefined ? undefined : optionalString(credits[\"balance\"]);\r\n\tconst individualLimit = spend === undefined ? undefined : optionalString(spend[\"limit\"]);\r\n\tconst individualUsed = spend === undefined ? undefined : optionalString(spend[\"used\"]);\r\n\tconst individualRemaining = spend === undefined ? undefined : optionalString(spend[\"remaining\"]);\r\n\tconst individualRemainingPercent =\r\n\t\tspend === undefined ? undefined : optionalPercent(spend[\"remainingPercent\"] ?? spend[\"remaining_percent\"]);\r\n\tconst individualResetsAt =\r\n\t\tspend === undefined ? undefined : optionalFiniteNumber(spend[\"resetsAt\"] ?? spend[\"reset_at\"]);\r\n\treturn {\r\n\t\trateLimits,\r\n\t\t...(credits !== undefined && typeof credits[\"unlimited\"] === \"boolean\"\r\n\t\t\t? { creditsUnlimited: credits[\"unlimited\"] }\r\n\t\t\t: {}),\r\n\t\t...(creditsBalance === undefined ? {} : { creditsBalance }),\r\n\t\t...(individualLimit === undefined ? {} : { individualLimit }),\r\n\t\t...(individualUsed === undefined ? {} : { individualUsed }),\r\n\t\t...(individualRemaining === undefined ? {} : { individualRemaining }),\r\n\t\t...(individualRemainingPercent === undefined ? {} : { individualRemainingPercent }),\r\n\t\t...(individualResetsAt === undefined ? {} : { individualResetsAt }),\r\n\t\t...(spendControlReached === undefined ? {} : { spendControlReached }),\r\n\t\t...(resetCredits !== undefined && resetCredits >= 0 && Number.isSafeInteger(resetCredits) ? { resetCredits } : {}),\r\n\t\t...(fetchedAt === undefined ? {} : { fetchedAt }),\r\n\t};\r\n}\r\n\r\nexport function usageHasVisibleFields(usage: UsageView): boolean {\r\n\treturn (\r\n\t\tusage.rateLimits.some((limit) => limit.windows.length > 0 || limit.name !== undefined) ||\r\n\t\tusage.creditsUnlimited !== undefined ||\r\n\t\tusage.creditsBalance !== undefined ||\r\n\t\tusage.individualLimit !== undefined ||\r\n\t\tusage.individualUsed !== undefined ||\r\n\t\tusage.individualRemaining !== undefined ||\r\n\t\tusage.individualRemainingPercent !== undefined ||\r\n\t\tusage.spendControlReached === true ||\r\n\t\tusage.resetCredits !== undefined\r\n\t);\r\n}\r\n\r\nexport function parseGateway(value: unknown): GatewayView | undefined {\r\n\tif (!isRecord(value)) return undefined;\r\n\tconst bind = optionalString(value[\"bind\"]);\r\n\tconst port = optionalFiniteNumber(value[\"port\"]);\r\n\tif (bind === undefined || port === undefined) return undefined;\r\n\tconst models = Array.isArray(value[\"models\"])\r\n\t\t? value[\"models\"].filter((model): model is string => typeof model === \"string\" && model.length > 0)\r\n\t\t: [];\r\n\tconst model = optionalString(value[\"model\"]) ?? models[0] ?? null;\r\n\tif (models.length === 0 && model !== null) models.push(model);\r\n\tconst keyAvailable = value[\"keyAvailable\"] === true || value[\"keyConfigured\"] === true;\r\n\treturn {\r\n\t\tenabled: value[\"enabled\"] === true,\r\n\t\trunning: value[\"running\"] === true,\r\n\t\tbind,\r\n\t\tport,\r\n\t\tmodel,\r\n\t\tkeyConfigured: keyAvailable,\r\n\t\tkeyAvailable,\r\n\t\tkeyHint: optionalString(value[\"keyHint\"]) ?? \"\",\r\n\t\tmodels,\r\n\t\twarning: optionalString(value[\"warning\"]) ?? \"\",\r\n\t};\r\n}\r\n\r\nexport function formatGatewayBaseUrl(bind: string, port: number): string {\r\n\tconst host = bind.includes(\":\") && !bind.startsWith(\"[\") ? `[${bind}]` : bind;\r\n\treturn `http://${host}:${String(port)}`;\r\n}\r\n\r\nexport function randomGatewayPort(exclude?: number): number {\r\n\tfor (let attempt = 0; attempt < 32; attempt += 1) {\r\n\t\tconst span = GATEWAY_RANDOM_PORT_MAX - GATEWAY_RANDOM_PORT_MIN + 1;\r\n\t\tconst candidate = GATEWAY_RANDOM_PORT_MIN + Math.floor(Math.random() * span);\r\n\t\tif (candidate !== exclude && !GATEWAY_RANDOM_RESERVED.has(candidate)) return candidate;\r\n\t}\r\n\treturn exclude === GATEWAY_RANDOM_PORT_MIN ? GATEWAY_RANDOM_PORT_MIN + 1 : GATEWAY_RANDOM_PORT_MIN;\r\n}\r\n\r\nexport function parseGatewayPort(value: string): number | undefined {\r\n\tconst port = Number(value);\r\n\tif (!Number.isInteger(port) || port < GATEWAY_PORT_MIN || port > GATEWAY_PORT_MAX) return undefined;\r\n\treturn port;\r\n}\r\n\r\nexport function parseImagineCredential(value: unknown): ImagineCredentialView | undefined {\r\n\tif (!isRecord(value)) return undefined;\r\n\tconst configured = optionalBoolean(value[\"configured\"]);\r\n\tif (configured === undefined && value[\"source\"] === undefined && value[\"writable\"] === undefined) return undefined;\r\n\tconst source = optionalString(value[\"source\"]);\r\n\tconst writable = optionalBoolean(value[\"writable\"]);\r\n\treturn {\r\n\t\tconfigured: configured === true,\r\n\t\t...(source === undefined || looksSecret(source) ? {} : { source }),\r\n\t\t...(writable === undefined ? {} : { writable }),\r\n\t};\r\n}\r\n\r\nexport function imagineSourceLabel(source: string | undefined, t: GrokBuildSettingsInjected[\"t\"]): string {\r\n\tif (source === undefined) return t(\"imagineSourceUnknown\");\r\n\tconst mapped = IMAGINE_SOURCE_KEY[source] ?? IMAGINE_SOURCE_KEY[source.toLowerCase()];\r\n\tif (mapped !== undefined) return t(mapped);\r\n\tif (source.length <= 40 && /^[a-z0-9._-]+$/iu.test(source) && !looksSecret(source)) return source;\r\n\treturn t(\"imagineSourceUnknown\");\r\n}\r\n\r\nexport function modelFields(status: ProviderStatus): { available: string[]; selected: string[] } {\r\n\tif (status.status !== \"signed-in\") return { available: [], selected: [] };\r\n\treturn {\r\n\t\tavailable: \"available\" in status ? status.available : [],\r\n\t\tselected: \"selected\" in status ? status.selected : [],\r\n\t};\r\n}\r\n", "/** CLI credential pull preview panel. */\r\n\r\nimport { SOURCE_CONFLICT_KEY, SOURCE_KIND_KEY, SOURCE_PREVIEW_ACTION_KEY } from \"../constants.ts\";\r\nimport { formatEpoch } from \"../parsers.ts\";\r\nimport {\r\n\tbodyStyle,\r\n\tbuttonStyle,\r\n\tcardStyle,\r\n\tcheckRowStyle,\r\n\thintStyle,\r\n\tlistStyle,\r\n\tmonoStyle,\r\n\tprimaryButtonStyle,\r\n} from \"../styles.ts\";\r\nimport type { GrokBuildSettingsInjected, SourcePreview } from \"../types.ts\";\r\n\r\nexport interface CliPullPreviewProps {\r\n\tt: GrokBuildSettingsInjected[\"t\"];\r\n\tpreview: SourcePreview;\r\n\tconfirmOverwrite: boolean;\r\n\tsourcesBusy: boolean;\r\n\tonConfirmOverwriteChange: (checked: boolean) => void;\r\n\tonCommit: () => void;\r\n\tonCancel: () => void;\r\n}\r\n\r\nexport function CliPullPreview({\r\n\tt,\r\n\tpreview,\r\n\tconfirmOverwrite,\r\n\tsourcesBusy,\r\n\tonConfirmOverwriteChange,\r\n\tonCommit,\r\n\tonCancel,\r\n}: CliPullPreviewProps) {\r\n\tconst expiresAt = formatEpoch(preview.expiresAt);\r\n\tconst ticketExpiresAt = formatEpoch(preview.ticketExpiresAt);\r\n\r\n\treturn (\r\n\t\t<section\r\n\t\t\tid={`coding-oauth-source-preview-${preview.kind}`}\r\n\t\t\tstyle={cardStyle}\r\n\t\t\taria-labelledby={`coding-oauth-source-preview-title-${preview.kind}`}\r\n\t\t\taria-live=\"polite\"\r\n\t\t\ttabIndex={-1}\r\n\t\t>\r\n\t\t\t<p id={`coding-oauth-source-preview-title-${preview.kind}`} style={bodyStyle}>\r\n\t\t\t\t{t(\"sourcesPreviewTitle\")} \u00B7 {t(SOURCE_KIND_KEY[preview.kind])}\r\n\t\t\t</p>\r\n\t\t\t<p style={hintStyle}>\r\n\t\t\t\t<span style={monoStyle}>{preview.displayPath}</span>\r\n\t\t\t</p>\r\n\t\t\t<p style={bodyStyle}>\r\n\t\t\t\t{t(\"sourcesConflict\", {\r\n\t\t\t\t\tdetail: t(\r\n\t\t\t\t\t\tpreview.conflict === undefined ? \"sourceConflictUnrecognized\" : SOURCE_CONFLICT_KEY[preview.conflict],\r\n\t\t\t\t\t),\r\n\t\t\t\t})}\r\n\t\t\t</p>\r\n\t\t\t<p style={bodyStyle}>\r\n\t\t\t\t{t(\"sourcesAction\", {\r\n\t\t\t\t\tdetail: t(\r\n\t\t\t\t\t\tpreview.action === undefined ? \"sourceActionUnrecognized\" : SOURCE_PREVIEW_ACTION_KEY[preview.action],\r\n\t\t\t\t\t),\r\n\t\t\t\t})}\r\n\t\t\t</p>\r\n\t\t\t{expiresAt === undefined ? null : <p style={hintStyle}>{t(\"sourcesPreviewExpires\", { time: expiresAt })}</p>}\r\n\t\t\t{ticketExpiresAt === undefined ? null : (\r\n\t\t\t\t<p style={hintStyle}>{t(\"sourcesTicketExpires\", { time: ticketExpiresAt })}</p>\r\n\t\t\t)}\r\n\t\t\t{preview.warnings.length === 0 ? null : (\r\n\t\t\t\t<ul style={{ ...listStyle, gap: 4 }} aria-label={t(\"sourcesWarnings\")}>\r\n\t\t\t\t\t{preview.warnings.map((warning) => (\r\n\t\t\t\t\t\t<li key={warning} style={hintStyle}>\r\n\t\t\t\t\t\t\t{warning}\r\n\t\t\t\t\t\t</li>\r\n\t\t\t\t\t))}\r\n\t\t\t\t</ul>\r\n\t\t\t)}\r\n\t\t\t{preview.confirmOverwriteRequired ? (\r\n\t\t\t\t<label style={checkRowStyle}>\r\n\t\t\t\t\t<input\r\n\t\t\t\t\t\taria-describedby={`coding-oauth-source-overwrite-hint-${preview.kind}`}\r\n\t\t\t\t\t\ttype=\"checkbox\"\r\n\t\t\t\t\t\tchecked={confirmOverwrite}\r\n\t\t\t\t\t\tdisabled={sourcesBusy || preview.action === \"blocked\"}\r\n\t\t\t\t\t\tonChange={(event) => {\r\n\t\t\t\t\t\t\tonConfirmOverwriteChange(event.target.checked);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t/>\r\n\t\t\t\t\t<span>\r\n\t\t\t\t\t\t{t(\"sourcesConfirmOverwrite\")}\r\n\t\t\t\t\t\t<span id={`coding-oauth-source-overwrite-hint-${preview.kind}`} style={{ display: \"block\", ...hintStyle }}>\r\n\t\t\t\t\t\t\t{t(\"sourcesConfirmOverwriteHint\")}\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t</span>\r\n\t\t\t\t</label>\r\n\t\t\t) : null}\r\n\t\t\t<div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8 }}>\r\n\t\t\t\t<button\r\n\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\tstyle={primaryButtonStyle}\r\n\t\t\t\t\tdisabled={\r\n\t\t\t\t\t\tsourcesBusy || preview.action === \"blocked\" || (preview.confirmOverwriteRequired && !confirmOverwrite)\r\n\t\t\t\t\t}\r\n\t\t\t\t\tonClick={onCommit}\r\n\t\t\t\t>\r\n\t\t\t\t\t{t(\"sourcesCommit\")}\r\n\t\t\t\t</button>\r\n\t\t\t\t<button type=\"button\" style={buttonStyle} disabled={sourcesBusy} onClick={onCancel}>\r\n\t\t\t\t\t{t(\"sourcesCancelPreview\")}\r\n\t\t\t\t</button>\r\n\t\t\t</div>\r\n\t\t</section>\r\n\t);\r\n}\r\n", "/** Dismissible notice banner with optional auto-hide. */\r\n\r\nimport { useEffect } from \"react\";\r\nimport { bodyStyle, buttonStyle, noticeStyle } from \"../styles.ts\";\r\n\r\nexport interface NoticeBannerProps {\r\n\tmessage: string;\r\n\tdismissLabel?: string;\r\n\tonDismiss?: () => void;\r\n\tautoHideMs?: number;\r\n\ttone?: \"info\" | \"success\";\r\n}\r\n\r\nexport function NoticeBanner({ message, dismissLabel, onDismiss, autoHideMs, tone = \"info\" }: NoticeBannerProps) {\r\n\tuseEffect(() => {\r\n\t\tif (autoHideMs === undefined || onDismiss === undefined) return;\r\n\t\tconst timer = window.setTimeout(onDismiss, autoHideMs);\r\n\t\treturn () => {\r\n\t\t\twindow.clearTimeout(timer);\r\n\t\t};\r\n\t}, [autoHideMs, onDismiss]);\r\n\r\n\tconst borderColor =\r\n\t\ttone === \"success\" ? \"var(--dsw-alias-state-success-primary, #22a06b)\" : \"var(--dsw-alias-brand-primary, #1677ff)\";\r\n\r\n\treturn (\r\n\t\t<div\r\n\t\t\tstyle={{\r\n\t\t\t\t...noticeStyle,\r\n\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\talignItems: \"flex-start\",\r\n\t\t\t\tjustifyContent: \"space-between\",\r\n\t\t\t\tgap: 12,\r\n\t\t\t\tborderLeft: `3px solid ${borderColor}`,\r\n\t\t\t}}\r\n\t\t\trole=\"status\"\r\n\t\t>\r\n\t\t\t<p style={{ ...bodyStyle, margin: 0, color: \"var(--dsw-alias-label-primary)\" }}>{message}</p>\r\n\t\t\t{onDismiss === undefined || dismissLabel === undefined ? null : (\r\n\t\t\t\t<button type=\"button\" style={buttonStyle} onClick={onDismiss}>\r\n\t\t\t\t\t{dismissLabel}\r\n\t\t\t\t</button>\r\n\t\t\t)}\r\n\t\t</div>\r\n\t);\r\n}\r\n", "/** Single provider account card for the Accounts tab. */\r\n\r\nimport { useEffect, useMemo, useRef, useState } from \"react\";\r\nimport { SOURCE_REASON_KEY } from \"../constants.ts\";\r\nimport { methodLabel, orderedLoginMethods, shouldShowPerCardSourceReason } from \"../display.ts\";\r\nimport { formatEpoch, modelFields, usageHasVisibleFields } from \"../parsers.ts\";\r\nimport {\r\n\tbodyStyle,\r\n\tbuttonStyle,\r\n\tcardStyle,\r\n\tcheckRowStyle,\r\n\tcodeStyle,\r\n\tcompactButtonStyle,\r\n\thintStyle,\r\n\tinputStyle,\r\n\tlistStyle,\r\n\tmonoStyle,\r\n\tnestedStyle,\r\n\tprimaryButtonStyle,\r\n\trowStyle,\r\n\tstepActiveStyle,\r\n\tstepNumberActiveStyle,\r\n\tstepNumberStyle,\r\n\tstepRowStyle,\r\n\ttitleStyle,\r\n\tvisuallyHiddenStyle,\r\n} from \"../styles.ts\";\r\nimport type {\r\n\tGrokBuildSettingsInjected,\r\n\tGrokStatus,\r\n\tLoginMethod,\r\n\tProviderCardDefinition,\r\n\tProviderStatus,\r\n\tSourceStatus,\r\n\tUsageView,\r\n} from \"../types.ts\";\r\nimport { Badge } from \"./Badge.tsx\";\r\nimport { CopyButton } from \"./CopyButton.tsx\";\r\nimport { ProgressBar } from \"./ProgressBar.tsx\";\r\n\r\nexport interface ProviderCardProps {\r\n\tt: GrokBuildSettingsInjected[\"t\"];\r\n\tdefinition: ProviderCardDefinition;\r\n\tproviderStatus: ProviderStatus;\r\n\tbusy: boolean;\r\n\tsourcesBusy: boolean;\r\n\tremote: boolean;\r\n\tcodeInput: string;\r\n\tpopupBlocked: boolean;\r\n\texpanded: boolean;\r\n\tsource: SourceStatus | undefined;\r\n\tshowUsage: boolean;\r\n\tusage: UsageView | undefined;\r\n\tusageError: string | undefined;\r\n\tusageLoading: boolean;\r\n\tonSignIn: (method: LoginMethod) => void;\r\n\tonSignOut: () => void;\r\n\tonCancelLogin: () => void;\r\n\tonSubmitCode: () => void;\r\n\tonCodeChange: (value: string) => void;\r\n\tonToggleExpanded: () => void;\r\n\tonPreviewSource: () => void;\r\n\tonSaveModels: (selected: string[]) => void;\r\n}\r\n\r\nfunction SignInSteps({\r\n\tt,\r\n\tactiveMethod,\r\n\tuserCode,\r\n\turl,\r\n\tpopupBlocked,\r\n}: {\r\n\tt: GrokBuildSettingsInjected[\"t\"];\r\n\tactiveMethod: LoginMethod;\r\n\tuserCode: string | undefined;\r\n\turl: string | undefined;\r\n\tpopupBlocked: boolean;\r\n}) {\r\n\tconst hasCode = userCode !== undefined && userCode.length > 0;\r\n\tconst hasUrl = url !== undefined && url.length > 0;\r\n\tconst needsPaste = activeMethod !== \"device\";\r\n\r\n\treturn (\r\n\t\t<div style={{ display: \"flex\", flexDirection: \"column\", gap: 10 }}>\r\n\t\t\t<div style={hasUrl ? stepActiveStyle : stepRowStyle}>\r\n\t\t\t\t<span style={hasUrl ? stepNumberActiveStyle : stepNumberStyle} aria-hidden=\"true\">\r\n\t\t\t\t\t1\r\n\t\t\t\t</span>\r\n\t\t\t\t<span>{t(\"signInStepOpen\")}</span>\r\n\t\t\t</div>\r\n\t\t\t{hasUrl ? (\r\n\t\t\t\t<div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8, paddingLeft: 32 }}>\r\n\t\t\t\t\t<a href={url} target=\"_blank\" rel=\"noreferrer\" style={primaryButtonStyle}>\r\n\t\t\t\t\t\t{t(\"openAuthUrl\")}\r\n\t\t\t\t\t</a>\r\n\t\t\t\t\t<CopyButton text={url} idleLabel={t(\"copy\")} copiedLabel={t(\"copied\")} failedLabel={t(\"copyFailed\")} />\r\n\t\t\t\t</div>\r\n\t\t\t) : null}\r\n\t\t\t{popupBlocked && hasUrl ? <p style={hintStyle}>{t(\"popupBlocked\")}</p> : null}\r\n\t\t\t{hasCode ? (\r\n\t\t\t\t<>\r\n\t\t\t\t\t<div style={stepActiveStyle}>\r\n\t\t\t\t\t\t<span style={stepNumberActiveStyle} aria-hidden=\"true\">\r\n\t\t\t\t\t\t\t2\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t<span>{t(\"signInStepCode\")}</span>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div style={{ display: \"flex\", flexWrap: \"wrap\", alignItems: \"center\", gap: 8, paddingLeft: 32 }}>\r\n\t\t\t\t\t\t<span style={codeStyle}>{userCode}</span>\r\n\t\t\t\t\t\t<CopyButton\r\n\t\t\t\t\t\t\ttext={userCode}\r\n\t\t\t\t\t\t\tidleLabel={t(\"copyUserCode\")}\r\n\t\t\t\t\t\t\tcopiedLabel={t(\"copied\")}\r\n\t\t\t\t\t\t\tfailedLabel={t(\"copyFailed\")}\r\n\t\t\t\t\t\t\tprimary\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</>\r\n\t\t\t) : null}\r\n\t\t\t<div style={stepActiveStyle}>\r\n\t\t\t\t<span style={stepNumberActiveStyle} aria-hidden=\"true\">\r\n\t\t\t\t\t{hasCode ? 3 : 2}\r\n\t\t\t\t</span>\r\n\t\t\t\t<span style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}>\r\n\t\t\t\t\t<span\r\n\t\t\t\t\t\taria-hidden=\"true\"\r\n\t\t\t\t\t\tstyle={{\r\n\t\t\t\t\t\t\twidth: 14,\r\n\t\t\t\t\t\t\theight: 14,\r\n\t\t\t\t\t\t\tborder: \"2px solid var(--dsw-alias-brand-primary, #1677ff)\",\r\n\t\t\t\t\t\t\tborderTopColor: \"transparent\",\r\n\t\t\t\t\t\t\tborderRadius: \"50%\",\r\n\t\t\t\t\t\t\tanimation: \"dsh-coding-oauth-spin 0.8s linear infinite\",\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t/>\r\n\t\t\t\t\t{t(\"signInStepWait\")}\r\n\t\t\t\t</span>\r\n\t\t\t</div>\r\n\t\t\t{needsPaste ? (\r\n\t\t\t\t<div style={{ display: \"flex\", flexDirection: \"column\", gap: 8, paddingLeft: 32 }}>\r\n\t\t\t\t\t<p style={bodyStyle}>{t(activeMethod === \"browser\" ? \"pasteBrowserCodeHint\" : \"pasteCodeHint\")}</p>\r\n\t\t\t\t</div>\r\n\t\t\t) : null}\r\n\t\t</div>\r\n\t);\r\n}\r\n\r\nexport function ProviderCard({\r\n\tt,\r\n\tdefinition,\r\n\tproviderStatus,\r\n\tbusy,\r\n\tsourcesBusy,\r\n\tremote,\r\n\tcodeInput,\r\n\tpopupBlocked,\r\n\texpanded,\r\n\tsource,\r\n\tshowUsage,\r\n\tusage,\r\n\tusageError,\r\n\tusageLoading,\r\n\tonSignIn,\r\n\tonSignOut,\r\n\tonCancelLogin,\r\n\tonSubmitCode,\r\n\tonCodeChange,\r\n\tonToggleExpanded,\r\n\tonPreviewSource,\r\n\tonSaveModels,\r\n}: ProviderCardProps) {\r\n\tconst [showAltMethods, setShowAltMethods] = useState(false);\r\n\tconst [modelFilter, setModelFilter] = useState(\"\");\r\n\tconst [logoutConfirm, setLogoutConfirm] = useState(false);\r\n\tconst logoutTrigger = useRef<HTMLButtonElement>(null);\r\n\tconst logoutConfirmAction = useRef<HTMLButtonElement>(null);\r\n\tconst restoreLogoutFocus = useRef(false);\r\n\r\n\tconst ordered = orderedLoginMethods(definition, remote);\r\n\tconst primaryMethod: LoginMethod = ordered[0] ?? definition.recommended;\r\n\tconst altMethods = ordered.filter((method) => method !== primaryMethod);\r\n\r\n\tconst statusLabel =\r\n\t\tproviderStatus.status === \"signed-in\"\r\n\t\t\t? t(\"signedIn\")\r\n\t\t\t: providerStatus.status === \"signing-in\"\r\n\t\t\t\t? t(\"signingIn\")\r\n\t\t\t\t: providerStatus.status === \"error\"\r\n\t\t\t\t\t? t(\"requestFailed\")\r\n\t\t\t\t\t: t(\"signedOut\");\r\n\tconst activeMethod = providerStatus.status === \"signing-in\" ? providerStatus.method : primaryMethod;\r\n\tconst { available, selected } = useMemo(() => modelFields(providerStatus), [providerStatus]);\r\n\tconst [modelDraft, setModelDraft] = useState<string[]>(selected);\r\n\tuseEffect(() => {\r\n\t\tsetModelDraft(selected);\r\n\t}, [selected]);\r\n\tuseEffect(() => {\r\n\t\tif (providerStatus.status !== \"signed-in\") setLogoutConfirm(false);\r\n\t}, [providerStatus.status]);\r\n\tuseEffect(() => {\r\n\t\tif (logoutConfirm) {\r\n\t\t\tlogoutConfirmAction.current?.focus();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!restoreLogoutFocus.current) return;\r\n\t\trestoreLogoutFocus.current = false;\r\n\t\tif (providerStatus.status === \"signed-in\") {\r\n\t\t\tlogoutTrigger.current?.focus();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tdocument.getElementById(`coding-oauth-login-${definition.slug}`)?.focus();\r\n\t}, [definition.slug, logoutConfirm, providerStatus.status]);\r\n\tconst modelDraftDirty =\r\n\t\tmodelDraft.length !== selected.length || modelDraft.some((model, index) => model !== selected[index]);\r\n\tconst grokProviderStatus = definition.slug === \"grok\" ? (providerStatus as GrokStatus) : undefined;\r\n\tconst showSourceReason = shouldShowPerCardSourceReason(source);\r\n\r\n\tconst filteredModels = useMemo(() => {\r\n\t\tconst query = modelFilter.trim().toLowerCase();\r\n\t\tif (query.length === 0) return available;\r\n\t\treturn available.filter((id) => id.toLowerCase().includes(query));\r\n\t}, [available, modelFilter]);\r\n\r\n\tconst usagePercent =\r\n\t\tdefinition.slug === \"codex\" && showUsage\r\n\t\t\t? usage?.individualRemainingPercent === undefined\r\n\t\t\t\t? usage?.rateLimits[0]?.windows[0]?.usedPercent\r\n\t\t\t\t: 100 - usage.individualRemainingPercent\r\n\t\t\t: undefined;\r\n\tconst fetchedAt = formatEpoch(usage?.fetchedAt);\r\n\r\n\treturn (\r\n\t\t<div style={cardStyle}>\r\n\t\t\t<div style={rowStyle}>\r\n\t\t\t\t<div>\r\n\t\t\t\t\t<h3 style={{ ...titleStyle, fontSize: 16 }}>{t(definition.titleKey)}</h3>\r\n\t\t\t\t\t{providerStatus.status === \"signed-in\" && !expanded ? (\r\n\t\t\t\t\t\t<p style={{ ...hintStyle, marginTop: 4 }}>\r\n\t\t\t\t\t\t\t{t(\"modelsSummary\", { selected: selected.length, total: available.length })}\r\n\t\t\t\t\t\t\t{usagePercent === undefined ? \"\" : ` \u00B7 ${t(\"usageUsedShort\", { value: `${String(usagePercent)}%` })}`}\r\n\t\t\t\t\t\t</p>\r\n\t\t\t\t\t) : (\r\n\t\t\t\t\t\t<>\r\n\t\t\t\t\t\t\t<p style={{ ...bodyStyle, marginTop: 4 }}>{t(definition.descriptionKey)}</p>\r\n\t\t\t\t\t\t\t<p style={{ ...bodyStyle, marginTop: 4 }}>\r\n\t\t\t\t\t\t\t\t<span style={monoStyle}>{definition.route}</span>\r\n\t\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t</>\r\n\t\t\t\t\t)}\r\n\t\t\t\t</div>\r\n\t\t\t\t<Badge label={statusLabel} providerStatus={providerStatus.status} />\r\n\t\t\t</div>\r\n\t\t\t<div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8 }}>\r\n\t\t\t\t{providerStatus.status === \"signed-in\" ? (\r\n\t\t\t\t\t<>\r\n\t\t\t\t\t\t{logoutConfirm ? (\r\n\t\t\t\t\t\t\t<fieldset style={{ ...nestedStyle, margin: 0, minWidth: 0 }}>\r\n\t\t\t\t\t\t\t\t<legend style={visuallyHiddenStyle}>{t(\"logoutConfirmTitle\")}</legend>\r\n\t\t\t\t\t\t\t\t<p style={bodyStyle}>{t(\"logoutConfirmHint\")}</p>\r\n\t\t\t\t\t\t\t\t<div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8 }}>\r\n\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\tref={logoutConfirmAction}\r\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\t\tstyle={primaryButtonStyle}\r\n\t\t\t\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\t\trestoreLogoutFocus.current = true;\r\n\t\t\t\t\t\t\t\t\t\t\tonSignOut();\r\n\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t{busy ? t(\"working\") : t(\"logoutConfirmAction\")}\r\n\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\t\tstyle={buttonStyle}\r\n\t\t\t\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\t\trestoreLogoutFocus.current = true;\r\n\t\t\t\t\t\t\t\t\t\t\tsetLogoutConfirm(false);\r\n\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t{t(\"cancel\")}\r\n\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</fieldset>\r\n\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\tref={logoutTrigger}\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tstyle={buttonStyle}\r\n\t\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\t\tonClick={() => setLogoutConfirm(true)}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{t(\"logout\")}\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\tid={`coding-oauth-models-toggle-${definition.slug}`}\r\n\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\tstyle={buttonStyle}\r\n\t\t\t\t\t\t\taria-expanded={expanded}\r\n\t\t\t\t\t\t\taria-controls={expanded ? `coding-oauth-models-${definition.slug}` : undefined}\r\n\t\t\t\t\t\t\tonClick={onToggleExpanded}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{expanded ? t(\"collapseModels\") : t(\"expandModels\")}\r\n\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t{source?.available === true ? (\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\tid={`coding-oauth-source-pull-${definition.slug}`}\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tstyle={buttonStyle}\r\n\t\t\t\t\t\t\t\tdisabled={sourcesBusy}\r\n\t\t\t\t\t\t\t\tonClick={onPreviewSource}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{t(\"sourcesPullCopy\")}\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t) : null}\r\n\t\t\t\t\t</>\r\n\t\t\t\t) : providerStatus.status === \"signing-in\" ? (\r\n\t\t\t\t\t<>\r\n\t\t\t\t\t\t<button type=\"button\" style={buttonStyle} disabled={busy} onClick={onCancelLogin}>\r\n\t\t\t\t\t\t\t{t(\"cancelLogin\")}\r\n\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t{altMethods.length > 0 ? (\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tstyle={compactButtonStyle}\r\n\t\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\tsetShowAltMethods((current) => !current);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{showAltMethods ? t(\"hideOtherLoginMethods\") : t(\"otherLoginMethods\")}\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t) : null}\r\n\t\t\t\t\t\t{showAltMethods\r\n\t\t\t\t\t\t\t? altMethods.map((method) => (\r\n\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\tkey={method}\r\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\t\tstyle={compactButtonStyle}\r\n\t\t\t\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\t\tonSignIn(method);\r\n\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t{methodLabel(method, t, { remote, primary: false })}\r\n\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t))\r\n\t\t\t\t\t\t\t: null}\r\n\t\t\t\t\t</>\r\n\t\t\t\t) : (\r\n\t\t\t\t\t<>\r\n\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\tid={`coding-oauth-login-${definition.slug}`}\r\n\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\tstyle={primaryButtonStyle}\r\n\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\tonSignIn(primaryMethod);\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{busy ? t(\"working\") : methodLabel(primaryMethod, t, { remote, primary: true })}\r\n\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t{altMethods.length > 0 ? (\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tstyle={compactButtonStyle}\r\n\t\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\tsetShowAltMethods((current) => !current);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{showAltMethods ? t(\"hideOtherLoginMethods\") : t(\"otherLoginMethods\")}\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t) : null}\r\n\t\t\t\t\t\t{showAltMethods\r\n\t\t\t\t\t\t\t? altMethods.map((method) => (\r\n\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\tkey={method}\r\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\t\tstyle={compactButtonStyle}\r\n\t\t\t\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\t\tonSignIn(method);\r\n\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t{methodLabel(method, t, { remote, primary: false })}\r\n\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t))\r\n\t\t\t\t\t\t\t: null}\r\n\t\t\t\t\t\t{source?.available === true ? (\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\tid={`coding-oauth-source-pull-${definition.slug}`}\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tstyle={buttonStyle}\r\n\t\t\t\t\t\t\t\tdisabled={sourcesBusy}\r\n\t\t\t\t\t\t\t\tonClick={onPreviewSource}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{t(\"sourcesPullCopy\")}\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t) : showSourceReason && source?.reason !== undefined ? (\r\n\t\t\t\t\t\t\t<span style={hintStyle}>{t(SOURCE_REASON_KEY[source.reason])}</span>\r\n\t\t\t\t\t\t) : null}\r\n\t\t\t\t\t</>\r\n\t\t\t\t)}\r\n\t\t\t</div>\r\n\t\t\t{providerStatus.status === \"error\" ? (\r\n\t\t\t\t<p style={{ ...bodyStyle, color: \"var(--dsw-alias-state-error-primary)\" }}>{providerStatus.message}</p>\r\n\t\t\t) : null}\r\n\t\t\t{providerStatus.status === \"signing-in\" ? (\r\n\t\t\t\t<SignInSteps\r\n\t\t\t\t\tt={t}\r\n\t\t\t\t\tactiveMethod={activeMethod}\r\n\t\t\t\t\tuserCode={providerStatus.userCode}\r\n\t\t\t\t\turl={providerStatus.url}\r\n\t\t\t\t\tpopupBlocked={popupBlocked}\r\n\t\t\t\t/>\r\n\t\t\t) : null}\r\n\t\t\t{providerStatus.status === \"signing-in\" && activeMethod !== \"device\" ? (\r\n\t\t\t\t<div style={{ display: \"flex\", flexDirection: \"column\", gap: 8 }}>\r\n\t\t\t\t\t<div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8 }}>\r\n\t\t\t\t\t\t<label htmlFor={`coding-oauth-code-${definition.slug}`} style={visuallyHiddenStyle}>\r\n\t\t\t\t\t\t\t{t(\"pasteCodeLabel\")}\r\n\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t<input\r\n\t\t\t\t\t\t\tid={`coding-oauth-code-${definition.slug}`}\r\n\t\t\t\t\t\t\tstyle={{ ...inputStyle, flex: \"1 1 360px\" }}\r\n\t\t\t\t\t\t\tvalue={codeInput}\r\n\t\t\t\t\t\t\tplaceholder={t(\"pasteCodePlaceholder\")}\r\n\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\tonChange={(event) => {\r\n\t\t\t\t\t\t\t\tonCodeChange(event.target.value);\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\tonKeyDown={(event) => {\r\n\t\t\t\t\t\t\t\tif (event.key === \"Enter\") {\r\n\t\t\t\t\t\t\t\t\tevent.preventDefault();\r\n\t\t\t\t\t\t\t\t\tonSubmitCode();\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\tstyle={primaryButtonStyle}\r\n\t\t\t\t\t\t\tdisabled={busy || codeInput.trim().length === 0}\r\n\t\t\t\t\t\t\tonClick={onSubmitCode}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{t(\"submitCode\")}\r\n\t\t\t\t\t\t</button>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t) : null}\r\n\t\t\t{providerStatus.status === \"signed-in\" && expanded ? (\r\n\t\t\t\t<div id={`coding-oauth-models-${definition.slug}`} style={{ display: \"flex\", flexDirection: \"column\", gap: 8 }}>\r\n\t\t\t\t\t<div style={rowStyle}>\r\n\t\t\t\t\t\t<h4 style={{ ...titleStyle, fontSize: 14 }}>{t(\"models\")}</h4>\r\n\t\t\t\t\t\t<div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8 }}>\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tstyle={compactButtonStyle}\r\n\t\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\tsetModelDraft([]);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{t(\"deselectAll\")}\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tstyle={compactButtonStyle}\r\n\t\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\tsetModelDraft([...available]);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{t(\"selectAll\")}\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tstyle={compactButtonStyle}\r\n\t\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\tsetModelDraft(available.length > 0 ? [available[0]!] : []);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{t(\"resetModelsDefault\")}\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<label htmlFor={`coding-oauth-model-filter-${definition.slug}`} style={visuallyHiddenStyle}>\r\n\t\t\t\t\t\t{t(\"modelFilterLabel\", { provider: t(definition.titleKey) })}\r\n\t\t\t\t\t</label>\r\n\t\t\t\t\t<input\r\n\t\t\t\t\t\tid={`coding-oauth-model-filter-${definition.slug}`}\r\n\t\t\t\t\t\ttype=\"search\"\r\n\t\t\t\t\t\tstyle={inputStyle}\r\n\t\t\t\t\t\tvalue={modelFilter}\r\n\t\t\t\t\t\tplaceholder={t(\"modelFilterPlaceholder\")}\r\n\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\tonChange={(event) => {\r\n\t\t\t\t\t\t\tsetModelFilter(event.target.value);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t/>\r\n\t\t\t\t\t{grokProviderStatus?.status === \"signed-in\" ? (\r\n\t\t\t\t\t\t<p style={bodyStyle}>\r\n\t\t\t\t\t\t\t{grokProviderStatus.catalogSource === \"live\"\r\n\t\t\t\t\t\t\t\t? t(\"catalogLive\")\r\n\t\t\t\t\t\t\t\t: grokProviderStatus.catalogSource === \"cache\"\r\n\t\t\t\t\t\t\t\t\t? t(\"catalogCache\")\r\n\t\t\t\t\t\t\t\t\t: t(\"catalogFallback\")}\r\n\t\t\t\t\t\t</p>\r\n\t\t\t\t\t) : null}\r\n\t\t\t\t\t<p style={bodyStyle}>\r\n\t\t\t\t\t\t{t(\"modelHint\")} <span style={monoStyle}>{definition.route}/<id></span>\r\n\t\t\t\t\t</p>\r\n\t\t\t\t\t<ul style={listStyle}>\r\n\t\t\t\t\t\t{filteredModels.map((id) => {\r\n\t\t\t\t\t\t\tconst checked = modelDraft.includes(id);\r\n\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t<li key={id}>\r\n\t\t\t\t\t\t\t\t\t<label style={checkRowStyle}>\r\n\t\t\t\t\t\t\t\t\t\t<input\r\n\t\t\t\t\t\t\t\t\t\t\ttype=\"checkbox\"\r\n\t\t\t\t\t\t\t\t\t\t\tchecked={checked}\r\n\t\t\t\t\t\t\t\t\t\t\tdisabled={busy}\r\n\t\t\t\t\t\t\t\t\t\t\tonChange={() => {\r\n\t\t\t\t\t\t\t\t\t\t\t\tconst current = new Set(modelDraft);\r\n\t\t\t\t\t\t\t\t\t\t\t\tif (checked) current.delete(id);\r\n\t\t\t\t\t\t\t\t\t\t\t\telse current.add(id);\r\n\t\t\t\t\t\t\t\t\t\t\t\tsetModelDraft([...available].filter((model) => current.has(model)));\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t\t<span style={monoStyle}>{id}</span>\r\n\t\t\t\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t\t\t</li>\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t})}\r\n\t\t\t\t\t</ul>\r\n\t\t\t\t\t<div style={{ display: \"flex\", flexWrap: \"wrap\", alignItems: \"center\", gap: 8 }}>\r\n\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\tstyle={primaryButtonStyle}\r\n\t\t\t\t\t\t\tdisabled={busy || !modelDraftDirty}\r\n\t\t\t\t\t\t\tonClick={() => onSaveModels(modelDraft)}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{busy ? t(\"working\") : t(\"applyModelDraft\")}\r\n\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t{modelDraftDirty ? <span style={hintStyle}>{t(\"modelDraftPending\")}</span> : null}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t{filteredModels.length === 0 ? <p style={hintStyle}>{t(\"modelFilterPlaceholder\")}</p> : null}\r\n\t\t\t\t\t{grokProviderStatus?.status === \"signed-in\" && grokProviderStatus.catalogError !== undefined ? (\r\n\t\t\t\t\t\t<p style={{ ...bodyStyle, color: \"var(--dsw-alias-state-error-primary)\" }}>{t(\"catalogError\")}</p>\r\n\t\t\t\t\t) : null}\r\n\t\t\t\t\t{definition.slug === \"codex\" && showUsage ? (\r\n\t\t\t\t\t\t<div style={nestedStyle}>\r\n\t\t\t\t\t\t\t<p style={{ ...bodyStyle, color: \"var(--dsw-alias-label-primary)\" }}>{t(\"usageTitle\")}</p>\r\n\t\t\t\t\t\t\t{usageError === undefined ? null : (\r\n\t\t\t\t\t\t\t\t<p style={{ ...bodyStyle, color: \"var(--dsw-alias-state-error-primary)\" }} role=\"alert\">\r\n\t\t\t\t\t\t\t\t\t{usageError}\r\n\t\t\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t{usageLoading && usage === undefined ? (\r\n\t\t\t\t\t\t\t\t<p style={hintStyle}>{t(\"usageLoading\")}</p>\r\n\t\t\t\t\t\t\t) : usage === undefined || !usageHasVisibleFields(usage) ? (\r\n\t\t\t\t\t\t\t\t<p style={hintStyle}>{t(\"usageEmpty\")}</p>\r\n\t\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\t<>\r\n\t\t\t\t\t\t\t\t\t{fetchedAt === undefined ? null : <p style={hintStyle}>{t(\"usageFetchedAt\", { time: fetchedAt })}</p>}\r\n\t\t\t\t\t\t\t\t\t{usagePercent !== undefined ? (\r\n\t\t\t\t\t\t\t\t\t\t<ProgressBar\r\n\t\t\t\t\t\t\t\t\t\t\tvalue={usagePercent}\r\n\t\t\t\t\t\t\t\t\t\t\tlabel={t(\"usageRateLimit\")}\r\n\t\t\t\t\t\t\t\t\t\t\tmeta={t(\"usageUsed\", { value: `${String(usagePercent)}%` })}\r\n\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t) : null}\r\n\t\t\t\t\t\t\t\t\t{usage.rateLimits.map((limit) => {\r\n\t\t\t\t\t\t\t\t\t\tconst window = limit.windows[0];\r\n\t\t\t\t\t\t\t\t\t\tconst used = window?.usedPercent;\r\n\t\t\t\t\t\t\t\t\t\tconst resetsAt = formatEpoch(window?.resetsAt);\r\n\t\t\t\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t\t\t\t<div key={limit.id} style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{used === undefined ? (\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<p style={hintStyle}>{limit.name ?? t(\"usageRateLimit\")}</p>\r\n\t\t\t\t\t\t\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<ProgressBar\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={used}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tlabel={limit.name ?? t(\"usageRateLimit\")}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmeta={\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tresetsAt === undefined\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? t(\"usageUsed\", { value: `${String(used)}%` })\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: `${t(\"usageUsed\", { value: `${String(used)}%` })} \u00B7 ${t(\"usageResets\", { time: resetsAt })}`\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t\t\t})}\r\n\t\t\t\t\t\t\t\t</>\r\n\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t) : null}\r\n\t\t\t\t</div>\r\n\t\t\t) : null}\r\n\t\t</div>\r\n\t);\r\n}\r\n", "/** Compact copy button with copied / failed feedback. */\r\n\r\nimport { useCallback, useEffect, useRef, useState } from \"react\";\r\nimport { copyText } from \"../api.ts\";\r\nimport { compactButtonStyle, primaryButtonStyle } from \"../styles.ts\";\r\n\r\nexport interface CopyButtonProps {\r\n\ttext: string;\r\n\tidleLabel: string;\r\n\tcopiedLabel: string;\r\n\tfailedLabel: string;\r\n\tprimary?: boolean;\r\n\tdisabled?: boolean;\r\n}\r\n\r\nexport function CopyButton({\r\n\ttext,\r\n\tidleLabel,\r\n\tcopiedLabel,\r\n\tfailedLabel,\r\n\tprimary = false,\r\n\tdisabled = false,\r\n}: CopyButtonProps) {\r\n\tconst [state, setState] = useState<\"idle\" | \"copied\" | \"failed\">(\"idle\");\r\n\tconst timerRef = useRef<number | undefined>(undefined);\r\n\r\n\tuseEffect(() => {\r\n\t\treturn () => {\r\n\t\t\tif (timerRef.current !== undefined) window.clearTimeout(timerRef.current);\r\n\t\t};\r\n\t}, []);\r\n\r\n\tconst handleClick = useCallback(async () => {\r\n\t\tconst ok = await copyText(text);\r\n\t\tsetState(ok ? \"copied\" : \"failed\");\r\n\t\tif (timerRef.current !== undefined) window.clearTimeout(timerRef.current);\r\n\t\ttimerRef.current = window.setTimeout(() => {\r\n\t\t\tsetState(\"idle\");\r\n\t\t\ttimerRef.current = undefined;\r\n\t\t}, 2000);\r\n\t}, [text]);\r\n\r\n\tconst label = state === \"copied\" ? copiedLabel : state === \"failed\" ? failedLabel : idleLabel;\r\n\r\n\treturn (\r\n\t\t<button\r\n\t\t\ttype=\"button\"\r\n\t\t\tstyle={primary ? primaryButtonStyle : compactButtonStyle}\r\n\t\t\tdisabled={disabled || text.length === 0}\r\n\t\t\tonClick={() => {\r\n\t\t\t\tvoid handleClick();\r\n\t\t\t}}\r\n\t\t>\r\n\t\t\t{label}\r\n\t\t</button>\r\n\t);\r\n}\r\n", "/** Usage quota progress bar with threshold-based color. */\r\n\r\nimport { hintStyle } from \"../styles.ts\";\r\n\r\nexport interface ProgressBarProps {\r\n\t/** 0\u2013100 used percentage. */\r\n\tvalue: number;\r\n\tlabel?: string;\r\n\tmeta?: string;\r\n}\r\n\r\nfunction barColor(percent: number): string {\r\n\tif (percent >= 90) return \"var(--dsw-alias-state-error-primary, #d92d20)\";\r\n\tif (percent >= 75) return \"var(--dsw-alias-state-warn-primary, #e06c00)\";\r\n\t// Prefer info fill over brand-primary: dark theme inverts brand-primary to near-white.\r\n\treturn \"var(--dsw-alias-button-info-fill, var(--dsw-static-deepseek-500, #4f6ef7))\";\r\n}\r\n\r\nexport function ProgressBar({ value, label, meta }: ProgressBarProps) {\r\n\tconst clamped = Math.max(0, Math.min(100, value));\r\n\treturn (\r\n\t\t<div style={{ display: \"flex\", flexDirection: \"column\", gap: 6 }}>\r\n\t\t\t{label === undefined ? null : (\r\n\t\t\t\t<div style={{ display: \"flex\", justifyContent: \"space-between\", gap: 8, flexWrap: \"wrap\" }}>\r\n\t\t\t\t\t<span style={{ ...hintStyle, color: \"var(--dsw-alias-label-primary)\" }}>{label}</span>\r\n\t\t\t\t\t{meta === undefined ? null : <span style={hintStyle}>{meta}</span>}\r\n\t\t\t\t</div>\r\n\t\t\t)}\r\n\t\t\t<div\r\n\t\t\t\trole=\"progressbar\"\r\n\t\t\t\taria-valuenow={clamped}\r\n\t\t\t\taria-valuemin={0}\r\n\t\t\t\taria-valuemax={100}\r\n\t\t\t\tstyle={{\r\n\t\t\t\t\theight: 8,\r\n\t\t\t\t\tborderRadius: 4,\r\n\t\t\t\t\tbackground: \"var(--dsw-alias-border-l2)\",\r\n\t\t\t\t\toverflow: \"hidden\",\r\n\t\t\t\t}}\r\n\t\t\t>\r\n\t\t\t\t<div\r\n\t\t\t\t\tstyle={{\r\n\t\t\t\t\t\twidth: `${String(clamped)}%`,\r\n\t\t\t\t\t\theight: \"100%\",\r\n\t\t\t\t\t\tborderRadius: 4,\r\n\t\t\t\t\t\tbackground: barColor(clamped),\r\n\t\t\t\t\t\ttransition: \"width 0.3s ease, background 0.3s ease\",\r\n\t\t\t\t\t}}\r\n\t\t\t\t/>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t);\r\n}\r\n", "/** Accessible toggle switch replacing native checkboxes for capability settings. */\r\n\r\nimport type { CSSProperties } from \"react\";\r\nimport { TRANSITION } from \"../styles.ts\";\r\n\r\nexport interface ToggleSwitchProps {\r\n\tchecked: boolean;\r\n\tdisabled?: boolean;\r\n\tonChange: (checked: boolean) => void;\r\n\t/** Accessible label (visually hidden when label prop is rendered externally). */\r\n\tariaLabel?: string;\r\n\tariaDescribedBy?: string;\r\n\tid?: string;\r\n}\r\n\r\nconst trackStyle = (checked: boolean, disabled: boolean): CSSProperties => ({\r\n\tposition: \"relative\",\r\n\twidth: 40,\r\n\theight: 22,\r\n\tborderRadius: 11,\r\n\tflex: \"0 0 auto\",\r\n\tbackground: checked\r\n\t\t? \"var(--dsw-alias-button-primary-fill)\"\r\n\t\t: \"var(--dsw-alias-border-l4, rgba(127, 127, 127, 0.45))\",\r\n\topacity: disabled ? 0.5 : 1,\r\n\tcursor: disabled ? \"not-allowed\" : \"pointer\",\r\n\ttransition: TRANSITION,\r\n\tborder: \"none\",\r\n\tpadding: 0,\r\n});\r\n\r\nconst thumbStyle = (checked: boolean): CSSProperties => ({\r\n\tposition: \"absolute\",\r\n\ttop: 2,\r\n\tleft: checked ? 20 : 2,\r\n\twidth: 18,\r\n\theight: 18,\r\n\tborderRadius: \"50%\",\r\n\t// Match DSH primary fill/foreground pairing so the thumb stays visible when\r\n\t// dark theme inverts brand-primary to near-white.\r\n\tbackground: checked ? \"var(--dsw-alias-label-primary-foreground)\" : \"var(--dsw-alias-button-elevated-fill)\",\r\n\tboxShadow: \"0 1px 3px rgba(0, 0, 0, 0.25)\",\r\n\ttransition: TRANSITION,\r\n});\r\n\r\nexport function ToggleSwitch({\r\n\tchecked,\r\n\tdisabled = false,\r\n\tonChange,\r\n\tariaLabel,\r\n\tariaDescribedBy,\r\n\tid,\r\n}: ToggleSwitchProps) {\r\n\treturn (\r\n\t\t<button\r\n\t\t\tid={id}\r\n\t\t\ttype=\"button\"\r\n\t\t\trole=\"switch\"\r\n\t\t\taria-checked={checked}\r\n\t\t\taria-label={ariaLabel}\r\n\t\t\taria-describedby={ariaDescribedBy}\r\n\t\t\tdisabled={disabled}\r\n\t\t\tstyle={trackStyle(checked, disabled)}\r\n\t\t\tonClick={() => {\r\n\t\t\t\tif (!disabled) onChange(!checked);\r\n\t\t\t}}\r\n\t\t>\r\n\t\t\t<span aria-hidden=\"true\" style={thumbStyle(checked)} />\r\n\t\t</button>\r\n\t);\r\n}\r\n", "/** Capabilities tab: Codex toggles, Grok Imagine, and limits. */\r\n\r\nimport { CAPABILITY_LIMITS, CAPABILITY_TOGGLES } from \"../constants.ts\";\r\nimport { imagineSourceLabel } from \"../parsers.ts\";\r\nimport {\r\n\tbodyStyle,\r\n\tbuttonStyle,\r\n\tcardStyle,\r\n\tdotStyle,\r\n\terrorStyle,\r\n\thintStyle,\r\n\tinputStyle,\r\n\tlistStyle,\r\n\tnestedStyle,\r\n\trowStyle,\r\n\tskeletonStyle,\r\n\tstatusStyle,\r\n\ttitleStyle,\r\n} from \"../styles.ts\";\r\nimport type {\r\n\tCapabilitySettingKey,\r\n\tCapabilitySnapshot,\r\n\tGrokBuildSettingsInjected,\r\n\tImagineCredentialView,\r\n} from \"../types.ts\";\r\nimport { Badge } from \"./Badge.tsx\";\r\nimport { ToggleSwitch } from \"./ToggleSwitch.tsx\";\r\n\r\nexport interface CapabilitiesTabProps {\r\n\tt: GrokBuildSettingsInjected[\"t\"];\r\n\tcapabilities: CapabilitySnapshot | undefined;\r\n\tcapabilitiesError: string | undefined;\r\n\tcapabilitiesBusy: boolean;\r\n\timagine: ImagineCredentialView | undefined;\r\n\timagineError: string | undefined;\r\n\tcodexSignedIn: boolean;\r\n\tonRetry: () => void;\r\n\tonOpenAccounts: (provider: \"codex\") => void;\r\n\tonFocusDependency: (target: \"codexImages\" | \"imagineCredential\") => void;\r\n\tonPatchCapability: (key: CapabilitySettingKey, value: boolean | number) => Promise<boolean | undefined> | undefined;\r\n}\r\n\r\nexport function CapabilitiesTab({\r\n\tt,\r\n\tcapabilities,\r\n\tcapabilitiesError,\r\n\tcapabilitiesBusy,\r\n\timagine,\r\n\timagineError,\r\n\tcodexSignedIn,\r\n\tonRetry,\r\n\tonOpenAccounts,\r\n\tonFocusDependency,\r\n\tonPatchCapability,\r\n}: CapabilitiesTabProps) {\r\n\tconst codexToggles = CAPABILITY_TOGGLES.filter((item) => !item.key.startsWith(\"grokImagine\"));\r\n\tconst imagineToggles = CAPABILITY_TOGGLES.filter((item) => item.key.startsWith(\"grokImagine\"));\r\n\r\n\treturn (\r\n\t\t<section style={cardStyle} aria-labelledby=\"coding-oauth-capabilities-title\">\r\n\t\t\t<div>\r\n\t\t\t\t<h3 id=\"coding-oauth-capabilities-title\" style={{ ...titleStyle, fontSize: 16 }}>\r\n\t\t\t\t\t{t(\"capabilitiesTitle\")}\r\n\t\t\t\t</h3>\r\n\t\t\t\t<p style={{ ...bodyStyle, marginTop: 4 }}>{t(\"capabilitiesIntro\")}</p>\r\n\t\t\t</div>\r\n\t\t\t{imagineError === undefined ? null : (\r\n\t\t\t\t<div style={nestedStyle} role=\"alert\">\r\n\t\t\t\t\t<p style={errorStyle}>{imagineError}</p>\r\n\t\t\t\t\t<button type=\"button\" style={buttonStyle} onClick={onRetry}>\r\n\t\t\t\t\t\t{t(\"retry\")}\r\n\t\t\t\t\t</button>\r\n\t\t\t\t</div>\r\n\t\t\t)}\r\n\t\t\t{imagine === undefined && imagineError === undefined ? (\r\n\t\t\t\t<div style={skeletonStyle} role=\"status\" aria-busy=\"true\">\r\n\t\t\t\t\t<div style={statusStyle}>\r\n\t\t\t\t\t\t<span aria-hidden=\"true\" style={dotStyle(\"loading\")} />\r\n\t\t\t\t\t\t{t(\"imagineLoading\")}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t) : imagine === undefined ? null : (\r\n\t\t\t\t<div id=\"coding-oauth-imagine-credential\" style={nestedStyle} tabIndex={-1}>\r\n\t\t\t\t\t<Badge\r\n\t\t\t\t\t\tlabel={imagine.configured ? t(\"imagineConfigured\") : t(\"imagineNotConfigured\")}\r\n\t\t\t\t\t\ttone={imagine.configured ? \"success\" : \"neutral\"}\r\n\t\t\t\t\t/>\r\n\t\t\t\t\t<p style={hintStyle}>{t(\"imagineSource\", { source: imagineSourceLabel(imagine.source, t) })}</p>\r\n\t\t\t\t</div>\r\n\t\t\t)}\r\n\t\t\t{capabilitiesError === undefined ? null : (\r\n\t\t\t\t<div style={nestedStyle} role=\"alert\">\r\n\t\t\t\t\t<p style={errorStyle}>{capabilitiesError}</p>\r\n\t\t\t\t\t<button type=\"button\" style={buttonStyle} onClick={onRetry}>\r\n\t\t\t\t\t\t{t(\"retry\")}\r\n\t\t\t\t\t</button>\r\n\t\t\t\t</div>\r\n\t\t\t)}\r\n\t\t\t{capabilities === undefined && capabilitiesError === undefined ? (\r\n\t\t\t\t<div style={skeletonStyle} role=\"status\" aria-busy=\"true\">\r\n\t\t\t\t\t<div style={statusStyle}>\r\n\t\t\t\t\t\t<span aria-hidden=\"true\" style={dotStyle(\"loading\")} />\r\n\t\t\t\t\t\t{t(\"capabilitiesLoading\")}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t) : capabilities === undefined ? null : (\r\n\t\t\t\t<fieldset style={{ border: 0, margin: 0, padding: 0, minWidth: 0 }}>\r\n\t\t\t\t\t<legend style={{ ...bodyStyle, position: \"absolute\", width: 1, height: 1, overflow: \"hidden\" }}>\r\n\t\t\t\t\t\t{t(\"capabilitiesTitle\")}\r\n\t\t\t\t\t</legend>\r\n\t\t\t\t\t{capabilities.writable ? null : <p style={hintStyle}>{t(\"capabilitiesReadOnly\")}</p>}\r\n\t\t\t\t\t<ul style={listStyle}>\r\n\t\t\t\t\t\t{codexToggles.map((item) => {\r\n\t\t\t\t\t\t\tconst checked = capabilities.value[item.key];\r\n\t\t\t\t\t\t\tconst imagesOff = item.requiresImages === true && !capabilities.value.codexImages;\r\n\t\t\t\t\t\t\tconst dependencyReason = !codexSignedIn\r\n\t\t\t\t\t\t\t\t? t(\"requiresCodexSignIn\")\r\n\t\t\t\t\t\t\t\t: imagesOff\r\n\t\t\t\t\t\t\t\t\t? t(\"requiresCodexImages\")\r\n\t\t\t\t\t\t\t\t\t: undefined;\r\n\t\t\t\t\t\t\tconst disabled = capabilitiesBusy || !capabilities.writable || dependencyReason !== undefined;\r\n\t\t\t\t\t\t\tconst switchId = `cap-switch-${item.key}`;\r\n\t\t\t\t\t\t\tconst repairAction = !codexSignedIn\r\n\t\t\t\t\t\t\t\t? { label: t(\"openCodexAccount\"), action: () => onOpenAccounts(\"codex\") }\r\n\t\t\t\t\t\t\t\t: imagesOff\r\n\t\t\t\t\t\t\t\t\t? { label: t(\"focusCodexImages\"), action: () => onFocusDependency(\"codexImages\") }\r\n\t\t\t\t\t\t\t\t\t: undefined;\r\n\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t<li\r\n\t\t\t\t\t\t\t\t\tkey={item.key}\r\n\t\t\t\t\t\t\t\t\tstyle={{\r\n\t\t\t\t\t\t\t\t\t\topacity: dependencyReason === undefined ? 1 : 0.65,\r\n\t\t\t\t\t\t\t\t\t\ttransition: \"opacity 0.15s ease\",\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t<div style={{ ...rowStyle, alignItems: \"flex-start\" }}>\r\n\t\t\t\t\t\t\t\t\t\t<label htmlFor={switchId} style={{ flex: \"1 1 360px\", cursor: disabled ? \"default\" : \"pointer\" }}>\r\n\t\t\t\t\t\t\t\t\t\t\t<span style={{ display: \"block\", fontSize: 14, color: \"var(--dsw-alias-label-primary)\" }}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{t(item.label)}\r\n\t\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t\t\t<span id={`cap-hint-${item.key}`} style={{ display: \"block\", ...hintStyle }}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{dependencyReason ?? t(item.hint)}\r\n\t\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t\t\t\t\t{repairAction === undefined ? null : (\r\n\t\t\t\t\t\t\t\t\t\t\t<button type=\"button\" style={buttonStyle} onClick={repairAction.action}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{repairAction.label}\r\n\t\t\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t\t\t<ToggleSwitch\r\n\t\t\t\t\t\t\t\t\t\t\tid={switchId}\r\n\t\t\t\t\t\t\t\t\t\t\tchecked={checked}\r\n\t\t\t\t\t\t\t\t\t\t\tdisabled={disabled}\r\n\t\t\t\t\t\t\t\t\t\t\tariaLabel={t(item.label)}\r\n\t\t\t\t\t\t\t\t\t\t\tariaDescribedBy={`cap-hint-${item.key}`}\r\n\t\t\t\t\t\t\t\t\t\t\tonChange={(next) => {\r\n\t\t\t\t\t\t\t\t\t\t\t\tvoid onPatchCapability(item.key, next);\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t</li>\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t})}\r\n\t\t\t\t\t</ul>\r\n\t\t\t\t\t<h4 style={{ ...titleStyle, fontSize: 14 }}>{t(\"imagineTitle\")}</h4>\r\n\t\t\t\t\t<ul style={listStyle}>\r\n\t\t\t\t\t\t{imagineToggles.map((item) => {\r\n\t\t\t\t\t\t\tconst checked = capabilities.value[item.key];\r\n\t\t\t\t\t\t\tconst dependencyReason = imagine?.configured === true ? undefined : t(\"requiresImagineCredential\");\r\n\t\t\t\t\t\t\tconst disabled = capabilitiesBusy || !capabilities.writable || dependencyReason !== undefined;\r\n\t\t\t\t\t\t\tconst switchId = `cap-switch-${item.key}`;\r\n\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t<li key={item.key}>\r\n\t\t\t\t\t\t\t\t\t<div style={{ ...rowStyle, alignItems: \"flex-start\" }}>\r\n\t\t\t\t\t\t\t\t\t\t<label htmlFor={switchId} style={{ flex: \"1 1 360px\", cursor: disabled ? \"default\" : \"pointer\" }}>\r\n\t\t\t\t\t\t\t\t\t\t\t<span style={{ display: \"block\", fontSize: 14, color: \"var(--dsw-alias-label-primary)\" }}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{t(item.label)}\r\n\t\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t\t\t<span id={`cap-hint-${item.key}`} style={{ display: \"block\", ...hintStyle }}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{dependencyReason ?? t(item.hint)}\r\n\t\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t\t\t\t\t{dependencyReason === undefined ? null : (\r\n\t\t\t\t\t\t\t\t\t\t\t<button type=\"button\" style={buttonStyle} onClick={() => onFocusDependency(\"imagineCredential\")}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{t(\"focusImagineCredential\")}\r\n\t\t\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t\t\t<ToggleSwitch\r\n\t\t\t\t\t\t\t\t\t\t\tid={switchId}\r\n\t\t\t\t\t\t\t\t\t\t\tchecked={checked}\r\n\t\t\t\t\t\t\t\t\t\t\tdisabled={disabled}\r\n\t\t\t\t\t\t\t\t\t\t\tariaLabel={t(item.label)}\r\n\t\t\t\t\t\t\t\t\t\t\tariaDescribedBy={`cap-hint-${item.key}`}\r\n\t\t\t\t\t\t\t\t\t\t\tonChange={(next) => {\r\n\t\t\t\t\t\t\t\t\t\t\t\tvoid onPatchCapability(item.key, next);\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t</li>\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t})}\r\n\t\t\t\t\t</ul>\r\n\t\t\t\t\t<div style={nestedStyle}>\r\n\t\t\t\t\t\t<h4 style={{ ...titleStyle, fontSize: 14 }}>{t(\"capabilityLimitsTitle\")}</h4>\r\n\t\t\t\t\t\t<p style={hintStyle}>{t(\"capabilityLimitsHint\")}</p>\r\n\t\t\t\t\t\t<ul style={listStyle}>\r\n\t\t\t\t\t\t\t{CAPABILITY_LIMITS.map((item) => {\r\n\t\t\t\t\t\t\t\tconst displayValue = capabilities.value[item.key] / item.scale;\r\n\t\t\t\t\t\t\t\tconst inputId = `cap-limit-${item.key}`;\r\n\t\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t\t<li key={item.key} style={rowStyle}>\r\n\t\t\t\t\t\t\t\t\t\t<label htmlFor={inputId} style={{ ...bodyStyle, flex: \"1 1 360px\" }}>\r\n\t\t\t\t\t\t\t\t\t\t\t<span style={{ display: \"block\", color: \"var(--dsw-alias-label-primary)\" }}>{t(item.label)}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t<span id={`${inputId}-hint`} style={{ display: \"block\", ...hintStyle }}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{t(item.hint)}\r\n\t\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t\t\t\t\t<input\r\n\t\t\t\t\t\t\t\t\t\t\tkey={`${item.key}-${String(capabilities.revision)}-${String(displayValue)}`}\r\n\t\t\t\t\t\t\t\t\t\t\tid={inputId}\r\n\t\t\t\t\t\t\t\t\t\t\ttype=\"number\"\r\n\t\t\t\t\t\t\t\t\t\t\tinputMode=\"numeric\"\r\n\t\t\t\t\t\t\t\t\t\t\tmin={item.min}\r\n\t\t\t\t\t\t\t\t\t\t\tmax={item.max}\r\n\t\t\t\t\t\t\t\t\t\t\tstep={1}\r\n\t\t\t\t\t\t\t\t\t\t\tdefaultValue={displayValue}\r\n\t\t\t\t\t\t\t\t\t\t\tdisabled={capabilitiesBusy || !capabilities.writable}\r\n\t\t\t\t\t\t\t\t\t\t\taria-describedby={`${inputId}-hint`}\r\n\t\t\t\t\t\t\t\t\t\t\tstyle={{ ...inputStyle, width: 112, flex: \"0 0 112px\" }}\r\n\t\t\t\t\t\t\t\t\t\t\tonInput={(event) => {\r\n\t\t\t\t\t\t\t\t\t\t\t\tevent.currentTarget.setCustomValidity(\"\");\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\tonKeyDown={(event) => {\r\n\t\t\t\t\t\t\t\t\t\t\t\tif (event.key === \"Enter\") event.currentTarget.blur();\r\n\t\t\t\t\t\t\t\t\t\t\t\tif (event.key === \"Escape\") {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tevent.currentTarget.value = String(displayValue);\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tevent.currentTarget.setCustomValidity(\"\");\r\n\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\tonBlur={(event) => {\r\n\t\t\t\t\t\t\t\t\t\t\t\tconst target = event.currentTarget;\r\n\t\t\t\t\t\t\t\t\t\t\t\tconst next = Number(target.value);\r\n\t\t\t\t\t\t\t\t\t\t\t\tif (!Number.isInteger(next) || next < item.min || next > item.max) {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\ttarget.setCustomValidity(t(\"capabilityLimitInvalid\", { min: item.min, max: item.max }));\r\n\t\t\t\t\t\t\t\t\t\t\t\t\ttarget.reportValidity();\r\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\ttarget.setCustomValidity(\"\");\r\n\t\t\t\t\t\t\t\t\t\t\t\tconst apiValue = next * item.scale;\r\n\t\t\t\t\t\t\t\t\t\t\t\tif (apiValue === capabilities.value[item.key]) return;\r\n\t\t\t\t\t\t\t\t\t\t\t\tvoid Promise.resolve(onPatchCapability(item.key, apiValue)).then((saved) => {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (saved === false && target.isConnected) target.value = String(displayValue);\r\n\t\t\t\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t</li>\r\n\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t})}\r\n\t\t\t\t\t\t</ul>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</fieldset>\r\n\t\t\t)}\r\n\t\t</section>\r\n\t);\r\n}\r\n", "/** Local API gateway settings tab. */\r\n\r\nimport { type KeyboardEvent, useEffect, useMemo, useRef, useState } from \"react\";\r\nimport { GATEWAY_PORT_MAX, GATEWAY_PORT_MIN } from \"../constants.ts\";\r\nimport { buildGatewaySnippets, type GatewaySnippetId } from \"../gatewaySnippets.ts\";\r\nimport { formatGatewayBaseUrl, parseGatewayPort, randomGatewayPort } from \"../parsers.ts\";\r\nimport {\r\n\tbodyStyle,\r\n\tbuttonStyle,\r\n\tcardStyle,\r\n\tcopyRowStyle,\r\n\tdotStyle,\r\n\terrorStyle,\r\n\thintStyle,\r\n\tinputStyle,\r\n\tmonoStyle,\r\n\tnestedStyle,\r\n\tprimaryButtonStyle,\r\n\tsegmentedNavStyle,\r\n\tsegmentedTabActiveStyle,\r\n\tsegmentedTabStyle,\r\n\tskeletonStyle,\r\n\tsnippetStyle,\r\n\tstatusStyle,\r\n\ttitleStyle,\r\n\twarningStyle,\r\n} from \"../styles.ts\";\r\nimport type { CopyField, GatewayView, GrokBuildSettingsInjected } from \"../types.ts\";\r\nimport { Badge } from \"./Badge.tsx\";\r\nimport { CopyButton } from \"./CopyButton.tsx\";\r\nimport { ToggleSwitch } from \"./ToggleSwitch.tsx\";\r\n\r\nexport interface GatewayTabProps {\r\n\tt: GrokBuildSettingsInjected[\"t\"];\r\n\tgateway: GatewayView | undefined;\r\n\tgatewayError: string | undefined;\r\n\tgatewayBusy: boolean;\r\n\tgatewayOnceKey: string | undefined;\r\n\tgatewayKeyVisible: boolean;\r\n\tgatewayRotateConfirm: boolean;\r\n\tgatewayRevealError: string | undefined;\r\n\tportDraft: string;\r\n\tcopiedField: CopyField | undefined;\r\n\tcopyFailedField: CopyField | undefined;\r\n\tonEnabledChange: (enabled: boolean) => void;\r\n\tonRetry: () => void;\r\n\tonPortDraftChange: (value: string) => void;\r\n\tonApplyPort: () => void;\r\n\tonRandomPort: (port: number) => void;\r\n\tonCopy: (field: CopyField, text: string) => void;\r\n\tonCopyKey: () => void;\r\n\tonToggleKeyVisible: () => void;\r\n\tonRotateConfirm: () => void;\r\n\tonRotateCancel: () => void;\r\n\tonRotate: () => void;\r\n}\r\n\r\nconst SNIPPET_TABS: readonly {\r\n\tid: GatewaySnippetId;\r\n\tlabelKey: \"gatewaySnippetCurl\" | \"gatewaySnippetPython\" | \"gatewaySnippetIde\";\r\n}[] = [\r\n\t{ id: \"curl\", labelKey: \"gatewaySnippetCurl\" },\r\n\t{ id: \"python\", labelKey: \"gatewaySnippetPython\" },\r\n\t{ id: \"ide\", labelKey: \"gatewaySnippetIde\" },\r\n];\r\n\r\nexport function GatewayTab({\r\n\tt,\r\n\tgateway,\r\n\tgatewayError,\r\n\tgatewayBusy,\r\n\tgatewayOnceKey,\r\n\tgatewayKeyVisible,\r\n\tgatewayRotateConfirm,\r\n\tgatewayRevealError,\r\n\tportDraft,\r\n\tcopiedField,\r\n\tcopyFailedField,\r\n\tonEnabledChange,\r\n\tonRetry,\r\n\tonPortDraftChange,\r\n\tonApplyPort,\r\n\tonRandomPort,\r\n\tonCopyKey,\r\n\tonToggleKeyVisible,\r\n\tonRotateConfirm,\r\n\tonRotateCancel,\r\n\tonRotate,\r\n}: GatewayTabProps) {\r\n\tconst [enableConfirm, setEnableConfirm] = useState(false);\r\n\tconst [activeSnippet, setActiveSnippet] = useState<GatewaySnippetId>(\"curl\");\r\n\tconst enableConfirmAction = useRef<HTMLButtonElement>(null);\r\n\tconst rotateTrigger = useRef<HTMLButtonElement>(null);\r\n\tconst rotateConfirmAction = useRef<HTMLButtonElement>(null);\r\n\tconst restoreEnableFocus = useRef(false);\r\n\tconst restoreRotateFocus = useRef(false);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (enableConfirm) {\r\n\t\t\tenableConfirmAction.current?.focus();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!restoreEnableFocus.current) return;\r\n\t\trestoreEnableFocus.current = false;\r\n\t\tdocument.getElementById(\"coding-oauth-gateway-enabled\")?.focus();\r\n\t}, [enableConfirm]);\r\n\tuseEffect(() => {\r\n\t\tif (gatewayRotateConfirm) {\r\n\t\t\trotateConfirmAction.current?.focus();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!restoreRotateFocus.current) return;\r\n\t\trestoreRotateFocus.current = false;\r\n\t\trotateTrigger.current?.focus();\r\n\t}, [gatewayRotateConfirm]);\r\n\r\n\tconst portValid = parseGatewayPort(portDraft) !== undefined;\r\n\tconst portChanged = gateway !== undefined && portDraft !== String(gateway.port);\r\n\r\n\tconst snippets = useMemo(() => {\r\n\t\tif (gateway === undefined || !gatewayKeyVisible || gatewayOnceKey === undefined || gateway.models.length === 0) {\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\t\tconst openAi = `${formatGatewayBaseUrl(gateway.bind, gateway.port)}/v1`;\r\n\t\tconst anthropic = formatGatewayBaseUrl(gateway.bind, gateway.port);\r\n\t\t// A masked keyHint is display-only and can never produce an executable command.\r\n\t\treturn buildGatewaySnippets(openAi, anthropic, gatewayOnceKey, gateway.models[0]);\r\n\t}, [gateway, gatewayKeyVisible, gatewayOnceKey]);\r\n\r\n\tconst copyLabel = (field: CopyField, idle?: string): string => {\r\n\t\tif (copyFailedField === field) return t(\"copyFailed\");\r\n\t\tif (copiedField === field) return t(\"copied\");\r\n\t\treturn idle ?? t(\"copy\");\r\n\t};\r\n\r\n\tconst focusSnippetTab = (index: number): void => {\r\n\t\tconst tab = SNIPPET_TABS[index];\r\n\t\tif (tab === undefined) return;\r\n\t\tsetActiveSnippet(tab.id);\r\n\t\tdocument.getElementById(`coding-oauth-snippet-tab-${tab.id}`)?.focus();\r\n\t};\r\n\r\n\tconst onSnippetKeyDown = (event: KeyboardEvent<HTMLDivElement>): void => {\r\n\t\tconst current = SNIPPET_TABS.findIndex((tab) => tab.id === activeSnippet);\r\n\t\tif (current < 0) return;\r\n\t\tif (event.key === \"ArrowRight\" || event.key === \"ArrowDown\") {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tfocusSnippetTab((current + 1) % SNIPPET_TABS.length);\r\n\t\t} else if (event.key === \"ArrowLeft\" || event.key === \"ArrowUp\") {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tfocusSnippetTab((current - 1 + SNIPPET_TABS.length) % SNIPPET_TABS.length);\r\n\t\t} else if (event.key === \"Home\") {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tfocusSnippetTab(0);\r\n\t\t} else if (event.key === \"End\") {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tfocusSnippetTab(SNIPPET_TABS.length - 1);\r\n\t\t}\r\n\t};\r\n\r\n\tconst openAiUrl = gateway === undefined ? \"\" : `${formatGatewayBaseUrl(gateway.bind, gateway.port)}/v1`;\r\n\tconst anthropicUrl = gateway === undefined ? \"\" : formatGatewayBaseUrl(gateway.bind, gateway.port);\r\n\r\n\treturn (\r\n\t\t<section style={cardStyle} aria-labelledby=\"coding-oauth-gateway-title\">\r\n\t\t\t<div>\r\n\t\t\t\t<h3 id=\"coding-oauth-gateway-title\" style={{ ...titleStyle, fontSize: 16 }}>\r\n\t\t\t\t\t{t(\"gatewayTitle\")}\r\n\t\t\t\t</h3>\r\n\t\t\t\t<p style={{ ...bodyStyle, marginTop: 4 }}>{t(\"gatewayIntro\")}</p>\r\n\t\t\t\t<p style={{ ...warningStyle, marginTop: 8 }}>{t(\"gatewayWarning\")}</p>\r\n\t\t\t\t<p style={{ ...hintStyle, marginTop: 8 }}>{t(\"gatewayLoopbackHint\")}</p>\r\n\t\t\t</div>\r\n\t\t\t{gatewayError === undefined ? null : (\r\n\t\t\t\t<p style={errorStyle} role=\"alert\">\r\n\t\t\t\t\t{gatewayError}\r\n\t\t\t\t</p>\r\n\t\t\t)}\r\n\t\t\t{gatewayRevealError === undefined ? null : (\r\n\t\t\t\t<p style={errorStyle} role=\"alert\">\r\n\t\t\t\t\t{gatewayRevealError}\r\n\t\t\t\t</p>\r\n\t\t\t)}\r\n\t\t\t{gateway === undefined && gatewayError === undefined ? (\r\n\t\t\t\t<div style={skeletonStyle} role=\"status\" aria-busy=\"true\">\r\n\t\t\t\t\t<div style={statusStyle}>\r\n\t\t\t\t\t\t<span aria-hidden=\"true\" style={dotStyle(\"loading\")} />\r\n\t\t\t\t\t\t{t(\"gatewayLoading\")}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t) : gateway === undefined ? (\r\n\t\t\t\t<div style={nestedStyle} role=\"status\">\r\n\t\t\t\t\t<p style={hintStyle}>{t(\"gatewayLoadFailed\")}</p>\r\n\t\t\t\t\t<button type=\"button\" style={buttonStyle} onClick={onRetry}>\r\n\t\t\t\t\t\t{t(\"retry\")}\r\n\t\t\t\t\t</button>\r\n\t\t\t\t</div>\r\n\t\t\t) : (\r\n\t\t\t\t<div style={nestedStyle}>\r\n\t\t\t\t\t<Badge\r\n\t\t\t\t\t\tlabel={gateway.running ? t(\"gatewayRunning\") : t(\"gatewayStopped\")}\r\n\t\t\t\t\t\ttone={gateway.running ? \"success\" : \"neutral\"}\r\n\t\t\t\t\t/>\r\n\t\t\t\t\t<p style={hintStyle}>\r\n\t\t\t\t\t\t{gateway.models.length > 0\r\n\t\t\t\t\t\t\t? t(\"gatewayModelsReady\", { count: gateway.models.length, model: gateway.models[0] })\r\n\t\t\t\t\t\t\t: t(\"gatewayModelsUnavailable\")}\r\n\t\t\t\t\t</p>\r\n\t\t\t\t\t<p style={hintStyle}>{gateway.keyConfigured ? t(\"gatewayKeyConfigured\") : t(\"gatewayKeyNotConfigured\")}</p>\r\n\t\t\t\t\t{enableConfirm ? (\r\n\t\t\t\t\t\t<div style={nestedStyle}>\r\n\t\t\t\t\t\t\t<p style={bodyStyle}>{t(\"gatewayEnableConfirm\")}</p>\r\n\t\t\t\t\t\t\t<div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8 }}>\r\n\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\tref={enableConfirmAction}\r\n\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\tstyle={primaryButtonStyle}\r\n\t\t\t\t\t\t\t\t\tdisabled={gatewayBusy}\r\n\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\trestoreEnableFocus.current = true;\r\n\t\t\t\t\t\t\t\t\t\tsetEnableConfirm(false);\r\n\t\t\t\t\t\t\t\t\t\tonEnabledChange(true);\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t{t(\"gatewayEnableConfirmAction\")}\r\n\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\tstyle={buttonStyle}\r\n\t\t\t\t\t\t\t\t\tdisabled={gatewayBusy}\r\n\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\trestoreEnableFocus.current = true;\r\n\t\t\t\t\t\t\t\t\t\tsetEnableConfirm(false);\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t{t(\"gatewayEnableCancel\")}\r\n\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t) : (\r\n\t\t\t\t\t\t<label\r\n\t\t\t\t\t\t\thtmlFor=\"coding-oauth-gateway-enabled\"\r\n\t\t\t\t\t\t\tstyle={{\r\n\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\tjustifyContent: \"space-between\",\r\n\t\t\t\t\t\t\t\tgap: 12,\r\n\t\t\t\t\t\t\t\tfontSize: 14,\r\n\t\t\t\t\t\t\t\tcolor: \"var(--dsw-alias-label-primary)\",\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t<span>{t(\"gatewayEnabled\")}</span>\r\n\t\t\t\t\t\t\t<ToggleSwitch\r\n\t\t\t\t\t\t\t\tid=\"coding-oauth-gateway-enabled\"\r\n\t\t\t\t\t\t\t\tchecked={gateway.enabled}\r\n\t\t\t\t\t\t\t\tdisabled={gatewayBusy}\r\n\t\t\t\t\t\t\t\tonChange={(enabled) => {\r\n\t\t\t\t\t\t\t\t\tif (enabled) {\r\n\t\t\t\t\t\t\t\t\t\tsetEnableConfirm(true);\r\n\t\t\t\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\tonEnabledChange(false);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t</label>\r\n\t\t\t\t\t)}\r\n\t\t\t\t\t<div>\r\n\t\t\t\t\t\t<label\r\n\t\t\t\t\t\t\thtmlFor=\"coding-oauth-gateway-port\"\r\n\t\t\t\t\t\t\tstyle={{ ...bodyStyle, color: \"var(--dsw-alias-label-primary)\" }}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{t(\"gatewayPort\")}\r\n\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t<p id=\"coding-oauth-gateway-port-hint\" style={hintStyle}>\r\n\t\t\t\t\t\t\t{t(\"gatewayPortHint\")}\r\n\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t{!portValid && portDraft.length > 0 ? (\r\n\t\t\t\t\t\t\t<p style={{ ...hintStyle, color: \"var(--dsw-alias-state-error-primary)\" }} role=\"alert\">\r\n\t\t\t\t\t\t\t\t{t(\"gatewayPortInvalid\")}\r\n\t\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t) : null}\r\n\t\t\t\t\t\t<div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8, marginTop: 8 }}>\r\n\t\t\t\t\t\t\t<input\r\n\t\t\t\t\t\t\t\tid=\"coding-oauth-gateway-port\"\r\n\t\t\t\t\t\t\t\ttype=\"number\"\r\n\t\t\t\t\t\t\t\tinputMode=\"numeric\"\r\n\t\t\t\t\t\t\t\tmin={GATEWAY_PORT_MIN}\r\n\t\t\t\t\t\t\t\tmax={GATEWAY_PORT_MAX}\r\n\t\t\t\t\t\t\t\tstep={1}\r\n\t\t\t\t\t\t\t\tvalue={portDraft}\r\n\t\t\t\t\t\t\t\tdisabled={gatewayBusy}\r\n\t\t\t\t\t\t\t\taria-describedby=\"coding-oauth-gateway-port-hint\"\r\n\t\t\t\t\t\t\t\taria-invalid={!portValid && portDraft.length > 0}\r\n\t\t\t\t\t\t\t\tstyle={{\r\n\t\t\t\t\t\t\t\t\t...inputStyle,\r\n\t\t\t\t\t\t\t\t\twidth: 112,\r\n\t\t\t\t\t\t\t\t\tflex: \"0 0 112px\",\r\n\t\t\t\t\t\t\t\t\tborderColor:\r\n\t\t\t\t\t\t\t\t\t\t!portValid && portDraft.length > 0\r\n\t\t\t\t\t\t\t\t\t\t\t? \"var(--dsw-alias-state-error-primary)\"\r\n\t\t\t\t\t\t\t\t\t\t\t: \"var(--dsw-alias-border-l2)\",\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\tonChange={(event) => {\r\n\t\t\t\t\t\t\t\t\tonPortDraftChange(event.target.value);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\tonKeyDown={(event) => {\r\n\t\t\t\t\t\t\t\t\tif (event.key === \"Enter\") {\r\n\t\t\t\t\t\t\t\t\t\tevent.preventDefault();\r\n\t\t\t\t\t\t\t\t\t\tonApplyPort();\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\tif (event.key === \"Escape\") {\r\n\t\t\t\t\t\t\t\t\t\tonPortDraftChange(String(gateway.port));\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tstyle={primaryButtonStyle}\r\n\t\t\t\t\t\t\t\tdisabled={gatewayBusy || !portChanged || !portValid}\r\n\t\t\t\t\t\t\t\tonClick={onApplyPort}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{t(\"gatewayPortApply\")}\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tstyle={buttonStyle}\r\n\t\t\t\t\t\t\t\tdisabled={gatewayBusy}\r\n\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\tonRandomPort(randomGatewayPort(gateway.port));\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{t(\"gatewayPortRandom\")}\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<p style={copyRowStyle}>\r\n\t\t\t\t\t\t<span style={hintStyle}>\r\n\t\t\t\t\t\t\t{t(\"gatewayOpenAiUrl\")}\r\n\t\t\t\t\t\t\t<span style={{ display: \"block\", ...monoStyle }}>{openAiUrl}</span>\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t<CopyButton\r\n\t\t\t\t\t\t\ttext={openAiUrl}\r\n\t\t\t\t\t\t\tidleLabel={t(\"copy\")}\r\n\t\t\t\t\t\t\tcopiedLabel={t(\"copied\")}\r\n\t\t\t\t\t\t\tfailedLabel={t(\"copyFailed\")}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</p>\r\n\t\t\t\t\t<p style={copyRowStyle}>\r\n\t\t\t\t\t\t<span style={hintStyle}>\r\n\t\t\t\t\t\t\t{t(\"gatewayAnthropicUrl\")}\r\n\t\t\t\t\t\t\t<span style={{ display: \"block\", ...monoStyle }}>{anthropicUrl}</span>\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t<CopyButton\r\n\t\t\t\t\t\t\ttext={anthropicUrl}\r\n\t\t\t\t\t\t\tidleLabel={t(\"copy\")}\r\n\t\t\t\t\t\t\tcopiedLabel={t(\"copied\")}\r\n\t\t\t\t\t\t\tfailedLabel={t(\"copyFailed\")}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</p>\r\n\t\t\t\t\t<p style={copyRowStyle}>\r\n\t\t\t\t\t\t<span style={hintStyle}>\r\n\t\t\t\t\t\t\t{t(\"gatewayKeyHint\")}\r\n\t\t\t\t\t\t\t<span style={{ display: \"block\", ...monoStyle, overflowWrap: \"anywhere\" }}>\r\n\t\t\t\t\t\t\t\t{gatewayKeyVisible && gatewayOnceKey !== undefined ? gatewayOnceKey : gateway.keyHint || \"\u2014\"}\r\n\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t<span style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8 }}>\r\n\t\t\t\t\t\t\t<button type=\"button\" style={primaryButtonStyle} disabled={gatewayBusy} onClick={onCopyKey}>\r\n\t\t\t\t\t\t\t\t{copyLabel(\"key\", t(\"gatewayCopyKey\"))}\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t<button type=\"button\" style={buttonStyle} disabled={gatewayBusy} onClick={onToggleKeyVisible}>\r\n\t\t\t\t\t\t\t\t{gatewayKeyVisible ? t(\"gatewayHideKey\") : t(\"gatewayShowKey\")}\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t</p>\r\n\t\t\t\t\t<p style={hintStyle}>{t(\"gatewayKeyCopyHint\")}</p>\r\n\t\t\t\t\t{gateway.enabled && snippets !== undefined ? (\r\n\t\t\t\t\t\t<div style={{ display: \"flex\", flexDirection: \"column\", gap: 10 }}>\r\n\t\t\t\t\t\t\t<h4 style={{ ...titleStyle, fontSize: 14 }}>{t(\"gatewaySnippetsTitle\")}</h4>\r\n\t\t\t\t\t\t\t<div\r\n\t\t\t\t\t\t\t\trole=\"tablist\"\r\n\t\t\t\t\t\t\t\taria-label={t(\"gatewaySnippetsTitle\")}\r\n\t\t\t\t\t\t\t\tstyle={segmentedNavStyle}\r\n\t\t\t\t\t\t\t\tonKeyDown={onSnippetKeyDown}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{SNIPPET_TABS.map((tab) => {\r\n\t\t\t\t\t\t\t\t\tconst selected = activeSnippet === tab.id;\r\n\t\t\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\t\tkey={tab.id}\r\n\t\t\t\t\t\t\t\t\t\t\tid={`coding-oauth-snippet-tab-${tab.id}`}\r\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\t\t\trole=\"tab\"\r\n\t\t\t\t\t\t\t\t\t\t\taria-selected={selected}\r\n\t\t\t\t\t\t\t\t\t\t\taria-controls=\"coding-oauth-snippet-panel\"\r\n\t\t\t\t\t\t\t\t\t\t\ttabIndex={selected ? 0 : -1}\r\n\t\t\t\t\t\t\t\t\t\t\tstyle={selected ? segmentedTabActiveStyle : segmentedTabStyle}\r\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\t\t\tsetActiveSnippet(tab.id);\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t{t(tab.labelKey)}\r\n\t\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t\t})}\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div\r\n\t\t\t\t\t\t\t\tid=\"coding-oauth-snippet-panel\"\r\n\t\t\t\t\t\t\t\trole=\"tabpanel\"\r\n\t\t\t\t\t\t\t\taria-labelledby={`coding-oauth-snippet-tab-${activeSnippet}`}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t<code style={snippetStyle}>{snippets[activeSnippet]}</code>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<CopyButton\r\n\t\t\t\t\t\t\t\ttext={snippets[activeSnippet]}\r\n\t\t\t\t\t\t\t\tidleLabel={t(\"copy\")}\r\n\t\t\t\t\t\t\t\tcopiedLabel={t(\"copied\")}\r\n\t\t\t\t\t\t\t\tfailedLabel={t(\"copyFailed\")}\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t) : gateway.enabled ? (\r\n\t\t\t\t\t\t<p style={hintStyle}>{t(\"gatewaySnippetsUnavailable\")}</p>\r\n\t\t\t\t\t) : null}\r\n\t\t\t\t\t{gatewayRotateConfirm ? (\r\n\t\t\t\t\t\t<div style={nestedStyle}>\r\n\t\t\t\t\t\t\t<p style={bodyStyle}>{t(\"gatewayRotateConfirm\")}</p>\r\n\t\t\t\t\t\t\t<p style={hintStyle}>{t(\"gatewayRotateConfirmHint\")}</p>\r\n\t\t\t\t\t\t\t<div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8 }}>\r\n\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\tref={rotateConfirmAction}\r\n\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\tstyle={primaryButtonStyle}\r\n\t\t\t\t\t\t\t\t\tdisabled={gatewayBusy}\r\n\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\trestoreRotateFocus.current = true;\r\n\t\t\t\t\t\t\t\t\t\tonRotate();\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t{t(\"gatewayRotateConfirmAction\")}\r\n\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\tstyle={buttonStyle}\r\n\t\t\t\t\t\t\t\t\tdisabled={gatewayBusy}\r\n\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\trestoreRotateFocus.current = true;\r\n\t\t\t\t\t\t\t\t\t\tonRotateCancel();\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t{t(\"gatewayRotateCancel\")}\r\n\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t) : (\r\n\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\tref={rotateTrigger}\r\n\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\tstyle={buttonStyle}\r\n\t\t\t\t\t\t\tdisabled={gatewayBusy}\r\n\t\t\t\t\t\t\tonClick={onRotateConfirm}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{t(\"gatewayRotate\")}\r\n\t\t\t\t\t\t</button>\r\n\t\t\t\t\t)}\r\n\t\t\t\t</div>\r\n\t\t\t)}\r\n\t\t</section>\r\n\t);\r\n}\r\n", "/** Quick-setup code snippets for the local API gateway. */\r\n\r\nexport type GatewaySnippetId = \"curl\" | \"python\" | \"ide\";\r\n\r\nexport function buildGatewaySnippets(\r\n\topenAiBaseUrl: string,\r\n\tanthropicBaseUrl: string,\r\n\tapiKeyPlaceholder: string,\r\n\tmodel = \"<gateway-model>\",\r\n): Record<GatewaySnippetId, string> {\r\n\tconst key = apiKeyPlaceholder.length > 0 ? apiKeyPlaceholder : \"<your-gateway-key>\";\r\n\treturn {\r\n\t\tcurl: `curl ${openAiBaseUrl}/chat/completions \\\\\r\n -H \"Authorization: Bearer ${key}\" \\\\\r\n -H \"Content-Type: application/json\" \\\\\r\n -d '{\"model\":\"${model}\",\"messages\":[{\"role\":\"user\",\"content\":\"Hello\"}]}'`,\r\n\t\tpython: `from openai import OpenAI\r\n\r\nclient = OpenAI(\r\n base_url=\"${openAiBaseUrl}\",\r\n api_key=\"${key}\",\r\n)\r\n\r\nresponse = client.chat.completions.create(\r\n model=\"${model}\",\r\n messages=[{\"role\": \"user\", \"content\": \"Hello\"}],\r\n)\r\nprint(response.choices[0].message.content)`,\r\n\t\tide: `# OpenAI-compatible client\r\nbase_url: ${openAiBaseUrl}\r\napi_key: ${key}\r\n\r\n# Anthropic-compatible client\r\nbase_url: ${anthropicBaseUrl}\r\napi_key: ${key}`,\r\n\t};\r\n}\r\n", "/** Accessible segmented tablist for Coding OAuth settings. */\r\n\r\nimport type { KeyboardEvent } from \"react\";\r\nimport { SETTINGS_TABS } from \"../constants.ts\";\r\nimport { segmentedNavStyle, segmentedTabActiveStyle, segmentedTabStyle } from \"../styles.ts\";\r\nimport type { GrokBuildSettingsInjected, SettingsTabId } from \"../types.ts\";\r\n\r\nexport interface SettingsTabHint {\r\n\tid: SettingsTabId;\r\n\tsuffix?: string;\r\n}\r\n\r\nexport interface SettingsTabsProps {\r\n\tt: GrokBuildSettingsInjected[\"t\"];\r\n\tactiveTab: SettingsTabId;\r\n\tonChange: (tab: SettingsTabId) => void;\r\n\thints?: readonly SettingsTabHint[];\r\n}\r\n\r\nexport function SettingsTabs({ t, activeTab, onChange, hints }: SettingsTabsProps) {\r\n\tconst hintFor = (id: SettingsTabId): string | undefined => hints?.find((entry) => entry.id === id)?.suffix;\r\n\r\n\tconst focusTab = (index: number): void => {\r\n\t\tconst tab = SETTINGS_TABS[index];\r\n\t\tif (tab === undefined) return;\r\n\t\tonChange(tab.id);\r\n\t\tconst button = document.getElementById(`coding-oauth-tab-${tab.id}`);\r\n\t\tbutton?.focus();\r\n\t};\r\n\r\n\tconst onKeyDown = (event: KeyboardEvent<HTMLDivElement>): void => {\r\n\t\tconst current = SETTINGS_TABS.findIndex((tab) => tab.id === activeTab);\r\n\t\tif (current < 0) return;\r\n\t\tif (event.key === \"ArrowRight\" || event.key === \"ArrowDown\") {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tfocusTab((current + 1) % SETTINGS_TABS.length);\r\n\t\t} else if (event.key === \"ArrowLeft\" || event.key === \"ArrowUp\") {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tfocusTab((current - 1 + SETTINGS_TABS.length) % SETTINGS_TABS.length);\r\n\t\t} else if (event.key === \"Home\") {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tfocusTab(0);\r\n\t\t} else if (event.key === \"End\") {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tfocusTab(SETTINGS_TABS.length - 1);\r\n\t\t}\r\n\t};\r\n\r\n\treturn (\r\n\t\t<div role=\"tablist\" aria-label={t(\"title\")} style={segmentedNavStyle} onKeyDown={onKeyDown}>\r\n\t\t\t{SETTINGS_TABS.map((tab) => {\r\n\t\t\t\tconst selected = activeTab === tab.id;\r\n\t\t\t\tconst suffix = hintFor(tab.id);\r\n\t\t\t\tconst label = suffix === undefined ? t(tab.label) : `${t(tab.label)} (${suffix})`;\r\n\t\t\t\treturn (\r\n\t\t\t\t\t<button\r\n\t\t\t\t\t\tkey={tab.id}\r\n\t\t\t\t\t\tid={`coding-oauth-tab-${tab.id}`}\r\n\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\trole=\"tab\"\r\n\t\t\t\t\t\taria-selected={selected}\r\n\t\t\t\t\t\taria-controls={selected ? `coding-oauth-panel-${tab.id}` : undefined}\r\n\t\t\t\t\t\ttabIndex={selected ? 0 : -1}\r\n\t\t\t\t\t\tstyle={selected ? segmentedTabActiveStyle : segmentedTabStyle}\r\n\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\tonChange(tab.id);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{label}\r\n\t\t\t\t\t</button>\r\n\t\t\t\t);\r\n\t\t\t})}\r\n\t\t</div>\r\n\t);\r\n}\r\n", "/** Injects global keyframes once for skeleton pulse and spinner animations. */\r\n\r\nconst STYLE_ID = \"dsh-coding-oauth-micro-styles\";\r\n\r\nconst CSS = `\r\n@keyframes dsh-coding-oauth-skeleton-pulse {\r\n 0% { background-position: 200% 0; }\r\n 100% { background-position: -200% 0; }\r\n}\r\n@keyframes dsh-coding-oauth-spin {\r\n from { transform: rotate(0deg); }\r\n to { transform: rotate(360deg); }\r\n}\r\n@keyframes dsh-coding-oauth-fade-in {\r\n from { opacity: 0; transform: translateY(-4px); }\r\n to { opacity: 1; transform: translateY(0); }\r\n}\r\n@media (prefers-reduced-motion: reduce) {\r\n [data-dsh-coding-oauth] *, [data-dsh-coding-oauth] *::before, [data-dsh-coding-oauth] *::after {\r\n animation-duration: 0.01ms !important;\r\n animation-iteration-count: 1 !important;\r\n transition-duration: 0.01ms !important;\r\n scroll-behavior: auto !important;\r\n }\r\n}\r\n@media (max-width: 560px) {\r\n [data-dsh-coding-oauth] button,\r\n [data-dsh-coding-oauth] input,\r\n [data-dsh-coding-oauth] [role=\"switch\"] {\r\n min-height: 44px;\r\n }\r\n [data-dsh-coding-oauth] [data-responsive-row] {\r\n align-items: stretch !important;\r\n flex-direction: column;\r\n }\r\n}\r\n`;\r\n\r\nlet injected = false;\r\n\r\nexport function ensureMicroStyles(): void {\r\n\tif (injected || typeof document === \"undefined\") return;\r\n\tif (document.getElementById(STYLE_ID) !== null) {\r\n\t\tinjected = true;\r\n\t\treturn;\r\n\t}\r\n\tconst style = document.createElement(\"style\");\r\n\tstyle.id = STYLE_ID;\r\n\tstyle.textContent = CSS;\r\n\tdocument.head.appendChild(style);\r\n\tinjected = true;\r\n}\r\n", "/** English copy for the Coding OAuth settings section. */\r\nexport const en = {\r\n\tnav: \"Coding OAuth\",\r\n\ttitle: \"Coding subscriptions\",\r\n\tintro:\r\n\t\t\"Use your own Grok Build, ChatGPT Codex, Kimi Code, and Claude Code subscriptions in dsh. API-key routes remain separate.\",\r\n\ttermsWarning:\r\n\t\t\"These are unofficial third-party integrations with subscription services. Provider terms, quotas, regions, and account-risk policies still apply.\",\r\n\tloadingAccount: \"Loading accounts\u2026\",\r\n\tsignedOut: \"Not signed in\",\r\n\tsigningIn: \"Waiting for authorization\u2026\",\r\n\tsignedIn: \"Signed in\",\r\n\trequestFailed: \"The account request failed.\",\r\n\tretry: \"Try again\",\r\n\tcancel: \"Cancel\",\r\n\tlogout: \"Sign out\",\r\n\tlogoutConfirmTitle: \"Confirm sign-out\",\r\n\tlogoutConfirmHint: \"Sign out of this provider in dsh? Your provider account itself is not changed.\",\r\n\tlogoutConfirmAction: \"Confirm sign-out\",\r\n\tworking: \"Working\u2026\",\r\n\tcancelLogin: \"Cancel sign-in\",\r\n\tdeviceLogin: \"Sign in with device code\",\r\n\tdeviceLoginRemote: \"Sign in with device code (best for remote)\",\r\n\tbrowserLogin: \"Sign in in browser\",\r\n\tpkceLogin: \"Sign in with authorization code\",\r\n\tuserCode: \"Enter this code when the provider asks:\",\r\n\topenUrl: \"Complete sign-in at:\",\r\n\tpopupBlocked: \"The browser blocked the sign-in window. Open this URL manually:\",\r\n\tpasteCodeHint:\r\n\t\t\"Paste the authorization code or complete redirect URL returned by the provider. For local PKCE, use this only if the callback could not reach this DSH host:\",\r\n\tpasteBrowserCodeHint:\r\n\t\t\"Paste the authorization code or complete redirect URL returned by the provider to finish this browser sign-in:\",\r\n\tpasteCodePlaceholder: \"authorization code or complete redirect URL\",\r\n\tpasteCodeLabel: \"Authorization code or complete redirect URL\",\r\n\tsubmitCode: \"Submit code\",\r\n\timportGrok: \"Import from Grok CLI\",\r\n\timportHint: \"Copies ~/.grok/auth.json into dsh. A later dsh refresh may rotate the token and sign the Grok CLI out.\",\r\n\tmodels: \"Visible models\",\r\n\tcatalogLive: \"From your current xAI account\",\r\n\tcatalogCache: \"From the last successful xAI listing\",\r\n\tcatalogFallback: \"Built-in Grok baseline (live listing unavailable)\",\r\n\tcatalogError: \"Could not refresh the live Grok model list.\",\r\n\tselectAll: \"Show all\",\r\n\tmodelHint: \"Checked models appear in the model picker as\",\r\n\tgrokTitle: \"xAI Grok Build\",\r\n\tgrokDescription: \"SuperGrok / X Premium coding subscription through the Grok Build endpoint.\",\r\n\tcodexTitle: \"OpenAI Codex\",\r\n\tcodexDescription: \"ChatGPT Plus/Pro Codex entitlement. Device code is recommended for a remote DSH host.\",\r\n\tkimiTitle: \"Kimi Code\",\r\n\tkimiDescription:\r\n\t\t\"Kimi Code membership through auth.kimi.com and api.kimi.com/coding; this is not the Moonshot API-key platform.\",\r\n\tclaudeTitle: \"Claude Code\",\r\n\tclaudeDescription: \"Claude Pro/Max OAuth with Claude Code scopes and automatic refresh.\",\r\n\tantigravityTitle: \"Google Antigravity\",\r\n\tantigravityDescription: \"Provided by the separately pinned MIT dsh-agy plugin and exposed as the agy route.\",\r\n\tantigravityInstalled: \"Installed (CLI-managed)\",\r\n\tantigravityMissing: \"Not installed\",\r\n\tantigravityCliHint:\r\n\t\t\"The unauthenticated dsh-agy web export dashboard is disabled. Manage Google OAuth with the profile-local CLI when needed.\",\r\n\tantigravityCliCommand: \"dsh plugin --profile web exec dsh-agy login --headless\",\r\n\tsourcesTitle: \"Pull a copy from official CLI files\",\r\n\tsourcesIntro:\r\n\t\t\"dsh can discover a local official CLI login and pull a one-way copy into its own store. Official CLI files stay read-only and are never modified.\",\r\n\tsourcesReadOnlyHint:\r\n\t\t\"This is a one-way pull of a copy. dsh does not update, replace, or write back the official CLI documents.\",\r\n\tsourcesLoading: \"Looking for official CLI login files\u2026\",\r\n\tsourcesCheckAgain: \"Check again\",\r\n\tsourcesAvailable: \"A readable copy is available\",\r\n\tsourcesUnavailable: \"No usable copy found\",\r\n\tsourcesAllMissingHint:\r\n\t\t\"No official CLI login files were found on this host. That is normal on a remote DSH machine \u2014 use device-code sign-in instead, or check again after logging in on this same host.\",\r\n\tsourcesAvailableHint:\r\n\t\t\"An official CLI login was found on this host. You can pull a one-way copy into dsh from a provider card.\",\r\n\tsourcesPullCopy: \"Pull a copy\",\r\n\tremoteAccountsTip:\r\n\t\t\"This Settings page looks remote (not loopback). Prefer device-code sign-in; browser pop-ups and local PKCE callbacks often fail from another machine.\",\r\n\tremoteTipDismiss: \"Dismiss\",\r\n\tsourcesPreviewTitle: \"Review this copy before saving it in dsh\",\r\n\tsourcesPreviewExpires: \"CLI credential expiry: {time}\",\r\n\tsourcesTicketExpires: \"This preview expires at {time}\",\r\n\tsourcesConflict: \"Stored dsh credential: {detail}\",\r\n\tsourcesAction: \"If you continue: {detail}\",\r\n\tsourcesWarnings: \"Notes\",\r\n\tsourcesConfirmOverwrite: \"Replace the credential already stored in dsh with this copy\",\r\n\tsourcesConfirmOverwriteHint: \"A different credential is already stored. Check the box, then confirm the pull.\",\r\n\tsourcesCommit: \"Confirm pull\",\r\n\tsourcesCancelPreview: \"Cancel preview\",\r\n\tsourcesCommitSuccess: \"Copied into dsh ({action}).\",\r\n\tsourcesPreviewFailed: \"Could not prepare a copy from that CLI file.\",\r\n\tsourcesCommitFailed: \"Could not save the copy in dsh.\",\r\n\tsourcesLoadFailed: \"Could not look for official CLI login files.\",\r\n\tsourceKindGrok: \"Grok CLI\",\r\n\tsourceKindCodex: \"Codex CLI\",\r\n\tsourceKindKimi: \"Kimi Code CLI\",\r\n\tsourceKindClaude: \"Claude Code CLI\",\r\n\tsourceReasonMissing: \"No official CLI file was found at the expected location.\",\r\n\tsourceReasonUnsafe: \"The official CLI file is not safe to read (permissions or file type).\",\r\n\tsourceReasonInvalid: \"The official CLI file is present but is not a usable OAuth login.\",\r\n\tsourceReasonTooLarge: \"The official CLI file is larger than the allowed read limit.\",\r\n\tsourceConflictNone: \"dsh has no stored credential yet\",\r\n\tsourceConflictSameCredential: \"same credential already stored\",\r\n\tsourceConflictSameAccount: \"same account, different credential\",\r\n\tsourceConflictDifferentAccount: \"a different account is already stored\",\r\n\tsourceConflictUnknownAccount: \"an existing credential is stored (account could not be compared)\",\r\n\tsourceConflictUnreadableDestination: \"the stored dsh credential could not be read\",\r\n\tsourceConflictUnsafeDestination: \"the stored dsh credential file is not safe to replace\",\r\n\tsourceConflictUnrecognized: \"the stored credential needs a review\",\r\n\tsourceActionImport: \"save this copy in dsh\",\r\n\tsourceActionReuse: \"keep the stored dsh credential (it already matches)\",\r\n\tsourceActionOverwrite: \"replace the stored dsh credential\",\r\n\tsourceActionBlocked: \"blocked \u2014 the stored dsh file cannot be replaced from here\",\r\n\tsourceActionUnrecognized: \"needs a review\",\r\n\tsourceCommitImported: \"saved\",\r\n\tsourceCommitUnchanged: \"already matched\",\r\n\tsourceCommitOverwritten: \"replaced\",\r\n\tcapabilitiesTitle: \"Subscription capabilities\",\r\n\tcapabilitiesIntro:\r\n\t\t\"Every switch starts off. Turning one on uses that vendor\u2019s subscription quota, not a separate API-key bill.\",\r\n\tcapabilitiesQuotaHint:\r\n\t\t\"Search, images, edits, Fast, usage, and Grok Imagine all consume the matching subscription quota when they run.\",\r\n\tcapabilitiesReadOnly: \"These switches are read-only in this deployment.\",\r\n\tcapabilitiesLoading: \"Loading capability settings\u2026\",\r\n\tcapabilitiesLoadFailed: \"Could not load capability settings.\",\r\n\tcapabilitiesSaveFailed: \"Could not save that capability setting.\",\r\n\tcapabilitiesConflictRefreshed: \"Those settings changed elsewhere. The page was refreshed; try again.\",\r\n\tcapabilityLimitsTitle: \"Capability limits\",\r\n\tcapabilityLimitsHint: \"Limits apply live to newly started operations and remain within the audited safety bounds.\",\r\n\tcapSearchResults: \"Maximum search results\",\r\n\tcapSearchResultsHint: \"Codex search returns at most this many results (1\u201320).\",\r\n\tcapImageCount: \"Maximum images per call\",\r\n\tcapImageCountHint: \"Codex and Imagine image tools can return at most this many images (1\u20134).\",\r\n\tcapVideoTtlHours: \"Video artifact retention (hours)\",\r\n\tcapVideoTtlHoursHint:\r\n\t\t\"Completed Imagine video artifacts are kept for 1\u2013168 hours. Lowering retention cleans older artifacts immediately; raising it applies to new artifacts.\",\r\n\tcapabilityLimitInvalid: \"Enter a whole number from {min} through {max}.\",\r\n\tcapCodexSearch: \"Codex subscription search\",\r\n\tcapCodexSearchHint: \"Optional search using Codex quota.\",\r\n\tcapCodexImages: \"Codex images\",\r\n\tcapCodexImagesHint: \"Generate images with ChatGPT/Codex quota.\",\r\n\tcapCodexImageEdits: \"Codex image edits\",\r\n\tcapCodexImageEditsHint: \"Edit images; requires Codex images.\",\r\n\tcapCodexImagesAnyModel: \"Allow any model to use image tools\",\r\n\tcapCodexImagesAnyModelHint:\r\n\t\t\"Let non-Codex routes also call image generate/edit. Still uses your ChatGPT/Codex quota and requires Codex sign-in.\",\r\n\tcapCodexUsage: \"Show Codex quota\",\r\n\tcapCodexUsageHint: \"Show remaining quota on the Codex account card when available.\",\r\n\tcapCodexFast: \"Fast requested\",\r\n\tcapCodexFastHint: \"Publish the Fast route when the live catalog confirms priority eligibility.\",\r\n\tcapGrokImagineImage: \"Grok Imagine images\",\r\n\tcapGrokImagineImageHint: \"Needs a separate Imagine credential (not Grok OAuth alone).\",\r\n\tcapGrokImagineVideo: \"Grok Imagine video\",\r\n\tcapGrokImagineVideoHint: \"Needs a separate Imagine credential (not Grok OAuth alone).\",\r\n\tusageTitle: \"Codex quota\",\r\n\tusageLoading: \"Loading Codex quota\u2026\",\r\n\tusageUnavailable: \"Codex quota is not available right now.\",\r\n\tusageEmpty: \"The vendor did not return any displayable quota fields.\",\r\n\tusageFetchedAt: \"Last read: {time}\",\r\n\tusageRateLimit: \"Rate limit\",\r\n\tusageWindow: \"{seconds}s window\",\r\n\tusageUsed: \"Used {value}\",\r\n\tusageRemaining: \"Remaining {value}\",\r\n\tusageResets: \"Resets {time}\",\r\n\tusageCredits: \"Credits\",\r\n\tusageCreditsUnlimited: \"Unlimited credits\",\r\n\tusageCreditsLimited: \"Limited credits\",\r\n\tusageBalance: \"Balance {value}\",\r\n\tusageIndividualLimit: \"Individual limit\",\r\n\tusageLimit: \"Limit {value}\",\r\n\tusageUsedAmount: \"Used {value}\",\r\n\tusageRemainingAmount: \"Remaining {value}\",\r\n\tusageSpendControlReached: \"Spend control has been reached.\",\r\n\tusageResetCredits: \"Reset credits available: {value}\",\r\n\timagineTitle: \"Grok Imagine credential\",\r\n\timagineIntro:\r\n\t\t\"Official Imagine calls use an xAI API credential (for example $XAI_API_KEY). That key is separate from a Grok Build OAuth login and is never shown here.\",\r\n\timagineLoading: \"Checking the Imagine credential\u2026\",\r\n\timagineLoadFailed: \"Could not read the Imagine credential status.\",\r\n\timagineConfigured: \"An Imagine credential is configured\",\r\n\timagineNotConfigured: \"No Imagine credential is configured\",\r\n\timagineSource: \"Source: {source}\",\r\n\timagineWritable: \"This deployment can update the Imagine credential store.\",\r\n\timagineReadOnly: \"This deployment cannot update the Imagine credential store.\",\r\n\timagineSourceNone: \"none\",\r\n\timagineSourceEnv: \"environment variable\",\r\n\timagineSourceApiKey: \"stored API key\",\r\n\timagineSourceOAuth: \"OAuth access (only if Imagine accepted it)\",\r\n\timagineSourceCliKey: \"Grok CLI key field\",\r\n\timagineSourceUnknown: \"configured (details withheld)\",\r\n\ttabAccounts: \"Accounts\",\r\n\ttabCapabilities: \"Capabilities\",\r\n\ttabGateway: \"Gateway\",\r\n\ttabAbout: \"About\",\r\n\tcopy: \"Copy\",\r\n\tcopied: \"Copied\",\r\n\tcopyFailed: \"Could not copy\",\r\n\tmodelsSummary: \"{selected}/{total} models visible\",\r\n\texpandModels: \"Models\",\r\n\tcollapseModels: \"Hide models\",\r\n\tusageUsedShort: \"Used {value}\",\r\n\tgatewayTitle: \"Local API gateway\",\r\n\tgatewayIntro: \"Loopback OpenAI/Anthropic-compatible server for your own tools. Off until you enable it.\",\r\n\tgatewayWarning: \"Exposes signed-in subscriptions as a local API. Can violate provider terms and uses quota.\",\r\n\tgatewayLoopbackHint: \"Binds to loopback only. Do not port-forward or expose this gateway on a public interface.\",\r\n\tgatewayEnableConfirm:\r\n\t\t\"Enable the local API gateway? It exposes your signed-in subscriptions to tools on this host and consumes provider quota.\",\r\n\tgatewayEnableConfirmAction: \"Confirm\",\r\n\tgatewayEnableCancel: \"Cancel\",\r\n\tgatewayEnabled: \"Enable local gateway\",\r\n\tgatewayBind: \"Bind\",\r\n\tgatewayPort: \"Port\",\r\n\tgatewayPortHint: \"Integer from 1024 through 65535. Apply to save; Random fills a high port, then Apply.\",\r\n\tgatewayPortApply: \"Apply\",\r\n\tgatewayPortRandom: \"Random\",\r\n\tgatewayPortInvalid: \"Enter a whole port number from 1024 through 65535.\",\r\n\tgatewayAddress: \"Gateway address\",\r\n\tgatewayOpenAiUrl: \"OpenAI-compatible base URL\",\r\n\tgatewayAnthropicUrl: \"Anthropic-compatible base URL\",\r\n\tgatewayKeyHint: \"Bearer key\",\r\n\tgatewayKeyCopyHint: \"Copy uses the current key. Rotate only if you want to invalidate existing clients.\",\r\n\tgatewayCopyKey: \"Copy key\",\r\n\tgatewayShowKey: \"Show\",\r\n\tgatewayHideKey: \"Hide\",\r\n\tgatewayRevealFailed: \"Could not read the current key.\",\r\n\tgatewayRotateConfirm: \"Rotate the key? Existing clients will stop working.\",\r\n\tgatewayRotateConfirmHint: \"This replaces the current Bearer key.\",\r\n\tgatewayRotateConfirmAction: \"Confirm rotate\",\r\n\tgatewayRotateCancel: \"Cancel\",\r\n\tgatewayRunning: \"Listening\",\r\n\tgatewayStopped: \"Not listening\",\r\n\tgatewayRotate: \"Rotate API key\",\r\n\tgatewayRotated: \"New key (shown once): {key}\",\r\n\tgatewayLoadFailed: \"Could not load gateway settings.\",\r\n\tgatewaySaveFailed: \"Could not update the gateway.\",\r\n\tgatewayLoading: \"Loading gateway settings\u2026\",\r\n\tgatewayModelsReady: \"{count} executable model(s) available. Snippets use {model}.\",\r\n\tgatewayModelsUnavailable: \"No signed-in provider currently exposes an executable gateway model.\",\r\n\tgatewayKeyConfigured: \"A real Bearer key is configured. Reveal it before copying an executable snippet.\",\r\n\tgatewayKeyNotConfigured: \"No Bearer key is configured yet.\",\r\n\tremoteLoginHelp:\r\n\t\t\"On a remote DSH host, open Settings here and use device-code sign-in for each provider. Complete the code on any browser that can reach the provider, then return to chat and pick the provider route model.\",\r\n\tpluginVersion: \"Plugin version {version}\",\r\n\taboutTitle: \"About\",\r\n\taboutDocsHint:\r\n\t\t\"See the plugin README and INSTALL docs in the repository for setup, supported providers, and gateway safety notes.\",\r\n\taboutDocsLink: \"Open README on GitHub\",\r\n\totherLoginMethods: \"Other sign-in methods\",\r\n\thideOtherLoginMethods: \"Hide other methods\",\r\n\tsignInStepOpen: \"Open the provider authorization page\",\r\n\tsignInStepCode: \"Enter the device code when prompted\",\r\n\tsignInStepWait: \"Waiting for authorization to complete\",\r\n\tcopyUserCode: \"Copy code\",\r\n\topenAuthUrl: \"Open authorization page\",\r\n\tmodelFilterPlaceholder: \"Filter models\u2026\",\r\n\tmodelFilterLabel: \"Filter models for {provider}\",\r\n\tapplyModelDraft: \"Apply model selection\",\r\n\tmodelDraftPending: \"Selection changed locally. Apply once to save.\",\r\n\tdeselectAll: \"Hide all\",\r\n\tresetModelsDefault: \"Reset selection\",\r\n\trequiresCodexImages: \"Turn on Codex images first.\",\r\n\trequiresCodexSignIn: \"Sign in to OpenAI Codex first.\",\r\n\trequiresImagineCredential: \"Configure the separate Grok Imagine credential first.\",\r\n\topenCodexAccount: \"Open Codex account\",\r\n\tfocusCodexImages: \"Go to Codex images\",\r\n\tfocusImagineCredential: \"View Imagine credential status\",\r\n\tgatewaySnippetsTitle: \"Quick setup snippets\",\r\n\tgatewaySnippetsUnavailable: \"Reveal the real key and sign in to at least one provider before snippets are shown.\",\r\n\tgatewaySnippetCurl: \"cURL\",\r\n\tgatewaySnippetPython: \"Python (OpenAI SDK)\",\r\n\tgatewaySnippetIde: \"IDE / client\",\r\n\ttabAccountsSignedIn: \"{count} signed in\",\r\n\tcoinstallTitle: \"Managed by Usage Center\",\r\n\tcoinstallSummary: \"Usage Center is the active OAuth owner. {count} provider account(s) are currently signed in.\",\r\n\tcoinstallOpenHub: \"Open Usage Center\",\r\n\ttabGatewayActive: \"Running\",\r\n};\r\n\r\nexport type GrokBuildSettingsKey = keyof typeof en;\r\n\r\nexport const zh: { [Key in GrokBuildSettingsKey]: string } = {\r\n\tnav: \"\u7F16\u7801 OAuth\",\r\n\ttitle: \"\u7F16\u7801\u8BA2\u9605\u8D26\u6237\",\r\n\tintro:\r\n\t\t\"\u5728 dsh \u4E2D\u4F7F\u7528\u81EA\u5DF1\u7684 Grok Build\u3001ChatGPT Codex\u3001Kimi Code \u548C Claude Code \u8BA2\u9605\uFF1B\u73B0\u6709 API-key \u8DEF\u7531\u7EE7\u7EED\u72EC\u7ACB\u4FDD\u7559\u3002\",\r\n\ttermsWarning: \"\u8FD9\u4E9B\u662F\u8BA2\u9605\u670D\u52A1\u7684\u975E\u5B98\u65B9\u7B2C\u4E09\u65B9\u96C6\u6210\uFF0C\u4ECD\u53D7\u4F9B\u5E94\u5546\u6761\u6B3E\u3001\u914D\u989D\u3001\u5730\u533A\u9650\u5236\u548C\u8D26\u53F7\u98CE\u63A7\u7EA6\u675F\u3002\",\r\n\tloadingAccount: \"\u6B63\u5728\u52A0\u8F7D\u8D26\u6237\u2026\",\r\n\tsignedOut: \"\u5C1A\u672A\u767B\u5F55\",\r\n\tsigningIn: \"\u6B63\u5728\u7B49\u5F85\u6388\u6743\u2026\",\r\n\tsignedIn: \"\u5DF2\u767B\u5F55\",\r\n\trequestFailed: \"\u8D26\u6237\u8BF7\u6C42\u5931\u8D25\u3002\",\r\n\tretry: \"\u91CD\u8BD5\",\r\n\tcancel: \"\u53D6\u6D88\",\r\n\tlogout: \"\u9000\u51FA\u767B\u5F55\",\r\n\tlogoutConfirmTitle: \"\u786E\u8BA4\u9000\u51FA\u767B\u5F55\",\r\n\tlogoutConfirmHint: \"\u786E\u5B9A\u5728 dsh \u4E2D\u9000\u51FA\u6B64\u4F9B\u5E94\u5546\uFF1F\u4F9B\u5E94\u5546\u8D26\u53F7\u672C\u8EAB\u4E0D\u4F1A\u88AB\u4FEE\u6539\u3002\",\r\n\tlogoutConfirmAction: \"\u786E\u8BA4\u9000\u51FA\",\r\n\tworking: \"\u5904\u7406\u4E2D\u2026\",\r\n\tcancelLogin: \"\u53D6\u6D88\u767B\u5F55\",\r\n\tdeviceLogin: \"\u4F7F\u7528\u8BBE\u5907\u7801\u767B\u5F55\",\r\n\tdeviceLoginRemote: \"\u4F7F\u7528\u8BBE\u5907\u7801\u767B\u5F55\uFF08\u9002\u5408\u8FDC\u7A0B\uFF09\",\r\n\tbrowserLogin: \"\u5728\u6D4F\u89C8\u5668\u4E2D\u767B\u5F55\",\r\n\tpkceLogin: \"\u4F7F\u7528\u6388\u6743\u7801\u767B\u5F55\",\r\n\tuserCode: \"\u4F9B\u5E94\u5546\u8981\u6C42\u8F93\u5165\u4EE3\u7801\u65F6\uFF0C\u8BF7\u8F93\u5165\uFF1A\",\r\n\topenUrl: \"\u8BF7\u5728\u6B64\u5B8C\u6210\u767B\u5F55\uFF1A\",\r\n\tpopupBlocked: \"\u6D4F\u89C8\u5668\u963B\u6B62\u4E86\u767B\u5F55\u7A97\u53E3\uFF0C\u8BF7\u624B\u52A8\u6253\u5F00\uFF1A\",\r\n\tpasteCodeHint: \"\u8BF7\u7C98\u8D34\u4F9B\u5E94\u5546\u8FD4\u56DE\u7684\u6388\u6743 code \u6216\u5B8C\u6574\u8DF3\u8F6C\u94FE\u63A5\u3002\u672C\u5730 PKCE \u4EC5\u5728\u56DE\u8C03\u65E0\u6CD5\u5230\u8FBE\u8FD9\u53F0 DSH \u4E3B\u673A\u65F6\u4F7F\u7528\uFF1A\",\r\n\tpasteBrowserCodeHint: \"\u8BF7\u7C98\u8D34\u4F9B\u5E94\u5546\u8FD4\u56DE\u7684\u6388\u6743 code \u6216\u5B8C\u6574\u8DF3\u8F6C\u94FE\u63A5\uFF0C\u4EE5\u5B8C\u6210\u6B64\u6B21\u6D4F\u89C8\u5668\u767B\u5F55\uFF1A\",\r\n\tpasteCodePlaceholder: \"\u6388\u6743 code \u6216\u5B8C\u6574\u8DF3\u8F6C\u94FE\u63A5\",\r\n\tpasteCodeLabel: \"\u6388\u6743 code \u6216\u5B8C\u6574\u8DF3\u8F6C\u94FE\u63A5\",\r\n\tsubmitCode: \"\u63D0\u4EA4 code\",\r\n\timportGrok: \"\u4ECE Grok CLI \u5BFC\u5165\",\r\n\timportHint: \"\u628A ~/.grok/auth.json \u590D\u5236\u8FDB dsh\uFF1B\u4E4B\u540E dsh \u5237\u65B0 token \u53EF\u80FD\u8BA9 Grok CLI \u6389\u7EBF\u3002\",\r\n\tmodels: \"\u53EF\u89C1\u6A21\u578B\",\r\n\tcatalogLive: \"\u6765\u81EA\u5F53\u524D xAI \u8D26\u53F7\",\r\n\tcatalogCache: \"\u6765\u81EA\u4E0A\u4E00\u6B21\u6210\u529F\u62C9\u53D6\u7684 xAI \u5217\u8868\",\r\n\tcatalogFallback: \"\u5185\u7F6E Grok \u57FA\u7EBF\u76EE\u5F55\uFF08\u7EBF\u4E0A\u5217\u8868\u4E0D\u53EF\u7528\uFF09\",\r\n\tcatalogError: \"\u65E0\u6CD5\u5237\u65B0\u7EBF\u4E0A Grok \u6A21\u578B\u5217\u8868\u3002\",\r\n\tselectAll: \"\u5168\u90E8\u663E\u793A\",\r\n\tmodelHint: \"\u52FE\u9009\u6A21\u578B\u4F1A\u4EE5\u8BE5\u524D\u7F00\u51FA\u73B0\u5728\u6A21\u578B\u9009\u62E9\u5668\uFF1A\",\r\n\tgrokTitle: \"xAI Grok Build\",\r\n\tgrokDescription: \"\u901A\u8FC7 Grok Build \u7AEF\u70B9\u4F7F\u7528 SuperGrok / X Premium \u7F16\u7801\u8BA2\u9605\u3002\",\r\n\tcodexTitle: \"OpenAI Codex\",\r\n\tcodexDescription: \"\u4F7F\u7528 ChatGPT Plus/Pro \u7684 Codex \u6743\u76CA\uFF1B\u8FDC\u7A0B DSH \u4E3B\u673A\u63A8\u8350\u8BBE\u5907\u7801\u767B\u5F55\u3002\",\r\n\tkimiTitle: \"Kimi Code\",\r\n\tkimiDescription: \"\u901A\u8FC7 auth.kimi.com \u4E0E api.kimi.com/coding \u4F7F\u7528 Kimi Code \u4F1A\u5458\uFF1B\u4E0D\u662F Moonshot API-key \u5F00\u653E\u5E73\u53F0\u3002\",\r\n\tclaudeTitle: \"Claude Code\",\r\n\tclaudeDescription: \"Claude Pro/Max OAuth\uFF0C\u5305\u542B Claude Code scope \u548C\u81EA\u52A8\u5237\u65B0\u3002\",\r\n\tantigravityTitle: \"Google Antigravity\",\r\n\tantigravityDescription: \"\u7531\u5355\u72EC\u56FA\u5B9A\u7248\u672C\u7684 MIT \u5F00\u6E90 dsh-agy \u63D2\u4EF6\u63D0\u4F9B\uFF0C\u5BF9\u5916\u8DEF\u7531\u4E3A agy\u3002\",\r\n\tantigravityInstalled: \"\u5DF2\u5B89\u88C5\uFF08CLI \u7BA1\u7406\uFF09\",\r\n\tantigravityMissing: \"\u5C1A\u672A\u5B89\u88C5\",\r\n\tantigravityCliHint:\r\n\t\t\"\u4E3A\u907F\u514D\u66B4\u9732\u65E0\u8BA4\u8BC1\u7684\u51ED\u636E\u5BFC\u51FA\u9875\u9762\uFF0C\u9ED8\u8BA4\u7981\u7528 dsh-agy Web \u7BA1\u7406\u9875\uFF1B\u9700\u8981\u65F6\u4F7F\u7528 profile \u5185 CLI \u7BA1\u7406 Google OAuth\u3002\",\r\n\tantigravityCliCommand: \"dsh plugin --profile web exec dsh-agy login --headless\",\r\n\tsourcesTitle: \"\u4ECE\u5B98\u65B9 CLI \u6587\u4EF6\u62C9\u53D6\u526F\u672C\",\r\n\tsourcesIntro:\r\n\t\t\"dsh \u53EF\u4EE5\u81EA\u52A8\u53D1\u73B0\u672C\u673A\u5B98\u65B9 CLI \u767B\u5F55\uFF0C\u5E76\u5355\u5411\u62C9\u53D6\u4E00\u4EFD\u526F\u672C\u5230\u81EA\u5DF1\u7684\u5B58\u50A8\u3002\u5B98\u65B9 CLI \u6587\u4EF6\u4FDD\u6301\u53EA\u8BFB\uFF0C\u7EDD\u4E0D\u4F1A\u88AB\u4FEE\u6539\u3002\",\r\n\tsourcesReadOnlyHint: \"\u8FD9\u662F\u5355\u5411\u62C9\u53D6\u526F\u672C\u3002dsh \u4E0D\u4F1A\u66F4\u65B0\u3001\u8986\u76D6\u6216\u56DE\u5199\u5B98\u65B9 CLI \u6587\u6863\u3002\",\r\n\tsourcesLoading: \"\u6B63\u5728\u67E5\u627E\u5B98\u65B9 CLI \u767B\u5F55\u6587\u4EF6\u2026\",\r\n\tsourcesCheckAgain: \"\u518D\u68C0\u67E5\u4E00\u6B21\",\r\n\tsourcesAvailable: \"\u53EF\u4EE5\u8BFB\u53D6\u4E00\u4EFD\u526F\u672C\",\r\n\tsourcesUnavailable: \"\u6CA1\u6709\u53EF\u7528\u7684\u526F\u672C\",\r\n\tsourcesAllMissingHint:\r\n\t\t\"\u8FD9\u53F0\u4E3B\u673A\u4E0A\u6CA1\u6709\u627E\u5230\u5B98\u65B9 CLI \u767B\u5F55\u6587\u4EF6\u3002\u8FDC\u7A0B DSH \u4E0A\u8FD9\u5F88\u5E38\u89C1\u2014\u2014\u8BF7\u6539\u7528\u8BBE\u5907\u7801\u767B\u5F55\uFF1B\u82E5\u5DF2\u5728\u672C\u673A CLI \u767B\u5F55\uFF0C\u53EF\u518D\u68C0\u67E5\u4E00\u6B21\u3002\",\r\n\tsourcesAvailableHint: \"\u672C\u673A\u53D1\u73B0\u4E86\u5B98\u65B9 CLI \u767B\u5F55\u3002\u53EF\u5728\u5BF9\u5E94\u8D26\u6237\u5361\u7247\u91CC\u5355\u5411\u62C9\u53D6\u4E00\u4EFD\u526F\u672C\u5230 dsh\u3002\",\r\n\tsourcesPullCopy: \"\u62C9\u53D6\u526F\u672C\",\r\n\tremoteAccountsTip:\r\n\t\t\"\u5F53\u524D Settings \u9875\u9762\u770B\u8D77\u6765\u662F\u8FDC\u7A0B\u8BBF\u95EE\uFF08\u975E\u672C\u673A\u56DE\u73AF\uFF09\u3002\u8BF7\u4F18\u5148\u4F7F\u7528\u8BBE\u5907\u7801\u767B\u5F55\uFF1B\u4ECE\u53E6\u4E00\u53F0\u673A\u5668\u6253\u5F00\u65F6\uFF0C\u6D4F\u89C8\u5668\u5F39\u7A97\u548C\u672C\u5730 PKCE \u56DE\u8C03\u7ECF\u5E38\u4F1A\u5931\u8D25\u3002\",\r\n\tremoteTipDismiss: \"\u77E5\u9053\u4E86\",\r\n\tsourcesPreviewTitle: \"\u5148\u6838\u5BF9\u8FD9\u4EFD\u526F\u672C\uFF0C\u518D\u5199\u5165 dsh\",\r\n\tsourcesPreviewExpires: \"CLI \u51ED\u636E\u5230\u671F\u65F6\u95F4\uFF1A{time}\",\r\n\tsourcesTicketExpires: \"\u6B64\u6B21\u9884\u89C8\u5C06\u4E8E {time} \u5931\u6548\",\r\n\tsourcesConflict: \"dsh \u4E2D\u5DF2\u5B58\u51ED\u636E\uFF1A{detail}\",\r\n\tsourcesAction: \"\u82E5\u7EE7\u7EED\uFF1A{detail}\",\r\n\tsourcesWarnings: \"\u8BF4\u660E\",\r\n\tsourcesConfirmOverwrite: \"\u7528\u8FD9\u4EFD\u526F\u672C\u66FF\u6362 dsh \u4E2D\u5DF2\u4FDD\u5B58\u7684\u51ED\u636E\",\r\n\tsourcesConfirmOverwriteHint: \"dsh \u91CC\u5DF2\u6709\u53E6\u4E00\u4EFD\u51ED\u636E\u3002\u8BF7\u5148\u52FE\u9009\uFF0C\u518D\u786E\u8BA4\u62C9\u53D6\u3002\",\r\n\tsourcesCommit: \"\u786E\u8BA4\u62C9\u53D6\",\r\n\tsourcesCancelPreview: \"\u53D6\u6D88\u9884\u89C8\",\r\n\tsourcesCommitSuccess: \"\u5DF2\u590D\u5236\u5230 dsh\uFF08{action}\uFF09\u3002\",\r\n\tsourcesPreviewFailed: \"\u65E0\u6CD5\u4ECE\u8BE5 CLI \u6587\u4EF6\u51C6\u5907\u526F\u672C\u3002\",\r\n\tsourcesCommitFailed: \"\u65E0\u6CD5\u628A\u526F\u672C\u4FDD\u5B58\u5230 dsh\u3002\",\r\n\tsourcesLoadFailed: \"\u65E0\u6CD5\u67E5\u627E\u5B98\u65B9 CLI \u767B\u5F55\u6587\u4EF6\u3002\",\r\n\tsourceKindGrok: \"Grok CLI\",\r\n\tsourceKindCodex: \"Codex CLI\",\r\n\tsourceKindKimi: \"Kimi Code CLI\",\r\n\tsourceKindClaude: \"Claude Code CLI\",\r\n\tsourceReasonMissing: \"\u5728\u9884\u671F\u4F4D\u7F6E\u6CA1\u6709\u627E\u5230\u5B98\u65B9 CLI \u6587\u4EF6\u3002\",\r\n\tsourceReasonUnsafe: \"\u5B98\u65B9 CLI \u6587\u4EF6\u4E0D\u5B89\u5168\uFF0C\u65E0\u6CD5\u8BFB\u53D6\uFF08\u6743\u9650\u6216\u6587\u4EF6\u7C7B\u578B\uFF09\u3002\",\r\n\tsourceReasonInvalid: \"\u5B98\u65B9 CLI \u6587\u4EF6\u5B58\u5728\uFF0C\u4F46\u4E0D\u662F\u53EF\u7528\u7684 OAuth \u767B\u5F55\u3002\",\r\n\tsourceReasonTooLarge: \"\u5B98\u65B9 CLI \u6587\u4EF6\u8D85\u8FC7\u5141\u8BB8\u7684\u8BFB\u53D6\u4E0A\u9650\u3002\",\r\n\tsourceConflictNone: \"dsh \u5C1A\u672A\u4FDD\u5B58\u51ED\u636E\",\r\n\tsourceConflictSameCredential: \"\u5DF2\u4FDD\u5B58\u540C\u4E00\u4EFD\u51ED\u636E\",\r\n\tsourceConflictSameAccount: \"\u540C\u4E00\u8D26\u53F7\uFF0C\u4F46\u51ED\u636E\u4E0D\u540C\",\r\n\tsourceConflictDifferentAccount: \"\u5DF2\u4FDD\u5B58\u53E6\u4E00\u4E2A\u8D26\u53F7\",\r\n\tsourceConflictUnknownAccount: \"\u5DF2\u4FDD\u5B58\u51ED\u636E\uFF08\u65E0\u6CD5\u6BD4\u8F83\u8D26\u53F7\uFF09\",\r\n\tsourceConflictUnreadableDestination: \"\u65E0\u6CD5\u8BFB\u53D6 dsh \u4E2D\u5DF2\u5B58\u51ED\u636E\",\r\n\tsourceConflictUnsafeDestination: \"dsh \u4E2D\u7684\u51ED\u636E\u6587\u4EF6\u4E0D\u5B89\u5168\uFF0C\u4E0D\u80FD\u4ECE\u8FD9\u91CC\u66FF\u6362\",\r\n\tsourceConflictUnrecognized: \"\u5DF2\u5B58\u51ED\u636E\u9700\u8981\u6838\u5BF9\",\r\n\tsourceActionImport: \"\u628A\u8FD9\u4EFD\u526F\u672C\u4FDD\u5B58\u5230 dsh\",\r\n\tsourceActionReuse: \"\u4FDD\u7559 dsh \u4E2D\u5DF2\u5B58\u51ED\u636E\uFF08\u5185\u5BB9\u5DF2\u76F8\u540C\uFF09\",\r\n\tsourceActionOverwrite: \"\u66FF\u6362 dsh \u4E2D\u5DF2\u5B58\u51ED\u636E\",\r\n\tsourceActionBlocked: \"\u5DF2\u963B\u6B62 \u2014 \u4E0D\u80FD\u4ECE\u8FD9\u91CC\u66FF\u6362 dsh \u4E2D\u7684\u6587\u4EF6\",\r\n\tsourceActionUnrecognized: \"\u9700\u8981\u6838\u5BF9\",\r\n\tsourceCommitImported: \"\u5DF2\u4FDD\u5B58\",\r\n\tsourceCommitUnchanged: \"\u539F\u672C\u5C31\u76F8\u540C\",\r\n\tsourceCommitOverwritten: \"\u5DF2\u66FF\u6362\",\r\n\tcapabilitiesTitle: \"\u8BA2\u9605\u80FD\u529B\",\r\n\tcapabilitiesIntro: \"\u6240\u6709\u5F00\u5173\u9ED8\u8BA4\u5173\u95ED\u3002\u6253\u5F00\u540E\u6D88\u8017\u7684\u662F\u5BF9\u5E94\u4F9B\u5E94\u5546\u7684\u8BA2\u9605\u914D\u989D\uFF0C\u4E0D\u662F\u53E6\u4E00\u5957 API-key \u8D26\u5355\u3002\",\r\n\tcapabilitiesQuotaHint: \"\u641C\u7D22\u3001\u51FA\u56FE\u3001\u6539\u56FE\u3001Fast\u3001\u989D\u5EA6\u5C55\u793A\u548C Grok Imagine \u5728\u5B9E\u9645\u8C03\u7528\u65F6\u90FD\u4F1A\u6D88\u8017\u5BF9\u5E94\u8BA2\u9605\u914D\u989D\u3002\",\r\n\tcapabilitiesReadOnly: \"\u5F53\u524D\u90E8\u7F72\u4E2D\u8FD9\u4E9B\u5F00\u5173\u4E3A\u53EA\u8BFB\u3002\",\r\n\tcapabilitiesLoading: \"\u6B63\u5728\u52A0\u8F7D\u80FD\u529B\u8BBE\u7F6E\u2026\",\r\n\tcapabilitiesLoadFailed: \"\u65E0\u6CD5\u52A0\u8F7D\u80FD\u529B\u8BBE\u7F6E\u3002\",\r\n\tcapabilitiesSaveFailed: \"\u65E0\u6CD5\u4FDD\u5B58\u8BE5\u80FD\u529B\u8BBE\u7F6E\u3002\",\r\n\tcapabilitiesConflictRefreshed: \"\u8FD9\u4E9B\u8BBE\u7F6E\u5DF2\u5728\u522B\u5904\u88AB\u6539\u8FC7\u3002\u9875\u9762\u5DF2\u5237\u65B0\uFF0C\u8BF7\u518D\u8BD5\u4E00\u6B21\u3002\",\r\n\tcapabilityLimitsTitle: \"\u80FD\u529B\u9650\u5236\",\r\n\tcapabilityLimitsHint: \"\u9650\u5236\u4F1A\u5B9E\u65F6\u5E94\u7528\u4E8E\u65B0\u53D1\u8D77\u7684\u64CD\u4F5C\uFF0C\u5E76\u59CB\u7EC8\u4FDD\u6301\u5728\u5DF2\u5BA1\u8BA1\u7684\u5B89\u5168\u8303\u56F4\u5185\u3002\",\r\n\tcapSearchResults: \"\u6700\u591A\u641C\u7D22\u7ED3\u679C\u6570\",\r\n\tcapSearchResultsHint: \"Codex \u641C\u7D22\u6700\u591A\u8FD4\u56DE\u8FD9\u4E48\u591A\u6761\u7ED3\u679C\uFF081\u201320\uFF09\u3002\",\r\n\tcapImageCount: \"\u5355\u6B21\u6700\u591A\u56FE\u7247\u6570\",\r\n\tcapImageCountHint: \"Codex \u4E0E Imagine \u56FE\u7247\u5DE5\u5177\u5355\u6B21\u6700\u591A\u8FD4\u56DE\u8FD9\u4E48\u591A\u5F20\u56FE\u7247\uFF081\u20134\uFF09\u3002\",\r\n\tcapVideoTtlHours: \"\u89C6\u9891\u4EA7\u7269\u4FDD\u7559\u65F6\u95F4\uFF08\u5C0F\u65F6\uFF09\",\r\n\tcapVideoTtlHoursHint: \"Imagine \u89C6\u9891\u4EA7\u7269\u4FDD\u7559 1\u2013168 \u5C0F\u65F6\uFF1B\u964D\u4F4E\u4FDD\u7559\u65F6\u95F4\u4F1A\u7ACB\u5373\u6E05\u7406\u8FC7\u671F\u65E7\u4EA7\u7269\uFF0C\u63D0\u9AD8\u53EA\u5F71\u54CD\u65B0\u4EA7\u7269\u3002\",\r\n\tcapabilityLimitInvalid: \"\u8BF7\u8F93\u5165 {min} \u5230 {max} \u4E4B\u95F4\u7684\u6574\u6570\u3002\",\r\n\tcapCodexSearch: \"Codex \u8BA2\u9605\u641C\u7D22\",\r\n\tcapCodexSearchHint: \"\u53EF\u9009\u641C\u7D22\uFF0C\u6D88\u8017 Codex \u914D\u989D\u3002\",\r\n\tcapCodexImages: \"Codex \u51FA\u56FE\",\r\n\tcapCodexImagesHint: \"\u7528 ChatGPT/Codex \u914D\u989D\u51FA\u56FE\u3002\",\r\n\tcapCodexImageEdits: \"Codex \u6539\u56FE\",\r\n\tcapCodexImageEditsHint: \"\u6539\u56FE\uFF1B\u9700\u5148\u6253\u5F00 Codex \u51FA\u56FE\u3002\",\r\n\tcapCodexImagesAnyModel: \"\u5141\u8BB8\u4EFB\u610F\u6A21\u578B\u8C03\u7528\u51FA\u56FE\u5DE5\u5177\",\r\n\tcapCodexImagesAnyModelHint: \"\u975E Codex \u6E20\u9053\u7684\u6A21\u578B\u4E5F\u53EF\u8C03\u7528\u56FE\u7247\u751F\u6210/\u7F16\u8F91\u3002\u4ECD\u6D88\u8017 ChatGPT/Codex \u914D\u989D\uFF0C\u4E14\u9700\u767B\u5F55 Codex\u3002\",\r\n\tcapCodexUsage: \"\u663E\u793A Codex \u989D\u5EA6\",\r\n\tcapCodexUsageHint: \"\u6709\u6570\u636E\u65F6\u5728 Codex \u8D26\u6237\u5361\u7247\u4E0A\u663E\u793A\u5269\u4F59\u989D\u5EA6\u3002\",\r\n\tcapCodexFast: \"\u5DF2\u8BF7\u6C42 Fast\",\r\n\tcapCodexFastHint: \"\u5728\u7EBF\u76EE\u5F55\u786E\u8BA4\u4F18\u5148\u8D44\u683C\u540E\u53D1\u5E03 Fast \u8DEF\u7531\u3002\",\r\n\tcapGrokImagineImage: \"Grok Imagine \u51FA\u56FE\",\r\n\tcapGrokImagineImageHint: \"\u9700\u8981\u5355\u72EC\u7684 Imagine \u51ED\u636E\uFF0C\u4EC5\u6709 Grok OAuth \u4E0D\u591F\u3002\",\r\n\tcapGrokImagineVideo: \"Grok Imagine \u51FA\u89C6\u9891\",\r\n\tcapGrokImagineVideoHint: \"\u9700\u8981\u5355\u72EC\u7684 Imagine \u51ED\u636E\uFF0C\u4EC5\u6709 Grok OAuth \u4E0D\u591F\u3002\",\r\n\tusageTitle: \"Codex \u989D\u5EA6\",\r\n\tusageLoading: \"\u6B63\u5728\u52A0\u8F7D Codex \u989D\u5EA6\u2026\",\r\n\tusageUnavailable: \"\u5F53\u524D\u65E0\u6CD5\u8BFB\u53D6 Codex \u989D\u5EA6\u3002\",\r\n\tusageEmpty: \"\u4F9B\u5E94\u5546\u6CA1\u6709\u8FD4\u56DE\u53EF\u5C55\u793A\u7684\u989D\u5EA6\u5B57\u6BB5\u3002\",\r\n\tusageFetchedAt: \"\u6700\u8FD1\u8BFB\u53D6\uFF1A{time}\",\r\n\tusageRateLimit: \"\u901F\u7387\u9650\u5236\",\r\n\tusageWindow: \"{seconds} \u79D2\u7A97\u53E3\",\r\n\tusageUsed: \"\u5DF2\u7528 {value}\",\r\n\tusageRemaining: \"\u5269\u4F59 {value}\",\r\n\tusageResets: \"\u91CD\u7F6E\u65F6\u95F4 {time}\",\r\n\tusageCredits: \"\u79EF\u5206\",\r\n\tusageCreditsUnlimited: \"\u65E0\u9650\u79EF\u5206\",\r\n\tusageCreditsLimited: \"\u6709\u9650\u79EF\u5206\",\r\n\tusageBalance: \"\u4F59\u989D {value}\",\r\n\tusageIndividualLimit: \"\u4E2A\u4EBA\u989D\u5EA6\",\r\n\tusageLimit: \"\u4E0A\u9650 {value}\",\r\n\tusageUsedAmount: \"\u5DF2\u7528 {value}\",\r\n\tusageRemainingAmount: \"\u5269\u4F59 {value}\",\r\n\tusageSpendControlReached: \"\u5DF2\u8FBE\u5230\u652F\u51FA\u63A7\u5236\u4E0A\u9650\u3002\",\r\n\tusageResetCredits: \"\u53EF\u7528\u91CD\u7F6E\u6B21\u6570\uFF1A{value}\",\r\n\timagineTitle: \"Grok Imagine \u51ED\u636E\",\r\n\timagineIntro:\r\n\t\t\"\u5B98\u65B9 Imagine \u8C03\u7528\u4F7F\u7528 xAI API \u51ED\u636E\uFF08\u4F8B\u5982 $XAI_API_KEY\uFF09\u3002\u5B83\u4E0E Grok Build OAuth \u767B\u5F55\u4E0D\u662F\u540C\u4E00\u4EFD\u51ED\u636E\uFF0C\u8FD9\u91CC\u4E5F\u4E0D\u4F1A\u663E\u793A\u5BC6\u94A5\u3002\",\r\n\timagineLoading: \"\u6B63\u5728\u68C0\u67E5 Imagine \u51ED\u636E\u2026\",\r\n\timagineLoadFailed: \"\u65E0\u6CD5\u8BFB\u53D6 Imagine \u51ED\u636E\u72B6\u6001\u3002\",\r\n\timagineConfigured: \"\u5DF2\u914D\u7F6E Imagine \u51ED\u636E\",\r\n\timagineNotConfigured: \"\u5C1A\u672A\u914D\u7F6E Imagine \u51ED\u636E\",\r\n\timagineSource: \"\u6765\u6E90\uFF1A{source}\",\r\n\timagineWritable: \"\u5F53\u524D\u90E8\u7F72\u53EF\u4EE5\u66F4\u65B0 Imagine \u51ED\u636E\u5B58\u50A8\u3002\",\r\n\timagineReadOnly: \"\u5F53\u524D\u90E8\u7F72\u4E0D\u80FD\u66F4\u65B0 Imagine \u51ED\u636E\u5B58\u50A8\u3002\",\r\n\timagineSourceNone: \"\u65E0\",\r\n\timagineSourceEnv: \"\u73AF\u5883\u53D8\u91CF\",\r\n\timagineSourceApiKey: \"\u5DF2\u4FDD\u5B58\u7684 API key\",\r\n\timagineSourceOAuth: \"OAuth access\uFF08\u4EC5\u5F53 Imagine \u63A5\u53D7\u65F6\uFF09\",\r\n\timagineSourceCliKey: \"Grok CLI \u7684 key \u5B57\u6BB5\",\r\n\timagineSourceUnknown: \"\u5DF2\u914D\u7F6E\uFF08\u7EC6\u8282\u4E0D\u5C55\u793A\uFF09\",\r\n\ttabAccounts: \"\u8D26\u6237\",\r\n\ttabCapabilities: \"\u80FD\u529B\",\r\n\ttabGateway: \"\u7F51\u5173\",\r\n\ttabAbout: \"\u5173\u4E8E\",\r\n\tcopy: \"\u590D\u5236\",\r\n\tcopied: \"\u5DF2\u590D\u5236\",\r\n\tcopyFailed: \"\u590D\u5236\u5931\u8D25\",\r\n\tmodelsSummary: \"\u5DF2\u663E\u793A {selected}/{total} \u4E2A\u6A21\u578B\",\r\n\texpandModels: \"\u6A21\u578B\",\r\n\tcollapseModels: \"\u6536\u8D77\u6A21\u578B\",\r\n\tusageUsedShort: \"\u5DF2\u7528 {value}\",\r\n\tgatewayTitle: \"\u672C\u5730 API \u7F51\u5173\",\r\n\tgatewayIntro: \"\u672C\u673A loopback \u4E0A\u7684 OpenAI/Anthropic \u517C\u5BB9\u670D\u52A1\uFF0C\u4F9B\u4F60\u81EA\u5DF1\u7684\u5DE5\u5177\u4F7F\u7528\u3002\u9ED8\u8BA4\u5173\u95ED\u3002\",\r\n\tgatewayWarning: \"\u6253\u5F00\u540E\u4F1A\u628A\u5DF2\u767B\u5F55\u8BA2\u9605\u66B4\u9732\u6210\u672C\u5730 API\u3002\u53EF\u80FD\u8FDD\u53CD\u4F9B\u5E94\u5546\u6761\u6B3E\u5E76\u6D88\u8017\u914D\u989D\u3002\",\r\n\tgatewayLoopbackHint: \"\u4EC5\u7ED1\u5B9A\u672C\u673A\u56DE\u73AF\u5730\u5740\u3002\u8BF7\u52FF\u505A\u7AEF\u53E3\u8F6C\u53D1\uFF0C\u4E5F\u4E0D\u8981\u628A\u5B83\u66B4\u9732\u5230\u516C\u7F51\u3002\",\r\n\tgatewayEnableConfirm: \"\u8981\u542F\u7528\u672C\u5730 API \u7F51\u5173\u5417\uFF1F\u5B83\u4F1A\u628A\u5DF2\u767B\u5F55\u7684\u8BA2\u9605\u66B4\u9732\u7ED9\u672C\u673A\u5DE5\u5177\uFF0C\u5E76\u6D88\u8017\u4F9B\u5E94\u5546\u914D\u989D\u3002\",\r\n\tgatewayEnableConfirmAction: \"\u786E\u8BA4\u542F\u7528\",\r\n\tgatewayEnableCancel: \"\u53D6\u6D88\",\r\n\tgatewayEnabled: \"\u542F\u7528\u672C\u5730\u7F51\u5173\",\r\n\tgatewayBind: \"\u7ED1\u5B9A\u5730\u5740\",\r\n\tgatewayPort: \"\u7AEF\u53E3\",\r\n\tgatewayPortHint: \"1024\u201365535 \u7684\u6574\u6570\u3002\u6539\u5B8C\u70B9\u786E\u5B9A\u4FDD\u5B58\uFF1B\u968F\u673A\u4F1A\u586B\u4E00\u4E2A\u9AD8\u4F4D\u7AEF\u53E3\uFF0C\u4ECD\u9700\u786E\u5B9A\u3002\",\r\n\tgatewayPortApply: \"\u786E\u5B9A\",\r\n\tgatewayPortRandom: \"\u968F\u673A\",\r\n\tgatewayPortInvalid: \"\u8BF7\u8F93\u5165 1024 \u5230 65535 \u4E4B\u95F4\u7684\u6574\u6570\u7AEF\u53E3\u3002\",\r\n\tgatewayAddress: \"\u7F51\u5173\u5730\u5740\",\r\n\tgatewayOpenAiUrl: \"OpenAI \u517C\u5BB9\u5730\u5740\",\r\n\tgatewayAnthropicUrl: \"Anthropic \u517C\u5BB9\u5730\u5740\",\r\n\tgatewayKeyHint: \"Bearer key\",\r\n\tgatewayKeyCopyHint: \"\u590D\u5236\u7684\u662F\u5F53\u524D key\u3002\u53EA\u6709\u8981\u4F5C\u5E9F\u5DF2\u6709\u5BA2\u6237\u7AEF\u65F6\u624D\u8F6E\u6362\u3002\",\r\n\tgatewayCopyKey: \"\u590D\u5236 key\",\r\n\tgatewayShowKey: \"\u663E\u793A\",\r\n\tgatewayHideKey: \"\u9690\u85CF\",\r\n\tgatewayRevealFailed: \"\u65E0\u6CD5\u8BFB\u53D6\u5F53\u524D key\u3002\",\r\n\tgatewayRotateConfirm: \"\u786E\u5B9A\u8F6E\u6362 key\uFF1F\u73B0\u6709\u5BA2\u6237\u7AEF\u5C06\u5931\u6548\u3002\",\r\n\tgatewayRotateConfirmHint: \"\u8FD9\u4F1A\u66FF\u6362\u5F53\u524D Bearer key\u3002\",\r\n\tgatewayRotateConfirmAction: \"\u786E\u8BA4\u8F6E\u6362\",\r\n\tgatewayRotateCancel: \"\u53D6\u6D88\",\r\n\tgatewayRunning: \"\u6B63\u5728\u76D1\u542C\",\r\n\tgatewayStopped: \"\u672A\u76D1\u542C\",\r\n\tgatewayRotate: \"\u8F6E\u6362 API key\",\r\n\tgatewayRotated: \"\u65B0 key\uFF08\u53EA\u663E\u793A\u4E00\u6B21\uFF09\uFF1A{key}\",\r\n\tgatewayLoadFailed: \"\u65E0\u6CD5\u52A0\u8F7D\u7F51\u5173\u8BBE\u7F6E\u3002\",\r\n\tgatewaySaveFailed: \"\u65E0\u6CD5\u66F4\u65B0\u7F51\u5173\u3002\",\r\n\tgatewayLoading: \"\u6B63\u5728\u52A0\u8F7D\u7F51\u5173\u8BBE\u7F6E\u2026\",\r\n\tgatewayModelsReady: \"\u5F53\u524D\u6709 {count} \u4E2A\u53EF\u6267\u884C\u6A21\u578B\uFF0C\u914D\u7F6E\u7247\u6BB5\u4F7F\u7528 {model}\u3002\",\r\n\tgatewayModelsUnavailable: \"\u5F53\u524D\u6CA1\u6709\u5DF2\u767B\u5F55\u4F9B\u5E94\u5546\u63D0\u4F9B\u53EF\u6267\u884C\u7684\u7F51\u5173\u6A21\u578B\u3002\",\r\n\tgatewayKeyConfigured: \"\u5DF2\u914D\u7F6E\u771F\u5B9E Bearer key\uFF1B\u590D\u5236\u53EF\u6267\u884C\u7247\u6BB5\u524D\u8BF7\u5148\u8BFB\u53D6 key\u3002\",\r\n\tgatewayKeyNotConfigured: \"\u5C1A\u672A\u914D\u7F6E Bearer key\u3002\",\r\n\tremoteLoginHelp:\r\n\t\t\"\u5728\u8FDC\u7A0B DSH \u4E3B\u673A\u4E0A\uFF0C\u6253\u5F00\u6B64\u5904 Settings\uFF0C\u5BF9\u6BCF\u4E2A\u4F9B\u5E94\u5546\u4F7F\u7528\u8BBE\u5907\u7801\u767B\u5F55\u3002\u5728\u80FD\u8BBF\u95EE\u4F9B\u5E94\u5546\u7684\u4EFB\u610F\u6D4F\u89C8\u5668\u5B8C\u6210\u9A8C\u8BC1\u7801\uFF0C\u518D\u56DE\u5230\u804A\u5929\u9009\u62E9\u5BF9\u5E94\u8DEF\u7531\u6A21\u578B\u3002\",\r\n\tpluginVersion: \"\u63D2\u4EF6\u7248\u672C {version}\",\r\n\taboutTitle: \"\u5173\u4E8E\",\r\n\taboutDocsHint: \"\u4ED3\u5E93\u4E2D\u7684 README \u4E0E INSTALL \u6587\u6863\u4ECB\u7ECD\u4E86\u5B89\u88C5\u6B65\u9AA4\u3001\u652F\u6301\u7684\u4F9B\u5E94\u5546\u4EE5\u53CA\u7F51\u5173\u5B89\u5168\u6CE8\u610F\u4E8B\u9879\u3002\",\r\n\taboutDocsLink: \"\u5728 GitHub \u6253\u5F00 README\",\r\n\totherLoginMethods: \"\u5176\u4ED6\u767B\u5F55\u65B9\u5F0F\",\r\n\thideOtherLoginMethods: \"\u6536\u8D77\u5176\u4ED6\u65B9\u5F0F\",\r\n\tsignInStepOpen: \"\u6253\u5F00\u4F9B\u5E94\u5546\u6388\u6743\u9875\u9762\",\r\n\tsignInStepCode: \"\u5728\u63D0\u793A\u5904\u8F93\u5165\u8BBE\u5907\u7801\",\r\n\tsignInStepWait: \"\u7B49\u5F85\u6388\u6743\u5B8C\u6210\",\r\n\tcopyUserCode: \"\u590D\u5236\u8BBE\u5907\u7801\",\r\n\topenAuthUrl: \"\u6253\u5F00\u6388\u6743\u9875\u9762\",\r\n\tmodelFilterPlaceholder: \"\u7B5B\u9009\u6A21\u578B\u2026\",\r\n\tmodelFilterLabel: \"\u7B5B\u9009 {provider} \u7684\u6A21\u578B\",\r\n\tapplyModelDraft: \"\u5E94\u7528\u6A21\u578B\u9009\u62E9\",\r\n\tmodelDraftPending: \"\u9009\u62E9\u4EC5\u5728\u672C\u9875\u5F62\u6210\u8349\u7A3F\uFF0C\u70B9\u51FB\u5E94\u7528\u540E\u4E00\u6B21\u4FDD\u5B58\u3002\",\r\n\tdeselectAll: \"\u5168\u90E8\u9690\u85CF\",\r\n\tresetModelsDefault: \"\u91CD\u7F6E\u9009\u62E9\",\r\n\trequiresCodexImages: \"\u9700\u5148\u5F00\u542F Codex \u51FA\u56FE\u3002\",\r\n\trequiresCodexSignIn: \"\u8BF7\u5148\u767B\u5F55 OpenAI Codex\u3002\",\r\n\trequiresImagineCredential: \"\u8BF7\u5148\u914D\u7F6E\u72EC\u7ACB\u7684 Grok Imagine \u51ED\u636E\u3002\",\r\n\topenCodexAccount: \"\u524D\u5F80 Codex \u8D26\u6237\",\r\n\tfocusCodexImages: \"\u524D\u5F80 Codex \u51FA\u56FE\u5F00\u5173\",\r\n\tfocusImagineCredential: \"\u67E5\u770B Imagine \u51ED\u636E\u72B6\u6001\",\r\n\tgatewaySnippetsTitle: \"\u5FEB\u901F\u914D\u7F6E\u7247\u6BB5\",\r\n\tgatewaySnippetsUnavailable: \"\u8BF7\u5148\u8BFB\u53D6\u771F\u5B9E key\uFF0C\u5E76\u81F3\u5C11\u767B\u5F55\u4E00\u4E2A\u4F9B\u5E94\u5546\uFF1B\u6EE1\u8DB3\u540E\u624D\u4F1A\u663E\u793A\u53EF\u6267\u884C\u914D\u7F6E\u7247\u6BB5\u3002\",\r\n\tgatewaySnippetCurl: \"cURL\",\r\n\tgatewaySnippetPython: \"Python (OpenAI SDK)\",\r\n\tgatewaySnippetIde: \"IDE / \u5BA2\u6237\u7AEF\",\r\n\ttabAccountsSignedIn: \"\u5DF2\u767B\u5F55 {count} \u4E2A\",\r\n\tcoinstallTitle: \"\u5DF2\u7531\u7528\u91CF\u4E2D\u5FC3\u7EDF\u4E00\u7BA1\u7406\",\r\n\tcoinstallSummary: \"\u7528\u91CF\u4E2D\u5FC3\u5F53\u524D\u8D1F\u8D23 OAuth \u8FD0\u884C\u65F6\uFF1B\u5DF2\u6709 {count} \u4E2A\u4F9B\u5E94\u5546\u8D26\u53F7\u767B\u5F55\u3002\",\r\n\tcoinstallOpenHub: \"\u524D\u5F80\u7528\u91CF\u4E2D\u5FC3\",\r\n\ttabGatewayActive: \"\u8FD0\u884C\u4E2D\",\r\n};\r\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["index_exports", "__export", "apply", "inject", "name", "__toCommonJS", "import_react", "import_client", "slotsOf", "context", "slots", "get", "createDshClientAdapter", "candidate", "locale", "diagnostics", "id", "value", "level", "frozenDiagnostics", "errors", "item", "options", "disposed", "installed", "disposeCurrent", "install", "slotContext", "inject", "import_react", "GROK_BUILD_AUTH_STATUS_PATH", "GROK_BUILD_AUTH_LOGIN_PATH", "GROK_BUILD_AUTH_LOGIN_CODE_PATH", "GROK_BUILD_AUTH_LOGIN_CANCEL_PATH", "GROK_BUILD_AUTH_IMPORT_PATH", "GROK_BUILD_AUTH_LOGOUT_PATH", "GROK_BUILD_AUTH_MODELS_PATH", "CODING_OAUTH_STATUS_PATH", "CODING_OAUTH_LOGIN_PATH", "CODING_OAUTH_LOGIN_CODE_PATH", "CODING_OAUTH_LOGIN_CANCEL_PATH", "CODING_OAUTH_LOGOUT_PATH", "CODING_OAUTH_MODELS_PATH", "OAUTH_IMPORT_SOURCES_PATH", "OAUTH_IMPORT_PREVIEW_PATH", "OAUTH_IMPORT_COMMIT_PATH", "OAUTH_IMPORT_CANCEL_PATH", "CAPABILITY_SETTINGS_PATH", "CODEX_USAGE_PATH", "IMAGINE_CREDENTIAL_STATUS_PATH", "GATEWAY_SETTINGS_PATH", "GATEWAY_REVEAL_PATH", "GATEWAY_ROTATE_PATH", "CODING_OAUTH_MANAGEMENT_PATHS", "STATUS_PATH", "CODING_OAUTH_STATUS_PATH", "LOGIN_PATH", "CODING_OAUTH_LOGIN_PATH", "LOGIN_CODE_PATH", "CODING_OAUTH_LOGIN_CODE_PATH", "LOGIN_CANCEL_PATH", "CODING_OAUTH_LOGIN_CANCEL_PATH", "LOGOUT_PATH", "CODING_OAUTH_LOGOUT_PATH", "MODELS_PATH", "CODING_OAUTH_MODELS_PATH", "SOURCES_PATH", "OAUTH_IMPORT_SOURCES_PATH", "SOURCES_PREVIEW_PATH", "OAUTH_IMPORT_PREVIEW_PATH", "SOURCES_COMMIT_PATH", "OAUTH_IMPORT_COMMIT_PATH", "SOURCES_CANCEL_PATH", "OAUTH_IMPORT_CANCEL_PATH", "CAPABILITIES_PATH", "CAPABILITY_SETTINGS_PATH", "CODEX_USAGE_PATH", "IMAGINE_CREDENTIAL_PATH", "IMAGINE_CREDENTIAL_STATUS_PATH", "GATEWAY_PATH", "GATEWAY_SETTINGS_PATH", "GATEWAY_REVEAL_PATH", "GATEWAY_ROTATE_PATH", "POLL_INTERVAL_MS", "HOUR_MS", "SOURCE_KINDS", "SOURCE_REASONS", "SOURCE_CONFLICTS", "SOURCE_PREVIEW_ACTIONS", "SOURCE_COMMIT_ACTIONS", "SOURCE_DEFAULT_PATH", "SOURCE_KIND_KEY", "SOURCE_REASON_KEY", "SOURCE_CONFLICT_KEY", "SOURCE_PREVIEW_ACTION_KEY", "SOURCE_COMMIT_ACTION_KEY", "CAPABILITY_TOGGLES", "CAPABILITY_LIMITS", "IMAGINE_SOURCE_KEY", "PROVIDERS", "SETTINGS_TABS", "GATEWAY_PORT_MIN", "GATEWAY_PORT_MAX", "GATEWAY_RANDOM_PORT_MIN", "GATEWAY_RANDOM_PORT_MAX", "GATEWAY_RANDOM_RESERVED", "CONSUMED_PREVIEW_CODES", "PLUGIN_VERSION", "isRecord", "value", "isPluginRequestError", "error", "isConflictError", "isConsumedPreviewError", "CONSUMED_PREVIEW_CODES", "cancelPreviewTicket", "previewId", "keepalive", "SOURCES_CANCEL_PATH", "jsonRequest", "path", "method", "body", "response", "record", "message", "code", "copyText", "text", "area", "ok", "TRANSITION", "pageStyle", "titleStyle", "bodyStyle", "cardStyle", "rowStyle", "statusStyle", "buttonStyle", "primaryButtonStyle", "compactButtonStyle", "errorStyle", "successStyle", "warningStyle", "tipStyle", "noticeStyle", "codeStyle", "monoStyle", "snippetStyle", "linkStyle", "listStyle", "checkRowStyle", "inputStyle", "nestedStyle", "hintStyle", "visuallyHiddenStyle", "segmentedNavStyle", "segmentedTabStyle", "segmentedTabActiveStyle", "panelStyle", "accountGridStyle", "copyRowStyle", "skeletonStyle", "stepRowStyle", "stepActiveStyle", "stepNumberStyle", "stepNumberActiveStyle", "statusToneColor", "tone", "badgeStyle", "color", "dotStyle", "status", "installed", "providerStatusTone", "import_jsx_runtime", "README_URL", "AboutTab", "t", "cardStyle", "titleStyle", "warningStyle", "bodyStyle", "hintStyle", "PLUGIN_VERSION", "linkStyle", "import_react", "preferredLoginMethod", "definition", "remote", "orderedLoginMethods", "preferred", "rest", "method", "shouldShowPerCardSourceReason", "source", "allOfficialCliMissing", "sources", "anyOfficialCliAvailable", "methodLabel", "options", "import_jsx_runtime", "Badge", "label", "tone", "providerStatus", "installed", "showDot", "resolvedTone", "providerStatusTone", "badgeStyle", "dotStyle", "optionalString", "value", "optionalFiniteNumber", "optionalBoolean", "optionalPercent", "numeric", "isSourceKind", "SOURCE_KINDS", "isSourceReason", "SOURCE_REASONS", "isSourceConflict", "SOURCE_CONFLICTS", "isSourcePreviewAction", "SOURCE_PREVIEW_ACTIONS", "isSourceCommitAction", "SOURCE_COMMIT_ACTIONS", "looksSecret", "safeDisplayPath", "kind", "text", "SOURCE_DEFAULT_PATH", "safeWarning", "formatEpoch", "ms", "formatted", "parseSource", "isRecord", "reasonRaw", "expiresAt", "mergeSources", "discovered", "entry", "parseSources", "rows", "parsePreview", "previewId", "kindRaw", "conflictRaw", "actionRaw", "ticketExpiresAt", "warnings", "parseCommitAction", "action", "boundedInteger", "min", "max", "fallback", "emptyCapabilitySettings", "HOUR_MS", "parseCapabilitySettings", "source", "parseCapabilities", "nested", "revision", "parseUsageWindow", "usedPercent", "remainingPercent", "windowSeconds", "resetsAt", "parseUsageLimit", "fallbackId", "id", "name", "windows", "parseUsage", "payload", "rateLimits", "seen", "add", "limit", "index", "credits", "spend", "resetRaw", "resetCredits", "fetchedAt", "spendControlReached", "creditsBalance", "individualLimit", "individualUsed", "individualRemaining", "individualRemainingPercent", "individualResetsAt", "usageHasVisibleFields", "usage", "parseGateway", "bind", "port", "models", "model", "keyAvailable", "formatGatewayBaseUrl", "randomGatewayPort", "exclude", "attempt", "span", "GATEWAY_RANDOM_PORT_MAX", "GATEWAY_RANDOM_PORT_MIN", "candidate", "GATEWAY_RANDOM_RESERVED", "parseGatewayPort", "GATEWAY_PORT_MIN", "GATEWAY_PORT_MAX", "parseImagineCredential", "configured", "writable", "imagineSourceLabel", "mapped", "IMAGINE_SOURCE_KEY", "modelFields", "status", "import_jsx_runtime", "CliPullPreview", "t", "preview", "confirmOverwrite", "sourcesBusy", "onConfirmOverwriteChange", "onCommit", "onCancel", "expiresAt", "formatEpoch", "ticketExpiresAt", "cardStyle", "bodyStyle", "SOURCE_KIND_KEY", "hintStyle", "monoStyle", "SOURCE_CONFLICT_KEY", "SOURCE_PREVIEW_ACTION_KEY", "listStyle", "warning", "checkRowStyle", "event", "primaryButtonStyle", "buttonStyle", "import_react", "import_jsx_runtime", "NoticeBanner", "message", "dismissLabel", "onDismiss", "autoHideMs", "tone", "timer", "noticeStyle", "bodyStyle", "buttonStyle", "import_react", "import_react", "import_jsx_runtime", "CopyButton", "text", "idleLabel", "copiedLabel", "failedLabel", "primary", "disabled", "state", "setState", "timerRef", "handleClick", "ok", "copyText", "label", "primaryButtonStyle", "compactButtonStyle", "import_jsx_runtime", "barColor", "percent", "ProgressBar", "value", "label", "meta", "clamped", "hintStyle", "import_jsx_runtime", "SignInSteps", "t", "activeMethod", "userCode", "url", "popupBlocked", "hasCode", "hasUrl", "needsPaste", "stepActiveStyle", "stepRowStyle", "stepNumberActiveStyle", "stepNumberStyle", "primaryButtonStyle", "CopyButton", "hintStyle", "codeStyle", "bodyStyle", "ProviderCard", "definition", "providerStatus", "busy", "sourcesBusy", "remote", "codeInput", "expanded", "source", "showUsage", "usage", "usageError", "usageLoading", "onSignIn", "onSignOut", "onCancelLogin", "onSubmitCode", "onCodeChange", "onToggleExpanded", "onPreviewSource", "onSaveModels", "showAltMethods", "setShowAltMethods", "modelFilter", "setModelFilter", "logoutConfirm", "setLogoutConfirm", "logoutTrigger", "logoutConfirmAction", "restoreLogoutFocus", "ordered", "orderedLoginMethods", "primaryMethod", "altMethods", "method", "statusLabel", "available", "selected", "modelFields", "modelDraft", "setModelDraft", "modelDraftDirty", "model", "index", "grokProviderStatus", "showSourceReason", "shouldShowPerCardSourceReason", "filteredModels", "query", "id", "usagePercent", "fetchedAt", "formatEpoch", "cardStyle", "rowStyle", "titleStyle", "monoStyle", "Badge", "nestedStyle", "visuallyHiddenStyle", "buttonStyle", "compactButtonStyle", "current", "methodLabel", "SOURCE_REASON_KEY", "inputStyle", "event", "listStyle", "checked", "checkRowStyle", "usageHasVisibleFields", "ProgressBar", "limit", "window", "used", "resetsAt", "import_jsx_runtime", "AccountsTab", "t", "status", "remote", "remoteTipDismissed", "onDismissRemoteTip", "sources", "sourcesError", "sourcesNotice", "sourcesBusy", "preview", "confirmOverwrite", "busyProvider", "codeInputs", "popupBlocked", "expandedProviders", "showUsage", "usage", "usageError", "usageLoading", "onSignIn", "onSignOut", "onCancelLogin", "onSubmitCode", "onCodeChange", "onToggleExpanded", "onPreviewSource", "onSaveModels", "onConfirmOverwriteChange", "onCommitSource", "onCancelSourcePreview", "onRefreshSources", "onDismissSourcesNotice", "previousPreviewKind", "trigger", "skeletonStyle", "statusStyle", "dotStyle", "NoticeBanner", "allOfficialCliMissing", "anyOfficialCliAvailable", "hintStyle", "bodyStyle", "accountGridStyle", "PROVIDERS", "definition", "providerStatus", "expanded", "ProviderCard", "entry", "method", "value", "selected", "CliPullPreview", "cardStyle", "rowStyle", "titleStyle", "monoStyle", "Badge", "import_jsx_runtime", "trackStyle", "checked", "disabled", "TRANSITION", "thumbStyle", "ToggleSwitch", "onChange", "ariaLabel", "ariaDescribedBy", "id", "import_jsx_runtime", "CapabilitiesTab", "t", "capabilities", "capabilitiesError", "capabilitiesBusy", "imagine", "imagineError", "codexSignedIn", "onRetry", "onOpenAccounts", "onFocusDependency", "onPatchCapability", "codexToggles", "CAPABILITY_TOGGLES", "item", "imagineToggles", "cardStyle", "titleStyle", "bodyStyle", "nestedStyle", "errorStyle", "buttonStyle", "skeletonStyle", "statusStyle", "dotStyle", "Badge", "hintStyle", "imagineSourceLabel", "listStyle", "checked", "imagesOff", "dependencyReason", "disabled", "switchId", "repairAction", "rowStyle", "ToggleSwitch", "next", "CAPABILITY_LIMITS", "displayValue", "inputId", "inputStyle", "event", "target", "apiValue", "saved", "import_react", "buildGatewaySnippets", "openAiBaseUrl", "anthropicBaseUrl", "apiKeyPlaceholder", "model", "key", "import_jsx_runtime", "SNIPPET_TABS", "GatewayTab", "t", "gateway", "gatewayError", "gatewayBusy", "gatewayOnceKey", "gatewayKeyVisible", "gatewayRotateConfirm", "gatewayRevealError", "portDraft", "copiedField", "copyFailedField", "onEnabledChange", "onRetry", "onPortDraftChange", "onApplyPort", "onRandomPort", "onCopyKey", "onToggleKeyVisible", "onRotateConfirm", "onRotateCancel", "onRotate", "enableConfirm", "setEnableConfirm", "activeSnippet", "setActiveSnippet", "enableConfirmAction", "rotateTrigger", "rotateConfirmAction", "restoreEnableFocus", "restoreRotateFocus", "portValid", "parseGatewayPort", "portChanged", "snippets", "openAi", "formatGatewayBaseUrl", "anthropic", "buildGatewaySnippets", "copyLabel", "field", "idle", "focusSnippetTab", "index", "tab", "onSnippetKeyDown", "event", "current", "openAiUrl", "anthropicUrl", "cardStyle", "titleStyle", "bodyStyle", "warningStyle", "hintStyle", "errorStyle", "skeletonStyle", "statusStyle", "dotStyle", "nestedStyle", "buttonStyle", "Badge", "primaryButtonStyle", "ToggleSwitch", "enabled", "GATEWAY_PORT_MIN", "GATEWAY_PORT_MAX", "inputStyle", "randomGatewayPort", "copyRowStyle", "monoStyle", "CopyButton", "segmentedNavStyle", "selected", "segmentedTabActiveStyle", "segmentedTabStyle", "snippetStyle", "import_jsx_runtime", "SettingsTabs", "t", "activeTab", "onChange", "hints", "hintFor", "id", "entry", "focusTab", "index", "tab", "SETTINGS_TABS", "onKeyDown", "event", "current", "segmentedNavStyle", "selected", "suffix", "label", "segmentedTabActiveStyle", "segmentedTabStyle", "STYLE_ID", "CSS", "injected", "ensureMicroStyles", "style", "import_jsx_runtime", "REMOTE_TIP_STORAGE_KEY", "readRemoteTipDismissed", "GrokBuildSettings", "t", "status", "setStatus", "requestError", "setRequestError", "busyProvider", "setBusyProvider", "codeInputs", "setCodeInputs", "popupBlocked", "setPopupBlocked", "sources", "setSources", "sourcesError", "setSourcesError", "sourcesBusy", "setSourcesBusy", "preview", "setPreview", "previewRef", "previewEpochRef", "mountedRef", "confirmOverwrite", "setConfirmOverwrite", "sourcesNotice", "setSourcesNotice", "capabilities", "setCapabilities", "capabilitiesError", "setCapabilitiesError", "capabilitiesBusy", "setCapabilitiesBusy", "capabilitiesLoaded", "setCapabilitiesLoaded", "usage", "setUsage", "usageError", "setUsageError", "usageLoading", "setUsageLoading", "imagine", "setImagine", "imagineError", "setImagineError", "gateway", "setGateway", "gatewayError", "setGatewayError", "gatewayBusy", "setGatewayBusy", "gatewayLoaded", "setGatewayLoaded", "gatewayOnceKey", "setGatewayOnceKey", "gatewayKeyVisible", "setGatewayKeyVisible", "gatewayRotateConfirm", "setGatewayRotateConfirm", "gatewayRevealError", "setGatewayRevealError", "portDraft", "setPortDraft", "activeTab", "setActiveTab", "copiedField", "setCopiedField", "copyFailedField", "setCopyFailedField", "expandedProviders", "setExpandedProviders", "remoteTipDismissed", "setRemoteTipDismissed", "copiedTimerRef", "remote", "refresh", "next", "jsonRequest", "STATUS_PATH", "error", "refreshSources", "parseSources", "SOURCES_PATH", "mergeSources", "refreshCapabilities", "parsed", "parseCapabilities", "CAPABILITIES_PATH", "emptyCapabilitySettings", "refreshGateway", "parseGateway", "GATEWAY_PATH", "refreshImagine", "parseImagineCredential", "IMAGINE_CREDENTIAL_PATH", "refreshUsage", "parseUsage", "CODEX_USAGE_PATH", "ensureMicroStyles", "active", "timer", "cancelPreviewTicket", "provider", "POLL_INTERVAL_MS", "signedIn", "signIn", "method", "popup", "current", "challenge", "LOGIN_PATH", "submitCode", "code", "LOGIN_CODE_PATH", "cancelLogin", "LOGIN_CANCEL_PATH", "signOut", "LOGOUT_PATH", "saveModels", "selected", "MODELS_PATH", "previewSource", "kind", "epoch", "previous", "parsePreview", "SOURCES_PREVIEW_PATH", "commitSource", "result", "SOURCES_COMMIT_PATH", "action", "parseCommitAction", "SOURCE_COMMIT_ACTION_KEY", "isConsumedPreviewError", "cancelSourcePreview", "previewId", "SOURCES_CANCEL_PATH", "patchCapability", "key", "value", "patch", "updated", "isConflictError", "showUsage", "signedInCount", "tabHints", "hints", "markCopied", "field", "handleCopy", "text", "copyText", "ensureGatewayKey", "GATEWAY_REVEAL_PATH", "copyGatewayKey", "toggleGatewayKeyVisible", "applyGatewayPort", "port", "parseGatewayPort", "rotateGatewayKey", "GATEWAY_ROTATE_PATH", "setGatewayEnabled", "enabled", "dismissRemoteTip", "openAccountsForCodex", "focusCapabilityDependency", "target", "id", "pageStyle", "titleStyle", "bodyStyle", "buttonStyle", "errorStyle", "SettingsTabs", "panelStyle", "AccountsTab", "slug", "CapabilitiesTab", "GatewayTab", "AboutTab", "en", "zh", "import_jsx_runtime", "name", "inject", "IndependentSettingsEntry", "t", "open", "setOpen", "trigger", "closeButton", "dialog", "host", "inertSiblings", "element", "focusable", "closeOnEscape", "event", "targets", "first", "last", "hadInert", "value", "GrokBuildSettings", "mountIndependentEntry", "root", "apply", "ctx", "dsh", "createDshClientAdapter", "namespace", "zh", "en", "slots"]
|
|
7
7
|
}
|