atoo-studio 0.0.1 → 0.0.2

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 (408) hide show
  1. package/LICENSE +21 -0
  2. package/README.github.md +322 -0
  3. package/README.md +112 -0
  4. package/README.npm.md +112 -0
  5. package/bin/atoo-studio.js +90 -0
  6. package/dist/src/agents/claude-code-terminal/adapter.d.ts +42 -0
  7. package/dist/src/agents/claude-code-terminal/adapter.js +166 -0
  8. package/dist/src/agents/claude-code-terminal/index.d.ts +13 -0
  9. package/dist/src/agents/claude-code-terminal/index.js +45 -0
  10. package/dist/src/agents/claude-code-terminal/spawner.d.ts +9 -0
  11. package/dist/src/agents/claude-code-terminal/spawner.js +37 -0
  12. package/dist/src/agents/claude-code-terminal-chatro/adapter.d.ts +51 -0
  13. package/dist/src/agents/claude-code-terminal-chatro/adapter.js +301 -0
  14. package/dist/src/agents/claude-code-terminal-chatro/index.d.ts +13 -0
  15. package/dist/src/agents/claude-code-terminal-chatro/index.js +45 -0
  16. package/dist/src/agents/claude-code-terminal-chatro/jsonl-watcher.d.ts +67 -0
  17. package/dist/src/agents/claude-code-terminal-chatro/jsonl-watcher.js +431 -0
  18. package/dist/src/agents/claude-code-terminal-chatro/spawner.d.ts +9 -0
  19. package/dist/src/agents/claude-code-terminal-chatro/spawner.js +37 -0
  20. package/dist/src/agents/codex-terminal/adapter.d.ts +40 -0
  21. package/dist/src/agents/codex-terminal/adapter.js +160 -0
  22. package/dist/src/agents/codex-terminal/index.d.ts +13 -0
  23. package/dist/src/agents/codex-terminal/index.js +47 -0
  24. package/dist/src/agents/codex-terminal/spawner.d.ts +9 -0
  25. package/dist/src/agents/codex-terminal/spawner.js +56 -0
  26. package/dist/src/agents/codex-terminal-chatro/adapter.d.ts +58 -0
  27. package/dist/src/agents/codex-terminal-chatro/adapter.js +266 -0
  28. package/dist/src/agents/codex-terminal-chatro/index.d.ts +13 -0
  29. package/dist/src/agents/codex-terminal-chatro/index.js +50 -0
  30. package/dist/src/agents/codex-terminal-chatro/jsonl-watcher.d.ts +36 -0
  31. package/dist/src/agents/codex-terminal-chatro/jsonl-watcher.js +205 -0
  32. package/dist/src/agents/codex-terminal-chatro/spawner.d.ts +9 -0
  33. package/dist/src/agents/codex-terminal-chatro/spawner.js +57 -0
  34. package/dist/src/agents/lib/chain-builder.d.ts +21 -0
  35. package/dist/src/agents/lib/chain-builder.js +139 -0
  36. package/dist/src/agents/lib/claude/fs-sessions.d.ts +31 -0
  37. package/dist/src/agents/lib/claude/fs-sessions.js +329 -0
  38. package/dist/src/agents/lib/claude/jsonl-writer.d.ts +32 -0
  39. package/dist/src/agents/lib/claude/jsonl-writer.js +342 -0
  40. package/dist/src/agents/lib/claude/workspace-trust.d.ts +1 -0
  41. package/dist/src/agents/lib/claude/workspace-trust.js +29 -0
  42. package/dist/src/agents/lib/codex/fs-sessions.d.ts +34 -0
  43. package/dist/src/agents/lib/codex/fs-sessions.js +255 -0
  44. package/dist/src/agents/lib/codex/jsonl-mapper.d.ts +11 -0
  45. package/dist/src/agents/lib/codex/jsonl-mapper.js +154 -0
  46. package/dist/src/agents/lib/codex/jsonl-writer.d.ts +8 -0
  47. package/dist/src/agents/lib/codex/jsonl-writer.js +440 -0
  48. package/dist/src/agents/lib/fs-tracking.d.ts +36 -0
  49. package/dist/src/agents/lib/fs-tracking.js +109 -0
  50. package/dist/src/agents/lib/pty-activity-tracker.d.ts +37 -0
  51. package/dist/src/agents/lib/pty-activity-tracker.js +105 -0
  52. package/dist/src/agents/lib/session-id-utils.d.ts +46 -0
  53. package/dist/src/agents/lib/session-id-utils.js +147 -0
  54. package/dist/src/agents/lib/session-precreate.d.ts +17 -0
  55. package/dist/src/agents/lib/session-precreate.js +177 -0
  56. package/dist/src/agents/registry.d.ts +72 -0
  57. package/dist/src/agents/registry.js +337 -0
  58. package/dist/src/agents/types.d.ts +135 -0
  59. package/dist/src/agents/types.js +1 -0
  60. package/dist/src/auth/crypto-key.d.ts +6 -0
  61. package/dist/src/auth/crypto-key.js +45 -0
  62. package/dist/src/auth/middleware.d.ts +18 -0
  63. package/dist/src/auth/middleware.js +54 -0
  64. package/dist/src/auth/password.d.ts +2 -0
  65. package/dist/src/auth/password.js +12 -0
  66. package/dist/src/auth/session.d.ts +10 -0
  67. package/dist/src/auth/session.js +33 -0
  68. package/dist/src/auth/totp.d.ts +12 -0
  69. package/dist/src/auth/totp.js +61 -0
  70. package/dist/src/auth/webauthn.d.ts +6 -0
  71. package/dist/src/auth/webauthn.js +117 -0
  72. package/dist/src/config.d.ts +10 -0
  73. package/dist/src/config.js +16 -0
  74. package/dist/src/database/connection-manager.d.ts +25 -0
  75. package/dist/src/database/connection-manager.js +211 -0
  76. package/dist/src/database/discovery/container.d.ts +6 -0
  77. package/dist/src/database/discovery/container.js +226 -0
  78. package/dist/src/database/discovery/env-parser.d.ts +9 -0
  79. package/dist/src/database/discovery/env-parser.js +525 -0
  80. package/dist/src/database/discovery/local-files.d.ts +6 -0
  81. package/dist/src/database/discovery/local-files.js +58 -0
  82. package/dist/src/database/discovery/port-scan.d.ts +7 -0
  83. package/dist/src/database/discovery/port-scan.js +61 -0
  84. package/dist/src/database/drivers/cassandra.d.ts +12 -0
  85. package/dist/src/database/drivers/cassandra.js +91 -0
  86. package/dist/src/database/drivers/clickhouse.d.ts +11 -0
  87. package/dist/src/database/drivers/clickhouse.js +127 -0
  88. package/dist/src/database/drivers/elasticsearch.d.ts +12 -0
  89. package/dist/src/database/drivers/elasticsearch.js +169 -0
  90. package/dist/src/database/drivers/influxdb.d.ts +14 -0
  91. package/dist/src/database/drivers/influxdb.js +194 -0
  92. package/dist/src/database/drivers/memcached.d.ts +11 -0
  93. package/dist/src/database/drivers/memcached.js +117 -0
  94. package/dist/src/database/drivers/mongodb.d.ts +12 -0
  95. package/dist/src/database/drivers/mongodb.js +128 -0
  96. package/dist/src/database/drivers/mysql.d.ts +11 -0
  97. package/dist/src/database/drivers/mysql.js +112 -0
  98. package/dist/src/database/drivers/neo4j.d.ts +11 -0
  99. package/dist/src/database/drivers/neo4j.js +158 -0
  100. package/dist/src/database/drivers/postgresql.d.ts +11 -0
  101. package/dist/src/database/drivers/postgresql.js +133 -0
  102. package/dist/src/database/drivers/redis.d.ts +11 -0
  103. package/dist/src/database/drivers/redis.js +91 -0
  104. package/dist/src/database/drivers/sqlite.d.ts +10 -0
  105. package/dist/src/database/drivers/sqlite.js +100 -0
  106. package/dist/src/database/query-stream.d.ts +5 -0
  107. package/dist/src/database/query-stream.js +75 -0
  108. package/dist/src/database/types.d.ts +71 -0
  109. package/dist/src/database/types.js +1 -0
  110. package/dist/src/events/index.d.ts +3 -0
  111. package/dist/src/events/index.js +3 -0
  112. package/dist/src/events/types.d.ts +214 -0
  113. package/dist/src/events/types.js +22 -0
  114. package/dist/src/events/wire.d.ts +114 -0
  115. package/dist/src/events/wire.js +296 -0
  116. package/dist/src/fs-monitor-types.d.ts +24 -0
  117. package/dist/src/fs-monitor-types.js +1 -0
  118. package/dist/src/fs-monitor.d.ts +80 -0
  119. package/dist/src/fs-monitor.js +637 -0
  120. package/dist/src/handlers/auth.d.ts +1 -0
  121. package/dist/src/handlers/auth.js +170 -0
  122. package/dist/src/handlers/changes.d.ts +1 -0
  123. package/dist/src/handlers/changes.js +203 -0
  124. package/dist/src/handlers/containers.d.ts +12 -0
  125. package/dist/src/handlers/containers.js +379 -0
  126. package/dist/src/handlers/databases.d.ts +3 -0
  127. package/dist/src/handlers/databases.js +327 -0
  128. package/dist/src/handlers/environments.d.ts +3 -0
  129. package/dist/src/handlers/environments.js +286 -0
  130. package/dist/src/handlers/github.d.ts +1 -0
  131. package/dist/src/handlers/github.js +153 -0
  132. package/dist/src/handlers/projects.d.ts +1 -0
  133. package/dist/src/handlers/projects.js +895 -0
  134. package/dist/src/handlers/ssh.d.ts +1 -0
  135. package/dist/src/handlers/ssh.js +162 -0
  136. package/dist/src/handlers/users.d.ts +1 -0
  137. package/dist/src/handlers/users.js +195 -0
  138. package/dist/src/index.d.ts +1 -0
  139. package/dist/src/index.js +228 -0
  140. package/dist/src/mcp/config.d.ts +32 -0
  141. package/dist/src/mcp/config.js +227 -0
  142. package/dist/src/mcp/server.d.ts +1 -0
  143. package/dist/src/mcp/server.js +574 -0
  144. package/dist/src/serial/cuse-device.d.ts +19 -0
  145. package/dist/src/serial/cuse-device.js +260 -0
  146. package/dist/src/serial/manager.d.ts +63 -0
  147. package/dist/src/serial/manager.js +206 -0
  148. package/dist/src/serial/pty-pair.d.ts +16 -0
  149. package/dist/src/serial/pty-pair.js +68 -0
  150. package/dist/src/services/fs-browser.d.ts +14 -0
  151. package/dist/src/services/fs-browser.js +98 -0
  152. package/dist/src/services/git-ops.d.ts +78 -0
  153. package/dist/src/services/git-ops.js +288 -0
  154. package/dist/src/services/github-ops.d.ts +104 -0
  155. package/dist/src/services/github-ops.js +192 -0
  156. package/dist/src/services/obfuscation.d.ts +2 -0
  157. package/dist/src/services/obfuscation.js +16 -0
  158. package/dist/src/services/preview/headless-backend.d.ts +62 -0
  159. package/dist/src/services/preview/headless-backend.js +698 -0
  160. package/dist/src/services/preview/injected-scripts.d.ts +9 -0
  161. package/dist/src/services/preview/injected-scripts.js +232 -0
  162. package/dist/src/services/preview/preview-backend.d.ts +92 -0
  163. package/dist/src/services/preview/preview-backend.js +15 -0
  164. package/dist/src/services/preview/universal-setter.d.ts +7 -0
  165. package/dist/src/services/preview/universal-setter.js +46 -0
  166. package/dist/src/services/preview-manager.d.ts +50 -0
  167. package/dist/src/services/preview-manager.js +216 -0
  168. package/dist/src/services/project-watcher.d.ts +6 -0
  169. package/dist/src/services/project-watcher.js +307 -0
  170. package/dist/src/services/remote-fs-browser.d.ts +11 -0
  171. package/dist/src/services/remote-fs-browser.js +50 -0
  172. package/dist/src/services/remote-git-ops.d.ts +71 -0
  173. package/dist/src/services/remote-git-ops.js +215 -0
  174. package/dist/src/services/session-search.d.ts +56 -0
  175. package/dist/src/services/session-search.js +303 -0
  176. package/dist/src/services/ssh-manager.d.ts +44 -0
  177. package/dist/src/services/ssh-manager.js +359 -0
  178. package/dist/src/session-writer.d.ts +9 -0
  179. package/dist/src/session-writer.js +66 -0
  180. package/dist/src/spawner.d.ts +56 -0
  181. package/dist/src/spawner.js +135 -0
  182. package/dist/src/state/db.d.ts +214 -0
  183. package/dist/src/state/db.js +897 -0
  184. package/dist/src/state/store.d.ts +37 -0
  185. package/dist/src/state/store.js +108 -0
  186. package/dist/src/state/types.d.ts +13 -0
  187. package/dist/src/state/types.js +1 -0
  188. package/dist/src/web/devtools-proxy.d.ts +7 -0
  189. package/dist/src/web/devtools-proxy.js +176 -0
  190. package/dist/src/web/port-proxy.d.ts +15 -0
  191. package/dist/src/web/port-proxy.js +124 -0
  192. package/dist/src/web/preview-ws.d.ts +5 -0
  193. package/dist/src/web/preview-ws.js +207 -0
  194. package/dist/src/web/server.d.ts +6 -0
  195. package/dist/src/web/server.js +1694 -0
  196. package/dist/src/ws/agent-ws.d.ts +5 -0
  197. package/dist/src/ws/agent-ws.js +93 -0
  198. package/frontend/dist/assets/_basePickBy-B-LibQ4-.js +1 -0
  199. package/frontend/dist/assets/_baseUniq-CprifHap.js +1 -0
  200. package/frontend/dist/assets/_createAssigner-ByDUqGii.js +1 -0
  201. package/frontend/dist/assets/abap-DuT-3z4x.js +1 -0
  202. package/frontend/dist/assets/addon-fit-CxQet2ja.js +1 -0
  203. package/frontend/dist/assets/addon-web-links-D_jRkPIl.js +1 -0
  204. package/frontend/dist/assets/apex-B-em86xX.js +1 -0
  205. package/frontend/dist/assets/api-SUPuHhSY.js +2 -0
  206. package/frontend/dist/assets/arc-Z0_eVteO.js +1 -0
  207. package/frontend/dist/assets/architecture-PBZL5I3N-hvVXGhqd.js +1 -0
  208. package/frontend/dist/assets/architectureDiagram-2XIMDMQ5-DiHPxX4j.js +36 -0
  209. package/frontend/dist/assets/array-CwG8vNfn.js +1 -0
  210. package/frontend/dist/assets/auth-store-R7eW5SVu.js +1 -0
  211. package/frontend/dist/assets/azcli-Bg9wQloi.js +1 -0
  212. package/frontend/dist/assets/bat-BM46z99L.js +1 -0
  213. package/frontend/dist/assets/bicep-DcBsJUfh.js +2 -0
  214. package/frontend/dist/assets/blockDiagram-WCTKOSBZ-C40u_hLo.js +132 -0
  215. package/frontend/dist/assets/c4Diagram-IC4MRINW-Ct7LjWFQ.js +10 -0
  216. package/frontend/dist/assets/cameligo-zw7JTtim.js +1 -0
  217. package/frontend/dist/assets/channel-ClCsE6HN.js +1 -0
  218. package/frontend/dist/assets/chunk-4BX2VUAB-zZ6P90VO.js +1 -0
  219. package/frontend/dist/assets/chunk-55IACEB6-DXllTDQl.js +1 -0
  220. package/frontend/dist/assets/chunk-7E7YKBS2-7zRaOLjj.js +1 -0
  221. package/frontend/dist/assets/chunk-7R4GIKGN-Csst1274.js +80 -0
  222. package/frontend/dist/assets/chunk-C72U2L5F-_JbQPbLN.js +1 -0
  223. package/frontend/dist/assets/chunk-CFjPhJqf.js +1 -0
  224. package/frontend/dist/assets/chunk-EGIJ26TM-B--aFyPw.js +1 -0
  225. package/frontend/dist/assets/chunk-FMBD7UC4-DVR34RNb.js +15 -0
  226. package/frontend/dist/assets/chunk-GEFDOKGD-CnmN6cC8.js +2 -0
  227. package/frontend/dist/assets/chunk-JSJVCQXG-CWxHBzeJ.js +1 -0
  228. package/frontend/dist/assets/chunk-KX2RTZJC-DkRk56s7.js +1 -0
  229. package/frontend/dist/assets/chunk-KYZI473N-DCCsG2dK.js +53 -0
  230. package/frontend/dist/assets/chunk-L3YUKLVL-C-DkZTMr.js +1 -0
  231. package/frontend/dist/assets/chunk-MX3YWQON-OUdzv5sZ.js +1 -0
  232. package/frontend/dist/assets/chunk-NQ4KR5QH-Bpu9FsM7.js +220 -0
  233. package/frontend/dist/assets/chunk-O4XLMI2P-BMLK6_ib.js +7 -0
  234. package/frontend/dist/assets/chunk-OZEHJAEY-CNNiJtG0.js +1 -0
  235. package/frontend/dist/assets/chunk-PQ6SQG4A-evVHD3KM.js +1 -0
  236. package/frontend/dist/assets/chunk-PU5JKC2W-DPFTYuvl.js +70 -0
  237. package/frontend/dist/assets/chunk-QZHKN3VN-JRdddPvu.js +1 -0
  238. package/frontend/dist/assets/chunk-R5LLSJPH-CHQzVVOV.js +1 -0
  239. package/frontend/dist/assets/chunk-WL4C6EOR-BNFU6IIi.js +189 -0
  240. package/frontend/dist/assets/chunk-XIRO2GV7-98T93G85.js +1 -0
  241. package/frontend/dist/assets/chunk-XZSTWKYB-BcW3cyNp.js +94 -0
  242. package/frontend/dist/assets/chunk-YBOYWFTD-BgKO1qAJ.js +1 -0
  243. package/frontend/dist/assets/classDiagram-VBA2DB6C-DikXzgcD.js +1 -0
  244. package/frontend/dist/assets/classDiagram-v2-RAHNMMFH-D7E3tQUK.js +1 -0
  245. package/frontend/dist/assets/clojure-FspFoNNQ.js +1 -0
  246. package/frontend/dist/assets/clone-mOXuZa7C.js +1 -0
  247. package/frontend/dist/assets/codicon-ngg6Pgfi.ttf +0 -0
  248. package/frontend/dist/assets/coffee-13n8Bk2W.js +1 -0
  249. package/frontend/dist/assets/cose-bilkent-S5V4N54A-zUOWQqLe.js +1 -0
  250. package/frontend/dist/assets/cpp-BVm2xGEs.js +1 -0
  251. package/frontend/dist/assets/csharp-D2kAWmUm.js +1 -0
  252. package/frontend/dist/assets/csp-Ezvgpf0e.js +1 -0
  253. package/frontend/dist/assets/css-CYxRwcFy.js +3 -0
  254. package/frontend/dist/assets/css.worker-Cd5h-ZOL.js +89 -0
  255. package/frontend/dist/assets/cssMode-CrXej49V.js +1 -0
  256. package/frontend/dist/assets/cypher-jg3SGErc.js +1 -0
  257. package/frontend/dist/assets/cytoscape.esm-kyyvzxNV.js +321 -0
  258. package/frontend/dist/assets/dagre-DH4bgZO7.js +1 -0
  259. package/frontend/dist/assets/dagre-KLK3FWXG-DNSqDkwT.js +4 -0
  260. package/frontend/dist/assets/dart-179jqhK4.js +1 -0
  261. package/frontend/dist/assets/defaultLocale-Dda4OpKy.js +1 -0
  262. package/frontend/dist/assets/diagram-E7M64L7V-RqPNT5Vs.js +24 -0
  263. package/frontend/dist/assets/diagram-IFDJBPK2-B-5NRyaE.js +43 -0
  264. package/frontend/dist/assets/diagram-P4PSJMXO-BrP69Hk0.js +24 -0
  265. package/frontend/dist/assets/dist-CU_Nb1G5.js +1 -0
  266. package/frontend/dist/assets/dockerfile-CIAtSGxS.js +1 -0
  267. package/frontend/dist/assets/ecl-CGVKfDxD.js +1 -0
  268. package/frontend/dist/assets/editor-Br_kD0ds.css +1 -0
  269. package/frontend/dist/assets/editor.api2-YXkDn0Gm.js +872 -0
  270. package/frontend/dist/assets/editor.main-fBaXZjJ0.js +6 -0
  271. package/frontend/dist/assets/elixir-BZ-6w0y3.js +1 -0
  272. package/frontend/dist/assets/erDiagram-INFDFZHY-BYiB9NYg.js +70 -0
  273. package/frontend/dist/assets/flow9-CVuOjTMv.js +1 -0
  274. package/frontend/dist/assets/flowDiagram-PKNHOUZH-Cwq47rsR.js +162 -0
  275. package/frontend/dist/assets/freemarker2-DM-pztJU.js +3 -0
  276. package/frontend/dist/assets/fsharp-q0pGJYr6.js +1 -0
  277. package/frontend/dist/assets/ganttDiagram-A5KZAMGK-Dnx3szD9.js +292 -0
  278. package/frontend/dist/assets/gitGraph-HDMCJU4V-COlTQ7bA.js +1 -0
  279. package/frontend/dist/assets/gitGraphDiagram-K3NZZRJ6-BaUxboNc.js +65 -0
  280. package/frontend/dist/assets/go-dzSPfdEO.js +1 -0
  281. package/frontend/dist/assets/graphlib-kEFlkt3U.js +1 -0
  282. package/frontend/dist/assets/graphql-CG4OUoEV.js +1 -0
  283. package/frontend/dist/assets/handlebars-BbK53Vec.js +1 -0
  284. package/frontend/dist/assets/hcl-Cy14JPk3.js +1 -0
  285. package/frontend/dist/assets/html-DYtTQNOG.js +1 -0
  286. package/frontend/dist/assets/html.worker-BjVEKLoU.js +502 -0
  287. package/frontend/dist/assets/htmlMode-C6GTouth.js +1 -0
  288. package/frontend/dist/assets/index-DMLxes_u.js +157 -0
  289. package/frontend/dist/assets/index-DmzeqkB1.css +1 -0
  290. package/frontend/dist/assets/info-3K5VOQVL-DBtHyA4C.js +1 -0
  291. package/frontend/dist/assets/infoDiagram-LFFYTUFH-yBXLgMPI.js +2 -0
  292. package/frontend/dist/assets/ini-Pbg8HGVD.js +1 -0
  293. package/frontend/dist/assets/init-D6KNwrax.js +1 -0
  294. package/frontend/dist/assets/ishikawaDiagram-PHBUUO56-Bld4two_.js +70 -0
  295. package/frontend/dist/assets/java-BmVu6Qrl.js +1 -0
  296. package/frontend/dist/assets/javascript-PbfQEdcJ.js +1 -0
  297. package/frontend/dist/assets/journeyDiagram-4ABVD52K-4HyMd4R2.js +139 -0
  298. package/frontend/dist/assets/json.worker-DqU5Wxnl.js +58 -0
  299. package/frontend/dist/assets/jsonMode-CASsGppE.js +7 -0
  300. package/frontend/dist/assets/julia-3cGnieBq.js +1 -0
  301. package/frontend/dist/assets/kanban-definition-K7BYSVSG-DpgsZmpG.js +89 -0
  302. package/frontend/dist/assets/katex-CEw3x5bf.js +261 -0
  303. package/frontend/dist/assets/kotlin-BuWkVcfV.js +1 -0
  304. package/frontend/dist/assets/less-CJ_VPy2C.js +2 -0
  305. package/frontend/dist/assets/lexon-BygAuZPu.js +1 -0
  306. package/frontend/dist/assets/line-CA_wh_TY.js +1 -0
  307. package/frontend/dist/assets/linear-BAcLW45z.js +1 -0
  308. package/frontend/dist/assets/liquid-kz84dle6.js +1 -0
  309. package/frontend/dist/assets/lspLanguageFeatures-C7hAHFn1.js +4 -0
  310. package/frontend/dist/assets/lua-C8Xs3dCx.js +1 -0
  311. package/frontend/dist/assets/m3-DTJeKBk4.js +1 -0
  312. package/frontend/dist/assets/markdown-QCgx8JqZ.js +1 -0
  313. package/frontend/dist/assets/math-D0YcMJAn.js +1 -0
  314. package/frontend/dist/assets/mdx-yRw0ap-E.js +1 -0
  315. package/frontend/dist/assets/mermaid-parser.core-DAeTodBQ.js +4 -0
  316. package/frontend/dist/assets/mindmap-definition-YRQLILUH-CoNlFyVl.js +68 -0
  317. package/frontend/dist/assets/mips-DopWaYgE.js +1 -0
  318. package/frontend/dist/assets/monaco.contribution-DeY0Qei-.js +2 -0
  319. package/frontend/dist/assets/msdax-BDis4ARV.js +1 -0
  320. package/frontend/dist/assets/mysql-BV6MLsOI.js +1 -0
  321. package/frontend/dist/assets/objective-c-B1UuzKs6.js +1 -0
  322. package/frontend/dist/assets/ordinal-jM7S0YHN.js +1 -0
  323. package/frontend/dist/assets/packet-RMMSAZCW-FF6-Tmai.js +1 -0
  324. package/frontend/dist/assets/pascal-BkvESCrc.js +1 -0
  325. package/frontend/dist/assets/pascaligo-lTy0kZYr.js +1 -0
  326. package/frontend/dist/assets/path-DNPd7Py7.js +1 -0
  327. package/frontend/dist/assets/perl-CrtUPXLV.js +1 -0
  328. package/frontend/dist/assets/pgsql-B9IbNWx2.js +1 -0
  329. package/frontend/dist/assets/php-CXvQBY2p.js +1 -0
  330. package/frontend/dist/assets/pie-UPGHQEXC-CFvXY2o-.js +1 -0
  331. package/frontend/dist/assets/pieDiagram-SKSYHLDU-CM_hbCcn.js +30 -0
  332. package/frontend/dist/assets/pla-DxBxuqWu.js +1 -0
  333. package/frontend/dist/assets/postiats-OkEuT5YF.js +1 -0
  334. package/frontend/dist/assets/powerquery-CMx5Tq4K.js +1 -0
  335. package/frontend/dist/assets/powershell-CstRxrEc.js +1 -0
  336. package/frontend/dist/assets/preload-helper-D4M6sveU.js +1 -0
  337. package/frontend/dist/assets/protobuf-Bx0Z-uRj.js +2 -0
  338. package/frontend/dist/assets/pug--W8vanWl.js +1 -0
  339. package/frontend/dist/assets/python-DA0rnlw3.js +1 -0
  340. package/frontend/dist/assets/qsharp-CRtr0YbN.js +1 -0
  341. package/frontend/dist/assets/quadrantDiagram-337W2JSQ-B3n3IUhC.js +7 -0
  342. package/frontend/dist/assets/r-C6E1d6iv.js +1 -0
  343. package/frontend/dist/assets/radar-KQ55EAFF-MPZu7SdX.js +1 -0
  344. package/frontend/dist/assets/razor-yd73uata.js +1 -0
  345. package/frontend/dist/assets/redis-Dx13voP3.js +1 -0
  346. package/frontend/dist/assets/redshift-D66HwlyV.js +1 -0
  347. package/frontend/dist/assets/requirementDiagram-Z7DCOOCP-CorP7L7F.js +73 -0
  348. package/frontend/dist/assets/restructuredtext-DQT2NKJ2.js +1 -0
  349. package/frontend/dist/assets/rough.esm-DxAX5Vpo.js +1 -0
  350. package/frontend/dist/assets/ruby-iFXI8hwH.js +1 -0
  351. package/frontend/dist/assets/rust-CSKiei34.js +1 -0
  352. package/frontend/dist/assets/sankeyDiagram-WA2Y5GQK-RDx6Bd-B.js +10 -0
  353. package/frontend/dist/assets/sb-Bo3ttdP2.js +1 -0
  354. package/frontend/dist/assets/scala-BC1D-Nxp.js +1 -0
  355. package/frontend/dist/assets/scheme-Z4OAo4Lv.js +1 -0
  356. package/frontend/dist/assets/scss-BvrdPs6B.js +3 -0
  357. package/frontend/dist/assets/sequenceDiagram-2WXFIKYE-JMqJSFq6.js +145 -0
  358. package/frontend/dist/assets/shell-Bh_aCyF-.js +1 -0
  359. package/frontend/dist/assets/solidity-CWHj6tSe.js +1 -0
  360. package/frontend/dist/assets/sophia-raoNtKtm.js +1 -0
  361. package/frontend/dist/assets/sparql-XzmoGnue.js +1 -0
  362. package/frontend/dist/assets/sql-BD0i9Gvg.js +1 -0
  363. package/frontend/dist/assets/src-Bn-kKzs7.js +1 -0
  364. package/frontend/dist/assets/st-DtVKyms6.js +1 -0
  365. package/frontend/dist/assets/stateDiagram-RAJIS63D-CgFfENdy.js +1 -0
  366. package/frontend/dist/assets/stateDiagram-v2-FVOUBMTO-C4Hh2P-U.js +1 -0
  367. package/frontend/dist/assets/swift--UZs77wT.js +1 -0
  368. package/frontend/dist/assets/systemverilog-CDnBSWUd.js +1 -0
  369. package/frontend/dist/assets/tcl-DdCEuTHZ.js +1 -0
  370. package/frontend/dist/assets/timeline-definition-YZTLITO2-BnatPBR5.js +61 -0
  371. package/frontend/dist/assets/treemap-KZPCXAKY-qb1Pl9la.js +1 -0
  372. package/frontend/dist/assets/ts.worker-DyPAEIuH.js +67719 -0
  373. package/frontend/dist/assets/tsMode-iuvyEpyO.js +11 -0
  374. package/frontend/dist/assets/twig-SSL-Altf.js +1 -0
  375. package/frontend/dist/assets/typescript-17918Hud.js +1 -0
  376. package/frontend/dist/assets/typespec-BT7S0ETg.js +1 -0
  377. package/frontend/dist/assets/vb-CrIgucua.js +1 -0
  378. package/frontend/dist/assets/vennDiagram-LZ73GAT5-DygS4Zzd.js +34 -0
  379. package/frontend/dist/assets/wgsl-BeKc3oEp.js +298 -0
  380. package/frontend/dist/assets/workers-DTfwKVoM.js +1 -0
  381. package/frontend/dist/assets/xml-CBMr_Wbw.js +1 -0
  382. package/frontend/dist/assets/xterm-BrP-ENHg.css +1 -0
  383. package/frontend/dist/assets/xterm-CBX2m0YM.js +36 -0
  384. package/frontend/dist/assets/xychartDiagram-JWTSCODW-D6wY1Jwd.js +7 -0
  385. package/frontend/dist/assets/yaml-CTjCH7Bv.js +1 -0
  386. package/frontend/dist/fonts/inter-300.ttf +0 -0
  387. package/frontend/dist/fonts/inter-400.ttf +0 -0
  388. package/frontend/dist/fonts/inter-500.ttf +0 -0
  389. package/frontend/dist/fonts/inter-600.ttf +0 -0
  390. package/frontend/dist/fonts/inter-700.ttf +0 -0
  391. package/frontend/dist/index.html +49 -0
  392. package/frontend/dist/logo_192x192.png +0 -0
  393. package/frontend/dist/logo_32x32.png +0 -0
  394. package/frontend/dist/logo_512x512.png +0 -0
  395. package/frontend/dist/logo_64x64.png +0 -0
  396. package/frontend/dist/logobg_192x192.png +0 -0
  397. package/frontend/dist/logobg_512x512.png +0 -0
  398. package/frontend/dist/logobg_64x64.png +0 -0
  399. package/frontend/dist/manifest.json +25 -0
  400. package/frontend/dist/sw.js +22 -0
  401. package/package.json +74 -7
  402. package/preload/Makefile +12 -0
  403. package/preload/atoo-studio-preload.c +647 -0
  404. package/preload/atoo-studio-preload.so +0 -0
  405. package/setup-cuse.sh +260 -0
  406. package/setup.sh +81 -0
  407. package/src/serial/native/binding.gyp +10 -0
  408. package/src/serial/native/pty_pair.c +222 -0
