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,45 @@
1
+ import { ClaudeCodeTerminalChatROAgent } from './adapter.js';
2
+ import { fsSessionScanner } from '../lib/claude/fs-sessions.js';
3
+ import { writeForkedClaudeJsonl } from '../lib/claude/jsonl-writer.js';
4
+ export class ClaudeCodeTerminalChatROAgentFactory {
5
+ agentType = 'claude-code-terminal-chatro';
6
+ agentFamily = 'claude';
7
+ create(sessionId) {
8
+ return new ClaudeCodeTerminalChatROAgent(sessionId);
9
+ }
10
+ getDescriptor() {
11
+ return {
12
+ agentType: this.agentType,
13
+ agentFamily: this.agentFamily,
14
+ name: 'Claude Code + ChatUI',
15
+ mode: 'terminal+chatRO',
16
+ iconUrl: `data:image/svg+xml,${encodeURIComponent('<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#d97757" viewBox="0 0 16 16"><path d="m3.127 10.604 3.135-1.76.053-.153-.053-.085H6.11l-.525-.032-1.791-.048-1.554-.065-1.505-.08-.38-.081L0 7.832l.036-.234.32-.214.455.04 1.009.069 1.513.105 1.097.064 1.626.17h.259l.036-.105-.089-.065-.068-.064-1.566-1.062-1.695-1.121-.887-.646-.48-.327-.243-.306-.104-.67.435-.48.585.04.15.04.593.456 1.267.981 1.654 1.218.242.202.097-.068.012-.049-.109-.181-.9-1.626-.96-1.655-.428-.686-.113-.411a2 2 0 0 1-.068-.484l.496-.674L4.446 0l.662.089.279.242.411.94.666 1.48 1.033 2.014.302.597.162.553.06.17h.105v-.097l.085-1.134.157-1.392.154-1.792.052-.504.25-.605.497-.327.387.186.319.456-.045.294-.19 1.23-.37 1.93-.243 1.29h.142l.161-.16.654-.868 1.097-1.372.484-.545.565-.601.363-.287h.686l.505.751-.226.775-.707.895-.585.759-.839 1.13-.524.904.048.072.125-.012 1.897-.403 1.024-.186 1.223-.21.553.258.06.263-.218.536-1.307.323-1.533.307-2.284.54-.028.02.032.04 1.029.098.44.024h1.077l2.005.15.525.346.315.424-.053.323-.807.411-3.631-.863-.872-.218h-.12v.073l.726.71 1.331 1.202 1.667 1.55.084.383-.214.302-.226-.032-1.464-1.101-.565-.497-1.28-1.077h-.084v.113l.295.432 1.557 2.34.08.718-.112.234-.404.141-.444-.08-.911-1.28-.94-1.44-.759-1.291-.093.053-.448 4.821-.21.246-.484.186-.403-.307-.214-.496.214-.98.258-1.28.21-1.016.19-1.263.112-.42-.008-.028-.092.012-.953 1.307-1.448 1.957-1.146 1.227-.274.109-.477-.247.045-.44.266-.39 1.586-2.018.956-1.25.617-.723-.004-.105h-.036l-4.212 2.736-.75.096-.324-.302.04-.496.154-.162 1.267-.871z"/></svg>')}`,
17
+ };
18
+ }
19
+ async getHistoricalSessions() {
20
+ const fsSessions = await fsSessionScanner.scan();
21
+ return fsSessions.map(s => ({
22
+ id: s.uuid,
23
+ agentType: this.agentType,
24
+ title: s.title,
25
+ directory: s.directory,
26
+ lastModified: s.lastModified,
27
+ eventCount: s.eventCount,
28
+ }));
29
+ }
30
+ async ownsSession(uuid) {
31
+ // This agent shares the same session file format as the terminal agent.
32
+ // Ownership is ambiguous — return false so the terminal agent claims it.
33
+ // Users can start a new terminal-chatro session and resume with it explicitly.
34
+ return false;
35
+ }
36
+ async getSessionFilesForProject(cwds) {
37
+ return fsSessionScanner.getFilesForProject(cwds);
38
+ }
39
+ async readSessionEvents(uuid) {
40
+ return fsSessionScanner.readEvents(uuid);
41
+ }
42
+ writeSessionForResume(events, targetUuid, directory) {
43
+ return writeForkedClaudeJsonl(events, targetUuid, directory);
44
+ }
45
+ }
@@ -0,0 +1,67 @@
1
+ /**
2
+ * JSONL session file discovery and tailing.
3
+ * Watches Claude CLI's session JSONL files for new events in real-time.
4
+ * Also discovers and tails subagent JSONL files from progress events.
5
+ */
6
+ import { EventEmitter } from 'events';
7
+ export interface SubagentMetadata {
8
+ sidechain: true;
9
+ parentToolUseID: string;
10
+ agentId: string;
11
+ }
12
+ export declare class JsonlWatcher extends EventEmitter {
13
+ private cwd;
14
+ private resumeUuid?;
15
+ private dirPath;
16
+ private targetPath;
17
+ private sessionUuid;
18
+ private lastReadOffset;
19
+ private lineBuffer;
20
+ private dirWatcher;
21
+ private fileWatcher;
22
+ private debounceTimer;
23
+ private discoveryTimer;
24
+ private stopped;
25
+ private preExistingFiles;
26
+ /** Active subagent tailers keyed by agentId */
27
+ private subagentTailers;
28
+ /** Maps agentId → parentToolUseID from the progress event that spawned it */
29
+ private subagentParents;
30
+ constructor(options: {
31
+ cwd: string;
32
+ resumeUuid?: string;
33
+ });
34
+ /**
35
+ * Phase 1: Snapshot existing JSONL files BEFORE the CLI is spawned.
36
+ * Must be called before the PTY spawn to avoid a race where the CLI
37
+ * creates its file before we record what was already there.
38
+ */
39
+ snapshot(): void;
40
+ /**
41
+ * Phase 2: Begin watching for a new file (or the known resume file).
42
+ * Called AFTER the PTY spawn.
43
+ */
44
+ start(): Promise<void>;
45
+ /** Set of agentIds currently being tailed (for adapter to check) */
46
+ get tailedAgentIds(): ReadonlySet<string>;
47
+ /**
48
+ * Start tailing a known session UUID file directly, bypassing discovery.
49
+ * Used when hooks report the exact session ID.
50
+ */
51
+ startTailingKnownUuid(uuid: string): void;
52
+ stop(): void;
53
+ private snapshotExisting;
54
+ private watchForNewFile;
55
+ private waitForFile;
56
+ private fallbackDiscovery;
57
+ private startTailing;
58
+ private debouncedRead;
59
+ private readFromOffset;
60
+ /**
61
+ * If the event is a progress event with data.agentId, start tailing
62
+ * the subagent's JSONL file.
63
+ */
64
+ private maybeStartSubagentTailer;
65
+ private startSubagentTailing;
66
+ private readSubagentFromOffset;
67
+ }
@@ -0,0 +1,431 @@
1
+ /**
2
+ * JSONL session file discovery and tailing.
3
+ * Watches Claude CLI's session JSONL files for new events in real-time.
4
+ * Also discovers and tails subagent JSONL files from progress events.
5
+ */
6
+ import { EventEmitter } from 'events';
7
+ import fs from 'fs';
8
+ import path from 'path';
9
+ import os from 'os';
10
+ import crypto from 'crypto';
11
+ const CLAUDE_PROJECTS_DIR = path.join(os.homedir(), '.claude', 'projects');
12
+ const DISCOVERY_TIMEOUT = 5_000;
13
+ const DEBOUNCE_MS = 50;
14
+ /**
15
+ * Convert a cwd path to Claude CLI's dir-hash format.
16
+ * Replaces all non-alphanumeric chars with '-'.
17
+ * "/home/furti/myproject" → "-home-furti-myproject"
18
+ */
19
+ function cwdToDirHash(cwd) {
20
+ const hashed = cwd.replace(/[^a-zA-Z0-9]/g, '-');
21
+ if (hashed.length <= 200)
22
+ return hashed;
23
+ const suffix = crypto.createHash('sha256').update(cwd).digest('hex').slice(0, 12);
24
+ return `${hashed.slice(0, 200)}-${suffix}`;
25
+ }
26
+ export class JsonlWatcher extends EventEmitter {
27
+ cwd;
28
+ resumeUuid;
29
+ dirPath;
30
+ targetPath = null;
31
+ sessionUuid = null;
32
+ lastReadOffset = 0;
33
+ lineBuffer = '';
34
+ dirWatcher = null;
35
+ fileWatcher = null;
36
+ debounceTimer = null;
37
+ discoveryTimer = null;
38
+ stopped = false;
39
+ preExistingFiles = new Set();
40
+ /** Active subagent tailers keyed by agentId */
41
+ subagentTailers = new Map();
42
+ /** Maps agentId → parentToolUseID from the progress event that spawned it */
43
+ subagentParents = new Map();
44
+ constructor(options) {
45
+ super();
46
+ this.cwd = options.cwd;
47
+ this.resumeUuid = options.resumeUuid;
48
+ this.dirPath = path.join(CLAUDE_PROJECTS_DIR, cwdToDirHash(this.cwd));
49
+ }
50
+ /**
51
+ * Phase 1: Snapshot existing JSONL files BEFORE the CLI is spawned.
52
+ * Must be called before the PTY spawn to avoid a race where the CLI
53
+ * creates its file before we record what was already there.
54
+ */
55
+ snapshot() {
56
+ if (this.resumeUuid)
57
+ return; // resume doesn't need a snapshot
58
+ this.snapshotExisting();
59
+ console.log(`[jsonl-watcher] Snapshot: ${this.preExistingFiles.size} existing JSONL files in ${this.dirPath}`);
60
+ }
61
+ /**
62
+ * Phase 2: Begin watching for a new file (or the known resume file).
63
+ * Called AFTER the PTY spawn.
64
+ */
65
+ async start() {
66
+ if (this.resumeUuid) {
67
+ // Known UUID — wait for that specific file
68
+ this.targetPath = path.join(this.dirPath, `${this.resumeUuid}.jsonl`);
69
+ this.sessionUuid = this.resumeUuid;
70
+ this.waitForFile(this.targetPath);
71
+ }
72
+ else {
73
+ // Watch for a new file that wasn't in the snapshot
74
+ this.watchForNewFile();
75
+ }
76
+ }
77
+ /** Set of agentIds currently being tailed (for adapter to check) */
78
+ get tailedAgentIds() {
79
+ return new Set(this.subagentTailers.keys());
80
+ }
81
+ /**
82
+ * Start tailing a known session UUID file directly, bypassing discovery.
83
+ * Used when hooks report the exact session ID.
84
+ */
85
+ startTailingKnownUuid(uuid) {
86
+ this.targetPath = path.join(this.dirPath, `${uuid}.jsonl`);
87
+ this.sessionUuid = uuid;
88
+ // Stop any active discovery
89
+ if (this.dirWatcher) {
90
+ this.dirWatcher.close();
91
+ this.dirWatcher = null;
92
+ }
93
+ if (this.discoveryTimer) {
94
+ clearTimeout(this.discoveryTimer);
95
+ this.discoveryTimer = null;
96
+ }
97
+ // Wait for the file to exist, then start tailing
98
+ this.waitForFile(this.targetPath);
99
+ }
100
+ stop() {
101
+ this.stopped = true;
102
+ if (this.dirWatcher) {
103
+ this.dirWatcher.close();
104
+ this.dirWatcher = null;
105
+ }
106
+ if (this.fileWatcher) {
107
+ this.fileWatcher.close();
108
+ this.fileWatcher = null;
109
+ }
110
+ if (this.debounceTimer) {
111
+ clearTimeout(this.debounceTimer);
112
+ this.debounceTimer = null;
113
+ }
114
+ if (this.discoveryTimer) {
115
+ clearTimeout(this.discoveryTimer);
116
+ this.discoveryTimer = null;
117
+ }
118
+ // Stop all subagent tailers
119
+ for (const [agentId, tailer] of this.subagentTailers) {
120
+ if (tailer.fileWatcher)
121
+ tailer.fileWatcher.close();
122
+ if (tailer.debounceTimer)
123
+ clearTimeout(tailer.debounceTimer);
124
+ console.log(`[jsonl-watcher] Stopped subagent tailer: ${agentId}`);
125
+ }
126
+ this.subagentTailers.clear();
127
+ this.subagentParents.clear();
128
+ }
129
+ snapshotExisting() {
130
+ try {
131
+ if (fs.existsSync(this.dirPath)) {
132
+ for (const f of fs.readdirSync(this.dirPath)) {
133
+ if (f.endsWith('.jsonl'))
134
+ this.preExistingFiles.add(f);
135
+ }
136
+ }
137
+ }
138
+ catch { }
139
+ }
140
+ watchForNewFile() {
141
+ // Ensure the projects dir exists
142
+ try {
143
+ fs.mkdirSync(this.dirPath, { recursive: true });
144
+ }
145
+ catch { }
146
+ try {
147
+ this.dirWatcher = fs.watch(this.dirPath, (eventType, filename) => {
148
+ if (this.stopped || this.targetPath)
149
+ return;
150
+ if (!filename || !filename.endsWith('.jsonl'))
151
+ return;
152
+ if (this.preExistingFiles.has(filename))
153
+ return;
154
+ // New JSONL file appeared
155
+ this.targetPath = path.join(this.dirPath, filename);
156
+ this.sessionUuid = filename.replace('.jsonl', '');
157
+ if (this.dirWatcher) {
158
+ this.dirWatcher.close();
159
+ this.dirWatcher = null;
160
+ }
161
+ if (this.discoveryTimer) {
162
+ clearTimeout(this.discoveryTimer);
163
+ this.discoveryTimer = null;
164
+ }
165
+ console.log(`[jsonl-watcher] Discovered session file: ${filename}`);
166
+ this.startTailing();
167
+ });
168
+ }
169
+ catch (err) {
170
+ console.warn(`[jsonl-watcher] Cannot watch directory ${this.dirPath}:`, err.message);
171
+ }
172
+ // Fallback: if no new file detected, pick the most recently modified one
173
+ this.discoveryTimer = setTimeout(() => {
174
+ if (this.stopped || this.targetPath)
175
+ return;
176
+ this.fallbackDiscovery();
177
+ }, DISCOVERY_TIMEOUT);
178
+ }
179
+ waitForFile(filePath) {
180
+ if (fs.existsSync(filePath)) {
181
+ console.log(`[jsonl-watcher] Resume file exists: ${path.basename(filePath)}`);
182
+ this.startTailing();
183
+ return;
184
+ }
185
+ // Watch directory for the file to appear
186
+ try {
187
+ fs.mkdirSync(this.dirPath, { recursive: true });
188
+ }
189
+ catch { }
190
+ const targetName = path.basename(filePath);
191
+ try {
192
+ this.dirWatcher = fs.watch(this.dirPath, (eventType, filename) => {
193
+ if (this.stopped)
194
+ return;
195
+ if (filename === targetName) {
196
+ if (this.dirWatcher) {
197
+ this.dirWatcher.close();
198
+ this.dirWatcher = null;
199
+ }
200
+ if (this.discoveryTimer) {
201
+ clearTimeout(this.discoveryTimer);
202
+ this.discoveryTimer = null;
203
+ }
204
+ console.log(`[jsonl-watcher] Resume file appeared: ${targetName}`);
205
+ this.startTailing();
206
+ }
207
+ });
208
+ }
209
+ catch { }
210
+ this.discoveryTimer = setTimeout(() => {
211
+ if (this.stopped)
212
+ return;
213
+ if (fs.existsSync(filePath)) {
214
+ this.startTailing();
215
+ }
216
+ else {
217
+ console.warn(`[jsonl-watcher] Timeout waiting for resume file: ${targetName}`);
218
+ }
219
+ }, DISCOVERY_TIMEOUT);
220
+ }
221
+ fallbackDiscovery() {
222
+ try {
223
+ const files = fs.readdirSync(this.dirPath).filter(f => f.endsWith('.jsonl'));
224
+ if (files.length === 0) {
225
+ console.warn('[jsonl-watcher] No JSONL files found in', this.dirPath);
226
+ return;
227
+ }
228
+ // Prefer files NOT in the pre-existing snapshot (i.e., created after we started)
229
+ const newFiles = files.filter(f => !this.preExistingFiles.has(f));
230
+ const candidates = newFiles.length > 0 ? newFiles : files;
231
+ // Pick the most recently modified
232
+ let best = null;
233
+ for (const f of candidates) {
234
+ try {
235
+ const stat = fs.statSync(path.join(this.dirPath, f));
236
+ if (!best || stat.mtimeMs > best.mtime) {
237
+ best = { name: f, mtime: stat.mtimeMs };
238
+ }
239
+ }
240
+ catch { }
241
+ }
242
+ if (best) {
243
+ this.targetPath = path.join(this.dirPath, best.name);
244
+ this.sessionUuid = best.name.replace('.jsonl', '');
245
+ if (this.dirWatcher) {
246
+ this.dirWatcher.close();
247
+ this.dirWatcher = null;
248
+ }
249
+ console.log(`[jsonl-watcher] Fallback: using ${newFiles.length > 0 ? 'new' : 'most recent'} file: ${best.name}`);
250
+ this.startTailing();
251
+ }
252
+ }
253
+ catch { }
254
+ }
255
+ startTailing() {
256
+ if (this.stopped || !this.targetPath)
257
+ return;
258
+ // Read any existing content first (for resume or late discovery)
259
+ this.readFromOffset();
260
+ // Watch for future changes
261
+ try {
262
+ this.fileWatcher = fs.watch(this.targetPath, (eventType) => {
263
+ if (this.stopped || eventType !== 'change')
264
+ return;
265
+ this.debouncedRead();
266
+ });
267
+ this.emit('ready');
268
+ }
269
+ catch (err) {
270
+ console.error(`[jsonl-watcher] Cannot watch file ${this.targetPath}:`, err.message);
271
+ this.emit('error', err);
272
+ }
273
+ }
274
+ debouncedRead() {
275
+ if (this.debounceTimer)
276
+ return;
277
+ this.debounceTimer = setTimeout(() => {
278
+ this.debounceTimer = null;
279
+ this.readFromOffset();
280
+ }, DEBOUNCE_MS);
281
+ }
282
+ readFromOffset() {
283
+ if (!this.targetPath)
284
+ return;
285
+ let stat;
286
+ try {
287
+ stat = fs.statSync(this.targetPath);
288
+ }
289
+ catch {
290
+ return;
291
+ }
292
+ // Handle truncation
293
+ if (stat.size < this.lastReadOffset) {
294
+ console.warn('[jsonl-watcher] File truncated, re-reading from start');
295
+ this.lastReadOffset = 0;
296
+ this.lineBuffer = '';
297
+ }
298
+ if (stat.size <= this.lastReadOffset)
299
+ return;
300
+ try {
301
+ const fd = fs.openSync(this.targetPath, 'r');
302
+ const buf = Buffer.alloc(stat.size - this.lastReadOffset);
303
+ fs.readSync(fd, buf, 0, buf.length, this.lastReadOffset);
304
+ fs.closeSync(fd);
305
+ this.lastReadOffset = stat.size;
306
+ const chunk = this.lineBuffer + buf.toString('utf-8');
307
+ const lines = chunk.split('\n');
308
+ // Last element may be incomplete — buffer it
309
+ this.lineBuffer = lines.pop() || '';
310
+ for (const line of lines) {
311
+ if (!line.trim())
312
+ continue;
313
+ try {
314
+ const event = JSON.parse(line);
315
+ // Check for subagent progress events and start tailing subagent files
316
+ this.maybeStartSubagentTailer(event);
317
+ this.emit('event', event);
318
+ }
319
+ catch {
320
+ // Skip unparseable lines
321
+ }
322
+ }
323
+ }
324
+ catch (err) {
325
+ console.error('[jsonl-watcher] Read error:', err.message);
326
+ }
327
+ }
328
+ /**
329
+ * If the event is a progress event with data.agentId, start tailing
330
+ * the subagent's JSONL file.
331
+ */
332
+ maybeStartSubagentTailer(event) {
333
+ if (event.type !== 'progress')
334
+ return;
335
+ const agentId = event.data?.agentId;
336
+ if (!agentId || this.subagentTailers.has(agentId))
337
+ return;
338
+ if (!this.sessionUuid)
339
+ return;
340
+ const parentToolUseID = event.parentToolUseID || event.toolUseID || '';
341
+ this.subagentParents.set(agentId, parentToolUseID);
342
+ const subagentPath = path.join(this.dirPath, this.sessionUuid, 'subagents', `agent-${agentId}.jsonl`);
343
+ // Start tailing, but the file may not exist yet
344
+ this.startSubagentTailing(agentId, subagentPath, parentToolUseID);
345
+ }
346
+ startSubagentTailing(agentId, filePath, parentToolUseID) {
347
+ const tailer = {
348
+ filePath,
349
+ lastReadOffset: 0,
350
+ lineBuffer: '',
351
+ fileWatcher: null,
352
+ debounceTimer: null,
353
+ };
354
+ this.subagentTailers.set(agentId, tailer);
355
+ const metadata = {
356
+ sidechain: true,
357
+ parentToolUseID,
358
+ agentId,
359
+ };
360
+ // Try to read existing content
361
+ this.readSubagentFromOffset(tailer, metadata);
362
+ // Watch for changes — file might not exist yet, retry with polling
363
+ const tryWatch = () => {
364
+ if (this.stopped)
365
+ return;
366
+ if (!fs.existsSync(filePath)) {
367
+ // File doesn't exist yet, retry shortly
368
+ setTimeout(tryWatch, 200);
369
+ return;
370
+ }
371
+ try {
372
+ tailer.fileWatcher = fs.watch(filePath, (eventType) => {
373
+ if (this.stopped || eventType !== 'change')
374
+ return;
375
+ if (tailer.debounceTimer)
376
+ return;
377
+ tailer.debounceTimer = setTimeout(() => {
378
+ tailer.debounceTimer = null;
379
+ this.readSubagentFromOffset(tailer, metadata);
380
+ }, DEBOUNCE_MS);
381
+ });
382
+ console.log(`[jsonl-watcher] Tailing subagent ${agentId}: ${path.basename(filePath)}`);
383
+ // Read again in case content appeared between our first read and the watch
384
+ this.readSubagentFromOffset(tailer, metadata);
385
+ }
386
+ catch (err) {
387
+ console.warn(`[jsonl-watcher] Cannot watch subagent file ${filePath}:`, err.message);
388
+ }
389
+ };
390
+ tryWatch();
391
+ }
392
+ readSubagentFromOffset(tailer, metadata) {
393
+ let stat;
394
+ try {
395
+ stat = fs.statSync(tailer.filePath);
396
+ }
397
+ catch {
398
+ return; // File doesn't exist yet
399
+ }
400
+ if (stat.size < tailer.lastReadOffset) {
401
+ tailer.lastReadOffset = 0;
402
+ tailer.lineBuffer = '';
403
+ }
404
+ if (stat.size <= tailer.lastReadOffset)
405
+ return;
406
+ try {
407
+ const fd = fs.openSync(tailer.filePath, 'r');
408
+ const buf = Buffer.alloc(stat.size - tailer.lastReadOffset);
409
+ fs.readSync(fd, buf, 0, buf.length, tailer.lastReadOffset);
410
+ fs.closeSync(fd);
411
+ tailer.lastReadOffset = stat.size;
412
+ const chunk = tailer.lineBuffer + buf.toString('utf-8');
413
+ const lines = chunk.split('\n');
414
+ tailer.lineBuffer = lines.pop() || '';
415
+ for (const line of lines) {
416
+ if (!line.trim())
417
+ continue;
418
+ try {
419
+ const event = JSON.parse(line);
420
+ this.emit('event', event, metadata);
421
+ }
422
+ catch {
423
+ // Skip unparseable lines
424
+ }
425
+ }
426
+ }
427
+ catch (err) {
428
+ console.error(`[jsonl-watcher] Subagent read error (${metadata.agentId}):`, err.message);
429
+ }
430
+ }
431
+ }
@@ -0,0 +1,9 @@
1
+ export declare function spawnTerminalCliProcess(options: {
2
+ skipPermissions?: boolean;
3
+ cwd?: string;
4
+ resumeSessionUuid?: string;
5
+ isChainContinuation?: boolean;
6
+ }): {
7
+ envId: string;
8
+ preloadSessionId: string;
9
+ };
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Claude Code Terminal+ChatRO–specific spawn logic.
3
+ * Plain `claude` PTY with MCP, system prompt, and LD_PRELOAD for file tracking.
4
+ */
5
+ import os from 'os';
6
+ import { v4 as uuidv4 } from 'uuid';
7
+ import { spawnProcess } from '../../spawner.js';
8
+ import { ensureWorkspaceTrust } from '../lib/claude/workspace-trust.js';
9
+ import { getMcpConfigPath, MCP_SYSTEM_PROMPT, CHAIN_SYSTEM_PROMPT } from '../../mcp/config.js';
10
+ import { addPreloadEnv } from '../lib/fs-tracking.js';
11
+ export function spawnTerminalCliProcess(options) {
12
+ const cwd = options.cwd || process.env.HOME || os.homedir();
13
+ ensureWorkspaceTrust(cwd);
14
+ const systemPrompt = options.isChainContinuation
15
+ ? MCP_SYSTEM_PROMPT + CHAIN_SYSTEM_PROMPT
16
+ : MCP_SYSTEM_PROMPT;
17
+ const mcpConfigPath = getMcpConfigPath(options.resumeSessionUuid);
18
+ const args = [];
19
+ if (options.skipPermissions)
20
+ args.push('--dangerously-skip-permissions');
21
+ args.push('--append-system-prompt', systemPrompt, '--mcp-config', mcpConfigPath);
22
+ if (options.resumeSessionUuid)
23
+ args.push('--resume', options.resumeSessionUuid);
24
+ const preloadSessionId = uuidv4();
25
+ const env = { ...process.env };
26
+ delete env.CLAUDECODE;
27
+ addPreloadEnv(env, preloadSessionId);
28
+ const { envId } = spawnProcess({
29
+ command: 'claude',
30
+ args,
31
+ cwd,
32
+ env,
33
+ preloadSessionId,
34
+ logPrefix: 'claude-terminal-chatro',
35
+ });
36
+ return { envId, preloadSessionId };
37
+ }
@@ -0,0 +1,40 @@
1
+ import { EventEmitter } from 'events';
2
+ import type { Agent, AgentInitOptions, AgentSessionInfo, Attachment } from '../types.js';
3
+ import type { SessionEvent } from '../../events/types.js';
4
+ import type { WireMessage } from '../../events/wire.js';
5
+ /**
6
+ * Terminal-only Codex agent.
7
+ * Spawns a plain `codex` PTY — no JSONL tailing, no chat overlay.
8
+ * The user interacts purely via the terminal xterm view.
9
+ */
10
+ export declare class CodexTerminalAgent extends EventEmitter implements Agent {
11
+ readonly sessionId: string;
12
+ envId: string | null;
13
+ private status;
14
+ private cwd;
15
+ private createdAt;
16
+ private destroyed;
17
+ private cliSessionId;
18
+ private activityTracker;
19
+ constructor(sessionId: string);
20
+ initialize(options: AgentInitOptions): Promise<void>;
21
+ destroy(): Promise<void>;
22
+ sendMessage(text: string, _attachments?: Attachment[]): void;
23
+ approve(_requestId: string, _updatedInput?: any): void;
24
+ deny(_requestId: string): void;
25
+ answerQuestion(_requestId: string, _answers: Record<string, string>): void;
26
+ setMode(_mode: string): void;
27
+ setModel(_model: string): void;
28
+ refreshContext(): void;
29
+ onFocused(): void;
30
+ onBlurred(): void;
31
+ sendKey(key: string): void;
32
+ getInfo(): AgentSessionInfo;
33
+ forkToResumable(_afterEventUuid: string, _fromEventUuid?: string, _targetDir?: string): string | null;
34
+ getMessages(): WireMessage[];
35
+ getEvents(): SessionEvent[];
36
+ getCliSessionId(): string | null;
37
+ getWireMessages(): WireMessage[];
38
+ private getCapabilities;
39
+ private setStatus;
40
+ }