aicodeman 1.22.0 → 1.23.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (205) hide show
  1. package/README.md +1 -1
  2. package/dist/config/dependency-registry.d.ts.map +1 -1
  3. package/dist/config/dependency-registry.js +27 -0
  4. package/dist/config/dependency-registry.js.map +1 -1
  5. package/dist/cron/cron-service.d.ts +3 -2
  6. package/dist/cron/cron-service.d.ts.map +1 -1
  7. package/dist/cron/cron-service.js +17 -3
  8. package/dist/cron/cron-service.js.map +1 -1
  9. package/dist/deepseek-status-shim.d.ts +77 -0
  10. package/dist/deepseek-status-shim.d.ts.map +1 -0
  11. package/dist/deepseek-status-shim.js +268 -0
  12. package/dist/deepseek-status-shim.js.map +1 -0
  13. package/dist/deepseek-transcript.d.ts +188 -0
  14. package/dist/deepseek-transcript.d.ts.map +1 -0
  15. package/dist/deepseek-transcript.js +633 -0
  16. package/dist/deepseek-transcript.js.map +1 -0
  17. package/dist/deepseek-web-server.d.ts +60 -0
  18. package/dist/deepseek-web-server.d.ts.map +1 -0
  19. package/dist/deepseek-web-server.js +249 -0
  20. package/dist/deepseek-web-server.js.map +1 -0
  21. package/dist/docker-hosts.d.ts.map +1 -1
  22. package/dist/docker-hosts.js +12 -0
  23. package/dist/docker-hosts.js.map +1 -1
  24. package/dist/mux-interface.d.ts +3 -1
  25. package/dist/mux-interface.d.ts.map +1 -1
  26. package/dist/remote-hosts.d.ts.map +1 -1
  27. package/dist/remote-hosts.js +4 -0
  28. package/dist/remote-hosts.js.map +1 -1
  29. package/dist/session.d.ts +27 -1
  30. package/dist/session.d.ts.map +1 -1
  31. package/dist/session.js +47 -2
  32. package/dist/session.js.map +1 -1
  33. package/dist/tmux-manager.d.ts +23 -1
  34. package/dist/tmux-manager.d.ts.map +1 -1
  35. package/dist/tmux-manager.js +134 -5
  36. package/dist/tmux-manager.js.map +1 -1
  37. package/dist/tui/tui-app.d.ts.map +1 -1
  38. package/dist/tui/tui-app.js +1 -0
  39. package/dist/tui/tui-app.js.map +1 -1
  40. package/dist/tui/tui-client.d.ts +1 -1
  41. package/dist/tui/tui-client.d.ts.map +1 -1
  42. package/dist/types/api.d.ts +1 -1
  43. package/dist/types/api.d.ts.map +1 -1
  44. package/dist/types/api.js.map +1 -1
  45. package/dist/types/session.d.ts +61 -4
  46. package/dist/types/session.d.ts.map +1 -1
  47. package/dist/types/session.js +2 -1
  48. package/dist/types/session.js.map +1 -1
  49. package/dist/types/webview.d.ts +15 -0
  50. package/dist/types/webview.d.ts.map +1 -1
  51. package/dist/utils/deepseek-cli-resolver.d.ts +144 -0
  52. package/dist/utils/deepseek-cli-resolver.d.ts.map +1 -0
  53. package/dist/utils/deepseek-cli-resolver.js +339 -0
  54. package/dist/utils/deepseek-cli-resolver.js.map +1 -0
  55. package/dist/utils/index.d.ts +2 -0
  56. package/dist/utils/index.d.ts.map +1 -1
  57. package/dist/utils/index.js +1 -0
  58. package/dist/utils/index.js.map +1 -1
  59. package/dist/web/public/admin-ui.js.gz +0 -0
  60. package/dist/web/public/api-client.c9b1cddc.js.gz +0 -0
  61. package/dist/web/public/app.c5cf1b8a.js +36 -0
  62. package/dist/web/public/app.c5cf1b8a.js.br +0 -0
  63. package/dist/web/public/app.c5cf1b8a.js.gz +0 -0
  64. package/dist/web/public/approvals-ui.js.gz +0 -0
  65. package/dist/web/public/{constants.189c7bff.js → constants.f4ea0a19.js} +8 -1
  66. package/dist/web/public/constants.f4ea0a19.js.br +0 -0
  67. package/dist/web/public/constants.f4ea0a19.js.gz +0 -0
  68. package/dist/web/public/cron-ui.js.gz +0 -0
  69. package/dist/web/public/entrance-animations.js.gz +0 -0
  70. package/dist/web/public/home-sessions.js +1 -0
  71. package/dist/web/public/home-sessions.js.br +0 -0
  72. package/dist/web/public/home-sessions.js.gz +0 -0
  73. package/dist/web/public/i18n.9ae15b51.js +1 -0
  74. package/dist/web/public/i18n.9ae15b51.js.br +0 -0
  75. package/dist/web/public/i18n.9ae15b51.js.gz +0 -0
  76. package/dist/web/public/image-input.ee16ad88.js.gz +0 -0
  77. package/dist/web/public/index.html +47 -14
  78. package/dist/web/public/index.html.br +0 -0
  79. package/dist/web/public/index.html.gz +0 -0
  80. package/dist/web/public/input-cjk.87f14251.js.gz +0 -0
  81. package/dist/web/public/keyboard-accessory.0454a3e9.js.gz +0 -0
  82. package/dist/web/public/mobile-handlers.0f83a608.js.gz +0 -0
  83. package/dist/web/public/mobile-overview.js +6 -0
  84. package/dist/web/public/mobile-overview.js.br +0 -0
  85. package/dist/web/public/mobile-overview.js.gz +0 -0
  86. package/dist/web/public/mobile.cab92e3f.css +1 -0
  87. package/dist/web/public/mobile.cab92e3f.css.br +0 -0
  88. package/dist/web/public/mobile.cab92e3f.css.gz +0 -0
  89. package/dist/web/public/notification-manager.5d229063.js.gz +0 -0
  90. package/dist/web/public/orchestrator-panel.js.gz +0 -0
  91. package/dist/web/public/{panels-ui.7c667123.js → panels-ui.344de87d.js} +41 -33
  92. package/dist/web/public/panels-ui.344de87d.js.br +0 -0
  93. package/dist/web/public/panels-ui.344de87d.js.gz +0 -0
  94. package/dist/web/public/ralph-panel.6de2d0f8.js.gz +0 -0
  95. package/dist/web/public/ralph-wizard.13a1831e.js.gz +0 -0
  96. package/dist/web/public/readmymind-ui.js.gz +0 -0
  97. package/dist/web/public/respawn-ui.ff0dae4c.js.gz +0 -0
  98. package/dist/web/public/sanitize-html.bc7078d6.js.gz +0 -0
  99. package/dist/web/public/session-lineage.js.gz +0 -0
  100. package/dist/web/public/session-ui.103656d3.js +68 -0
  101. package/dist/web/public/session-ui.103656d3.js.br +0 -0
  102. package/dist/web/public/session-ui.103656d3.js.gz +0 -0
  103. package/dist/web/public/settings-ui.3261b896.js +67 -0
  104. package/dist/web/public/settings-ui.3261b896.js.br +0 -0
  105. package/dist/web/public/settings-ui.3261b896.js.gz +0 -0
  106. package/dist/web/public/styles.1938fd02.css +1 -0
  107. package/dist/web/public/styles.1938fd02.css.br +0 -0
  108. package/dist/web/public/styles.1938fd02.css.gz +0 -0
  109. package/dist/web/public/subagent-windows.e6ca799f.js.gz +0 -0
  110. package/dist/web/public/sw.js.gz +0 -0
  111. package/dist/web/public/tab-rail-resize.42c24949.js +1 -0
  112. package/dist/web/public/tab-rail-resize.42c24949.js.br +0 -0
  113. package/dist/web/public/tab-rail-resize.42c24949.js.gz +0 -0
  114. package/dist/web/public/terminal-ui.5e0c230c.js +2 -0
  115. package/dist/web/public/terminal-ui.5e0c230c.js.br +0 -0
  116. package/dist/web/public/terminal-ui.5e0c230c.js.gz +0 -0
  117. package/dist/web/public/ultracode-panel.js.gz +0 -0
  118. package/dist/web/public/ultracode-windows.js.gz +0 -0
  119. package/dist/web/public/upload.html.gz +0 -0
  120. package/dist/web/public/vendor/dompurify.min.js.gz +0 -0
  121. package/dist/web/public/vendor/marked.min.js.gz +0 -0
  122. package/dist/web/public/vendor/xterm-addon-fit.min.js.gz +0 -0
  123. package/dist/web/public/vendor/xterm-addon-serialize.min.js.gz +0 -0
  124. package/dist/web/public/vendor/xterm-addon-unicode11.min.js.gz +0 -0
  125. package/dist/web/public/vendor/xterm-addon-webgl.min.js.gz +0 -0
  126. package/dist/web/public/vendor/xterm-predictive-echo.bd6882b8.js.gz +0 -0
  127. package/dist/web/public/vendor/xterm-zerolag-input.6fee72f2.js.gz +0 -0
  128. package/dist/web/public/vendor/xterm.css.gz +0 -0
  129. package/dist/web/public/vendor/xterm.min.js.gz +0 -0
  130. package/dist/web/public/voice-input.4ec670b0.js.gz +0 -0
  131. package/dist/web/public/voice-pcm-worklet.js.gz +0 -0
  132. package/dist/web/public/webview-tabs.js +4 -1
  133. package/dist/web/public/webview-tabs.js.br +0 -0
  134. package/dist/web/public/webview-tabs.js.gz +0 -0
  135. package/dist/web/response-viewer-transcript.js +1 -1
  136. package/dist/web/response-viewer-transcript.js.map +1 -1
  137. package/dist/web/routes/approval-routes.d.ts.map +1 -1
  138. package/dist/web/routes/approval-routes.js +12 -2
  139. package/dist/web/routes/approval-routes.js.map +1 -1
  140. package/dist/web/routes/hook-event-routes.d.ts.map +1 -1
  141. package/dist/web/routes/hook-event-routes.js +51 -7
  142. package/dist/web/routes/hook-event-routes.js.map +1 -1
  143. package/dist/web/routes/readmymind-routes.d.ts.map +1 -1
  144. package/dist/web/routes/readmymind-routes.js +5 -2
  145. package/dist/web/routes/readmymind-routes.js.map +1 -1
  146. package/dist/web/routes/session-routes.d.ts +30 -2
  147. package/dist/web/routes/session-routes.d.ts.map +1 -1
  148. package/dist/web/routes/session-routes.js +158 -16
  149. package/dist/web/routes/session-routes.js.map +1 -1
  150. package/dist/web/routes/system-routes.d.ts.map +1 -1
  151. package/dist/web/routes/system-routes.js +203 -2
  152. package/dist/web/routes/system-routes.js.map +1 -1
  153. package/dist/web/routes/webview-routes.d.ts.map +1 -1
  154. package/dist/web/routes/webview-routes.js +1 -0
  155. package/dist/web/routes/webview-routes.js.map +1 -1
  156. package/dist/web/schemas.d.ts +68 -0
  157. package/dist/web/schemas.d.ts.map +1 -1
  158. package/dist/web/schemas.js +107 -4
  159. package/dist/web/schemas.js.map +1 -1
  160. package/dist/web/server.d.ts.map +1 -1
  161. package/dist/web/server.js +21 -3
  162. package/dist/web/server.js.map +1 -1
  163. package/dist/web/session-wait-registry.d.ts +63 -7
  164. package/dist/web/session-wait-registry.d.ts.map +1 -1
  165. package/dist/web/session-wait-registry.js +67 -9
  166. package/dist/web/session-wait-registry.js.map +1 -1
  167. package/dist/web/sse-events.d.ts +11 -2
  168. package/dist/web/sse-events.d.ts.map +1 -1
  169. package/dist/web/sse-events.js +11 -2
  170. package/dist/web/sse-events.js.map +1 -1
  171. package/package.json +2 -1
  172. package/skills/codeman/SKILL.md +121 -34
  173. package/skills/codeman/preamble.sh +81 -26
  174. package/skills/codeman/reference/endpoints.md +18 -10
  175. package/skills/codeman/reference/messaging.md +2 -2
  176. package/skills/codeman/reference/recipes.md +53 -0
  177. package/skills/codeman/reference/verbs.md +39 -8
  178. package/dist/web/public/app.84bf8955.js +0 -36
  179. package/dist/web/public/app.84bf8955.js.br +0 -0
  180. package/dist/web/public/app.84bf8955.js.gz +0 -0
  181. package/dist/web/public/constants.189c7bff.js.br +0 -0
  182. package/dist/web/public/constants.189c7bff.js.gz +0 -0
  183. package/dist/web/public/i18n.34016b89.js +0 -1
  184. package/dist/web/public/i18n.34016b89.js.br +0 -0
  185. package/dist/web/public/i18n.34016b89.js.gz +0 -0
  186. package/dist/web/public/mobile.983f064e.css +0 -1
  187. package/dist/web/public/mobile.983f064e.css.br +0 -0
  188. package/dist/web/public/mobile.983f064e.css.gz +0 -0
  189. package/dist/web/public/panels-ui.7c667123.js.br +0 -0
  190. package/dist/web/public/panels-ui.7c667123.js.gz +0 -0
  191. package/dist/web/public/session-ui.acd79900.js +0 -68
  192. package/dist/web/public/session-ui.acd79900.js.br +0 -0
  193. package/dist/web/public/session-ui.acd79900.js.gz +0 -0
  194. package/dist/web/public/settings-ui.115a2d1e.js +0 -67
  195. package/dist/web/public/settings-ui.115a2d1e.js.br +0 -0
  196. package/dist/web/public/settings-ui.115a2d1e.js.gz +0 -0
  197. package/dist/web/public/styles.64369ebd.css +0 -1
  198. package/dist/web/public/styles.64369ebd.css.br +0 -0
  199. package/dist/web/public/styles.64369ebd.css.gz +0 -0
  200. package/dist/web/public/tab-rail-resize.f3465ce1.js +0 -1
  201. package/dist/web/public/tab-rail-resize.f3465ce1.js.br +0 -0
  202. package/dist/web/public/tab-rail-resize.f3465ce1.js.gz +0 -0
  203. package/dist/web/public/terminal-ui.ef68a666.js +0 -2
  204. package/dist/web/public/terminal-ui.ef68a666.js.br +0 -0
  205. package/dist/web/public/terminal-ui.ef68a666.js.gz +0 -0
