@rubytech/create-maxy-code 0.1.40 → 0.1.43

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 (172) hide show
  1. package/package.json +2 -2
  2. package/payload/platform/lib/mcp-stderr-tee/package.json +7 -0
  3. package/payload/platform/plugins/admin/hooks/turn-completed-graph-write.sh +142 -52
  4. package/payload/platform/plugins/docs/references/deployment.md +6 -0
  5. package/payload/platform/plugins/docs/references/platform.md +18 -4
  6. package/payload/platform/plugins/docs/references/plugins-guide.md +2 -0
  7. package/payload/platform/scripts/check-no-esm-require.mjs +132 -0
  8. package/payload/platform/scripts/smoke-boot-services.sh +175 -0
  9. package/payload/platform/services/claude-session-manager/dist/config.d.ts +17 -0
  10. package/payload/platform/services/claude-session-manager/dist/config.d.ts.map +1 -1
  11. package/payload/platform/services/claude-session-manager/dist/config.js +31 -0
  12. package/payload/platform/services/claude-session-manager/dist/config.js.map +1 -1
  13. package/payload/platform/services/claude-session-manager/dist/fs-watcher.d.ts +63 -0
  14. package/payload/platform/services/claude-session-manager/dist/fs-watcher.d.ts.map +1 -0
  15. package/payload/platform/services/claude-session-manager/dist/fs-watcher.js +514 -0
  16. package/payload/platform/services/claude-session-manager/dist/fs-watcher.js.map +1 -0
  17. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts +3 -1
  18. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  19. package/payload/platform/services/claude-session-manager/dist/http-server.js +364 -204
  20. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  21. package/payload/platform/services/claude-session-manager/dist/index.js +38 -11
  22. package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
  23. package/payload/platform/services/claude-session-manager/dist/jsonl-path.d.ts +2 -0
  24. package/payload/platform/services/claude-session-manager/dist/jsonl-path.d.ts.map +1 -1
  25. package/payload/platform/services/claude-session-manager/dist/jsonl-path.js +11 -6
  26. package/payload/platform/services/claude-session-manager/dist/jsonl-path.js.map +1 -1
  27. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts +37 -44
  28. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
  29. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +136 -159
  30. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
  31. package/payload/platform/services/claude-session-manager/dist/reaper.d.ts +24 -0
  32. package/payload/platform/services/claude-session-manager/dist/reaper.d.ts.map +1 -0
  33. package/payload/platform/services/claude-session-manager/dist/reaper.js +114 -0
  34. package/payload/platform/services/claude-session-manager/dist/reaper.js.map +1 -0
  35. package/payload/platform/services/claude-session-manager/dist/session-store.d.ts +16 -41
  36. package/payload/platform/services/claude-session-manager/dist/session-store.d.ts.map +1 -1
  37. package/payload/platform/services/claude-session-manager/dist/session-store.js +29 -68
  38. package/payload/platform/services/claude-session-manager/dist/session-store.js.map +1 -1
  39. package/payload/premium-plugins/real-agent/lib/mcp-stderr-tee/dist/index.d.ts +51 -0
  40. package/payload/premium-plugins/real-agent/lib/mcp-stderr-tee/dist/index.d.ts.map +1 -0
  41. package/payload/premium-plugins/real-agent/lib/mcp-stderr-tee/dist/index.js +196 -0
  42. package/payload/premium-plugins/real-agent/lib/mcp-stderr-tee/dist/index.js.map +1 -0
  43. package/payload/premium-plugins/real-agent/lib/mcp-stderr-tee/package.json +7 -0
  44. package/payload/server/public/assets/{admin-DO9W2D9g.js → admin-CzJDs5FQ.js} +24 -24
  45. package/payload/server/public/assets/{arc-DMDAZHAN.js → arc-aUiRP9AS.js} +1 -1
  46. package/payload/server/public/assets/architecture-YZFGNWBL--v-pJPNp.js +1 -0
  47. package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-BbLtk_k6.js → architectureDiagram-Q4EWVU46-DJvcnhtT.js} +1 -1
  48. package/payload/server/public/assets/{blockDiagram-DXYQGD6D-B9IgcgeJ.js → blockDiagram-DXYQGD6D-_vt7n9ql.js} +1 -1
  49. package/payload/server/public/assets/{brand-DQrOw38P.css → brand-DNSV7-vn.css} +1 -1
  50. package/payload/server/public/assets/{brand-Bky-hMVw.js → brand-FZ59T8pI.js} +1 -1
  51. package/payload/server/public/assets/{c4Diagram-AHTNJAMY-BrvPS09f.js → c4Diagram-AHTNJAMY-CdEo9QqN.js} +1 -1
  52. package/payload/server/public/assets/channel-DzmCBQ_9.js +1 -0
  53. package/payload/server/public/assets/{chunk-2KRD3SAO-Di4bO8ir.js → chunk-2KRD3SAO-BK3470lx.js} +1 -1
  54. package/payload/server/public/assets/chunk-336JU56O-JmuLOuir.js +2 -0
  55. package/payload/server/public/assets/chunk-426QAEUC-10f8pXpz.js +1 -0
  56. package/payload/server/public/assets/{chunk-4BX2VUAB-DyEhFk-Z.js → chunk-4BX2VUAB-BOvVdJLf.js} +1 -1
  57. package/payload/server/public/assets/{chunk-4TB4RGXK-D7_xc8xf.js → chunk-4TB4RGXK-DajMd0ug.js} +1 -1
  58. package/payload/server/public/assets/{chunk-55IACEB6-BRJOZLpU.js → chunk-55IACEB6-BwZyF7vR.js} +1 -1
  59. package/payload/server/public/assets/{chunk-5FUZZQ4R-CdCSpb8j.js → chunk-5FUZZQ4R-B4A-XUHI.js} +1 -1
  60. package/payload/server/public/assets/{chunk-5PVQY5BW-BVgnD9QR.js → chunk-5PVQY5BW-BNM3rT14.js} +1 -1
  61. package/payload/server/public/assets/{chunk-67CJDMHE-BG6-9r6c.js → chunk-67CJDMHE-D5bhMrtY.js} +1 -1
  62. package/payload/server/public/assets/{chunk-7N4EOEYR-BvMbitX7.js → chunk-7N4EOEYR-Si7Lgrwc.js} +1 -1
  63. package/payload/server/public/assets/{chunk-AA7GKIK3-CE8mGBD5.js → chunk-AA7GKIK3-DMuHtDqO.js} +1 -1
  64. package/payload/server/public/assets/{chunk-BSJP7CBP-DP7LTBll.js → chunk-BSJP7CBP-L79XKVcb.js} +1 -1
  65. package/payload/server/public/assets/{chunk-CIAEETIT-VfnIdN-h.js → chunk-CIAEETIT-C0O7Upmg.js} +1 -1
  66. package/payload/server/public/assets/{chunk-EDXVE4YY-CYrT1Tom.js → chunk-EDXVE4YY-atMwO81K.js} +1 -1
  67. package/payload/server/public/assets/{chunk-ENJZ2VHE-B70d0jN7.js → chunk-ENJZ2VHE-BUbZv2Nz.js} +1 -1
  68. package/payload/server/public/assets/{chunk-FMBD7UC4-w-yBZsN2.js → chunk-FMBD7UC4-C_E43NFJ.js} +1 -1
  69. package/payload/server/public/assets/{chunk-FOC6F5B3-f9cFywhd.js → chunk-FOC6F5B3-D9lWWHAu.js} +1 -1
  70. package/payload/server/public/assets/{chunk-ICPOFSXX-BcLouRbd.js → chunk-ICPOFSXX-BMF-eWHb.js} +2 -2
  71. package/payload/server/public/assets/{chunk-K5T4RW27-B_ZUrFUq.js → chunk-K5T4RW27-DuhsNH4c.js} +1 -1
  72. package/payload/server/public/assets/{chunk-KGLVRYIC-CcWTvRlI.js → chunk-KGLVRYIC-B4-A1Abi.js} +1 -1
  73. package/payload/server/public/assets/{chunk-LIHQZDEY-D-5-peQw.js → chunk-LIHQZDEY-BxqgHRgT.js} +1 -1
  74. package/payload/server/public/assets/{chunk-ORNJ4GCN-B4Z5L25I.js → chunk-ORNJ4GCN-DEYQ5WaJ.js} +1 -1
  75. package/payload/server/public/assets/{chunk-OYMX7WX6-C2ja2fPj.js → chunk-OYMX7WX6-BEMDmPTI.js} +1 -1
  76. package/payload/server/public/assets/chunk-QZHKN3VN-Bd-GrQM6.js +1 -0
  77. package/payload/server/public/assets/{chunk-U2HBQHQK-CCjoTpL6.js → chunk-U2HBQHQK-DOM7Y4f1.js} +1 -1
  78. package/payload/server/public/assets/{chunk-X2U36JSP-QIVkp-XR.js → chunk-X2U36JSP-C_uWyW6Y.js} +1 -1
  79. package/payload/server/public/assets/{chunk-XPW4576I-m1Y_r88I.js → chunk-XPW4576I-CBfZXZDB.js} +1 -1
  80. package/payload/server/public/assets/{chunk-YZCP3GAM-qD9rebhx.js → chunk-YZCP3GAM-DQbgl47k.js} +1 -1
  81. package/payload/server/public/assets/{chunk-ZZ45TVLE-C0J_f05H.js → chunk-ZZ45TVLE-C44DEAgq.js} +1 -1
  82. package/payload/server/public/assets/classDiagram-6PBFFD2Q-DVoOmecn.js +1 -0
  83. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-B0r3hpf9.js +1 -0
  84. package/payload/server/public/assets/clone-Dde30M8J.js +1 -0
  85. package/payload/server/public/assets/{cose-bilkent-S5V4N54A-BhtgY3T7.js → cose-bilkent-S5V4N54A-Br2gjtEO.js} +1 -1
  86. package/payload/server/public/assets/{dagre-KV5264BT-C8lVFO5U.js → dagre-KV5264BT-CE3meBlZ.js} +1 -1
  87. package/payload/server/public/assets/{dagre-B3cA7jId.js → dagre-lNEvWLDX.js} +1 -1
  88. package/payload/server/public/assets/data-DW6QAnMD.js +1 -0
  89. package/payload/server/public/assets/{device-url-actions-qu2-XiHc.js → device-url-actions-a6Bd-MRk.js} +1 -1
  90. package/payload/server/public/assets/{diagram-5BDNPKRD-BYkcTelK.js → diagram-5BDNPKRD-BqR72jWu.js} +1 -1
  91. package/payload/server/public/assets/{diagram-G4DWMVQ6-B6f_WR4j.js → diagram-G4DWMVQ6-DOjamNAP.js} +1 -1
  92. package/payload/server/public/assets/{diagram-MMDJMWI5-ALaKcN6w.js → diagram-MMDJMWI5-DAUB-aPu.js} +1 -1
  93. package/payload/server/public/assets/{diagram-TYMM5635-CkVg3crF.js → diagram-TYMM5635-DpToW00F.js} +1 -1
  94. package/payload/server/public/assets/{erDiagram-SMLLAGMA-DszlTGIQ.js → erDiagram-SMLLAGMA-C-p2ze2T.js} +1 -1
  95. package/payload/server/public/assets/{flatten-BsWEYbBB.js → flatten-Bo6YRmWl.js} +1 -1
  96. package/payload/server/public/assets/{flowDiagram-DWJPFMVM-C9-FqSlk.js → flowDiagram-DWJPFMVM-B9SS6a8F.js} +1 -1
  97. package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-faJU-5Zy.js → ganttDiagram-T4ZO3ILL-DnXZX0Gp.js} +1 -1
  98. package/payload/server/public/assets/gitGraph-7Q5UKJZL-CI0s_tqn.js +1 -0
  99. package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-Cck8_tiG.js → gitGraphDiagram-UUTBAWPF-CtQ0FzPg.js} +1 -1
  100. package/payload/server/public/assets/graph-D13IJB3w.js +1 -0
  101. package/payload/server/public/assets/graph-labels-CI9WmEiE.js +1 -0
  102. package/payload/server/public/assets/{graphlib-CYRxeBXj.js → graphlib-nUaDKzkp.js} +1 -1
  103. package/payload/server/public/assets/info-OMHHGYJF-g3gYW7Qm.js +1 -0
  104. package/payload/server/public/assets/infoDiagram-42DDH7IO-c2wWbEaX.js +2 -0
  105. package/payload/server/public/assets/{isEmpty-BWl67LAZ.js → isEmpty-D6Kr-M1M.js} +1 -1
  106. package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-nSIaVXdw.js → ishikawaDiagram-UXIWVN3A-BBOgnjrU.js} +1 -1
  107. package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-DuKq7d3g.js → journeyDiagram-VCZTEJTY-DzIkOZor.js} +1 -1
  108. package/payload/server/public/assets/{kanban-definition-6JOO6SKY-Bt5xqHfY.js → kanban-definition-6JOO6SKY-NoAdbB_E.js} +1 -1
  109. package/payload/server/public/assets/{line-BgV8qCP_.js → line-BRK1p00q.js} +1 -1
  110. package/payload/server/public/assets/{linear-0O14Y6uf.js → linear-DOh_6k2k.js} +1 -1
  111. package/payload/server/public/assets/{mermaid-parser.core-DQzl__pY.js → mermaid-parser.core-Bm0OvYTL.js} +2 -2
  112. package/payload/server/public/assets/{mermaid.core-BAPEOjwh.js → mermaid.core-CTznq93v.js} +3 -3
  113. package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-CmMBrI79.js → mindmap-definition-QFDTVHPH-BOQ1enWi.js} +1 -1
  114. package/payload/server/public/assets/{ordinal-krseTxxN.js → ordinal-BDi6f4xk.js} +1 -1
  115. package/payload/server/public/assets/packet-4T2RLAQJ-CT0TB9HI.js +1 -0
  116. package/payload/server/public/assets/{page-BoDdtGsH.js → page-BLNJpxTT.js} +2 -2
  117. package/payload/server/public/assets/{page-D_NCNi5j.js → page-Dn3gASQM.js} +1 -1
  118. package/payload/server/public/assets/pie-ZZUOXDRM-CXLe7TFF.js +1 -0
  119. package/payload/server/public/assets/{pieDiagram-DEJITSTG-BhsR9k6j.js → pieDiagram-DEJITSTG-2S-XHkal.js} +1 -1
  120. package/payload/server/public/assets/{public-DCcGKIMW.js → public-D0z7BALL.js} +5 -5
  121. package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-DSKV6d_A.js → quadrantDiagram-34T5L4WZ-CncZqXXr.js} +1 -1
  122. package/payload/server/public/assets/radar-PYXPWWZC-DnPLBl-D.js +1 -0
  123. package/payload/server/public/assets/{reduce-tk-xY6Fv.js → reduce-CGi9ik8i.js} +1 -1
  124. package/payload/server/public/assets/{requirementDiagram-MS252O5E-BccM48AI.js → requirementDiagram-MS252O5E-CPeWs9fs.js} +1 -1
  125. package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-C0pxiQfn.js → sankeyDiagram-XADWPNL6-A4_669ey.js} +1 -1
  126. package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-BVsUIJsW.js → sequenceDiagram-FGHM5R23-DD-qEurY.js} +1 -1
  127. package/payload/server/public/assets/{stateDiagram-FHFEXIEX-lqYQZ-F1.js → stateDiagram-FHFEXIEX-CdO6Mw_T.js} +1 -1
  128. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-D28bJZnf.js +1 -0
  129. package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-D-LxYOHq.js → timeline-definition-GMOUNBTQ-JH65fN1V.js} +1 -1
  130. package/payload/server/public/assets/treeView-SZITEDCU-C3cb7Xwe.js +1 -0
  131. package/payload/server/public/assets/treemap-W4RFUUIX-Dc7G3Bgm.js +1 -0
  132. package/payload/server/public/assets/{vennDiagram-DHZGUBPP-BNHzvNba.js → vennDiagram-DHZGUBPP-CJLoNrBL.js} +1 -1
  133. package/payload/server/public/assets/wardley-RL74JXVD-DtgibWAt.js +1 -0
  134. package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-BfXR9l5s.js → wardleyDiagram-NUSXRM2D-BgM9eEf7.js} +1 -1
  135. package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-CL7mVEbT.js → xychartDiagram-5P7HB3ND-DCmesmc9.js} +1 -1
  136. package/payload/server/public/data.html +5 -5
  137. package/payload/server/public/graph.html +5 -6
  138. package/payload/server/public/index.html +7 -8
  139. package/payload/server/public/public.html +4 -5
  140. package/payload/server/server.js +94 -4
  141. package/payload/server/public/assets/Checkbox-6lLDKzMP.js +0 -1
  142. package/payload/server/public/assets/architecture-YZFGNWBL-COhEvUpo.js +0 -1
  143. package/payload/server/public/assets/channel-Bmc1qlCD.js +0 -1
  144. package/payload/server/public/assets/chunk-336JU56O-DXOr0ZnC.js +0 -2
  145. package/payload/server/public/assets/chunk-426QAEUC-BFW4zwrV.js +0 -1
  146. package/payload/server/public/assets/chunk-QZHKN3VN-CWh_0JsP.js +0 -1
  147. package/payload/server/public/assets/classDiagram-6PBFFD2Q-RVZorqSk.js +0 -1
  148. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-BEZem5bl.js +0 -1
  149. package/payload/server/public/assets/clone-B6eXIhiR.js +0 -1
  150. package/payload/server/public/assets/data-BaSmBQ7U.js +0 -1
  151. package/payload/server/public/assets/gitGraph-7Q5UKJZL-DeTNsAO0.js +0 -1
  152. package/payload/server/public/assets/graph-labels-COhLbJD0.js +0 -1
  153. package/payload/server/public/assets/graph-qg6fkRyC.js +0 -1
  154. package/payload/server/public/assets/info-OMHHGYJF-DJJ9GlS6.js +0 -1
  155. package/payload/server/public/assets/infoDiagram-42DDH7IO-CLjEjhJX.js +0 -2
  156. package/payload/server/public/assets/packet-4T2RLAQJ-CGbvGkvF.js +0 -1
  157. package/payload/server/public/assets/pie-ZZUOXDRM-BZy8rjFn.js +0 -1
  158. package/payload/server/public/assets/radar-PYXPWWZC-DcfWIVXr.js +0 -1
  159. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-D2eHThhC.js +0 -1
  160. package/payload/server/public/assets/treeView-SZITEDCU-3WugwVdj.js +0 -1
  161. package/payload/server/public/assets/treemap-W4RFUUIX-Cf5mDLlu.js +0 -1
  162. package/payload/server/public/assets/wardley-RL74JXVD-Bv4md4b3.js +0 -1
  163. /package/payload/server/public/assets/{_baseFor-BHtDrjIo.js → _baseFor-Cam2PbSt.js} +0 -0
  164. /package/payload/server/public/assets/{array-DetWRiSa.js → array-DYRGGQae.js} +0 -0
  165. /package/payload/server/public/assets/{cytoscape.esm-C9yNhe1u.js → cytoscape.esm-nWsJMTNI.js} +0 -0
  166. /package/payload/server/public/assets/{defaultLocale-_WRwicXn.js → defaultLocale-Du1XY3Dp.js} +0 -0
  167. /package/payload/server/public/assets/{dist-Bd4S37oi.js → dist-BzAsli7o.js} +0 -0
  168. /package/payload/server/public/assets/{init-sTEcj9YX.js → init-B5BXBRcm.js} +0 -0
  169. /package/payload/server/public/assets/{katex-s61Rgv6l.js → katex-HOUACuRw.js} +0 -0
  170. /package/payload/server/public/assets/{path-B0Ik7Tu9.js → path-CNO468J-.js} +0 -0
  171. /package/payload/server/public/assets/{rough.esm-DKRO8IF-.js → rough.esm-DRO6hWPh.js} +0 -0
  172. /package/payload/server/public/assets/{src-B6XdH6xq.js → src-CWiyyVfn.js} +0 -0
