dsh-remote-control 1.0.0 → 1.2.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/cordis.patch.yml +4 -0
- package/dist/bundle/client.cjs +484 -0
- package/dist/bundle/index.js +577 -433
- package/package.json +14 -6
- package/dist/src/core/clock.d.ts +0 -45
- package/dist/src/core/clock.js +0 -83
- package/dist/src/core/clock.js.map +0 -1
- package/dist/src/core/keys.d.ts +0 -98
- package/dist/src/core/keys.js +0 -176
- package/dist/src/core/keys.js.map +0 -1
- package/dist/src/core/pairing-window.d.ts +0 -95
- package/dist/src/core/pairing-window.js +0 -92
- package/dist/src/core/pairing-window.js.map +0 -1
- package/dist/src/core/runtime.d.ts +0 -104
- package/dist/src/core/runtime.js +0 -491
- package/dist/src/core/runtime.js.map +0 -1
- package/dist/src/core/sleep-policy.d.ts +0 -81
- package/dist/src/core/sleep-policy.js +0 -134
- package/dist/src/core/sleep-policy.js.map +0 -1
- package/dist/src/core/window.d.ts +0 -88
- package/dist/src/core/window.js +0 -185
- package/dist/src/core/window.js.map +0 -1
- package/dist/src/index.d.ts +0 -70
- package/dist/src/index.js +0 -882
- package/dist/src/index.js.map +0 -1
- package/dist/src/platform/carrier-services.d.ts +0 -96
- package/dist/src/platform/carrier-services.js +0 -982
- package/dist/src/platform/carrier-services.js.map +0 -1
- package/dist/src/platform/guard.d.ts +0 -60
- package/dist/src/platform/guard.js +0 -124
- package/dist/src/platform/guard.js.map +0 -1
- package/dist/src/platform/mock-kernel.d.ts +0 -95
- package/dist/src/platform/mock-kernel.js +0 -180
- package/dist/src/platform/mock-kernel.js.map +0 -1
- package/dist/src/platform/qr.d.ts +0 -28
- package/dist/src/platform/qr.js +0 -80
- package/dist/src/platform/qr.js.map +0 -1
- package/dist/src/platform/sleep-posix.d.ts +0 -17
- package/dist/src/platform/sleep-posix.js +0 -91
- package/dist/src/platform/sleep-posix.js.map +0 -1
- package/dist/src/ports/index.d.ts +0 -246
- package/dist/src/ports/index.js +0 -2
- package/dist/src/ports/index.js.map +0 -1
- package/dist/src/shell/config.d.ts +0 -56
- package/dist/src/shell/config.js +0 -212
- package/dist/src/shell/config.js.map +0 -1
- package/dist/src/shell/pairing-text.d.ts +0 -38
- package/dist/src/shell/pairing-text.js +0 -22
- package/dist/src/shell/pairing-text.js.map +0 -1
- package/dist/src/shell/status.d.ts +0 -39
- package/dist/src/shell/status.js +0 -119
- package/dist/src/shell/status.js.map +0 -1
- package/dist/src/transport/relay.d.ts +0 -107
- package/dist/src/transport/relay.js +0 -359
- package/dist/src/transport/relay.js.map +0 -1
- package/dist/tests/carrier-events.test.d.ts +0 -1
- package/dist/tests/carrier-events.test.js +0 -88
- package/dist/tests/carrier-events.test.js.map +0 -1
- package/dist/tests/carrier-services.test.d.ts +0 -1
- package/dist/tests/carrier-services.test.js +0 -562
- package/dist/tests/carrier-services.test.js.map +0 -1
- package/dist/tests/carrier-vocabulary.test.d.ts +0 -1
- package/dist/tests/carrier-vocabulary.test.js +0 -149
- package/dist/tests/carrier-vocabulary.test.js.map +0 -1
- package/dist/tests/clock-probe-timers.test.d.ts +0 -1
- package/dist/tests/clock-probe-timers.test.js +0 -73
- package/dist/tests/clock-probe-timers.test.js.map +0 -1
- package/dist/tests/command-result.test.d.ts +0 -1
- package/dist/tests/command-result.test.js +0 -185
- package/dist/tests/command-result.test.js.map +0 -1
- package/dist/tests/config.test.d.ts +0 -1
- package/dist/tests/config.test.js +0 -223
- package/dist/tests/config.test.js.map +0 -1
- package/dist/tests/guard.test.d.ts +0 -1
- package/dist/tests/guard.test.js +0 -175
- package/dist/tests/guard.test.js.map +0 -1
- package/dist/tests/ids-and-keys.test.d.ts +0 -1
- package/dist/tests/ids-and-keys.test.js +0 -211
- package/dist/tests/ids-and-keys.test.js.map +0 -1
- package/dist/tests/pairing-text.test.d.ts +0 -1
- package/dist/tests/pairing-text.test.js +0 -62
- package/dist/tests/pairing-text.test.js.map +0 -1
- package/dist/tests/pairing-window.test.d.ts +0 -1
- package/dist/tests/pairing-window.test.js +0 -165
- package/dist/tests/pairing-window.test.js.map +0 -1
- package/dist/tests/relay-client.test.d.ts +0 -1
- package/dist/tests/relay-client.test.js +0 -557
- package/dist/tests/relay-client.test.js.map +0 -1
- package/dist/tests/runtime.test.d.ts +0 -1
- package/dist/tests/runtime.test.js +0 -963
- package/dist/tests/runtime.test.js.map +0 -1
- package/dist/tests/sleep.test.d.ts +0 -1
- package/dist/tests/sleep.test.js +0 -264
- package/dist/tests/sleep.test.js.map +0 -1
- package/dist/tests/status.test.d.ts +0 -1
- package/dist/tests/status.test.js +0 -238
- package/dist/tests/status.test.js.map +0 -1
- package/dist/tests/window.test.d.ts +0 -1
- package/dist/tests/window.test.js +0 -210
- package/dist/tests/window.test.js.map +0 -1
|
@@ -1,562 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* carrier-services.test — `platform/carrier-services.ts` 的内核调用形状。
|
|
3
|
-
*
|
|
4
|
-
* `core/` 那几层测的是"该发什么",这一层测的是**调内核时到底传了什么参数**。
|
|
5
|
-
* 这里每一条都对应一次真机取证或一条已归档的权威签名
|
|
6
|
-
* (`docs/legacy-spec/host-plugin-cordis.md` §3 表):
|
|
7
|
-
*
|
|
8
|
-
* 1. `agents.resume({resumeSessionId, agentOptions})`——**agentOptions 不能省**。
|
|
9
|
-
* 省掉它建出来的 Agent 没有 call configuration,回合在 prompt 装配阶段就死:
|
|
10
|
-
* `prompt variable "{{model}}" has no value for this assembly`,
|
|
11
|
-
* 手机上表现为"发出去、转两下、一个字都没有"。这是 live-e2e 在本机抓到的第一条真缺陷。
|
|
12
|
-
* 2. 取消的正解是 `agent.cancel({kind:'user'}, {keepInbox:true})`,
|
|
13
|
-
* **不是** `abort()`/`interrupt()`(那两个符号在全树零命中;复核 R8⑨)。
|
|
14
|
-
* 3. 没有可用模型时必须**在任何内核调用之前**主动拒绝,而不是让宿主去崩
|
|
15
|
-
* (`prepareRequest` 里抛 `reading 'provider'`,那条崩溃看起来与远程控制毫无关系)。
|
|
16
|
-
*
|
|
17
|
-
* 夹具是一个手搓的 `ServicesBundle`:本层的全部价值就在于"传了什么"能被逐字记下来,
|
|
18
|
-
* 所以这里用记录调用的假服务对象,而不是真内核。
|
|
19
|
-
*/
|
|
20
|
-
import { test } from 'node:test';
|
|
21
|
-
import assert from 'node:assert/strict';
|
|
22
|
-
import { createServicesKernel, historyPageFromLog } from '../src/platform/carrier-services.js';
|
|
23
|
-
import { FakeClock } from '../src/core/clock.js';
|
|
24
|
-
function fixture() {
|
|
25
|
-
const calls = { resume: [], unarchive: [], followup: [], steer: [], cancel: [] };
|
|
26
|
-
const clock = new FakeClock();
|
|
27
|
-
const liveAgent = {
|
|
28
|
-
followup: (message) => calls.followup.push(message),
|
|
29
|
-
steer: (message) => calls.steer.push(message),
|
|
30
|
-
cancel: (...args) => calls.cancel.push(args),
|
|
31
|
-
};
|
|
32
|
-
const bundle = (overrides = {}) => {
|
|
33
|
-
const live = overrides.live ?? false;
|
|
34
|
-
const model = 'model' in overrides ? overrides.model : { provider: 'stepfun', model: 'step-5-preview' };
|
|
35
|
-
return {
|
|
36
|
-
sessions: { list: () => [], get: () => undefined },
|
|
37
|
-
agents: {
|
|
38
|
-
get: () => (live ? liveAgent : undefined),
|
|
39
|
-
resume: (request) => {
|
|
40
|
-
calls.resume.push(request);
|
|
41
|
-
return Promise.resolve({ agent: liveAgent });
|
|
42
|
-
},
|
|
43
|
-
},
|
|
44
|
-
agentDefaultModel: model ? { currentSelection: () => model } : {},
|
|
45
|
-
workspaceRegistry: {
|
|
46
|
-
archivedSessionIds: ['ses_arch'],
|
|
47
|
-
unarchiveSession: (id) => {
|
|
48
|
-
calls.unarchive.push(id);
|
|
49
|
-
return Promise.resolve();
|
|
50
|
-
},
|
|
51
|
-
},
|
|
52
|
-
};
|
|
53
|
-
};
|
|
54
|
-
return {
|
|
55
|
-
calls,
|
|
56
|
-
liveAgent,
|
|
57
|
-
bundle,
|
|
58
|
-
kernel: (services) => createServicesKernel(services, { clock, log: () => { } }),
|
|
59
|
-
};
|
|
60
|
-
}
|
|
61
|
-
test('冷会话续跑必须带 agentOptions:不带模型续出来的 Agent 会让整回合在装配阶段死掉', async () => {
|
|
62
|
-
const f = fixture();
|
|
63
|
-
const kernel = f.kernel(f.bundle());
|
|
64
|
-
const ready = await kernel.ensureRunnable?.('ses_idle');
|
|
65
|
-
assert.equal(ready?.ok, true, `续跑被拒:${JSON.stringify(ready)}`);
|
|
66
|
-
assert.equal(f.calls.resume.length, 1, '没有调用 agents.resume:会话根本没被唤醒');
|
|
67
|
-
const request = f.calls.resume[0];
|
|
68
|
-
assert.equal(request.resumeSessionId, 'ses_idle', 'resumeSessionId 逐字传');
|
|
69
|
-
assert.equal(request.agentOptions?.provider, 'stepfun', 'agentOptions.provider 缺失:这就是手机上"一个字都没有"的根因');
|
|
70
|
-
assert.equal(request.agentOptions?.model, 'step-5-preview', 'agentOptions.model 缺失:同上');
|
|
71
|
-
});
|
|
72
|
-
test('已经有活的 agent 就不许再 resume(每条指令都重建一次 agent 会丢掉会话内状态)', async () => {
|
|
73
|
-
const f = fixture();
|
|
74
|
-
const kernel = f.kernel(f.bundle({ live: true }));
|
|
75
|
-
const ready = await kernel.ensureRunnable?.('ses_live');
|
|
76
|
-
assert.equal(ready?.ok, true);
|
|
77
|
-
assert.equal(f.calls.resume.length, 0, `白 resume 了 ${f.calls.resume.length} 次`);
|
|
78
|
-
});
|
|
79
|
-
test('拿不到模型选择时必须拒绝续跑,并且一次内核调用都不发', async () => {
|
|
80
|
-
const f = fixture();
|
|
81
|
-
const kernel = f.kernel(f.bundle({ model: undefined }));
|
|
82
|
-
const ready = await kernel.ensureRunnable?.('ses_idle');
|
|
83
|
-
assert.equal(ready?.ok, false, '没模型也照样 resume:宿主会在 prepareRequest 里抛 reading provider');
|
|
84
|
-
assert.match(ready?.message ?? '', /模型/, '拒绝原因必须是中文且点名模型,否则手机上只有一句看不懂的英文');
|
|
85
|
-
assert.equal(f.calls.resume.length, 0, '拒绝之前已经把 agent 建出来了:这条拒绝就成了空话');
|
|
86
|
-
const sent = await kernel.sendPrompt('ses_live', '跑一下');
|
|
87
|
-
assert.equal(sent.ok, false, '没模型也发指令:turn 会以 error 收场,而手机看不出来');
|
|
88
|
-
assert.equal(f.calls.followup.length, 0);
|
|
89
|
-
});
|
|
90
|
-
test('归档会话:先 unarchive 再 resume,顺序不能反', async () => {
|
|
91
|
-
const f = fixture();
|
|
92
|
-
const kernel = f.kernel(f.bundle());
|
|
93
|
-
await kernel.ensureRunnable?.('ses_arch');
|
|
94
|
-
assert.deepEqual(f.calls.unarchive, ['ses_arch'], '没先解归档:宿主的 archived-session-gate 会在 agent/pre-step 直接拒掉');
|
|
95
|
-
assert.equal(f.calls.resume.length, 1);
|
|
96
|
-
assert.ok(f.calls.unarchive.length > 0, 'unarchive 必须在 resume 之前发生');
|
|
97
|
-
});
|
|
98
|
-
test('发指令优先 followup;没有 followup 才退到 steer(两者都没有要把 keys 报出来)', async () => {
|
|
99
|
-
const f = fixture();
|
|
100
|
-
const kernel = f.kernel(f.bundle({ live: true }));
|
|
101
|
-
const sent = await kernel.sendPrompt('ses_live', '只回复 ok');
|
|
102
|
-
assert.equal(sent.ok, true);
|
|
103
|
-
assert.equal(f.calls.followup.length, 1, '有 followup 却走了别的路:followup 才是"排到下一轮"的正解');
|
|
104
|
-
assert.equal(f.calls.steer.length, 0, 'followup 存在时不该用 steer(steer 是插进当前步)');
|
|
105
|
-
const message = f.calls.followup[0];
|
|
106
|
-
const text = (message?.content ?? []).map((part) => part.text ?? '').join('');
|
|
107
|
-
assert.equal(text, '只回复 ok', '正文必须逐字进 content:官方 apiproxy 就是 createUserMessage({content,source})');
|
|
108
|
-
// 只给 steer 的一代宿主
|
|
109
|
-
const steerOnly = fixture();
|
|
110
|
-
delete steerOnly.liveAgent.followup;
|
|
111
|
-
const sent2 = await steerOnly.kernel(steerOnly.bundle({ live: true })).sendPrompt('ses_live', '换个路径');
|
|
112
|
-
assert.equal(sent2.ok, true);
|
|
113
|
-
assert.equal(steerOnly.calls.steer.length, 1, '没 followup 时应退回 steer');
|
|
114
|
-
// 两个都没有:必须把实际形状报出来,而不是静默失败
|
|
115
|
-
const neither = fixture();
|
|
116
|
-
delete neither.liveAgent.followup;
|
|
117
|
-
delete neither.liveAgent.steer;
|
|
118
|
-
const sent3 = await neither.kernel(neither.bundle({ live: true })).sendPrompt('ses_live', '发不出去');
|
|
119
|
-
assert.equal(sent3.ok, false);
|
|
120
|
-
assert.match(sent3.message ?? '', /keys=\[/, '两个方法都没有时要列出 keys,现场才能判断这一代宿主给了什么');
|
|
121
|
-
});
|
|
122
|
-
test('中断走 cancel({kind:"user"}, {keepInbox:true}):abort/interrupt 这两个符号在平台上不存在(复核 R8⑨)', async () => {
|
|
123
|
-
const f = fixture();
|
|
124
|
-
const kernel = f.kernel(f.bundle({ live: true }));
|
|
125
|
-
const done = await kernel.interrupt('ses_live');
|
|
126
|
-
assert.equal(done.ok, true);
|
|
127
|
-
assert.equal(f.calls.cancel.length, 1, '没走 cancel:手机点了"停止"而内核什么都没发生');
|
|
128
|
-
assert.deepEqual(f.calls.cancel[0], [{ kind: 'user' }, { keepInbox: true }], 'cancel 的参数形状必须逐字对:keepInbox 丢了会把已排队的指令一起吞掉');
|
|
129
|
-
});
|
|
130
|
-
test('modelSelection 与发指令读的是同一条路径(两处各写一遍迟早分叉)', () => {
|
|
131
|
-
const f = fixture();
|
|
132
|
-
const kernel = f.kernel(f.bundle());
|
|
133
|
-
assert.deepEqual(kernel.modelSelection?.(), { provider: 'stepfun', model: 'step-5-preview' });
|
|
134
|
-
const missing = fixture();
|
|
135
|
-
const kernel2 = missing.kernel(missing.bundle({ model: undefined }));
|
|
136
|
-
assert.equal(kernel2.modelSelection?.(), undefined, '没有 currentSelection 时必须返回 undefined,而不是抛或给半个对象');
|
|
137
|
-
});
|
|
138
|
-
/**
|
|
139
|
-
* 这条测的是"插件绝不带崩宿主"那一条红线在现场的形状。
|
|
140
|
-
*
|
|
141
|
-
* `guardedSubscribe` 只保护**注册**那一步;回调本体是裸交给 cordis 的 emit 的。
|
|
142
|
-
* 一次抛出(下游 runtime/transport 里任何一环都可能)会打断这条事件的派发,
|
|
143
|
-
* 严重时整条订阅被拆掉——真机表现是"回合跑到一半再也没事件",而 status.json 一片祥和。
|
|
144
|
-
* 所以:不许把异常抛回去,并且必须留下可查的痕迹。
|
|
145
|
-
*/
|
|
146
|
-
test('事件回调里的异常不许冒回内核,且必须进 status.json 的 kernel.listenerErrors', () => {
|
|
147
|
-
const f = fixture();
|
|
148
|
-
const services = f.bundle({ live: true });
|
|
149
|
-
const listeners = {};
|
|
150
|
-
services.on = (name, listener) => {
|
|
151
|
-
listeners[name] = listener;
|
|
152
|
-
return () => { };
|
|
153
|
-
};
|
|
154
|
-
const kernel = f.kernel(services);
|
|
155
|
-
kernel.subscribe(() => {
|
|
156
|
-
throw new Error('下游炸了');
|
|
157
|
-
});
|
|
158
|
-
const sessionEvent = listeners['session/event'];
|
|
159
|
-
assert.ok(sessionEvent, 'session/event 没订阅上:白名单或注册口出问题');
|
|
160
|
-
assert.doesNotThrow(() => sessionEvent({ id: 'ses_live' }, { type: 'turn/start', data: { turn: 3 } }), '我们的监听器把异常抛回了 cordis 的 emit:这一代 cordis 会因此拆掉整条订阅');
|
|
161
|
-
const described = kernel.describe();
|
|
162
|
-
assert.match(String(described.listenerErrors), /下游炸了/, '抛错没进 status.json:线上只能靠猜');
|
|
163
|
-
assert.match(String(described.listenerErrors), /^\d+×/, '要带次数:同一处抛一万次与抛一次是完全不同的问题');
|
|
164
|
-
});
|
|
165
|
-
test('人工交互两面的登记结果必须能从 status.json 读出来(审批卡没弹时的分诊入口)', () => {
|
|
166
|
-
const f = fixture();
|
|
167
|
-
const services = f.bundle({ live: true });
|
|
168
|
-
const listeners = {};
|
|
169
|
-
services.on = (name, listener) => {
|
|
170
|
-
listeners[name] = listener;
|
|
171
|
-
return () => { };
|
|
172
|
-
};
|
|
173
|
-
const kernel = f.kernel(services);
|
|
174
|
-
assert.equal(kernel.describe().approvalFace, 'not-attached', '还没挂 sink 就说"已登记":这条字段就成了谎');
|
|
175
|
-
const detach = kernel.attachInteractionSink({ approval: async () => 'allowed-once', question: async () => null });
|
|
176
|
-
const described = kernel.describe();
|
|
177
|
-
// 审批是 **waterfall 参与者**,登记动作就是 `on('approval/request', …)`。
|
|
178
|
-
assert.ok(listeners['approval/request'], '没有真正登记 approval/request 参与者');
|
|
179
|
-
assert.equal(described.approvalFace, 'registered', `审批面登记状态读不出真值:${String(described.approvalFace)}`);
|
|
180
|
-
// 提问默认不接管(`ctx.userQuestions` 是单提供者,接管会剥夺桌面 UI 的提问能力)。
|
|
181
|
-
assert.equal(described.questionsFace, 'not-taken-over', '默认就该是 not-taken-over,否则桌面端问不了问题');
|
|
182
|
-
detach();
|
|
183
|
-
});
|
|
184
|
-
test('takeOverQuestions=true 时才注册提问提供者;没有那个服务要说得出来', () => {
|
|
185
|
-
const f = fixture();
|
|
186
|
-
const services = f.bundle({ live: true });
|
|
187
|
-
services.on = (name, listener) => {
|
|
188
|
-
void name;
|
|
189
|
-
void listener;
|
|
190
|
-
return () => { };
|
|
191
|
-
};
|
|
192
|
-
let registered = 0;
|
|
193
|
-
services.userQuestions = {
|
|
194
|
-
registerProvider: () => {
|
|
195
|
-
registered += 1;
|
|
196
|
-
return () => { };
|
|
197
|
-
},
|
|
198
|
-
};
|
|
199
|
-
const clock = new FakeClock();
|
|
200
|
-
const kernel = createServicesKernel(services, { clock, takeOverQuestions: true, log: () => { } });
|
|
201
|
-
kernel.attachInteractionSink({ approval: async () => 'allowed-once', question: async () => null });
|
|
202
|
-
assert.equal(registered, 1, '开了接管却没注册提供者:手机端永远收不到提问,桌面端也问不了');
|
|
203
|
-
assert.equal(kernel.describe().questionsFace, 'registered');
|
|
204
|
-
const noService = fixture();
|
|
205
|
-
const bare = noService.bundle({ live: true });
|
|
206
|
-
bare.on = () => () => { };
|
|
207
|
-
delete bare.userQuestions;
|
|
208
|
-
const kernel2 = createServicesKernel(bare, { clock, takeOverQuestions: true, log: () => { } });
|
|
209
|
-
kernel2.attachInteractionSink({ approval: async () => 'allowed-once', question: async () => null });
|
|
210
|
-
const face = String(kernel2.describe().questionsFace);
|
|
211
|
-
assert.match(face, /no registerProvider/, '接管失败要说清是缺服务还是这一代换了 API 名字');
|
|
212
|
-
assert.match(face, /keys=/, '必须把服务实际暴露的成员报出来:真机上就是靠这个判断"这一代宿主没有注册口"');
|
|
213
|
-
});
|
|
214
|
-
test('未知事件类型不映射但要在 kernel.unmappedEventTypes 里看得见', () => {
|
|
215
|
-
const f = fixture();
|
|
216
|
-
const services = f.bundle({ live: true });
|
|
217
|
-
const listeners = {};
|
|
218
|
-
services.on = (name, listener) => {
|
|
219
|
-
listeners[name] = listener;
|
|
220
|
-
return () => { };
|
|
221
|
-
};
|
|
222
|
-
const kernel = f.kernel(services);
|
|
223
|
-
const seen = [];
|
|
224
|
-
kernel.subscribe((event) => seen.push(event.kind));
|
|
225
|
-
const unknownEvent = listeners['session/event'];
|
|
226
|
-
assert.ok(unknownEvent, 'session/event 没订阅上');
|
|
227
|
-
unknownEvent({ id: 'ses_live' }, { type: 'brand/new-event', seq: 1, data: { x: 1 } });
|
|
228
|
-
assert.deepEqual(seen, [], '未知类型被映射成了某个事件:F1 禁止挪用语义');
|
|
229
|
-
assert.equal(String(kernel.describe().unmappedEventTypes), 'brand/new-event', '没留痕:下一次"手机上缺东西"又要从头猜');
|
|
230
|
-
assert.match(String(kernel.describe().eventTypes), /brand\/new-event/, '收到过什么类型也要记:分不清"内核没发"与"我们没认"');
|
|
231
|
-
});
|
|
232
|
-
// ── 历史:内核日志 → 一页条目 ────────────────────────────────────────
|
|
233
|
-
//
|
|
234
|
-
// 夹具用的是**真机日志的形状**(取证:`~/.dsh/sessions/**/session.v4.jsonl.zstd`,逐字抄),
|
|
235
|
-
// 不是"照着类型定义编一个"。这一层最容易犯的错就是拿想象中的形状去测自己写的解析。
|
|
236
|
-
/** 一轮:用户说一句、模型想一下(reasoning + tool-call)、调工具、拿到结果、给出结论。 */
|
|
237
|
-
function realLog(sessionId) {
|
|
238
|
-
return [
|
|
239
|
-
{ type: 'turn/start', seq: 5, data: { turn: 1 } },
|
|
240
|
-
{ type: 'step/start', seq: 7, data: { turn: 1, step: 1 } },
|
|
241
|
-
{
|
|
242
|
-
type: 'user/message',
|
|
243
|
-
seq: 9,
|
|
244
|
-
data: {
|
|
245
|
-
content: [{ type: 'text', text: '看看这个项目的完成度' }],
|
|
246
|
-
source: { kind: 'user' },
|
|
247
|
-
role: 'user',
|
|
248
|
-
id: 'u-9',
|
|
249
|
-
},
|
|
250
|
-
},
|
|
251
|
-
{
|
|
252
|
-
type: 'assistant/message',
|
|
253
|
-
seq: 11,
|
|
254
|
-
// 正文在 data.message.content;这一条只有 reasoning + tool-call —— 正文是空的
|
|
255
|
-
data: {
|
|
256
|
-
turn: 1,
|
|
257
|
-
step: 1,
|
|
258
|
-
message: {
|
|
259
|
-
role: 'assistant',
|
|
260
|
-
content: [
|
|
261
|
-
{ type: 'reasoning', text: '先看看目录里有什么。' },
|
|
262
|
-
{ type: 'tool-call', id: 'call_a', name: 'run_code', arguments: '{"code":"ls"}' },
|
|
263
|
-
],
|
|
264
|
-
},
|
|
265
|
-
},
|
|
266
|
-
},
|
|
267
|
-
{
|
|
268
|
-
type: 'tool/call',
|
|
269
|
-
seq: 12,
|
|
270
|
-
data: { turn: 1, step: 1, callId: 'call_a', name: 'Bash', arguments: '{"command":"ls -la"}' },
|
|
271
|
-
},
|
|
272
|
-
{
|
|
273
|
-
type: 'tool/result',
|
|
274
|
-
seq: 13,
|
|
275
|
-
data: {
|
|
276
|
-
turn: 1,
|
|
277
|
-
step: 1,
|
|
278
|
-
message: {
|
|
279
|
-
role: 'tool',
|
|
280
|
-
source: { kind: 'tool', callId: 'call_a' },
|
|
281
|
-
toolCallId: 'call_a',
|
|
282
|
-
content: [{ type: 'text', text: 'total 88\ndrwxr-xr-x 20 dev' }],
|
|
283
|
-
},
|
|
284
|
-
},
|
|
285
|
-
},
|
|
286
|
-
{
|
|
287
|
-
type: 'assistant/message',
|
|
288
|
-
seq: 14,
|
|
289
|
-
data: {
|
|
290
|
-
turn: 1,
|
|
291
|
-
step: 1,
|
|
292
|
-
message: {
|
|
293
|
-
role: 'assistant',
|
|
294
|
-
content: [
|
|
295
|
-
{ type: 'reasoning', text: '看完了。' },
|
|
296
|
-
{ type: 'text', text: '项目结构清楚,完成度不错。' },
|
|
297
|
-
],
|
|
298
|
-
},
|
|
299
|
-
},
|
|
300
|
-
},
|
|
301
|
-
{ type: 'turn/end', seq: 15, data: { turn: 1, reason: { kind: 'completed' } } },
|
|
302
|
-
];
|
|
303
|
-
}
|
|
304
|
-
test('历史:与实时流同构的日志被翻译成同一种条目,空正文与运行态都不落进页面', () => {
|
|
305
|
-
const page = historyPageFromLog({ sessionId: 'ses_1', events: realLog('ses_1'), limit: 100 });
|
|
306
|
-
const shape = page.events.map((e) => {
|
|
307
|
-
if (e.kind === 'delta')
|
|
308
|
-
return `delta:${e.role}:${e.text}`;
|
|
309
|
-
if (e.kind === 'tool')
|
|
310
|
-
return `tool:${e.phase}:${e.callId}`;
|
|
311
|
-
return `other:${e.kind}`;
|
|
312
|
-
});
|
|
313
|
-
assert.deepEqual(shape, [
|
|
314
|
-
'delta:user:看看这个项目的完成度',
|
|
315
|
-
// 只有 reasoning + tool-call 的那条 assistant/message **不该**产生正文块:
|
|
316
|
-
// 不过滤的话历史里会插进一堆空白正文
|
|
317
|
-
'tool:args:call_a',
|
|
318
|
-
'tool:completed:call_a',
|
|
319
|
-
'delta:assistant:项目结构清楚,完成度不错。',
|
|
320
|
-
]);
|
|
321
|
-
assert.equal(page.nextBeforeSeq, undefined, '整份日志一次给完,不该再给游标');
|
|
322
|
-
});
|
|
323
|
-
test('历史:思维链正文(M28)一个字节都不出站 —— 历史这条路径也必须守', () => {
|
|
324
|
-
const page = historyPageFromLog({ sessionId: 'ses_1', events: realLog('ses_1'), limit: 100 });
|
|
325
|
-
const dumped = JSON.stringify(page);
|
|
326
|
-
assert.equal(dumped.includes('先看看目录里有什么'), false, 'reasoning 泄漏到出站结构里了');
|
|
327
|
-
assert.equal(dumped.includes('看完了'), false, 'reasoning 泄漏到出站结构里了');
|
|
328
|
-
assert.equal(dumped.includes('reasoning'), false);
|
|
329
|
-
});
|
|
330
|
-
test('历史:一条原始事件可能折成 0/1/2 条 —— 分页必须切在事件边界上,不能切在条目中间', () => {
|
|
331
|
-
const log = realLog('ses_1');
|
|
332
|
-
const all = historyPageFromLog({ sessionId: 'ses_1', events: log, limit: 100 });
|
|
333
|
-
// 从最后往前一页页翻,拼起来必须与一次全给**逐字相同**
|
|
334
|
-
const collected = [];
|
|
335
|
-
let cursor;
|
|
336
|
-
for (let guard = 0; guard < 20; guard++) {
|
|
337
|
-
const page = historyPageFromLog({
|
|
338
|
-
sessionId: 'ses_1',
|
|
339
|
-
events: log,
|
|
340
|
-
limit: 2,
|
|
341
|
-
...(cursor === undefined ? {} : { beforeSeq: cursor }),
|
|
342
|
-
});
|
|
343
|
-
collected.unshift(...page.events);
|
|
344
|
-
if (page.nextBeforeSeq === undefined)
|
|
345
|
-
break;
|
|
346
|
-
cursor = page.nextBeforeSeq;
|
|
347
|
-
}
|
|
348
|
-
assert.deepEqual(collected, all.events, '翻页拼起来与一次全给不一致:中间丢或重了');
|
|
349
|
-
});
|
|
350
|
-
test('历史:翻不动的时候不许给游标(否则手机上会长出一个点了没反应的「加载更早」)', () => {
|
|
351
|
-
const log = realLog('ses_1');
|
|
352
|
-
const one = historyPageFromLog({ sessionId: 'ses_1', events: log, limit: 2 });
|
|
353
|
-
assert.equal(typeof one.nextBeforeSeq, 'number', '还有更早的内容就必须给游标');
|
|
354
|
-
const rest = historyPageFromLog({ sessionId: 'ses_1', events: log, limit: 100, beforeSeq: one.nextBeforeSeq ?? 0 });
|
|
355
|
-
assert.equal(rest.nextBeforeSeq, undefined, '已经到最早了还在给游标');
|
|
356
|
-
assert.ok(rest.events.length > 0);
|
|
357
|
-
// 游标是**排他**上界:拿同一个游标再要一次,结果必须完全一致(幂等)
|
|
358
|
-
const again = historyPageFromLog({ sessionId: 'ses_1', events: log, limit: 100, beforeSeq: one.nextBeforeSeq ?? 0 });
|
|
359
|
-
assert.deepEqual(again, rest);
|
|
360
|
-
});
|
|
361
|
-
test('历史:预算再小也要给出一整组,不能产出空页(空页 + 游标 = 翻页死循环)', () => {
|
|
362
|
-
const page = historyPageFromLog({ sessionId: 'ses_1', events: realLog('ses_1'), limit: 1 });
|
|
363
|
-
assert.ok(page.events.length >= 1, '给了空页但游标还在动,手机端的「加载更早」会一直转');
|
|
364
|
-
});
|
|
365
|
-
test('历史:没有下文的工具调用要落成"已结束 + 说明",不能让它一直显示"正在执行"', () => {
|
|
366
|
-
const log = [
|
|
367
|
-
{ type: 'user/message', seq: 1, data: { content: [{ type: 'text', text: '跑一下' }], role: 'user', id: 'u-1' } },
|
|
368
|
-
{
|
|
369
|
-
type: 'tool/call',
|
|
370
|
-
seq: 2,
|
|
371
|
-
data: { turn: 1, step: 1, callId: 'call_x', name: 'Bash', arguments: '{"command":"sleep 999"}' },
|
|
372
|
-
},
|
|
373
|
-
// 这一轮被中断:没有 tool/result,只有一条 error 收尾
|
|
374
|
-
{
|
|
375
|
-
type: 'turn/end',
|
|
376
|
-
seq: 3,
|
|
377
|
-
data: { turn: 1, reason: { kind: 'error', error: { message: 'user interrupted', code: 'ABORT' } } },
|
|
378
|
-
},
|
|
379
|
-
];
|
|
380
|
-
const page = historyPageFromLog({ sessionId: 'ses_1', events: log, limit: 100 });
|
|
381
|
-
const tool = page.events.find((e) => e.kind === 'tool');
|
|
382
|
-
assert.ok(tool && tool.kind === 'tool');
|
|
383
|
-
assert.equal(tool.phase, 'completed', '停在 args/started 会让步骤组一直显示「正在执行 1 个步骤」');
|
|
384
|
-
assert.match(tool.resultPreview ?? '', /中断/, '要说明为什么没有结果,不能只留一个空结果');
|
|
385
|
-
// 收尾的错误文案要留下:否则手机上"这一轮什么都没发生"与"成功回合"长得一样
|
|
386
|
-
const texts = page.events.filter((e) => e.kind === 'delta').map((e) => (e.kind === 'delta' ? e.text : ''));
|
|
387
|
-
assert.ok(texts.some((t) => t.includes('user interrupted')), `错误原因被丢了:${JSON.stringify(texts)}`);
|
|
388
|
-
});
|
|
389
|
-
test('历史:未知事件类型既不映射也不炸(内核一直在加新事件)', () => {
|
|
390
|
-
const page = historyPageFromLog({
|
|
391
|
-
sessionId: 'ses_1',
|
|
392
|
-
events: [
|
|
393
|
-
{ type: 'brand/new-event', seq: 1, data: { x: 1 } },
|
|
394
|
-
{ type: 'user/message', seq: 2, data: { content: [{ type: 'text', text: '在' }], role: 'user', id: 'u-2' } },
|
|
395
|
-
],
|
|
396
|
-
limit: 100,
|
|
397
|
-
});
|
|
398
|
-
assert.equal(page.events.length, 1);
|
|
399
|
-
assert.equal(page.events[0].kind, 'delta');
|
|
400
|
-
});
|
|
401
|
-
test('历史:空日志给空页、且不给游标("这个会话没有内容"与"读不出来"必须分得清)', () => {
|
|
402
|
-
const page = historyPageFromLog({ sessionId: 'ses_1', events: [], limit: 100 });
|
|
403
|
-
assert.deepEqual(page.events, []);
|
|
404
|
-
assert.equal(page.nextBeforeSeq, undefined);
|
|
405
|
-
});
|
|
406
|
-
test('读历史走 sessionQuery.readSession,把它给的整份事件交给分页', async () => {
|
|
407
|
-
const f = fixture();
|
|
408
|
-
const asked = [];
|
|
409
|
-
const services = f.bundle({ live: true });
|
|
410
|
-
services.sessionQuery = {
|
|
411
|
-
readSession: (id) => {
|
|
412
|
-
asked.push(id);
|
|
413
|
-
return Promise.resolve({ session: { id }, events: realLog(id) });
|
|
414
|
-
},
|
|
415
|
-
};
|
|
416
|
-
const kernel = f.kernel(services);
|
|
417
|
-
const page = await kernel.readHistory('ses_1', { limit: 100 });
|
|
418
|
-
assert.deepEqual(asked, ['ses_1'], '读历史必须点名那条会话');
|
|
419
|
-
assert.equal(page.events.length, 4);
|
|
420
|
-
assert.match(String(kernel.describe().historyFace), /readSession/);
|
|
421
|
-
});
|
|
422
|
-
test('宿主没有 sessionQuery.readSession 时必须**抛**,不许回一张空页', async () => {
|
|
423
|
-
const f = fixture();
|
|
424
|
-
const kernel = f.kernel(f.bundle({ live: true })); // bundle 里根本没有 sessionQuery
|
|
425
|
-
await assert.rejects(() => kernel.readHistory('ses_1', { limit: 10 }), /不能读会话历史/, '回空页在手机上是"这个会话没内容"——一个会让人查错方向的假事实');
|
|
426
|
-
assert.match(String(kernel.describe().historyFace), /absent/);
|
|
427
|
-
});
|
|
428
|
-
// ── 新建会话 ────────────────────────────────────────────────────────
|
|
429
|
-
test('新建会话走 sessionController.commands.create({}):一个字段都不许自己塞', async () => {
|
|
430
|
-
const f = fixture();
|
|
431
|
-
const asked = [];
|
|
432
|
-
const services = f.bundle({ live: true });
|
|
433
|
-
services.sessionController = {
|
|
434
|
-
commands: {
|
|
435
|
-
create: (request) => {
|
|
436
|
-
asked.push(request);
|
|
437
|
-
// 真实签名(commands.js 的 `async create`):`{ sessionId, ...(agentPreset ? {agentPreset} : {}) }`
|
|
438
|
-
return Promise.resolve({ sessionId: 'session-abc' });
|
|
439
|
-
},
|
|
440
|
-
},
|
|
441
|
-
};
|
|
442
|
-
const kernel = f.kernel(services);
|
|
443
|
-
const made = await kernel.newSession();
|
|
444
|
-
assert.deepEqual(made, { ok: true, sessionId: 'session-abc' });
|
|
445
|
-
// 空对象而不是 `{cwd: ...}` / `{sessionId: ...}`:不给 sessionId 才让内核分配新的,
|
|
446
|
-
// 不给 cwd/workspaceId 才用宿主自己的默认项目目录(两者同时给会被内核当场拒)。
|
|
447
|
-
assert.deepEqual(asked, [{}]);
|
|
448
|
-
assert.match(String(kernel.describe().createFace), /commands\.create/);
|
|
449
|
-
});
|
|
450
|
-
test('新建的空会话必须出现在列表里 —— 持久化那面还没它,而它已经不是"不存在"', async () => {
|
|
451
|
-
const f = fixture();
|
|
452
|
-
const services = f.bundle({ live: true });
|
|
453
|
-
// 持久化那面(sessionQuery.listSessions)扫的是会话**日志**,一条还没有任何消息的
|
|
454
|
-
// 新会话根本没有日志。这里就模拟这个局面:它永远报不出新建的那条。
|
|
455
|
-
services.sessionQuery = {
|
|
456
|
-
listSessions: () => Promise.resolve([{ header: { id: 'ses_old', createdAt: 1_700_000_000_000, cwd: '/w/old' } }]),
|
|
457
|
-
};
|
|
458
|
-
services.sessionController = { commands: { create: () => Promise.resolve({ sessionId: 'ses_fresh' }) } };
|
|
459
|
-
const kernel = f.kernel(services);
|
|
460
|
-
const before = await kernel.listSessions(50);
|
|
461
|
-
assert.deepEqual(before.map((item) => item.summary.id), ['ses_old']);
|
|
462
|
-
await kernel.newSession();
|
|
463
|
-
const after = await kernel.listSessions(50);
|
|
464
|
-
const ids = after.map((item) => item.summary.id);
|
|
465
|
-
assert.equal(ids.includes('ses_fresh'), true, `新建的会话不在列表里(实得 ${JSON.stringify(ids)})→ 用户回到列表会以为没建上`);
|
|
466
|
-
assert.equal(ids.length, 2, '补进来的应该正好是新那一条,不能重复');
|
|
467
|
-
});
|
|
468
|
-
test('持久化那面追上之后,本地那条临时记录要退休(不能一直盖着真数据)', async () => {
|
|
469
|
-
const f = fixture();
|
|
470
|
-
const services = f.bundle({ live: true });
|
|
471
|
-
const rows = [
|
|
472
|
-
{ header: { id: 'ses_old', createdAt: 1_700_000_000_000, cwd: '/w/old' } },
|
|
473
|
-
];
|
|
474
|
-
services.sessionQuery = { listSessions: () => Promise.resolve(rows) };
|
|
475
|
-
services.sessionController = { commands: { create: () => Promise.resolve({ sessionId: 'ses_fresh' }) } };
|
|
476
|
-
const kernel = f.kernel(services);
|
|
477
|
-
await kernel.newSession();
|
|
478
|
-
assert.equal((await kernel.listSessions(50)).length, 2, '临时记录先顶上');
|
|
479
|
-
// 宿主把这条落盘了 → 下一次列表里它由持久化那面给出(带 cwd 等真数据)
|
|
480
|
-
rows.push({ header: { id: 'ses_fresh', createdAt: 1_700_000_001_000, cwd: '/w/proj' } });
|
|
481
|
-
const real = await kernel.listSessions(50);
|
|
482
|
-
assert.equal(real.length, 2, '两边都有它的时候不许出现两条');
|
|
483
|
-
const fresh = real.find((item) => item.summary.id === 'ses_fresh');
|
|
484
|
-
assert.equal(fresh?.summary.workspace, '/w/proj', '要让位给真数据,而不是继续用本地那条没 workspace 的');
|
|
485
|
-
});
|
|
486
|
-
test('宿主没有 sessionController:明确说出缺什么,不许编一个 id 出来', async () => {
|
|
487
|
-
const f = fixture();
|
|
488
|
-
const kernel = f.kernel(f.bundle({ live: true }));
|
|
489
|
-
const made = await kernel.newSession();
|
|
490
|
-
assert.equal(made.ok, false);
|
|
491
|
-
assert.equal(made.sessionId, undefined, '拒绝时绝不能带 id');
|
|
492
|
-
assert.match(String(made.message), /sessionController/, '要说清楚缺的是哪一层,否则只有一句看不懂的话');
|
|
493
|
-
assert.match(String(kernel.describe().createFace), /absent/);
|
|
494
|
-
});
|
|
495
|
-
test('sessionController 在、但 commands.create 不在:也要点名到成员一级', async () => {
|
|
496
|
-
const f = fixture();
|
|
497
|
-
const services = f.bundle({ live: true });
|
|
498
|
-
services.sessionController = { commands: { rename: () => undefined } };
|
|
499
|
-
const made = await f.kernel(services).newSession();
|
|
500
|
-
assert.equal(made.ok, false);
|
|
501
|
-
assert.match(String(made.message), /create/, '缺到哪一层就要报到哪一层(这个对象上有 rename 但没有 create)');
|
|
502
|
-
});
|
|
503
|
-
test('创建返回里没有 sessionId:按失败处理,不把 undefined 当成一个 id 往下传', async () => {
|
|
504
|
-
const f = fixture();
|
|
505
|
-
const services = f.bundle({ live: true });
|
|
506
|
-
services.sessionController = { commands: { create: () => Promise.resolve({ agentPreset: 'x' }) } };
|
|
507
|
-
const made = await f.kernel(services).newSession();
|
|
508
|
-
assert.equal(made.ok, false);
|
|
509
|
-
assert.match(String(made.message), /sessionId/);
|
|
510
|
-
});
|
|
511
|
-
/**
|
|
512
|
-
* `sessionWorkspace` 是二维码 PNG 落点的唯一依据(`/drc pair` 卡片与右栏那条路由都用它)。
|
|
513
|
-
* 它必须是**同步、零成本、绝不抛**的:调用点一个在命令 handler 里(用户等着出卡片),
|
|
514
|
-
* 一个在每 2 秒一次的轮询请求里。
|
|
515
|
-
*/
|
|
516
|
-
test('sessionWorkspace:认活会话头里的 cwd,认不出来就 undefined(调用方退回 ~/.dsh/)', () => {
|
|
517
|
-
const f = fixture();
|
|
518
|
-
const services = f.bundle();
|
|
519
|
-
services.sessions = {
|
|
520
|
-
list: () => [],
|
|
521
|
-
get: (id) => {
|
|
522
|
-
if (id === 'ses_ws')
|
|
523
|
-
return { header: { id: 'ses_ws', cwd: '/Users/u/project' } };
|
|
524
|
-
// 另一代把会话折叠成扁平记录(listSessions 的 sessions.list 分支就是这么读的)。
|
|
525
|
-
if (id === 'ses_flat')
|
|
526
|
-
return { id: 'ses_flat', cwd: '/Users/u/flat' };
|
|
527
|
-
if (id === 'ses_nocwd')
|
|
528
|
-
return { header: { id: 'ses_nocwd' } };
|
|
529
|
-
return undefined;
|
|
530
|
-
},
|
|
531
|
-
};
|
|
532
|
-
const kernel = f.kernel(services);
|
|
533
|
-
assert.equal(kernel.sessionWorkspace?.('ses_ws'), '/Users/u/project', '真身是 session.header.cwd');
|
|
534
|
-
assert.equal(kernel.sessionWorkspace?.('ses_flat'), '/Users/u/flat', '扁平记录形态(顶层 cwd)也要认');
|
|
535
|
-
assert.equal(kernel.sessionWorkspace?.('ses_nocwd'), undefined, '没有 cwd 就是 undefined,不许回空串(空串会被 path.join 拼到进程 CWD)');
|
|
536
|
-
assert.equal(kernel.sessionWorkspace?.('ses_gone'), undefined, '查不到就是 undefined');
|
|
537
|
-
assert.equal(kernel.sessionWorkspace?.(''), undefined, '空 id 不去问内核');
|
|
538
|
-
assert.match(String(kernel.describe().workspaceFace), /sessions\.get/);
|
|
539
|
-
});
|
|
540
|
-
test('宿主没有 sessions.get:返回 undefined 而不是抛(卡片退回 ~/.dsh/ 那条路)', () => {
|
|
541
|
-
const f = fixture();
|
|
542
|
-
const services = f.bundle();
|
|
543
|
-
services.sessions = { list: () => [] };
|
|
544
|
-
const kernel = f.kernel(services);
|
|
545
|
-
assert.doesNotThrow(() => kernel.sessionWorkspace?.('ses_any'));
|
|
546
|
-
assert.equal(kernel.sessionWorkspace?.('ses_any'), undefined);
|
|
547
|
-
assert.match(String(kernel.describe().workspaceFace), /absent/);
|
|
548
|
-
});
|
|
549
|
-
test('sessions.get 抛错(cordis Proxy 读不到成员就是抛):折成 undefined,不许打断 /drc pair', () => {
|
|
550
|
-
const f = fixture();
|
|
551
|
-
const services = f.bundle();
|
|
552
|
-
services.sessions = {
|
|
553
|
-
list: () => [],
|
|
554
|
-
get: () => {
|
|
555
|
-
throw new Error('cannot get property "x" without inject');
|
|
556
|
-
},
|
|
557
|
-
};
|
|
558
|
-
const kernel = f.kernel(services);
|
|
559
|
-
assert.doesNotThrow(() => kernel.sessionWorkspace?.('ses_boom'));
|
|
560
|
-
assert.equal(kernel.sessionWorkspace?.('ses_boom'), undefined);
|
|
561
|
-
});
|
|
562
|
-
//# sourceMappingURL=carrier-services.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"carrier-services.test.js","sourceRoot":"","sources":["../../tests/carrier-services.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|