@@ -0,0 +1,633 @@
1
+ /**
2
+ * @fileoverview Reading a DeepSeek Harness (`dsh`) session transcript off disk.
3
+ *
4
+ * ## Why this exists
5
+ *
6
+ * `GET /api/sessions/:id/last-response` is how an agent (and the Response
7
+ * Viewer) reads what a worker actually said. For Claude it comes from
8
+ * `~/.claude/projects/**`, for Codex from `~/.codex/sessions/**`, and for every
9
+ * other external CLI it comes from segmenting the terminal buffer, because
10
+ * those CLIs write nothing a reader could open.
11
+ *
12
+ * dsh is not in that last group: it writes a complete, structured JSONL
13
+ * transcript per session. Falling back to the pane for it was measurably wrong
14
+ * rather than merely coarse — dsh-TUI paints a full-screen splash, so the pane
15
+ * segmenter answered a `last-response` call for a fresh dsh session with the
16
+ * ASCII-art logo:
17
+ *
18
+ * {"text":"✦dsh-TUI v0.8.8█▀▀▀▄█▀▀▀▀█▀▀▀▀█▀▀▀▄█▀▀▀▀…","hasContext":true}
19
+ *
20
+ * which an agent polling for a worker's answer reads as an answer. This module
21
+ * is the real source: it locates the session's transcript, decodes it, and
22
+ * returns the last turn's text.
23
+ *
24
+ * ## The three things that make dsh transcripts unlike codex rollouts
25
+ *
26
+ * **1. One zstd FRAME per append, not one zstd stream.** The file is
27
+ * `session.jsonl.zstd`, and dsh appends by compressing each batch of lines into
28
+ * its own frame and writing it at the end. `zstd -dc` handles that (frames
29
+ * concatenate by definition), but Node's `zlib.zstdDecompress()` and
30
+ * `createZstdDecompress()` both stop at the first frame end: measured on a real
31
+ * 56-line transcript, Node returned 158 bytes / 1 line where the CLI returned
32
+ * 43,747 bytes / 56 lines. That is a silent truncation to the session header —
33
+ * every call would have reported "no answer yet" forever. `decodeZstdFrames()`
34
+ * below walks the frame headers itself and decompresses each frame, and
35
+ * `test/deepseek-transcript.test.ts` pins it against multi-frame fixtures.
36
+ *
37
+ * **2. The user's prompts are mixed with injected context.** Every turn also
38
+ * writes a `user/message` whose source is a plugin (the runtime-context
39
+ * snapshot: sandbox policy, approval policy, cwd). Those are `source.kind ===
40
+ * 'plugin'`; a real prompt is `source.kind === 'user'`. Rendering the plugin
41
+ * ones would show the agent its own boilerplate back as the user's words.
42
+ *
43
+ * **3. A failed turn is not an empty turn.** `turn/end` carries
44
+ * `reason.kind === 'error'` with the provider's message. Returning `""` there
45
+ * makes an agent poll `last-response` fifteen times and conclude the worker
46
+ * never answered, when the truth ("the provider rejected the request") was on
47
+ * disk the whole time. A turn that ends in an error and produced no text
48
+ * answers with that error, prefixed so it can never be mistaken for the model's
49
+ * own words.
50
+ *
51
+ * Verified against `dsh 0.1.1-rc.2` + `@deepseek-harness-tui/dsh-tui 0.8.8`.
52
+ */
53
+ import { promises as fs } from 'node:fs';
54
+ import { homedir } from 'node:os';
55
+ import { join } from 'node:path';
56
+ import * as zlib from 'node:zlib';
57
+ const zstdDecompressSync = zlib.zstdDecompressSync;
58
+ /** Whether this Node can decode the compressed transcripts dsh writes. */
59
+ export function zstdSupported() {
60
+ return typeof zstdDecompressSync === 'function';
61
+ }
62
+ /** zstd frame magic (RFC 8878 §3.1.1). */
63
+ const ZSTD_MAGIC = 0xfd2fb528;
64
+ /** Skippable-frame magic range: 0x184D2A50..0x184D2A5F. */
65
+ const ZSTD_SKIPPABLE_LO = 0x184d2a50;
66
+ const ZSTD_SKIPPABLE_HI = 0x184d2a5f;
67
+ const DID_FIELD_SIZE = [0, 1, 2, 4];
68
+ const FCS_FIELD_SIZE = [0, 2, 4, 8];
69
+ /**
70
+ * Byte ranges of the zstd frames in `buf`, in order.
71
+ *
72
+ * Walks frame headers and block headers only — no decompression — so the cost
73
+ * is proportional to the number of blocks, not to the content. Stops (rather
74
+ * than throws) at the first thing it cannot parse, so a transcript still being
75
+ * appended to mid-write yields every whole frame before the torn tail instead
76
+ * of failing the whole read.
77
+ *
78
+ * ⚠️ Splitting on the magic bytes instead would be wrong: the 4-byte sequence
79
+ * can occur inside compressed data, and a false split corrupts everything after
80
+ * it. The block walk is what makes the boundaries exact.
81
+ */
82
+ export function zstdFrameRanges(buf) {
83
+ const ranges = [];
84
+ let offset = 0;
85
+ while (offset + 4 <= buf.length) {
86
+ const magic = buf.readUInt32LE(offset);
87
+ if (magic >= ZSTD_SKIPPABLE_LO && magic <= ZSTD_SKIPPABLE_HI) {
88
+ if (offset + 8 > buf.length)
89
+ break;
90
+ const end = offset + 8 + buf.readUInt32LE(offset + 4);
91
+ if (end > buf.length || end <= offset)
92
+ break;
93
+ offset = end;
94
+ continue;
95
+ }
96
+ if (magic !== ZSTD_MAGIC)
97
+ break;
98
+ let p = offset + 4;
99
+ if (p >= buf.length)
100
+ break;
101
+ const descriptor = buf[p];
102
+ p += 1;
103
+ const fcsFlag = descriptor >> 6;
104
+ const singleSegment = (descriptor >> 5) & 1;
105
+ const hasChecksum = (descriptor >> 2) & 1;
106
+ const dictIdFlag = descriptor & 3;
107
+ if (!singleSegment)
108
+ p += 1; // window descriptor
109
+ p += DID_FIELD_SIZE[dictIdFlag];
110
+ // FCS is absent for flag 0 UNLESS Single_Segment is set, where it is 1 byte.
111
+ p += fcsFlag === 0 ? (singleSegment ? 1 : 0) : FCS_FIELD_SIZE[fcsFlag];
112
+ if (p > buf.length)
113
+ break;
114
+ let lastBlock = false;
115
+ let torn = false;
116
+ while (!lastBlock) {
117
+ if (p + 3 > buf.length) {
118
+ torn = true;
119
+ break;
120
+ }
121
+ const header = buf[p] | (buf[p + 1] << 8) | (buf[p + 2] << 16);
122
+ p += 3;
123
+ lastBlock = (header & 1) === 1;
124
+ const blockType = (header >> 1) & 3;
125
+ const blockSize = header >> 3;
126
+ if (blockType === 3) {
127
+ torn = true; // reserved: refuse rather than guess
128
+ break;
129
+ }
130
+ p += blockType === 1 ? 1 : blockSize; // RLE stores a single byte
131
+ if (p > buf.length) {
132
+ torn = true;
133
+ break;
134
+ }
135
+ }
136
+ if (torn)
137
+ break;
138
+ if (hasChecksum)
139
+ p += 4;
140
+ if (p > buf.length)
141
+ break;
142
+ ranges.push([offset, p]);
143
+ offset = p;
144
+ }
145
+ return ranges;
146
+ }
147
+ /**
148
+ * Decode a possibly multi-frame zstd buffer. A buffer that does not start with
149
+ * a zstd magic is passed through unchanged, which is what lets the same reader
150
+ * open a plain `session.jsonl` (dsh writes one when compression is off).
151
+ *
152
+ * A frame that fails to decompress truncates the decode THERE rather than
153
+ * failing it: everything decoded before it is kept, so a half-written tail
154
+ * frame does not cost the caller the whole conversation. (Not "skipped" — a
155
+ * frame after a corrupt one is never reached, which is the safe reading: dsh
156
+ * appends, so a bad frame means everything after it is suspect too.)
157
+ */
158
+ export function decodeZstdFrames(buf) {
159
+ if (buf.length < 4)
160
+ return buf.toString('utf8');
161
+ const magic = buf.readUInt32LE(0);
162
+ if (magic !== ZSTD_MAGIC && (magic < ZSTD_SKIPPABLE_LO || magic > ZSTD_SKIPPABLE_HI)) {
163
+ return buf.toString('utf8');
164
+ }
165
+ if (!zstdDecompressSync)
166
+ return '';
167
+ const parts = [];
168
+ for (const [start, end] of zstdFrameRanges(buf)) {
169
+ try {
170
+ parts.push(zstdDecompressSync(buf.subarray(start, end)));
171
+ }
172
+ catch {
173
+ // Torn or corrupt frame: keep what decoded before it.
174
+ break;
175
+ }
176
+ }
177
+ return Buffer.concat(parts).toString('utf8');
178
+ }
179
+ function asRecord(value) {
180
+ return value && typeof value === 'object' && !Array.isArray(value) ? value : undefined;
181
+ }
182
+ function asArray(value) {
183
+ return Array.isArray(value) ? value : [];
184
+ }
185
+ /**
186
+ * Strip a leaked reasoning prefix.
187
+ *
188
+ * Some providers stream reasoning into the same text block and close it with
189
+ * `</think>` without ever opening it (measured on a local deepseek-v4-flash
190
+ * route: `"I'll read the file first.</think>\n\nThe add function is…"`). The
191
+ * closing tag is the only reliable boundary, so everything up to the LAST one
192
+ * goes. A block with no tag is returned untouched.
193
+ */
194
+ function stripReasoningPrefix(text) {
195
+ const close = text.lastIndexOf('</think>');
196
+ return close === -1 ? text : text.slice(close + '</think>'.length);
197
+ }
198
+ /** `stripReasoning` is for ASSISTANT content only: a user prompt containing a
199
+ * literal `</think>` (someone pasting a transcript, say) must render whole. */
200
+ function textOfContent(content, stripReasoning = true) {
201
+ const parts = [];
202
+ for (const entry of asArray(content)) {
203
+ const block = asRecord(entry);
204
+ if (!block)
205
+ continue;
206
+ if (block.type === 'text' && typeof block.text === 'string') {
207
+ parts.push(stripReasoning ? stripReasoningPrefix(block.text) : block.text);
208
+ }
209
+ }
210
+ return parts.join('').trim();
211
+ }
212
+ function toolCallsOfContent(content) {
213
+ const calls = [];
214
+ for (const entry of asArray(content)) {
215
+ const block = asRecord(entry);
216
+ if (!block || block.type !== 'tool-call')
217
+ continue;
218
+ const name = typeof block.name === 'string' ? block.name : 'tool';
219
+ const args = typeof block.arguments === 'string' ? block.arguments : JSON.stringify(block.arguments ?? {});
220
+ calls.push(`${name}(${args})`);
221
+ }
222
+ return calls;
223
+ }
224
+ /** Flatten a `tool/result` message down to its text payload. */
225
+ function textOfToolResult(message) {
226
+ const parts = [];
227
+ for (const entry of asArray(asRecord(message)?.content)) {
228
+ const block = asRecord(entry);
229
+ if (!block)
230
+ continue;
231
+ if (block.type === 'text' && typeof block.text === 'string')
232
+ parts.push(block.text);
233
+ if (block.type === 'tool-result') {
234
+ for (const inner of asArray(block.content)) {
235
+ const innerBlock = asRecord(inner);
236
+ if (innerBlock?.type === 'text' && typeof innerBlock.text === 'string')
237
+ parts.push(innerBlock.text);
238
+ }
239
+ }
240
+ }
241
+ return parts.join('\n').trim();
242
+ }
243
+ function isoTime(time) {
244
+ return typeof time === 'number' && Number.isFinite(time) ? new Date(time).toISOString() : '';
245
+ }
246
+ function ensureStep(turn, step) {
247
+ if (!turn.steps.includes(step))
248
+ turn.steps.push(step);
249
+ }
250
+ function turnText(turn) {
251
+ const parts = [];
252
+ for (const step of turn.steps) {
253
+ // Deltas are only consulted for a step the model never finalized — a step
254
+ // that has both would otherwise render its text twice.
255
+ const text = turn.finalizedSteps.has(step)
256
+ ? (turn.finalized.get(step) ?? '')
257
+ : stripReasoningPrefix(turn.streamed.get(step) ?? '');
258
+ if (text.trim())
259
+ parts.push(text.trim());
260
+ }
261
+ return parts.join('\n\n').trim();
262
+ }
263
+ /**
264
+ * Parse a decoded dsh transcript.
265
+ *
266
+ * `text` is the LAST TURN's answer, not the last assistant message anywhere in
267
+ * the file: a turn that errored after an earlier turn answered must not hand
268
+ * back the earlier turn's text as though it were this turn's reply.
269
+ */
270
+ export function parseDeepSeekTranscript(raw, options = {}) {
271
+ const wantBlocks = options.blocks === true;
272
+ const blocks = [];
273
+ const turns = new Map();
274
+ const turnOrder = [];
275
+ let sessionId;
276
+ let cwd;
277
+ const getTurn = (n) => {
278
+ let turn = turns.get(n);
279
+ if (!turn) {
280
+ turn = { finalized: new Map(), finalizedSteps: new Set(), streamed: new Map(), steps: [], timestamp: '' };
281
+ turns.set(n, turn);
282
+ turnOrder.push(n);
283
+ }
284
+ return turn;
285
+ };
286
+ for (const line of raw.split('\n')) {
287
+ if (!line.trim())
288
+ continue;
289
+ let event;
290
+ try {
291
+ event = JSON.parse(line);
292
+ }
293
+ catch {
294
+ continue; // a torn tail line, or a frame we could not decode
295
+ }
296
+ const data = asRecord(event.data) ?? {};
297
+ const turnNo = typeof data.turn === 'number' ? data.turn : 0;
298
+ const stepNo = typeof data.step === 'number' ? data.step : 0;
299
+ switch (event.type) {
300
+ case 'session': {
301
+ const header = event;
302
+ if (typeof header.id === 'string')
303
+ sessionId = header.id;
304
+ if (typeof header.cwd === 'string')
305
+ cwd = header.cwd;
306
+ break;
307
+ }
308
+ case 'user/message': {
309
+ // ⚠️ Only a real prompt. The plugin-sourced twin is the runtime-context
310
+ // snapshot dsh injects every turn (sandbox policy, approvals, cwd).
311
+ if (asRecord(data.source)?.kind !== 'user')
312
+ break;
313
+ if (!wantBlocks)
314
+ break;
315
+ const text = textOfContent(data.content, false);
316
+ if (text)
317
+ blocks.push({ kind: 'prompt', label: 'Prompt', role: 'user', text });
318
+ break;
319
+ }
320
+ case 'assistant/message': {
321
+ const message = asRecord(data.message);
322
+ const turn = getTurn(turnNo);
323
+ ensureStep(turn, stepNo);
324
+ const text = textOfContent(message?.content);
325
+ if (message)
326
+ turn.finalizedSteps.add(stepNo);
327
+ if (text) {
328
+ turn.finalized.set(stepNo, text);
329
+ turn.timestamp = isoTime(event.time) || turn.timestamp;
330
+ if (wantBlocks)
331
+ blocks.push({ kind: 'response', label: 'Response', role: 'assistant', text });
332
+ }
333
+ if (wantBlocks) {
334
+ for (const call of toolCallsOfContent(message?.content)) {
335
+ blocks.push({ kind: 'tool', label: 'Tool', role: 'assistant', text: call });
336
+ }
337
+ }
338
+ break;
339
+ }
340
+ case 'assistant/chunk': {
341
+ const chunk = asRecord(data.chunk);
342
+ if (chunk?.type !== 'text-delta' || typeof chunk.text !== 'string')
343
+ break;
344
+ const turn = getTurn(turnNo);
345
+ ensureStep(turn, stepNo);
346
+ turn.streamed.set(stepNo, (turn.streamed.get(stepNo) ?? '') + chunk.text);
347
+ break;
348
+ }
349
+ case 'text-chunks': {
350
+ // The batched form of the same deltas (dsh coalesces once a stream gets
351
+ // going). ⚠️ These carry `seq: null`, so file order is the only order.
352
+ const turn = getTurn(turnNo);
353
+ ensureStep(turn, stepNo);
354
+ const texts = asArray(data.texts)
355
+ .filter((t) => typeof t === 'string')
356
+ .join('');
357
+ if (texts)
358
+ turn.streamed.set(stepNo, (turn.streamed.get(stepNo) ?? '') + texts);
359
+ break;
360
+ }
361
+ case 'tool/result': {
362
+ if (!wantBlocks)
363
+ break;
364
+ const text = textOfToolResult(data.message);
365
+ if (text)
366
+ blocks.push({ kind: 'tool', label: 'Tool', role: 'assistant', text });
367
+ break;
368
+ }
369
+ case 'turn/end': {
370
+ const turn = getTurn(turnNo);
371
+ const reason = asRecord(data.reason);
372
+ if (reason && reason.kind !== 'completed') {
373
+ // Two different things wear this field: a provider failure
374
+ // (`kind:'error'` with a message) and an ordinary early stop
375
+ // (`kind:'max-tokens'`, measured live). Calling the second one an
376
+ // error would misreport a truncated but real answer.
377
+ const error = asRecord(reason.error);
378
+ const message = typeof error?.message === 'string' ? error.message : undefined;
379
+ const kind = typeof reason.kind === 'string' ? reason.kind : 'unknown';
380
+ turn.ending = message ? `Turn error: ${message}` : `Turn ended: ${kind}`;
381
+ if (wantBlocks) {
382
+ blocks.push({ kind: 'status', label: 'Status', role: 'assistant', text: turn.ending });
383
+ }
384
+ }
385
+ turn.timestamp = isoTime(event.time) || turn.timestamp;
386
+ break;
387
+ }
388
+ default:
389
+ break;
390
+ }
391
+ }
392
+ const lastTurn = turnOrder.length > 0 ? turns.get(turnOrder[turnOrder.length - 1]) : undefined;
393
+ let text = lastTurn ? turnText(lastTurn) : '';
394
+ // A turn that failed and said nothing answers with its failure, labelled so
395
+ // it can never read as the model's own words. Without this an agent polls
396
+ // `last-response` fifteen times and concludes the worker never answered.
397
+ if (!text && lastTurn?.ending)
398
+ text = lastTurn.ending;
399
+ return { text, timestamp: lastTurn?.timestamp ?? '', blocks, sessionId, cwd };
400
+ }
401
+ /**
402
+ * `$DSH_HOME` for one session: a per-session override wins (`DSH_HOME` is an
403
+ * allowlisted `envOverrides` prefix, and pointing a worker at its own profile
404
+ * tree is a documented thing to do), then the server's own environment, then
405
+ * `~/.dsh`. Reading the wrong tree does not fail loudly — it silently finds no
406
+ * transcript — so this must resolve exactly the way the spawn did.
407
+ */
408
+ /* ⚠️ The override is EPHEMERAL: `envOverrides` is applied at spawn and exported
409
+ * through `tmux setenv`, but is deliberately not persisted to state.json (it can
410
+ * carry provider keys). A session that overrode `DSH_HOME` and then outlived a
411
+ * server restart therefore resolves to the default tree and finds no transcript
412
+ * — it reads as "nothing said yet" rather than as another session's answer,
413
+ * because every candidate is matched on its recorded `cwd`. */
414
+ export function resolveDeepSeekHome(session) {
415
+ const override = session.deepSeekHomeOverride;
416
+ if (override && override.trim())
417
+ return override.trim();
418
+ const fromEnv = process.env.DSH_HOME;
419
+ if (fromEnv && fromEnv.trim())
420
+ return fromEnv.trim();
421
+ return join(homedir(), '.dsh');
422
+ }
423
+ /**
424
+ * How far apart a session's start and its transcript's `createdAt` may be and
425
+ * still be the same session. dsh writes the header within ~2 s of pane start
426
+ * (measured); 60 s absorbs a cold profile boot without ever reaching a sibling
427
+ * started minutes later.
428
+ */
429
+ const PAIRING_WINDOW_MS = 60_000;
430
+ /** Transcript file names dsh has used, newest convention first. */
431
+ const TRANSCRIPT_FILES = ['session.jsonl.zstd', 'session.jsonl'];
432
+ /**
433
+ * Locate the transcript for a session.
434
+ *
435
+ * dsh buckets sessions by a mangled cwd (`--home-you-code-app--`) and then by
436
+ * its own session id, and the id form has changed between versions (`<uuid>`
437
+ * and `session-<uuid>` both exist on disk here). ⚠️ So the mangling is NOT
438
+ * reproduced: every candidate's own header line carries `cwd`, which is
439
+ * authoritative, and matching on it is immune to the next naming change.
440
+ *
441
+ * Pairing a Codeman session with ITS transcript then has one hard rule and one
442
+ * ladder. The rule: a transcript created BEFORE this session started belongs to
443
+ * an earlier conversation in the same directory and is never eligible. Measured
444
+ * cost of getting that wrong — a freshly spawned worker answered its very first
445
+ * `last-response` with the PREVIOUS session's reply, which is worse than saying
446
+ * nothing, because an agent cannot tell a stale answer from a fresh one.
447
+ *
448
+ * The ladder, once the older ones are out:
449
+ *
450
+ * 1. a transcript whose header `createdAt` sits within `PAIRING_WINDOW_MS` of
451
+ * this session's start — that is this pane's own boot, and it stays right
452
+ * even when a sibling session is running in the same case directory;
453
+ * 2. otherwise the newest transcript created after this session started;
454
+ * 3. otherwise nothing.
455
+ *
456
+ * ⚠️ The boot transcript wins for as long as it exists on disk — deliberately,
457
+ * and even over a LATER transcript in the same workspace. Step 2 cannot tell a
458
+ * `/new` from a sibling session that started later in the same directory, so
459
+ * preferring newest-eligible would hand a worker its busier sibling's reply
460
+ * (the exact bug the hard rule above was measured against, one seat over).
461
+ * The cost of that choice: after an interactive `/new` in a dsh tab, this
462
+ * reader keeps serving the pre-`/new` conversation (the same session's own
463
+ * earlier turns — stale, never foreign); step 2 is reached only when no
464
+ * boot-window transcript exists. Worker fleets never `/new`, so they only
465
+ * ever see step 1.
466
+ */
467
+ export async function findDeepSeekTranscript(options) {
468
+ const sessionsDir = join(options.dshHome, 'sessions');
469
+ let buckets;
470
+ try {
471
+ buckets = (await fs.readdir(sessionsDir, { withFileTypes: true }))
472
+ .filter((entry) => entry.isDirectory())
473
+ .map((entry) => entry.name);
474
+ }
475
+ catch {
476
+ return null;
477
+ }
478
+ const candidates = [];
479
+ for (const bucket of buckets) {
480
+ const bucketPath = join(sessionsDir, bucket);
481
+ let sessions;
482
+ try {
483
+ sessions = (await fs.readdir(bucketPath, { withFileTypes: true }))
484
+ .filter((entry) => entry.isDirectory())
485
+ .map((entry) => entry.name);
486
+ }
487
+ catch {
488
+ continue;
489
+ }
490
+ for (const sessionDir of sessions) {
491
+ for (const file of TRANSCRIPT_FILES) {
492
+ const path = join(bucketPath, sessionDir, file);
493
+ const stat = await fs.stat(path).catch(() => null);
494
+ if (!stat || !stat.isFile() || stat.size === 0)
495
+ continue;
496
+ candidates.push({ path, mtimeMs: stat.mtimeMs });
497
+ break;
498
+ }
499
+ }
500
+ }
501
+ if (candidates.length === 0)
502
+ return null;
503
+ candidates.sort((a, b) => b.mtimeMs - a.mtimeMs);
504
+ const startedAt = options.startedAt ?? 0;
505
+ // Slack in both directions: the harness writes its header a beat after the
506
+ // pane starts, and mtimes on a shared clock are not worth trusting to the ms.
507
+ const floor = startedAt > 0 ? startedAt - PAIRING_WINDOW_MS : 0;
508
+ let laterMatch = null;
509
+ for (const candidate of candidates) {
510
+ const header = await readTranscriptHeader(candidate.path);
511
+ if (!header || header.cwd !== options.workingDir)
512
+ continue;
513
+ // No usable header timestamp: fall back to the file's own mtime, which is
514
+ // still enough to keep a pre-session transcript out.
515
+ const createdAt = header.createdAt ?? candidate.mtimeMs;
516
+ if (createdAt < floor)
517
+ continue;
518
+ if (startedAt > 0 && Math.abs(createdAt - startedAt) <= PAIRING_WINDOW_MS)
519
+ return candidate.path;
520
+ if (!laterMatch)
521
+ laterMatch = candidate.path;
522
+ }
523
+ return laterMatch;
524
+ }
525
+ /**
526
+ * Read only the first frame of a transcript, which is where the header line
527
+ * lives. Bounded: a candidate scan must never decompress every conversation on
528
+ * the box to answer one `last-response` call.
529
+ */
530
+ async function readTranscriptHeader(path) {
531
+ let handle;
532
+ try {
533
+ handle = await fs.open(path, 'r');
534
+ }
535
+ catch {
536
+ return null;
537
+ }
538
+ try {
539
+ const head = Buffer.alloc(65536);
540
+ const { bytesRead } = await handle.read(head, 0, head.length, 0);
541
+ if (bytesRead === 0)
542
+ return null;
543
+ const text = decodeZstdFrames(head.subarray(0, bytesRead));
544
+ const firstLine = text.split('\n').find((line) => line.trim());
545
+ if (!firstLine)
546
+ return null;
547
+ const parsed = JSON.parse(firstLine);
548
+ if (parsed.type !== 'session')
549
+ return null;
550
+ return {
551
+ cwd: parsed.cwd,
552
+ id: parsed.id,
553
+ createdAt: typeof parsed.createdAt === 'number' ? parsed.createdAt : undefined,
554
+ };
555
+ }
556
+ catch {
557
+ return null;
558
+ }
559
+ finally {
560
+ await handle.close().catch(() => { });
561
+ }
562
+ }
563
+ /** Hard ceiling on a transcript read. A long agent run is a few hundred KB; a
564
+ * file past this is pathological and is not worth a synchronous decode. */
565
+ const MAX_TRANSCRIPT_BYTES = 64 * 1024 * 1024;
566
+ /**
567
+ * Memo of the last few decoded transcripts, keyed on (path, mtime, size,
568
+ * blocks). The skill's `last_text` polls once per second, and each poll used
569
+ * to zstdDecompressSync + reparse the WHOLE file on the event loop even when
570
+ * nothing had been appended — a multi-MB transcript made that a repeated
571
+ * ~100ms-class stall on the single-threaded server. A poll that finds the
572
+ * file unchanged now costs one stat. Insertion-order eviction; tiny, because
573
+ * an entry only earns its keep while a session is being actively polled.
574
+ */
575
+ const parseMemo = new Map();
576
+ const PARSE_MEMO_MAX = 16;
577
+ /** Test seam: a fixture that rewrites one path in place inside a single mtime
578
+ * tick would otherwise read its predecessor back out of the memo. */
579
+ export function resetDeepSeekTranscriptMemoForTest() {
580
+ parseMemo.clear();
581
+ }
582
+ /**
583
+ * Read one dsh session's last answer.
584
+ *
585
+ * ⚠️ The two empty outcomes are deliberately different, because the caller must
586
+ * treat them differently:
587
+ *
588
+ * - `null` means **this reader cannot run here** (a Node without zstd), and is
589
+ * the signal to fall back to the pane segmenter.
590
+ * - an empty `text` means **read fine, nothing said yet** — no transcript for
591
+ * this workspace, or a turn still in flight.
592
+ *
593
+ * Collapsing the two would put the ASCII-art splash back in front of an agent
594
+ * that is polling for a worker's first answer.
595
+ */
596
+ export async function readDeepSeekLastResponse(session, options = {}) {
597
+ const createdAt = session.createdAt instanceof Date ? session.createdAt.getTime() : session.createdAt;
598
+ // dsh compresses by default, so a Node without zstd can read nothing here.
599
+ // That is the one case the pane is still the better answer.
600
+ if (!zstdSupported())
601
+ return null;
602
+ const empty = { text: '', timestamp: '', blocks: [] };
603
+ const path = await findDeepSeekTranscript({
604
+ dshHome: resolveDeepSeekHome(session),
605
+ workingDir: session.workingDir,
606
+ startedAt: typeof createdAt === 'number' ? createdAt : undefined,
607
+ });
608
+ if (!path)
609
+ return empty;
610
+ const stat = await fs.stat(path).catch(() => null);
611
+ if (!stat || stat.size > MAX_TRANSCRIPT_BYTES)
612
+ return empty;
613
+ const memoKey = `${path}|${stat.mtimeMs}|${stat.size}|${options.blocks ? 1 : 0}`;
614
+ const memoized = parseMemo.get(memoKey);
615
+ if (memoized)
616
+ return memoized;
617
+ let buf;
618
+ try {
619
+ buf = await fs.readFile(path);
620
+ }
621
+ catch {
622
+ return empty;
623
+ }
624
+ const result = parseDeepSeekTranscript(decodeZstdFrames(buf), options);
625
+ if (parseMemo.size >= PARSE_MEMO_MAX) {
626
+ const oldest = parseMemo.keys().next().value;
627
+ if (oldest !== undefined)
628
+ parseMemo.delete(oldest);
629
+ }
630
+ parseMemo.set(memoKey, result);
631
+ return result;
632
+ }
633
+ //# sourceMappingURL=deepseek-transcript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deepseek-transcript.js","sourceRoot":"","sources":["../src/deepseek-transcript.ts"],"names":[],"mappings":"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"}