@eddyskywalker/dsh-chatgpt-subscription 0.1.22 → 0.1.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/client.js CHANGED
@@ -273,6 +273,9 @@ window.__ModuleLoader__.load({
273
273
  refreshQuota() {
274
274
  return post(`${ROUTE_PREFIX}/quota/refresh`, {});
275
275
  }
276
+ useResetCredit() {
277
+ return post(`${ROUTE_PREFIX}/quota/reset-credit/use`, {});
278
+ }
276
279
  testConnection() {
277
280
  return post(`${ROUTE_PREFIX}/connection/test`, {});
278
281
  }
@@ -317,6 +320,7 @@ window.__ModuleLoader__.load({
317
320
  const [error, setError] = (0, react.useState)(null);
318
321
  const [authUrl, setAuthUrl] = (0, react.useState)(null);
319
322
  const [popupBlocked, setPopupBlocked] = (0, react.useState)(false);
323
+ const [resetCreditNotice, setResetCreditNotice] = (0, react.useState)(null);
320
324
  const [connection, setConnection] = (0, react.useState)(null);
321
325
  const [contextDrafts, setContextDrafts] = (0, react.useState)({});
322
326
  const load = (0, react.useCallback)(async (quiet = false) => {
@@ -415,6 +419,17 @@ window.__ModuleLoader__.load({
415
419
  quota
416
420
  });
417
421
  });
422
+ const useResetCredit = async () => {
423
+ if (!window.confirm(t("useResetCreditConfirm"))) return;
424
+ await run("reset-credit", async () => {
425
+ const quota = await apiRef.current.useResetCredit();
426
+ setStatus((current) => current === null ? current : {
427
+ ...current,
428
+ quota
429
+ });
430
+ setResetCreditNotice(t("resetCreditUsed"));
431
+ });
432
+ };
418
433
  const testConnection = async () => run("test", async () => {
419
434
  const result = await apiRef.current.testConnection();
420
435
  setConnection({
@@ -453,6 +468,7 @@ window.__ModuleLoader__.load({
453
468
  const run = async (action, task) => {
454
469
  setBusy(action);
455
470
  setError(null);
471
+ setResetCreditNotice(null);
456
472
  try {
457
473
  await task();
458
474
  } catch (cause) {
@@ -706,9 +722,16 @@ window.__ModuleLoader__.load({
706
722
  label: t("monthlySpend"),
707
723
  value: individualLimitLabel(status.quota.individualLimit, t)
708
724
  }) : null,
709
- status?.quota.resetCredits !== null && status?.quota.resetCredits !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(QuotaFact, {
710
- label: t("resetCredits"),
711
- value: String(status.quota.resetCredits.availableCount)
725
+ status?.quota.resetCredits !== null && status?.quota.resetCredits !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ResetCreditsFact, {
726
+ resetCredits: status.quota.resetCredits,
727
+ busy,
728
+ onUse: useResetCredit,
729
+ t
730
+ }) : null,
731
+ resetCreditNotice !== null ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
732
+ className: "dsh-codex-success",
733
+ role: "status",
734
+ children: resetCreditNotice
712
735
  }) : null,
713
736
  status?.quota.spendControlReached === true ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
714
737
  className: "dsh-codex-warning",
@@ -814,6 +837,29 @@ window.__ModuleLoader__.load({
814
837
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: label }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: value })]
815
838
  });
816
839
  }
840
+ function ResetCreditsFact({ resetCredits, busy, onUse, t }) {
841
+ const available = resetCredits.availableCount > 0;
842
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
843
+ className: "dsh-codex-reset-credits",
844
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
845
+ className: "dsh-codex-reset-credits-info",
846
+ children: [
847
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("resetCredits") }),
848
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: resetCredits.availableCount }),
849
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("small", { children: [
850
+ t("resetCreditExpires"),
851
+ ": ",
852
+ resetCredits.expiresAt == null ? t("unknown") : formatReset(resetCredits.expiresAt)
853
+ ] })
854
+ ]
855
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Button, {
856
+ primary: true,
857
+ disabled: !available || busy !== null,
858
+ onClick: onUse,
859
+ children: busy === "reset-credit" ? t("usingResetCredit") : t("useResetCredit")
860
+ })]
861
+ });
862
+ }
817
863
  function QuotaBar({ label, window, t }) {
818
864
  const percent = window.usedPercent;
819
865
  const level = percent >= 95 ? "danger" : percent >= 80 ? "warning" : "normal";
@@ -1314,6 +1360,11 @@ window.__ModuleLoader__.load({
1314
1360
  credits: "Credits",
1315
1361
  monthlySpend: "月度消费控制",
1316
1362
  resetCredits: "重置次数",
1363
+ resetCreditExpires: "到期时间",
1364
+ useResetCredit: "使用重置卡",
1365
+ usingResetCredit: "使用中…",
1366
+ useResetCreditConfirm: "使用后会立即消耗 1 次重置机会,并重置符合条件的 Codex 额度窗口。确定继续吗?",
1367
+ resetCreditUsed: "重置卡已使用,用量数据已刷新。",
1317
1368
  spendControlReached: "已触发月度消费控制,新的订阅调用可能被限制。",
1318
1369
  limit: "上限",
1319
1370
  exhausted: "额度已用尽",
@@ -1431,6 +1482,11 @@ window.__ModuleLoader__.load({
1431
1482
  credits: "Credits",
1432
1483
  monthlySpend: "Monthly spend control",
1433
1484
  resetCredits: "Reset credits",
1485
+ resetCreditExpires: "Expires",
1486
+ useResetCredit: "Use reset credit",
1487
+ usingResetCredit: "Using…",
1488
+ useResetCreditConfirm: "This immediately spends one reset credit and resets eligible Codex limit windows. Continue?",
1489
+ resetCreditUsed: "The reset credit was used and usage data was refreshed.",
1434
1490
  spendControlReached: "Monthly spend control has been reached; new subscription calls may be limited.",
1435
1491
  limit: "Limit",
1436
1492
  exhausted: "Quota exhausted",
@@ -1472,9 +1528,10 @@ window.__ModuleLoader__.load({
1472
1528
  .dsh-codex-button:disabled{cursor:default;opacity:.5}
1473
1529
  .dsh-codex-button-primary{background:var(--dsw-alias-button-info-fill,#397ee8);border-color:transparent;color:var(--dsw-alias-button-info-label,#fff)}
1474
1530
  .dsh-codex-notice{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);border-radius:7px;color:var(--dsw-alias-label-secondary);font-size:12px;line-height:1.55;margin:12px 0 0;padding:10px 12px}
1475
- .dsh-codex-error,.dsh-codex-warning{font-size:12px;line-height:1.5;margin:8px 0 0}
1531
+ .dsh-codex-error,.dsh-codex-warning,.dsh-codex-success{font-size:12px;line-height:1.5;margin:8px 0 0}
1476
1532
  .dsh-codex-error{color:var(--dsw-alias-label-danger,#d94b4b)}
1477
1533
  .dsh-codex-warning{color:var(--dsw-alias-label-warning,#c77a18)}
1534
+ .dsh-codex-success{color:var(--dsw-alias-label-success,#2e9b62)}
1478
1535
  .dsh-codex-errorbar{align-items:center;background:color-mix(in srgb,var(--dsw-alias-label-danger,#d94b4b) 9%,transparent);border:1px solid color-mix(in srgb,var(--dsw-alias-label-danger,#d94b4b) 28%,transparent);border-radius:7px;color:var(--dsw-alias-label-danger,#d94b4b);display:flex;font-size:13px;gap:12px;justify-content:space-between;padding:10px 12px}
1479
1536
  .dsh-codex-link{color:var(--dsw-alias-label-link,#3278d4);display:inline-block;font-size:13px;margin-top:8px}
1480
1537
  .dsh-codex-models{display:flex;flex-wrap:wrap;gap:6px;padding-top:12px}
@@ -1510,6 +1567,11 @@ window.__ModuleLoader__.load({
1510
1567
  .dsh-codex-quota-fact{align-items:flex-start;border-bottom:1px solid var(--dsw-alias-border-l2);display:flex;font-size:12px;gap:12px;justify-content:space-between;line-height:1.45;padding:10px 0}
1511
1568
  .dsh-codex-quota-fact span{color:var(--dsw-alias-label-secondary);flex:none}
1512
1569
  .dsh-codex-quota-fact strong{font-weight:600;min-width:0;overflow-wrap:anywhere;text-align:right}
1570
+ .dsh-codex-reset-credits{align-items:center;border-bottom:1px solid var(--dsw-alias-border-l2);display:flex;gap:16px;justify-content:space-between;padding:10px 0}
1571
+ .dsh-codex-reset-credits-info{display:grid;font-size:12px;gap:2px;grid-template-columns:auto auto}
1572
+ .dsh-codex-reset-credits-info>span{color:var(--dsw-alias-label-secondary)}
1573
+ .dsh-codex-reset-credits-info>strong{font-weight:650;text-align:right}
1574
+ .dsh-codex-reset-credits-info>small{color:var(--dsw-alias-label-tertiary);font-size:11px;grid-column:1/-1}
1513
1575
  .dsh-codex-meter-wrap{margin-top:13px}
1514
1576
  .dsh-codex-meter-label,.dsh-codex-meter-meta{display:flex;gap:10px;justify-content:space-between}
1515
1577
  .dsh-codex-meter-label{font-size:12px;margin-bottom:6px}
@@ -1539,7 +1601,7 @@ window.__ModuleLoader__.load({
1539
1601
  .dsh-codex-image-loading,.dsh-codex-image-failed{border:1px dashed var(--dsw-alias-border-l2);border-radius:8px;color:var(--dsw-alias-label-tertiary);display:inline-flex;font-size:12px;line-height:1.4;padding:18px 20px}
1540
1602
  .dsh-codex-image-failed{color:var(--dsw-alias-label-danger,#d94b4b)}
1541
1603
  @keyframes dsh-codex-pulse{0%,100%{opacity:.55}50%{opacity:1}}
1542
- @media(max-width:560px){.dsh-codex-row,.dsh-codex-pref-row,.dsh-codex-quota-fact{align-items:flex-start;flex-direction:column;gap:3px}.dsh-codex-value,.dsh-codex-quota-fact strong{text-align:left}.dsh-codex-actions{justify-content:flex-start}.dsh-codex-grouphead{align-items:flex-start;flex-direction:column;gap:0;padding:12px 0}.dsh-codex-meter-meta{align-items:flex-start;flex-direction:column;gap:2px}.dsh-codex-errorbar{align-items:flex-start;flex-direction:column}.dsh-codex-segments{width:100%}.dsh-codex-select{max-width:none;width:100%}.dsh-codex-context-row{align-items:flex-start;flex-direction:column;gap:5px}.dsh-codex-segments label{flex:1}.dsh-codex-segments span{text-align:center}.dsh-codex-image-tool{max-width:100%;margin-left:0}}
1604
+ @media(max-width:560px){.dsh-codex-row,.dsh-codex-pref-row,.dsh-codex-quota-fact,.dsh-codex-reset-credits{align-items:flex-start;flex-direction:column;gap:3px}.dsh-codex-value,.dsh-codex-quota-fact strong{text-align:left}.dsh-codex-actions{justify-content:flex-start}.dsh-codex-grouphead{align-items:flex-start;flex-direction:column;gap:0;padding:12px 0}.dsh-codex-meter-meta{align-items:flex-start;flex-direction:column;gap:2px}.dsh-codex-errorbar{align-items:flex-start;flex-direction:column}.dsh-codex-segments{width:100%}.dsh-codex-select{max-width:none;width:100%}.dsh-codex-context-row{align-items:flex-start;flex-direction:column;gap:5px}.dsh-codex-segments label{flex:1}.dsh-codex-segments span{text-align:center}.dsh-codex-image-tool{max-width:100%;margin-left:0}}
1543
1605
  @media(prefers-reduced-motion:reduce){.dsh-codex-meter>span{transition:none}.dsh-codex-skeleton span{animation:none}}
1544
1606
  `;
1545
1607
  function installStyles() {
package/lib/client.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","names":["formatPercent","messageOf","parseCapacity","formatCapacity"],"sources":["../src/compat.ts","../src/client/quota.ts","../src/client/CodexComposerQuota.tsx","../src/client/CodexImageToolView.tsx","../src/shared/model-catalog.ts","../src/client/api.ts","../src/client/CodexSubscriptionSection.tsx","../src/client/SubagentSettingsSection.tsx","../src/client/locales.ts","../src/client/styles.ts","../src/client/index.tsx"],"sourcesContent":["/**\n * Compatibility constants for the ChatGPT-backed Codex flow. The backend and\n * OAuth parameters are not a public third-party API contract, so every such\n * value is isolated here for review and rollback.\n */\nexport const CHATGPT_OAUTH_ISSUER = 'https://auth.openai.com' as const\nexport const CHATGPT_OAUTH_CLIENT_ID = 'app_EMoamEEZ73f0CkXaXp7hrann' as const\nexport const OAUTH_CALLBACK_HOST = 'localhost' as const\nexport const OAUTH_CALLBACK_PORT = 1455 as const\nexport const OAUTH_CALLBACK_PATH = '/auth/callback' as const\nexport const OAUTH_REDIRECT_URI = `http://${OAUTH_CALLBACK_HOST}:${OAUTH_CALLBACK_PORT}${OAUTH_CALLBACK_PATH}` as const\nexport const OAUTH_SCOPE = 'openid profile email offline_access' as const\nexport const OAUTH_ORIGINATOR = 'opencode' as const\nexport const OAUTH_LOGIN_TIMEOUT_MS = 5 * 60_000\nexport const TOKEN_REFRESH_MARGIN_MS = 60_000\nexport const ROUTE_PREFIX = '/api/dsh-chatgpt-subscription' as const\nexport const PLUGIN_VERSION = '0.1.0-alpha.0' as const\nexport const CODEX_CHATGPT_PROVIDER_ID = 'codex-chatgpt' as const\n\nexport const CODEX_API_BASE = 'https://chatgpt.com/backend-api/codex' as const\nexport const CODEX_RESPONSES_URL = `${CODEX_API_BASE}/responses` as const\nexport const CODEX_IMAGE_GENERATION_URL = `${CODEX_API_BASE}/images/generations` as const\nexport const CODEX_SEARCH_URL = `${CODEX_API_BASE}/alpha/search` as const\nexport const CODEX_USAGE_URL = 'https://chatgpt.com/backend-api/wham/usage' as const\nexport const CODEX_ORIGINATOR = 'opencode' as const\nexport const CODEX_ENHANCED_ORIGINATOR = 'pi' as const\nexport const CODEX_IMAGE_TOOL_NAME = 'codex_image_generate' as const\nexport const CODEX_IMAGE_MODEL = 'gpt-image-2' as const\nexport const CODEX_SEARCH_PROVIDER_ID = 'codex-subscription' as const\nexport const QUOTA_CACHE_MS = 60_000\nexport const QUOTA_MIN_UPSTREAM_INTERVAL_MS = 15_000\n\nexport const OAUTH_AUTHORIZE_URL = `${CHATGPT_OAUTH_ISSUER}/oauth/authorize` as const\nexport const OAUTH_TOKEN_URL = `${CHATGPT_OAUTH_ISSUER}/oauth/token` as const\n","import type { QuotaBucketDto, QuotaStatusDto, QuotaWindowDto } from '../shared/contracts.ts'\n\nexport interface SelectedQuotaWindow {\n bucket: QuotaBucketDto\n window: QuotaWindowDto\n remainingPercent: number\n}\n\nexport function selectQuotaForModel(quota: QuotaStatusDto | undefined, modelId: string | undefined): SelectedQuotaWindow | null {\n if (quota === undefined || quota.buckets.length === 0) return null\n const model = modelId?.toLowerCase() ?? ''\n const wantsSpark = model.includes('spark')\n const bucket = wantsSpark\n ? quota.buckets.find(candidate => `${candidate.id} ${candidate.name}`.toLowerCase().includes('spark'))\n : quota.buckets.find(candidate => candidate.id === 'codex')\n ?? quota.buckets.find(candidate => candidate.name.toLowerCase() === 'codex')\n if (bucket === undefined) return null\n const windows = quotaWindows(bucket)\n if (windows.length === 0) return null\n const window = windows.reduce((tightest, candidate) => (\n candidate.usedPercent > tightest.usedPercent ? candidate : tightest\n ), windows[0]!)\n return {\n bucket,\n window,\n remainingPercent: Math.max(0, 100 - window.usedPercent),\n }\n}\n\nexport function quotaWindows(bucket: QuotaBucketDto): QuotaWindowDto[] {\n if (bucket.windows.length > 0) return bucket.windows\n return [bucket.primary, bucket.secondary].filter((window): window is QuotaWindowDto => window !== null)\n}\n","import { useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react'\nimport type { SnapshotStore } from '@deepseek-ai/dsh-client-runtime/client'\nimport type { ModelDirectoryState } from '@deepseek-ai/dsh-client-ui-model-selection/client'\nimport type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport { CODEX_CHATGPT_PROVIDER_ID } from '../compat.ts'\nimport type { PluginStatusDto } from '../shared/contracts.ts'\nimport { SubscriptionApi } from './api.ts'\nimport { NS } from './locales.ts'\nimport { selectQuotaForModel } from './quota.ts'\n\ntype Props = PropsRuntime<'conversation.input.right'> & PropsLocale<typeof NS> & {\n api: SubscriptionApi\n directory: SnapshotStore<ModelDirectoryState>\n loadModelDirectory: () => void\n}\n\nexport function CodexComposerQuota({ api, directory, loadModelDirectory, t }: Props): React.JSX.Element | null {\n const modelState = useStore(directory)\n const [status, setStatus] = useState<PluginStatusDto | null>(null)\n const [loading, setLoading] = useState(false)\n const mountedRef = useRef(false)\n const selected = modelState.current\n const isCodex = selected?.provider === CODEX_CHATGPT_PROVIDER_ID\n\n useEffect(() => {\n loadModelDirectory()\n }, [loadModelDirectory])\n\n useEffect(() => {\n mountedRef.current = true\n return () => {\n mountedRef.current = false\n }\n }, [])\n\n useEffect(() => {\n if (!isCodex) return\n let disposed = false\n const refresh = async (): Promise<void> => {\n setLoading(true)\n try {\n const next = await api.status()\n if (!disposed && mountedRef.current) setStatus(next)\n } catch {\n if (!disposed && mountedRef.current) setStatus(null)\n } finally {\n if (!disposed && mountedRef.current) setLoading(false)\n }\n }\n void refresh()\n const timer = window.setInterval(() => {\n if (document.visibilityState === 'visible') void refresh()\n }, 60_000)\n return () => {\n disposed = true\n window.clearInterval(timer)\n }\n }, [api, isCodex])\n\n const quota = useMemo(() => selectQuotaForModel(status?.quota, selected?.model), [selected?.model, status?.quota])\n if (!isCodex || status?.preferences.quickQuotaVisible !== true) return null\n const level = quota === null\n ? 'normal'\n : quota.remainingPercent <= 5\n ? 'danger'\n : quota.remainingPercent <= 20\n ? 'warning'\n : 'normal'\n return <span className=\"dsh-codex-composer-quota\" data-level={level} aria-label={quota === null ? t('quickQuotaLoading') : `${t('quickQuotaLabel')}: ${formatPercent(quota.remainingPercent)}`}>\n <span>{t('quickQuotaLabel')}</span>\n <strong>{quota === null ? (loading ? t('quickQuotaLoading') : '—') : formatPercent(quota.remainingPercent)}</strong>\n </span>\n}\n\nfunction useStore<T>(store: SnapshotStore<T>): T {\n return useSyncExternalStore(\n (listener) => store.subscribe(listener),\n () => store.getSnapshot(),\n () => store.getSnapshot(),\n )\n}\n\nfunction formatPercent(value: number): string {\n return `${new Intl.NumberFormat(undefined, { maximumFractionDigits: 0 }).format(value)}%`\n}\n","import { useEffect, useState } from 'react'\nimport type { ImageAttachmentRef } from '@deepseek-ai/dsh-attachment'\nimport type { ContentBlock } from '@deepseek-ai/dsh-client-connection/client'\nimport type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport { NS } from './locales.ts'\n\nexport type ImageLoader = (attachment: ImageAttachmentRef) => Promise<string>\n\ntype Props = PropsRuntime<'tool.call.toolview'> & PropsLocale<typeof NS> & {\n loadImage: ImageLoader\n}\n\nexport function CodexImageToolView({ block, loadImage, t }: Props): React.JSX.Element {\n const settled = 'kind' in block\n const isError = settled ? block.isError : false\n const prompt = promptFromBlock(block)\n const images = settled && !isError ? imageBlocks(block.content) : []\n const label = isError ? t('imageToolFailed') : settled ? t('imageToolDone') : t('imageToolRunning')\n const summary = prompt ?? textSummary(settled ? block.content : [])\n return <div className=\"dsh-codex-image-tool\" data-state={isError ? 'error' : settled ? 'done' : 'running'}>\n <div className=\"dsh-codex-image-tool-head\">\n <span className=\"dsh-codex-image-dot\" aria-hidden=\"true\" />\n <span className=\"dsh-codex-image-title\">{label}</span>\n {summary !== null ? <span className=\"dsh-codex-image-summary\">{summary}</span> : null}\n </div>\n {images.length > 0 ? <div className=\"dsh-codex-image-grid\">\n {images.map((attachment) => <GeneratedImage key={String(attachment.attachmentId)} attachment={attachment} load={loadImage} label={attachment.name ?? t('image')} t={t} />)}\n </div> : null}\n </div>\n}\n\nfunction GeneratedImage({ attachment, load, label, t }: {\n attachment: ImageAttachmentRef\n load: ImageLoader\n label: string\n t: Props['t']\n}): React.JSX.Element {\n const [src, setSrc] = useState<string | null>(null)\n const [failed, setFailed] = useState(false)\n useEffect(() => {\n let disposed = false\n setSrc(null)\n setFailed(false)\n load(attachment).then((url) => {\n if (!disposed) setSrc(url)\n }, () => {\n if (!disposed) setFailed(true)\n })\n return () => {\n disposed = true\n }\n }, [attachment, load])\n if (failed) return <span className=\"dsh-codex-image-failed\">{t('imageLoadFailed')}</span>\n if (src === null) return <span className=\"dsh-codex-image-loading\">{t('imageLoading')}</span>\n return <img className=\"dsh-codex-image-preview\" src={src} alt={label} />\n}\n\nfunction promptFromBlock(block: Props['block']): string | null {\n const raw = 'kind' in block ? block.call?.argsRaw : block.argsRaw\n if (typeof raw !== 'string' || raw.trim() === '') return null\n try {\n const value = JSON.parse(raw) as unknown\n return typeof value === 'object'\n && value !== null\n && !Array.isArray(value)\n && typeof (value as { prompt?: unknown }).prompt === 'string'\n ? (value as { prompt: string }).prompt\n : null\n } catch {\n return null\n }\n}\n\nfunction imageBlocks(blocks: readonly ContentBlock[]): ImageAttachmentRef[] {\n const result: ImageAttachmentRef[] = []\n for (const block of blocks) {\n if (block.type === 'image') result.push(block.attachment)\n if (block.type === 'tool-result') result.push(...imageBlocks(block.content))\n }\n return result\n}\n\nfunction textSummary(blocks: readonly ContentBlock[]): string | null {\n const text = blocks\n .map((block) => block.type === 'text' || block.type === 'reasoning' ? block.text : '')\n .filter(Boolean)\n .join(' ')\n .trim()\n return text === '' ? null : text\n}\n","export type CodexModelModality = 'text' | 'image'\n\nexport const GPT_56_MAX_CONTEXT_WINDOW = 1_000_000\n\nexport interface CodexModelCatalogEntry {\n id: string\n name: string\n contextWindow: number\n inputModalities: readonly CodexModelModality[]\n defaultReasoningEffort: string\n reasoningProfile: 'standard' | 'gpt-5.6'\n supportsReasoningSummary: boolean\n}\n\nexport const CODEX_MODEL_CATALOG = [\n {\n id: 'gpt-5.6-sol',\n name: '5.6 Sol',\n contextWindow: 272_000,\n inputModalities: ['text', 'image'],\n defaultReasoningEffort: 'medium',\n reasoningProfile: 'gpt-5.6',\n supportsReasoningSummary: true,\n },\n {\n id: 'gpt-5.6-terra',\n name: '5.6 Terra',\n contextWindow: 272_000,\n inputModalities: ['text', 'image'],\n defaultReasoningEffort: 'medium',\n reasoningProfile: 'gpt-5.6',\n supportsReasoningSummary: true,\n },\n {\n id: 'gpt-5.6-luna',\n name: '5.6 Luna',\n contextWindow: 272_000,\n inputModalities: ['text', 'image'],\n defaultReasoningEffort: 'medium',\n reasoningProfile: 'gpt-5.6',\n supportsReasoningSummary: true,\n },\n {\n id: 'gpt-5.5',\n name: '5.5',\n contextWindow: 272_000,\n inputModalities: ['text', 'image'],\n defaultReasoningEffort: 'medium',\n reasoningProfile: 'standard',\n supportsReasoningSummary: true,\n },\n {\n id: 'gpt-5.4',\n name: '5.4',\n contextWindow: 272_000,\n inputModalities: ['text', 'image'],\n defaultReasoningEffort: 'none',\n reasoningProfile: 'standard',\n supportsReasoningSummary: true,\n },\n {\n id: 'gpt-5.4-mini',\n name: '5.4 Mini',\n contextWindow: 272_000,\n inputModalities: ['text', 'image'],\n defaultReasoningEffort: 'none',\n reasoningProfile: 'standard',\n supportsReasoningSummary: true,\n },\n {\n id: 'gpt-5.3-codex-spark',\n name: '5.3 Codex Spark',\n contextWindow: 258_000,\n inputModalities: ['text'],\n defaultReasoningEffort: 'high',\n reasoningProfile: 'standard',\n supportsReasoningSummary: false,\n },\n] as const satisfies readonly CodexModelCatalogEntry[]\n\nexport type CodexModelId = typeof CODEX_MODEL_CATALOG[number]['id']\n\nexport const DEFAULT_CODEX_MODEL = CODEX_MODEL_CATALOG[0]\n\nexport const CONFIGURABLE_CONTEXT_MODEL_IDS = [\n 'gpt-5.6-sol',\n 'gpt-5.6-terra',\n 'gpt-5.6-luna',\n] as const satisfies readonly CodexModelId[]\n\nexport type ConfigurableContextModelId = typeof CONFIGURABLE_CONTEXT_MODEL_IDS[number]\n\nexport const STANDARD_REASONING_EFFORTS = ['none', 'low', 'medium', 'high', 'xhigh'] as const\nexport const GPT_56_REASONING_EFFORTS = [...STANDARD_REASONING_EFFORTS, 'max'] as const\nexport type CodexReasoningEffort = typeof GPT_56_REASONING_EFFORTS[number]\n\nexport function reasoningEffortsForModel(model: string): readonly CodexReasoningEffort[] {\n return resolveCodexCatalogEntry(model).reasoningProfile === 'gpt-5.6'\n ? GPT_56_REASONING_EFFORTS\n : STANDARD_REASONING_EFFORTS\n}\n\nexport function isCodexReasoningEffort(value: unknown): value is CodexReasoningEffort {\n return typeof value === 'string' && GPT_56_REASONING_EFFORTS.some((effort) => effort === value)\n}\n\nexport function modelSupportsReasoningEffort(model: string, effort: unknown): effort is CodexReasoningEffort {\n return isCodexReasoningEffort(effort) && reasoningEffortsForModel(model).some((candidate) => candidate === effort)\n}\n\nexport function isCodexModelId(model: unknown): model is CodexModelId {\n return typeof model === 'string' && CODEX_MODEL_CATALOG.some((entry) => entry.id === model)\n}\n\nexport function isConfigurableContextModelId(model: unknown): model is ConfigurableContextModelId {\n return typeof model === 'string' && CONFIGURABLE_CONTEXT_MODEL_IDS.some((id) => id === model)\n}\n\nexport function resolveCodexCatalogEntry(model: string): CodexModelCatalogEntry {\n return CODEX_MODEL_CATALOG.find((entry) => entry.id === model) ?? DEFAULT_CODEX_MODEL\n}\n\nexport function codexModelSupportsImageInput(model: string): boolean {\n return resolveCodexCatalogEntry(model).inputModalities.includes('image')\n}\n\nexport function codexModelSupportsReasoningSummary(model: string): boolean {\n return resolveCodexCatalogEntry(model).supportsReasoningSummary\n}\n","import { ROUTE_PREFIX } from '../compat.ts'\r\nimport type {\r\n ApiEnvelope,\r\n LoginEventDto,\r\n LoginStartDto,\r\n PluginStatusDto,\r\n QuotaStatusDto,\r\n SubagentModelCatalogDto,\r\n ConnectionTestDto,\r\n SubscriptionPreferencesDto,\r\n SubscriptionPreferencesUpdateDto,\r\n} from '../shared/contracts.ts'\r\n\r\nexport class SubscriptionApi {\r\n status(): Promise<PluginStatusDto> {\r\n return request<PluginStatusDto>(`${ROUTE_PREFIX}/status`)\r\n }\r\n\r\n models(): Promise<SubagentModelCatalogDto> {\r\n return request<SubagentModelCatalogDto>(`${ROUTE_PREFIX}/models`)\r\n }\r\n\r\n startLogin(): Promise<LoginStartDto> {\r\n return post<LoginStartDto>(`${ROUTE_PREFIX}/login/start`, {})\r\n }\r\n\r\n cancelLogin(loginId: string): Promise<{ cancelled: boolean }> {\r\n return post(`${ROUTE_PREFIX}/login/cancel`, { loginId })\r\n }\r\n\r\n logout(): Promise<{ authenticated: false }> {\r\n return post(`${ROUTE_PREFIX}/logout`, {})\r\n }\r\n\r\n refresh(): Promise<PluginStatusDto> {\r\n return post(`${ROUTE_PREFIX}/token/refresh`, {})\r\n }\r\n\r\n refreshQuota(): Promise<QuotaStatusDto> {\r\n return post(`${ROUTE_PREFIX}/quota/refresh`, {})\r\n }\r\n\r\n testConnection(): Promise<ConnectionTestDto> {\r\n return post(`${ROUTE_PREFIX}/connection/test`, {})\r\n }\r\n\r\n updatePreferences(patch: SubscriptionPreferencesUpdateDto): Promise<SubscriptionPreferencesDto> {\r\n return post(`${ROUTE_PREFIX}/preferences/update`, patch)\r\n }\r\n\r\n events(loginId: string): EventSource {\r\n return new EventSource(`${ROUTE_PREFIX}/login/events?loginId=${encodeURIComponent(loginId)}`)\r\n }\r\n}\r\n\r\nasync function post<T>(url: string, body: object): Promise<T> {\r\n return request<T>(url, {\r\n method: 'POST',\r\n headers: { 'content-type': 'application/json' },\r\n body: JSON.stringify(body),\r\n })\r\n}\r\n\r\nasync function request<T>(url: string, init?: RequestInit): Promise<T> {\r\n const response = await fetch(url, { ...init, credentials: 'same-origin' })\r\n const envelope = await response.json() as ApiEnvelope<T>\r\n if (!response.ok || !envelope.ok) {\r\n throw new Error(envelope.ok ? `Request failed (${response.status})` : envelope.error.message)\r\n }\r\n return envelope.value\r\n}\r\n\r\nexport function parseLoginEvent(event: MessageEvent<string>): LoginEventDto | null {\r\n try {\r\n const value = JSON.parse(event.data) as LoginEventDto\r\n return typeof value === 'object' && value !== null && typeof value.type === 'string' ? value : null\r\n } catch {\r\n return null\r\n }\r\n}\r\n","import { useCallback, useEffect, useRef, useState } from 'react'\r\nimport type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\r\nimport type { CredentialStorageDto, PluginStatusDto, QuotaBucketDto, QuotaWindowDto, SubscriptionPreferencesUpdateDto } from '../shared/contracts.ts'\r\nimport { CODEX_MODEL_CATALOG, CONFIGURABLE_CONTEXT_MODEL_IDS, GPT_56_MAX_CONTEXT_WINDOW, reasoningEffortsForModel, resolveCodexCatalogEntry } from '../shared/model-catalog.ts'\r\nimport { SubscriptionApi, parseLoginEvent } from './api.ts'\r\nimport { NS } from './locales.ts'\r\nimport { quotaWindows } from './quota.ts'\r\n\r\ntype Props = PropsRuntime<'settings.section'> & PropsLocale<typeof NS>\r\ntype BusyAction = 'login' | 'token' | 'quota' | 'test' | 'logout' | 'preferences' | null\r\ntype Translate = Props['t']\r\n\r\nexport function CodexSubscriptionSection({ t }: Props): React.JSX.Element {\r\n const apiRef = useRef(new SubscriptionApi())\r\n const eventSourceRef = useRef<EventSource | null>(null)\r\n const [status, setStatus] = useState<PluginStatusDto | null>(null)\r\n const [busy, setBusy] = useState<BusyAction>(null)\r\n const [error, setError] = useState<string | null>(null)\r\n const [authUrl, setAuthUrl] = useState<string | null>(null)\r\n const [popupBlocked, setPopupBlocked] = useState(false)\r\n const [connection, setConnection] = useState<{ latencyMs: number; checkedAt: number } | null>(null)\r\n const [contextDrafts, setContextDrafts] = useState<Record<string, string>>({})\r\n\r\n const load = useCallback(async (quiet = false) => {\r\n if (!quiet) setError(null)\r\n try {\r\n const next = await apiRef.current.status()\r\n setStatus(next)\r\n if (next.error !== undefined) setError(next.error.message)\r\n } catch (cause) {\r\n if (!quiet) setError(messageOf(cause))\r\n }\r\n }, [])\r\n\r\n useEffect(() => {\r\n void load()\r\n const refreshWhenVisible = (): void => {\r\n if (document.visibilityState === 'visible') void load(true)\r\n }\r\n document.addEventListener('visibilitychange', refreshWhenVisible)\r\n const timer = window.setInterval(refreshWhenVisible, 60_000)\r\n return () => {\r\n window.clearInterval(timer)\r\n document.removeEventListener('visibilitychange', refreshWhenVisible)\r\n eventSourceRef.current?.close()\r\n }\r\n }, [load])\r\n\r\n const watchLogin = useCallback((loginId: string) => {\r\n eventSourceRef.current?.close()\r\n const source = apiRef.current.events(loginId)\r\n eventSourceRef.current = source\r\n const finish = async (message?: string): Promise<void> => {\r\n source.close()\r\n eventSourceRef.current = null\r\n setBusy(null)\r\n setAuthUrl(null)\r\n if (message !== undefined) setError(message)\r\n // Preserve the terminal OAuth error while refreshing the account DTO.\r\n await load(true)\r\n }\r\n source.addEventListener('completed', (event) => {\r\n const parsed = parseLoginEvent(event as MessageEvent<string>)\r\n if (parsed?.type === 'completed') void finish()\r\n })\r\n source.addEventListener('cancelled', () => void finish())\r\n source.addEventListener('failed', (event) => {\r\n const parsed = parseLoginEvent(event as MessageEvent<string>)\r\n void finish(parsed?.type === 'failed' ? parsed.error.message : 'ChatGPT sign-in failed.')\r\n })\r\n }, [load])\r\n\r\n useEffect(() => {\r\n const loginId = status?.login.active ? status.login.loginId : null\r\n if (loginId !== null && loginId !== undefined && eventSourceRef.current === null) watchLogin(loginId)\r\n }, [status?.login.active, status?.login.loginId, watchLogin])\r\n\r\n const startLogin = async (): Promise<void> => {\r\n setBusy('login')\r\n setError(null)\r\n setPopupBlocked(false)\r\n const popup = window.open('about:blank', 'dsh-chatgpt-oauth', 'popup,width=560,height=760')\r\n try {\r\n const login = await apiRef.current.startLogin()\r\n setAuthUrl(login.authUrl)\r\n if (popup === null) setPopupBlocked(true)\r\n else popup.location.replace(login.authUrl)\r\n watchLogin(login.loginId)\r\n await load(true)\r\n } catch (cause) {\r\n popup?.close()\r\n setBusy(null)\r\n setError(messageOf(cause))\r\n }\r\n }\r\n\r\n const cancelLogin = async (): Promise<void> => {\r\n const loginId = status?.login.loginId\r\n if (loginId === null || loginId === undefined) return\r\n setBusy('login')\r\n try {\r\n await apiRef.current.cancelLogin(loginId)\r\n eventSourceRef.current?.close()\r\n eventSourceRef.current = null\r\n setAuthUrl(null)\r\n await load()\r\n } catch (cause) {\r\n setError(messageOf(cause))\r\n } finally {\r\n setBusy(null)\r\n }\r\n }\r\n\r\n const refreshToken = async (): Promise<void> => run('token', async () => {\r\n setStatus(await apiRef.current.refresh())\r\n })\r\n\r\n const refreshQuota = async (): Promise<void> => run('quota', async () => {\r\n const quota = await apiRef.current.refreshQuota()\r\n setStatus((current) => current === null ? current : { ...current, quota })\r\n })\r\n\r\n const testConnection = async (): Promise<void> => run('test', async () => {\r\n const result = await apiRef.current.testConnection()\r\n setConnection({ latencyMs: result.latencyMs, checkedAt: result.checkedAt })\r\n })\r\n\r\n const updatePreferences = async (patch: SubscriptionPreferencesUpdateDto): Promise<void> => run('preferences', async () => {\r\n const preferences = await apiRef.current.updatePreferences(patch)\r\n setStatus((current) => current === null ? current : { ...current, preferences })\r\n })\r\n\r\n const updateContextWindow = async (model: (typeof CONFIGURABLE_CONTEXT_MODEL_IDS)[number]): Promise<void> => {\r\n const current = status?.preferences.contextWindowOverrides[model] ?? resolveCodexCatalogEntry(model).contextWindow\r\n const parsed = parseCapacity(contextDrafts[model] ?? String(current))\r\n if (parsed === null) {\r\n setError(t('contextWindowInvalid'))\r\n return\r\n }\r\n await updatePreferences({ contextWindowOverrides: { [model]: parsed } })\r\n setContextDrafts((drafts) => ({ ...drafts, [model]: String(parsed) }))\r\n }\r\n\r\n const logout = async (): Promise<void> => run('logout', async () => {\r\n await apiRef.current.logout()\r\n eventSourceRef.current?.close()\r\n eventSourceRef.current = null\r\n setAuthUrl(null)\r\n setConnection(null)\r\n await load()\r\n })\r\n\r\n const run = async (action: Exclude<BusyAction, null>, task: () => Promise<void>): Promise<void> => {\r\n setBusy(action)\r\n setError(null)\r\n try {\r\n await task()\r\n } catch (cause) {\r\n setError(messageOf(cause))\r\n } finally {\r\n setBusy(null)\r\n }\r\n }\r\n\r\n const account = status?.account\r\n return <section className=\"dsh-codex-page\" aria-labelledby=\"dsh-codex-title\">\r\n <header>\r\n <h2 id=\"dsh-codex-title\" className=\"dsh-codex-title\">{t('title')}</h2>\r\n <p className=\"dsh-codex-intro\">{t('intro')}</p>\r\n </header>\r\n\r\n {error !== null ? <div className=\"dsh-codex-errorbar\" role=\"alert\">\r\n <span>{error}</span>\r\n {status === null ? <Button disabled={busy !== null} onClick={() => load()}>{t('retry')}</Button> : null}\r\n </div> : null}\r\n\r\n {status === null && error === null ? <Skeleton label={t('loading')} /> : <>\r\n <Section title={t('account')}>\r\n <InfoRow label={status?.authenticated ? t('signedIn') : t('signedOut')} value={account?.email ?? '—'} />\r\n {status?.authenticated ? <>\r\n <InfoRow label={t('plan')} value={account?.planType ?? t('unknown')} />\r\n <InfoRow label={t('accountId')} value={account?.accountIdSuffix ?? '—'} />\r\n <InfoRow label={t('expires')} value={formatDate(account?.tokenExpiresAt)} />\r\n </> : null}\r\n <InfoRow label={t('storage')} value={storageLabel(status?.storage, t)} />\r\n <p className=\"dsh-codex-notice\">{storageNotice(status?.storage, t)}</p>\r\n {status?.login.active ? <p className=\"dsh-codex-muted\" role=\"status\">{t('pending')}</p> : null}\r\n {popupBlocked ? <p className=\"dsh-codex-error\">{t('popupBlocked')}</p> : null}\r\n {authUrl !== null ? <a className=\"dsh-codex-link\" href={authUrl} target=\"_blank\" rel=\"noreferrer\">{t('continueLogin')}</a> : null}\r\n <div className=\"dsh-codex-actions\">\r\n {status?.login.active\r\n ? <Button disabled={busy !== null} onClick={cancelLogin}>{t('cancel')}</Button>\r\n : <Button primary disabled={busy !== null || status?.storage.available === false} onClick={startLogin}>{status?.authenticated ? t('signInAgain') : t('signIn')}</Button>}\r\n {status?.authenticated ? <>\r\n <Button disabled={busy !== null} onClick={refreshToken}>{t('refreshToken')}</Button>\r\n <Button disabled={busy !== null} onClick={logout}>{t('signOut')}</Button>\r\n </> : null}\r\n </div>\r\n </Section>\r\n\r\n <Section title={t('connection')}>\r\n <InfoRow label={t('provider')} value=\"Codex(ChatGPT 订阅) · codex-chatgpt\" />\r\n <InfoRow label={t('connectionState')} value={connection === null ? t('untested') : t('connected')} />\r\n {connection !== null ? <InfoRow label={t('latency')} value={`${connection.latencyMs} ms · ${formatDate(connection.checkedAt)}`} /> : null}\r\n <div className=\"dsh-codex-models\" aria-label={t('models')}>\r\n {CODEX_MODEL_CATALOG.map((model) => <code key={model.id} title={model.id}>{model.name}</code>)}\r\n </div>\r\n <div className=\"dsh-codex-actions\">\r\n <Button disabled={!status?.authenticated || busy !== null} onClick={testConnection}>{busy === 'test' ? t('testing') : t('testConnection')}</Button>\r\n </div>\r\n </Section>\r\n\r\n <Section title={t('enhancements')}>\r\n <div className=\"dsh-codex-pref-row\">\r\n <div>\r\n <strong>{t('searchProvider')}</strong>\r\n <p className=\"dsh-codex-muted\">{t('searchProviderHint')}</p>\r\n </div>\r\n <div className=\"dsh-codex-segments\" role=\"radiogroup\" aria-label={t('searchProvider')}>\r\n <label>\r\n <input type=\"radio\" name=\"dsh-codex-search-provider\" checked={status?.preferences.searchProvider === 'dsh'} disabled={busy !== null} onChange={() => updatePreferences({ searchProvider: 'dsh' })} />\r\n <span>{t('searchProviderDsh')}</span>\r\n </label>\r\n <label>\r\n <input type=\"radio\" name=\"dsh-codex-search-provider\" checked={status?.preferences.searchProvider === 'codex'} disabled={busy !== null} onChange={() => updatePreferences({ searchProvider: 'codex' })} />\r\n <span>{t('searchProviderCodex')}</span>\r\n </label>\r\n </div>\r\n </div>\r\n <div className=\"dsh-codex-context-settings\">\r\n <div>\r\n <strong>{t('contextWindows')}</strong>\r\n <p className=\"dsh-codex-muted\">{t('contextWindowsHint')}</p>\r\n </div>\r\n {CONFIGURABLE_CONTEXT_MODEL_IDS.map((model) => {\r\n const entry = resolveCodexCatalogEntry(model)\r\n const fallback = status?.preferences.contextWindowOverrides[model] ?? entry.contextWindow\r\n const draft = contextDrafts[model]\r\n const parsedDraft = draft === undefined ? fallback : parseCapacity(draft)\r\n const dirty = draft !== undefined && parsedDraft !== fallback\r\n const inputId = `dsh-codex-context-${model}`\r\n return <div className=\"dsh-codex-context-row\" key={model}>\r\n <label htmlFor={inputId}>{entry.name}</label>\r\n <span className=\"dsh-codex-capacity-control\">\r\n <input id={inputId} type=\"text\" inputMode=\"numeric\" value={draft ?? formatCapacity(fallback)} disabled={busy !== null} aria-label={entry.name + ' ' + t('contextWindow')} onChange={(event) => {\r\n const value = event.currentTarget.value\r\n setContextDrafts((drafts) => ({ ...drafts, [model]: value }))\r\n }} onKeyDown={(event) => {\r\n if (event.key !== 'Enter' || !dirty) return\r\n event.preventDefault()\r\n void updateContextWindow(model)\r\n }} />\r\n <small>{t('tokens')}</small>\r\n <button className=\"dsh-codex-context-save\" type=\"button\" data-model={model} aria-label={entry.name + ' ' + t('saveContextWindow')} disabled={busy !== null || !dirty} onClick={() => void updateContextWindow(model)}>{t('save')}</button>\r\n </span>\r\n </div>\r\n })}\r\n </div>\r\n <label className=\"dsh-codex-check\">\r\n <input type=\"checkbox\" checked={status?.preferences.quickQuotaVisible === true} disabled={busy !== null} onChange={(event) => updatePreferences({ quickQuotaVisible: event.currentTarget.checked })} />\r\n <span>\r\n <strong>{t('quickQuota')}</strong>\r\n <small>{t('quickQuotaHint')}</small>\r\n </span>\r\n </label>\r\n </Section>\r\n\r\n <Section title={t('quota')} aside={<Button disabled={!status?.authenticated || busy !== null} onClick={refreshQuota}>{busy === 'quota' ? t('refreshing') : t('refreshQuota')}</Button>}>\r\n <p className=\"dsh-codex-muted\">{t('quotaIntro')}</p>\r\n {status?.quota.state === 'signed-out' ? <p className=\"dsh-codex-empty\">{t('quotaSignedOut')}</p> : null}\r\n {status?.quota.buckets.map((bucket) => <QuotaBucket key={bucket.id} bucket={bucket} t={t} />)}\r\n {status?.quota.credits !== null && status?.quota.credits !== undefined ? <QuotaFact label={t('credits')} value={status.quota.credits.unlimited ? t('unlimited') : status.quota.credits.balance ?? (status.quota.credits.hasCredits ? t('available') : t('unavailable'))} /> : null}\r\n {status?.quota.individualLimit !== null && status?.quota.individualLimit !== undefined ? <QuotaFact label={t('monthlySpend')} value={individualLimitLabel(status.quota.individualLimit, t)} /> : null}\r\n {status?.quota.resetCredits !== null && status?.quota.resetCredits !== undefined ? <QuotaFact label={t('resetCredits')} value={String(status.quota.resetCredits.availableCount)} /> : null}\r\n {status?.quota.spendControlReached === true ? <p className=\"dsh-codex-warning\" role=\"status\">{t('spendControlReached')}</p> : null}\r\n {status?.quota.state === 'empty' ? <p className=\"dsh-codex-empty\">{t('noQuota')}</p> : null}\r\n {status?.quota.stale ? <p className=\"dsh-codex-warning\" role=\"status\">{t('stale')}</p> : null}\r\n {status?.quota.error ? <p className=\"dsh-codex-error\" role=\"alert\">{status.quota.error.message}</p> : null}\r\n {status?.quota.fetchedAt ? <p className=\"dsh-codex-timestamp\">{t('updated')}: {formatDate(status.quota.fetchedAt)}</p> : null}\r\n </Section>\r\n </>}\r\n\r\n <span className=\"dsh-codex-sr\" aria-live=\"polite\">{busy === null ? '' : busy}</span>\r\n </section>\r\n}\r\n\r\nfunction Section({ title, aside, children }: { title: string; aside?: React.ReactNode; children: React.ReactNode }): React.JSX.Element {\r\n return <section className=\"dsh-codex-group\">\r\n <div className=\"dsh-codex-grouphead\"><h3>{title}</h3>{aside}</div>\r\n {children}\r\n </section>\r\n}\r\n\r\nfunction Button({ primary = false, disabled, onClick, children }: { primary?: boolean; disabled?: boolean; onClick: () => void | Promise<void>; children: React.ReactNode }): React.JSX.Element {\r\n return <button className={`dsh-codex-button${primary ? ' dsh-codex-button-primary' : ''}`} type=\"button\" disabled={disabled} onClick={() => void onClick()}>{children}</button>\r\n}\r\n\r\nfunction InfoRow({ label, value }: { label: string; value: string }): React.JSX.Element {\r\n return <div className=\"dsh-codex-row\"><span className=\"dsh-codex-label\">{label}</span><span className=\"dsh-codex-value\">{value}</span></div>\r\n}\r\n\r\nexport function storageLabel(storage: CredentialStorageDto | undefined, t: Translate): string {\r\n if (storage === undefined || !storage.available) return t('storageUnavailable')\r\n if (storage.kind === 'windows-dpapi') return t('storageWindows')\r\n if (storage.kind === 'macos-keychain') return t('storageMacKeychain')\r\n if (storage.kind === 'linux-file') return t('storageLinuxFile')\r\n if (storage.kind === 'memory') return t('storageMemory')\r\n return t('storageUnavailable')\r\n}\r\n\r\nexport function storageNotice(storage: CredentialStorageDto | undefined, t: Translate): string {\r\n if (storage === undefined || !storage.available) return t('securityUnavailable')\r\n if (storage.kind === 'windows-dpapi') return t('securityWindows')\r\n if (storage.kind === 'macos-keychain') return t('securityMacKeychain')\r\n if (storage.kind === 'linux-file') return t('securityLinuxFile')\r\n if (storage.kind === 'memory') return t('securityMemory')\r\n return t('securityUnavailable')\r\n}\r\n\r\nfunction QuotaBucket({ bucket, t }: { bucket: QuotaBucketDto; t: Translate }): React.JSX.Element {\r\n const windows = quotaWindows(bucket)\r\n return <article className=\"dsh-codex-quota-card\">\r\n <div className=\"dsh-codex-quota-title\"><strong>{bucket.name}</strong>{bucket.planType ? <span>{bucket.planType}</span> : null}</div>\r\n {windows.map((window, index) => <QuotaBar key={`${window.windowDurationMins ?? 'x'}:${window.resetsAt ?? 'x'}:${index}`} label={windowLabel(window.windowDurationMins, t)} window={window} t={t} />)}\r\n </article>\r\n}\r\n\r\nfunction QuotaFact({ label, value }: { label: string; value: string }): React.JSX.Element {\r\n return <div className=\"dsh-codex-quota-fact\"><span>{label}</span><strong>{value}</strong></div>\r\n}\r\n\r\nexport function QuotaBar({ label, window, t }: { label: string; window: QuotaWindowDto; t: Translate }): React.JSX.Element {\r\n const percent = window.usedPercent\r\n const level = percent >= 95 ? 'danger' : percent >= 80 ? 'warning' : 'normal'\r\n const remaining = Math.max(0, 100 - percent)\r\n return <div className=\"dsh-codex-meter-wrap\">\r\n <div className=\"dsh-codex-meter-label\"><span>{label}</span><strong>{formatPercent(percent)}</strong></div>\r\n <div className={`dsh-codex-meter dsh-codex-meter-${level}`} role=\"progressbar\" aria-label={`${label}: ${formatPercent(percent)} ${t('used')}`} aria-valuemin={0} aria-valuemax={100} aria-valuenow={percent}>\r\n <span style={{ width: `${percent}%` }} />\r\n </div>\r\n <div className=\"dsh-codex-meter-meta\">\r\n <span>{percent >= 100 ? `${t('exhausted')} · ${formatPercent(remaining)} ${t('remaining')}` : `${formatPercent(percent)} ${t('used')} · ${formatPercent(remaining)} ${t('remaining')}`}</span>\r\n <span>{window.resetsAt === null ? '—' : `${t('resets')}: ${formatReset(window.resetsAt)}`}</span>\r\n </div>\r\n </div>\r\n}\r\n\r\nfunction Skeleton({ label }: { label: string }): React.JSX.Element {\r\n return <div className=\"dsh-codex-skeleton\" role=\"status\" aria-label={label}><span /><span /></div>\r\n}\r\n\r\nexport function windowLabel(minutes: number | null, t: Translate): string {\r\n if (minutes === null) return t('limitWindow')\r\n const [value, unit]: [number, Intl.NumberFormatOptions['unit']] = minutes >= 1440 && minutes % 1440 === 0\r\n ? [minutes / 1440, 'day']\r\n : minutes >= 60 && minutes % 60 === 0\r\n ? [minutes / 60, 'hour']\r\n : [Math.round(minutes), 'minute']\r\n return `${new Intl.NumberFormat(undefined, { style: 'unit', unit, unitDisplay: 'long' }).format(value)} ${t('limitWindow')}`\r\n}\r\n\r\nfunction reasoningEffortLabel(effort: string, t: Translate): string {\r\n const labels: Record<string, keyof typeof import('./locales.ts').zh> = {\r\n none: 'reasoningNone',\r\n low: 'reasoningLow',\r\n medium: 'reasoningMedium',\r\n high: 'reasoningHigh',\r\n xhigh: 'reasoningXhigh',\r\n max: 'reasoningMax',\r\n }\r\n return t(labels[effort] ?? 'unknown')\r\n}\r\n\r\nexport function parsePositiveCapacity(value: string): number | null {\r\n const normalized = value.trim().toLowerCase().replace(/[,_\\s]/g, '')\r\n const matched = normalized.match(/^(\\d+(?:\\.\\d+)?)(k|m)?$/)\r\n if (matched === null) return null\r\n const multiplier = matched[2] === 'm' ? 1_000_000 : matched[2] === 'k' ? 1_000 : 1\r\n const parsed = Number(matched[1]) * multiplier\r\n return Number.isSafeInteger(parsed) && parsed >= 1 ? parsed : null\r\n}\r\n\r\nexport function parseCapacity(value: string): number | null {\r\n const parsed = parsePositiveCapacity(value)\r\n return parsed !== null && parsed <= GPT_56_MAX_CONTEXT_WINDOW ? parsed : null\r\n}\r\n\r\nfunction formatCapacity(value: number): string {\r\n if (value % 1_000 === 0) return `${value / 1_000}K`\r\n return String(value)\r\n}\r\n\r\nfunction formatPercent(value: number): string {\r\n return `${new Intl.NumberFormat(undefined, { maximumFractionDigits: 1 }).format(value)}%`\r\n}\r\n\r\nfunction individualLimitLabel(limit: NonNullable<PluginStatusDto['quota']['individualLimit']>, t: Translate): string {\r\n const parts = [\r\n limit.remainingPercent !== null ? `${formatPercent(limit.remainingPercent)} ${t('remaining')}` : null,\r\n limit.limit !== null ? `${t('limit')}: ${limit.limit}` : null,\r\n limit.used !== null ? `${t('used')}: ${limit.used}` : null,\r\n limit.resetsAt !== null ? `${t('resets')}: ${formatReset(limit.resetsAt)}` : null,\r\n ].filter((part): part is string => part !== null)\r\n return parts.length > 0 ? parts.join(' · ') : t('unknown')\r\n}\r\n\r\nfunction formatDate(seconds: number | undefined): string {\r\n if (seconds === undefined) return '—'\r\n return new Intl.DateTimeFormat(undefined, { dateStyle: 'medium', timeStyle: 'short' }).format(seconds * 1000)\r\n}\r\n\r\nexport function formatReset(seconds: number): string {\r\n const absolute = formatDate(seconds)\r\n const diff = seconds * 1000 - Date.now()\r\n const abs = Math.abs(diff)\r\n const [amount, unit]: [number, Intl.RelativeTimeFormatUnit] = abs >= 86_400_000\r\n ? [Math.round(diff / 86_400_000), 'day']\r\n : abs >= 3_600_000\r\n ? [Math.round(diff / 3_600_000), 'hour']\r\n : [Math.round(diff / 60_000), 'minute']\r\n return `${absolute} (${new Intl.RelativeTimeFormat(undefined, { numeric: 'auto' }).format(amount, unit)})`\r\n}\r\n\r\nfunction messageOf(error: unknown): string {\r\n return error instanceof Error ? error.message : String(error)\r\n}\r\n","import { useCallback, useEffect, useRef, useState } from 'react'\nimport type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { SubagentModelCatalogDto, SubscriptionPreferencesDto, SubscriptionPreferencesUpdateDto } from '../shared/contracts.ts'\nimport { SUBAGENT_MAX_DEPTH_LIMIT } from '../shared/preferences.ts'\nimport { SubscriptionApi } from './api.ts'\nimport { NS } from './locales.ts'\n\ntype Props = PropsRuntime<'settings.section'> & PropsLocale<typeof NS>\n\nexport function SubagentSettingsSection({ t }: Props): React.JSX.Element {\n const apiRef = useRef(new SubscriptionApi())\n const [preferences, setPreferences] = useState<SubscriptionPreferencesDto | null>(null)\n const [catalog, setCatalog] = useState<SubagentModelCatalogDto | null>(null)\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [contextDraft, setContextDraft] = useState<string | null>(null)\n const [depthDraft, setDepthDraft] = useState<string | null>(null)\n const [agentsDraft, setAgentsDraft] = useState<string | null>(null)\n\n const load = useCallback(async () => {\n setError(null)\n try {\n const [status, models] = await Promise.all([apiRef.current.status(), apiRef.current.models()])\n setPreferences(status.preferences)\n setCatalog(models)\n } catch (cause) {\n setError(messageOf(cause))\n }\n }, [])\n\n useEffect(() => {\n void load()\n }, [load])\n\n const update = async (patch: SubscriptionPreferencesUpdateDto): Promise<void> => {\n setBusy(true)\n setError(null)\n try {\n setPreferences(await apiRef.current.updatePreferences(patch))\n } catch (cause) {\n setError(messageOf(cause))\n } finally {\n setBusy(false)\n }\n }\n\n const selectedProvider = catalog?.providers.find(provider => provider.id === preferences?.subagentProvider) ?? catalog?.providers[0]\n const selectedModel = selectedProvider?.models.find(model => model.id === preferences?.subagentModel) ?? selectedProvider?.models[0]\n const reasoning = selectedModel?.reasoning\n const selectedEffort = preferences?.subagentReasoningEffort ?? reasoning?.defaultEffort ?? reasoning?.efforts[0]?.id ?? ''\n const savedContext = preferences?.subagentContextWindow ?? selectedModel?.contextWindow ?? 1\n const parsedContext = parseCapacity(contextDraft ?? String(savedContext))\n const contextValid = parsedContext !== null && (selectedModel?.maxContextWindow === undefined || parsedContext <= selectedModel.maxContextWindow)\n const parsedDepthValue = parseNonNegativeInteger(depthDraft ?? String(preferences?.subagentMaxDepth ?? 0))\n const parsedDepth = parsedDepthValue !== null && parsedDepthValue <= SUBAGENT_MAX_DEPTH_LIMIT ? parsedDepthValue : null\n const parsedAgents = parsePositiveInteger(agentsDraft ?? String(preferences?.subagentMaxAgents ?? 1))\n\n return <section className=\"dsh-codex-page\" aria-labelledby=\"dsh-subagent-title\">\n <header>\n <h2 id=\"dsh-subagent-title\" className=\"dsh-codex-title\">{t('subagentSettingsTitle')}</h2>\n <p className=\"dsh-codex-intro\">{t('subagentSettingsIntro')}</p>\n </header>\n\n {error !== null ? <div className=\"dsh-codex-errorbar\" role=\"alert\">\n <span>{error}</span>\n {preferences === null ? <button className=\"dsh-codex-button\" type=\"button\" onClick={() => void load()}>{t('retry')}</button> : null}\n </div> : null}\n\n {preferences === null || catalog === null\n ? <div className=\"dsh-codex-skeleton\" role=\"status\" aria-label={t('loading')}><span /><span /></div>\n : <>\n <section className=\"dsh-codex-group\">\n <div className=\"dsh-codex-grouphead\"><h3>{t('subagentModelGroup')}</h3></div>\n <div className=\"dsh-codex-pref-row\">\n <div><strong>{t('subagentProvider')}</strong><p className=\"dsh-codex-muted\">{t('subagentProviderHint')}</p></div>\n <select className=\"dsh-codex-select\" aria-label={t('subagentProvider')} value={selectedProvider?.id ?? ''} disabled={busy || selectedProvider === undefined} onChange={(event) => {\n const provider = catalog.providers.find(entry => entry.id === event.currentTarget.value)\n const model = provider?.models[0]\n if (provider === undefined || model === undefined) return\n const effort = model.reasoning?.defaultEffort ?? model.reasoning?.efforts[0]?.id ?? null\n setContextDraft(null)\n void update({ subagentProvider: provider.id, subagentModel: model.id, subagentReasoningEffort: effort, subagentContextWindow: model.contextWindow ?? 1 })\n }}>\n {catalog.providers.map(provider => <option key={provider.id} value={provider.id}>{provider.name}</option>)}\n </select>\n </div>\n <div className=\"dsh-codex-pref-row\">\n <div><strong>{t('subagentModel')}</strong><p className=\"dsh-codex-muted\">{t('subagentModelHint')}</p></div>\n <select className=\"dsh-codex-select\" aria-label={t('subagentModel')} value={selectedModel?.id ?? ''} disabled={busy || selectedModel === undefined} onChange={(event) => {\n const model = selectedProvider?.models.find(entry => entry.id === event.currentTarget.value)\n if (selectedProvider === undefined || model === undefined) return\n const effort = model.reasoning?.defaultEffort ?? model.reasoning?.efforts[0]?.id ?? null\n setContextDraft(null)\n void update({ subagentProvider: selectedProvider.id, subagentModel: model.id, subagentReasoningEffort: effort, subagentContextWindow: model.contextWindow ?? 1 })\n }}>\n {selectedProvider?.models.map(model => <option key={model.id} value={model.id}>{model.name}</option>)}\n </select>\n </div>\n <div className=\"dsh-codex-pref-row\">\n <div><strong>{t('subagentReasoningEffort')}</strong><p className=\"dsh-codex-muted\">{t('subagentReasoningEffortHint')}</p></div>\n {reasoning !== undefined && reasoning.efforts.length > 0\n ? <select className=\"dsh-codex-select\" aria-label={t('subagentReasoningEffort')} value={selectedEffort} disabled={busy} onChange={(event) => void update({ subagentReasoningEffort: event.currentTarget.value })}>\n {reasoning.efforts.map(effort => <option key={effort.id} value={effort.id}>{effort.name}</option>)}\n </select>\n : <span className=\"dsh-codex-muted\">{t('providerDefault')}</span>}\n </div>\n {selectedModel?.contextWindow !== undefined ? <div className=\"dsh-codex-context-settings\">\n <div><strong>{t('effectiveContextWindow')}</strong><p className=\"dsh-codex-muted\">{t('selectedModelContextHint')}</p></div>\n <div className=\"dsh-codex-context-row\">\n <label htmlFor=\"dsh-subagent-context\">{selectedModel.name}</label>\n <span className=\"dsh-codex-capacity-control\">\n <input id=\"dsh-subagent-context\" type=\"text\" inputMode=\"numeric\" value={contextDraft ?? formatCapacity(savedContext)} disabled={busy} onChange={(event) => setContextDraft(event.currentTarget.value)} />\n <small>{t('tokens')}</small>\n <button className=\"dsh-codex-context-save\" type=\"button\" disabled={busy || contextDraft === null || !contextValid || parsedContext === savedContext} onClick={() => {\n if (parsedContext === null) return\n void update({ subagentContextWindow: parsedContext }).then(() => setContextDraft(null))\n }}>{t('save')}</button>\n </span>\n </div>\n </div> : null}\n </section>\n\n <section className=\"dsh-codex-group\">\n <div className=\"dsh-codex-grouphead\"><h3>{t('subagentLimitsGroup')}</h3></div>\n <div className=\"dsh-codex-context-settings\">\n <div><strong>{t('subagentMaxDepth')}</strong><p className=\"dsh-codex-muted\">{t('subagentMaxDepthHint')}</p></div>\n <div className=\"dsh-codex-context-row\">\n <label htmlFor=\"dsh-subagent-depth\">{t('subagentMaxDepth')}</label>\n <span className=\"dsh-codex-capacity-control\">\n <input id=\"dsh-subagent-depth\" type=\"number\" min=\"0\" max={SUBAGENT_MAX_DEPTH_LIMIT} step=\"1\" inputMode=\"numeric\" value={depthDraft ?? String(preferences.subagentMaxDepth)} disabled={busy} onChange={(event) => setDepthDraft(event.currentTarget.value)} />\n <small>{t('levels')}</small>\n <button className=\"dsh-codex-context-save\" type=\"button\" disabled={busy || depthDraft === null || parsedDepth === null || parsedDepth === preferences.subagentMaxDepth} onClick={() => {\n if (parsedDepth === null) return\n void update({ subagentMaxDepth: parsedDepth }).then(() => setDepthDraft(null))\n }}>{t('save')}</button>\n </span>\n </div>\n </div>\n <div className=\"dsh-codex-context-settings\">\n <div><strong>{t('subagentMaxAgents')}</strong><p className=\"dsh-codex-muted\">{t('subagentMaxAgentsHint')}</p></div>\n <div className=\"dsh-codex-context-row\">\n <label htmlFor=\"dsh-subagent-agents\">{t('subagentMaxAgents')}</label>\n <span className=\"dsh-codex-capacity-control\">\n <input id=\"dsh-subagent-agents\" type=\"number\" min=\"1\" step=\"1\" inputMode=\"numeric\" value={agentsDraft ?? String(preferences.subagentMaxAgents)} disabled={busy} onChange={(event) => setAgentsDraft(event.currentTarget.value)} />\n <small>{t('agents')}</small>\n <button className=\"dsh-codex-context-save\" type=\"button\" disabled={busy || agentsDraft === null || parsedAgents === null || parsedAgents === preferences.subagentMaxAgents} onClick={() => {\n if (parsedAgents === null) return\n void update({ subagentMaxAgents: parsedAgents }).then(() => setAgentsDraft(null))\n }}>{t('save')}</button>\n </span>\n </div>\n </div>\n <p className=\"dsh-codex-notice\">{t('subagentLimitsNotice')}</p>\n </section>\n </>}\n </section>\n}\n\nexport function parseNonNegativeInteger(value: string): number | null {\n if (!/^\\d+$/.test(value.trim())) return null\n const parsed = Number(value.trim())\n return Number.isSafeInteger(parsed) && parsed >= 0 ? parsed : null\n}\n\nexport function parsePositiveInteger(value: string): number | null {\n const parsed = parseNonNegativeInteger(value)\n return parsed !== null && parsed >= 1 ? parsed : null\n}\n\nexport function parseCapacity(value: string): number | null {\n const matched = value.trim().toLowerCase().replace(/[,_\\s]/g, '').match(/^(\\d+(?:\\.\\d+)?)(k|m)?$/)\n if (matched === null) return null\n const multiplier = matched[2] === 'm' ? 1_000_000 : matched[2] === 'k' ? 1_000 : 1\n const parsed = Number(matched[1]) * multiplier\n return Number.isSafeInteger(parsed) && parsed >= 1 ? parsed : null\n}\n\nfunction formatCapacity(value: number): string {\n if (value % 1_000_000 === 0) return `${value / 1_000_000}M`\n if (value % 1_000 === 0) return `${value / 1_000}K`\n return String(value)\n}\n\nfunction messageOf(cause: unknown): string {\n return cause instanceof Error ? cause.message : String(cause)\n}\n","export const NS = 'dsh-chatgpt-subscription' as const\n\nexport const zh = {\n title: 'Codex 订阅',\n intro: '使用 ChatGPT 账号登录,在 DSH 中使用订阅可用的 Codex 模型。',\n account: '账号',\n signedOut: '尚未登录',\n signedIn: '已登录',\n plan: '套餐',\n accountId: '账号 ID',\n expires: '令牌到期',\n storage: '凭据存储',\n storageWindows: 'Windows DPAPI(当前用户加密)',\n storageMacKeychain: 'macOS 钥匙串(Keychain 加密)',\n storageLinuxFile: 'Linux 用户私有文件(权限 0600)',\n storageMemory: '仅 Host 内存(不持久化)',\n storageUnavailable: '凭据存储不可用',\n securityWindows: '令牌由 Host 使用 Windows CurrentUser DPAPI 加密,不会进入浏览器、settings.yaml 或日志。',\n securityMacKeychain: '令牌由 Host 存入 macOS 登录钥匙串(Keychain),在本机加密保存,不会进入浏览器、settings.yaml 或日志。',\n securityLinuxFile: '令牌仅写入 Host 上当前 Linux 用户可读的 0600 文件,但不会额外加密;同 UID 进程、root、备份和磁盘快照仍可能读取。',\n securityMemory: '令牌仅保留在 Host 内存中,Host 退出后丢失。',\n securityUnavailable: 'Host 无法安全访问凭据存储;请修复文件所有者或权限后重试。',\n signIn: '使用 ChatGPT 登录',\n signInAgain: '重新登录',\n cancel: '取消登录',\n signOut: '注销',\n refreshToken: '刷新凭据',\n pending: '请在浏览器中完成登录。',\n popupBlocked: '浏览器拦截了登录窗口,请使用下面的链接继续。',\n continueLogin: '打开 ChatGPT 登录页',\n loading: '正在读取状态…',\n connection: '连接',\n provider: 'Provider',\n connectionState: '连接状态',\n connected: '可用',\n untested: '尚未测试',\n testConnection: '测试连接',\n testing: '测试中…',\n latency: '最近延迟',\n models: '可用模型',\n enhancements: '增强功能',\n subagentSettingsNav: '子代理',\n subagentSettingsTitle: '子代理设置',\n subagentSettingsIntro: '全局配置 DSH 内置子代理。模型、思考深度、上下文预算和运行限制适用于所有父 Agent,不受父 Agent 当前 Provider 或模型影响。',\n subagentModelGroup: '模型与上下文',\n subagentLimitsGroup: '运行限制',\n subagentMaxDepth: '最大嵌套深度',\n subagentMaxDepthHint: '限制从顶层 Agent 开始的子代理层级(0–3);0 禁止创建子代理,1 仅允许直接子代理。',\n subagentMaxAgents: '子代理数量上限',\n subagentMaxAgentsHint: '限制每个父 Agent 子树中同时处于活动或启动中的子代理总数。',\n subagentLimitsNotice: '限制会立即应用于新的委派,不会中断已经运行的子代理。数量上限统计当前父 Agent 的全部活动后代。',\n levels: '层',\n agents: '个',\n searchProvider: '搜索来源',\n searchProviderHint: '选择 DSH Web 搜索工具使用默认来源,或改用当前 ChatGPT 订阅的 Codex 搜索来源。',\n searchProviderDsh: 'DSH 默认',\n searchProviderCodex: 'Codex 订阅',\n subagentProvider: '子代理 Provider',\n subagentProviderHint: '选择 DSH 当前已接入且可用的模型提供方。',\n subagentModel: '子代理模型',\n subagentModelHint: '全局应用于所有 DSH 内置子代理;模型可来自任意已接入 Provider。',\n subagentReasoningEffort: '子代理思考深度',\n subagentReasoningEffortHint: '选项来自所选模型实际公开的 reasoning effort 能力。',\n providerDefault: '使用 Provider 默认值',\n effectiveContextWindow: '有效上下文窗口',\n selectedModelContextHint: '选择模型后展开;该值仅用于子 Agent 的 DSH 上下文预算与压缩判断。',\n reasoningNone: '无',\n reasoningLow: '低',\n reasoningMedium: '中',\n reasoningHigh: '高',\n reasoningXhigh: '超高',\n reasoningMax: '最大',\n contextWindows: 'GPT-5.6 上下文窗口',\n contextWindowsHint: '默认 272K;可选启用最高 1M。该值用于 DSH 的压缩与溢出判断,可输入 1M、512K 等容量。',\n contextWindow: '上下文窗口',\n contextWindowInvalid: '上下文窗口必须是 1 到 1M 的整数,可使用 K 或 M 后缀。',\n saveContextWindow: '保存上下文窗口',\n save: '保存',\n tokens: 'tokens',\n quickQuota: '在输入框旁显示快捷用量',\n quickQuotaHint: '仅在当前会话选中 codex-chatgpt 模型时显示。',\n quota: '用量与限额',\n quotaIntro: '数据来自 ChatGPT Codex 用量服务。页面可见时最多每 60 秒刷新一次。',\n refreshQuota: '刷新用量',\n refreshing: '刷新中…',\n noQuota: '当前套餐未返回可显示的限额窗口。',\n quotaSignedOut: '登录后可查看订阅限额。',\n stale: '显示的是上次成功获取的数据。',\n updated: '更新时间',\n primary: '主要窗口',\n secondary: '次要窗口',\n limitWindow: '额度',\n used: '已使用',\n remaining: '剩余',\n available: '可用',\n unavailable: '不可用',\n unlimited: '无限',\n credits: 'Credits',\n monthlySpend: '月度消费控制',\n resetCredits: '重置次数',\n spendControlReached: '已触发月度消费控制,新的订阅调用可能被限制。',\n limit: '上限',\n exhausted: '额度已用尽',\n resets: '重置',\n quickQuotaLabel: 'Codex 剩余',\n quickQuotaLoading: '用量…',\n imageToolRunning: '正在生成图片',\n imageToolDone: '已生成图片',\n imageToolFailed: '图片生成失败',\n image: '图片',\n openImage: '打开图片',\n openNamedImage: '打开 {name}',\n imageLoading: '加载图片…',\n imageLoadFailed: '图片加载失败,点击重试',\n imagePreviewClose: '关闭',\n imagePreviewOpenOriginal: '打开原图',\n retry: '重试',\n unknown: '未知',\n} as const\n\nexport const en: Record<keyof typeof zh, string> = {\n title: 'Codex subscription',\n intro: 'Sign in with ChatGPT to use Codex models available to your subscription in DSH.',\n account: 'Account',\n signedOut: 'Not signed in',\n signedIn: 'Signed in',\n plan: 'Plan',\n accountId: 'Account ID',\n expires: 'Token expires',\n storage: 'Credential storage',\n storageWindows: 'Windows DPAPI (current-user encrypted)',\n storageMacKeychain: 'macOS Keychain (encrypted)',\n storageLinuxFile: 'Linux user-private file (mode 0600)',\n storageMemory: 'Host memory only (not persistent)',\n storageUnavailable: 'Credential storage unavailable',\n securityWindows: 'The Host encrypts tokens with Windows CurrentUser DPAPI; they never enter the browser, settings.yaml, or logs.',\n securityMacKeychain: 'The Host stores tokens in the macOS login Keychain, encrypted on this machine; they never enter the browser, settings.yaml, or logs.',\n securityLinuxFile: 'Tokens are stored in a mode-0600 file readable only by the current Linux user, but are not additionally encrypted; same-UID processes, root, backups, and disk snapshots can still read them.',\n securityMemory: 'Tokens remain only in Host memory and are lost when the Host exits.',\n securityUnavailable: 'The Host cannot safely access credential storage. Fix the file owner or permissions and retry.',\n signIn: 'Sign in with ChatGPT',\n signInAgain: 'Sign in again',\n cancel: 'Cancel sign-in',\n signOut: 'Sign out',\n refreshToken: 'Refresh credentials',\n pending: 'Complete sign-in in your browser.',\n popupBlocked: 'The sign-in window was blocked. Use the link below to continue.',\n continueLogin: 'Open ChatGPT sign-in',\n loading: 'Reading status…',\n connection: 'Connection',\n provider: 'Provider',\n connectionState: 'Connection status',\n connected: 'Available',\n untested: 'Not tested',\n testConnection: 'Test connection',\n testing: 'Testing…',\n latency: 'Last latency',\n models: 'Available models',\n enhancements: 'Enhancements',\n subagentSettingsNav: 'Subagents',\n subagentSettingsTitle: 'Subagent settings',\n subagentSettingsIntro: 'Configure DSH built-in subagents globally. Model, reasoning effort, context budget, and runtime limits apply to every parent Agent regardless of its current provider or model.',\n subagentModelGroup: 'Model and context',\n subagentLimitsGroup: 'Runtime limits',\n subagentMaxDepth: 'Maximum nesting depth',\n subagentMaxDepthHint: 'Limit child levels below a top-level Agent (0–3). Zero disables subagents; one allows direct children only.',\n subagentMaxAgents: 'Maximum subagents',\n subagentMaxAgentsHint: 'Limit the total number of active or starting subagents in each parent Agent tree.',\n subagentLimitsNotice: 'Limits apply immediately to new delegations and do not interrupt subagents already running. The count covers all active descendants of the current parent Agent.',\n levels: 'levels',\n agents: 'agents',\n searchProvider: 'Search provider',\n searchProviderHint: 'Choose whether DSH web search uses its default provider or the Codex search source from this ChatGPT subscription.',\n searchProviderDsh: 'DSH default',\n searchProviderCodex: 'Codex subscription',\n subagentProvider: 'Subagent provider',\n subagentProviderHint: 'Choose from providers currently connected and available in DSH.',\n subagentModel: 'Subagent model',\n subagentModelHint: 'Applies globally to all built-in DSH subagents; the selected child model may come from any connected provider.',\n subagentReasoningEffort: 'Subagent reasoning effort',\n subagentReasoningEffortHint: 'Options come from the reasoning-effort capabilities exposed by the selected model.',\n providerDefault: 'Use provider default',\n effectiveContextWindow: 'Effective context window',\n selectedModelContextHint: 'Shown after model selection; used only for the child Agent context budget and DSH compaction decisions.',\n reasoningNone: 'None',\n reasoningLow: 'Low',\n reasoningMedium: 'Medium',\n reasoningHigh: 'High',\n reasoningXhigh: 'Extra high',\n reasoningMax: 'Maximum',\n contextWindows: 'GPT-5.6 context windows',\n contextWindowsHint: 'Defaults to 272K, with an optional value up to 1M. DSH uses it for compaction and overflow detection; values such as 1M and 512K are accepted.',\n contextWindow: 'Context window',\n contextWindowInvalid: 'The context window must be an integer from 1 to 1M. K and M suffixes are accepted.',\n saveContextWindow: 'Save context window',\n save: 'Save',\n tokens: 'tokens',\n quickQuota: 'Show quick usage beside the composer',\n quickQuotaHint: 'Shown only when the current session uses a codex-chatgpt model.',\n quota: 'Usage and limits',\n quotaIntro: 'Data comes from the ChatGPT Codex usage service and refreshes at most once per minute while visible.',\n refreshQuota: 'Refresh usage',\n refreshing: 'Refreshing…',\n noQuota: 'Your plan did not return any displayable limit windows.',\n quotaSignedOut: 'Sign in to view subscription limits.',\n stale: 'Showing the last successfully fetched data.',\n updated: 'Updated',\n primary: 'Primary window',\n secondary: 'Secondary window',\n limitWindow: 'limit',\n used: 'used',\n remaining: 'remaining',\n available: 'Available',\n unavailable: 'Unavailable',\n unlimited: 'Unlimited',\n credits: 'Credits',\n monthlySpend: 'Monthly spend control',\n resetCredits: 'Reset credits',\n spendControlReached: 'Monthly spend control has been reached; new subscription calls may be limited.',\n limit: 'Limit',\n exhausted: 'Quota exhausted',\n resets: 'Resets',\n quickQuotaLabel: 'Codex left',\n quickQuotaLoading: 'Usage…',\n imageToolRunning: 'Generating image',\n imageToolDone: 'Generated image',\n imageToolFailed: 'Image generation failed',\n image: 'Image',\n openImage: 'Open image',\n openNamedImage: 'Open {name}',\n imageLoading: 'Loading image…',\n imageLoadFailed: 'Image failed to load. Click to retry',\n imagePreviewClose: 'Close',\n imagePreviewOpenOriginal: 'Open original',\n retry: 'Retry',\n unknown: 'Unknown',\n}\n\nexport type LocaleKey = keyof typeof zh\nexport const dictionaries = { zh, en }\n","const STYLE_ID = '@eddyskywalker/dsh-chatgpt-subscription/main'\r\n\r\nconst CSS = `\r\n.dsh-codex-page{box-sizing:border-box;color:var(--dsw-alias-label-primary);display:flex;flex-direction:column;gap:20px;max-width:780px;min-width:0;padding:2px 0 30px}\r\n.dsh-codex-page *{box-sizing:border-box}\r\n.dsh-codex-title{font-size:15px;font-weight:650;line-height:1.4;margin:0 0 5px}\r\n.dsh-codex-intro,.dsh-codex-muted{color:var(--dsw-alias-label-secondary);font-size:13px;line-height:1.55;margin:0}\r\n.dsh-codex-group{border-top:1px solid var(--dsw-alias-border-l2);min-width:0}\r\n.dsh-codex-grouphead{align-items:center;display:flex;gap:12px;justify-content:space-between;min-height:48px}\r\n.dsh-codex-grouphead h3{font-size:14px;font-weight:650;margin:0}\r\n.dsh-codex-row{align-items:center;border-bottom:1px solid var(--dsw-alias-border-l2);display:flex;gap:20px;justify-content:space-between;min-height:44px;padding:8px 0}\r\n.dsh-codex-label{color:var(--dsw-alias-label-secondary);font-size:13px;flex:0 0 auto}\r\n.dsh-codex-value{font-size:13px;min-width:0;overflow-wrap:anywhere;text-align:right}\r\n.dsh-codex-actions{display:flex;flex-wrap:wrap;gap:8px;justify-content:flex-end;padding-top:12px}\r\n.dsh-codex-button{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);border-radius:999px;color:var(--dsw-alias-label-primary);cursor:pointer;font:inherit;font-size:13px;line-height:1;padding:8px 13px;white-space:nowrap}\r\n.dsh-codex-button:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}\r\n.dsh-codex-button:focus-visible,.dsh-codex-link:focus-visible{outline:2px solid var(--dsw-alias-button-info-fill,#397ee8);outline-offset:2px}\r\n.dsh-codex-button:disabled{cursor:default;opacity:.5}\r\n.dsh-codex-button-primary{background:var(--dsw-alias-button-info-fill,#397ee8);border-color:transparent;color:var(--dsw-alias-button-info-label,#fff)}\r\n.dsh-codex-notice{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);border-radius:7px;color:var(--dsw-alias-label-secondary);font-size:12px;line-height:1.55;margin:12px 0 0;padding:10px 12px}\r\n.dsh-codex-error,.dsh-codex-warning{font-size:12px;line-height:1.5;margin:8px 0 0}\r\n.dsh-codex-error{color:var(--dsw-alias-label-danger,#d94b4b)}\r\n.dsh-codex-warning{color:var(--dsw-alias-label-warning,#c77a18)}\r\n.dsh-codex-errorbar{align-items:center;background:color-mix(in srgb,var(--dsw-alias-label-danger,#d94b4b) 9%,transparent);border:1px solid color-mix(in srgb,var(--dsw-alias-label-danger,#d94b4b) 28%,transparent);border-radius:7px;color:var(--dsw-alias-label-danger,#d94b4b);display:flex;font-size:13px;gap:12px;justify-content:space-between;padding:10px 12px}\r\n.dsh-codex-link{color:var(--dsw-alias-label-link,#3278d4);display:inline-block;font-size:13px;margin-top:8px}\r\n.dsh-codex-models{display:flex;flex-wrap:wrap;gap:6px;padding-top:12px}\r\n.dsh-codex-models code{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);border-radius:5px;font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:11px;padding:4px 6px}\r\n.dsh-codex-pref-row{align-items:center;border-bottom:1px solid var(--dsw-alias-border-l2);display:flex;gap:16px;justify-content:space-between;min-height:58px;padding:10px 0}\r\n.dsh-codex-pref-row strong,.dsh-codex-check strong{display:block;font-size:13px;font-weight:600;line-height:1.35}\r\n.dsh-codex-segments{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);border-radius:8px;display:flex;flex:none;gap:2px;padding:2px}\r\n.dsh-codex-segments label{cursor:pointer;display:block}\r\n.dsh-codex-segments input{position:absolute;opacity:0;pointer-events:none}\r\n.dsh-codex-segments span{border-radius:6px;color:var(--dsw-alias-label-secondary);display:block;font-size:12px;line-height:1;padding:7px 10px;white-space:nowrap}\r\n.dsh-codex-segments input:checked+span{background:var(--dsw-alias-bg-base);box-shadow:0 1px 2px rgba(0,0,0,.08);color:var(--dsw-alias-label-primary)}\r\n.dsh-codex-segments input:focus-visible+span{outline:2px solid var(--dsw-alias-button-info-fill,#397ee8);outline-offset:2px}\r\n.dsh-codex-segments input:disabled+span{cursor:default;opacity:.5}\r\n.dsh-codex-select,.dsh-codex-capacity-control input{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);border-radius:7px;color:var(--dsw-alias-label-primary);font:inherit;font-size:12px;padding:7px 9px}\r\n.dsh-codex-select{max-width:210px;min-width:150px}\r\n.dsh-codex-context-settings{border-bottom:1px solid var(--dsw-alias-border-l2);display:grid;gap:10px;padding:12px 0}\r\n.dsh-codex-context-settings>div>strong{font-size:13px;font-weight:600}\r\n.dsh-codex-context-row{align-items:center;display:flex;font-size:12px;gap:14px;justify-content:space-between}\r\n.dsh-codex-capacity-control{align-items:center;display:flex;gap:7px}\r\n.dsh-codex-capacity-control input{font-family:ui-monospace,SFMono-Regular,Consolas,monospace;text-align:right;width:90px}\r\n.dsh-codex-capacity-control input[type=number]{width:110px}\r\n.dsh-codex-capacity-control small{color:var(--dsw-alias-label-tertiary);font-size:11px;width:42px}\r\n.dsh-codex-context-save{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);border-radius:7px;color:var(--dsw-alias-label-primary);cursor:pointer;font:inherit;font-size:12px;line-height:1;padding:8px 10px;white-space:nowrap}\r\n.dsh-codex-context-save:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}\r\n.dsh-codex-context-save:focus-visible{outline:2px solid var(--dsw-alias-button-info-fill,#397ee8);outline-offset:2px}\r\n.dsh-codex-context-save:disabled{cursor:default;opacity:.45}\r\n.dsh-codex-check{align-items:flex-start;border-bottom:1px solid var(--dsw-alias-border-l2);cursor:pointer;display:flex;gap:10px;padding:12px 0}\r\n.dsh-codex-check input{flex:none;margin-top:2px}\r\n.dsh-codex-check small{color:var(--dsw-alias-label-secondary);display:block;font-size:12px;line-height:1.45;margin-top:2px}\r\n.dsh-codex-quota-card{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);border-radius:8px;margin-top:12px;padding:12px}\r\n.dsh-codex-quota-title{align-items:center;display:flex;font-size:13px;gap:8px;justify-content:space-between}\r\n.dsh-codex-quota-title span{color:var(--dsw-alias-label-tertiary);font-size:11px;text-transform:uppercase}\r\n.dsh-codex-quota-fact{align-items:flex-start;border-bottom:1px solid var(--dsw-alias-border-l2);display:flex;font-size:12px;gap:12px;justify-content:space-between;line-height:1.45;padding:10px 0}\r\n.dsh-codex-quota-fact span{color:var(--dsw-alias-label-secondary);flex:none}\r\n.dsh-codex-quota-fact strong{font-weight:600;min-width:0;overflow-wrap:anywhere;text-align:right}\r\n.dsh-codex-meter-wrap{margin-top:13px}\r\n.dsh-codex-meter-label,.dsh-codex-meter-meta{display:flex;gap:10px;justify-content:space-between}\r\n.dsh-codex-meter-label{font-size:12px;margin-bottom:6px}\r\n.dsh-codex-meter-meta{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:1.45;margin-top:6px}\r\n.dsh-codex-meter{background:var(--dsw-alias-bg-layer-1,rgba(127,127,127,.15));border-radius:999px;height:7px;overflow:hidden;width:100%}\r\n.dsh-codex-meter>span{background:var(--dsw-alias-button-info-fill,#397ee8);border-radius:inherit;display:block;height:100%;max-width:100%;min-width:0;transition:width .25s ease}\r\n.dsh-codex-meter-warning>span{background:var(--dsw-alias-label-warning,#d58a24)}\r\n.dsh-codex-meter-danger>span{background:var(--dsw-alias-label-danger,#d94b4b)}\r\n.dsh-codex-empty{border:1px dashed var(--dsw-alias-border-l2);border-radius:7px;color:var(--dsw-alias-label-tertiary);font-size:12px;margin:12px 0 0;padding:16px;text-align:center}\r\n.dsh-codex-timestamp{color:var(--dsw-alias-label-tertiary);font-size:11px;margin:10px 0 0;text-align:right}\r\n.dsh-codex-skeleton{display:grid;gap:9px;padding-top:10px}\r\n.dsh-codex-skeleton span{animation:dsh-codex-pulse 1.4s ease-in-out infinite;background:var(--dsw-alias-bg-layer-2);border-radius:5px;height:42px}\r\n.dsh-codex-skeleton span:nth-child(2){animation-delay:.12s}.dsh-codex-skeleton span:nth-child(3){animation-delay:.24s}\r\n.dsh-codex-sr{height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;clip:rect(0 0 0 0);white-space:nowrap}\r\n.dsh-codex-composer-quota{align-items:center;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);border-radius:999px;color:var(--dsw-alias-label-secondary);display:inline-flex;font-size:11px;gap:6px;height:28px;line-height:1;max-width:160px;padding:0 9px;white-space:nowrap}\r\n.dsh-codex-composer-quota strong{color:var(--dsw-alias-label-primary);font-size:11px;font-weight:650}\r\n.dsh-codex-composer-quota[data-level=warning] strong{color:var(--dsw-alias-label-warning,#d58a24)}\r\n.dsh-codex-composer-quota[data-level=danger] strong{color:var(--dsw-alias-label-danger,#d94b4b)}\r\n.dsh-codex-image-tool{border:1px solid var(--dsw-alias-border-l2);border-radius:8px;display:flex;flex-direction:column;gap:8px;margin:4px 0 4px 4px;max-width:520px;padding:10px 12px}\r\n.dsh-codex-image-tool-head{align-items:center;display:flex;font-size:13px;gap:8px;min-width:0}\r\n.dsh-codex-image-dot{background:var(--dsw-alias-button-info-fill,#397ee8);border-radius:50%;display:inline-block;flex:none;height:8px;width:8px}\r\n.dsh-codex-image-tool[data-state=error] .dsh-codex-image-dot{background:var(--dsw-alias-label-danger,#d94b4b)}\r\n.dsh-codex-image-title{font-weight:600}\r\n.dsh-codex-image-summary{color:var(--dsw-alias-label-tertiary);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\r\n.dsh-codex-image-grid{display:flex;flex-wrap:wrap;gap:8px}\r\n.dsh-codex-image-preview{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);border-radius:8px;display:block;max-height:260px;max-width:min(100%,360px);object-fit:contain}\r\n.dsh-codex-image-loading,.dsh-codex-image-failed{border:1px dashed var(--dsw-alias-border-l2);border-radius:8px;color:var(--dsw-alias-label-tertiary);display:inline-flex;font-size:12px;line-height:1.4;padding:18px 20px}\r\n.dsh-codex-image-failed{color:var(--dsw-alias-label-danger,#d94b4b)}\r\n@keyframes dsh-codex-pulse{0%,100%{opacity:.55}50%{opacity:1}}\r\n@media(max-width:560px){.dsh-codex-row,.dsh-codex-pref-row,.dsh-codex-quota-fact{align-items:flex-start;flex-direction:column;gap:3px}.dsh-codex-value,.dsh-codex-quota-fact strong{text-align:left}.dsh-codex-actions{justify-content:flex-start}.dsh-codex-grouphead{align-items:flex-start;flex-direction:column;gap:0;padding:12px 0}.dsh-codex-meter-meta{align-items:flex-start;flex-direction:column;gap:2px}.dsh-codex-errorbar{align-items:flex-start;flex-direction:column}.dsh-codex-segments{width:100%}.dsh-codex-select{max-width:none;width:100%}.dsh-codex-context-row{align-items:flex-start;flex-direction:column;gap:5px}.dsh-codex-segments label{flex:1}.dsh-codex-segments span{text-align:center}.dsh-codex-image-tool{max-width:100%;margin-left:0}}\r\n@media(prefers-reduced-motion:reduce){.dsh-codex-meter>span{transition:none}.dsh-codex-skeleton span{animation:none}}\r\n`\r\n\r\nexport function installStyles(): () => void {\r\n if (document.querySelector(`style[data-plugin-css=\"${STYLE_ID}\"]`) !== null) return () => undefined\r\n const element = document.createElement('style')\r\n element.dataset.plugin = '@eddyskywalker/dsh-chatgpt-subscription'\r\n element.dataset.pluginCss = STYLE_ID\r\n element.textContent = CSS\r\n document.head.appendChild(element)\r\n return () => element.remove()\r\n}\r\n","import type { ClientContext } from '@deepseek-ai/dsh-client-runtime/client'\nimport type { ImageAttachmentRef } from '@deepseek-ai/dsh-attachment'\nimport type {} from '@deepseek-ai/dsh-client-ui-settings/client'\nimport type {} from '@deepseek-ai/dsh-client-locale/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-slots'\nimport type {} from '@deepseek-ai/dsh-client-ui-model-selection/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-conversation/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-tool/client'\nimport { CODEX_IMAGE_TOOL_NAME } from '../compat.ts'\nimport { CodexComposerQuota } from './CodexComposerQuota.tsx'\nimport { CodexImageToolView, type ImageLoader } from './CodexImageToolView.tsx'\nimport { CodexSubscriptionSection } from './CodexSubscriptionSection.tsx'\nimport { SubagentSettingsSection } from './SubagentSettingsSection.tsx'\nimport { SubscriptionApi } from './api.ts'\nimport { dictionaries, NS, type LocaleKey } from './locales.ts'\nimport { installStyles } from './styles.ts'\n\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\n interface LocaleNamespaceMap {\n 'dsh-chatgpt-subscription': LocaleKey\n }\n}\n\nexport const inject = ['slots', 'locale', 'modelDirectories', 'conversation']\n\nexport function apply(ctx: ClientContext): void {\n ctx.effect(() => ctx.locale.register(NS, dictionaries), 'dsh-chatgpt-subscription: dictionaries')\n ctx.effect(() => installStyles(), 'dsh-chatgpt-subscription: styles')\n const t = ctx.locale.bind(NS)\n ctx.slots.inject('settings.section', () => ctx.slots.register({\n name: 'settings.section',\n id: 'subagents',\n order: 30,\n label: () => t('subagentSettingsNav'),\n locale: NS,\n }, SubagentSettingsSection))\n ctx.slots.inject('settings.section', () => ctx.slots.register({\n name: 'settings.section',\n id: 'codex-subscription',\n order: 45,\n label: () => t('title'),\n locale: NS,\n }, CodexSubscriptionSection))\n ctx.slots.inject('conversation.input.right', () => ctx.slots.register({\n name: 'conversation.input.right',\n id: 'codex-subscription-quota',\n order: 35,\n locale: NS,\n inject: (sessionId) => {\n const directory = ctx.modelDirectories.directoryFor(sessionId)\n return {\n api: new SubscriptionApi(),\n directory: directory.store,\n loadModelDirectory: () => {\n void directory.load().catch(() => undefined)\n },\n }\n },\n }, CodexComposerQuota))\n ctx.slots.inject('tool.call.toolview', () => ctx.slots.register({\n name: 'tool.call.toolview',\n key: CODEX_IMAGE_TOOL_NAME,\n locale: NS,\n inject: (sessionId) => ({\n loadImage: imageLoader(ctx, sessionId),\n }),\n }, CodexImageToolView))\n}\n\nfunction imageLoader(ctx: ClientContext, sessionId: string): ImageLoader {\n const conversation = ctx.conversation as unknown as {\n resolveImage(sessionId: string, attachment: ImageAttachmentRef): Promise<string>\n }\n return (attachment) => conversation.resolveImage(sessionId, attachment)\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"client.js","names":["formatPercent","messageOf","parseCapacity","formatCapacity"],"sources":["../src/compat.ts","../src/client/quota.ts","../src/client/CodexComposerQuota.tsx","../src/client/CodexImageToolView.tsx","../src/shared/model-catalog.ts","../src/client/api.ts","../src/client/CodexSubscriptionSection.tsx","../src/client/SubagentSettingsSection.tsx","../src/client/locales.ts","../src/client/styles.ts","../src/client/index.tsx"],"sourcesContent":["/**\n * Compatibility constants for the ChatGPT-backed Codex flow. The backend and\n * OAuth parameters are not a public third-party API contract, so every such\n * value is isolated here for review and rollback.\n */\nexport const CHATGPT_OAUTH_ISSUER = 'https://auth.openai.com' as const\nexport const CHATGPT_OAUTH_CLIENT_ID = 'app_EMoamEEZ73f0CkXaXp7hrann' as const\nexport const OAUTH_CALLBACK_HOST = 'localhost' as const\nexport const OAUTH_CALLBACK_PORT = 1455 as const\nexport const OAUTH_CALLBACK_PATH = '/auth/callback' as const\nexport const OAUTH_REDIRECT_URI = `http://${OAUTH_CALLBACK_HOST}:${OAUTH_CALLBACK_PORT}${OAUTH_CALLBACK_PATH}` as const\nexport const OAUTH_SCOPE = 'openid profile email offline_access' as const\nexport const OAUTH_ORIGINATOR = 'opencode' as const\nexport const OAUTH_LOGIN_TIMEOUT_MS = 5 * 60_000\nexport const TOKEN_REFRESH_MARGIN_MS = 60_000\nexport const ROUTE_PREFIX = '/api/dsh-chatgpt-subscription' as const\nexport const PLUGIN_VERSION = '0.1.0-alpha.0' as const\nexport const CODEX_CHATGPT_PROVIDER_ID = 'codex-chatgpt' as const\n\nexport const CODEX_API_BASE = 'https://chatgpt.com/backend-api/codex' as const\nexport const CODEX_RESPONSES_URL = `${CODEX_API_BASE}/responses` as const\nexport const CODEX_IMAGE_GENERATION_URL = `${CODEX_API_BASE}/images/generations` as const\nexport const CODEX_SEARCH_URL = `${CODEX_API_BASE}/alpha/search` as const\nexport const CODEX_USAGE_URL = 'https://chatgpt.com/backend-api/wham/usage' as const\nexport const CODEX_RESET_CREDITS_URL = 'https://chatgpt.com/backend-api/wham/rate-limit-reset-credits' as const\nexport const CODEX_RESET_CREDITS_CONSUME_URL = `${CODEX_RESET_CREDITS_URL}/consume` as const\nexport const CODEX_ORIGINATOR = 'opencode' as const\nexport const CODEX_ENHANCED_ORIGINATOR = 'pi' as const\nexport const CODEX_IMAGE_TOOL_NAME = 'codex_image_generate' as const\nexport const CODEX_IMAGE_MODEL = 'gpt-image-2' as const\nexport const CODEX_SEARCH_PROVIDER_ID = 'codex-subscription' as const\nexport const QUOTA_CACHE_MS = 60_000\nexport const QUOTA_MIN_UPSTREAM_INTERVAL_MS = 15_000\n\nexport const OAUTH_AUTHORIZE_URL = `${CHATGPT_OAUTH_ISSUER}/oauth/authorize` as const\nexport const OAUTH_TOKEN_URL = `${CHATGPT_OAUTH_ISSUER}/oauth/token` as const\n","import type { QuotaBucketDto, QuotaStatusDto, QuotaWindowDto } from '../shared/contracts.ts'\n\nexport interface SelectedQuotaWindow {\n bucket: QuotaBucketDto\n window: QuotaWindowDto\n remainingPercent: number\n}\n\nexport function selectQuotaForModel(quota: QuotaStatusDto | undefined, modelId: string | undefined): SelectedQuotaWindow | null {\n if (quota === undefined || quota.buckets.length === 0) return null\n const model = modelId?.toLowerCase() ?? ''\n const wantsSpark = model.includes('spark')\n const bucket = wantsSpark\n ? quota.buckets.find(candidate => `${candidate.id} ${candidate.name}`.toLowerCase().includes('spark'))\n : quota.buckets.find(candidate => candidate.id === 'codex')\n ?? quota.buckets.find(candidate => candidate.name.toLowerCase() === 'codex')\n if (bucket === undefined) return null\n const windows = quotaWindows(bucket)\n if (windows.length === 0) return null\n const window = windows.reduce((tightest, candidate) => (\n candidate.usedPercent > tightest.usedPercent ? candidate : tightest\n ), windows[0]!)\n return {\n bucket,\n window,\n remainingPercent: Math.max(0, 100 - window.usedPercent),\n }\n}\n\nexport function quotaWindows(bucket: QuotaBucketDto): QuotaWindowDto[] {\n if (bucket.windows.length > 0) return bucket.windows\n return [bucket.primary, bucket.secondary].filter((window): window is QuotaWindowDto => window !== null)\n}\n","import { useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react'\nimport type { SnapshotStore } from '@deepseek-ai/dsh-client-runtime/client'\nimport type { ModelDirectoryState } from '@deepseek-ai/dsh-client-ui-model-selection/client'\nimport type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport { CODEX_CHATGPT_PROVIDER_ID } from '../compat.ts'\nimport type { PluginStatusDto } from '../shared/contracts.ts'\nimport { SubscriptionApi } from './api.ts'\nimport { NS } from './locales.ts'\nimport { selectQuotaForModel } from './quota.ts'\n\ntype Props = PropsRuntime<'conversation.input.right'> & PropsLocale<typeof NS> & {\n api: SubscriptionApi\n directory: SnapshotStore<ModelDirectoryState>\n loadModelDirectory: () => void\n}\n\nexport function CodexComposerQuota({ api, directory, loadModelDirectory, t }: Props): React.JSX.Element | null {\n const modelState = useStore(directory)\n const [status, setStatus] = useState<PluginStatusDto | null>(null)\n const [loading, setLoading] = useState(false)\n const mountedRef = useRef(false)\n const selected = modelState.current\n const isCodex = selected?.provider === CODEX_CHATGPT_PROVIDER_ID\n\n useEffect(() => {\n loadModelDirectory()\n }, [loadModelDirectory])\n\n useEffect(() => {\n mountedRef.current = true\n return () => {\n mountedRef.current = false\n }\n }, [])\n\n useEffect(() => {\n if (!isCodex) return\n let disposed = false\n const refresh = async (): Promise<void> => {\n setLoading(true)\n try {\n const next = await api.status()\n if (!disposed && mountedRef.current) setStatus(next)\n } catch {\n if (!disposed && mountedRef.current) setStatus(null)\n } finally {\n if (!disposed && mountedRef.current) setLoading(false)\n }\n }\n void refresh()\n const timer = window.setInterval(() => {\n if (document.visibilityState === 'visible') void refresh()\n }, 60_000)\n return () => {\n disposed = true\n window.clearInterval(timer)\n }\n }, [api, isCodex])\n\n const quota = useMemo(() => selectQuotaForModel(status?.quota, selected?.model), [selected?.model, status?.quota])\n if (!isCodex || status?.preferences.quickQuotaVisible !== true) return null\n const level = quota === null\n ? 'normal'\n : quota.remainingPercent <= 5\n ? 'danger'\n : quota.remainingPercent <= 20\n ? 'warning'\n : 'normal'\n return <span className=\"dsh-codex-composer-quota\" data-level={level} aria-label={quota === null ? t('quickQuotaLoading') : `${t('quickQuotaLabel')}: ${formatPercent(quota.remainingPercent)}`}>\n <span>{t('quickQuotaLabel')}</span>\n <strong>{quota === null ? (loading ? t('quickQuotaLoading') : '—') : formatPercent(quota.remainingPercent)}</strong>\n </span>\n}\n\nfunction useStore<T>(store: SnapshotStore<T>): T {\n return useSyncExternalStore(\n (listener) => store.subscribe(listener),\n () => store.getSnapshot(),\n () => store.getSnapshot(),\n )\n}\n\nfunction formatPercent(value: number): string {\n return `${new Intl.NumberFormat(undefined, { maximumFractionDigits: 0 }).format(value)}%`\n}\n","import { useEffect, useState } from 'react'\nimport type { ImageAttachmentRef } from '@deepseek-ai/dsh-attachment'\nimport type { ContentBlock } from '@deepseek-ai/dsh-client-connection/client'\nimport type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport { NS } from './locales.ts'\n\nexport type ImageLoader = (attachment: ImageAttachmentRef) => Promise<string>\n\ntype Props = PropsRuntime<'tool.call.toolview'> & PropsLocale<typeof NS> & {\n loadImage: ImageLoader\n}\n\nexport function CodexImageToolView({ block, loadImage, t }: Props): React.JSX.Element {\n const settled = 'kind' in block\n const isError = settled ? block.isError : false\n const prompt = promptFromBlock(block)\n const images = settled && !isError ? imageBlocks(block.content) : []\n const label = isError ? t('imageToolFailed') : settled ? t('imageToolDone') : t('imageToolRunning')\n const summary = prompt ?? textSummary(settled ? block.content : [])\n return <div className=\"dsh-codex-image-tool\" data-state={isError ? 'error' : settled ? 'done' : 'running'}>\n <div className=\"dsh-codex-image-tool-head\">\n <span className=\"dsh-codex-image-dot\" aria-hidden=\"true\" />\n <span className=\"dsh-codex-image-title\">{label}</span>\n {summary !== null ? <span className=\"dsh-codex-image-summary\">{summary}</span> : null}\n </div>\n {images.length > 0 ? <div className=\"dsh-codex-image-grid\">\n {images.map((attachment) => <GeneratedImage key={String(attachment.attachmentId)} attachment={attachment} load={loadImage} label={attachment.name ?? t('image')} t={t} />)}\n </div> : null}\n </div>\n}\n\nfunction GeneratedImage({ attachment, load, label, t }: {\n attachment: ImageAttachmentRef\n load: ImageLoader\n label: string\n t: Props['t']\n}): React.JSX.Element {\n const [src, setSrc] = useState<string | null>(null)\n const [failed, setFailed] = useState(false)\n useEffect(() => {\n let disposed = false\n setSrc(null)\n setFailed(false)\n load(attachment).then((url) => {\n if (!disposed) setSrc(url)\n }, () => {\n if (!disposed) setFailed(true)\n })\n return () => {\n disposed = true\n }\n }, [attachment, load])\n if (failed) return <span className=\"dsh-codex-image-failed\">{t('imageLoadFailed')}</span>\n if (src === null) return <span className=\"dsh-codex-image-loading\">{t('imageLoading')}</span>\n return <img className=\"dsh-codex-image-preview\" src={src} alt={label} />\n}\n\nfunction promptFromBlock(block: Props['block']): string | null {\n const raw = 'kind' in block ? block.call?.argsRaw : block.argsRaw\n if (typeof raw !== 'string' || raw.trim() === '') return null\n try {\n const value = JSON.parse(raw) as unknown\n return typeof value === 'object'\n && value !== null\n && !Array.isArray(value)\n && typeof (value as { prompt?: unknown }).prompt === 'string'\n ? (value as { prompt: string }).prompt\n : null\n } catch {\n return null\n }\n}\n\nfunction imageBlocks(blocks: readonly ContentBlock[]): ImageAttachmentRef[] {\n const result: ImageAttachmentRef[] = []\n for (const block of blocks) {\n if (block.type === 'image') result.push(block.attachment)\n if (block.type === 'tool-result') result.push(...imageBlocks(block.content))\n }\n return result\n}\n\nfunction textSummary(blocks: readonly ContentBlock[]): string | null {\n const text = blocks\n .map((block) => block.type === 'text' || block.type === 'reasoning' ? block.text : '')\n .filter(Boolean)\n .join(' ')\n .trim()\n return text === '' ? null : text\n}\n","export type CodexModelModality = 'text' | 'image'\n\nexport const GPT_56_MAX_CONTEXT_WINDOW = 1_000_000\n\nexport interface CodexModelCatalogEntry {\n id: string\n name: string\n contextWindow: number\n inputModalities: readonly CodexModelModality[]\n defaultReasoningEffort: string\n reasoningProfile: 'standard' | 'gpt-5.6'\n supportsReasoningSummary: boolean\n}\n\nexport const CODEX_MODEL_CATALOG = [\n {\n id: 'gpt-5.6-sol',\n name: '5.6 Sol',\n contextWindow: 272_000,\n inputModalities: ['text', 'image'],\n defaultReasoningEffort: 'medium',\n reasoningProfile: 'gpt-5.6',\n supportsReasoningSummary: true,\n },\n {\n id: 'gpt-5.6-terra',\n name: '5.6 Terra',\n contextWindow: 272_000,\n inputModalities: ['text', 'image'],\n defaultReasoningEffort: 'medium',\n reasoningProfile: 'gpt-5.6',\n supportsReasoningSummary: true,\n },\n {\n id: 'gpt-5.6-luna',\n name: '5.6 Luna',\n contextWindow: 272_000,\n inputModalities: ['text', 'image'],\n defaultReasoningEffort: 'medium',\n reasoningProfile: 'gpt-5.6',\n supportsReasoningSummary: true,\n },\n {\n id: 'gpt-5.5',\n name: '5.5',\n contextWindow: 272_000,\n inputModalities: ['text', 'image'],\n defaultReasoningEffort: 'medium',\n reasoningProfile: 'standard',\n supportsReasoningSummary: true,\n },\n {\n id: 'gpt-5.4',\n name: '5.4',\n contextWindow: 272_000,\n inputModalities: ['text', 'image'],\n defaultReasoningEffort: 'none',\n reasoningProfile: 'standard',\n supportsReasoningSummary: true,\n },\n {\n id: 'gpt-5.4-mini',\n name: '5.4 Mini',\n contextWindow: 272_000,\n inputModalities: ['text', 'image'],\n defaultReasoningEffort: 'none',\n reasoningProfile: 'standard',\n supportsReasoningSummary: true,\n },\n {\n id: 'gpt-5.3-codex-spark',\n name: '5.3 Codex Spark',\n contextWindow: 258_000,\n inputModalities: ['text'],\n defaultReasoningEffort: 'high',\n reasoningProfile: 'standard',\n supportsReasoningSummary: false,\n },\n] as const satisfies readonly CodexModelCatalogEntry[]\n\nexport type CodexModelId = typeof CODEX_MODEL_CATALOG[number]['id']\n\nexport const DEFAULT_CODEX_MODEL = CODEX_MODEL_CATALOG[0]\n\nexport const CONFIGURABLE_CONTEXT_MODEL_IDS = [\n 'gpt-5.6-sol',\n 'gpt-5.6-terra',\n 'gpt-5.6-luna',\n] as const satisfies readonly CodexModelId[]\n\nexport type ConfigurableContextModelId = typeof CONFIGURABLE_CONTEXT_MODEL_IDS[number]\n\nexport const STANDARD_REASONING_EFFORTS = ['none', 'low', 'medium', 'high', 'xhigh'] as const\nexport const GPT_56_REASONING_EFFORTS = [...STANDARD_REASONING_EFFORTS, 'max'] as const\nexport type CodexReasoningEffort = typeof GPT_56_REASONING_EFFORTS[number]\n\nexport function reasoningEffortsForModel(model: string): readonly CodexReasoningEffort[] {\n return resolveCodexCatalogEntry(model).reasoningProfile === 'gpt-5.6'\n ? GPT_56_REASONING_EFFORTS\n : STANDARD_REASONING_EFFORTS\n}\n\nexport function isCodexReasoningEffort(value: unknown): value is CodexReasoningEffort {\n return typeof value === 'string' && GPT_56_REASONING_EFFORTS.some((effort) => effort === value)\n}\n\nexport function modelSupportsReasoningEffort(model: string, effort: unknown): effort is CodexReasoningEffort {\n return isCodexReasoningEffort(effort) && reasoningEffortsForModel(model).some((candidate) => candidate === effort)\n}\n\nexport function isCodexModelId(model: unknown): model is CodexModelId {\n return typeof model === 'string' && CODEX_MODEL_CATALOG.some((entry) => entry.id === model)\n}\n\nexport function isConfigurableContextModelId(model: unknown): model is ConfigurableContextModelId {\n return typeof model === 'string' && CONFIGURABLE_CONTEXT_MODEL_IDS.some((id) => id === model)\n}\n\nexport function resolveCodexCatalogEntry(model: string): CodexModelCatalogEntry {\n return CODEX_MODEL_CATALOG.find((entry) => entry.id === model) ?? DEFAULT_CODEX_MODEL\n}\n\nexport function codexModelSupportsImageInput(model: string): boolean {\n return resolveCodexCatalogEntry(model).inputModalities.includes('image')\n}\n\nexport function codexModelSupportsReasoningSummary(model: string): boolean {\n return resolveCodexCatalogEntry(model).supportsReasoningSummary\n}\n","import { ROUTE_PREFIX } from '../compat.ts'\r\nimport type {\r\n ApiEnvelope,\r\n LoginEventDto,\r\n LoginStartDto,\r\n PluginStatusDto,\r\n QuotaStatusDto,\r\n SubagentModelCatalogDto,\r\n ConnectionTestDto,\r\n SubscriptionPreferencesDto,\r\n SubscriptionPreferencesUpdateDto,\r\n} from '../shared/contracts.ts'\r\n\r\nexport class SubscriptionApi {\r\n status(): Promise<PluginStatusDto> {\r\n return request<PluginStatusDto>(`${ROUTE_PREFIX}/status`)\r\n }\r\n\r\n models(): Promise<SubagentModelCatalogDto> {\r\n return request<SubagentModelCatalogDto>(`${ROUTE_PREFIX}/models`)\r\n }\r\n\r\n startLogin(): Promise<LoginStartDto> {\r\n return post<LoginStartDto>(`${ROUTE_PREFIX}/login/start`, {})\r\n }\r\n\r\n cancelLogin(loginId: string): Promise<{ cancelled: boolean }> {\r\n return post(`${ROUTE_PREFIX}/login/cancel`, { loginId })\r\n }\r\n\r\n logout(): Promise<{ authenticated: false }> {\r\n return post(`${ROUTE_PREFIX}/logout`, {})\r\n }\r\n\r\n refresh(): Promise<PluginStatusDto> {\r\n return post(`${ROUTE_PREFIX}/token/refresh`, {})\r\n }\r\n\r\n refreshQuota(): Promise<QuotaStatusDto> {\r\n return post(`${ROUTE_PREFIX}/quota/refresh`, {})\r\n }\r\n\r\n useResetCredit(): Promise<QuotaStatusDto> {\r\n return post(`${ROUTE_PREFIX}/quota/reset-credit/use`, {})\r\n }\r\n\r\n testConnection(): Promise<ConnectionTestDto> {\r\n return post(`${ROUTE_PREFIX}/connection/test`, {})\r\n }\r\n\r\n updatePreferences(patch: SubscriptionPreferencesUpdateDto): Promise<SubscriptionPreferencesDto> {\r\n return post(`${ROUTE_PREFIX}/preferences/update`, patch)\r\n }\r\n\r\n events(loginId: string): EventSource {\r\n return new EventSource(`${ROUTE_PREFIX}/login/events?loginId=${encodeURIComponent(loginId)}`)\r\n }\r\n}\r\n\r\nasync function post<T>(url: string, body: object): Promise<T> {\r\n return request<T>(url, {\r\n method: 'POST',\r\n headers: { 'content-type': 'application/json' },\r\n body: JSON.stringify(body),\r\n })\r\n}\r\n\r\nasync function request<T>(url: string, init?: RequestInit): Promise<T> {\r\n const response = await fetch(url, { ...init, credentials: 'same-origin' })\r\n const envelope = await response.json() as ApiEnvelope<T>\r\n if (!response.ok || !envelope.ok) {\r\n throw new Error(envelope.ok ? `Request failed (${response.status})` : envelope.error.message)\r\n }\r\n return envelope.value\r\n}\r\n\r\nexport function parseLoginEvent(event: MessageEvent<string>): LoginEventDto | null {\r\n try {\r\n const value = JSON.parse(event.data) as LoginEventDto\r\n return typeof value === 'object' && value !== null && typeof value.type === 'string' ? value : null\r\n } catch {\r\n return null\r\n }\r\n}\r\n","import { useCallback, useEffect, useRef, useState } from 'react'\r\nimport type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\r\nimport type { CredentialStorageDto, PluginStatusDto, QuotaBucketDto, QuotaWindowDto, SubscriptionPreferencesUpdateDto } from '../shared/contracts.ts'\r\nimport { CODEX_MODEL_CATALOG, CONFIGURABLE_CONTEXT_MODEL_IDS, GPT_56_MAX_CONTEXT_WINDOW, reasoningEffortsForModel, resolveCodexCatalogEntry } from '../shared/model-catalog.ts'\r\nimport { SubscriptionApi, parseLoginEvent } from './api.ts'\r\nimport { NS } from './locales.ts'\r\nimport { quotaWindows } from './quota.ts'\r\n\r\ntype Props = PropsRuntime<'settings.section'> & PropsLocale<typeof NS>\r\ntype BusyAction = 'login' | 'token' | 'quota' | 'reset-credit' | 'test' | 'logout' | 'preferences' | null\r\ntype Translate = Props['t']\r\n\r\nexport function CodexSubscriptionSection({ t }: Props): React.JSX.Element {\r\n const apiRef = useRef(new SubscriptionApi())\r\n const eventSourceRef = useRef<EventSource | null>(null)\r\n const [status, setStatus] = useState<PluginStatusDto | null>(null)\r\n const [busy, setBusy] = useState<BusyAction>(null)\r\n const [error, setError] = useState<string | null>(null)\r\n const [authUrl, setAuthUrl] = useState<string | null>(null)\r\n const [popupBlocked, setPopupBlocked] = useState(false)\r\n const [resetCreditNotice, setResetCreditNotice] = useState<string | null>(null)\r\n const [connection, setConnection] = useState<{ latencyMs: number; checkedAt: number } | null>(null)\r\n const [contextDrafts, setContextDrafts] = useState<Record<string, string>>({})\r\n\r\n const load = useCallback(async (quiet = false) => {\r\n if (!quiet) setError(null)\r\n try {\r\n const next = await apiRef.current.status()\r\n setStatus(next)\r\n if (next.error !== undefined) setError(next.error.message)\r\n } catch (cause) {\r\n if (!quiet) setError(messageOf(cause))\r\n }\r\n }, [])\r\n\r\n useEffect(() => {\r\n void load()\r\n const refreshWhenVisible = (): void => {\r\n if (document.visibilityState === 'visible') void load(true)\r\n }\r\n document.addEventListener('visibilitychange', refreshWhenVisible)\r\n const timer = window.setInterval(refreshWhenVisible, 60_000)\r\n return () => {\r\n window.clearInterval(timer)\r\n document.removeEventListener('visibilitychange', refreshWhenVisible)\r\n eventSourceRef.current?.close()\r\n }\r\n }, [load])\r\n\r\n const watchLogin = useCallback((loginId: string) => {\r\n eventSourceRef.current?.close()\r\n const source = apiRef.current.events(loginId)\r\n eventSourceRef.current = source\r\n const finish = async (message?: string): Promise<void> => {\r\n source.close()\r\n eventSourceRef.current = null\r\n setBusy(null)\r\n setAuthUrl(null)\r\n if (message !== undefined) setError(message)\r\n // Preserve the terminal OAuth error while refreshing the account DTO.\r\n await load(true)\r\n }\r\n source.addEventListener('completed', (event) => {\r\n const parsed = parseLoginEvent(event as MessageEvent<string>)\r\n if (parsed?.type === 'completed') void finish()\r\n })\r\n source.addEventListener('cancelled', () => void finish())\r\n source.addEventListener('failed', (event) => {\r\n const parsed = parseLoginEvent(event as MessageEvent<string>)\r\n void finish(parsed?.type === 'failed' ? parsed.error.message : 'ChatGPT sign-in failed.')\r\n })\r\n }, [load])\r\n\r\n useEffect(() => {\r\n const loginId = status?.login.active ? status.login.loginId : null\r\n if (loginId !== null && loginId !== undefined && eventSourceRef.current === null) watchLogin(loginId)\r\n }, [status?.login.active, status?.login.loginId, watchLogin])\r\n\r\n const startLogin = async (): Promise<void> => {\r\n setBusy('login')\r\n setError(null)\r\n setPopupBlocked(false)\r\n const popup = window.open('about:blank', 'dsh-chatgpt-oauth', 'popup,width=560,height=760')\r\n try {\r\n const login = await apiRef.current.startLogin()\r\n setAuthUrl(login.authUrl)\r\n if (popup === null) setPopupBlocked(true)\r\n else popup.location.replace(login.authUrl)\r\n watchLogin(login.loginId)\r\n await load(true)\r\n } catch (cause) {\r\n popup?.close()\r\n setBusy(null)\r\n setError(messageOf(cause))\r\n }\r\n }\r\n\r\n const cancelLogin = async (): Promise<void> => {\r\n const loginId = status?.login.loginId\r\n if (loginId === null || loginId === undefined) return\r\n setBusy('login')\r\n try {\r\n await apiRef.current.cancelLogin(loginId)\r\n eventSourceRef.current?.close()\r\n eventSourceRef.current = null\r\n setAuthUrl(null)\r\n await load()\r\n } catch (cause) {\r\n setError(messageOf(cause))\r\n } finally {\r\n setBusy(null)\r\n }\r\n }\r\n\r\n const refreshToken = async (): Promise<void> => run('token', async () => {\r\n setStatus(await apiRef.current.refresh())\r\n })\r\n\r\n const refreshQuota = async (): Promise<void> => run('quota', async () => {\r\n const quota = await apiRef.current.refreshQuota()\r\n setStatus((current) => current === null ? current : { ...current, quota })\r\n })\r\n\r\n const useResetCredit = async (): Promise<void> => {\r\n if (!window.confirm(t('useResetCreditConfirm'))) return\r\n await run('reset-credit', async () => {\r\n const quota = await apiRef.current.useResetCredit()\r\n setStatus((current) => current === null ? current : { ...current, quota })\r\n setResetCreditNotice(t('resetCreditUsed'))\r\n })\r\n }\r\n\r\n const testConnection = async (): Promise<void> => run('test', async () => {\r\n const result = await apiRef.current.testConnection()\r\n setConnection({ latencyMs: result.latencyMs, checkedAt: result.checkedAt })\r\n })\r\n\r\n const updatePreferences = async (patch: SubscriptionPreferencesUpdateDto): Promise<void> => run('preferences', async () => {\r\n const preferences = await apiRef.current.updatePreferences(patch)\r\n setStatus((current) => current === null ? current : { ...current, preferences })\r\n })\r\n\r\n const updateContextWindow = async (model: (typeof CONFIGURABLE_CONTEXT_MODEL_IDS)[number]): Promise<void> => {\r\n const current = status?.preferences.contextWindowOverrides[model] ?? resolveCodexCatalogEntry(model).contextWindow\r\n const parsed = parseCapacity(contextDrafts[model] ?? String(current))\r\n if (parsed === null) {\r\n setError(t('contextWindowInvalid'))\r\n return\r\n }\r\n await updatePreferences({ contextWindowOverrides: { [model]: parsed } })\r\n setContextDrafts((drafts) => ({ ...drafts, [model]: String(parsed) }))\r\n }\r\n\r\n const logout = async (): Promise<void> => run('logout', async () => {\r\n await apiRef.current.logout()\r\n eventSourceRef.current?.close()\r\n eventSourceRef.current = null\r\n setAuthUrl(null)\r\n setConnection(null)\r\n await load()\r\n })\r\n\r\n const run = async (action: Exclude<BusyAction, null>, task: () => Promise<void>): Promise<void> => {\r\n setBusy(action)\r\n setError(null)\r\n setResetCreditNotice(null)\r\n try {\r\n await task()\r\n } catch (cause) {\r\n setError(messageOf(cause))\r\n } finally {\r\n setBusy(null)\r\n }\r\n }\r\n\r\n const account = status?.account\r\n return <section className=\"dsh-codex-page\" aria-labelledby=\"dsh-codex-title\">\r\n <header>\r\n <h2 id=\"dsh-codex-title\" className=\"dsh-codex-title\">{t('title')}</h2>\r\n <p className=\"dsh-codex-intro\">{t('intro')}</p>\r\n </header>\r\n\r\n {error !== null ? <div className=\"dsh-codex-errorbar\" role=\"alert\">\r\n <span>{error}</span>\r\n {status === null ? <Button disabled={busy !== null} onClick={() => load()}>{t('retry')}</Button> : null}\r\n </div> : null}\r\n\r\n {status === null && error === null ? <Skeleton label={t('loading')} /> : <>\r\n <Section title={t('account')}>\r\n <InfoRow label={status?.authenticated ? t('signedIn') : t('signedOut')} value={account?.email ?? '—'} />\r\n {status?.authenticated ? <>\r\n <InfoRow label={t('plan')} value={account?.planType ?? t('unknown')} />\r\n <InfoRow label={t('accountId')} value={account?.accountIdSuffix ?? '—'} />\r\n <InfoRow label={t('expires')} value={formatDate(account?.tokenExpiresAt)} />\r\n </> : null}\r\n <InfoRow label={t('storage')} value={storageLabel(status?.storage, t)} />\r\n <p className=\"dsh-codex-notice\">{storageNotice(status?.storage, t)}</p>\r\n {status?.login.active ? <p className=\"dsh-codex-muted\" role=\"status\">{t('pending')}</p> : null}\r\n {popupBlocked ? <p className=\"dsh-codex-error\">{t('popupBlocked')}</p> : null}\r\n {authUrl !== null ? <a className=\"dsh-codex-link\" href={authUrl} target=\"_blank\" rel=\"noreferrer\">{t('continueLogin')}</a> : null}\r\n <div className=\"dsh-codex-actions\">\r\n {status?.login.active\r\n ? <Button disabled={busy !== null} onClick={cancelLogin}>{t('cancel')}</Button>\r\n : <Button primary disabled={busy !== null || status?.storage.available === false} onClick={startLogin}>{status?.authenticated ? t('signInAgain') : t('signIn')}</Button>}\r\n {status?.authenticated ? <>\r\n <Button disabled={busy !== null} onClick={refreshToken}>{t('refreshToken')}</Button>\r\n <Button disabled={busy !== null} onClick={logout}>{t('signOut')}</Button>\r\n </> : null}\r\n </div>\r\n </Section>\r\n\r\n <Section title={t('connection')}>\r\n <InfoRow label={t('provider')} value=\"Codex(ChatGPT 订阅) · codex-chatgpt\" />\r\n <InfoRow label={t('connectionState')} value={connection === null ? t('untested') : t('connected')} />\r\n {connection !== null ? <InfoRow label={t('latency')} value={`${connection.latencyMs} ms · ${formatDate(connection.checkedAt)}`} /> : null}\r\n <div className=\"dsh-codex-models\" aria-label={t('models')}>\r\n {CODEX_MODEL_CATALOG.map((model) => <code key={model.id} title={model.id}>{model.name}</code>)}\r\n </div>\r\n <div className=\"dsh-codex-actions\">\r\n <Button disabled={!status?.authenticated || busy !== null} onClick={testConnection}>{busy === 'test' ? t('testing') : t('testConnection')}</Button>\r\n </div>\r\n </Section>\r\n\r\n <Section title={t('enhancements')}>\r\n <div className=\"dsh-codex-pref-row\">\r\n <div>\r\n <strong>{t('searchProvider')}</strong>\r\n <p className=\"dsh-codex-muted\">{t('searchProviderHint')}</p>\r\n </div>\r\n <div className=\"dsh-codex-segments\" role=\"radiogroup\" aria-label={t('searchProvider')}>\r\n <label>\r\n <input type=\"radio\" name=\"dsh-codex-search-provider\" checked={status?.preferences.searchProvider === 'dsh'} disabled={busy !== null} onChange={() => updatePreferences({ searchProvider: 'dsh' })} />\r\n <span>{t('searchProviderDsh')}</span>\r\n </label>\r\n <label>\r\n <input type=\"radio\" name=\"dsh-codex-search-provider\" checked={status?.preferences.searchProvider === 'codex'} disabled={busy !== null} onChange={() => updatePreferences({ searchProvider: 'codex' })} />\r\n <span>{t('searchProviderCodex')}</span>\r\n </label>\r\n </div>\r\n </div>\r\n <div className=\"dsh-codex-context-settings\">\r\n <div>\r\n <strong>{t('contextWindows')}</strong>\r\n <p className=\"dsh-codex-muted\">{t('contextWindowsHint')}</p>\r\n </div>\r\n {CONFIGURABLE_CONTEXT_MODEL_IDS.map((model) => {\r\n const entry = resolveCodexCatalogEntry(model)\r\n const fallback = status?.preferences.contextWindowOverrides[model] ?? entry.contextWindow\r\n const draft = contextDrafts[model]\r\n const parsedDraft = draft === undefined ? fallback : parseCapacity(draft)\r\n const dirty = draft !== undefined && parsedDraft !== fallback\r\n const inputId = `dsh-codex-context-${model}`\r\n return <div className=\"dsh-codex-context-row\" key={model}>\r\n <label htmlFor={inputId}>{entry.name}</label>\r\n <span className=\"dsh-codex-capacity-control\">\r\n <input id={inputId} type=\"text\" inputMode=\"numeric\" value={draft ?? formatCapacity(fallback)} disabled={busy !== null} aria-label={entry.name + ' ' + t('contextWindow')} onChange={(event) => {\r\n const value = event.currentTarget.value\r\n setContextDrafts((drafts) => ({ ...drafts, [model]: value }))\r\n }} onKeyDown={(event) => {\r\n if (event.key !== 'Enter' || !dirty) return\r\n event.preventDefault()\r\n void updateContextWindow(model)\r\n }} />\r\n <small>{t('tokens')}</small>\r\n <button className=\"dsh-codex-context-save\" type=\"button\" data-model={model} aria-label={entry.name + ' ' + t('saveContextWindow')} disabled={busy !== null || !dirty} onClick={() => void updateContextWindow(model)}>{t('save')}</button>\r\n </span>\r\n </div>\r\n })}\r\n </div>\r\n <label className=\"dsh-codex-check\">\r\n <input type=\"checkbox\" checked={status?.preferences.quickQuotaVisible === true} disabled={busy !== null} onChange={(event) => updatePreferences({ quickQuotaVisible: event.currentTarget.checked })} />\r\n <span>\r\n <strong>{t('quickQuota')}</strong>\r\n <small>{t('quickQuotaHint')}</small>\r\n </span>\r\n </label>\r\n </Section>\r\n\r\n <Section title={t('quota')} aside={<Button disabled={!status?.authenticated || busy !== null} onClick={refreshQuota}>{busy === 'quota' ? t('refreshing') : t('refreshQuota')}</Button>}>\r\n <p className=\"dsh-codex-muted\">{t('quotaIntro')}</p>\r\n {status?.quota.state === 'signed-out' ? <p className=\"dsh-codex-empty\">{t('quotaSignedOut')}</p> : null}\r\n {status?.quota.buckets.map((bucket) => <QuotaBucket key={bucket.id} bucket={bucket} t={t} />)}\r\n {status?.quota.credits !== null && status?.quota.credits !== undefined ? <QuotaFact label={t('credits')} value={status.quota.credits.unlimited ? t('unlimited') : status.quota.credits.balance ?? (status.quota.credits.hasCredits ? t('available') : t('unavailable'))} /> : null}\r\n {status?.quota.individualLimit !== null && status?.quota.individualLimit !== undefined ? <QuotaFact label={t('monthlySpend')} value={individualLimitLabel(status.quota.individualLimit, t)} /> : null}\r\n {status?.quota.resetCredits !== null && status?.quota.resetCredits !== undefined ? <ResetCreditsFact resetCredits={status.quota.resetCredits} busy={busy} onUse={useResetCredit} t={t} /> : null}\r\n {resetCreditNotice !== null ? <p className=\"dsh-codex-success\" role=\"status\">{resetCreditNotice}</p> : null}\r\n {status?.quota.spendControlReached === true ? <p className=\"dsh-codex-warning\" role=\"status\">{t('spendControlReached')}</p> : null}\r\n {status?.quota.state === 'empty' ? <p className=\"dsh-codex-empty\">{t('noQuota')}</p> : null}\r\n {status?.quota.stale ? <p className=\"dsh-codex-warning\" role=\"status\">{t('stale')}</p> : null}\r\n {status?.quota.error ? <p className=\"dsh-codex-error\" role=\"alert\">{status.quota.error.message}</p> : null}\r\n {status?.quota.fetchedAt ? <p className=\"dsh-codex-timestamp\">{t('updated')}: {formatDate(status.quota.fetchedAt)}</p> : null}\r\n </Section>\r\n </>}\r\n\r\n <span className=\"dsh-codex-sr\" aria-live=\"polite\">{busy === null ? '' : busy}</span>\r\n </section>\r\n}\r\n\r\nfunction Section({ title, aside, children }: { title: string; aside?: React.ReactNode; children: React.ReactNode }): React.JSX.Element {\r\n return <section className=\"dsh-codex-group\">\r\n <div className=\"dsh-codex-grouphead\"><h3>{title}</h3>{aside}</div>\r\n {children}\r\n </section>\r\n}\r\n\r\nfunction Button({ primary = false, disabled, onClick, children }: { primary?: boolean; disabled?: boolean; onClick: () => void | Promise<void>; children: React.ReactNode }): React.JSX.Element {\r\n return <button className={`dsh-codex-button${primary ? ' dsh-codex-button-primary' : ''}`} type=\"button\" disabled={disabled} onClick={() => void onClick()}>{children}</button>\r\n}\r\n\r\nfunction InfoRow({ label, value }: { label: string; value: string }): React.JSX.Element {\r\n return <div className=\"dsh-codex-row\"><span className=\"dsh-codex-label\">{label}</span><span className=\"dsh-codex-value\">{value}</span></div>\r\n}\r\n\r\nexport function storageLabel(storage: CredentialStorageDto | undefined, t: Translate): string {\r\n if (storage === undefined || !storage.available) return t('storageUnavailable')\r\n if (storage.kind === 'windows-dpapi') return t('storageWindows')\r\n if (storage.kind === 'macos-keychain') return t('storageMacKeychain')\r\n if (storage.kind === 'linux-file') return t('storageLinuxFile')\r\n if (storage.kind === 'memory') return t('storageMemory')\r\n return t('storageUnavailable')\r\n}\r\n\r\nexport function storageNotice(storage: CredentialStorageDto | undefined, t: Translate): string {\r\n if (storage === undefined || !storage.available) return t('securityUnavailable')\r\n if (storage.kind === 'windows-dpapi') return t('securityWindows')\r\n if (storage.kind === 'macos-keychain') return t('securityMacKeychain')\r\n if (storage.kind === 'linux-file') return t('securityLinuxFile')\r\n if (storage.kind === 'memory') return t('securityMemory')\r\n return t('securityUnavailable')\r\n}\r\n\r\nfunction QuotaBucket({ bucket, t }: { bucket: QuotaBucketDto; t: Translate }): React.JSX.Element {\r\n const windows = quotaWindows(bucket)\r\n return <article className=\"dsh-codex-quota-card\">\r\n <div className=\"dsh-codex-quota-title\"><strong>{bucket.name}</strong>{bucket.planType ? <span>{bucket.planType}</span> : null}</div>\r\n {windows.map((window, index) => <QuotaBar key={`${window.windowDurationMins ?? 'x'}:${window.resetsAt ?? 'x'}:${index}`} label={windowLabel(window.windowDurationMins, t)} window={window} t={t} />)}\r\n </article>\r\n}\r\n\r\nfunction QuotaFact({ label, value }: { label: string; value: string }): React.JSX.Element {\r\n return <div className=\"dsh-codex-quota-fact\"><span>{label}</span><strong>{value}</strong></div>\r\n}\r\n\r\nexport function ResetCreditsFact({ resetCredits, busy, onUse, t }: { resetCredits: NonNullable<PluginStatusDto['quota']['resetCredits']>; busy: BusyAction; onUse: () => Promise<void>; t: Translate }): React.JSX.Element {\r\n const available = resetCredits.availableCount > 0\r\n return <div className=\"dsh-codex-reset-credits\">\r\n <div className=\"dsh-codex-reset-credits-info\">\r\n <span>{t('resetCredits')}</span>\r\n <strong>{resetCredits.availableCount}</strong>\r\n <small>{t('resetCreditExpires')}: {resetCredits.expiresAt == null ? t('unknown') : formatReset(resetCredits.expiresAt)}</small>\r\n </div>\r\n <Button primary disabled={!available || busy !== null} onClick={onUse}>{busy === 'reset-credit' ? t('usingResetCredit') : t('useResetCredit')}</Button>\r\n </div>\r\n}\r\n\r\nexport function QuotaBar({ label, window, t }: { label: string; window: QuotaWindowDto; t: Translate }): React.JSX.Element {\r\n const percent = window.usedPercent\r\n const level = percent >= 95 ? 'danger' : percent >= 80 ? 'warning' : 'normal'\r\n const remaining = Math.max(0, 100 - percent)\r\n return <div className=\"dsh-codex-meter-wrap\">\r\n <div className=\"dsh-codex-meter-label\"><span>{label}</span><strong>{formatPercent(percent)}</strong></div>\r\n <div className={`dsh-codex-meter dsh-codex-meter-${level}`} role=\"progressbar\" aria-label={`${label}: ${formatPercent(percent)} ${t('used')}`} aria-valuemin={0} aria-valuemax={100} aria-valuenow={percent}>\r\n <span style={{ width: `${percent}%` }} />\r\n </div>\r\n <div className=\"dsh-codex-meter-meta\">\r\n <span>{percent >= 100 ? `${t('exhausted')} · ${formatPercent(remaining)} ${t('remaining')}` : `${formatPercent(percent)} ${t('used')} · ${formatPercent(remaining)} ${t('remaining')}`}</span>\r\n <span>{window.resetsAt === null ? '—' : `${t('resets')}: ${formatReset(window.resetsAt)}`}</span>\r\n </div>\r\n </div>\r\n}\r\n\r\nfunction Skeleton({ label }: { label: string }): React.JSX.Element {\r\n return <div className=\"dsh-codex-skeleton\" role=\"status\" aria-label={label}><span /><span /></div>\r\n}\r\n\r\nexport function windowLabel(minutes: number | null, t: Translate): string {\r\n if (minutes === null) return t('limitWindow')\r\n const [value, unit]: [number, Intl.NumberFormatOptions['unit']] = minutes >= 1440 && minutes % 1440 === 0\r\n ? [minutes / 1440, 'day']\r\n : minutes >= 60 && minutes % 60 === 0\r\n ? [minutes / 60, 'hour']\r\n : [Math.round(minutes), 'minute']\r\n return `${new Intl.NumberFormat(undefined, { style: 'unit', unit, unitDisplay: 'long' }).format(value)} ${t('limitWindow')}`\r\n}\r\n\r\nfunction reasoningEffortLabel(effort: string, t: Translate): string {\r\n const labels: Record<string, keyof typeof import('./locales.ts').zh> = {\r\n none: 'reasoningNone',\r\n low: 'reasoningLow',\r\n medium: 'reasoningMedium',\r\n high: 'reasoningHigh',\r\n xhigh: 'reasoningXhigh',\r\n max: 'reasoningMax',\r\n }\r\n return t(labels[effort] ?? 'unknown')\r\n}\r\n\r\nexport function parsePositiveCapacity(value: string): number | null {\r\n const normalized = value.trim().toLowerCase().replace(/[,_\\s]/g, '')\r\n const matched = normalized.match(/^(\\d+(?:\\.\\d+)?)(k|m)?$/)\r\n if (matched === null) return null\r\n const multiplier = matched[2] === 'm' ? 1_000_000 : matched[2] === 'k' ? 1_000 : 1\r\n const parsed = Number(matched[1]) * multiplier\r\n return Number.isSafeInteger(parsed) && parsed >= 1 ? parsed : null\r\n}\r\n\r\nexport function parseCapacity(value: string): number | null {\r\n const parsed = parsePositiveCapacity(value)\r\n return parsed !== null && parsed <= GPT_56_MAX_CONTEXT_WINDOW ? parsed : null\r\n}\r\n\r\nfunction formatCapacity(value: number): string {\r\n if (value % 1_000 === 0) return `${value / 1_000}K`\r\n return String(value)\r\n}\r\n\r\nfunction formatPercent(value: number): string {\r\n return `${new Intl.NumberFormat(undefined, { maximumFractionDigits: 1 }).format(value)}%`\r\n}\r\n\r\nfunction individualLimitLabel(limit: NonNullable<PluginStatusDto['quota']['individualLimit']>, t: Translate): string {\r\n const parts = [\r\n limit.remainingPercent !== null ? `${formatPercent(limit.remainingPercent)} ${t('remaining')}` : null,\r\n limit.limit !== null ? `${t('limit')}: ${limit.limit}` : null,\r\n limit.used !== null ? `${t('used')}: ${limit.used}` : null,\r\n limit.resetsAt !== null ? `${t('resets')}: ${formatReset(limit.resetsAt)}` : null,\r\n ].filter((part): part is string => part !== null)\r\n return parts.length > 0 ? parts.join(' · ') : t('unknown')\r\n}\r\n\r\nfunction formatDate(seconds: number | undefined): string {\r\n if (seconds === undefined) return '—'\r\n return new Intl.DateTimeFormat(undefined, { dateStyle: 'medium', timeStyle: 'short' }).format(seconds * 1000)\r\n}\r\n\r\nexport function formatReset(seconds: number): string {\r\n const absolute = formatDate(seconds)\r\n const diff = seconds * 1000 - Date.now()\r\n const abs = Math.abs(diff)\r\n const [amount, unit]: [number, Intl.RelativeTimeFormatUnit] = abs >= 86_400_000\r\n ? [Math.round(diff / 86_400_000), 'day']\r\n : abs >= 3_600_000\r\n ? [Math.round(diff / 3_600_000), 'hour']\r\n : [Math.round(diff / 60_000), 'minute']\r\n return `${absolute} (${new Intl.RelativeTimeFormat(undefined, { numeric: 'auto' }).format(amount, unit)})`\r\n}\r\n\r\nfunction messageOf(error: unknown): string {\r\n return error instanceof Error ? error.message : String(error)\r\n}\r\n","import { useCallback, useEffect, useRef, useState } from 'react'\nimport type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { SubagentModelCatalogDto, SubscriptionPreferencesDto, SubscriptionPreferencesUpdateDto } from '../shared/contracts.ts'\nimport { SUBAGENT_MAX_DEPTH_LIMIT } from '../shared/preferences.ts'\nimport { SubscriptionApi } from './api.ts'\nimport { NS } from './locales.ts'\n\ntype Props = PropsRuntime<'settings.section'> & PropsLocale<typeof NS>\n\nexport function SubagentSettingsSection({ t }: Props): React.JSX.Element {\n const apiRef = useRef(new SubscriptionApi())\n const [preferences, setPreferences] = useState<SubscriptionPreferencesDto | null>(null)\n const [catalog, setCatalog] = useState<SubagentModelCatalogDto | null>(null)\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [contextDraft, setContextDraft] = useState<string | null>(null)\n const [depthDraft, setDepthDraft] = useState<string | null>(null)\n const [agentsDraft, setAgentsDraft] = useState<string | null>(null)\n\n const load = useCallback(async () => {\n setError(null)\n try {\n const [status, models] = await Promise.all([apiRef.current.status(), apiRef.current.models()])\n setPreferences(status.preferences)\n setCatalog(models)\n } catch (cause) {\n setError(messageOf(cause))\n }\n }, [])\n\n useEffect(() => {\n void load()\n }, [load])\n\n const update = async (patch: SubscriptionPreferencesUpdateDto): Promise<void> => {\n setBusy(true)\n setError(null)\n try {\n setPreferences(await apiRef.current.updatePreferences(patch))\n } catch (cause) {\n setError(messageOf(cause))\n } finally {\n setBusy(false)\n }\n }\n\n const selectedProvider = catalog?.providers.find(provider => provider.id === preferences?.subagentProvider) ?? catalog?.providers[0]\n const selectedModel = selectedProvider?.models.find(model => model.id === preferences?.subagentModel) ?? selectedProvider?.models[0]\n const reasoning = selectedModel?.reasoning\n const selectedEffort = preferences?.subagentReasoningEffort ?? reasoning?.defaultEffort ?? reasoning?.efforts[0]?.id ?? ''\n const savedContext = preferences?.subagentContextWindow ?? selectedModel?.contextWindow ?? 1\n const parsedContext = parseCapacity(contextDraft ?? String(savedContext))\n const contextValid = parsedContext !== null && (selectedModel?.maxContextWindow === undefined || parsedContext <= selectedModel.maxContextWindow)\n const parsedDepthValue = parseNonNegativeInteger(depthDraft ?? String(preferences?.subagentMaxDepth ?? 0))\n const parsedDepth = parsedDepthValue !== null && parsedDepthValue <= SUBAGENT_MAX_DEPTH_LIMIT ? parsedDepthValue : null\n const parsedAgents = parsePositiveInteger(agentsDraft ?? String(preferences?.subagentMaxAgents ?? 1))\n\n return <section className=\"dsh-codex-page\" aria-labelledby=\"dsh-subagent-title\">\n <header>\n <h2 id=\"dsh-subagent-title\" className=\"dsh-codex-title\">{t('subagentSettingsTitle')}</h2>\n <p className=\"dsh-codex-intro\">{t('subagentSettingsIntro')}</p>\n </header>\n\n {error !== null ? <div className=\"dsh-codex-errorbar\" role=\"alert\">\n <span>{error}</span>\n {preferences === null ? <button className=\"dsh-codex-button\" type=\"button\" onClick={() => void load()}>{t('retry')}</button> : null}\n </div> : null}\n\n {preferences === null || catalog === null\n ? <div className=\"dsh-codex-skeleton\" role=\"status\" aria-label={t('loading')}><span /><span /></div>\n : <>\n <section className=\"dsh-codex-group\">\n <div className=\"dsh-codex-grouphead\"><h3>{t('subagentModelGroup')}</h3></div>\n <div className=\"dsh-codex-pref-row\">\n <div><strong>{t('subagentProvider')}</strong><p className=\"dsh-codex-muted\">{t('subagentProviderHint')}</p></div>\n <select className=\"dsh-codex-select\" aria-label={t('subagentProvider')} value={selectedProvider?.id ?? ''} disabled={busy || selectedProvider === undefined} onChange={(event) => {\n const provider = catalog.providers.find(entry => entry.id === event.currentTarget.value)\n const model = provider?.models[0]\n if (provider === undefined || model === undefined) return\n const effort = model.reasoning?.defaultEffort ?? model.reasoning?.efforts[0]?.id ?? null\n setContextDraft(null)\n void update({ subagentProvider: provider.id, subagentModel: model.id, subagentReasoningEffort: effort, subagentContextWindow: model.contextWindow ?? 1 })\n }}>\n {catalog.providers.map(provider => <option key={provider.id} value={provider.id}>{provider.name}</option>)}\n </select>\n </div>\n <div className=\"dsh-codex-pref-row\">\n <div><strong>{t('subagentModel')}</strong><p className=\"dsh-codex-muted\">{t('subagentModelHint')}</p></div>\n <select className=\"dsh-codex-select\" aria-label={t('subagentModel')} value={selectedModel?.id ?? ''} disabled={busy || selectedModel === undefined} onChange={(event) => {\n const model = selectedProvider?.models.find(entry => entry.id === event.currentTarget.value)\n if (selectedProvider === undefined || model === undefined) return\n const effort = model.reasoning?.defaultEffort ?? model.reasoning?.efforts[0]?.id ?? null\n setContextDraft(null)\n void update({ subagentProvider: selectedProvider.id, subagentModel: model.id, subagentReasoningEffort: effort, subagentContextWindow: model.contextWindow ?? 1 })\n }}>\n {selectedProvider?.models.map(model => <option key={model.id} value={model.id}>{model.name}</option>)}\n </select>\n </div>\n <div className=\"dsh-codex-pref-row\">\n <div><strong>{t('subagentReasoningEffort')}</strong><p className=\"dsh-codex-muted\">{t('subagentReasoningEffortHint')}</p></div>\n {reasoning !== undefined && reasoning.efforts.length > 0\n ? <select className=\"dsh-codex-select\" aria-label={t('subagentReasoningEffort')} value={selectedEffort} disabled={busy} onChange={(event) => void update({ subagentReasoningEffort: event.currentTarget.value })}>\n {reasoning.efforts.map(effort => <option key={effort.id} value={effort.id}>{effort.name}</option>)}\n </select>\n : <span className=\"dsh-codex-muted\">{t('providerDefault')}</span>}\n </div>\n {selectedModel?.contextWindow !== undefined ? <div className=\"dsh-codex-context-settings\">\n <div><strong>{t('effectiveContextWindow')}</strong><p className=\"dsh-codex-muted\">{t('selectedModelContextHint')}</p></div>\n <div className=\"dsh-codex-context-row\">\n <label htmlFor=\"dsh-subagent-context\">{selectedModel.name}</label>\n <span className=\"dsh-codex-capacity-control\">\n <input id=\"dsh-subagent-context\" type=\"text\" inputMode=\"numeric\" value={contextDraft ?? formatCapacity(savedContext)} disabled={busy} onChange={(event) => setContextDraft(event.currentTarget.value)} />\n <small>{t('tokens')}</small>\n <button className=\"dsh-codex-context-save\" type=\"button\" disabled={busy || contextDraft === null || !contextValid || parsedContext === savedContext} onClick={() => {\n if (parsedContext === null) return\n void update({ subagentContextWindow: parsedContext }).then(() => setContextDraft(null))\n }}>{t('save')}</button>\n </span>\n </div>\n </div> : null}\n </section>\n\n <section className=\"dsh-codex-group\">\n <div className=\"dsh-codex-grouphead\"><h3>{t('subagentLimitsGroup')}</h3></div>\n <div className=\"dsh-codex-context-settings\">\n <div><strong>{t('subagentMaxDepth')}</strong><p className=\"dsh-codex-muted\">{t('subagentMaxDepthHint')}</p></div>\n <div className=\"dsh-codex-context-row\">\n <label htmlFor=\"dsh-subagent-depth\">{t('subagentMaxDepth')}</label>\n <span className=\"dsh-codex-capacity-control\">\n <input id=\"dsh-subagent-depth\" type=\"number\" min=\"0\" max={SUBAGENT_MAX_DEPTH_LIMIT} step=\"1\" inputMode=\"numeric\" value={depthDraft ?? String(preferences.subagentMaxDepth)} disabled={busy} onChange={(event) => setDepthDraft(event.currentTarget.value)} />\n <small>{t('levels')}</small>\n <button className=\"dsh-codex-context-save\" type=\"button\" disabled={busy || depthDraft === null || parsedDepth === null || parsedDepth === preferences.subagentMaxDepth} onClick={() => {\n if (parsedDepth === null) return\n void update({ subagentMaxDepth: parsedDepth }).then(() => setDepthDraft(null))\n }}>{t('save')}</button>\n </span>\n </div>\n </div>\n <div className=\"dsh-codex-context-settings\">\n <div><strong>{t('subagentMaxAgents')}</strong><p className=\"dsh-codex-muted\">{t('subagentMaxAgentsHint')}</p></div>\n <div className=\"dsh-codex-context-row\">\n <label htmlFor=\"dsh-subagent-agents\">{t('subagentMaxAgents')}</label>\n <span className=\"dsh-codex-capacity-control\">\n <input id=\"dsh-subagent-agents\" type=\"number\" min=\"1\" step=\"1\" inputMode=\"numeric\" value={agentsDraft ?? String(preferences.subagentMaxAgents)} disabled={busy} onChange={(event) => setAgentsDraft(event.currentTarget.value)} />\n <small>{t('agents')}</small>\n <button className=\"dsh-codex-context-save\" type=\"button\" disabled={busy || agentsDraft === null || parsedAgents === null || parsedAgents === preferences.subagentMaxAgents} onClick={() => {\n if (parsedAgents === null) return\n void update({ subagentMaxAgents: parsedAgents }).then(() => setAgentsDraft(null))\n }}>{t('save')}</button>\n </span>\n </div>\n </div>\n <p className=\"dsh-codex-notice\">{t('subagentLimitsNotice')}</p>\n </section>\n </>}\n </section>\n}\n\nexport function parseNonNegativeInteger(value: string): number | null {\n if (!/^\\d+$/.test(value.trim())) return null\n const parsed = Number(value.trim())\n return Number.isSafeInteger(parsed) && parsed >= 0 ? parsed : null\n}\n\nexport function parsePositiveInteger(value: string): number | null {\n const parsed = parseNonNegativeInteger(value)\n return parsed !== null && parsed >= 1 ? parsed : null\n}\n\nexport function parseCapacity(value: string): number | null {\n const matched = value.trim().toLowerCase().replace(/[,_\\s]/g, '').match(/^(\\d+(?:\\.\\d+)?)(k|m)?$/)\n if (matched === null) return null\n const multiplier = matched[2] === 'm' ? 1_000_000 : matched[2] === 'k' ? 1_000 : 1\n const parsed = Number(matched[1]) * multiplier\n return Number.isSafeInteger(parsed) && parsed >= 1 ? parsed : null\n}\n\nfunction formatCapacity(value: number): string {\n if (value % 1_000_000 === 0) return `${value / 1_000_000}M`\n if (value % 1_000 === 0) return `${value / 1_000}K`\n return String(value)\n}\n\nfunction messageOf(cause: unknown): string {\n return cause instanceof Error ? cause.message : String(cause)\n}\n","export const NS = 'dsh-chatgpt-subscription' as const\n\nexport const zh = {\n title: 'Codex 订阅',\n intro: '使用 ChatGPT 账号登录,在 DSH 中使用订阅可用的 Codex 模型。',\n account: '账号',\n signedOut: '尚未登录',\n signedIn: '已登录',\n plan: '套餐',\n accountId: '账号 ID',\n expires: '令牌到期',\n storage: '凭据存储',\n storageWindows: 'Windows DPAPI(当前用户加密)',\n storageMacKeychain: 'macOS 钥匙串(Keychain 加密)',\n storageLinuxFile: 'Linux 用户私有文件(权限 0600)',\n storageMemory: '仅 Host 内存(不持久化)',\n storageUnavailable: '凭据存储不可用',\n securityWindows: '令牌由 Host 使用 Windows CurrentUser DPAPI 加密,不会进入浏览器、settings.yaml 或日志。',\n securityMacKeychain: '令牌由 Host 存入 macOS 登录钥匙串(Keychain),在本机加密保存,不会进入浏览器、settings.yaml 或日志。',\n securityLinuxFile: '令牌仅写入 Host 上当前 Linux 用户可读的 0600 文件,但不会额外加密;同 UID 进程、root、备份和磁盘快照仍可能读取。',\n securityMemory: '令牌仅保留在 Host 内存中,Host 退出后丢失。',\n securityUnavailable: 'Host 无法安全访问凭据存储;请修复文件所有者或权限后重试。',\n signIn: '使用 ChatGPT 登录',\n signInAgain: '重新登录',\n cancel: '取消登录',\n signOut: '注销',\n refreshToken: '刷新凭据',\n pending: '请在浏览器中完成登录。',\n popupBlocked: '浏览器拦截了登录窗口,请使用下面的链接继续。',\n continueLogin: '打开 ChatGPT 登录页',\n loading: '正在读取状态…',\n connection: '连接',\n provider: 'Provider',\n connectionState: '连接状态',\n connected: '可用',\n untested: '尚未测试',\n testConnection: '测试连接',\n testing: '测试中…',\n latency: '最近延迟',\n models: '可用模型',\n enhancements: '增强功能',\n subagentSettingsNav: '子代理',\n subagentSettingsTitle: '子代理设置',\n subagentSettingsIntro: '全局配置 DSH 内置子代理。模型、思考深度、上下文预算和运行限制适用于所有父 Agent,不受父 Agent 当前 Provider 或模型影响。',\n subagentModelGroup: '模型与上下文',\n subagentLimitsGroup: '运行限制',\n subagentMaxDepth: '最大嵌套深度',\n subagentMaxDepthHint: '限制从顶层 Agent 开始的子代理层级(0–3);0 禁止创建子代理,1 仅允许直接子代理。',\n subagentMaxAgents: '子代理数量上限',\n subagentMaxAgentsHint: '限制每个父 Agent 子树中同时处于活动或启动中的子代理总数。',\n subagentLimitsNotice: '限制会立即应用于新的委派,不会中断已经运行的子代理。数量上限统计当前父 Agent 的全部活动后代。',\n levels: '层',\n agents: '个',\n searchProvider: '搜索来源',\n searchProviderHint: '选择 DSH Web 搜索工具使用默认来源,或改用当前 ChatGPT 订阅的 Codex 搜索来源。',\n searchProviderDsh: 'DSH 默认',\n searchProviderCodex: 'Codex 订阅',\n subagentProvider: '子代理 Provider',\n subagentProviderHint: '选择 DSH 当前已接入且可用的模型提供方。',\n subagentModel: '子代理模型',\n subagentModelHint: '全局应用于所有 DSH 内置子代理;模型可来自任意已接入 Provider。',\n subagentReasoningEffort: '子代理思考深度',\n subagentReasoningEffortHint: '选项来自所选模型实际公开的 reasoning effort 能力。',\n providerDefault: '使用 Provider 默认值',\n effectiveContextWindow: '有效上下文窗口',\n selectedModelContextHint: '选择模型后展开;该值仅用于子 Agent 的 DSH 上下文预算与压缩判断。',\n reasoningNone: '无',\n reasoningLow: '低',\n reasoningMedium: '中',\n reasoningHigh: '高',\n reasoningXhigh: '超高',\n reasoningMax: '最大',\n contextWindows: 'GPT-5.6 上下文窗口',\n contextWindowsHint: '默认 272K;可选启用最高 1M。该值用于 DSH 的压缩与溢出判断,可输入 1M、512K 等容量。',\n contextWindow: '上下文窗口',\n contextWindowInvalid: '上下文窗口必须是 1 到 1M 的整数,可使用 K 或 M 后缀。',\n saveContextWindow: '保存上下文窗口',\n save: '保存',\n tokens: 'tokens',\n quickQuota: '在输入框旁显示快捷用量',\n quickQuotaHint: '仅在当前会话选中 codex-chatgpt 模型时显示。',\n quota: '用量与限额',\n quotaIntro: '数据来自 ChatGPT Codex 用量服务。页面可见时最多每 60 秒刷新一次。',\n refreshQuota: '刷新用量',\n refreshing: '刷新中…',\n noQuota: '当前套餐未返回可显示的限额窗口。',\n quotaSignedOut: '登录后可查看订阅限额。',\n stale: '显示的是上次成功获取的数据。',\n updated: '更新时间',\n primary: '主要窗口',\n secondary: '次要窗口',\n limitWindow: '额度',\n used: '已使用',\n remaining: '剩余',\n available: '可用',\n unavailable: '不可用',\n unlimited: '无限',\n credits: 'Credits',\n monthlySpend: '月度消费控制',\n resetCredits: '重置次数',\n resetCreditExpires: '到期时间',\n useResetCredit: '使用重置卡',\n usingResetCredit: '使用中…',\n useResetCreditConfirm: '使用后会立即消耗 1 次重置机会,并重置符合条件的 Codex 额度窗口。确定继续吗?',\n resetCreditUsed: '重置卡已使用,用量数据已刷新。',\n spendControlReached: '已触发月度消费控制,新的订阅调用可能被限制。',\n limit: '上限',\n exhausted: '额度已用尽',\n resets: '重置',\n quickQuotaLabel: 'Codex 剩余',\n quickQuotaLoading: '用量…',\n imageToolRunning: '正在生成图片',\n imageToolDone: '已生成图片',\n imageToolFailed: '图片生成失败',\n image: '图片',\n openImage: '打开图片',\n openNamedImage: '打开 {name}',\n imageLoading: '加载图片…',\n imageLoadFailed: '图片加载失败,点击重试',\n imagePreviewClose: '关闭',\n imagePreviewOpenOriginal: '打开原图',\n retry: '重试',\n unknown: '未知',\n} as const\n\nexport const en: Record<keyof typeof zh, string> = {\n title: 'Codex subscription',\n intro: 'Sign in with ChatGPT to use Codex models available to your subscription in DSH.',\n account: 'Account',\n signedOut: 'Not signed in',\n signedIn: 'Signed in',\n plan: 'Plan',\n accountId: 'Account ID',\n expires: 'Token expires',\n storage: 'Credential storage',\n storageWindows: 'Windows DPAPI (current-user encrypted)',\n storageMacKeychain: 'macOS Keychain (encrypted)',\n storageLinuxFile: 'Linux user-private file (mode 0600)',\n storageMemory: 'Host memory only (not persistent)',\n storageUnavailable: 'Credential storage unavailable',\n securityWindows: 'The Host encrypts tokens with Windows CurrentUser DPAPI; they never enter the browser, settings.yaml, or logs.',\n securityMacKeychain: 'The Host stores tokens in the macOS login Keychain, encrypted on this machine; they never enter the browser, settings.yaml, or logs.',\n securityLinuxFile: 'Tokens are stored in a mode-0600 file readable only by the current Linux user, but are not additionally encrypted; same-UID processes, root, backups, and disk snapshots can still read them.',\n securityMemory: 'Tokens remain only in Host memory and are lost when the Host exits.',\n securityUnavailable: 'The Host cannot safely access credential storage. Fix the file owner or permissions and retry.',\n signIn: 'Sign in with ChatGPT',\n signInAgain: 'Sign in again',\n cancel: 'Cancel sign-in',\n signOut: 'Sign out',\n refreshToken: 'Refresh credentials',\n pending: 'Complete sign-in in your browser.',\n popupBlocked: 'The sign-in window was blocked. Use the link below to continue.',\n continueLogin: 'Open ChatGPT sign-in',\n loading: 'Reading status…',\n connection: 'Connection',\n provider: 'Provider',\n connectionState: 'Connection status',\n connected: 'Available',\n untested: 'Not tested',\n testConnection: 'Test connection',\n testing: 'Testing…',\n latency: 'Last latency',\n models: 'Available models',\n enhancements: 'Enhancements',\n subagentSettingsNav: 'Subagents',\n subagentSettingsTitle: 'Subagent settings',\n subagentSettingsIntro: 'Configure DSH built-in subagents globally. Model, reasoning effort, context budget, and runtime limits apply to every parent Agent regardless of its current provider or model.',\n subagentModelGroup: 'Model and context',\n subagentLimitsGroup: 'Runtime limits',\n subagentMaxDepth: 'Maximum nesting depth',\n subagentMaxDepthHint: 'Limit child levels below a top-level Agent (0–3). Zero disables subagents; one allows direct children only.',\n subagentMaxAgents: 'Maximum subagents',\n subagentMaxAgentsHint: 'Limit the total number of active or starting subagents in each parent Agent tree.',\n subagentLimitsNotice: 'Limits apply immediately to new delegations and do not interrupt subagents already running. The count covers all active descendants of the current parent Agent.',\n levels: 'levels',\n agents: 'agents',\n searchProvider: 'Search provider',\n searchProviderHint: 'Choose whether DSH web search uses its default provider or the Codex search source from this ChatGPT subscription.',\n searchProviderDsh: 'DSH default',\n searchProviderCodex: 'Codex subscription',\n subagentProvider: 'Subagent provider',\n subagentProviderHint: 'Choose from providers currently connected and available in DSH.',\n subagentModel: 'Subagent model',\n subagentModelHint: 'Applies globally to all built-in DSH subagents; the selected child model may come from any connected provider.',\n subagentReasoningEffort: 'Subagent reasoning effort',\n subagentReasoningEffortHint: 'Options come from the reasoning-effort capabilities exposed by the selected model.',\n providerDefault: 'Use provider default',\n effectiveContextWindow: 'Effective context window',\n selectedModelContextHint: 'Shown after model selection; used only for the child Agent context budget and DSH compaction decisions.',\n reasoningNone: 'None',\n reasoningLow: 'Low',\n reasoningMedium: 'Medium',\n reasoningHigh: 'High',\n reasoningXhigh: 'Extra high',\n reasoningMax: 'Maximum',\n contextWindows: 'GPT-5.6 context windows',\n contextWindowsHint: 'Defaults to 272K, with an optional value up to 1M. DSH uses it for compaction and overflow detection; values such as 1M and 512K are accepted.',\n contextWindow: 'Context window',\n contextWindowInvalid: 'The context window must be an integer from 1 to 1M. K and M suffixes are accepted.',\n saveContextWindow: 'Save context window',\n save: 'Save',\n tokens: 'tokens',\n quickQuota: 'Show quick usage beside the composer',\n quickQuotaHint: 'Shown only when the current session uses a codex-chatgpt model.',\n quota: 'Usage and limits',\n quotaIntro: 'Data comes from the ChatGPT Codex usage service and refreshes at most once per minute while visible.',\n refreshQuota: 'Refresh usage',\n refreshing: 'Refreshing…',\n noQuota: 'Your plan did not return any displayable limit windows.',\n quotaSignedOut: 'Sign in to view subscription limits.',\n stale: 'Showing the last successfully fetched data.',\n updated: 'Updated',\n primary: 'Primary window',\n secondary: 'Secondary window',\n limitWindow: 'limit',\n used: 'used',\n remaining: 'remaining',\n available: 'Available',\n unavailable: 'Unavailable',\n unlimited: 'Unlimited',\n credits: 'Credits',\n monthlySpend: 'Monthly spend control',\n resetCredits: 'Reset credits',\n resetCreditExpires: 'Expires',\n useResetCredit: 'Use reset credit',\n usingResetCredit: 'Using…',\n useResetCreditConfirm: 'This immediately spends one reset credit and resets eligible Codex limit windows. Continue?',\n resetCreditUsed: 'The reset credit was used and usage data was refreshed.',\n spendControlReached: 'Monthly spend control has been reached; new subscription calls may be limited.',\n limit: 'Limit',\n exhausted: 'Quota exhausted',\n resets: 'Resets',\n quickQuotaLabel: 'Codex left',\n quickQuotaLoading: 'Usage…',\n imageToolRunning: 'Generating image',\n imageToolDone: 'Generated image',\n imageToolFailed: 'Image generation failed',\n image: 'Image',\n openImage: 'Open image',\n openNamedImage: 'Open {name}',\n imageLoading: 'Loading image…',\n imageLoadFailed: 'Image failed to load. Click to retry',\n imagePreviewClose: 'Close',\n imagePreviewOpenOriginal: 'Open original',\n retry: 'Retry',\n unknown: 'Unknown',\n}\n\nexport type LocaleKey = keyof typeof zh\nexport const dictionaries = { zh, en }\n","const STYLE_ID = '@eddyskywalker/dsh-chatgpt-subscription/main'\r\n\r\nconst CSS = `\r\n.dsh-codex-page{box-sizing:border-box;color:var(--dsw-alias-label-primary);display:flex;flex-direction:column;gap:20px;max-width:780px;min-width:0;padding:2px 0 30px}\r\n.dsh-codex-page *{box-sizing:border-box}\r\n.dsh-codex-title{font-size:15px;font-weight:650;line-height:1.4;margin:0 0 5px}\r\n.dsh-codex-intro,.dsh-codex-muted{color:var(--dsw-alias-label-secondary);font-size:13px;line-height:1.55;margin:0}\r\n.dsh-codex-group{border-top:1px solid var(--dsw-alias-border-l2);min-width:0}\r\n.dsh-codex-grouphead{align-items:center;display:flex;gap:12px;justify-content:space-between;min-height:48px}\r\n.dsh-codex-grouphead h3{font-size:14px;font-weight:650;margin:0}\r\n.dsh-codex-row{align-items:center;border-bottom:1px solid var(--dsw-alias-border-l2);display:flex;gap:20px;justify-content:space-between;min-height:44px;padding:8px 0}\r\n.dsh-codex-label{color:var(--dsw-alias-label-secondary);font-size:13px;flex:0 0 auto}\r\n.dsh-codex-value{font-size:13px;min-width:0;overflow-wrap:anywhere;text-align:right}\r\n.dsh-codex-actions{display:flex;flex-wrap:wrap;gap:8px;justify-content:flex-end;padding-top:12px}\r\n.dsh-codex-button{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);border-radius:999px;color:var(--dsw-alias-label-primary);cursor:pointer;font:inherit;font-size:13px;line-height:1;padding:8px 13px;white-space:nowrap}\r\n.dsh-codex-button:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}\r\n.dsh-codex-button:focus-visible,.dsh-codex-link:focus-visible{outline:2px solid var(--dsw-alias-button-info-fill,#397ee8);outline-offset:2px}\r\n.dsh-codex-button:disabled{cursor:default;opacity:.5}\r\n.dsh-codex-button-primary{background:var(--dsw-alias-button-info-fill,#397ee8);border-color:transparent;color:var(--dsw-alias-button-info-label,#fff)}\r\n.dsh-codex-notice{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);border-radius:7px;color:var(--dsw-alias-label-secondary);font-size:12px;line-height:1.55;margin:12px 0 0;padding:10px 12px}\r\n.dsh-codex-error,.dsh-codex-warning,.dsh-codex-success{font-size:12px;line-height:1.5;margin:8px 0 0}\r\n.dsh-codex-error{color:var(--dsw-alias-label-danger,#d94b4b)}\r\n.dsh-codex-warning{color:var(--dsw-alias-label-warning,#c77a18)}\r\n.dsh-codex-success{color:var(--dsw-alias-label-success,#2e9b62)}\r\n.dsh-codex-errorbar{align-items:center;background:color-mix(in srgb,var(--dsw-alias-label-danger,#d94b4b) 9%,transparent);border:1px solid color-mix(in srgb,var(--dsw-alias-label-danger,#d94b4b) 28%,transparent);border-radius:7px;color:var(--dsw-alias-label-danger,#d94b4b);display:flex;font-size:13px;gap:12px;justify-content:space-between;padding:10px 12px}\r\n.dsh-codex-link{color:var(--dsw-alias-label-link,#3278d4);display:inline-block;font-size:13px;margin-top:8px}\r\n.dsh-codex-models{display:flex;flex-wrap:wrap;gap:6px;padding-top:12px}\r\n.dsh-codex-models code{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);border-radius:5px;font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:11px;padding:4px 6px}\r\n.dsh-codex-pref-row{align-items:center;border-bottom:1px solid var(--dsw-alias-border-l2);display:flex;gap:16px;justify-content:space-between;min-height:58px;padding:10px 0}\r\n.dsh-codex-pref-row strong,.dsh-codex-check strong{display:block;font-size:13px;font-weight:600;line-height:1.35}\r\n.dsh-codex-segments{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);border-radius:8px;display:flex;flex:none;gap:2px;padding:2px}\r\n.dsh-codex-segments label{cursor:pointer;display:block}\r\n.dsh-codex-segments input{position:absolute;opacity:0;pointer-events:none}\r\n.dsh-codex-segments span{border-radius:6px;color:var(--dsw-alias-label-secondary);display:block;font-size:12px;line-height:1;padding:7px 10px;white-space:nowrap}\r\n.dsh-codex-segments input:checked+span{background:var(--dsw-alias-bg-base);box-shadow:0 1px 2px rgba(0,0,0,.08);color:var(--dsw-alias-label-primary)}\r\n.dsh-codex-segments input:focus-visible+span{outline:2px solid var(--dsw-alias-button-info-fill,#397ee8);outline-offset:2px}\r\n.dsh-codex-segments input:disabled+span{cursor:default;opacity:.5}\r\n.dsh-codex-select,.dsh-codex-capacity-control input{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);border-radius:7px;color:var(--dsw-alias-label-primary);font:inherit;font-size:12px;padding:7px 9px}\r\n.dsh-codex-select{max-width:210px;min-width:150px}\r\n.dsh-codex-context-settings{border-bottom:1px solid var(--dsw-alias-border-l2);display:grid;gap:10px;padding:12px 0}\r\n.dsh-codex-context-settings>div>strong{font-size:13px;font-weight:600}\r\n.dsh-codex-context-row{align-items:center;display:flex;font-size:12px;gap:14px;justify-content:space-between}\r\n.dsh-codex-capacity-control{align-items:center;display:flex;gap:7px}\r\n.dsh-codex-capacity-control input{font-family:ui-monospace,SFMono-Regular,Consolas,monospace;text-align:right;width:90px}\r\n.dsh-codex-capacity-control input[type=number]{width:110px}\r\n.dsh-codex-capacity-control small{color:var(--dsw-alias-label-tertiary);font-size:11px;width:42px}\r\n.dsh-codex-context-save{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);border-radius:7px;color:var(--dsw-alias-label-primary);cursor:pointer;font:inherit;font-size:12px;line-height:1;padding:8px 10px;white-space:nowrap}\r\n.dsh-codex-context-save:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}\r\n.dsh-codex-context-save:focus-visible{outline:2px solid var(--dsw-alias-button-info-fill,#397ee8);outline-offset:2px}\r\n.dsh-codex-context-save:disabled{cursor:default;opacity:.45}\r\n.dsh-codex-check{align-items:flex-start;border-bottom:1px solid var(--dsw-alias-border-l2);cursor:pointer;display:flex;gap:10px;padding:12px 0}\r\n.dsh-codex-check input{flex:none;margin-top:2px}\r\n.dsh-codex-check small{color:var(--dsw-alias-label-secondary);display:block;font-size:12px;line-height:1.45;margin-top:2px}\r\n.dsh-codex-quota-card{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);border-radius:8px;margin-top:12px;padding:12px}\r\n.dsh-codex-quota-title{align-items:center;display:flex;font-size:13px;gap:8px;justify-content:space-between}\r\n.dsh-codex-quota-title span{color:var(--dsw-alias-label-tertiary);font-size:11px;text-transform:uppercase}\r\n.dsh-codex-quota-fact{align-items:flex-start;border-bottom:1px solid var(--dsw-alias-border-l2);display:flex;font-size:12px;gap:12px;justify-content:space-between;line-height:1.45;padding:10px 0}\r\n.dsh-codex-quota-fact span{color:var(--dsw-alias-label-secondary);flex:none}\r\n.dsh-codex-quota-fact strong{font-weight:600;min-width:0;overflow-wrap:anywhere;text-align:right}\r\n.dsh-codex-reset-credits{align-items:center;border-bottom:1px solid var(--dsw-alias-border-l2);display:flex;gap:16px;justify-content:space-between;padding:10px 0}\r\n.dsh-codex-reset-credits-info{display:grid;font-size:12px;gap:2px;grid-template-columns:auto auto}\r\n.dsh-codex-reset-credits-info>span{color:var(--dsw-alias-label-secondary)}\r\n.dsh-codex-reset-credits-info>strong{font-weight:650;text-align:right}\r\n.dsh-codex-reset-credits-info>small{color:var(--dsw-alias-label-tertiary);font-size:11px;grid-column:1/-1}\r\n.dsh-codex-meter-wrap{margin-top:13px}\r\n.dsh-codex-meter-label,.dsh-codex-meter-meta{display:flex;gap:10px;justify-content:space-between}\r\n.dsh-codex-meter-label{font-size:12px;margin-bottom:6px}\r\n.dsh-codex-meter-meta{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:1.45;margin-top:6px}\r\n.dsh-codex-meter{background:var(--dsw-alias-bg-layer-1,rgba(127,127,127,.15));border-radius:999px;height:7px;overflow:hidden;width:100%}\r\n.dsh-codex-meter>span{background:var(--dsw-alias-button-info-fill,#397ee8);border-radius:inherit;display:block;height:100%;max-width:100%;min-width:0;transition:width .25s ease}\r\n.dsh-codex-meter-warning>span{background:var(--dsw-alias-label-warning,#d58a24)}\r\n.dsh-codex-meter-danger>span{background:var(--dsw-alias-label-danger,#d94b4b)}\r\n.dsh-codex-empty{border:1px dashed var(--dsw-alias-border-l2);border-radius:7px;color:var(--dsw-alias-label-tertiary);font-size:12px;margin:12px 0 0;padding:16px;text-align:center}\r\n.dsh-codex-timestamp{color:var(--dsw-alias-label-tertiary);font-size:11px;margin:10px 0 0;text-align:right}\r\n.dsh-codex-skeleton{display:grid;gap:9px;padding-top:10px}\r\n.dsh-codex-skeleton span{animation:dsh-codex-pulse 1.4s ease-in-out infinite;background:var(--dsw-alias-bg-layer-2);border-radius:5px;height:42px}\r\n.dsh-codex-skeleton span:nth-child(2){animation-delay:.12s}.dsh-codex-skeleton span:nth-child(3){animation-delay:.24s}\r\n.dsh-codex-sr{height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;clip:rect(0 0 0 0);white-space:nowrap}\r\n.dsh-codex-composer-quota{align-items:center;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);border-radius:999px;color:var(--dsw-alias-label-secondary);display:inline-flex;font-size:11px;gap:6px;height:28px;line-height:1;max-width:160px;padding:0 9px;white-space:nowrap}\r\n.dsh-codex-composer-quota strong{color:var(--dsw-alias-label-primary);font-size:11px;font-weight:650}\r\n.dsh-codex-composer-quota[data-level=warning] strong{color:var(--dsw-alias-label-warning,#d58a24)}\r\n.dsh-codex-composer-quota[data-level=danger] strong{color:var(--dsw-alias-label-danger,#d94b4b)}\r\n.dsh-codex-image-tool{border:1px solid var(--dsw-alias-border-l2);border-radius:8px;display:flex;flex-direction:column;gap:8px;margin:4px 0 4px 4px;max-width:520px;padding:10px 12px}\r\n.dsh-codex-image-tool-head{align-items:center;display:flex;font-size:13px;gap:8px;min-width:0}\r\n.dsh-codex-image-dot{background:var(--dsw-alias-button-info-fill,#397ee8);border-radius:50%;display:inline-block;flex:none;height:8px;width:8px}\r\n.dsh-codex-image-tool[data-state=error] .dsh-codex-image-dot{background:var(--dsw-alias-label-danger,#d94b4b)}\r\n.dsh-codex-image-title{font-weight:600}\r\n.dsh-codex-image-summary{color:var(--dsw-alias-label-tertiary);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\r\n.dsh-codex-image-grid{display:flex;flex-wrap:wrap;gap:8px}\r\n.dsh-codex-image-preview{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);border-radius:8px;display:block;max-height:260px;max-width:min(100%,360px);object-fit:contain}\r\n.dsh-codex-image-loading,.dsh-codex-image-failed{border:1px dashed var(--dsw-alias-border-l2);border-radius:8px;color:var(--dsw-alias-label-tertiary);display:inline-flex;font-size:12px;line-height:1.4;padding:18px 20px}\r\n.dsh-codex-image-failed{color:var(--dsw-alias-label-danger,#d94b4b)}\r\n@keyframes dsh-codex-pulse{0%,100%{opacity:.55}50%{opacity:1}}\r\n@media(max-width:560px){.dsh-codex-row,.dsh-codex-pref-row,.dsh-codex-quota-fact,.dsh-codex-reset-credits{align-items:flex-start;flex-direction:column;gap:3px}.dsh-codex-value,.dsh-codex-quota-fact strong{text-align:left}.dsh-codex-actions{justify-content:flex-start}.dsh-codex-grouphead{align-items:flex-start;flex-direction:column;gap:0;padding:12px 0}.dsh-codex-meter-meta{align-items:flex-start;flex-direction:column;gap:2px}.dsh-codex-errorbar{align-items:flex-start;flex-direction:column}.dsh-codex-segments{width:100%}.dsh-codex-select{max-width:none;width:100%}.dsh-codex-context-row{align-items:flex-start;flex-direction:column;gap:5px}.dsh-codex-segments label{flex:1}.dsh-codex-segments span{text-align:center}.dsh-codex-image-tool{max-width:100%;margin-left:0}}\r\n@media(prefers-reduced-motion:reduce){.dsh-codex-meter>span{transition:none}.dsh-codex-skeleton span{animation:none}}\r\n`\r\n\r\nexport function installStyles(): () => void {\r\n if (document.querySelector(`style[data-plugin-css=\"${STYLE_ID}\"]`) !== null) return () => undefined\r\n const element = document.createElement('style')\r\n element.dataset.plugin = '@eddyskywalker/dsh-chatgpt-subscription'\r\n element.dataset.pluginCss = STYLE_ID\r\n element.textContent = CSS\r\n document.head.appendChild(element)\r\n return () => element.remove()\r\n}\r\n","import type { ClientContext } from '@deepseek-ai/dsh-client-runtime/client'\nimport type { ImageAttachmentRef } from '@deepseek-ai/dsh-attachment'\nimport type {} from '@deepseek-ai/dsh-client-ui-settings/client'\nimport type {} from '@deepseek-ai/dsh-client-locale/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-slots'\nimport type {} from '@deepseek-ai/dsh-client-ui-model-selection/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-conversation/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-tool/client'\nimport { CODEX_IMAGE_TOOL_NAME } from '../compat.ts'\nimport { CodexComposerQuota } from './CodexComposerQuota.tsx'\nimport { CodexImageToolView, type ImageLoader } from './CodexImageToolView.tsx'\nimport { CodexSubscriptionSection } from './CodexSubscriptionSection.tsx'\nimport { SubagentSettingsSection } from './SubagentSettingsSection.tsx'\nimport { SubscriptionApi } from './api.ts'\nimport { dictionaries, NS, type LocaleKey } from './locales.ts'\nimport { installStyles } from './styles.ts'\n\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\n interface LocaleNamespaceMap {\n 'dsh-chatgpt-subscription': LocaleKey\n }\n}\n\nexport const inject = ['slots', 'locale', 'modelDirectories', 'conversation']\n\nexport function apply(ctx: ClientContext): void {\n ctx.effect(() => ctx.locale.register(NS, dictionaries), 'dsh-chatgpt-subscription: dictionaries')\n ctx.effect(() => installStyles(), 'dsh-chatgpt-subscription: styles')\n const t = ctx.locale.bind(NS)\n ctx.slots.inject('settings.section', () => ctx.slots.register({\n name: 'settings.section',\n id: 'subagents',\n order: 30,\n label: () => t('subagentSettingsNav'),\n locale: NS,\n }, SubagentSettingsSection))\n ctx.slots.inject('settings.section', () => ctx.slots.register({\n name: 'settings.section',\n id: 'codex-subscription',\n order: 45,\n label: () => t('title'),\n locale: NS,\n }, CodexSubscriptionSection))\n ctx.slots.inject('conversation.input.right', () => ctx.slots.register({\n name: 'conversation.input.right',\n id: 'codex-subscription-quota',\n order: 35,\n locale: NS,\n inject: (sessionId) => {\n const directory = ctx.modelDirectories.directoryFor(sessionId)\n return {\n api: new SubscriptionApi(),\n directory: directory.store,\n loadModelDirectory: () => {\n void directory.load().catch(() => undefined)\n },\n }\n },\n }, CodexComposerQuota))\n ctx.slots.inject('tool.call.toolview', () => ctx.slots.register({\n name: 'tool.call.toolview',\n key: CODEX_IMAGE_TOOL_NAME,\n locale: NS,\n inject: (sessionId) => ({\n loadImage: imageLoader(ctx, sessionId),\n }),\n }, CodexImageToolView))\n}\n\nfunction imageLoader(ctx: ClientContext, sessionId: string): ImageLoader {\n const conversation = ctx.conversation as unknown as {\n resolveImage(sessionId: string, attachment: ImageAttachmentRef): Promise<string>\n }\n return (attachment) => conversation.resolveImage(sessionId, attachment)\n}\n"],"mappings":"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"}
package/lib/index.js CHANGED
@@ -33,6 +33,8 @@ const CODEX_RESPONSES_URL = `${CODEX_API_BASE}/responses`;
33
33
  const CODEX_IMAGE_GENERATION_URL = `${CODEX_API_BASE}/images/generations`;
34
34
  const CODEX_SEARCH_URL = `${CODEX_API_BASE}/alpha/search`;
35
35
  const CODEX_USAGE_URL = "https://chatgpt.com/backend-api/wham/usage";
36
+ const CODEX_RESET_CREDITS_URL = "https://chatgpt.com/backend-api/wham/rate-limit-reset-credits";
37
+ const CODEX_RESET_CREDITS_CONSUME_URL = `${CODEX_RESET_CREDITS_URL}/consume`;
36
38
  const CODEX_ORIGINATOR = "opencode";
37
39
  const CODEX_IMAGE_TOOL_NAME = "codex_image_generate";
38
40
  const CODEX_IMAGE_MODEL = "gpt-image-2";
@@ -1914,6 +1916,7 @@ var UsageService = class {
1914
1916
  blockedUntil = 0;
1915
1917
  invalidated = false;
1916
1918
  inFlight = null;
1919
+ resetConsumeInFlight = null;
1917
1920
  constructor(oauth, options = {}) {
1918
1921
  this.oauth = oauth;
1919
1922
  this.fetchFn = options.fetchFn ?? fetch;
@@ -1958,6 +1961,89 @@ var UsageService = class {
1958
1961
  this.blockedUntil = 0;
1959
1962
  this.invalidated = false;
1960
1963
  }
1964
+ async consumeResetCredit() {
1965
+ if (this.resetConsumeInFlight !== null) return this.resetConsumeInFlight;
1966
+ this.resetConsumeInFlight = this.consumeResetCreditUpstream().finally(() => {
1967
+ this.resetConsumeInFlight = null;
1968
+ });
1969
+ return this.resetConsumeInFlight;
1970
+ }
1971
+ async consumeResetCreditUpstream() {
1972
+ let credentials;
1973
+ try {
1974
+ credentials = await this.oauth.credentials();
1975
+ let creditsResponse = await this.fetchResetCredits(credentials);
1976
+ if (creditsResponse.status === 401) {
1977
+ await creditsResponse.body?.cancel().catch(() => void 0);
1978
+ credentials = await this.oauth.credentials(true);
1979
+ creditsResponse = await this.fetchResetCredits(credentials);
1980
+ }
1981
+ if (!creditsResponse.ok) {
1982
+ const status = creditsResponse.status;
1983
+ await creditsResponse.body?.cancel().catch(() => void 0);
1984
+ throw new UsageServiceError({
1985
+ code: status === 429 ? "rate-limited" : "quota-failed",
1986
+ message: status === 429 ? "Reset credit request was rate limited." : `Reset credit request failed (${status}).`
1987
+ });
1988
+ }
1989
+ const creditId = parseResetCredits(await creditsResponse.json()).availableCreditIds[0];
1990
+ if (creditId === void 0) throw new UsageServiceError({
1991
+ code: "bad-request",
1992
+ message: "No reset credits are currently available."
1993
+ });
1994
+ const redeemRequestId = randomUUID();
1995
+ let consumeResponse = await this.fetchFn(CODEX_RESET_CREDITS_CONSUME_URL, {
1996
+ method: "POST",
1997
+ headers: {
1998
+ ...codexHeaders(credentials),
1999
+ accept: "application/json",
2000
+ "content-type": "application/json"
2001
+ },
2002
+ body: JSON.stringify({
2003
+ credit_id: creditId,
2004
+ redeem_request_id: redeemRequestId
2005
+ })
2006
+ });
2007
+ if (consumeResponse.status === 401) {
2008
+ await consumeResponse.body?.cancel().catch(() => void 0);
2009
+ credentials = await this.oauth.credentials(true);
2010
+ consumeResponse = await this.fetchFn(CODEX_RESET_CREDITS_CONSUME_URL, {
2011
+ method: "POST",
2012
+ headers: {
2013
+ ...codexHeaders(credentials),
2014
+ accept: "application/json",
2015
+ "content-type": "application/json"
2016
+ },
2017
+ body: JSON.stringify({
2018
+ credit_id: creditId,
2019
+ redeem_request_id: redeemRequestId
2020
+ })
2021
+ });
2022
+ }
2023
+ if (!consumeResponse.ok) {
2024
+ const status = consumeResponse.status;
2025
+ await consumeResponse.body?.cancel().catch(() => void 0);
2026
+ throw new UsageServiceError({
2027
+ code: status === 429 ? "rate-limited" : "quota-failed",
2028
+ message: status === 429 ? "Using the reset credit was rate limited." : `Using the reset credit failed (${status}).`
2029
+ });
2030
+ }
2031
+ await consumeResponse.body?.cancel().catch(() => void 0);
2032
+ this.clear();
2033
+ const refreshed = await this.refreshUpstream(credentials, identityKey(credentials));
2034
+ if (refreshed.error !== void 0) throw new UsageServiceError({
2035
+ code: "quota-failed",
2036
+ message: "The reset credit was used, but usage could not be refreshed."
2037
+ });
2038
+ return refreshed;
2039
+ } catch (error) {
2040
+ if (error instanceof UsageServiceError) throw error;
2041
+ throw new UsageServiceError({
2042
+ code: "quota-failed",
2043
+ message: "The reset credit could not be used."
2044
+ });
2045
+ }
2046
+ }
1961
2047
  async testConnection() {
1962
2048
  const started = this.now();
1963
2049
  const result = await this.status(true, true);
@@ -2000,6 +2086,16 @@ var UsageService = class {
2000
2086
  });
2001
2087
  }
2002
2088
  const usage = parseCodexUsage(await response.json());
2089
+ if ((usage.resetCredits?.availableCount ?? 0) > 0) {
2090
+ const resetResponse = await this.fetchResetCredits(credentials).catch(() => null);
2091
+ if (resetResponse?.ok === true) {
2092
+ const reset = parseResetCredits(await resetResponse.json());
2093
+ usage.resetCredits = {
2094
+ availableCount: reset.availableCount,
2095
+ expiresAt: reset.expiresAt
2096
+ };
2097
+ } else await resetResponse?.body?.cancel().catch(() => void 0);
2098
+ }
2003
2099
  this.cache = {
2004
2100
  usage,
2005
2101
  fetchedAt: this.now(),
@@ -2021,6 +2117,12 @@ var UsageService = class {
2021
2117
  accept: "application/json"
2022
2118
  } });
2023
2119
  }
2120
+ fetchResetCredits(credentials) {
2121
+ return this.fetchFn(CODEX_RESET_CREDITS_URL, { headers: {
2122
+ ...codexHeaders(credentials),
2123
+ accept: "application/json"
2124
+ } });
2125
+ }
2024
2126
  fromCache(stale, error) {
2025
2127
  if (this.cache === null) return {
2026
2128
  state: error ? "error" : "empty",
@@ -2136,7 +2238,35 @@ function mapResetCredits(value) {
2136
2238
  if (data === null) return null;
2137
2239
  const available = numeric(data.available_count);
2138
2240
  if (available === void 0) return null;
2139
- return { availableCount: Math.max(0, Math.floor(available)) };
2241
+ return {
2242
+ availableCount: Math.max(0, Math.floor(available)),
2243
+ expiresAt: null
2244
+ };
2245
+ }
2246
+ function parseResetCredits(value) {
2247
+ const data = record(value);
2248
+ if (data === null) return {
2249
+ availableCount: 0,
2250
+ expiresAt: null,
2251
+ availableCreditIds: []
2252
+ };
2253
+ const available = (Array.isArray(data.credits) ? data.credits : []).map(record).filter((credit) => credit !== null && credit.status === "available").map((credit) => ({
2254
+ id: text(credit.id),
2255
+ expiresAt: timestamp(credit.expires_at)
2256
+ })).filter((credit) => credit.id !== null).sort((left, right) => (left.expiresAt ?? Number.MAX_SAFE_INTEGER) - (right.expiresAt ?? Number.MAX_SAFE_INTEGER));
2257
+ const reported = numeric(data.available_count);
2258
+ return {
2259
+ availableCount: reported === void 0 ? available.length : Math.max(0, Math.floor(reported)),
2260
+ expiresAt: available.map((credit) => credit.expiresAt).find((expiresAt) => expiresAt !== null) ?? null,
2261
+ availableCreditIds: available.map((credit) => credit.id)
2262
+ };
2263
+ }
2264
+ function timestamp(value) {
2265
+ const numericValue = numeric(value);
2266
+ if (numericValue !== void 0 && numericValue > 0) return numericValue > 1e10 ? Math.floor(numericValue / 1e3) : Math.floor(numericValue);
2267
+ if (typeof value !== "string") return null;
2268
+ const parsed = Date.parse(value);
2269
+ return Number.isFinite(parsed) ? Math.floor(parsed / 1e3) : null;
2140
2270
  }
2141
2271
  function record(value) {
2142
2272
  return typeof value === "object" && value !== null && !Array.isArray(value) ? value : null;
@@ -2327,6 +2457,13 @@ function registerRoutes(ctx, oauth, usage, preferences) {
2327
2457
  value: await usage.status(true, true)
2328
2458
  });
2329
2459
  return;
2460
+ case `${ROUTE_PREFIX}/quota/reset-credit/use`:
2461
+ if (!(await oauth.status()).authenticated) throw new Error("not authenticated");
2462
+ json(response, {
2463
+ ok: true,
2464
+ value: await usage.consumeResetCredit()
2465
+ });
2466
+ return;
2330
2467
  case `${ROUTE_PREFIX}/connection/test`:
2331
2468
  json(response, {
2332
2469
  ok: true,
@@ -1,11 +1,18 @@
1
1
  import type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots';
2
- import type { CredentialStorageDto, QuotaWindowDto } from '../shared/contracts.ts';
2
+ import type { CredentialStorageDto, PluginStatusDto, QuotaWindowDto } from '../shared/contracts.ts';
3
3
  import { NS } from './locales.ts';
4
4
  type Props = PropsRuntime<'settings.section'> & PropsLocale<typeof NS>;
5
+ type BusyAction = 'login' | 'token' | 'quota' | 'reset-credit' | 'test' | 'logout' | 'preferences' | null;
5
6
  type Translate = Props['t'];
6
7
  export declare function CodexSubscriptionSection({ t }: Props): React.JSX.Element;
7
8
  export declare function storageLabel(storage: CredentialStorageDto | undefined, t: Translate): string;
8
9
  export declare function storageNotice(storage: CredentialStorageDto | undefined, t: Translate): string;
10
+ export declare function ResetCreditsFact({ resetCredits, busy, onUse, t }: {
11
+ resetCredits: NonNullable<PluginStatusDto['quota']['resetCredits']>;
12
+ busy: BusyAction;
13
+ onUse: () => Promise<void>;
14
+ t: Translate;
15
+ }): React.JSX.Element;
9
16
  export declare function QuotaBar({ label, window, t }: {
10
17
  label: string;
11
18
  window: QuotaWindowDto;
@@ -1 +1 @@
1
- {"version":3,"file":"CodexSubscriptionSection.d.ts","sourceRoot":"","sources":["../../../src/client/CodexSubscriptionSection.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAA;AACjF,OAAO,KAAK,EAAE,oBAAoB,EAAmC,cAAc,EAAoC,MAAM,wBAAwB,CAAA;AAGrJ,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAA;AAGjC,KAAK,KAAK,GAAG,YAAY,CAAC,kBAAkB,CAAC,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC,CAAA;AAEtE,KAAK,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAA;AAE3B,wBAAgB,wBAAwB,CAAC,EAAE,CAAC,EAAE,EAAE,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAgRxE;AAiBD,wBAAgB,YAAY,CAAC,OAAO,EAAE,oBAAoB,GAAG,SAAS,EAAE,CAAC,EAAE,SAAS,GAAG,MAAM,CAO5F;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,SAAS,EAAE,CAAC,EAAE,SAAS,GAAG,MAAM,CAO7F;AAcD,wBAAgB,QAAQ,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,cAAc,CAAC;IAAC,CAAC,EAAE,SAAS,CAAA;CAAE,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAczH;AAMD,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,EAAE,CAAC,EAAE,SAAS,GAAG,MAAM,CAQxE;AAcD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOlE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG1D;AA0BD,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAUnD"}
1
+ {"version":3,"file":"CodexSubscriptionSection.d.ts","sourceRoot":"","sources":["../../../src/client/CodexSubscriptionSection.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAA;AACjF,OAAO,KAAK,EAAE,oBAAoB,EAAE,eAAe,EAAkB,cAAc,EAAoC,MAAM,wBAAwB,CAAA;AAGrJ,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAA;AAGjC,KAAK,KAAK,GAAG,YAAY,CAAC,kBAAkB,CAAC,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC,CAAA;AACtE,KAAK,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,cAAc,GAAG,MAAM,GAAG,QAAQ,GAAG,aAAa,GAAG,IAAI,CAAA;AACzG,KAAK,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAA;AAE3B,wBAAgB,wBAAwB,CAAC,EAAE,CAAC,EAAE,EAAE,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CA4RxE;AAiBD,wBAAgB,YAAY,CAAC,OAAO,EAAE,oBAAoB,GAAG,SAAS,EAAE,CAAC,EAAE,SAAS,GAAG,MAAM,CAO5F;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,SAAS,EAAE,CAAC,EAAE,SAAS,GAAG,MAAM,CAO7F;AAcD,wBAAgB,gBAAgB,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAAE,YAAY,EAAE,WAAW,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;IAAC,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAAC,CAAC,EAAE,SAAS,CAAA;CAAE,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAUzN;AAED,wBAAgB,QAAQ,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,cAAc,CAAC;IAAC,CAAC,EAAE,SAAS,CAAA;CAAE,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAczH;AAMD,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,EAAE,CAAC,EAAE,SAAS,GAAG,MAAM,CAQxE;AAcD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOlE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG1D;AA0BD,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAUnD"}
@@ -11,6 +11,7 @@ export declare class SubscriptionApi {
11
11
  }>;
12
12
  refresh(): Promise<PluginStatusDto>;
13
13
  refreshQuota(): Promise<QuotaStatusDto>;
14
+ useResetCredit(): Promise<QuotaStatusDto>;
14
15
  testConnection(): Promise<ConnectionTestDto>;
15
16
  updatePreferences(patch: SubscriptionPreferencesUpdateDto): Promise<SubscriptionPreferencesDto>;
16
17
  events(loginId: string): EventSource;
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/client/api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,aAAa,EACb,aAAa,EACb,eAAe,EACf,cAAc,EACd,uBAAuB,EACvB,iBAAiB,EACjB,0BAA0B,EAC1B,gCAAgC,EACjC,MAAM,wBAAwB,CAAA;AAE/B,qBAAa,eAAe;IAC1B,MAAM,IAAI,OAAO,CAAC,eAAe,CAAC;IAIlC,MAAM,IAAI,OAAO,CAAC,uBAAuB,CAAC;IAI1C,UAAU,IAAI,OAAO,CAAC,aAAa,CAAC;IAIpC,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC;IAI7D,MAAM,IAAI,OAAO,CAAC;QAAE,aAAa,EAAE,KAAK,CAAA;KAAE,CAAC;IAI3C,OAAO,IAAI,OAAO,CAAC,eAAe,CAAC;IAInC,YAAY,IAAI,OAAO,CAAC,cAAc,CAAC;IAIvC,cAAc,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAI5C,iBAAiB,CAAC,KAAK,EAAE,gCAAgC,GAAG,OAAO,CAAC,0BAA0B,CAAC;IAI/F,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW;CAGrC;AAmBD,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC,GAAG,aAAa,GAAG,IAAI,CAOjF"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/client/api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,aAAa,EACb,aAAa,EACb,eAAe,EACf,cAAc,EACd,uBAAuB,EACvB,iBAAiB,EACjB,0BAA0B,EAC1B,gCAAgC,EACjC,MAAM,wBAAwB,CAAA;AAE/B,qBAAa,eAAe;IAC1B,MAAM,IAAI,OAAO,CAAC,eAAe,CAAC;IAIlC,MAAM,IAAI,OAAO,CAAC,uBAAuB,CAAC;IAI1C,UAAU,IAAI,OAAO,CAAC,aAAa,CAAC;IAIpC,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC;IAI7D,MAAM,IAAI,OAAO,CAAC;QAAE,aAAa,EAAE,KAAK,CAAA;KAAE,CAAC;IAI3C,OAAO,IAAI,OAAO,CAAC,eAAe,CAAC;IAInC,YAAY,IAAI,OAAO,CAAC,cAAc,CAAC;IAIvC,cAAc,IAAI,OAAO,CAAC,cAAc,CAAC;IAIzC,cAAc,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAI5C,iBAAiB,CAAC,KAAK,EAAE,gCAAgC,GAAG,OAAO,CAAC,0BAA0B,CAAC;IAI/F,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW;CAGrC;AAmBD,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC,GAAG,aAAa,GAAG,IAAI,CAOjF"}
@@ -97,6 +97,11 @@ export declare const zh: {
97
97
  readonly credits: "Credits";
98
98
  readonly monthlySpend: "月度消费控制";
99
99
  readonly resetCredits: "重置次数";
100
+ readonly resetCreditExpires: "到期时间";
101
+ readonly useResetCredit: "使用重置卡";
102
+ readonly usingResetCredit: "使用中…";
103
+ readonly useResetCreditConfirm: "使用后会立即消耗 1 次重置机会,并重置符合条件的 Codex 额度窗口。确定继续吗?";
104
+ readonly resetCreditUsed: "重置卡已使用,用量数据已刷新。";
100
105
  readonly spendControlReached: "已触发月度消费控制,新的订阅调用可能被限制。";
101
106
  readonly limit: "上限";
102
107
  readonly exhausted: "额度已用尽";
@@ -217,6 +222,11 @@ export declare const dictionaries: {
217
222
  readonly credits: "Credits";
218
223
  readonly monthlySpend: "月度消费控制";
219
224
  readonly resetCredits: "重置次数";
225
+ readonly resetCreditExpires: "到期时间";
226
+ readonly useResetCredit: "使用重置卡";
227
+ readonly usingResetCredit: "使用中…";
228
+ readonly useResetCreditConfirm: "使用后会立即消耗 1 次重置机会,并重置符合条件的 Codex 额度窗口。确定继续吗?";
229
+ readonly resetCreditUsed: "重置卡已使用,用量数据已刷新。";
220
230
  readonly spendControlReached: "已触发月度消费控制,新的订阅调用可能被限制。";
221
231
  readonly limit: "上限";
222
232
  readonly exhausted: "额度已用尽";
@@ -236,6 +246,6 @@ export declare const dictionaries: {
236
246
  readonly retry: "重试";
237
247
  readonly unknown: "未知";
238
248
  };
239
- en: Record<"tokens" | "title" | "intro" | "account" | "signedOut" | "signedIn" | "plan" | "accountId" | "expires" | "storage" | "storageWindows" | "storageMacKeychain" | "storageLinuxFile" | "storageMemory" | "storageUnavailable" | "securityWindows" | "securityMacKeychain" | "securityLinuxFile" | "securityMemory" | "securityUnavailable" | "signIn" | "signInAgain" | "cancel" | "signOut" | "refreshToken" | "pending" | "popupBlocked" | "continueLogin" | "loading" | "connection" | "provider" | "connectionState" | "connected" | "untested" | "testConnection" | "testing" | "latency" | "models" | "enhancements" | "subagentSettingsNav" | "subagentSettingsTitle" | "subagentSettingsIntro" | "subagentModelGroup" | "subagentLimitsGroup" | "subagentMaxDepth" | "subagentMaxDepthHint" | "subagentMaxAgents" | "subagentMaxAgentsHint" | "subagentLimitsNotice" | "levels" | "agents" | "searchProvider" | "searchProviderHint" | "searchProviderDsh" | "searchProviderCodex" | "subagentProvider" | "subagentProviderHint" | "subagentModel" | "subagentModelHint" | "subagentReasoningEffort" | "subagentReasoningEffortHint" | "providerDefault" | "effectiveContextWindow" | "selectedModelContextHint" | "reasoningNone" | "reasoningLow" | "reasoningMedium" | "reasoningHigh" | "reasoningXhigh" | "reasoningMax" | "contextWindows" | "contextWindowsHint" | "contextWindow" | "contextWindowInvalid" | "saveContextWindow" | "save" | "quickQuota" | "quickQuotaHint" | "quota" | "quotaIntro" | "refreshQuota" | "refreshing" | "noQuota" | "quotaSignedOut" | "stale" | "updated" | "primary" | "secondary" | "limitWindow" | "used" | "remaining" | "available" | "unavailable" | "unlimited" | "credits" | "monthlySpend" | "resetCredits" | "spendControlReached" | "limit" | "exhausted" | "resets" | "quickQuotaLabel" | "quickQuotaLoading" | "imageToolRunning" | "imageToolDone" | "imageToolFailed" | "image" | "openImage" | "openNamedImage" | "imageLoading" | "imageLoadFailed" | "imagePreviewClose" | "imagePreviewOpenOriginal" | "retry" | "unknown", string>;
249
+ en: Record<"quota" | "account" | "storage" | "stale" | "pending" | "tokens" | "title" | "intro" | "signedOut" | "signedIn" | "plan" | "accountId" | "expires" | "storageWindows" | "storageMacKeychain" | "storageLinuxFile" | "storageMemory" | "storageUnavailable" | "securityWindows" | "securityMacKeychain" | "securityLinuxFile" | "securityMemory" | "securityUnavailable" | "signIn" | "signInAgain" | "cancel" | "signOut" | "refreshToken" | "popupBlocked" | "continueLogin" | "loading" | "connection" | "provider" | "connectionState" | "connected" | "untested" | "testConnection" | "testing" | "latency" | "models" | "enhancements" | "subagentSettingsNav" | "subagentSettingsTitle" | "subagentSettingsIntro" | "subagentModelGroup" | "subagentLimitsGroup" | "subagentMaxDepth" | "subagentMaxDepthHint" | "subagentMaxAgents" | "subagentMaxAgentsHint" | "subagentLimitsNotice" | "levels" | "agents" | "searchProvider" | "searchProviderHint" | "searchProviderDsh" | "searchProviderCodex" | "subagentProvider" | "subagentProviderHint" | "subagentModel" | "subagentModelHint" | "subagentReasoningEffort" | "subagentReasoningEffortHint" | "providerDefault" | "effectiveContextWindow" | "selectedModelContextHint" | "reasoningNone" | "reasoningLow" | "reasoningMedium" | "reasoningHigh" | "reasoningXhigh" | "reasoningMax" | "contextWindows" | "contextWindowsHint" | "contextWindow" | "contextWindowInvalid" | "saveContextWindow" | "save" | "quickQuota" | "quickQuotaHint" | "quotaIntro" | "refreshQuota" | "refreshing" | "noQuota" | "quotaSignedOut" | "updated" | "primary" | "secondary" | "limitWindow" | "used" | "remaining" | "available" | "unavailable" | "unlimited" | "credits" | "monthlySpend" | "resetCredits" | "resetCreditExpires" | "useResetCredit" | "usingResetCredit" | "useResetCreditConfirm" | "resetCreditUsed" | "spendControlReached" | "limit" | "exhausted" | "resets" | "quickQuotaLabel" | "quickQuotaLoading" | "imageToolRunning" | "imageToolDone" | "imageToolFailed" | "image" | "openImage" | "openNamedImage" | "imageLoading" | "imageLoadFailed" | "imagePreviewClose" | "imagePreviewOpenOriginal" | "retry" | "unknown", string>;
240
250
  };
241
251
  //# sourceMappingURL=locales.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"locales.d.ts","sourceRoot":"","sources":["../../../src/client/locales.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,EAAE,EAAG,0BAAmC,CAAA;AAErD,eAAO,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoHL,CAAA;AAEV,eAAO,MAAM,EAAE,EAAE,MAAM,CAAC,MAAM,OAAO,EAAE,EAAE,MAAM,CAoH9C,CAAA;AAED,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,EAAE,CAAA;AACvC,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAa,CAAA"}
1
+ {"version":3,"file":"locales.d.ts","sourceRoot":"","sources":["../../../src/client/locales.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,EAAE,EAAG,0BAAmC,CAAA;AAErD,eAAO,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyHL,CAAA;AAEV,eAAO,MAAM,EAAE,EAAE,MAAM,CAAC,MAAM,OAAO,EAAE,EAAE,MAAM,CAyH9C,CAAA;AAED,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,EAAE,CAAA;AACvC,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAa,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../src/client/styles.ts"],"names":[],"mappings":"AA2FA,wBAAgB,aAAa,IAAI,MAAM,IAAI,CAQ1C"}
1
+ {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../src/client/styles.ts"],"names":[],"mappings":"AAiGA,wBAAgB,aAAa,IAAI,MAAM,IAAI,CAQ1C"}
@@ -21,6 +21,8 @@ export declare const CODEX_RESPONSES_URL: "https://chatgpt.com/backend-api/codex
21
21
  export declare const CODEX_IMAGE_GENERATION_URL: "https://chatgpt.com/backend-api/codex/images/generations";
22
22
  export declare const CODEX_SEARCH_URL: "https://chatgpt.com/backend-api/codex/alpha/search";
23
23
  export declare const CODEX_USAGE_URL: "https://chatgpt.com/backend-api/wham/usage";
24
+ export declare const CODEX_RESET_CREDITS_URL: "https://chatgpt.com/backend-api/wham/rate-limit-reset-credits";
25
+ export declare const CODEX_RESET_CREDITS_CONSUME_URL: "https://chatgpt.com/backend-api/wham/rate-limit-reset-credits/consume";
24
26
  export declare const CODEX_ORIGINATOR: "opencode";
25
27
  export declare const CODEX_ENHANCED_ORIGINATOR: "pi";
26
28
  export declare const CODEX_IMAGE_TOOL_NAME: "codex_image_generate";
@@ -1 +1 @@
1
- {"version":3,"file":"compat.d.ts","sourceRoot":"","sources":["../../src/compat.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,EAAG,yBAAkC,CAAA;AACtE,eAAO,MAAM,uBAAuB,EAAG,8BAAuC,CAAA;AAC9E,eAAO,MAAM,mBAAmB,EAAG,WAAoB,CAAA;AACvD,eAAO,MAAM,mBAAmB,EAAG,IAAa,CAAA;AAChD,eAAO,MAAM,mBAAmB,EAAG,gBAAyB,CAAA;AAC5D,eAAO,MAAM,kBAAkB,uCAAwF,CAAA;AACvH,eAAO,MAAM,WAAW,EAAG,qCAA8C,CAAA;AACzE,eAAO,MAAM,gBAAgB,EAAG,UAAmB,CAAA;AACnD,eAAO,MAAM,sBAAsB,QAAa,CAAA;AAChD,eAAO,MAAM,uBAAuB,QAAS,CAAA;AAC7C,eAAO,MAAM,YAAY,EAAG,+BAAwC,CAAA;AACpE,eAAO,MAAM,cAAc,EAAG,eAAwB,CAAA;AACtD,eAAO,MAAM,yBAAyB,EAAG,eAAwB,CAAA;AAEjE,eAAO,MAAM,cAAc,EAAG,uCAAgD,CAAA;AAC9E,eAAO,MAAM,mBAAmB,mDAAyC,CAAA;AACzE,eAAO,MAAM,0BAA0B,4DAAkD,CAAA;AACzF,eAAO,MAAM,gBAAgB,sDAA4C,CAAA;AACzE,eAAO,MAAM,eAAe,EAAG,4CAAqD,CAAA;AACpF,eAAO,MAAM,gBAAgB,EAAG,UAAmB,CAAA;AACnD,eAAO,MAAM,yBAAyB,EAAG,IAAa,CAAA;AACtD,eAAO,MAAM,qBAAqB,EAAG,sBAA+B,CAAA;AACpE,eAAO,MAAM,iBAAiB,EAAG,aAAsB,CAAA;AACvD,eAAO,MAAM,wBAAwB,EAAG,oBAA6B,CAAA;AACrE,eAAO,MAAM,cAAc,QAAS,CAAA;AACpC,eAAO,MAAM,8BAA8B,QAAS,CAAA;AAEpD,eAAO,MAAM,mBAAmB,2CAAqD,CAAA;AACrF,eAAO,MAAM,eAAe,uCAAiD,CAAA"}
1
+ {"version":3,"file":"compat.d.ts","sourceRoot":"","sources":["../../src/compat.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,EAAG,yBAAkC,CAAA;AACtE,eAAO,MAAM,uBAAuB,EAAG,8BAAuC,CAAA;AAC9E,eAAO,MAAM,mBAAmB,EAAG,WAAoB,CAAA;AACvD,eAAO,MAAM,mBAAmB,EAAG,IAAa,CAAA;AAChD,eAAO,MAAM,mBAAmB,EAAG,gBAAyB,CAAA;AAC5D,eAAO,MAAM,kBAAkB,uCAAwF,CAAA;AACvH,eAAO,MAAM,WAAW,EAAG,qCAA8C,CAAA;AACzE,eAAO,MAAM,gBAAgB,EAAG,UAAmB,CAAA;AACnD,eAAO,MAAM,sBAAsB,QAAa,CAAA;AAChD,eAAO,MAAM,uBAAuB,QAAS,CAAA;AAC7C,eAAO,MAAM,YAAY,EAAG,+BAAwC,CAAA;AACpE,eAAO,MAAM,cAAc,EAAG,eAAwB,CAAA;AACtD,eAAO,MAAM,yBAAyB,EAAG,eAAwB,CAAA;AAEjE,eAAO,MAAM,cAAc,EAAG,uCAAgD,CAAA;AAC9E,eAAO,MAAM,mBAAmB,mDAAyC,CAAA;AACzE,eAAO,MAAM,0BAA0B,4DAAkD,CAAA;AACzF,eAAO,MAAM,gBAAgB,sDAA4C,CAAA;AACzE,eAAO,MAAM,eAAe,EAAG,4CAAqD,CAAA;AACpF,eAAO,MAAM,uBAAuB,EAAG,+DAAwE,CAAA;AAC/G,eAAO,MAAM,+BAA+B,yEAAgD,CAAA;AAC5F,eAAO,MAAM,gBAAgB,EAAG,UAAmB,CAAA;AACnD,eAAO,MAAM,yBAAyB,EAAG,IAAa,CAAA;AACtD,eAAO,MAAM,qBAAqB,EAAG,sBAA+B,CAAA;AACpE,eAAO,MAAM,iBAAiB,EAAG,aAAsB,CAAA;AACvD,eAAO,MAAM,wBAAwB,EAAG,oBAA6B,CAAA;AACrE,eAAO,MAAM,cAAc,QAAS,CAAA;AACpC,eAAO,MAAM,8BAA8B,QAAS,CAAA;AAEpD,eAAO,MAAM,mBAAmB,2CAAqD,CAAA;AACrF,eAAO,MAAM,eAAe,uCAAiD,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../src/host/routes.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAMlD,OAAO,EAAE,YAAY,EAAe,MAAM,oBAAoB,CAAA;AAC9D,OAAO,EAAmB,KAAK,2BAA2B,EAAE,MAAM,kBAAkB,CAAA;AACpF,OAAO,EAAE,YAAY,EAAqB,MAAM,oBAAoB,CAAA;AAKpE,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,2BAA2B,GAAG,MAAM,IAAI,CAmJ3I"}
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../src/host/routes.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAMlD,OAAO,EAAE,YAAY,EAAe,MAAM,oBAAoB,CAAA;AAC9D,OAAO,EAAmB,KAAK,2BAA2B,EAAE,MAAM,kBAAkB,CAAA;AACpF,OAAO,EAAE,YAAY,EAAqB,MAAM,oBAAoB,CAAA;AAKpE,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,2BAA2B,GAAG,MAAM,IAAI,CAyJ3I"}
@@ -14,13 +14,17 @@ export declare class UsageService {
14
14
  private blockedUntil;
15
15
  private invalidated;
16
16
  private inFlight;
17
+ private resetConsumeInFlight;
17
18
  constructor(oauth: OAuthService, options?: UsageServiceOptions);
18
19
  status(authenticated: boolean, force?: boolean): Promise<QuotaStatusDto>;
19
20
  invalidate(): void;
20
21
  clear(): void;
22
+ consumeResetCredit(): Promise<QuotaStatusDto>;
23
+ private consumeResetCreditUpstream;
21
24
  testConnection(): Promise<ConnectionTestDto>;
22
25
  private refreshUpstream;
23
26
  private fetch;
27
+ private fetchResetCredits;
24
28
  private fromCache;
25
29
  private failure;
26
30
  }
@@ -30,5 +34,10 @@ export declare class UsageServiceError extends Error {
30
34
  }
31
35
  export declare function mapCodexUsage(value: unknown): QuotaBucketDto[];
32
36
  export declare function parseCodexUsage(value: unknown): QuotaUsageDto;
37
+ export declare function parseResetCredits(value: unknown): {
38
+ availableCount: number;
39
+ expiresAt: number | null;
40
+ availableCreditIds: string[];
41
+ };
33
42
  export {};
34
43
  //# sourceMappingURL=usage-service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"usage-service.d.ts","sourceRoot":"","sources":["../../../src/host/usage-service.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,aAAa,EACb,cAAc,EAEf,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAIjD,KAAK,SAAS,GAAG,OAAO,KAAK,CAAA;AAgB7B,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,SAAS,CAAA;IACnB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CACnB;AAED,qBAAa,YAAY;IASX,OAAO,CAAC,QAAQ,CAAC,KAAK;IARlC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAW;IACnC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAc;IAClC,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,cAAc,CAAI;IAC1B,OAAO,CAAC,YAAY,CAAI;IACxB,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,QAAQ,CAAuC;gBAE1B,KAAK,EAAE,YAAY,EAAE,OAAO,GAAE,mBAAwB;IAK7E,MAAM,CAAC,aAAa,EAAE,OAAO,EAAE,KAAK,UAAQ,GAAG,OAAO,CAAC,cAAc,CAAC;IA2B5E,UAAU,IAAI,IAAI;IAIlB,KAAK,IAAI,IAAI;IAMP,cAAc,IAAI,OAAO,CAAC,iBAAiB,CAAC;YASpC,eAAe;IAmC7B,OAAO,CAAC,KAAK;IAMb,OAAO,CAAC,SAAS;IAiBjB,OAAO,CAAC,OAAO;CAGhB;AAED,qBAAa,iBAAkB,SAAQ,KAAK;IAC9B,QAAQ,CAAC,WAAW,EAAE,cAAc;gBAA3B,WAAW,EAAE,cAAc;CAGjD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,cAAc,EAAE,CAE9D;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,aAAa,CAwB7D"}
1
+ {"version":3,"file":"usage-service.d.ts","sourceRoot":"","sources":["../../../src/host/usage-service.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,aAAa,EACb,cAAc,EAEf,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAIjD,KAAK,SAAS,GAAG,OAAO,KAAK,CAAA;AAgB7B,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,SAAS,CAAA;IACnB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CACnB;AAED,qBAAa,YAAY;IAUX,OAAO,CAAC,QAAQ,CAAC,KAAK;IATlC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAW;IACnC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAc;IAClC,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,cAAc,CAAI;IAC1B,OAAO,CAAC,YAAY,CAAI;IACxB,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,QAAQ,CAAuC;IACvD,OAAO,CAAC,oBAAoB,CAAuC;gBAEtC,KAAK,EAAE,YAAY,EAAE,OAAO,GAAE,mBAAwB;IAK7E,MAAM,CAAC,aAAa,EAAE,OAAO,EAAE,KAAK,UAAQ,GAAG,OAAO,CAAC,cAAc,CAAC;IA2B5E,UAAU,IAAI,IAAI;IAIlB,KAAK,IAAI,IAAI;IAMP,kBAAkB,IAAI,OAAO,CAAC,cAAc,CAAC;YAQrC,0BAA0B;IA2DlC,cAAc,IAAI,OAAO,CAAC,iBAAiB,CAAC;YASpC,eAAe;IA4C7B,OAAO,CAAC,KAAK;IAMb,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,SAAS;IAiBjB,OAAO,CAAC,OAAO;CAGhB;AAED,qBAAa,iBAAkB,SAAQ,KAAK;IAC9B,QAAQ,CAAC,WAAW,EAAE,cAAc;gBAA3B,WAAW,EAAE,cAAc;CAGjD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,cAAc,EAAE,CAE9D;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,aAAa,CAwB7D;AAuED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,kBAAkB,EAAE,MAAM,EAAE,CAAA;CAAE,CAmBpI"}
@@ -105,6 +105,8 @@ export interface QuotaIndividualLimitDto {
105
105
  }
106
106
  export interface QuotaResetCreditsDto {
107
107
  availableCount: number;
108
+ /** Earliest expiration among currently available reset credits, as Unix seconds. */
109
+ expiresAt: number | null;
108
110
  }
109
111
  export interface QuotaUsageDto {
110
112
  buckets: QuotaBucketDto[];
@@ -1 +1 @@
1
- {"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../../../src/shared/contracts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../../../src/shared/contracts.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eddyskywalker/dsh-chatgpt-subscription",
3
- "version": "0.1.22",
3
+ "version": "0.1.23",
4
4
  "description": "DSH provider plugin for Codex access through a ChatGPT subscription.",
5
5
  "author": {
6
6
  "name": "eddyskywalker",