@@ -0,0 +1,36 @@
1
+ /**
2
+ * JSONL session file tailer for Codex CLI.
3
+ *
4
+ * Codex stores sessions at:
5
+ * ~/.codex/sessions/YYYY/MM/DD/rollout-{timestamp}-{uuid}.jsonl
6
+ *
7
+ * Session discovery is handled by the notify callback (notify.ts).
8
+ * This watcher only tails a known file by UUID.
9
+ */
10
+ import { EventEmitter } from 'events';
11
+ export declare class CodexJsonlWatcher extends EventEmitter {
12
+ private targetPath;
13
+ private lastReadOffset;
14
+ private lineBuffer;
15
+ private fileWatcher;
16
+ private debounceTimer;
17
+ private waitTimer;
18
+ private stopped;
19
+ private initialOffset;
20
+ /**
21
+ * Set the initial read offset to skip content already loaded historically.
22
+ * Must be called before startTailingUuid().
23
+ */
24
+ setInitialOffset(bytes: number): void;
25
+ /**
26
+ * Start tailing the session file for a known UUID.
27
+ * Finds the file on disk, waits for it to appear if needed, then tails.
28
+ */
29
+ startTailingUuid(uuid: string): void;
30
+ stop(): void;
31
+ private clearWaitTimer;
32
+ private findFileByUuid;
33
+ private beginTailing;
34
+ private debouncedRead;
35
+ private readFromOffset;
36
+ }
@@ -0,0 +1,205 @@
1
+ /**
2
+ * JSONL session file tailer for Codex CLI.
3
+ *
4
+ * Codex stores sessions at:
5
+ * ~/.codex/sessions/YYYY/MM/DD/rollout-{timestamp}-{uuid}.jsonl
6
+ *
7
+ * Session discovery is handled by the notify callback (notify.ts).
8
+ * This watcher only tails a known file by UUID.
9
+ */
10
+ import { EventEmitter } from 'events';
11
+ import fs from 'fs';
12
+ import path from 'path';
13
+ import os from 'os';
14
+ import { mapCodexJsonlLine } from '../lib/codex/jsonl-mapper.js';
15
+ const CODEX_SESSIONS_DIR = path.join(os.homedir(), '.codex', 'sessions');
16
+ const DEBOUNCE_MS = 50;
17
+ const FILE_WAIT_INTERVAL = 200;
18
+ const FILE_WAIT_TIMEOUT = 30_000;
19
+ export class CodexJsonlWatcher extends EventEmitter {
20
+ targetPath = null;
21
+ lastReadOffset = 0;
22
+ lineBuffer = '';
23
+ fileWatcher = null;
24
+ debounceTimer = null;
25
+ waitTimer = null;
26
+ stopped = false;
27
+ initialOffset = 0;
28
+ /**
29
+ * Set the initial read offset to skip content already loaded historically.
30
+ * Must be called before startTailingUuid().
31
+ */
32
+ setInitialOffset(bytes) {
33
+ this.initialOffset = bytes;
34
+ }
35
+ /**
36
+ * Start tailing the session file for a known UUID.
37
+ * Finds the file on disk, waits for it to appear if needed, then tails.
38
+ */
39
+ startTailingUuid(uuid) {
40
+ const filePath = this.findFileByUuid(uuid);
41
+ if (filePath) {
42
+ this.targetPath = filePath;
43
+ this.beginTailing();
44
+ }
45
+ else {
46
+ // File doesn't exist yet — poll until it appears
47
+ console.log(`[codex-jsonl-watcher] Waiting for session file for ${uuid}...`);
48
+ const startTime = Date.now();
49
+ this.waitTimer = setInterval(() => {
50
+ if (this.stopped) {
51
+ this.clearWaitTimer();
52
+ return;
53
+ }
54
+ const found = this.findFileByUuid(uuid);
55
+ if (found) {
56
+ this.clearWaitTimer();
57
+ this.targetPath = found;
58
+ console.log(`[codex-jsonl-watcher] Found session file: ${path.basename(found)}`);
59
+ this.beginTailing();
60
+ }
61
+ else if (Date.now() - startTime > FILE_WAIT_TIMEOUT) {
62
+ this.clearWaitTimer();
63
+ console.warn(`[codex-jsonl-watcher] Timed out waiting for session file for ${uuid}`);
64
+ }
65
+ }, FILE_WAIT_INTERVAL);
66
+ }
67
+ }
68
+ stop() {
69
+ this.stopped = true;
70
+ this.clearWaitTimer();
71
+ if (this.fileWatcher) {
72
+ this.fileWatcher.close();
73
+ this.fileWatcher = null;
74
+ }
75
+ if (this.debounceTimer) {
76
+ clearTimeout(this.debounceTimer);
77
+ this.debounceTimer = null;
78
+ }
79
+ }
80
+ clearWaitTimer() {
81
+ if (this.waitTimer) {
82
+ clearInterval(this.waitTimer);
83
+ this.waitTimer = null;
84
+ }
85
+ }
86
+ findFileByUuid(uuid) {
87
+ try {
88
+ const yearDirs = fs.readdirSync(CODEX_SESSIONS_DIR);
89
+ for (const year of yearDirs) {
90
+ const yearPath = path.join(CODEX_SESSIONS_DIR, year);
91
+ let monthDirs;
92
+ try {
93
+ monthDirs = fs.readdirSync(yearPath);
94
+ }
95
+ catch {
96
+ continue;
97
+ }
98
+ for (const month of monthDirs) {
99
+ const monthPath = path.join(yearPath, month);
100
+ let dayDirs;
101
+ try {
102
+ dayDirs = fs.readdirSync(monthPath);
103
+ }
104
+ catch {
105
+ continue;
106
+ }
107
+ for (const day of dayDirs) {
108
+ const dayPath = path.join(monthPath, day);
109
+ let files;
110
+ try {
111
+ files = fs.readdirSync(dayPath);
112
+ }
113
+ catch {
114
+ continue;
115
+ }
116
+ for (const file of files) {
117
+ if (file.includes(uuid) && file.endsWith('.jsonl')) {
118
+ return path.join(dayPath, file);
119
+ }
120
+ }
121
+ }
122
+ }
123
+ }
124
+ }
125
+ catch { }
126
+ return null;
127
+ }
128
+ beginTailing() {
129
+ if (this.stopped || !this.targetPath)
130
+ return;
131
+ // Skip content already loaded by historical pre-load
132
+ if (this.initialOffset > 0) {
133
+ this.lastReadOffset = this.initialOffset;
134
+ this.initialOffset = 0;
135
+ }
136
+ // Read any new content since the offset
137
+ this.readFromOffset();
138
+ // Watch for future changes
139
+ try {
140
+ this.fileWatcher = fs.watch(this.targetPath, (eventType) => {
141
+ if (this.stopped || eventType !== 'change')
142
+ return;
143
+ this.debouncedRead();
144
+ });
145
+ this.emit('ready');
146
+ }
147
+ catch (err) {
148
+ console.error(`[codex-jsonl-watcher] Cannot watch file ${this.targetPath}:`, err.message);
149
+ this.emit('error', err);
150
+ }
151
+ }
152
+ debouncedRead() {
153
+ if (this.debounceTimer)
154
+ return;
155
+ this.debounceTimer = setTimeout(() => {
156
+ this.debounceTimer = null;
157
+ this.readFromOffset();
158
+ }, DEBOUNCE_MS);
159
+ }
160
+ readFromOffset() {
161
+ if (!this.targetPath)
162
+ return;
163
+ let stat;
164
+ try {
165
+ stat = fs.statSync(this.targetPath);
166
+ }
167
+ catch {
168
+ return;
169
+ }
170
+ if (stat.size < this.lastReadOffset) {
171
+ console.warn('[codex-jsonl-watcher] File truncated, re-reading from start');
172
+ this.lastReadOffset = 0;
173
+ this.lineBuffer = '';
174
+ }
175
+ if (stat.size <= this.lastReadOffset)
176
+ return;
177
+ try {
178
+ const fd = fs.openSync(this.targetPath, 'r');
179
+ const buf = Buffer.alloc(stat.size - this.lastReadOffset);
180
+ fs.readSync(fd, buf, 0, buf.length, this.lastReadOffset);
181
+ fs.closeSync(fd);
182
+ this.lastReadOffset = stat.size;
183
+ const chunk = this.lineBuffer + buf.toString('utf-8');
184
+ const lines = chunk.split('\n');
185
+ this.lineBuffer = lines.pop() || '';
186
+ for (const line of lines) {
187
+ if (!line.trim())
188
+ continue;
189
+ try {
190
+ const parsed = JSON.parse(line);
191
+ const events = mapCodexJsonlLine(parsed);
192
+ for (const event of events) {
193
+ this.emit('event', event);
194
+ }
195
+ }
196
+ catch {
197
+ // Skip unparseable lines
198
+ }
199
+ }
200
+ }
201
+ catch (err) {
202
+ console.error('[codex-jsonl-watcher] Read error:', err.message);
203
+ }
204
+ }
205
+ }
@@ -0,0 +1,9 @@
1
+ export declare function spawnCodexCliProcess(options: {
2
+ skipPermissions?: boolean;
3
+ cwd?: string;
4
+ resumeSessionUuid?: string;
5
+ isChainContinuation?: boolean;
6
+ }): {
7
+ envId: string;
8
+ preloadSessionId: string;
9
+ };
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Codex Terminal+ChatRO spawn logic.
3
+ * Spawns a plain `codex` PTY or `codex resume <uuid>`.
4
+ */
5
+ import crypto from 'crypto';
6
+ import os from 'os';
7
+ import { v4 as uuidv4 } from 'uuid';
8
+ import { spawnProcess } from '../../spawner.js';
9
+ import { getMcpServerDef, MCP_SYSTEM_PROMPT, CHAIN_SYSTEM_PROMPT, registerMcpToken } from '../../mcp/config.js';
10
+ import { addPreloadEnv } from '../lib/fs-tracking.js';
11
+ export function spawnCodexCliProcess(options) {
12
+ const cwd = options.cwd || process.env.HOME || os.homedir();
13
+ let command;
14
+ let args;
15
+ const baseArgs = [];
16
+ if (options.skipPermissions)
17
+ baseArgs.push('--full-auto');
18
+ // Inject MCP server config via -c flags (per-process, doesn't affect other codex instances)
19
+ const mcpToken = crypto.randomUUID();
20
+ registerMcpToken(mcpToken);
21
+ const mcp = getMcpServerDef();
22
+ const mcpEnv = { ...mcp.env, ATOO_MCP_TOKEN: mcpToken };
23
+ if (options.resumeSessionUuid) {
24
+ mcpEnv.ATOO_CURRENT_SESSION_UUID = options.resumeSessionUuid;
25
+ }
26
+ baseArgs.push('-c', `mcp_servers.atoo-studio.command="${mcp.command}"`);
27
+ baseArgs.push('-c', `mcp_servers.atoo-studio.args=${JSON.stringify(mcp.args)}`);
28
+ for (const [key, value] of Object.entries(mcpEnv)) {
29
+ baseArgs.push('-c', `mcp_servers.atoo-studio.env.${key}="${value}"`);
30
+ }
31
+ // Inject system prompt with MCP tool usage instructions
32
+ const systemPrompt = options.isChainContinuation
33
+ ? MCP_SYSTEM_PROMPT + CHAIN_SYSTEM_PROMPT
34
+ : MCP_SYSTEM_PROMPT;
35
+ baseArgs.push('-c', `developer_instructions=${JSON.stringify(systemPrompt)}`);
36
+ if (options.resumeSessionUuid) {
37
+ // codex resume <session_id> [flags]
38
+ command = 'codex';
39
+ args = ['resume', options.resumeSessionUuid, ...baseArgs];
40
+ }
41
+ else {
42
+ command = 'codex';
43
+ args = [...baseArgs];
44
+ }
45
+ const preloadSessionId = uuidv4();
46
+ const env = { ...process.env };
47
+ addPreloadEnv(env, preloadSessionId);
48
+ const { envId } = spawnProcess({
49
+ command,
50
+ args,
51
+ cwd,
52
+ env,
53
+ preloadSessionId,
54
+ logPrefix: 'codex-terminal-chatro',
55
+ });
56
+ return { envId, preloadSessionId };
57
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Chain builder: creates a new chain-linked session from a source session.
3
+ *
4
+ * Instead of compacting context (which loses information), a chain link:
5
+ * 1. Carries forward the last N log entries + all user messages from the source
6
+ * 2. Tells the LLM to use search_session_history(CurrentSessionChain) for deeper context
7
+ * 3. Links to the source via the session ID schema ({parent-last16}c{random15})
8
+ */
9
+ import type { SessionEvent } from '../../events/types.js';
10
+ /**
11
+ * Build chain link events and UUID from a source session's events.
12
+ * Does NOT write to disk — the caller decides which format to write (Claude/Codex).
13
+ *
14
+ * @param sourceEvents - Events from the source session
15
+ * @param parentSessionId - The source session's ID (for parent-linking)
16
+ * @returns { uuid, events } or null if source has no conversation content
17
+ */
18
+ export declare function buildChainSession(sourceEvents: SessionEvent[], parentSessionId: string): {
19
+ uuid: string;
20
+ events: SessionEvent[];
21
+ } | null;
@@ -0,0 +1,139 @@
1
+ import { buildLinkedUuid } from './session-id-utils.js';
2
+ const MAX_PAIRS = 10;
3
+ /**
4
+ * Extract text from an assistant event's content, stripping tool_use blocks and thinking.
5
+ * Returns only the final text response, or null if there's no text.
6
+ */
7
+ function extractAssistantText(event) {
8
+ const content = event.message?.content;
9
+ if (typeof content === 'string')
10
+ return content || null;
11
+ if (Array.isArray(content)) {
12
+ const texts = content
13
+ .filter((b) => b.type === 'text')
14
+ .map((b) => b.text || '');
15
+ const joined = texts.join('\n').trim();
16
+ return joined || null;
17
+ }
18
+ return null;
19
+ }
20
+ /**
21
+ * Extract the last N user messages + their final assistant text responses.
22
+ * No tool calls, no tool results, no thinking, no intermediate events —
23
+ * just the clean conversation thread.
24
+ */
25
+ function extractChainEvents(events) {
26
+ if (events.length === 0)
27
+ return [];
28
+ // Walk through events and pair each real user text message with the
29
+ // last assistant text response before the next user message.
30
+ // Also count hidden events (tool calls, tool results, thinking, etc.)
31
+ // between each user message so we can inform the LLM.
32
+ const pairs = [];
33
+ let lastUserIdx = -1;
34
+ let hiddenCount = 0;
35
+ for (let i = 0; i < events.length; i++) {
36
+ const e = events[i];
37
+ // Real user text message (not tool_result)
38
+ if (e.type === 'user') {
39
+ const content = e.message?.content;
40
+ const isToolResult = Array.isArray(content) && content.some((b) => b.type === 'tool_result');
41
+ if (isToolResult) {
42
+ hiddenCount++;
43
+ continue;
44
+ }
45
+ // Attribute accumulated hidden events to the previous pair
46
+ if (lastUserIdx >= 0) {
47
+ pairs[lastUserIdx].hiddenCount = hiddenCount;
48
+ }
49
+ hiddenCount = 0;
50
+ pairs.push({ user: e, assistant: null, hiddenCount: 0 });
51
+ lastUserIdx = pairs.length - 1;
52
+ }
53
+ else if (e.type === 'assistant' && lastUserIdx >= 0) {
54
+ const text = extractAssistantText(e);
55
+ if (text) {
56
+ // Build a clean assistant event with text-only content
57
+ pairs[lastUserIdx].assistant = {
58
+ ...e,
59
+ message: {
60
+ ...e.message,
61
+ content: [{ type: 'text', text }],
62
+ },
63
+ };
64
+ }
65
+ // Count assistant events with only tool_use (no text) as hidden
66
+ if (!text)
67
+ hiddenCount++;
68
+ }
69
+ else {
70
+ // All other event types (progress, system, result, etc.) are hidden
71
+ hiddenCount++;
72
+ }
73
+ }
74
+ // Attribute final hidden count to last pair
75
+ if (lastUserIdx >= 0) {
76
+ pairs[lastUserIdx].hiddenCount = hiddenCount;
77
+ }
78
+ if (pairs.length === 0)
79
+ return [];
80
+ // Take the last N pairs
81
+ const selected = pairs.slice(-MAX_PAIRS);
82
+ // Flatten to event list: user, assistant, user, assistant, ...
83
+ // Prepend hidden count to assistant responses
84
+ const result = [];
85
+ for (const pair of selected) {
86
+ result.push(pair.user);
87
+ if (pair.assistant && pair.hiddenCount > 0) {
88
+ const a = pair.assistant;
89
+ const text = a.message.content[0].text;
90
+ result.push({
91
+ ...a,
92
+ message: {
93
+ ...a.message,
94
+ content: [{ type: 'text', text: `[${pair.hiddenCount} intermediate tool calls/results hidden]\n\n${text}` }],
95
+ },
96
+ });
97
+ }
98
+ else if (pair.assistant) {
99
+ result.push(pair.assistant);
100
+ }
101
+ }
102
+ // Inject chain context header into the first user message
103
+ if (result.length > 0) {
104
+ const header = '[This is a chain continuation session. The messages below are carried forward from the previous session in this chain. For full context from earlier in the conversation, use the search_session_history tool with type "CurrentSessionChain".]';
105
+ const first = result[0];
106
+ const msg = first.message;
107
+ const content = typeof msg.content === 'string'
108
+ ? `${header}\n\n${msg.content}`
109
+ : Array.isArray(msg.content)
110
+ ? [{ type: 'text', text: header }, ...msg.content]
111
+ : msg.content;
112
+ result[0] = { ...first, message: { ...msg, content } };
113
+ }
114
+ return result;
115
+ }
116
+ /**
117
+ * Build chain link events and UUID from a source session's events.
118
+ * Does NOT write to disk — the caller decides which format to write (Claude/Codex).
119
+ *
120
+ * @param sourceEvents - Events from the source session
121
+ * @param parentSessionId - The source session's ID (for parent-linking)
122
+ * @returns { uuid, events } or null if source has no conversation content
123
+ */
124
+ export function buildChainSession(sourceEvents, parentSessionId) {
125
+ if (sourceEvents.length === 0)
126
+ return null;
127
+ const chainEvents = extractChainEvents(sourceEvents);
128
+ if (chainEvents.length === 0)
129
+ return null;
130
+ // Verify there are actual conversational events (user/assistant) that will
131
+ // survive JSONL reconstruction. Non-conversational events (progress, etc.)
132
+ // are filtered out by the writers, which would produce an empty file.
133
+ const CONVERSATIONAL_TYPES = new Set(['user', 'assistant', 'system', 'result', 'control_request', 'control_response']);
134
+ const hasConversation = chainEvents.some(e => CONVERSATIONAL_TYPES.has(e.type));
135
+ if (!hasConversation)
136
+ return null;
137
+ const chainUuid = buildLinkedUuid(parentSessionId, 'chain');
138
+ return { uuid: chainUuid, events: chainEvents };
139
+ }
@@ -0,0 +1,31 @@
1
+ export interface FsSessionMeta {
2
+ uuid: string;
3
+ dirHash: string;
4
+ directory: string;
5
+ title: string;
6
+ lastModified: string;
7
+ fileSize: number;
8
+ eventCount: number;
9
+ jsonlPath: string;
10
+ }
11
+ declare class FsSessionScanner {
12
+ private cache;
13
+ private lastScanTime;
14
+ scan(): Promise<FsSessionMeta[]>;
15
+ private parseSessionMeta;
16
+ readEvents(uuid: string): Promise<any[]>;
17
+ getByUuid(uuid: string): FsSessionMeta | undefined;
18
+ invalidate(): void;
19
+ /**
20
+ * Find the most recently modified session UUID for a given working directory.
21
+ * Useful as a fallback when hook-based CLI session discovery fails.
22
+ */
23
+ findMostRecentForCwd(cwd: string): Promise<string | null>;
24
+ /**
25
+ * Return all JSONL file paths (sessions + subagents) for sessions
26
+ * whose working directory matches any of the given cwds.
27
+ */
28
+ getFilesForProject(cwds: string[]): Promise<string[]>;
29
+ }
30
+ export declare const fsSessionScanner: FsSessionScanner;
31
+ export {};