@rayadesu/dsh-client-ui-billing 0.3.12 → 0.3.13
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.i18n.yaml +2 -2
- package/README.md +7 -6
- package/README.zh.md +8 -6
- package/lib/client.js +446 -71
- package/lib/types/client/BalanceBadge.d.ts +17 -7
- package/lib/types/client/BalancePanel.d.ts +6 -1
- package/lib/types/client/format.d.ts +47 -4
- package/lib/types/client/locales.d.ts +7 -7
- package/lib/types/client/spendBuckets.d.ts +30 -0
- package/lib/types/client/spends.d.ts +22 -0
- package/lib/types/client/useBillingData.d.ts +23 -6
- package/package.json +44 -25
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Session-header billing badge: balance plus the current conversation's billed
|
|
3
|
-
* spend
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
3
|
+
* spend, both carrying the detail panel's own labels (`API 剩余金额` /
|
|
4
|
+
* `本会话花费`). Composition root: the data lifecycle lives in
|
|
5
|
+
* {@link useBillingData}, and the trigger / detail panel are pure views. The
|
|
6
|
+
* badge renders null until the first balance fetch settles, and a refresh keeps
|
|
7
|
+
* the last values visible rather than blanking them.
|
|
7
8
|
*/
|
|
8
|
-
import type { DeepSeekBalance, DeepSeekSessionSpend, DeepSeekTodaySessionsSpend, DeepSeekTodaySpend } from '@rayadesu/dsh-llm-billing/types';
|
|
9
|
+
import type { DeepSeekBalance, DeepSeekDelegatedSpend, DeepSeekSessionSpend, DeepSeekTodaySessionsSpend, DeepSeekTodaySpend } from '@rayadesu/dsh-llm-billing/types';
|
|
9
10
|
import type { SessionId } from '@deepseek-ai/dsh-session/types';
|
|
10
11
|
import type { InjectFace, PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots';
|
|
11
12
|
import { NS } from './locales.ts';
|
|
@@ -28,6 +29,13 @@ export interface BalanceBadgeInjected {
|
|
|
28
29
|
getCachedBalance: () => DeepSeekBalance | null;
|
|
29
30
|
/** Read one session's billed spend; rejects with the Remote error message. */
|
|
30
31
|
getSessionSpend: (sessionId: SessionId) => Promise<DeepSeekSessionSpend>;
|
|
32
|
+
/**
|
|
33
|
+
* Read the subagent part of one conversation's billed spend: every subagent
|
|
34
|
+
* session that session delegated, transitively, across every day. The badge
|
|
35
|
+
* adds it to the live own-session value, so the amount it shows is the whole
|
|
36
|
+
* conversation's. `force` behaves as in {@link getTodaySpend}.
|
|
37
|
+
*/
|
|
38
|
+
getDelegatedSpend: (sessionId: SessionId, force?: boolean) => Promise<DeepSeekDelegatedSpend>;
|
|
31
39
|
/**
|
|
32
40
|
* Read today's billed spend across every session; rejects with the Remote
|
|
33
41
|
* error message. `force` bypasses the host-side cache — the manual refresh
|
|
@@ -36,7 +44,9 @@ export interface BalanceBadgeInjected {
|
|
|
36
44
|
getTodaySpend: (force?: boolean) => Promise<DeepSeekTodaySpend>;
|
|
37
45
|
/**
|
|
38
46
|
* Read today's billed spend per session, sorted by cost descending; rejects
|
|
39
|
-
* with the Remote error message.
|
|
47
|
+
* with the Remote error message. One row per top-level conversation: the host
|
|
48
|
+
* merges every subagent session's spend into the row of the session that
|
|
49
|
+
* delegated it. `force` behaves as in {@link getTodaySpend}.
|
|
40
50
|
*/
|
|
41
51
|
getTodaySessionsSpend: (force?: boolean) => Promise<DeepSeekTodaySessionsSpend>;
|
|
42
52
|
}
|
|
@@ -50,5 +60,5 @@ export type BalanceBadgeProps = PropsRuntime<'conversation.session.header.utilit
|
|
|
50
60
|
* @param props - Remote face, locale, and the standard session-header runtime share.
|
|
51
61
|
* @returns the badge, or null until the first balance fetch settles.
|
|
52
62
|
*/
|
|
53
|
-
export declare function BalanceBadge({ getBalance, getCachedBalance, getSessionSpend, getTodaySpend, getTodaySessionsSpend, sessionId, useSession, useProjection, t }: BalanceBadgeProps): import("react").JSX.Element | null;
|
|
63
|
+
export declare function BalanceBadge({ getBalance, getCachedBalance, getSessionSpend, getTodaySpend, getTodaySessionsSpend, getDelegatedSpend, sessionId, useSession, useProjection, t }: BalanceBadgeProps): import("react").JSX.Element | null;
|
|
54
64
|
//# sourceMappingURL=BalanceBadge.d.ts.map
|
|
@@ -12,13 +12,18 @@ export interface BalancePanelProps {
|
|
|
12
12
|
amount: string;
|
|
13
13
|
/** The session this panel belongs to: the row looked up in today's ranking. */
|
|
14
14
|
sessionId: SessionId;
|
|
15
|
+
/** The WHOLE conversation's billed spend (this session plus the subagents it delegated). */
|
|
15
16
|
spend: DeepSeekSessionSpend | null;
|
|
16
17
|
todaySpend: DeepSeekTodaySpend | null;
|
|
17
18
|
sessionsSpend: DeepSeekTodaySessionsSpend | null;
|
|
19
|
+
/** Whether this session is itself a delegated subagent child (so it has no ranking row of its own). */
|
|
20
|
+
isSubagent: boolean;
|
|
21
|
+
/** Whether this session started on an earlier Beijing day (the only time a today share is shown). */
|
|
22
|
+
crossedDay: boolean;
|
|
18
23
|
refreshing: boolean;
|
|
19
24
|
onRefresh: () => void;
|
|
20
25
|
t: PropsLocale<typeof NS>['t'];
|
|
21
26
|
}
|
|
22
27
|
/** The detail box opened from the badge trigger. */
|
|
23
|
-
export declare function BalancePanel({ amount, sessionId, spend, todaySpend, sessionsSpend, refreshing, onRefresh, t }: BalancePanelProps): import("react").JSX.Element;
|
|
28
|
+
export declare function BalancePanel({ amount, sessionId, spend, todaySpend, sessionsSpend, isSubagent, crossedDay, refreshing, onRefresh, t }: BalancePanelProps): import("react").JSX.Element;
|
|
24
29
|
//# sourceMappingURL=BalancePanel.d.ts.map
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Shared display formatting for the billing badges: the balance-line currency
|
|
3
|
-
* prefix, the CNY spend amount renderer,
|
|
4
|
-
* header badge and the per-turn cost label
|
|
5
|
-
* entries cannot drift apart.
|
|
3
|
+
* prefix, the CNY spend amount renderer, the token-count renderer, and the
|
|
4
|
+
* cache-hit percentage. Both the header badge and the per-turn cost label
|
|
5
|
+
* format through these, so the two entries cannot drift apart.
|
|
6
6
|
*/
|
|
7
7
|
import type { DeepSeekBalance } from '@rayadesu/dsh-llm-billing/types';
|
|
8
8
|
/** Currency prefix for one balance line; unknown codes render as a literal prefix. */
|
|
@@ -12,8 +12,30 @@ export declare function primaryLine(balance: DeepSeekBalance): {
|
|
|
12
12
|
symbol: string;
|
|
13
13
|
total: string;
|
|
14
14
|
} | undefined;
|
|
15
|
-
/**
|
|
15
|
+
/**
|
|
16
|
+
* CNY amount, up to four decimals with trailing zeros trimmed. The balance line's
|
|
17
|
+
* renderer; spend figures go through {@link formatSpendSignificant} instead.
|
|
18
|
+
*/
|
|
16
19
|
export declare function formatSpend(amount: number): string;
|
|
20
|
+
/**
|
|
21
|
+
* CNY spend amount at a fixed number of SIGNIFICANT digits (default three),
|
|
22
|
+
* trailing zeros trimmed, prefixed with `¥` — and never finer than the panel's
|
|
23
|
+
* own four-decimal resolution.
|
|
24
|
+
*
|
|
25
|
+
* Every spend figure the plugin renders goes through this: the day's own amount
|
|
26
|
+
* and its three bucket costs, this session's spend and the parenthesized today
|
|
27
|
+
* share after it, the per-model rows and their bucket breakdowns, the ranking
|
|
28
|
+
* amounts, and the badge's own spend line. Four decimals are noise at these
|
|
29
|
+
* magnitudes — their last digits move with every request (`¥0.5068` → `¥0.507`)
|
|
30
|
+
* — while the four-decimal bound keeps a microscopic amount from growing a long
|
|
31
|
+
* `¥0.00002` string that would widen its column: an amount that rounds to zero
|
|
32
|
+
* there reads `¥0`. Only the BALANCE line keeps {@link formatSpend}'s plain four
|
|
33
|
+
* decimals, because remaining credit is a balance, not a spend measurement.
|
|
34
|
+
* @param amount - the amount to render.
|
|
35
|
+
* @param digits - significant digits to keep (default 3).
|
|
36
|
+
* @returns the rendered amount, e.g. `¥9.58`, `¥0.507`, `¥1230`, `¥0`.
|
|
37
|
+
*/
|
|
38
|
+
export declare function formatSpendSignificant(amount: number, digits?: number): string;
|
|
17
39
|
/**
|
|
18
40
|
* A token count in DSH's own compact notation: `517` / `12.2K` / `517K` / `1.2M`.
|
|
19
41
|
*
|
|
@@ -30,6 +52,27 @@ export declare function formatSpend(amount: number): string;
|
|
|
30
52
|
* @returns the compact count, without the label's own ` tok` suffix.
|
|
31
53
|
*/
|
|
32
54
|
export declare function formatTokens(count: number): string;
|
|
55
|
+
/**
|
|
56
|
+
* The cache-hit share of one prompt, in DSH's own percentage rule.
|
|
57
|
+
*
|
|
58
|
+
* Mirrors ui-chat's `formatCacheHitPercent`
|
|
59
|
+
* (`packages/client/ui-chat/src/client/chat/token-format.ts`) rule for rule, so
|
|
60
|
+
* one shell never prints the same ratio two ways: an integer percentage by
|
|
61
|
+
* default, and — because a partial hit must never round up to a full one — just
|
|
62
|
+
* enough extra decimals to stay below 100 when integer rounding would reach it
|
|
63
|
+
* (`99`, `99.5`, `99.95`, …). The rounding runs in integer arithmetic with
|
|
64
|
+
* positive ties going up, so it does not ride on binary-float precision.
|
|
65
|
+
*
|
|
66
|
+
* The ratio is over PROMPT-side tokens only (cache read over cache read plus
|
|
67
|
+
* uncached input, the split DSH's own `billedInputTokens` makes); output tokens
|
|
68
|
+
* never enter the denominator.
|
|
69
|
+
* @param cacheReadTokens - exact prompt tokens served from cache.
|
|
70
|
+
* @param promptTokens - exact aggregate prompt-side tokens.
|
|
71
|
+
* @param decimalPlaces - ordinary-ratio precision; a partial hit that would
|
|
72
|
+
* round to 100 automatically uses enough additional precision to stay honest.
|
|
73
|
+
* @returns percentage text without its `%`, or null when there was no prompt input.
|
|
74
|
+
*/
|
|
75
|
+
export declare function formatCacheHitPercent(cacheReadTokens: number, promptTokens: number, decimalPlaces?: 0 | 1): string | null;
|
|
33
76
|
/** Every billed token bucket of one priced model row. */
|
|
34
77
|
export interface TokenBuckets {
|
|
35
78
|
/** Cache-hit input tokens. */
|
|
@@ -3,28 +3,28 @@
|
|
|
3
3
|
export declare const NS = "billing";
|
|
4
4
|
/** Simplified Chinese dictionary (the key-set source of truth). */
|
|
5
5
|
export declare const zh: {
|
|
6
|
-
readonly 'trigger.balance': "
|
|
7
|
-
readonly 'trigger.conversationSpend': "本轮对话花费:{amount}";
|
|
6
|
+
readonly 'trigger.balance': "剩余金额:{amount}";
|
|
8
7
|
readonly 'label.amount': "API 剩余金额:{amount}";
|
|
9
8
|
readonly 'label.sessionSpend': "本会话花费:{amount}";
|
|
10
|
-
readonly 'label.sessionSpend.today': "
|
|
9
|
+
readonly 'label.sessionSpend.today': " {amount}";
|
|
11
10
|
readonly 'label.todaySpend': "今日花费:{amount}";
|
|
12
11
|
readonly 'label.todayTokens': "今日 Token:{count}";
|
|
12
|
+
readonly 'label.todayTokens.hit': " {percent}%";
|
|
13
13
|
readonly 'unit.tokens': "{count} tok";
|
|
14
14
|
readonly 'label.cost.input': "未缓存输入 {amount}";
|
|
15
15
|
readonly 'label.cost.cacheRead': "缓存读取 {amount}";
|
|
16
16
|
readonly 'label.cost.output': "输出 {amount}";
|
|
17
17
|
readonly 'card.title': "花费金额";
|
|
18
|
-
readonly 'card.input': "未缓存输入";
|
|
19
|
-
readonly 'card.cacheRead': "缓存读取";
|
|
20
|
-
readonly 'card.output': "输出";
|
|
21
18
|
readonly 'card.aria': "本轮对话花费:{amount}";
|
|
19
|
+
readonly 'label.bucket.input': "未缓存输入";
|
|
20
|
+
readonly 'label.bucket.cacheRead': "缓存读取";
|
|
21
|
+
readonly 'label.bucket.output': "输出";
|
|
22
22
|
readonly 'stat.none': "暂无消耗记录";
|
|
23
23
|
readonly 'stat.untitled': "未命名";
|
|
24
24
|
readonly 'state.unavailable': "额度不可用";
|
|
25
25
|
readonly 'action.refresh': "刷新";
|
|
26
26
|
readonly 'info.aria': "花费说明";
|
|
27
|
-
readonly 'info.hint': "估算:仅 DeepSeek 与 MiMo 模型,按每条消息自身时刻的峰谷官方单价计价(高峰:工作日 9:00–12:00、14:00–18:00)。\n
|
|
27
|
+
readonly 'info.hint': "估算:仅 DeepSeek 与 MiMo 模型,按每条消息自身时刻的峰谷官方单价计价(高峰:工作日 9:00–12:00、14:00–18:00)。\n金额含本会话委派的子代理会话。\n紧跟的数字为本会话今日花费。\nv{version}";
|
|
28
28
|
readonly 'badge.aria': "DeepSeek 额度:{amount}";
|
|
29
29
|
readonly 'panel.aria': "DeepSeek 额度详情";
|
|
30
30
|
readonly 'label.sessionRanking': "今日会话花费";
|
|
@@ -35,4 +35,34 @@ export interface SpendBuckets {
|
|
|
35
35
|
export declare function spendBucketsOf(spend: DeepSeekTodaySpend): SpendBuckets;
|
|
36
36
|
/** Whether a spend has any priced amount to show (a zero card stays hidden). */
|
|
37
37
|
export declare function hasBilledSpend(spend: DeepSeekTodaySpend): boolean;
|
|
38
|
+
/** One spend's three bucket TOKEN counts, in DSH's row order. */
|
|
39
|
+
export interface TokenBucketCounts {
|
|
40
|
+
/** Uncached (cache-miss) input tokens, cache writes included. */
|
|
41
|
+
uncachedInput: number;
|
|
42
|
+
/** Cache-hit (cache-read) input tokens. */
|
|
43
|
+
cacheRead: number;
|
|
44
|
+
/** Output tokens, reasoning included. */
|
|
45
|
+
output: number;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Fold one spend's model rows into the three bucket TOKEN counts — the token
|
|
49
|
+
* side of {@link spendBucketsOf}, so a surface that shows both (the panel's
|
|
50
|
+
* today rows) reads one bucket's tokens and its cost from the same rows.
|
|
51
|
+
*
|
|
52
|
+
* No reconciliation is needed here: tokens are integers, so the three counts
|
|
53
|
+
* always add up to the total the token line shows.
|
|
54
|
+
* @param spend - the day's (or one session's) priced rows.
|
|
55
|
+
* @returns the three bucket token counts.
|
|
56
|
+
*/
|
|
57
|
+
export declare function tokenBucketsOf(spend: DeepSeekTodaySpend): TokenBucketCounts;
|
|
58
|
+
/**
|
|
59
|
+
* The cache-hit share of one spend, in DSH's own percentage rule — the ratio of
|
|
60
|
+
* the cache-read bucket to every PROMPT-side bucket (uncached input with cache
|
|
61
|
+
* writes folded in, plus cache read), output excluded, exactly the split DSH's
|
|
62
|
+
* `billedInputTokens` makes. Rendered by {@link formatCacheHitPercent}, i.e. an
|
|
63
|
+
* integer percent that grows decimals only to keep a partial hit below 100.
|
|
64
|
+
* @param spend - the day's priced rows.
|
|
65
|
+
* @returns the percentage text without its `%`, or null when the spend billed no prompt input.
|
|
66
|
+
*/
|
|
67
|
+
export declare function cacheHitPercentOf(spend: DeepSeekTodaySpend): string | null;
|
|
38
68
|
//# sourceMappingURL=spendBuckets.d.ts.map
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Additive merge of a conversation's two spend halves: the session's OWN billed
|
|
3
|
+
* spend (live, from the pushed `billingTodaySpend` projection or the
|
|
4
|
+
* `billing/getSessionSpend` fallback) and the delegated-subagent subtotal
|
|
5
|
+
* (`billing/getDelegatedSpend`). The panel shows one amount for the whole
|
|
6
|
+
* conversation, so the two must be summed before rendering — and the per-model
|
|
7
|
+
* rows must be summed the same way, or the breakdown would no longer add up to
|
|
8
|
+
* the amount above it.
|
|
9
|
+
*
|
|
10
|
+
* Pure addition only: no pricing, no timezone, no fork-boundary knowledge lives
|
|
11
|
+
* here (the host owns all of that), so this cannot drift from the host's own
|
|
12
|
+
* sums.
|
|
13
|
+
*/
|
|
14
|
+
import type { DeepSeekSessionSpend } from '@rayadesu/dsh-llm-billing/types';
|
|
15
|
+
/**
|
|
16
|
+
* Sum one conversation's own spend and its delegated-subagent subtotal.
|
|
17
|
+
* @param own - the session's own billed spend.
|
|
18
|
+
* @param delegated - the delegated subtotal from the last `getDelegatedSpend` read.
|
|
19
|
+
* @returns the merged spend (own model order first, then newly seen models).
|
|
20
|
+
*/
|
|
21
|
+
export declare function sumSpends(own: DeepSeekSessionSpend, delegated: DeepSeekSessionSpend): DeepSeekSessionSpend;
|
|
22
|
+
//# sourceMappingURL=spends.d.ts.map
|
|
@@ -6,9 +6,24 @@ export declare const TURN_SETTLE_DEBOUNCE_MS = 2000;
|
|
|
6
6
|
/** The data surface the trigger and the panel render from. */
|
|
7
7
|
export interface BillingData {
|
|
8
8
|
balance: DeepSeekBalance | null;
|
|
9
|
+
/**
|
|
10
|
+
* The WHOLE conversation's billed spend: this session's own spend (live, from
|
|
11
|
+
* the pushed projection or the `getSessionSpend` fallback) plus the subagent
|
|
12
|
+
* sessions it delegated (the last `getDelegatedSpend` read), so the amount a
|
|
13
|
+
* user reads is the conversation's, not just its own log's.
|
|
14
|
+
*/
|
|
9
15
|
spend: DeepSeekSessionSpend | null;
|
|
10
16
|
todaySpend: DeepSeekTodaySpend | null;
|
|
11
17
|
sessionsSpend: DeepSeekTodaySessionsSpend | null;
|
|
18
|
+
/** Whether the current session is itself a delegated subagent child. */
|
|
19
|
+
isSubagent: boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Whether the current session started on an EARLIER Beijing day — the only
|
|
22
|
+
* case in which the panel's parenthesized today share is meaningful.
|
|
23
|
+
* `false` until the delegated read settles (an unproven crossing stays
|
|
24
|
+
* hidden) and for every session created today.
|
|
25
|
+
*/
|
|
26
|
+
crossedDay: boolean;
|
|
12
27
|
/** Balance fetch failure while no value is present yet. */
|
|
13
28
|
error: string | null;
|
|
14
29
|
refreshing: boolean;
|
|
@@ -19,12 +34,14 @@ export interface BillingData {
|
|
|
19
34
|
}
|
|
20
35
|
/**
|
|
21
36
|
* Start the badge's data lifecycle for one session. The spend follows the
|
|
22
|
-
* conversation: the host-pushed `billingTodaySpend` projection drives
|
|
23
|
-
* session
|
|
24
|
-
* bootstrap/fallback when the projection key is absent;
|
|
25
|
-
*
|
|
26
|
-
*
|
|
37
|
+
* conversation: the host-pushed `billingTodaySpend` projection drives this
|
|
38
|
+
* session's own part live (zero Remote calls), with `getSessionSpend` as the
|
|
39
|
+
* bootstrap/fallback when the projection key is absent; the delegated-subagent
|
|
40
|
+
* subtotal comes from `getDelegatedSpend` on mount, on refresh, and when a turn
|
|
41
|
+
* settles; today's spend is recomputed through `getTodaySpend` on the same
|
|
42
|
+
* events; the balance stays a manual-refresh snapshot and is never refetched on
|
|
43
|
+
* its own.
|
|
27
44
|
* @param props - the badge's injected face and session runtime share.
|
|
28
45
|
*/
|
|
29
|
-
export declare function useBillingData({ getBalance, getCachedBalance, getSessionSpend, getTodaySpend, getTodaySessionsSpend, sessionId, useSession, useProjection, }: Pick<BalanceBadgeProps, 'getBalance' | 'getCachedBalance' | 'getSessionSpend' | 'getTodaySpend' | 'getTodaySessionsSpend' | 'sessionId' | 'useSession' | 'useProjection'>): BillingData;
|
|
46
|
+
export declare function useBillingData({ getBalance, getCachedBalance, getSessionSpend, getTodaySpend, getTodaySessionsSpend, getDelegatedSpend, sessionId, useSession, useProjection, }: Pick<BalanceBadgeProps, 'getBalance' | 'getCachedBalance' | 'getSessionSpend' | 'getTodaySpend' | 'getTodaySessionsSpend' | 'getDelegatedSpend' | 'sessionId' | 'useSession' | 'useProjection'>): BillingData;
|
|
30
47
|
//# sourceMappingURL=useBillingData.d.ts.map
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rayadesu/dsh-client-ui-billing",
|
|
3
3
|
"description": "Session-header DeepSeek account-balance and conversation-spend badge over the billing Remote",
|
|
4
|
-
"version": "0.3.
|
|
4
|
+
"version": "0.3.13",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/index.js",
|
|
7
7
|
"types": "lib/types/index.d.ts",
|
|
@@ -47,28 +47,28 @@
|
|
|
47
47
|
"access": "public"
|
|
48
48
|
},
|
|
49
49
|
"peerDependencies": {
|
|
50
|
-
"@rayadesu/dsh-llm-billing": "^0.3.
|
|
51
|
-
"@deepseek-ai/dsh-client-locale": "^0.1.
|
|
52
|
-
"@deepseek-ai/dsh-client-ui-conversation": "^0.1.
|
|
53
|
-
"@deepseek-ai/dsh-typert-protocol": "^0.1.
|
|
54
|
-
"@deepseek-ai/dsh-invariants": "^0.1.
|
|
55
|
-
"@deepseek-ai/cordis": "^4.0.
|
|
56
|
-
"@deepseek-ai/dsh-api-remotes": "^0.1.
|
|
57
|
-
"@deepseek-ai/dsh-client-ui-renderer": "^0.1.
|
|
58
|
-
"@deepseek-ai/dsh-session": "^0.1.
|
|
50
|
+
"@rayadesu/dsh-llm-billing": "^0.3.13",
|
|
51
|
+
"@deepseek-ai/dsh-client-locale": "^0.1.6-alpha.1",
|
|
52
|
+
"@deepseek-ai/dsh-client-ui-conversation": "^0.1.6-alpha.1",
|
|
53
|
+
"@deepseek-ai/dsh-typert-protocol": "^0.1.6-alpha.1",
|
|
54
|
+
"@deepseek-ai/dsh-invariants": "^0.1.6-alpha.1",
|
|
55
|
+
"@deepseek-ai/cordis": "^4.0.2",
|
|
56
|
+
"@deepseek-ai/dsh-api-remotes": "^0.1.6-alpha.1",
|
|
57
|
+
"@deepseek-ai/dsh-client-ui-renderer": "^0.1.6-alpha.1",
|
|
58
|
+
"@deepseek-ai/dsh-session": "^0.1.6-alpha.1"
|
|
59
59
|
},
|
|
60
60
|
"devDependencies": {
|
|
61
|
-
"@rayadesu/dsh-llm-billing": "^0.3.
|
|
62
|
-
"@deepseek-ai/dsh-api-gateway": "^0.1.
|
|
63
|
-
"@deepseek-ai/dsh-client-locale": "^0.1.
|
|
64
|
-
"@deepseek-ai/dsh-client-store": "^0.1.
|
|
65
|
-
"@deepseek-ai/dsh-client-test-runtime": "^0.1.
|
|
66
|
-
"@deepseek-ai/dsh-client-ui-chat": "^0.1.
|
|
67
|
-
"@deepseek-ai/dsh-client-ui-conversation": "^0.1.
|
|
68
|
-
"@deepseek-ai/dsh-client-ui-primitives": "^0.1.
|
|
69
|
-
"@deepseek-ai/dsh-client-ui-slots": "^0.1.
|
|
70
|
-
"@deepseek-ai/dsh-typert-protocol": "^0.1.
|
|
71
|
-
"@deepseek-ai/dsh-invariants": "^0.1.
|
|
61
|
+
"@rayadesu/dsh-llm-billing": "^0.3.13",
|
|
62
|
+
"@deepseek-ai/dsh-api-gateway": "^0.1.6-alpha.1",
|
|
63
|
+
"@deepseek-ai/dsh-client-locale": "^0.1.6-alpha.1",
|
|
64
|
+
"@deepseek-ai/dsh-client-store": "^0.1.6-alpha.1",
|
|
65
|
+
"@deepseek-ai/dsh-client-test-runtime": "^0.1.6-alpha.1",
|
|
66
|
+
"@deepseek-ai/dsh-client-ui-chat": "^0.1.6-alpha.1",
|
|
67
|
+
"@deepseek-ai/dsh-client-ui-conversation": "^0.1.6-alpha.1",
|
|
68
|
+
"@deepseek-ai/dsh-client-ui-primitives": "^0.1.6-alpha.1",
|
|
69
|
+
"@deepseek-ai/dsh-client-ui-slots": "^0.1.6-alpha.1",
|
|
70
|
+
"@deepseek-ai/dsh-typert-protocol": "^0.1.6-alpha.1",
|
|
71
|
+
"@deepseek-ai/dsh-invariants": "^0.1.6-alpha.1",
|
|
72
72
|
"@testing-library/dom": "^10.4.1",
|
|
73
73
|
"@testing-library/react": "^16.3.2",
|
|
74
74
|
"@types/react": "~18.3.1",
|
|
@@ -76,10 +76,29 @@
|
|
|
76
76
|
"react": "^18.2.0",
|
|
77
77
|
"react-dom": "^18.2.0",
|
|
78
78
|
"use-sync-external-store": "^1.2.0",
|
|
79
|
-
"
|
|
80
|
-
"
|
|
81
|
-
"@deepseek-ai/
|
|
82
|
-
"@deepseek-ai/dsh-
|
|
79
|
+
"zustand": "~4.4.7",
|
|
80
|
+
"immer": "^10.1.1",
|
|
81
|
+
"@deepseek-ai/cordis": "^4.0.2",
|
|
82
|
+
"@deepseek-ai/dsh-api-remotes": "^0.1.6-alpha.1",
|
|
83
|
+
"@deepseek-ai/dsh-client-ui-renderer": "^0.1.6-alpha.1",
|
|
84
|
+
"@deepseek-ai/dsh-session": "^0.1.6-alpha.1",
|
|
85
|
+
"@shikijs/langs": "^4.3.1",
|
|
86
|
+
"anser": "^2.3.5",
|
|
87
|
+
"clsx": "^2.0.0",
|
|
88
|
+
"diff": "^9.0.0",
|
|
89
|
+
"katex": "^0.16.47",
|
|
90
|
+
"mdast-util-from-markdown": "^2.0.3",
|
|
91
|
+
"mdast-util-gfm": "^3.1.0",
|
|
92
|
+
"mdast-util-math": "^3.0.0",
|
|
93
|
+
"micromark-core-commonmark": "^2.0.3",
|
|
94
|
+
"micromark-extension-gfm": "^3.0.0",
|
|
95
|
+
"micromark-extension-math": "^3.1.0",
|
|
96
|
+
"micromark-factory-space": "^2.0.1",
|
|
97
|
+
"micromark-util-character": "^2.1.1",
|
|
98
|
+
"micromark-util-classify-character": "^2.0.1",
|
|
99
|
+
"micromark-util-sanitize-uri": "^2.0.1",
|
|
100
|
+
"micromark-util-symbol": "^2.0.1",
|
|
101
|
+
"shiki": "^4.3.1"
|
|
83
102
|
},
|
|
84
103
|
"files": [
|
|
85
104
|
"lib/index.js",
|