@linxin666/dsh-usage 0.3.7

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","names":["styles"],"sources":["../../../packages/dsh-usage/src/client/usage-store.ts","../../../packages/dsh-usage/src/client/locales.ts","../../../packages/dsh-usage/src/client/UsageSectionCard.tsx","../../../packages/dsh-usage/src/client/index.ts"],"sourcesContent":["/**\n * Browser-side usage store: the overview snapshot polled from the host plus\n * the fetch lifecycle. Section-local: the store lives while the settings\n * section is mounted, so polling only runs while the page is open.\n * @module @linxin666/dsh-usage/client/usage-store\n */\n\nimport { defineStore } from '@deepseek-ai/dsh-client-store'\nimport type { EngineStoreHandle, EngineStoreInstance } from '@deepseek-ai/dsh-client-store'\nimport type { UsageOverviewView } from '../core/types.ts'\n\n/** Section UI state as consumers see it. */\nexport interface UsageUiState {\n /** Latest host overview; null before the first successful fetch. */\n snapshot: UsageOverviewView | null\n /** Fetch lifecycle. */\n status: 'loading' | 'ready' | 'error'\n /** Transport error message, when any. */\n error: string | null\n}\n\n/** Store write set. */\nexport type UsageUiActions = {\n /** Replace the overview (poll result). */\n setSnapshot: (draft: UsageUiState, snapshot: UsageOverviewView) => void\n /** Mark the fetch lifecycle. */\n setState: (draft: UsageUiState, status: UsageUiState['status'], error: string | null) => void\n}\n\n/** Create the usage store handle (apply world only; never module-level). */\nexport function createUsageStore(): EngineStoreHandle<UsageUiState, UsageUiActions> {\n return defineStore({\n init: (): UsageUiState => ({\n snapshot: null,\n status: 'loading',\n error: null,\n }),\n actions: {\n setSnapshot: (draft, snapshot) => {\n draft.snapshot = snapshot\n draft.status = 'ready'\n draft.error = null\n },\n setState: (draft, status, error) => {\n draft.status = status\n draft.error = error\n },\n },\n })\n}\n\nexport type UsageStoreInstance = EngineStoreInstance<UsageUiState, UsageUiActions>\n","/**\n * dsh-usage locale dictionaries (zh/en). The zh dictionary is the key source;\n * `en` mirrors its full key set (packages/AGENTS.md bilingual discipline).\n * @module @linxin666/dsh-usage/client/locales\n */\n\n/** Dictionary namespace this package registers. */\nexport const NS = 'dsh-web-ui-usage'\n\n/** Chinese copy. */\nexport const zh = {\n 'usage.title': '使用统计',\n 'usage.tab.usage': '用量',\n 'usage.tab.plans': '个人套餐',\n 'usage.refresh': '刷新',\n 'usage.refreshing': '刷新中…',\n 'usage.updated': '更新于 {time}',\n 'usage.loading': '正在加载用量数据…',\n 'usage.error': '加载失败:{error}',\n 'usage.current': '当前',\n 'usage.today': '今日用量',\n 'usage.calls': '{n} 次调用',\n 'usage.tokens.total': '总 tokens',\n 'usage.tokens.input': '输入',\n 'usage.tokens.output': '输出',\n 'usage.tokens.cacheRead': '缓存读',\n 'usage.tokens.cacheWrite': '缓存写',\n 'usage.trend': '近 30 天',\n 'usage.noData': '暂无用量数据(统计自插件启用起)',\n 'usage.balance': '余额',\n 'usage.balance.unsupported': '暂不支持余额查询',\n 'usage.balance.noCredential': '未配置凭据',\n 'usage.oauth': 'OAuth 凭据,不做余额查询',\n 'usage.plan.reset': '{date} 重置',\n 'usage.plan.noPlan': '未检测到套餐数据',\n 'usage.plan.windows.5h': '5 小时',\n 'usage.plan.windows.week': '每周',\n 'usage.plan.windows.month': '每月',\n 'usage.provider.error': '查询失败:{error}',\n 'usage.config.title': '设置',\n 'usage.config.enabled': '启用插件',\n 'usage.config.pollIntervalSec': '轮询间隔(秒)',\n 'usage.config.bubbleMode': '宠物气泡',\n 'usage.config.bubbleMode.always': '常驻显示',\n 'usage.config.bubbleMode.change': '仅变化时',\n 'usage.config.bubbleMode.off': '关闭',\n}\n\n/** English mirror; every zh key present. */\nexport const en: Record<UsageKey, string> = {\n 'usage.title': 'Usage Statistics',\n 'usage.tab.usage': 'Usage',\n 'usage.tab.plans': 'Plans',\n 'usage.refresh': 'Refresh',\n 'usage.refreshing': 'Refreshing…',\n 'usage.updated': 'Updated {time}',\n 'usage.loading': 'Loading usage data…',\n 'usage.error': 'Failed to load: {error}',\n 'usage.current': 'Current',\n 'usage.today': 'Today',\n 'usage.calls': '{n} calls',\n 'usage.tokens.total': 'Total tokens',\n 'usage.tokens.input': 'Input',\n 'usage.tokens.output': 'Output',\n 'usage.tokens.cacheRead': 'Cache read',\n 'usage.tokens.cacheWrite': 'Cache write',\n 'usage.trend': 'Last 30 days',\n 'usage.noData': 'No usage data yet (counting starts when the plugin is enabled)',\n 'usage.balance': 'Balance',\n 'usage.balance.unsupported': 'Balance query not supported',\n 'usage.balance.noCredential': 'No credential configured',\n 'usage.oauth': 'OAuth credential, no balance query',\n 'usage.plan.reset': 'resets {date}',\n 'usage.plan.noPlan': 'No plan data detected',\n 'usage.plan.windows.5h': '5 hours',\n 'usage.plan.windows.week': 'Weekly',\n 'usage.plan.windows.month': 'Monthly',\n 'usage.provider.error': 'Query failed: {error}',\n 'usage.config.title': 'Settings',\n 'usage.config.enabled': 'Enable plugin',\n 'usage.config.pollIntervalSec': 'Poll interval (seconds)',\n 'usage.config.bubbleMode': 'Pet bubble',\n 'usage.config.bubbleMode.always': 'Always visible',\n 'usage.config.bubbleMode.change': 'On change',\n 'usage.config.bubbleMode.off': 'Off',\n}\n\nexport type UsageKey = keyof typeof zh\n\n/**\n * Active dictionary, picked by the document language at call time. The\n * section resolves its copy the same tiny way the pet's DOM-injected surface\n * does (the settings section has no framework locale seat of its own).\n */\nexport function dictionary(): Record<UsageKey, string> {\n const lang = typeof document !== 'undefined' ? document.documentElement.lang : 'zh'\n return lang.toLowerCase().startsWith('en') ? en : zh\n}\n\n/** Translate a key with optional `{name}` template params; missing keys degrade to the key. */\nexport function t(key: string, params?: Record<string, unknown>): string {\n let text: string = (dictionary() as Record<string, string>)[key] ?? key\n if (params !== undefined) {\n for (const [name, value] of Object.entries(params)) {\n text = text.replaceAll(`{${name}}`, String(value))\n }\n }\n return text\n}\n\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\n interface LocaleNamespaceMap {\n /** dsh-usage UI copy. */\n 'dsh-web-ui-usage': UsageKey\n }\n}\n","/**\n * The usage statistics settings section: two tabs (用量: today's usage,\n * balances, trend; 个人套餐: per-provider plan quota windows) plus a compact\n * settings row. Data comes from the host's loopback-fenced\n * /api/dsh-usage/overview document; polling runs only while the section is\n * mounted and the tab is visible.\n * @module @linxin666/dsh-usage/client/UsageSectionCard\n */\n\nimport { useEffect, useMemo, useState, useSyncExternalStore, type ReactNode } from 'react'\nimport type { SettingsScope } from '@deepseek-ai/dsh-client-ui-settings/client'\nimport type { UsageStoreInstance } from './usage-store.ts'\nimport { t } from './locales.ts'\nimport styles from './usage.module.css'\nimport type { ProviderSnapshotView, UsageTokenTotals } from '../core/types.ts'\n\n/** The settings fields this section edits (immediate-apply semantics). */\nexport interface UsageSettings {\n enabled?: boolean\n pollIntervalSec?: number\n bubbleMode?: string\n}\n\n/** The registration-side face the section's slot entry injects. */\nexport interface UsageSectionFace {\n /** The section-local store (overview snapshot + lifecycle). */\n store: UsageStoreInstance\n /** Fetch one overview now. */\n poll: () => void\n /** Force a host probe cycle now (resolves with the fresh overview). */\n refresh: () => void\n /** Whether a forced refresh is in flight (component-local state mirrors it). */\n settings: SettingsScope<UsageSettings>\n}\n\nexport interface UsageSectionProps extends UsageSectionFace {\n /** Close the settings panel (the shell owns the open state). */\n close: () => void\n}\n\n/** Poll cadence while the section is open. */\nconst SECTION_POLL_MS = 10_000\n\n/** Compact token count: 12345 -> 12.3k, 1234567 -> 1.23M. */\nexport function formatTokens(value: number): string {\n if (!Number.isFinite(value) || value <= 0) return '0'\n if (value < 1000) return String(value)\n if (value < 1_000_000) return trim(value / 1000) + 'k'\n if (value < 1_000_000_000) return trim(value / 1_000_000) + 'M'\n return trim(value / 1_000_000_000) + 'B'\n}\n\nfunction trim(value: number): string {\n return value >= 100 ? String(Math.round(value)) : value.toFixed(value >= 10 ? 1 : 2).replace(/\\.?0+$/, '')\n}\n\nfunction formatTime(ms: number): string {\n try {\n return new Date(ms).toLocaleTimeString()\n } catch {\n return ''\n }\n}\n\nfunction toneClass(percent: number): string {\n if (percent >= 90) return styles.barLow\n if (percent >= 70) return styles.barWarn\n return styles.barFill\n}\n\nfunction TotalsRow(props: { totals: UsageTokenTotals }): ReactNode {\n const { totals } = props\n return (\n <div className={styles.statRow}>\n <div className={styles.stat}>\n <span className={styles.statValue}>{formatTokens(totals.inputTokens + totals.cacheReadTokens + totals.cacheWriteTokens + totals.outputTokens)}</span>\n <span className={styles.statLabel}>{t('usage.tokens.total')}</span>\n </div>\n <div className={styles.stat}>\n <span className={styles.statValue}>{formatTokens(totals.inputTokens + totals.cacheReadTokens + totals.cacheWriteTokens)}</span>\n <span className={styles.statLabel}>{t('usage.tokens.input')}</span>\n </div>\n <div className={styles.stat}>\n <span className={styles.statValue}>{formatTokens(totals.outputTokens)}</span>\n <span className={styles.statLabel}>{t('usage.tokens.output')}</span>\n </div>\n <div className={styles.stat}>\n <span className={styles.statValue}>{formatTokens(totals.cacheReadTokens)}</span>\n <span className={styles.statLabel}>{t('usage.tokens.cacheRead')}</span>\n </div>\n <div className={styles.stat}>\n <span className={styles.statValue}>{formatTokens(totals.cacheWriteTokens)}</span>\n <span className={styles.statLabel}>{t('usage.tokens.cacheWrite')}</span>\n </div>\n <div className={styles.stat}>\n <span className={styles.statValue}>{formatTokens(totals.calls)}</span>\n <span className={styles.statLabel}>{t('usage.calls', { n: totals.calls })}</span>\n </div>\n </div>\n )\n}\n\nfunction balanceLine(provider: ProviderSnapshotView): ReactNode {\n if (provider.balance !== undefined) {\n return <span className={styles.providerBalance}>{provider.balance.currency.toUpperCase() === 'CNY' ? '¥' : provider.balance.currency.toUpperCase() === 'USD' ? '$' : ''}{provider.balance.totalBalance}{provider.balance.currency.toUpperCase() !== 'CNY' && provider.balance.currency.toUpperCase() !== 'USD' ? ' ' + provider.balance.currency.toUpperCase() : ''}</span>\n }\n if (provider.credential === 'oauth') return <span className={styles.muted}>{t('usage.oauth')}</span>\n if (provider.credential === 'none') return <span className={styles.muted}>{t('usage.balance.noCredential')}</span>\n if (!provider.supported) return <span className={styles.muted}>{t('usage.balance.unsupported')}</span>\n return null\n}\n\nfunction ProviderRow(props: { provider: ProviderSnapshotView; current?: string }): ReactNode {\n const { provider, current } = props\n return (\n <div className={styles.providerRow} data-dsh-part=\"provider-row\">\n <span className={styles.providerName}>\n {provider.displayName}\n {current === provider.provider && <span className={styles.currentBadge}>{t('usage.current')}</span>}\n </span>\n <span className={styles.providerTokens}>{balanceLine(provider)}</span>\n </div>\n )\n}\n\n/** The section component; the slot merges the face into these props. */\nexport function UsageSectionCard(props: UsageSectionProps): ReactNode {\n const { store, poll, refresh, settings } = props\n const ui = useSyncExternalStore(store.subscribe, store.getSnapshot)\n const settingsSnapshot = settings.getSnapshot()\n const settingsValue = settingsSnapshot.value ?? {}\n const [tab, setTab] = useState<'usage' | 'plans'>('usage')\n const [refreshing, setRefreshing] = useState(false)\n\n // Poll while mounted and visible; the overview is cheap (no probes — the\n // host's own cycle owns those) so 10 s keeps balances fresh-ish between\n // manual refreshes.\n useEffect(() => {\n poll()\n let timer: number | undefined\n const start = (): void => {\n if (timer === undefined && document.visibilityState === 'visible') timer = window.setInterval(poll, SECTION_POLL_MS)\n }\n const onVisibility = (): void => {\n if (document.visibilityState === 'visible') {\n poll()\n start()\n } else if (timer !== undefined) {\n window.clearInterval(timer)\n timer = undefined\n }\n }\n start()\n document.addEventListener('visibilitychange', onVisibility)\n return () => {\n if (timer !== undefined) window.clearInterval(timer)\n document.removeEventListener('visibilitychange', onVisibility)\n }\n }, [poll])\n\n const snapshot = ui.snapshot\n const trendMax = useMemo(() => {\n if (snapshot === null) return 0\n return Math.max(1, ...snapshot.usage.days.map((day) => day.totals.inputTokens + day.totals.outputTokens + day.totals.cacheReadTokens + day.totals.cacheWriteTokens))\n }, [snapshot])\n\n const onRefresh = (): void => {\n setRefreshing(true)\n try {\n refresh()\n } finally {\n // The POST resolves through the next poll tick; unlock shortly either way.\n window.setTimeout(() => setRefreshing(false), 3000)\n }\n }\n\n if (ui.status === 'error') {\n return <div className={styles.section} data-dsh-plugin=\"usage\">{t('usage.error', { error: ui.error ?? '' })}</div>\n }\n if (snapshot === null) {\n return <div className={styles.section} data-dsh-plugin=\"usage\">{t('usage.loading')}</div>\n }\n\n const current = snapshot.current\n const currentProvider = snapshot.providers.find((provider) => provider.provider === current.provider)\n const planProviders = snapshot.providers.filter((provider) => provider.plan !== undefined || (provider.supported && provider.credential !== 'none' && provider.credential !== 'oauth'))\n\n return (\n <div className={styles.section} data-dsh-plugin=\"usage\">\n <div className={styles.header} data-dsh-part=\"header\">\n <span className={styles.currentProvider}>\n {currentProvider !== undefined\n ? `${currentProvider.displayName}${current.model !== undefined && current.model !== '' ? ' · ' + current.model : ''}`\n : t('usage.noData')}\n </span>\n <span style={{ display: 'flex', gap: 8, alignItems: 'center' }}>\n <span className={styles.muted}>{t('usage.updated', { time: formatTime(snapshot.updatedAt) })}</span>\n <button type=\"button\" className={styles.refreshBtn} onClick={onRefresh} disabled={refreshing}>\n {refreshing ? t('usage.refreshing') : t('usage.refresh')}\n </button>\n </span>\n </div>\n\n <div className={styles.tabs} role=\"tablist\" data-dsh-part=\"tabs\">\n <button type=\"button\" role=\"tab\" aria-selected={tab === 'usage'} className={tab === 'usage' ? `${styles.tab} ${styles.tabActive}` : styles.tab} onClick={() => setTab('usage')}>\n {t('usage.tab.usage')}\n </button>\n <button type=\"button\" role=\"tab\" aria-selected={tab === 'plans'} className={tab === 'plans' ? `${styles.tab} ${styles.tabActive}` : styles.tab} onClick={() => setTab('plans')}>\n {t('usage.tab.plans')}\n </button>\n </div>\n\n {tab === 'usage' && (\n <>\n <div className={styles.card} data-dsh-part=\"today-card\">\n <span className={styles.cardTitle}>{t('usage.today')}</span>\n {snapshot.usage.today.totals.calls === 0\n ? <span className={styles.muted}>{t('usage.noData')}</span>\n : <TotalsRow totals={snapshot.usage.today.totals} />}\n {snapshot.usage.today.providers.length > 0 && (\n <div data-dsh-part=\"provider-list\">\n {snapshot.usage.today.providers.map((row) => (\n <div key={row.provider} className={styles.providerRow}>\n <span className={styles.providerName}>\n {snapshot.providers.find((provider) => provider.provider === row.provider)?.displayName ?? row.provider}\n {current.provider === row.provider && <span className={styles.currentBadge}>{t('usage.current')}</span>}\n </span>\n <span className={styles.providerTokens}>{formatTokens(row.totals.inputTokens + row.totals.cacheReadTokens + row.totals.cacheWriteTokens + row.totals.outputTokens)} · {t('usage.calls', { n: row.totals.calls })}</span>\n </div>\n ))}\n </div>\n )}\n </div>\n\n <div className={styles.card} data-dsh-part=\"balance-card\">\n <span className={styles.cardTitle}>{t('usage.balance')}</span>\n {snapshot.providers.filter((provider) => provider.supported).length === 0\n ? <span className={styles.muted}>{t('usage.balance.unsupported')}</span>\n : snapshot.providers.filter((provider) => provider.supported).map((provider) => (\n <ProviderRow key={provider.provider} provider={provider} current={current.provider} />\n ))}\n {snapshot.providers.some((provider) => provider.error !== undefined) && (\n <span className={styles.errorLine}>\n {snapshot.providers.filter((provider) => provider.error !== undefined).map((provider) => `${provider.displayName}: ${t('usage.provider.error', { error: provider.error ?? '' })}`).join(';')}\n </span>\n )}\n </div>\n\n {snapshot.usage.days.length > 0 && (\n <div className={styles.card} data-dsh-part=\"trend-card\">\n <span className={styles.cardTitle}>{t('usage.trend')}</span>\n <div className={styles.trend}>\n {snapshot.usage.days.map((day, index) => {\n const total = day.totals.inputTokens + day.totals.outputTokens + day.totals.cacheReadTokens + day.totals.cacheWriteTokens\n return (\n <div\n key={day.date}\n className={index === snapshot.usage.days.length - 1 ? `${styles.trendBar} ${styles.trendBarToday}` : styles.trendBar}\n style={{ height: `${Math.max(3, Math.round((total / trendMax) * 100))}%` }}\n title={`${day.date}: ${formatTokens(total)}`}\n />\n )\n })}\n </div>\n <div className={styles.trendAxis}>\n <span>{snapshot.usage.days[0]?.date.slice(5)}</span>\n <span>{snapshot.usage.days[snapshot.usage.days.length - 1]?.date.slice(5)}</span>\n </div>\n </div>\n )}\n\n <SettingsRow settings={settings} snapshot={settingsSnapshot.status === 'ready' ? settingsSnapshot : undefined} value={settingsValue} />\n </>\n )}\n\n {tab === 'plans' && (\n planProviders.length === 0\n ? <div className={styles.card}><span className={styles.muted}>{t('usage.plan.noPlan')}</span></div>\n : planProviders.map((provider) => <PlanCard key={provider.provider} provider={provider} />)\n )}\n </div>\n )\n}\n\nfunction PlanCard(props: { provider: ProviderSnapshotView }): ReactNode {\n const { provider } = props\n return (\n <div className={`${styles.card} ${styles.planCard}`} data-dsh-part=\"plan-card\">\n <div className={styles.planHead}>\n <span className={styles.planName}>\n {provider.displayName}\n {provider.plan?.planName !== undefined ? ` · ${provider.plan.planName}` : ''}\n </span>\n </div>\n {provider.error !== undefined && <span className={styles.errorLine}>{t('usage.provider.error', { error: provider.error })}</span>}\n {provider.plan === undefined || provider.plan.windows.length === 0\n ? <span className={styles.muted}>{t('usage.plan.noPlan')}</span>\n : provider.plan.windows.map((window) => (\n <div key={window.key} className={styles.windowRow} data-dsh-part=\"plan-window\">\n <span className={styles.windowLabel}>\n <span>{window.name ?? t(`usage.plan.windows.${window.key}`)}</span>\n <span>{window.percent !== undefined ? `${window.percent >= 10 ? Math.round(window.percent) : window.percent.toFixed(1)}%` : ''}</span>\n </span>\n {window.percent !== undefined && (\n <span className={styles.bar}>\n <span className={toneClass(window.percent)} style={{ width: `${Math.min(100, Math.max(0, window.percent))}%`, display: 'block' }} />\n </span>\n )}\n {window.resetsAt !== undefined && (\n <span className={styles.resetLine}>{t('usage.plan.reset', { date: new Date(window.resetsAt).toLocaleString() })}</span>\n )}\n </div>\n ))}\n </div>\n )\n}\n\nfunction SettingsRow(props: {\n settings: UsageSectionProps['settings']\n snapshot?: { writable: boolean }\n value: UsageSettings\n}): ReactNode {\n const { settings, snapshot, value } = props\n const disabled = snapshot === undefined || !snapshot.writable\n const bubbleMode = typeof value.bubbleMode === 'string' && ['always', 'change', 'off'].includes(value.bubbleMode) ? value.bubbleMode : 'always'\n return (\n <div className={styles.card} data-dsh-part=\"settings-row\">\n <span className={styles.cardTitle}>{t('usage.config.title')}</span>\n <div className={styles.settingsGrid}>\n <label className={styles.settingItem}>\n <input\n type=\"checkbox\"\n checked={value.enabled ?? true}\n disabled={disabled}\n onChange={(event) => { void settings.set('enabled', event.target.checked) }}\n />\n {t('usage.config.enabled')}\n </label>\n <label className={styles.settingItem}>\n {t('usage.config.pollIntervalSec')}\n <input\n type=\"number\"\n min={30}\n max={3600}\n value={typeof value.pollIntervalSec === 'number' ? value.pollIntervalSec : 60}\n disabled={disabled}\n onChange={(event) => {\n const parsed = Number(event.target.value)\n if (Number.isFinite(parsed) && parsed >= 30 && parsed <= 3600) void settings.set('pollIntervalSec', Math.round(parsed))\n }}\n />\n </label>\n <label className={styles.settingItem}>\n {t('usage.config.bubbleMode')}\n <select\n value={bubbleMode}\n disabled={disabled}\n onChange={(event) => { void settings.set('bubbleMode', event.target.value) }}\n >\n <option value=\"always\">{t('usage.config.bubbleMode.always')}</option>\n <option value=\"change\">{t('usage.config.bubbleMode.change')}</option>\n <option value=\"off\">{t('usage.config.bubbleMode.off')}</option>\n </select>\n </label>\n </div>\n </div>\n )\n}\n","/**\n * dsh-usage browser half — seats the first-level 使用统计 settings section\n * (below the Workshop entry) and polls the host overview only while the\n * section is open. All provider probing and credential handling happens in\n * the host half; this bundle only renders the overview document.\n * @module @linxin666/dsh-usage/client\n */\n\nimport type { Context as ClientContext } from '@deepseek-ai/cordis'\nimport type { SettingsScope, SettingsScopeSpec } from '@deepseek-ai/dsh-client-ui-settings/client'\n// Type-only: pulls the locale plugin's Context merge (ctx.locale).\nimport type {} from '@deepseek-ai/dsh-client-locale/client'\n// Type-only: pulls the settings-surface Context merge (ctx.settingsScope).\nimport type {} from '@deepseek-ai/dsh-client-ui-settings/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-slots'\n// Type-only: pulls the ctx.slots merge (the renderer owns the slot registry since 0.1.2).\nimport type {} from '@deepseek-ai/dsh-client-ui-renderer/client'\nimport { createElement } from 'react'\nimport { createUsageStore, type UsageStoreInstance } from './usage-store.ts'\nimport { UsageSectionCard, type UsageSectionFace, type UsageSettings } from './UsageSectionCard.tsx'\nimport { NS, en, zh } from './locales.ts'\nimport type { UsageOverviewView } from '../core/types.ts'\n\n/** The host usage API as the browser sees it (same-origin JSON endpoints). */\ninterface UsageHttpApi {\n overview(): Promise<UsageOverviewView>\n refresh(): Promise<UsageOverviewView>\n}\n\nasync function usageFetch<T>(path: string, method: 'GET' | 'POST'): Promise<T> {\n const response = await fetch(path, method === 'POST' ? { method: 'POST' } : {})\n if (!response.ok) throw new Error('usage ' + path + ' failed: ' + response.status)\n return (await response.json()) as T\n}\n\nconst usageApi: UsageHttpApi = {\n overview: () => usageFetch('/api/dsh-usage/overview', 'GET'),\n refresh: () => usageFetch('/api/dsh-usage/refresh', 'POST'),\n}\n\n/** Settings namespace the section edits (the host plugin registers it). */\nconst USAGE_SETTINGS_NS = 'dsh-usage'\n\n/** First-level nav position: directly below the Workshop section (order 150). */\nconst SECTION_ORDER = 151\n\n/** Required services. */\nexport const inject = ['slots', 'locale', 'connection', 'settingsScope', 'remote']\n\nexport type { UsageSectionProps, UsageSectionFace } from './UsageSectionCard.tsx'\nexport type { UsageUiState } from './usage-store.ts'\nexport type { UsageSettings }\n\ndeclare module '@deepseek-ai/cordis' {\n interface Context {\n /**\n * Optional rc.6 compatibility binder provided by dsh-web-settings;\n * absent when that group plugin is not installed, so callers fall back to\n * the official settings scope.\n */\n webUiSettings?: { bind<S>(spec: SettingsScopeSpec<S>): SettingsScope<S> }\n }\n}\n\n/**\n * Client plugin body: register dictionaries and seat the settings section.\n * The overview poll loop and the store live with the section component's\n * mount cycle, so no background traffic exists while the page is closed.\n * @param ctx - client root context.\n */\nexport function apply(ctx: ClientContext): void {\n ctx.effect(() => {\n try {\n return ctx.locale.register(NS, { zh, en })\n } catch {\n return () => {}\n }\n }, 'dsh-usage: dictionaries')\n\n const binder = ctx.get('webUiSettings') ?? ctx.settingsScope\n const settingsScope = binder.bind<UsageSettings>({ namespace: USAGE_SETTINGS_NS })\n\n // One store instance per apply body; the section mounts and unmounts with\n // the settings page, and the store survives between visits so the last\n // overview renders instantly on reopen.\n const store: UsageStoreInstance = createUsageStore().create()\n\n let pollSeq = 0\n const poll = (): void => {\n const seq = pollSeq + 1\n pollSeq = seq\n usageApi.overview().then((snapshot) => {\n if (seq !== pollSeq) return\n store.actions.setSnapshot(snapshot)\n }, () => {\n if (seq !== pollSeq) return\n store.actions.setState('error', 'usage.overview transport error')\n })\n }\n const refresh = (): void => {\n const seq = pollSeq + 1\n pollSeq = seq\n usageApi.refresh().then((snapshot) => {\n if (seq !== pollSeq) return\n store.actions.setSnapshot(snapshot)\n }, () => {\n if (seq !== pollSeq) return\n store.actions.setState('error', 'usage.refresh transport error')\n })\n }\n\n const face = (): UsageSectionFace => ({ store, poll, refresh, settings: settingsScope })\n\n ctx.slots.inject('settings.section', () => {\n try {\n const unregister = ctx.slots.register({\n name: 'settings.section',\n id: 'dsh-usage',\n order: SECTION_ORDER,\n label: () => ctx.locale.bind(NS)('usage.title'),\n locale: NS,\n inject: face,\n }, UsageSectionCard)\n return () => {\n unregister()\n }\n } catch {\n return () => {}\n }\n })\n}\n"],"mappings":"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"}