@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":"terminal-parser.js","sourceRoot":"","sources":["../../src/daemon/terminal-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Terminal streaming via tmux pipe-pane -O raw PTY stream.
3
+ * Replaces polling capture-pane approach.
4
+ *
5
+ * Per-subscriber flow:
6
+ * 1. capturePaneVisible() → fullFrame snapshot → sent to subscriber
7
+ * 2. startPipePaneStream() → raw PTY bytes forwarded to subscribers
8
+ *
9
+ * Subscribers joining an already-running stream get a snapshot barrier:
10
+ * - rawBuffer during snapshotPending (up to 256KB, else fail_subscriber)
11
+ * - flush buffer after snapshot completes
12
+ *
13
+ * Dual-layer idle detection:
14
+ * - Any raw bytes → reset idle timer → emit session.state(running) if was idle
15
+ * - No raw bytes for IDLE_THRESHOLD_MS → emit session.state(idle)
16
+ */
17
+ export interface TerminalDiff {
18
+ sessionName: string;
19
+ timestamp: number;
20
+ /** Changed line ranges: [lineIndex, content][] */
21
+ lines: Array<[number, string]>;
22
+ /** Full frame width/height (cols x rows) */
23
+ cols: number;
24
+ rows: number;
25
+ /** Per-session monotonic frame counter */
26
+ frameSeq: number;
27
+ /** True when first frame after subscribe or snapshot_request */
28
+ fullFrame: boolean;
29
+ /** True only when fullFrame was triggered by terminal.snapshot_request (not subscribe) */
30
+ snapshotRequested: boolean;
31
+ /** True when screen scrolled up by k lines */
32
+ scrolled: boolean;
33
+ /** Number of new lines at the bottom when scrolled (0 when not scrolled) */
34
+ newLineCount: number;
35
+ }
36
+ export interface TerminalHistory {
37
+ sessionName: string;
38
+ content: string;
39
+ }
40
+ export interface StreamSubscriber {
41
+ sessionName: string;
42
+ /** Send a fullFrame snapshot or diff (snapshot uses fullFrame: true). */
43
+ send: (diff: TerminalDiff) => void;
44
+ /** Send raw PTY bytes directly to the terminal renderer. */
45
+ sendRaw?: (data: Buffer) => void;
46
+ /** Send a control message (e.g. terminal.stream_reset). */
47
+ sendControl?: (msg: {
48
+ type: string;
49
+ [key: string]: unknown;
50
+ }) => void;
51
+ sendHistory?: (history: TerminalHistory) => void;
52
+ onError?: (err: Error) => void;
53
+ }
54
+ export declare class TerminalStreamer {
55
+ /** session → subscriber → state */
56
+ private subscribers;
57
+ private pipes;
58
+ private retryTimers;
59
+ private lastRawAt;
60
+ private idleTimers;
61
+ private idleState;
62
+ private sizeCache;
63
+ private static readonly SIZE_CACHE_MS;
64
+ private frameSeqs;
65
+ subscribe(subscriber: StreamSubscriber): () => void;
66
+ private bootstrapSubscriber;
67
+ unsubscribe(subscriber: StreamSubscriber): void;
68
+ /** Request an on-demand snapshot for all subscribers of a session. */
69
+ requestSnapshot(sessionName: string): void;
70
+ /** Invalidate size cache (call after resize events). */
71
+ invalidateSize(sessionName: string): void;
72
+ /** No-op in new design (no polling loop to nudge). Kept for API compat. */
73
+ nudge(_sessionName: string): void;
74
+ /** Called by session-manager when a session restarts with a new pane. */
75
+ rebindSession(sessionName: string): Promise<void>;
76
+ destroy(): void;
77
+ private startPipe;
78
+ private stopPipe;
79
+ private handlePipeClose;
80
+ /** Called after a session is newly created to start the pipe for any waiting subscribers. */
81
+ retryPipeIfSubscribers(sessionName: string): void;
82
+ private scheduleRebind;
83
+ private onRawData;
84
+ private failSubscriber;
85
+ private removeSubscriber;
86
+ private errorAllSubscribers;
87
+ private resetIdleTimer;
88
+ private clearIdleTimer;
89
+ private getSize;
90
+ private nextFrameSeq;
91
+ }
92
+ export declare const terminalStreamer: TerminalStreamer;
93
+ //# sourceMappingURL=terminal-streamer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-streamer.d.ts","sourceRoot":"","sources":["../../src/daemon/terminal-streamer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAgBH,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,KAAK,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC/B,4CAA4C;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,SAAS,EAAE,OAAO,CAAC;IACnB,0FAA0F;IAC1F,iBAAiB,EAAE,OAAO,CAAC;IAC3B,8CAA8C;IAC9C,QAAQ,EAAE,OAAO,CAAC;IAClB,4EAA4E;IAC5E,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,yEAAyE;IACzE,IAAI,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;IACnC,4DAA4D;IAC5D,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,2DAA2D;IAC3D,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;IACtE,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,IAAI,CAAC;IACjD,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;CAChC;AAgBD,qBAAa,gBAAgB;IAC3B,mCAAmC;IACnC,OAAO,CAAC,WAAW,CAA6D;IAChF,OAAO,CAAC,KAAK,CAAgC;IAC7C,OAAO,CAAC,WAAW,CAAoD;IAGvE,OAAO,CAAC,SAAS,CAA6B;IAC9C,OAAO,CAAC,UAAU,CAAoD;IACtE,OAAO,CAAC,SAAS,CAA8B;IAG/C,OAAO,CAAC,SAAS,CAAiE;IAClF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAS;IAE9C,OAAO,CAAC,SAAS,CAA6B;IAE9C,SAAS,CAAC,UAAU,EAAE,gBAAgB,GAAG,MAAM,IAAI;YAuBrC,mBAAmB;IA2DjC,WAAW,CAAC,UAAU,EAAE,gBAAgB,GAAG,IAAI;IAmB/C,sEAAsE;IACtE,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAmC1C,wDAAwD;IACxD,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAIzC,2EAA2E;IAC3E,KAAK,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAIjC,yEAAyE;IACnE,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQvD,OAAO,IAAI,IAAI;YAgBD,SAAS;YAkDT,QAAQ;IAkBtB,OAAO,CAAC,eAAe;IAWvB,6FAA6F;IAC7F,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAQjD,OAAO,CAAC,cAAc;IAgCtB,OAAO,CAAC,SAAS;IAgDjB,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,mBAAmB;IAa3B,OAAO,CAAC,cAAc;IAatB,OAAO,CAAC,cAAc;YAUR,OAAO;IAcrB,OAAO,CAAC,YAAY;CAKrB;AAID,eAAO,MAAM,gBAAgB,kBAAyB,CAAC"}
@@ -0,0 +1,451 @@
1
+ "use strict";
2
+ /**
3
+ * Terminal streaming via tmux pipe-pane -O raw PTY stream.
4
+ * Replaces polling capture-pane approach.
5
+ *
6
+ * Per-subscriber flow:
7
+ * 1. capturePaneVisible() → fullFrame snapshot → sent to subscriber
8
+ * 2. startPipePaneStream() → raw PTY bytes forwarded to subscribers
9
+ *
10
+ * Subscribers joining an already-running stream get a snapshot barrier:
11
+ * - rawBuffer during snapshotPending (up to 256KB, else fail_subscriber)
12
+ * - flush buffer after snapshot completes
13
+ *
14
+ * Dual-layer idle detection:
15
+ * - Any raw bytes → reset idle timer → emit session.state(running) if was idle
16
+ * - No raw bytes for IDLE_THRESHOLD_MS → emit session.state(idle)
17
+ */
18
+ var __importDefault = (this && this.__importDefault) || function (mod) {
19
+ return (mod && mod.__esModule) ? mod : { "default": mod };
20
+ };
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.terminalStreamer = exports.TerminalStreamer = void 0;
23
+ const tmux_js_1 = require("../agent/tmux.js");
24
+ const session_store_js_1 = require("../store/session-store.js");
25
+ const terminal_parser_js_1 = require("./terminal-parser.js");
26
+ const jsonl_watcher_js_1 = require("./jsonl-watcher.js");
27
+ const codex_watcher_js_1 = require("./codex-watcher.js");
28
+ const logger_js_1 = __importDefault(require("../util/logger.js"));
29
+ const timeline_emitter_js_1 = require("./timeline-emitter.js");
30
+ const IDLE_THRESHOLD_MS = 5_000; // 5s without raw bytes → idle (Stop hook fires immediately; this is fallback)
31
+ const MAX_RAW_BUFFER = 256 * 1024; // 256KB per-subscriber snapshot-pending buffer
32
+ const REBIND_DELAYS_MS = [1000, 2000, 4000, 8000, 16000, 30000];
33
+ const MAX_REBIND_ATTEMPTS = 5;
34
+ // ── TerminalStreamer ───────────────────────────────────────────────────────────
35
+ class TerminalStreamer {
36
+ /** session → subscriber → state */
37
+ subscribers = new Map();
38
+ pipes = new Map();
39
+ retryTimers = new Map();
40
+ // Idle detection
41
+ lastRawAt = new Map();
42
+ idleTimers = new Map();
43
+ idleState = new Map();
44
+ // Size cache for snapshots (refreshed every 5s)
45
+ sizeCache = new Map();
46
+ static SIZE_CACHE_MS = 5_000;
47
+ frameSeqs = new Map();
48
+ subscribe(subscriber) {
49
+ const { sessionName } = subscriber;
50
+ if (!this.subscribers.has(sessionName)) {
51
+ this.subscribers.set(sessionName, new Map());
52
+ }
53
+ const subs = this.subscribers.get(sessionName);
54
+ const hasPipe = this.pipes.has(sessionName);
55
+ const subState = {
56
+ // If pipe already running, buffer raw bytes until snapshot delivered
57
+ snapshotPending: hasPipe,
58
+ rawBuffer: [],
59
+ rawBufferBytes: 0,
60
+ };
61
+ subs.set(subscriber, subState);
62
+ // Async: take snapshot then start pipe (for first subscriber) or flush buffer
63
+ void this.bootstrapSubscriber(sessionName, subscriber, subState, hasPipe);
64
+ return () => this.unsubscribe(subscriber);
65
+ }
66
+ async bootstrapSubscriber(sessionName, subscriber, subState, hasPipe) {
67
+ // 1. Take snapshot
68
+ try {
69
+ const size = await this.getSize(sessionName);
70
+ const raw = await (0, tmux_js_1.capturePaneVisible)(sessionName);
71
+ const lines = raw.split('\n').slice(0, size.rows);
72
+ while (lines.length < size.rows)
73
+ lines.push('');
74
+ const diff = {
75
+ sessionName,
76
+ timestamp: Date.now(),
77
+ lines: lines.map((l, i) => [i, l]),
78
+ cols: size.cols,
79
+ rows: size.rows,
80
+ frameSeq: this.nextFrameSeq(sessionName),
81
+ fullFrame: true,
82
+ snapshotRequested: false,
83
+ scrolled: false,
84
+ newLineCount: 0,
85
+ };
86
+ // Check subscriber is still active
87
+ if (!this.subscribers.get(sessionName)?.has(subscriber))
88
+ return;
89
+ subscriber.send(diff);
90
+ // Send scrollback history if subscriber wants it
91
+ if (subscriber.sendHistory) {
92
+ try {
93
+ const historyContent = await (0, tmux_js_1.capturePaneHistory)(sessionName);
94
+ if (historyContent && this.subscribers.get(sessionName)?.has(subscriber)) {
95
+ subscriber.sendHistory({ sessionName, content: historyContent });
96
+ }
97
+ }
98
+ catch { /* best-effort */ }
99
+ }
100
+ }
101
+ catch (err) {
102
+ logger_js_1.default.warn({ sessionName, err }, 'Snapshot failed during subscribe');
103
+ // Continue — raw stream may still recover state
104
+ }
105
+ // 2. Flush buffered raw bytes (if pipe was already running)
106
+ subState.snapshotPending = false;
107
+ for (const chunk of subState.rawBuffer) {
108
+ if (!this.subscribers.get(sessionName)?.has(subscriber))
109
+ break;
110
+ try {
111
+ subscriber.sendRaw?.(chunk);
112
+ }
113
+ catch { /* ignore */ }
114
+ }
115
+ subState.rawBuffer = [];
116
+ subState.rawBufferBytes = 0;
117
+ // 3. Start pipe if this was the first subscriber
118
+ if (!hasPipe && this.subscribers.get(sessionName)?.has(subscriber)) {
119
+ await this.startPipe(sessionName, 0);
120
+ }
121
+ }
122
+ unsubscribe(subscriber) {
123
+ const { sessionName } = subscriber;
124
+ const subs = this.subscribers.get(sessionName);
125
+ if (!subs)
126
+ return;
127
+ subs.delete(subscriber);
128
+ if (subs.size === 0) {
129
+ this.subscribers.delete(sessionName);
130
+ void this.stopPipe(sessionName);
131
+ this.clearIdleTimer(sessionName);
132
+ this.lastRawAt.delete(sessionName);
133
+ this.idleState.delete(sessionName);
134
+ this.sizeCache.delete(sessionName);
135
+ this.frameSeqs.delete(sessionName);
136
+ (0, terminal_parser_js_1.resetParser)(sessionName);
137
+ }
138
+ }
139
+ /** Request an on-demand snapshot for all subscribers of a session. */
140
+ requestSnapshot(sessionName) {
141
+ const subs = this.subscribers.get(sessionName);
142
+ if (!subs || subs.size === 0)
143
+ return;
144
+ void (async () => {
145
+ try {
146
+ const size = await this.getSize(sessionName);
147
+ const raw = await (0, tmux_js_1.capturePaneVisible)(sessionName);
148
+ const lines = raw.split('\n').slice(0, size.rows);
149
+ while (lines.length < size.rows)
150
+ lines.push('');
151
+ const diff = {
152
+ sessionName,
153
+ timestamp: Date.now(),
154
+ lines: lines.map((l, i) => [i, l]),
155
+ cols: size.cols,
156
+ rows: size.rows,
157
+ frameSeq: this.nextFrameSeq(sessionName),
158
+ fullFrame: true,
159
+ snapshotRequested: true,
160
+ scrolled: false,
161
+ newLineCount: 0,
162
+ };
163
+ for (const [sub] of subs) {
164
+ try {
165
+ sub.send(diff);
166
+ }
167
+ catch { /* ignore */ }
168
+ }
169
+ timeline_emitter_js_1.timelineEmitter.emit(sessionName, 'terminal.snapshot', { lines, cols: size.cols, rows: size.rows });
170
+ }
171
+ catch (err) {
172
+ logger_js_1.default.warn({ sessionName, err }, 'requestSnapshot failed');
173
+ }
174
+ })();
175
+ }
176
+ /** Invalidate size cache (call after resize events). */
177
+ invalidateSize(sessionName) {
178
+ this.sizeCache.delete(sessionName);
179
+ }
180
+ /** No-op in new design (no polling loop to nudge). Kept for API compat. */
181
+ nudge(_sessionName) {
182
+ // Raw stream is always live — no nudge needed
183
+ }
184
+ /** Called by session-manager when a session restarts with a new pane. */
185
+ async rebindSession(sessionName) {
186
+ if (!this.subscribers.has(sessionName))
187
+ return;
188
+ await this.stopPipe(sessionName);
189
+ await this.startPipe(sessionName, 0);
190
+ // Re-snapshot all subscribers
191
+ this.requestSnapshot(sessionName);
192
+ }
193
+ destroy() {
194
+ for (const [sessionName] of this.subscribers) {
195
+ void this.stopPipe(sessionName);
196
+ this.clearIdleTimer(sessionName);
197
+ }
198
+ for (const timer of this.retryTimers.values())
199
+ clearTimeout(timer);
200
+ this.subscribers.clear();
201
+ this.pipes.clear();
202
+ this.retryTimers.clear();
203
+ this.lastRawAt.clear();
204
+ this.idleTimers.clear();
205
+ this.idleState.clear();
206
+ }
207
+ // ── Pipe lifecycle ──────────────────────────────────────────────────────────
208
+ async startPipe(sessionName, retryCount) {
209
+ const session = (0, session_store_js_1.getSession)(sessionName);
210
+ let paneId = session?.paneId;
211
+ if (!paneId) {
212
+ // Session created before paneId persistence — fetch dynamically from tmux
213
+ const fetched = (0, tmux_js_1.getPaneId)(sessionName);
214
+ paneId = fetched != null ? await fetched.catch(() => undefined) : undefined;
215
+ if (paneId && session != null) {
216
+ (0, session_store_js_1.upsertSession)({ ...session, paneId });
217
+ }
218
+ }
219
+ if (!paneId) {
220
+ logger_js_1.default.error({ sessionName }, 'Cannot start pipe-pane: paneId not available — restart session to fix');
221
+ // Do not remove subscribers: they can still receive on-demand snapshots
222
+ return;
223
+ }
224
+ try {
225
+ const { stream, cleanup } = await (0, tmux_js_1.startPipePaneStream)(sessionName, paneId);
226
+ const pipeState = { stream, cleanup, retryCount };
227
+ this.pipes.set(sessionName, pipeState);
228
+ stream.on('data', (chunk) => {
229
+ this.onRawData(sessionName, Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
230
+ });
231
+ stream.on('error', (err) => {
232
+ logger_js_1.default.warn({ sessionName, err }, 'Pipe stream error');
233
+ this.handlePipeClose(sessionName);
234
+ });
235
+ stream.on('close', () => {
236
+ // Unexpected close (e.g. FIFO fd error)
237
+ if (this.pipes.has(sessionName)) {
238
+ this.handlePipeClose(sessionName);
239
+ }
240
+ });
241
+ logger_js_1.default.info({ sessionName, paneId }, 'Pipe-pane stream started');
242
+ }
243
+ catch (err) {
244
+ logger_js_1.default.error({ sessionName, err }, 'Failed to start pipe-pane stream');
245
+ if (retryCount < MAX_REBIND_ATTEMPTS) {
246
+ this.scheduleRebind(sessionName, retryCount + 1);
247
+ }
248
+ else {
249
+ this.errorAllSubscribers(sessionName, err instanceof Error ? err : new Error(String(err)));
250
+ }
251
+ }
252
+ }
253
+ async stopPipe(sessionName) {
254
+ const timer = this.retryTimers.get(sessionName);
255
+ if (timer) {
256
+ clearTimeout(timer);
257
+ this.retryTimers.delete(sessionName);
258
+ }
259
+ const pipeState = this.pipes.get(sessionName);
260
+ if (!pipeState)
261
+ return;
262
+ this.pipes.delete(sessionName);
263
+ pipeState.stream.destroy();
264
+ try {
265
+ await pipeState.cleanup();
266
+ }
267
+ catch (err) {
268
+ logger_js_1.default.warn({ sessionName, err }, 'Pipe cleanup error');
269
+ }
270
+ try {
271
+ await (0, tmux_js_1.stopPipePaneStream)(sessionName);
272
+ }
273
+ catch { /* best-effort */ }
274
+ }
275
+ handlePipeClose(sessionName) {
276
+ this.pipes.delete(sessionName);
277
+ // If still have active subscribers, attempt rebind
278
+ const subs = this.subscribers.get(sessionName);
279
+ if (subs && subs.size > 0) {
280
+ logger_js_1.default.info({ sessionName }, 'Pipe closed unexpectedly — scheduling rebind');
281
+ this.scheduleRebind(sessionName, 0);
282
+ }
283
+ }
284
+ /** Called after a session is newly created to start the pipe for any waiting subscribers. */
285
+ retryPipeIfSubscribers(sessionName) {
286
+ const subs = this.subscribers.get(sessionName);
287
+ if (!subs || subs.size === 0)
288
+ return;
289
+ if (this.pipes.has(sessionName))
290
+ return;
291
+ if (this.retryTimers.has(sessionName))
292
+ return;
293
+ void this.startPipe(sessionName, 0);
294
+ }
295
+ scheduleRebind(sessionName, attempt) {
296
+ const delay = REBIND_DELAYS_MS[Math.min(attempt, REBIND_DELAYS_MS.length - 1)];
297
+ const timer = setTimeout(async () => {
298
+ this.retryTimers.delete(sessionName);
299
+ // Check if still have subscribers
300
+ const subs = this.subscribers.get(sessionName);
301
+ if (!subs || subs.size === 0)
302
+ return;
303
+ if (attempt >= MAX_REBIND_ATTEMPTS) {
304
+ logger_js_1.default.error({ sessionName }, 'Pipe rebind: max retries exceeded');
305
+ this.errorAllSubscribers(sessionName, new Error('Terminal stream unavailable after max retries'));
306
+ return;
307
+ }
308
+ // Check if session still alive
309
+ const alive = await (0, tmux_js_1.sessionExists)(sessionName).catch(() => false);
310
+ if (!alive) {
311
+ logger_js_1.default.warn({ sessionName }, 'Session gone, stopping pipe rebind');
312
+ this.errorAllSubscribers(sessionName, new Error('Session no longer exists'));
313
+ return;
314
+ }
315
+ logger_js_1.default.info({ sessionName, attempt }, 'Rebinding pipe-pane stream');
316
+ await this.startPipe(sessionName, attempt);
317
+ }, delay);
318
+ this.retryTimers.set(sessionName, timer);
319
+ }
320
+ // ── Raw data handling ───────────────────────────────────────────────────────
321
+ onRawData(sessionName, data) {
322
+ const hasStructuredWatcher = (0, jsonl_watcher_js_1.isWatching)(sessionName) || (0, codex_watcher_js_1.isWatching)(sessionName);
323
+ // Idle detection: skip for sessions with a structured watcher (CC/Codex).
324
+ // Those sessions get authoritative idle/running signals via hooks and JSONL events,
325
+ // so raw bytes (cursor blink, prompt redraws) must not cause spurious oscillation.
326
+ if (!hasStructuredWatcher) {
327
+ const wasIdle = this.idleState.get(sessionName) ?? false;
328
+ this.lastRawAt.set(sessionName, Date.now());
329
+ if (wasIdle) {
330
+ this.idleState.set(sessionName, false);
331
+ timeline_emitter_js_1.timelineEmitter.emit(sessionName, 'session.state', { state: 'running' });
332
+ }
333
+ this.resetIdleTimer(sessionName);
334
+ }
335
+ // Text extraction — skip if a structured watcher is active (higher quality source),
336
+ // or if this is a sub-session (deck_sub_*): sub-sessions always use JSONL or TerminalView,
337
+ // never terminal-parse for chat timeline events. This prevents garbled output during
338
+ // the window between daemon restart and the codex watcher being re-established.
339
+ const isSubSession = sessionName.startsWith('deck_sub_');
340
+ if (!hasStructuredWatcher && !isSubSession) {
341
+ (0, terminal_parser_js_1.processRawPtyData)(sessionName, data);
342
+ }
343
+ // Forward to subscribers
344
+ const subs = this.subscribers.get(sessionName);
345
+ if (!subs)
346
+ return;
347
+ for (const [sub, state] of subs) {
348
+ if (state.snapshotPending) {
349
+ // Buffer raw bytes while snapshot is pending
350
+ state.rawBuffer.push(data);
351
+ state.rawBufferBytes += data.length;
352
+ if (state.rawBufferBytes > MAX_RAW_BUFFER) {
353
+ this.failSubscriber(sessionName, sub, state);
354
+ }
355
+ }
356
+ else {
357
+ try {
358
+ sub.sendRaw?.(data);
359
+ }
360
+ catch (err) {
361
+ sub.onError?.(err instanceof Error ? err : new Error(String(err)));
362
+ this.removeSubscriber(sessionName, sub);
363
+ }
364
+ }
365
+ }
366
+ }
367
+ failSubscriber(sessionName, sub, state) {
368
+ // Discard buffer and remove subscriber
369
+ state.rawBuffer = [];
370
+ state.rawBufferBytes = 0;
371
+ this.removeSubscriber(sessionName, sub);
372
+ // Notify client to reset and resubscribe
373
+ try {
374
+ sub.sendControl?.({ type: 'terminal.stream_reset', session: sessionName, reason: 'raw_buffer_overflow' });
375
+ }
376
+ catch {
377
+ sub.onError?.(new Error('raw_buffer_overflow'));
378
+ }
379
+ }
380
+ removeSubscriber(sessionName, sub) {
381
+ const subs = this.subscribers.get(sessionName);
382
+ if (!subs)
383
+ return;
384
+ subs.delete(sub);
385
+ if (subs.size === 0) {
386
+ this.subscribers.delete(sessionName);
387
+ void this.stopPipe(sessionName);
388
+ this.clearIdleTimer(sessionName);
389
+ this.lastRawAt.delete(sessionName);
390
+ this.idleState.delete(sessionName);
391
+ }
392
+ }
393
+ errorAllSubscribers(sessionName, err) {
394
+ const subs = this.subscribers.get(sessionName);
395
+ if (!subs)
396
+ return;
397
+ for (const [sub] of subs) {
398
+ try {
399
+ sub.onError?.(err);
400
+ }
401
+ catch { /* ignore */ }
402
+ }
403
+ this.subscribers.delete(sessionName);
404
+ void this.stopPipe(sessionName);
405
+ this.clearIdleTimer(sessionName);
406
+ }
407
+ // ── Idle detection ──────────────────────────────────────────────────────────
408
+ resetIdleTimer(sessionName) {
409
+ this.clearIdleTimer(sessionName);
410
+ const timer = setTimeout(() => {
411
+ this.idleTimers.delete(sessionName);
412
+ const currentlyIdle = this.idleState.get(sessionName) ?? false;
413
+ if (!currentlyIdle) {
414
+ this.idleState.set(sessionName, true);
415
+ timeline_emitter_js_1.timelineEmitter.emit(sessionName, 'session.state', { state: 'idle' });
416
+ }
417
+ }, IDLE_THRESHOLD_MS);
418
+ this.idleTimers.set(sessionName, timer);
419
+ }
420
+ clearIdleTimer(sessionName) {
421
+ const timer = this.idleTimers.get(sessionName);
422
+ if (timer) {
423
+ clearTimeout(timer);
424
+ this.idleTimers.delete(sessionName);
425
+ }
426
+ }
427
+ // ── Helpers ─────────────────────────────────────────────────────────────────
428
+ async getSize(sessionName) {
429
+ const cached = this.sizeCache.get(sessionName);
430
+ if (cached && Date.now() - cached.ts < TerminalStreamer.SIZE_CACHE_MS) {
431
+ return { cols: cached.cols, rows: cached.rows };
432
+ }
433
+ try {
434
+ const size = await (0, tmux_js_1.getPaneSize)(sessionName);
435
+ this.sizeCache.set(sessionName, { ...size, ts: Date.now() });
436
+ return size;
437
+ }
438
+ catch {
439
+ return { cols: 80, rows: 24 };
440
+ }
441
+ }
442
+ nextFrameSeq(sessionName) {
443
+ const seq = (this.frameSeqs.get(sessionName) ?? 0) + 1;
444
+ this.frameSeqs.set(sessionName, seq);
445
+ return seq;
446
+ }
447
+ }
448
+ exports.TerminalStreamer = TerminalStreamer;
449
+ // ── Singleton ─────────────────────────────────────────────────────────────────
450
+ exports.terminalStreamer = new TerminalStreamer();
451
+ //# sourceMappingURL=terminal-streamer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-streamer.js","sourceRoot":"","sources":["../../src/daemon/terminal-streamer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Timeline event bus — per-session seq counter, ring buffer, replay.
3
+ * Singleton: import { timelineEmitter } from './timeline-emitter.js'
4
+ */
5
+ import type { TimelineEvent, TimelineEventType, TimelineSource, TimelineConfidence } from './timeline-event.js';
6
+ export declare class TimelineEmitter {
7
+ private seqMap;
8
+ private buffer;
9
+ private handlers;
10
+ /** Track last session.state per session to deduplicate repeated idle events */
11
+ private lastSessionState;
12
+ /** Track recent user.message per session to deduplicate (text → timestamp) */
13
+ private recentUserMsg;
14
+ /** Daemon startup timestamp — changes on restart, used for epoch-based seq continuity */
15
+ readonly epoch: number;
16
+ emit(sessionId: string, type: TimelineEventType, payload: Record<string, unknown>, opts?: {
17
+ source?: TimelineSource;
18
+ confidence?: TimelineConfidence;
19
+ }): TimelineEvent | null;
20
+ on(handler: (e: TimelineEvent) => void): () => void;
21
+ /**
22
+ * Replay events after a given seq for a session.
23
+ * Tries ring buffer first, falls back to file store for older events.
24
+ * Returns { events, truncated } where truncated=true if requested events fell off both buffer and file.
25
+ */
26
+ replay(sessionId: string, afterSeq: number): {
27
+ events: TimelineEvent[];
28
+ truncated: boolean;
29
+ };
30
+ }
31
+ export declare const timelineEmitter: TimelineEmitter;
32
+ //# sourceMappingURL=timeline-emitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline-emitter.d.ts","sourceRoot":"","sources":["../../src/daemon/timeline-emitter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAKhH,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,MAAM,CAAsC;IACpD,OAAO,CAAC,QAAQ,CAAyC;IACzD,+EAA+E;IAC/E,OAAO,CAAC,gBAAgB,CAA6B;IACrD,8EAA8E;IAC9E,OAAO,CAAC,aAAa,CAAmD;IACxE,yFAAyF;IACzF,QAAQ,CAAC,KAAK,SAAc;IAE5B,IAAI,CACF,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,iBAAiB,EACvB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,cAAc,CAAC;QAAC,UAAU,CAAC,EAAE,kBAAkB,CAAA;KAAE,GAClE,aAAa,GAAG,IAAI;IAuDvB,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,GAAG,MAAM,IAAI;IAKnD;;;;OAIG;IACH,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,aAAa,EAAE,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE;CAc7F;AAED,eAAO,MAAM,eAAe,iBAAwB,CAAC"}