@codedeck/codedeck 2026.3.1-4.63

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 (239) hide show
  1. package/README.md +38 -0
  2. package/config/default.yaml +51 -0
  3. package/dist/agent/brain-dispatcher.d.ts +67 -0
  4. package/dist/agent/brain-dispatcher.d.ts.map +1 -0
  5. package/dist/agent/brain-dispatcher.js +136 -0
  6. package/dist/agent/brain-dispatcher.js.map +1 -0
  7. package/dist/agent/detect.d.ts +20 -0
  8. package/dist/agent/detect.d.ts.map +1 -0
  9. package/dist/agent/detect.js +187 -0
  10. package/dist/agent/detect.js.map +1 -0
  11. package/dist/agent/drivers/base.d.ts +57 -0
  12. package/dist/agent/drivers/base.d.ts.map +1 -0
  13. package/dist/agent/drivers/base.js +3 -0
  14. package/dist/agent/drivers/base.js.map +1 -0
  15. package/dist/agent/drivers/claude-code.d.ts +14 -0
  16. package/dist/agent/drivers/claude-code.d.ts.map +1 -0
  17. package/dist/agent/drivers/claude-code.js +112 -0
  18. package/dist/agent/drivers/claude-code.js.map +1 -0
  19. package/dist/agent/drivers/codex.d.ts +14 -0
  20. package/dist/agent/drivers/codex.d.ts.map +1 -0
  21. package/dist/agent/drivers/codex.js +77 -0
  22. package/dist/agent/drivers/codex.js.map +1 -0
  23. package/dist/agent/drivers/gemini.d.ts +24 -0
  24. package/dist/agent/drivers/gemini.d.ts.map +1 -0
  25. package/dist/agent/drivers/gemini.js +142 -0
  26. package/dist/agent/drivers/gemini.js.map +1 -0
  27. package/dist/agent/drivers/opencode.d.ts +18 -0
  28. package/dist/agent/drivers/opencode.d.ts.map +1 -0
  29. package/dist/agent/drivers/opencode.js +50 -0
  30. package/dist/agent/drivers/opencode.js.map +1 -0
  31. package/dist/agent/drivers/shell.d.ts +13 -0
  32. package/dist/agent/drivers/shell.d.ts.map +1 -0
  33. package/dist/agent/drivers/shell.js +30 -0
  34. package/dist/agent/drivers/shell.js.map +1 -0
  35. package/dist/agent/env-isolation.d.ts +26 -0
  36. package/dist/agent/env-isolation.d.ts.map +1 -0
  37. package/dist/agent/env-isolation.js +103 -0
  38. package/dist/agent/env-isolation.js.map +1 -0
  39. package/dist/agent/notify-setup.d.ts +18 -0
  40. package/dist/agent/notify-setup.d.ts.map +1 -0
  41. package/dist/agent/notify-setup.js +68 -0
  42. package/dist/agent/notify-setup.js.map +1 -0
  43. package/dist/agent/session-manager.d.ts +75 -0
  44. package/dist/agent/session-manager.d.ts.map +1 -0
  45. package/dist/agent/session-manager.js +407 -0
  46. package/dist/agent/session-manager.js.map +1 -0
  47. package/dist/agent/signal.d.ts +32 -0
  48. package/dist/agent/signal.d.ts.map +1 -0
  49. package/dist/agent/signal.js +199 -0
  50. package/dist/agent/signal.js.map +1 -0
  51. package/dist/agent/status-poller.d.ts +27 -0
  52. package/dist/agent/status-poller.d.ts.map +1 -0
  53. package/dist/agent/status-poller.js +76 -0
  54. package/dist/agent/status-poller.js.map +1 -0
  55. package/dist/agent/templates/brain-prompt.d.ts +14 -0
  56. package/dist/agent/templates/brain-prompt.d.ts.map +1 -0
  57. package/dist/agent/templates/brain-prompt.js +57 -0
  58. package/dist/agent/templates/brain-prompt.js.map +1 -0
  59. package/dist/agent/templates/identity.d.ts +19 -0
  60. package/dist/agent/templates/identity.d.ts.map +1 -0
  61. package/dist/agent/templates/identity.js +97 -0
  62. package/dist/agent/templates/identity.js.map +1 -0
  63. package/dist/agent/tmux.d.ts +90 -0
  64. package/dist/agent/tmux.d.ts.map +1 -0
  65. package/dist/agent/tmux.js +386 -0
  66. package/dist/agent/tmux.js.map +1 -0
  67. package/dist/autofix/audit-engine.d.ts +35 -0
  68. package/dist/autofix/audit-engine.d.ts.map +1 -0
  69. package/dist/autofix/audit-engine.js +144 -0
  70. package/dist/autofix/audit-engine.js.map +1 -0
  71. package/dist/autofix/branch-manager.d.ts +44 -0
  72. package/dist/autofix/branch-manager.d.ts.map +1 -0
  73. package/dist/autofix/branch-manager.js +97 -0
  74. package/dist/autofix/branch-manager.js.map +1 -0
  75. package/dist/autofix/decision-engine.d.ts +38 -0
  76. package/dist/autofix/decision-engine.d.ts.map +1 -0
  77. package/dist/autofix/decision-engine.js +115 -0
  78. package/dist/autofix/decision-engine.js.map +1 -0
  79. package/dist/autofix/index.d.ts +23 -0
  80. package/dist/autofix/index.d.ts.map +1 -0
  81. package/dist/autofix/index.js +192 -0
  82. package/dist/autofix/index.js.map +1 -0
  83. package/dist/autofix/prompt-builder.d.ts +25 -0
  84. package/dist/autofix/prompt-builder.d.ts.map +1 -0
  85. package/dist/autofix/prompt-builder.js +137 -0
  86. package/dist/autofix/prompt-builder.js.map +1 -0
  87. package/dist/autofix/report-parser.d.ts +18 -0
  88. package/dist/autofix/report-parser.d.ts.map +1 -0
  89. package/dist/autofix/report-parser.js +74 -0
  90. package/dist/autofix/report-parser.js.map +1 -0
  91. package/dist/autofix/state-machine.d.ts +40 -0
  92. package/dist/autofix/state-machine.d.ts.map +1 -0
  93. package/dist/autofix/state-machine.js +76 -0
  94. package/dist/autofix/state-machine.js.map +1 -0
  95. package/dist/bind/bind-flow.d.ts +15 -0
  96. package/dist/bind/bind-flow.d.ts.map +1 -0
  97. package/dist/bind/bind-flow.js +198 -0
  98. package/dist/bind/bind-flow.js.map +1 -0
  99. package/dist/config.d.ts +53 -0
  100. package/dist/config.d.ts.map +1 -0
  101. package/dist/config.js +89 -0
  102. package/dist/config.js.map +1 -0
  103. package/dist/daemon/codex-watcher.d.ts +46 -0
  104. package/dist/daemon/codex-watcher.d.ts.map +1 -0
  105. package/dist/daemon/codex-watcher.js +533 -0
  106. package/dist/daemon/codex-watcher.js.map +1 -0
  107. package/dist/daemon/command-handler.d.ts +6 -0
  108. package/dist/daemon/command-handler.d.ts.map +1 -0
  109. package/dist/daemon/command-handler.js +770 -0
  110. package/dist/daemon/command-handler.js.map +1 -0
  111. package/dist/daemon/discussion-orchestrator.d.ts +63 -0
  112. package/dist/daemon/discussion-orchestrator.d.ts.map +1 -0
  113. package/dist/daemon/discussion-orchestrator.js +482 -0
  114. package/dist/daemon/discussion-orchestrator.js.map +1 -0
  115. package/dist/daemon/gemini-watcher.d.ts +42 -0
  116. package/dist/daemon/gemini-watcher.d.ts.map +1 -0
  117. package/dist/daemon/gemini-watcher.js +463 -0
  118. package/dist/daemon/gemini-watcher.js.map +1 -0
  119. package/dist/daemon/hook-server.d.ts +42 -0
  120. package/dist/daemon/hook-server.d.ts.map +1 -0
  121. package/dist/daemon/hook-server.js +160 -0
  122. package/dist/daemon/hook-server.js.map +1 -0
  123. package/dist/daemon/jsonl-watcher.d.ts +35 -0
  124. package/dist/daemon/jsonl-watcher.d.ts.map +1 -0
  125. package/dist/daemon/jsonl-watcher.js +635 -0
  126. package/dist/daemon/jsonl-watcher.js.map +1 -0
  127. package/dist/daemon/lifecycle.d.ts +20 -0
  128. package/dist/daemon/lifecycle.d.ts.map +1 -0
  129. package/dist/daemon/lifecycle.js +331 -0
  130. package/dist/daemon/lifecycle.js.map +1 -0
  131. package/dist/daemon/server-link.d.ts +44 -0
  132. package/dist/daemon/server-link.d.ts.map +1 -0
  133. package/dist/daemon/server-link.js +232 -0
  134. package/dist/daemon/server-link.js.map +1 -0
  135. package/dist/daemon/subsession-manager.d.ts +37 -0
  136. package/dist/daemon/subsession-manager.d.ts.map +1 -0
  137. package/dist/daemon/subsession-manager.js +240 -0
  138. package/dist/daemon/subsession-manager.js.map +1 -0
  139. package/dist/daemon/terminal-parser.d.ts +42 -0
  140. package/dist/daemon/terminal-parser.d.ts.map +1 -0
  141. package/dist/daemon/terminal-parser.js +278 -0
  142. package/dist/daemon/terminal-parser.js.map +1 -0
  143. package/dist/daemon/terminal-streamer.d.ts +93 -0
  144. package/dist/daemon/terminal-streamer.d.ts.map +1 -0
  145. package/dist/daemon/terminal-streamer.js +451 -0
  146. package/dist/daemon/terminal-streamer.js.map +1 -0
  147. package/dist/daemon/timeline-emitter.d.ts +32 -0
  148. package/dist/daemon/timeline-emitter.d.ts.map +1 -0
  149. package/dist/daemon/timeline-emitter.js +97 -0
  150. package/dist/daemon/timeline-emitter.js.map +1 -0
  151. package/dist/daemon/timeline-event.d.ts +23 -0
  152. package/dist/daemon/timeline-event.d.ts.map +1 -0
  153. package/dist/daemon/timeline-event.js +7 -0
  154. package/dist/daemon/timeline-event.js.map +1 -0
  155. package/dist/daemon/timeline-store.d.ts +40 -0
  156. package/dist/daemon/timeline-store.d.ts.map +1 -0
  157. package/dist/daemon/timeline-store.js +153 -0
  158. package/dist/daemon/timeline-store.js.map +1 -0
  159. package/dist/index.d.ts +3 -0
  160. package/dist/index.d.ts.map +1 -0
  161. package/dist/index.js +149 -0
  162. package/dist/index.js.map +1 -0
  163. package/dist/memory/claude-mem.d.ts +9 -0
  164. package/dist/memory/claude-mem.d.ts.map +1 -0
  165. package/dist/memory/claude-mem.js +58 -0
  166. package/dist/memory/claude-mem.js.map +1 -0
  167. package/dist/memory/context-builder.d.ts +4 -0
  168. package/dist/memory/context-builder.d.ts.map +1 -0
  169. package/dist/memory/context-builder.js +35 -0
  170. package/dist/memory/context-builder.js.map +1 -0
  171. package/dist/memory/detector.d.ts +7 -0
  172. package/dist/memory/detector.d.ts.map +1 -0
  173. package/dist/memory/detector.js +17 -0
  174. package/dist/memory/detector.js.map +1 -0
  175. package/dist/memory/extractor.d.ts +21 -0
  176. package/dist/memory/extractor.d.ts.map +1 -0
  177. package/dist/memory/extractor.js +83 -0
  178. package/dist/memory/extractor.js.map +1 -0
  179. package/dist/memory/injector.d.ts +7 -0
  180. package/dist/memory/injector.d.ts.map +1 -0
  181. package/dist/memory/injector.js +18 -0
  182. package/dist/memory/injector.js.map +1 -0
  183. package/dist/memory/interface.d.ts +25 -0
  184. package/dist/memory/interface.d.ts.map +1 -0
  185. package/dist/memory/interface.js +3 -0
  186. package/dist/memory/interface.js.map +1 -0
  187. package/dist/memory/mem0.d.ts +12 -0
  188. package/dist/memory/mem0.d.ts.map +1 -0
  189. package/dist/memory/mem0.js +93 -0
  190. package/dist/memory/mem0.js.map +1 -0
  191. package/dist/router/command-parser.d.ts +33 -0
  192. package/dist/router/command-parser.d.ts.map +1 -0
  193. package/dist/router/command-parser.js +66 -0
  194. package/dist/router/command-parser.js.map +1 -0
  195. package/dist/router/message-router.d.ts +42 -0
  196. package/dist/router/message-router.d.ts.map +1 -0
  197. package/dist/router/message-router.js +222 -0
  198. package/dist/router/message-router.js.map +1 -0
  199. package/dist/router/response-collector.d.ts +28 -0
  200. package/dist/router/response-collector.d.ts.map +1 -0
  201. package/dist/router/response-collector.js +164 -0
  202. package/dist/router/response-collector.js.map +1 -0
  203. package/dist/store/project-store.d.ts +37 -0
  204. package/dist/store/project-store.d.ts.map +1 -0
  205. package/dist/store/project-store.js +70 -0
  206. package/dist/store/project-store.js.map +1 -0
  207. package/dist/store/session-store.d.ts +32 -0
  208. package/dist/store/session-store.d.ts.map +1 -0
  209. package/dist/store/session-store.js +67 -0
  210. package/dist/store/session-store.js.map +1 -0
  211. package/dist/tracker/branch.d.ts +24 -0
  212. package/dist/tracker/branch.d.ts.map +1 -0
  213. package/dist/tracker/branch.js +55 -0
  214. package/dist/tracker/branch.js.map +1 -0
  215. package/dist/tracker/github.d.ts +31 -0
  216. package/dist/tracker/github.d.ts.map +1 -0
  217. package/dist/tracker/github.js +117 -0
  218. package/dist/tracker/github.js.map +1 -0
  219. package/dist/tracker/gitlab.d.ts +31 -0
  220. package/dist/tracker/gitlab.d.ts.map +1 -0
  221. package/dist/tracker/gitlab.js +116 -0
  222. package/dist/tracker/gitlab.js.map +1 -0
  223. package/dist/tracker/index.d.ts +9 -0
  224. package/dist/tracker/index.d.ts.map +1 -0
  225. package/dist/tracker/index.js +28 -0
  226. package/dist/tracker/index.js.map +1 -0
  227. package/dist/tracker/interface.d.ts +39 -0
  228. package/dist/tracker/interface.d.ts.map +1 -0
  229. package/dist/tracker/interface.js +7 -0
  230. package/dist/tracker/interface.js.map +1 -0
  231. package/dist/tracker/priority.d.ts +19 -0
  232. package/dist/tracker/priority.d.ts.map +1 -0
  233. package/dist/tracker/priority.js +40 -0
  234. package/dist/tracker/priority.js.map +1 -0
  235. package/dist/util/logger.d.ts +4 -0
  236. package/dist/util/logger.d.ts.map +1 -0
  237. package/dist/util/logger.js +14 -0
  238. package/dist/util/logger.js.map +1 -0
  239. package/package.json +65 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-link.js","sourceRoot":"","sources":["../../src/daemon/server-link.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Sub-session manager — creates/stops/rebuilds tmux sessions for sub-sessions.
