dsh-plugin-subscription-usage 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +38 -2
- package/cordis.patch.yml +5 -0
- package/icon.svg +9 -0
- package/lib/auth/claude-code-creds.d.ts +23 -0
- package/lib/auth/claude-code-creds.js +172 -0
- package/lib/auth/device-flow.d.ts +55 -0
- package/lib/auth/device-flow.js +177 -0
- package/lib/auth/jwt.d.ts +10 -0
- package/lib/auth/jwt.js +25 -0
- package/lib/auth/oauth-flow.d.ts +91 -0
- package/lib/auth/oauth-flow.js +227 -0
- package/lib/auth/pkce.d.ts +31 -0
- package/lib/auth/pkce.js +35 -0
- package/lib/auth/rpc.d.ts +233 -0
- package/lib/auth/rpc.js +501 -0
- package/lib/auth/store.d.ts +198 -0
- package/lib/auth/store.js +473 -0
- package/lib/client/Footer.d.ts +3 -0
- package/lib/client/Footer.js +73 -0
- package/lib/client/Gauge.d.ts +28 -0
- package/lib/client/Gauge.js +139 -0
- package/lib/client/ImageGallery.d.ts +54 -0
- package/lib/client/ImageGallery.js +112 -0
- package/lib/client/ImageGenerateToolview.d.ts +48 -0
- package/lib/client/ImageGenerateToolview.js +130 -0
- package/lib/client/Notice.d.ts +15 -0
- package/lib/client/Notice.js +93 -0
- package/lib/client/ProviderCard.d.ts +35 -0
- package/lib/client/ProviderCard.js +240 -0
- package/lib/client/SpeedSelect.d.ts +72 -0
- package/lib/client/SpeedSelect.js +214 -0
- package/lib/client/Usage.d.ts +7 -0
- package/lib/client/Usage.js +83 -0
- package/lib/client/VideoGenerateToolview.d.ts +42 -0
- package/lib/client/VideoGenerateToolview.js +172 -0
- package/lib/client/context.d.ts +16 -0
- package/lib/client/context.js +11 -0
- package/lib/client/fast-command.d.ts +2 -0
- package/lib/client/fast-command.js +4 -0
- package/lib/client/hooks.d.ts +2 -0
- package/lib/client/hooks.js +10 -0
- package/lib/client/index.d.ts +3 -0
- package/lib/client/index.js +113 -0
- package/lib/client/locales.d.ts +139 -0
- package/lib/client/locales.js +267 -0
- package/lib/client/meter.d.ts +91 -0
- package/lib/client/meter.js +196 -0
- package/lib/client/prefs.d.ts +51 -0
- package/lib/client/prefs.js +71 -0
- package/lib/client/rpc.d.ts +161 -0
- package/lib/client/rpc.js +31 -0
- package/lib/client/store.d.ts +67 -0
- package/lib/client/store.js +129 -0
- package/lib/client/styles.d.ts +7 -0
- package/lib/client/styles.js +176 -0
- package/lib/client.js +3933 -0
- package/lib/client.js.map +1 -0
- package/lib/compat.d.ts +55 -0
- package/lib/compat.js +20 -0
- package/lib/http.d.ts +134 -0
- package/lib/http.js +431 -0
- package/lib/index.d.ts +121 -0
- package/lib/index.js +13210 -0
- package/lib/json-text.d.ts +2 -0
- package/lib/json-text.js +4 -0
- package/lib/model-defaults.d.ts +23 -0
- package/lib/model-defaults.js +238 -0
- package/lib/model-speeds.d.ts +10 -0
- package/lib/model-speeds.js +48 -0
- package/lib/models-directory.d.ts +17 -0
- package/lib/models-directory.js +25 -0
- package/lib/provider-settings.d.ts +55 -0
- package/lib/provider-settings.js +215 -0
- package/lib/providers/account-preferences.d.ts +46 -0
- package/lib/providers/account-preferences.js +188 -0
- package/lib/providers/accounts.d.ts +113 -0
- package/lib/providers/accounts.js +142 -0
- package/lib/providers/antigravity-oauth-client.d.ts +7 -0
- package/lib/providers/antigravity-oauth-client.js +7 -0
- package/lib/providers/antigravity.d.ts +119 -0
- package/lib/providers/antigravity.js +552 -0
- package/lib/providers/catalog-refresh.d.ts +4 -0
- package/lib/providers/catalog-refresh.js +30 -0
- package/lib/providers/catalog-store.d.ts +47 -0
- package/lib/providers/catalog-store.js +283 -0
- package/lib/providers/claude-cli-version.d.ts +15 -0
- package/lib/providers/claude-cli-version.js +24 -0
- package/lib/providers/claude.d.ts +212 -0
- package/lib/providers/claude.js +726 -0
- package/lib/providers/codex-client-version.d.ts +8 -0
- package/lib/providers/codex-client-version.js +17 -0
- package/lib/providers/codex-search.d.ts +29 -0
- package/lib/providers/codex-search.js +198 -0
- package/lib/providers/codex.d.ts +253 -0
- package/lib/providers/codex.js +930 -0
- package/lib/providers/common.d.ts +415 -0
- package/lib/providers/common.js +679 -0
- package/lib/providers/copilot.d.ts +365 -0
- package/lib/providers/copilot.js +956 -0
- package/lib/providers/grok.d.ts +214 -0
- package/lib/providers/grok.js +750 -0
- package/lib/providers/image-pool.d.ts +30 -0
- package/lib/providers/image-pool.js +89 -0
- package/lib/providers/npm-cli-version.d.ts +56 -0
- package/lib/providers/npm-cli-version.js +98 -0
- package/lib/providers/pool-family.d.ts +56 -0
- package/lib/providers/pool-family.js +45 -0
- package/lib/providers/pool-health.d.ts +91 -0
- package/lib/providers/pool-health.js +164 -0
- package/lib/providers/pool-usage.d.ts +106 -0
- package/lib/providers/pool-usage.js +302 -0
- package/lib/providers/pool.d.ts +115 -0
- package/lib/providers/pool.js +461 -0
- package/lib/providers/rate-limit.d.ts +192 -0
- package/lib/providers/rate-limit.js +338 -0
- package/lib/providers/replay.d.ts +4 -0
- package/lib/providers/replay.js +37 -0
- package/lib/providers/reset-redemption.d.ts +20 -0
- package/lib/providers/reset-redemption.js +70 -0
- package/lib/tools/image-generate.d.ts +128 -0
- package/lib/tools/image-generate.js +438 -0
- package/lib/tools/registration.d.ts +15 -0
- package/lib/tools/registration.js +24 -0
- package/lib/tools/video-generate.d.ts +89 -0
- package/lib/tools/video-generate.js +257 -0
- package/lib/tools/x-search.d.ts +58 -0
- package/lib/tools/x-search.js +197 -0
- package/lib/translate/anthropic.d.ts +180 -0
- package/lib/translate/anthropic.js +534 -0
- package/lib/translate/antigravity-images.d.ts +11 -0
- package/lib/translate/antigravity-images.js +62 -0
- package/lib/translate/antigravity-schema.d.ts +4 -0
- package/lib/translate/antigravity-schema.js +145 -0
- package/lib/translate/antigravity-thinking.d.ts +5 -0
- package/lib/translate/antigravity-thinking.js +44 -0
- package/lib/translate/antigravity.d.ts +120 -0
- package/lib/translate/antigravity.js +412 -0
- package/lib/translate/chat-completions.d.ts +120 -0
- package/lib/translate/chat-completions.js +382 -0
- package/lib/translate/resolved.d.ts +98 -0
- package/lib/translate/resolved.js +186 -0
- package/lib/translate/responses.d.ts +192 -0
- package/lib/translate/responses.js +443 -0
- package/lib/translate/sse.d.ts +21 -0
- package/lib/translate/sse.js +62 -0
- package/lib/usage/headers.d.ts +21 -0
- package/lib/usage/headers.js +64 -0
- package/lib/usage/pace.d.ts +53 -0
- package/lib/usage/pace.js +48 -0
- package/lib/usage/service.d.ts +64 -0
- package/lib/usage/service.js +104 -0
- package/lib/usage-providers/common.d.ts +23 -0
- package/lib/usage-providers/common.js +28 -0
- package/lib/usage-providers/index.d.ts +42 -0
- package/lib/usage-providers/index.js +71 -0
- package/lib/usage-providers/keys.d.ts +11 -0
- package/lib/usage-providers/keys.js +52 -0
- package/lib/usage-providers/kimi.d.ts +4 -0
- package/lib/usage-providers/kimi.js +52 -0
- package/lib/usage-providers/ollama-cloud.d.ts +4 -0
- package/lib/usage-providers/ollama-cloud.js +42 -0
- package/lib/usage-providers/zai.d.ts +5 -0
- package/lib/usage-providers/zai.js +53 -0
- package/locale/en.json +6 -0
- package/locale/zh.json +6 -0
- package/package.json +115 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","names":["zh: Record<SubscriptionsKey, string>","PROVIDERS: readonly ProviderId[]","KEY_PROVIDERS: readonly KeyProviderId[]","USAGE_PROVIDERS: readonly UsageProviderId[]","result: RpcResult<unknown>","rpc: ConnectionHandle['rpc']","DEFAULT_PREFS: UsagePreferencesView","pace","ops: Parameters<ConfigFormLike['mutate']>[0][number][]","window","window","FAMILY_NAMES: Record<string, string>","out: ShownWindow[]","projection: ReactNode","window","next: ProviderPreferences","label","raw: unknown","candidates: (PaceNotice & { rank: number })[]","window","label","styles: Record<string, CSSProperties>","styles","label","PROMPT_MAX_LENGTH","fallbackTranslate","text: string","derivePrompt","parsed: unknown","prompt: string | undefined","resultText","parts: string[]","images: { attachment: ImageAttachmentRef }[]","styles: Record<string, CSSProperties>","labels: MessageImageLabels","styles","fallbackTranslate","text: string","parsed: unknown","prompt: string | undefined","parts: string[]","styles: Record<string, CSSProperties>","objectUrl: string | undefined","styles","state: SpeedState","TIERS: readonly SpeedTier[]","styles: Record<string, CSSProperties>","t: T","forms: unknown","service: unknown","currentModel: CurrentModelSource | undefined"],"sources":["../src/client/locales.ts","../src/client/styles.ts","../src/client/rpc.ts","../src/client/store.ts","../src/client/prefs.ts","../src/usage/pace.ts","../src/client/meter.tsx","../src/client/hooks.ts","../src/client/context.ts","../src/client/ProviderCard.tsx","../src/client/Footer.tsx","../src/client/Usage.tsx","../src/client/Gauge.tsx","../src/client/Notice.tsx","../src/client/ImageGallery.tsx","../src/client/ImageGenerateToolview.tsx","../src/client/VideoGenerateToolview.tsx","../src/client/SpeedSelect.tsx","../src/client/fast-command.ts","../src/client/index.ts"],"sourcesContent":["import type {} from '@deepseek-ai/dsh-client-ui-slots'\n\n/** Copy for every Client surface of this plugin, in one locale namespace. */\nexport const en = {\n // Provider card\n signIn: 'Sign in',\n signInAgain: 'Sign in',\n noApiKey: 'No API key needed',\n signInExpired: 'Sign-in expired',\n signedIn: 'Signed in',\n signInNeeded: 'Sign-in needed',\n manage: 'Manage',\n modelsCount: '{visible}/{total} models',\n modelsCountTitle: 'Models shown in the picker',\n refreshUsage: 'Refresh usage',\n refreshUsageNamed: 'Refresh {name} usage',\n refreshedWait: 'Refreshed. Again in {seconds}s',\n defaultAccount: 'Default account',\n servingAccount: 'Serving this session',\n live: 'live',\n liveTitle: 'Updates with every response',\n agoShort: '{time} ago',\n staleShort: '{time} old',\n staleTitle: 'Refresh failed. Retrying {when}',\n noUsageData: 'No usage data',\n noUsageDataTitle: 'This provider does not publish usage',\n usageUnavailable: 'Usage unavailable',\n moreAccounts: '{count} more accounts',\n // Sign-in flow\n stepTabOpened: 'Tab opened',\n stepApprove: 'Approve access',\n stepLoadModels: 'Load models',\n stepCodeIssued: 'Code issued',\n stepWaitingGithub: 'Waiting for GitHub',\n pasteRedirect: 'Paste redirect URL instead',\n pastePlaceholder: 'Redirect URL or code',\n continue: 'Continue',\n cancel: 'Cancel',\n copyCode: 'Copy code',\n claudeImport: 'Import Claude Code',\n claudeBrowser: 'Browser sign-in',\n // Manage panel\n tabAccounts: 'Accounts',\n tabModels: 'Models',\n tabTools: 'Tools',\n pool: 'Pool',\n poolInclude: 'Include {account} in the pool',\n makeDefault: 'Make default',\n signOut: 'Sign out',\n addAccount: 'Add account',\n searchModels: 'Search {count} models',\n showInPicker: 'Show {model} in the picker',\n pickerCount: '{visible} of {total} in the picker',\n autoShowNew: 'Show new models automatically',\n selectAll: 'Select all',\n deselectAll: 'Deselect all',\n effortFor: 'Default effort for {model}',\n effortAuto: 'Auto',\n toolWebSearch: 'Web search',\n toolImage: 'Image generation',\n toolVideo: 'Video generation',\n toolXSearch: 'X search',\n toolsNote: 'Applies to new sessions',\n save: 'Save',\n saving: 'Saving…',\n saveFailed: 'Could not save: {message}',\n loadFailed: 'Could not load: {message}',\n // Window labels and times\n window5h: '5h',\n window7d: '7d',\n windowOther: 'limit',\n resetsIn: 'in {time}',\n emptyAt: 'empty {time}',\n backAt: 'back {time}',\n tipUsedLeft: '{used}% used · {left}% left',\n tipElapsed: '{percent}% of the window has passed',\n tipPace: 'Pace: ~{percent}% by reset',\n tipResets: 'Resets {time}',\n tipCount: '{used} of {limit} used',\n notReported: 'Not reported',\n // Footer\n subscriptions: 'Subscriptions',\n addProvider: 'Add a provider',\n apiKey: 'API key',\n addKey: 'Add',\n removeKey: 'Remove key',\n keyHelp: 'Paste an API key. It is checked once, then stored on this machine.',\n keyChecking: 'Checking key…',\n usageEmpty: 'Sign in to a subscription in Models to see its usage here.',\n composerUsage: 'Composer usage',\n composerUsageNote: 'Current model plus pinned',\n showQuotaAs: 'Show quota as',\n displayLeft: 'Left',\n displayUsed: 'Used',\n paceWarnings: 'Pace warnings',\n proxy: 'Proxy',\n proxyOff: 'Off',\n proxyOn: 'On',\n configure: 'Configure',\n proxyUrl: 'Proxy URL',\n proxyBypass: 'Bypass hosts, comma separated',\n proxyEnabled: 'Use this proxy',\n proxyTest: 'Test',\n proxyTestOk: 'HTTP {status} in {ms} ms',\n // Gauge and popover\n usage: 'Usage',\n usageLabel: 'Subscription usage',\n refreshNow: 'Refresh now',\n usageSettings: 'Usage settings',\n pin: 'Pin to composer',\n unpin: 'Unpin from composer',\n otherProviders: '{count} more',\n // Notices\n noticeEmpty: '{provider} {window} empty around {time}',\n noticeOut: '{provider} {window} limit reached',\n noticeSwitched: '{provider} limit reached. Switched to {account}',\n dismiss: 'Dismiss',\n // Retained upstream surfaces\n generating: 'Generating image…',\n generatingVideo: 'Generating video…',\n image: 'image',\n imageClose: 'Close',\n imageLoadFailed: 'Retry',\n imageLoading: 'Loading…',\n imagePreview: 'Image preview',\n speed: 'Speed',\n speedStandard: 'Standard',\n speedStandardDescription: 'Default speed',\n speedFast: 'Fast',\n speedFastDescription: '1.5x speed, more usage',\n videoLoadFailed: 'Video failed to load: {message}',\n videoLoading: 'Loading video…',\n viewImage: 'View image',\n viewImageNamed: 'View {name}',\n commandFast: 'Switch the Codex speed tier (Standard/Fast)',\n commandFastUnavailable: 'The current model has no fast tier; /fast only works on Codex models whose catalog advertises one',\n} as const\n\n/** Every copy key. */\nexport type SubscriptionsKey = keyof typeof en\n\n/** The locale namespace this plugin registers. */\nexport const LOCALE_NS = 'subscription-models'\n\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\n interface LocaleNamespaceMap {\n 'subscription-models': SubscriptionsKey\n }\n}\n\nexport const zh: Record<SubscriptionsKey, string> = {\n signIn: '登录',\n signInAgain: '重新登录',\n noApiKey: '无需 API 密钥',\n signInExpired: '登录已过期',\n signedIn: '已登录',\n signInNeeded: '需要登录',\n manage: '管理',\n modelsCount: '{visible}/{total} 个模型',\n modelsCountTitle: '模型选择器中显示的模型',\n refreshUsage: '刷新用量',\n refreshUsageNamed: '刷新 {name} 用量',\n refreshedWait: '已刷新,{seconds} 秒后可再次刷新',\n defaultAccount: '默认账号',\n servingAccount: '正在为本会话服务',\n live: '实时',\n liveTitle: '每次回复后更新',\n agoShort: '{time}前',\n staleShort: '已过 {time}',\n staleTitle: '刷新失败,{when}重试',\n noUsageData: '无用量数据',\n noUsageDataTitle: '该服务商不提供用量数据',\n usageUnavailable: '用量不可用',\n moreAccounts: '另外 {count} 个账号',\n stepTabOpened: '已打开标签页',\n stepApprove: '批准访问',\n stepLoadModels: '加载模型',\n stepCodeIssued: '已生成代码',\n stepWaitingGithub: '等待 GitHub',\n pasteRedirect: '改为粘贴回调 URL',\n pastePlaceholder: '回调 URL 或授权码',\n continue: '继续',\n cancel: '取消',\n copyCode: '复制代码',\n claudeImport: '导入 Claude Code',\n claudeBrowser: '浏览器登录',\n tabAccounts: '账号',\n tabModels: '模型',\n tabTools: '工具',\n pool: '账号池',\n poolInclude: '将 {account} 加入账号池',\n makeDefault: '设为默认',\n signOut: '退出登录',\n addAccount: '添加账号',\n searchModels: '搜索 {count} 个模型',\n showInPicker: '在选择器中显示 {model}',\n pickerCount: '选择器中显示 {visible}/{total}',\n autoShowNew: '自动显示新模型',\n selectAll: '全选',\n deselectAll: '全不选',\n effortFor: '{model} 的默认推理强度',\n effortAuto: '自动',\n toolWebSearch: '网页搜索',\n toolImage: '图片生成',\n toolVideo: '视频生成',\n toolXSearch: 'X 搜索',\n toolsNote: '对新会话生效',\n save: '保存',\n saving: '保存中…',\n saveFailed: '保存失败:{message}',\n loadFailed: '加载失败:{message}',\n window5h: '5h',\n window7d: '7d',\n windowOther: '限额',\n resetsIn: '{time}后',\n emptyAt: '{time} 用尽',\n backAt: '{time} 恢复',\n tipUsedLeft: '已用 {used}% · 剩余 {left}%',\n tipElapsed: '窗口已过 {percent}%',\n tipPace: '按当前速度:重置前约用 {percent}%',\n tipResets: '{time} 重置',\n tipCount: '已用 {used} / {limit}',\n notReported: '未提供',\n subscriptions: '订阅',\n addProvider: '添加提供商',\n apiKey: 'API 密钥',\n addKey: '添加',\n removeKey: '移除密钥',\n keyHelp: '粘贴 API 密钥。验证一次后保存在本机。',\n keyChecking: '正在验证密钥…',\n usageEmpty: '在“模型”中登录订阅后,可在此查看用量。',\n composerUsage: '输入框用量',\n composerUsageNote: '当前模型和已固定',\n showQuotaAs: '额度显示为',\n displayLeft: '剩余',\n displayUsed: '已用',\n paceWarnings: '速度预警',\n proxy: '代理',\n proxyOff: '关闭',\n proxyOn: '开启',\n configure: '配置',\n proxyUrl: '代理 URL',\n proxyBypass: '绕过的主机,逗号分隔',\n proxyEnabled: '使用此代理',\n proxyTest: '测试',\n proxyTestOk: 'HTTP {status},耗时 {ms} ms',\n usage: '用量',\n usageLabel: '订阅用量',\n refreshNow: '立即刷新',\n usageSettings: '用量设置',\n pin: '固定到输入框',\n unpin: '从输入框取消固定',\n otherProviders: '另外 {count} 个',\n noticeEmpty: '{provider} {window} 预计 {time} 用尽',\n noticeOut: '{provider} {window} 已达上限',\n noticeSwitched: '{provider} 已达上限,已切换到 {account}',\n dismiss: '关闭',\n generating: '正在生成图片…',\n generatingVideo: '正在生成视频…',\n image: '图片',\n imageClose: '关闭',\n imageLoadFailed: '重试',\n imageLoading: '加载中…',\n imagePreview: '图片预览',\n speed: '速度',\n speedStandard: '标准',\n speedStandardDescription: '默认速度',\n speedFast: '快速',\n speedFastDescription: '约 1.5 倍速度,消耗更多用量',\n videoLoadFailed: '视频加载失败:{message}',\n videoLoading: '视频加载中…',\n viewImage: '查看图片',\n viewImageNamed: '查看 {name}',\n commandFast: '切换 Codex 速度档(标准/快速)',\n commandFastUnavailable: '当前模型不支持快速档;/fast 仅对目录声明了 fast tier 的 Codex 模型可用',\n}\n\n/** Fill `{name}` placeholders. */\nexport function format(text: string, params: Record<string, string | number> = {}): string {\n return text.replace(/\\{(\\w+)\\}/g, (match, key: string) => (key in params ? String(params[key]) : match))\n}\n","/**\n * One stylesheet for every surface, prefixed `dsm-`, colored only through\n * `--dsw-alias-*` tokens. Card and button values copy the Models page\n * (`dsh-client-ui-settings-models` 0.2.2-rc.1); meters follow\n * design/usage-draft.html v3.\n */\nexport const css = `\n.dsm-sub { display: flex; flex-direction: column; gap: 8px; min-width: 0; font-size: 13px; line-height: 20px; color: var(--dsw-alias-label-primary); }\n.dsm-sub .dsm-card-error { color: var(--dsw-alias-state-error-primary); font-size: 12px; }\n.dsm-num, .dsm-w, .dsm-mini, .dsm-fresh { font-variant-numeric: tabular-nums; }\n\n.dsm-btn { box-sizing: border-box; height: 28px; padding: 0 10px; border-radius: var(--dsw-radius-sm); font: inherit; font-size: 12px; line-height: 18px;\n cursor: pointer; border: .5px solid var(--dsw-alias-border-l3); background: transparent; color: var(--dsw-alias-label-primary);\n display: inline-flex; align-items: center; gap: 6px; white-space: nowrap; }\n.dsm-btn:hover:not(:disabled) { background: var(--dsw-alias-interactive-bg-hover-solid, var(--dsw-alias-interactive-bg-hover)); }\n.dsm-btn:disabled { opacity: .4; cursor: default; }\n.dsm-btn:focus-visible, .dsm-fold:focus-visible, .dsm-seg button:focus-visible, .dsm-switch:focus-visible, .dsm-chip:focus-visible, .dsm-gauge:focus-visible, .dsm-tab:focus-visible {\n box-shadow: 0 0 0 2px var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary)); outline: none; }\n.dsm-btn.dsm-primary { background: var(--dsw-alias-button-primary-fill, var(--dsw-alias-label-primary)); color: var(--dsw-alias-label-primary-foreground, var(--dsw-alias-bg-base)); border-color: transparent; }\n.dsm-btn.dsm-primary:hover:not(:disabled) { background: var(--dsw-alias-button-primary-hover, var(--dsw-alias-label-primary)); }\n.dsm-btn.dsm-ghost { border-color: transparent; color: var(--dsw-alias-label-secondary); }\n.dsm-btn.dsm-danger { border-color: transparent; color: var(--dsw-alias-state-error-primary); }\n.dsm-btn.dsm-danger:hover:not(:disabled) { background: var(--dsw-alias-interactive-bg-hover-danger, var(--dsw-alias-interactive-bg-hover)); }\n.dsm-btn.dsm-icon { width: 28px; padding: 0; justify-content: center; border-color: transparent; color: var(--dsw-alias-label-secondary); }\n.dsm-btn.dsm-icon.dsm-sm { width: 24px; height: 24px; }\n.dsm-spinning svg { animation: dsm-spin .7s linear infinite; }\n@keyframes dsm-spin { to { transform: rotate(360deg); } }\n\n.dsm-acct { display: flex; flex-direction: column; gap: 6px; min-width: 0; }\n.dsm-acct-head { display: flex; align-items: center; gap: 6px; min-width: 0; color: var(--dsw-alias-label-secondary); }\n.dsm-acct-name { color: var(--dsw-alias-label-primary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }\n.dsm-tag { flex: none; font-size: 11px; line-height: 16px; padding: 0 5px; border-radius: var(--dsw-radius-xs); border: .5px solid var(--dsw-alias-border-l3); color: var(--dsw-alias-label-secondary); }\n.dsm-glyph { display: inline-flex; flex: none; color: var(--dsw-alias-label-tertiary); }\n.dsm-glyph.dsm-star { color: var(--dsw-alias-state-warn-primary); }\n.dsm-glyph.dsm-live { color: var(--dsw-alias-state-business-primary); }\n.dsm-fresh { margin-left: auto; display: inline-flex; align-items: center; gap: 5px; font-size: 12px; color: var(--dsw-alias-label-tertiary); white-space: nowrap; flex: none; }\n.dsm-fresh.dsm-stale { color: var(--dsw-alias-state-warn-primary); }\n.dsm-live-dot { width: 6px; height: 6px; border-radius: 50%; background: var(--dsw-alias-state-success-primary); }\n\n/* Fixed label, value and time columns, so bars line up across accounts and providers. */\n.dsm-wins { display: grid; grid-template-columns: fit-content(132px) minmax(48px, 1fr) 40px 92px; column-gap: 12px; row-gap: 6px; align-items: center; }\n.dsm-w { display: contents; font-size: 12px; line-height: 18px; }\n.dsm-wl { color: var(--dsw-alias-label-tertiary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-size: 12px; line-height: 18px; }\n.dsm-wv { text-align: right; font-weight: 600; font-size: 13px; line-height: 18px; color: var(--dsw-alias-label-primary); }\n.dsm-wt { text-align: right; color: var(--dsw-alias-label-tertiary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-size: 12px; line-height: 18px; }\n.dsm-w.dsm-tight .dsm-wv, .dsm-w.dsm-tight .dsm-wt { color: var(--dsw-alias-state-warn-primary); }\n.dsm-w.dsm-over .dsm-wv, .dsm-w.dsm-over .dsm-wt, .dsm-w.dsm-out .dsm-wv, .dsm-w.dsm-out .dsm-wt { color: var(--dsw-alias-state-error-primary); }\n\n.dsm-bar { position: relative; display: block; border-radius: 3px; background: color-mix(in srgb, var(--dsw-alias-label-primary) 9%, transparent); color: var(--dsw-alias-state-success-primary); }\n.dsm-fill { position: absolute; top: 0; bottom: 0; left: 0; border-radius: inherit; background: currentColor; transition: width .5s cubic-bezier(.16, 1, .3, 1); }\n.dsm-proj { position: absolute; top: 0; bottom: 0; background: repeating-linear-gradient(90deg, transparent 0 2px, color-mix(in srgb, currentColor 55%, transparent) 2px 3px); }\n.dsm-bar.dsm-tight { color: var(--dsw-alias-state-warn-primary); }\n.dsm-bar.dsm-over, .dsm-bar.dsm-out { color: var(--dsw-alias-state-error-primary); }\n.dsm-bar.dsm-unknown .dsm-fill { display: none; }\n\n.dsm-minis { display: inline-flex; gap: 14px; flex: none; }\n.dsm-mini { display: inline-grid; grid-template-columns: auto 32px 34px; align-items: center; gap: 5px; font-size: 11px; line-height: 16px; }\n.dsm-mini i { font-style: normal; color: var(--dsw-alias-label-tertiary); max-width: 96px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.dsm-mini b { font-weight: 500; text-align: right; color: var(--dsw-alias-label-primary); font-size: 12px; }\n.dsm-mini.dsm-tight b { color: var(--dsw-alias-state-warn-primary); }\n.dsm-mini.dsm-over b, .dsm-mini.dsm-out b { color: var(--dsw-alias-state-error-primary); }\n\n.dsm-fold { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: 8px; width: 100%; min-height: 32px; padding: 0 6px 0 2px;\n border: 0; background: none; text-align: left; cursor: pointer; border-radius: var(--dsw-radius-md); font: inherit; font-size: 12px; color: var(--dsw-alias-label-secondary); }\n.dsm-fold:hover { background: var(--dsw-alias-interactive-bg-hover); }\n.dsm-fold .dsm-chev { color: var(--dsw-alias-label-tertiary); transition: transform .2s cubic-bezier(.16, 1, .3, 1); }\n.dsm-fold[aria-expanded=\"true\"] .dsm-chev { transform: rotate(90deg); }\n.dsm-fold-name { display: flex; align-items: center; gap: 6px; min-width: 0; }\n.dsm-fold-name > span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.dsm-fold-body { display: flex; flex-direction: column; gap: 8px; padding: 2px 0 4px 24px; min-width: 0; }\n\n.dsm-foot { display: flex; align-items: center; gap: 6px; }\n.dsm-muted { color: var(--dsw-alias-label-tertiary); font-size: 12px; line-height: 18px; margin: 0; display: inline-flex; align-items: center; gap: 6px; }\n.dsm-alert { display: flex; gap: 8px; align-items: center; padding: 6px 6px 6px 10px; border-radius: var(--dsw-radius-lg);\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 10%, transparent); }\n.dsm-alert > svg { color: var(--dsw-alias-state-error-primary); }\n.dsm-alert .dsm-btn { margin-left: auto; }\n\n.dsm-panel { border-radius: var(--dsw-radius-lg); background: var(--dsw-alias-bg-module-platform, var(--dsw-alias-bg-layer-2)); padding: 2px 12px 12px; display: flex; flex-direction: column; gap: 8px; }\n.dsm-tabs { display: flex; gap: 2px; border-bottom: .5px solid var(--dsw-alias-border-l2); margin: 0 -12px; padding: 0 8px; }\n.dsm-tab { border: 0; background: none; padding: 9px 8px 8px; font: inherit; font-size: 13px; color: var(--dsw-alias-label-tertiary); cursor: pointer; border-bottom: 2px solid transparent; margin-bottom: -.5px; }\n.dsm-tab[aria-selected=\"true\"] { color: var(--dsw-alias-label-primary); border-bottom-color: var(--dsw-alias-label-primary); }\n.dsm-row { display: flex; align-items: center; gap: 10px; min-height: 36px; font-size: 13px; }\n.dsm-row + .dsm-row { border-top: .5px solid var(--dsw-alias-border-l1); }\n.dsm-grow { flex: 1; min-width: 0; display: flex; align-items: center; gap: 6px; }\n.dsm-grow > .dsm-ellipsis { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }\n.dsm-note { color: var(--dsw-alias-label-tertiary); font-size: 12px; }\n.dsm-list { max-height: 280px; overflow-y: auto; }\n.dsm-switch { width: 30px; height: 18px; border-radius: 9px; background: var(--dsw-alias-state-idle-primary); border: 0; position: relative; cursor: pointer; flex: none; padding: 0; }\n.dsm-switch::after { content: \"\"; position: absolute; top: 2px; left: 2px; width: 14px; height: 14px; border-radius: 50%; background: #fff; transition: transform .2s cubic-bezier(.16, 1, .3, 1); }\n.dsm-switch[aria-checked=\"true\"] { background: var(--dsw-alias-state-success-primary); }\n.dsm-switch[aria-checked=\"true\"]::after { transform: translateX(12px); }\n.dsm-switch:disabled { opacity: .4; cursor: default; }\n.dsm-input { box-sizing: border-box; height: 30px; width: 100%; border-radius: var(--dsw-radius-md); border: .5px solid var(--dsw-alias-border-l3);\n background: var(--dsw-alias-bg-layer-1); color: var(--dsw-alias-label-primary); padding: 0 10px; font: inherit; font-size: 13px; }\n.dsm-select { height: 26px; border-radius: var(--dsw-radius-sm); border: .5px solid var(--dsw-alias-border-l3); background: var(--dsw-alias-bg-layer-1);\n color: var(--dsw-alias-label-primary); font: inherit; font-size: 12px; padding: 0 4px; max-width: 160px; }\n.dsm-panel-foot { display: flex; justify-content: flex-end; align-items: center; gap: 8px; padding-top: 4px; }\n.dsm-panel-foot .dsm-card-error { margin-right: auto; }\n.dsm-seg { display: inline-flex; padding: 2px; border-radius: 7px; background: color-mix(in srgb, var(--dsw-alias-label-primary) 9%, transparent); gap: 2px; flex: none; }\n.dsm-seg button { border: 0; background: transparent; height: 22px; padding: 0 9px; border-radius: 5px; font: inherit; font-size: 12px; color: var(--dsw-alias-label-secondary); cursor: pointer; }\n.dsm-seg button[aria-pressed=\"true\"] { background: var(--dsw-alias-bg-layer-1); color: var(--dsw-alias-label-primary); box-shadow: 0 1px 2px #0000002e; }\n.dsm-chips { display: flex; flex-wrap: wrap; gap: 6px; }\n.dsm-chip { height: 26px; padding: 0 10px 0 8px; border-radius: 13px; border: .5px solid var(--dsw-alias-border-l3); background: transparent; font: inherit; font-size: 12px;\n cursor: pointer; display: inline-flex; align-items: center; gap: 5px; color: var(--dsw-alias-label-secondary); }\n.dsm-chip[aria-pressed=\"true\"] { background: var(--dsw-alias-label-primary); color: var(--dsw-alias-bg-base); border-color: transparent; }\n.dsm-chip:disabled { opacity: .4; cursor: default; }\n\n.dsm-signin { display: flex; flex-direction: column; gap: 8px; padding: 10px 12px; border-radius: var(--dsw-radius-lg); background: var(--dsw-alias-bg-module-platform, var(--dsw-alias-bg-layer-2)); }\n.dsm-steps { display: flex; gap: 16px; margin: 0; padding: 0; list-style: none; font-size: 12px; flex-wrap: wrap; }\n.dsm-steps li { display: inline-flex; gap: 6px; align-items: center; color: var(--dsw-alias-label-tertiary); }\n.dsm-steps li[data-s=\"done\"] { color: var(--dsw-alias-state-success-primary); }\n.dsm-steps li[data-s=\"now\"] { color: var(--dsw-alias-label-primary); }\n.dsm-spin { width: 12px; height: 12px; border-radius: 50%; border: 1.5px solid var(--dsw-alias-border-l3); border-top-color: currentColor; animation: dsm-spin .8s linear infinite; flex: none; box-sizing: border-box; }\n.dsm-code { font: 600 20px/28px var(--dsw-font-family-mono, ui-monospace, Menlo, monospace); letter-spacing: .12em; padding: 4px 12px; border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-1); border: .5px solid var(--dsw-alias-border-l2); }\n.dsm-fallback summary { cursor: pointer; color: var(--dsw-alias-label-tertiary); font-size: 12px; list-style: none; display: inline-flex; gap: 4px; align-items: center; }\n.dsm-fallback summary::-webkit-details-marker { display: none; }\n.dsm-fallback[open] summary { margin-bottom: 6px; }\n\n.dsm-footer-block { margin-top: 18px; padding-top: 14px; border-top: .5px solid var(--dsw-alias-border-l2); display: flex; flex-direction: column; max-width: 720px; }\n.dsm-footer-block h3 { margin: 0 0 4px; font-size: 14px; font-weight: 500; line-height: 22px; color: var(--dsw-alias-label-primary); }\n.dsm-footer-block .dsm-row { min-height: 40px; color: var(--dsw-alias-label-primary); }\n\n.dsm-gauge-slot { position: relative; display: inline-flex; }\n.dsm-gauge { display: inline-flex; align-items: center; gap: 10px; height: 24px; padding: 0 8px; border-radius: 12px; border: 0; background: transparent; cursor: pointer;\n color: var(--dsw-alias-label-secondary); font: inherit; font-size: 12px; }\n.dsm-gauge:hover, .dsm-gauge[aria-expanded=\"true\"] { background: var(--dsw-alias-interactive-bg-hover); }\n.dsm-gp { display: inline-flex; align-items: center; gap: 8px; }\n.dsm-gp + .dsm-gp { padding-left: 10px; border-left: .5px solid var(--dsw-alias-border-l3); }\n.dsm-gp-name { color: var(--dsw-alias-label-primary); }\n.dsm-gp .dsm-minis { gap: 10px; }\n.dsm-gp .dsm-mini { grid-template-columns: auto 26px auto; }\n\n.dsm-pop { position: fixed; z-index: 1000; width: 420px; max-width: calc(100vw - 20px); box-sizing: border-box; background: var(--dsw-specific-menu, var(--dsw-alias-bg-overlay));\n backdrop-filter: var(--dsw-menu-backdrop-filter, none); border-radius: var(--dsw-radius-xl); box-shadow: var(--dsw-elevation-panel, 0 12px 32px #0006);\n border: .5px solid var(--dsw-alias-border-l2); padding: 6px; display: flex; flex-direction: column; color: var(--dsw-alias-label-primary);\n text-align: left; font-size: 13px; line-height: 20px; max-height: min(560px, calc(100vh - 24px)); overflow: hidden auto; }\n.dsm-pop-head { display: flex; align-items: center; gap: 2px; padding: 2px 2px 6px 8px; }\n.dsm-pop-head b { font-weight: 600; font-size: 13px; margin-right: auto; }\n.dsm-psec { border-top: .5px solid var(--dsw-alias-border-l2); padding: 4px 0; }\n.dsm-psec-head { display: flex; align-items: center; gap: 2px; }\n.dsm-psec-head .dsm-fold { flex: 1; }\n.dsm-psec-name { color: var(--dsw-alias-label-primary); font-weight: 500; font-size: 13px; }\n.dsm-psec .dsm-fold-body { padding: 0 8px 6px 26px; gap: 6px; }\n.dsm-psec .dsm-fold-body .dsm-fold-body { padding: 4px 0 0; }\n.dsm-psec .dsm-fold-body .dsm-fold { margin-left: -24px; width: calc(100% + 24px); }\n.dsm-pacct { display: flex; flex-direction: column; gap: 4px; min-width: 0; }\n.dsm-pacct .dsm-acct-head { font-size: 12px; line-height: 18px; }\n.dsm-others { padding-bottom: 0; }\n.dsm-others .dsm-psec { border-top: 0; padding: 0 0 0 16px; }\n.dsm-gauge > svg { color: var(--dsw-alias-label-secondary); }\n.dsm-pin { color: var(--dsw-alias-label-tertiary); }\n.dsm-pin[aria-pressed=\"true\"] { color: var(--dsw-alias-label-primary); }\n\n.dsm-notice { display: flex; gap: 8px; align-items: center; padding: 6px 6px 6px 12px; font-size: 13px; line-height: 20px; color: var(--dsw-alias-label-primary);\n background: var(--dsw-specific-menu, var(--dsw-alias-bg-overlay)); border-radius: var(--dsw-radius-lg); border: .5px solid var(--dsw-alias-border-l2);\n box-shadow: var(--dsw-elevation-panel, 0 12px 32px #0006); animation: dsm-drop .45s cubic-bezier(.16, 1, .3, 1); }\n.dsm-notice > svg { color: var(--dsw-alias-state-warn-primary); }\n.dsm-notice.dsm-err > svg { color: var(--dsw-alias-state-error-primary); }\n.dsm-notice-host { position: fixed; top: 52px; right: 20px; z-index: 1000; max-width: calc(100vw - 40px); }\n@keyframes dsm-drop { from { opacity: 0; transform: translateY(-8px); filter: blur(4px); } }\n\n.dsh-subscription-speed button:hover:not(:disabled) { --dsh-subscription-speed-hover: var(--dsw-alias-interactive-bg-hover); }\n.dsh-subscription-speed button:active:not(:disabled) { --dsh-subscription-speed-hover: var(--dsw-alias-interactive-bg-active); }\n.dsh-subscription-speed button:disabled { opacity: .4; cursor: default; }\n.dsh-subscription-speed button:focus-visible { outline: var(--dsw-focus-ring-width, 2px) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary)); outline-offset: 2px; }\n\n@media (prefers-reduced-motion: reduce) { .dsm-sub *, .dsm-pop *, .dsm-notice, .dsm-fill { animation: none !important; transition: none !important; } }\n@media (max-width: 640px) {\n .dsm-wins { column-gap: 8px; grid-template-columns: fit-content(96px) minmax(40px, 1fr) 36px 84px; }\n .dsm-minis { gap: 8px; } .dsm-mini { grid-template-columns: auto 22px 32px; } .dsm-mini i { max-width: 56px; }\n .dsm-gp-name { display: none; }\n .dsm-footer-block .dsm-row { flex-wrap: wrap; padding: 6px 0; }\n}\n`\n","/**\n * Browser calls to the Host's `/api/subscriptions-auth.*` routes, and the\n * shapes those routes return. Only types cross from the Host modules, so the\n * bundle stays free of Node imports.\n */\nimport type { ConnectionHandle, RpcResult } from '@deepseek-ai/dsh-api-remotes/client'\nimport type { AccountStatus, ProviderStatus, ProviderAccountCatalog } from '../auth/rpc.js'\nimport type { ProviderId } from '../auth/store.js'\nimport type { KeyProviderId, KeyProviderView } from '../usage-providers/index.js'\nimport type { ProviderPreferences, SubscriptionTool } from '../provider-settings.js'\nimport type { DisplayUsage, UsageReadReason } from '../usage/service.js'\nimport type { ProxyConfigView, ProxyInput, ProxyTestResult } from '../http.js'\n\nexport type { KeyProviderId, KeyProviderView, AccountStatus, ProviderStatus, ProviderId, ProviderPreferences, DisplayUsage, UsageReadReason, ProxyConfigView, ProxyTestResult }\n\n/** Every provider this plugin can route, in Models-page order. Names and metering come from `status`. */\nexport const PROVIDERS: readonly ProviderId[] = ['codex', 'claude', 'grok', 'copilot', 'antigravity']\n\n/** Providers that read usage with a pasted key, in Usage-page order. Mirrors the Host's `KEY_PROVIDER_IDS`. */\nexport const KEY_PROVIDERS: readonly KeyProviderId[] = ['zai', 'ollama-cloud', 'kimi']\n\n/** Any provider the Usage page and gauge can show. */\nexport type UsageProviderId = ProviderId | KeyProviderId\n\nexport const USAGE_PROVIDERS: readonly UsageProviderId[] = [...PROVIDERS, ...KEY_PROVIDERS]\n\nexport const isUsageProviderId = (value: unknown): value is UsageProviderId =>\n typeof value === 'string' && (USAGE_PROVIDERS as readonly string[]).includes(value)\n\nexport const isProviderId = (value: unknown): value is ProviderId =>\n typeof value === 'string' && (PROVIDERS as readonly string[]).includes(value)\n\n/** The provider's short name from `status`, else its id. */\nexport const shortName = (status: StatusValue | undefined, provider: UsageProviderId): string =>\n status?.providers[provider]?.shortName ?? provider\n\n/** Whether the Host reports usage for this provider. */\nexport const isMetered = (status: StatusValue | undefined, provider: UsageProviderId): boolean =>\n status?.providers[provider]?.metered === true\n\n/** `status` response. */\nexport interface StatusValue {\n usageRevision: number\n /** Every key provider with whether a key is stored; configured ones also appear in `providers`. Absent from a Host that predates key providers. */\n keyProviders?: KeyProviderView[]\n providers: Partial<Record<UsageProviderId, ProviderStatus>>\n}\n\n/** One model row of `providerSettings`. */\nexport interface ProviderModelRow {\n id: string\n name: string\n contextWindow?: number\n efforts: { id: string; name: string }[]\n configured?: string\n}\n\n/** `providerSettings` response. */\nexport interface ProviderSettingsValue {\n provider: ProviderId\n settings: ProviderPreferences\n models: ProviderModelRow[]\n tools: readonly SubscriptionTool[]\n accounts: ProviderAccountCatalog[]\n}\n\n/** The Host's business error text. */\nexport class SubscriptionsAuthError extends Error {}\n\n/** Typed endpoint table: payload in, value out. */\nexport interface Endpoints {\n status: [{ sessionId?: string }, StatusValue]\n usage: [{ provider: UsageProviderId; account: string; reason: UsageReadReason }, DisplayUsage]\n keysSet: [{ provider: KeyProviderId; key: string }, { ok: true }]\n keysRemove: [{ provider: KeyProviderId }, { ok: true }]\n login: [{ provider: ProviderId; method?: 'oauth' | 'keychain' }, { authorizeUrl: string; userCode?: string }]\n manual: [{ provider: ProviderId; input: string }, { ok: true }]\n cancel: [{ provider: ProviderId }, { ok: true }]\n logout: [{ provider: ProviderId; account: string }, { ok: true }]\n setDefault: [{ provider: ProviderId; account: string }, { ok: true }]\n providerSettings: [{ provider: ProviderId; force?: boolean }, ProviderSettingsValue]\n setProviderSettings: [{ provider: ProviderId; settings: ProviderPreferences }, { ok: true }]\n setModelDefault: [{ provider: ProviderId; model: string; effort?: string }, { ok: true }]\n proxyGet: [Record<string, never>, ProxyConfigView]\n proxySet: [ProxyInput, ProxyConfigView]\n proxyTest: [{ url?: string; proxy?: { url: string } }, ProxyTestResult]\n image: [Record<string, unknown>, { mediaType: string; dataBase64: string }]\n video: [{ name: string }, { mediaType: string; dataBase64: string }]\n speed: [{ sessionId: string; model?: string }, { tier: 'standard' | 'fast'; fastModels: string[] }]\n setSpeed: [{ sessionId: string; tier: 'standard' | 'fast'; model?: string }, { ok: true }]\n}\n\n/**\n * Call one endpoint and unwrap its business result.\n * @throws SubscriptionsAuthError with the Host's message on transport or business failure.\n */\nexport async function call<E extends keyof Endpoints>(\n rpc: ConnectionHandle['rpc'],\n endpoint: E,\n payload: Endpoints[E][0],\n): Promise<Endpoints[E][1]> {\n let result: RpcResult<unknown>\n try {\n result = await rpc.call('/api', `subscriptions-auth.${endpoint}`, payload)\n } catch (error) {\n throw new SubscriptionsAuthError(error instanceof Error ? error.message : String(error))\n }\n if (!result.ok) throw new SubscriptionsAuthError(result.error.message)\n // The Host route owns this shape; the endpoint table mirrors it.\n return result.value as Endpoints[E][1]\n}\n","/**\n * One shared store per page for login status and usage, read by the Models\n * cards, the composer gauge, and its popover. It never fetches on its own\n * beyond the policy below; the Host decides whether a read reaches a provider.\n *\n * - `status` is read on start, every 5 minutes while the page is visible, after\n * a sign-in or account change, and after each turn the gauge observes.\n * - `usage` is re-read when `status.usageRevision` moves (a reply carried new\n * headers, or another surface fetched), when the popover opens (`open`), on\n * the Refresh button (`manual`), and every 5 minutes while visible (`poll`).\n */\nimport type { ConnectionHandle } from '@deepseek-ai/dsh-api-remotes/client'\nimport { call, isMetered, USAGE_PROVIDERS } from './rpc.js'\nimport type { AccountStatus, DisplayUsage, UsageProviderId as ProviderId, ProviderStatus, StatusValue, UsageReadReason } from './rpc.js'\n\nexport const POLL_MS = 5 * 60_000\n\n/** Usage of one account, or the failure that left it empty. */\nexport type UsageEntry =\n | { kind: 'loading' }\n | { kind: 'ready'; usage: DisplayUsage; receivedAt: number }\n | { kind: 'error'; message: string }\n\nexport interface StoreSnapshot {\n status: StatusValue | undefined\n statusError: string | undefined\n /** Keyed `${provider}/${account}`. */\n usage: ReadonlyMap<string, UsageEntry>\n /** Accounts with a read in flight, keyed like `usage`. */\n refreshing: ReadonlySet<string>\n}\n\nexport const usageKey = (provider: ProviderId, account: string): string => `${provider}/${account}`\n\nexport class SubscriptionsStore {\n private snapshot: StoreSnapshot = { status: undefined, statusError: undefined, usage: new Map(), refreshing: new Set() }\n private readonly listeners = new Set<() => void>()\n private lastRevision = -1\n private statusInFlight: Promise<void> | undefined\n private timer: ReturnType<typeof setInterval> | undefined\n /** The session the gauge is showing, so `status` reports its serving account. */\n private sessionId: string | undefined\n\n constructor(private readonly rpc: ConnectionHandle['rpc']) {}\n\n getSnapshot = (): StoreSnapshot => this.snapshot\n\n subscribe = (listener: () => void): (() => void) => {\n this.listeners.add(listener)\n if (this.listeners.size === 1) this.start()\n return () => {\n this.listeners.delete(listener)\n if (this.listeners.size === 0) this.stop()\n }\n }\n\n /** Report the session whose serving account the `status` read should name. */\n focusSession(sessionId: string | undefined): void {\n if (this.sessionId === sessionId) return\n this.sessionId = sessionId\n void this.refreshStatus()\n }\n\n /** Re-read login status; usage follows when the Host's revision moved. */\n refreshStatus(): Promise<void> {\n this.statusInFlight ??= this.readStatus().finally(() => { this.statusInFlight = undefined })\n return this.statusInFlight\n }\n\n /** Read every signed-in account's usage under one reason. */\n async refreshUsage(reason: UsageReadReason, only?: ProviderId): Promise<void> {\n const status = this.snapshot.status\n if (status === undefined) return\n await Promise.all(USAGE_PROVIDERS.filter(p => (only === undefined || p === only) && isMetered(status, p))\n .flatMap(provider => (status.providers[provider]?.accounts ?? []).map(account => this.readUsage(provider, account.key, reason))))\n }\n\n private async readStatus(): Promise<void> {\n try {\n const status = await call(this.rpc, 'status', this.sessionId === undefined ? {} : { sessionId: this.sessionId })\n const known = new Set(USAGE_PROVIDERS.flatMap(p => (status.providers[p]?.accounts ?? []).map(a => usageKey(p, a.key))))\n const usage = new Map([...this.snapshot.usage].filter(([key]) => known.has(key)))\n this.publish({ ...this.snapshot, status, statusError: undefined, usage })\n if (status.usageRevision !== this.lastRevision) {\n this.lastRevision = status.usageRevision\n await this.refreshUsage('poll')\n }\n } catch (error) {\n this.publish({ ...this.snapshot, statusError: error instanceof Error ? error.message : String(error) })\n }\n }\n\n private async readUsage(provider: ProviderId, account: string, reason: UsageReadReason): Promise<void> {\n const key = usageKey(provider, account)\n if (!this.snapshot.usage.has(key)) this.setUsage(key, { kind: 'loading' })\n this.publish({ ...this.snapshot, refreshing: new Set([...this.snapshot.refreshing, key]) })\n try {\n const usage = await call(this.rpc, 'usage', { provider, account, reason })\n this.setUsage(key, { kind: 'ready', usage, receivedAt: Date.now() })\n } catch (error) {\n const previous = this.snapshot.usage.get(key)\n // Keep showing a real snapshot through a failure; the Host already marks it stale.\n if (previous?.kind !== 'ready') this.setUsage(key, { kind: 'error', message: error instanceof Error ? error.message : String(error) })\n } finally {\n const refreshing = new Set(this.snapshot.refreshing)\n refreshing.delete(key)\n this.publish({ ...this.snapshot, refreshing })\n }\n }\n\n private setUsage(key: string, entry: UsageEntry): void {\n const usage = new Map(this.snapshot.usage)\n usage.set(key, entry)\n this.publish({ ...this.snapshot, usage })\n }\n\n private publish(next: StoreSnapshot): void {\n this.snapshot = next\n for (const listener of this.listeners) listener()\n }\n\n private readonly onVisibility = (): void => {\n if (document.visibilityState === 'visible') void this.refreshStatus()\n }\n\n private start(): void {\n void this.refreshStatus()\n this.timer = setInterval(() => {\n if (document.visibilityState !== 'visible') return\n void this.refreshStatus().then(() => this.refreshUsage('poll'))\n }, POLL_MS)\n document.addEventListener('visibilitychange', this.onVisibility)\n }\n\n private stop(): void {\n if (this.timer !== undefined) clearInterval(this.timer)\n this.timer = undefined\n document.removeEventListener('visibilitychange', this.onVisibility)\n }\n}\n\n/** The account a provider is using now: the one that served last, else the default, else the first. */\nexport function activeAccountKey(status: ProviderStatus | undefined): string | undefined {\n if (status === undefined || status.accounts.length === 0) return undefined\n const served = status.servingAccount\n if (served !== undefined && status.accounts.some(a => a.key === served)) return served\n return (status.accounts.find(a => a.isDefault) ?? status.accounts[0])?.key\n}\n\n/** The active account shown in full, and the others that fold behind one row. */\nexport function splitAccounts(status: ProviderStatus): { active: AccountStatus; rest: AccountStatus[] } | undefined {\n const key = activeAccountKey(status)\n const active = status.accounts.find(a => a.key === key)\n if (active === undefined) return undefined\n return { active, rest: status.accounts.filter(a => a !== active) }\n}\n","/**\n * Usage preferences live in this plugin's volatile `usage` Config field, so\n * they persist in the profile and reach every tab. The Client reads them\n * through the settings forms service and validates the section where it\n * enters.\n */\nimport type { UsageProviderId as ProviderId } from './rpc.js'\nimport { isUsageProviderId } from './rpc.js'\n\nexport type { ProviderId }\n\nexport interface UsagePreferencesView {\n /** Show usage under the composer: the current model's provider plus `pinned`. */\n composer: boolean\n pinned: readonly ProviderId[]\n display: 'left' | 'used'\n paceWarnings: boolean\n /** Whether writes reach the profile. */\n writable: boolean\n}\n\nexport const DEFAULT_PREFS: UsagePreferencesView = { composer: true, pinned: [], display: 'left', paceWarnings: true, writable: false }\n\n/** The slice of a settings ConfigForm this store uses. */\nexport interface ConfigFormLike {\n getSnapshot(): { status: string; value: unknown; writable: boolean }\n subscribe(listener: () => void): () => void\n mutate(ops: readonly ({ op: 'set'; path: string[]; value: unknown } | { op: 'unset'; path: string[] })[]): Promise<boolean>\n}\n\n/** Narrow the namespace section's `usage` field, falling back field by field. */\nexport function parsePrefs(section: unknown, writable: boolean): UsagePreferencesView {\n const usage = section !== null && typeof section === 'object' && 'usage' in section ? section.usage : undefined\n if (usage === null || typeof usage !== 'object') return { ...DEFAULT_PREFS, writable }\n const read = (key: string): unknown => (key in usage ? (usage as Record<string, unknown>)[key] : undefined)\n const composer = read('composer')\n // Profiles saved before `composer` existed carry a three-way `gauge` mode.\n const legacyGauge = read('gauge')\n const display = read('display')\n const pinned = read('pinned')\n const pace = read('paceWarnings')\n return {\n composer: typeof composer === 'boolean' ? composer : legacyGauge !== 'off',\n pinned: Array.isArray(pinned) ? pinned.filter(isUsageProviderId) : [],\n display: display === 'used' ? 'used' : 'left',\n paceWarnings: typeof pace === 'boolean' ? pace : true,\n writable,\n }\n}\n\nexport class PrefsStore {\n private snapshot: UsagePreferencesView = DEFAULT_PREFS\n private readonly listeners = new Set<() => void>()\n private unsubscribe: (() => void) | undefined\n private form: ConfigFormLike | undefined\n\n getSnapshot = (): UsagePreferencesView => this.snapshot\n\n subscribe = (listener: () => void): (() => void) => {\n this.listeners.add(listener)\n return () => { this.listeners.delete(listener) }\n }\n\n /** Bind the form once the settings service is available; returns the unbinder. */\n bind(form: ConfigFormLike): () => void {\n this.form = form\n const sync = (): void => {\n const view = form.getSnapshot()\n if (view.status !== 'ready') return\n this.publish(parsePrefs(view.value, view.writable))\n }\n this.unsubscribe = form.subscribe(sync)\n sync()\n return () => {\n this.unsubscribe?.()\n this.form = undefined\n }\n }\n\n /** Change some preferences; the shown value updates at once and settles on the Host's answer. */\n async set(patch: Partial<Omit<UsagePreferencesView, 'writable'>>): Promise<boolean> {\n const next = { ...this.snapshot, ...patch }\n this.publish(next)\n if (this.form === undefined) return false\n const ops: Parameters<ConfigFormLike['mutate']>[0][number][] = Object.entries(patch).map(([key, value]) => ({ op: 'set' as const, path: ['usage', key], value }))\n // `composer` replaces the legacy `gauge` mode; drop it on the first write.\n ops.push({ op: 'unset', path: ['usage', 'gauge'] })\n return this.form.mutate(ops)\n }\n\n togglePinned(provider: ProviderId): Promise<boolean> {\n const pinned = this.snapshot.pinned.includes(provider)\n ? this.snapshot.pinned.filter(p => p !== provider)\n : [...this.snapshot.pinned, provider]\n return this.set({ pinned })\n }\n\n private publish(next: UsagePreferencesView): void {\n this.snapshot = next\n for (const listener of this.listeners) listener()\n }\n}\n","/**\n * Pace of one usage window: how much quota is used against how much of the\n * window has elapsed, and whether the current rate empties the window before\n * it resets. Pure, so the Host and the browser bundle share one definition.\n */\nimport type { UsageWindow } from '../providers/common.js'\n\n/** Below this share of elapsed window a burst says little about the whole window. */\nexport const MIN_FORECAST_ELAPSED = 0.2\n/** Below this usage the projection is noise. */\nexport const MIN_FORECAST_USED_PERCENT = 3\n/** Projected use above this percent turns a window `tight`. */\nexport const TIGHT_PROJECTED_PERCENT = 85\n\n/** Pace of one window. `calm` and `tight` may carry a projection; `over` always does. */\nexport type Pace =\n | { state: 'unknown' }\n | { state: 'out'; usedPercent: number }\n | { state: 'calm'; usedPercent: number; elapsed?: number; projectedPercent?: number }\n | { state: 'tight'; usedPercent: number; elapsed: number; projectedPercent: number }\n | { state: 'over'; usedPercent: number; elapsed: number; projectedPercent: number; emptyAt: number }\n\n/** The states a meter colors by. */\nexport type PaceState = Pace['state']\n\n/**\n * Compute the pace of one window at `now`.\n * @param window - the provider-reported window.\n * @param now - epoch milliseconds.\n * @returns the pace; `elapsed` is the share of the window passed, 0 to 1.\n */\nexport function pace(window: UsageWindow, now: number): Pace {\n const used = window.usedPercent\n if (!Number.isFinite(used)) return { state: 'unknown' }\n const usedPercent = Math.max(0, Math.min(100, used))\n if (usedPercent >= 100) return { state: 'out', usedPercent }\n const { durationMs, resetsAt } = window\n if (durationMs === undefined || resetsAt === undefined || !(durationMs > 0) || !Number.isFinite(resetsAt)) {\n return { state: 'calm', usedPercent }\n }\n const elapsed = Math.min(1, Math.max(0, 1 - (resetsAt - now) / durationMs))\n if (elapsed < MIN_FORECAST_ELAPSED || usedPercent < MIN_FORECAST_USED_PERCENT) {\n return { state: 'calm', usedPercent, elapsed }\n }\n const projectedPercent = usedPercent / elapsed\n if (projectedPercent > 100) {\n const ratePerMs = usedPercent / (elapsed * durationMs)\n return { state: 'over', usedPercent, elapsed, projectedPercent, emptyAt: now + (100 - usedPercent) / ratePerMs }\n }\n if (projectedPercent > TIGHT_PROJECTED_PERCENT) return { state: 'tight', usedPercent, elapsed, projectedPercent }\n return { state: 'calm', usedPercent, elapsed, projectedPercent }\n}\n\n/** Whether quota reads as remaining or as consumed. Display only; routing reads `usedPercent`. */\nexport type QuotaDisplay = 'left' | 'used'\n\n/**\n * The percent a meter shows.\n * @param window - the window to show.\n * @param display - left or used.\n * @returns an integer percent, or undefined when the provider reported none.\n */\nexport function displayPercent(window: UsageWindow, display: QuotaDisplay): number | undefined {\n if (!Number.isFinite(window.usedPercent)) return undefined\n const used = Math.round(Math.max(0, Math.min(100, window.usedPercent)))\n return display === 'left' ? 100 - used : used\n}\n","/**\n * Shared pieces of every usage surface: icons, the pace bar, one window row,\n * and the compact mini meter. All copy and colors route through the locale\n * `t` and `--dsw-alias-*` tokens.\n */\nimport type { ReactNode } from 'react'\nimport type { UsageWindow } from '../providers/common.js'\nimport { displayPercent, pace } from '../usage/pace.js'\nimport type { Pace, QuotaDisplay } from '../usage/pace.js'\nimport { format } from './locales.js'\nimport type { SubscriptionsKey } from './locales.js'\n\nexport type T = (key: SubscriptionsKey) => string\n\n/** Translate with placeholders. */\nexport function tf(t: T, key: SubscriptionsKey, params: Record<string, string | number>): string {\n return format(t(key), params)\n}\n\nconst PATHS = {\n refresh: <><path d=\"M13.5 8a5.5 5.5 0 1 1-1.6-3.9\" /><path d=\"M13.5 2.5v3h-3\" /></>,\n alert: <><path d=\"M8 1.8 15 14H1z\" /><path d=\"M8 6.3v3.4M8 11.8v.01\" /></>,\n check: <path d=\"m3.5 8.3 3 3 6-6.6\" />,\n star: <path d=\"m8 2 1.8 3.8 4.2.5-3.1 2.9.8 4.1L8 11.3 4.3 13.3l.8-4.1L2 6.3l4.2-.5z\" fill=\"currentColor\" />,\n bolt: <path d=\"M9 1.8 3.5 9H8l-1 5.2L12.5 7H8z\" fill=\"currentColor\" stroke=\"none\" />,\n pin: <><path d=\"M6 2.5h4l-.6 4 2.1 2.2v1H4.5v-1l2.1-2.2z\" /><path d=\"M8 9.7v3.8\" /></>,\n pinFilled: <><path d=\"M6 2.5h4l-.6 4 2.1 2.2v1H4.5v-1l2.1-2.2z\" fill=\"currentColor\" /><path d=\"M8 9.7v3.8\" /></>,\n gear: <><circle cx=\"8\" cy=\"8\" r=\"2.2\" /><path d=\"M8 1.8v1.6M8 12.6v1.6M1.8 8h1.6M12.6 8h1.6M3.6 3.6l1.1 1.1M11.3 11.3l1.1 1.1M3.6 12.4l1.1-1.1M11.3 4.7l1.1-1.1\" /></>,\n ext: <path d=\"M9 3h4v4M13 3 7.5 8.5M12 9.5V13H3V4h3.5\" />,\n copy: <><rect x=\"5\" y=\"5\" width=\"8.5\" height=\"8.5\" rx=\"1.5\" /><path d=\"M11 5V3.5A1.5 1.5 0 0 0 9.5 2h-6A1.5 1.5 0 0 0 2 3.5v6A1.5 1.5 0 0 0 3.5 11H5\" /></>,\n x: <path d=\"m4 4 8 8M12 4l-8 8\" />,\n right: <path d=\"m6 4 4 4-4 4\" />,\n down: <path d=\"m5 6.5 3 3 3-3\" />,\n meter: <><path d=\"M2.5 11a5.5 5.5 0 0 1 11 0\" /><path d=\"m8 11 2.6-3.2\" /></>,\n sparkle: <path d=\"M8 1.5 9.4 6.6 14.5 8 9.4 9.4 8 14.5 6.6 9.4 1.5 8 6.6 6.6z\" fill=\"currentColor\" stroke=\"none\" />,\n} as const\n\nexport type IconName = keyof typeof PATHS\n\n/** One 16-unit stroke icon. */\nexport function Icon({ name, size = 14, className }: { name: IconName; size?: number; className?: string }) {\n return (\n <svg className={className} width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\"\n strokeWidth={1.5} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" style={{ flex: 'none', display: 'block' }}>\n {PATHS[name]}\n </svg>\n )\n}\n\nconst H = 3_600_000\nconst D = 24 * H\n\n/** \"3h 6m\", \"2d 12h\", \"42m\". */\nexport function shortDuration(ms: number): string {\n // Round once, then split, so 4h 59.6m reads 5h rather than 4h 60m.\n const total = Math.max(1, Math.round(ms / 60_000))\n const days = Math.floor(total / 1440)\n const hours = Math.floor((total % 1440) / 60)\n const minutes = total % 60\n if (days > 0) return hours > 0 ? `${days}d ${hours}h` : `${days}d`\n if (hours > 0) return minutes > 0 ? `${hours}h ${minutes}m` : `${hours}h`\n return `${Math.max(1, minutes)}m`\n}\n\n/**\n * A short point in time in the browser's locale: \"6:04 PM\" today, \"Wed\" within\n * the week, \"12 Nov\" beyond. The day alone keeps the time column narrow; the\n * tooltip carries the exact reset time.\n */\nexport function clockTime(at: number, now: number): string {\n const date = new Date(at)\n if (date.toDateString() === new Date(now).toDateString()) {\n return date.toLocaleTimeString(undefined, { hour: 'numeric', minute: '2-digit' })\n }\n if (Math.abs(at - now) < 6 * D) return date.toLocaleDateString(undefined, { weekday: 'short' })\n return date.toLocaleDateString(undefined, { day: 'numeric', month: 'short' })\n}\n\n/** Weekday and time, for tooltips. */\nexport function fullTime(at: number): string {\n return new Date(at).toLocaleString(undefined, { weekday: 'short', hour: 'numeric', minute: '2-digit' })\n}\n\n/** The window's length as \"5h\", \"7d\" or \"30d\", rounded to a whole unit; undefined when unknown. */\nexport function lengthLabel(durationMs: number | undefined): string | undefined {\n if (durationMs === undefined || !Number.isFinite(durationMs) || durationMs <= 0) return undefined\n const hours = Math.round(durationMs / 3_600_000)\n if (hours < 1) return `${Math.max(1, Math.round(durationMs / 60_000))}m`\n return hours < 48 ? `${hours}h` : `${Math.round(hours / 24)}d`\n}\n\n/** \"5h\", \"7d\", \"30d\": the window's own length, else its kind, else \"limit\". */\nexport function kindLabel(t: T, kind: UsageWindow['kind'], durationMs?: number): string {\n const length = lengthLabel(durationMs)\n if (length !== undefined) return length\n return kind === 'session' ? t('window5h') : kind === 'weekly' ? t('window7d') : t('windowOther')\n}\n\n/** The length label, with a model scope when the window has one. A per-model quota is named by its scope alone. */\nexport function windowLabel(t: T, window: UsageWindow): string {\n if (window.scope === undefined) return kindLabel(t, window.kind, window.durationMs)\n return window.kind === 'other' ? window.scope : `${kindLabel(t, window.kind, window.durationMs)} ${window.scope}`\n}\n\n/** A window as shown, with the models it stands for when several share one quota. */\nexport type ShownWindow = UsageWindow & { models?: string[] }\n\nconst FAMILY_NAMES: Record<string, string> = { gemini: 'Gemini', claude: 'Claude', gpt: 'GPT' }\n\n/** \"claude-opus-4-6-thinking\" becomes \"Claude\"; \"tab_flash_lite\" becomes \"Tab\". */\nfunction modelFamily(id: string): string {\n const head = id.split(/[-_]/)[0] ?? id\n return FAMILY_NAMES[head.toLowerCase()] ?? head.charAt(0).toUpperCase() + head.slice(1)\n}\n\n/**\n * Per-model windows that report the same usage and reset share one quota pool\n * (Antigravity reports one window per model), so they merge into one row named\n * by model family. A per-model window at 0% with no reset carries no information\n * and is hidden. Unscoped windows pass through unchanged.\n */\nexport function shownWindows(windows: readonly UsageWindow[] | undefined): ShownWindow[] {\n const out: ShownWindow[] = []\n const groups = new Map<string, { window: UsageWindow; models: string[] }>()\n for (const window of windows ?? []) {\n if (window.scope === undefined || window.kind !== 'other') {\n out.push(window)\n continue\n }\n if (window.resetsAt === undefined && window.usedPercent === 0) continue\n const minute = window.resetsAt === undefined ? '' : String(Math.round(window.resetsAt / 60_000))\n const key = `${Math.round(window.usedPercent)}/${minute}`\n const group = groups.get(key)\n if (group === undefined) {\n const entry = { window, models: [window.scope] }\n groups.set(key, entry)\n } else {\n group.models.push(window.scope)\n }\n }\n for (const { window, models } of groups.values()) {\n const families = [...new Set(models.map(modelFamily))]\n out.push({ ...window, scope: families.join(' · '), models })\n }\n return out\n}\n\n/**\n * What compact surfaces show: unscoped windows, session first. A provider that\n * only reports per-model windows (Antigravity) shows its two most used instead.\n */\nexport function primaryWindows(windows: readonly UsageWindow[] | undefined): ShownWindow[] {\n const order = { session: 0, weekly: 1, other: 2 } as const\n const all = shownWindows(windows)\n const unscoped = all.filter(w => w.scope === undefined).sort((a, b) => order[a.kind] - order[b.kind])\n if (unscoped.length > 0) return unscoped\n return [...all].sort((a, b) => b.usedPercent - a.usedPercent).slice(0, 2)\n}\n\n/** The pace bar: fill is quota, hatch is the forecast, color is the pace state. Drains in `left` mode. */\nexport function Bar({ window, p, display, height = 6 }: { window: UsageWindow; p: Pace; display: QuotaDisplay; height?: number }) {\n const used = p.state === 'unknown' ? 0 : p.usedPercent\n const left = display === 'left'\n const fill = left ? 100 - used : used\n let projection: ReactNode = null\n if (p.state === 'over' || p.state === 'tight') {\n const end = Math.min(100, p.projectedPercent)\n projection = <span className=\"dsm-proj\" style={left ? { left: `${100 - end}%`, width: `${end - used}%` } : { left: `${used}%`, width: `${end - used}%` }} />\n }\n return (\n <span className={`dsm-bar dsm-${p.state}`} style={{ height }} role=\"meter\" aria-valuemin={0} aria-valuemax={100}\n aria-valuenow={displayPercent(window, display) ?? 0}>\n <span className=\"dsm-fill\" style={{ width: `${fill}%` }} />\n {projection}\n </span>\n )\n}\n\nfunction valueText(window: UsageWindow, display: QuotaDisplay): string {\n const value = displayPercent(window, display)\n return value === undefined ? '–' : `${value}%`\n}\n\n/** The time column: when this changes next. */\nfunction timeText(t: T, window: UsageWindow, p: Pace, now: number): string {\n if (p.state === 'out' && window.resetsAt !== undefined) return tf(t, 'backAt', { time: clockTime(window.resetsAt, now) })\n if (p.state === 'over') return tf(t, 'emptyAt', { time: clockTime(p.emptyAt, now) })\n return window.resetsAt === undefined ? '' : tf(t, 'resetsIn', { time: shortDuration(Math.max(0, window.resetsAt - now)) })\n}\n\nfunction tooltip(t: T, window: ShownWindow, p: Pace, now: number): string {\n if (p.state === 'unknown') return t('notReported')\n const used = Math.round(p.usedPercent)\n const lines = [...window.models ?? [], tf(t, 'tipUsedLeft', { used, left: 100 - used })]\n if (window.used !== undefined && window.limit !== undefined) {\n lines.push(tf(t, 'tipCount', { used: Math.round(window.used), limit: window.limit }))\n }\n if ((p.state === 'calm' || p.state === 'tight' || p.state === 'over') && p.elapsed !== undefined) {\n lines.push(tf(t, 'tipElapsed', { percent: Math.round(p.elapsed * 100) }))\n }\n if (p.state === 'tight') lines.push(tf(t, 'tipPace', { percent: Math.round(p.projectedPercent) }))\n if (p.state === 'over') lines.push(tf(t, 'emptyAt', { time: fullTime(p.emptyAt) }))\n if (window.resetsAt !== undefined) lines.push(tf(t, 'tipResets', { time: fullTime(window.resetsAt) }))\n return lines.join('\\n')\n}\n\n/** One window on the shared grid: label | bar | value | time. */\nexport function WindowRow({ t, window, display, now }: { t: T; window: ShownWindow; display: QuotaDisplay; now: number }) {\n const p = pace(window, now)\n const tip = tooltip(t, window, p, now)\n // The row is `display: contents` so its cells sit on the shared grid; each cell carries the tooltip.\n return (\n <div className={`dsm-w dsm-${p.state}`}>\n <span className=\"dsm-wl\" title={window.scope === undefined ? tip : `${windowLabel(t, window)}\\n${tip}`}>{windowLabel(t, window)}</span>\n <span title={tip}><Bar window={window} p={p} display={display} /></span>\n <span className=\"dsm-wv\" title={tip}>{valueText(window, display)}</span>\n <span className=\"dsm-wt\" title={tip}>{timeText(t, window, p, now)}</span>\n </div>\n )\n}\n\n/** Label, small bar and value, for summary rows and the gauge. */\nexport function Mini({ t, window, display, now }: { t: T; window: ShownWindow; display: QuotaDisplay; now: number }) {\n const p = pace(window, now)\n return (\n <span className={`dsm-mini dsm-${p.state}`} title={window.scope === undefined ? tooltip(t, window, p, now) : `${window.scope}\\n${tooltip(t, window, p, now)}`}>\n <i>{window.kind === 'other' && window.scope !== undefined ? window.scope : kindLabel(t, window.kind, window.durationMs)}</i>\n <Bar window={window} p={p} display={display} height={4} />\n <b>{valueText(window, display)}</b>\n </span>\n )\n}\n\n/** The mini meters of an account's unscoped windows. */\nexport function Minis({ t, windows, display, now }: { t: T; windows: readonly UsageWindow[] | undefined; display: QuotaDisplay; now: number }) {\n const shown = primaryWindows(windows)\n if (shown.length === 0) return null\n return <span className=\"dsm-minis\">{shown.map((w, i) => <Mini key={i} t={t} window={w} display={display} now={now} />)}</span>\n}\n","import { useEffect, useState } from 'react'\n\n/** The current time, re-read every `intervalMs`, so countdowns advance without a fetch. */\nexport function useNow(intervalMs: number): number {\n const [now, setNow] = useState(() => Date.now())\n useEffect(() => {\n const timer = setInterval(() => { setNow(Date.now()) }, intervalMs)\n return () => { clearInterval(timer) }\n }, [intervalMs])\n return now\n}\n","/**\n * What every surface receives through slot `inject`: the shared store, the\n * RPC caller, the copy function, and the usage preferences form.\n */\nimport { useSyncExternalStore } from 'react'\nimport type { ConnectionHandle } from '@deepseek-ai/dsh-api-remotes/client'\nimport type { ProviderId, UsagePreferencesView } from './prefs.js'\nimport type { SubscriptionsStore, StoreSnapshot } from './store.js'\nimport type { T } from './meter.js'\nimport type { PrefsStore } from './prefs.js'\n\nexport interface SurfaceInjected {\n store: SubscriptionsStore\n prefs: PrefsStore\n rpc: ConnectionHandle['rpc']\n t: T\n /** Open Settings at the Models page, when the shell offers it. */\n openSettings?: () => void\n}\n\nexport function useStore(store: SubscriptionsStore): StoreSnapshot {\n return useSyncExternalStore(store.subscribe, store.getSnapshot)\n}\n\nexport function usePrefs(prefs: PrefsStore): UsagePreferencesView {\n return useSyncExternalStore(prefs.subscribe, prefs.getSnapshot)\n}\n\nexport type { ProviderId }\n","/**\n * The body of one subscription row on the Models page, rendered in the\n * `settings.models.provider-card` slot. The active account shows in full;\n * other accounts fold behind one summary row; Manage opens Accounts, Models\n * and Tools inline.\n */\nimport { useEffect, useRef, useState } from 'react'\nimport type { PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\n// Type-only: the Models page's SlotMap merge (`settings.models.provider-card`).\nimport type {} from '@deepseek-ai/dsh-client-ui-settings-models/client'\nimport type { AccountStatus, ProviderId, UsageProviderId, ProviderModelRow, ProviderPreferences, ProviderSettingsValue, ProviderStatus } from './rpc.js'\nimport { call, isMetered, isProviderId } from './rpc.js'\nimport { splitAccounts, usageKey } from './store.js'\nimport type { StoreSnapshot } from './store.js'\nimport { Icon, shortDuration, shownWindows, tf, WindowRow } from './meter.js'\nimport type { T } from './meter.js'\nimport { useNow } from './hooks.js'\nimport { usePrefs, useStore } from './context.js'\nimport type { SurfaceInjected } from './context.js'\nimport type { UsagePreferencesView } from './prefs.js'\n\nexport type ProviderCardProps = PropsRuntime<'settings.models.provider-card'> & Partial<SurfaceInjected>\n\n/** How often a busy sign-in re-reads status until the account lands. */\nconst SIGN_IN_POLL_MS = 2000\n\nexport function ProviderCard(props: ProviderCardProps) {\n const { store, prefs, rpc, t } = props\n const provider = props.provider.provider\n if (store === undefined || prefs === undefined || rpc === undefined || t === undefined || !isProviderId(provider)) return null\n return <CardBody provider={provider} store={store} prefs={prefs} rpc={rpc} t={t} />\n}\n\ntype Mode = { kind: 'view' } | { kind: 'manage' } | { kind: 'signin'; userCode?: string; url?: string }\n\nfunction CardBody({ provider, store, prefs, rpc, t }: { provider: ProviderId } & SurfaceInjected) {\n const snapshot = useStore(store)\n const prefView = usePrefs(prefs)\n const now = useNow(30_000)\n const status = snapshot.status?.providers[provider]\n const [mode, setMode] = useState<Mode>({ kind: 'view' })\n const [error, setError] = useState<string | undefined>()\n const [moreOpen, setMoreOpen] = useState(false)\n\n // A busy sign-in polls status until the account lands or the attempt ends.\n const busy = status?.busy === true\n useEffect(() => {\n if (mode.kind !== 'signin' && !busy) return\n const timer = setInterval(() => { void store.refreshStatus() }, SIGN_IN_POLL_MS)\n return () => { clearInterval(timer) }\n }, [mode.kind, busy, store])\n const accountCount = status?.accounts.length ?? 0\n const startCount = useRef(accountCount)\n useEffect(() => {\n if (mode.kind === 'signin' && !busy && accountCount !== startCount.current) setMode({ kind: 'view' })\n }, [mode.kind, busy, accountCount])\n useEffect(() => {\n if (status?.detail !== undefined) setError(status.detail)\n }, [status?.detail])\n\n const signIn = async (method?: 'oauth' | 'keychain'): Promise<void> => {\n setError(undefined)\n startCount.current = accountCount\n try {\n const response = await call(rpc, 'login', { provider, ...method === undefined ? {} : { method } })\n if (response.authorizeUrl === '') {\n await store.refreshStatus()\n return\n }\n if (response.userCode !== undefined && response.userCode !== '') {\n setMode({ kind: 'signin', userCode: response.userCode, url: response.authorizeUrl })\n } else {\n window.open(response.authorizeUrl, '_blank', 'noopener')\n setMode({ kind: 'signin' })\n }\n void store.refreshStatus()\n } catch (failure) {\n setError(failure instanceof Error ? failure.message : String(failure))\n }\n }\n const cancel = async (): Promise<void> => {\n setMode({ kind: 'view' })\n await call(rpc, 'cancel', { provider }).catch(() => undefined)\n await store.refreshStatus()\n }\n\n if (status === undefined) {\n return snapshot.statusError === undefined ? null : <div className=\"dsm-sub\"><span className=\"dsm-card-error\">{snapshot.statusError}</span></div>\n }\n\n if (mode.kind === 'signin') {\n return (\n <div className=\"dsm-sub\">\n <SignIn t={t} provider={provider} mode={mode} rpc={rpc} onCancel={() => { void cancel() }} onError={setError} />\n {error === undefined ? null : <span className=\"dsm-card-error\" role=\"alert\">{error}</span>}\n </div>\n )\n }\n\n if (status.accounts.length === 0) {\n return (\n <div className=\"dsm-sub\">\n <div className=\"dsm-foot\">\n <button type=\"button\" className=\"dsm-btn dsm-primary\" onClick={() => { void signIn() }}>{t('signIn')}</button>\n {provider === 'claude'\n ? <button type=\"button\" className=\"dsm-btn dsm-ghost\" onClick={() => { void signIn('keychain') }}>{t('claudeImport')}</button>\n : <span className=\"dsm-muted\">{t('noApiKey')}</span>}\n </div>\n {error === undefined ? null : <span className=\"dsm-card-error\" role=\"alert\">{error}</span>}\n </div>\n )\n }\n\n const split = splitAccounts(status)\n if (split === undefined) return null\n const { active, rest } = split\n\n return (\n <div className=\"dsm-sub\">\n <Account t={t} provider={provider} account={active} status={status} snapshot={snapshot} prefs={prefView} now={now} hideUsage onSignIn={() => { void signIn() }} />\n {rest.length === 0 ? null : (\n <>\n <button type=\"button\" className=\"dsm-fold\" aria-expanded={moreOpen} onClick={() => { setMoreOpen(open => !open) }}>\n <span className=\"dsm-fold-name\">\n <Icon name=\"right\" size={12} className=\"dsm-chev\" />\n <span>{rest.length === 1 ? label(rest[0]!) : tf(t, 'moreAccounts', { count: rest.length })}</span>\n {rest.length === 1 ? <AccountTags t={t} account={rest[0]!} status={status} /> : null}\n </span>\n </button>\n {moreOpen ? (\n <div className=\"dsm-fold-body\">\n {rest.map(account => <Account key={account.key} t={t} provider={provider} account={account} status={status} snapshot={snapshot} prefs={prefView} now={now} hideUsage onSignIn={() => { void signIn() }} />)}\n </div>\n ) : null}\n </>\n )}\n {mode.kind === 'manage'\n ? <ManagePanel t={t} provider={provider} status={status} rpc={rpc} onClose={() => { setMode({ kind: 'view' }); void store.refreshStatus() }}\n onAddAccount={() => { void signIn() }} />\n : (\n <div className=\"dsm-foot\">\n <button type=\"button\" className=\"dsm-btn\" onClick={() => { setMode({ kind: 'manage' }) }}>{t('manage')}</button>\n <PickerCount t={t} status={status} />\n </div>\n )}\n {error === undefined ? null : <span className=\"dsm-card-error\" role=\"alert\">{error}</span>}\n </div>\n )\n}\n\nconst label = (account: AccountStatus): string => account.account ?? account.key\n\nfunction usageOf(snapshot: StoreSnapshot, provider: UsageProviderId, account: string) {\n const entry = snapshot.usage.get(usageKey(provider, account))\n return entry?.kind === 'ready' ? entry.usage : undefined\n}\n\n/** Plan tag, default star, and serving bolt. */\nexport function AccountTags({ t, account, status }: { t: T; account: AccountStatus; status: ProviderStatus }) {\n return (\n <>\n {account.plan === undefined ? null : <span className=\"dsm-tag\">{account.plan}</span>}\n {account.isDefault ? <span className=\"dsm-glyph dsm-star\" title={t('defaultAccount')} aria-label={t('defaultAccount')}><Icon name=\"star\" size={12} /></span> : null}\n {status.servingAccount === account.key\n ? <span className=\"dsm-glyph dsm-live\" title={t('servingAccount')} aria-label={t('servingAccount')}><Icon name=\"bolt\" size={12} /></span>\n : null}\n </>\n )\n}\n\n/** \"live\", \"4m ago\", or a stale warning, at the end of an account header. */\nexport function Freshness({ t, snapshot, provider, account, now }: { t: T; snapshot: StoreSnapshot; provider: UsageProviderId; account: string; now: number }) {\n if (!isMetered(snapshot.status, provider)) return <span className=\"dsm-fresh\" title={t('noUsageDataTitle')}>{t('noUsageData')}</span>\n const entry = snapshot.usage.get(usageKey(provider, account))\n if (entry === undefined || entry.kind === 'loading') return null\n if (entry.kind === 'error') return <span className=\"dsm-fresh dsm-stale\" title={entry.message}><Icon name=\"alert\" size={12} />{t('usageUnavailable')}</span>\n const usage = entry.usage\n const fetchedAt = usage.fetchedAt ?? entry.receivedAt\n if (usage.refreshFailed === true || usage.stale === true && usage.retryAt !== undefined) {\n const when = usage.retryAt === undefined ? '' : tf(t, 'resetsIn', { time: shortDuration(Math.max(0, usage.retryAt - now)) })\n return (\n <span className=\"dsm-fresh dsm-stale\" title={tf(t, 'staleTitle', { when })}>\n <Icon name=\"alert\" size={12} />{tf(t, 'staleShort', { time: shortDuration(Math.max(0, now - fetchedAt)) })}\n </span>\n )\n }\n if (usage.source === 'live' && now - fetchedAt < 10 * 60_000) {\n return <span className=\"dsm-fresh\" title={t('liveTitle')}><span className=\"dsm-live-dot\" />{t('live')}</span>\n }\n return <span className=\"dsm-fresh\">{tf(t, 'agoShort', { time: shortDuration(Math.max(0, now - fetchedAt)) })}</span>\n}\n\n/** One account: header, then its windows on the shared grid. */\nexport function Account({ t, provider, account, status, snapshot, prefs, now, onSignIn, compact, hideUsage }: {\n t: T; provider: UsageProviderId; account: AccountStatus; status: ProviderStatus; snapshot: StoreSnapshot\n prefs: UsagePreferencesView; now: number; onSignIn?: () => void; compact?: boolean; hideUsage?: boolean\n}) {\n const usage = usageOf(snapshot, provider, account.key)\n const expired = usage === undefined && snapshot.usage.get(usageKey(provider, account.key))?.kind === 'error'\n && account.expiresAt !== undefined && account.expiresAt < now\n return (\n <div className={compact === true ? 'dsm-pacct' : 'dsm-acct'}>\n <div className=\"dsm-acct-head\">\n <span className=\"dsm-acct-name\">{label(account)}</span>\n <AccountTags t={t} account={account} status={status} />\n {hideUsage === true ? null : <Freshness t={t} snapshot={snapshot} provider={provider} account={account.key} now={now} />}\n </div>\n {expired && onSignIn !== undefined ? (\n <div className=\"dsm-alert\" role=\"alert\">\n <Icon name=\"alert\" /><span>{t('signInExpired')}</span>\n <button type=\"button\" className=\"dsm-btn dsm-primary\" onClick={onSignIn}>{t('signInAgain')}</button>\n </div>\n ) : hideUsage === true || usage?.windows === undefined || usage.windows.length === 0 ? null : (\n <div className=\"dsm-wins\">\n {shownWindows(usage.windows).map((window, index) => <WindowRow key={index} t={t} window={window} display={prefs.display} now={now} />)}\n </div>\n )}\n </div>\n )\n}\n\nfunction PickerCount({ t, status }: { t: T; status: ProviderStatus }) {\n const total = status.catalogSize\n if (total === undefined) return null\n const visible = status.visibleModels === undefined ? total : status.visibleModels.length\n return <span className=\"dsm-muted dsm-num\" title={t('modelsCountTitle')}>{tf(t, 'modelsCount', { visible, total })}</span>\n}\n\nfunction SignIn({ t, provider, mode, rpc, onCancel, onError }: {\n t: T; provider: ProviderId; mode: Extract<Mode, { kind: 'signin' }>; rpc: SurfaceInjected['rpc']\n onCancel: () => void; onError: (message: string | undefined) => void\n}) {\n const [draft, setDraft] = useState('')\n if (mode.userCode !== undefined) {\n return (\n <div className=\"dsm-signin\">\n <ol className=\"dsm-steps\">\n <li data-s=\"done\"><Icon name=\"check\" size={12} />{t('stepCodeIssued')}</li>\n <li data-s=\"now\"><span className=\"dsm-spin\" />{t('stepWaitingGithub')}</li>\n </ol>\n <div className=\"dsm-foot\" style={{ flexWrap: 'wrap' }}>\n <span className=\"dsm-code\">{mode.userCode}</span>\n <button type=\"button\" className=\"dsm-btn dsm-icon\" aria-label={t('copyCode')} title={t('copyCode')}\n onClick={() => { void navigator.clipboard?.writeText(mode.userCode ?? '') }}><Icon name=\"copy\" /></button>\n {mode.url === undefined ? null : (\n <a className=\"dsm-btn\" href={mode.url} target=\"_blank\" rel=\"noopener noreferrer\">{new URL(mode.url).host + new URL(mode.url).pathname}<Icon name=\"ext\" size={12} /></a>\n )}\n <button type=\"button\" className=\"dsm-btn dsm-ghost\" style={{ marginLeft: 'auto' }} onClick={onCancel}>{t('cancel')}</button>\n </div>\n </div>\n )\n }\n const submit = async (): Promise<void> => {\n const input = draft.trim()\n if (input === '') return\n onError(undefined)\n try {\n await call(rpc, 'manual', { provider, input })\n setDraft('')\n } catch (failure) {\n onError(failure instanceof Error ? failure.message : String(failure))\n }\n }\n return (\n <div className=\"dsm-signin\">\n <ol className=\"dsm-steps\">\n <li data-s=\"done\"><Icon name=\"check\" size={12} />{t('stepTabOpened')}</li>\n <li data-s=\"now\"><span className=\"dsm-spin\" />{t('stepApprove')}</li>\n <li><Icon name=\"check\" size={12} />{t('stepLoadModels')}</li>\n </ol>\n <div className=\"dsm-foot\" style={{ alignItems: 'flex-start' }}>\n <details className=\"dsm-fallback\" style={{ flex: 1 }}>\n <summary><Icon name=\"down\" size={12} />{t('pasteRedirect')}</summary>\n <form className=\"dsm-foot\" onSubmit={event => { event.preventDefault(); void submit() }}>\n <input className=\"dsm-input\" value={draft} placeholder={t('pastePlaceholder')} onChange={event => { setDraft(event.target.value) }} />\n <button type=\"submit\" className=\"dsm-btn\" disabled={draft.trim() === ''}>{t('continue')}</button>\n </form>\n </details>\n <button type=\"button\" className=\"dsm-btn dsm-ghost\" onClick={onCancel}>{t('cancel')}</button>\n </div>\n </div>\n )\n}\n\nconst TOOL_LABEL = { web_search: 'toolWebSearch', image_generate: 'toolImage', video_generate: 'toolVideo', x_search: 'toolXSearch' } as const\n\nfunction ManagePanel({ t, provider, status, rpc, onClose, onAddAccount }: {\n t: T; provider: ProviderId; status: ProviderStatus; rpc: SurfaceInjected['rpc']; onClose: () => void; onAddAccount: () => void\n}) {\n const [tab, setTab] = useState<'accounts' | 'models' | 'tools'>('accounts')\n const [loaded, setLoaded] = useState<ProviderSettingsValue | undefined>()\n const [draft, setDraft] = useState<ProviderPreferences | undefined>()\n const [efforts, setEfforts] = useState<Record<string, string | undefined>>({})\n const [search, setSearch] = useState('')\n const [saving, setSaving] = useState(false)\n const [error, setError] = useState<string | undefined>()\n\n useEffect(() => {\n let live = true\n call(rpc, 'providerSettings', { provider }).then(value => {\n if (!live) return\n setLoaded(value)\n setDraft(value.settings)\n }, (failure: unknown) => { if (live) setError(tf(t, 'loadFailed', { message: failure instanceof Error ? failure.message : String(failure) })) })\n return () => { live = false }\n }, [rpc, provider, t])\n\n const accountAction = async (endpoint: 'logout' | 'setDefault', account: string): Promise<void> => {\n setError(undefined)\n try {\n await call(rpc, endpoint, { provider, account })\n onClose()\n } catch (failure) {\n setError(failure instanceof Error ? failure.message : String(failure))\n }\n }\n\n const save = async (): Promise<void> => {\n if (draft === undefined || loaded === undefined) return\n setSaving(true)\n setError(undefined)\n try {\n await call(rpc, 'setProviderSettings', { provider, settings: draft })\n for (const [model, effort] of Object.entries(efforts)) {\n await call(rpc, 'setModelDefault', { provider, model, ...effort === undefined ? {} : { effort } })\n }\n onClose()\n } catch (failure) {\n setError(tf(t, 'saveFailed', { message: failure instanceof Error ? failure.message : String(failure) }))\n } finally {\n setSaving(false)\n }\n }\n\n const models = loaded?.models ?? []\n const allIds = models.map(m => m.id)\n const visible = new Set(draft?.visibleModels ?? allIds)\n const automatic = draft?.visibleModels === undefined\n const setVisible = (ids: string[] | undefined): void => {\n setDraft(current => {\n const next: ProviderPreferences = { ...current }\n if (ids === undefined) delete next.visibleModels\n else next.visibleModels = ids\n return next\n })\n }\n const accountPrefs = draft?.accounts ?? {}\n const setPool = (account: string, enabled: boolean): void => {\n setDraft(current => ({ ...current, accounts: { ...current?.accounts, [account]: { ...current?.accounts?.[account], poolEnabled: enabled } } }))\n }\n const toolsOn = draft?.tools ?? {}\n const shown = models.filter(m => search === '' || m.id.toLowerCase().includes(search.toLowerCase()) || m.name.toLowerCase().includes(search.toLowerCase()))\n\n return (\n <div className=\"dsm-panel\">\n <div className=\"dsm-tabs\" role=\"tablist\">\n {(['accounts', 'models', 'tools'] as const).filter(id => id !== 'tools' || (loaded?.tools.length ?? 0) > 0).map(id => (\n <button key={id} type=\"button\" role=\"tab\" className=\"dsm-tab\" aria-selected={tab === id} onClick={() => { setTab(id) }}>\n {t(id === 'accounts' ? 'tabAccounts' : id === 'models' ? 'tabModels' : 'tabTools')}\n </button>\n ))}\n </div>\n {tab === 'accounts' ? (\n <>\n {status.accounts.map(account => (\n <div key={account.key} className=\"dsm-row\">\n <span className=\"dsm-grow\"><span className=\"dsm-ellipsis\">{label(account)}</span><AccountTags t={t} account={account} status={status} /></span>\n {status.accounts.length > 1 ? (\n <>\n <span className=\"dsm-note\">{t('pool')}</span>\n <button type=\"button\" role=\"switch\" className=\"dsm-switch\" aria-checked={accountPrefs[account.key]?.poolEnabled !== false}\n aria-label={tf(t, 'poolInclude', { account: label(account) })}\n onClick={() => { setPool(account.key, accountPrefs[account.key]?.poolEnabled === false) }} />\n </>\n ) : null}\n {account.isDefault ? null : (\n <button type=\"button\" className=\"dsm-btn dsm-icon\" title={t('makeDefault')} aria-label={t('makeDefault')}\n onClick={() => { void accountAction('setDefault', account.key) }}><Icon name=\"star\" /></button>\n )}\n <button type=\"button\" className=\"dsm-btn dsm-danger\" onClick={() => { void accountAction('logout', account.key) }}>{t('signOut')}</button>\n </div>\n ))}\n <div className=\"dsm-row\"><button type=\"button\" className=\"dsm-btn\" onClick={onAddAccount}>+ {t('addAccount')}</button></div>\n </>\n ) : null}\n {tab === 'models' ? (\n <>\n <input className=\"dsm-input\" value={search} placeholder={tf(t, 'searchModels', { count: models.length })} onChange={event => { setSearch(event.target.value) }} />\n <div className=\"dsm-row\">\n <span className=\"dsm-grow\">{t('autoShowNew')}</span>\n <button type=\"button\" role=\"switch\" className=\"dsm-switch\" aria-checked={automatic} aria-label={t('autoShowNew')}\n onClick={() => { setVisible(automatic ? allIds : undefined) }} />\n </div>\n <div className=\"dsm-row\">\n <button type=\"button\" className=\"dsm-btn\" onClick={() => { setVisible(allIds) }}>{t('selectAll')}</button>\n <button type=\"button\" className=\"dsm-btn\" onClick={() => { setVisible([]) }}>{t('deselectAll')}</button>\n </div>\n <div className=\"dsm-list\">\n {shown.map(model => (\n <ModelRow key={model.id} t={t} model={model} on={visible.has(model.id)}\n effort={model.id in efforts ? efforts[model.id] : model.configured}\n onToggle={() => {\n const next = new Set(visible)\n if (next.has(model.id)) next.delete(model.id); else next.add(model.id)\n setVisible(allIds.filter(id => next.has(id)))\n }}\n onEffort={effort => { setEfforts(current => ({ ...current, [model.id]: effort })) }} />\n ))}\n </div>\n <span className=\"dsm-note\">{tf(t, 'pickerCount', { visible: visible.size, total: models.length })}</span>\n </>\n ) : null}\n {tab === 'tools' ? (\n <>\n {(loaded?.tools ?? []).map(tool => (\n <div key={tool} className=\"dsm-row\">\n <span className=\"dsm-grow\">{t(TOOL_LABEL[tool])}</span>\n <button type=\"button\" role=\"switch\" className=\"dsm-switch\" aria-checked={toolsOn[tool] !== false} aria-label={t(TOOL_LABEL[tool])}\n onClick={() => { setDraft(current => ({ ...current, tools: { ...current?.tools, [tool]: current?.tools?.[tool] === false } })) }} />\n </div>\n ))}\n <span className=\"dsm-note\">{t('toolsNote')}</span>\n </>\n ) : null}\n <div className=\"dsm-panel-foot\">\n {error === undefined ? null : <span className=\"dsm-card-error\" role=\"alert\">{error}</span>}\n <button type=\"button\" className=\"dsm-btn dsm-ghost\" onClick={onClose}>{t('cancel')}</button>\n <button type=\"button\" className=\"dsm-btn dsm-primary\" disabled={saving || draft === undefined} onClick={() => { void save() }}>\n {saving ? t('saving') : t('save')}\n </button>\n </div>\n </div>\n )\n}\n\nfunction ModelRow({ t, model, on, effort, onToggle, onEffort }: {\n t: T; model: ProviderModelRow; on: boolean; effort: string | undefined; onToggle: () => void; onEffort: (effort: string | undefined) => void\n}) {\n return (\n <div className=\"dsm-row\">\n <button type=\"button\" role=\"switch\" className=\"dsm-switch\" aria-checked={on} aria-label={tf(t, 'showInPicker', { model: model.id })} onClick={onToggle} />\n <span className=\"dsm-grow\">\n <span className=\"dsm-ellipsis dsm-num\">{model.id}</span>\n {model.contextWindow === undefined ? null : <span className=\"dsm-note\">{Math.round(model.contextWindow / 1000)}K</span>}\n </span>\n {model.efforts.length === 0 ? null : (\n <select className=\"dsm-select\" aria-label={tf(t, 'effortFor', { model: model.id })} value={effort ?? ''}\n onChange={event => { onEffort(event.target.value === '' ? undefined : event.target.value) }}>\n <option value=\"\">{t('effortAuto')}</option>\n {model.efforts.map(level => <option key={level.id} value={level.id}>{level.name}</option>)}\n </select>\n )}\n </div>\n )\n}\n","/**\n * Plugin-wide options after the Models provider rows\n * (`settings.models.footer`): the subscription-only proxy. Usage options live in the Usage page.\n */\nimport { useEffect, useState } from 'react'\nimport type { ProxyConfigView } from './rpc.js'\nimport { call } from './rpc.js'\nimport { tf } from './meter.js'\nimport type { T } from './meter.js'\nimport type { SurfaceInjected } from './context.js'\n\nexport type FooterProps = Partial<SurfaceInjected>\n\nexport function Footer(props: FooterProps) {\n const { store, prefs, rpc, t } = props\n if (store === undefined || prefs === undefined || rpc === undefined || t === undefined) return null\n return <FooterBody rpc={rpc} t={t} />\n}\n\nfunction FooterBody({ rpc, t }: Omit<SurfaceInjected, 'store' | 'prefs'>) {\n return (\n <section className=\"dsm-footer-block\" aria-labelledby=\"dsm-footer-title\">\n <h3 id=\"dsm-footer-title\">{t('subscriptions')}</h3>\n <ProxyRow t={t} rpc={rpc} />\n </section>\n )\n}\n\nfunction ProxyRow({ t, rpc }: { t: T; rpc: SurfaceInjected['rpc'] }) {\n const [config, setConfig] = useState<ProxyConfigView | undefined>()\n const [open, setOpen] = useState(false)\n const [url, setUrl] = useState('')\n const [bypass, setBypass] = useState('')\n const [enabled, setEnabled] = useState(false)\n const [message, setMessage] = useState<string | undefined>()\n const [busy, setBusy] = useState(false)\n\n useEffect(() => {\n let live = true\n call(rpc, 'proxyGet', {}).then(value => { if (live) setConfig(value) }, () => undefined)\n return () => { live = false }\n }, [rpc])\n\n const edit = (): void => {\n setUrl(config?.url ?? '')\n setBypass((config?.bypass ?? []).join(', '))\n setEnabled(config?.enabled ?? false)\n setMessage(undefined)\n setOpen(true)\n }\n const save = async (): Promise<void> => {\n setBusy(true)\n setMessage(undefined)\n try {\n const saved = await call(rpc, 'proxySet', {\n enabled, url: url.trim(), bypass: bypass.split(',').map(entry => entry.trim()).filter(entry => entry !== ''),\n })\n setConfig(saved)\n setOpen(false)\n } catch (failure) {\n setMessage(tf(t, 'saveFailed', { message: failure instanceof Error ? failure.message : String(failure) }))\n } finally {\n setBusy(false)\n }\n }\n const test = async (): Promise<void> => {\n setBusy(true)\n setMessage(undefined)\n try {\n const result = await call(rpc, 'proxyTest', url.trim() === '' ? {} : { proxy: { url: url.trim() } })\n setMessage(result.ok && result.status !== undefined\n ? tf(t, 'proxyTestOk', { status: result.status, ms: result.latencyMs ?? 0 })\n : result.error ?? '')\n } catch (failure) {\n setMessage(failure instanceof Error ? failure.message : String(failure))\n } finally {\n setBusy(false)\n }\n }\n\n return (\n <>\n <div className=\"dsm-row\">\n <span className=\"dsm-grow\">{t('proxy')} <span className=\"dsm-note\">{config?.enabled === true ? config.url : t('proxyOff')}</span></span>\n {open ? null : <button type=\"button\" className=\"dsm-btn\" onClick={edit}>{t('configure')}</button>}\n </div>\n {open ? (\n <div className=\"dsm-panel\" style={{ paddingTop: 12 }}>\n <div className=\"dsm-row\">\n <span className=\"dsm-grow\">{t('proxyEnabled')}</span>\n <button type=\"button\" role=\"switch\" className=\"dsm-switch\" aria-checked={enabled} aria-label={t('proxyEnabled')} onClick={() => { setEnabled(value => !value) }} />\n </div>\n <input className=\"dsm-input\" value={url} placeholder=\"http://127.0.0.1:7890\" aria-label={t('proxyUrl')} onChange={event => { setUrl(event.target.value) }} />\n <input className=\"dsm-input\" value={bypass} placeholder={t('proxyBypass')} aria-label={t('proxyBypass')} onChange={event => { setBypass(event.target.value) }} />\n <div className=\"dsm-panel-foot\">\n {message === undefined ? null : <span className=\"dsm-note\" role=\"status\" style={{ marginRight: 'auto' }}>{message}</span>}\n <button type=\"button\" className=\"dsm-btn dsm-ghost\" disabled={busy} onClick={() => { void test() }}>{t('proxyTest')}</button>\n <button type=\"button\" className=\"dsm-btn dsm-ghost\" onClick={() => { setOpen(false) }}>{t('cancel')}</button>\n <button type=\"button\" className=\"dsm-btn dsm-primary\" disabled={busy} onClick={() => { void save() }}>{t('save')}</button>\n </div>\n </div>\n ) : null}\n </>\n )\n}\n","/**\n * The Usage settings page (`settings.section`): one block per signed-in\n * provider that reports usage, plus the display options. Accounts and models\n * stay on the Models page.\n */\nimport { useState } from 'react'\nimport { call, KEY_PROVIDERS } from './rpc.js'\nimport type { KeyProviderId } from './rpc.js'\nimport { splitAccounts, usageKey } from './store.js'\nimport type { StoreSnapshot } from './store.js'\nimport { Account } from './ProviderCard.js'\nimport { Icon, tf } from './meter.js'\nimport { useNow } from './hooks.js'\nimport { usePrefs, useStore } from './context.js'\nimport type { SurfaceInjected } from './context.js'\nimport type { UsageProviderId as ProviderId, ProviderStatus } from './rpc.js'\nimport { isMetered, USAGE_PROVIDERS, shortName } from './rpc.js'\n\n/** The Usage row's icon in the settings nav; the shell passes the edge size. */\nexport function UsageNavIcon({ size }: { size: number }) {\n return <Icon name=\"meter\" size={size} />\n}\n\nexport type UsageProps = Partial<SurfaceInjected>\n\nexport function Usage(props: UsageProps) {\n const { store, prefs, rpc, t } = props\n if (store === undefined || prefs === undefined || rpc === undefined || t === undefined) return null\n return <UsageBody store={store} prefs={prefs} rpc={rpc} t={t} />\n}\n\nfunction Segmented<V extends string>({ label, value, options, disabled, onChange }: {\n label: string; value: V; options: readonly (readonly [V, string])[]; disabled: boolean; onChange: (value: V) => void\n}) {\n return (\n <span className=\"dsm-seg\" role=\"group\" aria-label={label}>\n {options.map(([option, text]) => (\n <button key={option} type=\"button\" aria-pressed={value === option} disabled={disabled} onClick={() => { onChange(option) }}>{text}</button>\n ))}\n </span>\n )\n}\n\nfunction maxManualReady(snapshot: StoreSnapshot, provider: ProviderId, status: ProviderStatus): number | undefined {\n const times = status.accounts.map(a => {\n const entry = snapshot.usage.get(usageKey(provider, a.key))\n return entry?.kind === 'ready' ? entry.usage.manualReadyAt : undefined\n }).filter(at => at !== undefined)\n return times.length === 0 ? undefined : Math.max(...times)\n}\n\nfunction UsageBody({ store, prefs, rpc, t }: Omit<SurfaceInjected, never>) {\n const snapshot = useStore(store)\n const view = usePrefs(prefs)\n const now = useNow(30_000)\n const readOnly = !view.writable\n const providers = USAGE_PROVIDERS.filter(provider => {\n const status = snapshot.status?.providers[provider]\n return status !== undefined && status.accounts.length > 0 && isMetered(snapshot.status, provider)\n })\n return (\n <section className=\"dsm-footer-block dsm-usage\" aria-labelledby=\"dsm-usage-title\" style={{ marginTop: 0, borderTop: 'none', paddingTop: 0 }}>\n <h3 id=\"dsm-usage-title\">{t('usage')}</h3>\n <div className=\"dsm-row\">\n <span className=\"dsm-grow\">{t('showQuotaAs')}</span>\n <Segmented label={t('showQuotaAs')} value={view.display} disabled={readOnly}\n options={[['left', t('displayLeft')], ['used', t('displayUsed')]] as const}\n onChange={display => { void prefs.set({ display }) }} />\n </div>\n <div className=\"dsm-row\">\n <span className=\"dsm-grow\">{t('paceWarnings')}</span>\n <button type=\"button\" role=\"switch\" className=\"dsm-switch\" aria-checked={view.paceWarnings} aria-label={t('paceWarnings')} disabled={readOnly}\n onClick={() => { void prefs.set({ paceWarnings: !view.paceWarnings }) }} />\n </div>\n <div className=\"dsm-row\">\n <span className=\"dsm-grow\">{t('composerUsage')} <span className=\"dsm-note\">{t('composerUsageNote')}</span></span>\n <button type=\"button\" role=\"switch\" className=\"dsm-switch\" aria-checked={view.composer} aria-label={t('composerUsage')} disabled={readOnly}\n onClick={() => { void prefs.set({ composer: !view.composer }) }} />\n </div>\n {providers.length === 0 ? <p className=\"dsm-muted\" style={{ margin: '12px 0 0' }}>{t('usageEmpty')}</p> : null}\n {providers.map(provider => {\n const status = snapshot.status?.providers[provider]\n const split = status === undefined ? undefined : splitAccounts(status)\n if (status === undefined || split === undefined) return null\n const pinned = view.pinned.includes(provider)\n const pinLabel = pinned ? t('unpin') : t('pin')\n const refreshing = status.accounts.some(a => snapshot.refreshing.has(usageKey(provider, a.key)))\n const readyAt = maxManualReady(snapshot, provider, status)\n const cooling = readyAt !== undefined && readyAt > now\n return (\n <div key={provider} className=\"dsm-usage-block\" style={{ borderTop: '.5px solid var(--dsw-alias-border-l1)', padding: '10px 0' }}>\n <div className=\"dsm-row\" style={{ minHeight: 28 }}>\n <span className=\"dsm-grow\" style={{ fontWeight: 500 }}>{shortName(snapshot.status, provider)}</span>\n <button type=\"button\" className=\"dsm-btn dsm-icon dsm-pin\" aria-pressed={pinned} title={pinLabel} aria-label={pinLabel} disabled={readOnly}\n onClick={() => { void prefs.togglePinned(provider) }}>\n <Icon name={pinned ? 'pinFilled' : 'pin'} />\n </button>\n {isKey(provider) ? (\n <button type=\"button\" className=\"dsm-btn dsm-ghost\"\n onClick={() => { void call(rpc, 'keysRemove', { provider }).then(() => store.refreshStatus()) }}>{t('removeKey')}</button>\n ) : null}\n <button type=\"button\" className={`dsm-btn dsm-icon${refreshing ? ' dsm-spinning' : ''}`} disabled={refreshing || cooling}\n title={cooling ? tf(t, 'refreshedWait', { seconds: Math.ceil((readyAt - now) / 1000) }) : t('refreshUsage')}\n aria-label={tf(t, 'refreshUsageNamed', { name: provider })}\n onClick={() => { void store.refreshUsage('manual', provider) }}>\n <Icon name=\"refresh\" />\n </button>\n </div>\n <Account t={t} provider={provider} account={split.active} status={status} snapshot={snapshot} prefs={view} now={now} compact />\n {split.rest.map(account => <Account key={account.key} t={t} provider={provider} account={account} status={status} snapshot={snapshot} prefs={view} now={now} compact />)}\n </div>\n )\n })}\n <AddProvider t={t} store={store} rpc={rpc} unconfigured={KEY_PROVIDERS.filter(id => snapshot.status?.keyProviders?.find(v => v.id === id)?.configured !== true)} names={snapshot.status?.keyProviders ?? []} />\n </section>\n )\n}\n\nconst isKey = (provider: ProviderId): provider is KeyProviderId => (KEY_PROVIDERS as readonly string[]).includes(provider)\n\nfunction AddProvider({ t, store, rpc, unconfigured, names }: {\n t: SurfaceInjected['t']; store: SurfaceInjected['store']; rpc: SurfaceInjected['rpc']\n unconfigured: readonly KeyProviderId[]; names: readonly { id: KeyProviderId; name: string }[]\n}) {\n const [picked, setPicked] = useState<KeyProviderId | undefined>()\n const [key, setKey] = useState('')\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState<string | undefined>()\n if (unconfigured.length === 0) return null\n const save = async (id: KeyProviderId): Promise<void> => {\n setBusy(true)\n setError(undefined)\n try {\n await call(rpc, 'keysSet', { provider: id, key })\n setKey('')\n setPicked(undefined)\n await store.refreshStatus()\n } catch (failure) {\n setError(failure instanceof Error ? failure.message : String(failure))\n } finally {\n setBusy(false)\n }\n }\n const nameOf = (id: KeyProviderId): string => names.find(v => v.id === id)?.name ?? id\n return (\n <div className=\"dsm-usage-block\" style={{ borderTop: '.5px solid var(--dsw-alias-border-l1)', padding: '10px 0' }}>\n <div className=\"dsm-row\" style={{ minHeight: 28 }}>\n <span className=\"dsm-grow dsm-muted\">{t('addProvider')}</span>\n {unconfigured.map(id => (\n <button key={id} type=\"button\" className=\"dsm-btn\" aria-pressed={picked === id} onClick={() => { setPicked(picked === id ? undefined : id); setError(undefined) }}>{nameOf(id)}</button>\n ))}\n </div>\n {picked === undefined ? null : (\n <div className=\"dsm-panel\" style={{ paddingTop: 8 }}>\n <input className=\"dsm-input\" type=\"password\" autoComplete=\"off\" value={key} placeholder={t('apiKey')} aria-label={`${nameOf(picked)} ${t('apiKey')}`}\n onChange={event => { setKey(event.target.value) }} />\n <div className=\"dsm-panel-foot\">\n <span className=\"dsm-note\" role=\"status\" style={{ marginRight: 'auto' }}>{busy ? t('keyChecking') : error ?? t('keyHelp')}</span>\n <button type=\"button\" className=\"dsm-btn dsm-primary\" disabled={busy || key.trim() === ''} onClick={() => { void save(picked) }}>{t('addKey')}</button>\n </div>\n </div>\n )}\n </div>\n )\n}\n","/**\n * Composer usage gauge and its popover. Rendered under the composer\n * (`conversation.composer.dock`) once a conversation exists, and in the\n * New Session row (`conversation.hero.options`) before the first prompt.\n */\nimport { useEffect, useLayoutEffect, useRef, useState, useSyncExternalStore } from 'react'\nimport { createPortal } from 'react-dom'\nimport type { UsageProviderId as ProviderId } from './rpc.js'\nimport { isMetered, isUsageProviderId, USAGE_PROVIDERS, shortName } from './rpc.js'\nimport { activeAccountKey, splitAccounts, usageKey } from './store.js'\nimport type { StoreSnapshot } from './store.js'\nimport { Icon, Minis, tf } from './meter.js'\nimport type { T } from './meter.js'\nimport { Account } from './ProviderCard.js'\nimport { useNow } from './hooks.js'\nimport { usePrefs, useStore } from './context.js'\nimport type { SurfaceInjected } from './context.js'\nimport type { UsagePreferencesView } from './prefs.js'\n\n/** The session's model selection, as `modelDirectories` publishes it. */\nexport interface CurrentModelSource {\n getSnapshot(): { current: { provider: string; model: string } | null }\n subscribe(listener: () => void): () => void\n}\n\nexport interface GaugeInjected extends SurfaceInjected {\n sessionId: string\n /** Undefined when the model-selection service is not mounted. */\n currentModel: CurrentModelSource | undefined\n}\n\nconst noSubscribe = (): (() => void) => () => undefined\n\n/** Select the provider string itself, so the snapshot compares by value. */\nfunction useCurrentProvider(source: CurrentModelSource | undefined): string | undefined {\n return useSyncExternalStore(source?.subscribe ?? noSubscribe, () => source?.getSnapshot().current?.provider)\n}\n\n/** A provider the composer can show: signed in and reporting usage. */\nconst showable = (snapshot: StoreSnapshot, id: ProviderId): boolean =>\n isMetered(snapshot.status, id) && (snapshot.status?.providers[id]?.accounts.length ?? 0) > 0\n\n/** Providers the gauge shows: the current model's provider first, then the pinned ones. */\nexport function gaugeProviders(prefs: UsagePreferencesView, current: string | undefined, snapshot: StoreSnapshot): ProviderId[] {\n if (snapshot.status === undefined) return []\n const ids = new Set<ProviderId>(isUsageProviderId(current) ? [current, ...prefs.pinned] : prefs.pinned)\n return [...ids].filter(id => showable(snapshot, id))\n}\n\n/** Every provider the popover can list: the shown ones first, then the rest in page order. */\nexport function popoverProviders(shown: readonly ProviderId[], snapshot: StoreSnapshot): { shown: ProviderId[]; others: ProviderId[] } {\n return { shown: [...shown], others: USAGE_PROVIDERS.filter(id => !shown.includes(id) && showable(snapshot, id)) }\n}\n\nfunction windowsOf(snapshot: StoreSnapshot, provider: ProviderId) {\n const key = activeAccountKey(snapshot.status?.providers[provider])\n if (key === undefined) return undefined\n const entry = snapshot.usage.get(usageKey(provider, key))\n return entry?.kind === 'ready' ? entry.usage.windows : undefined\n}\n\nexport type GaugeProps = Partial<GaugeInjected>\n\nexport function Gauge(props: GaugeProps) {\n const { store, prefs, rpc, t, sessionId } = props\n if (store === undefined || prefs === undefined || rpc === undefined || t === undefined || sessionId === undefined) return null\n return <GaugeBody {...props} store={store} prefs={prefs} rpc={rpc} t={t} sessionId={sessionId} currentModel={props.currentModel} />\n}\n\nfunction GaugeBody({ store, prefs, t, sessionId, currentModel, openSettings }: GaugeInjected) {\n const snapshot = useStore(store)\n const prefView = usePrefs(prefs)\n const current = useCurrentProvider(currentModel)\n const now = useNow(30_000)\n const [open, setOpen] = useState(false)\n const anchor = useRef<HTMLButtonElement>(null)\n\n useEffect(() => { store.focusSession(sessionId) }, [store, sessionId])\n\n if (!prefView.composer || snapshot.status === undefined) return null\n const shown = gaugeProviders(prefView, current, snapshot)\n // Nothing to show and nothing to open: no subscription reports usage.\n if (shown.length === 0 && popoverProviders(shown, snapshot).others.length === 0) return null\n\n const toggle = (): void => {\n setOpen(value => {\n // Opening re-reads anything older than a minute; the Host enforces that bound.\n if (!value) void store.refreshUsage('open')\n return !value\n })\n }\n\n return (\n <span className=\"dsm-gauge-slot\">\n <button ref={anchor} type=\"button\" className=\"dsm-gauge\" aria-expanded={open} aria-haspopup=\"dialog\" aria-label={t('usageLabel')}\n title={shown.length === 0 ? t('usageLabel') : undefined} onClick={toggle}>\n {shown.length === 0 ? <Icon name=\"meter\" /> : shown.map(provider => (\n <span key={provider} className=\"dsm-gp\">\n <span className=\"dsm-gp-name\">{shortName(snapshot.status, provider)}</span>\n <Minis t={t} windows={windowsOf(snapshot, provider)} display={prefView.display} now={now} />\n </span>\n ))}\n </button>\n {open ? createPortal(\n <Popover t={t} store={store} prefs={prefs} snapshot={snapshot} prefView={prefView} shown={shown} now={now}\n anchor={anchor} onClose={() => { setOpen(false); anchor.current?.focus() }}\n {...openSettings === undefined ? {} : { onOpenSettings: () => { setOpen(false); openSettings() } }} />,\n document.body,\n ) : null}\n </span>\n )\n}\n\nfunction Popover({ t, store, prefs, snapshot, prefView, shown, now, anchor, onClose, onOpenSettings }: {\n t: T; store: SurfaceInjected['store']; prefs: SurfaceInjected['prefs']; snapshot: StoreSnapshot; prefView: UsagePreferencesView\n shown: ProviderId[]; now: number; anchor: React.RefObject<HTMLButtonElement | null>; onClose: () => void; onOpenSettings?: () => void\n}) {\n const panel = useRef<HTMLDivElement>(null)\n const [position, setPosition] = useState<{ left: number; top: number } | undefined>()\n const [openSections, setOpenSections] = useState(() => new Set<ProviderId>(shown))\n const [othersOpen, setOthersOpen] = useState(false)\n const [openMore, setOpenMore] = useState(() => new Set<ProviderId>())\n const [manualAt, setManualAt] = useState<number | undefined>()\n\n // Above the anchor like the host's stat dialogs; below it when there is no room (the New Session row).\n useLayoutEffect(() => {\n const place = (): void => {\n const a = anchor.current?.getBoundingClientRect()\n const p = panel.current?.getBoundingClientRect()\n if (a === undefined || p === undefined) return\n const left = Math.min(Math.max(8, a.left + a.width / 2 - p.width / 2), window.innerWidth - p.width - 8)\n const above = a.top - p.height - 8\n setPosition({ left, top: above >= 8 ? above : a.bottom + 8 })\n }\n place()\n window.addEventListener('resize', place)\n return () => { window.removeEventListener('resize', place) }\n }, [anchor, openSections, openMore, othersOpen, snapshot])\n\n useEffect(() => {\n const onKey = (event: KeyboardEvent): void => { if (event.key === 'Escape') onClose() }\n const onPointer = (event: PointerEvent): void => {\n const target = event.target\n if (!(target instanceof Node)) return\n if (panel.current?.contains(target) === true || anchor.current?.contains(target) === true) return\n onClose()\n }\n document.addEventListener('keydown', onKey)\n document.addEventListener('pointerdown', onPointer, true)\n return () => {\n document.removeEventListener('keydown', onKey)\n document.removeEventListener('pointerdown', onPointer, true)\n }\n }, [anchor, onClose])\n\n const { others } = popoverProviders(shown, snapshot)\n const refreshing = snapshot.refreshing.size > 0\n const cooling = manualAt !== undefined && now - manualAt < 30_000\n const toggleIn = (set: Set<ProviderId>, id: ProviderId): Set<ProviderId> => {\n const next = new Set(set)\n if (next.has(id)) next.delete(id); else next.add(id)\n return next\n }\n\n const renderSection = (provider: ProviderId) => {\n const status = snapshot.status?.providers[provider]\n if (status === undefined) return null\n const split = splitAccounts(status)\n if (split === undefined) return null\n const { active, rest } = split\n const sectionOpen = openSections.has(provider)\n const pinned = prefView.pinned.includes(provider)\n const pinLabel = pinned ? t('unpin') : t('pin')\n return (\n <div key={provider} className=\"dsm-psec\">\n <div className=\"dsm-psec-head\">\n <button type=\"button\" className=\"dsm-fold\" aria-expanded={sectionOpen} onClick={() => { setOpenSections(s => toggleIn(s, provider)) }}>\n <span className=\"dsm-fold-name\"><Icon name=\"right\" size={12} className=\"dsm-chev\" /><span className=\"dsm-psec-name\">{shortName(snapshot.status, provider)}</span></span>\n {sectionOpen ? <span /> : <Minis t={t} windows={windowsOf(snapshot, provider)} display={prefView.display} now={now} />}\n </button>\n <button type=\"button\" className=\"dsm-btn dsm-icon dsm-sm dsm-pin\" aria-pressed={pinned} title={pinLabel} aria-label={pinLabel}\n onClick={() => { void prefs.togglePinned(provider) }}>\n <Icon name={pinned ? 'pinFilled' : 'pin'} size={12} />\n </button>\n </div>\n {sectionOpen ? (\n <div className=\"dsm-fold-body\">\n <Account t={t} provider={provider} account={active} status={status} snapshot={snapshot} prefs={prefView} now={now} compact />\n {rest.length === 0 ? null : (\n <>\n <button type=\"button\" className=\"dsm-fold\" aria-expanded={openMore.has(provider)} onClick={() => { setOpenMore(s => toggleIn(s, provider)) }}>\n <span className=\"dsm-fold-name\">\n <Icon name=\"right\" size={12} className=\"dsm-chev\" />\n <span>{rest.length === 1 ? rest[0]!.account ?? rest[0]!.key : tf(t, 'moreAccounts', { count: rest.length })}</span>\n </span>\n {rest.length === 1 ? <MinisFor t={t} snapshot={snapshot} provider={provider} account={rest[0]!.key} prefs={prefView} now={now} /> : <span />}\n </button>\n {openMore.has(provider) ? (\n <div className=\"dsm-fold-body\">\n {rest.map(account => <Account key={account.key} t={t} provider={provider} account={account} status={status} snapshot={snapshot} prefs={prefView} now={now} compact />)}\n </div>\n ) : null}\n </>\n )}\n </div>\n ) : null}\n </div>\n )\n }\n\n return (\n <div ref={panel} className=\"dsm-pop\" role=\"dialog\" aria-label={t('usageLabel')}\n style={position === undefined ? { visibility: 'hidden', left: 0, top: 0 } : { left: position.left, top: position.top }}>\n <div className=\"dsm-pop-head\">\n <b>{t('usage')}</b>\n <button type=\"button\" className={`dsm-btn dsm-icon${refreshing ? ' dsm-spinning' : ''}`} disabled={refreshing || cooling}\n title={cooling ? tf(t, 'refreshedWait', { seconds: Math.ceil((30_000 - (now - (manualAt ?? now))) / 1000) }) : t('refreshNow')}\n aria-label={t('refreshNow')}\n onClick={() => { setManualAt(Date.now()); void store.refreshUsage('manual') }}>\n <Icon name={cooling && !refreshing ? 'check' : 'refresh'} />\n </button>\n {onOpenSettings === undefined ? null : (\n <button type=\"button\" className=\"dsm-btn dsm-icon\" title={t('usageSettings')} aria-label={t('usageSettings')} onClick={onOpenSettings}>\n <Icon name=\"gear\" />\n </button>\n )}\n </div>\n {shown.map(renderSection)}\n {/* With nothing shown (a model without usage), the rest is the whole list, so it needs no fold. */}\n {shown.length === 0 ? others.map(renderSection) : others.length === 0 ? null : (\n <div className=\"dsm-psec dsm-others\">\n <button type=\"button\" className=\"dsm-fold\" aria-expanded={othersOpen} onClick={() => { setOthersOpen(value => !value) }}>\n <span className=\"dsm-fold-name\"><Icon name=\"right\" size={12} className=\"dsm-chev\" /><span className=\"dsm-psec-name\">{tf(t, 'otherProviders', { count: others.length })}</span></span>\n <span />\n </button>\n {othersOpen ? others.map(renderSection) : null}\n </div>\n )}\n </div>\n )\n}\n\nfunction MinisFor({ t, snapshot, provider, account, prefs, now }: { t: T; snapshot: StoreSnapshot; provider: ProviderId; account: string; prefs: UsagePreferencesView; now: number }) {\n const entry = snapshot.usage.get(usageKey(provider, account))\n return <Minis t={t} windows={entry?.kind === 'ready' ? entry.usage.windows : undefined} display={prefs.display} now={now} />\n}\n","/**\n * Frame-wide pace notice in `shell.overlay`: one line when a window will\n * empty before it resets, or has run out. Each crossing shows once and stays\n * dismissed for that window, keyed by provider, account, window and reset.\n */\nimport { useEffect, useMemo, useState } from 'react'\nimport type { UsageWindow } from '../providers/common.js'\nimport { pace } from '../usage/pace.js'\nimport { isMetered, USAGE_PROVIDERS, shortName } from './rpc.js'\nimport type { UsageProviderId as ProviderId } from './rpc.js'\nimport { usageKey } from './store.js'\nimport type { StoreSnapshot } from './store.js'\nimport { clockTime, Icon, tf, windowLabel } from './meter.js'\nimport type { T } from './meter.js'\nimport { useNow } from './hooks.js'\nimport { usePrefs, useStore } from './context.js'\nimport type { SurfaceInjected } from './context.js'\n\nconst DISMISSED_KEY = 'dsh-plugin-subscription-usage.dismissed-notices'\n\nexport interface PaceNotice {\n id: string\n tone: 'warn' | 'error'\n text: string\n}\n\n/** Dismissals survive reloads; one entry per window crossing. */\nfunction readDismissed(): Set<string> {\n try {\n const raw: unknown = JSON.parse(localStorage.getItem(DISMISSED_KEY) ?? '[]')\n return new Set(Array.isArray(raw) ? raw.filter((id): id is string => typeof id === 'string') : [])\n } catch {\n return new Set()\n }\n}\n\n/**\n * The most urgent notice across the serving accounts, or undefined.\n * Only serving or default accounts warn; an idle account's pace is not the user's problem yet.\n */\nexport function currentNotice(t: T, snapshot: StoreSnapshot, now: number, dismissed: ReadonlySet<string>): PaceNotice | undefined {\n const candidates: (PaceNotice & { rank: number })[] = []\n for (const provider of USAGE_PROVIDERS) {\n if (!isMetered(snapshot.status, provider)) continue\n const status = snapshot.status?.providers[provider]\n if (status === undefined) continue\n for (const account of status.accounts) {\n if (account.key !== status.servingAccount && !account.isDefault) continue\n const entry = snapshot.usage.get(usageKey(provider, account.key))\n if (entry?.kind !== 'ready') continue\n for (const window of entry.usage.windows ?? []) {\n const notice = noticeFor(t, shortName(snapshot.status, provider), provider, account.key, window, now)\n if (notice !== undefined && !dismissed.has(notice.id)) candidates.push(notice)\n }\n }\n }\n candidates.sort((a, b) => a.rank - b.rank)\n const top = candidates[0]\n return top === undefined ? undefined : { id: top.id, tone: top.tone, text: top.text }\n}\n\nfunction noticeFor(t: T, name: string, provider: ProviderId, account: string, window: UsageWindow, now: number): (PaceNotice & { rank: number }) | undefined {\n const p = pace(window, now)\n const id = `${provider}/${account}/${window.kind}/${window.scope ?? ''}/${window.resetsAt ?? ''}`\n const label = windowLabel(t, window)\n if (p.state === 'out') return { id: `${id}/out`, tone: 'error', rank: 0, text: tf(t, 'noticeOut', { provider: name, window: label }) }\n if (p.state === 'over') {\n return { id: `${id}/over`, tone: 'warn', rank: p.emptyAt - now, text: tf(t, 'noticeEmpty', { provider: name, window: label, time: clockTime(p.emptyAt, now) }) }\n }\n return undefined\n}\n\nexport type NoticeProps = Partial<SurfaceInjected>\n\nexport function Notice(props: NoticeProps) {\n const { store, prefs, t } = props\n if (store === undefined || prefs === undefined || t === undefined) return null\n return <NoticeBody store={store} prefs={prefs} t={t} />\n}\n\nfunction NoticeBody({ store, prefs, t }: Pick<SurfaceInjected, 'store' | 'prefs' | 't'>) {\n const snapshot = useStore(store)\n const view = usePrefs(prefs)\n const now = useNow(60_000)\n const [dismissed, setDismissed] = useState(readDismissed)\n const notice = useMemo(() => view.paceWarnings ? currentNotice(t, snapshot, now, dismissed) : undefined, [view.paceWarnings, t, snapshot, now, dismissed])\n\n useEffect(() => {\n const onStorage = (event: StorageEvent): void => { if (event.key === DISMISSED_KEY) setDismissed(readDismissed()) }\n window.addEventListener('storage', onStorage)\n return () => { window.removeEventListener('storage', onStorage) }\n }, [])\n\n if (notice === undefined) return null\n const dismiss = (): void => {\n const next = new Set(dismissed)\n next.add(notice.id)\n // Old windows never return; keep the list short.\n localStorage.setItem(DISMISSED_KEY, JSON.stringify([...next].slice(-50)))\n setDismissed(next)\n }\n return (\n <div className=\"dsm-notice-host\" style={{ pointerEvents: 'auto' }}>\n <div className={`dsm-notice${notice.tone === 'error' ? ' dsm-err' : ''}`} role=\"status\" aria-live=\"polite\">\n <Icon name=\"alert\" />\n <span>{notice.text}</span>\n <button type=\"button\" className=\"dsm-btn dsm-icon\" aria-label={t('dismiss')} title={t('dismiss')} onClick={dismiss}><Icon name=\"x\" /></button>\n </div>\n </div>\n )\n}\n","/**\n * Plugin-local image gallery for generated-image toolviews.\n *\n * Since web-app rc.8, `@deepseek-ai/dsh-client-ui-attachment`'s browser module\n * exports only its cordis plugin surface (`apply`/`inject`) — the React\n * components are no longer package values, so importing `ImageGallery` from it\n * yields `undefined` at runtime and crashes the toolview inside the slot error\n * boundary (the whole call row disappears). This module re-implements the\n * gallery contract the toolview needs (loader-driven thumbnails, retry on\n * failure, click-to-open lightbox) with the same sizing rules as the platform\n * component, keeping this plugin independent of harness component exports.\n */\nimport { useCallback, useEffect, useMemo, useState } from 'react'\nimport type { CSSProperties } from 'react'\n\n/**\n * Mirror of ImageAttachmentRef (packages/attachment/attachment/src/types.ts);\n * the brand on attachmentId is compile-time only, so string suffices here.\n */\nexport interface ImageAttachmentRef {\n attachmentId: string\n mediaType: string\n bytes: number\n width: number\n height: number\n name?: string\n}\n\n/** Loads a session-authorized durable image URL (resolves to a data/blob URL). */\nexport type ImageLoader = (attachment: ImageAttachmentRef) => Promise<string>\n\n/** Lightbox strings forwarded to the opened preview. */\nexport interface ImageLightboxLabels {\n dialog: string\n close: string\n}\n\n/** Message-image strings the owner resolves from its own locale namespace. */\nexport interface MessageImageLabels {\n /** Fallback display name for an unnamed image. */\n image: string\n /** Thumbnail tooltip inviting the original-image preview. */\n open: string\n /** Accessible thumbnail label; receives the image's display name. */\n openNamed: (label: string) => string\n /** Loading placeholder shown until bytes resolve. */\n loading: string\n /** Retry-control label shown when the load fails. */\n loadFailed: string\n /** Lightbox strings forwarded to the opened preview. */\n lightbox: ImageLightboxLabels\n}\n\n/** Display box for a lone image (platform rule): long edge 240px with the\n * rendered aspect ratio clamped to [0.25, 4] — the overflow is cropped by\n * `object-fit: cover` — and never upscaled past the image's natural size. The\n * crop anchor keeps the top of very tall images and the left of very wide\n * ones, where the informative content usually starts. */\nfunction singleFit(attachment: ImageAttachmentRef): { width: number; height: number; objectPosition: string } {\n const natural = attachment.width / attachment.height\n const ratio = Math.min(4, Math.max(0.25, natural))\n const box = ratio >= 1 ? { width: 240, height: 240 / ratio } : { width: 240 * ratio, height: 240 }\n const scale = Math.min(1, attachment.width / box.width, attachment.height / box.height)\n return {\n width: Math.max(1, Math.round(box.width * scale)),\n height: Math.max(1, Math.round(box.height * scale)),\n objectPosition: natural < 0.25 ? 'center top' : natural > 4 ? 'left center' : 'center',\n }\n}\n\nconst styles: Record<string, CSSProperties> = {\n gallery: { display: 'flex', flexWrap: 'wrap', gap: 8, justifyContent: 'flex-start' },\n frame: {\n display: 'grid', placeItems: 'center', overflow: 'hidden', padding: 0,\n border: '1px solid var(--dsw-alias-border-l2-darkmode-thin)', borderRadius: 8,\n background: 'var(--dsw-alias-interactive-bg-hover-solid)', cursor: 'zoom-in',\n },\n tile: { width: 64, height: 64 },\n img: { width: '100%', height: '100%', objectFit: 'cover', display: 'block' },\n loading: { fontSize: 12, color: 'var(--dsw-alias-label-tertiary)', padding: '0 8px' },\n error: {\n fontSize: 12, color: 'var(--dsw-alias-state-error-primary)', cursor: 'pointer',\n border: '1px solid var(--dsw-alias-border-l2-darkmode-thin)', borderRadius: 8,\n background: 'transparent', padding: '6px 10px',\n },\n overlay: {\n position: 'fixed', inset: 0, zIndex: 1000, display: 'grid', placeItems: 'center',\n background: 'rgba(0, 0, 0, 0.72)', padding: 24,\n },\n overlayImg: { maxWidth: '92vw', maxHeight: '92vh', objectFit: 'contain', borderRadius: 4 },\n close: {\n position: 'absolute', top: 12, right: 12, width: 32, height: 32, display: 'grid',\n placeItems: 'center', border: 'none', borderRadius: '50%', cursor: 'pointer',\n background: 'rgba(255, 255, 255, 0.16)', color: '#fff', fontSize: 16, lineHeight: 1,\n },\n}\n\n/**\n * Full-viewport original-image preview: backdrop or close-control click and\n * Escape all dismiss; the image itself is inert so a click on it does not\n * fall through to the backdrop dismissal.\n */\nfunction ImageLightbox({ src, alt, labels, onClose }: {\n src: string\n alt: string\n labels: ImageLightboxLabels\n onClose: () => void\n}) {\n useEffect(() => {\n const onKey = (event: KeyboardEvent) => { if (event.key === 'Escape') onClose() }\n window.addEventListener('keydown', onKey)\n return () => { window.removeEventListener('keydown', onKey) }\n }, [onClose])\n return (\n <div role=\"dialog\" aria-label={labels.dialog} style={styles.overlay} onClick={onClose}>\n <img src={src} alt={alt} style={styles.overlayImg} onClick={event => { event.stopPropagation() }} />\n <button type=\"button\" aria-label={labels.close} style={styles.close} onClick={onClose}>×</button>\n </div>\n )\n}\n\n/**\n * Compact history renderer with retryable loading and click-to-open original\n * preview. A lone image renders at its `singleFit` size; an image among\n * several renders as a fixed 64px square tile.\n */\nexport function MessageImage({ attachment, load, variant, labels }: {\n attachment: ImageAttachmentRef\n load: ImageLoader\n variant: 'single' | 'tile'\n labels: MessageImageLabels\n}) {\n const [src, setSrc] = useState<string | null>(null)\n const [error, setError] = useState(false)\n const [open, setOpen] = useState(false)\n // Retry re-arms the one load effect below, so every attempt — first load or\n // retry — runs under the same liveness guard and the same reset.\n const [attempt, setAttempt] = useState(0)\n const retry = useCallback(() => { setAttempt(a => a + 1) }, [])\n const close = useCallback(() => { setOpen(false) }, [])\n const fit = useMemo(\n () => (variant === 'single' ? singleFit(attachment) : undefined),\n [attachment, variant],\n )\n\n useEffect(() => {\n let live = true\n setError(false)\n setSrc(null)\n void load(attachment).then((url) => { if (live) setSrc(url) }).catch(() => { if (live) setError(true) })\n return () => { live = false }\n }, [attachment, load, attempt])\n\n const label = attachment.name ?? labels.image\n if (error) {\n return <button type=\"button\" style={styles.error} onClick={retry}>{labels.loadFailed}</button>\n }\n const box = fit === undefined ? styles.tile : { width: fit.width, height: fit.height }\n return (\n <>\n <button\n type=\"button\"\n style={{ ...styles.frame, ...box }}\n title={labels.open}\n aria-label={labels.openNamed(label)}\n onClick={() => { if (src !== null) setOpen(true) }}\n >\n {src === null\n ? <span style={styles.loading}>{labels.loading}</span>\n : <img src={src} alt={label} style={{ ...styles.img, objectPosition: fit?.objectPosition }} />}\n </button>\n {open && src !== null && <ImageLightbox src={src} alt={label} labels={labels.lightbox} onClose={close} />}\n </>\n )\n}\n\n/** Wrapping image group: a lone image renders large, several render as 64px\n * square tiles (same rule as the platform gallery). */\nexport function ImageGallery({ images, load, labels }: {\n images: readonly { attachment: ImageAttachmentRef }[]\n load: ImageLoader\n labels: MessageImageLabels\n}) {\n if (images.length === 0) return null\n const variant = images.length === 1 ? 'single' : 'tile'\n return (\n <div style={styles.gallery}>\n {images.map((image, index) => (\n <MessageImage key={`${image.attachment.attachmentId}:${index}`} attachment={image.attachment} load={load} variant={variant} labels={labels} />\n ))}\n </div>\n )\n}\n","/**\n * Keyed toolview for the `image_generate` tool: renders generated images\n * inline in the conversation. The row shows the call's prompt while running\n * and after settling; a settled result with image blocks renders them through\n * this plugin's own ImageGallery (harness rc.8 stopped exporting the platform\n * one as a package value), whose bytes load through the node half's\n * `/subscriptions-auth` RPC channel (the durable ImageAttachmentRef is never\n * a fetchable URL on its own). A text-only settled result (degraded route)\n * renders its text; an error result renders the first error line.\n *\n * The 'tool.call.toolview' slot contract is owned by ui-tool\n * (packages/client/ui-tool/src/client/contract/slots.ts), which this package\n * does not resolve; the SlotMap merge and ToolCallOwnerProps below mirror it\n * structurally (same discipline as platform-modules.d.ts).\n */\nimport type { CSSProperties } from 'react'\nimport type { ConnectionHandle } from '@deepseek-ai/dsh-api-remotes/client'\nimport type { ToolCallBlock } from '@deepseek-ai/dsh-client-ui-conversation/client'\nimport { ImageGallery } from './ImageGallery.js'\nimport type { ImageAttachmentRef, ImageLoader, MessageImageLabels } from './ImageGallery.js'\nimport { Icon } from './meter.js'\nimport { call } from './rpc.js'\nimport { en } from './locales.js'\nimport type { SubscriptionsKey } from './locales.js'\n\n\n/** Title prompt truncation budget (characters). */\nconst PROMPT_MAX_LENGTH = 60\n\n/** Mirror of ui-tool's ToolCallOwnerProps (see the module header). */\ninterface ToolCallOwnerProps {\n callId: string\n toolName: string\n block: ToolCallBlock\n cwd?: string | undefined\n openFile: (path: string) => void\n inspect?: (() => void) | undefined\n}\n\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\n interface SlotMap {\n /** Mirror of ui-tool's keyed atomic Tool view declaration (see the module header). */\n 'tool.call.toolview': { kind: 'keyed'; scope: 'session'; owner: ToolCallOwnerProps }\n }\n}\n\n/** Injected dependencies of {@link ImageGenerateToolview} (slot `inject`). */\nexport interface ImageGenerateToolviewInjected {\n /** Session-authorized image URL loader riding the `/subscriptions-auth` channel. */\n load: ImageLoader\n}\n\n/**\n * Props delivered by the toolview outlet: the owner share plus the inject\n * face and the framework locale seat, spread flat.\n */\nexport type ImageGenerateToolviewProps =\n Partial<ToolCallOwnerProps>\n & Partial<ImageGenerateToolviewInjected>\n & { t?: ((key: SubscriptionsKey, params?: Record<string, unknown>) => string) | undefined }\n\n/**\n * Build the ImageGallery loader over the `image` endpoint.\n * @param rpc - Connection RPC caller.\n * @returns loader resolving an attachment ref to a data URL.\n */\nexport function createImageLoader(rpc: ConnectionHandle['rpc']): ImageLoader {\n // The host validates a full ImageAttachmentRef payload (readImage takes the\n // whole ref), so forward the attachment verbatim.\n return attachment =>\n call(rpc, 'image', { ...attachment })\n .then(result => `data:${result.mediaType};base64,${result.dataBase64}`)\n}\n\n/**\n * English-dictionary fallback for a missing locale seat (standalone renders);\n * the framework always supplies the namespace-bound one.\n * @param key - dictionary key.\n * @param params - `{name}` template params.\n * @returns the template with params substituted.\n */\nfunction fallbackTranslate(key: SubscriptionsKey, params?: Record<string, unknown>): string {\n let text: string = en[key]\n for (const [name, value] of Object.entries(params ?? {})) {\n text = text.replaceAll(`{${name}}`, String(value))\n }\n return text\n}\n\n/** Extract the prompt from the call's raw args JSON; falls back to the first string value, then the raw line. */\nfunction derivePrompt(argsRaw: string): string {\n let parsed: unknown\n try {\n parsed = JSON.parse(argsRaw)\n } catch {\n // Non-JSON args (mid-stream truncation): fall back to the raw string below.\n parsed = undefined\n }\n let prompt: string | undefined\n if (typeof parsed === 'object' && parsed !== null) {\n const args = parsed as Record<string, unknown>\n if (typeof args.prompt === 'string' && args.prompt !== '') prompt = args.prompt\n else {\n for (const value of Object.values(args)) {\n if (typeof value === 'string' && value !== '') { prompt = value; break }\n }\n }\n }\n const line = (prompt ?? argsRaw).split('\\n', 1)[0] ?? ''\n return line.length > PROMPT_MAX_LENGTH ? `${line.slice(0, PROMPT_MAX_LENGTH)}…` : line\n}\n\n/** Flatten a settled result's text blocks (the degraded text-only route and the error line). */\nfunction resultText(block: ToolCallBlock): string {\n if (!('kind' in block)) return ''\n const parts: string[] = []\n for (const part of block.content) {\n if (part.type === 'text') parts.push(part.text)\n }\n if (parts.length === 0 && block.error !== undefined) parts.push(`${block.error.name}: ${block.error.code}`)\n return parts.join('\\n')\n}\n\n/** Image attachments of a settled result; empty while running or on the text-only route. */\nfunction resultImages(block: ToolCallBlock): { attachment: ImageAttachmentRef }[] {\n if (!('kind' in block)) return []\n const images: { attachment: ImageAttachmentRef }[] = []\n for (const part of block.content) {\n if (part.type === 'image') images.push({ attachment: part.attachment as ImageAttachmentRef })\n }\n return images\n}\n\nconst styles: Record<string, CSSProperties> = {\n container: { display: 'flex', flexDirection: 'column', gap: 6, padding: '4px 0' },\n row: { display: 'flex', alignItems: 'center', gap: 6, minWidth: 0 },\n icon: { display: 'inline-flex', flexShrink: 0, color: 'var(--dsw-alias-label-tertiary)' },\n title: {\n fontSize: 13, lineHeight: '20px', color: 'var(--dsw-alias-label-primary)',\n overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap',\n },\n subtle: { margin: 0, fontSize: 12, lineHeight: '18px', color: 'var(--dsw-alias-label-tertiary)' },\n output: {\n margin: 0, fontSize: 12, lineHeight: '18px', color: 'var(--dsw-alias-label-secondary)',\n whiteSpace: 'pre-wrap', overflowWrap: 'anywhere',\n },\n error: { margin: 0, fontSize: 12, lineHeight: '18px', color: 'var(--dsw-alias-state-error-primary)' },\n}\n\n/**\n * The `image_generate` keyed toolview component.\n * @param props - owner share, inject face, and locale seat (spread flat).\n * @returns the call row plus, once settled, the gallery / text / error body.\n */\nexport function ImageGenerateToolview(props: ImageGenerateToolviewProps) {\n const { block, load } = props\n const t = props.t ?? fallbackTranslate\n if (block === undefined) return null\n const settled = 'kind' in block\n const argsRaw = (settled ? block.call?.argsRaw : 'argsRaw' in block ? block.argsRaw : undefined) ?? ''\n let references = 0\n try {\n const args = JSON.parse(argsRaw)\n if (Array.isArray(args?.referenceImages)) references = args.referenceImages.length\n } catch { /* Arguments may still be streaming. */ }\n const title = `image_generate${references > 0 ? ` (${references} ref)` : ''}: ${derivePrompt(argsRaw)}`\n const images = resultImages(block)\n const text = settled ? resultText(block) : ''\n const labels: MessageImageLabels = {\n image: t('image'),\n open: t('viewImage'),\n openNamed: name => t('viewImageNamed', { name }),\n loading: t('imageLoading'),\n loadFailed: t('imageLoadFailed'),\n lightbox: { dialog: t('imagePreview'), close: t('imageClose') },\n }\n return (\n <div style={styles.container}>\n <div style={styles.row}>\n <span style={styles.icon}><Icon name=\"sparkle\" size={14} /></span>\n <span style={styles.title}>{title}</span>\n </div>\n {!settled && <p style={styles.subtle}>{t('generating')}</p>}\n {settled && block.isError && text !== '' && (\n <p style={styles.error}>{text.split('\\n', 1)[0]}</p>\n )}\n {settled && !block.isError && images.length > 0 && load !== undefined && (\n <ImageGallery images={images} load={load} labels={labels} />\n )}\n {settled && !block.isError && images.length === 0 && text !== '' && (\n <p style={styles.output}>{text}</p>\n )}\n </div>\n )\n}\n","/**\n * Keyed toolview for the `video_generate` tool: renders the generated video\n * inline in the conversation. The row shows the call's prompt while running\n * and after settling; a settled success loads the MP4 bytes through the node\n * half's `/subscriptions-auth` `video` endpoint (by bare file name), builds a\n * Blob URL, and plays it in a native `<video controls>` element. The file\n * name comes from the result's presentation meta when the dispatch was\n * top-level, and is recovered from the \"Saved video to …\" text line for\n * nested (Code Mode) dispatches, where the harness computes no meta. A result\n * with neither renders its text; an error result renders the first error line.\n *\n * The 'tool.call.toolview' SlotMap entry is declared by\n * ImageGenerateToolview.tsx in this same package (one declaration per\n * augmentation), so this file only mirrors the owner-props shape.\n */\nimport { useEffect, useState } from 'react'\nimport type { CSSProperties } from 'react'\nimport type { ConnectionHandle } from '@deepseek-ai/dsh-api-remotes/client'\nimport type { ToolCallBlock } from '@deepseek-ai/dsh-client-ui-conversation/client'\nimport { Icon } from './meter.js'\nimport { call } from './rpc.js'\nimport { en } from './locales.js'\nimport type { SubscriptionsKey } from './locales.js'\n\n\n/** Title prompt truncation budget (characters). */\nconst PROMPT_MAX_LENGTH = 60\n\n/** Mirror of ui-tool's ToolCallOwnerProps (see ImageGenerateToolview). */\ninterface ToolCallOwnerProps {\n callId: string\n toolName: string\n block: ToolCallBlock\n cwd?: string | undefined\n openFile: (path: string) => void\n inspect?: (() => void) | undefined\n}\n\n/** Decoded video bytes as the node half's `video` endpoint answers them. */\nexport interface VideoBytes {\n mediaType: string\n dataBase64: string\n}\n\n/** Injected dependencies of {@link VideoGenerateToolview} (slot `inject`). */\nexport interface VideoGenerateToolviewInjected {\n /** Loads one generated video's bytes by bare file name. */\n loadVideo: (name: string) => Promise<VideoBytes>\n}\n\n/**\n * Props delivered by the toolview outlet: the owner share plus the inject\n * face and the framework locale seat, spread flat.\n */\nexport type VideoGenerateToolviewProps =\n Partial<ToolCallOwnerProps>\n & Partial<VideoGenerateToolviewInjected>\n & { t?: ((key: SubscriptionsKey, params?: Record<string, unknown>) => string) | undefined }\n\n/**\n * Build the video loader over the `/subscriptions-auth` `video` endpoint.\n * @param rpc - Connection RPC caller.\n * @returns loader resolving a bare file name to the decoded bytes.\n */\nexport function createVideoLoader(rpc: ConnectionHandle['rpc']): (name: string) => Promise<VideoBytes> {\n return name => call(rpc, 'video', { name })\n}\n\n/**\n * English-dictionary fallback for a missing locale seat (standalone renders);\n * the framework always supplies the namespace-bound one.\n */\nfunction fallbackTranslate(key: SubscriptionsKey, params?: Record<string, unknown>): string {\n let text: string = en[key]\n for (const [name, value] of Object.entries(params ?? {})) {\n text = text.replaceAll(`{${name}}`, String(value))\n }\n return text\n}\n\n/** Extract the prompt from the call's raw args JSON; falls back to the first string value, then the raw line. */\nfunction derivePrompt(argsRaw: string): string {\n let parsed: unknown\n try {\n parsed = JSON.parse(argsRaw)\n } catch {\n // Non-JSON args (mid-stream truncation): fall back to the raw string below.\n parsed = undefined\n }\n let prompt: string | undefined\n if (typeof parsed === 'object' && parsed !== null) {\n const args = parsed as Record<string, unknown>\n if (typeof args.prompt === 'string' && args.prompt !== '') prompt = args.prompt\n else {\n for (const value of Object.values(args)) {\n if (typeof value === 'string' && value !== '') { prompt = value; break }\n }\n }\n }\n const line = (prompt ?? argsRaw).split('\\n', 1)[0] ?? ''\n return line.length > PROMPT_MAX_LENGTH ? `${line.slice(0, PROMPT_MAX_LENGTH)}…` : line\n}\n\n/** Flatten a settled result's text blocks (the fallback body and the error line). */\nfunction resultText(block: ToolCallBlock): string {\n if (!('kind' in block)) return ''\n const parts: string[] = []\n for (const part of block.content) {\n if (part.type === 'text') parts.push(part.text)\n }\n if (parts.length === 0 && block.error !== undefined) parts.push(`${block.error.name}: ${block.error.code}`)\n return parts.join('\\n')\n}\n\n/**\n * The generated video's bare file name: presentation meta first (top-level\n * dispatches), then the render text's \"Saved video to …\" line (nested\n * dispatches compute no meta).\n */\nfunction resolveFileName(block: ToolCallBlock): string | undefined {\n if (!('kind' in block)) return undefined\n const meta = block.meta\n if (typeof meta === 'object' && meta !== null) {\n const fileName = (meta as Record<string, unknown>).fileName\n if (typeof fileName === 'string' && fileName.length > 0) return fileName\n }\n const match = /^Saved video to (.+\\.mp4)/m.exec(resultText(block))\n if (match === null) return undefined\n const path = match[1]\n return path.slice(path.lastIndexOf('/') + 1)\n}\n\n/** Decode a base64 payload into bytes (browser-side; no Buffer). */\nfunction base64Bytes(dataBase64: string): Uint8Array {\n const binary = atob(dataBase64)\n const bytes = new Uint8Array(binary.length)\n for (let index = 0; index < binary.length; index++) bytes[index] = binary.charCodeAt(index)\n return bytes\n}\n\n/** Loading lifecycle of the Blob URL. */\ntype LoadState =\n | { phase: 'loading' }\n | { phase: 'ready'; url: string }\n | { phase: 'failed'; message: string }\n\nconst styles: Record<string, CSSProperties> = {\n container: { display: 'flex', flexDirection: 'column', gap: 6, padding: '4px 0' },\n row: { display: 'flex', alignItems: 'center', gap: 6, minWidth: 0 },\n icon: { display: 'inline-flex', flexShrink: 0, color: 'var(--dsw-alias-label-tertiary)' },\n title: {\n fontSize: 13, lineHeight: '20px', color: 'var(--dsw-alias-label-primary)',\n overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap',\n },\n subtle: { margin: 0, fontSize: 12, lineHeight: '18px', color: 'var(--dsw-alias-label-tertiary)' },\n output: {\n margin: 0, fontSize: 12, lineHeight: '18px', color: 'var(--dsw-alias-label-secondary)',\n whiteSpace: 'pre-wrap', overflowWrap: 'anywhere',\n },\n error: { margin: 0, fontSize: 12, lineHeight: '18px', color: 'var(--dsw-alias-state-error-primary)' },\n video: {\n display: 'block', maxWidth: 480, width: '100%', borderRadius: 8,\n backgroundColor: 'var(--dsw-alias-fill-tertiary)',\n },\n}\n\n/**\n * The `video_generate` keyed toolview component.\n * @param props - owner share, inject face, and locale seat (spread flat).\n * @returns the call row plus, once settled, the player / text / error body.\n */\nexport function VideoGenerateToolview(props: VideoGenerateToolviewProps) {\n const { block, loadVideo } = props\n const t = props.t ?? fallbackTranslate\n const settled = block !== undefined && 'kind' in block\n const isError = settled && block.isError\n const fileName = block !== undefined && settled && !isError ? resolveFileName(block) : undefined\n const [load, setLoad] = useState<LoadState>({ phase: 'loading' })\n\n useEffect(() => {\n if (fileName === undefined || loadVideo === undefined) return\n let cancelled = false\n let objectUrl: string | undefined\n setLoad({ phase: 'loading' })\n loadVideo(fileName).then(\n (video) => {\n if (cancelled) return\n // Uint8Array#slice detaches a plain ArrayBuffer view for BlobPart.\n objectUrl = URL.createObjectURL(new Blob([base64Bytes(video.dataBase64).slice()], { type: video.mediaType }))\n setLoad({ phase: 'ready', url: objectUrl })\n },\n (error: unknown) => {\n if (cancelled) return\n setLoad({ phase: 'failed', message: error instanceof Error ? error.message : String(error) })\n },\n )\n return () => {\n cancelled = true\n if (objectUrl !== undefined) URL.revokeObjectURL(objectUrl)\n }\n }, [fileName, loadVideo])\n\n if (block === undefined) return null\n const argsRaw = (settled ? block.call?.argsRaw : 'argsRaw' in block ? block.argsRaw : undefined) ?? ''\n const title = `video_generate: ${derivePrompt(argsRaw)}`\n const text = settled ? resultText(block) : ''\n return (\n <div style={styles.container}>\n <div style={styles.row}>\n <span style={styles.icon}><Icon name=\"sparkle\" size={14} /></span>\n <span style={styles.title}>{title}</span>\n </div>\n {!settled && <p style={styles.subtle}>{t('generatingVideo')}</p>}\n {settled && isError && text !== '' && (\n <p style={styles.error}>{text.split('\\n', 1)[0]}</p>\n )}\n {settled && !isError && fileName !== undefined && load.phase === 'loading' && (\n <p style={styles.subtle}>{t('videoLoading')}</p>\n )}\n {settled && !isError && fileName !== undefined && load.phase === 'failed' && (\n <p style={styles.error}>{t('videoLoadFailed', { message: load.message })}</p>\n )}\n {settled && !isError && fileName !== undefined && load.phase === 'ready' && (\n // eslint-disable-next-line jsx-a11y/media-has-caption -- generated clip; no caption track exists.\n <video style={styles.video} src={load.url} controls preload=\"metadata\" />\n )}\n {settled && !isError && fileName === undefined && text !== '' && (\n <p style={styles.output}>{text}</p>\n )}\n </div>\n )\n}\n","/**\n * Codex Speed toggle: one small control in the composer's right tool row\n * (`conversation.input.right`), switching the session between standard routing\n * and the fast (priority) service tier — the Codex desktop app's Speed menu.\n * The choice is per session and lives in the node half (in-memory); this\n * component holds only viewing state. The control renders nothing until the\n * first load proves the session's current model is a codex model whose catalog\n * advertises the fast tier.\n *\n * Every color resolves through a `--dsw-alias-*` design token and every\n * user-visible string goes through the locale `t` of the\n * 'subscription-models' namespace, same as the settings section.\n */\nimport { useEffect, useRef, useState } from 'react'\nimport type { CSSProperties } from 'react'\nimport type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { ConnectionHandle } from '@deepseek-ai/dsh-api-remotes/client'\nimport { call } from './rpc.js'\nimport { en } from './locales.js'\nimport type { SubscriptionsKey } from './locales.js'\n\n/** One session's speed choice: standard routing or the fast (priority) tier. */\nexport type SpeedTier = 'standard' | 'fast'\n\n/** `speed` endpoint value, mirrored from the node half. */\nexport interface SpeedState {\n tier: SpeedTier\n fastModels: string[]\n}\n\n/** What {@link SpeedSelect} renders from: visibility plus the current tier. */\nexport interface SpeedSelectState {\n visible: boolean\n model?: string\n tier: SpeedTier\n}\n\n/**\n * Minimal structural face of ui-model-selection's `ctx.modelDirectories`\n * service (the sanctioned cross-plugin channel: cordis services, not value\n * imports — same mirroring discipline as ToolCallOwnerProps). Both dsh lines\n * ship it with this shape; it replaces rc.2's `connection.api.sessions.models`\n * read, which the 0.1.2-alpha removed along with the whole `.api` face.\n */\nexport interface ModelDirectoriesLike {\n /** Resolve one session's shared model directory (throws for unknown sessions). */\n directoryFor(sessionId: string): {\n /** Load the directory; `current` is the session's effective model selection. */\n load(): Promise<{ current: { provider: string; model: string } | null }>\n }\n}\n\n/** Injected dependencies of {@link SpeedSelect} (slot `inject`, session-bound). */\nexport interface SpeedSelectInjected {\n /** Load the session's speed state; `visible` false keeps the control hidden. */\n loadSpeed: () => Promise<SpeedSelectState>\n /** Set the session's speed tier; resolves false when the write failed. */\n setSpeed: (tier: SpeedTier, displayedModel?: string) => Promise<boolean>\n}\n\n/**\n * Props delivered by the slot outlet: the framework session kit and InputZone\n * owner share (unused — everything arrives session-bound through the inject\n * face), the injected callbacks, and the locale seat.\n */\nexport type SpeedSelectProps = PropsRuntime<'conversation.input.right'>\n & Partial<SpeedSelectInjected>\n & Partial<PropsLocale<'subscription-models'>>\n\n/**\n * The `loadSpeed` half of the inject face: the plugin's own speed state plus\n * the host's current model selection (the visibility gate). A model-RPC\n * failure throws rather than answering \"hidden\" — the caller keeps its last\n * known state, so a transient failure never locks the toggle away.\n *\n * `sessionId` is a plain string: slot and command contexts brand it through\n * different dsh-session copies, and only the service boundary needs one.\n *\n * `models` resolves lazily per call: the ui-model-selection service may\n * register after this plugin applies, and a shell without it (no model seat\n * at all) simply keeps the toggle hidden.\n */\nexport function createSpeedLoader(\n connection: ConnectionHandle,\n models: () => ModelDirectoriesLike | undefined,\n sessionId: string,\n): SpeedSelectInjected['loadSpeed'] {\n return async () => {\n const directories = models()\n const directory = directories?.directoryFor(sessionId)\n const current = (await directory?.load())?.current ?? null\n const state: SpeedState = await call(connection.rpc, 'speed', {\n sessionId, ...(current?.provider === 'codex' ? { model: current.model } : {}),\n })\n const visible = current !== null && current.provider === 'codex'\n && state.fastModels.includes(current.model)\n // Selection may change while the speed RPC is pending.\n const latest = (await directory?.load())?.current ?? null\n if (latest?.provider !== current?.provider || latest?.model !== current?.model) {\n throw new Error('Model changed while loading speed')\n }\n return { visible, tier: state.tier, ...(visible && current ? { model: current.model } : {}) }\n }\n}\n\n/** The `setSpeed` half of the inject face: boolean outcome for the component's busy state. */\nexport function createSpeedSetter(\n connection: ConnectionHandle,\n sessionId: string,\n models?: () => ModelDirectoriesLike | undefined,\n): SpeedSelectInjected['setSpeed'] {\n return async (tier, displayedModel) => {\n try {\n const directories = models?.()\n const current = directories === undefined ? null : (await directories.directoryFor(sessionId).load()).current\n if (models !== undefined && current?.provider !== 'codex') return false\n if (displayedModel !== undefined && current?.model !== displayedModel) return false\n await call(connection.rpc, 'setSpeed', {\n sessionId, tier, ...(current?.provider === 'codex' ? { model: current.model } : {}),\n })\n return true\n } catch {\n return false // The control keeps its last confirmed value on load or save failure.\n }\n }\n}\n\n/** English-dictionary fallback for a missing inject `t` (standalone renders). */\nfunction fallbackTranslate(key: SubscriptionsKey): string {\n return en[key]\n}\n\nconst TIERS: readonly SpeedTier[] = ['standard', 'fast']\n\n/**\n * The composer Speed control: a trigger reading `速度 · 快速`/`速度 · 标准`\n * that opens a two-row menu (standard/fast with descriptions, check mark on\n * the current tier). Mount and every open reload the host state so a model\n * switch made since the last open self-corrects.\n */\n/** How often the control re-reads the host state (model switches arrive only by asking). */\nconst POLL_INTERVAL_MS = 3000\n\n/**\n * The composer Speed control: a trigger reading `速度 · 快速`/`速度 · 标准`\n * that opens a two-row menu (standard/fast with descriptions, check mark on\n * the current tier). The host pushes nothing on a model switch, so the\n * control re-reads on a slow poll with a single-flight guard; a failed read\n * keeps the last known state, so a transient RPC failure can never lock the\n * toggle away (the earlier mount-only load had no recovery path).\n */\nexport function SpeedSelect({ loadSpeed, setSpeed, t }: SpeedSelectProps) {\n const translate = t ?? fallbackTranslate\n const [state, setState] = useState<SpeedSelectState | null>(null)\n const [open, setOpen] = useState(false)\n const [busy, setBusy] = useState(false)\n const rootRef = useRef<HTMLDivElement | null>(null)\n // The inject face may be re-evaluated (new callback identities) on re-render;\n // the poll effect mounts once and reads through this ref, so identity churn\n // neither resets the interval nor multiplies in-flight loads.\n const loadRef = useRef(loadSpeed)\n loadRef.current = loadSpeed\n\n const generation = useRef(0)\n const mounted = useRef(false)\n const refresh = async (): Promise<void> => {\n if (!mounted.current) return\n const id = ++generation.current\n try {\n const loaded = await loadRef.current?.()\n if (loaded && id === generation.current) setState(loaded)\n } catch { /* preserve the last confirmed state; a later poll can retry */ }\n }\n useEffect(() => {\n if (loadRef.current === undefined) return\n mounted.current = true\n let cancelled = false\n let inflight = false\n const reload = (): void => {\n const load = loadRef.current\n if (load === undefined || inflight || cancelled) return\n inflight = true\n void refresh().finally(() => { inflight = false })\n }\n reload()\n const timer = setInterval(reload, POLL_INTERVAL_MS)\n return () => {\n mounted.current = false\n ++generation.current\n cancelled = true\n clearInterval(timer)\n }\n }, [])\n\n useEffect(() => {\n if (!open) return\n const closeOutside = (event: MouseEvent): void => {\n if (!rootRef.current?.contains(event.target as Node)) setOpen(false)\n }\n document.addEventListener('mousedown', closeOutside)\n return () => { document.removeEventListener('mousedown', closeOutside) }\n }, [open])\n\n if (loadSpeed === undefined || setSpeed === undefined || state === null || !state.visible) {\n return null\n }\n\n const choose = (tier: SpeedTier): void => {\n if (busy) return\n if (tier === state.tier) {\n setOpen(false)\n return\n }\n setBusy(true)\n void setSpeed(tier, state.model).then((ok) => {\n if (!mounted.current) return\n setBusy(false)\n if (ok) setOpen(false)\n void refresh() // Read the currently selected model, even when the save concerned another.\n }, () => { if (mounted.current) { setBusy(false); void refresh() } })\n }\n\n const show = (): void => {\n setOpen(true)\n void refresh()\n }\n\n const tierName = (tier: SpeedTier): string =>\n translate(tier === 'fast' ? 'speedFast' : 'speedStandard')\n const tierDescription = (tier: SpeedTier): string =>\n translate(tier === 'fast' ? 'speedFastDescription' : 'speedStandardDescription')\n const triggerLabel = `${translate('speed')} · ${tierName(state.tier)}`\n\n return (\n <div\n ref={rootRef}\n className=\"dsh-subscription-speed\"\n style={styles.root}\n onKeyDown={(event) => {\n if (event.key === 'Escape' && open) {\n event.preventDefault()\n setOpen(false)\n }\n }}\n >\n {open && (\n <div style={styles.menu} role=\"menu\" aria-label={translate('speed')}>\n {TIERS.map(tier => (\n <button\n key={tier}\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={tier === state.tier}\n style={styles.item}\n disabled={busy}\n onClick={() => { choose(tier) }}\n >\n <span style={styles.itemCheck}>{tier === state.tier ? '✓' : ''}</span>\n <span style={styles.itemText}>\n <span style={styles.itemName}>{tierName(tier)}</span>\n <span style={styles.itemDescription}>{tierDescription(tier)}</span>\n </span>\n </button>\n ))}\n </div>\n )}\n <button\n type=\"button\"\n style={styles.trigger}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n title={triggerLabel}\n disabled={busy}\n onClick={() => {\n if (open) setOpen(false)\n else show()\n }}\n >\n {triggerLabel}\n </button>\n </div>\n )\n}\n\nconst styles: Record<string, CSSProperties> = {\n root: { position: 'relative', display: 'inline-flex' },\n trigger: {\n border: '0.5px solid var(--dsw-alias-border-l3)', borderRadius: 'var(--dsw-radius-sm, 8px)',\n background: 'var(--dsh-subscription-speed-hover, transparent)', color: 'var(--dsw-alias-label-secondary)',\n font: 'inherit', fontSize: 12, lineHeight: '18px',\n padding: '2px 8px', cursor: 'pointer', whiteSpace: 'nowrap',\n },\n menu: {\n position: 'absolute', bottom: '100%', right: 0, marginBottom: 4,\n minWidth: 180, padding: 4, zIndex: 20,\n background: 'var(--dsw-specific-menu, var(--dsw-alias-bg-layer-2))', border: 0,\n boxShadow: 'var(--dsw-elevation-prominent)', borderRadius: 'var(--dsw-radius-lg, 16px)', display: 'flex', flexDirection: 'column', gap: 2,\n },\n item: {\n display: 'flex', alignItems: 'flex-start', gap: 6, width: '100%',\n border: 'none', borderRadius: 'var(--dsw-radius-sm, 8px)', background: 'var(--dsh-subscription-speed-hover, transparent)',\n padding: '6px 8px', cursor: 'pointer', font: 'inherit', textAlign: 'left',\n },\n itemCheck: {\n width: 14, flexShrink: 0, fontSize: 12, lineHeight: '18px',\n color: 'var(--dsw-alias-label-primary)',\n },\n itemText: { display: 'flex', flexDirection: 'column' },\n itemName: { fontSize: 12, lineHeight: '18px', color: 'var(--dsw-alias-label-primary)' },\n itemDescription: { fontSize: 11, lineHeight: '16px', color: 'var(--dsw-alias-label-tertiary)' },\n}\n","/** Build the locale resolver used by the /fast command contribution. */\nexport function fastCommandDescription(t: () => string): () => string {\n return () => t()\n}\n","/**\n * Browser half. Registers:\n * - the Models row body (`settings.models.provider-card`, keyed by our entry id)\n * and the options block after the rows (`settings.models.footer`);\n * - the usage gauge under the composer (`conversation.composer.dock`) and in\n * the New Session row (`conversation.hero.options`);\n * - the pace notice (`shell.overlay`);\n * - the retained upstream surfaces: image/video tool views, the Codex Speed\n * toggle and `/fast`.\n */\nimport type {} from '@deepseek-ai/dsh-client-ui-renderer/client'\nimport type { Context as ClientContext } from '@deepseek-ai/cordis'\nimport type { ConnectionHandle } from '@deepseek-ai/dsh-api-remotes/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-settings/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-settings-models/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-conversation/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-layout/client'\nimport type {} from '@deepseek-ai/dsh-client-locale/client'\nimport type { CommandUiContract } from '@deepseek-ai/dsh-client-ui-commands/client'\nimport { en, zh, LOCALE_NS } from './locales.js'\nimport { css } from './styles.js'\nimport { SubscriptionsStore } from './store.js'\nimport { PrefsStore } from './prefs.js'\nimport type { ConfigFormLike } from './prefs.js'\nimport type { SurfaceInjected } from './context.js'\nimport type { T } from './meter.js'\nimport { ProviderCard } from './ProviderCard.js'\nimport { Footer } from './Footer.js'\nimport { Usage, UsageNavIcon } from './Usage.js'\nimport { Gauge } from './Gauge.js'\nimport type { CurrentModelSource, GaugeInjected } from './Gauge.js'\nimport { Notice } from './Notice.js'\nimport { ImageGenerateToolview, createImageLoader } from './ImageGenerateToolview.js'\nimport type { ImageGenerateToolviewInjected } from './ImageGenerateToolview.js'\nimport { VideoGenerateToolview, createVideoLoader } from './VideoGenerateToolview.js'\nimport type { VideoGenerateToolviewInjected } from './VideoGenerateToolview.js'\nimport { SpeedSelect, createSpeedLoader, createSpeedSetter } from './SpeedSelect.js'\nimport type { ModelDirectoriesLike, SpeedSelectInjected } from './SpeedSelect.js'\nimport { fastCommandDescription } from './fast-command.js'\n\n/** The Host entry id from cordis.patch.yml; the Models page dispatches our card by it. */\nconst ENTRY_ID = 'subscription-models'\n\nexport const inject = ['slots', 'connection', 'locale']\n\n/** The model-selection service as this plugin uses it. */\ninterface ModelDirectoriesService extends ModelDirectoriesLike {\n directoryFor(sessionId: string): ReturnType<ModelDirectoriesLike['directoryFor']> & {\n store: CurrentModelSource\n }\n}\n\n/** The settings forms service as this plugin uses it. */\ninterface ConfigFormsLike {\n get(entryId: string): ConfigFormLike\n}\n\nconst hasMethod = (value: unknown, name: string): boolean =>\n typeof value === 'object' && value !== null && name in value && typeof (value as Record<string, unknown>)[name] === 'function'\n\nexport function apply(ctx: ClientContext): void {\n ctx.effect(() => ctx.locale.register(LOCALE_NS, { en, zh }), 'dsh-plugin-subscription-usage: copy')\n ctx.effect(() => {\n const style = document.createElement('style')\n style.dataset.plugin = 'dsh-plugin-subscription-usage'\n style.textContent = css\n document.head.appendChild(style)\n return () => { style.remove() }\n }, 'dsh-plugin-subscription-usage: stylesheet')\n\n // In the browser the `connection` key holds the full client handle.\n const connection = ctx.get('connection') as unknown as ConnectionHandle\n const t: T = ctx.locale.bind(LOCALE_NS)\n const store = new SubscriptionsStore(connection.rpc)\n const prefs = new PrefsStore()\n const surface = (): SurfaceInjected => ({ store, prefs, rpc: connection.rpc, t })\n\n ctx.inject(['configForms'], scope => {\n const forms: unknown = scope.get('configForms')\n if (!hasMethod(forms, 'get')) return\n scope.effect(() => prefs.bind((forms as ConfigFormsLike).get(ENTRY_ID)), 'dsh-plugin-subscription-usage: usage preferences')\n })\n\n ctx.slots.inject('settings.models.provider-card', () => ctx.slots.register({\n name: 'settings.models.provider-card', key: ENTRY_ID, inject: surface,\n }, ProviderCard))\n ctx.slots.inject('settings.models.footer', () => ctx.slots.register({\n name: 'settings.models.footer', id: 'subscription-models', order: 10, inject: surface,\n }, Footer))\n\n ctx.slots.inject('settings.section', () => ctx.slots.register({\n name: 'settings.section', id: 'subscription-usage', order: 11, label: () => t('usage'), inject: surface,\n }, Usage))\n\n // The nav row keeps the shell's gear unless an icon is registered under the section id.\n ctx.slots.inject('settings.section.icon', () => ctx.slots.register({\n name: 'settings.section.icon', id: 'subscription-usage',\n }, UsageNavIcon))\n\n const models = (): ModelDirectoriesService | undefined => {\n const service: unknown = ctx.get('modelDirectories')\n return hasMethod(service, 'directoryFor') ? service as ModelDirectoriesService : undefined\n }\n const gaugeInject = (sessionId: string): GaugeInjected => {\n let currentModel: CurrentModelSource | undefined\n try {\n currentModel = models()?.directoryFor(sessionId).store\n } catch {\n // An unknown session has no directory yet; the gauge then follows pinned providers only.\n }\n return { ...surface(), sessionId, currentModel }\n }\n ctx.slots.inject('conversation.composer.dock', () => ctx.slots.register({\n name: 'conversation.composer.dock', id: 'subscription-models.gauge', order: 10, inject: gaugeInject,\n }, Gauge))\n ctx.slots.inject('conversation.hero.options', () => ctx.slots.register({\n name: 'conversation.hero.options', id: 'subscription-models.gauge', order: 10, inject: gaugeInject,\n }, Gauge))\n ctx.slots.inject('shell.overlay', () => ctx.slots.register({\n name: 'shell.overlay', id: 'subscription-models.notice', order: 50, inject: surface,\n }, Notice))\n\n ctx.slots.inject('tool.call.toolview', () => ctx.slots.register({\n name: 'tool.call.toolview', key: 'image_generate', locale: LOCALE_NS,\n inject: (): ImageGenerateToolviewInjected => ({ load: createImageLoader(connection.rpc) }),\n }, ImageGenerateToolview))\n ctx.slots.inject('tool.call.toolview', () => ctx.slots.register({\n name: 'tool.call.toolview', key: 'video_generate', locale: LOCALE_NS,\n inject: (): VideoGenerateToolviewInjected => ({ loadVideo: createVideoLoader(connection.rpc) }),\n }, VideoGenerateToolview))\n ctx.slots.inject('conversation.input.right', () => ctx.slots.register({\n name: 'conversation.input.right', id: 'codex-speed', order: 0, locale: LOCALE_NS,\n inject: (sessionId: string): SpeedSelectInjected => ({\n loadSpeed: createSpeedLoader(connection, models, sessionId),\n setSpeed: createSpeedSetter(connection, sessionId, models),\n }),\n }, SpeedSelect))\n\n ctx.inject(['commandUi'], (scope: ClientContext) => {\n const command = scope.get('commandUi') as CommandUiContract\n scope.effect(() => command.register({\n name: 'fast',\n description: fastCommandDescription(() => t('commandFast')),\n available: () => true,\n ui: {\n kind: 'popupSelect',\n options: async session => {\n const state = await createSpeedLoader(connection, models, session.sessionId)()\n if (!state.visible) throw new Error(t('commandFastUnavailable'))\n return ([\n { id: 'standard', label: t('speedStandard'), detail: t('speedStandardDescription') },\n { id: 'fast', label: t('speedFast'), detail: t('speedFastDescription') },\n ] as const).map(option => ({ ...option, active: option.id === state.tier }))\n },\n onSelect: async (option, session) => {\n await createSpeedSetter(connection, session.sessionId, models)(option.id === 'fast' ? 'fast' : 'standard')\n },\n },\n }), 'dsh-plugin-subscription-usage: /fast')\n })\n}\n"],"mappings":"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"}
|