@eddyskywalker/dsh-chatgpt-subscription 0.2.21 → 0.3.1
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 +100 -0
- package/README.md +115 -1
- package/lib/client.js +2831 -512
- package/lib/client.js.map +1 -1
- package/lib/index.js +9092 -389
- package/lib/types/client/ProviderHubSection.d.ts +15 -0
- package/lib/types/client/ProviderHubSection.d.ts.map +1 -0
- package/lib/types/client/command-code/CommandCodeComposerQuota.d.ts +24 -0
- package/lib/types/client/command-code/CommandCodeComposerQuota.d.ts.map +1 -0
- package/lib/types/client/command-code/CommandCodeSection.d.ts +11 -0
- package/lib/types/client/command-code/CommandCodeSection.d.ts.map +1 -0
- package/lib/types/client/command-code/locales.d.ts +401 -0
- package/lib/types/client/command-code/locales.d.ts.map +1 -0
- package/lib/types/client/index.d.ts +2 -0
- package/lib/types/client/index.d.ts.map +1 -1
- package/lib/types/client/kimi-code/KimiCodeComposerQuota.d.ts +25 -0
- package/lib/types/client/kimi-code/KimiCodeComposerQuota.d.ts.map +1 -0
- package/lib/types/client/kimi-code/KimiCodeSection.d.ts +11 -0
- package/lib/types/client/kimi-code/KimiCodeSection.d.ts.map +1 -0
- package/lib/types/client/kimi-code/KimiModelCapabilities.d.ts +16 -0
- package/lib/types/client/kimi-code/KimiModelCapabilities.d.ts.map +1 -0
- package/lib/types/client/kimi-code/locales.d.ts +671 -0
- package/lib/types/client/kimi-code/locales.d.ts.map +1 -0
- package/lib/types/client/kimi-code/styles.d.ts +4 -0
- package/lib/types/client/kimi-code/styles.d.ts.map +1 -0
- package/lib/types/client/locales.d.ts +3 -1
- package/lib/types/client/locales.d.ts.map +1 -1
- package/lib/types/client/styles.d.ts.map +1 -1
- package/lib/types/host/command-code/adapter.d.ts +34 -0
- package/lib/types/host/command-code/adapter.d.ts.map +1 -0
- package/lib/types/host/command-code/client.d.ts +99 -0
- package/lib/types/host/command-code/client.d.ts.map +1 -0
- package/lib/types/host/command-code/mapper.d.ts +102 -0
- package/lib/types/host/command-code/mapper.d.ts.map +1 -0
- package/lib/types/host/command-code/model-catalog.d.ts +31 -0
- package/lib/types/host/command-code/model-catalog.d.ts.map +1 -0
- package/lib/types/host/command-code/oauth.d.ts +89 -0
- package/lib/types/host/command-code/oauth.d.ts.map +1 -0
- package/lib/types/host/command-code/plans.d.ts +40 -0
- package/lib/types/host/command-code/plans.d.ts.map +1 -0
- package/lib/types/host/command-code/routes.d.ts +27 -0
- package/lib/types/host/command-code/routes.d.ts.map +1 -0
- package/lib/types/host/command-code/token-store.d.ts +88 -0
- package/lib/types/host/command-code/token-store.d.ts.map +1 -0
- package/lib/types/host/command-code/types.d.ts +138 -0
- package/lib/types/host/command-code/types.d.ts.map +1 -0
- package/lib/types/host/kimi-code/adapter.d.ts +112 -0
- package/lib/types/host/kimi-code/adapter.d.ts.map +1 -0
- package/lib/types/host/kimi-code/client.d.ts +173 -0
- package/lib/types/host/kimi-code/client.d.ts.map +1 -0
- package/lib/types/host/kimi-code/mapper.d.ts +370 -0
- package/lib/types/host/kimi-code/mapper.d.ts.map +1 -0
- package/lib/types/host/kimi-code/modalities.d.ts +94 -0
- package/lib/types/host/kimi-code/modalities.d.ts.map +1 -0
- package/lib/types/host/kimi-code/model-catalog.d.ts +77 -0
- package/lib/types/host/kimi-code/model-catalog.d.ts.map +1 -0
- package/lib/types/host/kimi-code/oauth.d.ts +133 -0
- package/lib/types/host/kimi-code/oauth.d.ts.map +1 -0
- package/lib/types/host/kimi-code/routes.d.ts +26 -0
- package/lib/types/host/kimi-code/routes.d.ts.map +1 -0
- package/lib/types/host/kimi-code/token-store.d.ts +135 -0
- package/lib/types/host/kimi-code/token-store.d.ts.map +1 -0
- package/lib/types/host/kimi-code/types.d.ts +174 -0
- package/lib/types/host/kimi-code/types.d.ts.map +1 -0
- package/lib/types/host/kimi-code/video-store.d.ts +99 -0
- package/lib/types/host/kimi-code/video-store.d.ts.map +1 -0
- package/lib/types/host/kimi-code/video-tool.d.ts +25 -0
- package/lib/types/host/kimi-code/video-tool.d.ts.map +1 -0
- package/lib/types/host/relay-probe.d.ts +161 -0
- package/lib/types/host/relay-probe.d.ts.map +1 -0
- package/lib/types/host/responses-client.d.ts.map +1 -1
- package/lib/types/index.d.ts +13 -0
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/shared/command-code-contracts.d.ts +119 -0
- package/lib/types/shared/command-code-contracts.d.ts.map +1 -0
- package/lib/types/shared/kimi-code-contracts.d.ts +203 -0
- package/lib/types/shared/kimi-code-contracts.d.ts.map +1 -0
- package/package.json +1 -1
package/lib/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","names":["useStore","formatPercent","formatDate","formatCapacity","parsePositiveCapacity","zh","en","dictionaries","STYLE_ID","API","fetchApi","dictionaries","antigravityDicts"],"sources":["../src/compat.ts","../src/client/quota.ts","../src/client/CodexComposerQuota.tsx","../src/client/CodexImageToolView.tsx","../src/shared/model-catalog.ts","../src/client/api.ts","../src/client/CodexSubscriptionSection.tsx","../src/client/locales.ts","../src/client/styles.ts","../src/client/antigravity/locales.ts","../src/client/antigravity/AntigravitySection.tsx","../src/client/antigravity/styles.ts","../src/client/antigravity/AntigravityComposerQuota.tsx","../src/client/mermaid/sanitize.ts","../src/client/mermaid/styles.ts","../src/client/mermaid/renderer.ts","../src/client/index.tsx"],"sourcesContent":["/**\n * Compatibility constants for the ChatGPT-backed Codex flow. The backend and\n * OAuth parameters are not a public third-party API contract, so every such\n * value is isolated here for review and rollback.\n */\nexport const CHATGPT_OAUTH_ISSUER = 'https://auth.openai.com' as const\nexport const CHATGPT_OAUTH_CLIENT_ID = 'app_EMoamEEZ73f0CkXaXp7hrann' as const\nexport const OAUTH_CALLBACK_HOST = 'localhost' as const\nexport const OAUTH_CALLBACK_PORT = 1455 as const\nexport const OAUTH_CALLBACK_PATH = '/auth/callback' as const\nexport const OAUTH_REDIRECT_URI = `http://${OAUTH_CALLBACK_HOST}:${OAUTH_CALLBACK_PORT}${OAUTH_CALLBACK_PATH}` as const\nexport const OAUTH_SCOPE = 'openid profile email offline_access' as const\nexport const OAUTH_ORIGINATOR = 'opencode' as const\nexport const OAUTH_LOGIN_TIMEOUT_MS = 5 * 60_000\nexport const TOKEN_REFRESH_MARGIN_MS = 60_000\nexport const ROUTE_PREFIX = '/api/dsh-chatgpt-subscription' as const\nexport const PLUGIN_VERSION = '0.1.0-alpha.0' as const\nexport const CODEX_CHATGPT_PROVIDER_ID = 'codex-chatgpt' as const\n\nexport const CODEX_API_BASE = 'https://chatgpt.com/backend-api/codex' as const\nexport const CODEX_RESPONSES_URL = `${CODEX_API_BASE}/responses` as const\nexport const CODEX_IMAGE_GENERATION_URL = `${CODEX_API_BASE}/images/generations` as const\nexport const CODEX_SEARCH_URL = `${CODEX_API_BASE}/alpha/search` as const\nexport const CODEX_USAGE_URL = 'https://chatgpt.com/backend-api/wham/usage' as const\nexport const CODEX_RESET_CREDITS_URL = 'https://chatgpt.com/backend-api/wham/rate-limit-reset-credits' as const\nexport const CODEX_RESET_CREDITS_CONSUME_URL = `${CODEX_RESET_CREDITS_URL}/consume` as const\nexport const CODEX_ORIGINATOR = 'opencode' as const\nexport const CODEX_ENHANCED_ORIGINATOR = 'pi' as const\nexport const CODEX_IMAGE_TOOL_NAME = 'codex_image_generate' as const\nexport const CODEX_IMAGE_MODEL = 'gpt-image-2' as const\nexport const CODEX_SEARCH_PROVIDER_ID = 'codex-subscription' as const\nexport const CODEX_FETCH_PROVIDER_ID = 'codex-subscription' as const\nexport const QUOTA_CACHE_MS = 60_000\nexport const QUOTA_MIN_UPSTREAM_INTERVAL_MS = 15_000\n\nexport const OAUTH_AUTHORIZE_URL = `${CHATGPT_OAUTH_ISSUER}/oauth/authorize` as const\nexport const OAUTH_TOKEN_URL = `${CHATGPT_OAUTH_ISSUER}/oauth/token` as const\n","import type { QuotaBucketDto, QuotaStatusDto, QuotaWindowDto } from '../shared/contracts.ts'\n\nexport interface SelectedQuotaWindow {\n bucket: QuotaBucketDto\n window: QuotaWindowDto\n remainingPercent: number\n}\n\nexport function selectQuotaForModel(quota: QuotaStatusDto | undefined, modelId: string | undefined): SelectedQuotaWindow | null {\n if (quota === undefined || quota.buckets.length === 0) return null\n const model = modelId?.toLowerCase() ?? ''\n const wantsSpark = model.includes('spark')\n const bucket = wantsSpark\n ? quota.buckets.find(candidate => `${candidate.id} ${candidate.name}`.toLowerCase().includes('spark'))\n : quota.buckets.find(candidate => candidate.id === 'codex')\n ?? quota.buckets.find(candidate => candidate.name.toLowerCase() === 'codex')\n if (bucket === undefined) return null\n const windows = quotaWindows(bucket)\n if (windows.length === 0) return null\n // 优先选取 5h 等短周期额度(按 windowDurationMins 升序排序),没有短周期时选取周额度\n const sorted = [...windows].sort((a, b) => {\n const durA = a.windowDurationMins ?? Infinity\n const durB = b.windowDurationMins ?? Infinity\n return durA - durB\n })\n const window = sorted[0]!\n return {\n bucket,\n window,\n remainingPercent: Math.max(0, 100 - window.usedPercent),\n }\n}\n\nexport function quotaWindows(bucket: QuotaBucketDto): QuotaWindowDto[] {\n if (bucket.windows.length > 0) return bucket.windows\n return [bucket.primary, bucket.secondary].filter((window): window is QuotaWindowDto => window !== null)\n}\n","import { useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react'\nimport type { SnapshotStore } from '@deepseek-ai/dsh-client-runtime/client'\nimport type { ModelDirectoryState } from '@deepseek-ai/dsh-client-ui-model-selection/client'\nimport type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport { CODEX_CHATGPT_PROVIDER_ID } from '../compat.ts'\nimport type { PluginStatusDto } from '../shared/contracts.ts'\nimport { SubscriptionApi } from './api.ts'\nimport { NS } from './locales.ts'\nimport { selectQuotaForModel } from './quota.ts'\n\ntype Props = PropsRuntime<'conversation.input.right'> & PropsLocale<typeof NS> & {\n api: SubscriptionApi\n directory: SnapshotStore<ModelDirectoryState>\n loadModelDirectory: () => void\n}\n\nexport function CodexComposerQuota({ api, directory, loadModelDirectory, t }: Props): React.JSX.Element | null {\n const modelState = useStore(directory)\n const [status, setStatus] = useState<PluginStatusDto | null>(null)\n const [loading, setLoading] = useState(false)\n const mountedRef = useRef(false)\n const selected = modelState.current\n const isCodex = selected?.provider === CODEX_CHATGPT_PROVIDER_ID\n\n useEffect(() => {\n loadModelDirectory()\n }, [loadModelDirectory])\n\n useEffect(() => {\n mountedRef.current = true\n return () => {\n mountedRef.current = false\n }\n }, [])\n\n useEffect(() => {\n if (!isCodex) return\n let disposed = false\n const refresh = async (): Promise<void> => {\n setLoading(true)\n try {\n const next = await api.status()\n if (!disposed && mountedRef.current) setStatus(next)\n } catch {\n if (!disposed && mountedRef.current) setStatus(null)\n } finally {\n if (!disposed && mountedRef.current) setLoading(false)\n }\n }\n void refresh()\n const timer = window.setInterval(() => {\n if (document.visibilityState === 'visible') void refresh()\n }, 60_000)\n return () => {\n disposed = true\n window.clearInterval(timer)\n }\n }, [api, isCodex])\n\n const quota = useMemo(() => selectQuotaForModel(status?.quota, selected?.model), [selected?.model, status?.quota])\n if (!isCodex || status?.preferences.quickQuotaVisible !== true) return null\n const level = quota === null\n ? 'normal'\n : quota.remainingPercent <= 5\n ? 'danger'\n : quota.remainingPercent <= 20\n ? 'warning'\n : 'normal'\n return <span className=\"dsh-codex-composer-quota\" data-level={level} aria-label={quota === null ? t('quickQuotaLoading') : `${t('quickQuotaLabel')}: ${formatPercent(quota.remainingPercent)}`}>\n <span>{t('quickQuotaLabel')}</span>\n <strong>{quota === null ? (loading ? t('quickQuotaLoading') : '—') : formatPercent(quota.remainingPercent)}</strong>\n </span>\n}\n\nfunction useStore<T>(store: SnapshotStore<T>): T {\n return useSyncExternalStore(\n (listener) => store.subscribe(listener),\n () => store.getSnapshot(),\n () => store.getSnapshot(),\n )\n}\n\nfunction formatPercent(value: number): string {\n return `${new Intl.NumberFormat(undefined, { maximumFractionDigits: 0 }).format(value)}%`\n}\n","import { useEffect, useState } from 'react'\nimport type { ImageAttachmentRef } from '@deepseek-ai/dsh-attachment'\nimport type { ContentBlock } from '@deepseek-ai/dsh-client-connection/client'\nimport type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport { NS } from './locales.ts'\n\nexport type ImageLoader = (attachment: ImageAttachmentRef) => Promise<string>\n\ntype Props = PropsRuntime<'tool.call.toolview'> & PropsLocale<typeof NS> & {\n loadImage: ImageLoader\n}\n\nexport function CodexImageToolView({ block, loadImage, t }: Props): React.JSX.Element {\n const settled = 'kind' in block\n const isError = settled ? block.isError : false\n const prompt = promptFromBlock(block)\n const images = settled && !isError ? imageBlocks(block.content) : []\n const label = isError ? t('imageToolFailed') : settled ? t('imageToolDone') : t('imageToolRunning')\n const summary = prompt ?? textSummary(settled ? block.content : [])\n return <div className=\"dsh-codex-image-tool\" data-state={isError ? 'error' : settled ? 'done' : 'running'}>\n <div className=\"dsh-codex-image-tool-head\">\n <span className=\"dsh-codex-image-dot\" aria-hidden=\"true\" />\n <span className=\"dsh-codex-image-title\">{label}</span>\n {summary !== null ? <span className=\"dsh-codex-image-summary\">{summary}</span> : null}\n </div>\n {images.length > 0 ? <div className=\"dsh-codex-image-grid\">\n {images.map((attachment) => <GeneratedImage key={String(attachment.attachmentId)} attachment={attachment} load={loadImage} label={attachment.name ?? t('image')} t={t} />)}\n </div> : null}\n </div>\n}\n\nfunction GeneratedImage({ attachment, load, label, t }: {\n attachment: ImageAttachmentRef\n load: ImageLoader\n label: string\n t: Props['t']\n}): React.JSX.Element {\n const [src, setSrc] = useState<string | null>(null)\n const [failed, setFailed] = useState(false)\n useEffect(() => {\n let disposed = false\n setSrc(null)\n setFailed(false)\n load(attachment).then((url) => {\n if (!disposed) setSrc(url)\n }, () => {\n if (!disposed) setFailed(true)\n })\n return () => {\n disposed = true\n }\n }, [attachment, load])\n if (failed) return <span className=\"dsh-codex-image-failed\">{t('imageLoadFailed')}</span>\n if (src === null) return <span className=\"dsh-codex-image-loading\">{t('imageLoading')}</span>\n return <img className=\"dsh-codex-image-preview\" src={src} alt={label} />\n}\n\nfunction promptFromBlock(block: Props['block']): string | null {\n const raw = 'kind' in block ? block.call?.argsRaw : block.argsRaw\n if (typeof raw !== 'string' || raw.trim() === '') return null\n try {\n const value = JSON.parse(raw) as unknown\n return typeof value === 'object'\n && value !== null\n && !Array.isArray(value)\n && typeof (value as { prompt?: unknown }).prompt === 'string'\n ? (value as { prompt: string }).prompt\n : null\n } catch {\n return null\n }\n}\n\nfunction imageBlocks(blocks: readonly ContentBlock[]): ImageAttachmentRef[] {\n const result: ImageAttachmentRef[] = []\n for (const block of blocks) {\n if (block.type === 'image') result.push(block.attachment)\n if (block.type === 'tool-result') result.push(...imageBlocks(block.content))\n }\n return result\n}\n\nfunction textSummary(blocks: readonly ContentBlock[]): string | null {\n const text = blocks\n .map((block) => block.type === 'text' || block.type === 'reasoning' ? block.text : '')\n .filter(Boolean)\n .join(' ')\n .trim()\n return text === '' ? null : text\n}\n","export type CodexModelModality = 'text' | 'image'\n\nexport const GPT_56_MAX_CONTEXT_WINDOW = 1_000_000\n// Codex subscription limit from the model catalog; the public API has a different limit.\nexport const GPT_6_ASTRA_MAX_CONTEXT_WINDOW = 872_000\n\nexport interface CodexModelCatalogEntry {\n id: string\n name: string\n contextWindow: number\n inputModalities: readonly CodexModelModality[]\n defaultReasoningEffort: string\n reasoningProfile: 'standard' | 'gpt-5.6' | 'gpt-6-astra'\n supportsReasoningSummary: boolean\n fallbackModelId?: string\n}\n\nexport const CODEX_MODEL_CATALOG = [\n {\n id: 'gpt-5.6-sol',\n name: '5.6 Sol',\n contextWindow: 272_000,\n inputModalities: ['text', 'image'],\n defaultReasoningEffort: 'medium',\n reasoningProfile: 'gpt-5.6',\n supportsReasoningSummary: true,\n fallbackModelId: 'gpt-5.6-terra',\n },\n {\n id: 'gpt-6-astra',\n name: '6 Astra',\n contextWindow: 272_000,\n inputModalities: ['text', 'image'],\n defaultReasoningEffort: 'medium',\n reasoningProfile: 'gpt-6-astra',\n supportsReasoningSummary: true,\n },\n {\n id: 'gpt-5.6-terra',\n name: '5.6 Terra',\n contextWindow: 272_000,\n inputModalities: ['text', 'image'],\n defaultReasoningEffort: 'medium',\n reasoningProfile: 'gpt-5.6',\n supportsReasoningSummary: true,\n fallbackModelId: 'gpt-5.5',\n },\n {\n id: 'gpt-5.6-luna',\n name: '5.6 Luna',\n contextWindow: 272_000,\n inputModalities: ['text', 'image'],\n defaultReasoningEffort: 'medium',\n reasoningProfile: 'gpt-5.6',\n supportsReasoningSummary: true,\n fallbackModelId: 'gpt-5.5',\n },\n {\n id: 'gpt-5.5',\n name: '5.5',\n contextWindow: 272_000,\n inputModalities: ['text', 'image'],\n defaultReasoningEffort: 'medium',\n reasoningProfile: 'standard',\n supportsReasoningSummary: true,\n },\n {\n id: 'gpt-5.4',\n name: '5.4',\n contextWindow: 272_000,\n inputModalities: ['text', 'image'],\n defaultReasoningEffort: 'none',\n reasoningProfile: 'standard',\n supportsReasoningSummary: true,\n fallbackModelId: 'gpt-5.4-mini',\n },\n {\n id: 'gpt-5.4-mini',\n name: '5.4 Mini',\n contextWindow: 272_000,\n inputModalities: ['text', 'image'],\n defaultReasoningEffort: 'none',\n reasoningProfile: 'standard',\n supportsReasoningSummary: true,\n },\n {\n id: 'gpt-5.3-codex-spark',\n name: '5.3 Codex Spark',\n contextWindow: 258_000,\n inputModalities: ['text'],\n defaultReasoningEffort: 'high',\n reasoningProfile: 'standard',\n supportsReasoningSummary: false,\n },\n] as const satisfies readonly CodexModelCatalogEntry[]\n\nexport type CodexModelId = typeof CODEX_MODEL_CATALOG[number]['id']\n\nexport const DEFAULT_VISIBLE_CODEX_MODEL_IDS = [\n 'gpt-5.6-sol',\n 'gpt-6-astra',\n 'gpt-5.6-terra',\n 'gpt-5.6-luna',\n] as const satisfies readonly CodexModelId[]\n\nexport const DEFAULT_CODEX_MODEL = CODEX_MODEL_CATALOG[0]\n\nexport const CONFIGURABLE_CONTEXT_MODEL_IDS = [\n 'gpt-6-astra',\n 'gpt-5.6-sol',\n 'gpt-5.6-terra',\n 'gpt-5.6-luna',\n] as const satisfies readonly CodexModelId[]\n\nexport type ConfigurableContextModelId = typeof CONFIGURABLE_CONTEXT_MODEL_IDS[number]\n\nexport const STANDARD_REASONING_EFFORTS = ['none', 'low', 'medium', 'high', 'xhigh'] as const\nexport const GPT_56_REASONING_EFFORTS = [...STANDARD_REASONING_EFFORTS, 'max'] as const\n// Ultra in Codex also controls subagent orchestration; expose the Responses efforts here.\nexport const GPT_6_ASTRA_REASONING_EFFORTS = ['low', 'medium', 'high', 'xhigh', 'max'] as const\nexport type CodexReasoningEffort = typeof GPT_56_REASONING_EFFORTS[number]\n\nexport function reasoningEffortsForModel(model: string): readonly CodexReasoningEffort[] {\n const profile = resolveCodexCatalogEntry(model).reasoningProfile\n if (profile === 'gpt-6-astra') return GPT_6_ASTRA_REASONING_EFFORTS\n return profile === 'gpt-5.6'\n ? GPT_56_REASONING_EFFORTS\n : STANDARD_REASONING_EFFORTS\n}\n\nexport function isCodexReasoningEffort(value: unknown): value is CodexReasoningEffort {\n return typeof value === 'string' && GPT_56_REASONING_EFFORTS.some((effort) => effort === value)\n}\n\nexport function modelSupportsReasoningEffort(model: string, effort: unknown): effort is CodexReasoningEffort {\n return isCodexReasoningEffort(effort) && reasoningEffortsForModel(model).some((candidate) => candidate === effort)\n}\n\nexport function isCodexModelId(model: unknown): model is CodexModelId {\n return typeof model === 'string' && CODEX_MODEL_CATALOG.some((entry) => entry.id === model)\n}\n\nexport function isConfigurableContextModelId(model: unknown): model is ConfigurableContextModelId {\n return typeof model === 'string' && CONFIGURABLE_CONTEXT_MODEL_IDS.some((id) => id === model)\n}\n\nexport function contextWindowLimitForModel(model: ConfigurableContextModelId): number {\n return model === 'gpt-6-astra' ? GPT_6_ASTRA_MAX_CONTEXT_WINDOW : GPT_56_MAX_CONTEXT_WINDOW\n}\n\nexport function resolveCodexCatalogEntry(model: string): CodexModelCatalogEntry {\n return CODEX_MODEL_CATALOG.find((entry) => entry.id === model) ?? DEFAULT_CODEX_MODEL\n}\n\nexport function codexModelSupportsImageInput(model: string): boolean {\n return resolveCodexCatalogEntry(model).inputModalities.includes('image')\n}\n\nexport function codexModelSupportsReasoningSummary(model: string): boolean {\n return resolveCodexCatalogEntry(model).supportsReasoningSummary\n}\n\nexport function resolveCodexFallbackModel(model: string): CodexModelCatalogEntry | undefined {\n const entry = resolveCodexCatalogEntry(model)\n if (!entry.fallbackModelId) return undefined\n return CODEX_MODEL_CATALOG.find((cand) => cand.id === entry.fallbackModelId)\n}\n","import { ROUTE_PREFIX } from '../compat.ts'\nimport type {\n ApiEnvelope,\n LoginEventDto,\n LoginStartDto,\n PluginStatusDto,\n QuotaStatusDto,\n ConnectionTestDto,\n SubscriptionPreferencesDto,\n SubscriptionPreferencesUpdateDto,\n} from '../shared/contracts.ts'\n\nexport class SubscriptionApi {\n status(): Promise<PluginStatusDto> {\n return request<PluginStatusDto>(`${ROUTE_PREFIX}/status`)\n }\n\n startLogin(): Promise<LoginStartDto> {\n return post<LoginStartDto>(`${ROUTE_PREFIX}/login/start`, {})\n }\n\n cancelLogin(loginId: string): Promise<{ cancelled: boolean }> {\n return post(`${ROUTE_PREFIX}/login/cancel`, { loginId })\n }\n\n logout(): Promise<{ authenticated: false }> {\n return post(`${ROUTE_PREFIX}/logout`, {})\n }\n\n refresh(): Promise<PluginStatusDto> {\n return post(`${ROUTE_PREFIX}/token/refresh`, {})\n }\n\n refreshQuota(): Promise<QuotaStatusDto> {\n return post(`${ROUTE_PREFIX}/quota/refresh`, {})\n }\n\n useResetCredit(): Promise<QuotaStatusDto> {\n return post(`${ROUTE_PREFIX}/quota/reset-credit/use`, {})\n }\n\n testConnection(): Promise<ConnectionTestDto> {\n return post(`${ROUTE_PREFIX}/connection/test`, {})\n }\n\n updatePreferences(patch: SubscriptionPreferencesUpdateDto): Promise<SubscriptionPreferencesDto> {\n return post(`${ROUTE_PREFIX}/preferences/update`, patch)\n }\n\n events(loginId: string): EventSource {\n return new EventSource(`${ROUTE_PREFIX}/login/events?loginId=${encodeURIComponent(loginId)}`)\n }\n}\n\nasync function post<T>(url: string, body: object): Promise<T> {\n return request<T>(url, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(body),\n })\n}\n\nasync function request<T>(url: string, init?: RequestInit): Promise<T> {\n const response = await fetch(url, { ...init, credentials: 'same-origin' })\n const envelope = await response.json() as ApiEnvelope<T>\n if (!response.ok || !envelope.ok) {\n throw new Error(envelope.ok ? `Request failed (${response.status})` : envelope.error.message)\n }\n return envelope.value\n}\n\nexport function parseLoginEvent(event: MessageEvent<string>): LoginEventDto | null {\n try {\n const value = JSON.parse(event.data) as LoginEventDto\n return typeof value === 'object' && value !== null && typeof value.type === 'string' ? value : null\n } catch {\n return null\n }\n}\n","import { useCallback, useEffect, useRef, useState } from 'react'\nimport type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { CodexReasoningSummary, CredentialStorageDto, PluginStatusDto, QuotaBucketDto, QuotaWindowDto, SearchProviderPreference, SubscriptionPreferencesUpdateDto } from '../shared/contracts.ts'\nimport { CODEX_MODEL_CATALOG, CONFIGURABLE_CONTEXT_MODEL_IDS, DEFAULT_VISIBLE_CODEX_MODEL_IDS, GPT_56_MAX_CONTEXT_WINDOW, contextWindowLimitForModel, resolveCodexCatalogEntry } from '../shared/model-catalog.ts'\nimport { SubscriptionApi, parseLoginEvent } from './api.ts'\nimport { NS } from './locales.ts'\nimport { quotaWindows } from './quota.ts'\n\ntype Props = PropsRuntime<'settings.section'> & PropsLocale<typeof NS>\ntype BusyAction = 'login' | 'token' | 'quota' | 'reset-credit' | 'test' | 'logout' | 'preferences' | null\ntype Translate = Props['t']\n\nexport function CodexSubscriptionSection({ t }: Props): React.JSX.Element {\n const apiRef = useRef(new SubscriptionApi())\n const eventSourceRef = useRef<EventSource | null>(null)\n const [status, setStatus] = useState<PluginStatusDto | null>(null)\n const [busy, setBusy] = useState<BusyAction>(null)\n const [error, setError] = useState<string | null>(null)\n const [authUrl, setAuthUrl] = useState<string | null>(null)\n const [popupBlocked, setPopupBlocked] = useState(false)\n const [resetCreditNotice, setResetCreditNotice] = useState<string | null>(null)\n const [connection, setConnection] = useState<{ latencyMs: number; checkedAt: number } | null>(null)\n const [contextDrafts, setContextDrafts] = useState<Record<string, string>>({})\n const [customProxyDraft, setCustomProxyDraft] = useState<string | null>(null)\n\n const load = useCallback(async (quiet = false) => {\n if (!quiet) setError(null)\n try {\n const next = await apiRef.current.status()\n setStatus(next)\n if (next.error !== undefined) setError(next.error.message)\n } catch (cause) {\n if (!quiet) setError(messageOf(cause))\n }\n }, [])\n\n useEffect(() => {\n void load()\n const refreshWhenVisible = (): void => {\n if (document.visibilityState === 'visible') void load(true)\n }\n document.addEventListener('visibilitychange', refreshWhenVisible)\n const timer = window.setInterval(refreshWhenVisible, 60_000)\n return () => {\n window.clearInterval(timer)\n document.removeEventListener('visibilitychange', refreshWhenVisible)\n eventSourceRef.current?.close()\n }\n }, [load])\n\n const watchLogin = useCallback((loginId: string) => {\n eventSourceRef.current?.close()\n const source = apiRef.current.events(loginId)\n eventSourceRef.current = source\n const finish = async (message?: string): Promise<void> => {\n source.close()\n eventSourceRef.current = null\n setBusy(null)\n setAuthUrl(null)\n if (message !== undefined) setError(message)\n // Preserve the terminal OAuth error while refreshing the account DTO.\n await load(true)\n }\n source.addEventListener('completed', (event) => {\n const parsed = parseLoginEvent(event as MessageEvent<string>)\n if (parsed?.type === 'completed') void finish()\n })\n source.addEventListener('cancelled', () => void finish())\n source.addEventListener('failed', (event) => {\n const parsed = parseLoginEvent(event as MessageEvent<string>)\n void finish(parsed?.type === 'failed' ? parsed.error.message : 'ChatGPT sign-in failed.')\n })\n }, [load])\n\n useEffect(() => {\n const loginId = status?.login.active ? status.login.loginId : null\n if (loginId !== null && loginId !== undefined && eventSourceRef.current === null) watchLogin(loginId)\n }, [status?.login.active, status?.login.loginId, watchLogin])\n\n const startLogin = async (): Promise<void> => {\n setBusy('login')\n setError(null)\n setPopupBlocked(false)\n const popup = window.open('about:blank', 'dsh-chatgpt-oauth', 'popup,width=560,height=760')\n try {\n const login = await apiRef.current.startLogin()\n setAuthUrl(login.authUrl)\n if (popup === null) setPopupBlocked(true)\n else popup.location.replace(login.authUrl)\n watchLogin(login.loginId)\n await load(true)\n } catch (cause) {\n popup?.close()\n setBusy(null)\n setError(messageOf(cause))\n }\n }\n\n const cancelLogin = async (): Promise<void> => {\n const loginId = status?.login.loginId\n if (loginId === null || loginId === undefined) return\n setBusy('login')\n try {\n await apiRef.current.cancelLogin(loginId)\n eventSourceRef.current?.close()\n eventSourceRef.current = null\n setAuthUrl(null)\n await load()\n } catch (cause) {\n setError(messageOf(cause))\n } finally {\n setBusy(null)\n }\n }\n\n const refreshToken = async (): Promise<void> => run('token', async () => {\n setStatus(await apiRef.current.refresh())\n })\n\n const refreshQuota = async (): Promise<void> => run('quota', async () => {\n const quota = await apiRef.current.refreshQuota()\n setStatus((current) => current === null ? current : { ...current, quota })\n })\n\n const useResetCredit = async (): Promise<void> => {\n if (!window.confirm(t('useResetCreditConfirm'))) return\n await run('reset-credit', async () => {\n const quota = await apiRef.current.useResetCredit()\n setStatus((current) => current === null ? current : { ...current, quota })\n setResetCreditNotice(t('resetCreditUsed'))\n })\n }\n\n const testConnection = async (): Promise<void> => run('test', async () => {\n const result = await apiRef.current.testConnection()\n setConnection({ latencyMs: result.latencyMs, checkedAt: result.checkedAt })\n })\n\n const updatePreferences = async (patch: SubscriptionPreferencesUpdateDto): Promise<void> => run('preferences', async () => {\n const preferences = await apiRef.current.updatePreferences(patch)\n setStatus((current) => current === null ? current : { ...current, preferences })\n })\n\n const selectSearchProvider = (provider: SearchProviderPreference): void => {\n setStatus(current => current ? { ...current, preferences: { ...current.preferences, searchProvider: provider } } : current)\n void updatePreferences({ searchProvider: provider })\n }\n\n const toggleVisibleModel = async (modelId: string, checked: boolean): Promise<void> => {\n const current = status?.preferences.visibleModelIds ?? [...DEFAULT_VISIBLE_CODEX_MODEL_IDS]\n const visibleModelIds = checked ? [...current, modelId] : current.filter(id => id !== modelId)\n if (visibleModelIds.length === 0) return\n await updatePreferences({ visibleModelIds })\n }\n\n const updateContextWindow = async (model: (typeof CONFIGURABLE_CONTEXT_MODEL_IDS)[number]): Promise<void> => {\n const current = status?.preferences.contextWindowOverrides[model] ?? resolveCodexCatalogEntry(model).contextWindow\n const parsed = parseCapacity(contextDrafts[model] ?? String(current), contextWindowLimitForModel(model))\n if (parsed === null) {\n setError(t('contextWindowInvalid'))\n return\n }\n await updatePreferences({ contextWindowOverrides: { [model]: parsed } })\n setContextDrafts((drafts) => ({ ...drafts, [model]: String(parsed) }))\n }\n\n const updateCustomProxyUrl = async (): Promise<void> => {\n const draft = customProxyDraft?.trim()\n await updatePreferences({ customProxyUrl: draft ? draft : null })\n setCustomProxyDraft(null)\n }\n\n const logout = async (): Promise<void> => run('logout', async () => {\n await apiRef.current.logout()\n eventSourceRef.current?.close()\n eventSourceRef.current = null\n setAuthUrl(null)\n setConnection(null)\n await load()\n })\n\n const run = async (action: Exclude<BusyAction, null>, task: () => Promise<void>): Promise<void> => {\n setBusy(action)\n setError(null)\n setResetCreditNotice(null)\n try {\n await task()\n } catch (cause) {\n setError(messageOf(cause))\n } finally {\n setBusy(null)\n }\n }\n\n const account = status?.account\n const preferences = status?.preferences\n const quota = status?.quota\n const storage = status?.storage\n const login = status?.login\n const visibleModelIds = preferences?.visibleModelIds ?? DEFAULT_VISIBLE_CODEX_MODEL_IDS\n return <section className=\"dsh-codex-page\" aria-labelledby=\"dsh-codex-title\">\n <header>\n <h2 id=\"dsh-codex-title\" className=\"dsh-codex-title\">{t('title')}</h2>\n <p className=\"dsh-codex-intro\">{t('intro')}</p>\n </header>\n\n {error !== null ? <div className=\"dsh-codex-errorbar\" role=\"alert\">\n <span>{error}</span>\n {status === null ? <Button disabled={busy !== null} onClick={() => load()}>{t('retry')}</Button> : null}\n </div> : null}\n\n {status === null && error === null ? <Skeleton label={t('loading')} /> : <>\n <Section title={t('account')}>\n <InfoRow label={status?.authenticated ? t('signedIn') : t('signedOut')} value={account?.email ?? '—'} />\n {status?.authenticated ? <>\n <InfoRow label={t('plan')} value={account?.planType ?? t('unknown')} />\n <InfoRow label={t('accountId')} value={account?.accountIdSuffix ?? '—'} />\n <InfoRow label={t('expires')} value={formatDate(account?.tokenExpiresAt)} />\n </> : null}\n <InfoRow label={t('storage')} value={storageLabel(storage, t)} />\n <p className=\"dsh-codex-notice\">{storageNotice(storage, t)}</p>\n {login?.active ? <p className=\"dsh-codex-muted\" role=\"status\">{t('pending')}</p> : null}\n {popupBlocked ? <p className=\"dsh-codex-error\">{t('popupBlocked')}</p> : null}\n {authUrl !== null ? <a className=\"dsh-codex-link\" href={authUrl} target=\"_blank\" rel=\"noreferrer\">{t('continueLogin')}</a> : null}\n <div className=\"dsh-codex-actions\">\n {login?.active\n ? <Button disabled={busy !== null} onClick={cancelLogin}>{t('cancel')}</Button>\n : <Button primary disabled={busy !== null || storage?.available === false} onClick={startLogin}>{status?.authenticated ? t('signInAgain') : t('signIn')}</Button>}\n {status?.authenticated ? <>\n <Button disabled={busy !== null} onClick={refreshToken}>{t('refreshToken')}</Button>\n <Button disabled={busy !== null} onClick={logout}>{t('signOut')}</Button>\n </> : null}\n </div>\n </Section>\n\n <Section title={t('connection')}>\n <InfoRow label={t('provider')} value=\"Codex(ChatGPT 订阅) · codex-chatgpt\" />\n <InfoRow label={t('connectionState')} value={connection === null ? t('untested') : t('connected')} />\n {connection !== null ? <InfoRow label={t('latency')} value={`${connection.latencyMs} ms · ${formatDate(connection.checkedAt)}`} /> : null}\n <p className=\"dsh-codex-muted dsh-codex-models-hint\">{t('modelsHint')}</p>\n <div className=\"dsh-codex-models\" aria-label={t('models')}>\n {CODEX_MODEL_CATALOG.map((model) => {\n const checked = visibleModelIds.some(id => id === model.id)\n const lastVisible = checked && visibleModelIds.length === 1\n return <label key={model.id} title={model.id}>\n <input type=\"checkbox\" checked={checked} disabled={busy !== null || lastVisible} onChange={(event) => void toggleVisibleModel(model.id, event.currentTarget.checked)} />\n <span>{model.name}</span>\n </label>\n })}\n </div>\n <div className=\"dsh-codex-actions\">\n <Button disabled={!status?.authenticated || busy !== null} onClick={testConnection}>{busy === 'test' ? t('testing') : t('testConnection')}</Button>\n </div>\n </Section>\n\n <Section title={t('proxySettings')}>\n <div className=\"dsh-codex-pref-row\">\n <div>\n <strong>{t('proxyMode')}</strong>\n <p className=\"dsh-codex-muted\">{t('proxyModeHint')}</p>\n </div>\n <select\n className=\"dsh-codex-select\"\n aria-label={t('proxyMode')}\n value={preferences?.proxyMode ?? 'auto'}\n disabled={busy !== null}\n onChange={(event) => {\n const mode = event.currentTarget.value as 'auto' | 'custom' | 'direct'\n setStatus(current => current ? { ...current, preferences: { ...current.preferences, proxyMode: mode } } : current)\n void updatePreferences({ proxyMode: mode })\n }}\n >\n <option value=\"auto\">{t('proxyModeAuto')}</option>\n <option value=\"custom\">{t('proxyModeCustom')}</option>\n <option value=\"direct\">{t('proxyModeDirect')}</option>\n </select>\n </div>\n\n {(preferences?.proxyMode ?? 'auto') === 'auto' ? <div className=\"dsh-codex-proxy-status\">\n {status?.detectedProxy ? <>\n <span>{t('proxyDetected')}:</span>\n <code className=\"dsh-codex-proxy-tag\">{status.detectedProxy}</code>\n <span className=\"dsh-codex-success\">{t('proxyDetectedEffective')}</span>\n </> : <span className=\"dsh-codex-muted\">{t('proxyNoneDetected')}</span>}\n </div> : null}\n\n {preferences?.proxyMode === 'direct' ? <p className=\"dsh-codex-muted\" style={{ margin: '8px 0 0' }}>{t('proxyDirectHint')}</p> : null}\n\n {preferences?.proxyMode === 'custom' ? <div className=\"dsh-codex-context-settings\">\n <div>\n <strong>{t('customProxyUrl')}</strong>\n <p className=\"dsh-codex-muted\">{t('customProxyUrlHint')}</p>\n </div>\n <div className=\"dsh-codex-context-row\">\n <span className=\"dsh-codex-proxy-control\">\n <input\n id=\"dsh-codex-custom-proxy\"\n type=\"text\"\n placeholder={t('customProxyUrlPlaceholder')}\n value={customProxyDraft ?? (preferences?.customProxyUrl ?? '')}\n disabled={busy !== null}\n aria-label={t('customProxyUrl')}\n onChange={(event) => {\n setCustomProxyDraft(event.currentTarget.value)\n }}\n onKeyDown={(event) => {\n if (event.key !== 'Enter') return\n event.preventDefault()\n void updateCustomProxyUrl()\n }}\n />\n <button\n className=\"dsh-codex-context-save\"\n type=\"button\"\n aria-label={t('saveProxyUrl')}\n disabled={busy !== null || customProxyDraft === null}\n onClick={() => void updateCustomProxyUrl()}\n >\n {t('save')}\n </button>\n </span>\n </div>\n </div> : null}\n </Section>\n\n <Section title={t('enhancements')}>\n <div className=\"dsh-codex-pref-row\">\n <div>\n <strong>{t('searchProvider')}</strong>\n <p className=\"dsh-codex-muted\">{t('searchProviderHint')}</p>\n </div>\n <div className=\"dsh-codex-segments\" role=\"group\" aria-label={t('searchProvider')}>\n <button\n type=\"button\"\n className={preferences?.searchProvider === 'dsh' ? 'active' : ''}\n aria-pressed={preferences?.searchProvider === 'dsh'}\n disabled={busy !== null}\n onClick={() => selectSearchProvider('dsh')}\n >\n {t('searchProviderDsh')}\n </button>\n <button\n type=\"button\"\n className={preferences?.searchProvider === 'codex' ? 'active' : ''}\n aria-pressed={preferences?.searchProvider === 'codex'}\n disabled={busy !== null}\n onClick={() => selectSearchProvider('codex')}\n >\n {t('searchProviderCodex')}\n </button>\n </div>\n </div>\n <div className=\"dsh-codex-pref-row\">\n <div>\n <strong>{t('outputVerbosity')}</strong>\n <p className=\"dsh-codex-muted\">{t('outputVerbosityHint')}</p>\n </div>\n <select className=\"dsh-codex-select\" aria-label={t('outputVerbosity')} value={preferences?.outputVerbosity ?? ''} disabled={busy !== null} onChange={(event) => {\n const value = event.currentTarget.value\n void updatePreferences({ outputVerbosity: value === '' ? null : value as 'low' | 'medium' | 'high' })\n }}>\n <option value=\"\">{t('providerDefault')}</option>\n <option value=\"low\">{t('verbosityLow')}</option>\n <option value=\"medium\">{t('verbosityMedium')}</option>\n <option value=\"high\">{t('verbosityHigh')}</option>\n </select>\n </div>\n <div className=\"dsh-codex-pref-row\">\n <div>\n <strong>{t('reasoningSummary')}</strong>\n <p className=\"dsh-codex-muted\">{t('reasoningSummaryHint')}</p>\n </div>\n <select className=\"dsh-codex-select\" aria-label={t('reasoningSummary')} value={preferences?.reasoningSummary ?? ''} disabled={busy !== null} onChange={(event) => {\n const value = event.currentTarget.value\n void updatePreferences({ reasoningSummary: value === '' ? null : value as CodexReasoningSummary })\n }}>\n <option value=\"\">{t('providerDefault')}</option>\n <option value=\"auto\">{t('summaryAuto')}</option>\n <option value=\"concise\">{t('summaryConcise')}</option>\n <option value=\"detailed\">{t('summaryDetailed')}</option>\n <option value=\"none\">{t('summaryNone')}</option>\n </select>\n </div>\n <div className=\"dsh-codex-context-settings\">\n <div>\n <strong>{t('contextWindows')}</strong>\n <p className=\"dsh-codex-muted\">{t('contextWindowsHint')}</p>\n </div>\n {CONFIGURABLE_CONTEXT_MODEL_IDS.map((model) => {\n const entry = resolveCodexCatalogEntry(model)\n const fallback = preferences?.contextWindowOverrides?.[model] ?? entry.contextWindow\n const draft = contextDrafts[model]\n const parsedDraft = draft === undefined ? fallback : parseCapacity(draft, contextWindowLimitForModel(model))\n const dirty = draft !== undefined && parsedDraft !== fallback\n const inputId = `dsh-codex-context-${model}`\n return <div className=\"dsh-codex-context-row\" key={model}>\n <label htmlFor={inputId}>{entry.name}</label>\n <span className=\"dsh-codex-capacity-control\">\n <input id={inputId} type=\"text\" inputMode=\"numeric\" value={draft ?? formatCapacity(fallback)} disabled={busy !== null} aria-label={entry.name + ' ' + t('contextWindow')} onChange={(event) => {\n const value = event.currentTarget.value\n setContextDrafts((drafts) => ({ ...drafts, [model]: value }))\n }} onKeyDown={(event) => {\n if (event.key !== 'Enter' || !dirty) return\n event.preventDefault()\n void updateContextWindow(model)\n }} />\n <small>{t('tokens')}</small>\n <button className=\"dsh-codex-context-save\" type=\"button\" data-model={model} aria-label={entry.name + ' ' + t('saveContextWindow')} disabled={busy !== null || !dirty} onClick={() => void updateContextWindow(model)}>{t('save')}</button>\n </span>\n </div>\n })}\n </div>\n <label className=\"dsh-codex-check\">\n <input type=\"checkbox\" checked={preferences?.fastMode === true} disabled={busy !== null} onChange={(event) => updatePreferences({ fastMode: event.currentTarget.checked })} />\n <span>\n <strong>{t('fastMode')}</strong>\n <small>{t('fastModeHint')}</small>\n </span>\n </label>\n <label className=\"dsh-codex-check\">\n <input type=\"checkbox\" checked={preferences?.quickQuotaVisible === true} disabled={busy !== null} onChange={(event) => updatePreferences({ quickQuotaVisible: event.currentTarget.checked })} />\n <span>\n <strong>{t('quickQuota')}</strong>\n <small>{t('quickQuotaHint')}</small>\n </span>\n </label>\n </Section>\n\n <Section title={t('quota')} aside={<Button disabled={!status?.authenticated || busy !== null} onClick={refreshQuota}>{busy === 'quota' ? t('refreshing') : t('refreshQuota')}</Button>}>\n <p className=\"dsh-codex-muted\">{t('quotaIntro')}</p>\n {quota?.state === 'signed-out' || !status?.authenticated ? <p className=\"dsh-codex-empty\">{t('quotaSignedOut')}</p> : null}\n {quota?.buckets?.map((bucket) => <QuotaBucket key={bucket.id} bucket={bucket} t={t} />)}\n {quota?.credits !== null && quota?.credits !== undefined ? <QuotaFact label={t('credits')} value={quota.credits.unlimited ? t('unlimited') : quota.credits.balance ?? (quota.credits.hasCredits ? t('available') : t('unavailable'))} /> : null}\n {quota?.individualLimit !== null && quota?.individualLimit !== undefined ? <QuotaFact label={t('monthlySpend')} value={individualLimitLabel(quota.individualLimit, t)} /> : null}\n {quota?.resetCredits !== null && quota?.resetCredits !== undefined ? <ResetCreditsFact resetCredits={quota.resetCredits} busy={busy} onUse={useResetCredit} t={t} /> : null}\n {resetCreditNotice !== null ? <p className=\"dsh-codex-success\" role=\"status\">{resetCreditNotice}</p> : null}\n {quota?.spendControlReached === true ? <p className=\"dsh-codex-warning\" role=\"status\">{t('spendControlReached')}</p> : null}\n {quota?.state === 'empty' ? <p className=\"dsh-codex-empty\">{t('noQuota')}</p> : null}\n {quota?.stale ? <p className=\"dsh-codex-warning\" role=\"status\">{t('stale')}</p> : null}\n {quota?.error ? <p className=\"dsh-codex-error\" role=\"alert\">{quota.error.message}</p> : null}\n {quota?.fetchedAt ? <p className=\"dsh-codex-timestamp\">{t('updated')}: {formatDate(quota.fetchedAt)}</p> : null}\n </Section>\n </>}\n\n <span className=\"dsh-codex-sr\" aria-live=\"polite\">{busy === null ? '' : busy}</span>\n </section>\n}\n\nfunction Section({ title, aside, children }: { title: string; aside?: React.ReactNode; children: React.ReactNode }): React.JSX.Element {\n return <section className=\"dsh-codex-group\">\n <div className=\"dsh-codex-grouphead\"><h3>{title}</h3>{aside}</div>\n {children}\n </section>\n}\n\nfunction Button({ primary = false, disabled, onClick, children }: { primary?: boolean; disabled?: boolean; onClick: () => void | Promise<void>; children: React.ReactNode }): React.JSX.Element {\n return <button className={`dsh-codex-button${primary ? ' dsh-codex-button-primary' : ''}`} type=\"button\" disabled={disabled} onClick={() => void onClick()}>{children}</button>\n}\n\nfunction InfoRow({ label, value }: { label: string; value: string }): React.JSX.Element {\n return <div className=\"dsh-codex-row\"><span className=\"dsh-codex-label\">{label}</span><span className=\"dsh-codex-value\">{value}</span></div>\n}\n\nexport function storageLabel(storage: CredentialStorageDto | undefined, t: Translate): string {\n if (storage === undefined || !storage.available) return t('storageUnavailable')\n if (storage.kind === 'windows-dpapi') return t('storageWindows')\n if (storage.kind === 'macos-keychain') return t('storageMacKeychain')\n if (storage.kind === 'linux-file') return t('storageLinuxFile')\n if (storage.kind === 'memory') return t('storageMemory')\n return t('storageUnavailable')\n}\n\nexport function storageNotice(storage: CredentialStorageDto | undefined, t: Translate): string {\n if (storage === undefined || !storage.available) return t('securityUnavailable')\n if (storage.kind === 'windows-dpapi') return t('securityWindows')\n if (storage.kind === 'macos-keychain') return t('securityMacKeychain')\n if (storage.kind === 'linux-file') return t('securityLinuxFile')\n if (storage.kind === 'memory') return t('securityMemory')\n return t('securityUnavailable')\n}\n\nfunction QuotaBucket({ bucket, t }: { bucket: QuotaBucketDto; t: Translate }): React.JSX.Element {\n const windows = quotaWindows(bucket)\n return <article className=\"dsh-codex-quota-card\">\n <div className=\"dsh-codex-quota-title\"><strong>{bucket.name}</strong>{bucket.planType ? <span>{bucket.planType}</span> : null}</div>\n {windows.map((window, index) => <QuotaBar key={`${window.windowDurationMins ?? 'x'}:${window.resetsAt ?? 'x'}:${index}`} label={windowLabel(window.windowDurationMins, t)} window={window} t={t} />)}\n </article>\n}\n\nfunction QuotaFact({ label, value }: { label: string; value: string }): React.JSX.Element {\n return <div className=\"dsh-codex-quota-fact\"><span>{label}</span><strong>{value}</strong></div>\n}\n\nexport function ResetCreditsFact({ resetCredits, busy, onUse, t }: { resetCredits: NonNullable<PluginStatusDto['quota']['resetCredits']>; busy: BusyAction; onUse: () => Promise<void>; t: Translate }): React.JSX.Element {\n const available = resetCredits.availableCount > 0\n return <div className=\"dsh-codex-reset-credits\">\n <div className=\"dsh-codex-reset-credits-info\">\n <span>{t('resetCredits')}</span>\n <strong>{resetCredits.availableCount}</strong>\n <small>{t('resetCreditExpires')}: {resetCredits.expiresAt == null ? t('unknown') : formatReset(resetCredits.expiresAt)}</small>\n </div>\n <Button primary disabled={!available || busy !== null} onClick={onUse}>{busy === 'reset-credit' ? t('usingResetCredit') : t('useResetCredit')}</Button>\n </div>\n}\n\nexport function QuotaBar({ label, window, t }: { label: string; window: QuotaWindowDto; t: Translate }): React.JSX.Element {\n const percent = typeof window?.usedPercent === 'number' && Number.isFinite(window.usedPercent) ? window.usedPercent : 0\n const level = percent >= 95 ? 'danger' : percent >= 80 ? 'warning' : 'normal'\n const remaining = Math.max(0, 100 - percent)\n return <div className=\"dsh-codex-meter-wrap\">\n <div className=\"dsh-codex-meter-label\"><span>{label}</span><strong>{formatPercent(percent)}</strong></div>\n <div className={`dsh-codex-meter dsh-codex-meter-${level}`} role=\"progressbar\" aria-label={`${label}: ${formatPercent(percent)} ${t('used')}`} aria-valuemin={0} aria-valuemax={100} aria-valuenow={percent}>\n <span style={{ width: `${Math.min(100, Math.max(0, percent))}%` }} />\n </div>\n <div className=\"dsh-codex-meter-meta\">\n <span>{percent >= 100 ? `${t('exhausted')} · ${formatPercent(remaining)} ${t('remaining')}` : `${formatPercent(percent)} ${t('used')} · ${formatPercent(remaining)} ${t('remaining')}`}</span>\n <span>{window?.resetsAt == null ? '—' : `${t('resets')}: ${formatReset(window.resetsAt)}`}</span>\n </div>\n </div>\n}\n\nfunction Skeleton({ label }: { label: string }): React.JSX.Element {\n return <div className=\"dsh-codex-skeleton\" role=\"status\" aria-label={label}><span /><span /></div>\n}\n\nexport function windowLabel(minutes: number | null | undefined, t: Translate): string {\n if (minutes === null || minutes === undefined || typeof minutes !== 'number' || !Number.isFinite(minutes) || minutes <= 0) return t('limitWindow')\n const [value, unit]: [number, Intl.NumberFormatOptions['unit']] = minutes >= 1440 && minutes % 1440 === 0\n ? [minutes / 1440, 'day']\n : minutes >= 60 && minutes % 60 === 0\n ? [minutes / 60, 'hour']\n : [Math.round(minutes), 'minute']\n try {\n return `${new Intl.NumberFormat(undefined, { style: 'unit', unit, unitDisplay: 'long' }).format(value)} ${t('limitWindow')}`\n } catch {\n return `${value} ${t('limitWindow')}`\n }\n}\n\nexport function parsePositiveCapacity(value: string): number | null {\n const normalized = value.trim().toLowerCase().replace(/[,_\\s]/g, '')\n const matched = normalized.match(/^(\\d+(?:\\.\\d+)?)(k|m)?$/)\n if (matched === null) return null\n const multiplier = matched[2] === 'm' ? 1_000_000 : matched[2] === 'k' ? 1_000 : 1\n const parsed = Number(matched[1]) * multiplier\n return Number.isSafeInteger(parsed) && parsed >= 1 ? parsed : null\n}\n\nexport function parseCapacity(value: string, maxContextWindow = GPT_56_MAX_CONTEXT_WINDOW): number | null {\n const parsed = parsePositiveCapacity(value)\n return parsed !== null && parsed <= maxContextWindow ? parsed : null\n}\n\nfunction formatCapacity(value: number): string {\n if (value % 1_000 === 0) return `${value / 1_000}K`\n return String(value)\n}\n\nfunction formatPercent(value: number | undefined | null): string {\n if (value === undefined || value === null || typeof value !== 'number' || !Number.isFinite(value)) return '0%'\n try {\n return `${new Intl.NumberFormat(undefined, { maximumFractionDigits: 1 }).format(value)}%`\n } catch {\n return `${value}%`\n }\n}\n\nfunction individualLimitLabel(limit: NonNullable<PluginStatusDto['quota']['individualLimit']>, t: Translate): string {\n const parts = [\n limit.remainingPercent !== null && limit.remainingPercent !== undefined ? `${formatPercent(limit.remainingPercent)} ${t('remaining')}` : null,\n limit.limit !== null && limit.limit !== undefined ? `${t('limit')}: ${limit.limit}` : null,\n limit.used !== null && limit.used !== undefined ? `${t('used')}: ${limit.used}` : null,\n limit.resetsAt !== null && limit.resetsAt !== undefined ? `${t('resets')}: ${formatReset(limit.resetsAt)}` : null,\n ].filter((part): part is string => part !== null)\n return parts.length > 0 ? parts.join(' · ') : t('unknown')\n}\n\nfunction formatDate(seconds: number | undefined | null): string {\n if (seconds === undefined || seconds === null || typeof seconds !== 'number' || !Number.isFinite(seconds) || seconds <= 0) return '—'\n const ms = seconds > 10_000_000_000 ? seconds : seconds * 1000\n try {\n return new Intl.DateTimeFormat(undefined, { dateStyle: 'medium', timeStyle: 'short' }).format(ms)\n } catch {\n return '—'\n }\n}\n\nexport function formatReset(seconds: number | undefined | null): string {\n if (seconds === undefined || seconds === null || typeof seconds !== 'number' || !Number.isFinite(seconds) || seconds <= 0) return '—'\n const ms = seconds > 10_000_000_000 ? seconds : seconds * 1000\n const absolute = formatDate(seconds)\n const diff = ms - Date.now()\n const abs = Math.abs(diff)\n const [amount, unit]: [number, Intl.RelativeTimeFormatUnit] = abs >= 86_400_000\n ? [Math.round(diff / 86_400_000), 'day']\n : abs >= 3_600_000\n ? [Math.round(diff / 3_600_000), 'hour']\n : [Math.round(diff / 60_000), 'minute']\n try {\n return `${absolute} (${new Intl.RelativeTimeFormat(undefined, { numeric: 'auto' }).format(amount, unit)})`\n } catch {\n return absolute\n }\n}\n\nfunction messageOf(error: unknown): string {\n return error instanceof Error ? error.message : String(error)\n}\n","export const NS = 'dsh-chatgpt-subscription' as const\n\nexport const zh = {\n title: 'ChatGPT',\n intro: '使用 ChatGPT 账号登录,在 DSH 中使用订阅可用的模型。',\n account: '账号',\n signedOut: '尚未登录',\n signedIn: '已登录',\n plan: '套餐',\n accountId: '账号 ID',\n expires: '令牌到期',\n storage: '凭据存储',\n storageWindows: 'Windows DPAPI(当前用户加密)',\n storageMacKeychain: 'macOS 钥匙串(Keychain 加密)',\n storageLinuxFile: 'Linux 用户私有文件(权限 0600)',\n storageMemory: '仅 Host 内存(不持久化)',\n storageUnavailable: '凭据存储不可用',\n securityWindows: '令牌由 Host 使用 Windows CurrentUser DPAPI 加密,不会进入浏览器、settings.yaml 或日志。',\n securityMacKeychain: '令牌由 Host 存入 macOS 登录钥匙串(Keychain),在本机加密保存,不会进入浏览器、settings.yaml 或日志。',\n securityLinuxFile: '令牌仅写入 Host 上当前 Linux 用户可读的 0600 文件,但不会额外加密;同 UID 进程、root、备份和磁盘快照仍可能读取。',\n securityMemory: '令牌仅保留在 Host 内存中,Host 退出后丢失。',\n securityUnavailable: 'Host 无法安全访问凭据存储;请修复文件所有者或权限后重试。',\n signIn: '使用 ChatGPT 登录',\n signInAgain: '重新登录',\n cancel: '取消登录',\n signOut: '注销',\n refreshToken: '刷新凭据',\n pending: '请在浏览器中完成登录。',\n popupBlocked: '浏览器拦截了登录窗口,请使用下面的链接继续。',\n continueLogin: '打开 ChatGPT 登录页',\n loading: '正在读取状态…',\n connection: '连接',\n provider: 'Provider',\n connectionState: '连接状态',\n connected: '可用',\n untested: '尚未测试',\n testConnection: '测试连接',\n testing: '测试中…',\n latency: '最近延迟',\n models: '可用模型',\n modelsHint: '勾选后模型才会显示在对话页的模型选择列表中;至少保留一个。',\n proxySettings: '网络代理',\n proxyMode: '代理模式',\n proxyModeHint: 'GPT 与 Antigravity(Gemini)共用此代理设置;支持自动读取系统代理,修改后对后续请求生效。',\n proxyModeAuto: '系统代理(自动检测)',\n proxyModeCustom: '自定义代理',\n proxyModeDirect: '直连(禁用代理)',\n customProxyUrl: '自定义代理地址',\n customProxyUrlHint: '支持 HTTP/HTTPS/SOCKS5 代理地址,例如 http://127.0.0.1:7890',\n customProxyUrlPlaceholder: '例如: http://127.0.0.1:7890',\n saveProxyUrl: '保存代理地址',\n proxyDetected: '检测到系统代理',\n proxyDetectedEffective: '(已自动生效)',\n proxyNoneDetected: '未检测到系统代理,将使用直连',\n proxyDirectHint: '所有网络请求将直接连接,不经过任何代理服务器。',\n enhancements: '增强功能',\n fastMode: '快速模式(1.5x 速度)',\n fastModeHint: '提升 Token 生成速度至约 1.5 倍;将以约 2x–2.5x 速度消耗 Codex 订阅额度。',\n outputVerbosity: '输出详细程度',\n outputVerbosityHint: '控制 Codex 最终回答的详细程度;不影响思考深度。',\n verbosityLow: '低(保持回答简洁)',\n verbosityMedium: '中(兼顾细节与简洁)',\n verbosityHigh: '高(在回答中包含更多细节)',\n reasoningSummary: '推理摘要',\n reasoningSummaryHint: '选择 ChatGPT 总结其推理的方式;不影响思考深度。',\n summaryAuto: '自动(让模型选择摘要详细程度)',\n summaryConcise: '简洁(显示简要推理摘要)',\n summaryDetailed: '详细(显示更详细的推理摘要)',\n summaryNone: '无(不显示推理摘要)',\n searchProvider: '搜索与抓取来源',\n searchProviderHint: '选择 DSH 联网工具使用默认来源,或改用当前 ChatGPT 订阅的 Codex 来源(自动走代理隧道)。',\n searchProviderDsh: 'DSH 默认',\n searchProviderCodex: 'ChatGPT(代理隧道)',\n providerDefault: '使用 Provider 默认值',\n contextWindows: '模型上下文窗口',\n contextWindowsHint: '默认 272K;6 Astra 最高 872K,GPT-5.6 最高 1M。该值用于 DSH 的压缩与溢出判断,可输入 872K、512K 等容量。',\n contextWindow: '上下文窗口',\n contextWindowInvalid: '上下文窗口必须是正整数,且不能超过模型上限(6 Astra 为 872K,GPT-5.6 为 1M);可使用 K 或 M 后缀。',\n saveContextWindow: '保存上下文窗口',\n save: '保存',\n tokens: 'tokens',\n quickQuota: '在输入框旁显示快捷用量',\n quickQuotaHint: '仅在当前会话选中 codex-chatgpt 模型时显示。',\n quota: '用量与限额',\n quotaIntro: '数据来自 ChatGPT Codex 用量服务。页面可见时最多每 60 秒刷新一次。',\n refreshQuota: '刷新用量',\n refreshing: '刷新中…',\n noQuota: '当前套餐未返回可显示的限额窗口。',\n quotaSignedOut: '登录后可查看订阅限额。',\n stale: '显示的是上次成功获取的数据。',\n updated: '更新时间',\n primary: '主要窗口',\n secondary: '次要窗口',\n limitWindow: '额度',\n used: '已使用',\n remaining: '剩余',\n available: '可用',\n unavailable: '不可用',\n unlimited: '无限',\n credits: 'Credits',\n monthlySpend: '月度消费控制',\n resetCredits: '重置次数',\n resetCreditExpires: '到期时间',\n useResetCredit: '使用重置卡',\n usingResetCredit: '使用中…',\n useResetCreditConfirm: '使用后会立即消耗 1 次重置机会,并重置符合条件的 Codex 额度窗口。确定继续吗?',\n resetCreditUsed: '重置卡已使用,用量数据已刷新。',\n spendControlReached: '已触发月度消费控制,新的订阅调用可能被限制。',\n limit: '上限',\n exhausted: '额度已用尽',\n resets: '重置',\n quickQuotaLabel: 'Codex 剩余',\n quickQuotaLoading: '用量…',\n imageToolRunning: '正在生成图片',\n imageToolDone: '已生成图片',\n imageToolFailed: '图片生成失败',\n image: '图片',\n openImage: '打开图片',\n openNamedImage: '打开 {name}',\n imageLoading: '加载图片…',\n imageLoadFailed: '图片加载失败,点击重试',\n imagePreviewClose: '关闭',\n imagePreviewOpenOriginal: '打开原图',\n retry: '重试',\n unknown: '未知',\n} as const\n\nexport const en: Record<keyof typeof zh, string> = {\n title: 'ChatGPT',\n intro: 'Sign in with ChatGPT to use models available to your subscription in DSH.',\n account: 'Account',\n signedOut: 'Not signed in',\n signedIn: 'Signed in',\n plan: 'Plan',\n accountId: 'Account ID',\n expires: 'Token expires',\n storage: 'Credential storage',\n storageWindows: 'Windows DPAPI (current-user encrypted)',\n storageMacKeychain: 'macOS Keychain (encrypted)',\n storageLinuxFile: 'Linux user-private file (mode 0600)',\n storageMemory: 'Host memory only (not persistent)',\n storageUnavailable: 'Credential storage unavailable',\n securityWindows: 'The Host encrypts tokens with Windows CurrentUser DPAPI; they never enter the browser, settings.yaml, or logs.',\n securityMacKeychain: 'The Host stores tokens in the macOS login Keychain, encrypted on this machine; they never enter the browser, settings.yaml, or logs.',\n securityLinuxFile: 'Tokens are stored in a mode-0600 file readable only by the current Linux user, but are not additionally encrypted; same-UID processes, root, backups, and disk snapshots can still read them.',\n securityMemory: 'Tokens remain only in Host memory and are lost when the Host exits.',\n securityUnavailable: 'The Host cannot safely access credential storage. Fix the file owner or permissions and retry.',\n signIn: 'Sign in with ChatGPT',\n signInAgain: 'Sign in again',\n cancel: 'Cancel sign-in',\n signOut: 'Sign out',\n refreshToken: 'Refresh credentials',\n pending: 'Complete sign-in in your browser.',\n popupBlocked: 'The sign-in window was blocked. Use the link below to continue.',\n continueLogin: 'Open ChatGPT sign-in',\n loading: 'Reading status…',\n connection: 'Connection',\n provider: 'Provider',\n connectionState: 'Connection status',\n connected: 'Available',\n untested: 'Not tested',\n testConnection: 'Test connection',\n testing: 'Testing…',\n latency: 'Last latency',\n models: 'Available models',\n modelsHint: 'Checked models appear in the conversation model picker; at least one must remain enabled.',\n proxySettings: 'Network Proxy',\n proxyMode: 'Proxy Mode',\n proxyModeHint: 'GPT and Antigravity (Gemini) share these proxy settings. Supports system proxy detection; changes apply to subsequent requests.',\n proxyModeAuto: 'System Proxy (Auto-detect)',\n proxyModeCustom: 'Custom Proxy',\n proxyModeDirect: 'Direct (No Proxy)',\n customProxyUrl: 'Custom Proxy URL',\n customProxyUrlHint: 'Supports HTTP/HTTPS/SOCKS5 proxy URLs, e.g. http://127.0.0.1:7890',\n customProxyUrlPlaceholder: 'e.g. http://127.0.0.1:7890',\n saveProxyUrl: 'Save Proxy URL',\n proxyDetected: 'Detected system proxy',\n proxyDetectedEffective: ' (active)',\n proxyNoneDetected: 'No system proxy detected; connecting directly',\n proxyDirectHint: 'All requests connect directly without using any proxy server.',\n enhancements: 'Enhancements',\n fastMode: 'Fast mode (1.5x speed)',\n fastModeHint: 'Generates tokens ~1.5x faster; consumes Codex subscription quota at ~2x–2.5x the normal rate.',\n outputVerbosity: 'Output verbosity',\n outputVerbosityHint: 'Controls the detail level of final Codex answers without changing reasoning effort.',\n verbosityLow: 'Low (keep answers concise)',\n verbosityMedium: 'Medium (balance detail and brevity)',\n verbosityHigh: 'High (include more detail)',\n reasoningSummary: 'Reasoning summary',\n reasoningSummaryHint: 'Controls how ChatGPT summarizes its chain of thought; does not change reasoning depth.',\n summaryAuto: 'Auto (let model determine detail)',\n summaryConcise: 'Concise (brief summary)',\n summaryDetailed: 'Detailed (in-depth summary)',\n summaryNone: 'None (hide reasoning summary)',\n searchProvider: 'Search & Fetch provider',\n searchProviderHint: 'Choose whether DSH web tools use the default provider or the Codex proxy-backed source from this ChatGPT subscription.',\n searchProviderDsh: 'DSH default',\n searchProviderCodex: 'ChatGPT (Proxy tunnel)',\n providerDefault: 'Use provider default',\n contextWindows: 'Model context windows',\n contextWindowsHint: 'Defaults to 272K, with up to 872K for 6 Astra and 1M for GPT-5.6. DSH uses it for compaction and overflow detection; values such as 872K and 512K are accepted.',\n contextWindow: 'Context window',\n contextWindowInvalid: 'The context window must be a positive integer within the model limit (872K for 6 Astra, 1M for GPT-5.6). K and M suffixes are accepted.',\n saveContextWindow: 'Save context window',\n save: 'Save',\n tokens: 'tokens',\n quickQuota: 'Show quick usage beside the composer',\n quickQuotaHint: 'Shown only when the current session uses a codex-chatgpt model.',\n quota: 'Usage and limits',\n quotaIntro: 'Data comes from the ChatGPT Codex usage service and refreshes at most once per minute while visible.',\n refreshQuota: 'Refresh usage',\n refreshing: 'Refreshing…',\n noQuota: 'Your plan did not return any displayable limit windows.',\n quotaSignedOut: 'Sign in to view subscription limits.',\n stale: 'Showing the last successfully fetched data.',\n updated: 'Updated',\n primary: 'Primary window',\n secondary: 'Secondary window',\n limitWindow: 'limit',\n used: 'used',\n remaining: 'remaining',\n available: 'Available',\n unavailable: 'Unavailable',\n unlimited: 'Unlimited',\n credits: 'Credits',\n monthlySpend: 'Monthly spend control',\n resetCredits: 'Reset credits',\n resetCreditExpires: 'Expires',\n useResetCredit: 'Use reset credit',\n usingResetCredit: 'Using…',\n useResetCreditConfirm: 'This immediately spends one reset credit and resets eligible Codex limit windows. Continue?',\n resetCreditUsed: 'The reset credit was used and usage data was refreshed.',\n spendControlReached: 'Monthly spend control has been reached; new subscription calls may be limited.',\n limit: 'Limit',\n exhausted: 'Quota exhausted',\n resets: 'Resets',\n quickQuotaLabel: 'Codex left',\n quickQuotaLoading: 'Usage…',\n imageToolRunning: 'Generating image',\n imageToolDone: 'Generated image',\n imageToolFailed: 'Image generation failed',\n image: 'Image',\n openImage: 'Open image',\n openNamedImage: 'Open {name}',\n imageLoading: 'Loading image…',\n imageLoadFailed: 'Image failed to load. Click to retry',\n imagePreviewClose: 'Close',\n imagePreviewOpenOriginal: 'Open original',\n retry: 'Retry',\n unknown: 'Unknown',\n}\n\nexport type LocaleKey = keyof typeof zh\nexport const dictionaries = { zh, en }\n","const STYLE_ID = '@eddyskywalker/dsh-chatgpt-subscription/main'\n\nconst CSS = `\n.dsh-codex-page{box-sizing:border-box;color:var(--dsw-alias-label-primary);display:flex;flex-direction:column;gap:20px;max-width:780px;min-width:0;padding:2px 0 30px}\n.dsh-codex-page *{box-sizing:border-box}\n.dsh-codex-title{font-size:15px;font-weight:650;line-height:1.4;margin:0 0 5px}\n.dsh-codex-intro,.dsh-codex-muted{color:var(--dsw-alias-label-secondary);font-size:13px;line-height:1.55;margin:0}\n.dsh-codex-group{border-top:0.5px solid var(--dsw-alias-border-l2);min-width:0}\n.dsh-codex-grouphead{align-items:center;display:flex;gap:12px;justify-content:space-between;min-height:48px}\n.dsh-codex-grouphead h3{font-size:14px;font-weight:650;margin:0}\n.dsh-codex-row{align-items:center;border-bottom:0.5px solid var(--dsw-alias-border-l2);display:flex;gap:20px;justify-content:space-between;min-height:44px;padding:8px 0}\n.dsh-codex-label{color:var(--dsw-alias-label-secondary);font-size:13px;flex:0 0 auto}\n.dsh-codex-value{font-size:13px;min-width:0;overflow-wrap:anywhere;text-align:right}\n.dsh-codex-actions{display:flex;flex-wrap:wrap;gap:8px;justify-content:flex-end;padding-top:12px}\n.dsh-codex-button{background:var(--dsw-alias-bg-layer-2);border:0.5px solid var(--dsw-alias-border-l2);border-radius:999px;corner-shape:round;color:var(--dsw-alias-label-primary);cursor:pointer;font:inherit;font-size:13px;line-height:1;padding:8px 13px;white-space:nowrap}\n.dsh-codex-button:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}\n.dsh-codex-button:focus-visible,.dsh-codex-link:focus-visible{outline:2px solid var(--dsw-alias-button-info-fill,#397ee8);outline-offset:2px}\n.dsh-codex-button:disabled{cursor:default;opacity:.5}\n.dsh-codex-button-primary{background:var(--dsw-alias-button-info-fill,#397ee8);border-color:transparent;color:var(--dsw-alias-button-info-label,#fff)}\n.dsh-codex-notice{background:var(--dsw-alias-bg-layer-2);border:0.5px solid var(--dsw-alias-border-l2);border-radius:7px;color:var(--dsw-alias-label-secondary);font-size:12px;line-height:1.55;margin:12px 0 0;padding:10px 12px}\n.dsh-codex-error,.dsh-codex-warning,.dsh-codex-success{font-size:12px;line-height:1.5;margin:8px 0 0}\n.dsh-codex-error{color:var(--dsw-alias-label-danger,#d94b4b)}\n.dsh-codex-warning{color:var(--dsw-alias-label-warning,#c77a18)}\n.dsh-codex-success{color:var(--dsw-alias-label-success,#2e9b62)}\n.dsh-codex-errorbar{align-items:center;background:color-mix(in srgb,var(--dsw-alias-label-danger,#d94b4b) 9%,transparent);border:0.5px solid color-mix(in srgb,var(--dsw-alias-label-danger,#d94b4b) 28%,transparent);border-radius:7px;color:var(--dsw-alias-label-danger,#d94b4b);display:flex;font-size:13px;gap:12px;justify-content:space-between;padding:10px 12px}\n.dsh-codex-link{color:var(--dsw-alias-label-link,#3278d4);display:inline-block;font-size:13px;margin-top:8px}\n.dsh-codex-models-hint{padding-top:10px}\n.dsh-codex-models{display:flex;flex-wrap:wrap;gap:7px;padding-top:8px}\n.dsh-codex-models label{cursor:pointer;display:block;position:relative}\n.dsh-codex-models input{position:absolute;opacity:0;pointer-events:none}\n.dsh-codex-models span{background:var(--dsw-alias-bg-layer-2);border:0.5px solid var(--dsw-alias-border-l2);border-radius:6px;color:var(--dsw-alias-label-secondary);display:block;font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:11px;padding:5px 8px}\n.dsh-codex-models input:checked+span{background:color-mix(in srgb,var(--dsw-alias-button-info-fill,#397ee8) 14%,var(--dsw-alias-bg-layer-2));border-color:color-mix(in srgb,var(--dsw-alias-button-info-fill,#397ee8) 55%,var(--dsw-alias-border-l2));color:var(--dsw-alias-label-primary)}\n.dsh-codex-models input:focus-visible+span{outline:2px solid var(--dsw-alias-button-info-fill,#397ee8);outline-offset:2px}\n.dsh-codex-models input:disabled+span{cursor:default;opacity:.5}\n.dsh-codex-pref-row{align-items:center;border-bottom:0.5px solid var(--dsw-alias-border-l2);display:flex;gap:16px;justify-content:space-between;min-height:58px;padding:10px 0}\n.dsh-codex-pref-row strong,.dsh-codex-check strong{display:block;font-size:13px;font-weight:600;line-height:1.35}\n.dsh-codex-segments{background:var(--dsw-alias-bg-layer-2);border:0.5px solid var(--dsw-alias-border-l2);border-radius:8px;display:inline-flex;flex-wrap:nowrap;gap:3px;padding:3px}\n.dsh-codex-segments label{cursor:pointer;display:block;margin:0}\n.dsh-codex-segments input{position:absolute;opacity:0;pointer-events:none}\n.dsh-codex-segments span,.dsh-codex-segments button{border:0.5px solid transparent;border-radius:6px;color:var(--dsw-alias-label-secondary);display:block;font:inherit;font-size:12px;font-weight:500;line-height:1.2;padding:6px 12px;transition:all .15s ease;user-select:none;white-space:nowrap}\n.dsh-codex-segments button{background:transparent;cursor:pointer}\n.dsh-codex-segments label:hover span,.dsh-codex-segments button:hover:not(:disabled){color:var(--dsw-alias-label-primary)}\n.dsh-codex-segments input:checked+span,.dsh-codex-segments button.active,.dsh-codex-segments button[aria-pressed=true]{background:color-mix(in srgb,var(--dsw-alias-button-info-fill,#397ee8) 22%,var(--dsw-alias-bg-layer-2));border-color:color-mix(in srgb,var(--dsw-alias-button-info-fill,#397ee8) 60%,var(--dsw-alias-border-l2));color:var(--dsw-alias-label-primary);font-weight:600;box-shadow:0 1px 3px rgba(0,0,0,.15)}\n.dsh-codex-segments input:focus-visible+span,.dsh-codex-segments button:focus-visible{outline:2px solid var(--dsw-alias-button-info-fill,#397ee8);outline-offset:2px}\n.dsh-codex-segments input:disabled+span,.dsh-codex-segments button:disabled{cursor:default;opacity:.5}\n.dsh-codex-select,.dsh-codex-capacity-control input{background:var(--dsw-alias-bg-layer-2);border:0.5px solid var(--dsw-alias-border-l2);border-radius:7px;color:var(--dsw-alias-label-primary);font:inherit;font-size:12px;padding:7px 9px}\n.dsh-codex-select{max-width:210px;min-width:150px}\n.dsh-codex-context-settings{border-bottom:0.5px solid var(--dsw-alias-border-l2);display:grid;gap:10px;padding:12px 0}\n.dsh-codex-context-settings>div>strong{font-size:13px;font-weight:600}\n.dsh-codex-context-row{align-items:center;display:flex;font-size:12px;gap:14px;justify-content:space-between}\n.dsh-codex-proxy-control{align-items:center;display:flex;gap:8px;width:100%}\n.dsh-codex-proxy-control input{background:var(--dsw-alias-bg-layer-2);border:0.5px solid var(--dsw-alias-border-l2);border-radius:7px;color:var(--dsw-alias-label-primary);flex:1;font:inherit;font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:12px;min-width:220px;padding:7px 10px;text-align:left}\n.dsh-codex-proxy-status{align-items:center;color:var(--dsw-alias-label-secondary);display:flex;flex-wrap:wrap;font-size:12px;gap:6px;margin:6px 0 0}\n.dsh-codex-proxy-tag{background:color-mix(in srgb,var(--dsw-alias-button-info-fill,#397ee8) 18%,transparent);border:0.5px solid color-mix(in srgb,var(--dsw-alias-button-info-fill,#397ee8) 45%,transparent);border-radius:4px;color:var(--dsw-alias-label-primary);font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:11px;padding:2px 6px}\n.dsh-codex-capacity-control{align-items:center;display:flex;gap:7px}\n.dsh-codex-capacity-control input{font-family:ui-monospace,SFMono-Regular,Consolas,monospace;text-align:right;width:90px}\n.dsh-codex-capacity-control input[type=number]{width:110px}\n.dsh-codex-capacity-control small{color:var(--dsw-alias-label-tertiary);font-size:11px;width:42px}\n.dsh-codex-context-save{background:var(--dsw-alias-bg-layer-2);border:0.5px solid var(--dsw-alias-border-l2);border-radius:7px;color:var(--dsw-alias-label-primary);cursor:pointer;font:inherit;font-size:12px;line-height:1;padding:8px 10px;white-space:nowrap}\n.dsh-codex-context-save:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}\n.dsh-codex-context-save:focus-visible{outline:2px solid var(--dsw-alias-button-info-fill,#397ee8);outline-offset:2px}\n.dsh-codex-context-save:disabled{cursor:default;opacity:.45}\n.dsh-codex-check{align-items:flex-start;border-bottom:0.5px solid var(--dsw-alias-border-l2);cursor:pointer;display:flex;gap:10px;padding:12px 0}\n.dsh-codex-check input{flex:none;margin-top:2px}\n.dsh-codex-check small{color:var(--dsw-alias-label-secondary);display:block;font-size:12px;line-height:1.45;margin-top:2px}\n.dsh-codex-quota-card{background:var(--dsw-alias-bg-layer-2);border:0.5px solid var(--dsw-alias-border-l2);border-radius:8px;margin-top:12px;padding:12px}\n.dsh-codex-quota-title{align-items:center;display:flex;font-size:13px;gap:8px;justify-content:space-between}\n.dsh-codex-quota-title span{color:var(--dsw-alias-label-tertiary);font-size:11px;text-transform:uppercase}\n.dsh-codex-quota-fact{align-items:flex-start;border-bottom:0.5px solid var(--dsw-alias-border-l2);display:flex;font-size:12px;gap:12px;justify-content:space-between;line-height:1.45;padding:10px 0}\n.dsh-codex-quota-fact span{color:var(--dsw-alias-label-secondary);flex:none}\n.dsh-codex-quota-fact strong{font-weight:600;min-width:0;overflow-wrap:anywhere;text-align:right}\n.dsh-codex-reset-credits{align-items:center;border-bottom:0.5px solid var(--dsw-alias-border-l2);display:flex;gap:16px;justify-content:space-between;padding:10px 0}\n.dsh-codex-reset-credits-info{display:grid;font-size:12px;gap:2px;grid-template-columns:auto auto}\n.dsh-codex-reset-credits-info>span{color:var(--dsw-alias-label-secondary)}\n.dsh-codex-reset-credits-info>strong{font-weight:650;text-align:right}\n.dsh-codex-reset-credits-info>small{color:var(--dsw-alias-label-tertiary);font-size:11px;grid-column:1/-1}\n.dsh-codex-meter-wrap{margin-top:13px}\n.dsh-codex-meter-label,.dsh-codex-meter-meta{display:flex;gap:10px;justify-content:space-between}\n.dsh-codex-meter-label{font-size:12px;margin-bottom:6px}\n.dsh-codex-meter-meta{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:1.45;margin-top:6px}\n.dsh-codex-meter{background:var(--dsw-alias-bg-layer-1,rgba(127,127,127,.15));border-radius:999px;corner-shape:round;height:7px;overflow:hidden;width:100%}\n.dsh-codex-meter>span{background:var(--dsw-alias-button-info-fill,#397ee8);border-radius:inherit;display:block;height:100%;max-width:100%;min-width:0;transition:width .25s ease}\n.dsh-codex-meter-warning>span{background:var(--dsw-alias-label-warning,#d58a24)}\n.dsh-codex-meter-danger>span{background:var(--dsw-alias-label-danger,#d94b4b)}\n.dsh-codex-empty{border:0.5px dashed var(--dsw-alias-border-l2);border-radius:7px;color:var(--dsw-alias-label-tertiary);font-size:12px;margin:12px 0 0;padding:16px;text-align:center}\n.dsh-codex-timestamp{color:var(--dsw-alias-label-tertiary);font-size:11px;margin:10px 0 0;text-align:right}\n.dsh-codex-skeleton{display:grid;gap:9px;padding-top:10px}\n.dsh-codex-skeleton span{animation:dsh-codex-pulse 1.4s ease-in-out infinite;background:var(--dsw-alias-bg-layer-2);border-radius:5px;height:42px}\n.dsh-codex-skeleton span:nth-child(2){animation-delay:.12s}.dsh-codex-skeleton span:nth-child(3){animation-delay:.24s}\n.dsh-codex-sr{height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;clip:rect(0 0 0 0);white-space:nowrap}\n.dsh-codex-composer-quota{align-items:center;background:var(--dsw-alias-bg-layer-2);border:0.5px solid var(--dsw-alias-border-l2);border-radius:999px;corner-shape:round;color:var(--dsw-alias-label-secondary);display:inline-flex;font-size:11px;gap:6px;height:28px;line-height:1;max-width:160px;padding:0 9px;white-space:nowrap}\n.dsh-codex-composer-quota strong{color:var(--dsw-alias-label-primary);font-size:11px;font-weight:650}\n.dsh-codex-composer-quota[data-level=warning] strong{color:var(--dsw-alias-label-warning,#d58a24)}\n.dsh-codex-composer-quota[data-level=danger] strong{color:var(--dsw-alias-label-danger,#d94b4b)}\n.dsh-codex-image-tool{border:0.5px solid var(--dsw-alias-border-l2);border-radius:8px;display:flex;flex-direction:column;gap:8px;margin:4px 0 4px 4px;max-width:520px;padding:10px 12px}\n.dsh-codex-image-tool-head{align-items:center;display:flex;font-size:13px;gap:8px;min-width:0}\n.dsh-codex-image-dot{background:var(--dsw-alias-button-info-fill,#397ee8);border-radius:50%;corner-shape:round;display:inline-block;flex:none;height:8px;width:8px}\n.dsh-codex-image-tool[data-state=error] .dsh-codex-image-dot{background:var(--dsw-alias-label-danger,#d94b4b)}\n.dsh-codex-image-title{font-weight:600}\n.dsh-codex-image-summary{color:var(--dsw-alias-label-tertiary);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.dsh-codex-image-grid{display:flex;flex-wrap:wrap;gap:8px}\n.dsh-codex-image-preview{background:var(--dsw-alias-bg-layer-2);border:0.5px solid var(--dsw-alias-border-l2);border-radius:8px;display:block;max-height:260px;max-width:min(100%,360px);object-fit:contain}\n.dsh-codex-image-loading,.dsh-codex-image-failed{border:0.5px dashed var(--dsw-alias-border-l2);border-radius:8px;color:var(--dsw-alias-label-tertiary);display:inline-flex;font-size:12px;line-height:1.4;padding:18px 20px}\n.dsh-codex-image-failed{color:var(--dsw-alias-label-danger,#d94b4b)}\n@keyframes dsh-codex-pulse{0%,100%{opacity:.45}50%{opacity:.85}}\n@media(max-width:560px){.dsh-codex-row,.dsh-codex-pref-row,.dsh-codex-quota-fact,.dsh-codex-reset-credits{align-items:flex-start;flex-direction:column;gap:3px}.dsh-codex-value,.dsh-codex-quota-fact strong{text-align:left}.dsh-codex-actions{justify-content:flex-start}.dsh-codex-grouphead{align-items:flex-start;flex-direction:column;gap:0;padding:12px 0}.dsh-codex-meter-meta{align-items:flex-start;flex-direction:column;gap:2px}.dsh-codex-errorbar{align-items:flex-start;flex-direction:column}.dsh-codex-segments{width:100%}.dsh-codex-select{max-width:none;width:100%}.dsh-codex-context-row{align-items:flex-start;flex-direction:column;gap:5px}.dsh-codex-segments label{flex:1}.dsh-codex-segments span{text-align:center}.dsh-codex-image-tool{max-width:100%;margin-left:0}}\n@media(prefers-reduced-motion:reduce){.dsh-codex-meter>span{transition:none}.dsh-codex-skeleton span{animation:none}}\n`\n\nexport function installStyles(): () => void {\n if (document.querySelector(`style[data-plugin-css=\"${STYLE_ID}\"]`) !== null) return () => undefined\n const element = document.createElement('style')\n element.dataset.plugin = '@eddyskywalker/dsh-chatgpt-subscription'\n element.dataset.pluginCss = STYLE_ID\n element.textContent = CSS\n document.head.appendChild(element)\n return () => element.remove()\n}\n","export const NS_ANTIGRAVITY = 'dsh-antigravity'\n\nexport const zh = {\n title: 'Antigravity',\n pageDesc: '登录 Google Antigravity / Cloud Code Assist,并查看当前账号的共享额度。',\n account: '已登录',\n signedIn: '已登录',\n signedOut: '未登录',\n plan: '套餐',\n accountId: '账号 ID',\n expires: '令牌到期',\n storage: '凭据存储',\n storageNotice: '令牌由 Host 保存于本地安全存储 ($DSH_HOME/storages/antigravity-oauth.json),不会进入浏览器。',\n signInAgain: '重新登录',\n refreshToken: '刷新凭据',\n signOut: '注销',\n signIn: '登录',\n signingIn: '登录中...',\n connection: '连接',\n provider: 'Provider',\n providerValue: 'Google Antigravity · antigravity',\n connectionState: '连接状态',\n connected: '已连接',\n untested: '未测试',\n modelsHint: '勾选后模型才会显示在对话页的模型选择列表中;至少保留一个。',\n selectAll: '全选',\n unselectAll: '全不选',\n enhanced: '增强功能',\n defaultReasoningEffort: '默认思考深度',\n defaultReasoningEffortHint: '控制支持推理的模型在未单独指定时的思考强度。',\n defaultEffortAuto: '使用 Provider 默认值',\n contextWindowSection: '模型上下文窗口',\n contextWindowHint: '默认按模型标准;可选应用最高容量,该值用于 DSH 的压缩与溢出判断,可输入 1M、512K、200K 等容量。',\n save: '保存',\n saved: '已保存',\n saving: '保存中...',\n quotaSection: '用量与配额',\n quotaDesc: '数据来自 Google Cloud Code Assist 配额服务,页面可见时最多每 60 秒刷新一次。',\n refreshQuota: '刷新用量',\n refreshingQuota: '刷新中...',\n quotaEmpty: '暂无配额数据,点击「刷新用量」重试。',\n googleValidation: '前往 Google 完成账号验证',\n resetPrefix: '重置: {time}',\n resetUnavailable: '重置: n/a',\n resetNow: '现在',\n timeDayHour: '{days}天 {hours}时',\n timeHourMin: '{hours}h {minutes}m',\n timeMin: '{minutes}m',\n updatedAt: '更新时间:{time}',\n loading: '加载中...',\n loginFailed: '登录失败',\n tokens: 'tokens',\n}\n\nexport const en = {\n title: 'Antigravity',\n pageDesc: 'Sign in to Google Antigravity / Cloud Code Assist and view shared quotas.',\n account: 'Signed in',\n signedIn: 'Signed in',\n signedOut: 'Not signed in',\n plan: 'Plan',\n accountId: 'Account ID',\n expires: 'Token expires',\n storage: 'Credential storage',\n storageNotice: 'Tokens are stored locally by the Host ($DSH_HOME/storages/antigravity-oauth.json) and never sent to browser.',\n signInAgain: 'Sign in again',\n refreshToken: 'Refresh token',\n signOut: 'Sign out',\n signIn: 'Sign in',\n signingIn: 'Signing in...',\n connection: 'Connection',\n provider: 'Provider',\n providerValue: 'Google Antigravity · antigravity',\n connectionState: 'Connection state',\n connected: 'Connected',\n untested: 'Untested',\n modelsHint: 'Checked models will appear in DSH conversation model list; keep at least one.',\n selectAll: 'Select all',\n unselectAll: 'Deselect all',\n enhanced: 'Enhanced Features',\n defaultReasoningEffort: 'Default reasoning effort',\n defaultReasoningEffortHint: 'Controls reasoning effort for reasoning models when not explicitly specified in conversation.',\n defaultEffortAuto: 'Use Provider default',\n contextWindowSection: 'Model Context Window',\n contextWindowHint: 'Defaults to model specification; configure custom capacity used by DSH for compaction and overflow judgments (e.g., 1M, 512K, 200K).',\n save: 'Save',\n saved: 'Saved',\n saving: 'Saving...',\n quotaSection: 'Usage & Quota',\n quotaDesc: 'Data from Google Cloud Code Assist quota service; refreshes up to once every 60 seconds when visible.',\n refreshQuota: 'Refresh quota',\n refreshingQuota: 'Refreshing...',\n quotaEmpty: 'No quota data yet — use “Refresh quota” to retry.',\n googleValidation: 'Verify the account with Google',\n resetPrefix: 'Reset: {time}',\n resetUnavailable: 'Reset: n/a',\n resetNow: 'now',\n timeDayHour: '{days}d {hours}h',\n timeHourMin: '{hours}h {minutes}m',\n timeMin: '{minutes}m',\n updatedAt: 'Updated at: {time}',\n loading: 'Loading...',\n loginFailed: 'Login failed',\n tokens: 'tokens',\n}\n\nexport const dictionaries = {\n zh,\n 'zh-CN': zh,\n en,\n 'en-US': en,\n}\n","import React, { useCallback, useEffect, useState } from 'react'\nimport type { AntigravityModelOption, AntigravityWebStatus } from '../../shared/antigravity-contracts.ts'\nimport { zh } from './locales.ts'\n\nconst API = '/antigravity/api'\n\ninterface Props {\n onModelChange?: () => void\n loadModelDirectory?: () => void\n}\n\nasync function fetchApi<T>(path: string, options?: RequestInit): Promise<T> {\n const res = await fetch(`${API}${path}`, {\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers,\n },\n })\n const json = (await res.json()) as { ok: boolean; value?: T; error?: string }\n if (!res.ok || !json.ok) {\n throw new Error(json.error || `HTTP ${res.status}`)\n }\n return json.value as T\n}\n\nexport function parsePositiveCapacity(value: string): number | null {\n const normalized = value.trim().toLowerCase().replace(/[,_\\s]/g, '')\n const matched = normalized.match(/^(\\d+(?:\\.\\d+)?)(k|m)?$/)\n if (matched === null) return null\n const multiplier = matched[2] === 'm' ? 1_000_000 : matched[2] === 'k' ? 1_000 : 1\n const parsed = Number(matched[1]) * multiplier\n return Number.isSafeInteger(parsed) && parsed >= 1 ? parsed : null\n}\n\nexport function formatCapacity(value: number): string {\n if (value >= 1_000_000 && value % 100_000 === 0) return `${value / 1_000_000}M`\n if (value % 1_000 === 0) return `${value / 1_000}K`\n return String(value)\n}\n\nfunction formatResetTime(resetTime?: string): string {\n if (!resetTime) return ''\n const diff = new Date(resetTime).getTime() - Date.now()\n if (diff <= 0) return '现在'\n const mins = Math.floor(diff / 60000)\n const hours = Math.floor(mins / 60)\n const days = Math.floor(hours / 24)\n if (days > 0) return `${days}天 ${hours % 24}时`\n if (hours > 0) return `${hours}h ${mins % 60}m`\n return `${mins}m`\n}\n\nfunction formatDate(ms?: number): string {\n if (!ms || ms <= 0) return '—'\n try {\n return new Intl.DateTimeFormat(undefined, { dateStyle: 'medium', timeStyle: 'short' }).format(ms)\n } catch {\n return '—'\n }\n}\n\nexport function AntigravitySection({ onModelChange, loadModelDirectory }: Props): React.ReactElement {\n const [status, setStatus] = useState<AntigravityWebStatus | null>(null)\n const [loading, setLoading] = useState(true)\n const [busy, setBusy] = useState<string | null>(null)\n const [error, setError] = useState<string | null>(null)\n const [validationUrl, setValidationUrl] = useState<string | null>(null)\n const [loginProgress, setLoginProgress] = useState<string | null>(null)\n const [contextDrafts, setContextDrafts] = useState<Record<string, string>>({})\n const [savingModel, setSavingModel] = useState<string | null>(null)\n\n const t = zh\n\n const notifyChange = useCallback(() => {\n onModelChange?.()\n loadModelDirectory?.()\n }, [onModelChange, loadModelDirectory])\n\n const loadStatus = useCallback(async (quiet = false) => {\n if (!quiet) {\n setError(null)\n setValidationUrl(null)\n }\n try {\n // The host refreshes a stale quota cache while serving /status, so a second\n // client-side POST /quota here would double every upstream fetch.\n const data = await fetchApi<AntigravityWebStatus>('/status')\n setStatus(data)\n // 初始化输入草稿\n const drafts: Record<string, string> = {}\n for (const m of data.models) {\n const val = data.contextWindowOverrides[m.id] || m.defaultContextWindow\n drafts[m.id] = formatCapacity(val)\n }\n setContextDrafts(drafts)\n } catch (err) {\n if (!quiet) setError(err instanceof Error ? err.message : String(err))\n } finally {\n setLoading(false)\n }\n }, [])\n\n useEffect(() => {\n void loadStatus()\n const refreshWhenVisible = () => {\n if (document.visibilityState === 'visible') void loadStatus(true)\n }\n document.addEventListener('visibilitychange', refreshWhenVisible)\n const timer = window.setInterval(refreshWhenVisible, 60_000)\n return () => {\n window.clearInterval(timer)\n document.removeEventListener('visibilitychange', refreshWhenVisible)\n }\n }, [loadStatus])\n\n const handleLogin = async () => {\n try {\n setBusy('login')\n setError(null)\n setValidationUrl(null)\n setLoginProgress(null)\n const flow = await fetchApi<{ authUrl?: string; status?: string }>('/login', { method: 'POST' })\n if (flow.authUrl) {\n window.open(flow.authUrl, '_blank')\n }\n const pollTimer = setInterval(async () => {\n try {\n const pollStatus = await fetchApi<{\n status: string\n error?: string\n validationUrl?: string\n progress?: string\n }>('/login/status')\n if (pollStatus.progress) {\n setLoginProgress(pollStatus.progress)\n }\n if (pollStatus.status === 'complete') {\n clearInterval(pollTimer)\n setBusy(null)\n setLoginProgress(null)\n await loadStatus()\n notifyChange()\n } else if (pollStatus.status === 'error') {\n clearInterval(pollTimer)\n setBusy(null)\n setLoginProgress(null)\n setError(pollStatus.error || t.loginFailed)\n if (pollStatus.validationUrl) {\n setValidationUrl(pollStatus.validationUrl)\n }\n }\n } catch {\n // ignore\n }\n }, 1500)\n\n setTimeout(() => {\n clearInterval(pollTimer)\n setBusy(null)\n setLoginProgress(null)\n }, 5 * 60 * 1000)\n } catch (err) {\n setBusy(null)\n setLoginProgress(null)\n setError(err instanceof Error ? err.message : String(err))\n }\n }\n\n const handleRefreshQuota = async () => {\n try {\n setBusy('quota')\n setError(null)\n const updated = await fetchApi<AntigravityWebStatus>('/quota', { method: 'POST' })\n setStatus(updated)\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n } finally {\n setBusy(null)\n }\n }\n\n const handleLogout = async () => {\n try {\n setBusy('logout')\n setError(null)\n const updated = await fetchApi<AntigravityWebStatus>('/logout', { method: 'POST' })\n setStatus(updated)\n notifyChange()\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n } finally {\n setBusy(null)\n }\n }\n\n const toggleModel = async (modelId: string, checked: boolean) => {\n if (!status) return\n const currentEnabled = status.models.filter((m) => m.enabled).map((m) => m.id)\n const nextEnabled = checked\n ? [...new Set([...currentEnabled, modelId])]\n : currentEnabled.filter((id) => id !== modelId)\n\n if (nextEnabled.length === 0) return // 至少保留一个\n\n try {\n const updated = await fetchApi<AntigravityWebStatus>('/models', {\n method: 'POST',\n body: JSON.stringify({ enabledModelIds: nextEnabled }),\n })\n setStatus(updated)\n notifyChange()\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n }\n }\n\n const setAllModels = async (selectAll: boolean) => {\n if (!status) return\n const nextEnabled = selectAll ? status.models.map((m) => m.id) : [status.models[0].id]\n try {\n const updated = await fetchApi<AntigravityWebStatus>('/models', {\n method: 'POST',\n body: JSON.stringify({ enabledModelIds: nextEnabled }),\n })\n setStatus(updated)\n notifyChange()\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n }\n }\n\n const handleUpdateEffort = async (effort: 'low' | 'medium' | 'high' | null) => {\n try {\n const updated = await fetchApi<AntigravityWebStatus>('/settings', {\n method: 'POST',\n body: JSON.stringify({ defaultReasoningEffort: effort }),\n })\n setStatus(updated)\n notifyChange()\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n }\n }\n\n const handleSaveContextWindow = async (modelId: string) => {\n const raw = contextDrafts[modelId] || ''\n const parsed = parsePositiveCapacity(raw)\n if (parsed === null) {\n setError(`无效的上下文容量值: ${raw}`)\n return\n }\n\n try {\n setSavingModel(modelId)\n setError(null)\n const updated = await fetchApi<AntigravityWebStatus>('/settings', {\n method: 'POST',\n body: JSON.stringify({\n contextWindowOverrides: {\n [modelId]: parsed,\n },\n }),\n })\n setStatus(updated)\n setContextDrafts((prev) => ({ ...prev, [modelId]: formatCapacity(parsed) }))\n notifyChange()\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n } finally {\n setSavingModel(null)\n }\n }\n\n if (loading) {\n return (\n <div className=\"dsha-page\">\n <div className=\"dsha-empty\">{t.loading}</div>\n </div>\n )\n }\n\n const quota = status?.quota\n const groups = quota?.groups || []\n const visibleCount = status?.models.filter((m) => m.enabled).length || 0\n\n return (\n <div className=\"dsha-page\">\n {/* 1. 账号信息分组 */}\n <section className=\"dsha-group\">\n <div className=\"dsha-grouphead\">\n <h3>{status?.authenticated ? t.account : t.signedOut}</h3>\n </div>\n <div className=\"dsha-row\">\n <span className=\"dsha-label\">{status?.authenticated ? t.signedIn : t.signedOut}</span>\n <span className=\"dsha-value\">{status?.email || '—'}</span>\n </div>\n {status?.authenticated && (\n <>\n <div className=\"dsha-row\">\n <span className=\"dsha-label\">{t.plan}</span>\n <span className=\"dsha-value\">{quota?.planLabel || 'Google AI Ultra'}</span>\n </div>\n <div className=\"dsha-row\">\n <span className=\"dsha-label\">{t.accountId}</span>\n <span className=\"dsha-value\">{status.projectId || 'antigravity-default'}</span>\n </div>\n <div className=\"dsha-row\">\n <span className=\"dsha-label\">{t.expires}</span>\n <span className=\"dsha-value\">{formatDate(Date.now() + 86400000 * 30)}</span>\n </div>\n </>\n )}\n <div className=\"dsha-row\">\n <span className=\"dsha-label\">{t.storage}</span>\n <span className=\"dsha-value\">本地安全存储 (JSON)</span>\n </div>\n <p className=\"dsha-notice\">{t.storageNotice}</p>\n\n <div className=\"dsha-actions\">\n {!status?.authenticated ? (\n <button className=\"dsha-btn dsha-btn-primary\" disabled={busy !== null} onClick={handleLogin}>\n {busy === 'login' ? (loginProgress || t.signingIn) : t.signIn}\n </button>\n ) : (\n <>\n <button className=\"dsha-btn dsha-btn-primary\" disabled={busy !== null} onClick={handleLogin}>\n {busy === 'login' ? (loginProgress || t.signingIn) : t.signInAgain}\n </button>\n <button className=\"dsha-btn\" disabled={busy !== null} onClick={handleRefreshQuota}>\n {busy === 'quota' ? t.refreshingQuota : t.refreshToken}\n </button>\n <button className=\"dsha-btn\" disabled={busy !== null} onClick={handleLogout}>\n {t.signOut}\n </button>\n </>\n )}\n </div>\n </section>\n\n {/* 2. 连接与模型胶囊标签选择器 */}\n <section className=\"dsha-group\">\n <div className=\"dsha-grouphead\">\n <h3>{t.connection}</h3>\n </div>\n <div className=\"dsha-row\">\n <span className=\"dsha-label\">{t.provider}</span>\n <span className=\"dsha-value\">{t.providerValue}</span>\n </div>\n <div className=\"dsha-row\">\n <span className=\"dsha-label\">{t.connectionState}</span>\n <span className=\"dsha-value\">{status?.authenticated ? t.connected : t.untested}</span>\n </div>\n\n <p className=\"dsha-muted dsha-models-hint\">{t.modelsHint}</p>\n\n {/* 胶囊标签多选列表 */}\n <div className=\"dsha-models\" aria-label=\"Antigravity Models\">\n {status?.models.map((model) => {\n const checked = model.enabled\n const lastVisible = checked && visibleCount === 1\n return (\n <label key={model.id} title={model.id}>\n <input\n type=\"checkbox\"\n checked={checked}\n disabled={busy !== null || lastVisible}\n onChange={(e) => void toggleModel(model.id, e.currentTarget.checked)}\n />\n <span>{model.name}</span>\n </label>\n )\n })}\n </div>\n\n <div className=\"dsha-actions\">\n <button className=\"dsha-btn\" disabled={busy !== null} onClick={() => setAllModels(true)}>\n {t.selectAll}\n </button>\n <button className=\"dsha-btn\" disabled={busy !== null} onClick={() => setAllModels(false)}>\n {t.unselectAll}\n </button>\n </div>\n </section>\n\n {/* 3. 增强功能(思考深度设置) */}\n <section className=\"dsha-group\">\n <div className=\"dsha-grouphead\">\n <h3>{t.enhanced}</h3>\n </div>\n <div className=\"dsha-pref-row\">\n <div>\n <strong>{t.defaultReasoningEffort}</strong>\n <p className=\"dsha-muted\">{t.defaultReasoningEffortHint}</p>\n </div>\n <select\n className=\"dsha-select\"\n aria-label={t.defaultReasoningEffort}\n value={status?.defaultReasoningEffort ?? ''}\n disabled={busy !== null}\n onChange={(e) => {\n const val = e.currentTarget.value\n void handleUpdateEffort(val === '' ? null : (val as 'low' | 'medium' | 'high'))\n }}\n >\n <option value=\"\">{t.defaultEffortAuto}</option>\n <option value=\"low\">Low</option>\n <option value=\"medium\">Medium</option>\n <option value=\"high\">High</option>\n </select>\n </div>\n </section>\n\n {/* 4. 模型上下文窗口设置(按模型独立配置) */}\n <section className=\"dsha-group\">\n <div className=\"dsha-grouphead\">\n <h3>{t.contextWindowSection}</h3>\n </div>\n <p className=\"dsha-muted\">{t.contextWindowHint}</p>\n\n <div className=\"dsha-context-settings\">\n {status?.models.map((model) => (\n <div key={model.id} className=\"dsha-context-row\">\n <span>{model.name}</span>\n <div className=\"dsha-capacity-control\">\n <input\n type=\"text\"\n value={contextDrafts[model.id] ?? ''}\n onChange={(e) => setContextDrafts({ ...contextDrafts, [model.id]: e.target.value })}\n onKeyDown={(e) => {\n if (e.key === 'Enter') void handleSaveContextWindow(model.id)\n }}\n />\n <small>{t.tokens}</small>\n <button\n type=\"button\"\n className=\"dsha-context-save\"\n disabled={savingModel === model.id}\n onClick={() => void handleSaveContextWindow(model.id)}\n >\n {savingModel === model.id ? t.saving : t.save}\n </button>\n </div>\n </div>\n ))}\n </div>\n </section>\n\n {/* 5. 用量与配额卡片 */}\n <section className=\"dsha-group\">\n <div className=\"dsha-grouphead\">\n <h3>{t.quotaSection}</h3>\n <button\n className=\"dsha-btn\"\n disabled={busy !== null || !status?.authenticated}\n onClick={handleRefreshQuota}\n >\n {busy === 'quota' ? t.refreshingQuota : t.refreshQuota}\n </button>\n </div>\n <p className=\"dsha-muted\">{t.quotaDesc}</p>\n\n {!status?.authenticated ? (\n <div className=\"dsha-empty\">{t.signedOut}</div>\n ) : groups.length === 0 ? (\n <div className=\"dsha-empty\">{busy === 'quota' ? t.refreshingQuota : t.quotaEmpty}</div>\n ) : (\n groups.map((group, gIdx) => (\n <div key={gIdx} className=\"dsha-quota-card\">\n <div className=\"dsha-quota-title\">\n <strong>{group.displayName}</strong>\n {group.description && <span>{group.description}</span>}\n </div>\n\n {group.buckets.map((bucket, bIdx) => {\n const isCyan = /claude|gpt|3p/i.test(group.displayName)\n const pct = Math.round(bucket.remainingFraction * 100)\n const resetText = formatResetTime(bucket.resetTime)\n return (\n <div key={bIdx} className=\"dsha-meter-wrap\">\n <div className=\"dsha-meter-label\">\n <span>{bucket.displayName}</span>\n <strong>{pct}% 剩余</strong>\n </div>\n <div className={`dsha-meter ${isCyan ? 'dsha-meter-cyan' : 'dsha-meter-green'}`}>\n <span style={{ width: `${pct}%` }} />\n </div>\n {resetText && (\n <div className=\"dsha-meter-meta\">\n <span>重置: {resetText}</span>\n </div>\n )}\n </div>\n )\n })}\n </div>\n ))\n )}\n\n {quota?.fetchedAt && (\n <div className=\"dsha-timestamp\">\n 更新时间: {new Date(quota.fetchedAt).toLocaleString()}\n </div>\n )}\n </section>\n\n {error && (\n <div className=\"dsha-error\">\n <div>{error}</div>\n {validationUrl && (\n <div style={{ marginTop: '8px' }}>\n <a\n href={validationUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"dsha-btn dsha-btn-primary\"\n style={{ display: 'inline-block', textDecoration: 'none', padding: '4px 10px', fontSize: '12px' }}\n >\n {t.googleValidation}\n </a>\n </div>\n )}\n </div>\n )}\n </div>\n )\n}\n","export const STYLE_ID = 'dsh-antigravity-settings-style'\n\nexport function installAntigravityStyles(): void {\n if (typeof document === 'undefined' || document.getElementById(STYLE_ID)) return\n const style = document.createElement('style')\n style.id = STYLE_ID\n style.textContent = `\n.dsha-page{box-sizing:border-box;color:var(--dsw-alias-label-primary);display:flex;flex-direction:column;gap:20px;max-width:780px;min-width:0;padding:2px 0 30px}\n.dsha-page *{box-sizing:border-box}\n.dsha-group{border-top:0.5px solid var(--dsw-alias-border-l2);min-width:0}\n.dsha-group:first-of-type{border-top:0}\n.dsha-grouphead{align-items:center;display:flex;gap:12px;justify-content:space-between;min-height:48px}\n.dsha-grouphead h3{font-size:14px;font-weight:650;margin:0;color:var(--dsw-alias-label-primary)}\n.dsha-row{align-items:center;border-bottom:0.5px solid var(--dsw-alias-border-l2);display:flex;gap:20px;justify-content:space-between;min-height:44px;padding:8px 0}\n.dsha-label{color:var(--dsw-alias-label-secondary);font-size:13px;flex:0 0 auto}\n.dsha-value{font-size:13px;min-width:0;overflow-wrap:anywhere;text-align:right;color:var(--dsw-alias-label-primary)}\n.dsha-actions{display:flex;flex-wrap:wrap;gap:8px;justify-content:flex-end;padding-top:12px}\n.dsha-btn{background:var(--dsw-alias-bg-layer-2);border:0.5px solid var(--dsw-alias-border-l2);border-radius:999px;corner-shape:round;color:var(--dsw-alias-label-primary);cursor:pointer;font:inherit;font-size:13px;line-height:1;padding:8px 13px;white-space:nowrap}\n.dsha-btn:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}\n.dsha-btn:disabled{cursor:default;opacity:.5}\n.dsha-btn-primary{background:var(--dsw-alias-button-info-fill,#397ee8);border-color:transparent;color:var(--dsw-alias-button-info-label,#fff)}\n.dsha-btn-primary:hover:not(:disabled){opacity:.9}\n.dsha-notice{background:var(--dsw-alias-bg-layer-2);border:0.5px solid var(--dsw-alias-border-l2);border-radius:7px;color:var(--dsw-alias-label-secondary);font-size:12px;line-height:1.55;margin:12px 0 0;padding:10px 12px}\n.dsha-muted{color:var(--dsw-alias-label-secondary);font-size:13px;line-height:1.55;margin:0}\n.dsha-models-hint{padding-top:10px}\n.dsha-models{display:flex;flex-wrap:wrap;gap:7px;padding-top:8px}\n.dsha-models label{cursor:pointer;display:block;position:relative}\n.dsha-models input{position:absolute;opacity:0;pointer-events:none}\n.dsha-models span{background:var(--dsw-alias-bg-layer-2);border:0.5px solid var(--dsw-alias-border-l2);border-radius:6px;color:var(--dsw-alias-label-secondary);display:block;font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:11px;padding:5px 8px;transition:all .15s ease}\n.dsha-models input:checked+span{background:color-mix(in srgb,var(--dsw-alias-button-info-fill,#397ee8) 14%,var(--dsw-alias-bg-layer-2));border-color:color-mix(in srgb,var(--dsw-alias-button-info-fill,#397ee8) 55%,var(--dsw-alias-border-l2));color:var(--dsw-alias-label-primary);font-weight:600}\n.dsha-models input:disabled+span{cursor:default;opacity:.5}\n.dsha-pref-row{align-items:center;border-bottom:0.5px solid var(--dsw-alias-border-l2);display:flex;gap:16px;justify-content:space-between;min-height:58px;padding:10px 0}\n.dsha-pref-row strong{display:block;font-size:13px;font-weight:600;line-height:1.35;color:var(--dsw-alias-label-primary)}\n.dsha-select{background:var(--dsw-alias-bg-layer-2);border:0.5px solid var(--dsw-alias-border-l2);border-radius:7px;color:var(--dsw-alias-label-primary);font:inherit;font-size:12px;padding:7px 9px;max-width:220px;min-width:160px}\n.dsha-context-settings{border-bottom:0.5px solid var(--dsw-alias-border-l2);display:grid;gap:10px;padding:12px 0}\n.dsha-context-settings>div>strong{font-size:13px;font-weight:600;color:var(--dsw-alias-label-primary)}\n.dsha-context-row{align-items:center;display:flex;font-size:12px;gap:14px;justify-content:space-between}\n.dsha-capacity-control{align-items:center;display:flex;gap:7px}\n.dsha-capacity-control input{background:var(--dsw-alias-bg-layer-2);border:0.5px solid var(--dsw-alias-border-l2);border-radius:7px;color:var(--dsw-alias-label-primary);font:inherit;font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:12px;padding:7px 9px;text-align:right;width:90px}\n.dsha-capacity-control small{color:var(--dsw-alias-label-tertiary);font-size:11px;width:42px}\n.dsha-context-save{background:var(--dsw-alias-bg-layer-2);border:0.5px solid var(--dsw-alias-border-l2);border-radius:7px;color:var(--dsw-alias-label-primary);cursor:pointer;font:inherit;font-size:12px;line-height:1;padding:8px 10px;white-space:nowrap}\n.dsha-context-save:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}\n.dsha-context-save:disabled{cursor:default;opacity:.45}\n.dsha-quota-card{background:var(--dsw-alias-bg-layer-2);border:0.5px solid var(--dsw-alias-border-l2);border-radius:8px;margin-top:12px;padding:12px}\n.dsha-quota-title{align-items:center;display:flex;font-size:13px;gap:8px;justify-content:space-between;color:var(--dsw-alias-label-primary);font-weight:650}\n.dsha-quota-title span{color:var(--dsw-alias-label-tertiary);font-size:11px;text-transform:uppercase}\n.dsha-meter-wrap{margin-top:13px}\n.dsha-meter-label,.dsha-meter-meta{display:flex;gap:10px;justify-content:space-between}\n.dsha-meter-label{font-size:12px;margin-bottom:6px;color:var(--dsw-alias-label-primary)}\n.dsha-meter-meta{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:1.45;margin-top:6px}\n.dsha-meter{background:var(--dsw-alias-bg-layer-1,rgba(127,127,127,.15));border-radius:999px;corner-shape:round;height:7px;overflow:hidden;width:100%}\n.dsha-meter>span{background:var(--dsw-alias-button-info-fill,#397ee8);border-radius:inherit;display:block;height:100%;max-width:100%;min-width:0;transition:width .25s ease}\n.dsha-meter-green>span{background:var(--dsw-alias-label-success,#10b981)}\n.dsha-meter-cyan>span{background:#06b6d4}\n.dsha-timestamp{color:var(--dsw-alias-label-tertiary);font-size:11px;margin:10px 0 0;text-align:right}\n.dsha-mini-btn{border:0;background:transparent;color:var(--dsw-alias-label-link,#397ee8);font-size:12px;line-height:18px;cursor:pointer;padding:0;margin-left:8px}\n.dsha-mini-btn:hover{text-decoration:underline}\n.dsha-empty{border:0.5px dashed var(--dsw-alias-border-l2);border-radius:7px;color:var(--dsw-alias-label-tertiary);font-size:12px;margin:12px 0 0;padding:16px;text-align:center}\n.dsha-error{color:var(--dsw-alias-label-danger,#d94b4b);font-size:12px;margin:8px 0 0}\n.dsha-composer-quota{align-items:center;background:var(--dsw-alias-bg-layer-2);border:0.5px solid var(--dsw-alias-border-l2);border-radius:999px;corner-shape:round;color:var(--dsw-alias-label-secondary);cursor:pointer;display:inline-flex;font-size:11px;gap:6px;height:28px;line-height:1;max-width:160px;padding:0 9px;white-space:nowrap;user-select:none;transition:all .15s ease}\n.dsha-composer-quota:hover{background:var(--dsw-alias-interactive-bg-hover);border-color:var(--dsw-alias-border-l1,var(--dsw-alias-border-l2))}\n.dsha-composer-quota strong{color:var(--dsw-alias-label-primary);font-size:11px;font-weight:650}\n.dsha-composer-quota[data-level=warning] strong{color:var(--dsw-alias-label-warning,#d58a24)}\n.dsha-composer-quota[data-level=danger] strong{color:var(--dsw-alias-label-danger,#d94b4b)}\n`\n document.head.append(style)\n}\n","import { useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react'\nimport type { SnapshotStore } from '@deepseek-ai/dsh-client-runtime/client'\nimport type { ModelDirectoryState } from '@deepseek-ai/dsh-client-ui-model-selection/client'\nimport type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { AntigravityQuotaGroup, AntigravityModelBucket, AntigravityWebStatus } from '../../shared/antigravity-contracts.ts'\nimport { NS_ANTIGRAVITY } from './locales.ts'\n\nconst API = '/antigravity/api'\n\nasync function fetchApi<T>(path: string, options?: RequestInit): Promise<T> {\n const res = await fetch(`${API}${path}`, {\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers,\n },\n })\n const json = (await res.json()) as { ok: boolean; value?: T; error?: string }\n if (!res.ok || !json.ok) {\n throw new Error(json.error || `HTTP ${res.status}`)\n }\n return json.value as T\n}\n\ntype Props = PropsRuntime<'conversation.input.right'> &\n PropsLocale<typeof NS_ANTIGRAVITY> & {\n directory: SnapshotStore<ModelDirectoryState>\n loadModelDirectory: () => void\n }\n\nfunction selectQuotaBucketForModel(groups: AntigravityQuotaGroup[], modelId?: string) {\n if (!groups || groups.length === 0) return null\n const isClaudeOrGpt = modelId ? /claude|gpt/i.test(modelId) : false\n const targetGroup =\n groups.find((g) => {\n const match = /claude|gpt|3p/i.test(g.displayName)\n return isClaudeOrGpt ? match : !match\n }) || groups[0]\n\n if (!targetGroup || !targetGroup.buckets || targetGroup.buckets.length === 0) return null\n const shortBucket: AntigravityModelBucket =\n targetGroup.buckets.find((b: AntigravityModelBucket) => /5\\s*小时|hour|5h/i.test(b.displayName)) || targetGroup.buckets[0]\n\n return {\n groupName: targetGroup.displayName,\n bucketName: shortBucket.displayName,\n remainingPercent: Math.round(shortBucket.remainingFraction * 100),\n resetTime: shortBucket.resetTime,\n }\n}\n\nfunction formatResetCountdown(resetTime?: string): string {\n if (!resetTime) return ''\n try {\n const diff = new Date(resetTime).getTime() - Date.now()\n if (diff <= 0) return '即将重置'\n const h = Math.floor(diff / 3600000)\n const m = Math.floor((diff % 3600000) / 60000)\n if (h > 0) return `${h}小时${m}分后重置`\n return `${m}分钟后重置`\n } catch {\n return ''\n }\n}\n\nexport function AntigravityComposerQuota({ directory, loadModelDirectory }: Props): React.JSX.Element | null {\n const modelState = useStore(directory)\n const [status, setStatus] = useState<AntigravityWebStatus | null>(null)\n const [loading, setLoading] = useState(false)\n const mountedRef = useRef(false)\n const selected = modelState.current\n const isAntigravity = selected?.provider === 'antigravity'\n\n useEffect(() => {\n loadModelDirectory()\n }, [loadModelDirectory])\n\n useEffect(() => {\n mountedRef.current = true\n return () => {\n mountedRef.current = false\n }\n }, [])\n\n const fetchStatus = useCallback(async (refresh = false) => {\n if (!mountedRef.current) return\n setLoading(true)\n try {\n const data = refresh\n ? await fetchApi<AntigravityWebStatus>('/quota', { method: 'POST' })\n : await fetchApi<AntigravityWebStatus>('/status')\n // The host refreshes a stale quota cache while serving /status; a second\n // client-side POST /quota here would double every upstream fetch.\n if (mountedRef.current) setStatus(data)\n } catch {\n // best-effort\n } finally {\n if (mountedRef.current) setLoading(false)\n }\n }, [])\n\n useEffect(() => {\n if (!isAntigravity) return\n void fetchStatus(false)\n const timer = window.setInterval(() => {\n if (document.visibilityState === 'visible') void fetchStatus(false)\n }, 60_000)\n return () => {\n window.clearInterval(timer)\n }\n }, [fetchStatus, isAntigravity])\n\n const quotaInfo = useMemo(() => {\n const groups = status?.quota?.groups || []\n return selectQuotaBucketForModel(groups, selected?.model)\n }, [status?.quota?.groups, selected?.model])\n\n if (!isAntigravity || !status?.authenticated) return null\n\n const level =\n quotaInfo === null\n ? 'normal'\n : quotaInfo.remainingPercent <= 5\n ? 'danger'\n : quotaInfo.remainingPercent <= 20\n ? 'warning'\n : 'normal'\n\n const countdown = quotaInfo?.resetTime ? formatResetCountdown(quotaInfo.resetTime) : ''\n const tooltip = quotaInfo\n ? `[Antigravity] ${quotaInfo.groupName} - ${quotaInfo.bucketName}: 剩余 ${quotaInfo.remainingPercent}%${countdown ? ' (' + countdown + ')' : ''},点击刷新`\n : '点击刷新 Antigravity 配额'\n\n return (\n <span\n className=\"dsha-composer-quota\"\n data-level={level}\n title={tooltip}\n aria-label={tooltip}\n onClick={() => void fetchStatus(true)}\n >\n <span className=\"dsha-composer-quota-label\">额度</span>\n <strong className=\"dsha-composer-quota-val\">\n {loading ? '…' : quotaInfo === null ? '—' : `${quotaInfo.remainingPercent}%`}\n </strong>\n </span>\n )\n}\n\nfunction useStore<T>(store: SnapshotStore<T>): T {\n return useSyncExternalStore(\n (listener) => store.subscribe(listener),\n () => store.getSnapshot(),\n () => store.getSnapshot(),\n )\n}","const STRIP_ELEMENTS = new Set([\n 'foreignobject',\n 'script',\n 'img',\n 'iframe',\n 'object',\n 'embed',\n 'video',\n 'audio',\n 'input',\n 'button',\n 'form',\n 'link',\n 'meta',\n 'base',\n])\n\nexport function sanitizeSvg(svg: string): string {\n if (typeof DOMParser === 'undefined' || typeof XMLSerializer === 'undefined') return ''\n let doc: Document\n try {\n doc = new DOMParser().parseFromString(svg, 'image/svg+xml')\n } catch {\n return ''\n }\n if (doc.querySelector('parsererror') !== null) return ''\n if (doc.documentElement === null || doc.documentElement.localName !== 'svg') return ''\n doc.querySelectorAll('*').forEach((node) => {\n if (STRIP_ELEMENTS.has(node.localName.toLowerCase())) {\n node.remove()\n return\n }\n for (const attribute of [...node.attributes]) {\n const name = attribute.name\n const normalized = name.toLowerCase()\n if (normalized.startsWith('@') || normalized.startsWith('on')) {\n node.removeAttribute(name)\n continue\n }\n if (normalized === 'href' || normalized === 'xlink:href') {\n node.removeAttribute(name)\n }\n }\n })\n return new XMLSerializer().serializeToString(doc.documentElement)\n}","export const MERMAID_STYLE_ID = 'dsh-mermaid-renderer-style'\n\nexport function installMermaidStyles(): void {\n if (typeof document === 'undefined' || document.getElementById(MERMAID_STYLE_ID)) return\n const style = document.createElement('style')\n style.id = MERMAID_STYLE_ID\n style.textContent = `\n.dsh-mermaid-wrapper{margin:12px 0;border:1px solid var(--dsw-alias-border-l2,rgba(255,255,255,0.12));border-radius:8px;overflow:hidden;background:var(--dsw-alias-bg-layer-2,#1a1a1a);box-shadow:0 2px 8px rgba(0,0,0,0.15)}\n.dsh-mermaid-header{display:flex;align-items:center;justify-content:space-between;padding:6px 12px;background:var(--dsw-alias-bg-layer-1,rgba(0,0,0,0.25));border-bottom:1px solid var(--dsw-alias-border-l2,rgba(255,255,255,0.08));font-size:12px;color:var(--dsw-alias-label-secondary,#888)}\n.dsh-mermaid-title{font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:11px;text-transform:uppercase;letter-spacing:0.5px;color:var(--dsw-alias-label-tertiary,#aaa);font-weight:600}\n.dsh-mermaid-controls{display:flex;gap:8px;align-items:center}\n.dsh-mermaid-btn{background:transparent;border:1px solid var(--dsw-alias-border-l2,rgba(255,255,255,0.15));border-radius:4px;color:var(--dsw-alias-label-secondary,#ccc);padding:2px 8px;font-size:11px;cursor:pointer;line-height:18px;transition:all .15s}\n.dsh-mermaid-btn:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(255,255,255,0.08));color:var(--dsw-alias-label-primary,#fff);border-color:var(--dsw-alias-border-l1,rgba(255,255,255,0.3))}\n.dsh-mermaid-chart{padding:18px;overflow-x:auto;display:flex;justify-content:center;align-items:center;min-height:100px;background:var(--dsw-alias-bg-layer-2,#181818);cursor:zoom-in}\n.dsh-mermaid-chart svg{max-width:100%;height:auto;display:block;margin:0 auto}\n.dsh-mermaid-source{display:none;margin:0;padding:12px;background:var(--dsw-alias-bg-layer-1,#121212);border-top:1px solid var(--dsw-alias-border-l2,rgba(255,255,255,0.08));font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:12px;line-height:1.5;overflow-x:auto;white-space:pre-wrap;word-break:break-all}\n.dsh-mermaid-source.is-visible{display:block}\n\n/* 全屏缩放预览模态框 */\n.dsh-mermaid-modal-overlay{position:fixed;inset:0;background:rgba(0,0,0,0.8);backdrop-filter:blur(4px);z-index:99999;display:flex;flex-direction:column;justify-content:center;align-items:center}\n.dsh-mermaid-modal-toolbar{position:absolute;top:20px;right:24px;display:flex;gap:8px;background:rgba(20,20,20,0.85);border:1px solid rgba(255,255,255,0.15);border-radius:6px;padding:4px;box-shadow:0 8px 24px rgba(0,0,0,0.5)}\n.dsh-mermaid-modal-btn{background:transparent;border:0;color:#fff;font-size:14px;padding:6px 12px;cursor:pointer;border-radius:4px}\n.dsh-mermaid-modal-btn:hover{background:rgba(255,255,255,0.15)}\n.dsh-mermaid-modal-stage{flex:1;width:100%;height:100%;overflow:auto;display:flex;justify-content:center;align-items:center;padding:40px}\n.dsh-mermaid-modal-stage svg{max-width:90vw;max-height:85vh;height:auto}\n`\n document.head.append(style)\n}","import { sanitizeSvg } from './sanitize.ts'\nimport { installMermaidStyles } from './styles.ts'\n\ninterface MermaidAPI {\n initialize: (config: Record<string, unknown>) => void\n render: (id: string, text: string) => Promise<{ svg: string }>\n}\n\nlet mermaidSeq = 0\nlet mermaidPromise: Promise<MermaidAPI | null> | null = null\nconst processedHosts = new WeakSet<HTMLElement>()\n\nfunction loadMermaid(): Promise<MermaidAPI | null> {\n if (typeof window === 'undefined') return Promise.resolve(null)\n const existing = (window as unknown as { mermaid?: MermaidAPI }).mermaid\n if (existing) return Promise.resolve(existing)\n if (mermaidPromise) return mermaidPromise\n\n mermaidPromise = new Promise((resolve) => {\n const current = (window as unknown as { mermaid?: MermaidAPI }).mermaid\n if (current) {\n resolve(current)\n return\n }\n\n const script = document.createElement('script')\n script.src = '/api/dsh-chatgpt-subscription/mermaid.min.js'\n script.async = true\n script.onload = () => {\n resolve((window as unknown as { mermaid?: MermaidAPI }).mermaid || null)\n }\n script.onerror = () => {\n const cdn = document.createElement('script')\n cdn.src = 'https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.min.js'\n cdn.async = true\n cdn.onload = () => resolve((window as unknown as { mermaid?: MermaidAPI }).mermaid || null)\n cdn.onerror = () => resolve(null)\n document.head.appendChild(cdn)\n }\n document.head.appendChild(script)\n })\n\n return mermaidPromise\n}\n\nfunction isDarkTheme(): boolean {\n if (typeof document === 'undefined') return false\n const root = document.documentElement\n return (\n root.classList.contains('dark') ||\n root.getAttribute('data-theme') === 'dark' ||\n root.getAttribute('data-color-mode') === 'dark' ||\n window.matchMedia('(prefers-color-scheme: dark)').matches\n )\n}\n\nasync function initMermaidConfig(): Promise<MermaidAPI | null> {\n const m = await loadMermaid()\n if (!m) return null\n try {\n m.initialize({\n startOnLoad: false,\n securityLevel: 'strict',\n htmlLabels: false,\n theme: isDarkTheme() ? 'dark' : 'default',\n fontFamily: 'ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica, Arial, sans-serif',\n })\n } catch {\n // best-effort\n }\n return m\n}\n\nfunction openZoomModal(svgHtml: string): void {\n const overlay = document.createElement('div')\n overlay.className = 'dsh-mermaid-modal-overlay'\n\n let scale = 1\n\n overlay.innerHTML = `\n <div class=\"dsh-mermaid-modal-toolbar\">\n <button type=\"button\" class=\"dsh-mermaid-modal-btn\" data-action=\"zoom-out\" title=\"缩小\">− 缩小</button>\n <button type=\"button\" class=\"dsh-mermaid-modal-btn\" data-action=\"zoom-in\" title=\"放大\">+ 放大</button>\n <button type=\"button\" class=\"dsh-mermaid-modal-btn\" data-action=\"reset\" title=\"重置\">⟳ 重置</button>\n <button type=\"button\" class=\"dsh-mermaid-modal-btn\" data-action=\"close\" title=\"关闭\">关闭</button>\n </div>\n <div class=\"dsh-mermaid-modal-stage\">\n <div class=\"dsh-mermaid-zoom-container\">${svgHtml}</div>\n </div>\n `\n\n const stage = overlay.querySelector('.dsh-mermaid-zoom-container') as HTMLElement\n const updateTransform = () => {\n if (stage) stage.style.transform = `scale(${scale})`\n }\n\n overlay.addEventListener('click', (e) => {\n const target = e.target as HTMLElement\n const action = target?.getAttribute('data-action')\n if (action === 'close' || target === overlay) {\n overlay.remove()\n document.removeEventListener('keydown', onKeyDown)\n } else if (action === 'zoom-in') {\n scale = Math.min(5, scale * 1.25)\n updateTransform()\n } else if (action === 'zoom-out') {\n scale = Math.max(0.2, scale / 1.25)\n updateTransform()\n } else if (action === 'reset') {\n scale = 1\n updateTransform()\n }\n })\n\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n overlay.remove()\n document.removeEventListener('keydown', onKeyDown)\n }\n }\n document.addEventListener('keydown', onKeyDown)\n\n document.body.appendChild(overlay)\n}\n\nfunction findMermaidCandidate(codeEl: HTMLElement): { host: HTMLElement; code: string } | null {\n // 1. 绝对忽略我们自己渲染容器内的任何子元素\n if (codeEl.closest('.dsh-mermaid-wrapper')) return null\n\n // 2. 找到唯一的代码块宿主容器(优先 .md-code-block,其次 pre,最后自身)\n const host = (codeEl.closest('.md-code-block') as HTMLElement) || codeEl.closest('pre') || codeEl\n if (processedHosts.has(host) || host.getAttribute('data-dsh-mermaid-status')) return null\n if (host.previousElementSibling?.classList.contains('dsh-mermaid-wrapper')) return null\n\n const codeText = (codeEl.textContent || '').trim()\n if (!codeText || codeText.length < 5) return null\n\n // 3. 判断是否为 mermaid 语法或标记\n const hasMermaidClass = [...codeEl.classList].some((c) => c.toLowerCase().includes('mermaid'))\n const topText = host.firstElementChild?.textContent?.trim().toLowerCase()\n const isHeaderMermaid = topText === 'mermaid' || topText?.startsWith('mermaid ')\n\n const isGrammarStart = /^(flowchart|graph|sequenceDiagram|classDiagram|stateDiagram|erDiagram|gantt|pie|gitGraph|mindmap|timeline)\\b/i.test(codeText)\n\n if (hasMermaidClass || isHeaderMermaid || isGrammarStart) {\n return { host, code: codeText }\n }\n\n return null\n}\n\nasync function renderMermaidHost(host: HTMLElement, code: string): Promise<void> {\n // 同步立即锁死该宿主,杜绝并发与重入\n processedHosts.add(host)\n host.setAttribute('data-dsh-mermaid-status', 'processing')\n\n const m = await initMermaidConfig()\n if (!m) {\n processedHosts.delete(host)\n host.removeAttribute('data-dsh-mermaid-status')\n return\n }\n\n const renderId = `dsh-mermaid-${++mermaidSeq}`\n\n try {\n const { svg } = await m.render(renderId, code)\n const cleanSvg = sanitizeSvg(svg)\n if (!cleanSvg) {\n processedHosts.delete(host)\n host.removeAttribute('data-dsh-mermaid-status')\n return\n }\n\n // 再次双重检查:防止在异步等待期间被其他流程插入\n if (host.previousElementSibling?.classList.contains('dsh-mermaid-wrapper')) {\n host.setAttribute('data-dsh-mermaid-status', 'done')\n host.style.display = 'none'\n return\n }\n\n const wrapper = document.createElement('div')\n wrapper.className = 'dsh-mermaid-wrapper'\n\n let showSource = false\n\n wrapper.innerHTML = `\n <div class=\"dsh-mermaid-header\">\n <span class=\"dsh-mermaid-title\">Mermaid 图表</span>\n <div class=\"dsh-mermaid-controls\">\n <button type=\"button\" class=\"dsh-mermaid-btn\" data-btn=\"toggle-source\">源码</button>\n <button type=\"button\" class=\"dsh-mermaid-btn\" data-btn=\"copy\">复制</button>\n <button type=\"button\" class=\"dsh-mermaid-btn\" data-btn=\"zoom\" title=\"放大查看\">放大 ↗</button>\n </div>\n </div>\n <div class=\"dsh-mermaid-chart\" title=\"点击放大\">${cleanSvg}</div>\n <div class=\"dsh-mermaid-source\"><code>${code.replace(/</g, '<').replace(/>/g, '>')}</code></div>\n `\n\n const sourceEl = wrapper.querySelector('.dsh-mermaid-source') as HTMLElement\n const toggleBtn = wrapper.querySelector('[data-btn=\"toggle-source\"]') as HTMLButtonElement\n const copyBtn = wrapper.querySelector('[data-btn=\"copy\"]') as HTMLButtonElement\n const chartEl = wrapper.querySelector('.dsh-mermaid-chart') as HTMLElement\n\n toggleBtn?.addEventListener('click', (e) => {\n e.stopPropagation()\n showSource = !showSource\n if (showSource) {\n sourceEl.classList.add('is-visible')\n toggleBtn.textContent = '图表'\n } else {\n sourceEl.classList.remove('is-visible')\n toggleBtn.textContent = '源码'\n }\n })\n\n copyBtn?.addEventListener('click', async (e) => {\n e.stopPropagation()\n try {\n await navigator.clipboard.writeText(code)\n copyBtn.textContent = '已复制'\n setTimeout(() => {\n copyBtn.textContent = '复制'\n }, 1500)\n } catch {\n // fallback\n }\n })\n\n const handleZoom = (e: Event) => {\n e.stopPropagation()\n openZoomModal(cleanSvg)\n }\n\n wrapper.querySelector('[data-btn=\"zoom\"]')?.addEventListener('click', handleZoom)\n chartEl?.addEventListener('click', handleZoom)\n\n // 隐藏宿主并插入图表\n host.style.display = 'none'\n host.parentNode?.insertBefore(wrapper, host)\n host.setAttribute('data-dsh-mermaid-status', 'done')\n } catch {\n // 语法错误或流式未完成时释放锁,允许后续更新后重试\n processedHosts.delete(host)\n host.removeAttribute('data-dsh-mermaid-status')\n const errContainer = document.getElementById(renderId)\n if (errContainer) errContainer.remove()\n }\n}\n\nexport function scanAndRenderMermaid(): void {\n if (typeof document === 'undefined') return\n\n // 只以 code 标签为唯一的判定入口,彻底避免 querySelector 多级命中同一代码块\n const codeElements = document.querySelectorAll<HTMLElement>('pre code, .md-code-block code')\n\n for (const codeEl of codeElements) {\n const candidate = findMermaidCandidate(codeEl)\n if (candidate) {\n void renderMermaidHost(candidate.host, candidate.code)\n }\n }\n}\n\nexport function setupMermaidObserver(): () => void {\n if (typeof document === 'undefined') return () => {}\n\n installMermaidStyles()\n\n let timer: number | undefined\n const debouncedScan = () => {\n window.clearTimeout(timer)\n timer = window.setTimeout(() => {\n scanAndRenderMermaid()\n }, 250)\n }\n\n debouncedScan()\n\n const observer = new MutationObserver((mutations) => {\n let shouldScan = false\n for (const m of mutations) {\n // 只要 mutation 是我们自己的 wrapper 产生的变动,直接忽略\n for (const node of m.addedNodes) {\n if (node.nodeType === 1) {\n const el = node as HTMLElement\n if (el.classList?.contains('dsh-mermaid-wrapper') || el.closest?.('.dsh-mermaid-wrapper')) {\n continue\n }\n shouldScan = true\n break\n }\n }\n if (shouldScan) break\n }\n if (shouldScan) debouncedScan()\n })\n\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n })\n\n const themeObserver = new MutationObserver(() => {\n void initMermaidConfig()\n for (const el of document.querySelectorAll<HTMLElement>('[data-dsh-mermaid-status=\"done\"]')) {\n processedHosts.delete(el)\n el.removeAttribute('data-dsh-mermaid-status')\n const prevWrapper = el.previousElementSibling\n if (prevWrapper && prevWrapper.classList.contains('dsh-mermaid-wrapper')) {\n prevWrapper.remove()\n }\n el.style.display = ''\n }\n debouncedScan()\n })\n\n themeObserver.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class', 'data-theme', 'data-color-mode'],\n })\n\n return () => {\n observer.disconnect()\n themeObserver.disconnect()\n window.clearTimeout(timer)\n }\n}","import type { ClientContext } from '@deepseek-ai/dsh-client-runtime/client'\nimport type { ImageAttachmentRef } from '@deepseek-ai/dsh-attachment'\nimport type {} from '@deepseek-ai/dsh-client-ui-settings/client'\nimport type {} from '@deepseek-ai/dsh-client-locale/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-slots'\nimport type {} from '@deepseek-ai/dsh-client-ui-model-selection/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-conversation/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-tool/client'\nimport { CODEX_IMAGE_TOOL_NAME } from '../compat.ts'\nimport { CodexComposerQuota } from './CodexComposerQuota.tsx'\nimport { CodexImageToolView, type ImageLoader } from './CodexImageToolView.tsx'\nimport { CodexSubscriptionSection } from './CodexSubscriptionSection.tsx'\nimport { SubscriptionApi } from './api.ts'\nimport { dictionaries, NS, type LocaleKey } from './locales.ts'\nimport { installStyles } from './styles.ts'\nimport { AntigravitySection } from './antigravity/AntigravitySection.tsx'\nimport { installAntigravityStyles } from './antigravity/styles.ts'\nimport { dictionaries as antigravityDicts, NS_ANTIGRAVITY } from './antigravity/locales.ts'\nimport { AntigravityComposerQuota } from './antigravity/AntigravityComposerQuota.tsx'\nimport { setupMermaidObserver } from './mermaid/renderer.ts'\n\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\n interface LocaleNamespaceMap {\n 'dsh-chatgpt-subscription': LocaleKey\n 'dsh-antigravity': any\n }\n}\n\nexport const inject = ['slots', 'locale', 'modelDirectories', 'conversation']\n\nexport function apply(ctx: ClientContext): void {\n ctx.effect(() => ctx.locale.register(NS, dictionaries), 'dsh-chatgpt-subscription: dictionaries')\n ctx.effect(() => installStyles(), 'dsh-chatgpt-subscription: styles')\n ctx.effect(() => ctx.locale.register(NS_ANTIGRAVITY, antigravityDicts), 'dsh-antigravity: dictionaries')\n ctx.effect(() => {\n installAntigravityStyles()\n return () => {}\n }, 'dsh-antigravity: styles')\n ctx.effect(() => setupMermaidObserver(), 'dsh-mermaid: observer')\n\n const t = ctx.locale.bind(NS)\n ctx.slots.inject('settings.section', () => ctx.slots.register({\n name: 'settings.section',\n id: 'codex-subscription',\n order: 45,\n label: () => t('title'),\n locale: NS,\n }, CodexSubscriptionSection))\n\n const AntigravitySectionWrapper: React.FC = () => {\n const handleModelChange = () => {\n try {\n const conv = ctx.conversation as unknown as { activeSessionId?: string; currentSessionId?: string; activeId?: string }\n const activeSessionId = conv?.activeSessionId || conv?.currentSessionId || conv?.activeId\n if (activeSessionId && ctx.modelDirectories) {\n const dir = ctx.modelDirectories.directoryFor(activeSessionId as any)\n void dir?.load?.().catch?.(() => undefined)\n }\n } catch {\n // best-effort\n }\n }\n return <AntigravitySection onModelChange={handleModelChange} />\n }\n\n ctx.slots.inject('settings.section', () => ctx.slots.register({\n name: 'settings.section',\n id: 'antigravity',\n order: 46,\n label: () => 'Antigravity',\n locale: NS_ANTIGRAVITY,\n }, AntigravitySectionWrapper))\n ctx.slots.inject('conversation.input.right', () => ctx.slots.register({\n name: 'conversation.input.right',\n id: 'codex-subscription-quota',\n order: 35,\n locale: NS,\n inject: (sessionId) => {\n const directory = ctx.modelDirectories.directoryFor(sessionId)\n return {\n api: new SubscriptionApi(),\n directory: directory.store,\n loadModelDirectory: () => {\n void directory.load().catch(() => undefined)\n },\n }\n },\n }, CodexComposerQuota))\n ctx.slots.inject('conversation.input.right', () => ctx.slots.register({\n name: 'conversation.input.right',\n id: 'antigravity-quota',\n order: 36,\n locale: NS_ANTIGRAVITY,\n inject: (sessionId) => {\n const directory = ctx.modelDirectories.directoryFor(sessionId)\n return {\n directory: directory.store,\n loadModelDirectory: () => {\n void directory.load().catch(() => undefined)\n },\n }\n },\n }, AntigravityComposerQuota))\n ctx.slots.inject('tool.call.toolview', () => ctx.slots.register({\n name: 'tool.call.toolview',\n key: CODEX_IMAGE_TOOL_NAME,\n locale: NS,\n inject: (sessionId) => ({\n loadImage: imageLoader(ctx, sessionId),\n }),\n }, CodexImageToolView))\n}\n\nfunction imageLoader(ctx: ClientContext, sessionId: string): ImageLoader {\n const conversation = ctx.conversation as unknown as {\n resolveImage(sessionId: string, attachment: ImageAttachmentRef): Promise<string>\n }\n return (attachment) => conversation.resolveImage(sessionId, attachment)\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","names":["useStore","formatPercent","formatDate","formatCapacity","formatReset","parsePositiveCapacity","zh","en","dictionaries","API","fetchApi","parsePositiveCapacity","formatCapacity","formatDate","zh","zh","en","dictionaries","API","fetchApi","parsePositiveCapacity","formatCapacity","formatDate","formatReset","zh","zh","en","dictionaries","zh","API","fetchApi","zh","STYLE_ID","STYLE_ID","API","fetchApi","useStore","API","fetchApi","selectBadgeFacts","useStore","antigravityDicts","commandCodeDicts","kimiCodeDicts"],"sources":["../src/compat.ts","../src/client/quota.ts","../src/client/CodexComposerQuota.tsx","../src/client/CodexImageToolView.tsx","../src/shared/model-catalog.ts","../src/client/api.ts","../src/client/CodexSubscriptionSection.tsx","../src/client/antigravity/locales.ts","../src/client/antigravity/AntigravitySection.tsx","../src/shared/command-code-contracts.ts","../src/client/command-code/locales.ts","../src/client/command-code/CommandCodeSection.tsx","../src/shared/kimi-code-contracts.ts","../src/client/kimi-code/locales.ts","../src/client/kimi-code/KimiModelCapabilities.tsx","../src/client/kimi-code/KimiCodeSection.tsx","../src/client/ProviderHubSection.tsx","../src/client/locales.ts","../src/client/styles.ts","../src/client/antigravity/styles.ts","../src/client/antigravity/AntigravityComposerQuota.tsx","../src/client/command-code/CommandCodeComposerQuota.tsx","../src/client/kimi-code/KimiCodeComposerQuota.tsx","../src/client/kimi-code/styles.ts","../src/client/mermaid/sanitize.ts","../src/client/mermaid/styles.ts","../src/client/mermaid/renderer.ts","../src/client/index.tsx"],"sourcesContent":["/**\n * Compatibility constants for the ChatGPT-backed Codex flow. The backend and\n * OAuth parameters are not a public third-party API contract, so every such\n * value is isolated here for review and rollback.\n */\nexport const CHATGPT_OAUTH_ISSUER = 'https://auth.openai.com' as const\nexport const CHATGPT_OAUTH_CLIENT_ID = 'app_EMoamEEZ73f0CkXaXp7hrann' as const\nexport const OAUTH_CALLBACK_HOST = 'localhost' as const\nexport const OAUTH_CALLBACK_PORT = 1455 as const\nexport const OAUTH_CALLBACK_PATH = '/auth/callback' as const\nexport const OAUTH_REDIRECT_URI = `http://${OAUTH_CALLBACK_HOST}:${OAUTH_CALLBACK_PORT}${OAUTH_CALLBACK_PATH}` as const\nexport const OAUTH_SCOPE = 'openid profile email offline_access' as const\nexport const OAUTH_ORIGINATOR = 'opencode' as const\nexport const OAUTH_LOGIN_TIMEOUT_MS = 5 * 60_000\nexport const TOKEN_REFRESH_MARGIN_MS = 60_000\nexport const ROUTE_PREFIX = '/api/dsh-chatgpt-subscription' as const\nexport const PLUGIN_VERSION = '0.1.0-alpha.0' as const\nexport const CODEX_CHATGPT_PROVIDER_ID = 'codex-chatgpt' as const\n\nexport const CODEX_API_BASE = 'https://chatgpt.com/backend-api/codex' as const\nexport const CODEX_RESPONSES_URL = `${CODEX_API_BASE}/responses` as const\nexport const CODEX_IMAGE_GENERATION_URL = `${CODEX_API_BASE}/images/generations` as const\nexport const CODEX_SEARCH_URL = `${CODEX_API_BASE}/alpha/search` as const\nexport const CODEX_USAGE_URL = 'https://chatgpt.com/backend-api/wham/usage' as const\nexport const CODEX_RESET_CREDITS_URL = 'https://chatgpt.com/backend-api/wham/rate-limit-reset-credits' as const\nexport const CODEX_RESET_CREDITS_CONSUME_URL = `${CODEX_RESET_CREDITS_URL}/consume` as const\nexport const CODEX_ORIGINATOR = 'opencode' as const\nexport const CODEX_ENHANCED_ORIGINATOR = 'pi' as const\nexport const CODEX_IMAGE_TOOL_NAME = 'codex_image_generate' as const\nexport const CODEX_IMAGE_MODEL = 'gpt-image-2' as const\nexport const CODEX_SEARCH_PROVIDER_ID = 'codex-subscription' as const\nexport const CODEX_FETCH_PROVIDER_ID = 'codex-subscription' as const\nexport const QUOTA_CACHE_MS = 60_000\nexport const QUOTA_MIN_UPSTREAM_INTERVAL_MS = 15_000\n\nexport const OAUTH_AUTHORIZE_URL = `${CHATGPT_OAUTH_ISSUER}/oauth/authorize` as const\nexport const OAUTH_TOKEN_URL = `${CHATGPT_OAUTH_ISSUER}/oauth/token` as const\n","import type { QuotaBucketDto, QuotaStatusDto, QuotaWindowDto } from '../shared/contracts.ts'\n\nexport interface SelectedQuotaWindow {\n bucket: QuotaBucketDto\n window: QuotaWindowDto\n remainingPercent: number\n}\n\nexport function selectQuotaForModel(quota: QuotaStatusDto | undefined, modelId: string | undefined): SelectedQuotaWindow | null {\n if (quota === undefined || quota.buckets.length === 0) return null\n const model = modelId?.toLowerCase() ?? ''\n const wantsSpark = model.includes('spark')\n const bucket = wantsSpark\n ? quota.buckets.find(candidate => `${candidate.id} ${candidate.name}`.toLowerCase().includes('spark'))\n : quota.buckets.find(candidate => candidate.id === 'codex')\n ?? quota.buckets.find(candidate => candidate.name.toLowerCase() === 'codex')\n if (bucket === undefined) return null\n const windows = quotaWindows(bucket)\n if (windows.length === 0) return null\n // 优先选取 5h 等短周期额度(按 windowDurationMins 升序排序),没有短周期时选取周额度\n const sorted = [...windows].sort((a, b) => {\n const durA = a.windowDurationMins ?? Infinity\n const durB = b.windowDurationMins ?? Infinity\n return durA - durB\n })\n const window = sorted[0]!\n return {\n bucket,\n window,\n remainingPercent: Math.max(0, 100 - window.usedPercent),\n }\n}\n\nexport function quotaWindows(bucket: QuotaBucketDto): QuotaWindowDto[] {\n if (bucket.windows.length > 0) return bucket.windows\n return [bucket.primary, bucket.secondary].filter((window): window is QuotaWindowDto => window !== null)\n}\n","import { useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react'\nimport type { SnapshotStore } from '@deepseek-ai/dsh-client-runtime/client'\nimport type { ModelDirectoryState } from '@deepseek-ai/dsh-client-ui-model-selection/client'\nimport type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport { CODEX_CHATGPT_PROVIDER_ID } from '../compat.ts'\nimport type { PluginStatusDto } from '../shared/contracts.ts'\nimport { SubscriptionApi } from './api.ts'\nimport { NS } from './locales.ts'\nimport { selectQuotaForModel } from './quota.ts'\n\ntype Props = PropsRuntime<'conversation.input.right'> & PropsLocale<typeof NS> & {\n api: SubscriptionApi\n directory: SnapshotStore<ModelDirectoryState>\n loadModelDirectory: () => void\n}\n\nexport function CodexComposerQuota({ api, directory, loadModelDirectory, t }: Props): React.JSX.Element | null {\n const modelState = useStore(directory)\n const [status, setStatus] = useState<PluginStatusDto | null>(null)\n const [loading, setLoading] = useState(false)\n const mountedRef = useRef(false)\n const selected = modelState.current\n const isCodex = selected?.provider === CODEX_CHATGPT_PROVIDER_ID\n\n useEffect(() => {\n loadModelDirectory()\n }, [loadModelDirectory])\n\n useEffect(() => {\n mountedRef.current = true\n return () => {\n mountedRef.current = false\n }\n }, [])\n\n useEffect(() => {\n if (!isCodex) return\n let disposed = false\n const refresh = async (): Promise<void> => {\n setLoading(true)\n try {\n const next = await api.status()\n if (!disposed && mountedRef.current) setStatus(next)\n } catch {\n if (!disposed && mountedRef.current) setStatus(null)\n } finally {\n if (!disposed && mountedRef.current) setLoading(false)\n }\n }\n void refresh()\n const timer = window.setInterval(() => {\n if (document.visibilityState === 'visible') void refresh()\n }, 60_000)\n return () => {\n disposed = true\n window.clearInterval(timer)\n }\n }, [api, isCodex])\n\n const quota = useMemo(() => selectQuotaForModel(status?.quota, selected?.model), [selected?.model, status?.quota])\n if (!isCodex || status?.preferences.quickQuotaVisible !== true) return null\n const level = quota === null\n ? 'normal'\n : quota.remainingPercent <= 5\n ? 'danger'\n : quota.remainingPercent <= 20\n ? 'warning'\n : 'normal'\n return <span className=\"dsh-codex-composer-quota\" data-level={level} aria-label={quota === null ? t('quickQuotaLoading') : `${t('quickQuotaLabel')}: ${formatPercent(quota.remainingPercent)}`}>\n <span>{t('quickQuotaLabel')}</span>\n <strong>{quota === null ? (loading ? t('quickQuotaLoading') : '—') : formatPercent(quota.remainingPercent)}</strong>\n </span>\n}\n\nfunction useStore<T>(store: SnapshotStore<T>): T {\n return useSyncExternalStore(\n (listener) => store.subscribe(listener),\n () => store.getSnapshot(),\n () => store.getSnapshot(),\n )\n}\n\nfunction formatPercent(value: number): string {\n return `${new Intl.NumberFormat(undefined, { maximumFractionDigits: 0 }).format(value)}%`\n}\n","import { useEffect, useState } from 'react'\nimport type { ImageAttachmentRef } from '@deepseek-ai/dsh-attachment'\nimport type { ContentBlock } from '@deepseek-ai/dsh-client-connection/client'\nimport type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport { NS } from './locales.ts'\n\nexport type ImageLoader = (attachment: ImageAttachmentRef) => Promise<string>\n\ntype Props = PropsRuntime<'tool.call.toolview'> & PropsLocale<typeof NS> & {\n loadImage: ImageLoader\n}\n\nexport function CodexImageToolView({ block, loadImage, t }: Props): React.JSX.Element {\n const settled = 'kind' in block\n const isError = settled ? block.isError : false\n const prompt = promptFromBlock(block)\n const images = settled && !isError ? imageBlocks(block.content) : []\n const label = isError ? t('imageToolFailed') : settled ? t('imageToolDone') : t('imageToolRunning')\n const summary = prompt ?? textSummary(settled ? block.content : [])\n return <div className=\"dsh-codex-image-tool\" data-state={isError ? 'error' : settled ? 'done' : 'running'}>\n <div className=\"dsh-codex-image-tool-head\">\n <span className=\"dsh-codex-image-dot\" aria-hidden=\"true\" />\n <span className=\"dsh-codex-image-title\">{label}</span>\n {summary !== null ? <span className=\"dsh-codex-image-summary\">{summary}</span> : null}\n </div>\n {images.length > 0 ? <div className=\"dsh-codex-image-grid\">\n {images.map((attachment) => <GeneratedImage key={String(attachment.attachmentId)} attachment={attachment} load={loadImage} label={attachment.name ?? t('image')} t={t} />)}\n </div> : null}\n </div>\n}\n\nfunction GeneratedImage({ attachment, load, label, t }: {\n attachment: ImageAttachmentRef\n load: ImageLoader\n label: string\n t: Props['t']\n}): React.JSX.Element {\n const [src, setSrc] = useState<string | null>(null)\n const [failed, setFailed] = useState(false)\n useEffect(() => {\n let disposed = false\n setSrc(null)\n setFailed(false)\n load(attachment).then((url) => {\n if (!disposed) setSrc(url)\n }, () => {\n if (!disposed) setFailed(true)\n })\n return () => {\n disposed = true\n }\n }, [attachment, load])\n if (failed) return <span className=\"dsh-codex-image-failed\">{t('imageLoadFailed')}</span>\n if (src === null) return <span className=\"dsh-codex-image-loading\">{t('imageLoading')}</span>\n return <img className=\"dsh-codex-image-preview\" src={src} alt={label} />\n}\n\nfunction promptFromBlock(block: Props['block']): string | null {\n const raw = 'kind' in block ? block.call?.argsRaw : block.argsRaw\n if (typeof raw !== 'string' || raw.trim() === '') return null\n try {\n const value = JSON.parse(raw) as unknown\n return typeof value === 'object'\n && value !== null\n && !Array.isArray(value)\n && typeof (value as { prompt?: unknown }).prompt === 'string'\n ? (value as { prompt: string }).prompt\n : null\n } catch {\n return null\n }\n}\n\nfunction imageBlocks(blocks: readonly ContentBlock[]): ImageAttachmentRef[] {\n const result: ImageAttachmentRef[] = []\n for (const block of blocks) {\n if (block.type === 'image') result.push(block.attachment)\n if (block.type === 'tool-result') result.push(...imageBlocks(block.content))\n }\n return result\n}\n\nfunction textSummary(blocks: readonly ContentBlock[]): string | null {\n const text = blocks\n .map((block) => block.type === 'text' || block.type === 'reasoning' ? block.text : '')\n .filter(Boolean)\n .join(' ')\n .trim()\n return text === '' ? null : text\n}\n","export type CodexModelModality = 'text' | 'image'\n\nexport const GPT_56_MAX_CONTEXT_WINDOW = 1_000_000\n// Codex subscription limit from the model catalog; the public API has a different limit.\nexport const GPT_6_ASTRA_MAX_CONTEXT_WINDOW = 872_000\n\nexport interface CodexModelCatalogEntry {\n id: string\n name: string\n contextWindow: number\n inputModalities: readonly CodexModelModality[]\n defaultReasoningEffort: string\n reasoningProfile: 'standard' | 'gpt-5.6' | 'gpt-6-astra'\n supportsReasoningSummary: boolean\n fallbackModelId?: string\n}\n\nexport const CODEX_MODEL_CATALOG = [\n {\n id: 'gpt-5.6-sol',\n name: '5.6 Sol',\n contextWindow: 272_000,\n inputModalities: ['text', 'image'],\n defaultReasoningEffort: 'medium',\n reasoningProfile: 'gpt-5.6',\n supportsReasoningSummary: true,\n fallbackModelId: 'gpt-5.6-terra',\n },\n {\n id: 'gpt-6-astra',\n name: '6 Astra',\n contextWindow: 272_000,\n inputModalities: ['text', 'image'],\n defaultReasoningEffort: 'medium',\n reasoningProfile: 'gpt-6-astra',\n supportsReasoningSummary: true,\n },\n {\n id: 'gpt-5.6-terra',\n name: '5.6 Terra',\n contextWindow: 272_000,\n inputModalities: ['text', 'image'],\n defaultReasoningEffort: 'medium',\n reasoningProfile: 'gpt-5.6',\n supportsReasoningSummary: true,\n fallbackModelId: 'gpt-5.5',\n },\n {\n id: 'gpt-5.6-luna',\n name: '5.6 Luna',\n contextWindow: 272_000,\n inputModalities: ['text', 'image'],\n defaultReasoningEffort: 'medium',\n reasoningProfile: 'gpt-5.6',\n supportsReasoningSummary: true,\n fallbackModelId: 'gpt-5.5',\n },\n {\n id: 'gpt-5.5',\n name: '5.5',\n contextWindow: 272_000,\n inputModalities: ['text', 'image'],\n defaultReasoningEffort: 'medium',\n reasoningProfile: 'standard',\n supportsReasoningSummary: true,\n },\n {\n id: 'gpt-5.4',\n name: '5.4',\n contextWindow: 272_000,\n inputModalities: ['text', 'image'],\n defaultReasoningEffort: 'none',\n reasoningProfile: 'standard',\n supportsReasoningSummary: true,\n fallbackModelId: 'gpt-5.4-mini',\n },\n {\n id: 'gpt-5.4-mini',\n name: '5.4 Mini',\n contextWindow: 272_000,\n inputModalities: ['text', 'image'],\n defaultReasoningEffort: 'none',\n reasoningProfile: 'standard',\n supportsReasoningSummary: true,\n },\n {\n id: 'gpt-5.3-codex-spark',\n name: '5.3 Codex Spark',\n contextWindow: 258_000,\n inputModalities: ['text'],\n defaultReasoningEffort: 'high',\n reasoningProfile: 'standard',\n supportsReasoningSummary: false,\n },\n] as const satisfies readonly CodexModelCatalogEntry[]\n\nexport type CodexModelId = typeof CODEX_MODEL_CATALOG[number]['id']\n\nexport const DEFAULT_VISIBLE_CODEX_MODEL_IDS = [\n 'gpt-5.6-sol',\n 'gpt-6-astra',\n 'gpt-5.6-terra',\n 'gpt-5.6-luna',\n] as const satisfies readonly CodexModelId[]\n\nexport const DEFAULT_CODEX_MODEL = CODEX_MODEL_CATALOG[0]\n\nexport const CONFIGURABLE_CONTEXT_MODEL_IDS = [\n 'gpt-6-astra',\n 'gpt-5.6-sol',\n 'gpt-5.6-terra',\n 'gpt-5.6-luna',\n] as const satisfies readonly CodexModelId[]\n\nexport type ConfigurableContextModelId = typeof CONFIGURABLE_CONTEXT_MODEL_IDS[number]\n\nexport const STANDARD_REASONING_EFFORTS = ['none', 'low', 'medium', 'high', 'xhigh'] as const\nexport const GPT_56_REASONING_EFFORTS = [...STANDARD_REASONING_EFFORTS, 'max'] as const\n// Ultra in Codex also controls subagent orchestration; expose the Responses efforts here.\nexport const GPT_6_ASTRA_REASONING_EFFORTS = ['low', 'medium', 'high', 'xhigh', 'max'] as const\nexport type CodexReasoningEffort = typeof GPT_56_REASONING_EFFORTS[number]\n\nexport function reasoningEffortsForModel(model: string): readonly CodexReasoningEffort[] {\n const profile = resolveCodexCatalogEntry(model).reasoningProfile\n if (profile === 'gpt-6-astra') return GPT_6_ASTRA_REASONING_EFFORTS\n return profile === 'gpt-5.6'\n ? GPT_56_REASONING_EFFORTS\n : STANDARD_REASONING_EFFORTS\n}\n\nexport function isCodexReasoningEffort(value: unknown): value is CodexReasoningEffort {\n return typeof value === 'string' && GPT_56_REASONING_EFFORTS.some((effort) => effort === value)\n}\n\nexport function modelSupportsReasoningEffort(model: string, effort: unknown): effort is CodexReasoningEffort {\n return isCodexReasoningEffort(effort) && reasoningEffortsForModel(model).some((candidate) => candidate === effort)\n}\n\nexport function isCodexModelId(model: unknown): model is CodexModelId {\n return typeof model === 'string' && CODEX_MODEL_CATALOG.some((entry) => entry.id === model)\n}\n\nexport function isConfigurableContextModelId(model: unknown): model is ConfigurableContextModelId {\n return typeof model === 'string' && CONFIGURABLE_CONTEXT_MODEL_IDS.some((id) => id === model)\n}\n\nexport function contextWindowLimitForModel(model: ConfigurableContextModelId): number {\n return model === 'gpt-6-astra' ? GPT_6_ASTRA_MAX_CONTEXT_WINDOW : GPT_56_MAX_CONTEXT_WINDOW\n}\n\nexport function resolveCodexCatalogEntry(model: string): CodexModelCatalogEntry {\n return CODEX_MODEL_CATALOG.find((entry) => entry.id === model) ?? DEFAULT_CODEX_MODEL\n}\n\nexport function codexModelSupportsImageInput(model: string): boolean {\n return resolveCodexCatalogEntry(model).inputModalities.includes('image')\n}\n\nexport function codexModelSupportsReasoningSummary(model: string): boolean {\n return resolveCodexCatalogEntry(model).supportsReasoningSummary\n}\n\nexport function resolveCodexFallbackModel(model: string): CodexModelCatalogEntry | undefined {\n const entry = resolveCodexCatalogEntry(model)\n if (!entry.fallbackModelId) return undefined\n return CODEX_MODEL_CATALOG.find((cand) => cand.id === entry.fallbackModelId)\n}\n","import { ROUTE_PREFIX } from '../compat.ts'\nimport type {\n ApiEnvelope,\n LoginEventDto,\n LoginStartDto,\n PluginStatusDto,\n QuotaStatusDto,\n ConnectionTestDto,\n SubscriptionPreferencesDto,\n SubscriptionPreferencesUpdateDto,\n} from '../shared/contracts.ts'\n\nexport class SubscriptionApi {\n status(): Promise<PluginStatusDto> {\n return request<PluginStatusDto>(`${ROUTE_PREFIX}/status`)\n }\n\n startLogin(): Promise<LoginStartDto> {\n return post<LoginStartDto>(`${ROUTE_PREFIX}/login/start`, {})\n }\n\n cancelLogin(loginId: string): Promise<{ cancelled: boolean }> {\n return post(`${ROUTE_PREFIX}/login/cancel`, { loginId })\n }\n\n logout(): Promise<{ authenticated: false }> {\n return post(`${ROUTE_PREFIX}/logout`, {})\n }\n\n refresh(): Promise<PluginStatusDto> {\n return post(`${ROUTE_PREFIX}/token/refresh`, {})\n }\n\n refreshQuota(): Promise<QuotaStatusDto> {\n return post(`${ROUTE_PREFIX}/quota/refresh`, {})\n }\n\n useResetCredit(): Promise<QuotaStatusDto> {\n return post(`${ROUTE_PREFIX}/quota/reset-credit/use`, {})\n }\n\n testConnection(): Promise<ConnectionTestDto> {\n return post(`${ROUTE_PREFIX}/connection/test`, {})\n }\n\n updatePreferences(patch: SubscriptionPreferencesUpdateDto): Promise<SubscriptionPreferencesDto> {\n return post(`${ROUTE_PREFIX}/preferences/update`, patch)\n }\n\n events(loginId: string): EventSource {\n return new EventSource(`${ROUTE_PREFIX}/login/events?loginId=${encodeURIComponent(loginId)}`)\n }\n}\n\nasync function post<T>(url: string, body: object): Promise<T> {\n return request<T>(url, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(body),\n })\n}\n\nasync function request<T>(url: string, init?: RequestInit): Promise<T> {\n const response = await fetch(url, { ...init, credentials: 'same-origin' })\n const envelope = await response.json() as ApiEnvelope<T>\n if (!response.ok || !envelope.ok) {\n throw new Error(envelope.ok ? `Request failed (${response.status})` : envelope.error.message)\n }\n return envelope.value\n}\n\nexport function parseLoginEvent(event: MessageEvent<string>): LoginEventDto | null {\n try {\n const value = JSON.parse(event.data) as LoginEventDto\n return typeof value === 'object' && value !== null && typeof value.type === 'string' ? value : null\n } catch {\n return null\n }\n}\n","import { useCallback, useEffect, useRef, useState } from 'react'\nimport type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { CodexReasoningSummary, CredentialStorageDto, PluginStatusDto, QuotaBucketDto, QuotaWindowDto, SearchProviderPreference, SubscriptionPreferencesUpdateDto } from '../shared/contracts.ts'\nimport { CODEX_MODEL_CATALOG, CONFIGURABLE_CONTEXT_MODEL_IDS, DEFAULT_VISIBLE_CODEX_MODEL_IDS, GPT_56_MAX_CONTEXT_WINDOW, contextWindowLimitForModel, resolveCodexCatalogEntry } from '../shared/model-catalog.ts'\nimport { SubscriptionApi, parseLoginEvent } from './api.ts'\nimport { NS } from './locales.ts'\nimport { quotaWindows } from './quota.ts'\n\ntype Props = PropsRuntime<'settings.section'> & PropsLocale<typeof NS>\ntype BusyAction = 'login' | 'token' | 'quota' | 'reset-credit' | 'test' | 'logout' | 'preferences' | null\ntype Translate = Props['t']\n\nexport function CodexSubscriptionSection({ t }: Props): React.JSX.Element {\n const apiRef = useRef(new SubscriptionApi())\n const eventSourceRef = useRef<EventSource | null>(null)\n const [status, setStatus] = useState<PluginStatusDto | null>(null)\n const [busy, setBusy] = useState<BusyAction>(null)\n const [error, setError] = useState<string | null>(null)\n const [authUrl, setAuthUrl] = useState<string | null>(null)\n const [popupBlocked, setPopupBlocked] = useState(false)\n const [resetCreditNotice, setResetCreditNotice] = useState<string | null>(null)\n const [connection, setConnection] = useState<{ latencyMs: number; checkedAt: number } | null>(null)\n const [contextDrafts, setContextDrafts] = useState<Record<string, string>>({})\n const [customProxyDraft, setCustomProxyDraft] = useState<string | null>(null)\n\n const load = useCallback(async (quiet = false) => {\n if (!quiet) setError(null)\n try {\n const next = await apiRef.current.status()\n setStatus(next)\n if (next.error !== undefined) setError(next.error.message)\n } catch (cause) {\n if (!quiet) setError(messageOf(cause))\n }\n }, [])\n\n useEffect(() => {\n void load()\n const refreshWhenVisible = (): void => {\n if (document.visibilityState === 'visible') void load(true)\n }\n document.addEventListener('visibilitychange', refreshWhenVisible)\n const timer = window.setInterval(refreshWhenVisible, 60_000)\n return () => {\n window.clearInterval(timer)\n document.removeEventListener('visibilitychange', refreshWhenVisible)\n eventSourceRef.current?.close()\n }\n }, [load])\n\n const watchLogin = useCallback((loginId: string) => {\n eventSourceRef.current?.close()\n const source = apiRef.current.events(loginId)\n eventSourceRef.current = source\n const finish = async (message?: string): Promise<void> => {\n source.close()\n eventSourceRef.current = null\n setBusy(null)\n setAuthUrl(null)\n if (message !== undefined) setError(message)\n // Preserve the terminal OAuth error while refreshing the account DTO.\n await load(true)\n }\n source.addEventListener('completed', (event) => {\n const parsed = parseLoginEvent(event as MessageEvent<string>)\n if (parsed?.type === 'completed') void finish()\n })\n source.addEventListener('cancelled', () => void finish())\n source.addEventListener('failed', (event) => {\n const parsed = parseLoginEvent(event as MessageEvent<string>)\n void finish(parsed?.type === 'failed' ? parsed.error.message : 'ChatGPT sign-in failed.')\n })\n }, [load])\n\n useEffect(() => {\n const loginId = status?.login.active ? status.login.loginId : null\n if (loginId !== null && loginId !== undefined && eventSourceRef.current === null) watchLogin(loginId)\n }, [status?.login.active, status?.login.loginId, watchLogin])\n\n const startLogin = async (): Promise<void> => {\n setBusy('login')\n setError(null)\n setPopupBlocked(false)\n const popup = window.open('about:blank', 'dsh-chatgpt-oauth', 'popup,width=560,height=760')\n try {\n const login = await apiRef.current.startLogin()\n setAuthUrl(login.authUrl)\n if (popup === null) setPopupBlocked(true)\n else popup.location.replace(login.authUrl)\n watchLogin(login.loginId)\n await load(true)\n } catch (cause) {\n popup?.close()\n setBusy(null)\n setError(messageOf(cause))\n }\n }\n\n const cancelLogin = async (): Promise<void> => {\n const loginId = status?.login.loginId\n if (loginId === null || loginId === undefined) return\n setBusy('login')\n try {\n await apiRef.current.cancelLogin(loginId)\n eventSourceRef.current?.close()\n eventSourceRef.current = null\n setAuthUrl(null)\n await load()\n } catch (cause) {\n setError(messageOf(cause))\n } finally {\n setBusy(null)\n }\n }\n\n const refreshToken = async (): Promise<void> => run('token', async () => {\n setStatus(await apiRef.current.refresh())\n })\n\n const refreshQuota = async (): Promise<void> => run('quota', async () => {\n const quota = await apiRef.current.refreshQuota()\n setStatus((current) => current === null ? current : { ...current, quota })\n })\n\n const useResetCredit = async (): Promise<void> => {\n if (!window.confirm(t('useResetCreditConfirm'))) return\n await run('reset-credit', async () => {\n const quota = await apiRef.current.useResetCredit()\n setStatus((current) => current === null ? current : { ...current, quota })\n setResetCreditNotice(t('resetCreditUsed'))\n })\n }\n\n const testConnection = async (): Promise<void> => run('test', async () => {\n const result = await apiRef.current.testConnection()\n setConnection({ latencyMs: result.latencyMs, checkedAt: result.checkedAt })\n })\n\n const updatePreferences = async (patch: SubscriptionPreferencesUpdateDto): Promise<void> => run('preferences', async () => {\n const preferences = await apiRef.current.updatePreferences(patch)\n setStatus((current) => current === null ? current : { ...current, preferences })\n })\n\n const selectSearchProvider = (provider: SearchProviderPreference): void => {\n setStatus(current => current ? { ...current, preferences: { ...current.preferences, searchProvider: provider } } : current)\n void updatePreferences({ searchProvider: provider })\n }\n\n const toggleVisibleModel = async (modelId: string, checked: boolean): Promise<void> => {\n const current = status?.preferences.visibleModelIds ?? [...DEFAULT_VISIBLE_CODEX_MODEL_IDS]\n const visibleModelIds = checked ? [...current, modelId] : current.filter(id => id !== modelId)\n if (visibleModelIds.length === 0) return\n await updatePreferences({ visibleModelIds })\n }\n\n const updateContextWindow = async (model: (typeof CONFIGURABLE_CONTEXT_MODEL_IDS)[number]): Promise<void> => {\n const current = status?.preferences.contextWindowOverrides[model] ?? resolveCodexCatalogEntry(model).contextWindow\n const parsed = parseCapacity(contextDrafts[model] ?? String(current), contextWindowLimitForModel(model))\n if (parsed === null) {\n setError(t('contextWindowInvalid'))\n return\n }\n await updatePreferences({ contextWindowOverrides: { [model]: parsed } })\n setContextDrafts((drafts) => ({ ...drafts, [model]: String(parsed) }))\n }\n\n const updateCustomProxyUrl = async (): Promise<void> => {\n const draft = customProxyDraft?.trim()\n await updatePreferences({ customProxyUrl: draft ? draft : null })\n setCustomProxyDraft(null)\n }\n\n const logout = async (): Promise<void> => run('logout', async () => {\n await apiRef.current.logout()\n eventSourceRef.current?.close()\n eventSourceRef.current = null\n setAuthUrl(null)\n setConnection(null)\n await load()\n })\n\n const run = async (action: Exclude<BusyAction, null>, task: () => Promise<void>): Promise<void> => {\n setBusy(action)\n setError(null)\n setResetCreditNotice(null)\n try {\n await task()\n } catch (cause) {\n setError(messageOf(cause))\n } finally {\n setBusy(null)\n }\n }\n\n const account = status?.account\n const preferences = status?.preferences\n const quota = status?.quota\n const storage = status?.storage\n const login = status?.login\n const visibleModelIds = preferences?.visibleModelIds ?? DEFAULT_VISIBLE_CODEX_MODEL_IDS\n return <section className=\"dsh-codex-page\" aria-labelledby=\"dsh-codex-title\">\n <header>\n <h2 id=\"dsh-codex-title\" className=\"dsh-codex-title\">{t('title')}</h2>\n <p className=\"dsh-codex-intro\">{t('intro')}</p>\n </header>\n\n {error !== null ? <div className=\"dsh-codex-errorbar\" role=\"alert\">\n <span>{error}</span>\n {status === null ? <Button disabled={busy !== null} onClick={() => load()}>{t('retry')}</Button> : null}\n </div> : null}\n\n {status === null && error === null ? <Skeleton label={t('loading')} /> : <>\n <Section title={t('account')}>\n <InfoRow label={status?.authenticated ? t('signedIn') : t('signedOut')} value={account?.email ?? '—'} />\n {status?.authenticated ? <>\n <InfoRow label={t('plan')} value={account?.planType ?? t('unknown')} />\n <InfoRow label={t('accountId')} value={account?.accountIdSuffix ?? '—'} />\n <InfoRow label={t('expires')} value={formatDate(account?.tokenExpiresAt)} />\n </> : null}\n <InfoRow label={t('storage')} value={storageLabel(storage, t)} />\n <p className=\"dsh-codex-notice\">{storageNotice(storage, t)}</p>\n {login?.active ? <p className=\"dsh-codex-muted\" role=\"status\">{t('pending')}</p> : null}\n {popupBlocked ? <p className=\"dsh-codex-error\">{t('popupBlocked')}</p> : null}\n {authUrl !== null ? <a className=\"dsh-codex-link\" href={authUrl} target=\"_blank\" rel=\"noreferrer\">{t('continueLogin')}</a> : null}\n <div className=\"dsh-codex-actions\">\n {login?.active\n ? <Button disabled={busy !== null} onClick={cancelLogin}>{t('cancel')}</Button>\n : <Button primary disabled={busy !== null || storage?.available === false} onClick={startLogin}>{status?.authenticated ? t('signInAgain') : t('signIn')}</Button>}\n {status?.authenticated ? <>\n <Button disabled={busy !== null} onClick={refreshToken}>{t('refreshToken')}</Button>\n <Button disabled={busy !== null} onClick={logout}>{t('signOut')}</Button>\n </> : null}\n </div>\n </Section>\n\n <Section title={t('connection')}>\n <InfoRow label={t('provider')} value=\"Codex(ChatGPT 订阅) · codex-chatgpt\" />\n <InfoRow label={t('connectionState')} value={connection === null ? t('untested') : t('connected')} />\n {connection !== null ? <InfoRow label={t('latency')} value={`${connection.latencyMs} ms · ${formatDate(connection.checkedAt)}`} /> : null}\n <p className=\"dsh-codex-muted dsh-codex-models-hint\">{t('modelsHint')}</p>\n <div className=\"dsh-codex-models\" aria-label={t('models')}>\n {CODEX_MODEL_CATALOG.map((model) => {\n const checked = visibleModelIds.some(id => id === model.id)\n const lastVisible = checked && visibleModelIds.length === 1\n return <label key={model.id} title={model.id}>\n <input type=\"checkbox\" checked={checked} disabled={busy !== null || lastVisible} onChange={(event) => void toggleVisibleModel(model.id, event.currentTarget.checked)} />\n <span>{model.name}</span>\n </label>\n })}\n </div>\n <div className=\"dsh-codex-actions\">\n <Button disabled={!status?.authenticated || busy !== null} onClick={testConnection}>{busy === 'test' ? t('testing') : t('testConnection')}</Button>\n </div>\n </Section>\n\n <Section title={t('proxySettings')}>\n <div className=\"dsh-codex-pref-row\">\n <div>\n <strong>{t('proxyMode')}</strong>\n <p className=\"dsh-codex-muted\">{t('proxyModeHint')}</p>\n </div>\n <select\n className=\"dsh-codex-select\"\n aria-label={t('proxyMode')}\n value={preferences?.proxyMode ?? 'auto'}\n disabled={busy !== null}\n onChange={(event) => {\n const mode = event.currentTarget.value as 'auto' | 'custom' | 'direct'\n setStatus(current => current ? { ...current, preferences: { ...current.preferences, proxyMode: mode } } : current)\n void updatePreferences({ proxyMode: mode })\n }}\n >\n <option value=\"auto\">{t('proxyModeAuto')}</option>\n <option value=\"custom\">{t('proxyModeCustom')}</option>\n <option value=\"direct\">{t('proxyModeDirect')}</option>\n </select>\n </div>\n\n {(preferences?.proxyMode ?? 'auto') === 'auto' ? <div className=\"dsh-codex-proxy-status\">\n {status?.detectedProxy ? <>\n <span>{t('proxyDetected')}:</span>\n <code className=\"dsh-codex-proxy-tag\">{status.detectedProxy}</code>\n <span className=\"dsh-codex-success\">{t('proxyDetectedEffective')}</span>\n </> : <span className=\"dsh-codex-muted\">{t('proxyNoneDetected')}</span>}\n </div> : null}\n\n {preferences?.proxyMode === 'direct' ? <p className=\"dsh-codex-muted\" style={{ margin: '8px 0 0' }}>{t('proxyDirectHint')}</p> : null}\n\n {preferences?.proxyMode === 'custom' ? <div className=\"dsh-codex-context-settings\">\n <div>\n <strong>{t('customProxyUrl')}</strong>\n <p className=\"dsh-codex-muted\">{t('customProxyUrlHint')}</p>\n </div>\n <div className=\"dsh-codex-context-row\">\n <span className=\"dsh-codex-proxy-control\">\n <input\n id=\"dsh-codex-custom-proxy\"\n type=\"text\"\n placeholder={t('customProxyUrlPlaceholder')}\n value={customProxyDraft ?? (preferences?.customProxyUrl ?? '')}\n disabled={busy !== null}\n aria-label={t('customProxyUrl')}\n onChange={(event) => {\n setCustomProxyDraft(event.currentTarget.value)\n }}\n onKeyDown={(event) => {\n if (event.key !== 'Enter') return\n event.preventDefault()\n void updateCustomProxyUrl()\n }}\n />\n <button\n className=\"dsh-codex-context-save\"\n type=\"button\"\n aria-label={t('saveProxyUrl')}\n disabled={busy !== null || customProxyDraft === null}\n onClick={() => void updateCustomProxyUrl()}\n >\n {t('save')}\n </button>\n </span>\n </div>\n </div> : null}\n </Section>\n\n <Section title={t('enhancements')}>\n <div className=\"dsh-codex-pref-row\">\n <div>\n <strong>{t('searchProvider')}</strong>\n <p className=\"dsh-codex-muted\">{t('searchProviderHint')}</p>\n </div>\n <div className=\"dsh-codex-segments\" role=\"group\" aria-label={t('searchProvider')}>\n <button\n type=\"button\"\n className={preferences?.searchProvider === 'dsh' ? 'active' : ''}\n aria-pressed={preferences?.searchProvider === 'dsh'}\n disabled={busy !== null}\n onClick={() => selectSearchProvider('dsh')}\n >\n {t('searchProviderDsh')}\n </button>\n <button\n type=\"button\"\n className={preferences?.searchProvider === 'codex' ? 'active' : ''}\n aria-pressed={preferences?.searchProvider === 'codex'}\n disabled={busy !== null}\n onClick={() => selectSearchProvider('codex')}\n >\n {t('searchProviderCodex')}\n </button>\n </div>\n </div>\n <div className=\"dsh-codex-pref-row\">\n <div>\n <strong>{t('outputVerbosity')}</strong>\n <p className=\"dsh-codex-muted\">{t('outputVerbosityHint')}</p>\n </div>\n <select className=\"dsh-codex-select\" aria-label={t('outputVerbosity')} value={preferences?.outputVerbosity ?? ''} disabled={busy !== null} onChange={(event) => {\n const value = event.currentTarget.value\n void updatePreferences({ outputVerbosity: value === '' ? null : value as 'low' | 'medium' | 'high' })\n }}>\n <option value=\"\">{t('providerDefault')}</option>\n <option value=\"low\">{t('verbosityLow')}</option>\n <option value=\"medium\">{t('verbosityMedium')}</option>\n <option value=\"high\">{t('verbosityHigh')}</option>\n </select>\n </div>\n <div className=\"dsh-codex-pref-row\">\n <div>\n <strong>{t('reasoningSummary')}</strong>\n <p className=\"dsh-codex-muted\">{t('reasoningSummaryHint')}</p>\n </div>\n <select className=\"dsh-codex-select\" aria-label={t('reasoningSummary')} value={preferences?.reasoningSummary ?? ''} disabled={busy !== null} onChange={(event) => {\n const value = event.currentTarget.value\n void updatePreferences({ reasoningSummary: value === '' ? null : value as CodexReasoningSummary })\n }}>\n <option value=\"\">{t('providerDefault')}</option>\n <option value=\"auto\">{t('summaryAuto')}</option>\n <option value=\"concise\">{t('summaryConcise')}</option>\n <option value=\"detailed\">{t('summaryDetailed')}</option>\n <option value=\"none\">{t('summaryNone')}</option>\n </select>\n </div>\n <div className=\"dsh-codex-context-settings\">\n <div>\n <strong>{t('contextWindows')}</strong>\n <p className=\"dsh-codex-muted\">{t('contextWindowsHint')}</p>\n </div>\n {CONFIGURABLE_CONTEXT_MODEL_IDS.map((model) => {\n const entry = resolveCodexCatalogEntry(model)\n const fallback = preferences?.contextWindowOverrides?.[model] ?? entry.contextWindow\n const draft = contextDrafts[model]\n const parsedDraft = draft === undefined ? fallback : parseCapacity(draft, contextWindowLimitForModel(model))\n const dirty = draft !== undefined && parsedDraft !== fallback\n const inputId = `dsh-codex-context-${model}`\n return <div className=\"dsh-codex-context-row\" key={model}>\n <label htmlFor={inputId}>{entry.name}</label>\n <span className=\"dsh-codex-capacity-control\">\n <input id={inputId} type=\"text\" inputMode=\"numeric\" value={draft ?? formatCapacity(fallback)} disabled={busy !== null} aria-label={entry.name + ' ' + t('contextWindow')} onChange={(event) => {\n const value = event.currentTarget.value\n setContextDrafts((drafts) => ({ ...drafts, [model]: value }))\n }} onKeyDown={(event) => {\n if (event.key !== 'Enter' || !dirty) return\n event.preventDefault()\n void updateContextWindow(model)\n }} />\n <small>{t('tokens')}</small>\n <button className=\"dsh-codex-context-save\" type=\"button\" data-model={model} aria-label={entry.name + ' ' + t('saveContextWindow')} disabled={busy !== null || !dirty} onClick={() => void updateContextWindow(model)}>{t('save')}</button>\n </span>\n </div>\n })}\n </div>\n <label className=\"dsh-codex-check\">\n <input type=\"checkbox\" checked={preferences?.fastMode === true} disabled={busy !== null} onChange={(event) => updatePreferences({ fastMode: event.currentTarget.checked })} />\n <span>\n <strong>{t('fastMode')}</strong>\n <small>{t('fastModeHint')}</small>\n </span>\n </label>\n <label className=\"dsh-codex-check\">\n <input type=\"checkbox\" checked={preferences?.quickQuotaVisible === true} disabled={busy !== null} onChange={(event) => updatePreferences({ quickQuotaVisible: event.currentTarget.checked })} />\n <span>\n <strong>{t('quickQuota')}</strong>\n <small>{t('quickQuotaHint')}</small>\n </span>\n </label>\n </Section>\n\n <Section title={t('quota')} aside={<Button disabled={!status?.authenticated || busy !== null} onClick={refreshQuota}>{busy === 'quota' ? t('refreshing') : t('refreshQuota')}</Button>}>\n <p className=\"dsh-codex-muted\">{t('quotaIntro')}</p>\n {quota?.state === 'signed-out' || !status?.authenticated ? <p className=\"dsh-codex-empty\">{t('quotaSignedOut')}</p> : null}\n {quota?.buckets?.map((bucket) => <QuotaBucket key={bucket.id} bucket={bucket} t={t} />)}\n {quota?.credits !== null && quota?.credits !== undefined ? <QuotaFact label={t('credits')} value={quota.credits.unlimited ? t('unlimited') : quota.credits.balance ?? (quota.credits.hasCredits ? t('available') : t('unavailable'))} /> : null}\n {quota?.individualLimit !== null && quota?.individualLimit !== undefined ? <QuotaFact label={t('monthlySpend')} value={individualLimitLabel(quota.individualLimit, t)} /> : null}\n {quota?.resetCredits !== null && quota?.resetCredits !== undefined ? <ResetCreditsFact resetCredits={quota.resetCredits} busy={busy} onUse={useResetCredit} t={t} /> : null}\n {resetCreditNotice !== null ? <p className=\"dsh-codex-success\" role=\"status\">{resetCreditNotice}</p> : null}\n {quota?.spendControlReached === true ? <p className=\"dsh-codex-warning\" role=\"status\">{t('spendControlReached')}</p> : null}\n {quota?.state === 'empty' ? <p className=\"dsh-codex-empty\">{t('noQuota')}</p> : null}\n {quota?.stale ? <p className=\"dsh-codex-warning\" role=\"status\">{t('stale')}</p> : null}\n {quota?.error ? <p className=\"dsh-codex-error\" role=\"alert\">{quota.error.message}</p> : null}\n {quota?.fetchedAt ? <p className=\"dsh-codex-timestamp\">{t('updated')}: {formatDate(quota.fetchedAt)}</p> : null}\n </Section>\n </>}\n\n <span className=\"dsh-codex-sr\" aria-live=\"polite\">{busy === null ? '' : busy}</span>\n </section>\n}\n\nfunction Section({ title, aside, children }: { title: string; aside?: React.ReactNode; children: React.ReactNode }): React.JSX.Element {\n return <section className=\"dsh-codex-group\">\n <div className=\"dsh-codex-grouphead\"><h3>{title}</h3>{aside}</div>\n {children}\n </section>\n}\n\nfunction Button({ primary = false, disabled, onClick, children }: { primary?: boolean; disabled?: boolean; onClick: () => void | Promise<void>; children: React.ReactNode }): React.JSX.Element {\n return <button className={`dsh-codex-button${primary ? ' dsh-codex-button-primary' : ''}`} type=\"button\" disabled={disabled} onClick={() => void onClick()}>{children}</button>\n}\n\nfunction InfoRow({ label, value }: { label: string; value: string }): React.JSX.Element {\n return <div className=\"dsh-codex-row\"><span className=\"dsh-codex-label\">{label}</span><span className=\"dsh-codex-value\">{value}</span></div>\n}\n\nexport function storageLabel(storage: CredentialStorageDto | undefined, t: Translate): string {\n if (storage === undefined || !storage.available) return t('storageUnavailable')\n if (storage.kind === 'windows-dpapi') return t('storageWindows')\n if (storage.kind === 'macos-keychain') return t('storageMacKeychain')\n if (storage.kind === 'linux-file') return t('storageLinuxFile')\n if (storage.kind === 'memory') return t('storageMemory')\n return t('storageUnavailable')\n}\n\nexport function storageNotice(storage: CredentialStorageDto | undefined, t: Translate): string {\n if (storage === undefined || !storage.available) return t('securityUnavailable')\n if (storage.kind === 'windows-dpapi') return t('securityWindows')\n if (storage.kind === 'macos-keychain') return t('securityMacKeychain')\n if (storage.kind === 'linux-file') return t('securityLinuxFile')\n if (storage.kind === 'memory') return t('securityMemory')\n return t('securityUnavailable')\n}\n\nfunction QuotaBucket({ bucket, t }: { bucket: QuotaBucketDto; t: Translate }): React.JSX.Element {\n const windows = quotaWindows(bucket)\n return <article className=\"dsh-codex-quota-card\">\n <div className=\"dsh-codex-quota-title\"><strong>{bucket.name}</strong>{bucket.planType ? <span>{bucket.planType}</span> : null}</div>\n {windows.map((window, index) => <QuotaBar key={`${window.windowDurationMins ?? 'x'}:${window.resetsAt ?? 'x'}:${index}`} label={windowLabel(window.windowDurationMins, t)} window={window} t={t} />)}\n </article>\n}\n\nfunction QuotaFact({ label, value }: { label: string; value: string }): React.JSX.Element {\n return <div className=\"dsh-codex-quota-fact\"><span>{label}</span><strong>{value}</strong></div>\n}\n\nexport function ResetCreditsFact({ resetCredits, busy, onUse, t }: { resetCredits: NonNullable<PluginStatusDto['quota']['resetCredits']>; busy: BusyAction; onUse: () => Promise<void>; t: Translate }): React.JSX.Element {\n const available = resetCredits.availableCount > 0\n return <div className=\"dsh-codex-reset-credits\">\n <div className=\"dsh-codex-reset-credits-info\">\n <span>{t('resetCredits')}</span>\n <strong>{resetCredits.availableCount}</strong>\n <small>{t('resetCreditExpires')}: {resetCredits.expiresAt == null ? t('unknown') : formatReset(resetCredits.expiresAt)}</small>\n </div>\n <Button primary disabled={!available || busy !== null} onClick={onUse}>{busy === 'reset-credit' ? t('usingResetCredit') : t('useResetCredit')}</Button>\n </div>\n}\n\nexport function QuotaBar({ label, window, t }: { label: string; window: QuotaWindowDto; t: Translate }): React.JSX.Element {\n const percent = typeof window?.usedPercent === 'number' && Number.isFinite(window.usedPercent) ? window.usedPercent : 0\n const level = percent >= 95 ? 'danger' : percent >= 80 ? 'warning' : 'normal'\n const remaining = Math.max(0, 100 - percent)\n return <div className=\"dsh-codex-meter-wrap\">\n <div className=\"dsh-codex-meter-label\"><span>{label}</span><strong>{formatPercent(percent)}</strong></div>\n <div className={`dsh-codex-meter dsh-codex-meter-${level}`} role=\"progressbar\" aria-label={`${label}: ${formatPercent(percent)} ${t('used')}`} aria-valuemin={0} aria-valuemax={100} aria-valuenow={percent}>\n <span style={{ width: `${Math.min(100, Math.max(0, percent))}%` }} />\n </div>\n <div className=\"dsh-codex-meter-meta\">\n <span>{percent >= 100 ? `${t('exhausted')} · ${formatPercent(remaining)} ${t('remaining')}` : `${formatPercent(percent)} ${t('used')} · ${formatPercent(remaining)} ${t('remaining')}`}</span>\n <span>{window?.resetsAt == null ? '—' : `${t('resets')}: ${formatReset(window.resetsAt)}`}</span>\n </div>\n </div>\n}\n\nfunction Skeleton({ label }: { label: string }): React.JSX.Element {\n return <div className=\"dsh-codex-skeleton\" role=\"status\" aria-label={label}><span /><span /></div>\n}\n\nexport function windowLabel(minutes: number | null | undefined, t: Translate): string {\n if (minutes === null || minutes === undefined || typeof minutes !== 'number' || !Number.isFinite(minutes) || minutes <= 0) return t('limitWindow')\n const [value, unit]: [number, Intl.NumberFormatOptions['unit']] = minutes >= 1440 && minutes % 1440 === 0\n ? [minutes / 1440, 'day']\n : minutes >= 60 && minutes % 60 === 0\n ? [minutes / 60, 'hour']\n : [Math.round(minutes), 'minute']\n try {\n return `${new Intl.NumberFormat(undefined, { style: 'unit', unit, unitDisplay: 'long' }).format(value)} ${t('limitWindow')}`\n } catch {\n return `${value} ${t('limitWindow')}`\n }\n}\n\nexport function parsePositiveCapacity(value: string): number | null {\n const normalized = value.trim().toLowerCase().replace(/[,_\\s]/g, '')\n const matched = normalized.match(/^(\\d+(?:\\.\\d+)?)(k|m)?$/)\n if (matched === null) return null\n const multiplier = matched[2] === 'm' ? 1_000_000 : matched[2] === 'k' ? 1_000 : 1\n const parsed = Number(matched[1]) * multiplier\n return Number.isSafeInteger(parsed) && parsed >= 1 ? parsed : null\n}\n\nexport function parseCapacity(value: string, maxContextWindow = GPT_56_MAX_CONTEXT_WINDOW): number | null {\n const parsed = parsePositiveCapacity(value)\n return parsed !== null && parsed <= maxContextWindow ? parsed : null\n}\n\nfunction formatCapacity(value: number): string {\n if (value % 1_000 === 0) return `${value / 1_000}K`\n return String(value)\n}\n\nfunction formatPercent(value: number | undefined | null): string {\n if (value === undefined || value === null || typeof value !== 'number' || !Number.isFinite(value)) return '0%'\n try {\n return `${new Intl.NumberFormat(undefined, { maximumFractionDigits: 1 }).format(value)}%`\n } catch {\n return `${value}%`\n }\n}\n\nfunction individualLimitLabel(limit: NonNullable<PluginStatusDto['quota']['individualLimit']>, t: Translate): string {\n const parts = [\n limit.remainingPercent !== null && limit.remainingPercent !== undefined ? `${formatPercent(limit.remainingPercent)} ${t('remaining')}` : null,\n limit.limit !== null && limit.limit !== undefined ? `${t('limit')}: ${limit.limit}` : null,\n limit.used !== null && limit.used !== undefined ? `${t('used')}: ${limit.used}` : null,\n limit.resetsAt !== null && limit.resetsAt !== undefined ? `${t('resets')}: ${formatReset(limit.resetsAt)}` : null,\n ].filter((part): part is string => part !== null)\n return parts.length > 0 ? parts.join(' · ') : t('unknown')\n}\n\nfunction formatDate(seconds: number | undefined | null): string {\n if (seconds === undefined || seconds === null || typeof seconds !== 'number' || !Number.isFinite(seconds) || seconds <= 0) return '—'\n const ms = seconds > 10_000_000_000 ? seconds : seconds * 1000\n try {\n return new Intl.DateTimeFormat(undefined, { dateStyle: 'medium', timeStyle: 'short' }).format(ms)\n } catch {\n return '—'\n }\n}\n\nexport function formatReset(seconds: number | undefined | null): string {\n if (seconds === undefined || seconds === null || typeof seconds !== 'number' || !Number.isFinite(seconds) || seconds <= 0) return '—'\n const ms = seconds > 10_000_000_000 ? seconds : seconds * 1000\n const absolute = formatDate(seconds)\n const diff = ms - Date.now()\n const abs = Math.abs(diff)\n const [amount, unit]: [number, Intl.RelativeTimeFormatUnit] = abs >= 86_400_000\n ? [Math.round(diff / 86_400_000), 'day']\n : abs >= 3_600_000\n ? [Math.round(diff / 3_600_000), 'hour']\n : [Math.round(diff / 60_000), 'minute']\n try {\n return `${absolute} (${new Intl.RelativeTimeFormat(undefined, { numeric: 'auto' }).format(amount, unit)})`\n } catch {\n return absolute\n }\n}\n\nfunction messageOf(error: unknown): string {\n return error instanceof Error ? error.message : String(error)\n}\n","export const NS_ANTIGRAVITY = 'dsh-antigravity'\n\nexport const zh = {\n title: 'Antigravity',\n pageDesc: '登录 Google Antigravity / Cloud Code Assist,并查看当前账号的共享额度。',\n account: '已登录',\n signedIn: '已登录',\n signedOut: '未登录',\n plan: '套餐',\n accountId: '账号 ID',\n expires: '令牌到期',\n storage: '凭据存储',\n storageNotice: '令牌由 Host 保存于本地安全存储 ($DSH_HOME/storages/antigravity-oauth.json),不会进入浏览器。',\n signInAgain: '重新登录',\n refreshToken: '刷新凭据',\n signOut: '注销',\n signIn: '登录',\n signingIn: '登录中...',\n connection: '连接',\n provider: 'Provider',\n providerValue: 'Google Antigravity · antigravity',\n connectionState: '连接状态',\n connected: '已连接',\n untested: '未测试',\n modelsHint: '勾选后模型才会显示在对话页的模型选择列表中;至少保留一个。',\n selectAll: '全选',\n unselectAll: '全不选',\n enhanced: '增强功能',\n defaultReasoningEffort: '默认思考深度',\n defaultReasoningEffortHint: '控制支持推理的模型在未单独指定时的思考强度。',\n defaultEffortAuto: '使用 Provider 默认值',\n contextWindowSection: '模型上下文窗口',\n contextWindowHint: '默认按模型标准;可选应用最高容量,该值用于 DSH 的压缩与溢出判断,可输入 1M、512K、200K 等容量。',\n save: '保存',\n saved: '已保存',\n saving: '保存中...',\n quotaSection: '用量与配额',\n quotaDesc: '数据来自 Google Cloud Code Assist 配额服务,页面可见时最多每 60 秒刷新一次。',\n refreshQuota: '刷新用量',\n refreshingQuota: '刷新中...',\n quotaEmpty: '暂无配额数据,点击「刷新用量」重试。',\n googleValidation: '前往 Google 完成账号验证',\n resetPrefix: '重置: {time}',\n resetUnavailable: '重置: n/a',\n resetNow: '现在',\n timeDayHour: '{days}天 {hours}时',\n timeHourMin: '{hours}h {minutes}m',\n timeMin: '{minutes}m',\n updatedAt: '更新时间:{time}',\n loading: '加载中...',\n loginFailed: '登录失败',\n tokens: 'tokens',\n}\n\nexport const en = {\n title: 'Antigravity',\n pageDesc: 'Sign in to Google Antigravity / Cloud Code Assist and view shared quotas.',\n account: 'Signed in',\n signedIn: 'Signed in',\n signedOut: 'Not signed in',\n plan: 'Plan',\n accountId: 'Account ID',\n expires: 'Token expires',\n storage: 'Credential storage',\n storageNotice: 'Tokens are stored locally by the Host ($DSH_HOME/storages/antigravity-oauth.json) and never sent to browser.',\n signInAgain: 'Sign in again',\n refreshToken: 'Refresh token',\n signOut: 'Sign out',\n signIn: 'Sign in',\n signingIn: 'Signing in...',\n connection: 'Connection',\n provider: 'Provider',\n providerValue: 'Google Antigravity · antigravity',\n connectionState: 'Connection state',\n connected: 'Connected',\n untested: 'Untested',\n modelsHint: 'Checked models will appear in DSH conversation model list; keep at least one.',\n selectAll: 'Select all',\n unselectAll: 'Deselect all',\n enhanced: 'Enhanced Features',\n defaultReasoningEffort: 'Default reasoning effort',\n defaultReasoningEffortHint: 'Controls reasoning effort for reasoning models when not explicitly specified in conversation.',\n defaultEffortAuto: 'Use Provider default',\n contextWindowSection: 'Model Context Window',\n contextWindowHint: 'Defaults to model specification; configure custom capacity used by DSH for compaction and overflow judgments (e.g., 1M, 512K, 200K).',\n save: 'Save',\n saved: 'Saved',\n saving: 'Saving...',\n quotaSection: 'Usage & Quota',\n quotaDesc: 'Data from Google Cloud Code Assist quota service; refreshes up to once every 60 seconds when visible.',\n refreshQuota: 'Refresh quota',\n refreshingQuota: 'Refreshing...',\n quotaEmpty: 'No quota data yet — use “Refresh quota” to retry.',\n googleValidation: 'Verify the account with Google',\n resetPrefix: 'Reset: {time}',\n resetUnavailable: 'Reset: n/a',\n resetNow: 'now',\n timeDayHour: '{days}d {hours}h',\n timeHourMin: '{hours}h {minutes}m',\n timeMin: '{minutes}m',\n updatedAt: 'Updated at: {time}',\n loading: 'Loading...',\n loginFailed: 'Login failed',\n tokens: 'tokens',\n}\n\nexport const dictionaries = {\n zh,\n 'zh-CN': zh,\n en,\n 'en-US': en,\n}\n","import React, { useCallback, useEffect, useState } from 'react'\nimport type { AntigravityModelOption, AntigravityWebStatus } from '../../shared/antigravity-contracts.ts'\nimport { zh } from './locales.ts'\n\nconst API = '/antigravity/api'\n\ninterface Props {\n onModelChange?: () => void\n loadModelDirectory?: () => void\n}\n\nasync function fetchApi<T>(path: string, options?: RequestInit): Promise<T> {\n const res = await fetch(`${API}${path}`, {\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers,\n },\n })\n const json = (await res.json()) as { ok: boolean; value?: T; error?: string }\n if (!res.ok || !json.ok) {\n throw new Error(json.error || `HTTP ${res.status}`)\n }\n return json.value as T\n}\n\nexport function parsePositiveCapacity(value: string): number | null {\n const normalized = value.trim().toLowerCase().replace(/[,_\\s]/g, '')\n const matched = normalized.match(/^(\\d+(?:\\.\\d+)?)(k|m)?$/)\n if (matched === null) return null\n const multiplier = matched[2] === 'm' ? 1_000_000 : matched[2] === 'k' ? 1_000 : 1\n const parsed = Number(matched[1]) * multiplier\n return Number.isSafeInteger(parsed) && parsed >= 1 ? parsed : null\n}\n\nexport function formatCapacity(value: number): string {\n if (value >= 1_000_000 && value % 100_000 === 0) return `${value / 1_000_000}M`\n if (value % 1_000 === 0) return `${value / 1_000}K`\n return String(value)\n}\n\nfunction formatResetTime(resetTime?: string): string {\n if (!resetTime) return ''\n const diff = new Date(resetTime).getTime() - Date.now()\n if (diff <= 0) return '现在'\n const mins = Math.floor(diff / 60000)\n const hours = Math.floor(mins / 60)\n const days = Math.floor(hours / 24)\n if (days > 0) return `${days}天 ${hours % 24}时`\n if (hours > 0) return `${hours}h ${mins % 60}m`\n return `${mins}m`\n}\n\nfunction formatDate(ms?: number): string {\n if (!ms || ms <= 0) return '—'\n try {\n return new Intl.DateTimeFormat(undefined, { dateStyle: 'medium', timeStyle: 'short' }).format(ms)\n } catch {\n return '—'\n }\n}\n\nexport function AntigravitySection({ onModelChange, loadModelDirectory }: Props): React.ReactElement {\n const [status, setStatus] = useState<AntigravityWebStatus | null>(null)\n const [loading, setLoading] = useState(true)\n const [busy, setBusy] = useState<string | null>(null)\n const [error, setError] = useState<string | null>(null)\n const [validationUrl, setValidationUrl] = useState<string | null>(null)\n const [loginProgress, setLoginProgress] = useState<string | null>(null)\n const [contextDrafts, setContextDrafts] = useState<Record<string, string>>({})\n const [savingModel, setSavingModel] = useState<string | null>(null)\n\n const t = zh\n\n const notifyChange = useCallback(() => {\n onModelChange?.()\n loadModelDirectory?.()\n }, [onModelChange, loadModelDirectory])\n\n const loadStatus = useCallback(async (quiet = false) => {\n if (!quiet) {\n setError(null)\n setValidationUrl(null)\n }\n try {\n // The host refreshes a stale quota cache while serving /status, so a second\n // client-side POST /quota here would double every upstream fetch.\n const data = await fetchApi<AntigravityWebStatus>('/status')\n setStatus(data)\n // 初始化输入草稿\n const drafts: Record<string, string> = {}\n for (const m of data.models) {\n const val = data.contextWindowOverrides[m.id] || m.defaultContextWindow\n drafts[m.id] = formatCapacity(val)\n }\n setContextDrafts(drafts)\n } catch (err) {\n if (!quiet) setError(err instanceof Error ? err.message : String(err))\n } finally {\n setLoading(false)\n }\n }, [])\n\n useEffect(() => {\n void loadStatus()\n const refreshWhenVisible = () => {\n if (document.visibilityState === 'visible') void loadStatus(true)\n }\n document.addEventListener('visibilitychange', refreshWhenVisible)\n const timer = window.setInterval(refreshWhenVisible, 60_000)\n return () => {\n window.clearInterval(timer)\n document.removeEventListener('visibilitychange', refreshWhenVisible)\n }\n }, [loadStatus])\n\n const handleLogin = async () => {\n try {\n setBusy('login')\n setError(null)\n setValidationUrl(null)\n setLoginProgress(null)\n const flow = await fetchApi<{ authUrl?: string; status?: string }>('/login', { method: 'POST' })\n if (flow.authUrl) {\n window.open(flow.authUrl, '_blank')\n }\n const pollTimer = setInterval(async () => {\n try {\n const pollStatus = await fetchApi<{\n status: string\n error?: string\n validationUrl?: string\n progress?: string\n }>('/login/status')\n if (pollStatus.progress) {\n setLoginProgress(pollStatus.progress)\n }\n if (pollStatus.status === 'complete') {\n clearInterval(pollTimer)\n setBusy(null)\n setLoginProgress(null)\n await loadStatus()\n notifyChange()\n } else if (pollStatus.status === 'error') {\n clearInterval(pollTimer)\n setBusy(null)\n setLoginProgress(null)\n setError(pollStatus.error || t.loginFailed)\n if (pollStatus.validationUrl) {\n setValidationUrl(pollStatus.validationUrl)\n }\n }\n } catch {\n // ignore\n }\n }, 1500)\n\n setTimeout(() => {\n clearInterval(pollTimer)\n setBusy(null)\n setLoginProgress(null)\n }, 5 * 60 * 1000)\n } catch (err) {\n setBusy(null)\n setLoginProgress(null)\n setError(err instanceof Error ? err.message : String(err))\n }\n }\n\n const handleRefreshQuota = async () => {\n try {\n setBusy('quota')\n setError(null)\n const updated = await fetchApi<AntigravityWebStatus>('/quota', { method: 'POST' })\n setStatus(updated)\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n } finally {\n setBusy(null)\n }\n }\n\n const handleLogout = async () => {\n try {\n setBusy('logout')\n setError(null)\n const updated = await fetchApi<AntigravityWebStatus>('/logout', { method: 'POST' })\n setStatus(updated)\n notifyChange()\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n } finally {\n setBusy(null)\n }\n }\n\n const toggleModel = async (modelId: string, checked: boolean) => {\n if (!status) return\n const currentEnabled = status.models.filter((m) => m.enabled).map((m) => m.id)\n const nextEnabled = checked\n ? [...new Set([...currentEnabled, modelId])]\n : currentEnabled.filter((id) => id !== modelId)\n\n if (nextEnabled.length === 0) return // 至少保留一个\n\n try {\n const updated = await fetchApi<AntigravityWebStatus>('/models', {\n method: 'POST',\n body: JSON.stringify({ enabledModelIds: nextEnabled }),\n })\n setStatus(updated)\n notifyChange()\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n }\n }\n\n const setAllModels = async (selectAll: boolean) => {\n if (!status) return\n const nextEnabled = selectAll ? status.models.map((m) => m.id) : [status.models[0].id]\n try {\n const updated = await fetchApi<AntigravityWebStatus>('/models', {\n method: 'POST',\n body: JSON.stringify({ enabledModelIds: nextEnabled }),\n })\n setStatus(updated)\n notifyChange()\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n }\n }\n\n const handleUpdateEffort = async (effort: 'low' | 'medium' | 'high' | null) => {\n try {\n const updated = await fetchApi<AntigravityWebStatus>('/settings', {\n method: 'POST',\n body: JSON.stringify({ defaultReasoningEffort: effort }),\n })\n setStatus(updated)\n notifyChange()\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n }\n }\n\n const handleSaveContextWindow = async (modelId: string) => {\n const raw = contextDrafts[modelId] || ''\n const parsed = parsePositiveCapacity(raw)\n if (parsed === null) {\n setError(`无效的上下文容量值: ${raw}`)\n return\n }\n\n try {\n setSavingModel(modelId)\n setError(null)\n const updated = await fetchApi<AntigravityWebStatus>('/settings', {\n method: 'POST',\n body: JSON.stringify({\n contextWindowOverrides: {\n [modelId]: parsed,\n },\n }),\n })\n setStatus(updated)\n setContextDrafts((prev) => ({ ...prev, [modelId]: formatCapacity(parsed) }))\n notifyChange()\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n } finally {\n setSavingModel(null)\n }\n }\n\n if (loading) {\n return (\n <div className=\"dsha-page\">\n <div className=\"dsha-empty\">{t.loading}</div>\n </div>\n )\n }\n\n const quota = status?.quota\n const groups = quota?.groups || []\n const visibleCount = status?.models.filter((m) => m.enabled).length || 0\n\n return (\n <div className=\"dsha-page\">\n {/* 1. 账号信息分组 */}\n <section className=\"dsha-group\">\n <div className=\"dsha-grouphead\">\n <h3>{status?.authenticated ? t.account : t.signedOut}</h3>\n </div>\n <div className=\"dsha-row\">\n <span className=\"dsha-label\">{status?.authenticated ? t.signedIn : t.signedOut}</span>\n <span className=\"dsha-value\">{status?.email || '—'}</span>\n </div>\n {status?.authenticated && (\n <>\n <div className=\"dsha-row\">\n <span className=\"dsha-label\">{t.plan}</span>\n <span className=\"dsha-value\">{quota?.planLabel || 'Google AI Ultra'}</span>\n </div>\n <div className=\"dsha-row\">\n <span className=\"dsha-label\">{t.accountId}</span>\n <span className=\"dsha-value\">{status.projectId || 'antigravity-default'}</span>\n </div>\n <div className=\"dsha-row\">\n <span className=\"dsha-label\">{t.expires}</span>\n <span className=\"dsha-value\">{formatDate(Date.now() + 86400000 * 30)}</span>\n </div>\n </>\n )}\n <div className=\"dsha-row\">\n <span className=\"dsha-label\">{t.storage}</span>\n <span className=\"dsha-value\">本地安全存储 (JSON)</span>\n </div>\n <p className=\"dsha-notice\">{t.storageNotice}</p>\n\n <div className=\"dsha-actions\">\n {!status?.authenticated ? (\n <button className=\"dsha-btn dsha-btn-primary\" disabled={busy !== null} onClick={handleLogin}>\n {busy === 'login' ? (loginProgress || t.signingIn) : t.signIn}\n </button>\n ) : (\n <>\n <button className=\"dsha-btn dsha-btn-primary\" disabled={busy !== null} onClick={handleLogin}>\n {busy === 'login' ? (loginProgress || t.signingIn) : t.signInAgain}\n </button>\n <button className=\"dsha-btn\" disabled={busy !== null} onClick={handleRefreshQuota}>\n {busy === 'quota' ? t.refreshingQuota : t.refreshToken}\n </button>\n <button className=\"dsha-btn\" disabled={busy !== null} onClick={handleLogout}>\n {t.signOut}\n </button>\n </>\n )}\n </div>\n </section>\n\n {/* 2. 连接与模型胶囊标签选择器 */}\n <section className=\"dsha-group\">\n <div className=\"dsha-grouphead\">\n <h3>{t.connection}</h3>\n </div>\n <div className=\"dsha-row\">\n <span className=\"dsha-label\">{t.provider}</span>\n <span className=\"dsha-value\">{t.providerValue}</span>\n </div>\n <div className=\"dsha-row\">\n <span className=\"dsha-label\">{t.connectionState}</span>\n <span className=\"dsha-value\">{status?.authenticated ? t.connected : t.untested}</span>\n </div>\n\n <p className=\"dsha-muted dsha-models-hint\">{t.modelsHint}</p>\n\n {/* 胶囊标签多选列表 */}\n <div className=\"dsha-models\" aria-label=\"Antigravity Models\">\n {status?.models.map((model) => {\n const checked = model.enabled\n const lastVisible = checked && visibleCount === 1\n return (\n <label key={model.id} title={model.id}>\n <input\n type=\"checkbox\"\n checked={checked}\n disabled={busy !== null || lastVisible}\n onChange={(e) => void toggleModel(model.id, e.currentTarget.checked)}\n />\n <span>{model.name}</span>\n </label>\n )\n })}\n </div>\n\n <div className=\"dsha-actions\">\n <button className=\"dsha-btn\" disabled={busy !== null} onClick={() => setAllModels(true)}>\n {t.selectAll}\n </button>\n <button className=\"dsha-btn\" disabled={busy !== null} onClick={() => setAllModels(false)}>\n {t.unselectAll}\n </button>\n </div>\n </section>\n\n {/* 3. 增强功能(思考深度设置) */}\n <section className=\"dsha-group\">\n <div className=\"dsha-grouphead\">\n <h3>{t.enhanced}</h3>\n </div>\n <div className=\"dsha-pref-row\">\n <div>\n <strong>{t.defaultReasoningEffort}</strong>\n <p className=\"dsha-muted\">{t.defaultReasoningEffortHint}</p>\n </div>\n <select\n className=\"dsha-select\"\n aria-label={t.defaultReasoningEffort}\n value={status?.defaultReasoningEffort ?? ''}\n disabled={busy !== null}\n onChange={(e) => {\n const val = e.currentTarget.value\n void handleUpdateEffort(val === '' ? null : (val as 'low' | 'medium' | 'high'))\n }}\n >\n <option value=\"\">{t.defaultEffortAuto}</option>\n <option value=\"low\">Low</option>\n <option value=\"medium\">Medium</option>\n <option value=\"high\">High</option>\n </select>\n </div>\n </section>\n\n {/* 4. 模型上下文窗口设置(按模型独立配置) */}\n <section className=\"dsha-group\">\n <div className=\"dsha-grouphead\">\n <h3>{t.contextWindowSection}</h3>\n </div>\n <p className=\"dsha-muted\">{t.contextWindowHint}</p>\n\n <div className=\"dsha-context-settings\">\n {status?.models.map((model) => (\n <div key={model.id} className=\"dsha-context-row\">\n <span>{model.name}</span>\n <div className=\"dsha-capacity-control\">\n <input\n type=\"text\"\n value={contextDrafts[model.id] ?? ''}\n onChange={(e) => setContextDrafts({ ...contextDrafts, [model.id]: e.target.value })}\n onKeyDown={(e) => {\n if (e.key === 'Enter') void handleSaveContextWindow(model.id)\n }}\n />\n <small>{t.tokens}</small>\n <button\n type=\"button\"\n className=\"dsha-context-save\"\n disabled={savingModel === model.id}\n onClick={() => void handleSaveContextWindow(model.id)}\n >\n {savingModel === model.id ? t.saving : t.save}\n </button>\n </div>\n </div>\n ))}\n </div>\n </section>\n\n {/* 5. 用量与配额卡片 */}\n <section className=\"dsha-group\">\n <div className=\"dsha-grouphead\">\n <h3>{t.quotaSection}</h3>\n <button\n className=\"dsha-btn\"\n disabled={busy !== null || !status?.authenticated}\n onClick={handleRefreshQuota}\n >\n {busy === 'quota' ? t.refreshingQuota : t.refreshQuota}\n </button>\n </div>\n <p className=\"dsha-muted\">{t.quotaDesc}</p>\n\n {!status?.authenticated ? (\n <div className=\"dsha-empty\">{t.signedOut}</div>\n ) : groups.length === 0 ? (\n <div className=\"dsha-empty\">{busy === 'quota' ? t.refreshingQuota : t.quotaEmpty}</div>\n ) : (\n groups.map((group, gIdx) => (\n <div key={gIdx} className=\"dsha-quota-card\">\n <div className=\"dsha-quota-title\">\n <strong>{group.displayName}</strong>\n {group.description && <span>{group.description}</span>}\n </div>\n\n {group.buckets.map((bucket, bIdx) => {\n const isCyan = /claude|gpt|3p/i.test(group.displayName)\n const pct = Math.round(bucket.remainingFraction * 100)\n const resetText = formatResetTime(bucket.resetTime)\n return (\n <div key={bIdx} className=\"dsha-meter-wrap\">\n <div className=\"dsha-meter-label\">\n <span>{bucket.displayName}</span>\n <strong>{pct}% 剩余</strong>\n </div>\n <div className={`dsha-meter ${isCyan ? 'dsha-meter-cyan' : 'dsha-meter-green'}`}>\n <span style={{ width: `${pct}%` }} />\n </div>\n {resetText && (\n <div className=\"dsha-meter-meta\">\n <span>重置: {resetText}</span>\n </div>\n )}\n </div>\n )\n })}\n </div>\n ))\n )}\n\n {quota?.fetchedAt && (\n <div className=\"dsha-timestamp\">\n 更新时间: {new Date(quota.fetchedAt).toLocaleString()}\n </div>\n )}\n </section>\n\n {error && (\n <div className=\"dsha-error\">\n <div>{error}</div>\n {validationUrl && (\n <div style={{ marginTop: '8px' }}>\n <a\n href={validationUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"dsha-btn dsha-btn-primary\"\n style={{ display: 'inline-block', textDecoration: 'none', padding: '4px 10px', fontSize: '12px' }}\n >\n {t.googleValidation}\n </a>\n </div>\n )}\n </div>\n )}\n </div>\n )\n}\n","/**\n * Wire contracts between the Command Code host routes and the browser settings\n * card. Everything here is public: no credential ever crosses this boundary.\n */\n\n/** Deployment of the Command Code API a credential was issued against. */\nexport type CommandCodeApiEnv = 'prod' | 'staging' | 'local'\n\n/**\n * Reasoning levels the provider registry can expose. The exact set is per\n * model — `minimal` is the cheapest budget, `xhigh` sits between `high` and\n * `max`, and most models declare only a subset.\n */\nexport type CommandCodeReasoningEffort = 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max'\n\n/** Every level, in escalating order; the settings card renders exactly these. */\nexport const COMMAND_CODE_REASONING_EFFORTS: readonly CommandCodeReasoningEffort[] =\n ['minimal', 'low', 'medium', 'high', 'xhigh', 'max']\n\n/** One model offered by the Command Code provider API. */\nexport interface CommandCodeModelOption {\n id: string\n name: string\n /** Enabled models are the ones DSH offers in the conversation model picker. */\n enabled: boolean\n /** Context window the live catalog reports for this model. */\n defaultContextWindow: number\n /** Effective context window: the override when one is saved, else the default. */\n contextWindow: number\n /** Maximum output tokens this route requests when a caller omits one. */\n defaultMaxTokens: number\n /** Reasoning levels this route exposes; absent for non-reasoning models. */\n reasoningEfforts?: string[]\n /** Reasoning dialect the adapter uses on the wire. */\n wire: CommandCodeWire\n}\n\n/** Request/response dialect a model id is served over. */\nexport type CommandCodeWire = 'openai' | 'anthropic'\n\n/** One credit / spend meter reported by the billing service. */\nexport interface CommandCodeMeter {\n id: string\n label: string\n /** Used fraction in [0, 1] when the service reports a bounded allowance. */\n usedFraction: number | null\n /** Remaining fraction in [0, 1], when the service reports one. */\n remainingFraction: number | null\n used: string | null\n limit: string | null\n /** Unix milliseconds the meter resets, when reported. */\n resetsAt: number | null\n description: string | null\n}\n\n/** Windowed request/token allowance reported by the usage service. */\nexport interface CommandCodeUsageWindow {\n id: string\n label: string\n usedPercent: number\n windowDurationMins: number | null\n resetsAt: number | null\n}\n\n/** Account identity returned by `/alpha/whoami`. */\nexport interface CommandCodeAccount {\n userId: string | null\n userName: string | null\n email: string | null\n organizationName: string | null\n keyName: string | null\n planLabel: string | null\n planId: string | null\n authenticatedAt: number | null\n}\n\n/** One point-in-time quota snapshot for the signed-in Command Code account. */\nexport interface CommandCodeAccountQuota {\n account: CommandCodeAccount\n /** Credit balance in the provider's own unit, when reported. */\n creditBalance: string | null\n /** True when the plan bills against an unlimited allowance. */\n unlimited: boolean\n /** Machine id the service reports, e.g. `individual-goat`. */\n planId: string | null\n /** Display name for {@link planId}, e.g. `GOAT`. */\n planName: string | null\n /** Monthly credits the plan grants, when the id is recognized. */\n planMonthlyCredits: number | null\n /** Subscription state the service reports, e.g. `active`. */\n subscriptionStatus: string | null\n /** End of the current billing period, as Unix milliseconds. */\n periodEndsAt: number | null\n meters: CommandCodeMeter[]\n windows: CommandCodeUsageWindow[]\n /** Raw service payloads, kept for diagnostics in the settings card. */\n fetchedAt: number\n sources: string[]\n}\n\n/** Everything the settings card and the composer badge render. */\nexport interface CommandCodeWebStatus {\n authenticated: boolean\n hasCredentials: boolean\n storagePath: string\n apiEnv: CommandCodeApiEnv\n account: CommandCodeAccount | null\n quota: CommandCodeAccountQuota | null\n lastFetchedAt: number | null\n models: CommandCodeModelOption[]\n contextWindowOverrides: Record<string, number>\n defaultReasoningEffort: CommandCodeReasoningEffort | null\n /** Route the plugin currently serves; false when another plugin owns it. */\n serving: boolean\n /** Diagnostic when the route is owned by a different adapter family. */\n conflict: string | null\n}\n\n/** Patch accepted by the models/settings routes. */\nexport interface CommandCodeSettingsUpdateDto {\n enabledModelIds?: string[]\n contextWindowOverrides?: Record<string, number>\n defaultReasoningEffort?: CommandCodeReasoningEffort | null\n}\n\n/** Result of a manual API-key submission or a compatibility probe. */\nexport interface CommandCodeConnectionDto {\n connected: boolean\n account: CommandCodeAccount | null\n checkedAt: number\n}\n","export const NS_COMMAND_CODE = 'dsh-command-code'\n\nexport const zh = {\n title: 'Command Code',\n pageDesc: '登录 Command Code,管理可用模型、上下文窗口与额度。',\n account: '账号',\n signedIn: '已登录',\n signedOut: '未登录',\n keyName: '密钥名称',\n organization: '组织',\n plan: '套餐',\n planUnknown: '—',\n subscription: '订阅状态',\n renews: '续费于',\n authenticatedAt: '登录时间',\n storage: '凭据存储',\n storageNotice: 'API Key 由 Host 保存于本地安全存储 ($DSH_HOME/storages/command-code-credentials.json),不会进入浏览器。',\n signIn: '浏览器登录',\n signInAgain: '重新登录',\n signingIn: '登录中...',\n signOut: '注销',\n cancelSignIn: '取消登录',\n openSignInPage: '打开登录页面',\n apiKeySection: '手动填写 API Key',\n apiKeyHint: '在 Command Code Studio 创建 API Key 后粘贴到此处;浏览器登录不可用时使用。',\n apiKeyPlaceholder: '粘贴 Command Code API Key',\n apiKeySave: '保存并验证',\n apiKeySaving: '验证中...',\n apiKeySaved: '已保存',\n connection: '连接',\n provider: 'Provider',\n providerValue: 'Command Code · command-code',\n connectionState: '连接状态',\n connected: '已连接',\n untested: '未测试',\n testConnection: '测试连接',\n testingConnection: '测试中...',\n routeOwned: '模型路由由本插件提供',\n routeConflict: '模型路由已被其他 Provider 占用:{detail}。请在 DSH 设置中移除重复的 Provider 配置后重试。',\n modelsSection: '模型',\n modelsHint: '勾选后模型才会出现在对话页的模型选择列表中;至少保留一个。',\n refreshCatalog: '刷新模型目录',\n refreshingCatalog: '刷新中...',\n selectAll: '全选',\n unselectAll: '全不选',\n wireAnthropic: 'Anthropic',\n wireOpenai: 'OpenAI',\n enhanced: '增强功能',\n defaultReasoningEffort: '默认思考深度',\n defaultReasoningEffortHint: '控制支持推理的模型在未单独指定时的思考强度。Anthropic 模型会映射为 thinking 预算。',\n defaultEffortAuto: '使用 Provider 默认值',\n contextWindowSection: '模型上下文窗口',\n contextWindowHint: '默认取 Command Code 模型目录的 context length;可覆盖为自定义容量,该值用于 DSH 的压缩与溢出判断,可输入 1M、512K、200K 等容量。',\n save: '保存',\n saved: '已保存',\n saving: '保存中...',\n quotaSection: '用量与配额',\n quotaDesc: '数据来自 Command Code 账户接口,页面可见时最多每 60 秒刷新一次。',\n refreshQuota: '刷新用量',\n refreshingQuota: '刷新中...',\n quotaEmpty: '暂无配额数据,点击「刷新用量」重试。',\n quotaCredits: '剩余额度',\n quotaUnlimited: '不限量',\n updatedAt: '更新时间:{time}',\n loading: '加载中...',\n loginFailed: '登录失败',\n tokens: 'tokens',\n} as const\n\nexport const en = {\n title: 'Command Code',\n pageDesc: 'Sign in to Command Code and manage models, context windows, and quota.',\n account: 'Account',\n signedIn: 'Signed in',\n signedOut: 'Not signed in',\n keyName: 'Key name',\n organization: 'Organization',\n plan: 'Plan',\n planUnknown: '—',\n subscription: 'Subscription',\n renews: 'renews',\n authenticatedAt: 'Signed in at',\n storage: 'Credential storage',\n storageNotice: 'The API key is stored locally by the Host ($DSH_HOME/storages/command-code-credentials.json) and never reaches the browser.',\n signIn: 'Sign in with browser',\n signInAgain: 'Sign in again',\n signingIn: 'Signing in...',\n signOut: 'Sign out',\n cancelSignIn: 'Cancel',\n openSignInPage: 'Open the sign-in page',\n apiKeySection: 'Paste an API key',\n apiKeyHint: 'Create a key in Command Code Studio and paste it here; use this when the browser flow is unavailable.',\n apiKeyPlaceholder: 'Command Code API key',\n apiKeySave: 'Save and verify',\n apiKeySaving: 'Verifying...',\n apiKeySaved: 'Saved',\n connection: 'Connection',\n provider: 'Provider',\n providerValue: 'Command Code · command-code',\n connectionState: 'Connection state',\n connected: 'Connected',\n untested: 'Untested',\n testConnection: 'Test connection',\n testingConnection: 'Testing...',\n routeOwned: 'This plugin serves the model route',\n routeConflict: 'Another provider already owns the model route: {detail}. Remove the duplicate provider configuration in DSH settings and reload.',\n modelsSection: 'Models',\n modelsHint: 'Checked models appear in the DSH conversation model list; keep at least one.',\n refreshCatalog: 'Refresh catalog',\n refreshingCatalog: 'Refreshing...',\n selectAll: 'Select all',\n unselectAll: 'Deselect all',\n wireAnthropic: 'Anthropic',\n wireOpenai: 'OpenAI',\n enhanced: 'Enhanced features',\n defaultReasoningEffort: 'Default reasoning effort',\n defaultReasoningEffortHint: 'Reasoning effort for models that support it when the conversation does not specify one. Anthropic models map it to a thinking budget.',\n defaultEffortAuto: 'Use provider default',\n contextWindowSection: 'Model context window',\n contextWindowHint: 'Defaults to the context length in the Command Code catalog; override it with the capacity DSH should use for compaction and overflow decisions (e.g., 1M, 512K, 200K).',\n save: 'Save',\n saved: 'Saved',\n saving: 'Saving...',\n quotaSection: 'Usage & quota',\n quotaDesc: 'Read from the Command Code account endpoints; refreshes at most once every 60 seconds while visible.',\n refreshQuota: 'Refresh quota',\n refreshingQuota: 'Refreshing...',\n quotaEmpty: 'No quota data yet — use “Refresh quota” to retry.',\n quotaCredits: 'Remaining credits',\n quotaUnlimited: 'Unlimited',\n updatedAt: 'Updated at: {time}',\n loading: 'Loading...',\n loginFailed: 'Sign-in failed',\n tokens: 'tokens',\n} as const\n\nexport const dictionaries = {\n zh,\n 'zh-CN': zh,\n en,\n 'en-US': en,\n}\n\nexport type CommandCodeLocaleKey = keyof typeof zh\n","import React, { useCallback, useEffect, useState } from 'react'\nimport type {\n CommandCodeModelOption,\n CommandCodeReasoningEffort,\n CommandCodeWebStatus,\n} from '../../shared/command-code-contracts.ts'\nimport { COMMAND_CODE_REASONING_EFFORTS } from '../../shared/command-code-contracts.ts'\n\n/**\n * Display label per reasoning level. The locale dictionary only accepts flat\n * string values, so this nested table lives with the control that renders it.\n */\nconst EFFORT_LABELS: Record<CommandCodeReasoningEffort, string> = {\n minimal: 'Minimal',\n low: 'Low',\n medium: 'Medium',\n high: 'High',\n xhigh: 'X-High',\n max: 'Max',\n}\nimport { zh } from './locales.ts'\n\nconst API = '/command-code/api'\n\ninterface Props {\n onModelChange?: () => void\n loadModelDirectory?: () => void\n}\n\nasync function fetchApi<T>(path: string, options?: RequestInit): Promise<T> {\n const res = await fetch(`${API}${path}`, {\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers,\n },\n })\n const json = (await res.json()) as { ok: boolean; value?: T; error?: string }\n if (!res.ok || !json.ok) {\n throw new Error(json.error || `HTTP ${res.status}`)\n }\n return json.value as T\n}\n\n/** Parse \"1M\", \"512K\", \"200000\" into a positive integer token count. */\nexport function parsePositiveCapacity(value: string): number | null {\n const normalized = value.trim().toLowerCase().replace(/[,_\\s]/g, '')\n const matched = normalized.match(/^(\\d+(?:\\.\\d+)?)(k|m)?$/)\n if (matched === null) return null\n const multiplier = matched[2] === 'm' ? 1_000_000 : matched[2] === 'k' ? 1_000 : 1\n const parsed = Number(matched[1]) * multiplier\n return Number.isSafeInteger(parsed) && parsed >= 1 ? parsed : null\n}\n\nexport function formatCapacity(value: number): string {\n if (value >= 1_000_000 && value % 100_000 === 0) return `${value / 1_000_000}M`\n if (value >= 1_000 && value % 1_000 === 0) return `${value / 1_000}K`\n return String(value)\n}\n\nfunction formatDate(ms?: number | null): string {\n if (ms === undefined || ms === null || ms <= 0) return '—'\n try {\n return new Intl.DateTimeFormat(undefined, { dateStyle: 'medium', timeStyle: 'short' }).format(ms)\n } catch {\n return '—'\n }\n}\n\nfunction formatReset(resetsAt?: number | null): string {\n if (resetsAt === undefined || resetsAt === null || resetsAt <= 0) return ''\n const diff = resetsAt - Date.now()\n if (diff <= 0) return 'now'\n const mins = Math.floor(diff / 60000)\n const hours = Math.floor(mins / 60)\n const days = Math.floor(hours / 24)\n if (days > 0) return `${days}d ${hours % 24}h`\n if (hours > 0) return `${hours}h ${mins % 60}m`\n return `${mins}m`\n}\n\ninterface LoginPollStatus {\n status: string\n authUrl?: string\n error?: string\n progress?: string\n}\n\nexport function CommandCodeSection({ onModelChange, loadModelDirectory }: Props): React.ReactElement {\n const [status, setStatus] = useState<CommandCodeWebStatus | null>(null)\n const [loading, setLoading] = useState(true)\n const [busy, setBusy] = useState<string | null>(null)\n const [error, setError] = useState<string | null>(null)\n const [loginProgress, setLoginProgress] = useState<string | null>(null)\n const [contextDrafts, setContextDrafts] = useState<Record<string, string>>({})\n const [savingModel, setSavingModel] = useState<string | null>(null)\n const [apiKey, setApiKey] = useState('')\n\n const t = zh\n\n const notifyChange = useCallback(() => {\n onModelChange?.()\n loadModelDirectory?.()\n }, [onModelChange, loadModelDirectory])\n\n const loadStatus = useCallback(async (quiet = false) => {\n if (!quiet) {\n setError(null)\n }\n try {\n const data = await fetchApi<CommandCodeWebStatus>('/status')\n setStatus(data)\n const drafts: Record<string, string> = {}\n for (const model of data.models) {\n drafts[model.id] = formatCapacity(data.contextWindowOverrides[model.id] || model.defaultContextWindow)\n }\n setContextDrafts(drafts)\n } catch (err) {\n if (!quiet) setError(err instanceof Error ? err.message : String(err))\n } finally {\n setLoading(false)\n }\n }, [])\n\n useEffect(() => {\n void loadStatus()\n const refreshWhenVisible = () => {\n if (document.visibilityState === 'visible') void loadStatus(true)\n }\n document.addEventListener('visibilitychange', refreshWhenVisible)\n const timer = window.setInterval(refreshWhenVisible, 60_000)\n return () => {\n window.clearInterval(timer)\n document.removeEventListener('visibilitychange', refreshWhenVisible)\n }\n }, [loadStatus])\n\n const handleLogin = async () => {\n try {\n setBusy('login')\n setError(null)\n setLoginProgress(null)\n const flow = await fetchApi<LoginPollStatus>('/login', { method: 'POST' })\n if (flow.authUrl) {\n window.open(flow.authUrl, '_blank')\n }\n const pollTimer = window.setInterval(() => {\n void (async () => {\n try {\n const poll = await fetchApi<LoginPollStatus>('/login/status')\n if (poll.progress) setLoginProgress(poll.progress)\n if (poll.status === 'complete') {\n window.clearInterval(pollTimer)\n setBusy(null)\n setLoginProgress(null)\n await loadStatus()\n notifyChange()\n } else if (poll.status === 'error') {\n window.clearInterval(pollTimer)\n setBusy(null)\n setLoginProgress(null)\n setError(poll.error || t.loginFailed)\n }\n } catch {\n // A failed poll is transient; the next tick retries.\n }\n })()\n }, 1500)\n window.setTimeout(() => {\n window.clearInterval(pollTimer)\n setBusy(null)\n setLoginProgress(null)\n }, 5 * 60 * 1000)\n } catch (err) {\n setBusy(null)\n setLoginProgress(null)\n setError(err instanceof Error ? err.message : String(err))\n }\n }\n\n const handleApiKey = async () => {\n try {\n setBusy('apikey')\n setError(null)\n const updated = await fetchApi<CommandCodeWebStatus>('/login/apikey', {\n method: 'POST',\n body: JSON.stringify({ apiKey }),\n })\n setStatus(updated)\n setApiKey('')\n notifyChange()\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n } finally {\n setBusy(null)\n }\n }\n\n const handleLogout = async () => {\n try {\n setBusy('logout')\n setError(null)\n const updated = await fetchApi<CommandCodeWebStatus>('/logout', { method: 'POST' })\n setStatus(updated)\n notifyChange()\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n } finally {\n setBusy(null)\n }\n }\n\n const handleRefreshQuota = async () => {\n try {\n setBusy('quota')\n setError(null)\n const updated = await fetchApi<CommandCodeWebStatus>('/quota', { method: 'POST' })\n setStatus(updated)\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n } finally {\n setBusy(null)\n }\n }\n\n const handleRefreshCatalog = async () => {\n try {\n setBusy('catalog')\n setError(null)\n const updated = await fetchApi<CommandCodeWebStatus>('/catalog/refresh', { method: 'POST' })\n setStatus(updated)\n const drafts: Record<string, string> = {}\n for (const model of updated.models) {\n drafts[model.id] = formatCapacity(updated.contextWindowOverrides[model.id] || model.defaultContextWindow)\n }\n setContextDrafts(drafts)\n notifyChange()\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n } finally {\n setBusy(null)\n }\n }\n\n const handleTestConnection = async () => {\n try {\n setBusy('connection')\n setError(null)\n await fetchApi('/connection/test', { method: 'POST' })\n await loadStatus(true)\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n } finally {\n setBusy(null)\n }\n }\n\n const applyEnabled = async (enabledModelIds: string[]) => {\n try {\n const updated = await fetchApi<CommandCodeWebStatus>('/models', {\n method: 'POST',\n body: JSON.stringify({ enabledModelIds }),\n })\n setStatus(updated)\n notifyChange()\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n }\n }\n\n const toggleModel = (modelId: string, checked: boolean) => {\n if (!status) return\n const current = status.models.filter((model) => model.enabled).map((model) => model.id)\n const next = checked ? [...new Set([...current, modelId])] : current.filter((id) => id !== modelId)\n // The route refuses an empty selection; DSH would have no model to offer.\n if (next.length === 0) return\n void applyEnabled(next)\n }\n\n const setAllModels = (selectAll: boolean) => {\n if (!status || status.models.length === 0) return\n void applyEnabled(selectAll ? status.models.map((model) => model.id) : [status.models[0]!.id])\n }\n\n const handleUpdateEffort = async (effort: CommandCodeReasoningEffort | null) => {\n try {\n const updated = await fetchApi<CommandCodeWebStatus>('/settings', {\n method: 'POST',\n body: JSON.stringify({ defaultReasoningEffort: effort }),\n })\n setStatus(updated)\n notifyChange()\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n }\n }\n\n const handleSaveContextWindow = async (modelId: string) => {\n const raw = contextDrafts[modelId] || ''\n const parsed = parsePositiveCapacity(raw)\n if (parsed === null) {\n setError(`Invalid context capacity: ${raw}`)\n return\n }\n try {\n setSavingModel(modelId)\n setError(null)\n const updated = await fetchApi<CommandCodeWebStatus>('/settings', {\n method: 'POST',\n body: JSON.stringify({ contextWindowOverrides: { [modelId]: parsed } }),\n })\n setStatus(updated)\n setContextDrafts((prev) => ({ ...prev, [modelId]: formatCapacity(parsed) }))\n notifyChange()\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n } finally {\n setSavingModel(null)\n }\n }\n\n if (loading) {\n return (\n <div className=\"dsha-page\">\n <div className=\"dsha-empty\">{t.loading}</div>\n </div>\n )\n }\n\n const quota = status?.quota\n const account = status?.account\n const visibleCount = status?.models.filter((model) => model.enabled).length || 0\n\n return (\n <div className=\"dsha-page\">\n <section className=\"dsha-group\">\n <div className=\"dsha-grouphead\">\n <h3>{status?.authenticated ? t.account : t.signedOut}</h3>\n </div>\n <div className=\"dsha-row\">\n <span className=\"dsha-label\">{status?.authenticated ? t.signedIn : t.signedOut}</span>\n <span className=\"dsha-value\">{account?.email || account?.userName || '—'}</span>\n </div>\n {status?.authenticated && (\n <>\n <div className=\"dsha-row\">\n <span className=\"dsha-label\">{t.plan}</span>\n <span className=\"dsha-value\">{quota?.planName || account?.planLabel || t.planUnknown}</span>\n </div>\n <div className=\"dsha-row\">\n <span className=\"dsha-label\">{t.keyName}</span>\n <span className=\"dsha-value\">{account?.keyName || '—'}</span>\n </div>\n {quota?.subscriptionStatus && (\n <div className=\"dsha-row\">\n <span className=\"dsha-label\">{t.subscription}</span>\n <span className=\"dsha-value\">\n {quota.subscriptionStatus}\n {quota.periodEndsAt !== null ? ` · ${t.renews} ${formatDate(quota.periodEndsAt)}` : ''}\n </span>\n </div>\n )}\n {account?.organizationName && (\n <div className=\"dsha-row\">\n <span className=\"dsha-label\">{t.organization}</span>\n <span className=\"dsha-value\">{account.organizationName}</span>\n </div>\n )}\n <div className=\"dsha-row\">\n <span className=\"dsha-label\">{t.authenticatedAt}</span>\n <span className=\"dsha-value\">{formatDate(account?.authenticatedAt)}</span>\n </div>\n </>\n )}\n <div className=\"dsha-row\">\n <span className=\"dsha-label\">{t.storage}</span>\n <span className=\"dsha-value\">{status?.storagePath || '—'}</span>\n </div>\n <p className=\"dsha-notice\">{t.storageNotice}</p>\n\n <div className=\"dsha-actions\">\n {!status?.authenticated ? (\n <button className=\"dsha-btn dsha-btn-primary\" disabled={busy !== null} onClick={() => void handleLogin()}>\n {busy === 'login' ? (loginProgress || t.signingIn) : t.signIn}\n </button>\n ) : (\n <>\n <button className=\"dsha-btn dsha-btn-primary\" disabled={busy !== null} onClick={() => void handleLogin()}>\n {busy === 'login' ? (loginProgress || t.signingIn) : t.signInAgain}\n </button>\n <button className=\"dsha-btn\" disabled={busy !== null} onClick={() => void handleRefreshQuota()}>\n {busy === 'quota' ? t.refreshingQuota : t.refreshQuota}\n </button>\n <button className=\"dsha-btn\" disabled={busy !== null} onClick={() => void handleLogout()}>\n {t.signOut}\n </button>\n </>\n )}\n </div>\n </section>\n\n <section className=\"dsha-group\">\n <div className=\"dsha-grouphead\">\n <h3>{t.apiKeySection}</h3>\n </div>\n <p className=\"dsha-muted\">{t.apiKeyHint}</p>\n <div className=\"dsha-capacity-control\">\n <input\n type=\"password\"\n aria-label={t.apiKeySection}\n placeholder={t.apiKeyPlaceholder}\n value={apiKey}\n onChange={(event) => setApiKey(event.currentTarget.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter' && apiKey.trim() !== '') void handleApiKey()\n }}\n />\n <button\n type=\"button\"\n className=\"dsha-context-save\"\n disabled={busy !== null || apiKey.trim() === ''}\n onClick={() => void handleApiKey()}\n >\n {busy === 'apikey' ? t.apiKeySaving : t.apiKeySave}\n </button>\n </div>\n </section>\n\n <section className=\"dsha-group\">\n <div className=\"dsha-grouphead\">\n <h3>{t.connection}</h3>\n </div>\n <div className=\"dsha-row\">\n <span className=\"dsha-label\">{t.provider}</span>\n <span className=\"dsha-value\">{t.providerValue}</span>\n </div>\n <div className=\"dsha-row\">\n <span className=\"dsha-label\">{t.connectionState}</span>\n <span className=\"dsha-value\">{status?.authenticated ? t.connected : t.untested}</span>\n </div>\n <p className=\"dsha-notice\">{status?.serving === false && status.conflict ? t.routeConflict.replace('{detail}', status.conflict) : t.routeOwned}</p>\n <div className=\"dsha-actions\">\n <button className=\"dsha-btn\" disabled={busy !== null || !status?.authenticated} onClick={() => void handleTestConnection()}>\n {busy === 'connection' ? t.testingConnection : t.testConnection}\n </button>\n </div>\n </section>\n\n <section className=\"dsha-group\">\n <div className=\"dsha-grouphead\">\n <h3>{t.modelsSection}</h3>\n <button className=\"dsha-btn\" disabled={busy !== null} onClick={() => void handleRefreshCatalog()}>\n {busy === 'catalog' ? t.refreshingCatalog : t.refreshCatalog}\n </button>\n </div>\n <p className=\"dsha-muted dsha-models-hint\">{t.modelsHint}</p>\n <div className=\"dsha-models\" aria-label=\"Command Code Models\">\n {status?.models.map((model: CommandCodeModelOption) => {\n const lastVisible = model.enabled && visibleCount === 1\n return (\n <label key={model.id} title={`${model.id} · ${model.wire === 'anthropic' ? t.wireAnthropic : t.wireOpenai}`}>\n <input\n type=\"checkbox\"\n checked={model.enabled}\n disabled={busy !== null || lastVisible}\n onChange={(event) => toggleModel(model.id, event.currentTarget.checked)}\n />\n <span>{model.name}</span>\n </label>\n )\n })}\n </div>\n <div className=\"dsha-actions\">\n <button className=\"dsha-btn\" disabled={busy !== null} onClick={() => setAllModels(true)}>\n {t.selectAll}\n </button>\n <button className=\"dsha-btn\" disabled={busy !== null} onClick={() => setAllModels(false)}>\n {t.unselectAll}\n </button>\n </div>\n </section>\n\n <section className=\"dsha-group\">\n <div className=\"dsha-grouphead\">\n <h3>{t.enhanced}</h3>\n </div>\n <div className=\"dsha-pref-row\">\n <div>\n <strong>{t.defaultReasoningEffort}</strong>\n <p className=\"dsha-muted\">{t.defaultReasoningEffortHint}</p>\n </div>\n <select\n className=\"dsha-select\"\n aria-label={t.defaultReasoningEffort}\n value={status?.defaultReasoningEffort ?? ''}\n disabled={busy !== null}\n onChange={(event) => {\n const value = event.currentTarget.value\n void handleUpdateEffort(value === '' ? null : (value as CommandCodeReasoningEffort))\n }}\n >\n <option value=\"\">{t.defaultEffortAuto}</option>\n {COMMAND_CODE_REASONING_EFFORTS.map((effort) => (\n <option key={effort} value={effort}>{EFFORT_LABELS[effort]}</option>\n ))}\n </select>\n </div>\n </section>\n\n <section className=\"dsha-group\">\n <div className=\"dsha-grouphead\">\n <h3>{t.contextWindowSection}</h3>\n </div>\n <p className=\"dsha-muted\">{t.contextWindowHint}</p>\n <div className=\"dsha-context-settings\">\n {status?.models.map((model: CommandCodeModelOption) => (\n <div key={model.id} className=\"dsha-context-row\">\n <span title={model.id}>{model.name}</span>\n <div className=\"dsha-capacity-control\">\n <input\n type=\"text\"\n aria-label={`${model.name} context window`}\n value={contextDrafts[model.id] ?? ''}\n onChange={(event) => setContextDrafts({ ...contextDrafts, [model.id]: event.currentTarget.value })}\n onKeyDown={(event) => {\n if (event.key === 'Enter') void handleSaveContextWindow(model.id)\n }}\n />\n <small>{t.tokens}</small>\n <button\n type=\"button\"\n className=\"dsha-context-save\"\n disabled={savingModel === model.id}\n onClick={() => void handleSaveContextWindow(model.id)}\n >\n {savingModel === model.id ? t.saving : t.save}\n </button>\n </div>\n </div>\n ))}\n </div>\n </section>\n\n <section className=\"dsha-group\">\n <div className=\"dsha-grouphead\">\n <h3>{t.quotaSection}</h3>\n <button className=\"dsha-btn\" disabled={busy !== null || !status?.authenticated} onClick={() => void handleRefreshQuota()}>\n {busy === 'quota' ? t.refreshingQuota : t.refreshQuota}\n </button>\n </div>\n <p className=\"dsha-muted\">{t.quotaDesc}</p>\n\n {!status?.authenticated ? (\n <div className=\"dsha-empty\">{t.signedOut}</div>\n ) : quota === null || quota === undefined ? (\n <div className=\"dsha-empty\">{busy === 'quota' ? t.refreshingQuota : t.quotaEmpty}</div>\n ) : (\n <div className=\"dsha-quota-card\">\n <div className=\"dsha-quota-title\">\n <strong>{t.quotaCredits}</strong>\n <span>\n {quota.unlimited\n ? t.quotaUnlimited\n : quota.creditBalance !== null\n ? quota.creditBalance\n : '—'}\n </span>\n </div>\n\n {quota.windows.map((window) => (\n <div key={window.id} className=\"dsha-meter-wrap\">\n <div className=\"dsha-meter-label\">\n <span>{window.label}</span>\n <strong>{Math.max(0, 100 - window.usedPercent)}% left</strong>\n </div>\n <div className=\"dsha-meter dsha-meter-green\">\n <span style={{ width: `${Math.max(0, 100 - window.usedPercent)}%` }} />\n </div>\n {window.resetsAt !== null && (\n <div className=\"dsha-meter-meta\">\n <span>Reset: {formatReset(window.resetsAt)}</span>\n </div>\n )}\n </div>\n ))}\n\n {quota.meters.map((meter) => {\n const remaining = meter.remainingFraction\n const percent = remaining === null ? null : Math.round(remaining * 100)\n const isWindow = percent !== null\n return (\n <div key={meter.id} className=\"dsha-meter-wrap\">\n <div className=\"dsha-meter-label\">\n <span>{meter.label}</span>\n <strong>{isWindow ? `${percent}% left` : (meter.limit ?? '—')}</strong>\n </div>\n {isWindow && (\n <div className=\"dsha-meter dsha-meter-cyan\">\n <span style={{ width: `${percent}%` }} />\n </div>\n )}\n {isWindow ? (\n <div className=\"dsha-meter-meta\">\n <span>{meter.used ?? '—'} / {meter.limit ?? '—'}</span>\n {meter.resetsAt !== null && <span>Reset: {formatReset(meter.resetsAt)}</span>}\n </div>\n ) : meter.description !== null ? (\n <div className=\"dsha-meter-meta\"><span>{meter.description}</span></div>\n ) : null}\n </div>\n )\n })}\n\n {quota.meters.length === 0 && quota.windows.length === 0 && (\n <div className=\"dsha-empty\">{t.quotaEmpty}</div>\n )}\n\n <div className=\"dsha-timestamp\">\n {t.updatedAt.replace('{time}', new Date(quota.fetchedAt).toLocaleString())}\n </div>\n </div>\n )}\n </section>\n\n {error && (\n <div className=\"dsha-error\">\n <div>{error}</div>\n </div>\n )}\n </div>\n )\n}\n","/**\n * Wire contracts between the Kimi Code host routes and the browser settings\n * card. Everything here is public: no credential ever crosses this boundary.\n *\n * Kimi Code (https://www.kimi.com/code) is a Moonshot AI coding subscription,\n * distinct from the pay-as-you-go Moonshot Open Platform: its credentials come\n * from an OAuth device flow against auth.kimi.com and its inference lives at\n * https://api.kimi.com/coding/v1.\n */\n\n/** Region a Kimi Code account belongs to; decides which hosts the client uses. */\nexport type KimiCodeRegion = 'mainland-cn' | 'global'\n\n/**\n * Request/response dialect used for the model calls.\n *\n * The official Kimi Code CLI configures its managed provider as `type = \"kimi\"`,\n * an OpenAI-compatible chat-completions client, so that is the default here.\n * The Anthropic Messages dialect is offered too because the service documents\n * `https://api.kimi.com/coding/` as an Anthropic-compatible base URL for\n * third-party tools, and some models behave better with a thinking budget.\n */\nexport type KimiCodeWire = 'openai' | 'anthropic'\n\n/**\n * Thinking level a Kimi Code model accepts.\n *\n * Kimi Code maps a tool's effort onto exactly three K3 levels plus a thinking-off\n * switch. The documented mapping is authoritative and deliberately narrower than\n * the generic level set other providers use:\n *\n * - `low` <- `low` / `minimum` / `light`\n * - `high` <- `high` / `medium`\n * - `max` <- `ultra` / `max` / `xhigh`\n * - `none` -> thinking disabled (`thinking.type = \"disabled\"`)\n *\n * Anything else the client sends is rejected by the service with HTTP 400, so\n * no other level is ever put on the wire.\n */\nexport type KimiCodeReasoningEffort = 'low' | 'high' | 'max' | 'none'\n\n/** Every level, in escalating order; the settings card renders exactly these. */\nexport const KIMI_CODE_REASONING_EFFORTS: readonly KimiCodeReasoningEffort[] =\n ['low', 'high', 'max', 'none']\n\n/** One model offered by the Kimi Code coding endpoint. */\nexport interface KimiCodeModelOption {\n id: string\n name: string\n /** Enabled models are the ones DSH offers in the conversation model picker. */\n enabled: boolean\n /** Context window the catalog reports for this model. */\n defaultContextWindow: number\n /** Effective context window: the override when one is saved, else the default. */\n contextWindow: number\n /** Maximum output tokens this route requests when a caller omits one. */\n defaultMaxTokens: number\n /** Thinking levels this model accepts; absent for a model that cannot reason. */\n reasoningEfforts?: string[]\n /** Thinking level used when the conversation does not pick one. */\n defaultReasoningEffort?: string\n /** Request/response dialect the adapter uses on the wire. */\n wire: KimiCodeWire\n /** Human description from the official model table. */\n description: string | null\n /** Whether the model accepts video input as well as images. */\n supportsVideo: boolean\n /**\n * Whether the model accepts message-level tool declarations\n * (`messages[].tools`), Kimi's `dynamically_loaded_tools` capability.\n *\n * The card shows it because it is the one K3 feature that changes how a\n * client should be shaped rather than what it may send: a session that\n * progressively discloses tools keeps its top-level list stable, which is\n * what protects the prefix cache.\n */\n supportsDynamicTools: boolean\n /** Subscription tier the model needs, when it is not open to every member. */\n minimumPlan: string | null\n}\n\n/** One quota window reported for the signed-in account. */\nexport interface KimiCodeUsageWindow {\n id: string\n label: string\n /** Used fraction in [0, 1]. */\n usedFraction: number\n /** Convenience integer for the card and badge. */\n usedPercent: number\n /** Nominal window length in minutes, when the service states one. */\n windowDurationMins: number | null\n /** Unix milliseconds the window resets, when reported. */\n resetsAt: number | null\n /** Allowance as the service reports it (request counts), when reported. */\n limit: string | null\n used: string | null\n remaining: string | null\n}\n\n/** Pay-as-you-go wallet the account can fall back on once a window is spent. */\nexport interface KimiCodeExtraUsage {\n /** Remaining wallet balance in the currency's minor unit. */\n balanceCents: number | null\n totalCents: number | null\n monthlyChargeLimitEnabled: boolean\n monthlyChargeLimitCents: number | null\n monthlyUsedCents: number | null\n currency: string | null\n}\n\n/** Account identity, resolved from the token and the usage response. */\nexport interface KimiCodeAccount {\n userId: string | null\n nickname: string | null\n email: string | null\n /** Subscription tier display name, for example Moderato. */\n planName: string | null\n /** Machine tier level when the service reports one. */\n planLevel: string | null\n region: KimiCodeRegion | null\n authenticatedAt: number | null\n}\n\n/** One point-in-time quota snapshot for the signed-in Kimi Code account. */\nexport interface KimiCodeAccountQuota {\n account: KimiCodeAccount\n /** Subscription tier display name, when the service reports one. */\n planName: string | null\n /** Every quota window the account currently has. */\n windows: KimiCodeUsageWindow[]\n /** Pay-as-you-go booster wallet, when the account has one. */\n extraUsage: KimiCodeExtraUsage | null\n /** Unix milliseconds this snapshot was fetched. */\n fetchedAt: number\n /** Endpoint paths that answered, kept for diagnostics in the card. */\n sources: string[]\n}\n\n/** Everything the settings card and the composer badge render. */\nexport interface KimiCodeWebStatus {\n authenticated: boolean\n hasCredentials: boolean\n storagePath: string\n region: KimiCodeRegion\n oauthHost: string\n codingBaseUrl: string\n account: KimiCodeAccount | null\n quota: KimiCodeAccountQuota | null\n lastFetchedAt: number | null\n /** When true the stored refresh token was rejected and sign-in is required. */\n credentialsRejected: boolean\n /**\n * Why the quota could not be read, when the last attempt failed.\n *\n * Reported beside the snapshot rather than in place of it: a transient\n * failure should explain itself without hiding the account that is signed in.\n */\n quotaError?: string | null\n /** Rolling prefix-cache effectiveness for this process, when requests ran. */\n cache: KimiCodeCacheStatsDto | null\n /** Whether Preserved Thinking is currently requested on the wire. */\n preserveThinking: boolean\n models: KimiCodeModelOption[]\n contextWindowOverrides: Record<string, number>\n defaultReasoningEffort: KimiCodeReasoningEffort | null\n /** Region used for the next login flow. */\n loginRegion: KimiCodeRegion\n /** Route the plugin currently serves; false when another plugin owns it. */\n serving: boolean\n /** Diagnostic when the route is owned by a different adapter family. */\n conflict: string | null\n}\n\n/**\n * How well Kimi's automatic prefix cache is working for this process.\n *\n * Reported because the cache is invisible otherwise: it is content-hash based\n * with no marker to set, so the read ratio is the only evidence a session is\n * actually reusing its prefix.\n */\nexport interface KimiCodeCacheStatsDto {\n requests: number\n cachedTokens: number\n freshTokens: number\n outputTokens: number\n /** Cached / (cached + fresh); null until a request reports usage. */\n hitRatio: number | null\n}\n\n/** Patch accepted by the models/settings routes. */\nexport interface KimiCodeSettingsUpdateDto {\n enabledModelIds?: string[]\n contextWindowOverrides?: Record<string, number>\n defaultReasoningEffort?: KimiCodeReasoningEffort | null\n}\n\n/** Live state of the device-code login flow the card polls. */\nexport interface KimiCodeLoginFlowStatus {\n status: 'idle' | 'pending' | 'complete' | 'error'\n /** Page the user must open, including the pre-filled user code. */\n verificationUriComplete?: string\n verificationUri?: string\n userCode?: string\n startedAt?: number\n completedAt?: number\n /** Unix milliseconds the device code stops being valid. */\n expiresAt?: number\n progress?: string\n error?: string\n}\n\n/** Result of an explicit connection test. */\nexport interface KimiCodeConnectionDto {\n connected: boolean\n latencyMs: number\n account: KimiCodeAccount | null\n}\n","export const NS_KIMI_CODE = 'dsh-kimi-code'\n\nexport const zh = {\n title: 'Kimi Code',\n pageDesc: '登录 Kimi Code 订阅,管理模型、思考档位、上下文窗口与额度。',\n account: '账号',\n signedIn: '已登录',\n signedOut: '未登录',\n nickname: '昵称',\n email: '邮箱',\n plan: '套餐',\n planUnknown: '—',\n region: '区域',\n regionMainland: '中国大陆 (kimi.com)',\n regionGlobal: '国际 (kimi.ai)',\n authenticatedAt: '登录时间',\n storage: '凭据存储',\n storageNotice: 'OAuth 凭据由 Host 保存在本地安全存储 ($DSH_HOME/storages/kimi-code-credentials.json),不会进入浏览器。访问令牌会自动刷新。',\n refreshRejected: '刷新令牌已被拒绝,请重新登录。',\n signIn: '设备码登录',\n signInAgain: '重新登录',\n signingIn: '登录中...',\n signOut: '注销',\n cancelSignIn: '取消登录',\n deviceCodeSection: '设备码授权',\n deviceCodeHint: '在浏览器中打开下方链接(已自动填充用户码),确认后用同一账号授权。',\n openSignInPage: '打开授权页面',\n copyCode: '复制用户码',\n copied: '已复制',\n userCode: '用户码',\n codeExpires: '有效期至',\n waitingAuthorization: '等待浏览器授权...',\n requestingCode: '正在申请设备码...',\n connection: '连接',\n provider: 'Provider',\n providerValue: 'Kimi Code · kimi-code',\n oauthHost: 'OAuth 主机',\n codingEndpoint: '模型接口',\n connectionState: '连接状态',\n connected: '已连接',\n untested: '未测试',\n testConnection: '测试连接',\n testingConnection: '测试中...',\n testSuccess: '连接正常',\n testFailed: '连接失败:Kimi Code 未接受当前凭据',\n routeOwned: '模型路由由本插件提供',\n routeConflict: '模型路由已被其他 Provider 占用:{detail}。请在 DSH 设置中移除重复的 Provider 配置后重试。',\n modelsSection: '模型',\n modelsHint: '勾选后模型才会出现在对话页的模型选择列表中;至少保留一个。',\n refreshCatalog: '刷新模型目录',\n refreshingCatalog: '刷新中...',\n selectAll: '全选',\n unselectAll: '全不选',\n wireAnthropic: 'Anthropic',\n wireOpenai: 'OpenAI',\n capVideo: '视频*',\n capDynamicTools: '动态工具',\n capImageOnly: '仅图片',\n capNone: '—',\n capVideoFootnote: '* 视频输入需先由 kimi_attach_video 工具挂载(本地绝对路径或 http(s) 链接);直接粘贴的上传路径仍只支持图片。',\n capabilitiesTitle: '模型能力',\n capColMedia: '多模态',\n capColTools: '动态工具',\n capColNotes: '说明',\n capPlan: '需要套餐:{plan}',\n speedRegular: '标准',\n speedHighspeed: '高速 (约 6×)',\n quotaCost: '额度倍率',\n minimumPlan: '所需套餐',\n enhanced: '思考设置',\n defaultReasoningEffort: '默认思考档位',\n defaultReasoningEffortHint: 'Kimi Code 只接受 low / high / max 三档;none 表示关闭思考。切换档位会使上下文缓存失效,建议在同一会话中保持一致。',\n defaultEffortAuto: '使用模型默认值',\n effortLow: '低 (low)',\n effortHigh: '高 (high)',\n effortMax: '最高 (max)',\n effortNone: '关闭思考',\n contextWindowSection: '模型上下文窗口',\n contextWindowHint: '默认取模型目录的上下文长度。k3 的 1M 上下文需要 Allegretto 及以上套餐,因此默认按 256K 计算;如已升级可在此覆盖为 1M。',\n contextWindowPlan: '完整上下文需要 {plan} 套餐',\n save: '保存',\n saved: '已保存',\n saving: '保存中...',\n cacheSection: '缓存与 K3 调优',\n cacheDesc: 'Kimi 的前缀缓存按请求内容自动命中,无需也无法手动声明,因此这里用读缓存比例反映实际效果。',\n cacheEmpty: '本进程还没有带用量回报的请求。',\n cacheHitRatio: '缓存命中率',\n cacheCached: '命中 tokens',\n cacheFresh: '新处理 tokens',\n cacheOutput: '输出 tokens',\n cacheRequests: '请求数',\n cacheHint: '同一会话内:系统提示与工具列表一旦变化会使缓存整体失效,因此保持工具集合稳定、把新增内容追加在末尾,命中率最高。',\n preserveThinking: '保留思考 (Preserved Thinking)',\n preserveOn: '已开启(官方默认):跨轮保留 reasoning_content,多轮工具调用更连贯,但思考 token 也计入输出。',\n preserveOff: '已关闭:不要求服务回传推理内容。可设置 DSH_KIMI_CODE_PRESERVE_THINKING=0 关闭。',\n outputCap: '输出上限跟随上下文窗口,长思考不会被 32K 截断',\n quotaSection: '用量与额度',\n quotaDesc: '数据来自 Kimi Code 账户接口,页面可见时最多每 60 秒刷新一次。',\n refreshQuota: '刷新用量',\n refreshingQuota: '刷新中...',\n quotaEmpty: '暂无配额数据,点击「刷新用量」重试。',\n quotaPlan: '当前套餐',\n quotaWallet: '加油包余额',\n quotaWalletLimit: '月度上限',\n quotaWalletUsed: '本月已用',\n quotaUnlimited: '不限量',\n updatedAt: '更新时间:{time}',\n resetAt: '重置:{time}',\n loading: '加载中...',\n loginFailed: '登录失败',\n requests: '次请求',\n tokens: 'tokens',\n} as const\n\nexport const en = {\n title: 'Kimi Code',\n pageDesc: 'Sign in to the Kimi Code subscription and manage models, thinking level, context windows, and quota.',\n account: 'Account',\n signedIn: 'Signed in',\n signedOut: 'Not signed in',\n nickname: 'Nickname',\n email: 'Email',\n plan: 'Plan',\n planUnknown: '—',\n region: 'Region',\n regionMainland: 'Mainland China (kimi.com)',\n regionGlobal: 'Global (kimi.ai)',\n authenticatedAt: 'Signed in at',\n storage: 'Credential storage',\n storageNotice: 'The OAuth credential is stored locally by the Host ($DSH_HOME/storages/kimi-code-credentials.json) and never reaches the browser. Access tokens refresh automatically.',\n refreshRejected: 'The refresh token was rejected — sign in again.',\n signIn: 'Sign in with device code',\n signInAgain: 'Sign in again',\n signingIn: 'Signing in...',\n signOut: 'Sign out',\n cancelSignIn: 'Cancel',\n deviceCodeSection: 'Device authorization',\n deviceCodeHint: 'Open the link below in a browser (the user code is pre-filled) and approve it with the same account.',\n openSignInPage: 'Open the sign-in page',\n copyCode: 'Copy user code',\n copied: 'Copied',\n userCode: 'User code',\n codeExpires: 'Expires at',\n waitingAuthorization: 'Waiting for browser authorization...',\n requestingCode: 'Requesting a device code...',\n connection: 'Connection',\n provider: 'Provider',\n providerValue: 'Kimi Code · kimi-code',\n oauthHost: 'OAuth host',\n codingEndpoint: 'Model endpoint',\n connectionState: 'Connection state',\n connected: 'Connected',\n untested: 'Untested',\n testConnection: 'Test connection',\n testingConnection: 'Testing...',\n testSuccess: 'Connection OK',\n testFailed: 'Connection failed: Kimi Code did not accept the stored credential',\n routeOwned: 'This plugin serves the model route',\n routeConflict: 'Another provider already owns the model route: {detail}. Remove the duplicate provider configuration in DSH settings and reload.',\n modelsSection: 'Models',\n modelsHint: 'Checked models appear in the DSH conversation model list; keep at least one.',\n refreshCatalog: 'Refresh catalog',\n refreshingCatalog: 'Refreshing...',\n selectAll: 'Select all',\n unselectAll: 'Deselect all',\n wireAnthropic: 'Anthropic',\n wireOpenai: 'OpenAI',\n capVideo: 'Video*',\n capDynamicTools: 'Dynamic tools',\n capImageOnly: 'Images',\n capNone: '—',\n capVideoFootnote: '* Video input is attached with the kimi_attach_video tool (an absolute local path or an http(s) URL); the paste/upload path still accepts images only.',\n capabilitiesTitle: 'Capabilities',\n capColMedia: 'Multimodal',\n capColTools: 'Dynamic tools',\n capColNotes: 'Notes',\n capPlan: 'Requires plan: {plan}',\n speedRegular: 'Regular',\n speedHighspeed: 'HighSpeed (~6x)',\n quotaCost: 'Quota cost',\n minimumPlan: 'Required plan',\n enhanced: 'Thinking',\n defaultReasoningEffort: 'Default thinking level',\n defaultReasoningEffortHint: 'Kimi Code accepts only low / high / max; none disables thinking. Switching the level invalidates the context cache, so keep it steady within a session.',\n defaultEffortAuto: 'Use the model default',\n effortLow: 'Low',\n effortHigh: 'High',\n effortMax: 'Max',\n effortNone: 'Thinking off',\n contextWindowSection: 'Model context window',\n contextWindowHint: 'Defaults to the catalog context length. k3 reaches 1M only on Allegretto and above, so it defaults to 256K; raise the override here after upgrading.',\n contextWindowPlan: 'Full context requires the {plan} plan',\n save: 'Save',\n saved: 'Saved',\n saving: 'Saving...',\n cacheSection: 'Cache & K3 tuning',\n cacheDesc: \"Kimi's prefix cache is automatic and content-hash based — there is no marker to set — so the cache-read ratio is the only evidence it is working.\",\n cacheEmpty: 'No request in this process has reported usage yet.',\n cacheHitRatio: 'Cache hit ratio',\n cacheCached: 'Cached tokens',\n cacheFresh: 'Fresh tokens',\n cacheOutput: 'Output tokens',\n cacheRequests: 'Requests',\n cacheHint: 'Within one session: any change to the system prompt or the tool list invalidates the whole prefix cache, so keep the tool set stable and append new material at the tail for the best hit rate.',\n preserveThinking: 'Preserved Thinking',\n preserveOn: 'On (the official default): reasoning_content is retained across turns, which keeps multi-step tool use coherent — its tokens are billed as output.',\n preserveOff: 'Off: the service is not asked to return reasoning. Set DSH_KIMI_CODE_PRESERVE_THINKING=0 to disable.',\n outputCap: 'Output cap follows the context window, so long reasoning is not cut off at 32K',\n quotaSection: 'Usage & quota',\n quotaDesc: 'Read from the Kimi Code account endpoints; refreshes at most once every 60 seconds while visible.',\n refreshQuota: 'Refresh quota',\n refreshingQuota: 'Refreshing...',\n quotaEmpty: 'No quota data yet — use \"Refresh quota\" to retry.',\n quotaPlan: 'Current plan',\n quotaWallet: 'Booster wallet',\n quotaWalletLimit: 'Monthly cap',\n quotaWalletUsed: 'Used this month',\n quotaUnlimited: 'Unlimited',\n updatedAt: 'Updated at: {time}',\n resetAt: 'Reset: {time}',\n loading: 'Loading...',\n loginFailed: 'Sign-in failed',\n requests: 'requests',\n tokens: 'tokens',\n} as const\n\nexport const dictionaries = {\n zh,\n 'zh-CN': zh,\n en,\n 'en-US': en,\n}\n\nexport type KimiCodeLocaleKey = keyof typeof zh\n","/**\n * Capability table for the Kimi model list.\n *\n * Extracted from the settings card so the layout is testable: an earlier\n * revision inlined each capability as prose beside the model name, which\n * stretched the name column and pushed the descriptions out of alignment.\n * Capabilities are now short tags in their own columns, with the per-model\n * detail kept in a hover title.\n */\nimport React from 'react'\nimport type { KimiCodeModelOption } from '../../shared/kimi-code-contracts.ts'\nimport { zh } from './locales.ts'\n\nconst t = zh\n\nexport interface KimiModelCapabilitiesProps {\n models: KimiCodeModelOption[]\n}\n\nexport function KimiModelCapabilities({ models }: KimiModelCapabilitiesProps): React.ReactElement {\n return (\n <div className=\"dsha-cap-table\">\n <table>\n <thead>\n <tr>\n <th>{t.capabilitiesTitle}</th>\n <th>{t.capColMedia}</th>\n <th>{t.capColTools}</th>\n <th>{t.capColNotes}</th>\n </tr>\n </thead>\n <tbody>\n {models.map((model) => {\n // Hover text keeps the per-model facts that would otherwise bloat\n // the table: wire, default effort and required plan.\n const facts = [\n model.id,\n model.wire === 'anthropic' ? t.wireAnthropic : t.wireOpenai,\n ...(model.defaultReasoningEffort ? [t.defaultReasoningEffort + ': ' + model.defaultReasoningEffort] : []),\n ...(model.minimumPlan ? [t.capPlan.replace('{plan}', model.minimumPlan)] : []),\n ]\n return (\n <tr key={model.id}>\n <td title={facts.join(' · ')}>{model.name}</td>\n <td>\n <span className={model.supportsVideo ? 'dsha-cap-on' : 'dsha-cap-off'}>\n {model.supportsVideo ? t.capVideo : t.capImageOnly}\n </span>\n </td>\n <td>\n {model.supportsDynamicTools\n ? <span className=\"dsha-cap-on\">{t.capDynamicTools}</span>\n : <span className=\"dsha-cap-off\">{t.capNone}</span>}\n </td>\n <td className=\"dsha-cap-notes\">{model.description ?? ''}</td>\n </tr>\n )\n })}\n </tbody>\n </table>\n {models.some((model) => model.supportsVideo) && (\n <p className=\"dsha-muted dsha-cap-footnote\">{t.capVideoFootnote}</p>\n )}\n </div>\n )\n}\n","import React, { useCallback, useEffect, useState } from 'react'\nimport type {\n KimiCodeLoginFlowStatus,\n KimiCodeModelOption,\n KimiCodeReasoningEffort,\n KimiCodeWebStatus,\n} from '../../shared/kimi-code-contracts.ts'\nimport { KIMI_CODE_REASONING_EFFORTS } from '../../shared/kimi-code-contracts.ts'\nimport { zh } from './locales.ts'\nimport { KimiModelCapabilities } from './KimiModelCapabilities.tsx'\n\nconst API = '/kimi-code/api'\n\ninterface Props {\n onModelChange?: () => void\n loadModelDirectory?: () => void\n}\n\nasync function fetchApi<T>(path: string, options?: RequestInit): Promise<T> {\n const res = await fetch(`${API}${path}`, {\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers,\n },\n })\n const json = (await res.json()) as { ok: boolean; value?: T; error?: string }\n if (!res.ok || !json.ok) {\n throw new Error(json.error || `HTTP ${res.status}`)\n }\n return json.value as T\n}\n\n/** Parse \"1M\", \"512K\", \"200000\" into a positive integer token count. */\nexport function parsePositiveCapacity(value: string): number | null {\n const normalized = value.trim().toLowerCase().replace(/[,_\\s]/g, '')\n const matched = normalized.match(/^(\\d+(?:\\.\\d+)?)(k|m)?$/)\n if (matched === null) return null\n const multiplier = matched[2] === 'm' ? 1_000_000 : matched[2] === 'k' ? 1_000 : 1\n const parsed = Number(matched[1]) * multiplier\n return Number.isSafeInteger(parsed) && parsed >= 1 ? parsed : null\n}\n\nexport function formatCapacity(value: number): string {\n if (value >= 1_000_000 && value % 100_000 === 0) return `${value / 1_000_000}M`\n if (value >= 1_000 && value % 1_000 === 0) return `${value / 1_000}K`\n return String(value)\n}\n\nfunction formatDate(ms?: number | null): string {\n if (ms === undefined || ms === null || ms <= 0) return '—'\n try {\n return new Intl.DateTimeFormat(undefined, { dateStyle: 'medium', timeStyle: 'short' }).format(ms)\n } catch {\n return '—'\n }\n}\n\nfunction formatReset(resetsAt?: number | null): string {\n if (resetsAt === undefined || resetsAt === null || resetsAt <= 0) return ''\n const diff = resetsAt - Date.now()\n if (diff <= 0) return 'now'\n const mins = Math.floor(diff / 60000)\n const hours = Math.floor(mins / 60)\n const days = Math.floor(hours / 24)\n if (days > 0) return `${days}d ${hours % 24}h`\n if (hours > 0) return `${hours}h ${mins % 60}m`\n return `${mins}m`\n}\n\n/** Money the service reports in minor units, rendered in its own currency. */\nfunction formatMoney(cents: number | null, currency: string | null): string {\n if (cents === null) return '—'\n const code = currency ?? 'USD'\n try {\n return new Intl.NumberFormat(undefined, { style: 'currency', currency: code }).format(cents / 100)\n } catch {\n return `${(cents / 100).toFixed(2)} ${code}`\n }\n}\n\nconst EFFORT_LABEL: Record<KimiCodeReasoningEffort, string> = {\n low: zh.effortLow,\n high: zh.effortHigh,\n max: zh.effortMax,\n none: zh.effortNone,\n}\n\nexport function KimiCodeSection({ onModelChange, loadModelDirectory }: Props): React.ReactElement {\n const [status, setStatus] = useState<KimiCodeWebStatus | null>(null)\n const [loading, setLoading] = useState(true)\n const [busy, setBusy] = useState<string | null>(null)\n const [error, setError] = useState<string | null>(null)\n const [flow, setFlow] = useState<KimiCodeLoginFlowStatus | null>(null)\n const [contextDrafts, setContextDrafts] = useState<Record<string, string>>({})\n const [savingModel, setSavingModel] = useState<string | null>(null)\n const [copied, setCopied] = useState(false)\n // Result of an explicit connection test. The button used to end silently on\n // success, which is indistinguishable from a click that never registered.\n const [connectionNotice, setConnectionNotice] = useState<string | null>(null)\n\n const t = zh\n\n const notifyChange = useCallback(() => {\n onModelChange?.()\n loadModelDirectory?.()\n }, [onModelChange, loadModelDirectory])\n\n const loadStatus = useCallback(async (quiet = false) => {\n if (!quiet) setError(null)\n try {\n const data = await fetchApi<KimiCodeWebStatus>('/status')\n setStatus(data)\n const drafts: Record<string, string> = {}\n for (const model of data.models) {\n drafts[model.id] = formatCapacity(data.contextWindowOverrides[model.id] || model.defaultContextWindow)\n }\n setContextDrafts(drafts)\n } catch (err) {\n if (!quiet) setError(err instanceof Error ? err.message : String(err))\n } finally {\n setLoading(false)\n }\n }, [])\n\n useEffect(() => {\n void loadStatus()\n const refreshWhenVisible = () => {\n if (document.visibilityState === 'visible') void loadStatus(true)\n }\n document.addEventListener('visibilitychange', refreshWhenVisible)\n const timer = window.setInterval(refreshWhenVisible, 60_000)\n return () => {\n window.clearInterval(timer)\n document.removeEventListener('visibilitychange', refreshWhenVisible)\n }\n }, [loadStatus])\n\n // The login flow runs on the host and is polled here, because authorization\n // happens in a browser the card does not control.\n useEffect(() => {\n if (flow?.status !== 'pending') return\n const timer = window.setInterval(() => {\n void (async () => {\n try {\n const poll = await fetchApi<KimiCodeLoginFlowStatus>('/login/status')\n setFlow(poll)\n if (poll.status === 'complete') {\n await loadStatus()\n notifyChange()\n } else if (poll.status === 'error') {\n setError(poll.error || t.loginFailed)\n }\n } catch {\n // A failed poll is transient; the next tick retries.\n }\n })()\n }, 2000)\n return () => window.clearInterval(timer)\n }, [flow?.status, loadStatus, notifyChange, t.loginFailed])\n\n const handleLogin = async () => {\n try {\n setBusy('login')\n setError(null)\n setCopied(false)\n const next = await fetchApi<KimiCodeLoginFlowStatus>('/login', {\n method: 'POST',\n body: JSON.stringify({}),\n })\n setFlow(next)\n // The host already opened the browser; a failed launch is recoverable\n // because the card always renders the URL and the user code.\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n } finally {\n setBusy(null)\n }\n }\n\n const handleCancelLogin = async () => {\n try {\n await fetchApi<KimiCodeLoginFlowStatus>('/login/cancel', { method: 'POST' })\n setFlow({ status: 'idle' })\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n }\n }\n\n const handleCopyCode = async () => {\n const code = flow?.userCode\n if (!code) return\n try {\n await navigator.clipboard.writeText(code)\n setCopied(true)\n window.setTimeout(() => setCopied(false), 2000)\n } catch {\n // Clipboard access can be denied; the code stays visible to copy by hand.\n }\n }\n\n const handleLogout = async () => {\n try {\n setBusy('logout')\n setError(null)\n const updated = await fetchApi<KimiCodeWebStatus>('/logout', { method: 'POST' })\n setStatus(updated)\n setFlow({ status: 'idle' })\n notifyChange()\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n } finally {\n setBusy(null)\n }\n }\n\n const handleRefreshQuota = async () => {\n try {\n setBusy('quota')\n setError(null)\n // The host reports the real outcome; a failure arrives as a thrown error\n // carrying the upstream reason rather than an indistinguishable 200.\n const updated = await fetchApi<KimiCodeWebStatus>('/quota', { method: 'POST' })\n setStatus(updated)\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n // Re-read so the card still shows the account and any recorded reason.\n await loadStatus(true)\n } finally {\n setBusy(null)\n }\n }\n\n const handleRefreshCatalog = async () => {\n try {\n setBusy('catalog')\n setError(null)\n const updated = await fetchApi<KimiCodeWebStatus>('/catalog/refresh', { method: 'POST' })\n setStatus(updated)\n const drafts: Record<string, string> = {}\n for (const model of updated.models) {\n drafts[model.id] = formatCapacity(updated.contextWindowOverrides[model.id] || model.defaultContextWindow)\n }\n setContextDrafts(drafts)\n notifyChange()\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n } finally {\n setBusy(null)\n }\n }\n\n const handleTestConnection = async () => {\n try {\n setBusy('connection')\n setError(null)\n setConnectionNotice(null)\n const result = await fetchApi<{ connected: boolean; latencyMs: number }>('/connection/test', {\n method: 'POST',\n })\n setConnectionNotice(result.connected ? `${t.testSuccess} · ${result.latencyMs} ms` : t.testFailed)\n // The probe is a real usage call, so the quota shown is now current.\n await loadStatus(true)\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n } finally {\n setBusy(null)\n }\n }\n\n const applyEnabled = async (enabledModelIds: string[]) => {\n try {\n const updated = await fetchApi<KimiCodeWebStatus>('/models', {\n method: 'POST',\n body: JSON.stringify({ enabledModelIds }),\n })\n setStatus(updated)\n notifyChange()\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n }\n }\n\n const toggleModel = (modelId: string, checked: boolean) => {\n if (!status) return\n const current = status.models.filter((model) => model.enabled).map((model) => model.id)\n const next = checked ? [...new Set([...current, modelId])] : current.filter((id) => id !== modelId)\n // The route refuses an empty selection; DSH would have no model to offer.\n if (next.length === 0) return\n void applyEnabled(next)\n }\n\n const setAllModels = (selectAll: boolean) => {\n if (!status || status.models.length === 0) return\n void applyEnabled(selectAll ? status.models.map((model) => model.id) : [status.models[0]!.id])\n }\n\n const handleUpdateEffort = async (effort: KimiCodeReasoningEffort | null) => {\n try {\n const updated = await fetchApi<KimiCodeWebStatus>('/settings', {\n method: 'POST',\n body: JSON.stringify({ defaultReasoningEffort: effort }),\n })\n setStatus(updated)\n notifyChange()\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n }\n }\n\n const handleSaveContextWindow = async (modelId: string) => {\n const raw = contextDrafts[modelId] || ''\n const parsed = parsePositiveCapacity(raw)\n if (parsed === null) {\n setError(`Invalid context capacity: ${raw}`)\n return\n }\n try {\n setSavingModel(modelId)\n setError(null)\n const updated = await fetchApi<KimiCodeWebStatus>('/settings', {\n method: 'POST',\n body: JSON.stringify({ contextWindowOverrides: { [modelId]: parsed } }),\n })\n setStatus(updated)\n setContextDrafts((prev) => ({ ...prev, [modelId]: formatCapacity(parsed) }))\n notifyChange()\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n } finally {\n setSavingModel(null)\n }\n }\n\n if (loading) {\n return (\n <div className=\"dsha-page\">\n <div className=\"dsha-empty\">{t.loading}</div>\n </div>\n )\n }\n\n const quota = status?.quota\n const account = status?.account\n const visibleCount = status?.models.filter((model) => model.enabled).length || 0\n const loginPending = flow?.status === 'pending'\n\n return (\n <div className=\"dsha-page\">\n <section className=\"dsha-group\">\n <div className=\"dsha-grouphead\">\n <h3>{status?.authenticated ? t.account : t.signedOut}</h3>\n </div>\n <div className=\"dsha-row\">\n <span className=\"dsha-label\">{status?.authenticated ? t.signedIn : t.signedOut}</span>\n <span className=\"dsha-value\">{account?.nickname || account?.email || account?.userId || '—'}</span>\n </div>\n {status?.authenticated && (\n <>\n <div className=\"dsha-row\">\n <span className=\"dsha-label\">{t.plan}</span>\n <span className=\"dsha-value\">{quota?.planName || account?.planName || t.planUnknown}</span>\n </div>\n {account?.email && (\n <div className=\"dsha-row\">\n <span className=\"dsha-label\">{t.email}</span>\n <span className=\"dsha-value\">{account.email}</span>\n </div>\n )}\n <div className=\"dsha-row\">\n <span className=\"dsha-label\">{t.region}</span>\n <span className=\"dsha-value\">\n {status.region === 'global' ? t.regionGlobal : t.regionMainland}\n </span>\n </div>\n <div className=\"dsha-row\">\n <span className=\"dsha-label\">{t.authenticatedAt}</span>\n <span className=\"dsha-value\">{formatDate(account?.authenticatedAt)}</span>\n </div>\n </>\n )}\n <div className=\"dsha-row\">\n <span className=\"dsha-label\">{t.storage}</span>\n <span className=\"dsha-value\">{status?.storagePath || '—'}</span>\n </div>\n <p className=\"dsha-notice\">{t.storageNotice}</p>\n {status?.credentialsRejected && (\n <p className=\"dsha-notice\">{t.refreshRejected}</p>\n )}\n\n {loginPending && (\n <div className=\"dsha-device-box\">\n <strong>{t.deviceCodeSection}</strong>\n <p className=\"dsha-muted\">{t.deviceCodeHint}</p>\n {flow?.userCode && (\n <div className=\"dsha-code-row\">\n <span className=\"dsha-code\">{flow.userCode}</span>\n <button className=\"dsha-btn\" onClick={() => void handleCopyCode()}>\n {copied ? t.copied : t.copyCode}\n </button>\n </div>\n )}\n {flow?.verificationUriComplete && (\n <a\n className=\"dsha-link\"\n href={flow.verificationUriComplete}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n >\n {flow.verificationUriComplete}\n </a>\n )}\n <div className=\"dsha-row\">\n <span className=\"dsha-label\">{t.codeExpires}</span>\n <span className=\"dsha-value\">{formatDate(flow?.expiresAt)}</span>\n </div>\n <div className=\"dsha-actions\">\n {flow?.verificationUriComplete && (\n <a\n className=\"dsha-btn\"\n href={flow.verificationUriComplete}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n >\n {t.openSignInPage}\n </a>\n )}\n <button className=\"dsha-btn\" disabled={busy !== null} onClick={() => void handleCancelLogin()}>\n {t.cancelSignIn}\n </button>\n </div>\n </div>\n )}\n\n <div className=\"dsha-actions\">\n {!status?.authenticated ? (\n <button\n className=\"dsha-btn dsha-btn-primary\"\n disabled={busy !== null || loginPending}\n onClick={() => void handleLogin()}\n >\n {loginPending ? t.waitingAuthorization : busy === 'login' ? t.requestingCode : t.signIn}\n </button>\n ) : (\n <>\n <button\n className=\"dsha-btn dsha-btn-primary\"\n disabled={busy !== null || loginPending}\n onClick={() => void handleLogin()}\n >\n {loginPending ? t.waitingAuthorization : t.signInAgain}\n </button>\n <button className=\"dsha-btn\" disabled={busy !== null} onClick={() => void handleRefreshQuota()}>\n {busy === 'quota' ? t.refreshingQuota : t.refreshQuota}\n </button>\n <button className=\"dsha-btn\" disabled={busy !== null} onClick={() => void handleLogout()}>\n {t.signOut}\n </button>\n </>\n )}\n </div>\n </section>\n\n <section className=\"dsha-group\">\n <div className=\"dsha-grouphead\">\n <h3>{t.connection}</h3>\n </div>\n <div className=\"dsha-row\">\n <span className=\"dsha-label\">{t.provider}</span>\n <span className=\"dsha-value\">{t.providerValue}</span>\n </div>\n <div className=\"dsha-row\">\n <span className=\"dsha-label\">{t.oauthHost}</span>\n <span className=\"dsha-value\">{status?.oauthHost || '—'}</span>\n </div>\n <div className=\"dsha-row\">\n <span className=\"dsha-label\">{t.codingEndpoint}</span>\n <span className=\"dsha-value\">{status?.codingBaseUrl || '—'}</span>\n </div>\n <div className=\"dsha-row\">\n <span className=\"dsha-label\">{t.connectionState}</span>\n <span className=\"dsha-value\">{status?.authenticated ? t.connected : t.untested}</span>\n </div>\n <p className=\"dsha-notice\">\n {status?.serving === false && status.conflict\n ? t.routeConflict.replace('{detail}', status.conflict)\n : t.routeOwned}\n </p>\n {connectionNotice && <p className=\"dsha-muted\">{connectionNotice}</p>}\n <div className=\"dsha-actions\">\n <button\n className=\"dsha-btn\"\n disabled={busy !== null || !status?.authenticated}\n onClick={() => void handleTestConnection()}\n >\n {busy === 'connection' ? t.testingConnection : t.testConnection}\n </button>\n </div>\n </section>\n\n <section className=\"dsha-group\">\n <div className=\"dsha-grouphead\">\n <h3>{t.modelsSection}</h3>\n <button className=\"dsha-btn\" disabled={busy !== null} onClick={() => void handleRefreshCatalog()}>\n {busy === 'catalog' ? t.refreshingCatalog : t.refreshCatalog}\n </button>\n </div>\n <p className=\"dsha-muted dsha-models-hint\">{t.modelsHint}</p>\n <div className=\"dsha-models\" aria-label=\"Kimi Code Models\">\n {status?.models.map((model: KimiCodeModelOption) => {\n const lastVisible = model.enabled && visibleCount === 1\n // The tooltip carries what the model actually accepts, including the\n // service-side capabilities DSH itself cannot exercise.\n const facts = [\n model.id,\n model.wire === 'anthropic' ? t.wireAnthropic : t.wireOpenai,\n ...(model.supportsVideo ? [t.capVideo] : []),\n ...(model.supportsDynamicTools ? [t.capDynamicTools] : []),\n ...(model.minimumPlan ? [t.capPlan.replace('{plan}', model.minimumPlan)] : []),\n ]\n return (\n <label key={model.id} title={facts.join(' · ')}>\n <input\n type=\"checkbox\"\n checked={model.enabled}\n disabled={busy !== null || lastVisible}\n onChange={(event) => toggleModel(model.id, event.currentTarget.checked)}\n />\n <span>{model.name}</span>\n </label>\n )\n })}\n </div>\n <div className=\"dsha-actions\">\n <button className=\"dsha-btn\" disabled={busy !== null} onClick={() => setAllModels(true)}>\n {t.selectAll}\n </button>\n <button className=\"dsha-btn\" disabled={busy !== null} onClick={() => setAllModels(false)}>\n {t.unselectAll}\n </button>\n </div>\n {status !== null && status.models.length > 0 && <KimiModelCapabilities models={status.models} />}\n </section>\n\n <section className=\"dsha-group\">\n <div className=\"dsha-grouphead\">\n <h3>{t.enhanced}</h3>\n </div>\n <div className=\"dsha-pref-row\">\n <div>\n <strong>{t.defaultReasoningEffort}</strong>\n <p className=\"dsha-muted\">{t.defaultReasoningEffortHint}</p>\n </div>\n <select\n className=\"dsha-select\"\n aria-label={t.defaultReasoningEffort}\n value={status?.defaultReasoningEffort ?? ''}\n disabled={busy !== null}\n onChange={(event) => {\n const value = event.currentTarget.value\n void handleUpdateEffort(value === '' ? null : (value as KimiCodeReasoningEffort))\n }}\n >\n <option value=\"\">{t.defaultEffortAuto}</option>\n {KIMI_CODE_REASONING_EFFORTS.map((effort) => (\n <option key={effort} value={effort}>{EFFORT_LABEL[effort]}</option>\n ))}\n </select>\n </div>\n </section>\n\n <section className=\"dsha-group\">\n <div className=\"dsha-grouphead\">\n <h3>{t.contextWindowSection}</h3>\n </div>\n <p className=\"dsha-muted\">{t.contextWindowHint}</p>\n <div className=\"dsha-context-settings\">\n {status?.models.map((model: KimiCodeModelOption) => (\n <div key={model.id} className=\"dsha-context-row\">\n <span title={model.id}>\n {model.name}\n {model.defaultContextWindow < model.contextWindow && (\n <span className=\"dsha-model-meta\">{formatCapacity(model.contextWindow)}</span>\n )}\n </span>\n <div className=\"dsha-capacity-control\">\n <input\n type=\"text\"\n aria-label={`${model.name} context window`}\n value={contextDrafts[model.id] ?? ''}\n onChange={(event) => setContextDrafts({ ...contextDrafts, [model.id]: event.currentTarget.value })}\n onKeyDown={(event) => {\n if (event.key === 'Enter') void handleSaveContextWindow(model.id)\n }}\n />\n <small>{t.tokens}</small>\n <button\n type=\"button\"\n className=\"dsha-context-save\"\n disabled={savingModel === model.id}\n onClick={() => void handleSaveContextWindow(model.id)}\n >\n {savingModel === model.id ? t.saving : t.save}\n </button>\n </div>\n </div>\n ))}\n </div>\n </section>\n\n <section className=\"dsha-group\">\n <div className=\"dsha-grouphead\">\n <h3>{t.quotaSection}</h3>\n <button\n className=\"dsha-btn\"\n disabled={busy !== null || !status?.authenticated}\n onClick={() => void handleRefreshQuota()}\n >\n {busy === 'quota' ? t.refreshingQuota : t.refreshQuota}\n </button>\n </div>\n <p className=\"dsha-muted\">{t.quotaDesc}</p>\n\n {status?.quotaError && <p className=\"dsha-notice\">{status.quotaError}</p>}\n\n {!status?.authenticated ? (\n <div className=\"dsha-empty\">{t.signedOut}</div>\n ) : quota === null || quota === undefined ? (\n <div className=\"dsha-empty\">{busy === 'quota' ? t.refreshingQuota : t.quotaEmpty}</div>\n ) : (\n <div className=\"dsha-quota-card\">\n <div className=\"dsha-quota-title\">\n <strong>{t.quotaPlan}</strong>\n <span>{quota.planName || t.planUnknown}</span>\n </div>\n\n {quota.windows.map((window) => {\n const remaining = Math.max(0, 100 - window.usedPercent)\n return (\n <div key={window.id} className=\"dsha-meter-wrap\">\n <div className=\"dsha-meter-label\">\n <span>{window.label}</span>\n <strong>{remaining}% left</strong>\n </div>\n <div className={`dsha-meter ${remaining <= 10 ? 'dsha-meter-cyan' : 'dsha-meter-green'}`}>\n <span style={{ width: `${remaining}%` }} />\n </div>\n <div className=\"dsha-meter-meta\">\n <span>\n {window.used ?? '—'} / {window.limit ?? '—'} {t.requests}\n </span>\n {window.resetsAt !== null && (\n <span>{t.resetAt.replace('{time}', formatReset(window.resetsAt))}</span>\n )}\n </div>\n </div>\n )\n })}\n\n {quota.extraUsage !== null && (\n <div className=\"dsha-meter-wrap\">\n <div className=\"dsha-meter-label\">\n <span>{t.quotaWallet}</span>\n <strong>{formatMoney(quota.extraUsage.balanceCents, quota.extraUsage.currency)}</strong>\n </div>\n <div className=\"dsha-meter-meta\">\n <span>{formatMoney(quota.extraUsage.totalCents, quota.extraUsage.currency)}</span>\n {quota.extraUsage.monthlyChargeLimitEnabled && quota.extraUsage.monthlyChargeLimitCents !== null && (\n <span>\n {t.quotaWalletLimit}: {formatMoney(quota.extraUsage.monthlyChargeLimitCents, quota.extraUsage.currency)}\n </span>\n )}\n </div>\n </div>\n )}\n\n {quota.windows.length === 0 && quota.extraUsage === null && (\n <div className=\"dsha-empty\">{t.quotaEmpty}</div>\n )}\n\n <div className=\"dsha-timestamp\">\n {t.updatedAt.replace('{time}', new Date(quota.fetchedAt).toLocaleString())}\n </div>\n </div>\n )}\n </section>\n\n {error && (\n <div className=\"dsha-error\">\n <div>{error}</div>\n </div>\n )}\n </div>\n )\n}\n","import { useCallback, useState } from 'react'\nimport type { KeyboardEvent } from 'react'\nimport type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport { CodexSubscriptionSection } from './CodexSubscriptionSection.tsx'\nimport { AntigravitySection } from './antigravity/AntigravitySection.tsx'\nimport { CommandCodeSection } from './command-code/CommandCodeSection.tsx'\nimport { KimiCodeSection } from './kimi-code/KimiCodeSection.tsx'\nimport { NS } from './locales.ts'\n\ntype Props = PropsRuntime<'settings.section'> & PropsLocale<typeof NS> & {\n onModelChange?: () => void\n}\n\ntype HubTabId = 'chatgpt' | 'antigravity' | 'command-code' | 'kimi-code'\n\n// Brand names stay literal: the former standalone sidebar entries used the\n// same hardcoded labels, and every provider section except ChatGPT is\n// zh-only today.\nconst HUB_TABS: ReadonlyArray<{ id: HubTabId; label: string }> = [\n { id: 'chatgpt', label: 'ChatGPT' },\n { id: 'antigravity', label: 'Antigravity' },\n { id: 'command-code', label: 'Command Code' },\n { id: 'kimi-code', label: 'Kimi Code' },\n]\n\n/**\n * Single settings page that hosts every subscription provider behind tabs,\n * so the settings sidebar shows one entry instead of one per provider. Only\n * the active tab is mounted, mirroring the shell's previous behavior of\n * mounting just the selected settings page (each provider section refetches\n * its status on mount).\n */\nexport function ProviderHubSection({ t, onModelChange, ...runtime }: Props): React.JSX.Element {\n const [active, setActive] = useState<HubTabId>('chatgpt')\n\n const onTabKeyDown = useCallback((event: KeyboardEvent<HTMLButtonElement>): void => {\n if (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight') return\n event.preventDefault()\n const index = HUB_TABS.findIndex((tab) => tab.id === active)\n const delta = event.key === 'ArrowRight' ? 1 : -1\n const next = HUB_TABS[(index + delta + HUB_TABS.length) % HUB_TABS.length]\n setActive(next.id)\n document.getElementById(`dsh-hub-tab-${next.id}`)?.focus()\n }, [active])\n\n return <section className=\"dsh-codex-page\" aria-labelledby=\"dsh-hub-title\">\n <header>\n <h2 id=\"dsh-hub-title\" className=\"dsh-codex-title\">{t('hubTitle')}</h2>\n </header>\n <div className=\"dsh-codex-segments dsh-hub-tabs\" role=\"tablist\" aria-label={t('hubTitle')}>\n {HUB_TABS.map((tab) => <button\n key={tab.id}\n type=\"button\"\n role=\"tab\"\n id={`dsh-hub-tab-${tab.id}`}\n aria-selected={active === tab.id}\n aria-controls={`dsh-hub-panel-${tab.id}`}\n className={active === tab.id ? 'active' : undefined}\n tabIndex={active === tab.id ? 0 : -1}\n onClick={() => setActive(tab.id)}\n onKeyDown={onTabKeyDown}\n >{tab.label}</button>)}\n </div>\n <div role=\"tabpanel\" id={`dsh-hub-panel-${active}`} aria-labelledby={`dsh-hub-tab-${active}`}>\n {active === 'chatgpt' ? <CodexSubscriptionSection t={t} {...runtime} /> : null}\n {active === 'antigravity' ? <AntigravitySection onModelChange={onModelChange} /> : null}\n {active === 'command-code' ? <CommandCodeSection onModelChange={onModelChange} /> : null}\n {active === 'kimi-code' ? <KimiCodeSection onModelChange={onModelChange} /> : null}\n </div>\n </section>\n}\n","export const NS = 'dsh-chatgpt-subscription' as const\n\nexport const zh = {\n title: 'ChatGPT',\n hubTitle: '订阅服务',\n intro: '使用 ChatGPT 账号登录,在 DSH 中使用订阅可用的模型。',\n account: '账号',\n signedOut: '尚未登录',\n signedIn: '已登录',\n plan: '套餐',\n accountId: '账号 ID',\n expires: '令牌到期',\n storage: '凭据存储',\n storageWindows: 'Windows DPAPI(当前用户加密)',\n storageMacKeychain: 'macOS 钥匙串(Keychain 加密)',\n storageLinuxFile: 'Linux 用户私有文件(权限 0600)',\n storageMemory: '仅 Host 内存(不持久化)',\n storageUnavailable: '凭据存储不可用',\n securityWindows: '令牌由 Host 使用 Windows CurrentUser DPAPI 加密,不会进入浏览器、settings.yaml 或日志。',\n securityMacKeychain: '令牌由 Host 存入 macOS 登录钥匙串(Keychain),在本机加密保存,不会进入浏览器、settings.yaml 或日志。',\n securityLinuxFile: '令牌仅写入 Host 上当前 Linux 用户可读的 0600 文件,但不会额外加密;同 UID 进程、root、备份和磁盘快照仍可能读取。',\n securityMemory: '令牌仅保留在 Host 内存中,Host 退出后丢失。',\n securityUnavailable: 'Host 无法安全访问凭据存储;请修复文件所有者或权限后重试。',\n signIn: '使用 ChatGPT 登录',\n signInAgain: '重新登录',\n cancel: '取消登录',\n signOut: '注销',\n refreshToken: '刷新凭据',\n pending: '请在浏览器中完成登录。',\n popupBlocked: '浏览器拦截了登录窗口,请使用下面的链接继续。',\n continueLogin: '打开 ChatGPT 登录页',\n loading: '正在读取状态…',\n connection: '连接',\n provider: 'Provider',\n connectionState: '连接状态',\n connected: '可用',\n untested: '尚未测试',\n testConnection: '测试连接',\n testing: '测试中…',\n latency: '最近延迟',\n models: '可用模型',\n modelsHint: '勾选后模型才会显示在对话页的模型选择列表中;至少保留一个。',\n proxySettings: '网络代理',\n proxyMode: '代理模式',\n proxyModeHint: 'GPT 与 Antigravity(Gemini)共用此代理设置;支持自动读取系统代理,修改后对后续请求生效。',\n proxyModeAuto: '系统代理(自动检测)',\n proxyModeCustom: '自定义代理',\n proxyModeDirect: '直连(禁用代理)',\n customProxyUrl: '自定义代理地址',\n customProxyUrlHint: '支持 HTTP/HTTPS/SOCKS5 代理地址,例如 http://127.0.0.1:7890',\n customProxyUrlPlaceholder: '例如: http://127.0.0.1:7890',\n saveProxyUrl: '保存代理地址',\n proxyDetected: '检测到系统代理',\n proxyDetectedEffective: '(已自动生效)',\n proxyNoneDetected: '未检测到系统代理,将使用直连',\n proxyDirectHint: '所有网络请求将直接连接,不经过任何代理服务器。',\n enhancements: '增强功能',\n fastMode: '快速模式(1.5x 速度)',\n fastModeHint: '提升 Token 生成速度至约 1.5 倍;将以约 2x–2.5x 速度消耗 Codex 订阅额度。',\n outputVerbosity: '输出详细程度',\n outputVerbosityHint: '控制 Codex 最终回答的详细程度;不影响思考深度。',\n verbosityLow: '低(保持回答简洁)',\n verbosityMedium: '中(兼顾细节与简洁)',\n verbosityHigh: '高(在回答中包含更多细节)',\n reasoningSummary: '推理摘要',\n reasoningSummaryHint: '选择 ChatGPT 总结其推理的方式;不影响思考深度。',\n summaryAuto: '自动(让模型选择摘要详细程度)',\n summaryConcise: '简洁(显示简要推理摘要)',\n summaryDetailed: '详细(显示更详细的推理摘要)',\n summaryNone: '无(不显示推理摘要)',\n searchProvider: '搜索与抓取来源',\n searchProviderHint: '选择 DSH 联网工具使用默认来源,或改用当前 ChatGPT 订阅的 Codex 来源(自动走代理隧道)。',\n searchProviderDsh: 'DSH 默认',\n searchProviderCodex: 'ChatGPT(代理隧道)',\n providerDefault: '使用 Provider 默认值',\n contextWindows: '模型上下文窗口',\n contextWindowsHint: '默认 272K;6 Astra 最高 872K,GPT-5.6 最高 1M。该值用于 DSH 的压缩与溢出判断,可输入 872K、512K 等容量。',\n contextWindow: '上下文窗口',\n contextWindowInvalid: '上下文窗口必须是正整数,且不能超过模型上限(6 Astra 为 872K,GPT-5.6 为 1M);可使用 K 或 M 后缀。',\n saveContextWindow: '保存上下文窗口',\n save: '保存',\n tokens: 'tokens',\n quickQuota: '在输入框旁显示快捷用量',\n quickQuotaHint: '仅在当前会话选中 codex-chatgpt 模型时显示。',\n quota: '用量与限额',\n quotaIntro: '数据来自 ChatGPT Codex 用量服务。页面可见时最多每 60 秒刷新一次。',\n refreshQuota: '刷新用量',\n refreshing: '刷新中…',\n noQuota: '当前套餐未返回可显示的限额窗口。',\n quotaSignedOut: '登录后可查看订阅限额。',\n stale: '显示的是上次成功获取的数据。',\n updated: '更新时间',\n primary: '主要窗口',\n secondary: '次要窗口',\n limitWindow: '额度',\n used: '已使用',\n remaining: '剩余',\n available: '可用',\n unavailable: '不可用',\n unlimited: '无限',\n credits: 'Credits',\n monthlySpend: '月度消费控制',\n resetCredits: '重置次数',\n resetCreditExpires: '到期时间',\n useResetCredit: '使用重置卡',\n usingResetCredit: '使用中…',\n useResetCreditConfirm: '使用后会立即消耗 1 次重置机会,并重置符合条件的 Codex 额度窗口。确定继续吗?',\n resetCreditUsed: '重置卡已使用,用量数据已刷新。',\n spendControlReached: '已触发月度消费控制,新的订阅调用可能被限制。',\n limit: '上限',\n exhausted: '额度已用尽',\n resets: '重置',\n quickQuotaLabel: 'Codex 剩余',\n quickQuotaLoading: '用量…',\n imageToolRunning: '正在生成图片',\n imageToolDone: '已生成图片',\n imageToolFailed: '图片生成失败',\n image: '图片',\n openImage: '打开图片',\n openNamedImage: '打开 {name}',\n imageLoading: '加载图片…',\n imageLoadFailed: '图片加载失败,点击重试',\n imagePreviewClose: '关闭',\n imagePreviewOpenOriginal: '打开原图',\n retry: '重试',\n unknown: '未知',\n} as const\n\nexport const en: Record<keyof typeof zh, string> = {\n title: 'ChatGPT',\n hubTitle: 'Subscriptions',\n intro: 'Sign in with ChatGPT to use models available to your subscription in DSH.',\n account: 'Account',\n signedOut: 'Not signed in',\n signedIn: 'Signed in',\n plan: 'Plan',\n accountId: 'Account ID',\n expires: 'Token expires',\n storage: 'Credential storage',\n storageWindows: 'Windows DPAPI (current-user encrypted)',\n storageMacKeychain: 'macOS Keychain (encrypted)',\n storageLinuxFile: 'Linux user-private file (mode 0600)',\n storageMemory: 'Host memory only (not persistent)',\n storageUnavailable: 'Credential storage unavailable',\n securityWindows: 'The Host encrypts tokens with Windows CurrentUser DPAPI; they never enter the browser, settings.yaml, or logs.',\n securityMacKeychain: 'The Host stores tokens in the macOS login Keychain, encrypted on this machine; they never enter the browser, settings.yaml, or logs.',\n securityLinuxFile: 'Tokens are stored in a mode-0600 file readable only by the current Linux user, but are not additionally encrypted; same-UID processes, root, backups, and disk snapshots can still read them.',\n securityMemory: 'Tokens remain only in Host memory and are lost when the Host exits.',\n securityUnavailable: 'The Host cannot safely access credential storage. Fix the file owner or permissions and retry.',\n signIn: 'Sign in with ChatGPT',\n signInAgain: 'Sign in again',\n cancel: 'Cancel sign-in',\n signOut: 'Sign out',\n refreshToken: 'Refresh credentials',\n pending: 'Complete sign-in in your browser.',\n popupBlocked: 'The sign-in window was blocked. Use the link below to continue.',\n continueLogin: 'Open ChatGPT sign-in',\n loading: 'Reading status…',\n connection: 'Connection',\n provider: 'Provider',\n connectionState: 'Connection status',\n connected: 'Available',\n untested: 'Not tested',\n testConnection: 'Test connection',\n testing: 'Testing…',\n latency: 'Last latency',\n models: 'Available models',\n modelsHint: 'Checked models appear in the conversation model picker; at least one must remain enabled.',\n proxySettings: 'Network Proxy',\n proxyMode: 'Proxy Mode',\n proxyModeHint: 'GPT and Antigravity (Gemini) share these proxy settings. Supports system proxy detection; changes apply to subsequent requests.',\n proxyModeAuto: 'System Proxy (Auto-detect)',\n proxyModeCustom: 'Custom Proxy',\n proxyModeDirect: 'Direct (No Proxy)',\n customProxyUrl: 'Custom Proxy URL',\n customProxyUrlHint: 'Supports HTTP/HTTPS/SOCKS5 proxy URLs, e.g. http://127.0.0.1:7890',\n customProxyUrlPlaceholder: 'e.g. http://127.0.0.1:7890',\n saveProxyUrl: 'Save Proxy URL',\n proxyDetected: 'Detected system proxy',\n proxyDetectedEffective: ' (active)',\n proxyNoneDetected: 'No system proxy detected; connecting directly',\n proxyDirectHint: 'All requests connect directly without using any proxy server.',\n enhancements: 'Enhancements',\n fastMode: 'Fast mode (1.5x speed)',\n fastModeHint: 'Generates tokens ~1.5x faster; consumes Codex subscription quota at ~2x–2.5x the normal rate.',\n outputVerbosity: 'Output verbosity',\n outputVerbosityHint: 'Controls the detail level of final Codex answers without changing reasoning effort.',\n verbosityLow: 'Low (keep answers concise)',\n verbosityMedium: 'Medium (balance detail and brevity)',\n verbosityHigh: 'High (include more detail)',\n reasoningSummary: 'Reasoning summary',\n reasoningSummaryHint: 'Controls how ChatGPT summarizes its chain of thought; does not change reasoning depth.',\n summaryAuto: 'Auto (let model determine detail)',\n summaryConcise: 'Concise (brief summary)',\n summaryDetailed: 'Detailed (in-depth summary)',\n summaryNone: 'None (hide reasoning summary)',\n searchProvider: 'Search & Fetch provider',\n searchProviderHint: 'Choose whether DSH web tools use the default provider or the Codex proxy-backed source from this ChatGPT subscription.',\n searchProviderDsh: 'DSH default',\n searchProviderCodex: 'ChatGPT (Proxy tunnel)',\n providerDefault: 'Use provider default',\n contextWindows: 'Model context windows',\n contextWindowsHint: 'Defaults to 272K, with up to 872K for 6 Astra and 1M for GPT-5.6. DSH uses it for compaction and overflow detection; values such as 872K and 512K are accepted.',\n contextWindow: 'Context window',\n contextWindowInvalid: 'The context window must be a positive integer within the model limit (872K for 6 Astra, 1M for GPT-5.6). K and M suffixes are accepted.',\n saveContextWindow: 'Save context window',\n save: 'Save',\n tokens: 'tokens',\n quickQuota: 'Show quick usage beside the composer',\n quickQuotaHint: 'Shown only when the current session uses a codex-chatgpt model.',\n quota: 'Usage and limits',\n quotaIntro: 'Data comes from the ChatGPT Codex usage service and refreshes at most once per minute while visible.',\n refreshQuota: 'Refresh usage',\n refreshing: 'Refreshing…',\n noQuota: 'Your plan did not return any displayable limit windows.',\n quotaSignedOut: 'Sign in to view subscription limits.',\n stale: 'Showing the last successfully fetched data.',\n updated: 'Updated',\n primary: 'Primary window',\n secondary: 'Secondary window',\n limitWindow: 'limit',\n used: 'used',\n remaining: 'remaining',\n available: 'Available',\n unavailable: 'Unavailable',\n unlimited: 'Unlimited',\n credits: 'Credits',\n monthlySpend: 'Monthly spend control',\n resetCredits: 'Reset credits',\n resetCreditExpires: 'Expires',\n useResetCredit: 'Use reset credit',\n usingResetCredit: 'Using…',\n useResetCreditConfirm: 'This immediately spends one reset credit and resets eligible Codex limit windows. Continue?',\n resetCreditUsed: 'The reset credit was used and usage data was refreshed.',\n spendControlReached: 'Monthly spend control has been reached; new subscription calls may be limited.',\n limit: 'Limit',\n exhausted: 'Quota exhausted',\n resets: 'Resets',\n quickQuotaLabel: 'Codex left',\n quickQuotaLoading: 'Usage…',\n imageToolRunning: 'Generating image',\n imageToolDone: 'Generated image',\n imageToolFailed: 'Image generation failed',\n image: 'Image',\n openImage: 'Open image',\n openNamedImage: 'Open {name}',\n imageLoading: 'Loading image…',\n imageLoadFailed: 'Image failed to load. Click to retry',\n imagePreviewClose: 'Close',\n imagePreviewOpenOriginal: 'Open original',\n retry: 'Retry',\n unknown: 'Unknown',\n}\n\nexport type LocaleKey = keyof typeof zh\nexport const dictionaries = { zh, en }\n","const STYLE_ID = '@eddyskywalker/dsh-chatgpt-subscription/main'\n\nconst CSS = `\n.dsh-codex-page{box-sizing:border-box;color:var(--dsw-alias-label-primary);display:flex;flex-direction:column;gap:20px;max-width:780px;min-width:0;padding:2px 0 30px}\n.dsh-codex-page *{box-sizing:border-box}\n.dsh-codex-title{font-size:15px;font-weight:650;line-height:1.4;margin:0 0 5px}\n.dsh-codex-intro,.dsh-codex-muted{color:var(--dsw-alias-label-secondary);font-size:13px;line-height:1.55;margin:0}\n.dsh-codex-group{border-top:0.5px solid var(--dsw-alias-border-l2);min-width:0}\n.dsh-codex-grouphead{align-items:center;display:flex;gap:12px;justify-content:space-between;min-height:48px}\n.dsh-codex-grouphead h3{font-size:14px;font-weight:650;margin:0}\n.dsh-codex-row{align-items:center;border-bottom:0.5px solid var(--dsw-alias-border-l2);display:flex;gap:20px;justify-content:space-between;min-height:44px;padding:8px 0}\n.dsh-codex-label{color:var(--dsw-alias-label-secondary);font-size:13px;flex:0 0 auto}\n.dsh-codex-value{font-size:13px;min-width:0;overflow-wrap:anywhere;text-align:right}\n.dsh-codex-actions{display:flex;flex-wrap:wrap;gap:8px;justify-content:flex-end;padding-top:12px}\n.dsh-codex-button{background:var(--dsw-alias-bg-layer-2);border:0.5px solid var(--dsw-alias-border-l2);border-radius:999px;corner-shape:round;color:var(--dsw-alias-label-primary);cursor:pointer;font:inherit;font-size:13px;line-height:1;padding:8px 13px;white-space:nowrap}\n.dsh-codex-button:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}\n.dsh-codex-button:focus-visible,.dsh-codex-link:focus-visible{outline:2px solid var(--dsw-alias-button-info-fill,#397ee8);outline-offset:2px}\n.dsh-codex-button:disabled{cursor:default;opacity:.5}\n.dsh-codex-button-primary{background:var(--dsw-alias-button-info-fill,#397ee8);border-color:transparent;color:var(--dsw-alias-button-info-label,#fff)}\n.dsh-codex-notice{background:var(--dsw-alias-bg-layer-2);border:0.5px solid var(--dsw-alias-border-l2);border-radius:7px;color:var(--dsw-alias-label-secondary);font-size:12px;line-height:1.55;margin:12px 0 0;padding:10px 12px}\n.dsh-codex-error,.dsh-codex-warning,.dsh-codex-success{font-size:12px;line-height:1.5;margin:8px 0 0}\n.dsh-codex-error{color:var(--dsw-alias-label-danger,#d94b4b)}\n.dsh-codex-warning{color:var(--dsw-alias-label-warning,#c77a18)}\n.dsh-codex-success{color:var(--dsw-alias-label-success,#2e9b62)}\n.dsh-codex-errorbar{align-items:center;background:color-mix(in srgb,var(--dsw-alias-label-danger,#d94b4b) 9%,transparent);border:0.5px solid color-mix(in srgb,var(--dsw-alias-label-danger,#d94b4b) 28%,transparent);border-radius:7px;color:var(--dsw-alias-label-danger,#d94b4b);display:flex;font-size:13px;gap:12px;justify-content:space-between;padding:10px 12px}\n.dsh-codex-link{color:var(--dsw-alias-label-link,#3278d4);display:inline-block;font-size:13px;margin-top:8px}\n.dsh-codex-models-hint{padding-top:10px}\n.dsh-codex-models{display:flex;flex-wrap:wrap;gap:7px;padding-top:8px}\n.dsh-codex-models label{cursor:pointer;display:block;position:relative}\n.dsh-codex-models input{position:absolute;opacity:0;pointer-events:none}\n.dsh-codex-models span{background:var(--dsw-alias-bg-layer-2);border:0.5px solid var(--dsw-alias-border-l2);border-radius:6px;color:var(--dsw-alias-label-secondary);display:block;font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:11px;padding:5px 8px}\n.dsh-codex-models input:checked+span{background:color-mix(in srgb,var(--dsw-alias-button-info-fill,#397ee8) 14%,var(--dsw-alias-bg-layer-2));border-color:color-mix(in srgb,var(--dsw-alias-button-info-fill,#397ee8) 55%,var(--dsw-alias-border-l2));color:var(--dsw-alias-label-primary)}\n.dsh-codex-models input:focus-visible+span{outline:2px solid var(--dsw-alias-button-info-fill,#397ee8);outline-offset:2px}\n.dsh-codex-models input:disabled+span{cursor:default;opacity:.5}\n.dsh-codex-pref-row{align-items:center;border-bottom:0.5px solid var(--dsw-alias-border-l2);display:flex;gap:16px;justify-content:space-between;min-height:58px;padding:10px 0}\n.dsh-codex-pref-row strong,.dsh-codex-check strong{display:block;font-size:13px;font-weight:600;line-height:1.35}\n.dsh-codex-segments{background:var(--dsw-alias-bg-layer-2);border:0.5px solid var(--dsw-alias-border-l2);border-radius:8px;display:inline-flex;flex-wrap:nowrap;gap:3px;padding:3px}\n.dsh-codex-segments label{cursor:pointer;display:block;margin:0}\n.dsh-codex-segments input{position:absolute;opacity:0;pointer-events:none}\n.dsh-codex-segments span,.dsh-codex-segments button{border:0.5px solid transparent;border-radius:6px;color:var(--dsw-alias-label-secondary);display:block;font:inherit;font-size:12px;font-weight:500;line-height:1.2;padding:6px 12px;transition:all .15s ease;user-select:none;white-space:nowrap}\n.dsh-codex-segments button{background:transparent;cursor:pointer}\n.dsh-codex-segments label:hover span,.dsh-codex-segments button:hover:not(:disabled){color:var(--dsw-alias-label-primary)}\n.dsh-codex-segments input:checked+span,.dsh-codex-segments button.active,.dsh-codex-segments button[aria-pressed=true]{background:color-mix(in srgb,var(--dsw-alias-button-info-fill,#397ee8) 22%,var(--dsw-alias-bg-layer-2));border-color:color-mix(in srgb,var(--dsw-alias-button-info-fill,#397ee8) 60%,var(--dsw-alias-border-l2));color:var(--dsw-alias-label-primary);font-weight:600;box-shadow:0 1px 3px rgba(0,0,0,.15)}\n.dsh-codex-segments input:focus-visible+span,.dsh-codex-segments button:focus-visible{outline:2px solid var(--dsw-alias-button-info-fill,#397ee8);outline-offset:2px}\n.dsh-codex-segments input:disabled+span,.dsh-codex-segments button:disabled{cursor:default;opacity:.5}\n.dsh-codex-select,.dsh-codex-capacity-control input{background:var(--dsw-alias-bg-layer-2);border:0.5px solid var(--dsw-alias-border-l2);border-radius:7px;color:var(--dsw-alias-label-primary);font:inherit;font-size:12px;padding:7px 9px}\n.dsh-codex-select{max-width:210px;min-width:150px}\n.dsh-codex-context-settings{border-bottom:0.5px solid var(--dsw-alias-border-l2);display:grid;gap:10px;padding:12px 0}\n.dsh-codex-context-settings>div>strong{font-size:13px;font-weight:600}\n.dsh-codex-context-row{align-items:center;display:flex;font-size:12px;gap:14px;justify-content:space-between}\n.dsh-codex-proxy-control{align-items:center;display:flex;gap:8px;width:100%}\n.dsh-codex-proxy-control input{background:var(--dsw-alias-bg-layer-2);border:0.5px solid var(--dsw-alias-border-l2);border-radius:7px;color:var(--dsw-alias-label-primary);flex:1;font:inherit;font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:12px;min-width:220px;padding:7px 10px;text-align:left}\n.dsh-codex-proxy-status{align-items:center;color:var(--dsw-alias-label-secondary);display:flex;flex-wrap:wrap;font-size:12px;gap:6px;margin:6px 0 0}\n.dsh-codex-proxy-tag{background:color-mix(in srgb,var(--dsw-alias-button-info-fill,#397ee8) 18%,transparent);border:0.5px solid color-mix(in srgb,var(--dsw-alias-button-info-fill,#397ee8) 45%,transparent);border-radius:4px;color:var(--dsw-alias-label-primary);font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:11px;padding:2px 6px}\n.dsh-codex-capacity-control{align-items:center;display:flex;gap:7px}\n.dsh-codex-capacity-control input{font-family:ui-monospace,SFMono-Regular,Consolas,monospace;text-align:right;width:90px}\n.dsh-codex-capacity-control input[type=number]{width:110px}\n.dsh-codex-capacity-control small{color:var(--dsw-alias-label-tertiary);font-size:11px;width:42px}\n.dsh-codex-context-save{background:var(--dsw-alias-bg-layer-2);border:0.5px solid var(--dsw-alias-border-l2);border-radius:7px;color:var(--dsw-alias-label-primary);cursor:pointer;font:inherit;font-size:12px;line-height:1;padding:8px 10px;white-space:nowrap}\n.dsh-codex-context-save:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}\n.dsh-codex-context-save:focus-visible{outline:2px solid var(--dsw-alias-button-info-fill,#397ee8);outline-offset:2px}\n.dsh-codex-context-save:disabled{cursor:default;opacity:.45}\n.dsh-codex-check{align-items:flex-start;border-bottom:0.5px solid var(--dsw-alias-border-l2);cursor:pointer;display:flex;gap:10px;padding:12px 0}\n.dsh-codex-check input{flex:none;margin-top:2px}\n.dsh-codex-check small{color:var(--dsw-alias-label-secondary);display:block;font-size:12px;line-height:1.45;margin-top:2px}\n.dsh-codex-quota-card{background:var(--dsw-alias-bg-layer-2);border:0.5px solid var(--dsw-alias-border-l2);border-radius:8px;margin-top:12px;padding:12px}\n.dsh-codex-quota-title{align-items:center;display:flex;font-size:13px;gap:8px;justify-content:space-between}\n.dsh-codex-quota-title span{color:var(--dsw-alias-label-tertiary);font-size:11px;text-transform:uppercase}\n.dsh-codex-quota-fact{align-items:flex-start;border-bottom:0.5px solid var(--dsw-alias-border-l2);display:flex;font-size:12px;gap:12px;justify-content:space-between;line-height:1.45;padding:10px 0}\n.dsh-codex-quota-fact span{color:var(--dsw-alias-label-secondary);flex:none}\n.dsh-codex-quota-fact strong{font-weight:600;min-width:0;overflow-wrap:anywhere;text-align:right}\n.dsh-codex-reset-credits{align-items:center;border-bottom:0.5px solid var(--dsw-alias-border-l2);display:flex;gap:16px;justify-content:space-between;padding:10px 0}\n.dsh-codex-reset-credits-info{display:grid;font-size:12px;gap:2px;grid-template-columns:auto auto}\n.dsh-codex-reset-credits-info>span{color:var(--dsw-alias-label-secondary)}\n.dsh-codex-reset-credits-info>strong{font-weight:650;text-align:right}\n.dsh-codex-reset-credits-info>small{color:var(--dsw-alias-label-tertiary);font-size:11px;grid-column:1/-1}\n.dsh-codex-meter-wrap{margin-top:13px}\n.dsh-codex-meter-label,.dsh-codex-meter-meta{display:flex;gap:10px;justify-content:space-between}\n.dsh-codex-meter-label{font-size:12px;margin-bottom:6px}\n.dsh-codex-meter-meta{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:1.45;margin-top:6px}\n.dsh-codex-meter{background:var(--dsw-alias-bg-layer-1,rgba(127,127,127,.15));border-radius:999px;corner-shape:round;height:7px;overflow:hidden;width:100%}\n.dsh-codex-meter>span{background:var(--dsw-alias-button-info-fill,#397ee8);border-radius:inherit;display:block;height:100%;max-width:100%;min-width:0;transition:width .25s ease}\n.dsh-codex-meter-warning>span{background:var(--dsw-alias-label-warning,#d58a24)}\n.dsh-codex-meter-danger>span{background:var(--dsw-alias-label-danger,#d94b4b)}\n.dsh-codex-empty{border:0.5px dashed var(--dsw-alias-border-l2);border-radius:7px;color:var(--dsw-alias-label-tertiary);font-size:12px;margin:12px 0 0;padding:16px;text-align:center}\n.dsh-codex-timestamp{color:var(--dsw-alias-label-tertiary);font-size:11px;margin:10px 0 0;text-align:right}\n.dsh-codex-skeleton{display:grid;gap:9px;padding-top:10px}\n.dsh-codex-skeleton span{animation:dsh-codex-pulse 1.4s ease-in-out infinite;background:var(--dsw-alias-bg-layer-2);border-radius:5px;height:42px}\n.dsh-codex-skeleton span:nth-child(2){animation-delay:.12s}.dsh-codex-skeleton span:nth-child(3){animation-delay:.24s}\n.dsh-codex-sr{height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;clip:rect(0 0 0 0);white-space:nowrap}\n.dsh-codex-composer-quota{align-items:center;background:var(--dsw-alias-bg-layer-2);border:0.5px solid var(--dsw-alias-border-l2);border-radius:999px;corner-shape:round;color:var(--dsw-alias-label-secondary);display:inline-flex;font-size:11px;gap:6px;height:28px;line-height:1;max-width:160px;padding:0 9px;white-space:nowrap}\n.dsh-codex-composer-quota strong{color:var(--dsw-alias-label-primary);font-size:11px;font-weight:650}\n.dsh-codex-composer-quota[data-level=warning] strong{color:var(--dsw-alias-label-warning,#d58a24)}\n.dsh-codex-composer-quota[data-level=danger] strong{color:var(--dsw-alias-label-danger,#d94b4b)}\n.dsh-codex-image-tool{border:0.5px solid var(--dsw-alias-border-l2);border-radius:8px;display:flex;flex-direction:column;gap:8px;margin:4px 0 4px 4px;max-width:520px;padding:10px 12px}\n.dsh-codex-image-tool-head{align-items:center;display:flex;font-size:13px;gap:8px;min-width:0}\n.dsh-codex-image-dot{background:var(--dsw-alias-button-info-fill,#397ee8);border-radius:50%;corner-shape:round;display:inline-block;flex:none;height:8px;width:8px}\n.dsh-codex-image-tool[data-state=error] .dsh-codex-image-dot{background:var(--dsw-alias-label-danger,#d94b4b)}\n.dsh-codex-image-title{font-weight:600}\n.dsh-codex-image-summary{color:var(--dsw-alias-label-tertiary);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.dsh-codex-image-grid{display:flex;flex-wrap:wrap;gap:8px}\n.dsh-codex-image-preview{background:var(--dsw-alias-bg-layer-2);border:0.5px solid var(--dsw-alias-border-l2);border-radius:8px;display:block;max-height:260px;max-width:min(100%,360px);object-fit:contain}\n.dsh-codex-image-loading,.dsh-codex-image-failed{border:0.5px dashed var(--dsw-alias-border-l2);border-radius:8px;color:var(--dsw-alias-label-tertiary);display:inline-flex;font-size:12px;line-height:1.4;padding:18px 20px}\n.dsh-codex-image-failed{color:var(--dsw-alias-label-danger,#d94b4b)}\n.dsh-hub-tabs{align-self:flex-start;max-width:100%}\n@keyframes dsh-codex-pulse{0%,100%{opacity:.45}50%{opacity:.85}}\n@media(max-width:560px){.dsh-codex-row,.dsh-codex-pref-row,.dsh-codex-quota-fact,.dsh-codex-reset-credits{align-items:flex-start;flex-direction:column;gap:3px}.dsh-codex-value,.dsh-codex-quota-fact strong{text-align:left}.dsh-codex-actions{justify-content:flex-start}.dsh-codex-grouphead{align-items:flex-start;flex-direction:column;gap:0;padding:12px 0}.dsh-codex-meter-meta{align-items:flex-start;flex-direction:column;gap:2px}.dsh-codex-errorbar{align-items:flex-start;flex-direction:column}.dsh-codex-segments{width:100%}.dsh-codex-select{max-width:none;width:100%}.dsh-codex-context-row{align-items:flex-start;flex-direction:column;gap:5px}.dsh-codex-segments label{flex:1}.dsh-codex-segments span{text-align:center}.dsh-codex-image-tool{max-width:100%;margin-left:0}}\n@media(prefers-reduced-motion:reduce){.dsh-codex-meter>span{transition:none}.dsh-codex-skeleton span{animation:none}}\n`\n\nexport function installStyles(): () => void {\n if (document.querySelector(`style[data-plugin-css=\"${STYLE_ID}\"]`) !== null) return () => undefined\n const element = document.createElement('style')\n element.dataset.plugin = '@eddyskywalker/dsh-chatgpt-subscription'\n element.dataset.pluginCss = STYLE_ID\n element.textContent = CSS\n document.head.appendChild(element)\n return () => element.remove()\n}\n","export const STYLE_ID = 'dsh-antigravity-settings-style'\n\nexport function installAntigravityStyles(): void {\n if (typeof document === 'undefined' || document.getElementById(STYLE_ID)) return\n const style = document.createElement('style')\n style.id = STYLE_ID\n style.textContent = `\n.dsha-page{box-sizing:border-box;color:var(--dsw-alias-label-primary);display:flex;flex-direction:column;gap:20px;max-width:780px;min-width:0;padding:2px 0 30px}\n.dsha-page *{box-sizing:border-box}\n.dsha-group{border-top:0.5px solid var(--dsw-alias-border-l2);min-width:0}\n.dsha-group:first-of-type{border-top:0}\n.dsha-grouphead{align-items:center;display:flex;gap:12px;justify-content:space-between;min-height:48px}\n.dsha-grouphead h3{font-size:14px;font-weight:650;margin:0;color:var(--dsw-alias-label-primary)}\n.dsha-row{align-items:center;border-bottom:0.5px solid var(--dsw-alias-border-l2);display:flex;gap:20px;justify-content:space-between;min-height:44px;padding:8px 0}\n.dsha-label{color:var(--dsw-alias-label-secondary);font-size:13px;flex:0 0 auto}\n.dsha-value{font-size:13px;min-width:0;overflow-wrap:anywhere;text-align:right;color:var(--dsw-alias-label-primary)}\n.dsha-actions{display:flex;flex-wrap:wrap;gap:8px;justify-content:flex-end;padding-top:12px}\n.dsha-btn{background:var(--dsw-alias-bg-layer-2);border:0.5px solid var(--dsw-alias-border-l2);border-radius:999px;corner-shape:round;color:var(--dsw-alias-label-primary);cursor:pointer;font:inherit;font-size:13px;line-height:1;padding:8px 13px;white-space:nowrap}\n.dsha-btn:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}\n.dsha-btn:disabled{cursor:default;opacity:.5}\n.dsha-btn-primary{background:var(--dsw-alias-button-info-fill,#397ee8);border-color:transparent;color:var(--dsw-alias-button-info-label,#fff)}\n.dsha-btn-primary:hover:not(:disabled){opacity:.9}\n.dsha-notice{background:var(--dsw-alias-bg-layer-2);border:0.5px solid var(--dsw-alias-border-l2);border-radius:7px;color:var(--dsw-alias-label-secondary);font-size:12px;line-height:1.55;margin:12px 0 0;padding:10px 12px}\n.dsha-muted{color:var(--dsw-alias-label-secondary);font-size:13px;line-height:1.55;margin:0}\n.dsha-models-hint{padding-top:10px}\n.dsha-models{display:flex;flex-wrap:wrap;gap:7px;padding-top:8px}\n.dsha-models label{cursor:pointer;display:block;position:relative}\n.dsha-models input{position:absolute;opacity:0;pointer-events:none}\n.dsha-models span{background:var(--dsw-alias-bg-layer-2);border:0.5px solid var(--dsw-alias-border-l2);border-radius:6px;color:var(--dsw-alias-label-secondary);display:block;font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:11px;padding:5px 8px;transition:all .15s ease}\n.dsha-models input:checked+span{background:color-mix(in srgb,var(--dsw-alias-button-info-fill,#397ee8) 14%,var(--dsw-alias-bg-layer-2));border-color:color-mix(in srgb,var(--dsw-alias-button-info-fill,#397ee8) 55%,var(--dsw-alias-border-l2));color:var(--dsw-alias-label-primary);font-weight:600}\n.dsha-models input:disabled+span{cursor:default;opacity:.5}\n.dsha-pref-row{align-items:center;border-bottom:0.5px solid var(--dsw-alias-border-l2);display:flex;gap:16px;justify-content:space-between;min-height:58px;padding:10px 0}\n.dsha-pref-row strong{display:block;font-size:13px;font-weight:600;line-height:1.35;color:var(--dsw-alias-label-primary)}\n.dsha-select{background:var(--dsw-alias-bg-layer-2);border:0.5px solid var(--dsw-alias-border-l2);border-radius:7px;color:var(--dsw-alias-label-primary);font:inherit;font-size:12px;padding:7px 9px;max-width:220px;min-width:160px}\n.dsha-context-settings{border-bottom:0.5px solid var(--dsw-alias-border-l2);display:grid;gap:10px;padding:12px 0}\n.dsha-context-settings>div>strong{font-size:13px;font-weight:600;color:var(--dsw-alias-label-primary)}\n.dsha-context-row{align-items:center;display:flex;font-size:12px;gap:14px;justify-content:space-between}\n.dsha-capacity-control{align-items:center;display:flex;gap:7px}\n.dsha-capacity-control input{background:var(--dsw-alias-bg-layer-2);border:0.5px solid var(--dsw-alias-border-l2);border-radius:7px;color:var(--dsw-alias-label-primary);font:inherit;font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:12px;padding:7px 9px;text-align:right;width:90px}\n.dsha-capacity-control small{color:var(--dsw-alias-label-tertiary);font-size:11px;width:42px}\n.dsha-context-save{background:var(--dsw-alias-bg-layer-2);border:0.5px solid var(--dsw-alias-border-l2);border-radius:7px;color:var(--dsw-alias-label-primary);cursor:pointer;font:inherit;font-size:12px;line-height:1;padding:8px 10px;white-space:nowrap}\n.dsha-context-save:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}\n.dsha-context-save:disabled{cursor:default;opacity:.45}\n.dsha-quota-card{background:var(--dsw-alias-bg-layer-2);border:0.5px solid var(--dsw-alias-border-l2);border-radius:8px;margin-top:12px;padding:12px}\n.dsha-quota-title{align-items:center;display:flex;font-size:13px;gap:8px;justify-content:space-between;color:var(--dsw-alias-label-primary);font-weight:650}\n.dsha-quota-title span{color:var(--dsw-alias-label-tertiary);font-size:11px;text-transform:uppercase}\n.dsha-meter-wrap{margin-top:13px}\n.dsha-meter-label,.dsha-meter-meta{display:flex;gap:10px;justify-content:space-between}\n.dsha-meter-label{font-size:12px;margin-bottom:6px;color:var(--dsw-alias-label-primary)}\n.dsha-meter-meta{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:1.45;margin-top:6px}\n.dsha-meter{background:var(--dsw-alias-bg-layer-1,rgba(127,127,127,.15));border-radius:999px;corner-shape:round;height:7px;overflow:hidden;width:100%}\n.dsha-meter>span{background:var(--dsw-alias-button-info-fill,#397ee8);border-radius:inherit;display:block;height:100%;max-width:100%;min-width:0;transition:width .25s ease}\n.dsha-meter-green>span{background:var(--dsw-alias-label-success,#10b981)}\n.dsha-meter-cyan>span{background:#06b6d4}\n.dsha-timestamp{color:var(--dsw-alias-label-tertiary);font-size:11px;margin:10px 0 0;text-align:right}\n.dsha-mini-btn{border:0;background:transparent;color:var(--dsw-alias-label-link,#397ee8);font-size:12px;line-height:18px;cursor:pointer;padding:0;margin-left:8px}\n.dsha-mini-btn:hover{text-decoration:underline}\n.dsha-empty{border:0.5px dashed var(--dsw-alias-border-l2);border-radius:7px;color:var(--dsw-alias-label-tertiary);font-size:12px;margin:12px 0 0;padding:16px;text-align:center}\n.dsha-error{color:var(--dsw-alias-label-danger,#d94b4b);font-size:12px;margin:8px 0 0}\n.dsha-composer-quota{align-items:center;background:var(--dsw-alias-bg-layer-2);border:0.5px solid var(--dsw-alias-border-l2);border-radius:999px;corner-shape:round;color:var(--dsw-alias-label-secondary);cursor:pointer;display:inline-flex;font-size:11px;gap:6px;height:28px;line-height:1;max-width:160px;padding:0 9px;white-space:nowrap;user-select:none;transition:all .15s ease}\n.dsha-composer-quota:hover{background:var(--dsw-alias-interactive-bg-hover);border-color:var(--dsw-alias-border-l1,var(--dsw-alias-border-l2))}\n.dsha-composer-quota strong{color:var(--dsw-alias-label-primary);font-size:11px;font-weight:650}\n.dsha-composer-quota[data-level=warning] strong{color:var(--dsw-alias-label-warning,#d58a24)}\n.dsha-composer-quota[data-level=danger] strong{color:var(--dsw-alias-label-danger,#d94b4b)}\n`\n document.head.append(style)\n}\n","import { useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react'\nimport type { SnapshotStore } from '@deepseek-ai/dsh-client-runtime/client'\nimport type { ModelDirectoryState } from '@deepseek-ai/dsh-client-ui-model-selection/client'\nimport type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { AntigravityQuotaGroup, AntigravityModelBucket, AntigravityWebStatus } from '../../shared/antigravity-contracts.ts'\nimport { NS_ANTIGRAVITY } from './locales.ts'\n\nconst API = '/antigravity/api'\n\nasync function fetchApi<T>(path: string, options?: RequestInit): Promise<T> {\n const res = await fetch(`${API}${path}`, {\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers,\n },\n })\n const json = (await res.json()) as { ok: boolean; value?: T; error?: string }\n if (!res.ok || !json.ok) {\n throw new Error(json.error || `HTTP ${res.status}`)\n }\n return json.value as T\n}\n\ntype Props = PropsRuntime<'conversation.input.right'> &\n PropsLocale<typeof NS_ANTIGRAVITY> & {\n directory: SnapshotStore<ModelDirectoryState>\n loadModelDirectory: () => void\n }\n\nfunction selectQuotaBucketForModel(groups: AntigravityQuotaGroup[], modelId?: string) {\n if (!groups || groups.length === 0) return null\n const isClaudeOrGpt = modelId ? /claude|gpt/i.test(modelId) : false\n const targetGroup =\n groups.find((g) => {\n const match = /claude|gpt|3p/i.test(g.displayName)\n return isClaudeOrGpt ? match : !match\n }) || groups[0]\n\n if (!targetGroup || !targetGroup.buckets || targetGroup.buckets.length === 0) return null\n const shortBucket: AntigravityModelBucket =\n targetGroup.buckets.find((b: AntigravityModelBucket) => /5\\s*小时|hour|5h/i.test(b.displayName)) || targetGroup.buckets[0]\n\n return {\n groupName: targetGroup.displayName,\n bucketName: shortBucket.displayName,\n remainingPercent: Math.round(shortBucket.remainingFraction * 100),\n resetTime: shortBucket.resetTime,\n }\n}\n\nfunction formatResetCountdown(resetTime?: string): string {\n if (!resetTime) return ''\n try {\n const diff = new Date(resetTime).getTime() - Date.now()\n if (diff <= 0) return '即将重置'\n const h = Math.floor(diff / 3600000)\n const m = Math.floor((diff % 3600000) / 60000)\n if (h > 0) return `${h}小时${m}分后重置`\n return `${m}分钟后重置`\n } catch {\n return ''\n }\n}\n\nexport function AntigravityComposerQuota({ directory, loadModelDirectory }: Props): React.JSX.Element | null {\n const modelState = useStore(directory)\n const [status, setStatus] = useState<AntigravityWebStatus | null>(null)\n const [loading, setLoading] = useState(false)\n const mountedRef = useRef(false)\n const selected = modelState.current\n const isAntigravity = selected?.provider === 'antigravity'\n\n useEffect(() => {\n loadModelDirectory()\n }, [loadModelDirectory])\n\n useEffect(() => {\n mountedRef.current = true\n return () => {\n mountedRef.current = false\n }\n }, [])\n\n const fetchStatus = useCallback(async (refresh = false) => {\n if (!mountedRef.current) return\n setLoading(true)\n try {\n const data = refresh\n ? await fetchApi<AntigravityWebStatus>('/quota', { method: 'POST' })\n : await fetchApi<AntigravityWebStatus>('/status')\n // The host refreshes a stale quota cache while serving /status; a second\n // client-side POST /quota here would double every upstream fetch.\n if (mountedRef.current) setStatus(data)\n } catch {\n // best-effort\n } finally {\n if (mountedRef.current) setLoading(false)\n }\n }, [])\n\n useEffect(() => {\n if (!isAntigravity) return\n void fetchStatus(false)\n const timer = window.setInterval(() => {\n if (document.visibilityState === 'visible') void fetchStatus(false)\n }, 60_000)\n return () => {\n window.clearInterval(timer)\n }\n }, [fetchStatus, isAntigravity])\n\n const quotaInfo = useMemo(() => {\n const groups = status?.quota?.groups || []\n return selectQuotaBucketForModel(groups, selected?.model)\n }, [status?.quota?.groups, selected?.model])\n\n if (!isAntigravity || !status?.authenticated) return null\n\n const level =\n quotaInfo === null\n ? 'normal'\n : quotaInfo.remainingPercent <= 5\n ? 'danger'\n : quotaInfo.remainingPercent <= 20\n ? 'warning'\n : 'normal'\n\n const countdown = quotaInfo?.resetTime ? formatResetCountdown(quotaInfo.resetTime) : ''\n const tooltip = quotaInfo\n ? `[Antigravity] ${quotaInfo.groupName} - ${quotaInfo.bucketName}: 剩余 ${quotaInfo.remainingPercent}%${countdown ? ' (' + countdown + ')' : ''},点击刷新`\n : '点击刷新 Antigravity 配额'\n\n return (\n <span\n className=\"dsha-composer-quota\"\n data-level={level}\n title={tooltip}\n aria-label={tooltip}\n onClick={() => void fetchStatus(true)}\n >\n <span className=\"dsha-composer-quota-label\">额度</span>\n <strong className=\"dsha-composer-quota-val\">\n {loading ? '…' : quotaInfo === null ? '—' : `${quotaInfo.remainingPercent}%`}\n </strong>\n </span>\n )\n}\n\nfunction useStore<T>(store: SnapshotStore<T>): T {\n return useSyncExternalStore(\n (listener) => store.subscribe(listener),\n () => store.getSnapshot(),\n () => store.getSnapshot(),\n )\n}","import { useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react'\nimport type { SnapshotStore } from '@deepseek-ai/dsh-client-runtime/client'\nimport type { ModelDirectoryState } from '@deepseek-ai/dsh-client-ui-model-selection/client'\nimport type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { CommandCodeWebStatus } from '../../shared/command-code-contracts.ts'\nimport { NS_COMMAND_CODE } from './locales.ts'\n\nconst API = '/command-code/api'\n\nasync function fetchApi<T>(path: string, options?: RequestInit): Promise<T> {\n const res = await fetch(`${API}${path}`, {\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers,\n },\n })\n const json = (await res.json()) as { ok: boolean; value?: T; error?: string }\n if (!res.ok || !json.ok) {\n throw new Error(json.error || `HTTP ${res.status}`)\n }\n return json.value as T\n}\n\ntype Props = PropsRuntime<'conversation.input.right'> &\n PropsLocale<typeof NS_COMMAND_CODE> & {\n directory: SnapshotStore<ModelDirectoryState>\n loadModelDirectory: () => void\n }\n\ninterface BadgeFacts {\n text: string\n tooltip: string\n level: 'normal' | 'warning' | 'danger'\n}\n\n/**\n * Pick the most meaningful number for the badge.\n *\n * A bounded usage window is the number a user actually spends down, so it wins\n * over a credit balance; the balance shows only when no window is reported.\n */\nexport function selectBadgeFacts(status: CommandCodeWebStatus | null): BadgeFacts | null {\n const quota = status?.quota\n if (quota === null || quota === undefined) {\n return { text: '—', tooltip: 'Command Code quota unavailable — click to refresh', level: 'normal' }\n }\n\n const window = [...(quota.windows ?? [])].sort((a, b) => (a.windowDurationMins ?? Infinity) - (b.windowDurationMins ?? Infinity))[0]\n if (window !== undefined) {\n const remaining = Math.max(0, 100 - window.usedPercent)\n return {\n text: `${remaining}%`,\n tooltip: `[Command Code] ${window.label}: ${remaining}% left`,\n level: remaining <= 5 ? 'danger' : remaining <= 20 ? 'warning' : 'normal',\n }\n }\n\n const meter = (quota.meters ?? []).find((candidate) => candidate.remainingFraction !== null)\n if (meter !== undefined && meter.remainingFraction !== null) {\n const remaining = Math.round(meter.remainingFraction * 100)\n return {\n text: `${remaining}%`,\n tooltip: `[Command Code] ${meter.label}: ${remaining}% left`,\n level: remaining <= 5 ? 'danger' : remaining <= 20 ? 'warning' : 'normal',\n }\n }\n\n if (quota.unlimited) {\n return { text: '∞', tooltip: '[Command Code] Unlimited plan allowance', level: 'normal' }\n }\n if (quota.creditBalance !== null) {\n return { text: quota.creditBalance, tooltip: `[Command Code] Remaining credits: ${quota.creditBalance}`, level: 'normal' }\n }\n return { text: '—', tooltip: 'Command Code quota unavailable — click to refresh', level: 'normal' }\n}\n\nexport function CommandCodeComposerQuota({ directory, loadModelDirectory }: Props): React.JSX.Element | null {\n const modelState = useStore(directory)\n const [status, setStatus] = useState<CommandCodeWebStatus | null>(null)\n const [loading, setLoading] = useState(false)\n const mountedRef = useRef(false)\n const selected = modelState.current\n const isCommandCode = selected?.provider === 'command-code'\n\n useEffect(() => {\n loadModelDirectory()\n }, [loadModelDirectory])\n\n useEffect(() => {\n mountedRef.current = true\n return () => {\n mountedRef.current = false\n }\n }, [])\n\n const fetchStatus = useCallback(async (refresh = false) => {\n if (!mountedRef.current) return\n setLoading(true)\n try {\n // The host refreshes a stale quota cache while serving /status; only an\n // explicit click asks for the forced refresh, so a poll never doubles the\n // upstream request count.\n const data = refresh\n ? await fetchApi<CommandCodeWebStatus>('/quota', { method: 'POST' })\n : await fetchApi<CommandCodeWebStatus>('/status')\n if (mountedRef.current) setStatus(data)\n } catch {\n // best-effort: the settings card reports the actionable error\n } finally {\n if (mountedRef.current) setLoading(false)\n }\n }, [])\n\n useEffect(() => {\n if (!isCommandCode) return\n void fetchStatus(false)\n const timer = window.setInterval(() => {\n if (document.visibilityState === 'visible') void fetchStatus(false)\n }, 60_000)\n return () => {\n window.clearInterval(timer)\n }\n }, [fetchStatus, isCommandCode])\n\n const facts = useMemo(() => selectBadgeFacts(status), [status])\n\n if (!isCommandCode || !status?.authenticated || facts === null) return null\n\n return (\n <span\n className=\"dsha-composer-quota\"\n data-level={facts.level}\n title={facts.tooltip}\n aria-label={facts.tooltip}\n onClick={() => void fetchStatus(true)}\n >\n <span className=\"dsha-composer-quota-label\">额度</span>\n <strong className=\"dsha-composer-quota-val\">{loading ? '…' : facts.text}</strong>\n </span>\n )\n}\n\nfunction useStore<T>(store: SnapshotStore<T>): T {\n return useSyncExternalStore(\n (listener) => store.subscribe(listener),\n () => store.getSnapshot(),\n () => store.getSnapshot(),\n )\n}\n","import { useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react'\nimport type { SnapshotStore } from '@deepseek-ai/dsh-client-runtime/client'\nimport type { ModelDirectoryState } from '@deepseek-ai/dsh-client-ui-model-selection/client'\nimport type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { KimiCodeWebStatus } from '../../shared/kimi-code-contracts.ts'\nimport { NS_KIMI_CODE } from './locales.ts'\n\nconst API = '/kimi-code/api'\n\nasync function fetchApi<T>(path: string, options?: RequestInit): Promise<T> {\n const res = await fetch(`${API}${path}`, {\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers,\n },\n })\n const json = (await res.json()) as { ok: boolean; value?: T; error?: string }\n if (!res.ok || !json.ok) {\n throw new Error(json.error || `HTTP ${res.status}`)\n }\n return json.value as T\n}\n\ntype Props = PropsRuntime<'conversation.input.right'> &\n PropsLocale<typeof NS_KIMI_CODE> & {\n directory: SnapshotStore<ModelDirectoryState>\n loadModelDirectory: () => void\n }\n\ninterface BadgeFacts {\n text: string\n tooltip: string\n level: 'normal' | 'warning' | 'danger'\n}\n\n/**\n * Pick the most meaningful number for the badge.\n *\n * The shortest window is the one a user spends down first and the one that\n * blocks work soonest, so it wins over the longer pools; the 7-day allowance\n * shows only when no 5-hour window is reported.\n */\nexport function selectBadgeFacts(status: KimiCodeWebStatus | null): BadgeFacts | null {\n const quota = status?.quota\n if (quota === null || quota === undefined) {\n return { text: '—', tooltip: '[Kimi Code] quota unavailable — click to refresh', level: 'normal' }\n }\n\n const window = [...(quota.windows ?? [])]\n .filter((candidate) => candidate.windowDurationMins !== null)\n .sort((a, b) => (a.windowDurationMins ?? Infinity) - (b.windowDurationMins ?? Infinity))[0]\n ?? quota.windows[0]\n\n if (window !== undefined) {\n const remaining = Math.max(0, 100 - window.usedPercent)\n return {\n text: `${remaining}%`,\n tooltip: `[Kimi Code] ${window.label}: ${remaining}% left`,\n level: remaining <= 5 ? 'danger' : remaining <= 20 ? 'warning' : 'normal',\n }\n }\n\n const wallet = quota.extraUsage\n if (wallet !== null && wallet !== undefined && wallet.balanceCents !== null) {\n const amount = (wallet.balanceCents / 100).toFixed(2)\n return {\n text: amount,\n tooltip: `[Kimi Code] booster wallet: ${amount} ${wallet.currency ?? ''}`.trim(),\n level: 'normal',\n }\n }\n\n return { text: '—', tooltip: '[Kimi Code] quota unavailable — click to refresh', level: 'normal' }\n}\n\nexport function KimiCodeComposerQuota({ directory, loadModelDirectory }: Props): React.JSX.Element | null {\n const modelState = useStore(directory)\n const [status, setStatus] = useState<KimiCodeWebStatus | null>(null)\n const [loading, setLoading] = useState(false)\n const mountedRef = useRef(false)\n const selected = modelState.current\n const isKimiCode = selected?.provider === 'kimi-code'\n\n useEffect(() => {\n loadModelDirectory()\n }, [loadModelDirectory])\n\n useEffect(() => {\n mountedRef.current = true\n return () => {\n mountedRef.current = false\n }\n }, [])\n\n const fetchStatus = useCallback(async (refresh = false) => {\n if (!mountedRef.current) return\n setLoading(true)\n try {\n // The host refreshes a stale quota cache while serving /status; only an\n // explicit click asks for the forced refresh, so a poll never doubles the\n // upstream request count.\n const data = refresh\n ? await fetchApi<KimiCodeWebStatus>('/quota', { method: 'POST' })\n : await fetchApi<KimiCodeWebStatus>('/status')\n if (mountedRef.current) setStatus(data)\n } catch {\n // best-effort: the settings card reports the actionable error\n } finally {\n if (mountedRef.current) setLoading(false)\n }\n }, [])\n\n useEffect(() => {\n if (!isKimiCode) return\n void fetchStatus(false)\n const timer = window.setInterval(() => {\n if (document.visibilityState === 'visible') void fetchStatus(false)\n }, 60_000)\n return () => {\n window.clearInterval(timer)\n }\n }, [fetchStatus, isKimiCode])\n\n const facts = useMemo(() => selectBadgeFacts(status), [status])\n\n if (!isKimiCode || !status?.authenticated || facts === null) return null\n\n return (\n <span\n className=\"dsha-composer-quota\"\n data-level={facts.level}\n title={facts.tooltip}\n aria-label={facts.tooltip}\n onClick={() => void fetchStatus(true)}\n >\n <span className=\"dsha-composer-quota-label\">额度</span>\n <strong className=\"dsha-composer-quota-val\">{loading ? '…' : facts.text}</strong>\n </span>\n )\n}\n\nfunction useStore<T>(store: SnapshotStore<T>): T {\n return useSyncExternalStore(\n (listener) => store.subscribe(listener),\n () => store.getSnapshot(),\n () => store.getSnapshot(),\n )\n}\n","export const STYLE_ID = 'dsh-kimi-code-settings-style'\n\n/**\n * Node the base control styles come from.\n *\n * The Kimi Code card renders the same controls as the sibling routes, so it\n * reuses one extracted stylesheet verbatim rather than re-declaring a parallel\n * design system that would drift from it.\n */\nconst BASE = `\n.dsha-page{box-sizing:border-box;color:var(--dsw-alias-label-primary);display:flex;flex-direction:column;gap:20px;max-width:780px;min-width:0;padding:2px 0 30px}\n.dsha-page *{box-sizing:border-box}\n.dsha-group{border-top:0.5px solid var(--dsw-alias-border-l2);min-width:0}\n.dsha-group:first-of-type{border-top:0}\n.dsha-grouphead{align-items:center;display:flex;gap:12px;justify-content:space-between;min-height:48px}\n.dsha-grouphead h3{font-size:14px;font-weight:650;margin:0;color:var(--dsw-alias-label-primary)}\n.dsha-row{align-items:center;border-bottom:0.5px solid var(--dsw-alias-border-l2);display:flex;gap:20px;justify-content:space-between;min-height:44px;padding:8px 0}\n.dsha-label{color:var(--dsw-alias-label-secondary);font-size:13px;flex:0 0 auto}\n.dsha-value{font-size:13px;min-width:0;overflow-wrap:anywhere;text-align:right;color:var(--dsw-alias-label-primary)}\n.dsha-actions{display:flex;flex-wrap:wrap;gap:8px;justify-content:flex-end;padding-top:12px}\n.dsha-btn{background:var(--dsw-alias-bg-layer-2);border:0.5px solid var(--dsw-alias-border-l2);border-radius:999px;corner-shape:round;color:var(--dsw-alias-label-primary);cursor:pointer;font:inherit;font-size:13px;line-height:1;padding:8px 13px;white-space:nowrap}\n.dsha-btn:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}\n.dsha-btn:disabled{cursor:default;opacity:.5}\n.dsha-btn-primary{background:var(--dsw-alias-button-info-fill,#397ee8);border-color:transparent;color:var(--dsw-alias-button-info-label,#fff)}\n.dsha-btn-primary:hover:not(:disabled){opacity:.9}\n.dsha-notice{background:var(--dsw-alias-bg-layer-2);border:0.5px solid var(--dsw-alias-border-l2);border-radius:7px;color:var(--dsw-alias-label-secondary);font-size:12px;line-height:1.55;margin:12px 0 0;padding:10px 12px}\n.dsha-muted{color:var(--dsw-alias-label-secondary);font-size:13px;line-height:1.55;margin:0}\n.dsha-models-hint{padding-top:10px}\n.dsha-models{display:flex;flex-wrap:wrap;gap:7px;padding-top:8px}\n.dsha-models label{cursor:pointer;display:block;position:relative}\n.dsha-models input{position:absolute;opacity:0;pointer-events:none}\n.dsha-models span{background:var(--dsw-alias-bg-layer-2);border:0.5px solid var(--dsw-alias-border-l2);border-radius:6px;color:var(--dsw-alias-label-secondary);display:block;font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:11px;padding:5px 8px;transition:all .15s ease}\n.dsha-models input:checked+span{background:color-mix(in srgb,var(--dsw-alias-button-info-fill,#397ee8) 14%,var(--dsw-alias-bg-layer-2));border-color:color-mix(in srgb,var(--dsw-alias-button-info-fill,#397ee8) 55%,var(--dsw-alias-border-l2));color:var(--dsw-alias-label-primary);font-weight:600}\n.dsha-models input:disabled+span{cursor:default;opacity:.5}\n.dsha-pref-row{align-items:center;border-bottom:0.5px solid var(--dsw-alias-border-l2);display:flex;gap:16px;justify-content:space-between;min-height:58px;padding:10px 0}\n.dsha-pref-row strong{display:block;font-size:13px;font-weight:600;line-height:1.35;color:var(--dsw-alias-label-primary)}\n.dsha-select{background:var(--dsw-alias-bg-layer-2);border:0.5px solid var(--dsw-alias-border-l2);border-radius:7px;color:var(--dsw-alias-label-primary);font:inherit;font-size:12px;padding:7px 9px;max-width:220px;min-width:160px}\n.dsha-context-settings{border-bottom:0.5px solid var(--dsw-alias-border-l2);display:grid;gap:10px;padding:12px 0}\n.dsha-context-settings>div>strong{font-size:13px;font-weight:600;color:var(--dsw-alias-label-primary)}\n.dsha-context-row{align-items:center;display:flex;font-size:12px;gap:14px;justify-content:space-between}\n.dsha-capacity-control{align-items:center;display:flex;gap:7px}\n.dsha-capacity-control input{background:var(--dsw-alias-bg-layer-2);border:0.5px solid var(--dsw-alias-border-l2);border-radius:7px;color:var(--dsw-alias-label-primary);font:inherit;font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:12px;padding:7px 9px;text-align:right;width:90px}\n.dsha-capacity-control small{color:var(--dsw-alias-label-tertiary);font-size:11px;width:42px}\n.dsha-context-save{background:var(--dsw-alias-bg-layer-2);border:0.5px solid var(--dsw-alias-border-l2);border-radius:7px;color:var(--dsw-alias-label-primary);cursor:pointer;font:inherit;font-size:12px;line-height:1;padding:8px 10px;white-space:nowrap}\n.dsha-context-save:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}\n.dsha-context-save:disabled{cursor:default;opacity:.45}\n.dsha-quota-card{background:var(--dsw-alias-bg-layer-2);border:0.5px solid var(--dsw-alias-border-l2);border-radius:8px;margin-top:12px;padding:12px}\n.dsha-quota-title{align-items:center;display:flex;font-size:13px;gap:8px;justify-content:space-between;color:var(--dsw-alias-label-primary);font-weight:650}\n.dsha-quota-title span{color:var(--dsw-alias-label-tertiary);font-size:11px;text-transform:uppercase}\n.dsha-meter-wrap{margin-top:13px}\n.dsha-meter-label,.dsha-meter-meta{display:flex;gap:10px;justify-content:space-between}\n.dsha-meter-label{font-size:12px;margin-bottom:6px;color:var(--dsw-alias-label-primary)}\n.dsha-meter-meta{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:1.45;margin-top:6px}\n.dsha-meter{background:var(--dsw-alias-bg-layer-1,rgba(127,127,127,.15));border-radius:999px;corner-shape:round;height:7px;overflow:hidden;width:100%}\n.dsha-meter>span{background:var(--dsw-alias-button-info-fill,#397ee8);border-radius:inherit;display:block;height:100%;max-width:100%;min-width:0;transition:width .25s ease}\n.dsha-meter-green>span{background:var(--dsw-alias-label-success,#10b981)}\n.dsha-meter-cyan>span{background:#06b6d4}\n.dsha-timestamp{color:var(--dsw-alias-label-tertiary);font-size:11px;margin:10px 0 0;text-align:right}\n.dsha-mini-btn{border:0;background:transparent;color:var(--dsw-alias-label-link,#397ee8);font-size:12px;line-height:18px;cursor:pointer;padding:0;margin-left:8px}\n.dsha-mini-btn:hover{text-decoration:underline}\n.dsha-empty{border:0.5px dashed var(--dsw-alias-border-l2);border-radius:7px;color:var(--dsw-alias-label-tertiary);font-size:12px;margin:12px 0 0;padding:16px;text-align:center}\n.dsha-error{color:var(--dsw-alias-label-danger,#d94b4b);font-size:12px;margin:8px 0 0}\n.dsha-composer-quota{align-items:center;background:var(--dsw-alias-bg-layer-2);border:0.5px solid var(--dsw-alias-border-l2);border-radius:999px;corner-shape:round;color:var(--dsw-alias-label-secondary);cursor:pointer;display:inline-flex;font-size:11px;gap:6px;height:28px;line-height:1;max-width:160px;padding:0 9px;white-space:nowrap;user-select:none;transition:all .15s ease}\n.dsha-composer-quota:hover{background:var(--dsw-alias-interactive-bg-hover);border-color:var(--dsw-alias-border-l1,var(--dsw-alias-border-l2))}\n.dsha-composer-quota strong{color:var(--dsw-alias-label-primary);font-size:11px;font-weight:650}\n.dsha-composer-quota[data-level=warning] strong{color:var(--dsw-alias-label-warning,#d58a24)}\n.dsha-composer-quota[data-level=danger] strong{color:var(--dsw-alias-label-danger,#d94b4b)}\n\n.dsha-device-box{background:var(--dsw-alias-bg-layer-2);border:0.5px solid var(--dsw-alias-border-l2);border-radius:8px;display:flex;flex-direction:column;gap:10px;margin-top:12px;padding:12px}\n.dsha-code-row{align-items:center;display:flex;flex-wrap:wrap;gap:10px;justify-content:space-between}\n.dsha-code{background:var(--dsw-alias-bg-layer-1,rgba(127,127,127,.14));border:0.5px solid var(--dsw-alias-border-l2);border-radius:7px;color:var(--dsw-alias-label-primary);font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:16px;font-weight:650;letter-spacing:.14em;padding:8px 12px}\n.dsha-link{color:var(--dsw-alias-label-link,#397ee8);font-size:12px;overflow-wrap:anywhere;text-decoration:none}\n.dsha-link:hover{text-decoration:underline}\n.dsha-model-meta{color:var(--dsw-alias-label-tertiary);font-size:11px;margin-left:5px}\n.dsha-badge{background:var(--dsw-alias-bg-layer-1,rgba(127,127,127,.14));border:0.5px solid var(--dsw-alias-border-l2);border-radius:999px;color:var(--dsw-alias-label-tertiary);font-size:10px;padding:2px 6px}\n.dsha-cap-table{border-bottom:0.5px solid var(--dsw-alias-border-l2);padding:12px 0}\n.dsha-cap-table table{border-collapse:collapse;font-size:11px;width:100%}\n.dsha-cap-table th{color:var(--dsw-alias-label-tertiary);font-size:11px;font-weight:500;padding:0 10px 6px 0;text-align:left;white-space:nowrap}\n.dsha-cap-table th:last-child,.dsha-cap-table td:last-child{padding-right:0}\n.dsha-cap-table td{border-top:0.5px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);padding:8px 10px 8px 0;vertical-align:top}\n.dsha-cap-table td:first-child{color:var(--dsw-alias-label-primary);font-family:ui-monospace,SFMono-Regular,Consolas,monospace;white-space:nowrap}\n.dsha-cap-table td:nth-child(2),.dsha-cap-table td:nth-child(3){white-space:nowrap}\n.dsha-cap-on{color:var(--dsw-alias-label-primary);font-weight:500}\n.dsha-cap-off{color:var(--dsw-alias-label-tertiary)}\n.dsha-cap-notes{line-height:1.5;min-width:200px}\n.dsha-cap-footnote{font-size:11px;line-height:1.55;margin:8px 0 0}\n`\n\n/** Kimi-specific rules layered on top of the shared control styles. */\nexport function installKimiCodeStyles(): void {\n if (typeof document === 'undefined' || document.getElementById(STYLE_ID)) return\n const style = document.createElement('style')\n style.id = STYLE_ID\n style.textContent = BASE\n document.head.appendChild(style)\n}\n","const STRIP_ELEMENTS = new Set([\n 'foreignobject',\n 'script',\n 'img',\n 'iframe',\n 'object',\n 'embed',\n 'video',\n 'audio',\n 'input',\n 'button',\n 'form',\n 'link',\n 'meta',\n 'base',\n])\n\nexport function sanitizeSvg(svg: string): string {\n if (typeof DOMParser === 'undefined' || typeof XMLSerializer === 'undefined') return ''\n let doc: Document\n try {\n doc = new DOMParser().parseFromString(svg, 'image/svg+xml')\n } catch {\n return ''\n }\n if (doc.querySelector('parsererror') !== null) return ''\n if (doc.documentElement === null || doc.documentElement.localName !== 'svg') return ''\n doc.querySelectorAll('*').forEach((node) => {\n if (STRIP_ELEMENTS.has(node.localName.toLowerCase())) {\n node.remove()\n return\n }\n for (const attribute of [...node.attributes]) {\n const name = attribute.name\n const normalized = name.toLowerCase()\n if (normalized.startsWith('@') || normalized.startsWith('on')) {\n node.removeAttribute(name)\n continue\n }\n if (normalized === 'href' || normalized === 'xlink:href') {\n node.removeAttribute(name)\n }\n }\n })\n return new XMLSerializer().serializeToString(doc.documentElement)\n}","export const MERMAID_STYLE_ID = 'dsh-mermaid-renderer-style'\n\nexport function installMermaidStyles(): void {\n if (typeof document === 'undefined' || document.getElementById(MERMAID_STYLE_ID)) return\n const style = document.createElement('style')\n style.id = MERMAID_STYLE_ID\n style.textContent = `\n.dsh-mermaid-wrapper{margin:12px 0;border:1px solid var(--dsw-alias-border-l2,rgba(255,255,255,0.12));border-radius:8px;overflow:hidden;background:var(--dsw-alias-bg-layer-2,#1a1a1a);box-shadow:0 2px 8px rgba(0,0,0,0.15)}\n.dsh-mermaid-header{display:flex;align-items:center;justify-content:space-between;padding:6px 12px;background:var(--dsw-alias-bg-layer-1,rgba(0,0,0,0.25));border-bottom:1px solid var(--dsw-alias-border-l2,rgba(255,255,255,0.08));font-size:12px;color:var(--dsw-alias-label-secondary,#888)}\n.dsh-mermaid-title{font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:11px;text-transform:uppercase;letter-spacing:0.5px;color:var(--dsw-alias-label-tertiary,#aaa);font-weight:600}\n.dsh-mermaid-controls{display:flex;gap:8px;align-items:center}\n.dsh-mermaid-btn{background:transparent;border:1px solid var(--dsw-alias-border-l2,rgba(255,255,255,0.15));border-radius:4px;color:var(--dsw-alias-label-secondary,#ccc);padding:2px 8px;font-size:11px;cursor:pointer;line-height:18px;transition:all .15s}\n.dsh-mermaid-btn:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(255,255,255,0.08));color:var(--dsw-alias-label-primary,#fff);border-color:var(--dsw-alias-border-l1,rgba(255,255,255,0.3))}\n.dsh-mermaid-chart{padding:18px;overflow-x:auto;display:flex;justify-content:center;align-items:center;min-height:100px;background:var(--dsw-alias-bg-layer-2,#181818);cursor:zoom-in}\n.dsh-mermaid-chart svg{max-width:100%;height:auto;display:block;margin:0 auto}\n.dsh-mermaid-source{display:none;margin:0;padding:12px;background:var(--dsw-alias-bg-layer-1,#121212);border-top:1px solid var(--dsw-alias-border-l2,rgba(255,255,255,0.08));font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:12px;line-height:1.5;overflow-x:auto;white-space:pre-wrap;word-break:break-all}\n.dsh-mermaid-source.is-visible{display:block}\n\n/* 全屏缩放预览模态框 */\n.dsh-mermaid-modal-overlay{position:fixed;inset:0;background:rgba(0,0,0,0.8);backdrop-filter:blur(4px);z-index:99999;display:flex;flex-direction:column;justify-content:center;align-items:center}\n.dsh-mermaid-modal-toolbar{position:absolute;top:20px;right:24px;display:flex;gap:8px;background:rgba(20,20,20,0.85);border:1px solid rgba(255,255,255,0.15);border-radius:6px;padding:4px;box-shadow:0 8px 24px rgba(0,0,0,0.5)}\n.dsh-mermaid-modal-btn{background:transparent;border:0;color:#fff;font-size:14px;padding:6px 12px;cursor:pointer;border-radius:4px}\n.dsh-mermaid-modal-btn:hover{background:rgba(255,255,255,0.15)}\n.dsh-mermaid-modal-stage{flex:1;width:100%;height:100%;overflow:auto;display:flex;justify-content:center;align-items:center;padding:40px}\n.dsh-mermaid-modal-stage svg{max-width:90vw;max-height:85vh;height:auto}\n`\n document.head.append(style)\n}","import { sanitizeSvg } from './sanitize.ts'\nimport { installMermaidStyles } from './styles.ts'\n\ninterface MermaidAPI {\n initialize: (config: Record<string, unknown>) => void\n render: (id: string, text: string) => Promise<{ svg: string }>\n}\n\nlet mermaidSeq = 0\nlet mermaidPromise: Promise<MermaidAPI | null> | null = null\nconst processedHosts = new WeakSet<HTMLElement>()\n\nfunction loadMermaid(): Promise<MermaidAPI | null> {\n if (typeof window === 'undefined') return Promise.resolve(null)\n const existing = (window as unknown as { mermaid?: MermaidAPI }).mermaid\n if (existing) return Promise.resolve(existing)\n if (mermaidPromise) return mermaidPromise\n\n mermaidPromise = new Promise((resolve) => {\n const current = (window as unknown as { mermaid?: MermaidAPI }).mermaid\n if (current) {\n resolve(current)\n return\n }\n\n const script = document.createElement('script')\n script.src = '/api/dsh-chatgpt-subscription/mermaid.min.js'\n script.async = true\n script.onload = () => {\n resolve((window as unknown as { mermaid?: MermaidAPI }).mermaid || null)\n }\n script.onerror = () => {\n const cdn = document.createElement('script')\n cdn.src = 'https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.min.js'\n cdn.async = true\n cdn.onload = () => resolve((window as unknown as { mermaid?: MermaidAPI }).mermaid || null)\n cdn.onerror = () => resolve(null)\n document.head.appendChild(cdn)\n }\n document.head.appendChild(script)\n })\n\n return mermaidPromise\n}\n\nfunction isDarkTheme(): boolean {\n if (typeof document === 'undefined') return false\n const root = document.documentElement\n return (\n root.classList.contains('dark') ||\n root.getAttribute('data-theme') === 'dark' ||\n root.getAttribute('data-color-mode') === 'dark' ||\n window.matchMedia('(prefers-color-scheme: dark)').matches\n )\n}\n\nasync function initMermaidConfig(): Promise<MermaidAPI | null> {\n const m = await loadMermaid()\n if (!m) return null\n try {\n m.initialize({\n startOnLoad: false,\n securityLevel: 'strict',\n htmlLabels: false,\n theme: isDarkTheme() ? 'dark' : 'default',\n fontFamily: 'ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica, Arial, sans-serif',\n })\n } catch {\n // best-effort\n }\n return m\n}\n\nfunction openZoomModal(svgHtml: string): void {\n const overlay = document.createElement('div')\n overlay.className = 'dsh-mermaid-modal-overlay'\n\n let scale = 1\n\n overlay.innerHTML = `\n <div class=\"dsh-mermaid-modal-toolbar\">\n <button type=\"button\" class=\"dsh-mermaid-modal-btn\" data-action=\"zoom-out\" title=\"缩小\">− 缩小</button>\n <button type=\"button\" class=\"dsh-mermaid-modal-btn\" data-action=\"zoom-in\" title=\"放大\">+ 放大</button>\n <button type=\"button\" class=\"dsh-mermaid-modal-btn\" data-action=\"reset\" title=\"重置\">⟳ 重置</button>\n <button type=\"button\" class=\"dsh-mermaid-modal-btn\" data-action=\"close\" title=\"关闭\">关闭</button>\n </div>\n <div class=\"dsh-mermaid-modal-stage\">\n <div class=\"dsh-mermaid-zoom-container\">${svgHtml}</div>\n </div>\n `\n\n const stage = overlay.querySelector('.dsh-mermaid-zoom-container') as HTMLElement\n const updateTransform = () => {\n if (stage) stage.style.transform = `scale(${scale})`\n }\n\n overlay.addEventListener('click', (e) => {\n const target = e.target as HTMLElement\n const action = target?.getAttribute('data-action')\n if (action === 'close' || target === overlay) {\n overlay.remove()\n document.removeEventListener('keydown', onKeyDown)\n } else if (action === 'zoom-in') {\n scale = Math.min(5, scale * 1.25)\n updateTransform()\n } else if (action === 'zoom-out') {\n scale = Math.max(0.2, scale / 1.25)\n updateTransform()\n } else if (action === 'reset') {\n scale = 1\n updateTransform()\n }\n })\n\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n overlay.remove()\n document.removeEventListener('keydown', onKeyDown)\n }\n }\n document.addEventListener('keydown', onKeyDown)\n\n document.body.appendChild(overlay)\n}\n\nfunction findMermaidCandidate(codeEl: HTMLElement): { host: HTMLElement; code: string } | null {\n // 1. 绝对忽略我们自己渲染容器内的任何子元素\n if (codeEl.closest('.dsh-mermaid-wrapper')) return null\n\n // 2. 找到唯一的代码块宿主容器(优先 .md-code-block,其次 pre,最后自身)\n const host = (codeEl.closest('.md-code-block') as HTMLElement) || codeEl.closest('pre') || codeEl\n if (processedHosts.has(host) || host.getAttribute('data-dsh-mermaid-status')) return null\n if (host.previousElementSibling?.classList.contains('dsh-mermaid-wrapper')) return null\n\n const codeText = (codeEl.textContent || '').trim()\n if (!codeText || codeText.length < 5) return null\n\n // 3. 判断是否为 mermaid 语法或标记\n const hasMermaidClass = [...codeEl.classList].some((c) => c.toLowerCase().includes('mermaid'))\n const topText = host.firstElementChild?.textContent?.trim().toLowerCase()\n const isHeaderMermaid = topText === 'mermaid' || topText?.startsWith('mermaid ')\n\n const isGrammarStart = /^(flowchart|graph|sequenceDiagram|classDiagram|stateDiagram|erDiagram|gantt|pie|gitGraph|mindmap|timeline)\\b/i.test(codeText)\n\n if (hasMermaidClass || isHeaderMermaid || isGrammarStart) {\n return { host, code: codeText }\n }\n\n return null\n}\n\nasync function renderMermaidHost(host: HTMLElement, code: string): Promise<void> {\n // 同步立即锁死该宿主,杜绝并发与重入\n processedHosts.add(host)\n host.setAttribute('data-dsh-mermaid-status', 'processing')\n\n const m = await initMermaidConfig()\n if (!m) {\n processedHosts.delete(host)\n host.removeAttribute('data-dsh-mermaid-status')\n return\n }\n\n const renderId = `dsh-mermaid-${++mermaidSeq}`\n\n try {\n const { svg } = await m.render(renderId, code)\n const cleanSvg = sanitizeSvg(svg)\n if (!cleanSvg) {\n processedHosts.delete(host)\n host.removeAttribute('data-dsh-mermaid-status')\n return\n }\n\n // 再次双重检查:防止在异步等待期间被其他流程插入\n if (host.previousElementSibling?.classList.contains('dsh-mermaid-wrapper')) {\n host.setAttribute('data-dsh-mermaid-status', 'done')\n host.style.display = 'none'\n return\n }\n\n const wrapper = document.createElement('div')\n wrapper.className = 'dsh-mermaid-wrapper'\n\n let showSource = false\n\n wrapper.innerHTML = `\n <div class=\"dsh-mermaid-header\">\n <span class=\"dsh-mermaid-title\">Mermaid 图表</span>\n <div class=\"dsh-mermaid-controls\">\n <button type=\"button\" class=\"dsh-mermaid-btn\" data-btn=\"toggle-source\">源码</button>\n <button type=\"button\" class=\"dsh-mermaid-btn\" data-btn=\"copy\">复制</button>\n <button type=\"button\" class=\"dsh-mermaid-btn\" data-btn=\"zoom\" title=\"放大查看\">放大 ↗</button>\n </div>\n </div>\n <div class=\"dsh-mermaid-chart\" title=\"点击放大\">${cleanSvg}</div>\n <div class=\"dsh-mermaid-source\"><code>${code.replace(/</g, '<').replace(/>/g, '>')}</code></div>\n `\n\n const sourceEl = wrapper.querySelector('.dsh-mermaid-source') as HTMLElement\n const toggleBtn = wrapper.querySelector('[data-btn=\"toggle-source\"]') as HTMLButtonElement\n const copyBtn = wrapper.querySelector('[data-btn=\"copy\"]') as HTMLButtonElement\n const chartEl = wrapper.querySelector('.dsh-mermaid-chart') as HTMLElement\n\n toggleBtn?.addEventListener('click', (e) => {\n e.stopPropagation()\n showSource = !showSource\n if (showSource) {\n sourceEl.classList.add('is-visible')\n toggleBtn.textContent = '图表'\n } else {\n sourceEl.classList.remove('is-visible')\n toggleBtn.textContent = '源码'\n }\n })\n\n copyBtn?.addEventListener('click', async (e) => {\n e.stopPropagation()\n try {\n await navigator.clipboard.writeText(code)\n copyBtn.textContent = '已复制'\n setTimeout(() => {\n copyBtn.textContent = '复制'\n }, 1500)\n } catch {\n // fallback\n }\n })\n\n const handleZoom = (e: Event) => {\n e.stopPropagation()\n openZoomModal(cleanSvg)\n }\n\n wrapper.querySelector('[data-btn=\"zoom\"]')?.addEventListener('click', handleZoom)\n chartEl?.addEventListener('click', handleZoom)\n\n // 隐藏宿主并插入图表\n host.style.display = 'none'\n host.parentNode?.insertBefore(wrapper, host)\n host.setAttribute('data-dsh-mermaid-status', 'done')\n } catch {\n // 语法错误或流式未完成时释放锁,允许后续更新后重试\n processedHosts.delete(host)\n host.removeAttribute('data-dsh-mermaid-status')\n const errContainer = document.getElementById(renderId)\n if (errContainer) errContainer.remove()\n }\n}\n\nexport function scanAndRenderMermaid(): void {\n if (typeof document === 'undefined') return\n\n // 只以 code 标签为唯一的判定入口,彻底避免 querySelector 多级命中同一代码块\n const codeElements = document.querySelectorAll<HTMLElement>('pre code, .md-code-block code')\n\n for (const codeEl of codeElements) {\n const candidate = findMermaidCandidate(codeEl)\n if (candidate) {\n void renderMermaidHost(candidate.host, candidate.code)\n }\n }\n}\n\nexport function setupMermaidObserver(): () => void {\n if (typeof document === 'undefined') return () => {}\n\n installMermaidStyles()\n\n let timer: number | undefined\n const debouncedScan = () => {\n window.clearTimeout(timer)\n timer = window.setTimeout(() => {\n scanAndRenderMermaid()\n }, 250)\n }\n\n debouncedScan()\n\n const observer = new MutationObserver((mutations) => {\n let shouldScan = false\n for (const m of mutations) {\n // 只要 mutation 是我们自己的 wrapper 产生的变动,直接忽略\n for (const node of m.addedNodes) {\n if (node.nodeType === 1) {\n const el = node as HTMLElement\n if (el.classList?.contains('dsh-mermaid-wrapper') || el.closest?.('.dsh-mermaid-wrapper')) {\n continue\n }\n shouldScan = true\n break\n }\n }\n if (shouldScan) break\n }\n if (shouldScan) debouncedScan()\n })\n\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n })\n\n const themeObserver = new MutationObserver(() => {\n void initMermaidConfig()\n for (const el of document.querySelectorAll<HTMLElement>('[data-dsh-mermaid-status=\"done\"]')) {\n processedHosts.delete(el)\n el.removeAttribute('data-dsh-mermaid-status')\n const prevWrapper = el.previousElementSibling\n if (prevWrapper && prevWrapper.classList.contains('dsh-mermaid-wrapper')) {\n prevWrapper.remove()\n }\n el.style.display = ''\n }\n debouncedScan()\n })\n\n themeObserver.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class', 'data-theme', 'data-color-mode'],\n })\n\n return () => {\n observer.disconnect()\n themeObserver.disconnect()\n window.clearTimeout(timer)\n }\n}","import type { ClientContext } from '@deepseek-ai/dsh-client-runtime/client'\nimport type { ImageAttachmentRef } from '@deepseek-ai/dsh-attachment'\nimport type {} from '@deepseek-ai/dsh-client-ui-settings/client'\nimport type {} from '@deepseek-ai/dsh-client-locale/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-slots'\nimport type {} from '@deepseek-ai/dsh-client-ui-model-selection/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-conversation/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-tool/client'\nimport { CODEX_IMAGE_TOOL_NAME } from '../compat.ts'\nimport { CodexComposerQuota } from './CodexComposerQuota.tsx'\nimport { CodexImageToolView, type ImageLoader } from './CodexImageToolView.tsx'\nimport { ProviderHubSection } from './ProviderHubSection.tsx'\nimport { SubscriptionApi } from './api.ts'\nimport { dictionaries, NS, type LocaleKey } from './locales.ts'\nimport { installStyles } from './styles.ts'\nimport { installAntigravityStyles } from './antigravity/styles.ts'\nimport { dictionaries as antigravityDicts, NS_ANTIGRAVITY } from './antigravity/locales.ts'\nimport { AntigravityComposerQuota } from './antigravity/AntigravityComposerQuota.tsx'\nimport { CommandCodeComposerQuota } from './command-code/CommandCodeComposerQuota.tsx'\nimport { dictionaries as commandCodeDicts, NS_COMMAND_CODE } from './command-code/locales.ts'\nimport { KimiCodeComposerQuota } from './kimi-code/KimiCodeComposerQuota.tsx'\nimport { dictionaries as kimiCodeDicts, NS_KIMI_CODE } from './kimi-code/locales.ts'\nimport { installKimiCodeStyles } from './kimi-code/styles.ts'\nimport { setupMermaidObserver } from './mermaid/renderer.ts'\n\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\n interface LocaleNamespaceMap {\n 'dsh-chatgpt-subscription': LocaleKey\n 'dsh-antigravity': any\n 'dsh-command-code': any\n 'dsh-kimi-code': any\n }\n}\n\nexport const inject = ['slots', 'locale', 'modelDirectories', 'conversation']\n\nexport function apply(ctx: ClientContext): void {\n ctx.effect(() => ctx.locale.register(NS, dictionaries), 'dsh-chatgpt-subscription: dictionaries')\n ctx.effect(() => installStyles(), 'dsh-chatgpt-subscription: styles')\n ctx.effect(() => ctx.locale.register(NS_ANTIGRAVITY, antigravityDicts), 'dsh-antigravity: dictionaries')\n ctx.effect(() => {\n installAntigravityStyles()\n return () => {}\n }, 'dsh-antigravity: styles')\n ctx.effect(() => ctx.locale.register(NS_COMMAND_CODE, commandCodeDicts), 'dsh-command-code: dictionaries')\n ctx.effect(() => ctx.locale.register(NS_KIMI_CODE, kimiCodeDicts), 'dsh-kimi-code: dictionaries')\n ctx.effect(() => {\n installKimiCodeStyles()\n return () => {}\n }, 'dsh-kimi-code: styles')\n ctx.effect(() => setupMermaidObserver(), 'dsh-mermaid: observer')\n\n const t = ctx.locale.bind(NS)\n\n const handleModelDirectoryReload = () => {\n try {\n const conv = ctx.conversation as unknown as { activeSessionId?: string; currentSessionId?: string; activeId?: string }\n const activeSessionId = conv?.activeSessionId || conv?.currentSessionId || conv?.activeId\n if (activeSessionId && ctx.modelDirectories) {\n const dir = ctx.modelDirectories.directoryFor(activeSessionId as any)\n void dir?.load?.().catch?.(() => undefined)\n }\n } catch {\n // best-effort\n }\n }\n\n // One sidebar entry hosts every subscription provider behind tabs instead\n // of registering a separate settings page per provider.\n const ProviderHubSectionWrapper: React.FC<React.ComponentProps<typeof ProviderHubSection>> = (props) => {\n // The hub reuses the refresh callback contract so a model toggle in any\n // provider tab repaints the conversation model picker.\n return <ProviderHubSection {...props} onModelChange={handleModelDirectoryReload} />\n }\n\n ctx.slots.inject('settings.section', () => ctx.slots.register({\n name: 'settings.section',\n id: 'subscription-hub',\n order: 45,\n label: () => t('hubTitle'),\n locale: NS,\n }, ProviderHubSectionWrapper))\n\n ctx.slots.inject('conversation.input.right', () => ctx.slots.register({\n name: 'conversation.input.right',\n id: 'codex-subscription-quota',\n order: 35,\n locale: NS,\n inject: (sessionId) => {\n const directory = ctx.modelDirectories.directoryFor(sessionId)\n return {\n api: new SubscriptionApi(),\n directory: directory.store,\n loadModelDirectory: () => {\n void directory.load().catch(() => undefined)\n },\n }\n },\n }, CodexComposerQuota))\n ctx.slots.inject('conversation.input.right', () => ctx.slots.register({\n name: 'conversation.input.right',\n id: 'antigravity-quota',\n order: 36,\n locale: NS_ANTIGRAVITY,\n inject: (sessionId) => {\n const directory = ctx.modelDirectories.directoryFor(sessionId)\n return {\n directory: directory.store,\n loadModelDirectory: () => {\n void directory.load().catch(() => undefined)\n },\n }\n },\n }, AntigravityComposerQuota))\n ctx.slots.inject('conversation.input.right', () => ctx.slots.register({\n name: 'conversation.input.right',\n id: 'command-code-quota',\n order: 37,\n locale: NS_COMMAND_CODE,\n inject: (sessionId) => {\n const directory = ctx.modelDirectories.directoryFor(sessionId)\n return {\n directory: directory.store,\n loadModelDirectory: () => {\n void directory.load().catch(() => undefined)\n },\n }\n },\n }, CommandCodeComposerQuota))\n ctx.slots.inject('conversation.input.right', () => ctx.slots.register({\n name: 'conversation.input.right',\n id: 'kimi-code-quota',\n order: 38,\n locale: NS_KIMI_CODE,\n inject: (sessionId) => {\n const directory = ctx.modelDirectories.directoryFor(sessionId)\n return {\n directory: directory.store,\n loadModelDirectory: () => {\n void directory.load().catch(() => undefined)\n },\n }\n },\n }, KimiCodeComposerQuota))\n ctx.slots.inject('tool.call.toolview', () => ctx.slots.register({\n name: 'tool.call.toolview',\n key: CODEX_IMAGE_TOOL_NAME,\n locale: NS,\n inject: (sessionId) => ({\n loadImage: imageLoader(ctx, sessionId),\n }),\n }, CodexImageToolView))\n}\n\nfunction imageLoader(ctx: ClientContext, sessionId: string): ImageLoader {\n const conversation = ctx.conversation as unknown as {\n resolveImage(sessionId: string, attachment: ImageAttachmentRef): Promise<string>\n }\n return (attachment) => conversation.resolveImage(sessionId, attachment)\n}\n"],"mappings":"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"}
|