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