dsh-remote-control 1.0.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.
Files changed (100) hide show
  1. package/LICENSE +21 -0
  2. package/cordis.patch.yml +21 -0
  3. package/dist/bundle/index.js +33956 -0
  4. package/dist/src/core/clock.d.ts +45 -0
  5. package/dist/src/core/clock.js +83 -0
  6. package/dist/src/core/clock.js.map +1 -0
  7. package/dist/src/core/keys.d.ts +98 -0
  8. package/dist/src/core/keys.js +176 -0
  9. package/dist/src/core/keys.js.map +1 -0
  10. package/dist/src/core/pairing-window.d.ts +95 -0
  11. package/dist/src/core/pairing-window.js +92 -0
  12. package/dist/src/core/pairing-window.js.map +1 -0
  13. package/dist/src/core/runtime.d.ts +104 -0
  14. package/dist/src/core/runtime.js +491 -0
  15. package/dist/src/core/runtime.js.map +1 -0
  16. package/dist/src/core/sleep-policy.d.ts +81 -0
  17. package/dist/src/core/sleep-policy.js +134 -0
  18. package/dist/src/core/sleep-policy.js.map +1 -0
  19. package/dist/src/core/window.d.ts +88 -0
  20. package/dist/src/core/window.js +185 -0
  21. package/dist/src/core/window.js.map +1 -0
  22. package/dist/src/index.d.ts +70 -0
  23. package/dist/src/index.js +882 -0
  24. package/dist/src/index.js.map +1 -0
  25. package/dist/src/platform/carrier-services.d.ts +96 -0
  26. package/dist/src/platform/carrier-services.js +982 -0
  27. package/dist/src/platform/carrier-services.js.map +1 -0
  28. package/dist/src/platform/guard.d.ts +60 -0
  29. package/dist/src/platform/guard.js +124 -0
  30. package/dist/src/platform/guard.js.map +1 -0
  31. package/dist/src/platform/mock-kernel.d.ts +95 -0
  32. package/dist/src/platform/mock-kernel.js +180 -0
  33. package/dist/src/platform/mock-kernel.js.map +1 -0
  34. package/dist/src/platform/qr.d.ts +28 -0
  35. package/dist/src/platform/qr.js +80 -0
  36. package/dist/src/platform/qr.js.map +1 -0
  37. package/dist/src/platform/sleep-posix.d.ts +17 -0
  38. package/dist/src/platform/sleep-posix.js +91 -0
  39. package/dist/src/platform/sleep-posix.js.map +1 -0
  40. package/dist/src/ports/index.d.ts +246 -0
  41. package/dist/src/ports/index.js +2 -0
  42. package/dist/src/ports/index.js.map +1 -0
  43. package/dist/src/shell/config.d.ts +56 -0
  44. package/dist/src/shell/config.js +212 -0
  45. package/dist/src/shell/config.js.map +1 -0
  46. package/dist/src/shell/pairing-text.d.ts +38 -0
  47. package/dist/src/shell/pairing-text.js +22 -0
  48. package/dist/src/shell/pairing-text.js.map +1 -0
  49. package/dist/src/shell/status.d.ts +39 -0
  50. package/dist/src/shell/status.js +119 -0
  51. package/dist/src/shell/status.js.map +1 -0
  52. package/dist/src/transport/relay.d.ts +107 -0
  53. package/dist/src/transport/relay.js +359 -0
  54. package/dist/src/transport/relay.js.map +1 -0
  55. package/dist/tests/carrier-events.test.d.ts +1 -0
  56. package/dist/tests/carrier-events.test.js +88 -0
  57. package/dist/tests/carrier-events.test.js.map +1 -0
  58. package/dist/tests/carrier-services.test.d.ts +1 -0
  59. package/dist/tests/carrier-services.test.js +562 -0
  60. package/dist/tests/carrier-services.test.js.map +1 -0
  61. package/dist/tests/carrier-vocabulary.test.d.ts +1 -0
  62. package/dist/tests/carrier-vocabulary.test.js +149 -0
  63. package/dist/tests/carrier-vocabulary.test.js.map +1 -0
  64. package/dist/tests/clock-probe-timers.test.d.ts +1 -0
  65. package/dist/tests/clock-probe-timers.test.js +73 -0
  66. package/dist/tests/clock-probe-timers.test.js.map +1 -0
  67. package/dist/tests/command-result.test.d.ts +1 -0
  68. package/dist/tests/command-result.test.js +185 -0
  69. package/dist/tests/command-result.test.js.map +1 -0
  70. package/dist/tests/config.test.d.ts +1 -0
  71. package/dist/tests/config.test.js +223 -0
  72. package/dist/tests/config.test.js.map +1 -0
  73. package/dist/tests/guard.test.d.ts +1 -0
  74. package/dist/tests/guard.test.js +175 -0
  75. package/dist/tests/guard.test.js.map +1 -0
  76. package/dist/tests/ids-and-keys.test.d.ts +1 -0
  77. package/dist/tests/ids-and-keys.test.js +211 -0
  78. package/dist/tests/ids-and-keys.test.js.map +1 -0
  79. package/dist/tests/pairing-text.test.d.ts +1 -0
  80. package/dist/tests/pairing-text.test.js +62 -0
  81. package/dist/tests/pairing-text.test.js.map +1 -0
  82. package/dist/tests/pairing-window.test.d.ts +1 -0
  83. package/dist/tests/pairing-window.test.js +165 -0
  84. package/dist/tests/pairing-window.test.js.map +1 -0
  85. package/dist/tests/relay-client.test.d.ts +1 -0
  86. package/dist/tests/relay-client.test.js +557 -0
  87. package/dist/tests/relay-client.test.js.map +1 -0
  88. package/dist/tests/runtime.test.d.ts +1 -0
  89. package/dist/tests/runtime.test.js +963 -0
  90. package/dist/tests/runtime.test.js.map +1 -0
  91. package/dist/tests/sleep.test.d.ts +1 -0
  92. package/dist/tests/sleep.test.js +264 -0
  93. package/dist/tests/sleep.test.js.map +1 -0
  94. package/dist/tests/status.test.d.ts +1 -0
  95. package/dist/tests/status.test.js +238 -0
  96. package/dist/tests/status.test.js.map +1 -0
  97. package/dist/tests/window.test.d.ts +1 -0
  98. package/dist/tests/window.test.js +210 -0
  99. package/dist/tests/window.test.js.map +1 -0
  100. package/package.json +70 -0
@@ -0,0 +1,562 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"carrier-services.test.js","sourceRoot":"","sources":["../../tests/carrier-services.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};