@@ -0,0 +1,514 @@
1
+ // Filesystem watcher — single source of truth for the manager's row index.
2
+ //
3
+ // Two directories are watched continuously:
4
+ //
5
+ // ${CLAUDE_CONFIG_DIR}/sessions/<pid>.json — written by Claude Code at PTY
6
+ // launch for entrypoint=cli. Carries sessionId, bridgeSessionId, agent,
7
+ // status, cwd, updatedAt directly. Created at process init, refreshed on
8
+ // status/agent change, deleted when the process exits cleanly.
9
+ //
10
+ // ${CLAUDE_CONFIG_DIR}/projects/<slug>/<sessionId>.jsonl — written on the
11
+ // first operator turn; persists after process exit as the audit
12
+ // transcript.
13
+ //
14
+ // The watcher unifies the two surfaces into one row indexed by the intrinsic
15
+ // `sessionId` (the UUID Claude Code mints, identical to the JSONL basename).
16
+ // PID-file events drive the live half of the lifecycle; JSONL events drive
17
+ // the archived half. A row exists whenever EITHER file exists.
18
+ //
19
+ // Boot sequence is sync-then-arm: bootSeed() reads both directories
20
+ // synchronously and rebuilds the in-memory index before arm() turns on the
21
+ // fs.watch handlers. Without this ordering, watch events fire before the
22
+ // seed completes and either land before any subscriber attaches (silent
23
+ // drop) or race with seed inserts (double-emit). The deterministic order
24
+ // also lets the manager survive restarts mid-session — a long-lived PTY's
25
+ // PID file is already on disk when the manager comes back up.
26
+ //
27
+ // Per-file 200 ms debounce coalesces the burst of MODIFY events Claude Code
28
+ // emits when the PID file is rewritten (write-temp-rename is two events
29
+ // from fs.watch's perspective on macOS, more on Linux), and folds the
30
+ // CREATE→MODIFY pair an editor-style writer can emit.
31
+ //
32
+ // Identifiers carried on every row:
33
+ // - sessionId (canonical, never null)
34
+ // - bridgeSessionId ("session_<suffix>" form, null for entrypoint=cli
35
+ // rows that have not yet written URL-bound state)
36
+ // - bridgeSuffix ("<suffix>" — derived; bridgeSessionId minus the
37
+ // "session_" prefix)
38
+ // - pid (null on archived JSONL-only rows)
39
+ // The store/HTTP layer resolves an inbound id against all four keys so a
40
+ // caller holding any one of them resolves to the same row.
41
+ import { existsSync, mkdirSync, openSync, closeSync, readSync, readFileSync, readdirSync, statSync, watch } from 'node:fs';
42
+ import { join } from 'node:path';
43
+ const DEBOUNCE_MS = 200;
44
+ // First `agent-setting` record sits near the JSONL head (Claude Code writes
45
+ // it after env+meta, before the first user turn). 32 KiB is enough to cover
46
+ // the prologue with margin.
47
+ const JSONL_HEAD_READ_BYTES = 32 * 1024;
48
+ /** Scan the first JSONL_HEAD_READ_BYTES of a transcript for the first
49
+ * `{"type":"agent-setting","agentSetting":"<name>"}` record. Returns the
50
+ * agent name, or null when no record is found (operator-driven session)
51
+ * or the file is unreadable. */
52
+ function readAgentSettingFromJsonl(path) {
53
+ let fd;
54
+ try {
55
+ fd = openSync(path, 'r');
56
+ }
57
+ catch {
58
+ return null;
59
+ }
60
+ try {
61
+ const buf = Buffer.alloc(JSONL_HEAD_READ_BYTES);
62
+ const n = readSync(fd, buf, 0, JSONL_HEAD_READ_BYTES, 0);
63
+ const head = buf.toString('utf8', 0, n);
64
+ const newlineIdx = head.lastIndexOf('\n');
65
+ const scannable = newlineIdx === -1 ? head : head.slice(0, newlineIdx);
66
+ for (const line of scannable.split('\n')) {
67
+ if (!line.includes('"agent-setting"'))
68
+ continue;
69
+ try {
70
+ const obj = JSON.parse(line);
71
+ if (obj.type !== 'agent-setting')
72
+ continue;
73
+ if (typeof obj.agentSetting !== 'string' || obj.agentSetting.length === 0)
74
+ continue;
75
+ return obj.agentSetting;
76
+ }
77
+ catch {
78
+ // Malformed line — keep scanning.
79
+ }
80
+ }
81
+ return null;
82
+ }
83
+ finally {
84
+ try {
85
+ closeSync(fd);
86
+ }
87
+ catch { /* ignore */ }
88
+ }
89
+ }
90
+ function parsePidFile(path) {
91
+ let raw;
92
+ try {
93
+ raw = readFileSync(path, 'utf8');
94
+ }
95
+ catch {
96
+ return null;
97
+ }
98
+ if (!raw)
99
+ return null;
100
+ let parsed;
101
+ try {
102
+ parsed = JSON.parse(raw);
103
+ }
104
+ catch {
105
+ return null;
106
+ }
107
+ const sessionId = typeof parsed.sessionId === 'string' ? parsed.sessionId : '';
108
+ const pid = typeof parsed.pid === 'number' ? parsed.pid : null;
109
+ if (!sessionId || pid === null)
110
+ return null;
111
+ const bridgeSessionId = typeof parsed.bridgeSessionId === 'string' ? parsed.bridgeSessionId : null;
112
+ const bridgeSuffix = bridgeSessionId ? bridgeSessionId.replace(/^session_/, '') : null;
113
+ const agent = typeof parsed.agent === 'string' ? parsed.agent : null;
114
+ const cwd = typeof parsed.cwd === 'string' ? parsed.cwd : null;
115
+ const rawStatus = typeof parsed.status === 'string' ? parsed.status : '';
116
+ const status = rawStatus === 'busy' ? 'busy' : 'idle';
117
+ const updatedAt = typeof parsed.updatedAt === 'number'
118
+ ? parsed.updatedAt
119
+ : typeof parsed.startedAt === 'number'
120
+ ? parsed.startedAt
121
+ : 0;
122
+ return {
123
+ sessionId,
124
+ bridgeSessionId,
125
+ bridgeSuffix,
126
+ agent,
127
+ cachedAgentSetting: null,
128
+ cwd,
129
+ pid,
130
+ jsonlPath: null,
131
+ pidFilePath: path,
132
+ state: 'live',
133
+ status,
134
+ updatedAt,
135
+ };
136
+ }
137
+ export function createFsWatcher(opts) {
138
+ const { sessionsDir, projectsDir, logger } = opts;
139
+ // Canonical store keyed on sessionId. Secondary maps re-derived from the
140
+ // canonical row so a removeRow drops every key in one shot.
141
+ const rowsBySessionId = new Map();
142
+ const sessionIdByPid = new Map();
143
+ const sessionIdByBridgeSuffix = new Map();
144
+ const sessionIdByPidFilePath = new Map();
145
+ const subscribers = new Set();
146
+ const pidWaiters = new Map();
147
+ const debounceTimers = new Map();
148
+ let pidWatcher = null;
149
+ let jsonlWatcher = null;
150
+ let armed = false;
151
+ let seeded = false;
152
+ function emit(event) {
153
+ logger(`[fs-watcher] event=${event.kind} kind=${event.source} sessionId=${event.sessionId} ` +
154
+ `bridgeSessionId=${event.row?.bridgeSessionId ?? 'none'} agent=${event.row?.agent ?? 'none'} ` +
155
+ `status=${event.row?.status ?? 'gone'} path=${event.row?.[event.source === 'pid' ? 'pidFilePath' : 'jsonlPath'] ?? 'none'}`);
156
+ for (const sub of subscribers) {
157
+ try {
158
+ sub(event);
159
+ }
160
+ catch (err) {
161
+ logger(`[fs-watcher] subscriber-error message=${err instanceof Error ? err.message : String(err)}`);
162
+ }
163
+ }
164
+ // Drain PID waiters when the event carries a pid.
165
+ if (event.kind !== 'delete' && event.row && event.row.pid !== null) {
166
+ const waiter = pidWaiters.get(event.row.pid);
167
+ if (waiter) {
168
+ clearTimeout(waiter.timer);
169
+ pidWaiters.delete(event.row.pid);
170
+ waiter.resolve(event.row);
171
+ }
172
+ }
173
+ }
174
+ function indexRow(row) {
175
+ rowsBySessionId.set(row.sessionId, row);
176
+ if (row.pid !== null)
177
+ sessionIdByPid.set(row.pid, row.sessionId);
178
+ if (row.bridgeSuffix)
179
+ sessionIdByBridgeSuffix.set(row.bridgeSuffix, row.sessionId);
180
+ if (row.pidFilePath)
181
+ sessionIdByPidFilePath.set(row.pidFilePath, row.sessionId);
182
+ }
183
+ function unindexRow(row) {
184
+ rowsBySessionId.delete(row.sessionId);
185
+ if (row.pid !== null)
186
+ sessionIdByPid.delete(row.pid);
187
+ if (row.bridgeSuffix)
188
+ sessionIdByBridgeSuffix.delete(row.bridgeSuffix);
189
+ if (row.pidFilePath)
190
+ sessionIdByPidFilePath.delete(row.pidFilePath);
191
+ }
192
+ function jsonlPathFor(sessionId) {
193
+ return join(projectsDir, `${sessionId}.jsonl`);
194
+ }
195
+ /** Apply the current on-disk state for one PID-file path to the index.
196
+ * Reads the file if present, merges with any existing row (by sessionId),
197
+ * or removes the row when the file is gone. Emits create/modify/delete. */
198
+ function reconcilePidFile(path) {
199
+ const onDisk = existsSync(path);
200
+ const priorSessionId = sessionIdByPidFilePath.get(path);
201
+ if (!onDisk) {
202
+ if (!priorSessionId)
203
+ return;
204
+ const prior = rowsBySessionId.get(priorSessionId);
205
+ if (!prior) {
206
+ sessionIdByPidFilePath.delete(path);
207
+ return;
208
+ }
209
+ // PID file gone. If JSONL still exists, demote row to archived;
210
+ // else drop it entirely.
211
+ const jsonlPath = prior.jsonlPath ?? jsonlPathFor(prior.sessionId);
212
+ if (existsSync(jsonlPath)) {
213
+ // Cache agent identity from JSONL head before the PID file is
214
+ // forgotten. `agent` on a live row comes from the PID file
215
+ // (`--agent <name>`); after demote it's null, so without this
216
+ // cache the UI would lose the specialist label.
217
+ const cachedAgentSetting = prior.cachedAgentSetting
218
+ ?? readAgentSettingFromJsonl(jsonlPath);
219
+ const updated = {
220
+ ...prior,
221
+ pid: null,
222
+ pidFilePath: null,
223
+ state: 'archived',
224
+ status: 'gone',
225
+ cachedAgentSetting,
226
+ jsonlPath,
227
+ };
228
+ unindexRow(prior);
229
+ indexRow(updated);
230
+ emit({ kind: 'delete', source: 'pid', row: updated, sessionId: updated.sessionId });
231
+ emit({ kind: 'modify', source: 'jsonl', row: updated, sessionId: updated.sessionId });
232
+ return;
233
+ }
234
+ unindexRow(prior);
235
+ emit({ kind: 'delete', source: 'pid', row: null, sessionId: prior.sessionId });
236
+ return;
237
+ }
238
+ const parsed = parsePidFile(path);
239
+ if (!parsed)
240
+ return;
241
+ const jsonlPath = jsonlPathFor(parsed.sessionId);
242
+ if (existsSync(jsonlPath))
243
+ parsed.jsonlPath = jsonlPath;
244
+ const prior = rowsBySessionId.get(parsed.sessionId);
245
+ if (!prior) {
246
+ indexRow(parsed);
247
+ emit({ kind: 'create', source: 'pid', row: parsed, sessionId: parsed.sessionId });
248
+ return;
249
+ }
250
+ // Merge: keep jsonlPath from prior if file existed; otherwise from
251
+ // parsed (which already checked disk above).
252
+ const merged = {
253
+ ...prior,
254
+ ...parsed,
255
+ jsonlPath: parsed.jsonlPath ?? prior.jsonlPath,
256
+ };
257
+ unindexRow(prior);
258
+ indexRow(merged);
259
+ emit({ kind: 'modify', source: 'pid', row: merged, sessionId: merged.sessionId });
260
+ }
261
+ function reconcileJsonlFile(path) {
262
+ const onDisk = existsSync(path);
263
+ const fileName = path.slice(path.lastIndexOf('/') + 1);
264
+ if (!fileName.endsWith('.jsonl'))
265
+ return;
266
+ const sessionId = fileName.slice(0, -'.jsonl'.length);
267
+ const prior = rowsBySessionId.get(sessionId);
268
+ if (!onDisk) {
269
+ if (!prior)
270
+ return;
271
+ // JSONL gone. If PID file still present, row stays live but loses
272
+ // transcript; else drop row entirely.
273
+ if (prior.pidFilePath && existsSync(prior.pidFilePath)) {
274
+ const updated = { ...prior, jsonlPath: null };
275
+ rowsBySessionId.set(updated.sessionId, updated);
276
+ emit({ kind: 'delete', source: 'jsonl', row: updated, sessionId });
277
+ return;
278
+ }
279
+ unindexRow(prior);
280
+ emit({ kind: 'delete', source: 'jsonl', row: null, sessionId });
281
+ return;
282
+ }
283
+ if (prior) {
284
+ if (prior.jsonlPath === path) {
285
+ emit({ kind: 'modify', source: 'jsonl', row: prior, sessionId });
286
+ return;
287
+ }
288
+ const updated = { ...prior, jsonlPath: path };
289
+ rowsBySessionId.set(sessionId, updated);
290
+ emit({ kind: 'modify', source: 'jsonl', row: updated, sessionId });
291
+ return;
292
+ }
293
+ // JSONL appeared without a corresponding PID file → archived row.
294
+ const row = {
295
+ sessionId,
296
+ bridgeSessionId: null,
297
+ bridgeSuffix: null,
298
+ agent: null,
299
+ cachedAgentSetting: readAgentSettingFromJsonl(path),
300
+ cwd: null,
301
+ pid: null,
302
+ jsonlPath: path,
303
+ pidFilePath: null,
304
+ state: 'archived',
305
+ status: 'gone',
306
+ updatedAt: (() => {
307
+ try {
308
+ return statSync(path).mtimeMs;
309
+ }
310
+ catch {
311
+ return 0;
312
+ }
313
+ })(),
314
+ };
315
+ indexRow(row);
316
+ emit({ kind: 'create', source: 'jsonl', row, sessionId });
317
+ }
318
+ function schedule(path, reconcile) {
319
+ const prev = debounceTimers.get(path);
320
+ if (prev)
321
+ clearTimeout(prev);
322
+ const t = setTimeout(() => {
323
+ debounceTimers.delete(path);
324
+ try {
325
+ reconcile(path);
326
+ }
327
+ catch (err) {
328
+ logger(`[fs-watcher] reconcile-error path=${path} message=${err instanceof Error ? err.message : String(err)}`);
329
+ }
330
+ }, DEBOUNCE_MS);
331
+ debounceTimers.set(path, t);
332
+ }
333
+ function bootSeed() {
334
+ if (seeded)
335
+ return;
336
+ let pidCount = 0;
337
+ let jsonlCount = 0;
338
+ try {
339
+ for (const entry of readdirSync(sessionsDir, { withFileTypes: true })) {
340
+ if (!entry.isFile() || !entry.name.endsWith('.json'))
341
+ continue;
342
+ const path = join(sessionsDir, entry.name);
343
+ const row = parsePidFile(path);
344
+ if (!row)
345
+ continue;
346
+ const jsonlPath = jsonlPathFor(row.sessionId);
347
+ if (existsSync(jsonlPath))
348
+ row.jsonlPath = jsonlPath;
349
+ indexRow(row);
350
+ pidCount += 1;
351
+ }
352
+ }
353
+ catch {
354
+ // sessionsDir absent — fine. Watcher creates it via mkdir at arm time.
355
+ }
356
+ try {
357
+ for (const entry of readdirSync(projectsDir, { withFileTypes: true })) {
358
+ if (!entry.isFile() || !entry.name.endsWith('.jsonl'))
359
+ continue;
360
+ const sessionId = entry.name.slice(0, -'.jsonl'.length);
361
+ const path = join(projectsDir, entry.name);
362
+ const prior = rowsBySessionId.get(sessionId);
363
+ if (prior) {
364
+ if (prior.jsonlPath !== path) {
365
+ rowsBySessionId.set(sessionId, { ...prior, jsonlPath: path });
366
+ }
367
+ }
368
+ else {
369
+ const row = {
370
+ sessionId,
371
+ bridgeSessionId: null,
372
+ bridgeSuffix: null,
373
+ agent: null,
374
+ cachedAgentSetting: readAgentSettingFromJsonl(path),
375
+ cwd: null,
376
+ pid: null,
377
+ jsonlPath: path,
378
+ pidFilePath: null,
379
+ state: 'archived',
380
+ status: 'gone',
381
+ updatedAt: (() => {
382
+ try {
383
+ return statSync(path).mtimeMs;
384
+ }
385
+ catch {
386
+ return 0;
387
+ }
388
+ })(),
389
+ };
390
+ indexRow(row);
391
+ }
392
+ jsonlCount += 1;
393
+ }
394
+ }
395
+ catch {
396
+ // projectsDir absent on first boot — Claude Code creates it on first
397
+ // transcript write. Watcher's mkdirSync at arm() avoids fs.watch ENOENT.
398
+ }
399
+ seeded = true;
400
+ logger(`[fs-watcher] boot-seed sessions-dir=${pidCount} projects-dir=${jsonlCount} rows=${rowsBySessionId.size}`);
401
+ }
402
+ function arm() {
403
+ if (armed)
404
+ return;
405
+ if (!seeded)
406
+ bootSeed();
407
+ try {
408
+ mkdirSync(sessionsDir, { recursive: true });
409
+ }
410
+ catch { /* best effort */ }
411
+ try {
412
+ mkdirSync(projectsDir, { recursive: true });
413
+ }
414
+ catch { /* best effort */ }
415
+ try {
416
+ pidWatcher = watch(sessionsDir, { persistent: false }, (_event, filename) => {
417
+ if (!filename || !filename.endsWith('.json'))
418
+ return;
419
+ const path = join(sessionsDir, filename);
420
+ schedule(path, reconcilePidFile);
421
+ });
422
+ pidWatcher.on('error', (err) => {
423
+ logger(`[fs-watcher] watch-error dir=${sessionsDir} message=${err instanceof Error ? err.message : String(err)}`);
424
+ });
425
+ }
426
+ catch (err) {
427
+ logger(`[fs-watcher] watch-init-failed dir=${sessionsDir} message=${err instanceof Error ? err.message : String(err)}`);
428
+ }
429
+ try {
430
+ jsonlWatcher = watch(projectsDir, { persistent: false }, (_event, filename) => {
431
+ if (!filename || !filename.endsWith('.jsonl'))
432
+ return;
433
+ const path = join(projectsDir, filename);
434
+ schedule(path, reconcileJsonlFile);
435
+ });
436
+ jsonlWatcher.on('error', (err) => {
437
+ logger(`[fs-watcher] watch-error dir=${projectsDir} message=${err instanceof Error ? err.message : String(err)}`);
438
+ });
439
+ }
440
+ catch (err) {
441
+ logger(`[fs-watcher] watch-init-failed dir=${projectsDir} message=${err instanceof Error ? err.message : String(err)}`);
442
+ }
443
+ armed = true;
444
+ logger(`[fs-watcher] armed sessions-dir=${sessionsDir} projects-dir=${projectsDir}`);
445
+ }
446
+ function subscribe(sub) {
447
+ subscribers.add(sub);
448
+ return () => { subscribers.delete(sub); };
449
+ }
450
+ function getBySessionId(id) {
451
+ return rowsBySessionId.get(id);
452
+ }
453
+ function getByBridgeSessionId(id) {
454
+ const suffix = id.replace(/^session_/, '');
455
+ const sessionId = sessionIdByBridgeSuffix.get(suffix);
456
+ return sessionId ? rowsBySessionId.get(sessionId) : undefined;
457
+ }
458
+ function getByBridgeSuffix(suffix) {
459
+ const sessionId = sessionIdByBridgeSuffix.get(suffix);
460
+ return sessionId ? rowsBySessionId.get(sessionId) : undefined;
461
+ }
462
+ function getByPid(pid) {
463
+ const sessionId = sessionIdByPid.get(pid);
464
+ return sessionId ? rowsBySessionId.get(sessionId) : undefined;
465
+ }
466
+ function all() {
467
+ return [...rowsBySessionId.values()];
468
+ }
469
+ function waitForPid(pid, timeoutMs) {
470
+ const existing = getByPid(pid);
471
+ if (existing)
472
+ return Promise.resolve(existing);
473
+ return new Promise((resolve, reject) => {
474
+ const timer = setTimeout(() => {
475
+ pidWaiters.delete(pid);
476
+ reject(new Error(`fs-watcher waitForPid timed out pid=${pid} ms=${timeoutMs}`));
477
+ }, timeoutMs);
478
+ pidWaiters.set(pid, { resolve, reject, timer });
479
+ });
480
+ }
481
+ function close() {
482
+ if (pidWatcher) {
483
+ pidWatcher.close();
484
+ pidWatcher = null;
485
+ }
486
+ if (jsonlWatcher) {
487
+ jsonlWatcher.close();
488
+ jsonlWatcher = null;
489
+ }
490
+ for (const t of debounceTimers.values())
491
+ clearTimeout(t);
492
+ debounceTimers.clear();
493
+ for (const w of pidWaiters.values()) {
494
+ clearTimeout(w.timer);
495
+ w.reject(new Error('fs-watcher closed'));
496
+ }
497
+ pidWaiters.clear();
498
+ subscribers.clear();
499
+ }
500
+ return {
501
+ bootSeed,
502
+ arm,
503
+ subscribe,
504
+ getBySessionId,
505
+ getByBridgeSessionId,
506
+ getByBridgeSuffix,
507
+ getByPid,
508
+ all,
509
+ waitForPid,
510
+ close,
511
+ __internal: { reconcilePidFile, reconcileJsonlFile },
512
+ };
513
+ }
514
+ //# sourceMappingURL=fs-watcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-watcher.js","sourceRoot":"","sources":["../src/fs-watcher.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,12 @@
1
1
  import { Hono } from 'hono';
