@kenz1117/dsh-ui-usage-billing 0.9.0 → 0.9.2
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/README.en.md +186 -0
- package/README.md +39 -129
- package/lib/client.js +1166 -495
- package/lib/index.js +293 -32
- package/lib/types/aggregate.d.ts +19 -4
- package/lib/types/client/PeakAlertBanner.d.ts +18 -0
- package/lib/types/client/UsageBilling.d.ts +4 -4
- package/lib/types/client/completion-notify.d.ts +28 -0
- package/lib/types/client/locales.d.ts +1 -1
- package/lib/types/client/peak-alert.d.ts +49 -0
- package/lib/types/client/pricing.d.ts +34 -4
- package/lib/types/client/provider-display.d.ts +21 -0
- package/lib/types/subscriptions.d.ts +20 -1
- package/package.json +29 -29
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** Locale dictionaries for the usage billing surface. */
|
|
2
|
-
export type UsageBillingKey = 'billing.title' | 'billing.subtitle' | 'billing.cost' | 'billing.todayCost' | 'billing.monthCost' | 'billing.yearCost' | 'billing.monthProjected' | 'billing.liveTurn' | 'billing.liveSession' | 'billing.totalCost' | 'billing.calls' | 'billing.cacheHitRate' | 'billing.tokens' | 'billing.inputTokens' | 'billing.outputTokens' | 'billing.avgCost' | 'billing.trend' | 'billing.trend7d' | 'billing.trend30d' | 'billing.trendEmpty' | 'billing.budget' | 'billing.sessions' | 'billing.project' | 'billing.lastActive' | 'billing.sessionOverflow' | 'billing.budgetTierBody' | 'billing.models' | 'billing.providerBilling' | 'billing.estimated' | 'billing.actual' | 'billing.pricing' | 'billing.showPricing' | 'billing.hidePricing' | 'billing.pricePerM' | 'billing.input' | 'billing.output' | 'billing.cacheHit' | 'billing.peak' | 'billing.offPeak' | 'billing.flat' | 'billing.peakHours' | 'billing.band' | 'billing.openDashboard' | 'billing.close' | 'billing.lastUpdated' | 'billing.noData' | 'billing.todayRate' | 'billing.rateLive' | 'billing.rateBuiltin' | 'billing.balance' | 'billing.balanceUnconfigured' | 'billing.balanceUnauthorized' | 'billing.balanceUnreachable' | 'billing.uncatalogued' | 'billing.estimatedPricing' | 'billing.balanceDays' | 'billing.balanceLowBody' | 'billing.subscriptions' | 'billing.subscriptionNotConfigured' | 'billing.subscriptionUnauthorized' | 'billing.subscriptionUnavailable' | 'billing.subscriptionInvalid' | 'billing.subscriptionRateLimited' | 'billing.subscriptionSession' | 'billing.subscriptionWeekly' | 'billing.subscriptionMonthly' | 'billing.subscriptionBilling' | 'billing.subscriptionRemaining' | 'billing.subscriptionExhausted' | 'billing.subscriptionReset' | 'billing.subscriptionNoApi' | 'billing.heatmapLess' | 'billing.heatmapMore' | 'billing.currency' | 'billing.currencyCny' | 'billing.currencyUsd' | 'billing.heatmap' | 'billing.rounds' | 'billing.anomaly' | 'billing.workspaces' | 'billing.plan' | 'billing.remaining' | 'billing.unknownModel' | 'billing.model' | 'billing.currentRound' | 'billing.costAbbr' | 'billing.tabOverview' | 'billing.tabTrends' | 'billing.tabProviders' | 'billing.tabDetails' | 'billing.tabPricing' | 'billing.export' | 'billing.exportCsvDay' | 'billing.exportCsvSession' | 'billing.exportJson' | 'billing.peakShare' | 'billing.peakShareHint' | 'billing.weekCost' | 'billing.roleCost' | 'billing.roleUser' | 'billing.roleAssistant' | 'billing.roleTool' | 'billing.roleHint' | 'billing.tierPeak' | 'billing.tierOff' | 'billing.tierToPeak' | 'billing.tierToOff' | 'billing.tierAlertEnterPeak' | 'billing.tierAlertEnterOff' | 'billing.planTypeCode' | 'billing.planTypeToken' | 'billing.subscriptionFeePerMonth';
|
|
2
|
+
export type UsageBillingKey = 'billing.title' | 'billing.subtitle' | 'billing.cost' | 'billing.todayCost' | 'billing.monthCost' | 'billing.yearCost' | 'billing.monthProjected' | 'billing.liveTurn' | 'billing.liveSession' | 'billing.totalCost' | 'billing.calls' | 'billing.cacheHitRate' | 'billing.tokens' | 'billing.inputTokens' | 'billing.outputTokens' | 'billing.avgCost' | 'billing.trend' | 'billing.trend7d' | 'billing.trend30d' | 'billing.trendEmpty' | 'billing.budget' | 'billing.sessions' | 'billing.project' | 'billing.lastActive' | 'billing.sessionOverflow' | 'billing.budgetTierBody' | 'billing.models' | 'billing.providerBilling' | 'billing.estimated' | 'billing.actual' | 'billing.pricing' | 'billing.showPricing' | 'billing.hidePricing' | 'billing.pricePerM' | 'billing.input' | 'billing.output' | 'billing.cacheHit' | 'billing.peak' | 'billing.offPeak' | 'billing.flat' | 'billing.peakHours' | 'billing.band' | 'billing.openDashboard' | 'billing.close' | 'billing.lastUpdated' | 'billing.noData' | 'billing.todayRate' | 'billing.rateLive' | 'billing.rateBuiltin' | 'billing.pricingTip' | 'billing.balance' | 'billing.balanceUnconfigured' | 'billing.balanceUnauthorized' | 'billing.balanceUnreachable' | 'billing.uncatalogued' | 'billing.estimatedPricing' | 'billing.balanceDays' | 'billing.balanceLowBody' | 'billing.subscriptions' | 'billing.subscriptionNotConfigured' | 'billing.subscriptionUnauthorized' | 'billing.subscriptionUnavailable' | 'billing.subscriptionInvalid' | 'billing.subscriptionRateLimited' | 'billing.subscriptionSession' | 'billing.subscriptionWeekly' | 'billing.subscriptionMonthly' | 'billing.subscriptionBilling' | 'billing.subscriptionRemaining' | 'billing.subscriptionExhausted' | 'billing.subscriptionReset' | 'billing.subscriptionNoApi' | 'billing.heatmapLess' | 'billing.heatmapMore' | 'billing.currency' | 'billing.currencyCny' | 'billing.currencyUsd' | 'billing.heatmap' | 'billing.rounds' | 'billing.anomaly' | 'billing.workspaces' | 'billing.plan' | 'billing.remaining' | 'billing.unknownModel' | 'billing.model' | 'billing.currentRound' | 'billing.costAbbr' | 'billing.tabOverview' | 'billing.tabTrends' | 'billing.tabProviders' | 'billing.tabDetails' | 'billing.tabPricing' | 'billing.tabSettings' | 'billing.settingsHead' | 'billing.settingsHint' | 'billing.budgetHint' | 'billing.peakAlertHint' | 'billing.peakAlertDescPeak' | 'billing.peakAlertDescOff' | 'billing.export' | 'billing.exportCsvDay' | 'billing.exportCsvSession' | 'billing.exportJson' | 'billing.peakShare' | 'billing.peakShareHint' | 'billing.weekCost' | 'billing.roleCost' | 'billing.roleUser' | 'billing.roleAssistant' | 'billing.roleTool' | 'billing.roleHint' | 'billing.tierPeak' | 'billing.tierOff' | 'billing.tierToPeak' | 'billing.tierToOff' | 'billing.tierAlertEnterPeak' | 'billing.tierAlertEnterOff' | 'billing.peakAlertTitlePeak' | 'billing.peakAlertTitleOff' | 'billing.peakAlert' | 'billing.peakAlertLeadMin' | 'billing.peakAlertPosCorner' | 'billing.peakAlertPosCenter' | 'billing.peakAlertModePeak' | 'billing.peakAlertModeOff' | 'billing.peakAlertModeBoth' | 'billing.peakAlertWebNotify' | 'billing.peakAlertPreview' | 'billing.planTypeCode' | 'billing.planTypeToken' | 'billing.subscriptionFeePerMonth' | 'billing.triggerToday' | 'billing.triggerMonth' | 'billing.subscriptionIncluded' | 'billing.free' | 'billing.official' | 'billing.thirdParty' | 'billing.officialCost' | 'billing.thirdPartyCost';
|
|
3
3
|
export declare const NS = "usageBilling";
|
|
4
4
|
export declare const zh: Record<UsageBillingKey, string>;
|
|
5
5
|
export declare const en: Record<UsageBillingKey, string>;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 峰谷切换提醒(增强版)纯逻辑:偏好持久化 + 切档前命中判定。
|
|
3
|
+
*
|
|
4
|
+
* 参照 dsh-cost-meter 的 peak/off-peak 提醒:在距下次「进入峰时 / 进入平价」
|
|
5
|
+
* 不足提前量时,弹可视化色条浮层 + 可选的系统通知。偏好经 localStorage 持久化
|
|
6
|
+
* (默认关闭,用户到面板设置开启);「同一切换点只提醒一次」由 budget store 的
|
|
7
|
+
* `lastTierSwitchAt` 承担(与原系统通知共用一份去重,避免一条切换提醒弹两次)。
|
|
8
|
+
*/
|
|
9
|
+
import { type PriceTierId } from './pricing.ts';
|
|
10
|
+
/** 提醒模式:只提醒进入峰时 / 只提醒进入平价 / 峰与谷都提醒。 */
|
|
11
|
+
export type PeakAlertMode = 'peak' | 'offPeak' | 'both';
|
|
12
|
+
/** 浮层位置:右下角 / 屏幕居中。 */
|
|
13
|
+
export type PeakAlertPosition = 'bottom-right' | 'center';
|
|
14
|
+
/** 峰谷提醒偏好。 */
|
|
15
|
+
export interface PeakAlertConfig {
|
|
16
|
+
/** 总开关:关 = 既不浮层也不系统通知。 */
|
|
17
|
+
enabled: boolean;
|
|
18
|
+
/** 提前量(分钟);1–30。 */
|
|
19
|
+
leadMin: number;
|
|
20
|
+
/** 浮层位置。 */
|
|
21
|
+
position: PeakAlertPosition;
|
|
22
|
+
/** 是否同步发浏览器系统通知(Notification 授权后生效)。 */
|
|
23
|
+
webNotify: boolean;
|
|
24
|
+
/** 提醒模式。 */
|
|
25
|
+
mode: PeakAlertMode;
|
|
26
|
+
}
|
|
27
|
+
/** 配置持久化 key。 */
|
|
28
|
+
export declare const PEAK_ALERT_KEY = "dsh-billing-peak-alert-v1";
|
|
29
|
+
/** 默认配置:关、2 分钟提前、右下角、开系统通知、峰与谷都提醒。 */
|
|
30
|
+
export declare const DEFAULT_PEAK_ALERT_CONFIG: PeakAlertConfig;
|
|
31
|
+
/** 一次命中:即将进入的档位与该切换时刻。 */
|
|
32
|
+
export interface PeakAlertHit {
|
|
33
|
+
entering: PriceTierId;
|
|
34
|
+
atMs: number;
|
|
35
|
+
}
|
|
36
|
+
/** 读取本地偏好(缺失/损坏回退默认,字段宽松校验)。 */
|
|
37
|
+
export declare function loadPeakAlertConfig(): PeakAlertConfig;
|
|
38
|
+
/** 保存偏好;存储失败静默(降级为关闭,不影响其它能力)。 */
|
|
39
|
+
export declare function savePeakAlertConfig(config: PeakAlertConfig): void;
|
|
40
|
+
/**
|
|
41
|
+
* 计算是否需要提醒:已启用、距切换不足提前量、按模式过滤、且该切换点未提醒过。
|
|
42
|
+
* 导出供测试:纯函数。
|
|
43
|
+
* @param nowMs - 当前时刻(epoch 毫秒)。
|
|
44
|
+
* @param config - 峰谷提醒偏好。
|
|
45
|
+
* @param lastAlertedAt - 上次提醒过的切换点时刻(budget store 的 lastTierSwitchAt);同点跳过。
|
|
46
|
+
* @returns 命中(含即将进入的档位与切换时刻),否则 null。
|
|
47
|
+
*/
|
|
48
|
+
export declare function computePeakAlert(nowMs: number, config: PeakAlertConfig, lastAlertedAt: number): PeakAlertHit | null;
|
|
49
|
+
//# sourceMappingURL=peak-alert.d.ts.map
|
|
@@ -8,9 +8,10 @@
|
|
|
8
8
|
* through the exchange rate, never domestic ones.
|
|
9
9
|
*
|
|
10
10
|
* Google-style two-band billing is modeled per model: Gemini's Flex tier
|
|
11
|
-
* prices spare-capacity traffic at -50%; DeepSeek
|
|
12
|
-
* (09:00-12:00 / 14:00-18:00 Beijing) at 2x the off-peak rate
|
|
13
|
-
*
|
|
11
|
+
* prices spare-capacity traffic at -50%; DeepSeek splits peak
|
|
12
|
+
* (weekdays 09:00-12:00 / 14:00-18:00 Beijing) at 2x the off-peak rate —
|
|
13
|
+
* weekends (Sat/Sun, Beijing) are charged at the off-peak rate all day.
|
|
14
|
+
* The estimator mixes both bands by a configured peak share ({@link DEFAULT_PEAK_SHARE}).
|
|
14
15
|
*/
|
|
15
16
|
import type { LivePricing } from '../pricing-shared.ts';
|
|
16
17
|
/**
|
|
@@ -58,13 +59,15 @@ export type PriceTierId = 'peak' | 'offPeak';
|
|
|
58
59
|
/** 成本显示币种:人民币(国内模型直价)/ 美元(国外模型直价或换算显示)。 */
|
|
59
60
|
export type CostCurrency = 'cny' | 'usd';
|
|
60
61
|
/**
|
|
61
|
-
*
|
|
62
|
+
* 工作日高峰时段判定(北京时间,UTC+8,无夏令时):09:00–12:00、14:00–18:00。
|
|
63
|
+
* 周末(周六/周日)北京全天为低谷,不调用本函数判定峰/平。
|
|
62
64
|
* @param beijingHour - 北京时间的小时数(0–23)。
|
|
63
65
|
*/
|
|
64
66
|
export declare function isPeakHour(beijingHour: number): boolean;
|
|
65
67
|
/**
|
|
66
68
|
* 由时刻(epoch 毫秒)推断计费时段;时刻未知/非法时按高峰计(保守:未知
|
|
67
69
|
* 时刻不低估成本,与社区 dsh-usage-chart 的 tierAt 语义一致)。
|
|
70
|
+
* 周末(北京时间周六/周日)全天不区分峰谷,统一按低谷价。
|
|
68
71
|
* @param timeMs - Unix epoch 毫秒;null/undefined/NaN 视为未知。
|
|
69
72
|
*/
|
|
70
73
|
export declare function tierAt(timeMs: number | null | undefined): PriceTierId;
|
|
@@ -166,6 +169,23 @@ export declare const MODEL_CATALOG: readonly ModelEntry[];
|
|
|
166
169
|
* 解析,两侧共用一份映射,避免同一模型两侧不一致导致「未收录」。
|
|
167
170
|
*/
|
|
168
171
|
export declare const MODEL_KEY_ALIASES: Readonly<Record<string, string>>;
|
|
172
|
+
/**
|
|
173
|
+
* 模型 id 归一化:小写、去括号附注(如 `gpt5.6 luna(go)` 只看主体)、再去所有
|
|
174
|
+
* 非字母数字分隔符(空格 / 横杠 / 点 / 下划线)。用于日志里的模型 id 与计费
|
|
175
|
+
* 目录键做宽松匹配,提升「大小写/分隔符差异导致未收录」的识别率。
|
|
176
|
+
* @param id - 原始模型 id(日志或目录键)。
|
|
177
|
+
* @returns 归一化键(字母数字小写串)。
|
|
178
|
+
*/
|
|
179
|
+
export declare function canonModelId(id: string): string;
|
|
180
|
+
/**
|
|
181
|
+
* 解析真实日志模型 id → 计费目录键。先精确别名映射(既有行为);未命中时做
|
|
182
|
+
* 归一化匹配(忽略大小写/分隔符/括号附注),命中内置目录 / 别名目标 / 兜底键 /
|
|
183
|
+
* models.dev 补充键即返回其真实键;完全未知时保持原样(回退 other,不计费)。
|
|
184
|
+
* 供聚合层折叠与客户端渲染共用,两侧一致。
|
|
185
|
+
* @param id - 真实模型 id(日志里出现的形式)。
|
|
186
|
+
* @returns 计费目录键。
|
|
187
|
+
*/
|
|
188
|
+
export declare function resolveCatalogKey(id: string): string;
|
|
169
189
|
/** Lookup a model by its stats key; falls back to the generic `other` entry. */
|
|
170
190
|
export declare function modelOf(key: string): ModelEntry;
|
|
171
191
|
/**
|
|
@@ -221,6 +241,16 @@ export declare function formatMoney(amount: number, currency?: CostCurrency): st
|
|
|
221
241
|
* zero): CNY for domestic models, USD for overseas ones.
|
|
222
242
|
*/
|
|
223
243
|
export declare function formatUnitPrice(price: number, currency?: 'CNY' | 'USD'): string;
|
|
244
|
+
/**
|
|
245
|
+
* 把一条「每百万 token」单价从原生币种换算到目标展示币种(按 USD→CNY 汇率)。
|
|
246
|
+
* 汇率缺失/非法时回退原值,避免 0 汇率把价格算没。
|
|
247
|
+
* @param price - 原生币种单价。
|
|
248
|
+
* @param native - 模型原生币种。
|
|
249
|
+
* @param target - 用户当前展示币种。
|
|
250
|
+
* @param rate - USD→CNY 汇率(1 USD = rate CNY)。
|
|
251
|
+
* @returns 换算到目标币种的单价;同币种或汇率不可用时原值。
|
|
252
|
+
*/
|
|
253
|
+
export declare function convertUnitPrice(price: number, native: 'CNY' | 'USD', target: CostCurrency, rate: number): number;
|
|
224
254
|
/** Format a large token count with B/M/K suffix. */
|
|
225
255
|
export declare function formatTokens(value: number): string;
|
|
226
256
|
/** Format a percentage. */
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 厂商显示名本地化:界面文案已随币种切换中英文,但厂商名(如「智谱 AI」/
|
|
3
|
+
* 「阿里通义」/「月之暗面」)散落在 PROVIDER_ALIASES、MODEL_CATALOG、
|
|
4
|
+
* SUBSCRIPTION_DISPLAY_NAMES、balance 等多个数据层,且这些中文名同时充当
|
|
5
|
+
* 匹配与分组的 key。为不改动任何数据层/匹配逻辑,这里只提供一张「中文厂商名
|
|
6
|
+
* → 英文显示名」的映射表(大写字面量作为 key,非中文/未收录名原样返回),
|
|
7
|
+
* 供 JSX 渲染层在做语言切换时调用。
|
|
8
|
+
*/
|
|
9
|
+
type ProviderLang = 'zh' | 'en';
|
|
10
|
+
/**
|
|
11
|
+
* 把厂商显示名按界面语言本地化:中文名映射成英文,其余(已是英文 / 未收录 /
|
|
12
|
+
* 未知)原样返回。仅在渲染层调用,不影响数据层的中文 key 匹配。
|
|
13
|
+
* @param name - 数据层返回的厂商显示名(多为中文)。
|
|
14
|
+
* @param lang - 当前界面语言(跟随币种)。
|
|
15
|
+
* @returns 本地化后的显示名。
|
|
16
|
+
*/
|
|
17
|
+
export declare function localizeProviderName(name: string, lang: ProviderLang): string;
|
|
18
|
+
/** 判断一个厂商显示名是否包含中文(用于测试/守卫:保证映射覆盖完整)。 */
|
|
19
|
+
export declare function hasCjk(name: string): boolean;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=provider-display.d.ts.map
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* "no quota API" marker rather than hidden. API keys come from the `llm-pi-ai`
|
|
12
12
|
* settings namespace (`apiKeyEnv` refs) resolved through the credentials seam.
|
|
13
13
|
*/
|
|
14
|
-
import type { SubscriptionPlanConfig, SubscriptionQuota } from './pricing-shared.ts';
|
|
14
|
+
import type { SubscriptionPlanConfig, SubscriptionQuota, SubscriptionWindow } from './pricing-shared.ts';
|
|
15
15
|
/** 订阅适配器需要的凭据(来自 llm-pi-ai 设置命名空间)。 */
|
|
16
16
|
export interface SubscriptionKeys {
|
|
17
17
|
/** Kimi For Coding API key。 */
|
|
@@ -20,6 +20,10 @@ export interface SubscriptionKeys {
|
|
|
20
20
|
zaiApiKey: string;
|
|
21
21
|
/** OpenCode Go API key。 */
|
|
22
22
|
opencodeApiKey: string;
|
|
23
|
+
/** MiniMax Token Plan API key。 */
|
|
24
|
+
minmaxApiKey: string;
|
|
25
|
+
/** OpenRouter API key(credits 已用%)。 */
|
|
26
|
+
openrouterApiKey: string;
|
|
23
27
|
/** Z.ai 区域(global / bigmodel-cn)。 */
|
|
24
28
|
zaiRegion: 'global' | 'bigmodel-cn';
|
|
25
29
|
}
|
|
@@ -46,6 +50,21 @@ export declare function isSubscriptionProviderId(providerId: string): boolean;
|
|
|
46
50
|
export declare function identifySubscriptionPlans(providers: Record<string, {
|
|
47
51
|
apiKeyEnv?: string;
|
|
48
52
|
} | undefined> | undefined): IdentifiedSubscriptionPlan[];
|
|
53
|
+
/**
|
|
54
|
+
* 解析 MiniMax Token Plan `/v1/token_plan/remains` 响应。取 general(或 MiniMax-M*)
|
|
55
|
+
* 一行抽出 5h/7d 窗口(total_count 常为 0,以 remaining_percent 为准),不按模型拆条。
|
|
56
|
+
* 导出供测试:纯函数。
|
|
57
|
+
* @param body - 接口响应 JSON。
|
|
58
|
+
* @returns 窗口列表;无可用窗口时为空数组。
|
|
59
|
+
*/
|
|
60
|
+
export declare function parseMiniMaxRemains(body: unknown): SubscriptionWindow[];
|
|
61
|
+
/**
|
|
62
|
+
* 解析 OpenRouter `/api/v1/credits` 响应:已用% = total_usage / total_credits。
|
|
63
|
+
* 导出供测试:纯函数。
|
|
64
|
+
* @param body - 接口响应 JSON。
|
|
65
|
+
* @returns 窗口列表;无有效额度时为 []。
|
|
66
|
+
*/
|
|
67
|
+
export declare function parseOpenRouterCredits(body: unknown): SubscriptionWindow[];
|
|
49
68
|
/**
|
|
50
69
|
* Collect quota for the given plans concurrently (adapter-backed plans only;
|
|
51
70
|
* identified plans without an adapter are surfaced by the caller as "no
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kenz1117/dsh-ui-usage-billing",
|
|
3
3
|
"description": "Usage billing dashboard for DeepSeek Harness: sidebar cost metrics plus a full dashboard modal, priced from a current multi-provider catalog with real usage aggregated from session logs.",
|
|
4
|
-
"version": "0.9.
|
|
4
|
+
"version": "0.9.2",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
@@ -47,42 +47,42 @@
|
|
|
47
47
|
},
|
|
48
48
|
"license": "MIT",
|
|
49
49
|
"peerDependencies": {
|
|
50
|
-
"@deepseek-ai/dsh-api-remotes": "
|
|
51
|
-
"@deepseek-ai/dsh-atomic-write": "
|
|
52
|
-
"@deepseek-ai/dsh-client-connection": "
|
|
53
|
-
"@deepseek-ai/dsh-host-webserver": "
|
|
54
|
-
"@deepseek-ai/dsh-client-locale": "
|
|
55
|
-
"@deepseek-ai/dsh-client-runtime": "
|
|
56
|
-
"@deepseek-ai/dsh-client-ui-conversation": "
|
|
57
|
-
"@deepseek-ai/dsh-client-ui-sidebar": "
|
|
58
|
-
"@deepseek-ai/dsh-client-ui-primitives": "
|
|
59
|
-
"@deepseek-ai/dsh-client-ui-slots": "
|
|
60
|
-
"@deepseek-ai/dsh-credentials": "
|
|
61
|
-
"@deepseek-ai/dsh-invariants": "
|
|
62
|
-
"@deepseek-ai/dsh-llm": "
|
|
63
|
-
"@deepseek-ai/dsh-session": "
|
|
64
|
-
"@deepseek-ai/dsh-session-persistence": "
|
|
65
|
-
"@deepseek-ai/dsh-settings": "
|
|
66
|
-
"@deepseek-ai/dsh-tools": "
|
|
67
|
-
"@deepseek-ai/schemastery": "
|
|
68
|
-
"@deepseek-ai/cordis": "
|
|
50
|
+
"@deepseek-ai/dsh-api-remotes": "workspace:^",
|
|
51
|
+
"@deepseek-ai/dsh-atomic-write": "workspace:^",
|
|
52
|
+
"@deepseek-ai/dsh-client-connection": "workspace:^",
|
|
53
|
+
"@deepseek-ai/dsh-host-webserver": "workspace:^",
|
|
54
|
+
"@deepseek-ai/dsh-client-locale": "workspace:^",
|
|
55
|
+
"@deepseek-ai/dsh-client-runtime": "workspace:^",
|
|
56
|
+
"@deepseek-ai/dsh-client-ui-conversation": "workspace:^",
|
|
57
|
+
"@deepseek-ai/dsh-client-ui-sidebar": "workspace:^",
|
|
58
|
+
"@deepseek-ai/dsh-client-ui-primitives": "workspace:^",
|
|
59
|
+
"@deepseek-ai/dsh-client-ui-slots": "workspace:^",
|
|
60
|
+
"@deepseek-ai/dsh-credentials": "workspace:^",
|
|
61
|
+
"@deepseek-ai/dsh-invariants": "workspace:^",
|
|
62
|
+
"@deepseek-ai/dsh-llm": "workspace:^",
|
|
63
|
+
"@deepseek-ai/dsh-session": "workspace:^",
|
|
64
|
+
"@deepseek-ai/dsh-session-persistence": "workspace:^",
|
|
65
|
+
"@deepseek-ai/dsh-settings": "workspace:^",
|
|
66
|
+
"@deepseek-ai/dsh-tools": "workspace:^",
|
|
67
|
+
"@deepseek-ai/schemastery": "workspace:^",
|
|
68
|
+
"@deepseek-ai/cordis": "workspace:^",
|
|
69
69
|
"react": "^18.2.0"
|
|
70
70
|
},
|
|
71
71
|
"dependencies": {
|
|
72
72
|
"clsx": "^2.1.1"
|
|
73
73
|
},
|
|
74
74
|
"devDependencies": {
|
|
75
|
-
"@deepseek-ai/dsh-client-locale": "
|
|
76
|
-
"@deepseek-ai/dsh-client-runtime": "
|
|
77
|
-
"@deepseek-ai/dsh-client-test-runtime": "
|
|
78
|
-
"@deepseek-ai/dsh-client-ui-conversation": "
|
|
79
|
-
"@deepseek-ai/dsh-client-ui-primitives": "
|
|
80
|
-
"@deepseek-ai/dsh-client-ui-slots": "
|
|
81
|
-
"@deepseek-ai/dsh-client-web-react": "
|
|
82
|
-
"@deepseek-ai/dsh-invariants": "
|
|
75
|
+
"@deepseek-ai/dsh-client-locale": "workspace:^",
|
|
76
|
+
"@deepseek-ai/dsh-client-runtime": "workspace:^",
|
|
77
|
+
"@deepseek-ai/dsh-client-test-runtime": "workspace:^",
|
|
78
|
+
"@deepseek-ai/dsh-client-ui-conversation": "workspace:^",
|
|
79
|
+
"@deepseek-ai/dsh-client-ui-primitives": "workspace:^",
|
|
80
|
+
"@deepseek-ai/dsh-client-ui-slots": "workspace:^",
|
|
81
|
+
"@deepseek-ai/dsh-client-web-react": "workspace:^",
|
|
82
|
+
"@deepseek-ai/dsh-invariants": "workspace:^",
|
|
83
83
|
"@testing-library/react": "^16.1.0",
|
|
84
84
|
"@types/react": "~18.3.1",
|
|
85
|
-
"@deepseek-ai/cordis": "
|
|
85
|
+
"@deepseek-ai/cordis": "workspace:^",
|
|
86
86
|
"react": "^18.2.0",
|
|
87
87
|
"react-dom": "^18.2.0"
|
|
88
88
|
},
|