@barryfan2045/dsh-matrix 0.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 (206) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +286 -0
  3. package/THIRD_PARTY_NOTICES.md +53 -0
  4. package/assets/avatars/instance-01.png +0 -0
  5. package/assets/avatars/instance-02.png +0 -0
  6. package/assets/avatars/instance-03.png +0 -0
  7. package/assets/avatars/instance-04.png +0 -0
  8. package/assets/avatars/instance-05.png +0 -0
  9. package/assets/avatars/instance-06.png +0 -0
  10. package/assets/avatars/instance-07.png +0 -0
  11. package/assets/avatars/instance-08.png +0 -0
  12. package/assets/avatars/instance-09.png +0 -0
  13. package/assets/avatars/instance-10.png +0 -0
  14. package/assets/avatars/instance-11.png +0 -0
  15. package/assets/avatars/instance-12.png +0 -0
  16. package/assets/avatars/management.png +0 -0
  17. package/cordis.patch.yml +13 -0
  18. package/dist/auth/admin-commands.d.ts +47 -0
  19. package/dist/auth/admin-commands.d.ts.map +1 -0
  20. package/dist/auth/admin-commands.js +112 -0
  21. package/dist/auth/admin-commands.js.map +1 -0
  22. package/dist/auth/challenge.d.ts +93 -0
  23. package/dist/auth/challenge.d.ts.map +1 -0
  24. package/dist/auth/challenge.js +104 -0
  25. package/dist/auth/challenge.js.map +1 -0
  26. package/dist/auth/store.d.ts +55 -0
  27. package/dist/auth/store.d.ts.map +1 -0
  28. package/dist/auth/store.js +124 -0
  29. package/dist/auth/store.js.map +1 -0
  30. package/dist/bridge/agent-commands.d.ts +39 -0
  31. package/dist/bridge/agent-commands.d.ts.map +1 -0
  32. package/dist/bridge/agent-commands.js +243 -0
  33. package/dist/bridge/agent-commands.js.map +1 -0
  34. package/dist/bridge/attachments-ledger.d.ts +54 -0
  35. package/dist/bridge/attachments-ledger.d.ts.map +1 -0
  36. package/dist/bridge/attachments-ledger.js +68 -0
  37. package/dist/bridge/attachments-ledger.js.map +1 -0
  38. package/dist/bridge/commands.d.ts +28 -0
  39. package/dist/bridge/commands.d.ts.map +1 -0
  40. package/dist/bridge/commands.js +18 -0
  41. package/dist/bridge/commands.js.map +1 -0
  42. package/dist/bridge/crypto-health.d.ts +37 -0
  43. package/dist/bridge/crypto-health.d.ts.map +1 -0
  44. package/dist/bridge/crypto-health.js +38 -0
  45. package/dist/bridge/crypto-health.js.map +1 -0
  46. package/dist/bridge/group-gate.d.ts +38 -0
  47. package/dist/bridge/group-gate.d.ts.map +1 -0
  48. package/dist/bridge/group-gate.js +49 -0
  49. package/dist/bridge/group-gate.js.map +1 -0
  50. package/dist/bridge/instance-lock.d.ts +10 -0
  51. package/dist/bridge/instance-lock.d.ts.map +1 -0
  52. package/dist/bridge/instance-lock.js +82 -0
  53. package/dist/bridge/instance-lock.js.map +1 -0
  54. package/dist/bridge/interactions.d.ts +62 -0
  55. package/dist/bridge/interactions.d.ts.map +1 -0
  56. package/dist/bridge/interactions.js +237 -0
  57. package/dist/bridge/interactions.js.map +1 -0
  58. package/dist/bridge/management-room.d.ts +13 -0
  59. package/dist/bridge/management-room.d.ts.map +1 -0
  60. package/dist/bridge/management-room.js +27 -0
  61. package/dist/bridge/management-room.js.map +1 -0
  62. package/dist/bridge/multi-project.d.ts +34 -0
  63. package/dist/bridge/multi-project.d.ts.map +1 -0
  64. package/dist/bridge/multi-project.js +44 -0
  65. package/dist/bridge/multi-project.js.map +1 -0
  66. package/dist/bridge/pipeline.d.ts +151 -0
  67. package/dist/bridge/pipeline.d.ts.map +1 -0
  68. package/dist/bridge/pipeline.js +502 -0
  69. package/dist/bridge/pipeline.js.map +1 -0
  70. package/dist/bridge/pmctl.d.ts +50 -0
  71. package/dist/bridge/pmctl.d.ts.map +1 -0
  72. package/dist/bridge/pmctl.js +272 -0
  73. package/dist/bridge/pmctl.js.map +1 -0
  74. package/dist/bridge/power-levels.d.ts +57 -0
  75. package/dist/bridge/power-levels.d.ts.map +1 -0
  76. package/dist/bridge/power-levels.js +92 -0
  77. package/dist/bridge/power-levels.js.map +1 -0
  78. package/dist/bridge/power-sync.d.ts +64 -0
  79. package/dist/bridge/power-sync.d.ts.map +1 -0
  80. package/dist/bridge/power-sync.js +121 -0
  81. package/dist/bridge/power-sync.js.map +1 -0
  82. package/dist/bridge/projects.d.ts +97 -0
  83. package/dist/bridge/projects.d.ts.map +1 -0
  84. package/dist/bridge/projects.js +288 -0
  85. package/dist/bridge/projects.js.map +1 -0
  86. package/dist/bridge/quote-cache.d.ts +38 -0
  87. package/dist/bridge/quote-cache.d.ts.map +1 -0
  88. package/dist/bridge/quote-cache.js +56 -0
  89. package/dist/bridge/quote-cache.js.map +1 -0
  90. package/dist/bridge/reply.d.ts +31 -0
  91. package/dist/bridge/reply.d.ts.map +1 -0
  92. package/dist/bridge/reply.js +122 -0
  93. package/dist/bridge/reply.js.map +1 -0
  94. package/dist/bridge/space-identity.d.ts +43 -0
  95. package/dist/bridge/space-identity.d.ts.map +1 -0
  96. package/dist/bridge/space-identity.js +92 -0
  97. package/dist/bridge/space-identity.js.map +1 -0
  98. package/dist/bridge/space-sync.d.ts +94 -0
  99. package/dist/bridge/space-sync.d.ts.map +1 -0
  100. package/dist/bridge/space-sync.js +137 -0
  101. package/dist/bridge/space-sync.js.map +1 -0
  102. package/dist/bridge/turn-commands.d.ts +28 -0
  103. package/dist/bridge/turn-commands.d.ts.map +1 -0
  104. package/dist/bridge/turn-commands.js +97 -0
  105. package/dist/bridge/turn-commands.js.map +1 -0
  106. package/dist/cli/config-store.d.ts +32 -0
  107. package/dist/cli/config-store.d.ts.map +1 -0
  108. package/dist/cli/config-store.js +118 -0
  109. package/dist/cli/config-store.js.map +1 -0
  110. package/dist/cli/crypto-store.d.ts +42 -0
  111. package/dist/cli/crypto-store.d.ts.map +1 -0
  112. package/dist/cli/crypto-store.js +70 -0
  113. package/dist/cli/crypto-store.js.map +1 -0
  114. package/dist/cli/device-prune.d.ts +105 -0
  115. package/dist/cli/device-prune.d.ts.map +1 -0
  116. package/dist/cli/device-prune.js +163 -0
  117. package/dist/cli/device-prune.js.map +1 -0
  118. package/dist/cli/index.d.ts +4 -0
  119. package/dist/cli/index.d.ts.map +1 -0
  120. package/dist/cli/index.js +584 -0
  121. package/dist/cli/index.js.map +1 -0
  122. package/dist/cli/log-filter.d.ts +32 -0
  123. package/dist/cli/log-filter.d.ts.map +1 -0
  124. package/dist/cli/log-filter.js +40 -0
  125. package/dist/cli/log-filter.js.map +1 -0
  126. package/dist/cli/pnpm-builds.d.ts +32 -0
  127. package/dist/cli/pnpm-builds.d.ts.map +1 -0
  128. package/dist/cli/pnpm-builds.js +73 -0
  129. package/dist/cli/pnpm-builds.js.map +1 -0
  130. package/dist/cli/profile-patch.d.ts +26 -0
  131. package/dist/cli/profile-patch.d.ts.map +1 -0
  132. package/dist/cli/profile-patch.js +56 -0
  133. package/dist/cli/profile-patch.js.map +1 -0
  134. package/dist/cli/setup.d.ts +39 -0
  135. package/dist/cli/setup.d.ts.map +1 -0
  136. package/dist/cli/setup.js +234 -0
  137. package/dist/cli/setup.js.map +1 -0
  138. package/dist/cli/systemd-hint.d.ts +11 -0
  139. package/dist/cli/systemd-hint.d.ts.map +1 -0
  140. package/dist/cli/systemd-hint.js +46 -0
  141. package/dist/cli/systemd-hint.js.map +1 -0
  142. package/dist/cli/systemd.d.ts +32 -0
  143. package/dist/cli/systemd.d.ts.map +1 -0
  144. package/dist/cli/systemd.js +58 -0
  145. package/dist/cli/systemd.js.map +1 -0
  146. package/dist/config.d.ts +54 -0
  147. package/dist/config.d.ts.map +1 -0
  148. package/dist/config.js +107 -0
  149. package/dist/config.js.map +1 -0
  150. package/dist/dsh/backend.d.ts +110 -0
  151. package/dist/dsh/backend.d.ts.map +1 -0
  152. package/dist/dsh/backend.js +481 -0
  153. package/dist/dsh/backend.js.map +1 -0
  154. package/dist/dsh/interactions.d.ts +50 -0
  155. package/dist/dsh/interactions.d.ts.map +1 -0
  156. package/dist/dsh/interactions.js +141 -0
  157. package/dist/dsh/interactions.js.map +1 -0
  158. package/dist/dsh/stream.d.ts +32 -0
  159. package/dist/dsh/stream.d.ts.map +1 -0
  160. package/dist/dsh/stream.js +109 -0
  161. package/dist/dsh/stream.js.map +1 -0
  162. package/dist/formatting.d.ts +14 -0
  163. package/dist/formatting.d.ts.map +1 -0
  164. package/dist/formatting.js +63 -0
  165. package/dist/formatting.js.map +1 -0
  166. package/dist/index.d.ts +8 -0
  167. package/dist/index.d.ts.map +1 -0
  168. package/dist/index.js +232 -0
  169. package/dist/index.js.map +1 -0
  170. package/dist/logger.d.ts +9 -0
  171. package/dist/logger.d.ts.map +1 -0
  172. package/dist/logger.js +28 -0
  173. package/dist/logger.js.map +1 -0
  174. package/dist/matrix/matrix-events.d.ts +49 -0
  175. package/dist/matrix/matrix-events.d.ts.map +1 -0
  176. package/dist/matrix/matrix-events.js +89 -0
  177. package/dist/matrix/matrix-events.js.map +1 -0
  178. package/dist/matrix/transport.d.ts +192 -0
  179. package/dist/matrix/transport.d.ts.map +1 -0
  180. package/dist/matrix/transport.js +510 -0
  181. package/dist/matrix/transport.js.map +1 -0
  182. package/dist/ports/attachments.d.ts +51 -0
  183. package/dist/ports/attachments.d.ts.map +1 -0
  184. package/dist/ports/attachments.js +27 -0
  185. package/dist/ports/attachments.js.map +1 -0
  186. package/dist/ports/backend.d.ts +159 -0
  187. package/dist/ports/backend.d.ts.map +1 -0
  188. package/dist/ports/backend.js +25 -0
  189. package/dist/ports/backend.js.map +1 -0
  190. package/dist/ports/interactions.d.ts +65 -0
  191. package/dist/ports/interactions.d.ts.map +1 -0
  192. package/dist/ports/interactions.js +15 -0
  193. package/dist/ports/interactions.js.map +1 -0
  194. package/dist/ports/streaming.d.ts +45 -0
  195. package/dist/ports/streaming.d.ts.map +1 -0
  196. package/dist/ports/streaming.js +23 -0
  197. package/dist/ports/streaming.js.map +1 -0
  198. package/dist/ports/transport.d.ts +68 -0
  199. package/dist/ports/transport.d.ts.map +1 -0
  200. package/dist/ports/transport.js +2 -0
  201. package/dist/ports/transport.js.map +1 -0
  202. package/dist/types.d.ts +53 -0
  203. package/dist/types.d.ts.map +1 -0
  204. package/dist/types.js +2 -0
  205. package/dist/types.js.map +1 -0
  206. package/package.json +80 -0