2
2
  import type { SessionStore } from './session-store.js';
3
3
  import { type SpawnDeps } from './pty-spawner.js';
4
+ import type { FsWatcher } from './fs-watcher.js';
4
5
  import type { RateLimiter } from './spawn-rate-limiter.js';
5
6
  import type { AuditRegistry } from './public-tool-audit.js';
6
- export interface HttpDeps extends Omit<SpawnDeps, 'store' | 'onJsonlObserved'> {
7
+ export interface HttpDeps extends Omit<SpawnDeps, 'store' | 'onSessionReady' | 'watcher'> {
7
8
  store: SessionStore;
9
+ watcher: FsWatcher;
8
10
  killGraceMs: number;
9
11
  jsonlReadMaxBytes: number;
10
12
  publicSpawnLimiter: RateLimiter;
@@ -1 +1 @@
1
- {"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"AAiCA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAI3B,OAAO,KAAK,EAAE,YAAY,EAAiB,MAAM,oBAAoB,CAAA;AACrE,OAAO,EAA4E,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAK3H,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAkF3D,MAAM,WAAW,QAAS,SAAQ,IAAI,CAAC,SAAS,EAAE,OAAO,GAAG,iBAAiB,CAAC;IAC5E,KAAK,EAAE,YAAY,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,iBAAiB,EAAE,MAAM,CAAA;IACzB,kBAAkB,EAAE,WAAW,CAAA;IAC/B,eAAe,EAAE,aAAa,CAAA;CAC/B;AAiED,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAojBjD"}
1
+ {"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"AAyBA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAI3B,OAAO,KAAK,EAAE,YAAY,EAAiB,MAAM,oBAAoB,CAAA;AACrE,OAAO,EAA0E,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAIzH,OAAO,KAAK,EAAE,SAAS,EAAc,MAAM,iBAAiB,CAAA;AAE5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AA8E3D,MAAM,WAAW,QAAS,SAAQ,IAAI,CAAC,SAAS,EAAE,OAAO,GAAG,gBAAgB,GAAG,SAAS,CAAC;IACvF,KAAK,EAAE,YAAY,CAAA;IACnB,OAAO,EAAE,SAAS,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,iBAAiB,EAAE,MAAM,CAAA;IACzB,kBAAkB,EAAE,WAAW,CAAA;IAC/B,eAAe,EAAE,aAAa,CAAA;CAC/B;AA0DD,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CA0tBjD"}