3
+ * Sub-sessions are named deck_sub_{id} and can run claude-code, codex, opencode, or shell.
4
+ */
5
+ export interface SubSessionRecord {
6
+ id: string;
7
+ type: string;
8
+ shellBin?: string | null;
9
+ cwd?: string | null;
10
+ ccSessionId?: string | null;
11
+ codexModel?: string | null;
12
+ geminiSessionId?: string | null;
13
+ fresh?: boolean;
14
+ /** Pre-launch file snapshot for snapshot-diff based file discovery (internal) */
15
+ _fileSnapshot?: Set<string>;
16
+ /** Callback when Gemini session ID is discovered from new file (internal) */
17
+ _onGeminiDiscovered?: (sessionId: string) => void;
18
+ }
19
+ export declare function subSessionName(id: string): string;
20
+ /** Launch a sub-session tmux session. */
21
+ export declare function startSubSession(sub: SubSessionRecord): Promise<void>;
22
+ /** Kill a sub-session tmux session. */
23
+ export declare function stopSubSession(sessionName: string): Promise<void>;
24
+ /** Rebuild all active sub-sessions that are not currently running.
25
+ * For already-running CC/Codex sub-sessions, ensure the JSONL watcher is active. */
26
+ export declare function rebuildSubSessions(subSessions: SubSessionRecord[]): Promise<void>;
27
+ /** Detect available shell binaries. */
28
+ export declare function detectShells(): Promise<string[]>;
29
+ /**
30
+ * Read the last response from a sub-session after idle.
31
+ * Returns { status: 'working' } if not idle, or { status: 'idle', response: string } if idle.
32
+ */
33
+ export declare function readSubSessionResponse(sessionName: string): Promise<{
34
+ status: 'working' | 'idle';
35
+ response?: string;
36
+ }>;
37
+ //# sourceMappingURL=subsession-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subsession-manager.d.ts","sourceRoot":"","sources":["../../src/daemon/subsession-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,iFAAiF;IACjF,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5B,6EAA6E;IAC7E,mBAAmB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CACnD;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,yCAAyC;AACzC,wBAAsB,eAAe,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgF1E;AAED,uCAAuC;AACvC,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASvE;AAED;qFACqF;AACrF,wBAAsB,kBAAkB,CAAC,WAAW,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAoDvF;AAoDD,uCAAuC;AACvC,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAsBtD;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,MAAM,EAAE,SAAS,GAAG,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA2B5D"}
@@ -0,0 +1,240 @@
1
+ "use strict";
2
+ /**
3
+ * Sub-session manager — creates/stops/rebuilds tmux sessions for sub-sessions.
4
+ * Sub-sessions are named deck_sub_{id} and can run claude-code, codex, opencode, or shell.
5
+ */
6
+ var __importDefault = (this && this.__importDefault) || function (mod) {
7
+ return (mod && mod.__esModule) ? mod : { "default": mod };
8
+ };
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.subSessionName = subSessionName;
11
+ exports.startSubSession = startSubSession;
12
+ exports.stopSubSession = stopSubSession;
13
+ exports.rebuildSubSessions = rebuildSubSessions;
14
+ exports.detectShells = detectShells;
15
+ exports.readSubSessionResponse = readSubSessionResponse;
16
+ const tmux_js_1 = require("../agent/tmux.js");
17
+ const session_manager_js_1 = require("../agent/session-manager.js");
18
+ const timeline_store_js_1 = require("./timeline-store.js");
19
+ const session_store_js_1 = require("../store/session-store.js");
20
+ const node_fs_1 = require("node:fs");
21
+ const node_path_1 = __importDefault(require("node:path"));
22
+ const logger_js_1 = __importDefault(require("../util/logger.js"));
23
+ function subSessionName(id) {
24
+ return `deck_sub_${id}`;
25
+ }
26
+ /** Launch a sub-session tmux session. */
27
+ async function startSubSession(sub) {
28
+ const sessionName = subSessionName(sub.id);
29
+ const agentType = sub.type;
30
+ const driver = (0, session_manager_js_1.getDriver)(agentType);
31
+ const exists = await (0, tmux_js_1.sessionExists)(sessionName);
32
+ if (exists) {
33
+ logger_js_1.default.info({ sessionName }, 'Sub-session already running');
34
+ return;
35
+ }
36
+ const launchCmd = driver.buildLaunchCommand(sessionName, {
37
+ cwd: sub.cwd ?? undefined,
38
+ ...(sub.shellBin ? { shellBin: sub.shellBin } : {}),
39
+ ...(sub.ccSessionId ? { ccSessionId: sub.ccSessionId } : {}),
40
+ ...(sub.codexModel ? { codexModel: sub.codexModel } : {}),
41
+ ...(sub.geminiSessionId ? { geminiSessionId: sub.geminiSessionId } : {}),
42
+ ...(sub.fresh ? { fresh: true } : {}),
43
+ });
44
+ await (0, tmux_js_1.newSession)(sessionName, launchCmd, { cwd: sub.cwd ?? undefined });
45
+ // Register in session-store so command-handler can look up agentType (e.g. for Codex delayed-Enter)
46
+ // ccSessionId is stored so that restoreFromStore can use startWatchingFile (not directory scan) if needed.
47
+ (0, session_store_js_1.upsertSession)({ name: sessionName, projectName: sessionName, agentType: sub.type, role: 'w1', state: 'running', projectDir: sub.cwd ?? '', ccSessionId: sub.ccSessionId ?? undefined, restarts: 0, restartTimestamps: [], createdAt: Date.now(), updatedAt: Date.now() });
48
+ logger_js_1.default.info({ sessionName, type: sub.type }, 'Sub-session started');
49
+ // Kick off pipe-pane for any browsers that subscribed before the tmux session existed
50
+ const { terminalStreamer } = await import('./terminal-streamer.js');
51
+ terminalStreamer.retryPipeIfSubscribers(sessionName);
52
+ // Start JSONL watcher for CC sub-sessions pointing at specific file
53
+ if (agentType === 'claude-code' && sub.ccSessionId && sub.cwd) {
54
+ const { startWatchingFile, claudeProjectDir } = await import('./jsonl-watcher.js');
55
+ const projectDir = claudeProjectDir(sub.cwd);
56
+ const jsonlPath = node_path_1.default.join(projectDir, `${sub.ccSessionId}.jsonl`);
57
+ startWatchingFile(sessionName, jsonlPath).catch((e) => logger_js_1.default.warn({ err: e, sessionName }, 'jsonl-watcher startWatchingFile failed'));
58
+ }
59
+ // Start gemini watcher for gemini sub-sessions
60
+ if (agentType === 'gemini') {
61
+ if (sub.geminiSessionId) {
62
+ const { startWatching } = await import('./gemini-watcher.js');
63
+ startWatching(sessionName, sub.geminiSessionId).catch((e) => logger_js_1.default.warn({ err: e, sessionName }, 'gemini-watcher startWatching failed'));
64
+ }
65
+ else if (sub._fileSnapshot) {
66
+ // resolveSessionId failed — use snapshot diff to find the new file
67
+ const { startWatchingNew } = await import('./gemini-watcher.js');
68
+ startWatchingNew(sessionName, sub._fileSnapshot, (sessionId, _filePath) => {
69
+ logger_js_1.default.info({ sessionName, sessionId }, 'Discovered Gemini session ID from new file');
70
+ // Persist via onGeminiDiscovered callback if provided
71
+ sub._onGeminiDiscovered?.(sessionId);
72
+ }).catch((e) => logger_js_1.default.warn({ err: e, sessionName }, 'gemini-watcher startWatchingNew failed'));
73
+ }
74
+ else {
75
+ const { startWatchingLatest } = await import('./gemini-watcher.js');
76
+ startWatchingLatest(sessionName).catch((e) => logger_js_1.default.warn({ err: e, sessionName }, 'gemini-watcher startWatchingLatest failed'));
77
+ }
78
+ }
79
+ // Start codex JSONL watcher for codex sub-sessions
80
+ if (agentType === 'codex' && sub.cwd) {
81
+ const { startWatching: startCodexWatching } = await import('./codex-watcher.js');
82
+ startCodexWatching(sessionName, sub.cwd, sub.codexModel ?? undefined).catch((e) => logger_js_1.default.warn({ err: e, sessionName }, 'codex-watcher startWatching failed'));
83
+ }
84
+ if (driver.postLaunch) {
85
+ const { capturePane, sendKey } = await import('../agent/tmux.js');
86
+ driver.postLaunch(() => capturePane(sessionName), (key) => sendKey(sessionName, key)).catch((e) => logger_js_1.default.warn({ err: e, sessionName }, 'Sub-session postLaunch failed'));
87
+ }
88
+ }
89
+ /** Kill a sub-session tmux session. */
90
+ async function stopSubSession(sessionName) {
91
+ await (0, tmux_js_1.killSession)(sessionName).catch(() => { });
92
+ const { stopWatching } = await import('./jsonl-watcher.js');
93
+ stopWatching(sessionName);
94
+ const { stopWatching: stopCodexWatching } = await import('./codex-watcher.js');
95
+ stopCodexWatching(sessionName);
96
+ const { stopWatching: stopGeminiWatching } = await import('./gemini-watcher.js');
97
+ stopGeminiWatching(sessionName);
98
+ logger_js_1.default.info({ sessionName }, 'Sub-session stopped');
99
+ }
100
+ /** Rebuild all active sub-sessions that are not currently running.
101
+ * For already-running CC/Codex sub-sessions, ensure the JSONL watcher is active. */
102
+ async function rebuildSubSessions(subSessions) {
103
+ const { startWatchingFile, claudeProjectDir, isWatching } = await import('./jsonl-watcher.js');
104
+ const { startWatching: startCodexWatching, isWatching: isCodexWatching } = await import('./codex-watcher.js');
105
+ const { startWatching: startGeminiWatching, startWatchingLatest: startGeminiWatchingLatest, isWatching: isGeminiWatching } = await import('./gemini-watcher.js');
106
+ for (const sub of subSessions) {
107
+ const sessionName = subSessionName(sub.id);
108
+ const exists = await (0, tmux_js_1.sessionExists)(sessionName);
109
+ if (!exists) {
110
+ await startSubSession(sub).catch((e) => logger_js_1.default.warn({ err: e, sessionName }, 'Sub-session rebuild failed'));
111
+ }
112
+ else if (sub.type === 'claude-code' && sub.ccSessionId && sub.cwd && !isWatching(sessionName)) {
113
+ // Already running — restore the JSONL watcher (lost on daemon restart)
114
+ const projectDir = claudeProjectDir(sub.cwd);
115
+ const jsonlPath = node_path_1.default.join(projectDir, `${sub.ccSessionId}.jsonl`);
116
+ startWatchingFile(sessionName, jsonlPath).catch((e) => logger_js_1.default.warn({ err: e, sessionName }, 'Sub-session watcher restore failed'));
117
+ logger_js_1.default.info({ sessionName, jsonlPath }, 'Restored JSONL watcher for running sub-session');
118
+ }
119
+ else if (sub.type === 'codex' && sub.cwd && !isCodexWatching(sessionName)) {
120
+ // Already running — restore the codex JSONL watcher (lost on daemon restart)
121
+ startCodexWatching(sessionName, sub.cwd, sub.codexModel ?? undefined).catch((e) => logger_js_1.default.warn({ err: e, sessionName }, 'Codex watcher restore failed'));
122
+ logger_js_1.default.info({ sessionName }, 'Restored codex JSONL watcher for running sub-session');
123
+ }
124
+ else if (sub.type === 'gemini' && !isGeminiWatching(sessionName)) {
125
+ // Already running — restore the gemini watcher (lost on daemon restart)
126
+ // Try stored UUID first, then extract from process args, then fall back to latest
127
+ let uuid = sub.geminiSessionId ?? null;
128
+ if (!uuid) {
129
+ uuid = await extractGeminiUuidFromProcess(sessionName);
130
+ if (uuid) {
131
+ logger_js_1.default.info({ sessionName, geminiSessionId: uuid }, 'Extracted Gemini UUID from process args');
132
+ }
133
+ }
134
+ if (uuid) {
135
+ startGeminiWatching(sessionName, uuid).catch((e) => logger_js_1.default.warn({ err: e, sessionName }, 'Gemini watcher restore failed'));
136
+ }
137
+ else {
138
+ startGeminiWatchingLatest(sessionName).catch((e) => logger_js_1.default.warn({ err: e, sessionName }, 'Gemini watcher restore failed'));
139
+ }
140
+ logger_js_1.default.info({ sessionName, geminiSessionId: uuid }, 'Restored gemini watcher for running sub-session');
141
+ }
142
+ // Ensure agentType is in session-store for all running sub-sessions (needed by command-handler)
143
+ if (exists) {
144
+ (0, session_store_js_1.upsertSession)({ name: sessionName, projectName: sessionName, agentType: sub.type, role: 'w1', state: 'running', projectDir: sub.cwd ?? '', ccSessionId: sub.ccSessionId ?? undefined, restarts: 0, restartTimestamps: [], createdAt: Date.now(), updatedAt: Date.now() });
145
+ }
146
+ }
147
+ }
148
+ /**
149
+ * Extract the Gemini --resume UUID from a running tmux session's process tree.
150
+ * Returns the UUID string, or null if not found or if it's 'latest'.
151
+ */
152
+ async function extractGeminiUuidFromProcess(sessionName) {
153
+ try {
154
+ const { execFile: execFileCb } = await import('node:child_process');
155
+ const { promisify } = await import('node:util');
156
+ const execFileAsync = promisify(execFileCb);
157
+ // Get pane PID from tmux
158
+ const { stdout: panePid } = await execFileAsync('tmux', ['display', '-t', sessionName, '-p', '#{pane_pid}']);
159
+ const pid = panePid.trim();
160
+ if (!pid)
161
+ return null;
162
+ // Find gemini process in the process tree (child or grandchild)
163
+ // Use ps to get all descendants and their command lines
164
+ const { stdout: psOut } = await execFileAsync('ps', ['--ppid', pid, '-o', 'pid=,args=', '--no-headers']).catch(() => ({ stdout: '' }));
165
+ const checkLine = (line) => {
166
+ if (!line.includes('gemini'))
167
+ return null;
168
+ const match = line.match(/--resume\s+([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})/i);
169
+ return match ? match[1] : null;
170
+ };
171
+ for (const line of psOut.split('\n')) {
172
+ const uuid = checkLine(line);
173
+ if (uuid)
174
+ return uuid;
175
+ // Check grandchildren
176
+ const childPid = line.trim().split(/\s+/)[0];
177
+ if (!childPid)
178
+ continue;
179
+ const { stdout: grandPs } = await execFileAsync('ps', ['--ppid', childPid, '-o', 'pid=,args=', '--no-headers']).catch(() => ({ stdout: '' }));
180
+ for (const gline of grandPs.split('\n')) {
181
+ const guuid = checkLine(gline);
182
+ if (guuid)
183
+ return guuid;
184
+ }
185
+ }
186
+ }
187
+ catch {
188
+ // best-effort
189
+ }
190
+ return null;
191
+ }
192
+ /** Detect available shell binaries. */
193
+ async function detectShells() {
194
+ const CANDIDATES = ['fish', 'zsh', 'bash', 'sh'];
195
+ const SEARCH_PATHS = ['/opt/homebrew/bin', '/usr/local/bin', '/usr/bin', '/bin'];
196
+ const shells = [];
197
+ // Include process.env.SHELL first if it exists
198
+ const envShell = process.env.SHELL;
199
+ if (envShell && (0, node_fs_1.existsSync)(envShell) && !shells.includes(envShell)) {
200
+ shells.push(envShell);
201
+ }
202
+ for (const dir of SEARCH_PATHS) {
203
+ for (const candidate of CANDIDATES) {
204
+ const full = `${dir}/${candidate}`;
205
+ if ((0, node_fs_1.existsSync)(full) && !shells.includes(full)) {
206
+ shells.push(full);
207
+ }
208
+ }
209
+ }
210
+ return shells;
211
+ }
212
+ /**
213
+ * Read the last response from a sub-session after idle.
214
+ * Returns { status: 'working' } if not idle, or { status: 'idle', response: string } if idle.
215
+ */
216
+ async function readSubSessionResponse(sessionName) {
217
+ const { capturePane } = await import('../agent/tmux.js');
218
+ const { detectStatus } = await import('../agent/detect.js');
219
+ const lines = await capturePane(sessionName).catch(() => []);
220
+ const exists = await (0, tmux_js_1.sessionExists)(sessionName);
221
+ if (!exists)
222
+ return { status: 'idle', response: '' };
223
+ // Look up actual agent type from session store (set by startSubSession/rebuildSubSessions)
224
+ const { getSession } = await import('../store/session-store.js');
225
+ const sessionRecord = getSession(sessionName);
226
+ const agentType = (sessionRecord?.agentType ?? 'shell');
227
+ const status = detectStatus(lines, agentType);
228
+ if (status !== 'idle')
229
+ return { status: 'working' };
230
+ // Read from timeline store: find events after last user.message
231
+ const events = timeline_store_js_1.timelineStore.read(sessionName);
232
+ const lastUserMsgIdx = events.map((e) => e.type).lastIndexOf('user.message');
233
+ const responseEvents = lastUserMsgIdx >= 0 ? events.slice(lastUserMsgIdx + 1) : events;
234
+ const textParts = responseEvents
235
+ .filter((e) => e.type === 'assistant.text')
236
+ .map((e) => String(e.payload.text ?? ''));
237
+ const response = textParts.length > 0 ? textParts.join('\n') : lines.join('\n');
238
+ return { status: 'idle', response };
239
+ }
240
+ //# sourceMappingURL=subsession-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subsession-manager.js","sourceRoot":"","sources":["../../src/daemon/subsession-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Terminal text extraction from raw PTY stream.
3
+ * RawStreamParser handles chunk-boundary UTF-8/ANSI fragments and CR/LF semantics.
4
+ * Completed lines are classified and throttled into assistant.text timeline events.
5
+ */
6
+ export declare function stripAnsi(s: string): string;
7
+ export type LineClass = 'HIDE' | 'MUTED' | 'KEEP';
8
+ export declare function classifyLine(stripped: string): LineClass;
9
+ /**
10
+ * Per-session streaming parser for raw PTY bytes.
11
+ * Handles UTF-8 multi-byte fragments, ANSI escape fragments, and CR/LF semantics
12
+ * across arbitrary chunk boundaries.
13
+ *
14
+ * CR semantics:
15
+ * \r\n → CRLF: emit current line as completed
16
+ * \r<X> → pure CR overwrite: discard current line (spinner/progress bar redraw)
17
+ * \n → LF only: emit current line as completed
18
+ */
19
+ export declare class RawStreamParser {
20
+ private utf8Pending;
21
+ private ansiBuffer;
22
+ private inAnsi;
23
+ private currentLine;
24
+ private crPending;
25
+ /**
26
+ * Feed a raw PTY chunk. Returns completed new lines (stripped of ANSI,
27
+ * after carriage-return overwrite logic applied).
28
+ */
29
+ feed(chunk: Buffer): string[];
30
+ /** Currently accumulated (not yet completed) line text. */
31
+ pending(): string;
32
+ /** Reset all parser state (e.g. on session restart). */
33
+ reset(): void;
34
+ }
35
+ export declare function resetParser(sessionName: string): void;
36
+ /**
37
+ * Process a raw PTY data chunk for a session.
38
+ * Feeds into per-session RawStreamParser, classifies completed lines,
39
+ * and throttles assistant.text emission.
40
+ */
41
+ export declare function processRawPtyData(sessionName: string, data: Buffer): void;
42
+ //# sourceMappingURL=terminal-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-parser.d.ts","sourceRoot":"","sources":["../../src/daemon/terminal-parser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAUH,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE3C;AAID,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAuClD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAmBxD;AAID;;;;;;;;;GASG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,UAAU,CAAM;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAM;IACzB,OAAO,CAAC,SAAS,CAAS;IAE1B;;;OAGG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IA+E7B,2DAA2D;IAC3D,OAAO,IAAI,MAAM;IAIjB,wDAAwD;IACxD,KAAK,IAAI,IAAI;CAOd;AAgDD,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAGrD;AAyCD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAwBzE"}
@@ -0,0 +1,278 @@
1
+ "use strict";
2
+ /**
3
+ * Terminal text extraction from raw PTY stream.
4
+ * RawStreamParser handles chunk-boundary UTF-8/ANSI fragments and CR/LF semantics.
5
+ * Completed lines are classified and throttled into assistant.text timeline events.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.RawStreamParser = void 0;
9
+ exports.stripAnsi = stripAnsi;
10
+ exports.classifyLine = classifyLine;
11
+ exports.resetParser = resetParser;
12
+ exports.processRawPtyData = processRawPtyData;
13
+ const timeline_emitter_js_1 = require("./timeline-emitter.js");
14
+ // ── ANSI stripping ───────────────────────────────────────────────────────────
15
+ const ANSI_CSI = /\x1b\[[0-9;]*[a-zA-Z]/g;
16
+ const ANSI_OSC = /\x1b\].*?\x07/g;
17
+ const ANSI_OTHER = /\x1b[^[\]].?/g;
18
+ function stripAnsi(s) {
19
+ return s.replace(ANSI_CSI, '').replace(ANSI_OSC, '').replace(ANSI_OTHER, '');
20
+ }
21
+ const BRAILLE_RANGE = /^[\u2800-\u28FF\s]+$/;
22
+ const HIDE_EXACT = new Set([
23
+ 'How is Claude doing this session?',
24
+ 'How is Claude doing this session',
25
+ ]);
26
+ // Box-drawing: U+2500-U+257F
27
+ const BOX_DRAWING = /[\u2500-\u257F]/g;
28
+ // Claude Code UI chrome patterns — these are tool/status lines, not assistant text
29
+ const CC_CHROME_PATTERNS = [
30
+ /^[>❯]\s*(Read|Edit|Write|Bash|Grep|Glob|Agent|Skill|WebFetch|WebSearch|LSP|NotebookEdit|TodoWrite|AskUserQuestion|TaskCreate|TaskUpdate|TaskGet|TaskList|TaskOutput|TaskStop|ToolSearch|EnterPlanMode|ExitPlanMode)\b/,
31
+ /^[<]\s*(done|error|result)/i,
32
+ /^[*●○◉⬤]\s*(Accomplishing|Thinking|Working|Reading|Searching|Running|Generating|Planning|Waiting)/i,
33
+ // "Agent working.•." / "Agent idle - waiting for input" / "Agent running..." Claude Code status lines
34
+ /^Agent\s+(working|idle|running|thinking|stopped|paused|waiting)/i,
35
+ /^Agent\s+idle\s*[-–]/i,
36
+ /^\s*[LI⎿├│└┌─]\s/, // tree/indent markers
37
+ /^Running\.*\s*\(\d/, // "Running... (23s..."
38
+ /^thought for/i,
39
+ /^\d+[smh]\s*[·•]\s*(timeout|tokens)/, // "23s · timeout 2m 30s"
40
+ /^ctrl\+/i, // "ctrl+b ctrl+b..."
41
+ /^Co-Authored-By:/,
42
+ /^EOF$/,
43
+ // Claude Code TUI tool-execution status lines (ink full-screen redraw emits these every tick)
44
+ /^[\u23F5\u23F8\u23F9\u25B6\u25A0]/, // ⏵ ⏸ ⏹ ▶ ■ — tool spinner/status prefixes
45
+ /\(running\)\s*$/, // "... (running)"
46
+ /\(\d+(\.\d+)?s(\s+elapsed)?\)\s*$/, // "... (5s)" or "... (5s elapsed)"
47
+ /^[✓✗]\s*(Read|Edit|Write|Bash|Grep|Glob|Agent|Skill|WebFetch|WebSearch|LSP|NotebookEdit|TodoWrite|AskUserQuestion|TaskCreate|TaskUpdate|TaskGet|TaskList|TaskOutput|TaskStop|ToolSearch)\b/, // tool result lines
48
+ /^⎿/, // result indent (U+2B3F)
49
+ /^[·•]\s*(done|error|result|output|result)/i,
50
+ /^\s*Context\s+[\u2580-\u259F\u2588█░▒▓]/, // "Context ████░░░" progress bar
51
+ /^\s*(Context|Usage)\s+\d+%/, // "Context 75%" / "Usage 66%"
52
+ /^\s*\d+\s+(CLAUDE\.md|hooks?)/i, // "1 CLAUDE.md | 4 hooks"
53
+ /^\s*[✓✗]\s+Bash\s+×/, // "✓ Bash ×11"
54
+ ];
55
+ function classifyLine(stripped) {
56
+ const trimmed = stripped.trim();
57
+ if (!trimmed)
58
+ return 'HIDE';
59
+ if (HIDE_EXACT.has(trimmed))
60
+ return 'HIDE';
61
+ for (const pat of CC_CHROME_PATTERNS) {
62
+ if (pat.test(trimmed))
63
+ return 'HIDE';
64
+ }
65
+ if (BRAILLE_RANGE.test(trimmed))
66
+ return 'HIDE';
67
+ const nonWs = trimmed.replace(/\s/g, '');
68
+ if (nonWs.length > 0) {
69
+ const boxCount = (nonWs.match(BOX_DRAWING) ?? []).length;
70
+ if (boxCount / nonWs.length > 0.8)
71
+ return 'MUTED';
72
+ }
73
+ return 'KEEP';
74
+ }
75
+ // ── RawStreamParser ──────────────────────────────────────────────────────────
76
+ /**
77
+ * Per-session streaming parser for raw PTY bytes.
78
+ * Handles UTF-8 multi-byte fragments, ANSI escape fragments, and CR/LF semantics
79
+ * across arbitrary chunk boundaries.
80
+ *
81
+ * CR semantics:
82
+ * \r\n → CRLF: emit current line as completed
83
+ * \r<X> → pure CR overwrite: discard current line (spinner/progress bar redraw)
84
+ * \n → LF only: emit current line as completed
85
+ */
86
+ class RawStreamParser {
87
+ utf8Pending = []; // incomplete multi-byte UTF-8 sequence
88
+ ansiBuffer = ''; // incomplete ANSI escape sequence
89
+ inAnsi = false; // currently inside an ANSI sequence
90
+ currentLine = ''; // accumulated text for current line
91
+ crPending = false; // last char was \r, waiting to see next
92
+ /**
93
+ * Feed a raw PTY chunk. Returns completed new lines (stripped of ANSI,
94
+ * after carriage-return overwrite logic applied).
95
+ */
96
+ feed(chunk) {
97
+ // 1. Prepend any pending UTF-8 bytes from previous chunk
98
+ let buf;
99
+ if (this.utf8Pending.length > 0) {
100
+ buf = Buffer.concat([Buffer.from(this.utf8Pending), chunk]);
101
+ this.utf8Pending = [];
102
+ }
103
+ else {
104
+ buf = chunk;
105
+ }
106
+ // 2. Split off incomplete trailing UTF-8 sequence
107
+ const split = splitIncompleteUtf8(buf);
108
+ if (split.pending.length > 0) {
109
+ this.utf8Pending = Array.from(split.pending);
110
+ }
111
+ // 3. Decode safe portion to string
112
+ const str = split.safe.toString('utf8');
113
+ // 4. Scan characters
114
+ const completed = [];
115
+ for (let i = 0; i < str.length; i++) {
116
+ const ch = str[i];
117
+ // ANSI sequence handling
118
+ if (this.inAnsi) {
119
+ this.ansiBuffer += ch;
120
+ // ANSI sequences end with a letter (C0 letters, m, J, H, etc.)
121
+ if (/[a-zA-Z]/.test(ch)) {
122
+ this.inAnsi = false;
123
+ this.ansiBuffer = '';
124
+ }
125
+ continue;
126
+ }
127
+ if (ch === '\x1b') {
128
+ // Start of escape sequence
129
+ this.inAnsi = true;
130
+ this.ansiBuffer = ch;
131
+ continue;
132
+ }
133
+ if (ch === '\r') {
134
+ if (this.crPending) {
135
+ // Double CR — treat first CR as overwrite (discard line), start fresh
136
+ this.currentLine = '';
137
+ }
138
+ this.crPending = true;
139
+ continue;
140
+ }
141
+ if (ch === '\n') {
142
+ if (this.crPending) {
143
+ // CRLF: emit current line
144
+ completed.push(this.currentLine);
145
+ this.currentLine = '';
146
+ this.crPending = false;
147
+ }
148
+ else {
149
+ // Pure LF: emit current line
150
+ completed.push(this.currentLine);
151
+ this.currentLine = '';
152
+ }
153
+ continue;
154
+ }
155
+ // Regular character
156
+ if (this.crPending) {
157
+ // Pure CR (not followed by \n): overwrite — discard current line
158
+ this.currentLine = '';
159
+ this.crPending = false;
160
+ }
161
+ this.currentLine += ch;
162
+ }
163
+ return completed;
164
+ }
165
+ /** Currently accumulated (not yet completed) line text. */
166
+ pending() {
167
+ return this.currentLine;
168
+ }
169
+ /** Reset all parser state (e.g. on session restart). */
170
+ reset() {
171
+ this.utf8Pending = [];
172
+ this.ansiBuffer = '';
173
+ this.inAnsi = false;
174
+ this.currentLine = '';
175
+ this.crPending = false;
176
+ }
177
+ }
178
+ exports.RawStreamParser = RawStreamParser;
179
+ /**
180
+ * Split a buffer at the last complete UTF-8 character boundary.
181
+ * Returns { safe: complete bytes, pending: incomplete trailing bytes }.
182
+ */
183
+ function splitIncompleteUtf8(buf) {
184
+ if (buf.length === 0)
185
+ return { safe: buf, pending: Buffer.alloc(0) };
186
+ // Find where trailing incomplete sequence starts (if any)
187
+ let i = buf.length - 1;
188
+ while (i >= 0 && i >= buf.length - 4) {
189
+ const b = buf[i];
190
+ if ((b & 0x80) === 0) {
191
+ // ASCII byte — fully valid, no pending
192
+ return { safe: buf, pending: Buffer.alloc(0) };
193
+ }
194
+ if ((b & 0xC0) === 0xC0) {
195
+ // Start of multi-byte sequence
196
+ const seqLen = b >= 0xF0 ? 4 : b >= 0xE0 ? 3 : 2;
197
+ const remaining = buf.length - i;
198
+ if (remaining < seqLen) {
199
+ // Incomplete sequence at end
200
+ return { safe: buf.slice(0, i), pending: buf.slice(i) };
201
+ }
202
+ // Complete sequence
203
+ return { safe: buf, pending: Buffer.alloc(0) };
204
+ }
205
+ // Continuation byte (0x80-0xBF) — keep scanning backwards
206
+ i--;
207
+ }
208
+ return { safe: buf, pending: Buffer.alloc(0) };
209
+ }
210
+ // ── Per-session parser instances ─────────────────────────────────────────────
211
+ const parsers = new Map();
212
+ function getOrCreateParser(sessionName) {
213
+ let parser = parsers.get(sessionName);
214
+ if (!parser) {
215
+ parser = new RawStreamParser();
216
+ parsers.set(sessionName, parser);
217
+ }
218
+ return parser;
219
+ }
220
+ function resetParser(sessionName) {
221
+ parsers.get(sessionName)?.reset();
222
+ parsers.delete(sessionName);
223
+ }
224
+ // ── Streaming text accumulator (per-session throttle) ────────────────────────
225
+ const THROTTLE_MS = 500;
226
+ const accumulators = new Map();
227
+ function getAcc(sessionName) {
228
+ let acc = accumulators.get(sessionName);
229
+ if (!acc) {
230
+ acc = { pendingText: '', timer: null, seenLines: new Set() };
231
+ accumulators.set(sessionName, acc);
232
+ }
233
+ return acc;
234
+ }
235
+ function flushAcc(sessionName) {
236
+ const acc = accumulators.get(sessionName);
237
+ if (!acc || !acc.pendingText)
238
+ return;
239
+ timeline_emitter_js_1.timelineEmitter.emit(sessionName, 'assistant.text', {
240
+ text: acc.pendingText,
241
+ streaming: true,
242
+ }, {
243
+ source: 'terminal-parse',
244
+ confidence: 'low',
245
+ });
246
+ acc.pendingText = '';
247
+ acc.timer = null;
248
+ acc.seenLines.clear();
249
+ }
250
+ /**
251
+ * Process a raw PTY data chunk for a session.
252
+ * Feeds into per-session RawStreamParser, classifies completed lines,
253
+ * and throttles assistant.text emission.
254
+ */
255
+ function processRawPtyData(sessionName, data) {
256
+ const parser = getOrCreateParser(sessionName);
257
+ const newLines = parser.feed(data);
258
+ if (newLines.length === 0)
259
+ return;
260
+ const acc = getAcc(sessionName);
261
+ for (const line of newLines) {
262
+ const stripped = stripAnsi(line).trimEnd();
263
+ const cls = classifyLine(stripped);
264
+ if (cls === 'KEEP' && !acc.seenLines.has(stripped)) {
265
+ acc.seenLines.add(stripped);
266
+ if (acc.pendingText) {
267
+ acc.pendingText += '\n' + stripped;
268
+ }
269
+ else {
270
+ acc.pendingText = stripped;
271
+ }
272
+ }
273
+ }
274
+ if (acc.pendingText && !acc.timer) {
275
+ acc.timer = setTimeout(() => flushAcc(sessionName), THROTTLE_MS);
276
+ }
277
+ }
278
+ //# sourceMappingURL=terminal-parser.js.map