@eddyskywalker/dsh-chatgpt-subscription 0.2.9 → 0.2.11

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/lib/client.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","names":["useStore","formatPercent","parsePositiveCapacity","formatDate","formatCapacity","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":["/**\r\n * Compatibility constants for the ChatGPT-backed Codex flow. The backend and\r\n * OAuth parameters are not a public third-party API contract, so every such\r\n * value is isolated here for review and rollback.\r\n */\r\nexport const CHATGPT_OAUTH_ISSUER = 'https://auth.openai.com' as const\r\nexport const CHATGPT_OAUTH_CLIENT_ID = 'app_EMoamEEZ73f0CkXaXp7hrann' as const\r\nexport const OAUTH_CALLBACK_HOST = 'localhost' as const\r\nexport const OAUTH_CALLBACK_PORT = 1455 as const\r\nexport const OAUTH_CALLBACK_PATH = '/auth/callback' as const\r\nexport const OAUTH_REDIRECT_URI = `http://${OAUTH_CALLBACK_HOST}:${OAUTH_CALLBACK_PORT}${OAUTH_CALLBACK_PATH}` as const\r\nexport const OAUTH_SCOPE = 'openid profile email offline_access' as const\r\nexport const OAUTH_ORIGINATOR = 'opencode' as const\r\nexport const OAUTH_LOGIN_TIMEOUT_MS = 5 * 60_000\r\nexport const TOKEN_REFRESH_MARGIN_MS = 60_000\r\nexport const ROUTE_PREFIX = '/api/dsh-chatgpt-subscription' as const\r\nexport const PLUGIN_VERSION = '0.1.0-alpha.0' as const\r\nexport const CODEX_CHATGPT_PROVIDER_ID = 'codex-chatgpt' as const\r\n\r\nexport const CODEX_API_BASE = 'https://chatgpt.com/backend-api/codex' as const\r\nexport const CODEX_RESPONSES_URL = `${CODEX_API_BASE}/responses` as const\r\nexport const CODEX_IMAGE_GENERATION_URL = `${CODEX_API_BASE}/images/generations` as const\r\nexport const CODEX_SEARCH_URL = `${CODEX_API_BASE}/alpha/search` as const\r\nexport const CODEX_USAGE_URL = 'https://chatgpt.com/backend-api/wham/usage' as const\r\nexport const CODEX_RESET_CREDITS_URL = 'https://chatgpt.com/backend-api/wham/rate-limit-reset-credits' as const\r\nexport const CODEX_RESET_CREDITS_CONSUME_URL = `${CODEX_RESET_CREDITS_URL}/consume` as const\r\nexport const CODEX_ORIGINATOR = 'opencode' as const\r\nexport const CODEX_ENHANCED_ORIGINATOR = 'pi' as const\r\nexport const CODEX_IMAGE_TOOL_NAME = 'codex_image_generate' as const\r\nexport const CODEX_IMAGE_MODEL = 'gpt-image-2' as const\r\nexport const CODEX_SEARCH_PROVIDER_ID = 'codex-subscription' as const\r\nexport const CODEX_FETCH_PROVIDER_ID = 'codex-subscription' as const\r\nexport const QUOTA_CACHE_MS = 60_000\r\nexport const QUOTA_MIN_UPSTREAM_INTERVAL_MS = 15_000\r\n\r\nexport const OAUTH_AUTHORIZE_URL = `${CHATGPT_OAUTH_ISSUER}/oauth/authorize` as const\r\nexport const OAUTH_TOKEN_URL = `${CHATGPT_OAUTH_ISSUER}/oauth/token` as const\r\n","import type { QuotaBucketDto, QuotaStatusDto, QuotaWindowDto } from '../shared/contracts.ts'\r\n\r\nexport interface SelectedQuotaWindow {\r\n bucket: QuotaBucketDto\r\n window: QuotaWindowDto\r\n remainingPercent: number\r\n}\r\n\r\nexport function selectQuotaForModel(quota: QuotaStatusDto | undefined, modelId: string | undefined): SelectedQuotaWindow | null {\r\n if (quota === undefined || quota.buckets.length === 0) return null\r\n const model = modelId?.toLowerCase() ?? ''\r\n const wantsSpark = model.includes('spark')\r\n const bucket = wantsSpark\r\n ? quota.buckets.find(candidate => `${candidate.id} ${candidate.name}`.toLowerCase().includes('spark'))\r\n : quota.buckets.find(candidate => candidate.id === 'codex')\r\n ?? quota.buckets.find(candidate => candidate.name.toLowerCase() === 'codex')\r\n if (bucket === undefined) return null\r\n const windows = quotaWindows(bucket)\r\n if (windows.length === 0) return null\r\n // 优先选取 5h 等短周期额度(按 windowDurationMins 升序排序),没有短周期时选取周额度\r\n const sorted = [...windows].sort((a, b) => {\r\n const durA = a.windowDurationMins ?? Infinity\r\n const durB = b.windowDurationMins ?? Infinity\r\n return durA - durB\r\n })\r\n const window = sorted[0]!\r\n return {\r\n bucket,\r\n window,\r\n remainingPercent: Math.max(0, 100 - window.usedPercent),\r\n }\r\n}\r\n\r\nexport function quotaWindows(bucket: QuotaBucketDto): QuotaWindowDto[] {\r\n if (bucket.windows.length > 0) return bucket.windows\r\n return [bucket.primary, bucket.secondary].filter((window): window is QuotaWindowDto => window !== null)\r\n}\r\n","import { useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react'\r\nimport type { SnapshotStore } from '@deepseek-ai/dsh-client-runtime/client'\r\nimport type { ModelDirectoryState } from '@deepseek-ai/dsh-client-ui-model-selection/client'\r\nimport type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\r\nimport { CODEX_CHATGPT_PROVIDER_ID } from '../compat.ts'\r\nimport type { PluginStatusDto } from '../shared/contracts.ts'\r\nimport { SubscriptionApi } from './api.ts'\r\nimport { NS } from './locales.ts'\r\nimport { selectQuotaForModel } from './quota.ts'\r\n\r\ntype Props = PropsRuntime<'conversation.input.right'> & PropsLocale<typeof NS> & {\r\n api: SubscriptionApi\r\n directory: SnapshotStore<ModelDirectoryState>\r\n loadModelDirectory: () => void\r\n}\r\n\r\nexport function CodexComposerQuota({ api, directory, loadModelDirectory, t }: Props): React.JSX.Element | null {\r\n const modelState = useStore(directory)\r\n const [status, setStatus] = useState<PluginStatusDto | null>(null)\r\n const [loading, setLoading] = useState(false)\r\n const mountedRef = useRef(false)\r\n const selected = modelState.current\r\n const isCodex = selected?.provider === CODEX_CHATGPT_PROVIDER_ID\r\n\r\n useEffect(() => {\r\n loadModelDirectory()\r\n }, [loadModelDirectory])\r\n\r\n useEffect(() => {\r\n mountedRef.current = true\r\n return () => {\r\n mountedRef.current = false\r\n }\r\n }, [])\r\n\r\n useEffect(() => {\r\n if (!isCodex) return\r\n let disposed = false\r\n const refresh = async (): Promise<void> => {\r\n setLoading(true)\r\n try {\r\n const next = await api.status()\r\n if (!disposed && mountedRef.current) setStatus(next)\r\n } catch {\r\n if (!disposed && mountedRef.current) setStatus(null)\r\n } finally {\r\n if (!disposed && mountedRef.current) setLoading(false)\r\n }\r\n }\r\n void refresh()\r\n const timer = window.setInterval(() => {\r\n if (document.visibilityState === 'visible') void refresh()\r\n }, 60_000)\r\n return () => {\r\n disposed = true\r\n window.clearInterval(timer)\r\n }\r\n }, [api, isCodex])\r\n\r\n const quota = useMemo(() => selectQuotaForModel(status?.quota, selected?.model), [selected?.model, status?.quota])\r\n if (!isCodex || status?.preferences.quickQuotaVisible !== true) return null\r\n const level = quota === null\r\n ? 'normal'\r\n : quota.remainingPercent <= 5\r\n ? 'danger'\r\n : quota.remainingPercent <= 20\r\n ? 'warning'\r\n : 'normal'\r\n return <span className=\"dsh-codex-composer-quota\" data-level={level} aria-label={quota === null ? t('quickQuotaLoading') : `${t('quickQuotaLabel')}: ${formatPercent(quota.remainingPercent)}`}>\r\n <span>{t('quickQuotaLabel')}</span>\r\n <strong>{quota === null ? (loading ? t('quickQuotaLoading') : '—') : formatPercent(quota.remainingPercent)}</strong>\r\n </span>\r\n}\r\n\r\nfunction useStore<T>(store: SnapshotStore<T>): T {\r\n return useSyncExternalStore(\r\n (listener) => store.subscribe(listener),\r\n () => store.getSnapshot(),\r\n () => store.getSnapshot(),\r\n )\r\n}\r\n\r\nfunction formatPercent(value: number): string {\r\n return `${new Intl.NumberFormat(undefined, { maximumFractionDigits: 0 }).format(value)}%`\r\n}\r\n","import { useEffect, useState } from 'react'\r\nimport type { ImageAttachmentRef } from '@deepseek-ai/dsh-attachment'\r\nimport type { ContentBlock } from '@deepseek-ai/dsh-client-connection/client'\r\nimport type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\r\nimport { NS } from './locales.ts'\r\n\r\nexport type ImageLoader = (attachment: ImageAttachmentRef) => Promise<string>\r\n\r\ntype Props = PropsRuntime<'tool.call.toolview'> & PropsLocale<typeof NS> & {\r\n loadImage: ImageLoader\r\n}\r\n\r\nexport function CodexImageToolView({ block, loadImage, t }: Props): React.JSX.Element {\r\n const settled = 'kind' in block\r\n const isError = settled ? block.isError : false\r\n const prompt = promptFromBlock(block)\r\n const images = settled && !isError ? imageBlocks(block.content) : []\r\n const label = isError ? t('imageToolFailed') : settled ? t('imageToolDone') : t('imageToolRunning')\r\n const summary = prompt ?? textSummary(settled ? block.content : [])\r\n return <div className=\"dsh-codex-image-tool\" data-state={isError ? 'error' : settled ? 'done' : 'running'}>\r\n <div className=\"dsh-codex-image-tool-head\">\r\n <span className=\"dsh-codex-image-dot\" aria-hidden=\"true\" />\r\n <span className=\"dsh-codex-image-title\">{label}</span>\r\n {summary !== null ? <span className=\"dsh-codex-image-summary\">{summary}</span> : null}\r\n </div>\r\n {images.length > 0 ? <div className=\"dsh-codex-image-grid\">\r\n {images.map((attachment) => <GeneratedImage key={String(attachment.attachmentId)} attachment={attachment} load={loadImage} label={attachment.name ?? t('image')} t={t} />)}\r\n </div> : null}\r\n </div>\r\n}\r\n\r\nfunction GeneratedImage({ attachment, load, label, t }: {\r\n attachment: ImageAttachmentRef\r\n load: ImageLoader\r\n label: string\r\n t: Props['t']\r\n}): React.JSX.Element {\r\n const [src, setSrc] = useState<string | null>(null)\r\n const [failed, setFailed] = useState(false)\r\n useEffect(() => {\r\n let disposed = false\r\n setSrc(null)\r\n setFailed(false)\r\n load(attachment).then((url) => {\r\n if (!disposed) setSrc(url)\r\n }, () => {\r\n if (!disposed) setFailed(true)\r\n })\r\n return () => {\r\n disposed = true\r\n }\r\n }, [attachment, load])\r\n if (failed) return <span className=\"dsh-codex-image-failed\">{t('imageLoadFailed')}</span>\r\n if (src === null) return <span className=\"dsh-codex-image-loading\">{t('imageLoading')}</span>\r\n return <img className=\"dsh-codex-image-preview\" src={src} alt={label} />\r\n}\r\n\r\nfunction promptFromBlock(block: Props['block']): string | null {\r\n const raw = 'kind' in block ? block.call?.argsRaw : block.argsRaw\r\n if (typeof raw !== 'string' || raw.trim() === '') return null\r\n try {\r\n const value = JSON.parse(raw) as unknown\r\n return typeof value === 'object'\r\n && value !== null\r\n && !Array.isArray(value)\r\n && typeof (value as { prompt?: unknown }).prompt === 'string'\r\n ? (value as { prompt: string }).prompt\r\n : null\r\n } catch {\r\n return null\r\n }\r\n}\r\n\r\nfunction imageBlocks(blocks: readonly ContentBlock[]): ImageAttachmentRef[] {\r\n const result: ImageAttachmentRef[] = []\r\n for (const block of blocks) {\r\n if (block.type === 'image') result.push(block.attachment)\r\n if (block.type === 'tool-result') result.push(...imageBlocks(block.content))\r\n }\r\n return result\r\n}\r\n\r\nfunction textSummary(blocks: readonly ContentBlock[]): string | null {\r\n const text = blocks\r\n .map((block) => block.type === 'text' || block.type === 'reasoning' ? block.text : '')\r\n .filter(Boolean)\r\n .join(' ')\r\n .trim()\r\n return text === '' ? null : text\r\n}\r\n","export type CodexModelModality = 'text' | 'image'\r\n\r\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\r\nexport interface CodexModelCatalogEntry {\r\n id: string\r\n name: string\r\n contextWindow: number\r\n inputModalities: readonly CodexModelModality[]\r\n defaultReasoningEffort: string\r\n reasoningProfile: 'standard' | 'gpt-5.6' | 'gpt-6-astra'\n supportsReasoningSummary: boolean\r\n fallbackModelId?: string\r\n}\r\n\r\nexport const CODEX_MODEL_CATALOG = [\r\n {\r\n id: 'gpt-5.6-sol',\r\n name: '5.6 Sol',\r\n contextWindow: 272_000,\r\n inputModalities: ['text', 'image'],\r\n defaultReasoningEffort: 'medium',\r\n reasoningProfile: 'gpt-5.6',\r\n supportsReasoningSummary: true,\r\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 {\r\n id: 'gpt-5.6-terra',\r\n name: '5.6 Terra',\r\n contextWindow: 272_000,\r\n inputModalities: ['text', 'image'],\r\n defaultReasoningEffort: 'medium',\r\n reasoningProfile: 'gpt-5.6',\r\n supportsReasoningSummary: true,\r\n fallbackModelId: 'gpt-5.5',\r\n },\r\n {\r\n id: 'gpt-5.6-luna',\r\n name: '5.6 Luna',\r\n contextWindow: 272_000,\r\n inputModalities: ['text', 'image'],\r\n defaultReasoningEffort: 'medium',\r\n reasoningProfile: 'gpt-5.6',\r\n supportsReasoningSummary: true,\r\n fallbackModelId: 'gpt-5.5',\r\n },\r\n {\r\n id: 'gpt-5.5',\r\n name: '5.5',\r\n contextWindow: 272_000,\r\n inputModalities: ['text', 'image'],\r\n defaultReasoningEffort: 'medium',\r\n reasoningProfile: 'standard',\r\n supportsReasoningSummary: true,\r\n },\r\n {\r\n id: 'gpt-5.4',\r\n name: '5.4',\r\n contextWindow: 272_000,\r\n inputModalities: ['text', 'image'],\r\n defaultReasoningEffort: 'none',\r\n reasoningProfile: 'standard',\r\n supportsReasoningSummary: true,\r\n fallbackModelId: 'gpt-5.4-mini',\r\n },\r\n {\r\n id: 'gpt-5.4-mini',\r\n name: '5.4 Mini',\r\n contextWindow: 272_000,\r\n inputModalities: ['text', 'image'],\r\n defaultReasoningEffort: 'none',\r\n reasoningProfile: 'standard',\r\n supportsReasoningSummary: true,\r\n },\r\n {\r\n id: 'gpt-5.3-codex-spark',\r\n name: '5.3 Codex Spark',\r\n contextWindow: 258_000,\r\n inputModalities: ['text'],\r\n defaultReasoningEffort: 'high',\r\n reasoningProfile: 'standard',\r\n supportsReasoningSummary: false,\r\n },\r\n] as const satisfies readonly CodexModelCatalogEntry[]\r\n\r\nexport type CodexModelId = typeof CODEX_MODEL_CATALOG[number]['id']\r\n\r\nexport const DEFAULT_VISIBLE_CODEX_MODEL_IDS = [\n 'gpt-5.6-sol',\n 'gpt-6-astra',\n 'gpt-5.6-terra',\r\n 'gpt-5.6-luna',\r\n] as const satisfies readonly CodexModelId[]\r\n\r\nexport const DEFAULT_CODEX_MODEL = CODEX_MODEL_CATALOG[0]\r\n\r\nexport const CONFIGURABLE_CONTEXT_MODEL_IDS = [\n 'gpt-6-astra',\n 'gpt-5.6-sol',\r\n 'gpt-5.6-terra',\r\n 'gpt-5.6-luna',\r\n] as const satisfies readonly CodexModelId[]\r\n\r\nexport type ConfigurableContextModelId = typeof CONFIGURABLE_CONTEXT_MODEL_IDS[number]\r\n\r\nexport const STANDARD_REASONING_EFFORTS = ['none', 'low', 'medium', 'high', 'xhigh'] as const\r\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\r\nexport function reasoningEffortsForModel(model: string): readonly CodexReasoningEffort[] {\r\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\r\n : STANDARD_REASONING_EFFORTS\r\n}\r\n\r\nexport function isCodexReasoningEffort(value: unknown): value is CodexReasoningEffort {\r\n return typeof value === 'string' && GPT_56_REASONING_EFFORTS.some((effort) => effort === value)\n}\r\n\r\nexport function modelSupportsReasoningEffort(model: string, effort: unknown): effort is CodexReasoningEffort {\r\n return isCodexReasoningEffort(effort) && reasoningEffortsForModel(model).some((candidate) => candidate === effort)\r\n}\r\n\r\nexport function isCodexModelId(model: unknown): model is CodexModelId {\r\n return typeof model === 'string' && CODEX_MODEL_CATALOG.some((entry) => entry.id === model)\r\n}\r\n\r\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 {\r\n return CODEX_MODEL_CATALOG.find((entry) => entry.id === model) ?? DEFAULT_CODEX_MODEL\r\n}\r\n\r\nexport function codexModelSupportsImageInput(model: string): boolean {\r\n return resolveCodexCatalogEntry(model).inputModalities.includes('image')\r\n}\r\n\r\nexport function codexModelSupportsReasoningSummary(model: string): boolean {\r\n return resolveCodexCatalogEntry(model).supportsReasoningSummary\r\n}\r\n\r\nexport function resolveCodexFallbackModel(model: string): CodexModelCatalogEntry | undefined {\r\n const entry = resolveCodexCatalogEntry(model)\r\n if (!entry.fallbackModelId) return undefined\r\n return CODEX_MODEL_CATALOG.find((cand) => cand.id === entry.fallbackModelId)\r\n}\r\n","import { ROUTE_PREFIX } from '../compat.ts'\r\nimport type {\r\n ApiEnvelope,\r\n LoginEventDto,\r\n LoginStartDto,\r\n PluginStatusDto,\r\n QuotaStatusDto,\r\n ConnectionTestDto,\r\n SubscriptionPreferencesDto,\r\n SubscriptionPreferencesUpdateDto,\r\n} from '../shared/contracts.ts'\r\n\r\nexport class SubscriptionApi {\r\n status(): Promise<PluginStatusDto> {\r\n return request<PluginStatusDto>(`${ROUTE_PREFIX}/status`)\r\n }\r\n\r\n startLogin(): Promise<LoginStartDto> {\r\n return post<LoginStartDto>(`${ROUTE_PREFIX}/login/start`, {})\r\n }\r\n\r\n cancelLogin(loginId: string): Promise<{ cancelled: boolean }> {\r\n return post(`${ROUTE_PREFIX}/login/cancel`, { loginId })\r\n }\r\n\r\n logout(): Promise<{ authenticated: false }> {\r\n return post(`${ROUTE_PREFIX}/logout`, {})\r\n }\r\n\r\n refresh(): Promise<PluginStatusDto> {\r\n return post(`${ROUTE_PREFIX}/token/refresh`, {})\r\n }\r\n\r\n refreshQuota(): Promise<QuotaStatusDto> {\r\n return post(`${ROUTE_PREFIX}/quota/refresh`, {})\r\n }\r\n\r\n useResetCredit(): Promise<QuotaStatusDto> {\r\n return post(`${ROUTE_PREFIX}/quota/reset-credit/use`, {})\r\n }\r\n\r\n testConnection(): Promise<ConnectionTestDto> {\r\n return post(`${ROUTE_PREFIX}/connection/test`, {})\r\n }\r\n\r\n updatePreferences(patch: SubscriptionPreferencesUpdateDto): Promise<SubscriptionPreferencesDto> {\r\n return post(`${ROUTE_PREFIX}/preferences/update`, patch)\r\n }\r\n\r\n events(loginId: string): EventSource {\r\n return new EventSource(`${ROUTE_PREFIX}/login/events?loginId=${encodeURIComponent(loginId)}`)\r\n }\r\n}\r\n\r\nasync function post<T>(url: string, body: object): Promise<T> {\r\n return request<T>(url, {\r\n method: 'POST',\r\n headers: { 'content-type': 'application/json' },\r\n body: JSON.stringify(body),\r\n })\r\n}\r\n\r\nasync function request<T>(url: string, init?: RequestInit): Promise<T> {\r\n const response = await fetch(url, { ...init, credentials: 'same-origin' })\r\n const envelope = await response.json() as ApiEnvelope<T>\r\n if (!response.ok || !envelope.ok) {\r\n throw new Error(envelope.ok ? `Request failed (${response.status})` : envelope.error.message)\r\n }\r\n return envelope.value\r\n}\r\n\r\nexport function parseLoginEvent(event: MessageEvent<string>): LoginEventDto | null {\r\n try {\r\n const value = JSON.parse(event.data) as LoginEventDto\r\n return typeof value === 'object' && value !== null && typeof value.type === 'string' ? value : null\r\n } catch {\r\n return null\r\n }\r\n}\r\n","import { useCallback, useEffect, useRef, useState } from 'react'\r\nimport type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\r\nimport type { CodexReasoningSummary, CredentialStorageDto, PluginStatusDto, QuotaBucketDto, QuotaWindowDto, SearchProviderPreference, SubscriptionPreferencesUpdateDto } from '../shared/contracts.ts'\r\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'\r\nimport { NS } from './locales.ts'\r\nimport { quotaWindows } from './quota.ts'\r\n\r\ntype Props = PropsRuntime<'settings.section'> & PropsLocale<typeof NS>\r\ntype BusyAction = 'login' | 'token' | 'quota' | 'reset-credit' | 'test' | 'logout' | 'preferences' | null\r\ntype Translate = Props['t']\r\n\r\nexport function CodexSubscriptionSection({ t }: Props): React.JSX.Element {\r\n const apiRef = useRef(new SubscriptionApi())\r\n const eventSourceRef = useRef<EventSource | null>(null)\r\n const [status, setStatus] = useState<PluginStatusDto | null>(null)\r\n const [busy, setBusy] = useState<BusyAction>(null)\r\n const [error, setError] = useState<string | null>(null)\r\n const [authUrl, setAuthUrl] = useState<string | null>(null)\r\n const [popupBlocked, setPopupBlocked] = useState(false)\r\n const [resetCreditNotice, setResetCreditNotice] = useState<string | null>(null)\r\n const [connection, setConnection] = useState<{ latencyMs: number; checkedAt: number } | null>(null)\r\n const [contextDrafts, setContextDrafts] = useState<Record<string, string>>({})\r\n const [subagentContextDraft, setSubagentContextDraft] = useState<string | null>(null)\r\n const [customProxyDraft, setCustomProxyDraft] = useState<string | null>(null)\r\n\r\n const load = useCallback(async (quiet = false) => {\r\n if (!quiet) setError(null)\r\n try {\r\n const next = await apiRef.current.status()\r\n setStatus(next)\r\n if (next.error !== undefined) setError(next.error.message)\r\n } catch (cause) {\r\n if (!quiet) setError(messageOf(cause))\r\n }\r\n }, [])\r\n\r\n useEffect(() => {\r\n void load()\r\n const refreshWhenVisible = (): void => {\r\n if (document.visibilityState === 'visible') void load(true)\r\n }\r\n document.addEventListener('visibilitychange', refreshWhenVisible)\r\n const timer = window.setInterval(refreshWhenVisible, 60_000)\r\n return () => {\r\n window.clearInterval(timer)\r\n document.removeEventListener('visibilitychange', refreshWhenVisible)\r\n eventSourceRef.current?.close()\r\n }\r\n }, [load])\r\n\r\n const watchLogin = useCallback((loginId: string) => {\r\n eventSourceRef.current?.close()\r\n const source = apiRef.current.events(loginId)\r\n eventSourceRef.current = source\r\n const finish = async (message?: string): Promise<void> => {\r\n source.close()\r\n eventSourceRef.current = null\r\n setBusy(null)\r\n setAuthUrl(null)\r\n if (message !== undefined) setError(message)\r\n // Preserve the terminal OAuth error while refreshing the account DTO.\r\n await load(true)\r\n }\r\n source.addEventListener('completed', (event) => {\r\n const parsed = parseLoginEvent(event as MessageEvent<string>)\r\n if (parsed?.type === 'completed') void finish()\r\n })\r\n source.addEventListener('cancelled', () => void finish())\r\n source.addEventListener('failed', (event) => {\r\n const parsed = parseLoginEvent(event as MessageEvent<string>)\r\n void finish(parsed?.type === 'failed' ? parsed.error.message : 'ChatGPT sign-in failed.')\r\n })\r\n }, [load])\r\n\r\n useEffect(() => {\r\n const loginId = status?.login.active ? status.login.loginId : null\r\n if (loginId !== null && loginId !== undefined && eventSourceRef.current === null) watchLogin(loginId)\r\n }, [status?.login.active, status?.login.loginId, watchLogin])\r\n\r\n const startLogin = async (): Promise<void> => {\r\n setBusy('login')\r\n setError(null)\r\n setPopupBlocked(false)\r\n const popup = window.open('about:blank', 'dsh-chatgpt-oauth', 'popup,width=560,height=760')\r\n try {\r\n const login = await apiRef.current.startLogin()\r\n setAuthUrl(login.authUrl)\r\n if (popup === null) setPopupBlocked(true)\r\n else popup.location.replace(login.authUrl)\r\n watchLogin(login.loginId)\r\n await load(true)\r\n } catch (cause) {\r\n popup?.close()\r\n setBusy(null)\r\n setError(messageOf(cause))\r\n }\r\n }\r\n\r\n const cancelLogin = async (): Promise<void> => {\r\n const loginId = status?.login.loginId\r\n if (loginId === null || loginId === undefined) return\r\n setBusy('login')\r\n try {\r\n await apiRef.current.cancelLogin(loginId)\r\n eventSourceRef.current?.close()\r\n eventSourceRef.current = null\r\n setAuthUrl(null)\r\n await load()\r\n } catch (cause) {\r\n setError(messageOf(cause))\r\n } finally {\r\n setBusy(null)\r\n }\r\n }\r\n\r\n const refreshToken = async (): Promise<void> => run('token', async () => {\r\n setStatus(await apiRef.current.refresh())\r\n })\r\n\r\n const refreshQuota = async (): Promise<void> => run('quota', async () => {\r\n const quota = await apiRef.current.refreshQuota()\r\n setStatus((current) => current === null ? current : { ...current, quota })\r\n })\r\n\r\n const useResetCredit = async (): Promise<void> => {\r\n if (!window.confirm(t('useResetCreditConfirm'))) return\r\n await run('reset-credit', async () => {\r\n const quota = await apiRef.current.useResetCredit()\r\n setStatus((current) => current === null ? current : { ...current, quota })\r\n setResetCreditNotice(t('resetCreditUsed'))\r\n })\r\n }\r\n\r\n const testConnection = async (): Promise<void> => run('test', async () => {\r\n const result = await apiRef.current.testConnection()\r\n setConnection({ latencyMs: result.latencyMs, checkedAt: result.checkedAt })\r\n })\r\n\r\n const updatePreferences = async (patch: SubscriptionPreferencesUpdateDto): Promise<void> => run('preferences', async () => {\r\n const preferences = await apiRef.current.updatePreferences(patch)\r\n setStatus((current) => current === null ? current : { ...current, preferences })\r\n })\r\n\r\n const selectSearchProvider = (provider: SearchProviderPreference): void => {\r\n setStatus(current => current ? { ...current, preferences: { ...current.preferences, searchProvider: provider } } : current)\r\n void updatePreferences({ searchProvider: provider })\r\n }\r\n\r\n const toggleVisibleModel = async (modelId: string, checked: boolean): Promise<void> => {\r\n const current = status?.preferences.visibleModelIds ?? [...DEFAULT_VISIBLE_CODEX_MODEL_IDS]\r\n const visibleModelIds = checked ? [...current, modelId] : current.filter(id => id !== modelId)\r\n if (visibleModelIds.length === 0) return\r\n await updatePreferences({ visibleModelIds })\r\n }\r\n\r\n const updateContextWindow = async (model: (typeof CONFIGURABLE_CONTEXT_MODEL_IDS)[number]): Promise<void> => {\r\n const current = status?.preferences.contextWindowOverrides[model] ?? resolveCodexCatalogEntry(model).contextWindow\r\n const parsed = parseCapacity(contextDrafts[model] ?? String(current), contextWindowLimitForModel(model))\n if (parsed === null) {\r\n setError(t('contextWindowInvalid'))\r\n return\r\n }\r\n await updatePreferences({ contextWindowOverrides: { [model]: parsed } })\r\n setContextDrafts((drafts) => ({ ...drafts, [model]: String(parsed) }))\r\n }\r\n\r\n const updateSubagentContextWindow = async (): Promise<void> => {\r\n const draft = subagentContextDraft?.trim()\r\n if (draft === undefined || draft === '') {\r\n await updatePreferences({ subagentContextWindow: null })\r\n setSubagentContextDraft(null)\r\n return\r\n }\r\n const parsed = parsePositiveCapacity(draft)\r\n if (parsed === null) {\r\n setError(t('contextWindowInvalid'))\r\n return\r\n }\r\n await updatePreferences({ subagentContextWindow: parsed })\r\n setSubagentContextDraft(null)\r\n }\r\n\r\n const updateCustomProxyUrl = async (): Promise<void> => {\r\n const draft = customProxyDraft?.trim()\r\n await updatePreferences({ customProxyUrl: draft ? draft : null })\r\n setCustomProxyDraft(null)\r\n }\r\n\r\n const logout = async (): Promise<void> => run('logout', async () => {\r\n await apiRef.current.logout()\r\n eventSourceRef.current?.close()\r\n eventSourceRef.current = null\r\n setAuthUrl(null)\r\n setConnection(null)\r\n await load()\r\n })\r\n\r\n const run = async (action: Exclude<BusyAction, null>, task: () => Promise<void>): Promise<void> => {\r\n setBusy(action)\r\n setError(null)\r\n setResetCreditNotice(null)\r\n try {\r\n await task()\r\n } catch (cause) {\r\n setError(messageOf(cause))\r\n } finally {\r\n setBusy(null)\r\n }\r\n }\r\n\r\n const account = status?.account\r\n const preferences = status?.preferences\r\n const quota = status?.quota\r\n const storage = status?.storage\r\n const login = status?.login\r\n const visibleModelIds = preferences?.visibleModelIds ?? DEFAULT_VISIBLE_CODEX_MODEL_IDS\r\n return <section className=\"dsh-codex-page\" aria-labelledby=\"dsh-codex-title\">\r\n <header>\r\n <h2 id=\"dsh-codex-title\" className=\"dsh-codex-title\">{t('title')}</h2>\r\n <p className=\"dsh-codex-intro\">{t('intro')}</p>\r\n </header>\r\n\r\n {error !== null ? <div className=\"dsh-codex-errorbar\" role=\"alert\">\r\n <span>{error}</span>\r\n {status === null ? <Button disabled={busy !== null} onClick={() => load()}>{t('retry')}</Button> : null}\r\n </div> : null}\r\n\r\n {status === null && error === null ? <Skeleton label={t('loading')} /> : <>\r\n <Section title={t('account')}>\r\n <InfoRow label={status?.authenticated ? t('signedIn') : t('signedOut')} value={account?.email ?? '—'} />\r\n {status?.authenticated ? <>\r\n <InfoRow label={t('plan')} value={account?.planType ?? t('unknown')} />\r\n <InfoRow label={t('accountId')} value={account?.accountIdSuffix ?? '—'} />\r\n <InfoRow label={t('expires')} value={formatDate(account?.tokenExpiresAt)} />\r\n </> : null}\r\n <InfoRow label={t('storage')} value={storageLabel(storage, t)} />\r\n <p className=\"dsh-codex-notice\">{storageNotice(storage, t)}</p>\r\n {login?.active ? <p className=\"dsh-codex-muted\" role=\"status\">{t('pending')}</p> : null}\r\n {popupBlocked ? <p className=\"dsh-codex-error\">{t('popupBlocked')}</p> : null}\r\n {authUrl !== null ? <a className=\"dsh-codex-link\" href={authUrl} target=\"_blank\" rel=\"noreferrer\">{t('continueLogin')}</a> : null}\r\n <div className=\"dsh-codex-actions\">\r\n {login?.active\r\n ? <Button disabled={busy !== null} onClick={cancelLogin}>{t('cancel')}</Button>\r\n : <Button primary disabled={busy !== null || storage?.available === false} onClick={startLogin}>{status?.authenticated ? t('signInAgain') : t('signIn')}</Button>}\r\n {status?.authenticated ? <>\r\n <Button disabled={busy !== null} onClick={refreshToken}>{t('refreshToken')}</Button>\r\n <Button disabled={busy !== null} onClick={logout}>{t('signOut')}</Button>\r\n </> : null}\r\n </div>\r\n </Section>\r\n\r\n <Section title={t('connection')}>\r\n <InfoRow label={t('provider')} value=\"Codex(ChatGPT 订阅) · codex-chatgpt\" />\r\n <InfoRow label={t('connectionState')} value={connection === null ? t('untested') : t('connected')} />\r\n {connection !== null ? <InfoRow label={t('latency')} value={`${connection.latencyMs} ms · ${formatDate(connection.checkedAt)}`} /> : null}\r\n <p className=\"dsh-codex-muted dsh-codex-models-hint\">{t('modelsHint')}</p>\r\n <div className=\"dsh-codex-models\" aria-label={t('models')}>\r\n {CODEX_MODEL_CATALOG.map((model) => {\r\n const checked = visibleModelIds.some(id => id === model.id)\r\n const lastVisible = checked && visibleModelIds.length === 1\r\n return <label key={model.id} title={model.id}>\r\n <input type=\"checkbox\" checked={checked} disabled={busy !== null || lastVisible} onChange={(event) => void toggleVisibleModel(model.id, event.currentTarget.checked)} />\r\n <span>{model.name}</span>\r\n </label>\r\n })}\r\n </div>\r\n <div className=\"dsh-codex-actions\">\r\n <Button disabled={!status?.authenticated || busy !== null} onClick={testConnection}>{busy === 'test' ? t('testing') : t('testConnection')}</Button>\r\n </div>\r\n </Section>\r\n\r\n <Section title={t('proxySettings')}>\r\n <div className=\"dsh-codex-pref-row\">\r\n <div>\r\n <strong>{t('proxyMode')}</strong>\r\n <p className=\"dsh-codex-muted\">{t('proxyModeHint')}</p>\r\n </div>\r\n <select\r\n className=\"dsh-codex-select\"\r\n aria-label={t('proxyMode')}\r\n value={preferences?.proxyMode ?? 'auto'}\r\n disabled={busy !== null}\r\n onChange={(event) => {\r\n const mode = event.currentTarget.value as 'auto' | 'custom' | 'direct'\r\n setStatus(current => current ? { ...current, preferences: { ...current.preferences, proxyMode: mode } } : current)\r\n void updatePreferences({ proxyMode: mode })\r\n }}\r\n >\r\n <option value=\"auto\">{t('proxyModeAuto')}</option>\r\n <option value=\"custom\">{t('proxyModeCustom')}</option>\r\n <option value=\"direct\">{t('proxyModeDirect')}</option>\r\n </select>\r\n </div>\r\n\r\n {(preferences?.proxyMode ?? 'auto') === 'auto' ? <div className=\"dsh-codex-proxy-status\">\r\n {status?.detectedProxy ? <>\r\n <span>{t('proxyDetected')}:</span>\r\n <code className=\"dsh-codex-proxy-tag\">{status.detectedProxy}</code>\r\n <span className=\"dsh-codex-success\">{t('proxyDetectedEffective')}</span>\r\n </> : <span className=\"dsh-codex-muted\">{t('proxyNoneDetected')}</span>}\r\n </div> : null}\r\n\r\n {preferences?.proxyMode === 'direct' ? <p className=\"dsh-codex-muted\" style={{ margin: '8px 0 0' }}>{t('proxyDirectHint')}</p> : null}\r\n\r\n {preferences?.proxyMode === 'custom' ? <div className=\"dsh-codex-context-settings\">\r\n <div>\r\n <strong>{t('customProxyUrl')}</strong>\r\n <p className=\"dsh-codex-muted\">{t('customProxyUrlHint')}</p>\r\n </div>\r\n <div className=\"dsh-codex-context-row\">\r\n <span className=\"dsh-codex-proxy-control\">\r\n <input\r\n id=\"dsh-codex-custom-proxy\"\r\n type=\"text\"\r\n placeholder={t('customProxyUrlPlaceholder')}\r\n value={customProxyDraft ?? (preferences?.customProxyUrl ?? '')}\r\n disabled={busy !== null}\r\n aria-label={t('customProxyUrl')}\r\n onChange={(event) => {\r\n setCustomProxyDraft(event.currentTarget.value)\r\n }}\r\n onKeyDown={(event) => {\r\n if (event.key !== 'Enter') return\r\n event.preventDefault()\r\n void updateCustomProxyUrl()\r\n }}\r\n />\r\n <button\r\n className=\"dsh-codex-context-save\"\r\n type=\"button\"\r\n aria-label={t('saveProxyUrl')}\r\n disabled={busy !== null || customProxyDraft === null}\r\n onClick={() => void updateCustomProxyUrl()}\r\n >\r\n {t('save')}\r\n </button>\r\n </span>\r\n </div>\r\n </div> : null}\r\n </Section>\r\n\r\n <Section title={t('enhancements')}>\r\n <div className=\"dsh-codex-pref-row\">\r\n <div>\r\n <strong>{t('searchProvider')}</strong>\r\n <p className=\"dsh-codex-muted\">{t('searchProviderHint')}</p>\r\n </div>\r\n <div className=\"dsh-codex-segments\" role=\"group\" aria-label={t('searchProvider')}>\r\n <button\r\n type=\"button\"\r\n className={preferences?.searchProvider === 'dsh' ? 'active' : ''}\r\n aria-pressed={preferences?.searchProvider === 'dsh'}\r\n disabled={busy !== null}\r\n onClick={() => selectSearchProvider('dsh')}\r\n >\r\n {t('searchProviderDsh')}\r\n </button>\r\n <button\r\n type=\"button\"\r\n className={preferences?.searchProvider === 'codex' ? 'active' : ''}\r\n aria-pressed={preferences?.searchProvider === 'codex'}\r\n disabled={busy !== null}\r\n onClick={() => selectSearchProvider('codex')}\r\n >\r\n {t('searchProviderCodex')}\r\n </button>\r\n </div>\r\n </div>\r\n <div className=\"dsh-codex-pref-row\">\r\n <div>\r\n <strong>{t('outputVerbosity')}</strong>\r\n <p className=\"dsh-codex-muted\">{t('outputVerbosityHint')}</p>\r\n </div>\r\n <select className=\"dsh-codex-select\" aria-label={t('outputVerbosity')} value={preferences?.outputVerbosity ?? ''} disabled={busy !== null} onChange={(event) => {\r\n const value = event.currentTarget.value\r\n void updatePreferences({ outputVerbosity: value === '' ? null : value as 'low' | 'medium' | 'high' })\r\n }}>\r\n <option value=\"\">{t('providerDefault')}</option>\r\n <option value=\"low\">{t('verbosityLow')}</option>\r\n <option value=\"medium\">{t('verbosityMedium')}</option>\r\n <option value=\"high\">{t('verbosityHigh')}</option>\r\n </select>\r\n </div>\r\n <div className=\"dsh-codex-pref-row\">\r\n <div>\r\n <strong>{t('reasoningSummary')}</strong>\r\n <p className=\"dsh-codex-muted\">{t('reasoningSummaryHint')}</p>\r\n </div>\r\n <select className=\"dsh-codex-select\" aria-label={t('reasoningSummary')} value={preferences?.reasoningSummary ?? ''} disabled={busy !== null} onChange={(event) => {\r\n const value = event.currentTarget.value\r\n void updatePreferences({ reasoningSummary: value === '' ? null : value as CodexReasoningSummary })\r\n }}>\r\n <option value=\"\">{t('providerDefault')}</option>\r\n <option value=\"auto\">{t('summaryAuto')}</option>\r\n <option value=\"concise\">{t('summaryConcise')}</option>\r\n <option value=\"detailed\">{t('summaryDetailed')}</option>\r\n <option value=\"none\">{t('summaryNone')}</option>\r\n </select>\r\n </div>\r\n <div className=\"dsh-codex-pref-row\">\r\n <div>\r\n <strong>{t('subagentMaxDepth')}</strong>\r\n <p className=\"dsh-codex-muted\">{t('subagentMaxDepthHint')}</p>\r\n </div>\r\n <select\r\n className=\"dsh-codex-select\"\r\n aria-label={t('subagentMaxDepth')}\r\n value={preferences?.subagentMaxDepth === null || preferences?.subagentMaxDepth === undefined ? '' : String(preferences.subagentMaxDepth)}\r\n disabled={busy !== null}\r\n onChange={(event) => {\r\n const value = event.currentTarget.value\r\n void updatePreferences({ subagentMaxDepth: value === '' ? null : Number(value) })\r\n }}\r\n >\r\n <option value=\"\">{t('providerDefault')}</option>\r\n <option value=\"0\">0 ({t('subagentDisabled')})</option>\r\n <option value=\"1\">1 {t('levels')}</option>\r\n <option value=\"2\">2 {t('levels')}</option>\r\n <option value=\"3\">3 {t('levels')}</option>\r\n </select>\r\n </div>\r\n <div className=\"dsh-codex-context-settings\">\r\n <div>\r\n <strong>{t('subagentContextWindow')}</strong>\r\n <p className=\"dsh-codex-muted\">{t('subagentContextWindowHint')}</p>\r\n </div>\r\n <div className=\"dsh-codex-context-row\">\r\n <label htmlFor=\"dsh-codex-subagent-context\">{t('subagentContextWindow')}</label>\r\n <span className=\"dsh-codex-capacity-control\">\r\n <input\r\n id=\"dsh-codex-subagent-context\"\r\n type=\"text\"\r\n inputMode=\"numeric\"\r\n placeholder={t('providerDefault')}\r\n value={subagentContextDraft ?? (preferences?.subagentContextWindow ? formatCapacity(preferences.subagentContextWindow) : '')}\r\n disabled={busy !== null}\r\n aria-label={t('subagentContextWindow')}\r\n onChange={(event) => {\r\n setSubagentContextDraft(event.currentTarget.value)\r\n }}\r\n onKeyDown={(event) => {\r\n if (event.key !== 'Enter') return\r\n event.preventDefault()\r\n void updateSubagentContextWindow()\r\n }}\r\n />\r\n <small>{t('tokens')}</small>\r\n <button\r\n className=\"dsh-codex-context-save\"\r\n type=\"button\"\r\n aria-label={t('save') + ' ' + t('subagentContextWindow')}\r\n disabled={busy !== null || subagentContextDraft === null}\r\n onClick={() => void updateSubagentContextWindow()}\r\n >\r\n {t('save')}\r\n </button>\r\n </span>\r\n </div>\r\n </div>\r\n <div className=\"dsh-codex-context-settings\">\r\n <div>\r\n <strong>{t('contextWindows')}</strong>\r\n <p className=\"dsh-codex-muted\">{t('contextWindowsHint')}</p>\r\n </div>\r\n {CONFIGURABLE_CONTEXT_MODEL_IDS.map((model) => {\r\n const entry = resolveCodexCatalogEntry(model)\r\n const fallback = preferences?.contextWindowOverrides?.[model] ?? entry.contextWindow\r\n const draft = contextDrafts[model]\r\n const parsedDraft = draft === undefined ? fallback : parseCapacity(draft, contextWindowLimitForModel(model))\n const dirty = draft !== undefined && parsedDraft !== fallback\r\n const inputId = `dsh-codex-context-${model}`\r\n return <div className=\"dsh-codex-context-row\" key={model}>\r\n <label htmlFor={inputId}>{entry.name}</label>\r\n <span className=\"dsh-codex-capacity-control\">\r\n <input id={inputId} type=\"text\" inputMode=\"numeric\" value={draft ?? formatCapacity(fallback)} disabled={busy !== null} aria-label={entry.name + ' ' + t('contextWindow')} onChange={(event) => {\r\n const value = event.currentTarget.value\r\n setContextDrafts((drafts) => ({ ...drafts, [model]: value }))\r\n }} onKeyDown={(event) => {\r\n if (event.key !== 'Enter' || !dirty) return\r\n event.preventDefault()\r\n void updateContextWindow(model)\r\n }} />\r\n <small>{t('tokens')}</small>\r\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>\r\n </span>\r\n </div>\r\n })}\r\n </div>\r\n <label className=\"dsh-codex-check\">\r\n <input type=\"checkbox\" checked={preferences?.fastMode === true} disabled={busy !== null} onChange={(event) => updatePreferences({ fastMode: event.currentTarget.checked })} />\r\n <span>\r\n <strong>{t('fastMode')}</strong>\r\n <small>{t('fastModeHint')}</small>\r\n </span>\r\n </label>\r\n <label className=\"dsh-codex-check\">\r\n <input type=\"checkbox\" checked={preferences?.quickQuotaVisible === true} disabled={busy !== null} onChange={(event) => updatePreferences({ quickQuotaVisible: event.currentTarget.checked })} />\r\n <span>\r\n <strong>{t('quickQuota')}</strong>\r\n <small>{t('quickQuotaHint')}</small>\r\n </span>\r\n </label>\r\n </Section>\r\n\r\n <Section title={t('quota')} aside={<Button disabled={!status?.authenticated || busy !== null} onClick={refreshQuota}>{busy === 'quota' ? t('refreshing') : t('refreshQuota')}</Button>}>\r\n <p className=\"dsh-codex-muted\">{t('quotaIntro')}</p>\r\n {quota?.state === 'signed-out' || !status?.authenticated ? <p className=\"dsh-codex-empty\">{t('quotaSignedOut')}</p> : null}\r\n {quota?.buckets?.map((bucket) => <QuotaBucket key={bucket.id} bucket={bucket} t={t} />)}\r\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}\r\n {quota?.individualLimit !== null && quota?.individualLimit !== undefined ? <QuotaFact label={t('monthlySpend')} value={individualLimitLabel(quota.individualLimit, t)} /> : null}\r\n {quota?.resetCredits !== null && quota?.resetCredits !== undefined ? <ResetCreditsFact resetCredits={quota.resetCredits} busy={busy} onUse={useResetCredit} t={t} /> : null}\r\n {resetCreditNotice !== null ? <p className=\"dsh-codex-success\" role=\"status\">{resetCreditNotice}</p> : null}\r\n {quota?.spendControlReached === true ? <p className=\"dsh-codex-warning\" role=\"status\">{t('spendControlReached')}</p> : null}\r\n {quota?.state === 'empty' ? <p className=\"dsh-codex-empty\">{t('noQuota')}</p> : null}\r\n {quota?.stale ? <p className=\"dsh-codex-warning\" role=\"status\">{t('stale')}</p> : null}\r\n {quota?.error ? <p className=\"dsh-codex-error\" role=\"alert\">{quota.error.message}</p> : null}\r\n {quota?.fetchedAt ? <p className=\"dsh-codex-timestamp\">{t('updated')}: {formatDate(quota.fetchedAt)}</p> : null}\r\n </Section>\r\n </>}\r\n\r\n <span className=\"dsh-codex-sr\" aria-live=\"polite\">{busy === null ? '' : busy}</span>\r\n </section>\r\n}\r\n\r\nfunction Section({ title, aside, children }: { title: string; aside?: React.ReactNode; children: React.ReactNode }): React.JSX.Element {\r\n return <section className=\"dsh-codex-group\">\r\n <div className=\"dsh-codex-grouphead\"><h3>{title}</h3>{aside}</div>\r\n {children}\r\n </section>\r\n}\r\n\r\nfunction Button({ primary = false, disabled, onClick, children }: { primary?: boolean; disabled?: boolean; onClick: () => void | Promise<void>; children: React.ReactNode }): React.JSX.Element {\r\n return <button className={`dsh-codex-button${primary ? ' dsh-codex-button-primary' : ''}`} type=\"button\" disabled={disabled} onClick={() => void onClick()}>{children}</button>\r\n}\r\n\r\nfunction InfoRow({ label, value }: { label: string; value: string }): React.JSX.Element {\r\n return <div className=\"dsh-codex-row\"><span className=\"dsh-codex-label\">{label}</span><span className=\"dsh-codex-value\">{value}</span></div>\r\n}\r\n\r\nexport function storageLabel(storage: CredentialStorageDto | undefined, t: Translate): string {\r\n if (storage === undefined || !storage.available) return t('storageUnavailable')\r\n if (storage.kind === 'windows-dpapi') return t('storageWindows')\r\n if (storage.kind === 'macos-keychain') return t('storageMacKeychain')\r\n if (storage.kind === 'linux-file') return t('storageLinuxFile')\r\n if (storage.kind === 'memory') return t('storageMemory')\r\n return t('storageUnavailable')\r\n}\r\n\r\nexport function storageNotice(storage: CredentialStorageDto | undefined, t: Translate): string {\r\n if (storage === undefined || !storage.available) return t('securityUnavailable')\r\n if (storage.kind === 'windows-dpapi') return t('securityWindows')\r\n if (storage.kind === 'macos-keychain') return t('securityMacKeychain')\r\n if (storage.kind === 'linux-file') return t('securityLinuxFile')\r\n if (storage.kind === 'memory') return t('securityMemory')\r\n return t('securityUnavailable')\r\n}\r\n\r\nfunction QuotaBucket({ bucket, t }: { bucket: QuotaBucketDto; t: Translate }): React.JSX.Element {\r\n const windows = quotaWindows(bucket)\r\n return <article className=\"dsh-codex-quota-card\">\r\n <div className=\"dsh-codex-quota-title\"><strong>{bucket.name}</strong>{bucket.planType ? <span>{bucket.planType}</span> : null}</div>\r\n {windows.map((window, index) => <QuotaBar key={`${window.windowDurationMins ?? 'x'}:${window.resetsAt ?? 'x'}:${index}`} label={windowLabel(window.windowDurationMins, t)} window={window} t={t} />)}\r\n </article>\r\n}\r\n\r\nfunction QuotaFact({ label, value }: { label: string; value: string }): React.JSX.Element {\r\n return <div className=\"dsh-codex-quota-fact\"><span>{label}</span><strong>{value}</strong></div>\r\n}\r\n\r\nexport function ResetCreditsFact({ resetCredits, busy, onUse, t }: { resetCredits: NonNullable<PluginStatusDto['quota']['resetCredits']>; busy: BusyAction; onUse: () => Promise<void>; t: Translate }): React.JSX.Element {\r\n const available = resetCredits.availableCount > 0\r\n return <div className=\"dsh-codex-reset-credits\">\r\n <div className=\"dsh-codex-reset-credits-info\">\r\n <span>{t('resetCredits')}</span>\r\n <strong>{resetCredits.availableCount}</strong>\r\n <small>{t('resetCreditExpires')}: {resetCredits.expiresAt == null ? t('unknown') : formatReset(resetCredits.expiresAt)}</small>\r\n </div>\r\n <Button primary disabled={!available || busy !== null} onClick={onUse}>{busy === 'reset-credit' ? t('usingResetCredit') : t('useResetCredit')}</Button>\r\n </div>\r\n}\r\n\r\nexport function QuotaBar({ label, window, t }: { label: string; window: QuotaWindowDto; t: Translate }): React.JSX.Element {\r\n const percent = typeof window?.usedPercent === 'number' && Number.isFinite(window.usedPercent) ? window.usedPercent : 0\r\n const level = percent >= 95 ? 'danger' : percent >= 80 ? 'warning' : 'normal'\r\n const remaining = Math.max(0, 100 - percent)\r\n return <div className=\"dsh-codex-meter-wrap\">\r\n <div className=\"dsh-codex-meter-label\"><span>{label}</span><strong>{formatPercent(percent)}</strong></div>\r\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}>\r\n <span style={{ width: `${Math.min(100, Math.max(0, percent))}%` }} />\r\n </div>\r\n <div className=\"dsh-codex-meter-meta\">\r\n <span>{percent >= 100 ? `${t('exhausted')} · ${formatPercent(remaining)} ${t('remaining')}` : `${formatPercent(percent)} ${t('used')} · ${formatPercent(remaining)} ${t('remaining')}`}</span>\r\n <span>{window?.resetsAt == null ? '—' : `${t('resets')}: ${formatReset(window.resetsAt)}`}</span>\r\n </div>\r\n </div>\r\n}\r\n\r\nfunction Skeleton({ label }: { label: string }): React.JSX.Element {\r\n return <div className=\"dsh-codex-skeleton\" role=\"status\" aria-label={label}><span /><span /></div>\r\n}\r\n\r\nexport function windowLabel(minutes: number | null | undefined, t: Translate): string {\r\n if (minutes === null || minutes === undefined || typeof minutes !== 'number' || !Number.isFinite(minutes) || minutes <= 0) return t('limitWindow')\r\n const [value, unit]: [number, Intl.NumberFormatOptions['unit']] = minutes >= 1440 && minutes % 1440 === 0\r\n ? [minutes / 1440, 'day']\r\n : minutes >= 60 && minutes % 60 === 0\r\n ? [minutes / 60, 'hour']\r\n : [Math.round(minutes), 'minute']\r\n try {\r\n return `${new Intl.NumberFormat(undefined, { style: 'unit', unit, unitDisplay: 'long' }).format(value)} ${t('limitWindow')}`\r\n } catch {\r\n return `${value} ${t('limitWindow')}`\r\n }\r\n}\r\n\r\nexport function parsePositiveCapacity(value: string): number | null {\r\n const normalized = value.trim().toLowerCase().replace(/[,_\\s]/g, '')\r\n const matched = normalized.match(/^(\\d+(?:\\.\\d+)?)(k|m)?$/)\r\n if (matched === null) return null\r\n const multiplier = matched[2] === 'm' ? 1_000_000 : matched[2] === 'k' ? 1_000 : 1\r\n const parsed = Number(matched[1]) * multiplier\r\n return Number.isSafeInteger(parsed) && parsed >= 1 ? parsed : null\r\n}\r\n\r\nexport function parseCapacity(value: string, maxContextWindow = GPT_56_MAX_CONTEXT_WINDOW): number | null {\n const parsed = parsePositiveCapacity(value)\r\n return parsed !== null && parsed <= maxContextWindow ? parsed : null\n}\r\n\r\nfunction formatCapacity(value: number): string {\r\n if (value % 1_000 === 0) return `${value / 1_000}K`\r\n return String(value)\r\n}\r\n\r\nfunction formatPercent(value: number | undefined | null): string {\r\n if (value === undefined || value === null || typeof value !== 'number' || !Number.isFinite(value)) return '0%'\r\n try {\r\n return `${new Intl.NumberFormat(undefined, { maximumFractionDigits: 1 }).format(value)}%`\r\n } catch {\r\n return `${value}%`\r\n }\r\n}\r\n\r\nfunction individualLimitLabel(limit: NonNullable<PluginStatusDto['quota']['individualLimit']>, t: Translate): string {\r\n const parts = [\r\n limit.remainingPercent !== null && limit.remainingPercent !== undefined ? `${formatPercent(limit.remainingPercent)} ${t('remaining')}` : null,\r\n limit.limit !== null && limit.limit !== undefined ? `${t('limit')}: ${limit.limit}` : null,\r\n limit.used !== null && limit.used !== undefined ? `${t('used')}: ${limit.used}` : null,\r\n limit.resetsAt !== null && limit.resetsAt !== undefined ? `${t('resets')}: ${formatReset(limit.resetsAt)}` : null,\r\n ].filter((part): part is string => part !== null)\r\n return parts.length > 0 ? parts.join(' · ') : t('unknown')\r\n}\r\n\r\nfunction formatDate(seconds: number | undefined | null): string {\r\n if (seconds === undefined || seconds === null || typeof seconds !== 'number' || !Number.isFinite(seconds) || seconds <= 0) return '—'\r\n const ms = seconds > 10_000_000_000 ? seconds : seconds * 1000\r\n try {\r\n return new Intl.DateTimeFormat(undefined, { dateStyle: 'medium', timeStyle: 'short' }).format(ms)\r\n } catch {\r\n return '—'\r\n }\r\n}\r\n\r\nexport function formatReset(seconds: number | undefined | null): string {\r\n if (seconds === undefined || seconds === null || typeof seconds !== 'number' || !Number.isFinite(seconds) || seconds <= 0) return '—'\r\n const ms = seconds > 10_000_000_000 ? seconds : seconds * 1000\r\n const absolute = formatDate(seconds)\r\n const diff = ms - Date.now()\r\n const abs = Math.abs(diff)\r\n const [amount, unit]: [number, Intl.RelativeTimeFormatUnit] = abs >= 86_400_000\r\n ? [Math.round(diff / 86_400_000), 'day']\r\n : abs >= 3_600_000\r\n ? [Math.round(diff / 3_600_000), 'hour']\r\n : [Math.round(diff / 60_000), 'minute']\r\n try {\r\n return `${absolute} (${new Intl.RelativeTimeFormat(undefined, { numeric: 'auto' }).format(amount, unit)})`\r\n } catch {\r\n return absolute\r\n }\r\n}\r\n\r\nfunction messageOf(error: unknown): string {\r\n return error instanceof Error ? error.message : String(error)\r\n}\r\n","export const NS = 'dsh-chatgpt-subscription' as const\r\n\r\nexport const zh = {\r\n title: 'ChatGPT',\r\n intro: '使用 ChatGPT 账号登录,在 DSH 中使用订阅可用的模型。',\r\n account: '账号',\r\n signedOut: '尚未登录',\r\n signedIn: '已登录',\r\n plan: '套餐',\r\n accountId: '账号 ID',\r\n expires: '令牌到期',\r\n storage: '凭据存储',\r\n storageWindows: 'Windows DPAPI(当前用户加密)',\r\n storageMacKeychain: 'macOS 钥匙串(Keychain 加密)',\r\n storageLinuxFile: 'Linux 用户私有文件(权限 0600)',\r\n storageMemory: '仅 Host 内存(不持久化)',\r\n storageUnavailable: '凭据存储不可用',\r\n securityWindows: '令牌由 Host 使用 Windows CurrentUser DPAPI 加密,不会进入浏览器、settings.yaml 或日志。',\r\n securityMacKeychain: '令牌由 Host 存入 macOS 登录钥匙串(Keychain),在本机加密保存,不会进入浏览器、settings.yaml 或日志。',\r\n securityLinuxFile: '令牌仅写入 Host 上当前 Linux 用户可读的 0600 文件,但不会额外加密;同 UID 进程、root、备份和磁盘快照仍可能读取。',\r\n securityMemory: '令牌仅保留在 Host 内存中,Host 退出后丢失。',\r\n securityUnavailable: 'Host 无法安全访问凭据存储;请修复文件所有者或权限后重试。',\r\n signIn: '使用 ChatGPT 登录',\r\n signInAgain: '重新登录',\r\n cancel: '取消登录',\r\n signOut: '注销',\r\n refreshToken: '刷新凭据',\r\n pending: '请在浏览器中完成登录。',\r\n popupBlocked: '浏览器拦截了登录窗口,请使用下面的链接继续。',\r\n continueLogin: '打开 ChatGPT 登录页',\r\n loading: '正在读取状态…',\r\n connection: '连接',\r\n provider: 'Provider',\r\n connectionState: '连接状态',\r\n connected: '可用',\r\n untested: '尚未测试',\r\n testConnection: '测试连接',\r\n testing: '测试中…',\r\n latency: '最近延迟',\r\n models: '可用模型',\r\n modelsHint: '勾选后模型才会显示在对话页的模型选择列表中;至少保留一个。',\r\n proxySettings: '网络代理',\r\n proxyMode: '代理模式',\r\n proxyModeHint: 'GPT 与 Antigravity(Gemini)共用此代理设置;支持自动读取系统代理,修改后对后续请求生效。',\n proxyModeAuto: '系统代理(自动检测)',\r\n proxyModeCustom: '自定义代理',\r\n proxyModeDirect: '直连(禁用代理)',\r\n customProxyUrl: '自定义代理地址',\r\n customProxyUrlHint: '支持 HTTP/HTTPS/SOCKS5 代理地址,例如 http://127.0.0.1:7890',\r\n customProxyUrlPlaceholder: '例如: http://127.0.0.1:7890',\r\n saveProxyUrl: '保存代理地址',\r\n proxyDetected: '检测到系统代理',\r\n proxyDetectedEffective: '(已自动生效)',\r\n proxyNoneDetected: '未检测到系统代理,将使用直连',\r\n proxyDirectHint: '所有网络请求将直接连接,不经过任何代理服务器。',\r\n enhancements: '增强功能',\r\n fastMode: '快速模式(1.5x 速度)',\r\n fastModeHint: '提升 Token 生成速度至约 1.5 倍;将以约 2x–2.5x 速度消耗 Codex 订阅额度。',\r\n outputVerbosity: '输出详细程度',\r\n outputVerbosityHint: '控制 Codex 最终回答的详细程度;不影响思考深度。',\r\n verbosityLow: '低(保持回答简洁)',\r\n verbosityMedium: '中(兼顾细节与简洁)',\r\n verbosityHigh: '高(在回答中包含更多细节)',\r\n reasoningSummary: '推理摘要',\r\n reasoningSummaryHint: '选择 ChatGPT 总结其推理的方式;不影响思考深度。',\r\n summaryAuto: '自动(让模型选择摘要详细程度)',\r\n summaryConcise: '简洁(显示简要推理摘要)',\r\n summaryDetailed: '详细(显示更详细的推理摘要)',\r\n summaryNone: '无(不显示推理摘要)',\r\n searchProvider: '搜索与抓取来源',\r\n searchProviderHint: '选择 DSH 联网工具使用默认来源,或改用当前 ChatGPT 订阅的 Codex 来源(自动走代理隧道)。',\r\n searchProviderDsh: 'DSH 默认',\r\n searchProviderCodex: 'ChatGPT(代理隧道)',\r\n providerDefault: '使用 Provider 默认值',\r\n subagentEnhancements: '子代理设置',\r\n subagentContextWindow: '子代理上下文预算',\r\n subagentContextWindowHint: '限制子代理运行时的最大上下文 Token 数(例如 128K、256K);留空跟随模型主设置。',\r\n subagentMaxDepth: '子代理最大嵌套深度',\r\n subagentMaxDepthHint: '限制子代理的递归层级(0–3);0 禁止创建子代理。',\r\n subagentDisabled: '已禁用',\r\n levels: '层',\r\n contextWindows: '模型上下文窗口',\n contextWindowsHint: '默认 272K;6 Astra 最高 872K,GPT-5.6 最高 1M。该值用于 DSH 的压缩与溢出判断,可输入 872K、512K 等容量。',\n contextWindow: '上下文窗口',\r\n contextWindowInvalid: '上下文窗口必须是正整数,且不能超过模型上限(6 Astra 为 872K,GPT-5.6 为 1M);可使用 K 或 M 后缀。',\n saveContextWindow: '保存上下文窗口',\r\n save: '保存',\r\n tokens: 'tokens',\r\n quickQuota: '在输入框旁显示快捷用量',\r\n quickQuotaHint: '仅在当前会话选中 codex-chatgpt 模型时显示。',\r\n quota: '用量与限额',\r\n quotaIntro: '数据来自 ChatGPT Codex 用量服务。页面可见时最多每 60 秒刷新一次。',\r\n refreshQuota: '刷新用量',\r\n refreshing: '刷新中…',\r\n noQuota: '当前套餐未返回可显示的限额窗口。',\r\n quotaSignedOut: '登录后可查看订阅限额。',\r\n stale: '显示的是上次成功获取的数据。',\r\n updated: '更新时间',\r\n primary: '主要窗口',\r\n secondary: '次要窗口',\r\n limitWindow: '额度',\r\n used: '已使用',\r\n remaining: '剩余',\r\n available: '可用',\r\n unavailable: '不可用',\r\n unlimited: '无限',\r\n credits: 'Credits',\r\n monthlySpend: '月度消费控制',\r\n resetCredits: '重置次数',\r\n resetCreditExpires: '到期时间',\r\n useResetCredit: '使用重置卡',\r\n usingResetCredit: '使用中…',\r\n useResetCreditConfirm: '使用后会立即消耗 1 次重置机会,并重置符合条件的 Codex 额度窗口。确定继续吗?',\r\n resetCreditUsed: '重置卡已使用,用量数据已刷新。',\r\n spendControlReached: '已触发月度消费控制,新的订阅调用可能被限制。',\r\n limit: '上限',\r\n exhausted: '额度已用尽',\r\n resets: '重置',\r\n quickQuotaLabel: 'Codex 剩余',\r\n quickQuotaLoading: '用量…',\r\n imageToolRunning: '正在生成图片',\r\n imageToolDone: '已生成图片',\r\n imageToolFailed: '图片生成失败',\r\n image: '图片',\r\n openImage: '打开图片',\r\n openNamedImage: '打开 {name}',\r\n imageLoading: '加载图片…',\r\n imageLoadFailed: '图片加载失败,点击重试',\r\n imagePreviewClose: '关闭',\r\n imagePreviewOpenOriginal: '打开原图',\r\n retry: '重试',\r\n unknown: '未知',\r\n} as const\r\n\r\nexport const en: Record<keyof typeof zh, string> = {\r\n title: 'ChatGPT',\r\n intro: 'Sign in with ChatGPT to use models available to your subscription in DSH.',\r\n account: 'Account',\r\n signedOut: 'Not signed in',\r\n signedIn: 'Signed in',\r\n plan: 'Plan',\r\n accountId: 'Account ID',\r\n expires: 'Token expires',\r\n storage: 'Credential storage',\r\n storageWindows: 'Windows DPAPI (current-user encrypted)',\r\n storageMacKeychain: 'macOS Keychain (encrypted)',\r\n storageLinuxFile: 'Linux user-private file (mode 0600)',\r\n storageMemory: 'Host memory only (not persistent)',\r\n storageUnavailable: 'Credential storage unavailable',\r\n securityWindows: 'The Host encrypts tokens with Windows CurrentUser DPAPI; they never enter the browser, settings.yaml, or logs.',\r\n securityMacKeychain: 'The Host stores tokens in the macOS login Keychain, encrypted on this machine; they never enter the browser, settings.yaml, or logs.',\r\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.',\r\n securityMemory: 'Tokens remain only in Host memory and are lost when the Host exits.',\r\n securityUnavailable: 'The Host cannot safely access credential storage. Fix the file owner or permissions and retry.',\r\n signIn: 'Sign in with ChatGPT',\r\n signInAgain: 'Sign in again',\r\n cancel: 'Cancel sign-in',\r\n signOut: 'Sign out',\r\n refreshToken: 'Refresh credentials',\r\n pending: 'Complete sign-in in your browser.',\r\n popupBlocked: 'The sign-in window was blocked. Use the link below to continue.',\r\n continueLogin: 'Open ChatGPT sign-in',\r\n loading: 'Reading status…',\r\n connection: 'Connection',\r\n provider: 'Provider',\r\n connectionState: 'Connection status',\r\n connected: 'Available',\r\n untested: 'Not tested',\r\n testConnection: 'Test connection',\r\n testing: 'Testing…',\r\n latency: 'Last latency',\r\n models: 'Available models',\r\n modelsHint: 'Checked models appear in the conversation model picker; at least one must remain enabled.',\r\n proxySettings: 'Network Proxy',\r\n proxyMode: 'Proxy Mode',\r\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)',\r\n proxyModeCustom: 'Custom Proxy',\r\n proxyModeDirect: 'Direct (No Proxy)',\r\n customProxyUrl: 'Custom Proxy URL',\r\n customProxyUrlHint: 'Supports HTTP/HTTPS/SOCKS5 proxy URLs, e.g. http://127.0.0.1:7890',\r\n customProxyUrlPlaceholder: 'e.g. http://127.0.0.1:7890',\r\n saveProxyUrl: 'Save Proxy URL',\r\n proxyDetected: 'Detected system proxy',\r\n proxyDetectedEffective: ' (active)',\r\n proxyNoneDetected: 'No system proxy detected; connecting directly',\r\n proxyDirectHint: 'All requests connect directly without using any proxy server.',\r\n enhancements: 'Enhancements',\r\n fastMode: 'Fast mode (1.5x speed)',\r\n fastModeHint: 'Generates tokens ~1.5x faster; consumes Codex subscription quota at ~2x–2.5x the normal rate.',\r\n outputVerbosity: 'Output verbosity',\r\n outputVerbosityHint: 'Controls the detail level of final Codex answers without changing reasoning effort.',\r\n verbosityLow: 'Low (keep answers concise)',\r\n verbosityMedium: 'Medium (balance detail and brevity)',\r\n verbosityHigh: 'High (include more detail)',\r\n reasoningSummary: 'Reasoning summary',\r\n reasoningSummaryHint: 'Controls how ChatGPT summarizes its chain of thought; does not change reasoning depth.',\r\n summaryAuto: 'Auto (let model determine detail)',\r\n summaryConcise: 'Concise (brief summary)',\r\n summaryDetailed: 'Detailed (in-depth summary)',\r\n summaryNone: 'None (hide reasoning summary)',\r\n searchProvider: 'Search & Fetch provider',\r\n searchProviderHint: 'Choose whether DSH web tools use the default provider or the Codex proxy-backed source from this ChatGPT subscription.',\r\n searchProviderDsh: 'DSH default',\r\n searchProviderCodex: 'ChatGPT (Proxy tunnel)',\r\n providerDefault: 'Use provider default',\r\n subagentEnhancements: 'Subagent settings',\r\n subagentContextWindow: 'Subagent context window budget',\r\n subagentContextWindowHint: 'Limits context capacity in tokens for subagents (e.g. 128K, 256K); leave empty to follow main model settings.',\r\n subagentMaxDepth: 'Subagent maximum nesting depth',\r\n subagentMaxDepthHint: 'Limits child levels for subagents (0–3); 0 disables subagents.',\r\n subagentDisabled: 'Disabled',\r\n levels: 'levels',\r\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',\r\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',\r\n save: 'Save',\r\n tokens: 'tokens',\r\n quickQuota: 'Show quick usage beside the composer',\r\n quickQuotaHint: 'Shown only when the current session uses a codex-chatgpt model.',\r\n quota: 'Usage and limits',\r\n quotaIntro: 'Data comes from the ChatGPT Codex usage service and refreshes at most once per minute while visible.',\r\n refreshQuota: 'Refresh usage',\r\n refreshing: 'Refreshing…',\r\n noQuota: 'Your plan did not return any displayable limit windows.',\r\n quotaSignedOut: 'Sign in to view subscription limits.',\r\n stale: 'Showing the last successfully fetched data.',\r\n updated: 'Updated',\r\n primary: 'Primary window',\r\n secondary: 'Secondary window',\r\n limitWindow: 'limit',\r\n used: 'used',\r\n remaining: 'remaining',\r\n available: 'Available',\r\n unavailable: 'Unavailable',\r\n unlimited: 'Unlimited',\r\n credits: 'Credits',\r\n monthlySpend: 'Monthly spend control',\r\n resetCredits: 'Reset credits',\r\n resetCreditExpires: 'Expires',\r\n useResetCredit: 'Use reset credit',\r\n usingResetCredit: 'Using…',\r\n useResetCreditConfirm: 'This immediately spends one reset credit and resets eligible Codex limit windows. Continue?',\r\n resetCreditUsed: 'The reset credit was used and usage data was refreshed.',\r\n spendControlReached: 'Monthly spend control has been reached; new subscription calls may be limited.',\r\n limit: 'Limit',\r\n exhausted: 'Quota exhausted',\r\n resets: 'Resets',\r\n quickQuotaLabel: 'Codex left',\r\n quickQuotaLoading: 'Usage…',\r\n imageToolRunning: 'Generating image',\r\n imageToolDone: 'Generated image',\r\n imageToolFailed: 'Image generation failed',\r\n image: 'Image',\r\n openImage: 'Open image',\r\n openNamedImage: 'Open {name}',\r\n imageLoading: 'Loading image…',\r\n imageLoadFailed: 'Image failed to load. Click to retry',\r\n imagePreviewClose: 'Close',\r\n imagePreviewOpenOriginal: 'Open original',\r\n retry: 'Retry',\r\n unknown: 'Unknown',\r\n}\r\n\r\nexport type LocaleKey = keyof typeof zh\r\nexport const dictionaries = { zh, en }\r\n","const STYLE_ID = '@eddyskywalker/dsh-chatgpt-subscription/main'\r\n\r\nconst CSS = `\r\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}\r\n.dsh-codex-page *{box-sizing:border-box}\r\n.dsh-codex-title{font-size:15px;font-weight:650;line-height:1.4;margin:0 0 5px}\r\n.dsh-codex-intro,.dsh-codex-muted{color:var(--dsw-alias-label-secondary);font-size:13px;line-height:1.55;margin:0}\r\n.dsh-codex-group{border-top:0.5px solid var(--dsw-alias-border-l2);min-width:0}\r\n.dsh-codex-grouphead{align-items:center;display:flex;gap:12px;justify-content:space-between;min-height:48px}\r\n.dsh-codex-grouphead h3{font-size:14px;font-weight:650;margin:0}\r\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}\r\n.dsh-codex-label{color:var(--dsw-alias-label-secondary);font-size:13px;flex:0 0 auto}\r\n.dsh-codex-value{font-size:13px;min-width:0;overflow-wrap:anywhere;text-align:right}\r\n.dsh-codex-actions{display:flex;flex-wrap:wrap;gap:8px;justify-content:flex-end;padding-top:12px}\r\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}\r\n.dsh-codex-button:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}\r\n.dsh-codex-button:focus-visible,.dsh-codex-link:focus-visible{outline:2px solid var(--dsw-alias-button-info-fill,#397ee8);outline-offset:2px}\r\n.dsh-codex-button:disabled{cursor:default;opacity:.5}\r\n.dsh-codex-button-primary{background:var(--dsw-alias-button-info-fill,#397ee8);border-color:transparent;color:var(--dsw-alias-button-info-label,#fff)}\r\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}\r\n.dsh-codex-error,.dsh-codex-warning,.dsh-codex-success{font-size:12px;line-height:1.5;margin:8px 0 0}\r\n.dsh-codex-error{color:var(--dsw-alias-label-danger,#d94b4b)}\r\n.dsh-codex-warning{color:var(--dsw-alias-label-warning,#c77a18)}\r\n.dsh-codex-success{color:var(--dsw-alias-label-success,#2e9b62)}\r\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}\r\n.dsh-codex-link{color:var(--dsw-alias-label-link,#3278d4);display:inline-block;font-size:13px;margin-top:8px}\r\n.dsh-codex-models-hint{padding-top:10px}\r\n.dsh-codex-models{display:flex;flex-wrap:wrap;gap:7px;padding-top:8px}\r\n.dsh-codex-models label{cursor:pointer;display:block;position:relative}\r\n.dsh-codex-models input{position:absolute;opacity:0;pointer-events:none}\r\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}\r\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)}\r\n.dsh-codex-models input:focus-visible+span{outline:2px solid var(--dsw-alias-button-info-fill,#397ee8);outline-offset:2px}\r\n.dsh-codex-models input:disabled+span{cursor:default;opacity:.5}\r\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}\r\n.dsh-codex-pref-row strong,.dsh-codex-check strong{display:block;font-size:13px;font-weight:600;line-height:1.35}\r\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}\r\n.dsh-codex-segments label{cursor:pointer;display:block;margin:0}\r\n.dsh-codex-segments input{position:absolute;opacity:0;pointer-events:none}\r\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}\r\n.dsh-codex-segments button{background:transparent;cursor:pointer}\r\n.dsh-codex-segments label:hover span,.dsh-codex-segments button:hover:not(:disabled){color:var(--dsw-alias-label-primary)}\r\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)}\r\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}\r\n.dsh-codex-segments input:disabled+span,.dsh-codex-segments button:disabled{cursor:default;opacity:.5}\r\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}\r\n.dsh-codex-select{max-width:210px;min-width:150px}\r\n.dsh-codex-context-settings{border-bottom:0.5px solid var(--dsw-alias-border-l2);display:grid;gap:10px;padding:12px 0}\r\n.dsh-codex-context-settings>div>strong{font-size:13px;font-weight:600}\r\n.dsh-codex-context-row{align-items:center;display:flex;font-size:12px;gap:14px;justify-content:space-between}\r\n.dsh-codex-proxy-control{align-items:center;display:flex;gap:8px;width:100%}\r\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}\r\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}\r\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}\r\n.dsh-codex-capacity-control{align-items:center;display:flex;gap:7px}\r\n.dsh-codex-capacity-control input{font-family:ui-monospace,SFMono-Regular,Consolas,monospace;text-align:right;width:90px}\r\n.dsh-codex-capacity-control input[type=number]{width:110px}\r\n.dsh-codex-capacity-control small{color:var(--dsw-alias-label-tertiary);font-size:11px;width:42px}\r\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}\r\n.dsh-codex-context-save:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}\r\n.dsh-codex-context-save:focus-visible{outline:2px solid var(--dsw-alias-button-info-fill,#397ee8);outline-offset:2px}\r\n.dsh-codex-context-save:disabled{cursor:default;opacity:.45}\r\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}\r\n.dsh-codex-check input{flex:none;margin-top:2px}\r\n.dsh-codex-check small{color:var(--dsw-alias-label-secondary);display:block;font-size:12px;line-height:1.45;margin-top:2px}\r\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}\r\n.dsh-codex-quota-title{align-items:center;display:flex;font-size:13px;gap:8px;justify-content:space-between}\r\n.dsh-codex-quota-title span{color:var(--dsw-alias-label-tertiary);font-size:11px;text-transform:uppercase}\r\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}\r\n.dsh-codex-quota-fact span{color:var(--dsw-alias-label-secondary);flex:none}\r\n.dsh-codex-quota-fact strong{font-weight:600;min-width:0;overflow-wrap:anywhere;text-align:right}\r\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}\r\n.dsh-codex-reset-credits-info{display:grid;font-size:12px;gap:2px;grid-template-columns:auto auto}\r\n.dsh-codex-reset-credits-info>span{color:var(--dsw-alias-label-secondary)}\r\n.dsh-codex-reset-credits-info>strong{font-weight:650;text-align:right}\r\n.dsh-codex-reset-credits-info>small{color:var(--dsw-alias-label-tertiary);font-size:11px;grid-column:1/-1}\r\n.dsh-codex-meter-wrap{margin-top:13px}\r\n.dsh-codex-meter-label,.dsh-codex-meter-meta{display:flex;gap:10px;justify-content:space-between}\r\n.dsh-codex-meter-label{font-size:12px;margin-bottom:6px}\r\n.dsh-codex-meter-meta{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:1.45;margin-top:6px}\r\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%}\r\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}\r\n.dsh-codex-meter-warning>span{background:var(--dsw-alias-label-warning,#d58a24)}\r\n.dsh-codex-meter-danger>span{background:var(--dsw-alias-label-danger,#d94b4b)}\r\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}\r\n.dsh-codex-timestamp{color:var(--dsw-alias-label-tertiary);font-size:11px;margin:10px 0 0;text-align:right}\r\n.dsh-codex-skeleton{display:grid;gap:9px;padding-top:10px}\r\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}\r\n.dsh-codex-skeleton span:nth-child(2){animation-delay:.12s}.dsh-codex-skeleton span:nth-child(3){animation-delay:.24s}\r\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}\r\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}\r\n.dsh-codex-composer-quota strong{color:var(--dsw-alias-label-primary);font-size:11px;font-weight:650}\r\n.dsh-codex-composer-quota[data-level=warning] strong{color:var(--dsw-alias-label-warning,#d58a24)}\r\n.dsh-codex-composer-quota[data-level=danger] strong{color:var(--dsw-alias-label-danger,#d94b4b)}\r\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}\r\n.dsh-codex-image-tool-head{align-items:center;display:flex;font-size:13px;gap:8px;min-width:0}\r\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}\r\n.dsh-codex-image-tool[data-state=error] .dsh-codex-image-dot{background:var(--dsw-alias-label-danger,#d94b4b)}\r\n.dsh-codex-image-title{font-weight:600}\r\n.dsh-codex-image-summary{color:var(--dsw-alias-label-tertiary);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\r\n.dsh-codex-image-grid{display:flex;flex-wrap:wrap;gap:8px}\r\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}\r\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}\r\n.dsh-codex-image-failed{color:var(--dsw-alias-label-danger,#d94b4b)}\r\n@keyframes dsh-codex-pulse{0%,100%{opacity:.55}50%{opacity:1}}\r\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}}\r\n@media(prefers-reduced-motion:reduce){.dsh-codex-meter>span{transition:none}.dsh-codex-skeleton span{animation:none}}\r\n`\r\n\r\nexport function installStyles(): () => void {\r\n if (document.querySelector(`style[data-plugin-css=\"${STYLE_ID}\"]`) !== null) return () => undefined\r\n const element = document.createElement('style')\r\n element.dataset.plugin = '@eddyskywalker/dsh-chatgpt-subscription'\r\n element.dataset.pluginCss = STYLE_ID\r\n element.textContent = CSS\r\n document.head.appendChild(element)\r\n return () => element.remove()\r\n}\r\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 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 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 [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) setError(null)\n try {\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 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<{ status: string }>('/login/status')\n if (pollStatus.status === 'complete') {\n clearInterval(pollTimer)\n setBusy(null)\n await loadStatus()\n notifyChange()\n } else if (pollStatus.status === 'error') {\n clearInterval(pollTimer)\n setBusy(null)\n setError(t.loginFailed)\n }\n } catch {\n // ignore\n }\n }, 1500)\n\n setTimeout(() => {\n clearInterval(pollTimer)\n setBusy(null)\n }, 5 * 60 * 1000)\n } catch (err) {\n setBusy(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' ? t.signingIn : t.signIn}\n </button>\n ) : (\n <>\n <button className=\"dsha-btn dsha-btn-primary\" disabled={busy !== null} onClick={handleLogin}>\n {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\">暂无配额数据,点击右上角刷新用量。</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 && <div className=\"dsha-error\">{error}</div>}\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 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, '&lt;').replace(/>/g, '&gt;')}</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'\r\nimport type { ImageAttachmentRef } from '@deepseek-ai/dsh-attachment'\r\nimport type {} from '@deepseek-ai/dsh-client-ui-settings/client'\r\nimport type {} from '@deepseek-ai/dsh-client-locale/client'\r\nimport type {} from '@deepseek-ai/dsh-client-ui-slots'\r\nimport type {} from '@deepseek-ai/dsh-client-ui-model-selection/client'\r\nimport type {} from '@deepseek-ai/dsh-client-ui-conversation/client'\r\nimport type {} from '@deepseek-ai/dsh-client-ui-tool/client'\r\nimport { CODEX_IMAGE_TOOL_NAME } from '../compat.ts'\r\nimport { CodexComposerQuota } from './CodexComposerQuota.tsx'\r\nimport { CodexImageToolView, type ImageLoader } from './CodexImageToolView.tsx'\r\nimport { CodexSubscriptionSection } from './CodexSubscriptionSection.tsx'\r\nimport { SubscriptionApi } from './api.ts'\r\nimport { dictionaries, NS, type LocaleKey } from './locales.ts'\r\nimport { installStyles } from './styles.ts'\r\nimport { AntigravitySection } from './antigravity/AntigravitySection.tsx'\r\nimport { installAntigravityStyles } from './antigravity/styles.ts'\r\nimport { dictionaries as antigravityDicts, NS_ANTIGRAVITY } from './antigravity/locales.ts'\r\nimport { AntigravityComposerQuota } from './antigravity/AntigravityComposerQuota.tsx'\r\nimport { setupMermaidObserver } from './mermaid/renderer.ts'\r\n\r\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\r\n interface LocaleNamespaceMap {\r\n 'dsh-chatgpt-subscription': LocaleKey\r\n 'dsh-antigravity': any\r\n }\r\n}\r\n\r\nexport const inject = ['slots', 'locale', 'modelDirectories', 'conversation']\r\n\r\nexport function apply(ctx: ClientContext): void {\r\n ctx.effect(() => ctx.locale.register(NS, dictionaries), 'dsh-chatgpt-subscription: dictionaries')\r\n ctx.effect(() => installStyles(), 'dsh-chatgpt-subscription: styles')\r\n ctx.effect(() => ctx.locale.register(NS_ANTIGRAVITY, antigravityDicts), 'dsh-antigravity: dictionaries')\r\n ctx.effect(() => {\r\n installAntigravityStyles()\r\n return () => {}\r\n }, 'dsh-antigravity: styles')\r\n ctx.effect(() => setupMermaidObserver(), 'dsh-mermaid: observer')\r\n\r\n const t = ctx.locale.bind(NS)\r\n ctx.slots.inject('settings.section', () => ctx.slots.register({\r\n name: 'settings.section',\r\n id: 'codex-subscription',\r\n order: 45,\r\n label: () => t('title'),\r\n locale: NS,\r\n }, CodexSubscriptionSection))\r\n\r\n const AntigravitySectionWrapper: React.FC = () => {\r\n const handleModelChange = () => {\r\n try {\r\n const conv = ctx.conversation as unknown as { activeSessionId?: string; currentSessionId?: string; activeId?: string }\r\n const activeSessionId = conv?.activeSessionId || conv?.currentSessionId || conv?.activeId\r\n if (activeSessionId && ctx.modelDirectories) {\r\n const dir = ctx.modelDirectories.directoryFor(activeSessionId as any)\r\n void dir?.load?.().catch?.(() => undefined)\r\n }\r\n } catch {\r\n // best-effort\r\n }\r\n }\r\n return <AntigravitySection onModelChange={handleModelChange} />\r\n }\r\n\r\n ctx.slots.inject('settings.section', () => ctx.slots.register({\r\n name: 'settings.section',\r\n id: 'antigravity',\r\n order: 46,\r\n label: () => 'Antigravity',\r\n locale: NS_ANTIGRAVITY,\r\n }, AntigravitySectionWrapper))\r\n ctx.slots.inject('conversation.input.right', () => ctx.slots.register({\r\n name: 'conversation.input.right',\r\n id: 'codex-subscription-quota',\r\n order: 35,\r\n locale: NS,\r\n inject: (sessionId) => {\r\n const directory = ctx.modelDirectories.directoryFor(sessionId)\r\n return {\r\n api: new SubscriptionApi(),\r\n directory: directory.store,\r\n loadModelDirectory: () => {\r\n void directory.load().catch(() => undefined)\r\n },\r\n }\r\n },\r\n }, CodexComposerQuota))\r\n ctx.slots.inject('conversation.input.right', () => ctx.slots.register({\r\n name: 'conversation.input.right',\r\n id: 'antigravity-quota',\r\n order: 36,\r\n locale: NS_ANTIGRAVITY,\r\n inject: (sessionId) => {\r\n const directory = ctx.modelDirectories.directoryFor(sessionId)\r\n return {\r\n directory: directory.store,\r\n loadModelDirectory: () => {\r\n void directory.load().catch(() => undefined)\r\n },\r\n }\r\n },\r\n }, AntigravityComposerQuota))\r\n ctx.slots.inject('tool.call.toolview', () => ctx.slots.register({\r\n name: 'tool.call.toolview',\r\n key: CODEX_IMAGE_TOOL_NAME,\r\n locale: NS,\r\n inject: (sessionId) => ({\r\n loadImage: imageLoader(ctx, sessionId),\r\n }),\r\n }, CodexImageToolView))\r\n}\r\n\r\nfunction imageLoader(ctx: ClientContext, sessionId: string): ImageLoader {\r\n const conversation = ctx.conversation as unknown as {\r\n resolveImage(sessionId: string, attachment: ImageAttachmentRef): Promise<string>\r\n }\r\n return (attachment) => conversation.resolveImage(sessionId, attachment)\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAeA,MAAa,eAAe;EAE5B,MAAa,4BAA4B;EAWzC,MAAa,wBAAwB;;;ECpBrC,SAAgB,oBAAoB,OAAmC,SAAyD;GAC9H,IAAI,UAAU,KAAA,KAAa,MAAM,QAAQ,WAAW,GAAG,OAAO;GAG9D,MAAM,UAFQ,SAAS,YAAY,KAAK,GAAA,CACf,SAAS,OACV,IACpB,MAAM,QAAQ,MAAK,cAAa,GAAG,UAAU,GAAG,GAAG,UAAU,OAAO,YAAY,CAAC,CAAC,SAAS,OAAO,CAAC,IACnG,MAAM,QAAQ,MAAK,cAAa,UAAU,OAAO,OAAO,KACrD,MAAM,QAAQ,MAAK,cAAa,UAAU,KAAK,YAAY,MAAM,OAAO;GAC/E,IAAI,WAAW,KAAA,GAAW,OAAO;GACjC,MAAM,UAAU,aAAa,MAAM;GACnC,IAAI,QAAQ,WAAW,GAAG,OAAO;GAOjC,MAAM,SALS,CAAC,GAAG,OAAO,CAAC,CAAC,MAAM,GAAG,MAAM;IAGzC,QAFa,EAAE,sBAAsB,aACxB,EAAE,sBAAsB;GAEvC,CACoB,CAAC,CAAC;GACtB,OAAO;IACL;IACA;IACA,kBAAkB,KAAK,IAAI,GAAG,MAAM,OAAO,WAAW;GACxD;EACF;EAEA,SAAgB,aAAa,QAA0C;GACrE,IAAI,OAAO,QAAQ,SAAS,GAAG,OAAO,OAAO;GAC7C,OAAO,CAAC,OAAO,SAAS,OAAO,SAAS,CAAC,CAAC,QAAQ,WAAqC,WAAW,IAAI;EACxG;;;ECpBA,SAAgB,mBAAmB,EAAE,KAAK,WAAW,oBAAoB,KAAsC;GAC7G,MAAM,aAAaA,WAAS,SAAS;GACrC,MAAM,CAAC,QAAQ,cAAA,GAAA,MAAA,SAAA,CAA8C,IAAI;GACjE,MAAM,CAAC,SAAS,eAAA,GAAA,MAAA,SAAA,CAAuB,KAAK;GAC5C,MAAM,cAAA,GAAA,MAAA,OAAA,CAAoB,KAAK;GAC/B,MAAM,WAAW,WAAW;GAC5B,MAAM,UAAU,UAAU,aAAa;GAEvC,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,mBAAmB;GACrB,GAAG,CAAC,kBAAkB,CAAC;GAEvB,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,WAAW,UAAU;IACrB,aAAa;KACX,WAAW,UAAU;IACvB;GACF,GAAG,CAAC,CAAC;GAEL,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,CAAC,SAAS;IACd,IAAI,WAAW;IACf,MAAM,UAAU,YAA2B;KACzC,WAAW,IAAI;KACf,IAAI;MACF,MAAM,OAAO,MAAM,IAAI,OAAO;MAC9B,IAAI,CAAC,YAAY,WAAW,SAAS,UAAU,IAAI;KACrD,QAAQ;MACN,IAAI,CAAC,YAAY,WAAW,SAAS,UAAU,IAAI;KACrD,UAAU;MACR,IAAI,CAAC,YAAY,WAAW,SAAS,WAAW,KAAK;KACvD;IACF;IACA,QAAa;IACb,MAAM,QAAQ,OAAO,kBAAkB;KACrC,IAAI,SAAS,oBAAoB,WAAW,QAAa;IAC3D,GAAG,GAAM;IACT,aAAa;KACX,WAAW;KACX,OAAO,cAAc,KAAK;IAC5B;GACF,GAAG,CAAC,KAAK,OAAO,CAAC;GAEjB,MAAM,SAAA,GAAA,MAAA,QAAA,OAAsB,oBAAoB,QAAQ,OAAO,UAAU,KAAK,GAAG,CAAC,UAAU,OAAO,QAAQ,KAAK,CAAC;GACjH,IAAI,CAAC,WAAW,QAAQ,YAAY,sBAAsB,MAAM,OAAO;GAQvE,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;IAAM,WAAU;IAA2B,cAPpC,UAAU,OACpB,WACA,MAAM,oBAAoB,IACxB,WACA,MAAM,oBAAoB,KACxB,YACA;IAC6D,cAAY,UAAU,OAAO,EAAE,mBAAmB,IAAI,GAAG,EAAE,iBAAiB,EAAE,IAAIC,gBAAc,MAAM,gBAAgB;cAApL,CACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,EAAE,iBAAiB,EAAQ,CAAA,GAClC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,UAAU,OAAQ,UAAU,EAAE,mBAAmB,IAAI,MAAOA,gBAAc,MAAM,gBAAgB,EAAU,CAAA,CAC/G;;EACR;EAEA,SAASD,WAAY,OAA4B;GAC/C,QAAA,GAAA,MAAA,qBAAA,EACG,aAAa,MAAM,UAAU,QAAQ,SAChC,MAAM,YAAY,SAClB,MAAM,YAAY,CAC1B;EACF;EAEA,SAASC,gBAAc,OAAuB;GAC5C,OAAO,GAAG,IAAI,KAAK,aAAa,KAAA,GAAW,EAAE,uBAAuB,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,EAAE;EACzF;;;ECxEA,SAAgB,mBAAmB,EAAE,OAAO,WAAW,KAA+B;GACpF,MAAM,UAAU,UAAU;GAC1B,MAAM,UAAU,UAAU,MAAM,UAAU;GAC1C,MAAM,SAAS,gBAAgB,KAAK;GACpC,MAAM,SAAS,WAAW,CAAC,UAAU,YAAY,MAAM,OAAO,IAAI,CAAC;GACnE,MAAM,QAAQ,UAAU,EAAE,iBAAiB,IAAI,UAAU,EAAE,eAAe,IAAI,EAAE,kBAAkB;GAClG,MAAM,UAAU,UAAU,YAAY,UAAU,MAAM,UAAU,CAAC,CAAC;GAClE,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAU;IAAuB,cAAY,UAAU,UAAU,UAAU,SAAS;cAAzF,CACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;KAAK,WAAU;eAAf;MACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,WAAU;OAAsB,eAAY;MAAQ,CAAA;MAC1D,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,WAAU;iBAAyB;MAAY,CAAA;MACpD,YAAY,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,WAAU;iBAA2B;MAAc,CAAA,IAAI;KAC9E;QACJ,OAAO,SAAS,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;KAAK,WAAU;eACjC,OAAO,KAAK,eAAe,iBAAA,GAAA,kBAAA,IAAA,CAAC,gBAAD;MAAkE;MAAY,MAAM;MAAW,OAAO,WAAW,QAAQ,EAAE,OAAO;MAAM;KAAI,GAAvH,OAAO,WAAW,YAAY,CAAyF,CAAC;IACtK,CAAA,IAAI,IACN;;EACP;EAEA,SAAS,eAAe,EAAE,YAAY,MAAM,OAAO,KAK7B;GACpB,MAAM,CAAC,KAAK,WAAA,GAAA,MAAA,SAAA,CAAkC,IAAI;GAClD,MAAM,CAAC,QAAQ,cAAA,GAAA,MAAA,SAAA,CAAsB,KAAK;GAC1C,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,WAAW;IACf,OAAO,IAAI;IACX,UAAU,KAAK;IACf,KAAK,UAAU,CAAC,CAAC,MAAM,QAAQ;KAC7B,IAAI,CAAC,UAAU,OAAO,GAAG;IAC3B,SAAS;KACP,IAAI,CAAC,UAAU,UAAU,IAAI;IAC/B,CAAC;IACD,aAAa;KACX,WAAW;IACb;GACF,GAAG,CAAC,YAAY,IAAI,CAAC;GACrB,IAAI,QAAQ,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;IAAM,WAAU;cAA0B,EAAE,iBAAiB;GAAQ,CAAA;GACxF,IAAI,QAAQ,MAAM,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;IAAM,WAAU;cAA2B,EAAE,cAAc;GAAQ,CAAA;GAC5F,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;IAAK,WAAU;IAA+B;IAAK,KAAK;GAAQ,CAAA;EACzE;EAEA,SAAS,gBAAgB,OAAsC;GAC7D,MAAM,MAAM,UAAU,QAAQ,MAAM,MAAM,UAAU,MAAM;GAC1D,IAAI,OAAO,QAAQ,YAAY,IAAI,KAAK,MAAM,IAAI,OAAO;GACzD,IAAI;IACF,MAAM,QAAQ,KAAK,MAAM,GAAG;IAC5B,OAAO,OAAO,UAAU,YACnB,UAAU,QACV,CAAC,MAAM,QAAQ,KAAK,KACpB,OAAQ,MAA+B,WAAW,WAClD,MAA6B,SAC9B;GACN,QAAQ;IACN,OAAO;GACT;EACF;EAEA,SAAS,YAAY,QAAuD;GAC1E,MAAM,SAA+B,CAAC;GACtC,KAAK,MAAM,SAAS,QAAQ;IAC1B,IAAI,MAAM,SAAS,SAAS,OAAO,KAAK,MAAM,UAAU;IACxD,IAAI,MAAM,SAAS,eAAe,OAAO,KAAK,GAAG,YAAY,MAAM,OAAO,CAAC;GAC7E;GACA,OAAO;EACT;EAEA,SAAS,YAAY,QAAgD;GACnE,MAAM,OAAO,OACV,KAAK,UAAU,MAAM,SAAS,UAAU,MAAM,SAAS,cAAc,MAAM,OAAO,EAAE,CAAC,CACrF,OAAO,OAAO,CAAC,CACf,KAAK,GAAG,CAAC,CACT,KAAK;GACR,OAAO,SAAS,KAAK,OAAO;EAC9B;;;ECvFA,MAAa,4BAA4B;EAEzC,MAAa,iCAAiC;EAa9C,MAAa,sBAAsB;GACjC;IACE,IAAI;IACJ,MAAM;IACN,eAAe;IACf,iBAAiB,CAAC,QAAQ,OAAO;IACjC,wBAAwB;IACxB,kBAAkB;IAClB,0BAA0B;IAC1B,iBAAiB;GACnB;GACA;IACE,IAAI;IACJ,MAAM;IACN,eAAe;IACf,iBAAiB,CAAC,QAAQ,OAAO;IACjC,wBAAwB;IACxB,kBAAkB;IAClB,0BAA0B;GAC5B;GACA;IACE,IAAI;IACJ,MAAM;IACN,eAAe;IACf,iBAAiB,CAAC,QAAQ,OAAO;IACjC,wBAAwB;IACxB,kBAAkB;IAClB,0BAA0B;IAC1B,iBAAiB;GACnB;GACA;IACE,IAAI;IACJ,MAAM;IACN,eAAe;IACf,iBAAiB,CAAC,QAAQ,OAAO;IACjC,wBAAwB;IACxB,kBAAkB;IAClB,0BAA0B;IAC1B,iBAAiB;GACnB;GACA;IACE,IAAI;IACJ,MAAM;IACN,eAAe;IACf,iBAAiB,CAAC,QAAQ,OAAO;IACjC,wBAAwB;IACxB,kBAAkB;IAClB,0BAA0B;GAC5B;GACA;IACE,IAAI;IACJ,MAAM;IACN,eAAe;IACf,iBAAiB,CAAC,QAAQ,OAAO;IACjC,wBAAwB;IACxB,kBAAkB;IAClB,0BAA0B;IAC1B,iBAAiB;GACnB;GACA;IACE,IAAI;IACJ,MAAM;IACN,eAAe;IACf,iBAAiB,CAAC,QAAQ,OAAO;IACjC,wBAAwB;IACxB,kBAAkB;IAClB,0BAA0B;GAC5B;GACA;IACE,IAAI;IACJ,MAAM;IACN,eAAe;IACf,iBAAiB,CAAC,MAAM;IACxB,wBAAwB;IACxB,kBAAkB;IAClB,0BAA0B;GAC5B;EACF;EAIA,MAAa,kCAAkC;GAC7C;GACA;GACA;GACA;EACF;EAEA,MAAa,sBAAsB,oBAAoB;EAEvD,MAAa,iCAAiC;GAC5C;GACA;GACA;GACA;EACF;EAkCA,SAAgB,2BAA2B,OAA2C;GACpF,OAAO,UAAU,gBAAgB,iCAAiC;EACpE;EAEA,SAAgB,yBAAyB,OAAuC;GAC9E,OAAO,oBAAoB,MAAM,UAAU,MAAM,OAAO,KAAK,KAAK;EACpE;;;EC5IA,IAAa,kBAAb,MAA6B;GAC3B,SAAmC;IACjC,OAAO,QAAyB,GAAG,aAAa,QAAQ;GAC1D;GAEA,aAAqC;IACnC,OAAO,KAAoB,GAAG,aAAa,eAAe,CAAC,CAAC;GAC9D;GAEA,YAAY,SAAkD;IAC5D,OAAO,KAAK,GAAG,aAAa,gBAAgB,EAAE,QAAQ,CAAC;GACzD;GAEA,SAA4C;IAC1C,OAAO,KAAK,GAAG,aAAa,UAAU,CAAC,CAAC;GAC1C;GAEA,UAAoC;IAClC,OAAO,KAAK,GAAG,aAAa,iBAAiB,CAAC,CAAC;GACjD;GAEA,eAAwC;IACtC,OAAO,KAAK,GAAG,aAAa,iBAAiB,CAAC,CAAC;GACjD;GAEA,iBAA0C;IACxC,OAAO,KAAK,GAAG,aAAa,0BAA0B,CAAC,CAAC;GAC1D;GAEA,iBAA6C;IAC3C,OAAO,KAAK,GAAG,aAAa,mBAAmB,CAAC,CAAC;GACnD;GAEA,kBAAkB,OAA8E;IAC9F,OAAO,KAAK,GAAG,aAAa,sBAAsB,KAAK;GACzD;GAEA,OAAO,SAA8B;IACnC,OAAO,IAAI,YAAY,GAAG,aAAa,wBAAwB,mBAAmB,OAAO,GAAG;GAC9F;EACF;EAEA,eAAe,KAAQ,KAAa,MAA0B;GAC5D,OAAO,QAAW,KAAK;IACrB,QAAQ;IACR,SAAS,EAAE,gBAAgB,mBAAmB;IAC9C,MAAM,KAAK,UAAU,IAAI;GAC3B,CAAC;EACH;EAEA,eAAe,QAAW,KAAa,MAAgC;GACrE,MAAM,WAAW,MAAM,MAAM,KAAK;IAAE,GAAG;IAAM,aAAa;GAAc,CAAC;GACzE,MAAM,WAAW,MAAM,SAAS,KAAK;GACrC,IAAI,CAAC,SAAS,MAAM,CAAC,SAAS,IAC5B,MAAM,IAAI,MAAM,SAAS,KAAK,mBAAmB,SAAS,OAAO,KAAK,SAAS,MAAM,OAAO;GAE9F,OAAO,SAAS;EAClB;EAEA,SAAgB,gBAAgB,OAAmD;GACjF,IAAI;IACF,MAAM,QAAQ,KAAK,MAAM,MAAM,IAAI;IACnC,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,OAAO,MAAM,SAAS,WAAW,QAAQ;GACjG,QAAQ;IACN,OAAO;GACT;EACF;;;EClEA,SAAgB,yBAAyB,EAAE,KAA+B;GACxE,MAAM,UAAA,GAAA,MAAA,OAAA,CAAgB,IAAI,gBAAgB,CAAC;GAC3C,MAAM,kBAAA,GAAA,MAAA,OAAA,CAA4C,IAAI;GACtD,MAAM,CAAC,QAAQ,cAAA,GAAA,MAAA,SAAA,CAA8C,IAAI;GACjE,MAAM,CAAC,MAAM,YAAA,GAAA,MAAA,SAAA,CAAgC,IAAI;GACjD,MAAM,CAAC,OAAO,aAAA,GAAA,MAAA,SAAA,CAAoC,IAAI;GACtD,MAAM,CAAC,SAAS,eAAA,GAAA,MAAA,SAAA,CAAsC,IAAI;GAC1D,MAAM,CAAC,cAAc,oBAAA,GAAA,MAAA,SAAA,CAA4B,KAAK;GACtD,MAAM,CAAC,mBAAmB,yBAAA,GAAA,MAAA,SAAA,CAAgD,IAAI;GAC9E,MAAM,CAAC,YAAY,kBAAA,GAAA,MAAA,SAAA,CAA2E,IAAI;GAClG,MAAM,CAAC,eAAe,qBAAA,GAAA,MAAA,SAAA,CAAqD,CAAC,CAAC;GAC7E,MAAM,CAAC,sBAAsB,4BAAA,GAAA,MAAA,SAAA,CAAmD,IAAI;GACpF,MAAM,CAAC,kBAAkB,wBAAA,GAAA,MAAA,SAAA,CAA+C,IAAI;GAE5E,MAAM,QAAA,GAAA,MAAA,YAAA,CAAmB,OAAO,QAAQ,UAAU;IAChD,IAAI,CAAC,OAAO,SAAS,IAAI;IACzB,IAAI;KACF,MAAM,OAAO,MAAM,OAAO,QAAQ,OAAO;KACzC,UAAU,IAAI;KACd,IAAI,KAAK,UAAU,KAAA,GAAW,SAAS,KAAK,MAAM,OAAO;IAC3D,SAAS,OAAO;KACd,IAAI,CAAC,OAAO,SAAS,UAAU,KAAK,CAAC;IACvC;GACF,GAAG,CAAC,CAAC;GAEL,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,KAAU;IACV,MAAM,2BAAiC;KACrC,IAAI,SAAS,oBAAoB,WAAW,KAAU,IAAI;IAC5D;IACA,SAAS,iBAAiB,oBAAoB,kBAAkB;IAChE,MAAM,QAAQ,OAAO,YAAY,oBAAoB,GAAM;IAC3D,aAAa;KACX,OAAO,cAAc,KAAK;KAC1B,SAAS,oBAAoB,oBAAoB,kBAAkB;KACnE,eAAe,SAAS,MAAM;IAChC;GACF,GAAG,CAAC,IAAI,CAAC;GAET,MAAM,cAAA,GAAA,MAAA,YAAA,EAA0B,YAAoB;IAClD,eAAe,SAAS,MAAM;IAC9B,MAAM,SAAS,OAAO,QAAQ,OAAO,OAAO;IAC5C,eAAe,UAAU;IACzB,MAAM,SAAS,OAAO,YAAoC;KACxD,OAAO,MAAM;KACb,eAAe,UAAU;KACzB,QAAQ,IAAI;KACZ,WAAW,IAAI;KACf,IAAI,YAAY,KAAA,GAAW,SAAS,OAAO;KAE3C,MAAM,KAAK,IAAI;IACjB;IACA,OAAO,iBAAiB,cAAc,UAAU;KAE9C,IADe,gBAAgB,KACtB,CAAC,EAAE,SAAS,aAAa,OAAY;IAChD,CAAC;IACD,OAAO,iBAAiB,mBAAmB,KAAK,OAAO,CAAC;IACxD,OAAO,iBAAiB,WAAW,UAAU;KAC3C,MAAM,SAAS,gBAAgB,KAA6B;KAC5D,OAAY,QAAQ,SAAS,WAAW,OAAO,MAAM,UAAU,yBAAyB;IAC1F,CAAC;GACH,GAAG,CAAC,IAAI,CAAC;GAET,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,MAAM,UAAU,QAAQ,MAAM,SAAS,OAAO,MAAM,UAAU;IAC9D,IAAI,YAAY,QAAQ,YAAY,KAAA,KAAa,eAAe,YAAY,MAAM,WAAW,OAAO;GACtG,GAAG;IAAC,QAAQ,MAAM;IAAQ,QAAQ,MAAM;IAAS;GAAU,CAAC;GAE5D,MAAM,aAAa,YAA2B;IAC5C,QAAQ,OAAO;IACf,SAAS,IAAI;IACb,gBAAgB,KAAK;IACrB,MAAM,QAAQ,OAAO,KAAK,eAAe,qBAAqB,4BAA4B;IAC1F,IAAI;KACF,MAAM,QAAQ,MAAM,OAAO,QAAQ,WAAW;KAC9C,WAAW,MAAM,OAAO;KACxB,IAAI,UAAU,MAAM,gBAAgB,IAAI;UACnC,MAAM,SAAS,QAAQ,MAAM,OAAO;KACzC,WAAW,MAAM,OAAO;KACxB,MAAM,KAAK,IAAI;IACjB,SAAS,OAAO;KACd,OAAO,MAAM;KACb,QAAQ,IAAI;KACZ,SAAS,UAAU,KAAK,CAAC;IAC3B;GACF;GAEA,MAAM,cAAc,YAA2B;IAC7C,MAAM,UAAU,QAAQ,MAAM;IAC9B,IAAI,YAAY,QAAQ,YAAY,KAAA,GAAW;IAC/C,QAAQ,OAAO;IACf,IAAI;KACF,MAAM,OAAO,QAAQ,YAAY,OAAO;KACxC,eAAe,SAAS,MAAM;KAC9B,eAAe,UAAU;KACzB,WAAW,IAAI;KACf,MAAM,KAAK;IACb,SAAS,OAAO;KACd,SAAS,UAAU,KAAK,CAAC;IAC3B,UAAU;KACR,QAAQ,IAAI;IACd;GACF;GAEA,MAAM,eAAe,YAA2B,IAAI,SAAS,YAAY;IACvE,UAAU,MAAM,OAAO,QAAQ,QAAQ,CAAC;GAC1C,CAAC;GAED,MAAM,eAAe,YAA2B,IAAI,SAAS,YAAY;IACvE,MAAM,QAAQ,MAAM,OAAO,QAAQ,aAAa;IAChD,WAAW,YAAY,YAAY,OAAO,UAAU;KAAE,GAAG;KAAS;IAAM,CAAC;GAC3E,CAAC;GAED,MAAM,iBAAiB,YAA2B;IAChD,IAAI,CAAC,OAAO,QAAQ,EAAE,uBAAuB,CAAC,GAAG;IACjD,MAAM,IAAI,gBAAgB,YAAY;KACpC,MAAM,QAAQ,MAAM,OAAO,QAAQ,eAAe;KAClD,WAAW,YAAY,YAAY,OAAO,UAAU;MAAE,GAAG;MAAS;KAAM,CAAC;KACzE,qBAAqB,EAAE,iBAAiB,CAAC;IAC3C,CAAC;GACH;GAEA,MAAM,iBAAiB,YAA2B,IAAI,QAAQ,YAAY;IACxE,MAAM,SAAS,MAAM,OAAO,QAAQ,eAAe;IACnD,cAAc;KAAE,WAAW,OAAO;KAAW,WAAW,OAAO;IAAU,CAAC;GAC5E,CAAC;GAED,MAAM,oBAAoB,OAAO,UAA2D,IAAI,eAAe,YAAY;IACzH,MAAM,cAAc,MAAM,OAAO,QAAQ,kBAAkB,KAAK;IAChE,WAAW,YAAY,YAAY,OAAO,UAAU;KAAE,GAAG;KAAS;IAAY,CAAC;GACjF,CAAC;GAED,MAAM,wBAAwB,aAA6C;IACzE,WAAU,YAAW,UAAU;KAAE,GAAG;KAAS,aAAa;MAAE,GAAG,QAAQ;MAAa,gBAAgB;KAAS;IAAE,IAAI,OAAO;IAC1H,kBAAuB,EAAE,gBAAgB,SAAS,CAAC;GACrD;GAEA,MAAM,qBAAqB,OAAO,SAAiB,YAAoC;IACrF,MAAM,UAAU,QAAQ,YAAY,mBAAmB,CAAC,GAAG,+BAA+B;IAC1F,MAAM,kBAAkB,UAAU,CAAC,GAAG,SAAS,OAAO,IAAI,QAAQ,QAAO,OAAM,OAAO,OAAO;IAC7F,IAAI,gBAAgB,WAAW,GAAG;IAClC,MAAM,kBAAkB,EAAE,gBAAgB,CAAC;GAC7C;GAEA,MAAM,sBAAsB,OAAO,UAA0E;IAC3G,MAAM,UAAU,QAAQ,YAAY,uBAAuB,UAAU,yBAAyB,KAAK,CAAC,CAAC;IACrG,MAAM,SAAS,cAAc,cAAc,UAAU,OAAO,OAAO,GAAG,2BAA2B,KAAK,CAAC;IACvG,IAAI,WAAW,MAAM;KACnB,SAAS,EAAE,sBAAsB,CAAC;KAClC;IACF;IACA,MAAM,kBAAkB,EAAE,wBAAwB,GAAG,QAAQ,OAAO,EAAE,CAAC;IACvE,kBAAkB,YAAY;KAAE,GAAG;MAAS,QAAQ,OAAO,MAAM;IAAE,EAAE;GACvE;GAEA,MAAM,8BAA8B,YAA2B;IAC7D,MAAM,QAAQ,sBAAsB,KAAK;IACzC,IAAI,UAAU,KAAA,KAAa,UAAU,IAAI;KACvC,MAAM,kBAAkB,EAAE,uBAAuB,KAAK,CAAC;KACvD,wBAAwB,IAAI;KAC5B;IACF;IACA,MAAM,SAASC,wBAAsB,KAAK;IAC1C,IAAI,WAAW,MAAM;KACnB,SAAS,EAAE,sBAAsB,CAAC;KAClC;IACF;IACA,MAAM,kBAAkB,EAAE,uBAAuB,OAAO,CAAC;IACzD,wBAAwB,IAAI;GAC9B;GAEA,MAAM,uBAAuB,YAA2B;IACtD,MAAM,QAAQ,kBAAkB,KAAK;IACrC,MAAM,kBAAkB,EAAE,gBAAgB,QAAQ,QAAQ,KAAK,CAAC;IAChE,oBAAoB,IAAI;GAC1B;GAEA,MAAM,SAAS,YAA2B,IAAI,UAAU,YAAY;IAClE,MAAM,OAAO,QAAQ,OAAO;IAC5B,eAAe,SAAS,MAAM;IAC9B,eAAe,UAAU;IACzB,WAAW,IAAI;IACf,cAAc,IAAI;IAClB,MAAM,KAAK;GACb,CAAC;GAED,MAAM,MAAM,OAAO,QAAmC,SAA6C;IACjG,QAAQ,MAAM;IACd,SAAS,IAAI;IACb,qBAAqB,IAAI;IACzB,IAAI;KACF,MAAM,KAAK;IACb,SAAS,OAAO;KACd,SAAS,UAAU,KAAK,CAAC;IAC3B,UAAU;KACR,QAAQ,IAAI;IACd;GACF;GAEA,MAAM,UAAU,QAAQ;GACxB,MAAM,cAAc,QAAQ;GAC5B,MAAM,QAAQ,QAAQ;GACtB,MAAM,UAAU,QAAQ;GACxB,MAAM,QAAQ,QAAQ;GACtB,MAAM,kBAAkB,aAAa,mBAAmB;GACxD,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;IAAS,WAAU;IAAiB,mBAAgB;cAApD;KACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;MAAI,IAAG;MAAkB,WAAU;gBAAmB,EAAE,OAAO;KAAM,CAAA,GACrE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,WAAU;gBAAmB,EAAE,OAAO;KAAK,CAAA,CACxC,EAAA,CAAA;KAEP,UAAU,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAU;MAAqB,MAAK;gBAAzC,CAChB,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,MAAY,CAAA,GAClB,WAAW,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAQ,UAAU,SAAS;OAAM,eAAe,KAAK;iBAAI,EAAE,OAAO;MAAU,CAAA,IAAI,IAChG;UAAI;KAER,WAAW,QAAQ,UAAU,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAU,OAAO,EAAE,SAAS,EAAI,CAAA,IAAI,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;MACvE,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;OAAS,OAAO,EAAE,SAAS;iBAA3B;QACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;SAAS,OAAO,QAAQ,gBAAgB,EAAE,UAAU,IAAI,EAAE,WAAW;SAAG,OAAO,SAAS,SAAS;QAAM,CAAA;QACtG,QAAQ,gBAAgB,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;SACvB,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;UAAS,OAAO,EAAE,MAAM;UAAG,OAAO,SAAS,YAAY,EAAE,SAAS;SAAI,CAAA;SACtE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;UAAS,OAAO,EAAE,WAAW;UAAG,OAAO,SAAS,mBAAmB;SAAM,CAAA;SACzE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;UAAS,OAAO,EAAE,SAAS;UAAG,OAAOC,aAAW,SAAS,cAAc;SAAI,CAAA;QAC3E,EAAA,CAAA,IAAI;QACN,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;SAAS,OAAO,EAAE,SAAS;SAAG,OAAO,aAAa,SAAS,CAAC;QAAI,CAAA;QAChE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;SAAG,WAAU;mBAAoB,cAAc,SAAS,CAAC;QAAK,CAAA;QAC7D,OAAO,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;SAAG,WAAU;SAAkB,MAAK;mBAAU,EAAE,SAAS;QAAK,CAAA,IAAI;QAClF,eAAe,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;SAAG,WAAU;mBAAmB,EAAE,cAAc;QAAK,CAAA,IAAI;QACxE,YAAY,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;SAAG,WAAU;SAAiB,MAAM;SAAS,QAAO;SAAS,KAAI;mBAAc,EAAE,eAAe;QAAK,CAAA,IAAI;QAC7H,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;SAAK,WAAU;mBAAf,CACG,OAAO,SACJ,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UAAQ,UAAU,SAAS;UAAM,SAAS;oBAAc,EAAE,QAAQ;SAAU,CAAA,IAC5E,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UAAQ,SAAA;UAAQ,UAAU,SAAS,QAAQ,SAAS,cAAc;UAAO,SAAS;oBAAa,QAAQ,gBAAgB,EAAE,aAAa,IAAI,EAAE,QAAQ;SAAU,CAAA,GACjK,QAAQ,gBAAgB,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA,CACvB,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UAAQ,UAAU,SAAS;UAAM,SAAS;oBAAe,EAAE,cAAc;SAAU,CAAA,GACnF,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UAAQ,UAAU,SAAS;UAAM,SAAS;oBAAS,EAAE,SAAS;SAAU,CAAA,CACxE,EAAA,CAAA,IAAI,IACH;;OACE;;MAET,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;OAAS,OAAO,EAAE,YAAY;iBAA9B;QACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;SAAS,OAAO,EAAE,UAAU;SAAG,OAAM;QAAqC,CAAA;QAC1E,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;SAAS,OAAO,EAAE,iBAAiB;SAAG,OAAO,eAAe,OAAO,EAAE,UAAU,IAAI,EAAE,WAAW;QAAI,CAAA;QACnG,eAAe,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;SAAS,OAAO,EAAE,SAAS;SAAG,OAAO,GAAG,WAAW,UAAU,QAAQA,aAAW,WAAW,SAAS;QAAM,CAAA,IAAI;QACrI,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;SAAG,WAAU;mBAAyC,EAAE,YAAY;QAAK,CAAA;QACzE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;SAAK,WAAU;SAAmB,cAAY,EAAE,QAAQ;mBACrD,oBAAoB,KAAK,UAAU;UAClC,MAAM,UAAU,gBAAgB,MAAK,OAAM,OAAO,MAAM,EAAE;UAC1D,MAAM,cAAc,WAAW,gBAAgB,WAAW;UAC1D,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;WAAsB,OAAO,MAAM;qBAAnC,CACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;YAAO,MAAK;YAAoB;YAAS,UAAU,SAAS,QAAQ;YAAa,WAAW,UAAU,KAAK,mBAAmB,MAAM,IAAI,MAAM,cAAc,OAAO;WAAI,CAAA,GACvK,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,MAAM,KAAW,CAAA,CACnB;aAHY,MAAM,EAGlB;SACT,CAAC;QACE,CAAA;QACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;SAAK,WAAU;mBACb,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UAAQ,UAAU,CAAC,QAAQ,iBAAiB,SAAS;UAAM,SAAS;oBAAiB,SAAS,SAAS,EAAE,SAAS,IAAI,EAAE,gBAAgB;SAAU,CAAA;QAC/I,CAAA;OACE;;MAET,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;OAAS,OAAO,EAAE,eAAe;iBAAjC;QACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;SAAK,WAAU;mBAAf,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,EAAE,WAAW,EAAU,CAAA,GAChC,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;UAAG,WAAU;oBAAmB,EAAE,eAAe;SAAK,CAAA,CACnD,EAAA,CAAA,GACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;UACE,WAAU;UACV,cAAY,EAAE,WAAW;UACzB,OAAO,aAAa,aAAa;UACjC,UAAU,SAAS;UACnB,WAAW,UAAU;WACnB,MAAM,OAAO,MAAM,cAAc;WACjC,WAAU,YAAW,UAAU;YAAE,GAAG;YAAS,aAAa;aAAE,GAAG,QAAQ;aAAa,WAAW;YAAK;WAAE,IAAI,OAAO;WACjH,kBAAuB,EAAE,WAAW,KAAK,CAAC;UAC5C;oBATF;WAWE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;YAAQ,OAAM;sBAAQ,EAAE,eAAe;WAAU,CAAA;WACjD,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;YAAQ,OAAM;sBAAU,EAAE,iBAAiB;WAAU,CAAA;WACrD,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;YAAQ,OAAM;sBAAU,EAAE,iBAAiB;WAAU,CAAA;UAC/C;WACL;;SAEH,aAAa,aAAa,YAAY,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;SAAK,WAAU;mBAC7D,QAAQ,gBAAgB,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;UACvB,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD,EAAA,UAAA,CAAO,EAAE,eAAe,GAAE,GAAO,EAAA,CAAA;UACjC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;WAAM,WAAU;qBAAuB,OAAO;UAAoB,CAAA;UAClE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;WAAM,WAAU;qBAAqB,EAAE,wBAAwB;UAAQ,CAAA;SACvE,EAAA,CAAA,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UAAM,WAAU;oBAAmB,EAAE,mBAAmB;SAAQ,CAAA;QACnE,CAAA,IAAI;QAER,aAAa,cAAc,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;SAAG,WAAU;SAAkB,OAAO,EAAE,QAAQ,UAAU;mBAAI,EAAE,iBAAiB;QAAK,CAAA,IAAI;QAEhI,aAAa,cAAc,WAAW,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;SAAK,WAAU;mBAAf,CACrC,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,EAAE,gBAAgB,EAAU,CAAA,GACrC,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;UAAG,WAAU;oBAAmB,EAAE,oBAAoB;SAAK,CAAA,CACxD,EAAA,CAAA,GACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;UAAK,WAAU;oBACb,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;WAAM,WAAU;qBAAhB,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;YACE,IAAG;YACH,MAAK;YACL,aAAa,EAAE,2BAA2B;YAC1C,OAAO,oBAAqB,aAAa,kBAAkB;YAC3D,UAAU,SAAS;YACnB,cAAY,EAAE,gBAAgB;YAC9B,WAAW,UAAU;aACnB,oBAAoB,MAAM,cAAc,KAAK;YAC/C;YACA,YAAY,UAAU;aACpB,IAAI,MAAM,QAAQ,SAAS;aAC3B,MAAM,eAAe;aACrB,qBAA0B;YAC5B;WACD,CAAA,GACD,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;YACE,WAAU;YACV,MAAK;YACL,cAAY,EAAE,cAAc;YAC5B,UAAU,SAAS,QAAQ,qBAAqB;YAChD,eAAe,KAAK,qBAAqB;sBAExC,EAAE,MAAM;WACH,CAAA,CACJ;;SACH,CAAA,CACF;aAAI;OACF;;MAET,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;OAAS,OAAO,EAAE,cAAc;iBAAhC;QACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;SAAK,WAAU;mBAAf,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,EAAE,gBAAgB,EAAU,CAAA,GACrC,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;UAAG,WAAU;oBAAmB,EAAE,oBAAoB;SAAK,CAAA,CACxD,EAAA,CAAA,GACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;UAAK,WAAU;UAAqB,MAAK;UAAQ,cAAY,EAAE,gBAAgB;oBAA/E,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;WACE,MAAK;WACL,WAAW,aAAa,mBAAmB,QAAQ,WAAW;WAC9D,gBAAc,aAAa,mBAAmB;WAC9C,UAAU,SAAS;WACnB,eAAe,qBAAqB,KAAK;qBAExC,EAAE,mBAAmB;UAChB,CAAA,GACR,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;WACE,MAAK;WACL,WAAW,aAAa,mBAAmB,UAAU,WAAW;WAChE,gBAAc,aAAa,mBAAmB;WAC9C,UAAU,SAAS;WACnB,eAAe,qBAAqB,OAAO;qBAE1C,EAAE,qBAAqB;UAClB,CAAA,CACL;WACF;;QACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;SAAK,WAAU;mBAAf,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,EAAE,iBAAiB,EAAU,CAAA,GACtC,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;UAAG,WAAU;oBAAmB,EAAE,qBAAqB;SAAK,CAAA,CACzD,EAAA,CAAA,GACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;UAAQ,WAAU;UAAmB,cAAY,EAAE,iBAAiB;UAAG,OAAO,aAAa,mBAAmB;UAAI,UAAU,SAAS;UAAM,WAAW,UAAU;WAC9J,MAAM,QAAQ,MAAM,cAAc;WAClC,kBAAuB,EAAE,iBAAiB,UAAU,KAAK,OAAO,MAAmC,CAAC;UACtG;oBAHA;WAIE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;YAAQ,OAAM;sBAAI,EAAE,iBAAiB;WAAU,CAAA;WAC/C,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;YAAQ,OAAM;sBAAO,EAAE,cAAc;WAAU,CAAA;WAC/C,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;YAAQ,OAAM;sBAAU,EAAE,iBAAiB;WAAU,CAAA;WACrD,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;YAAQ,OAAM;sBAAQ,EAAE,eAAe;WAAU,CAAA;UAC3C;WACL;;QACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;SAAK,WAAU;mBAAf,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,EAAE,kBAAkB,EAAU,CAAA,GACvC,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;UAAG,WAAU;oBAAmB,EAAE,sBAAsB;SAAK,CAAA,CAC1D,EAAA,CAAA,GACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;UAAQ,WAAU;UAAmB,cAAY,EAAE,kBAAkB;UAAG,OAAO,aAAa,oBAAoB;UAAI,UAAU,SAAS;UAAM,WAAW,UAAU;WAChK,MAAM,QAAQ,MAAM,cAAc;WAClC,kBAAuB,EAAE,kBAAkB,UAAU,KAAK,OAAO,MAA+B,CAAC;UACnG;oBAHA;WAIE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;YAAQ,OAAM;sBAAI,EAAE,iBAAiB;WAAU,CAAA;WAC/C,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;YAAQ,OAAM;sBAAQ,EAAE,aAAa;WAAU,CAAA;WAC/C,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;YAAQ,OAAM;sBAAW,EAAE,gBAAgB;WAAU,CAAA;WACrD,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;YAAQ,OAAM;sBAAY,EAAE,iBAAiB;WAAU,CAAA;WACvD,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;YAAQ,OAAM;sBAAQ,EAAE,aAAa;WAAU,CAAA;UACzC;WACL;;QACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;SAAK,WAAU;mBAAf,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,EAAE,kBAAkB,EAAU,CAAA,GACvC,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;UAAG,WAAU;oBAAmB,EAAE,sBAAsB;SAAK,CAAA,CAC1D,EAAA,CAAA,GACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;UACE,WAAU;UACV,cAAY,EAAE,kBAAkB;UAChC,OAAO,aAAa,qBAAqB,QAAQ,aAAa,qBAAqB,KAAA,IAAY,KAAK,OAAO,YAAY,gBAAgB;UACvI,UAAU,SAAS;UACnB,WAAW,UAAU;WACnB,MAAM,QAAQ,MAAM,cAAc;WAClC,kBAAuB,EAAE,kBAAkB,UAAU,KAAK,OAAO,OAAO,KAAK,EAAE,CAAC;UAClF;oBARF;WAUE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;YAAQ,OAAM;sBAAI,EAAE,iBAAiB;WAAU,CAAA;WAC/C,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;YAAQ,OAAM;sBAAd;aAAkB;aAAI,EAAE,kBAAkB;aAAE;YAAS;;WACrD,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;YAAQ,OAAM;sBAAd,CAAkB,MAAG,EAAE,QAAQ,CAAU;;WACzC,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;YAAQ,OAAM;sBAAd,CAAkB,MAAG,EAAE,QAAQ,CAAU;;WACzC,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;YAAQ,OAAM;sBAAd,CAAkB,MAAG,EAAE,QAAQ,CAAU;;UACnC;WACL;;QACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;SAAK,WAAU;mBAAf,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,EAAE,uBAAuB,EAAU,CAAA,GAC5C,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;UAAG,WAAU;oBAAmB,EAAE,2BAA2B;SAAK,CAAA,CAC/D,EAAA,CAAA,GACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;UAAK,WAAU;oBAAf,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;WAAO,SAAQ;qBAA8B,EAAE,uBAAuB;UAAS,CAAA,GAC/E,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;WAAM,WAAU;qBAAhB;YACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;aACE,IAAG;aACH,MAAK;aACL,WAAU;aACV,aAAa,EAAE,iBAAiB;aAChC,OAAO,yBAAyB,aAAa,wBAAwBC,iBAAe,YAAY,qBAAqB,IAAI;aACzH,UAAU,SAAS;aACnB,cAAY,EAAE,uBAAuB;aACrC,WAAW,UAAU;cACnB,wBAAwB,MAAM,cAAc,KAAK;aACnD;aACA,YAAY,UAAU;cACpB,IAAI,MAAM,QAAQ,SAAS;cAC3B,MAAM,eAAe;cACrB,4BAAiC;aACnC;YACD,CAAA;YACD,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQ,EAAE,QAAQ,EAAS,CAAA;YAC3B,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;aACE,WAAU;aACV,MAAK;aACL,cAAY,EAAE,MAAM,IAAI,MAAM,EAAE,uBAAuB;aACvD,UAAU,SAAS,QAAQ,yBAAyB;aACpD,eAAe,KAAK,4BAA4B;uBAE/C,EAAE,MAAM;YACH,CAAA;WACJ;YACH;WACF;;QACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;SAAK,WAAU;mBAAf,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,EAAE,gBAAgB,EAAU,CAAA,GACrC,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;UAAG,WAAU;oBAAmB,EAAE,oBAAoB;SAAK,CAAA,CACxD,EAAA,CAAA,GACJ,+BAA+B,KAAK,UAAU;UAC7C,MAAM,QAAQ,yBAAyB,KAAK;UAC5C,MAAM,WAAW,aAAa,yBAAyB,UAAU,MAAM;UACvE,MAAM,QAAQ,cAAc;UAC5B,MAAM,cAAc,UAAU,KAAA,IAAY,WAAW,cAAc,OAAO,2BAA2B,KAAK,CAAC;UAC3G,MAAM,QAAQ,UAAU,KAAA,KAAa,gBAAgB;UACrD,MAAM,UAAU,qBAAqB;UACrC,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;WAAK,WAAU;qBAAf,CACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;YAAO,SAAS;sBAAU,MAAM;WAAY,CAAA,GAC5C,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;YAAM,WAAU;sBAAhB;aACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;cAAO,IAAI;cAAS,MAAK;cAAO,WAAU;cAAU,OAAO,SAASA,iBAAe,QAAQ;cAAG,UAAU,SAAS;cAAM,cAAY,MAAM,OAAO,MAAM,EAAE,eAAe;cAAG,WAAW,UAAU;eAC7L,MAAM,QAAQ,MAAM,cAAc;eAClC,kBAAkB,YAAY;gBAAE,GAAG;iBAAS,QAAQ;eAAM,EAAE;cAC9D;cAAG,YAAY,UAAU;eACvB,IAAI,MAAM,QAAQ,WAAW,CAAC,OAAO;eACrC,MAAM,eAAe;eACrB,oBAAyB,KAAK;cAChC;aAAI,CAAA;aACJ,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQ,EAAE,QAAQ,EAAS,CAAA;aAC3B,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;cAAQ,WAAU;cAAyB,MAAK;cAAS,cAAY;cAAO,cAAY,MAAM,OAAO,MAAM,EAAE,mBAAmB;cAAG,UAAU,SAAS,QAAQ,CAAC;cAAO,eAAe,KAAK,oBAAoB,KAAK;wBAAI,EAAE,MAAM;aAAU,CAAA;YACrO;aACH;aAd8C,KAc9C;SACP,CAAC,CACE;;QACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;SAAO,WAAU;mBAAjB,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;UAAO,MAAK;UAAW,SAAS,aAAa,aAAa;UAAM,UAAU,SAAS;UAAM,WAAW,UAAU,kBAAkB,EAAE,UAAU,MAAM,cAAc,QAAQ,CAAC;SAAI,CAAA,GAC7K,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,EAAE,UAAU,EAAU,CAAA,GAC/B,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQ,EAAE,cAAc,EAAS,CAAA,CAC7B,EAAA,CAAA,CACD;;QACP,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;SAAO,WAAU;mBAAjB,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;UAAO,MAAK;UAAW,SAAS,aAAa,sBAAsB;UAAM,UAAU,SAAS;UAAM,WAAW,UAAU,kBAAkB,EAAE,mBAAmB,MAAM,cAAc,QAAQ,CAAC;SAAI,CAAA,GAC/L,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,EAAE,YAAY,EAAU,CAAA,GACjC,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQ,EAAE,gBAAgB,EAAS,CAAA,CAC/B,EAAA,CAAA,CACD;;OACA;;MAET,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;OAAS,OAAO,EAAE,OAAO;OAAG,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAQ,UAAU,CAAC,QAAQ,iBAAiB,SAAS;QAAM,SAAS;kBAAe,SAAS,UAAU,EAAE,YAAY,IAAI,EAAE,cAAc;OAAU,CAAA;iBAArL;QACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;SAAG,WAAU;mBAAmB,EAAE,YAAY;QAAK,CAAA;QAClD,OAAO,UAAU,gBAAgB,CAAC,QAAQ,gBAAgB,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;SAAG,WAAU;mBAAmB,EAAE,gBAAgB;QAAK,CAAA,IAAI;QACrH,OAAO,SAAS,KAAK,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;SAAqC;SAAW;QAAI,GAAlC,OAAO,EAA2B,CAAC;QACrF,OAAO,YAAY,QAAQ,OAAO,YAAY,KAAA,IAAY,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;SAAW,OAAO,EAAE,SAAS;SAAG,OAAO,MAAM,QAAQ,YAAY,EAAE,WAAW,IAAI,MAAM,QAAQ,YAAY,MAAM,QAAQ,aAAa,EAAE,WAAW,IAAI,EAAE,aAAa;QAAK,CAAA,IAAI;QAC1O,OAAO,oBAAoB,QAAQ,OAAO,oBAAoB,KAAA,IAAY,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;SAAW,OAAO,EAAE,cAAc;SAAG,OAAO,qBAAqB,MAAM,iBAAiB,CAAC;QAAI,CAAA,IAAI;QAC3K,OAAO,iBAAiB,QAAQ,OAAO,iBAAiB,KAAA,IAAY,iBAAA,GAAA,kBAAA,IAAA,CAAC,kBAAD;SAAkB,cAAc,MAAM;SAAoB;SAAM,OAAO;SAAmB;QAAI,CAAA,IAAI;QACtK,sBAAsB,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;SAAG,WAAU;SAAoB,MAAK;mBAAU;QAAqB,CAAA,IAAI;QACtG,OAAO,wBAAwB,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;SAAG,WAAU;SAAoB,MAAK;mBAAU,EAAE,qBAAqB;QAAK,CAAA,IAAI;QACtH,OAAO,UAAU,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;SAAG,WAAU;mBAAmB,EAAE,SAAS;QAAK,CAAA,IAAI;QAC/E,OAAO,QAAQ,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;SAAG,WAAU;SAAoB,MAAK;mBAAU,EAAE,OAAO;QAAK,CAAA,IAAI;QACjF,OAAO,QAAQ,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;SAAG,WAAU;SAAkB,MAAK;mBAAS,MAAM,MAAM;QAAW,CAAA,IAAI;QACvF,OAAO,YAAY,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD;SAAG,WAAU;mBAAb;UAAoC,EAAE,SAAS;UAAE;UAAGD,aAAW,MAAM,SAAS;SAAK;aAAI;OACpG;;KACT,EAAA,CAAA;KAEF,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;MAAM,WAAU;MAAe,aAAU;gBAAU,SAAS,OAAO,KAAK;KAAW,CAAA;IAC5E;;EACX;EAEA,SAAS,QAAQ,EAAE,OAAO,OAAO,YAAsG;GACrI,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;IAAS,WAAU;cAAnB,CACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;KAAK,WAAU;eAAf,CAAqC,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,MAAU,CAAA,GAAE,KAAW;QAChE,QACM;;EACX;EAEA,SAAS,OAAO,EAAE,UAAU,OAAO,UAAU,SAAS,YAA0I;GAC9L,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;IAAQ,WAAW,mBAAmB,UAAU,8BAA8B;IAAM,MAAK;IAAmB;IAAU,eAAe,KAAK,QAAQ;IAAI;GAAiB,CAAA;EAChL;EAEA,SAAS,QAAQ,EAAE,OAAO,SAA8D;GACtF,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAU;cAAf,CAA+B,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;KAAM,WAAU;eAAmB;IAAY,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;KAAM,WAAU;eAAmB;IAAY,CAAA,CAAM;;EAC7I;EAEA,SAAgB,aAAa,SAA2C,GAAsB;GAC5F,IAAI,YAAY,KAAA,KAAa,CAAC,QAAQ,WAAW,OAAO,EAAE,oBAAoB;GAC9E,IAAI,QAAQ,SAAS,iBAAiB,OAAO,EAAE,gBAAgB;GAC/D,IAAI,QAAQ,SAAS,kBAAkB,OAAO,EAAE,oBAAoB;GACpE,IAAI,QAAQ,SAAS,cAAc,OAAO,EAAE,kBAAkB;GAC9D,IAAI,QAAQ,SAAS,UAAU,OAAO,EAAE,eAAe;GACvD,OAAO,EAAE,oBAAoB;EAC/B;EAEA,SAAgB,cAAc,SAA2C,GAAsB;GAC7F,IAAI,YAAY,KAAA,KAAa,CAAC,QAAQ,WAAW,OAAO,EAAE,qBAAqB;GAC/E,IAAI,QAAQ,SAAS,iBAAiB,OAAO,EAAE,iBAAiB;GAChE,IAAI,QAAQ,SAAS,kBAAkB,OAAO,EAAE,qBAAqB;GACrE,IAAI,QAAQ,SAAS,cAAc,OAAO,EAAE,mBAAmB;GAC/D,IAAI,QAAQ,SAAS,UAAU,OAAO,EAAE,gBAAgB;GACxD,OAAO,EAAE,qBAAqB;EAChC;EAEA,SAAS,YAAY,EAAE,QAAQ,KAAkE;GAC/F,MAAM,UAAU,aAAa,MAAM;GACnC,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;IAAS,WAAU;cAAnB,CACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;KAAK,WAAU;eAAf,CAAuC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,OAAO,KAAa,CAAA,GAAE,OAAO,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,OAAO,SAAe,CAAA,IAAI,IAAU;QAClI,QAAQ,KAAK,QAAQ,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;KAAyF,OAAO,YAAY,OAAO,oBAAoB,CAAC;KAAW;KAAW;IAAI,GAAnJ,GAAG,OAAO,sBAAsB,IAAI,GAAG,OAAO,YAAY,IAAI,GAAG,OAAkF,CAAC,CAC5L;;EACX;EAEA,SAAS,UAAU,EAAE,OAAO,SAA8D;GACxF,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAU;cAAf,CAAsC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,MAAY,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,MAAc,CAAA,CAAM;;EAChG;EAEA,SAAgB,iBAAiB,EAAE,cAAc,MAAM,OAAO,KAA6J;GACzN,MAAM,YAAY,aAAa,iBAAiB;GAChD,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAU;cAAf,CACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;KAAK,WAAU;eAAf;MACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,EAAE,cAAc,EAAQ,CAAA;MAC/B,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,aAAa,eAAuB,CAAA;MAC7C,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA;OAAQ,EAAE,oBAAoB;OAAE;OAAG,aAAa,aAAa,OAAO,EAAE,SAAS,IAAI,YAAY,aAAa,SAAS;MAAS,EAAA,CAAA;KAC3H;QACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;KAAQ,SAAA;KAAQ,UAAU,CAAC,aAAa,SAAS;KAAM,SAAS;eAAQ,SAAS,iBAAiB,EAAE,kBAAkB,IAAI,EAAE,gBAAgB;IAAU,CAAA,CACnJ;;EACP;EAEA,SAAgB,SAAS,EAAE,OAAO,QAAQ,KAAiF;GACzH,MAAM,UAAU,OAAO,QAAQ,gBAAgB,YAAY,OAAO,SAAS,OAAO,WAAW,IAAI,OAAO,cAAc;GACtH,MAAM,QAAQ,WAAW,KAAK,WAAW,WAAW,KAAK,YAAY;GACrE,MAAM,YAAY,KAAK,IAAI,GAAG,MAAM,OAAO;GAC3C,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAU;cAAf;KACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAU;gBAAf,CAAuC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,MAAY,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,cAAc,OAAO,EAAU,CAAA,CAAM;;KACzG,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,WAAW,mCAAmC;MAAS,MAAK;MAAc,cAAY,GAAG,MAAM,IAAI,cAAc,OAAO,EAAE,GAAG,EAAE,MAAM;MAAK,iBAAe;MAAG,iBAAe;MAAK,iBAAe;gBAClM,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAM,OAAO,EAAE,OAAO,GAAG,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,OAAO,CAAC,EAAE,GAAG,EAAI,CAAA;KACjE,CAAA;KACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAU;gBAAf,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,WAAW,MAAM,GAAG,EAAE,WAAW,EAAE,KAAK,cAAc,SAAS,EAAE,GAAG,EAAE,WAAW,MAAM,GAAG,cAAc,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,cAAc,SAAS,EAAE,GAAG,EAAE,WAAW,IAAU,CAAA,GAC7L,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,QAAQ,YAAY,OAAO,MAAM,GAAG,EAAE,QAAQ,EAAE,IAAI,YAAY,OAAO,QAAQ,IAAU,CAAA,CAC7F;;IACF;;EACP;EAEA,SAAS,SAAS,EAAE,SAA+C;GACjE,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAU;IAAqB,MAAK;IAAS,cAAY;cAA9D,CAAqE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,CAAO,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,CAAO,CAAA,CAAM;;EACnG;EAEA,SAAgB,YAAY,SAAoC,GAAsB;GACpF,IAAI,YAAY,QAAQ,YAAY,KAAA,KAAa,OAAO,YAAY,YAAY,CAAC,OAAO,SAAS,OAAO,KAAK,WAAW,GAAG,OAAO,EAAE,aAAa;GACjJ,MAAM,CAAC,OAAO,QAAoD,WAAW,QAAQ,UAAU,SAAS,IACpG,CAAC,UAAU,MAAM,KAAK,IACtB,WAAW,MAAM,UAAU,OAAO,IAChC,CAAC,UAAU,IAAI,MAAM,IACrB,CAAC,KAAK,MAAM,OAAO,GAAG,QAAQ;GACpC,IAAI;IACF,OAAO,GAAG,IAAI,KAAK,aAAa,KAAA,GAAW;KAAE,OAAO;KAAQ;KAAM,aAAa;IAAO,CAAC,CAAC,CAAC,OAAO,KAAK,EAAE,GAAG,EAAE,aAAa;GAC3H,QAAQ;IACN,OAAO,GAAG,MAAM,GAAG,EAAE,aAAa;GACpC;EACF;EAEA,SAAgBD,wBAAsB,OAA8B;GAElE,MAAM,UADa,MAAM,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,QAAQ,WAAW,EACxC,CAAC,CAAC,MAAM,yBAAyB;GAC1D,IAAI,YAAY,MAAM,OAAO;GAC7B,MAAM,aAAa,QAAQ,OAAO,MAAM,MAAY,QAAQ,OAAO,MAAM,MAAQ;GACjF,MAAM,SAAS,OAAO,QAAQ,EAAE,IAAI;GACpC,OAAO,OAAO,cAAc,MAAM,KAAK,UAAU,IAAI,SAAS;EAChE;EAEA,SAAgB,cAAc,OAAe,mBAAmB,2BAA0C;GACxG,MAAM,SAASA,wBAAsB,KAAK;GAC1C,OAAO,WAAW,QAAQ,UAAU,mBAAmB,SAAS;EAClE;EAEA,SAASE,iBAAe,OAAuB;GAC7C,IAAI,QAAQ,QAAU,GAAG,OAAO,GAAG,QAAQ,IAAM;GACjD,OAAO,OAAO,KAAK;EACrB;EAEA,SAAS,cAAc,OAA0C;GAC/D,IAAI,UAAU,KAAA,KAAa,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,GAAG,OAAO;GAC1G,IAAI;IACF,OAAO,GAAG,IAAI,KAAK,aAAa,KAAA,GAAW,EAAE,uBAAuB,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,EAAE;GACzF,QAAQ;IACN,OAAO,GAAG,MAAM;GAClB;EACF;EAEA,SAAS,qBAAqB,OAAiE,GAAsB;GACnH,MAAM,QAAQ;IACZ,MAAM,qBAAqB,QAAQ,MAAM,qBAAqB,KAAA,IAAY,GAAG,cAAc,MAAM,gBAAgB,EAAE,GAAG,EAAE,WAAW,MAAM;IACzI,MAAM,UAAU,QAAQ,MAAM,UAAU,KAAA,IAAY,GAAG,EAAE,OAAO,EAAE,IAAI,MAAM,UAAU;IACtF,MAAM,SAAS,QAAQ,MAAM,SAAS,KAAA,IAAY,GAAG,EAAE,MAAM,EAAE,IAAI,MAAM,SAAS;IAClF,MAAM,aAAa,QAAQ,MAAM,aAAa,KAAA,IAAY,GAAG,EAAE,QAAQ,EAAE,IAAI,YAAY,MAAM,QAAQ,MAAM;GAC/G,CAAC,CAAC,QAAQ,SAAyB,SAAS,IAAI;GAChD,OAAO,MAAM,SAAS,IAAI,MAAM,KAAK,KAAK,IAAI,EAAE,SAAS;EAC3D;EAEA,SAASD,aAAW,SAA4C;GAC9D,IAAI,YAAY,KAAA,KAAa,YAAY,QAAQ,OAAO,YAAY,YAAY,CAAC,OAAO,SAAS,OAAO,KAAK,WAAW,GAAG,OAAO;GAClI,MAAM,KAAK,UAAU,OAAiB,UAAU,UAAU;GAC1D,IAAI;IACF,OAAO,IAAI,KAAK,eAAe,KAAA,GAAW;KAAE,WAAW;KAAU,WAAW;IAAQ,CAAC,CAAC,CAAC,OAAO,EAAE;GAClG,QAAQ;IACN,OAAO;GACT;EACF;EAEA,SAAgB,YAAY,SAA4C;GACtE,IAAI,YAAY,KAAA,KAAa,YAAY,QAAQ,OAAO,YAAY,YAAY,CAAC,OAAO,SAAS,OAAO,KAAK,WAAW,GAAG,OAAO;GAClI,MAAM,KAAK,UAAU,OAAiB,UAAU,UAAU;GAC1D,MAAM,WAAWA,aAAW,OAAO;GACnC,MAAM,OAAO,KAAK,KAAK,IAAI;GAC3B,MAAM,MAAM,KAAK,IAAI,IAAI;GACzB,MAAM,CAAC,QAAQ,QAA+C,OAAO,QACjE,CAAC,KAAK,MAAM,OAAO,KAAU,GAAG,KAAK,IACrC,OAAO,OACL,CAAC,KAAK,MAAM,OAAO,IAAS,GAAG,MAAM,IACrC,CAAC,KAAK,MAAM,OAAO,GAAM,GAAG,QAAQ;GAC1C,IAAI;IACF,OAAO,GAAG,SAAS,IAAI,IAAI,KAAK,mBAAmB,KAAA,GAAW,EAAE,SAAS,OAAO,CAAC,CAAC,CAAC,OAAO,QAAQ,IAAI,EAAE;GAC1G,QAAQ;IACN,OAAO;GACT;EACF;EAEA,SAAS,UAAU,OAAwB;GACzC,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;EAC9D;;;EC5qBA,MAAa,KAAK;EA2QlB,MAAaI,iBAAe;GAAE,IAAA;IAxQ5B,OAAO;IACP,OAAO;IACP,SAAS;IACT,WAAW;IACX,UAAU;IACV,MAAM;IACN,WAAW;IACX,SAAS;IACT,SAAS;IACT,gBAAgB;IAChB,oBAAoB;IACpB,kBAAkB;IAClB,eAAe;IACf,oBAAoB;IACpB,iBAAiB;IACjB,qBAAqB;IACrB,mBAAmB;IACnB,gBAAgB;IAChB,qBAAqB;IACrB,QAAQ;IACR,aAAa;IACb,QAAQ;IACR,SAAS;IACT,cAAc;IACd,SAAS;IACT,cAAc;IACd,eAAe;IACf,SAAS;IACT,YAAY;IACZ,UAAU;IACV,iBAAiB;IACjB,WAAW;IACX,UAAU;IACV,gBAAgB;IAChB,SAAS;IACT,SAAS;IACT,QAAQ;IACR,YAAY;IACZ,eAAe;IACf,WAAW;IACX,eAAe;IACf,eAAe;IACf,iBAAiB;IACjB,iBAAiB;IACjB,gBAAgB;IAChB,oBAAoB;IACpB,2BAA2B;IAC3B,cAAc;IACd,eAAe;IACf,wBAAwB;IACxB,mBAAmB;IACnB,iBAAiB;IACjB,cAAc;IACd,UAAU;IACV,cAAc;IACd,iBAAiB;IACjB,qBAAqB;IACrB,cAAc;IACd,iBAAiB;IACjB,eAAe;IACf,kBAAkB;IAClB,sBAAsB;IACtB,aAAa;IACb,gBAAgB;IAChB,iBAAiB;IACjB,aAAa;IACb,gBAAgB;IAChB,oBAAoB;IACpB,mBAAmB;IACnB,qBAAqB;IACrB,iBAAiB;IACjB,sBAAsB;IACtB,uBAAuB;IACvB,2BAA2B;IAC3B,kBAAkB;IAClB,sBAAsB;IACtB,kBAAkB;IAClB,QAAQ;IACR,gBAAgB;IAChB,oBAAoB;IACpB,eAAe;IACf,sBAAsB;IACtB,mBAAmB;IACnB,MAAM;IACN,QAAQ;IACR,YAAY;IACZ,gBAAgB;IAChB,OAAO;IACP,YAAY;IACZ,cAAc;IACd,YAAY;IACZ,SAAS;IACT,gBAAgB;IAChB,OAAO;IACP,SAAS;IACT,SAAS;IACT,WAAW;IACX,aAAa;IACb,MAAM;IACN,WAAW;IACX,WAAW;IACX,aAAa;IACb,WAAW;IACX,SAAS;IACT,cAAc;IACd,cAAc;IACd,oBAAoB;IACpB,gBAAgB;IAChB,kBAAkB;IAClB,uBAAuB;IACvB,iBAAiB;IACjB,qBAAqB;IACrB,OAAO;IACP,WAAW;IACX,QAAQ;IACR,iBAAiB;IACjB,mBAAmB;IACnB,kBAAkB;IAClB,eAAe;IACf,iBAAiB;IACjB,OAAO;IACP,WAAW;IACX,gBAAgB;IAChB,cAAc;IACd,iBAAiB;IACjB,mBAAmB;IACnB,0BAA0B;IAC1B,OAAO;IACP,SAAS;GAwImB;GAAI,IAAA;IApIhC,OAAO;IACP,OAAO;IACP,SAAS;IACT,WAAW;IACX,UAAU;IACV,MAAM;IACN,WAAW;IACX,SAAS;IACT,SAAS;IACT,gBAAgB;IAChB,oBAAoB;IACpB,kBAAkB;IAClB,eAAe;IACf,oBAAoB;IACpB,iBAAiB;IACjB,qBAAqB;IACrB,mBAAmB;IACnB,gBAAgB;IAChB,qBAAqB;IACrB,QAAQ;IACR,aAAa;IACb,QAAQ;IACR,SAAS;IACT,cAAc;IACd,SAAS;IACT,cAAc;IACd,eAAe;IACf,SAAS;IACT,YAAY;IACZ,UAAU;IACV,iBAAiB;IACjB,WAAW;IACX,UAAU;IACV,gBAAgB;IAChB,SAAS;IACT,SAAS;IACT,QAAQ;IACR,YAAY;IACZ,eAAe;IACf,WAAW;IACX,eAAe;IACf,eAAe;IACf,iBAAiB;IACjB,iBAAiB;IACjB,gBAAgB;IAChB,oBAAoB;IACpB,2BAA2B;IAC3B,cAAc;IACd,eAAe;IACf,wBAAwB;IACxB,mBAAmB;IACnB,iBAAiB;IACjB,cAAc;IACd,UAAU;IACV,cAAc;IACd,iBAAiB;IACjB,qBAAqB;IACrB,cAAc;IACd,iBAAiB;IACjB,eAAe;IACf,kBAAkB;IAClB,sBAAsB;IACtB,aAAa;IACb,gBAAgB;IAChB,iBAAiB;IACjB,aAAa;IACb,gBAAgB;IAChB,oBAAoB;IACpB,mBAAmB;IACnB,qBAAqB;IACrB,iBAAiB;IACjB,sBAAsB;IACtB,uBAAuB;IACvB,2BAA2B;IAC3B,kBAAkB;IAClB,sBAAsB;IACtB,kBAAkB;IAClB,QAAQ;IACR,gBAAgB;IAChB,oBAAoB;IACpB,eAAe;IACf,sBAAsB;IACtB,mBAAmB;IACnB,MAAM;IACN,QAAQ;IACR,YAAY;IACZ,gBAAgB;IAChB,OAAO;IACP,YAAY;IACZ,cAAc;IACd,YAAY;IACZ,SAAS;IACT,gBAAgB;IAChB,OAAO;IACP,SAAS;IACT,SAAS;IACT,WAAW;IACX,aAAa;IACb,MAAM;IACN,WAAW;IACX,WAAW;IACX,aAAa;IACb,WAAW;IACX,SAAS;IACT,cAAc;IACd,cAAc;IACd,oBAAoB;IACpB,gBAAgB;IAChB,kBAAkB;IAClB,uBAAuB;IACvB,iBAAiB;IACjB,qBAAqB;IACrB,OAAO;IACP,WAAW;IACX,QAAQ;IACR,iBAAiB;IACjB,mBAAmB;IACnB,kBAAkB;IAClB,eAAe;IACf,iBAAiB;IACjB,OAAO;IACP,WAAW;IACX,gBAAgB;IAChB,cAAc;IACd,iBAAiB;IACjB,mBAAmB;IACnB,0BAA0B;IAC1B,OAAO;IACP,SAAS;GAIuB;EAAG;;;EC3QrC,MAAMC,aAAW;EAEjB,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2GZ,SAAgB,gBAA4B;GAC1C,IAAI,SAAS,cAAc,0BAA0BA,WAAS,GAAG,MAAM,MAAM,aAAa,KAAA;GAC1F,MAAM,UAAU,SAAS,cAAc,OAAO;GAC9C,QAAQ,QAAQ,SAAS;GACzB,QAAQ,QAAQ,YAAYA;GAC5B,QAAQ,cAAc;GACtB,SAAS,KAAK,YAAY,OAAO;GACjC,aAAa,QAAQ,OAAO;EAC9B;;;ECrHA,MAAa,iBAAiB;EAE9B,MAAa,KAAK;GAChB,OAAO;GACP,UAAU;GACV,SAAS;GACT,UAAU;GACV,WAAW;GACX,MAAM;GACN,WAAW;GACX,SAAS;GACT,SAAS;GACT,eAAe;GACf,aAAa;GACb,cAAc;GACd,SAAS;GACT,QAAQ;GACR,WAAW;GACX,YAAY;GACZ,UAAU;GACV,eAAe;GACf,iBAAiB;GACjB,WAAW;GACX,UAAU;GACV,YAAY;GACZ,WAAW;GACX,aAAa;GACb,UAAU;GACV,wBAAwB;GACxB,4BAA4B;GAC5B,mBAAmB;GACnB,sBAAsB;GACtB,mBAAmB;GACnB,MAAM;GACN,OAAO;GACP,QAAQ;GACR,cAAc;GACd,WAAW;GACX,cAAc;GACd,iBAAiB;GACjB,aAAa;GACb,kBAAkB;GAClB,UAAU;GACV,aAAa;GACb,aAAa;GACb,SAAS;GACT,WAAW;GACX,SAAS;GACT,aAAa;GACb,QAAQ;EACV;EAEA,MAAa,KAAK;GAChB,OAAO;GACP,UAAU;GACV,SAAS;GACT,UAAU;GACV,WAAW;GACX,MAAM;GACN,WAAW;GACX,SAAS;GACT,SAAS;GACT,eAAe;GACf,aAAa;GACb,cAAc;GACd,SAAS;GACT,QAAQ;GACR,WAAW;GACX,YAAY;GACZ,UAAU;GACV,eAAe;GACf,iBAAiB;GACjB,WAAW;GACX,UAAU;GACV,YAAY;GACZ,WAAW;GACX,aAAa;GACb,UAAU;GACV,wBAAwB;GACxB,4BAA4B;GAC5B,mBAAmB;GACnB,sBAAsB;GACtB,mBAAmB;GACnB,MAAM;GACN,OAAO;GACP,QAAQ;GACR,cAAc;GACd,WAAW;GACX,cAAc;GACd,iBAAiB;GACjB,aAAa;GACb,kBAAkB;GAClB,UAAU;GACV,aAAa;GACb,aAAa;GACb,SAAS;GACT,WAAW;GACX,SAAS;GACT,aAAa;GACb,QAAQ;EACV;EAEA,MAAa,eAAe;GAC1B;GACA,SAAS;GACT;GACA,SAAS;EACX;;;ECvGA,MAAMC,QAAM;EAOZ,eAAeC,WAAY,MAAc,SAAmC;GAC1E,MAAM,MAAM,MAAM,MAAM,GAAGD,QAAM,QAAQ;IACvC,GAAG;IACH,SAAS;KACP,gBAAgB;KAChB,GAAG,SAAS;IACd;GACF,CAAC;GACD,MAAM,OAAQ,MAAM,IAAI,KAAK;GAC7B,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK,IACnB,MAAM,IAAI,MAAM,KAAK,SAAS,QAAQ,IAAI,QAAQ;GAEpD,OAAO,KAAK;EACd;EAEA,SAAgB,sBAAsB,OAA8B;GAElE,MAAM,UADa,MAAM,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,QAAQ,WAAW,EACxC,CAAC,CAAC,MAAM,yBAAyB;GAC1D,IAAI,YAAY,MAAM,OAAO;GAC7B,MAAM,aAAa,QAAQ,OAAO,MAAM,MAAY,QAAQ,OAAO,MAAM,MAAQ;GACjF,MAAM,SAAS,OAAO,QAAQ,EAAE,IAAI;GACpC,OAAO,OAAO,cAAc,MAAM,KAAK,UAAU,IAAI,SAAS;EAChE;EAEA,SAAgB,eAAe,OAAuB;GACpD,IAAI,SAAS,OAAa,QAAQ,QAAY,GAAG,OAAO,GAAG,QAAQ,IAAU;GAC7E,IAAI,QAAQ,QAAU,GAAG,OAAO,GAAG,QAAQ,IAAM;GACjD,OAAO,OAAO,KAAK;EACrB;EAEA,SAAS,gBAAgB,WAA4B;GACnD,IAAI,CAAC,WAAW,OAAO;GACvB,MAAM,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,QAAQ,IAAI,KAAK,IAAI;GACtD,IAAI,QAAQ,GAAG,OAAO;GACtB,MAAM,OAAO,KAAK,MAAM,OAAO,GAAK;GACpC,MAAM,QAAQ,KAAK,MAAM,OAAO,EAAE;GAClC,MAAM,OAAO,KAAK,MAAM,QAAQ,EAAE;GAClC,IAAI,OAAO,GAAG,OAAO,GAAG,KAAK,IAAI,QAAQ,GAAG;GAC5C,IAAI,QAAQ,GAAG,OAAO,GAAG,MAAM,IAAI,OAAO,GAAG;GAC7C,OAAO,GAAG,KAAK;EACjB;EAEA,SAAS,WAAW,IAAqB;GACvC,IAAI,CAAC,MAAM,MAAM,GAAG,OAAO;GAC3B,IAAI;IACF,OAAO,IAAI,KAAK,eAAe,KAAA,GAAW;KAAE,WAAW;KAAU,WAAW;IAAQ,CAAC,CAAC,CAAC,OAAO,EAAE;GAClG,QAAQ;IACN,OAAO;GACT;EACF;EAEA,SAAgB,mBAAmB,EAAE,eAAe,sBAAiD;GACnG,MAAM,CAAC,QAAQ,cAAA,GAAA,MAAA,SAAA,CAAmD,IAAI;GACtE,MAAM,CAAC,SAAS,eAAA,GAAA,MAAA,SAAA,CAAuB,IAAI;GAC3C,MAAM,CAAC,MAAM,YAAA,GAAA,MAAA,SAAA,CAAmC,IAAI;GACpD,MAAM,CAAC,OAAO,aAAA,GAAA,MAAA,SAAA,CAAoC,IAAI;GACtD,MAAM,CAAC,eAAe,qBAAA,GAAA,MAAA,SAAA,CAAqD,CAAC,CAAC;GAC7E,MAAM,CAAC,aAAa,mBAAA,GAAA,MAAA,SAAA,CAA0C,IAAI;GAElE,MAAM,IAAI;GAEV,MAAM,gBAAA,GAAA,MAAA,YAAA,OAAiC;IACrC,gBAAgB;IAChB,qBAAqB;GACvB,GAAG,CAAC,eAAe,kBAAkB,CAAC;GAEtC,MAAM,cAAA,GAAA,MAAA,YAAA,CAAyB,OAAO,QAAQ,UAAU;IACtD,IAAI,CAAC,OAAO,SAAS,IAAI;IACzB,IAAI;KACF,MAAM,OAAO,MAAMC,WAA+B,SAAS;KAC3D,UAAU,IAAI;KAEd,MAAM,SAAiC,CAAC;KACxC,KAAK,MAAM,KAAK,KAAK,QAAQ;MAC3B,MAAM,MAAM,KAAK,uBAAuB,EAAE,OAAO,EAAE;MACnD,OAAO,EAAE,MAAM,eAAe,GAAG;KACnC;KACA,iBAAiB,MAAM;IACzB,SAAS,KAAK;KACZ,IAAI,CAAC,OAAO,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;IACvE,UAAU;KACR,WAAW,KAAK;IAClB;GACF,GAAG,CAAC,CAAC;GAEL,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,WAAgB;IAChB,MAAM,2BAA2B;KAC/B,IAAI,SAAS,oBAAoB,WAAW,WAAgB,IAAI;IAClE;IACA,SAAS,iBAAiB,oBAAoB,kBAAkB;IAChE,MAAM,QAAQ,OAAO,YAAY,oBAAoB,GAAM;IAC3D,aAAa;KACX,OAAO,cAAc,KAAK;KAC1B,SAAS,oBAAoB,oBAAoB,kBAAkB;IACrE;GACF,GAAG,CAAC,UAAU,CAAC;GAEf,MAAM,cAAc,YAAY;IAC9B,IAAI;KACF,QAAQ,OAAO;KACf,SAAS,IAAI;KACb,MAAM,OAAO,MAAMA,WAAgD,UAAU,EAAE,QAAQ,OAAO,CAAC;KAC/F,IAAI,KAAK,SACP,OAAO,KAAK,KAAK,SAAS,QAAQ;KAEpC,MAAM,YAAY,YAAY,YAAY;MACxC,IAAI;OACF,MAAM,aAAa,MAAMA,WAA6B,eAAe;OACrE,IAAI,WAAW,WAAW,YAAY;QACpC,cAAc,SAAS;QACvB,QAAQ,IAAI;QACZ,MAAM,WAAW;QACjB,aAAa;OACf,OAAO,IAAI,WAAW,WAAW,SAAS;QACxC,cAAc,SAAS;QACvB,QAAQ,IAAI;QACZ,SAAS,EAAE,WAAW;OACxB;MACF,QAAQ,CAER;KACF,GAAG,IAAI;KAEP,iBAAiB;MACf,cAAc,SAAS;MACvB,QAAQ,IAAI;KACd,GAAG,MAAS,GAAI;IAClB,SAAS,KAAK;KACZ,QAAQ,IAAI;KACZ,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;IAC3D;GACF;GAEA,MAAM,qBAAqB,YAAY;IACrC,IAAI;KACF,QAAQ,OAAO;KACf,SAAS,IAAI;KACb,MAAM,UAAU,MAAMA,WAA+B,UAAU,EAAE,QAAQ,OAAO,CAAC;KACjF,UAAU,OAAO;IACnB,SAAS,KAAK;KACZ,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;IAC3D,UAAU;KACR,QAAQ,IAAI;IACd;GACF;GAEA,MAAM,eAAe,YAAY;IAC/B,IAAI;KACF,QAAQ,QAAQ;KAChB,SAAS,IAAI;KACb,MAAM,UAAU,MAAMA,WAA+B,WAAW,EAAE,QAAQ,OAAO,CAAC;KAClF,UAAU,OAAO;KACjB,aAAa;IACf,SAAS,KAAK;KACZ,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;IAC3D,UAAU;KACR,QAAQ,IAAI;IACd;GACF;GAEA,MAAM,cAAc,OAAO,SAAiB,YAAqB;IAC/D,IAAI,CAAC,QAAQ;IACb,MAAM,iBAAiB,OAAO,OAAO,QAAQ,MAAM,EAAE,OAAO,CAAC,CAAC,KAAK,MAAM,EAAE,EAAE;IAC7E,MAAM,cAAc,UAChB,CAAC,mBAAG,IAAI,IAAI,CAAC,GAAG,gBAAgB,OAAO,CAAC,CAAC,IACzC,eAAe,QAAQ,OAAO,OAAO,OAAO;IAEhD,IAAI,YAAY,WAAW,GAAG;IAE9B,IAAI;KACF,MAAM,UAAU,MAAMA,WAA+B,WAAW;MAC9D,QAAQ;MACR,MAAM,KAAK,UAAU,EAAE,iBAAiB,YAAY,CAAC;KACvD,CAAC;KACD,UAAU,OAAO;KACjB,aAAa;IACf,SAAS,KAAK;KACZ,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;IAC3D;GACF;GAEA,MAAM,eAAe,OAAO,cAAuB;IACjD,IAAI,CAAC,QAAQ;IACb,MAAM,cAAc,YAAY,OAAO,OAAO,KAAK,MAAM,EAAE,EAAE,IAAI,CAAC,OAAO,OAAO,EAAE,CAAC,EAAE;IACrF,IAAI;KACF,MAAM,UAAU,MAAMA,WAA+B,WAAW;MAC9D,QAAQ;MACR,MAAM,KAAK,UAAU,EAAE,iBAAiB,YAAY,CAAC;KACvD,CAAC;KACD,UAAU,OAAO;KACjB,aAAa;IACf,SAAS,KAAK;KACZ,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;IAC3D;GACF;GAEA,MAAM,qBAAqB,OAAO,WAA6C;IAC7E,IAAI;KACF,MAAM,UAAU,MAAMA,WAA+B,aAAa;MAChE,QAAQ;MACR,MAAM,KAAK,UAAU,EAAE,wBAAwB,OAAO,CAAC;KACzD,CAAC;KACD,UAAU,OAAO;KACjB,aAAa;IACf,SAAS,KAAK;KACZ,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;IAC3D;GACF;GAEA,MAAM,0BAA0B,OAAO,YAAoB;IACzD,MAAM,MAAM,cAAc,YAAY;IACtC,MAAM,SAAS,sBAAsB,GAAG;IACxC,IAAI,WAAW,MAAM;KACnB,SAAS,cAAc,KAAK;KAC5B;IACF;IAEA,IAAI;KACF,eAAe,OAAO;KACtB,SAAS,IAAI;KACb,MAAM,UAAU,MAAMA,WAA+B,aAAa;MAChE,QAAQ;MACR,MAAM,KAAK,UAAU,EACnB,wBAAwB,GACrB,UAAU,OACb,EACF,CAAC;KACH,CAAC;KACD,UAAU,OAAO;KACjB,kBAAkB,UAAU;MAAE,GAAG;OAAO,UAAU,eAAe,MAAM;KAAE,EAAE;KAC3E,aAAa;IACf,SAAS,KAAK;KACZ,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;IAC3D,UAAU;KACR,eAAe,IAAI;IACrB;GACF;GAEA,IAAI,SACF,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;IAAK,WAAU;cACb,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;KAAK,WAAU;eAAc,EAAE;IAAa,CAAA;GACzC,CAAA;GAIT,MAAM,QAAQ,QAAQ;GACtB,MAAM,SAAS,OAAO,UAAU,CAAC;GACjC,MAAM,eAAe,QAAQ,OAAO,QAAQ,MAAM,EAAE,OAAO,CAAC,CAAC,UAAU;GAEvE,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAU;cAAf;KAEE,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;MAAS,WAAU;gBAAnB;OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;QAAK,WAAU;kBACb,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,QAAQ,gBAAgB,EAAE,UAAU,EAAE,UAAc,CAAA;OACtD,CAAA;OACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAU;kBAAf,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;SAAM,WAAU;mBAAc,QAAQ,gBAAgB,EAAE,WAAW,EAAE;QAAgB,CAAA,GACrF,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;SAAM,WAAU;mBAAc,QAAQ,SAAS;QAAU,CAAA,CACtD;;OACJ,QAAQ,iBACP,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;QACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;SAAK,WAAU;mBAAf,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UAAM,WAAU;oBAAc,EAAE;SAAW,CAAA,GAC3C,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UAAM,WAAU;oBAAc,OAAO,aAAa;SAAwB,CAAA,CACvE;;QACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;SAAK,WAAU;mBAAf,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UAAM,WAAU;oBAAc,EAAE;SAAgB,CAAA,GAChD,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UAAM,WAAU;oBAAc,OAAO,aAAa;SAA4B,CAAA,CAC3E;;QACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;SAAK,WAAU;mBAAf,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UAAM,WAAU;oBAAc,EAAE;SAAc,CAAA,GAC9C,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UAAM,WAAU;oBAAc,WAAW,KAAK,IAAI,IAAI,QAAW,EAAE;SAAQ,CAAA,CACxE;;OACL,EAAA,CAAA;OAEJ,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAU;kBAAf,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;SAAM,WAAU;mBAAc,EAAE;QAAc,CAAA,GAC9C,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;SAAM,WAAU;mBAAa;QAAmB,CAAA,CAC7C;;OACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAG,WAAU;kBAAe,EAAE;OAAiB,CAAA;OAE/C,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;QAAK,WAAU;kBACZ,CAAC,QAAQ,gBACR,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,WAAU;SAA4B,UAAU,SAAS;SAAM,SAAS;mBAC7E,SAAS,UAAU,EAAE,YAAY,EAAE;QAC9B,CAAA,IAER,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;SACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;UAAQ,WAAU;UAA4B,UAAU,SAAS;UAAM,SAAS;oBAC7E,EAAE;SACG,CAAA;SACR,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;UAAQ,WAAU;UAAW,UAAU,SAAS;UAAM,SAAS;oBAC5D,SAAS,UAAU,EAAE,kBAAkB,EAAE;SACpC,CAAA;SACR,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;UAAQ,WAAU;UAAW,UAAU,SAAS;UAAM,SAAS;oBAC5D,EAAE;SACG,CAAA;QACR,EAAA,CAAA;OAED,CAAA;MACE;;KAGT,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;MAAS,WAAU;gBAAnB;OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;QAAK,WAAU;kBACb,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,EAAE,WAAe,CAAA;OACnB,CAAA;OACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAU;kBAAf,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;SAAM,WAAU;mBAAc,EAAE;QAAe,CAAA,GAC/C,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;SAAM,WAAU;mBAAc,EAAE;QAAoB,CAAA,CACjD;;OACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAU;kBAAf,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;SAAM,WAAU;mBAAc,EAAE;QAAsB,CAAA,GACtD,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;SAAM,WAAU;mBAAc,QAAQ,gBAAgB,EAAE,YAAY,EAAE;QAAe,CAAA,CAClF;;OAEL,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAG,WAAU;kBAA+B,EAAE;OAAc,CAAA;OAG5D,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;QAAK,WAAU;QAAc,cAAW;kBACrC,QAAQ,OAAO,KAAK,UAAU;SAC7B,MAAM,UAAU,MAAM;SACtB,MAAM,cAAc,WAAW,iBAAiB;SAChD,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;UAAsB,OAAO,MAAM;oBAAnC,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;WACE,MAAK;WACI;WACT,UAAU,SAAS,QAAQ;WAC3B,WAAW,MAAM,KAAK,YAAY,MAAM,IAAI,EAAE,cAAc,OAAO;UACpE,CAAA,GACD,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,MAAM,KAAW,CAAA,CACnB;YARK,MAAM,EAQX;QAEX,CAAC;OACE,CAAA;OAEL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAU;kBAAf,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,WAAU;SAAW,UAAU,SAAS;SAAM,eAAe,aAAa,IAAI;mBACnF,EAAE;QACG,CAAA,GACR,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,WAAU;SAAW,UAAU,SAAS;SAAM,eAAe,aAAa,KAAK;mBACpF,EAAE;QACG,CAAA,CACL;;MACE;;KAGT,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;MAAS,WAAU;gBAAnB,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAAK,WAAU;iBACb,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,EAAE,SAAa,CAAA;MACjB,CAAA,GACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,WAAU;iBAAf,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,EAAE,uBAA+B,CAAA,GAC1C,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAG,WAAU;kBAAc,EAAE;OAA8B,CAAA,CACxD,EAAA,CAAA,GACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;QACE,WAAU;QACV,cAAY,EAAE;QACd,OAAO,QAAQ,0BAA0B;QACzC,UAAU,SAAS;QACnB,WAAW,MAAM;SACf,MAAM,MAAM,EAAE,cAAc;SAC5B,mBAAwB,QAAQ,KAAK,OAAQ,GAAiC;QAChF;kBARF;SAUE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;UAAQ,OAAM;oBAAI,EAAE;SAA0B,CAAA;SAC9C,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;UAAQ,OAAM;oBAAM;SAAW,CAAA;SAC/B,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;UAAQ,OAAM;oBAAS;SAAc,CAAA;SACrC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;UAAQ,OAAM;oBAAO;SAAY,CAAA;QAC3B;SACL;QACE;;KAGT,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;MAAS,WAAU;gBAAnB;OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;QAAK,WAAU;kBACb,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,EAAE,qBAAyB,CAAA;OAC7B,CAAA;OACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAG,WAAU;kBAAc,EAAE;OAAqB,CAAA;OAElD,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;QAAK,WAAU;kBACZ,QAAQ,OAAO,KAAK,UACnB,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;SAAoB,WAAU;mBAA9B,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,MAAM,KAAW,CAAA,GACxB,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;UAAK,WAAU;oBAAf;WACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;YACE,MAAK;YACL,OAAO,cAAc,MAAM,OAAO;YAClC,WAAW,MAAM,iBAAiB;aAAE,GAAG;cAAgB,MAAM,KAAK,EAAE,OAAO;YAAM,CAAC;YAClF,YAAY,MAAM;aAChB,IAAI,EAAE,QAAQ,SAAS,wBAA6B,MAAM,EAAE;YAC9D;WACD,CAAA;WACD,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQ,EAAE,OAAc,CAAA;WACxB,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;YACE,MAAK;YACL,WAAU;YACV,UAAU,gBAAgB,MAAM;YAChC,eAAe,KAAK,wBAAwB,MAAM,EAAE;sBAEnD,gBAAgB,MAAM,KAAK,EAAE,SAAS,EAAE;WACnC,CAAA;UACL;WACF;WArBK,MAAM,EAqBX,CACN;OACE,CAAA;MACE;;KAGT,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;MAAS,WAAU;gBAAnB;OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAU;kBAAf,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,EAAE,aAAiB,CAAA,GACxB,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SACE,WAAU;SACV,UAAU,SAAS,QAAQ,CAAC,QAAQ;SACpC,SAAS;mBAER,SAAS,UAAU,EAAE,kBAAkB,EAAE;QACpC,CAAA,CACL;;OACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAG,WAAU;kBAAc,EAAE;OAAa,CAAA;OAEzC,CAAC,QAAQ,gBACR,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;QAAK,WAAU;kBAAc,EAAE;OAAe,CAAA,IAC5C,OAAO,WAAW,IACpB,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;QAAK,WAAU;kBAAa;OAAsB,CAAA,IAElD,OAAO,KAAK,OAAO,SACjB,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAgB,WAAU;kBAA1B,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;SAAK,WAAU;mBAAf,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,MAAM,YAAoB,CAAA,GAClC,MAAM,eAAe,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,MAAM,YAAkB,CAAA,CAClD;YAEJ,MAAM,QAAQ,KAAK,QAAQ,SAAS;SACnC,MAAM,SAAS,iBAAiB,KAAK,MAAM,WAAW;SACtD,MAAM,MAAM,KAAK,MAAM,OAAO,oBAAoB,GAAG;SACrD,MAAM,YAAY,gBAAgB,OAAO,SAAS;SAClD,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;UAAgB,WAAU;oBAA1B;WACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;YAAK,WAAU;sBAAf,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,OAAO,YAAkB,CAAA,GAChC,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD,EAAA,UAAA,CAAS,KAAI,MAAY,EAAA,CAAA,CACtB;;WACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;YAAK,WAAW,cAAc,SAAS,oBAAoB;sBACzD,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAM,OAAO,EAAE,OAAO,GAAG,IAAI,GAAG,EAAI,CAAA;WACjC,CAAA;WACJ,aACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;YAAK,WAAU;sBACb,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD,EAAA,UAAA,CAAM,QAAK,SAAgB,EAAA,CAAA;WACxB,CAAA;UAEJ;YAbK,IAaL;QAET,CAAC,CACE;UA3BK,IA2BL,CACN;OAGF,OAAO,aACN,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAU;kBAAf,CAAgC,UACvB,IAAI,KAAK,MAAM,SAAS,CAAC,CAAC,eAAe,CAC7C;;MAEA;;KAER,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,WAAU;gBAAc;KAAW,CAAA;IAC/C;;EAET;;;ECreA,MAAa,WAAW;EAExB,SAAgB,2BAAiC;GAC/C,IAAI,OAAO,aAAa,eAAe,SAAS,eAAA,gCAAuB,GAAG;GAC1E,MAAM,QAAQ,SAAS,cAAc,OAAO;GAC5C,MAAM,KAAK;GACX,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2DpB,SAAS,KAAK,OAAO,KAAK;EAC5B;;;EC3DA,MAAM,MAAM;EAEZ,eAAe,SAAY,MAAc,SAAmC;GAC1E,MAAM,MAAM,MAAM,MAAM,GAAG,MAAM,QAAQ;IACvC,GAAG;IACH,SAAS;KACP,gBAAgB;KAChB,GAAG,SAAS;IACd;GACF,CAAC;GACD,MAAM,OAAQ,MAAM,IAAI,KAAK;GAC7B,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK,IACnB,MAAM,IAAI,MAAM,KAAK,SAAS,QAAQ,IAAI,QAAQ;GAEpD,OAAO,KAAK;EACd;EAQA,SAAS,0BAA0B,QAAiC,SAAkB;GACpF,IAAI,CAAC,UAAU,OAAO,WAAW,GAAG,OAAO;GAC3C,MAAM,gBAAgB,UAAU,cAAc,KAAK,OAAO,IAAI;GAC9D,MAAM,cACJ,OAAO,MAAM,MAAM;IACjB,MAAM,QAAQ,iBAAiB,KAAK,EAAE,WAAW;IACjD,OAAO,gBAAgB,QAAQ,CAAC;GAClC,CAAC,KAAK,OAAO;GAEf,IAAI,CAAC,eAAe,CAAC,YAAY,WAAW,YAAY,QAAQ,WAAW,GAAG,OAAO;GACrF,MAAM,cACJ,YAAY,QAAQ,MAAM,MAA8B,kBAAkB,KAAK,EAAE,WAAW,CAAC,KAAK,YAAY,QAAQ;GAExH,OAAO;IACL,WAAW,YAAY;IACvB,YAAY,YAAY;IACxB,kBAAkB,KAAK,MAAM,YAAY,oBAAoB,GAAG;IAChE,WAAW,YAAY;GACzB;EACF;EAEA,SAAS,qBAAqB,WAA4B;GACxD,IAAI,CAAC,WAAW,OAAO;GACvB,IAAI;IACF,MAAM,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,QAAQ,IAAI,KAAK,IAAI;IACtD,IAAI,QAAQ,GAAG,OAAO;IACtB,MAAM,IAAI,KAAK,MAAM,OAAO,IAAO;IACnC,MAAM,IAAI,KAAK,MAAO,OAAO,OAAW,GAAK;IAC7C,IAAI,IAAI,GAAG,OAAO,GAAG,EAAE,IAAI,EAAE;IAC7B,OAAO,GAAG,EAAE;GACd,QAAQ;IACN,OAAO;GACT;EACF;EAEA,SAAgB,yBAAyB,EAAE,WAAW,sBAAuD;GAC3G,MAAM,aAAa,SAAS,SAAS;GACrC,MAAM,CAAC,QAAQ,cAAA,GAAA,MAAA,SAAA,CAAmD,IAAI;GACtE,MAAM,CAAC,SAAS,eAAA,GAAA,MAAA,SAAA,CAAuB,KAAK;GAC5C,MAAM,cAAA,GAAA,MAAA,OAAA,CAAoB,KAAK;GAC/B,MAAM,WAAW,WAAW;GAC5B,MAAM,gBAAgB,UAAU,aAAa;GAE7C,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,mBAAmB;GACrB,GAAG,CAAC,kBAAkB,CAAC;GAEvB,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,WAAW,UAAU;IACrB,aAAa;KACX,WAAW,UAAU;IACvB;GACF,GAAG,CAAC,CAAC;GAEL,MAAM,eAAA,GAAA,MAAA,YAAA,CAA0B,OAAO,UAAU,UAAU;IACzD,IAAI,CAAC,WAAW,SAAS;IACzB,WAAW,IAAI;IACf,IAAI;KACF,MAAM,OAAO,UACT,MAAM,SAA+B,UAAU,EAAE,QAAQ,OAAO,CAAC,IACjE,MAAM,SAA+B,SAAS;KAClD,IAAI,WAAW,SAAS,UAAU,IAAI;IACxC,QAAQ,CAER,UAAU;KACR,IAAI,WAAW,SAAS,WAAW,KAAK;IAC1C;GACF,GAAG,CAAC,CAAC;GAEL,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,CAAC,eAAe;IACpB,YAAiB,KAAK;IACtB,MAAM,QAAQ,OAAO,kBAAkB;KACrC,IAAI,SAAS,oBAAoB,WAAW,YAAiB,KAAK;IACpE,GAAG,GAAM;IACT,aAAa;KACX,OAAO,cAAc,KAAK;IAC5B;GACF,GAAG,CAAC,aAAa,aAAa,CAAC;GAE/B,MAAM,aAAA,GAAA,MAAA,QAAA,OAA0B;IAE9B,OAAO,0BADQ,QAAQ,OAAO,UAAU,CAAC,GACA,UAAU,KAAK;GAC1D,GAAG,CAAC,QAAQ,OAAO,QAAQ,UAAU,KAAK,CAAC;GAE3C,IAAI,CAAC,iBAAiB,CAAC,QAAQ,eAAe,OAAO;GAErD,MAAM,QACJ,cAAc,OACV,WACA,UAAU,oBAAoB,IAC5B,WACA,UAAU,oBAAoB,KAC5B,YACA;GAEV,MAAM,YAAY,WAAW,YAAY,qBAAqB,UAAU,SAAS,IAAI;GACrF,MAAM,UAAU,YACZ,iBAAiB,UAAU,UAAU,KAAK,UAAU,WAAW,OAAO,UAAU,iBAAiB,GAAG,YAAY,OAAO,YAAY,MAAM,GAAG,SAC5I;GAEJ,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;IACE,WAAU;IACV,cAAY;IACZ,OAAO;IACP,cAAY;IACZ,eAAe,KAAK,YAAY,IAAI;cALtC,CAOE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;KAAM,WAAU;eAA4B;IAAQ,CAAA,GACpD,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;KAAQ,WAAU;eACf,UAAU,MAAM,cAAc,OAAO,MAAM,GAAG,UAAU,iBAAiB;IACpE,CAAA,CACJ;;EAEV;EAEA,SAAS,SAAY,OAA4B;GAC/C,QAAA,GAAA,MAAA,qBAAA,EACG,aAAa,MAAM,UAAU,QAAQ,SAChC,MAAM,YAAY,SAClB,MAAM,YAAY,CAC1B;EACF;;;ECzJA,MAAM,iCAAiB,IAAI,IAAI;GAC7B;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACF,CAAC;EAED,SAAgB,YAAY,KAAqB;GAC/C,IAAI,OAAO,cAAc,eAAe,OAAO,kBAAkB,aAAa,OAAO;GACrF,IAAI;GACJ,IAAI;IACF,MAAM,IAAI,UAAU,CAAC,CAAC,gBAAgB,KAAK,eAAe;GAC5D,QAAQ;IACN,OAAO;GACT;GACA,IAAI,IAAI,cAAc,aAAa,MAAM,MAAM,OAAO;GACtD,IAAI,IAAI,oBAAoB,QAAQ,IAAI,gBAAgB,cAAc,OAAO,OAAO;GACpF,IAAI,iBAAiB,GAAG,CAAC,CAAC,SAAS,SAAS;IAC1C,IAAI,eAAe,IAAI,KAAK,UAAU,YAAY,CAAC,GAAG;KACpD,KAAK,OAAO;KACZ;IACF;IACA,KAAK,MAAM,aAAa,CAAC,GAAG,KAAK,UAAU,GAAG;KAC5C,MAAM,OAAO,UAAU;KACvB,MAAM,aAAa,KAAK,YAAY;KACpC,IAAI,WAAW,WAAW,GAAG,KAAK,WAAW,WAAW,IAAI,GAAG;MAC7D,KAAK,gBAAgB,IAAI;MACzB;KACF;KACA,IAAI,eAAe,UAAU,eAAe,cAC1C,KAAK,gBAAgB,IAAI;IAE7B;GACF,CAAC;GACD,OAAO,IAAI,cAAc,CAAC,CAAC,kBAAkB,IAAI,eAAe;EAClE;;;EC7CA,MAAa,mBAAmB;EAEhC,SAAgB,uBAA6B;GAC3C,IAAI,OAAO,aAAa,eAAe,SAAS,eAAA,4BAA+B,GAAG;GAClF,MAAM,QAAQ,SAAS,cAAc,OAAO;GAC5C,MAAM,KAAK;GACX,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;GAoBpB,SAAS,KAAK,OAAO,KAAK;EAC5B;;;ECnBA,IAAI,aAAa;EACjB,IAAI,iBAAoD;EACxD,MAAM,iCAAiB,IAAI,QAAqB;EAEhD,SAAS,cAA0C;GACjD,IAAI,OAAO,WAAW,aAAa,OAAO,QAAQ,QAAQ,IAAI;GAC9D,MAAM,WAAY,OAA+C;GACjE,IAAI,UAAU,OAAO,QAAQ,QAAQ,QAAQ;GAC7C,IAAI,gBAAgB,OAAO;GAE3B,iBAAiB,IAAI,SAAS,YAAY;IACxC,MAAM,UAAW,OAA+C;IAChE,IAAI,SAAS;KACX,QAAQ,OAAO;KACf;IACF;IAEA,MAAM,SAAS,SAAS,cAAc,QAAQ;IAC9C,OAAO,MAAM;IACb,OAAO,QAAQ;IACf,OAAO,eAAe;KACpB,QAAS,OAA+C,WAAW,IAAI;IACzE;IACA,OAAO,gBAAgB;KACrB,MAAM,MAAM,SAAS,cAAc,QAAQ;KAC3C,IAAI,MAAM;KACV,IAAI,QAAQ;KACZ,IAAI,eAAe,QAAS,OAA+C,WAAW,IAAI;KAC1F,IAAI,gBAAgB,QAAQ,IAAI;KAChC,SAAS,KAAK,YAAY,GAAG;IAC/B;IACA,SAAS,KAAK,YAAY,MAAM;GAClC,CAAC;GAED,OAAO;EACT;EAEA,SAAS,cAAuB;GAC9B,IAAI,OAAO,aAAa,aAAa,OAAO;GAC5C,MAAM,OAAO,SAAS;GACtB,OACE,KAAK,UAAU,SAAS,MAAM,KAC9B,KAAK,aAAa,YAAY,MAAM,UACpC,KAAK,aAAa,iBAAiB,MAAM,UACzC,OAAO,WAAW,8BAA8B,CAAC,CAAC;EAEtD;EAEA,eAAe,oBAAgD;GAC7D,MAAM,IAAI,MAAM,YAAY;GAC5B,IAAI,CAAC,GAAG,OAAO;GACf,IAAI;IACF,EAAE,WAAW;KACX,aAAa;KACb,eAAe;KACf,YAAY;KACZ,OAAO,YAAY,IAAI,SAAS;KAChC,YAAY;IACd,CAAC;GACH,QAAQ,CAER;GACA,OAAO;EACT;EAEA,SAAS,cAAc,SAAuB;GAC5C,MAAM,UAAU,SAAS,cAAc,KAAK;GAC5C,QAAQ,YAAY;GAEpB,IAAI,QAAQ;GAEZ,QAAQ,YAAY;;;;;;;;gDAQ0B,QAAQ;;;GAItD,MAAM,QAAQ,QAAQ,cAAc,6BAA6B;GACjE,MAAM,wBAAwB;IAC5B,IAAI,OAAO,MAAM,MAAM,YAAY,SAAS,MAAM;GACpD;GAEA,QAAQ,iBAAiB,UAAU,MAAM;IACvC,MAAM,SAAS,EAAE;IACjB,MAAM,SAAS,QAAQ,aAAa,aAAa;IACjD,IAAI,WAAW,WAAW,WAAW,SAAS;KAC5C,QAAQ,OAAO;KACf,SAAS,oBAAoB,WAAW,SAAS;IACnD,OAAO,IAAI,WAAW,WAAW;KAC/B,QAAQ,KAAK,IAAI,GAAG,QAAQ,IAAI;KAChC,gBAAgB;IAClB,OAAO,IAAI,WAAW,YAAY;KAChC,QAAQ,KAAK,IAAI,IAAK,QAAQ,IAAI;KAClC,gBAAgB;IAClB,OAAO,IAAI,WAAW,SAAS;KAC7B,QAAQ;KACR,gBAAgB;IAClB;GACF,CAAC;GAED,MAAM,aAAa,MAAqB;IACtC,IAAI,EAAE,QAAQ,UAAU;KACtB,QAAQ,OAAO;KACf,SAAS,oBAAoB,WAAW,SAAS;IACnD;GACF;GACA,SAAS,iBAAiB,WAAW,SAAS;GAE9C,SAAS,KAAK,YAAY,OAAO;EACnC;EAEA,SAAS,qBAAqB,QAAiE;GAE7F,IAAI,OAAO,QAAQ,sBAAsB,GAAG,OAAO;GAGnD,MAAM,OAAQ,OAAO,QAAQ,gBAAgB,KAAqB,OAAO,QAAQ,KAAK,KAAK;GAC3F,IAAI,eAAe,IAAI,IAAI,KAAK,KAAK,aAAa,yBAAyB,GAAG,OAAO;GACrF,IAAI,KAAK,wBAAwB,UAAU,SAAS,qBAAqB,GAAG,OAAO;GAEnF,MAAM,YAAY,OAAO,eAAe,GAAA,CAAI,KAAK;GACjD,IAAI,CAAC,YAAY,SAAS,SAAS,GAAG,OAAO;GAG7C,MAAM,kBAAkB,CAAC,GAAG,OAAO,SAAS,CAAC,CAAC,MAAM,MAAM,EAAE,YAAY,CAAC,CAAC,SAAS,SAAS,CAAC;GAC7F,MAAM,UAAU,KAAK,mBAAmB,aAAa,KAAK,CAAC,CAAC,YAAY;GACxE,MAAM,kBAAkB,YAAY,aAAa,SAAS,WAAW,UAAU;GAE/E,MAAM,iBAAiB,gHAAgH,KAAK,QAAQ;GAEpJ,IAAI,mBAAmB,mBAAmB,gBACxC,OAAO;IAAE;IAAM,MAAM;GAAS;GAGhC,OAAO;EACT;EAEA,eAAe,kBAAkB,MAAmB,MAA6B;GAE/E,eAAe,IAAI,IAAI;GACvB,KAAK,aAAa,2BAA2B,YAAY;GAEzD,MAAM,IAAI,MAAM,kBAAkB;GAClC,IAAI,CAAC,GAAG;IACN,eAAe,OAAO,IAAI;IAC1B,KAAK,gBAAgB,yBAAyB;IAC9C;GACF;GAEA,MAAM,WAAW,eAAe,EAAE;GAElC,IAAI;IACF,MAAM,EAAE,QAAQ,MAAM,EAAE,OAAO,UAAU,IAAI;IAC7C,MAAM,WAAW,YAAY,GAAG;IAChC,IAAI,CAAC,UAAU;KACb,eAAe,OAAO,IAAI;KAC1B,KAAK,gBAAgB,yBAAyB;KAC9C;IACF;IAGA,IAAI,KAAK,wBAAwB,UAAU,SAAS,qBAAqB,GAAG;KAC1E,KAAK,aAAa,2BAA2B,MAAM;KACnD,KAAK,MAAM,UAAU;KACrB;IACF;IAEA,MAAM,UAAU,SAAS,cAAc,KAAK;IAC5C,QAAQ,YAAY;IAEpB,IAAI,aAAa;IAEjB,QAAQ,YAAY;;;;;;;;;oDAS4B,SAAS;8CACf,KAAK,QAAQ,MAAM,MAAM,CAAC,CAAC,QAAQ,MAAM,MAAM,EAAE;;IAG3F,MAAM,WAAW,QAAQ,cAAc,qBAAqB;IAC5D,MAAM,YAAY,QAAQ,cAAc,8BAA4B;IACpE,MAAM,UAAU,QAAQ,cAAc,qBAAmB;IACzD,MAAM,UAAU,QAAQ,cAAc,oBAAoB;IAE1D,WAAW,iBAAiB,UAAU,MAAM;KAC1C,EAAE,gBAAgB;KAClB,aAAa,CAAC;KACd,IAAI,YAAY;MACd,SAAS,UAAU,IAAI,YAAY;MACnC,UAAU,cAAc;KAC1B,OAAO;MACL,SAAS,UAAU,OAAO,YAAY;MACtC,UAAU,cAAc;KAC1B;IACF,CAAC;IAED,SAAS,iBAAiB,SAAS,OAAO,MAAM;KAC9C,EAAE,gBAAgB;KAClB,IAAI;MACF,MAAM,UAAU,UAAU,UAAU,IAAI;MACxC,QAAQ,cAAc;MACtB,iBAAiB;OACf,QAAQ,cAAc;MACxB,GAAG,IAAI;KACT,QAAQ,CAER;IACF,CAAC;IAED,MAAM,cAAc,MAAa;KAC/B,EAAE,gBAAgB;KAClB,cAAc,QAAQ;IACxB;IAEA,QAAQ,cAAc,qBAAmB,CAAC,EAAE,iBAAiB,SAAS,UAAU;IAChF,SAAS,iBAAiB,SAAS,UAAU;IAG7C,KAAK,MAAM,UAAU;IACrB,KAAK,YAAY,aAAa,SAAS,IAAI;IAC3C,KAAK,aAAa,2BAA2B,MAAM;GACrD,QAAQ;IAEN,eAAe,OAAO,IAAI;IAC1B,KAAK,gBAAgB,yBAAyB;IAC9C,MAAM,eAAe,SAAS,eAAe,QAAQ;IACrD,IAAI,cAAc,aAAa,OAAO;GACxC;EACF;EAEA,SAAgB,uBAA6B;GAC3C,IAAI,OAAO,aAAa,aAAa;GAGrC,MAAM,eAAe,SAAS,iBAA8B,+BAA+B;GAE3F,KAAK,MAAM,UAAU,cAAc;IACjC,MAAM,YAAY,qBAAqB,MAAM;IAC7C,IAAI,WACF,kBAAuB,UAAU,MAAM,UAAU,IAAI;GAEzD;EACF;EAEA,SAAgB,uBAAmC;GACjD,IAAI,OAAO,aAAa,aAAa,aAAa,CAAC;GAEnD,qBAAqB;GAErB,IAAI;GACJ,MAAM,sBAAsB;IAC1B,OAAO,aAAa,KAAK;IACzB,QAAQ,OAAO,iBAAiB;KAC9B,qBAAqB;IACvB,GAAG,GAAG;GACR;GAEA,cAAc;GAEd,MAAM,WAAW,IAAI,kBAAkB,cAAc;IACnD,IAAI,aAAa;IACjB,KAAK,MAAM,KAAK,WAAW;KAEzB,KAAK,MAAM,QAAQ,EAAE,YACnB,IAAI,KAAK,aAAa,GAAG;MACvB,MAAM,KAAK;MACX,IAAI,GAAG,WAAW,SAAS,qBAAqB,KAAK,GAAG,UAAU,sBAAsB,GACtF;MAEF,aAAa;MACb;KACF;KAEF,IAAI,YAAY;IAClB;IACA,IAAI,YAAY,cAAc;GAChC,CAAC;GAED,SAAS,QAAQ,SAAS,MAAM;IAC9B,WAAW;IACX,SAAS;GACX,CAAC;GAED,MAAM,gBAAgB,IAAI,uBAAuB;IAC/C,kBAAuB;IACvB,KAAK,MAAM,MAAM,SAAS,iBAA8B,oCAAkC,GAAG;KAC3F,eAAe,OAAO,EAAE;KACxB,GAAG,gBAAgB,yBAAyB;KAC5C,MAAM,cAAc,GAAG;KACvB,IAAI,eAAe,YAAY,UAAU,SAAS,qBAAqB,GACrE,YAAY,OAAO;KAErB,GAAG,MAAM,UAAU;IACrB;IACA,cAAc;GAChB,CAAC;GAED,cAAc,QAAQ,SAAS,iBAAiB;IAC9C,YAAY;IACZ,iBAAiB;KAAC;KAAS;KAAc;IAAiB;GAC5D,CAAC;GAED,aAAa;IACX,SAAS,WAAW;IACpB,cAAc,WAAW;IACzB,OAAO,aAAa,KAAK;GAC3B;EACF;;;EC3SA,MAAa,SAAS;GAAC;GAAS;GAAU;GAAoB;EAAc;EAE5E,SAAgB,MAAM,KAA0B;GAC9C,IAAI,aAAa,IAAI,OAAO,SAAS,IAAIC,cAAY,GAAG,wCAAwC;GAChG,IAAI,aAAa,cAAc,GAAG,kCAAkC;GACpE,IAAI,aAAa,IAAI,OAAO,SAAS,gBAAgBC,YAAgB,GAAG,+BAA+B;GACvG,IAAI,aAAa;IACf,yBAAyB;IACzB,aAAa,CAAC;GAChB,GAAG,yBAAyB;GAC5B,IAAI,aAAa,qBAAqB,GAAG,uBAAuB;GAEhE,MAAM,IAAI,IAAI,OAAO,KAAK,EAAE;GAC5B,IAAI,MAAM,OAAO,0BAA0B,IAAI,MAAM,SAAS;IAC5D,MAAM;IACN,IAAI;IACJ,OAAO;IACP,aAAa,EAAE,OAAO;IACtB,QAAQ;GACV,GAAG,wBAAwB,CAAC;GAE5B,MAAM,kCAA4C;IAChD,MAAM,0BAA0B;KAC9B,IAAI;MACF,MAAM,OAAO,IAAI;MACjB,MAAM,kBAAkB,MAAM,mBAAmB,MAAM,oBAAoB,MAAM;MACjF,IAAI,mBAAmB,IAAI,kBAEzB,IADgB,iBAAiB,aAAa,eACvC,CAAC,EAAE,OAAO,CAAC,CAAC,cAAc,KAAA,CAAS;KAE9C,QAAQ,CAER;IACF;IACA,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,oBAAD,EAAoB,eAAe,kBAAoB,CAAA;GAChE;GAEA,IAAI,MAAM,OAAO,0BAA0B,IAAI,MAAM,SAAS;IAC5D,MAAM;IACN,IAAI;IACJ,OAAO;IACP,aAAa;IACb,QAAQ;GACV,GAAG,yBAAyB,CAAC;GAC7B,IAAI,MAAM,OAAO,kCAAkC,IAAI,MAAM,SAAS;IACpE,MAAM;IACN,IAAI;IACJ,OAAO;IACP,QAAQ;IACR,SAAS,cAAc;KACrB,MAAM,YAAY,IAAI,iBAAiB,aAAa,SAAS;KAC7D,OAAO;MACL,KAAK,IAAI,gBAAgB;MACzB,WAAW,UAAU;MACrB,0BAA0B;OACxB,UAAe,KAAK,CAAC,CAAC,YAAY,KAAA,CAAS;MAC7C;KACF;IACF;GACF,GAAG,kBAAkB,CAAC;GACtB,IAAI,MAAM,OAAO,kCAAkC,IAAI,MAAM,SAAS;IACpE,MAAM;IACN,IAAI;IACJ,OAAO;IACP,QAAQ;IACR,SAAS,cAAc;KACrB,MAAM,YAAY,IAAI,iBAAiB,aAAa,SAAS;KAC7D,OAAO;MACL,WAAW,UAAU;MACrB,0BAA0B;OACxB,UAAe,KAAK,CAAC,CAAC,YAAY,KAAA,CAAS;MAC7C;KACF;IACF;GACF,GAAG,wBAAwB,CAAC;GAC5B,IAAI,MAAM,OAAO,4BAA4B,IAAI,MAAM,SAAS;IAC9D,MAAM;IACN,KAAK;IACL,QAAQ;IACR,SAAS,eAAe,EACtB,WAAW,YAAY,KAAK,SAAS,EACvC;GACF,GAAG,kBAAkB,CAAC;EACxB;EAEA,SAAS,YAAY,KAAoB,WAAgC;GACvE,MAAM,eAAe,IAAI;GAGzB,QAAQ,eAAe,aAAa,aAAa,WAAW,UAAU;EACxE"}
1
+ {"version":3,"file":"client.js","names":["useStore","formatPercent","parsePositiveCapacity","formatDate","formatCapacity","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 [subagentContextDraft, setSubagentContextDraft] = useState<string | null>(null)\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 updateSubagentContextWindow = async (): Promise<void> => {\n const draft = subagentContextDraft?.trim()\n if (draft === undefined || draft === '') {\n await updatePreferences({ subagentContextWindow: null })\n setSubagentContextDraft(null)\n return\n }\n const parsed = parsePositiveCapacity(draft)\n if (parsed === null) {\n setError(t('contextWindowInvalid'))\n return\n }\n await updatePreferences({ subagentContextWindow: parsed })\n setSubagentContextDraft(null)\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-pref-row\">\n <div>\n <strong>{t('subagentMaxDepth')}</strong>\n <p className=\"dsh-codex-muted\">{t('subagentMaxDepthHint')}</p>\n </div>\n <select\n className=\"dsh-codex-select\"\n aria-label={t('subagentMaxDepth')}\n value={preferences?.subagentMaxDepth === null || preferences?.subagentMaxDepth === undefined ? '' : String(preferences.subagentMaxDepth)}\n disabled={busy !== null}\n onChange={(event) => {\n const value = event.currentTarget.value\n void updatePreferences({ subagentMaxDepth: value === '' ? null : Number(value) })\n }}\n >\n <option value=\"\">{t('providerDefault')}</option>\n <option value=\"0\">0 ({t('subagentDisabled')})</option>\n <option value=\"1\">1 {t('levels')}</option>\n <option value=\"2\">2 {t('levels')}</option>\n <option value=\"3\">3 {t('levels')}</option>\n </select>\n </div>\n <div className=\"dsh-codex-context-settings\">\n <div>\n <strong>{t('subagentContextWindow')}</strong>\n <p className=\"dsh-codex-muted\">{t('subagentContextWindowHint')}</p>\n </div>\n <div className=\"dsh-codex-context-row\">\n <label htmlFor=\"dsh-codex-subagent-context\">{t('subagentContextWindow')}</label>\n <span className=\"dsh-codex-capacity-control\">\n <input\n id=\"dsh-codex-subagent-context\"\n type=\"text\"\n inputMode=\"numeric\"\n placeholder={t('providerDefault')}\n value={subagentContextDraft ?? (preferences?.subagentContextWindow ? formatCapacity(preferences.subagentContextWindow) : '')}\n disabled={busy !== null}\n aria-label={t('subagentContextWindow')}\n onChange={(event) => {\n setSubagentContextDraft(event.currentTarget.value)\n }}\n onKeyDown={(event) => {\n if (event.key !== 'Enter') return\n event.preventDefault()\n void updateSubagentContextWindow()\n }}\n />\n <small>{t('tokens')}</small>\n <button\n className=\"dsh-codex-context-save\"\n type=\"button\"\n aria-label={t('save') + ' ' + t('subagentContextWindow')}\n disabled={busy !== null || subagentContextDraft === null}\n onClick={() => void updateSubagentContextWindow()}\n >\n {t('save')}\n </button>\n </span>\n </div>\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 subagentEnhancements: '子代理设置',\n subagentContextWindow: '子代理上下文预算',\n subagentContextWindowHint: '限制子代理运行时的最大上下文 Token 数(例如 128K、256K);留空跟随模型主设置。',\n subagentMaxDepth: '子代理最大嵌套深度',\n subagentMaxDepthHint: '限制子代理的递归层级(0–3);0 禁止创建子代理。',\n subagentDisabled: '已禁用',\n levels: '层',\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 subagentEnhancements: 'Subagent settings',\n subagentContextWindow: 'Subagent context window budget',\n subagentContextWindowHint: 'Limits context capacity in tokens for subagents (e.g. 128K, 256K); leave empty to follow main model settings.',\n subagentMaxDepth: 'Subagent maximum nesting depth',\n subagentMaxDepthHint: 'Limits child levels for subagents (0–3); 0 disables subagents.',\n subagentDisabled: 'Disabled',\n levels: 'levels',\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:.55}50%{opacity:1}}\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 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 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 const data = await fetchApi<AntigravityWebStatus>('/status')\n setStatus(data)\n if (data.authenticated && (!data.quota || data.quota.groups.length === 0)) {\n void fetchApi<AntigravityWebStatus>('/quota', { method: 'POST' })\n .then((updated) => setStatus(updated))\n .catch(() => undefined)\n }\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 : '正在获取配额用量数据...'}</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 前往 Google 完成账号验证\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 if (mountedRef.current) {\n setStatus(data)\n if (data.authenticated && (!data.quota || data.quota.groups.length === 0) && !refresh) {\n void fetchApi<AntigravityWebStatus>('/quota', { method: 'POST' })\n .then((updated) => {\n if (mountedRef.current) setStatus(updated)\n })\n .catch(() => undefined)\n }\n }\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, '&lt;').replace(/>/g, '&gt;')}</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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"}