@kenz1117/dsh-ui-usage-billing 1.6.8 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +28 -4
- package/README.md +32 -4
- package/lib/client.js +5 -5
- package/lib/index.js +2 -1
- package/lib/types/client/context-store.d.ts +68 -0
- package/lib/types/client/domain/agent-tree.d.ts +60 -0
- package/lib/types/client/domain/types.d.ts +6 -13
- package/lib/types/client/live-cost.d.ts +8 -1
- package/lib/types/client/locales.d.ts +1 -1
- package/lib/types/client/session-navigation.d.ts +36 -0
- package/lib/types/client/usage-command.d.ts +37 -0
- package/package.json +39 -31
package/lib/index.js
CHANGED
|
@@ -338,7 +338,8 @@ function isBeijingWeekend(timeMs) {
|
|
|
338
338
|
*
|
|
339
339
|
* 编码为空格分隔的 `YYYYMMDD` 列表(按年分组、同年日期连续排列,便于逐年追加):
|
|
340
340
|
* 每个键长度固定为 8,故 `includes` 不会跨键误匹配;相比「区间 + 运行时展开」
|
|
341
|
-
* 省掉一段解析代码——client / index 两个 face
|
|
341
|
+
* 省掉一段解析代码——client / index 两个 face 都要过本仓自设的体积成本线
|
|
342
|
+
* (sync.sh 的 256/320 KiB;DSH Store 对插件 JS bundle 本身无审查上限)。
|
|
342
343
|
*/
|
|
343
344
|
const CHINA_HOLIDAYS = "20260925 20260926 20260927 20261001 20261002 20261003 20261004 20261005 20261006 20261007";
|
|
344
345
|
/** 北京日期键 YYYYMMDD(与宿主时区无关)。 */
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 上下文占用快照 store:把宿主的 token-meter 投影从**会话作用域**搬到全局弹窗。
|
|
3
|
+
*
|
|
4
|
+
* 宿主能力(@deepseek-ai/dsh-token-meter,经会话作用域标准 props 的 useProjection 读):
|
|
5
|
+
* - `contextPressure`:{ pressureTokens?, projectedTokens?, contextWindow? }
|
|
6
|
+
* —— provider 上报的最近一次提示词占用、下一次请求的占用外推、路由容量上限。
|
|
7
|
+
* - `contextBreakdown`:{ systemTokens, toolsTokens, messageTokens }
|
|
8
|
+
* —— 下一次请求上下文的构成拆解(**启发式 token 估算**,三项之和不等于
|
|
9
|
+
* provider 锚定的 projectedTokens:估算器系统性低估 CJK 与 JSON schema)。
|
|
10
|
+
*
|
|
11
|
+
* 为什么需要这个 store:`contextPressure` / `contextBreakdown` 只在**会话作用域**
|
|
12
|
+
* 的槽位里可读(投影按会话分发),而仪表盘弹窗是全局的——侧边栏触发的弹窗不在
|
|
13
|
+
* 任何会话作用域内。解法:会话作用域里已有的即时代费用条(conversation.composer.dock
|
|
14
|
+
* 座位)顺手读一次投影并发布到本 store,弹窗订阅它。
|
|
15
|
+
*
|
|
16
|
+
* 降级:没有会话 / 宿主不提供该投影 / 老宿主没有 token-meter → store 保持空,
|
|
17
|
+
* 界面整块隐藏(**不显示 0、不显示占位假数据**)。
|
|
18
|
+
*/
|
|
19
|
+
/** 上下文占用快照(两个投影的合并视图)。 */
|
|
20
|
+
export interface ContextOccupancy {
|
|
21
|
+
/** 下一次请求的提示词占用(provider 锚定 + 增量外推)——面板主指标。 */
|
|
22
|
+
projectedTokens?: number;
|
|
23
|
+
/** 最近一次请求的提示词占用(provider 上报值)。 */
|
|
24
|
+
pressureTokens?: number;
|
|
25
|
+
/** 路由容量(上下文窗口上限);适配器未上报时缺席。 */
|
|
26
|
+
contextWindow?: number;
|
|
27
|
+
/** 系统提示词占用(启发式估算)。 */
|
|
28
|
+
systemTokens?: number;
|
|
29
|
+
/** 工具 schema 占用(启发式估算)。 */
|
|
30
|
+
toolsTokens?: number;
|
|
31
|
+
/** 消息占用(启发式估算)。 */
|
|
32
|
+
messageTokens?: number;
|
|
33
|
+
}
|
|
34
|
+
/** 空快照:无数据(界面据此整块隐藏)。 */
|
|
35
|
+
export declare const EMPTY_CONTEXT: ContextOccupancy;
|
|
36
|
+
/** 上下文 store:写入方 = 会话作用域的费用条;读取方 = 全局仪表盘弹窗。 */
|
|
37
|
+
export interface ContextStore {
|
|
38
|
+
/** 发布新快照(内容未变时保持同一对象引用,避免无谓重渲染)。 */
|
|
39
|
+
publish(next: ContextOccupancy): void;
|
|
40
|
+
/** 订阅变更;立即收到当前值一次(若为空则收到 undefined)。 */
|
|
41
|
+
subscribe(listener: (value: ContextOccupancy | undefined) => void): () => void;
|
|
42
|
+
/** 读取当前快照(无数据返回 undefined)。 */
|
|
43
|
+
read(): ContextOccupancy | undefined;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* 创建上下文 store。
|
|
47
|
+
* @returns store 实例。
|
|
48
|
+
*/
|
|
49
|
+
export declare function createContextStore(): ContextStore;
|
|
50
|
+
/**
|
|
51
|
+
* 占用率(0..1):以外推占用除以窗口容量。
|
|
52
|
+
* 缺任一要素 → undefined(界面不画进度,不以 0 冒充)。
|
|
53
|
+
* @param occupancy - 占用快照。
|
|
54
|
+
* @returns 占用率或 undefined。
|
|
55
|
+
*/
|
|
56
|
+
export declare function occupancyRatio(occupancy: ContextOccupancy | undefined): number | undefined;
|
|
57
|
+
/**
|
|
58
|
+
* 构成拆解的三项(顺序固定,便于渲染与比较)。
|
|
59
|
+
* @param occupancy - 占用快照。
|
|
60
|
+
* @returns 构成项数组(无任何构成数据时返回空数组)。
|
|
61
|
+
*/
|
|
62
|
+
export declare function occupancyBreakdown(occupancy: ContextOccupancy | undefined): readonly {
|
|
63
|
+
key: 'system' | 'tools' | 'message';
|
|
64
|
+
tokens: number;
|
|
65
|
+
}[];
|
|
66
|
+
/** 页面级单例:同一页面只有一个计费插件实例,与其它模块级单例同口径。 */
|
|
67
|
+
export declare const contextStore: ContextStore;
|
|
68
|
+
//# sourceMappingURL=context-store.d.ts.map
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 智能体网络树:从会话行的 `parentId` 还原委派关系,并逐级算出「链合计」。
|
|
3
|
+
*
|
|
4
|
+
* 背景:宿主把子智能体落成**独立会话**,靠 `parentId` 指向委派它的对话。本仓的
|
|
5
|
+
* 账单页(明细 Tab)已经能把子智能体归并到父会话,但那是「账单视角」;本模块给出
|
|
6
|
+
* 「网络视角」——谁委派了谁、每条链总共花了多少,用来回答**「哪次委派最贵」**。
|
|
7
|
+
*
|
|
8
|
+
* 与展示层的 `buildSessionDisplay` 的分工:那一支做的是**同标题会话合并 + 展示树
|
|
9
|
+
* 挂靠**(账单表要按人可读的方式分组);本模块只做**委派关系 + 链合计**,不合并
|
|
10
|
+
* 同标题会话——网络视角里两个同名会话是两个独立智能体。
|
|
11
|
+
*
|
|
12
|
+
* 环防护:异常数据可能出现 `a.parentId=b && b.parentId=a`(互指父子),直接递归
|
|
13
|
+
* 会造出渲染死循环。建树时按「父链回溯」判环:命中环的节点按根处理(不挂到任何
|
|
14
|
+
* 父节点下),其余结构照常。
|
|
15
|
+
*/
|
|
16
|
+
import type { SessionBillingRow } from './types.ts';
|
|
17
|
+
/** 网络树的一个节点(一个智能体 / 一个会话)。 */
|
|
18
|
+
export interface AgentNode {
|
|
19
|
+
id: string;
|
|
20
|
+
title?: string;
|
|
21
|
+
cwd?: string;
|
|
22
|
+
/** 自身调用数(不含后代)。 */
|
|
23
|
+
calls: number;
|
|
24
|
+
/** 自身费用(不含后代)。 */
|
|
25
|
+
cost: number;
|
|
26
|
+
/** 最后活跃时刻(毫秒)。 */
|
|
27
|
+
lastActive: number;
|
|
28
|
+
/** 自身 + 全部后代的费用合计。 */
|
|
29
|
+
chainCost: number;
|
|
30
|
+
/** 自身 + 全部后代的调用合计。 */
|
|
31
|
+
chainCalls: number;
|
|
32
|
+
/** 直接子智能体(按链合计倒序)。 */
|
|
33
|
+
children: AgentNode[];
|
|
34
|
+
/** 深度(根 = 0)。 */
|
|
35
|
+
depth: number;
|
|
36
|
+
}
|
|
37
|
+
/** 网络树汇总。 */
|
|
38
|
+
export interface AgentTreeStats {
|
|
39
|
+
/** 参与网络的智能体总数(含根)。 */
|
|
40
|
+
agents: number;
|
|
41
|
+
/** 委派边数(父 → 子 的条数)。 */
|
|
42
|
+
delegations: number;
|
|
43
|
+
/** 根(对话)数量。 */
|
|
44
|
+
roots: number;
|
|
45
|
+
/** 链合计最高的一支(根或子节点皆可)。 */
|
|
46
|
+
costliest?: AgentNode;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* 建树:还原委派关系并算链合计。
|
|
50
|
+
* @param rows - 会话行(含 parentId 的原始行,不是展示层合并后的行)。
|
|
51
|
+
* @returns 根节点数组(按链合计倒序)。
|
|
52
|
+
*/
|
|
53
|
+
export declare function buildAgentTree(rows: readonly SessionBillingRow[]): AgentNode[];
|
|
54
|
+
/**
|
|
55
|
+
* 网络树汇总统计。
|
|
56
|
+
* @param roots - 根节点数组。
|
|
57
|
+
* @returns 汇总(智能体数 / 委派数 / 对话数 / 最贵的一支)。
|
|
58
|
+
*/
|
|
59
|
+
export declare function agentTreeStats(roots: readonly AgentNode[]): AgentTreeStats;
|
|
60
|
+
//# sourceMappingURL=agent-tree.d.ts.map
|
|
@@ -27,7 +27,7 @@ export interface ModelHealth {
|
|
|
27
27
|
/** Idle health state before the probe settles. */
|
|
28
28
|
export declare const IDLE_HEALTH: ModelHealth;
|
|
29
29
|
/** 仪表盘分区 Tab id。 */
|
|
30
|
-
export type DashboardTab = 'overview' | 'token' | 'trends' | 'providers' | 'pricing' | 'settings';
|
|
30
|
+
export type DashboardTab = 'overview' | 'context' | 'agents' | 'token' | 'trends' | 'providers' | 'pricing' | 'settings';
|
|
31
31
|
import type { UsageBillingKey } from '../locales.ts';
|
|
32
32
|
/**
|
|
33
33
|
* Tab 定义(顺序即渲染顺序):概览=主数字/KPI/热力图,账单=厂商计费与订阅,
|
|
@@ -65,19 +65,7 @@ export interface KpiAgg {
|
|
|
65
65
|
peakTokens: number;
|
|
66
66
|
}
|
|
67
67
|
/** v1.5 Tab 徽章数据信号:空字符串 / 数字 / 状态字。`kind` 决定色调。 */
|
|
68
|
-
export type TabBadgeKind = 'warn' | 'hot' | 'violet' | 'neutral';
|
|
69
68
|
/** v1.5 Tab 徽章。 */
|
|
70
|
-
export interface TabBadge {
|
|
71
|
-
label: string;
|
|
72
|
-
kind: TabBadgeKind;
|
|
73
|
-
}
|
|
74
|
-
/** 各 Tab 数据信号聚合:调用方传 dashboardBadgeState(避免每个 Tab 重复声明) */
|
|
75
|
-
export interface DashboardBadgeState {
|
|
76
|
-
providersCount: number;
|
|
77
|
-
tokenTotal: number;
|
|
78
|
-
rateAgeMinutes: number | null;
|
|
79
|
-
settingsDirty: number;
|
|
80
|
-
}
|
|
81
69
|
/** 会话明细行(与服务端 SessionUsageRow 同形;旧快照可能缺失整个 bySession)。 */
|
|
82
70
|
export interface SessionBillingRow {
|
|
83
71
|
id: string;
|
|
@@ -161,6 +149,11 @@ export interface UsageBillingInjected {
|
|
|
161
149
|
monthCost: number;
|
|
162
150
|
}) => void;
|
|
163
151
|
registerOpen: (handler: () => void) => () => void;
|
|
152
|
+
/**
|
|
153
|
+
* 跳转到宿主会话(跨插件导航):面板点会话行时调用。
|
|
154
|
+
* 返回 'opened' 已跳转 / 'unavailable' 宿主无通道(老到没有)/ 'failed' 通道报错。
|
|
155
|
+
*/
|
|
156
|
+
navigateToSession: (sessionId: string) => 'opened' | 'unavailable' | 'failed';
|
|
164
157
|
}
|
|
165
158
|
/** Usage stats structure from `.dsh-usage-stats.json`. */
|
|
166
159
|
export interface UsageStats {
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
import type { SessionId } from '@deepseek-ai/dsh-session/types';
|
|
22
22
|
import type { LiveCostBarPrefs } from './usage-billing-settings.ts';
|
|
23
23
|
import type { UsageBillingKey } from './locales.ts';
|
|
24
|
+
import type { UseProjection } from '@deepseek-ai/dsh-api-session-controller/client';
|
|
24
25
|
/** The usage-stats shape the composer bar needs (a thin slice, not the whole doc). */
|
|
25
26
|
export interface LiveStats {
|
|
26
27
|
bySession?: readonly {
|
|
@@ -116,6 +117,12 @@ export declare function isBlankPhase(session: SessionPhaseSlice): boolean;
|
|
|
116
117
|
export interface LiveCostBarProps {
|
|
117
118
|
/** Current Session identity supplied by the session-scope standard kit. */
|
|
118
119
|
sessionId: SessionId;
|
|
120
|
+
/**
|
|
121
|
+
* Host projection reader (session-scope standard kit). Present only on hosts
|
|
122
|
+
* that serve session projections; absent → no context dimension (the
|
|
123
|
+
* dashboard hides that card entirely rather than showing zeros).
|
|
124
|
+
*/
|
|
125
|
+
useProjection?: UseProjection;
|
|
119
126
|
/** The owning seat's locale seat (bound to the billing NS). */
|
|
120
127
|
t: (key: UsageBillingKey) => string;
|
|
121
128
|
/** Which host seat this instance occupies; it renders only when the position pref matches. */
|
|
@@ -128,7 +135,7 @@ export interface LiveCostBarProps {
|
|
|
128
135
|
* @param props - framework session identity, locale, the seat occupied, and
|
|
129
136
|
* (input.dock only) the owner session snapshot.
|
|
130
137
|
*/
|
|
131
|
-
export declare function LiveCostBar({ sessionId, t, seat, session }: LiveCostBarProps): React.ReactNode;
|
|
138
|
+
export declare function LiveCostBar({ sessionId, t, seat, session, useProjection }: LiveCostBarProps): React.ReactNode;
|
|
132
139
|
/** Props of the tool-row chip: session identity and locale only (its seat is fixed to input.right). */
|
|
133
140
|
export type LiveCostChipProps = Pick<LiveCostBarProps, 'sessionId' | 't'>;
|
|
134
141
|
/**
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** Locale dictionaries for the usage billing surface. */
|
|
2
|
-
export type UsageBillingKey = 'title' | 'cost' | 'todayCost' | 'monthCost' | 'yearCost' | 'monthProjected' | 'liveTurn' | 'liveSession' | 'liveSessionSub' | 'calls' | 'cacheHitRate' | 'tokens' | 'inputTokens' | 'outputTokens' | 'avgCost' | 'kpiRange' | 'avgRangeToday' | 'avgRange7d' | 'avgRangeWeek' | 'avgRangeMonth' | 'avgRangeAll' | 'trend' | 'trend7d' | 'trend30d' | 'trendMetric' | 'trendMetricCost' | 'trendMetricTokens' | 'pricingSearch' | 'bandPinHint' | 'trendEmpty' | 'trendTotal' | 'roundsUnit' | 'healthModelsLive' | 'healthVendorsDown' | 'healthVendorsUnavailable' | 'budget' | 'budgetRemain' | 'budgetAmount' | 'budgetSummary' | 'sessions' | 'sessionTitle' | 'lastActive' | 'sessionOverflow' | 'budgetTierBody' | 'models' | 'providerBilling' | 'channelUnknown' | 'directTag' | 'relayTag' | 'unknownTag' | 'unknownChannelHint' | 'planCountUnit' | 'actual' | 'pricing' | 'input' | 'output' | 'cacheHit' | 'peak' | 'offPeak' | 'flat' | 'band' | 'close' | 'footer' | 'footerCredit' | 'lastUpdated' | 'noData' | 'todayRate' | 'rateLive' | 'rateBuiltin' | 'pricingSyncedAt' | 'pricingSyncNow' | 'pricingSyncing' | 'promoBadge' | 'promoUntil' | 'promoOpenEnded' | 'pricingTip' | 'pricingUnit' | 'pricingNotes' | 'ubPeak' | 'ubOff' | 'ubStd' | 'peakBand' | 'pricingSource' | 'noteCache' | 'noteBand' | 'noteSource' | 'balance' | 'recharge' | 'rechargeHint' | 'balanceUnconfigured' | 'balanceUnauthorized' | 'balanceUnreachable' | 'uncatalogued' | 'estimatedPricing' | 'balanceDays' | 'balanceLowBody' | 'reconcileDrift' | 'reconcileDismiss' | 'subscriptionNotConfigured' | 'subscriptionUnauthorized' | 'subscriptionUnavailable' | 'subscriptionInvalid' | 'subscriptionRateLimited' | 'subscriptionSession' | 'subscriptionWeekly' | 'subscriptionMonthly' | 'subscriptionBilling' | 'subscriptionRemaining' | 'subscriptionExhausted' | 'subscriptionReset' | 'subscriptionNoApi' | 'floatWindow' | 'floatModeCombined' | 'floatModeSubscription' | 'floatMode' | 'floatTargets' | 'floatWindowHint' | 'floatPrimaryToday' | 'floatPrimaryWeek' | 'floatPrimaryMonth' | 'floatNoTargets' | 'floatNoTargetsHint' | 'cardDisplay' | 'cardDisplayHint' | 'cardMetric' | 'cardMetricMoney' | 'cardMetricTokens' | 'cardSpan' | 'cardSpanDay' | 'cardSpanWeek' | 'cardSpanMonth' | 'cardDeltaBadge' | 'cardDeltaShow' | 'cardDeltaHide' | 'triggerMonthTokens' | 'triggerTodayTokens' | 'triggerWeekTokens' | 'subscriptionsStale' | 'balanceStaleNotice' | 'staleLedgerNotice' | 'staleSnapshotNotice' | 'unreadableNotice' | 'unreadableFormatNotice' | 'unreadableNoLedgerNotice' | 'tokenCacheWrite' | 'toolRank' | 'toolName' | 'userPrices' | 'userPricesHint' | 'userPriceSave' | 'userPriceModel' | 'userPriceSource' | 'userPriceSourceHint' | 'userPriceOffPeak' | 'userPriceNormal' | 'userPriceCurrency' | 'userPriceAdd' | 'userPriceRemoveSelected' | 'userPriceSelect' | 'sessionStaleBadge' | 'sessionUntitled' | 'sessionSubCost' | 'sessionSubCalls' | 'sessionSubRow' | 'heatmapLess' | 'heatmapMore' | 'currency' | 'currencyCny' | 'currencyUsd' | 'currencyEur' | 'language' | 'heatmap' | 'rounds' | 'roundsHint' | 'anomaly' | 'model' | 'thModel' | 'thInputMiss' | 'thInputHit' | 'costAbbr' | 'tabOverview' | 'tabTrends' | 'tabProviders' | 'tabPricing' | 'tabSettings' | 'budgetHint' | 'peakAlertHint' | 'peakAlertDescPeak' | 'peakAlertDescOff' | 'peakAlertDescPeakZhipu' | 'peakAlertDescOffZhipu' | 'export' | 'exportCsvDay' | 'exportCsvSession' | 'exportJson' | 'peakShare' | 'peakSharePerCall' | 'offPeakSavings' | 'perfMax' | 'weekCost' | 'roleCost' | 'roleUser' | 'roleAssistant' | 'roleTool' | 'roleHint' | 'tierPeak' | 'tierOff' | 'tierToPeak' | 'tierToOff' | 'tierAlertEnterPeak' | 'tierAlertEnterOff' | 'tierAlertEnterPeakZhipu' | 'tierAlertEnterOffZhipu' | 'peakAlertTitlePeak' | 'peakAlertTitleOff' | 'peakAlert' | 'peakAlertLeadMin' | 'peakAlertPos' | 'peakAlertMode' | 'peakAlertPosCorner' | 'peakAlertPosCenter' | 'peakAlertModePeak' | 'peakAlertModeOff' | 'peakAlertModeBoth' | 'peakAlertWebNotify' | 'peakAlertPreview' | 'planTypeCode' | 'planTypeToken' | 'subscriptionFeePerMonth' | 'triggerToday' | 'triggerMonth' | 'subscriptionTag' | 'cellEstimateHint' | 'free' | 'perfSamples' | 'perfTtft' | 'perfP50' | 'perfP90' | 'perfTps' | 'perfLatency' | 'perfEstimated' | 'perfEmpty' | 'perfTpsUnit' | 'perfTitle' | 'perfHint' | 'perfAll' | 'perfChartEmpty' | 'heatmapYear' | 'heatmapHalf' | 'heatmapMonth' | 'metricCost' | 'metricTokens' | 'heatmapTotal' | 'activeDays' | 'streakDays' | 'subscriptionAutoDetect' | 'pluginAuthor' | 'pluginRepository' | 'pluginNpm' | 'pluginLicense' | 'tabToken' | 'tokenExport' | 'tokenExportCsv' | 'tokenReasoningShare' | 'tokenReasoningShort' | 'tokenIo' | 'tokenPeak' | 'densityLabel' | 'densityHint' | 'densityCompact' | 'densityDefault' | 'densityComfortable' | 'motionLabel' | 'motionHint' | 'motionOff' | 'motionSubtle' | 'motionRich' | 'settingsNavDisplayPref' | 'settingsNavBudget' | 'settingsNavAlert' | 'settingsNavDisplay' | 'settingsNavAdvanced' | 'settingsNavAbout' | 'settingsSearchPlaceholder' | 'settingsSearchEmpty' | 'sessionsViewAll' | 'sessionViewerSearch' | 'modelBudgetTitle' | 'modelBudgetHint' | 'modelBudgetBody' | 'modelBudgetPlaceholder' | 'moreWorksTitle' | 'adEngramName' | 'adEngramDesc' | 'adRainbowName' | 'adRainbowDesc' | 'kpiDescCacheHit' | 'kpiDescTokens' | 'kpiDescAvgCost' | 'kpiDescCalls' | 'kpiDescReasoning' | 'kpiDescIo' | 'kpiDescPeak' | 'healthDotLive' | 'healthDotFailed' | 'healthDotUnknown' | 'settingsSectionDisplay' | 'emptyHint' | 'tokenDaily' | 'tokenByModel' | 'tokenMiss' | 'tokenHit' | 'tokenOutput' | 'tokenViewStructure' | 'tokenViewModel' | 'tokenHitShort' | 'tokenMissShort' | 'tokenTotal' | 'tokenShare' | 'usageStatsTool' | 'usageStatsToolHint' | 'balanceGranted' | 'balanceTopped' | 'balanceDaily' | 'balanceDaysLong' | 'balanceDaysUnit' | 'popTodayModel' | 'popNoConsumption' | 'popTitle' | 'popDirectLead' | 'popSubLead' | 'unpricedHint' | 'searchEstimateHint' | 'siteListDisplay' | 'siteListDisplayHint' | 'liveCostBar' | 'liveCostBarHint' | 'liveCostBarPosition' | 'liveCostBarPosBelow' | 'liveCostBarPosAbove' | 'liveCostBarPosToolbar' | 'exportCsvSite' | 'panelRelayQuota' | 'relayBalance' | 'relayNoQuota' | 'relayWindowUsed' | 'relayKindNewApi' | 'relayKindSub2Api' | 'relayKindUnknown' | 'expandAll' | 'collapseAll' | 'todayOnly' | 'todayNoConsumption';
|
|
2
|
+
export type UsageBillingKey = 'title' | 'cost' | 'todayCost' | 'monthCost' | 'yearCost' | 'monthProjected' | 'liveTurn' | 'liveSession' | 'liveSessionSub' | 'calls' | 'cacheHitRate' | 'tokens' | 'inputTokens' | 'outputTokens' | 'avgCost' | 'kpiRange' | 'avgRangeToday' | 'avgRange7d' | 'avgRangeWeek' | 'avgRangeMonth' | 'avgRangeAll' | 'trend' | 'trend7d' | 'trend30d' | 'trendMetric' | 'trendMetricCost' | 'trendMetricTokens' | 'pricingSearch' | 'bandPinHint' | 'trendEmpty' | 'trendTotal' | 'roundsUnit' | 'healthModelsLive' | 'healthVendorsDown' | 'healthVendorsUnavailable' | 'budget' | 'budgetRemain' | 'budgetAmount' | 'budgetSummary' | 'sessions' | 'sessionTitle' | 'lastActive' | 'sessionOverflow' | 'budgetTierBody' | 'models' | 'providerBilling' | 'channelUnknown' | 'directTag' | 'relayTag' | 'unknownTag' | 'unknownChannelHint' | 'planCountUnit' | 'actual' | 'pricing' | 'input' | 'output' | 'cacheHit' | 'peak' | 'offPeak' | 'flat' | 'band' | 'close' | 'footer' | 'footerCredit' | 'lastUpdated' | 'noData' | 'todayRate' | 'rateLive' | 'rateBuiltin' | 'pricingSyncedAt' | 'pricingSyncNow' | 'pricingSyncing' | 'promoBadge' | 'promoUntil' | 'promoOpenEnded' | 'pricingTip' | 'pricingUnit' | 'pricingNotes' | 'ubPeak' | 'ubOff' | 'ubStd' | 'peakBand' | 'pricingSource' | 'noteCache' | 'noteBand' | 'noteSource' | 'balance' | 'recharge' | 'rechargeHint' | 'balanceUnconfigured' | 'balanceUnauthorized' | 'balanceUnreachable' | 'uncatalogued' | 'estimatedPricing' | 'balanceDays' | 'balanceLowBody' | 'reconcileDrift' | 'reconcileDismiss' | 'subscriptionNotConfigured' | 'subscriptionUnauthorized' | 'subscriptionUnavailable' | 'subscriptionInvalid' | 'subscriptionRateLimited' | 'subscriptionSession' | 'subscriptionWeekly' | 'subscriptionMonthly' | 'subscriptionBilling' | 'subscriptionRemaining' | 'subscriptionExhausted' | 'subscriptionReset' | 'subscriptionNoApi' | 'floatWindow' | 'floatModeCombined' | 'floatModeSubscription' | 'floatMode' | 'floatTargets' | 'floatWindowHint' | 'floatPrimaryToday' | 'floatPrimaryWeek' | 'floatPrimaryMonth' | 'floatNoTargets' | 'floatNoTargetsHint' | 'cardDisplay' | 'cardDisplayHint' | 'cardMetric' | 'cardMetricMoney' | 'cardMetricTokens' | 'cardSpan' | 'cardSpanDay' | 'cardSpanWeek' | 'cardSpanMonth' | 'cardDeltaBadge' | 'cardDeltaShow' | 'cardDeltaHide' | 'triggerMonthTokens' | 'triggerTodayTokens' | 'triggerWeekTokens' | 'subscriptionsStale' | 'balanceStaleNotice' | 'staleLedgerNotice' | 'staleSnapshotNotice' | 'unreadableNotice' | 'unreadableFormatNotice' | 'unreadableNoLedgerNotice' | 'tokenCacheWrite' | 'toolRank' | 'toolName' | 'userPrices' | 'userPricesHint' | 'userPriceSave' | 'userPriceModel' | 'userPriceSource' | 'userPriceSourceHint' | 'userPriceOffPeak' | 'userPriceNormal' | 'userPriceCurrency' | 'userPriceAdd' | 'userPriceRemoveSelected' | 'userPriceSelect' | 'sessionStaleBadge' | 'sessionUntitled' | 'sessionSubCost' | 'sessionSubCalls' | 'sessionSubRow' | 'heatmapLess' | 'heatmapMore' | 'currency' | 'currencyCny' | 'currencyUsd' | 'currencyEur' | 'language' | 'heatmap' | 'rounds' | 'roundsHint' | 'anomaly' | 'model' | 'thModel' | 'thInputMiss' | 'thInputHit' | 'costAbbr' | 'tabOverview' | 'tabTrends' | 'tabProviders' | 'tabPricing' | 'tabSettings' | 'budgetHint' | 'peakAlertHint' | 'peakAlertDescPeak' | 'peakAlertDescOff' | 'peakAlertDescPeakZhipu' | 'peakAlertDescOffZhipu' | 'export' | 'exportCsvDay' | 'exportCsvSession' | 'exportJson' | 'peakShare' | 'peakSharePerCall' | 'offPeakSavings' | 'perfMax' | 'weekCost' | 'roleCost' | 'roleUser' | 'roleAssistant' | 'roleTool' | 'roleHint' | 'tierPeak' | 'tierOff' | 'tierToPeak' | 'tierToOff' | 'tierAlertEnterPeak' | 'tierAlertEnterOff' | 'tierAlertEnterPeakZhipu' | 'tierAlertEnterOffZhipu' | 'peakAlertTitlePeak' | 'peakAlertTitleOff' | 'peakAlert' | 'peakAlertLeadMin' | 'peakAlertPos' | 'peakAlertMode' | 'peakAlertPosCorner' | 'peakAlertPosCenter' | 'peakAlertModePeak' | 'peakAlertModeOff' | 'peakAlertModeBoth' | 'peakAlertWebNotify' | 'peakAlertPreview' | 'planTypeCode' | 'planTypeToken' | 'subscriptionFeePerMonth' | 'triggerToday' | 'triggerMonth' | 'subscriptionTag' | 'cellEstimateHint' | 'free' | 'perfSamples' | 'perfTtft' | 'perfP50' | 'perfP90' | 'perfTps' | 'perfLatency' | 'perfEstimated' | 'perfEmpty' | 'perfTpsUnit' | 'perfTitle' | 'perfHint' | 'perfAll' | 'perfChartEmpty' | 'heatmapYear' | 'heatmapHalf' | 'heatmapMonth' | 'metricCost' | 'metricTokens' | 'heatmapTotal' | 'activeDays' | 'streakDays' | 'subscriptionAutoDetect' | 'pluginAuthor' | 'pluginRepository' | 'pluginNpm' | 'pluginLicense' | 'tabToken' | 'tokenExport' | 'tokenExportCsv' | 'tokenReasoningShare' | 'tokenReasoningShort' | 'tokenIo' | 'tokenPeak' | 'densityLabel' | 'densityHint' | 'densityCompact' | 'densityDefault' | 'densityComfortable' | 'motionLabel' | 'motionHint' | 'motionOff' | 'motionSubtle' | 'motionRich' | 'settingsNavDisplayPref' | 'settingsNavBudget' | 'settingsNavAlert' | 'settingsNavDisplay' | 'settingsNavAdvanced' | 'settingsNavAbout' | 'settingsSearchPlaceholder' | 'settingsSearchEmpty' | 'sessionsViewAll' | 'sessionViewerSearch' | 'modelBudgetTitle' | 'modelBudgetHint' | 'modelBudgetBody' | 'modelBudgetPlaceholder' | 'moreWorksTitle' | 'adEngramName' | 'adEngramDesc' | 'adRainbowName' | 'adRainbowDesc' | 'kpiDescCacheHit' | 'kpiDescTokens' | 'kpiDescAvgCost' | 'kpiDescCalls' | 'kpiDescReasoning' | 'kpiDescIo' | 'kpiDescPeak' | 'healthDotLive' | 'healthDotFailed' | 'healthDotUnknown' | 'settingsSectionDisplay' | 'emptyHint' | 'tokenDaily' | 'tokenByModel' | 'tokenMiss' | 'tokenHit' | 'tokenOutput' | 'tokenViewStructure' | 'tokenViewModel' | 'tokenHitShort' | 'tokenMissShort' | 'tokenTotal' | 'tokenShare' | 'usageStatsTool' | 'usageStatsToolHint' | 'balanceGranted' | 'balanceTopped' | 'balanceDaily' | 'balanceDaysLong' | 'balanceDaysUnit' | 'popTodayModel' | 'popNoConsumption' | 'popTitle' | 'popDirectLead' | 'popSubLead' | 'unpricedHint' | 'searchEstimateHint' | 'siteListDisplay' | 'siteListDisplayHint' | 'liveCostBar' | 'liveCostBarHint' | 'liveCostBarPosition' | 'liveCostBarPosBelow' | 'liveCostBarPosAbove' | 'liveCostBarPosToolbar' | 'exportCsvSite' | 'panelRelayQuota' | 'relayBalance' | 'relayNoQuota' | 'relayWindowUsed' | 'relayKindNewApi' | 'relayKindSub2Api' | 'relayKindUnknown' | 'expandAll' | 'collapseAll' | 'todayOnly' | 'todayNoConsumption' | 'commandUsageLabel' | 'commandUsageDescription' | 'sessionOpen' | 'sessionOpenFailed' | 'sessionOpenUnavailable' | 'contextOccupancy' | 'contextWindow' | 'contextSystem' | 'contextTools' | 'contextMessages' | 'contextNoData' | 'tabContext' | 'tabAgents' | 'contextNextRequest' | 'contextLastRequest' | 'contextComposition' | 'contextCompositionHint' | 'agentsSummary' | 'agentsCount' | 'agentsDelegations' | 'agentsRoots' | 'agentsMostExpensive' | 'agentsChainTotal' | 'agentsNoData' | 'agentsSubagent' | 'agentsRoot';
|
|
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,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 会话跳转(跨插件导航):把面板里的会话行接到宿主的会话选择通道。
|
|
3
|
+
*
|
|
4
|
+
* 宿主有**两代**通道(实测自 deepseek-harness 源码,非推测):
|
|
5
|
+
* - 0.1.6-alpha.2+:`ctx.uiWorkspace.openSession(SessionId)`
|
|
6
|
+
* (@deepseek-ai/dsh-client-ui-workspace,packages/client/ui-workspace/src/client/navigation.ts:36)
|
|
7
|
+
* - 0.1.2-alpha.1 ~ 0.1.6-alpha.1:`ctx.sessions.open(SessionId)`
|
|
8
|
+
* (@deepseek-ai/dsh-api-session-controller,packages/api/session-controller/src/client/contract/sessions.ts:44
|
|
9
|
+
* —— 注释写明「id 必须在列表中,不存在则 fail loud」)
|
|
10
|
+
* master 已移除 `sessions.open`,故运行时按「新 → 旧」探测,两条都不可用时降级为不可跳转。
|
|
11
|
+
*
|
|
12
|
+
* 取服务一律走 `ctx.get()`(cordis 的免 inject 服务读取),**不进 inject 列表**:
|
|
13
|
+
* 老宿主没有 uiWorkspace 服务,把它声明成注入依赖会挂起等它、卡住整个 web 启动
|
|
14
|
+
* (本仓 apply.ts 对 remote.llm 的注释记过这个坑:issue #28 的同源教训)。
|
|
15
|
+
*
|
|
16
|
+
* 老宿主的 `sessions.open` 对未知 id 会 fail loud——本插件的会话行来自**持久化会话
|
|
17
|
+
* 日志**,可能不在宿主当前会话列表里(删过、别的 profile、只读快照),故调用必须
|
|
18
|
+
* 包 try/catch 并把失败如实回报给 UI,不得让点击抛错。
|
|
19
|
+
*/
|
|
20
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
21
|
+
/** 跳转结果:opened=已跳转;unavailable=宿主无通道(老到没有);failed=通道报错。 */
|
|
22
|
+
export type SessionNavigationResult = 'opened' | 'unavailable' | 'failed';
|
|
23
|
+
/** 会话跳转器:面板用它把「点会话行」接到宿主导航。 */
|
|
24
|
+
export interface SessionNavigator {
|
|
25
|
+
/** 当前宿主是否具备跳转能力(运行时探测,服务可能后到)。 */
|
|
26
|
+
available(): boolean;
|
|
27
|
+
/** 打开指定会话;返回结果供 UI 决定是否提示。 */
|
|
28
|
+
open(sessionId: string): SessionNavigationResult;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* 构造会话跳转器。
|
|
32
|
+
* @param ctx - 客户端根 context(服务读取走 ctx.get,不声明注入依赖)。
|
|
33
|
+
* @returns 跳转器。
|
|
34
|
+
*/
|
|
35
|
+
export declare function createSessionNavigator(ctx: Context): SessionNavigator;
|
|
36
|
+
//# sourceMappingURL=session-navigation.d.ts.map
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `/usage` 对话内命令:把计费仪表盘拉进对话流。
|
|
3
|
+
*
|
|
4
|
+
* 宿主能力(@deepseek-ai/dsh-client-ui-commands,`ctx.commandUi`):
|
|
5
|
+
* - `register(contribution)` 注册一个**客户端自有**的斜杠命令,与宿主命令目录按
|
|
6
|
+
* 名字合并;同名撞宿主命令会 fail loud(绝不遮蔽宿主命令)——故命令名取
|
|
7
|
+
* `usage`,宿主目录里没有同名命令。
|
|
8
|
+
* - `contribution.ui` 用 `{ kind: 'action', run(session) }`:行为完全在客户端,
|
|
9
|
+
* 不回传宿主命令执行器。
|
|
10
|
+
* - `label` / `description` 是**函数**:菜单每次打开都重新读取,切换语言立即生效,
|
|
11
|
+
* 无需重新注册。
|
|
12
|
+
*
|
|
13
|
+
* 取服务走 `ctx.get('commandUi')`(cordis 免 inject 读取):老宿主没有该服务时
|
|
14
|
+
* **不注册命令**,面板功能完全不受影响——这是「服务缺席即降级、不得因此收窄兼容
|
|
15
|
+
* 矩阵」的落点(宿主自己的 ui-permission-presets 也是 `ctx.get('commandUi')`)。
|
|
16
|
+
*/
|
|
17
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
18
|
+
/** 命令名(斜杠后不带斜杠):与宿主命令目录合并的键。 */
|
|
19
|
+
export declare const USAGE_COMMAND_NAME = "usage";
|
|
20
|
+
/** 注册参数。 */
|
|
21
|
+
export interface UsageCommandOptions {
|
|
22
|
+
/** 打开计费仪表盘(复用面板已注册的打开回调)。 */
|
|
23
|
+
openDashboard: () => void;
|
|
24
|
+
/** 菜单行标题(每次候选合成时读取,语言切换即时生效)。 */
|
|
25
|
+
label: () => string;
|
|
26
|
+
/** 菜单行描述。 */
|
|
27
|
+
description: () => string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* 注册 `/usage` 命令。
|
|
31
|
+
*
|
|
32
|
+
* @param ctx - 客户端根 context。
|
|
33
|
+
* @param options - 打开回调与文案。
|
|
34
|
+
* @returns 是否注册成功(宿主无 commandUi 服务时返回 false,属正常降级)。
|
|
35
|
+
*/
|
|
36
|
+
export declare function registerUsageCommand(ctx: Context, options: UsageCommandOptions): boolean;
|
|
37
|
+
//# sourceMappingURL=usage-command.d.ts.map
|
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": "1.
|
|
4
|
+
"version": "1.7.0",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"deepseek-harness",
|
|
7
7
|
"deepseek",
|
|
@@ -81,7 +81,8 @@
|
|
|
81
81
|
"0.2.1-alpha.4": "compatible",
|
|
82
82
|
"0.2.1-alpha.5": "compatible",
|
|
83
83
|
"0.2.1-rc.1": "compatible",
|
|
84
|
-
"0.2.1-rc.2": "compatible"
|
|
84
|
+
"0.2.1-rc.2": "compatible",
|
|
85
|
+
"0.2.1-rc.3": "compatible"
|
|
85
86
|
}
|
|
86
87
|
}
|
|
87
88
|
},
|
|
@@ -90,6 +91,7 @@
|
|
|
90
91
|
"bundle": "tsdown",
|
|
91
92
|
"watch": "tsdown --watch",
|
|
92
93
|
"lint": "node scripts/lint.mjs && node scripts/check-clientbundle-sync.mjs",
|
|
94
|
+
"size": "node scripts/check-bundle-size.mjs",
|
|
93
95
|
"test": "vitest run",
|
|
94
96
|
"test:e2e": "playwright test",
|
|
95
97
|
"test:e2e:install": "playwright install chromium"
|
|
@@ -110,6 +112,9 @@
|
|
|
110
112
|
"@deepseek-ai/dsh-client-ui-primitives": "*",
|
|
111
113
|
"@deepseek-ai/dsh-client-ui-sidebar": "*",
|
|
112
114
|
"@deepseek-ai/dsh-client-ui-slots": "*",
|
|
115
|
+
"@deepseek-ai/dsh-client-ui-commands": "*",
|
|
116
|
+
"@deepseek-ai/dsh-client-ui-workspace": "*",
|
|
117
|
+
"@deepseek-ai/dsh-token-meter": "*",
|
|
113
118
|
"@deepseek-ai/dsh-credentials": "*",
|
|
114
119
|
"@deepseek-ai/dsh-home-paths": "*",
|
|
115
120
|
"@deepseek-ai/dsh-host-webserver": "*",
|
|
@@ -129,36 +134,39 @@
|
|
|
129
134
|
"@deepseek-ai/cordis": "*",
|
|
130
135
|
"@deepseek-ai/cordis-plugin-include": "^1.0.7",
|
|
131
136
|
"@deepseek-ai/cordis-plugin-loader": "^1.0.5",
|
|
132
|
-
"@deepseek-ai/dsh-agent": "0.2.1-rc.
|
|
133
|
-
"@deepseek-ai/dsh-api-gateway": "0.2.1-rc.
|
|
134
|
-
"@deepseek-ai/dsh-api-remotes": "0.2.1-rc.
|
|
135
|
-
"@deepseek-ai/dsh-api-session-controller": "0.2.1-rc.
|
|
136
|
-
"@deepseek-ai/dsh-atomic-write": "0.2.1-rc.
|
|
137
|
-
"@deepseek-ai/dsh-client-locale": "0.2.1-rc.
|
|
138
|
-
"@deepseek-ai/dsh-client-store": "0.2.1-rc.
|
|
139
|
-
"@deepseek-ai/dsh-client-ui-conversation": "0.2.1-rc.
|
|
140
|
-
"@deepseek-ai/dsh-client-ui-
|
|
141
|
-
"@deepseek-ai/dsh-client-ui-
|
|
142
|
-
"@deepseek-ai/dsh-client-ui-
|
|
143
|
-
"@deepseek-ai/dsh-client-ui-
|
|
144
|
-
"@deepseek-ai/dsh-
|
|
145
|
-
"@deepseek-ai/dsh-
|
|
146
|
-
"@deepseek-ai/dsh-
|
|
137
|
+
"@deepseek-ai/dsh-agent": "0.2.1-rc.3",
|
|
138
|
+
"@deepseek-ai/dsh-api-gateway": "0.2.1-rc.3",
|
|
139
|
+
"@deepseek-ai/dsh-api-remotes": "0.2.1-rc.3",
|
|
140
|
+
"@deepseek-ai/dsh-api-session-controller": "0.2.1-rc.3",
|
|
141
|
+
"@deepseek-ai/dsh-atomic-write": "0.2.1-rc.3",
|
|
142
|
+
"@deepseek-ai/dsh-client-locale": "0.2.1-rc.3",
|
|
143
|
+
"@deepseek-ai/dsh-client-store": "0.2.1-rc.3",
|
|
144
|
+
"@deepseek-ai/dsh-client-ui-conversation": "0.2.1-rc.3",
|
|
145
|
+
"@deepseek-ai/dsh-client-ui-commands": "0.2.1-rc.3",
|
|
146
|
+
"@deepseek-ai/dsh-client-ui-workspace": "0.2.1-rc.3",
|
|
147
|
+
"@deepseek-ai/dsh-client-ui-primitives": "0.2.1-rc.3",
|
|
148
|
+
"@deepseek-ai/dsh-client-ui-renderer": "0.2.1-rc.3",
|
|
149
|
+
"@deepseek-ai/dsh-client-ui-sidebar": "0.2.1-rc.3",
|
|
150
|
+
"@deepseek-ai/dsh-client-ui-slots": "0.2.1-rc.3",
|
|
151
|
+
"@deepseek-ai/dsh-credentials": "0.2.1-rc.3",
|
|
152
|
+
"@deepseek-ai/dsh-home-paths": "0.2.1-rc.3",
|
|
153
|
+
"@deepseek-ai/dsh-host-webserver": "0.2.1-rc.3",
|
|
147
154
|
"@deepseek-ai/dsh-invariants": "0.2.0-rc.2",
|
|
148
|
-
"@deepseek-ai/dsh-llm": "0.2.1-rc.
|
|
149
|
-
"@deepseek-ai/dsh-ptc-runtime": "0.2.1-rc.
|
|
150
|
-
"@deepseek-ai/dsh-sandbox": "0.2.1-rc.
|
|
151
|
-
"@deepseek-ai/dsh-sandbox-policy": "0.2.1-rc.
|
|
152
|
-
"@deepseek-ai/dsh-scope": "0.2.1-rc.
|
|
153
|
-
"@deepseek-ai/dsh-session": "0.2.1-rc.
|
|
154
|
-
"@deepseek-ai/dsh-session-persistence": "0.2.1-rc.
|
|
155
|
-
"@deepseek-ai/dsh-settings": "0.2.1-rc.
|
|
156
|
-
"@deepseek-ai/dsh-system-prompt": "0.2.1-rc.
|
|
157
|
-
"@deepseek-ai/dsh-
|
|
158
|
-
"@deepseek-ai/dsh-
|
|
159
|
-
"@deepseek-ai/dsh-
|
|
160
|
-
"@deepseek-ai/dsh-
|
|
161
|
-
"@deepseek-ai/dsh-util-
|
|
155
|
+
"@deepseek-ai/dsh-llm": "0.2.1-rc.3",
|
|
156
|
+
"@deepseek-ai/dsh-ptc-runtime": "0.2.1-rc.3",
|
|
157
|
+
"@deepseek-ai/dsh-sandbox": "0.2.1-rc.3",
|
|
158
|
+
"@deepseek-ai/dsh-sandbox-policy": "0.2.1-rc.3",
|
|
159
|
+
"@deepseek-ai/dsh-scope": "0.2.1-rc.3",
|
|
160
|
+
"@deepseek-ai/dsh-session": "0.2.1-rc.3",
|
|
161
|
+
"@deepseek-ai/dsh-session-persistence": "0.2.1-rc.3",
|
|
162
|
+
"@deepseek-ai/dsh-settings": "0.2.1-rc.3",
|
|
163
|
+
"@deepseek-ai/dsh-system-prompt": "0.2.1-rc.3",
|
|
164
|
+
"@deepseek-ai/dsh-token-meter": "0.2.1-rc.3",
|
|
165
|
+
"@deepseek-ai/dsh-tools": "0.2.1-rc.3",
|
|
166
|
+
"@deepseek-ai/dsh-typert-protocol": "0.2.1-rc.3",
|
|
167
|
+
"@deepseek-ai/dsh-user-approval": "0.2.1-rc.3",
|
|
168
|
+
"@deepseek-ai/dsh-util-code-language": "0.2.1-rc.3",
|
|
169
|
+
"@deepseek-ai/dsh-util-workspace-path": "0.2.1-rc.3",
|
|
162
170
|
"@deepseek-ai/schemastery": "^3.18.4",
|
|
163
171
|
"@playwright/test": "^1.64.1",
|
|
164
172
|
"@shikijs/langs": "^4.3.1",
|