@@ -0,0 +1,481 @@
1
+ /**
2
+ * DSH backend adapter: implements the Backend port against the in-process
3
+ * Cordis services (ctx.agents etc). Every call shape used here was verified
4
+ * end-to-end by the spike (docs/dsh-matrix-port-feasibility.md §9):
5
+ * agents.create({sessionId, meta:{cwd}, agentOptions}) -> AgentHandle
6
+ * agent.followup/steer(createUserMessage({content, source}))
7
+ * agent.status === 'running' | 'idle'; agent.whenIdle()
8
+ * agent.session.snapshotEvents() -> events with type 'assistant/message'
9
+ *
10
+ * Runtime typing: the Context from @deepseek-ai/cordis has no `agents` key
11
+ * unless dsh-agent's module augmentation is loaded, which we deliberately do
12
+ * NOT import (type-only world). We read the service through a narrow
13
+ * structural view - the same trick dsh-web-startup-auth uses.
14
+ */
15
+ import { createUserMessage } from '@deepseek-ai/dsh-llm';
16
+ import * as fs from 'node:fs';
17
+ import * as path from 'node:path';
18
+ import { SessionBusyError } from "../ports/backend.js";
19
+ import { extractTextFromParts } from "../formatting.js";
20
+ /** Raster types the attachment store admits as images (everything else is a file). */
21
+ const ADMISSIBLE_IMAGE_TYPES = new Set(['image/png', 'image/jpeg', 'image/webp', 'image/gif']);
22
+ /** 房间 ID → 安全子目录名(pi-courier sanitizeRoomKey 同式)。 */
23
+ export function sanitizeRoomDir(roomId) {
24
+ return roomId.replace(/[^A-Za-z0-9._-]/g, '_') || 'room';
25
+ }
26
+ /** 文件名消毒:去路径分隔符与控制字符,限长;空回退 attachment。 */
27
+ export function safeFileName(name) {
28
+ const base = (name ?? '').split(/[/\\]/).pop() ?? '';
29
+ const cleaned = base.replace(/[\x00-\x1f\x7f]/g, '').replace(/\.+$/, '').trim().slice(0, 120);
30
+ return cleaned || 'attachment';
31
+ }
32
+ /** 落盘兜底前缀(US27 的 pi-courier UX:路径 + read 工具提示)。 */
33
+ function attachmentPathsPrefix(paths, text) {
34
+ const lines = paths.map((p) => `附件已保存: ${p},请用 read 工具查看`);
35
+ return `${lines.join('\n')}\n\n${text}`;
36
+ }
37
+ /**
38
+ * 认人:DSH 的写句柄独占错误(dsh-session-persistence 的
39
+ * `SessionAlreadyOwnedError`)。DSH GUI 打开着同一会话时,resume 就会撞上它
40
+ * —— 实测报错链:agents.resume → "session ... is already owned by an active
41
+ * write handle"。别名或消息匹配都对(错误可能被上层再包一层,所以顺着
42
+ * `cause` 链往下走)。
43
+ */
44
+ function isSessionOwnedError(error) {
45
+ let current = error;
46
+ for (let depth = 0; current instanceof Error && depth < 5; depth++) {
47
+ if (current.name === 'SessionAlreadyOwnedError')
48
+ return true;
49
+ if (/already owned by an active write handle/i.test(current.message))
50
+ return true;
51
+ current = current.cause;
52
+ }
53
+ return false;
54
+ }
55
+ function asDshContext(ctx) {
56
+ return ctx;
57
+ }
58
+ /** Wrap a live DSH agent into the Backend's SessionHandle contract. */
59
+ class DshSession {
60
+ id;
61
+ agent;
62
+ logger;
63
+ extras;
64
+ /** Pending async admissions (T6): while > 0 the session counts as running. */
65
+ pending = 0;
66
+ pendingWaiters = [];
67
+ constructor(id, agent, logger, extras) {
68
+ this.id = id;
69
+ this.agent = agent;
70
+ this.logger = logger;
71
+ this.extras = extras;
72
+ }
73
+ isRunning() {
74
+ return this.agent.status === 'running' || this.pending > 0;
75
+ }
76
+ prompt(text, files) {
77
+ if (!files?.length) {
78
+ this.agent.followup(createUserMessage({
79
+ content: [{ type: 'text', text }],
80
+ source: { kind: 'user' },
81
+ }));
82
+ return;
83
+ }
84
+ // Admission is async (storage writes); the ledger was already consumed by
85
+ // the pipeline, so attachments must NEVER vanish quietly: a refused or
86
+ // unavailable admission path falls back to on-disk paths + text prefix.
87
+ this.pending += 1;
88
+ void this.admitAndSend(text, files)
89
+ .catch((error) => {
90
+ this.logger.warn('attachments admission failed, falling back to on-disk paths:', error instanceof Error ? error.message : error);
91
+ this.fallbackPrompt(text, files);
92
+ })
93
+ .finally(() => {
94
+ this.pending -= 1;
95
+ for (const w of this.pendingWaiters.splice(0))
96
+ w();
97
+ });
98
+ }
99
+ async admitAndSend(text, files) {
100
+ const svc = this.extras.attachments();
101
+ if (!svc)
102
+ throw new Error('attachments 服务不可用');
103
+ const parts = [];
104
+ for (const f of files) {
105
+ if (f.kind === 'image' && ADMISSIBLE_IMAGE_TYPES.has(f.mimeType)) {
106
+ parts.push({
107
+ type: 'image',
108
+ mediaType: f.mimeType,
109
+ data: Buffer.from(f.bytes).toString('base64'),
110
+ ...(f.filename ? { name: f.filename } : {}),
111
+ });
112
+ }
113
+ else {
114
+ // 非图片(含白名单外的图,如 bmp):逐字节存为 generic file,
115
+ // 请求组装时由 dsh-llm 投射成 name/size/已存路径 的 handle 行。
116
+ const ref = await svc.saveFile({
117
+ data: f.bytes,
118
+ ...(f.filename ? { name: f.filename } : {}),
119
+ });
120
+ parts.push({ type: 'file', attachment: ref });
121
+ }
122
+ }
123
+ parts.push({ type: 'text', text });
124
+ const admitted = await svc.admitPromptContent(parts);
125
+ this.agent.followup(createUserMessage({
126
+ content: admitted,
127
+ source: { kind: 'user' },
128
+ }));
129
+ }
130
+ /** Last-resort path: write bytes under attachmentsDir and prompt text-only
131
+ * with the saved paths prepended (pi-courier UX, US27). */
132
+ fallbackPrompt(text, files) {
133
+ const dir = this.extras.attachmentsDir;
134
+ const paths = [];
135
+ if (dir) {
136
+ const roomDir = path.join(dir, sanitizeRoomDir(this.extras.roomId));
137
+ for (const f of files) {
138
+ try {
139
+ fs.mkdirSync(roomDir, { recursive: true, mode: 0o700 });
140
+ const target = path.join(roomDir, `${Date.now()}-${safeFileName(f.filename)}`);
141
+ fs.writeFileSync(target, f.bytes, { mode: 0o600 });
142
+ paths.push(target);
143
+ }
144
+ catch (error) {
145
+ this.logger.warn('attachment fallback save failed:', error instanceof Error ? error.message : error);
146
+ }
147
+ }
148
+ }
149
+ if (!paths.length) {
150
+ this.logger.warn(`dsh-matrix: ${files.length} 个附件无法接收(attachments 服务与落盘目录均不可用),仅发送文本`);
151
+ this.agent.followup(createUserMessage({
152
+ content: [{ type: 'text', text }],
153
+ source: { kind: 'user' },
154
+ }));
155
+ return;
156
+ }
157
+ this.agent.followup(createUserMessage({
158
+ content: [{ type: 'text', text: attachmentPathsPrefix(paths, text) }],
159
+ source: { kind: 'user' },
160
+ }));
161
+ }
162
+ async whenIdle() {
163
+ while (this.pending > 0)
164
+ await new Promise((r) => this.pendingWaiters.push(r));
165
+ await this.agent.whenIdle();
166
+ }
167
+ steer(text) {
168
+ this.agent.steer(createUserMessage({
169
+ content: [{ type: 'text', text }],
170
+ source: { kind: 'user' },
171
+ }));
172
+ }
173
+ cancel(options) {
174
+ // dsh-session AgentCancelCause: 'user' 是稳定的调用方意图。
175
+ this.agent.cancel({ kind: 'user' }, options);
176
+ }
177
+ queuedItems() {
178
+ const items = [];
179
+ try {
180
+ const inbox = this.agent.inbox;
181
+ if (!inbox)
182
+ return items; // 降级:驱动未暴露 inbox → 空表
183
+ for (const m of inbox.nextStep ?? []) {
184
+ items.push({ kind: 'steer', text: extractTextFromParts(m.content ?? []) });
185
+ }
186
+ for (const m of inbox.nextTurn ?? []) {
187
+ items.push({ kind: 'queue', text: extractTextFromParts(m.content ?? []) });
188
+ }
189
+ }
190
+ catch (error) {
191
+ this.logger.warn('queuedItems failed:', error instanceof Error ? error.message : error);
192
+ }
193
+ return items;
194
+ }
195
+ injectContext(text) {
196
+ this.agent.inject(createUserMessage({
197
+ content: [{ type: 'text', text }],
198
+ source: { kind: 'user' },
199
+ }));
200
+ }
201
+ lastReply() {
202
+ try {
203
+ const events = this.agent.session.snapshotEvents();
204
+ for (let i = events.length - 1; i >= 0; i -= 1) {
205
+ const ev = events[i];
206
+ if (ev?.type !== 'assistant/message')
207
+ continue;
208
+ const msg = (ev.data?.['message'] ?? ev.message ?? ev.data);
209
+ const parts = Array.isArray(msg?.content) ? msg.content : [];
210
+ const text = extractTextFromParts(parts);
211
+ if (text)
212
+ return text;
213
+ }
214
+ }
215
+ catch (error) {
216
+ this.logger.warn('lastReply failed:', error instanceof Error ? error.message : error);
217
+ }
218
+ return undefined;
219
+ }
220
+ /**
221
+ * T11(US42):最近一个回合以失败收尾时给出可读原因。
222
+ *
223
+ * DSH 的会话事件里 `turn/end` 带 `{ turn, reason }`,reason 是判别联合
224
+ * (completed / aborted / blocked / error / max-tokens;见 dsh 的
225
+ * TurnEndReasonMap)。只有 `kind === 'error'` 才算"回合失败":它携带
226
+ * `error: LlmFailure`,而这条路径**不会让 prompt() 抛错**,所以 pipeline 的
227
+ * try/catch 兜不住 —— 必须在回合结束后主动查一次。
228
+ *
229
+ * `aborted`(用户自己 /stop)与 `completed`/`blocked`/`max-tokens` 都不算失败,
230
+ * 返回 undefined(不往房间贴失败行)。
231
+ */
232
+ lastTurnFailure() {
233
+ try {
234
+ const events = this.agent.session.snapshotEvents();
235
+ for (let i = events.length - 1; i >= 0; i -= 1) {
236
+ const ev = events[i];
237
+ if (ev?.type !== 'turn/end')
238
+ continue;
239
+ // 只认最近一次回合结束:它的 reason 决定这次回合的成败
240
+ const reason = (ev.data?.['reason'] ?? ev.reason);
241
+ if (reason?.kind !== 'error')
242
+ return undefined;
243
+ const message = reason.error?.message?.trim();
244
+ return message ? message : '未知错误';
245
+ }
246
+ }
247
+ catch (error) {
248
+ this.logger.warn('lastTurnFailure failed:', error instanceof Error ? error.message : error);
249
+ }
250
+ return undefined;
251
+ }
252
+ }
253
+ export class DshBackend {
254
+ opts;
255
+ handles = new Map();
256
+ sessions = new Map();
257
+ /** sessionId → roomId 归属表:T5 interactions 用它判定"这是不是桥的会话"。 */
258
+ sessionRoom = new Map();
259
+ ctx;
260
+ constructor(ctx, opts) {
261
+ this.opts = opts;
262
+ this.ctx = asDshContext(ctx);
263
+ }
264
+ /** Stable, idempotent session id for a Matrix room id. */
265
+ static sessionIdFor(roomId) {
266
+ return `matrix-${roomId.replace(/[^A-Za-z0-9._-]/g, '_')}`;
267
+ }
268
+ /** Late-read the attachments service (profile may mount it after us). */
269
+ attachmentsService() {
270
+ return this.ctx.get?.('attachments');
271
+ }
272
+ makeSession(roomId, agent) {
273
+ return new DshSession(DshBackend.sessionIdFor(roomId), agent, this.opts.logger, {
274
+ attachments: () => this.attachmentsService(),
275
+ ...(this.opts.attachmentsDir ? { attachmentsDir: this.opts.attachmentsDir } : {}),
276
+ roomId,
277
+ });
278
+ }
279
+ async executeCommand(roomId, line) {
280
+ const handle = this.handles.get(roomId);
281
+ if (!handle) {
282
+ throw new Error(`dsh-matrix: 房间 ${roomId} 还没有会话,先发一条普通消息再使用 DSH 命令`);
283
+ }
284
+ const commands = this.ctx.get?.('commands');
285
+ if (!commands?.execute) {
286
+ throw new Error('dsh-matrix: 当前 profile 未挂载 DSH 命令服务(dsh-commands),无法透传命令');
287
+ }
288
+ const execution = await commands.execute(handle.agent, line, [], new AbortController().signal);
289
+ if (!execution)
290
+ return undefined;
291
+ if (!execution.result)
292
+ return '';
293
+ return execution.result.text ?? '';
294
+ }
295
+ async listPassthroughCommands(roomId) {
296
+ const handle = this.handles.get(roomId);
297
+ const commands = this.ctx.get?.('commands');
298
+ if (!handle || !commands?.list)
299
+ return [];
300
+ try {
301
+ return commands.list(handle.agent).map((d) => ({
302
+ name: d.name,
303
+ description: d.description,
304
+ ...(d.input?.hint ? { hint: d.input.hint } : {}),
305
+ }));
306
+ }
307
+ catch (error) {
308
+ this.opts.logger.warn('listPassthroughCommands failed:', error instanceof Error ? error.message : error);
309
+ return [];
310
+ }
311
+ }
312
+ async getSession(roomId, cwd) {
313
+ const sessionId = DshBackend.sessionIdFor(roomId);
314
+ this.sessionRoom.set(sessionId, roomId);
315
+ const cached = this.sessions.get(roomId);
316
+ if (cached)
317
+ return cached;
318
+ const existingHandle = this.handles.get(roomId);
319
+ if (existingHandle) {
320
+ const reused = this.makeSession(roomId, existingHandle.agent);
321
+ this.sessions.set(roomId, reused);
322
+ return reused;
323
+ }
324
+ let agentOptions = {};
325
+ if (this.opts.provider && this.opts.model) {
326
+ agentOptions = { provider: this.opts.provider, model: this.opts.model };
327
+ }
328
+ else {
329
+ const defaults = this.ctx.get?.('agentDefaultModel')?.currentSelection?.();
330
+ if (defaults?.provider && defaults?.model) {
331
+ agentOptions = { provider: defaults.provider, model: defaults.model };
332
+ }
333
+ }
334
+ try {
335
+ let created;
336
+ try {
337
+ created = await this.ctx.agents.create({
338
+ sessionId,
339
+ meta: { cwd },
340
+ agentOptions,
341
+ });
342
+ }
343
+ catch (error) {
344
+ // 持久层已有该 id(桥重启):恢复而不是重开
345
+ if (!/already exists/i.test(error instanceof Error ? error.message : String(error)))
346
+ throw error;
347
+ this.opts.logger.info(`dsh session ${sessionId} 已持久化,resume`);
348
+ created = await this.ctx.agents.resume({
349
+ resumeSessionId: sessionId,
350
+ ...(agentOptions.provider ? { agentOptions } : {}),
351
+ });
352
+ }
353
+ this.handles.set(roomId, created);
354
+ const session = this.makeSession(roomId, created.agent);
355
+ this.sessions.set(roomId, session);
356
+ this.opts.logger.info(`dsh session ready for room ${roomId} (${sessionId}, cwd=${cwd})`);
357
+ return session;
358
+ }
359
+ catch (error) {
360
+ // 写句柄独占(DSH GUI 开着同一会话)= 暂时状态,交给 pipeline 通知房间
361
+ // 并按间隔重试;这不是"打不开",别降级成静默失败的普通错误。
362
+ if (isSessionOwnedError(error))
363
+ throw new SessionBusyError(sessionId, { cause: error });
364
+ throw new Error(`dsh-matrix: cannot open session for room ${roomId}: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
365
+ }
366
+ }
367
+ peekSession(roomId) {
368
+ return this.sessions.get(roomId);
369
+ }
370
+ /**
371
+ * T11(/sessions):本进程已知的房间↔会话绑定,只读。
372
+ * 归属表是新增会话时写进去的(T5 也用它判定"这是不是桥的会话"),这里按
373
+ * roomId 排序输出,保证同一状态下列表稳定(便于人读与测试)。
374
+ */
375
+ async listSessions() {
376
+ return [...this.sessionRoom.entries()]
377
+ .map(([sessionId, roomId]) => ({ roomId, sessionId, running: this.sessions.get(roomId)?.isRunning() ?? false }))
378
+ .sort((a, b) => (a.roomId < b.roomId ? -1 : a.roomId > b.roomId ? 1 : 0));
379
+ }
380
+ /**
381
+ * T9: 放掉房间的会话句柄(dispose + 清 map),持久会话数据保留(US35)。
382
+ * 幂等:未开过的房间直接返回。
383
+ */
384
+ async dropRoomSession(roomId) {
385
+ this.sessions.delete(roomId);
386
+ this.sessionRoom.delete(DshBackend.sessionIdFor(roomId));
387
+ const handle = this.handles.get(roomId);
388
+ if (!handle)
389
+ return;
390
+ this.handles.delete(roomId);
391
+ try {
392
+ await handle.dispose();
393
+ }
394
+ catch (error) {
395
+ this.opts.logger.warn(`dropRoomSession(${roomId}) dispose 失败:`, error instanceof Error ? error.message : error);
396
+ }
397
+ }
398
+ // ── T4 slice 3: model surface(无 sessionController 的 base profile 直取 llm/agents)──
399
+ llmService() {
400
+ const svc = this.ctx.get?.('llm');
401
+ if (!svc)
402
+ throw new Error('dsh-matrix: 该 profile 未挂载 llm 服务,模型命令不可用');
403
+ return svc;
404
+ }
405
+ async listModels() {
406
+ const llm = this.llmService();
407
+ const out = [];
408
+ for (const p of llm.listProviders()) {
409
+ for (const m of await llm.listModels(p.id)) {
410
+ out.push({ provider: m.provider, model: m.id, ...(m.name ? { name: m.name } : {}) });
411
+ }
412
+ }
413
+ return out;
414
+ }
415
+ async currentModel(roomId) {
416
+ const entry = this.handles.get(roomId);
417
+ if (!entry)
418
+ return undefined; // 无 open 会话
419
+ const o = entry.agent.options ?? {};
420
+ return {
421
+ ...(o.provider ? { provider: o.provider } : {}),
422
+ ...(o.model ? { model: o.model } : {}),
423
+ ...(o.reasoningEffort ? { reasoningEffort: o.reasoningEffort } : {}),
424
+ };
425
+ }
426
+ async selectModel(roomId, provider, model, reasoningEffort) {
427
+ const entry = this.handles.get(roomId);
428
+ if (!entry)
429
+ throw new Error('dsh-matrix: 该房间还没有会话,先发一条消息再切换模型');
430
+ // 先校验路由:未知路由直接抛,不动现有会话
431
+ await this.llmService().resolveModelInfo(provider, model);
432
+ if (entry.agent.status === 'running')
433
+ throw new Error('dsh-matrix: 当前回合运行中,先 /stop 再切换模型');
434
+ const sessionId = DshBackend.sessionIdFor(roomId);
435
+ try {
436
+ await entry.dispose();
437
+ }
438
+ catch (error) {
439
+ this.opts.logger.warn(`selectModel dispose(${sessionId}) 失败:`, error instanceof Error ? error.message : error);
440
+ }
441
+ const created = await this.ctx.agents.resume({
442
+ resumeSessionId: sessionId,
443
+ agentOptions: { provider, model, ...(reasoningEffort ? { reasoningEffort } : {}) },
444
+ });
445
+ this.handles.set(roomId, created);
446
+ this.sessions.set(roomId, this.makeSession(roomId, created.agent));
447
+ this.opts.logger.info(`dsh session ${sessionId} 已切到 ${provider}/${model}${reasoningEffort ? ` (${reasoningEffort})` : ''}`);
448
+ return { provider, model, ...(reasoningEffort ? { reasoningEffort } : {}) };
449
+ }
450
+ async renameSession(roomId, title) {
451
+ const entry = this.handles.get(roomId);
452
+ if (!entry)
453
+ throw new Error('dsh-matrix: 该房间还没有会话,无法命名');
454
+ const st = this.ctx.get?.('sessionTitle');
455
+ if (!st)
456
+ throw new Error('dsh-matrix: 该 profile 未挂载 sessionTitle 服务');
457
+ st.rename(entry.agent.session, title);
458
+ }
459
+ async listThinkingEfforts(provider, model) {
460
+ const info = await this.llmService().resolveModelInfo(provider, model);
461
+ return (info?.reasoning?.efforts ?? []).map((e) => ({ id: e.id, name: e.name, ...(e.description ? { description: e.description } : {}) }));
462
+ }
463
+ /** 反查:该桥会话 id 属于哪个房间?非桥会话返回 undefined。(T5 归属判定) */
464
+ roomIdForSession(sessionId) {
465
+ return this.sessionRoom.get(sessionId);
466
+ }
467
+ async dispose() {
468
+ this.sessions.clear();
469
+ this.sessionRoom.clear();
470
+ for (const [roomId, handle] of this.handles) {
471
+ try {
472
+ await handle.dispose();
473
+ }
474
+ catch (error) {
475
+ this.opts.logger.warn(`dispose agent for ${roomId}:`, error instanceof Error ? error.message : error);
476
+ }
477
+ }
478
+ this.handles.clear();
479
+ }
480
+ }
481
+ //# sourceMappingURL=backend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend.js","sourceRoot":"","sources":["../../src/dsh/backend.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * dsh 侧 InteractionSource:在 Cordis 根上注册 user-questions/request 与
3
+ * approval/request 两个 waterfall 监听器(形状与 spike/dsh-spike-matrix 实测
4
+ * 一致)。归属判定用提问 agent 的 `session.id`:只有桥自己的会话才认领,其余
5
+ * 一律 next() 交还——与 Web 回答器共存,不抢别人的请求。
6
+ *
7
+ * 字段形状实证(dsh-user-approval / dsh-user-questions 的 lib/index.js):
8
+ * - 提问监听器收到 `{ questions, agent?, signal? }`(agent 为 runtime root),
9
+ * 应答对象 `{ answers: [{ id, selected, custom? }] }`;
10
+ * - 审批监听器收到 `{ agent, toolName, callId?, reason?, signal? }`,
11
+ * 应答 `'allowed-once' | 'rejected' | 'cancelled'`(服务侧还会归一非法值)。
12
+ *
13
+ * ctx.on 的 disposer 自动挂 fiber;本实现的 disposer 额外做真退订,便于测试
14
+ * 与 stop 语义。
15
+ */
16
+ import type { Logger } from '../types.ts';
17
+ import type { AbortSignalLike, InteractionSource } from '../ports/interactions.ts';
18
+ /** 本适配器消费的最小 cordis 事件面。 */
19
+ export interface InteractionEventsLike {
20
+ on(name: 'user-questions/request', listener: (request: QuestionRequestRaw, next: () => unknown) => unknown): () => boolean;
21
+ on(name: 'approval/request', listener: (request: ApprovalRequestRaw, next: () => unknown) => unknown): () => boolean;
22
+ }
23
+ interface QuestionRequestRaw {
24
+ questions?: unknown;
25
+ agent?: {
26
+ session?: {
27
+ id?: unknown;
28
+ };
29
+ };
30
+ signal?: AbortSignalLike;
31
+ }
32
+ interface ApprovalRequestRaw {
33
+ agent?: {
34
+ session?: {
35
+ id?: unknown;
36
+ };
37
+ };
38
+ toolName?: unknown;
39
+ reason?: unknown;
40
+ callId?: unknown;
41
+ signal?: AbortSignalLike;
42
+ }
43
+ export interface DshInteractionOptions {
44
+ /** 桥会话 id → 房间;undefined = 不是桥的会话(必须交还)。 */
45
+ roomForSession(sessionId: string): string | undefined;
46
+ logger: Logger;
47
+ }
48
+ export declare function createDshInteractionSource(ctx: InteractionEventsLike, opts: DshInteractionOptions): InteractionSource;
49
+ export {};
50
+ //# sourceMappingURL=interactions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactions.d.ts","sourceRoot":"","sources":["../../src/dsh/interactions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EAElB,MAAM,0BAA0B,CAAA;AAEjC,4BAA4B;AAC5B,MAAM,WAAW,qBAAqB;IACpC,EAAE,CAAC,IAAI,EAAE,wBAAwB,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,OAAO,KAAK,OAAO,GAAG,MAAM,OAAO,CAAA;IAC1H,EAAE,CAAC,IAAI,EAAE,kBAAkB,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,OAAO,KAAK,OAAO,GAAG,MAAM,OAAO,CAAA;CACrH;AAED,UAAU,kBAAkB;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,KAAK,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE;YAAE,EAAE,CAAC,EAAE,OAAO,CAAA;SAAE,CAAA;KAAE,CAAA;IACtC,MAAM,CAAC,EAAE,eAAe,CAAA;CACzB;AAED,UAAU,kBAAkB;IAC1B,KAAK,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE;YAAE,EAAE,CAAC,EAAE,OAAO,CAAA;SAAE,CAAA;KAAE,CAAA;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,MAAM,CAAC,EAAE,eAAe,CAAA;CACzB;AAED,MAAM,WAAW,qBAAqB;IACpC,4CAA4C;IAC5C,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;IACrD,MAAM,EAAE,MAAM,CAAA;CACf;AAmCD,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,qBAAqB,EAC1B,IAAI,EAAE,qBAAqB,GAC1B,iBAAiB,CAmFnB"}