@max-null/dsh-allostasis 0.1.1 → 0.2.1
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.md +69 -9
- package/cordis.patch.yml +4 -0
- package/dist/client.js +238 -0
- package/dist/config.d.ts +68 -0
- package/dist/config.js +70 -0
- package/dist/drift.d.ts +7 -2
- package/dist/drift.js +8 -3
- package/dist/index.d.ts +41 -11
- package/dist/index.js +177 -35
- package/dist/messages.d.ts +62 -0
- package/dist/messages.js +89 -0
- package/dist/name.d.ts +15 -0
- package/dist/name.js +15 -0
- package/dist/repetition.d.ts +91 -0
- package/dist/repetition.js +100 -0
- package/dist/tail.d.ts +110 -0
- package/dist/tail.js +111 -0
- package/dist/throttle.d.ts +11 -8
- package/dist/throttle.js +10 -7
- package/docs/shots/silent-turn-1.png +0 -0
- package/package.json +26 -13
package/dist/tail.d.ts
ADDED
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 回合末步的产出形态判定(空回合检测的判据)。
|
|
3
|
+
*
|
|
4
|
+
* 落点:`assistant/message` 事件的 `message.content` —— 与 `thinking.ts` 读同一个事件的
|
|
5
|
+
* 另一个字段(那边读 `stream` 里的 `reasoning-chunks`,这里读 `content` 的块构成)。
|
|
6
|
+
*
|
|
7
|
+
* 判据 = **本 turn 最后一条助手消息里没有非空 text 块**。
|
|
8
|
+
*
|
|
9
|
+
* 实测依据(2026-09-30,14 天内 1202 个 `completed` 回合):完成态结尾沉默 34 轮
|
|
10
|
+
* (2.8%),其中 **32 轮的末步只有 `reasoning`** —— 判据纯度 94%,误报面小。
|
|
11
|
+
* `aborted` / `interrupted` 的沉默另有 15 轮,但那是用户中止的预期结果,**不在判据内**:
|
|
12
|
+
* 调用方按 `signal.aborted` 排除,见 `index.ts` 的 turn-stopping 监听。
|
|
13
|
+
*
|
|
14
|
+
* 为什么读 `content` 而不是 `stream`:`stream` 里的 `text-chunks` 回答「模型有没有生成过
|
|
15
|
+
* 文本」,`content` 回答「这一步最终产出了什么」。判据要的是后者,前者只在排查时用来
|
|
16
|
+
* 交叉验证(设计文档 §2.2)。
|
|
17
|
+
*
|
|
18
|
+
* 设计出处:`docs/设计/2026-09-30-空回合检测与可见化.md` §二
|
|
19
|
+
* @module @max-null/dsh-allostasis/tail
|
|
20
|
+
*/
|
|
21
|
+
import type { SessionEvent } from '@deepseek-ai/dsh-session';
|
|
22
|
+
/** 空回合兜底的档位:`off` 不判定,`observe` 判定并留痕,`steer` 额外补一次生成。 */
|
|
23
|
+
export type SilentTurnMode = 'off' | 'observe' | 'steer';
|
|
24
|
+
/** 全部档位,供配置校验枚举。 */
|
|
25
|
+
export declare const SILENT_TURN_MODES: readonly SilentTurnMode[];
|
|
26
|
+
/**
|
|
27
|
+
* 空回合兜底的档位缺省值。
|
|
28
|
+
*
|
|
29
|
+
* `observe` 而不是 `off`:判定与留痕必须先跑起来,否则「这个现象有多频繁、判据准不准」
|
|
30
|
+
* 永远没有数据。补生成(`steer`)要等到有数据说明它值得开之后再加。
|
|
31
|
+
*/
|
|
32
|
+
export declare const SILENT_TURN_MODE: SilentTurnMode;
|
|
33
|
+
/** 判定只需要块的类型与文本;用最小形状接收,判据模块因此不依赖会话包的内容类型。 */
|
|
34
|
+
export interface TailBlock {
|
|
35
|
+
/** 块类型:`reasoning` / `text` / `tool-call`。 */
|
|
36
|
+
readonly type: string;
|
|
37
|
+
/** 文本与推理块的正文;工具调用块没有这个字段。 */
|
|
38
|
+
readonly text?: string;
|
|
39
|
+
}
|
|
40
|
+
/** 一条助手消息的产出形态。 */
|
|
41
|
+
export interface TailShape {
|
|
42
|
+
/** 该消息所属的 turn。 */
|
|
43
|
+
readonly turn: number;
|
|
44
|
+
/** 该消息所属的 step。 */
|
|
45
|
+
readonly step: number;
|
|
46
|
+
/** 非空 `text` 块的总字符数。空回合恒为 0。 */
|
|
47
|
+
readonly textChars: number;
|
|
48
|
+
/** `reasoning` 块的总字符数——区分「想了很久没说」与「完全没输出」。 */
|
|
49
|
+
readonly reasoningChars: number;
|
|
50
|
+
/** 按类型的块计数。 */
|
|
51
|
+
readonly blocks: {
|
|
52
|
+
readonly reasoning: number;
|
|
53
|
+
readonly text: number;
|
|
54
|
+
readonly toolCalls: number;
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* 三态判定。`unknown` 用于「本回合没有助手消息」——比如用户消息刚落下、助手还没产出,
|
|
59
|
+
* 此时既不能说它说了话,也不能说它是空回合。
|
|
60
|
+
*/
|
|
61
|
+
export type TailVerdict = 'spoke' | 'silent' | 'unknown';
|
|
62
|
+
/**
|
|
63
|
+
* 统计一条助手消息的块构成。
|
|
64
|
+
*
|
|
65
|
+
* `text` 按去掉首尾空白后的长度计入:只含空白的文本块在界面上不产生任何可见内容,
|
|
66
|
+
* 把它算作「说了话」会让判据漏掉真实的空回合。
|
|
67
|
+
* @param turn - 该消息所属的 turn。
|
|
68
|
+
* @param step - 该消息所属的 step。
|
|
69
|
+
* @param content - 助手消息的内容块,按出现顺序。
|
|
70
|
+
* @returns 该消息的产出形态。
|
|
71
|
+
*/
|
|
72
|
+
export declare function shapeOf(turn: number, step: number, content: readonly TailBlock[]): TailShape;
|
|
73
|
+
/** 从会话事件里取出的助手消息样本:判定只读这三个字段。 */
|
|
74
|
+
export interface TailSample {
|
|
75
|
+
/** 该消息所属的 turn。 */
|
|
76
|
+
readonly turn: number;
|
|
77
|
+
/** 该消息所属的 step。 */
|
|
78
|
+
readonly step: number;
|
|
79
|
+
/** 内容块,按出现顺序。 */
|
|
80
|
+
readonly content: readonly TailBlock[];
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* 把会话事件收窄成判定样本。
|
|
84
|
+
*
|
|
85
|
+
* 与 {@link measureTail} 分成两步,是为了让判定完全落在纯函数上:`SessionEvent` 是
|
|
86
|
+
* 所有事件的联合,拿它当参数就得在测试里伪造整个事件(含 `usage` / `stream`),
|
|
87
|
+
* 或者用类型断言把缺口盖掉。收窄只在这里做一次。
|
|
88
|
+
* @param events - 会话事件,按 seq 升序。
|
|
89
|
+
* @returns 助手消息样本,保持原顺序;其它类型的事件被跳过。
|
|
90
|
+
*/
|
|
91
|
+
export declare function tailSamples(events: readonly SessionEvent[]): TailSample[];
|
|
92
|
+
/**
|
|
93
|
+
* 取本 turn **最后一条**助手消息的产出形态。
|
|
94
|
+
*
|
|
95
|
+
* 倒扫而不是取「最后一条样本」:会话里可能夹着别的 turn 的助手消息(中断后的残留、
|
|
96
|
+
* 子代理的投递),而判定要问的是「这一轮结束时用户看到了什么」。
|
|
97
|
+
* @param samples - {@link tailSamples} 的产出。
|
|
98
|
+
* @param turn - 要检查的 turn。
|
|
99
|
+
* @returns 末条助手消息的形态;该 turn 没有助手消息时返回 `undefined`。
|
|
100
|
+
*/
|
|
101
|
+
export declare function measureTail(samples: readonly TailSample[], turn: number): TailShape | undefined;
|
|
102
|
+
/**
|
|
103
|
+
* 对一次测量下判定。
|
|
104
|
+
*
|
|
105
|
+
* 只有「有助手消息且它没有非空文本」才算空回合。工具调用**不**改变判定:一个以
|
|
106
|
+
* `tool-call` 结尾的完成态回合同样是异常(工具执行完还会再走一步,除非回合已经结束)。
|
|
107
|
+
* @param shape - 末条助手消息的形态;没有助手消息时传 `undefined`。
|
|
108
|
+
* @returns 三态判定。
|
|
109
|
+
*/
|
|
110
|
+
export declare function tailVerdict(shape: TailShape | undefined): TailVerdict;
|
package/dist/tail.js
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 回合末步的产出形态判定(空回合检测的判据)。
|
|
3
|
+
*
|
|
4
|
+
* 落点:`assistant/message` 事件的 `message.content` —— 与 `thinking.ts` 读同一个事件的
|
|
5
|
+
* 另一个字段(那边读 `stream` 里的 `reasoning-chunks`,这里读 `content` 的块构成)。
|
|
6
|
+
*
|
|
7
|
+
* 判据 = **本 turn 最后一条助手消息里没有非空 text 块**。
|
|
8
|
+
*
|
|
9
|
+
* 实测依据(2026-09-30,14 天内 1202 个 `completed` 回合):完成态结尾沉默 34 轮
|
|
10
|
+
* (2.8%),其中 **32 轮的末步只有 `reasoning`** —— 判据纯度 94%,误报面小。
|
|
11
|
+
* `aborted` / `interrupted` 的沉默另有 15 轮,但那是用户中止的预期结果,**不在判据内**:
|
|
12
|
+
* 调用方按 `signal.aborted` 排除,见 `index.ts` 的 turn-stopping 监听。
|
|
13
|
+
*
|
|
14
|
+
* 为什么读 `content` 而不是 `stream`:`stream` 里的 `text-chunks` 回答「模型有没有生成过
|
|
15
|
+
* 文本」,`content` 回答「这一步最终产出了什么」。判据要的是后者,前者只在排查时用来
|
|
16
|
+
* 交叉验证(设计文档 §2.2)。
|
|
17
|
+
*
|
|
18
|
+
* 设计出处:`docs/设计/2026-09-30-空回合检测与可见化.md` §二
|
|
19
|
+
* @module @max-null/dsh-allostasis/tail
|
|
20
|
+
*/
|
|
21
|
+
/** 全部档位,供配置校验枚举。 */
|
|
22
|
+
export const SILENT_TURN_MODES = ['off', 'observe', 'steer'];
|
|
23
|
+
/**
|
|
24
|
+
* 空回合兜底的档位缺省值。
|
|
25
|
+
*
|
|
26
|
+
* `observe` 而不是 `off`:判定与留痕必须先跑起来,否则「这个现象有多频繁、判据准不准」
|
|
27
|
+
* 永远没有数据。补生成(`steer`)要等到有数据说明它值得开之后再加。
|
|
28
|
+
*/
|
|
29
|
+
export const SILENT_TURN_MODE = 'observe';
|
|
30
|
+
/**
|
|
31
|
+
* 统计一条助手消息的块构成。
|
|
32
|
+
*
|
|
33
|
+
* `text` 按去掉首尾空白后的长度计入:只含空白的文本块在界面上不产生任何可见内容,
|
|
34
|
+
* 把它算作「说了话」会让判据漏掉真实的空回合。
|
|
35
|
+
* @param turn - 该消息所属的 turn。
|
|
36
|
+
* @param step - 该消息所属的 step。
|
|
37
|
+
* @param content - 助手消息的内容块,按出现顺序。
|
|
38
|
+
* @returns 该消息的产出形态。
|
|
39
|
+
*/
|
|
40
|
+
export function shapeOf(turn, step, content) {
|
|
41
|
+
let textChars = 0;
|
|
42
|
+
let reasoningChars = 0;
|
|
43
|
+
const blocks = { reasoning: 0, text: 0, toolCalls: 0 };
|
|
44
|
+
for (const block of content) {
|
|
45
|
+
if (block.type === 'reasoning') {
|
|
46
|
+
blocks.reasoning += 1;
|
|
47
|
+
reasoningChars += block.text?.length ?? 0;
|
|
48
|
+
}
|
|
49
|
+
else if (block.type === 'text') {
|
|
50
|
+
blocks.text += 1;
|
|
51
|
+
textChars += block.text?.trim().length ?? 0;
|
|
52
|
+
}
|
|
53
|
+
else if (block.type === 'tool-call') {
|
|
54
|
+
blocks.toolCalls += 1;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return { turn, step, textChars, reasoningChars, blocks };
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* 把会话事件收窄成判定样本。
|
|
61
|
+
*
|
|
62
|
+
* 与 {@link measureTail} 分成两步,是为了让判定完全落在纯函数上:`SessionEvent` 是
|
|
63
|
+
* 所有事件的联合,拿它当参数就得在测试里伪造整个事件(含 `usage` / `stream`),
|
|
64
|
+
* 或者用类型断言把缺口盖掉。收窄只在这里做一次。
|
|
65
|
+
* @param events - 会话事件,按 seq 升序。
|
|
66
|
+
* @returns 助手消息样本,保持原顺序;其它类型的事件被跳过。
|
|
67
|
+
*/
|
|
68
|
+
export function tailSamples(events) {
|
|
69
|
+
const samples = [];
|
|
70
|
+
for (const event of events) {
|
|
71
|
+
if (event.type !== 'assistant/message')
|
|
72
|
+
continue;
|
|
73
|
+
samples.push({
|
|
74
|
+
turn: event.data.turn,
|
|
75
|
+
step: event.data.step,
|
|
76
|
+
content: event.data.message.content,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
return samples;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* 取本 turn **最后一条**助手消息的产出形态。
|
|
83
|
+
*
|
|
84
|
+
* 倒扫而不是取「最后一条样本」:会话里可能夹着别的 turn 的助手消息(中断后的残留、
|
|
85
|
+
* 子代理的投递),而判定要问的是「这一轮结束时用户看到了什么」。
|
|
86
|
+
* @param samples - {@link tailSamples} 的产出。
|
|
87
|
+
* @param turn - 要检查的 turn。
|
|
88
|
+
* @returns 末条助手消息的形态;该 turn 没有助手消息时返回 `undefined`。
|
|
89
|
+
*/
|
|
90
|
+
export function measureTail(samples, turn) {
|
|
91
|
+
for (let index = samples.length - 1; index >= 0; index -= 1) {
|
|
92
|
+
const sample = samples[index];
|
|
93
|
+
if (sample === undefined || sample.turn !== turn)
|
|
94
|
+
continue;
|
|
95
|
+
return shapeOf(sample.turn, sample.step, sample.content);
|
|
96
|
+
}
|
|
97
|
+
return undefined;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* 对一次测量下判定。
|
|
101
|
+
*
|
|
102
|
+
* 只有「有助手消息且它没有非空文本」才算空回合。工具调用**不**改变判定:一个以
|
|
103
|
+
* `tool-call` 结尾的完成态回合同样是异常(工具执行完还会再走一步,除非回合已经结束)。
|
|
104
|
+
* @param shape - 末条助手消息的形态;没有助手消息时传 `undefined`。
|
|
105
|
+
* @returns 三态判定。
|
|
106
|
+
*/
|
|
107
|
+
export function tailVerdict(shape) {
|
|
108
|
+
if (shape === undefined)
|
|
109
|
+
return 'unknown';
|
|
110
|
+
return shape.textChars > 0 ? 'spoke' : 'silent';
|
|
111
|
+
}
|
package/dist/throttle.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* 提醒注入的节流:**同一 turn 至多一次**。
|
|
3
3
|
*
|
|
4
4
|
* 实测(2026-09-21,会话 `session-502b3e2b`,记录见设计方案 §12.4):漂移持续时**每个
|
|
5
5
|
* step 都会判定为漂移**,于是同一个 turn 内会连着注入多条几乎一样的提醒——观测到 3 连注,
|
|
@@ -8,13 +8,16 @@
|
|
|
8
8
|
* 所以收紧到「同一 turn 至多一次」:turn 是用户能感知的自然边界,重试留到下一轮,
|
|
9
9
|
* 而不是在一步之内反复催促。上限写成常数而不是配置项,是因为**没有数据支撑别的取值**;
|
|
10
10
|
* 等无对抗的自然漂移样本出来,再决定要不要放宽(设计方案 §八 第 9 条)。
|
|
11
|
+
*
|
|
12
|
+
* 退化提醒复用同一契约、独立一份状态:两类提醒的判据无关,共用状态会让先说的那类
|
|
13
|
+
* 把另一类挡在门外。
|
|
11
14
|
* @module @max-null/dsh-allostasis/throttle
|
|
12
15
|
*/
|
|
13
|
-
/**
|
|
14
|
-
export declare const
|
|
16
|
+
/** 同一 turn 内的提醒注入上限。 */
|
|
17
|
+
export declare const MAX_PER_TURN = 1;
|
|
15
18
|
/** 节流状态。不可变——每次放行都返回一份新状态。 */
|
|
16
|
-
export interface
|
|
17
|
-
/** 最近一次注入所针对的 turn
|
|
19
|
+
export interface PerTurnThrottleState {
|
|
20
|
+
/** 最近一次注入所针对的 turn(产出那段异常输出的 turn)。 */
|
|
18
21
|
lastTurn: number;
|
|
19
22
|
/** 该 turn 内已经注入了几次。 */
|
|
20
23
|
inTurn: number;
|
|
@@ -24,10 +27,10 @@ export interface AnchorThrottleState {
|
|
|
24
27
|
/**
|
|
25
28
|
* 判定本次是否放行,并推进状态。
|
|
26
29
|
*
|
|
27
|
-
* `sampledTurn`
|
|
30
|
+
* `sampledTurn` 是**产出那段被判定异常的输出的 turn**,不是当前 turn——提醒的措辞
|
|
28
31
|
* 指向「你上一步在想什么」,节流的计次也应当跟着它走。
|
|
29
32
|
* @param state - 上一次的状态;首次调用传 `undefined`。
|
|
30
|
-
* @param sampledTurn -
|
|
33
|
+
* @param sampledTurn - 产出该输出的 turn。
|
|
31
34
|
* @returns 放行时返回新状态;应当跳过时返回 `undefined`。
|
|
32
35
|
*/
|
|
33
|
-
export declare function
|
|
36
|
+
export declare function admitPerTurn(state: PerTurnThrottleState | undefined, sampledTurn: number): PerTurnThrottleState | undefined;
|
package/dist/throttle.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* 提醒注入的节流:**同一 turn 至多一次**。
|
|
3
3
|
*
|
|
4
4
|
* 实测(2026-09-21,会话 `session-502b3e2b`,记录见设计方案 §12.4):漂移持续时**每个
|
|
5
5
|
* step 都会判定为漂移**,于是同一个 turn 内会连着注入多条几乎一样的提醒——观测到 3 连注,
|
|
@@ -8,23 +8,26 @@
|
|
|
8
8
|
* 所以收紧到「同一 turn 至多一次」:turn 是用户能感知的自然边界,重试留到下一轮,
|
|
9
9
|
* 而不是在一步之内反复催促。上限写成常数而不是配置项,是因为**没有数据支撑别的取值**;
|
|
10
10
|
* 等无对抗的自然漂移样本出来,再决定要不要放宽(设计方案 §八 第 9 条)。
|
|
11
|
+
*
|
|
12
|
+
* 退化提醒复用同一契约、独立一份状态:两类提醒的判据无关,共用状态会让先说的那类
|
|
13
|
+
* 把另一类挡在门外。
|
|
11
14
|
* @module @max-null/dsh-allostasis/throttle
|
|
12
15
|
*/
|
|
13
|
-
/**
|
|
14
|
-
export const
|
|
16
|
+
/** 同一 turn 内的提醒注入上限。 */
|
|
17
|
+
export const MAX_PER_TURN = 1;
|
|
15
18
|
/**
|
|
16
19
|
* 判定本次是否放行,并推进状态。
|
|
17
20
|
*
|
|
18
|
-
* `sampledTurn`
|
|
21
|
+
* `sampledTurn` 是**产出那段被判定异常的输出的 turn**,不是当前 turn——提醒的措辞
|
|
19
22
|
* 指向「你上一步在想什么」,节流的计次也应当跟着它走。
|
|
20
23
|
* @param state - 上一次的状态;首次调用传 `undefined`。
|
|
21
|
-
* @param sampledTurn -
|
|
24
|
+
* @param sampledTurn - 产出该输出的 turn。
|
|
22
25
|
* @returns 放行时返回新状态;应当跳过时返回 `undefined`。
|
|
23
26
|
*/
|
|
24
|
-
export function
|
|
27
|
+
export function admitPerTurn(state, sampledTurn) {
|
|
25
28
|
const current = state ?? { lastTurn: Number.NaN, inTurn: 0, count: 0 };
|
|
26
29
|
const inTurn = current.lastTurn === sampledTurn ? current.inTurn : 0;
|
|
27
|
-
if (inTurn >=
|
|
30
|
+
if (inTurn >= MAX_PER_TURN)
|
|
28
31
|
return undefined;
|
|
29
32
|
return { lastTurn: sampledTurn, inTurn: inTurn + 1, count: current.count + 1 };
|
|
30
33
|
}
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@max-null/dsh-allostasis",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "应变(allostasis):会话状态的自我调节。第一期:中文思考的漂移检测与近因锚定",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"publishConfig": {
|
|
@@ -13,16 +13,26 @@
|
|
|
13
13
|
".": {
|
|
14
14
|
"types": "./dist/index.d.ts",
|
|
15
15
|
"default": "./dist/index.js"
|
|
16
|
-
}
|
|
16
|
+
},
|
|
17
|
+
"./client": "./dist/client.js"
|
|
17
18
|
},
|
|
18
19
|
"files": [
|
|
19
20
|
"dist",
|
|
20
21
|
"cordis.patch.yml",
|
|
21
|
-
"tools"
|
|
22
|
+
"tools",
|
|
23
|
+
"docs/shots"
|
|
22
24
|
],
|
|
23
25
|
"dsh": {
|
|
24
26
|
"bundle": {
|
|
25
27
|
"patch": "./cordis.patch.yml"
|
|
28
|
+
},
|
|
29
|
+
"client": {
|
|
30
|
+
"platform": "web",
|
|
31
|
+
"inject": [
|
|
32
|
+
"@deepseek-ai/dsh-client-locale",
|
|
33
|
+
"@deepseek-ai/dsh-client-ui-chat",
|
|
34
|
+
"@deepseek-ai/dsh-client-ui-conversation"
|
|
35
|
+
]
|
|
26
36
|
}
|
|
27
37
|
},
|
|
28
38
|
"keywords": [
|
|
@@ -42,28 +52,31 @@
|
|
|
42
52
|
"url": "git+https://github.com/Max-Null/dsh-allostasis.git"
|
|
43
53
|
},
|
|
44
54
|
"scripts": {
|
|
45
|
-
"build": "tsc -p tsconfig.build.json",
|
|
55
|
+
"build": "tsc -p tsconfig.build.json && tsdown",
|
|
46
56
|
"typecheck": "tsc --noEmit -p tsconfig.json",
|
|
47
57
|
"test": "vitest run",
|
|
48
58
|
"prepublishOnly": "npm run build"
|
|
49
59
|
},
|
|
50
60
|
"dependencies": {
|
|
51
|
-
"
|
|
61
|
+
"@deepseek-ai/schemastery": "^3.18.2"
|
|
52
62
|
},
|
|
53
63
|
"peerDependencies": {
|
|
54
64
|
"@deepseek-ai/cordis": "^4.0.1",
|
|
55
|
-
"@deepseek-ai/dsh-agent": "
|
|
56
|
-
"@deepseek-ai/dsh-llm": "
|
|
57
|
-
"@deepseek-ai/dsh-session": "
|
|
65
|
+
"@deepseek-ai/dsh-agent": ">=0.1.7-rc.1 <0.3.0",
|
|
66
|
+
"@deepseek-ai/dsh-llm": ">=0.1.7-rc.1 <0.3.0",
|
|
67
|
+
"@deepseek-ai/dsh-session": ">=0.1.7-rc.1 <0.3.0"
|
|
58
68
|
},
|
|
59
69
|
"devDependencies": {
|
|
60
|
-
"@types/node": "^26.2.0",
|
|
61
|
-
"tsx": "^4.0.0",
|
|
62
|
-
"typescript": "^5.5.0",
|
|
63
|
-
"vitest": "^2.1.0",
|
|
64
70
|
"@deepseek-ai/cordis": "^4.0.1",
|
|
65
71
|
"@deepseek-ai/dsh-agent": "^0.1.7-rc.2",
|
|
66
72
|
"@deepseek-ai/dsh-llm": "^0.1.7-rc.2",
|
|
67
|
-
"@deepseek-ai/dsh-session": "^0.1.7-rc.2"
|
|
73
|
+
"@deepseek-ai/dsh-session": "^0.1.7-rc.2",
|
|
74
|
+
"@types/node": "^26.2.0",
|
|
75
|
+
"@types/react": "~18.3.31",
|
|
76
|
+
"react": "^18.3.1",
|
|
77
|
+
"tsdown": "^0.22.14",
|
|
78
|
+
"tsx": "^4.0.0",
|
|
79
|
+
"typescript": "^5.5.0",
|
|
80
|
+
"vitest": "^2.1.0"
|
|
68
81
|
}
|
|
69
82
|
}
|