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,160 @@
1
+ import { EventEmitter } from 'events';
2
+ import os from 'os';
3
+ import { getProcessPid, getPty, killCliProcess } from '../../spawner.js';
4
+ import { spawnCodexCliProcess } from './spawner.js';
5
+ import { initFileTracking } from '../lib/fs-tracking.js';
6
+ import { PtyActivityTracker } from '../lib/pty-activity-tracker.js';
7
+ import { precreateCodexSession } from '../lib/session-precreate.js';
8
+ /**
9
+ * Terminal-only Codex agent.
10
+ * Spawns a plain `codex` PTY — no JSONL tailing, no chat overlay.
11
+ * The user interacts purely via the terminal xterm view.
12
+ */
13
+ export class CodexTerminalAgent extends EventEmitter {
14
+ sessionId;
15
+ envId = null;
16
+ status = 'open';
17
+ cwd = null;
18
+ createdAt = Date.now();
19
+ destroyed = false;
20
+ cliSessionId = null;
21
+ activityTracker = null;
22
+ constructor(sessionId) {
23
+ super();
24
+ this.sessionId = sessionId;
25
+ }
26
+ async initialize(options) {
27
+ this.cwd = options.cwd || os.homedir();
28
+ // Determine session UUID: use provided resume UUID, or pre-create a new one
29
+ const resumeUuid = options.resumeSessionUuid || precreateCodexSession(this.cwd);
30
+ this.cliSessionId = resumeUuid;
31
+ try {
32
+ const { envId, preloadSessionId } = spawnCodexCliProcess({
33
+ skipPermissions: options.skipPermissions,
34
+ cwd: this.cwd,
35
+ resumeSessionUuid: resumeUuid,
36
+ isChainContinuation: options.isChainContinuation,
37
+ });
38
+ this.envId = envId;
39
+ // Set up PTY activity tracking (burst detection → status events)
40
+ this.activityTracker = new PtyActivityTracker((status) => {
41
+ this.setStatus(status);
42
+ });
43
+ const pty = getPty(this.envId);
44
+ if (pty) {
45
+ pty.onData((data) => this.activityTracker?.onPtyData(data));
46
+ }
47
+ // Start file change detection (levels 1+2: LD_PRELOAD + inotify)
48
+ const pid = getProcessPid(this.envId);
49
+ if (pid) {
50
+ initFileTracking({
51
+ sessionId: this.cliSessionId,
52
+ cwd: this.cwd,
53
+ pid,
54
+ preloadSessionId,
55
+ });
56
+ }
57
+ this.emit('ready');
58
+ }
59
+ catch (err) {
60
+ this.emit('error', err);
61
+ throw err;
62
+ }
63
+ }
64
+ async destroy() {
65
+ if (this.destroyed)
66
+ return;
67
+ this.destroyed = true;
68
+ if (this.activityTracker) {
69
+ this.activityTracker.dispose();
70
+ this.activityTracker = null;
71
+ }
72
+ if (this.envId) {
73
+ killCliProcess(this.envId);
74
+ }
75
+ this.setStatus('exited');
76
+ this.emit('exit');
77
+ }
78
+ // Terminal-only: type message directly into the PTY
79
+ sendMessage(text, _attachments) {
80
+ if (!text || !this.envId)
81
+ return;
82
+ const pty = getPty(this.envId);
83
+ if (!pty)
84
+ return;
85
+ setTimeout(() => {
86
+ const p = getPty(this.envId);
87
+ if (p)
88
+ p.write(text + '\n');
89
+ }, 2000);
90
+ }
91
+ approve(_requestId, _updatedInput) { }
92
+ deny(_requestId) { }
93
+ answerQuestion(_requestId, _answers) { }
94
+ setMode(_mode) { }
95
+ setModel(_model) { }
96
+ refreshContext() { }
97
+ onFocused() { this.activityTracker?.onFocused(); }
98
+ onBlurred() { this.activityTracker?.onBlurred(); }
99
+ sendKey(key) {
100
+ if (!this.envId)
101
+ return;
102
+ const pty = getPty(this.envId);
103
+ if (!pty)
104
+ return;
105
+ const KEY_MAP = {
106
+ escape: '\x1b',
107
+ };
108
+ const sequence = KEY_MAP[key];
109
+ if (sequence) {
110
+ pty.write(sequence);
111
+ }
112
+ }
113
+ getInfo() {
114
+ return {
115
+ sessionId: this.sessionId,
116
+ agentType: 'codex-terminal',
117
+ agentMode: 'terminal',
118
+ status: this.status,
119
+ mode: 'default',
120
+ cwd: this.cwd || undefined,
121
+ capabilities: this.getCapabilities(),
122
+ createdAt: this.createdAt,
123
+ cliSessionId: this.cliSessionId || undefined,
124
+ };
125
+ }
126
+ forkToResumable(_afterEventUuid, _fromEventUuid, _targetDir) {
127
+ return null;
128
+ }
129
+ getMessages() {
130
+ return [];
131
+ }
132
+ getEvents() {
133
+ return [];
134
+ }
135
+ getCliSessionId() {
136
+ return this.cliSessionId;
137
+ }
138
+ getWireMessages() {
139
+ return [];
140
+ }
141
+ getCapabilities() {
142
+ return {
143
+ canChangeMode: false,
144
+ canChangeModel: false,
145
+ hasContextUsage: false,
146
+ canFork: false,
147
+ canResume: true,
148
+ hasTerminal: true,
149
+ hasFileTracking: true,
150
+ availableModes: [],
151
+ availableModels: [],
152
+ };
153
+ }
154
+ setStatus(status) {
155
+ if (this.status === status)
156
+ return;
157
+ this.status = status;
158
+ this.emit('status', status);
159
+ }
160
+ }
@@ -0,0 +1,13 @@
1
+ import type { AgentFactory, Agent, AgentDescriptor, HistoricalSession } from '../types.js';
2
+ import type { SessionEvent } from '../../events/types.js';
3
+ export declare class CodexTerminalAgentFactory implements AgentFactory {
4
+ agentType: string;
5
+ agentFamily: string;
6
+ create(sessionId: string): Agent;
7
+ getDescriptor(): AgentDescriptor;
8
+ getHistoricalSessions(): Promise<HistoricalSession[]>;
9
+ ownsSession(uuid: string): Promise<boolean>;
10
+ getSessionFilesForProject(cwds: string[]): Promise<string[]>;
11
+ readSessionEvents(uuid: string): Promise<SessionEvent[]>;
12
+ writeSessionForResume(events: SessionEvent[], targetUuid: string, directory: string): string;
13
+ }
@@ -0,0 +1,47 @@
1
+ import { CodexTerminalAgent } from './adapter.js';
2
+ import { codexSessionScanner } from '../lib/codex/fs-sessions.js';
3
+ import { writeForkedCodexJsonl } from '../lib/codex/jsonl-writer.js';
4
+ export class CodexTerminalAgentFactory {
5
+ agentType = 'codex-terminal';
6
+ agentFamily = 'codex';
7
+ create(sessionId) {
8
+ return new CodexTerminalAgent(sessionId);
9
+ }
10
+ getDescriptor() {
11
+ return {
12
+ agentType: this.agentType,
13
+ agentFamily: this.agentFamily,
14
+ name: 'Codex',
15
+ mode: 'terminal',
16
+ iconUrl: `data:image/svg+xml,${encodeURIComponent('<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#10a37f" viewBox="0 0 24 24"><path d="M22.282 9.821a5.985 5.985 0 0 0-.516-4.91 6.046 6.046 0 0 0-6.51-2.9A6.065 6.065 0 0 0 4.981 4.18a5.985 5.985 0 0 0-3.998 2.9 6.046 6.046 0 0 0 .743 7.097 5.98 5.98 0 0 0 .51 4.911 6.051 6.051 0 0 0 6.515 2.9A5.985 5.985 0 0 0 13.26 24a6.056 6.056 0 0 0 5.772-4.206 5.99 5.99 0 0 0 3.997-2.9 6.056 6.056 0 0 0-.747-7.073zM13.26 22.43a4.476 4.476 0 0 1-2.876-1.04l.141-.081 4.779-2.758a.795.795 0 0 0 .392-.681v-6.737l2.02 1.168a.071.071 0 0 1 .038.052v5.583a4.504 4.504 0 0 1-4.494 4.494zM3.6 18.304a4.47 4.47 0 0 1-.535-3.014l.142.085 4.783 2.759a.771.771 0 0 0 .78 0l5.843-3.369v2.332a.08.08 0 0 1-.033.062L9.74 19.95a4.5 4.5 0 0 1-6.14-1.646zM2.34 7.896a4.485 4.485 0 0 1 2.366-1.973V11.6a.766.766 0 0 0 .388.676l5.815 3.355-2.02 1.168a.076.076 0 0 1-.071 0l-4.83-2.786A4.504 4.504 0 0 1 2.34 7.872zm16.597 3.855l-5.833-3.387L15.119 7.2a.076.076 0 0 1 .071 0l4.83 2.791a4.494 4.494 0 0 1-.676 8.105v-5.678a.79.79 0 0 0-.407-.667zm2.01-3.023l-.141-.085-4.774-2.782a.776.776 0 0 0-.785 0L9.409 9.23V6.897a.066.066 0 0 1 .028-.061l4.83-2.787a4.5 4.5 0 0 1 6.68 4.66zm-12.64 4.135l-2.02-1.164a.08.08 0 0 1-.038-.057V6.075a4.5 4.5 0 0 1 7.375-3.453l-.142.08L8.704 5.46a.795.795 0 0 0-.393.681zm1.097-2.365l2.602-1.5 2.607 1.5v2.999l-2.597 1.5-2.607-1.5z"/></svg>')}`,
17
+ };
18
+ }
19
+ async getHistoricalSessions() {
20
+ const sessions = await codexSessionScanner.scan();
21
+ return sessions.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
+ const meta = codexSessionScanner.getByUuid(uuid);
32
+ if (meta)
33
+ return true;
34
+ codexSessionScanner.invalidate();
35
+ await codexSessionScanner.scan();
36
+ return !!codexSessionScanner.getByUuid(uuid);
37
+ }
38
+ async getSessionFilesForProject(cwds) {
39
+ return codexSessionScanner.getFilesForProject(cwds);
40
+ }
41
+ async readSessionEvents(uuid) {
42
+ return codexSessionScanner.readEvents(uuid);
43
+ }
44
+ writeSessionForResume(events, targetUuid, directory) {
45
+ return writeForkedCodexJsonl(events, targetUuid, directory);
46
+ }
47
+ }
@@ -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,56 @@
1
+ /**
2
+ * Codex Terminal–specific spawn logic.
3
+ * Spawns a plain `codex` PTY with MCP, system prompt, and LD_PRELOAD for file tracking.
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
+ command = 'codex';
38
+ args = ['resume', options.resumeSessionUuid, ...baseArgs];
39
+ }
40
+ else {
41
+ command = 'codex';
42
+ args = [...baseArgs];
43
+ }
44
+ const preloadSessionId = uuidv4();
45
+ const env = { ...process.env };
46
+ addPreloadEnv(env, preloadSessionId);
47
+ const { envId } = spawnProcess({
48
+ command,
49
+ args,
50
+ cwd,
51
+ env,
52
+ preloadSessionId,
53
+ logPrefix: 'codex-terminal',
54
+ });
55
+ return { envId, preloadSessionId };
56
+ }
@@ -0,0 +1,58 @@
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 + Chat Read-Only agent for Codex CLI.
7
+ * Spawns a plain `codex` PTY and uses the notify callback to discover
8
+ * the session thread-id, then tails the JSONL file for chat content.
9
+ */
10
+ export declare class CodexTerminalChatROAgent extends EventEmitter implements Agent {
11
+ readonly sessionId: string;
12
+ envId: string | null;
13
+ private status;
14
+ private activityTracker;
15
+ private cwd;
16
+ private createdAt;
17
+ private destroyed;
18
+ private jsonlWatcher;
19
+ private toolTracker;
20
+ private wireMessages;
21
+ private events;
22
+ private pendingToolUses;
23
+ private cliSessionId;
24
+ private resumeSessionUuid;
25
+ constructor(sessionId: string);
26
+ initialize(options: AgentInitOptions): Promise<void>;
27
+ destroy(): Promise<void>;
28
+ onFocused(): void;
29
+ onBlurred(): void;
30
+ sendMessage(text: string, _attachments?: Attachment[]): void;
31
+ approve(_requestId: string, _updatedInput?: any): void;
32
+ deny(_requestId: string): void;
33
+ answerQuestion(_requestId: string, _answers: Record<string, string>): void;
34
+ setMode(_mode: string): void;
35
+ setModel(_model: string): void;
36
+ refreshContext(): void;
37
+ sendKey(key: string): void;
38
+ getInfo(): AgentSessionInfo;
39
+ forkToResumable(afterEventUuid: string, fromEventUuid?: string, targetDir?: string): string | null;
40
+ getCliSessionId(): string | null;
41
+ getMessages(): WireMessage[];
42
+ getEvents(): SessionEvent[];
43
+ getWireMessages(): WireMessage[];
44
+ /**
45
+ * Start tailing the JSONL file for a known session UUID.
46
+ * For resume: tails from the end of historical content (new appended content only).
47
+ * For new sessions: tails from offset 0 (reads everything).
48
+ */
49
+ private startTailing;
50
+ /**
51
+ * Read the known session file by UUID and populate events/wireMessages.
52
+ * Synchronous — no watcher, no discovery, just a direct file read.
53
+ */
54
+ private loadHistoricalFile;
55
+ private handleEvent;
56
+ private getCapabilities;
57
+ private setStatus;
58
+ }
@@ -0,0 +1,266 @@
1
+ import { EventEmitter } from 'events';
2
+ import fs from 'fs';
3
+ import os from 'os';
4
+ import { toWireMessages } from '../../events/wire.js';
5
+ import { mapCodexJsonlLine } from '../lib/codex/jsonl-mapper.js';
6
+ import { codexSessionScanner } from '../lib/codex/fs-sessions.js';
7
+ import { forkEventsToResumable } from '../lib/claude/jsonl-writer.js';
8
+ import { getProcessPid, getPty, killCliProcess } from '../../spawner.js';
9
+ import { spawnCodexCliProcess } from './spawner.js';
10
+ import { CodexJsonlWatcher } from './jsonl-watcher.js';
11
+ import { initFileTracking, ToolResultFileTracker } from '../lib/fs-tracking.js';
12
+ import { PtyActivityTracker } from '../lib/pty-activity-tracker.js';
13
+ import { precreateCodexSession } from '../lib/session-precreate.js';
14
+ /**
15
+ * Terminal + Chat Read-Only agent for Codex CLI.
16
+ * Spawns a plain `codex` PTY and uses the notify callback to discover
17
+ * the session thread-id, then tails the JSONL file for chat content.
18
+ */
19
+ export class CodexTerminalChatROAgent extends EventEmitter {
20
+ sessionId;
21
+ envId = null;
22
+ status = 'open';
23
+ activityTracker = null;
24
+ cwd = null;
25
+ createdAt = Date.now();
26
+ destroyed = false;
27
+ jsonlWatcher = null;
28
+ toolTracker = null;
29
+ wireMessages = [];
30
+ events = [];
31
+ pendingToolUses = new Map();
32
+ cliSessionId = null;
33
+ resumeSessionUuid = null;
34
+ constructor(sessionId) {
35
+ super();
36
+ this.sessionId = sessionId;
37
+ }
38
+ async initialize(options) {
39
+ this.cwd = options.cwd || os.homedir();
40
+ // Determine session UUID: use provided resume UUID, or pre-create a new one
41
+ const resumeUuid = options.resumeSessionUuid || precreateCodexSession(this.cwd);
42
+ this.cliSessionId = resumeUuid;
43
+ try {
44
+ if (options.resumeSessionUuid) {
45
+ this.resumeSessionUuid = options.resumeSessionUuid;
46
+ // Read historical events directly from the known file
47
+ this.loadHistoricalFile(options.resumeSessionUuid);
48
+ }
49
+ // Spawn the terminal PTY — always with resume since we pre-created the file
50
+ const { envId, preloadSessionId } = spawnCodexCliProcess({
51
+ skipPermissions: options.skipPermissions,
52
+ cwd: this.cwd,
53
+ resumeSessionUuid: resumeUuid,
54
+ isChainContinuation: options.isChainContinuation,
55
+ });
56
+ this.envId = envId;
57
+ // Set up PTY activity tracking (burst detection → status events)
58
+ this.activityTracker = new PtyActivityTracker((status) => {
59
+ this.setStatus(status);
60
+ });
61
+ const pty = getPty(this.envId);
62
+ if (pty) {
63
+ pty.onData((data) => this.activityTracker?.onPtyData(data));
64
+ }
65
+ // Start file change detection (all 3 levels)
66
+ const pid = getProcessPid(this.envId);
67
+ if (pid) {
68
+ initFileTracking({
69
+ sessionId: this.cliSessionId,
70
+ cwd: this.cwd,
71
+ pid,
72
+ preloadSessionId,
73
+ });
74
+ }
75
+ this.toolTracker = new ToolResultFileTracker(this.cliSessionId);
76
+ // Start tailing the known session file — UUID is known, no discovery needed
77
+ this.startTailing(resumeUuid);
78
+ this.emit('ready');
79
+ }
80
+ catch (err) {
81
+ this.emit('error', err);
82
+ throw err;
83
+ }
84
+ }
85
+ async destroy() {
86
+ if (this.destroyed)
87
+ return;
88
+ this.destroyed = true;
89
+ if (this.activityTracker) {
90
+ this.activityTracker.dispose();
91
+ this.activityTracker = null;
92
+ }
93
+ if (this.jsonlWatcher) {
94
+ this.jsonlWatcher.stop();
95
+ this.jsonlWatcher = null;
96
+ }
97
+ if (this.envId) {
98
+ killCliProcess(this.envId);
99
+ }
100
+ this.setStatus('exited');
101
+ this.emit('exit');
102
+ }
103
+ onFocused() { this.activityTracker?.onFocused(); }
104
+ onBlurred() { this.activityTracker?.onBlurred(); }
105
+ // Terminal-only: type message directly into the PTY
106
+ sendMessage(text, _attachments) {
107
+ if (!text || !this.envId)
108
+ return;
109
+ const pty = getPty(this.envId);
110
+ if (!pty)
111
+ return;
112
+ setTimeout(() => {
113
+ const p = getPty(this.envId);
114
+ if (p)
115
+ p.write(text + '\n');
116
+ }, 2000);
117
+ }
118
+ approve(_requestId, _updatedInput) { }
119
+ deny(_requestId) { }
120
+ answerQuestion(_requestId, _answers) { }
121
+ setMode(_mode) { }
122
+ setModel(_model) { }
123
+ refreshContext() { }
124
+ sendKey(key) {
125
+ if (!this.envId)
126
+ return;
127
+ const pty = getPty(this.envId);
128
+ if (!pty)
129
+ return;
130
+ const KEY_MAP = {
131
+ escape: '\x1b',
132
+ };
133
+ const sequence = KEY_MAP[key];
134
+ if (sequence) {
135
+ pty.write(sequence);
136
+ }
137
+ }
138
+ getInfo() {
139
+ return {
140
+ sessionId: this.sessionId,
141
+ agentType: 'codex-terminal-chatro',
142
+ agentMode: 'terminal+chatRO',
143
+ status: this.status,
144
+ mode: 'default',
145
+ cwd: this.cwd || undefined,
146
+ capabilities: this.getCapabilities(),
147
+ createdAt: this.createdAt,
148
+ cliSessionId: this.cliSessionId || undefined,
149
+ };
150
+ }
151
+ forkToResumable(afterEventUuid, fromEventUuid, targetDir) {
152
+ const dir = targetDir || this.cwd || os.homedir();
153
+ const parentId = this.resumeSessionUuid || this.cliSessionId || this.sessionId;
154
+ return forkEventsToResumable(this.events, afterEventUuid, dir, parentId, fromEventUuid);
155
+ }
156
+ getCliSessionId() {
157
+ return this.cliSessionId;
158
+ }
159
+ getMessages() {
160
+ return this.wireMessages;
161
+ }
162
+ getEvents() {
163
+ return this.events;
164
+ }
165
+ getWireMessages() {
166
+ const wireToolUses = new Map();
167
+ const result = [];
168
+ for (const event of this.events) {
169
+ result.push(...toWireMessages(this.sessionId, event, wireToolUses));
170
+ }
171
+ return result;
172
+ }
173
+ /**
174
+ * Start tailing the JSONL file for a known session UUID.
175
+ * For resume: tails from the end of historical content (new appended content only).
176
+ * For new sessions: tails from offset 0 (reads everything).
177
+ */
178
+ startTailing(uuid) {
179
+ if (this.jsonlWatcher)
180
+ return; // already tailing
181
+ this.jsonlWatcher = new CodexJsonlWatcher();
182
+ this.jsonlWatcher.on('event', (event) => {
183
+ this.handleEvent(event);
184
+ });
185
+ this.jsonlWatcher.on('error', (err) => {
186
+ console.error(`[codex-terminal-chatro] JSONL watcher error:`, err.message);
187
+ });
188
+ // For resume: skip bytes already loaded by loadHistoricalFile
189
+ const filePath = codexSessionScanner.findSessionFile(uuid);
190
+ if (filePath && this.resumeSessionUuid) {
191
+ try {
192
+ const stat = fs.statSync(filePath);
193
+ this.jsonlWatcher.setInitialOffset(stat.size);
194
+ }
195
+ catch { }
196
+ }
197
+ this.jsonlWatcher.startTailingUuid(uuid);
198
+ }
199
+ /**
200
+ * Read the known session file by UUID and populate events/wireMessages.
201
+ * Synchronous — no watcher, no discovery, just a direct file read.
202
+ */
203
+ loadHistoricalFile(uuid) {
204
+ const filePath = codexSessionScanner.findSessionFile(uuid);
205
+ if (!filePath) {
206
+ console.warn(`[codex-terminal-chatro] Session file not found for ${uuid}`);
207
+ return;
208
+ }
209
+ try {
210
+ const content = fs.readFileSync(filePath, 'utf-8');
211
+ for (const line of content.split('\n')) {
212
+ if (!line.trim())
213
+ continue;
214
+ try {
215
+ const parsed = JSON.parse(line);
216
+ const events = mapCodexJsonlLine(parsed);
217
+ for (const event of events) {
218
+ this.events.push(event);
219
+ const wireMsgs = toWireMessages(this.sessionId, event, this.pendingToolUses);
220
+ for (const msg of wireMsgs) {
221
+ this.wireMessages.push(msg);
222
+ }
223
+ }
224
+ }
225
+ catch { /* skip unparseable lines */ }
226
+ }
227
+ console.log(`[codex-terminal-chatro] Loaded ${this.wireMessages.length} historical messages from ${uuid}`);
228
+ }
229
+ catch (err) {
230
+ console.warn(`[codex-terminal-chatro] Failed to read session file for ${uuid}:`, err.message);
231
+ }
232
+ }
233
+ handleEvent(event) {
234
+ this.events.push(event);
235
+ // Level 3: detect file-modifying tool results
236
+ this.toolTracker?.processEvent(event);
237
+ const mapped = toWireMessages(this.sessionId, event, this.pendingToolUses);
238
+ for (const msg of mapped) {
239
+ this.wireMessages.push(msg);
240
+ this.emit('message', msg);
241
+ }
242
+ // New content from watcher means codex is working
243
+ if (this.status !== 'active') {
244
+ this.setStatus('active');
245
+ }
246
+ }
247
+ getCapabilities() {
248
+ return {
249
+ canChangeMode: false,
250
+ canChangeModel: false,
251
+ hasContextUsage: false,
252
+ canFork: true,
253
+ canResume: true,
254
+ hasTerminal: true,
255
+ hasFileTracking: true,
256
+ availableModes: [],
257
+ availableModels: [],
258
+ };
259
+ }
260
+ setStatus(status) {
261
+ if (this.status === status)
262
+ return;
263
+ this.status = status;
264
+ this.emit('status', status);
265
+ }
266
+ }
@@ -0,0 +1,13 @@
1
+ import type { AgentFactory, Agent, AgentDescriptor, HistoricalSession } from '../types.js';
2
+ import type { SessionEvent } from '../../events/types.js';
3
+ export declare class CodexTerminalChatROAgentFactory implements AgentFactory {
4
+ agentType: string;
5
+ agentFamily: string;
6
+ create(sessionId: string): Agent;
7
+ getDescriptor(): AgentDescriptor;
8
+ getHistoricalSessions(): Promise<HistoricalSession[]>;
9
+ ownsSession(uuid: string): Promise<boolean>;
10
+ getSessionFilesForProject(cwds: string[]): Promise<string[]>;
11
+ readSessionEvents(uuid: string): Promise<SessionEvent[]>;
12
+ writeSessionForResume(events: SessionEvent[], targetUuid: string, directory: string): string;
13
+ }
@@ -0,0 +1,50 @@
1
+ import { CodexTerminalChatROAgent } from './adapter.js';
2
+ import { codexSessionScanner } from '../lib/codex/fs-sessions.js';
3
+ import { writeForkedCodexJsonl } from '../lib/codex/jsonl-writer.js';
4
+ export class CodexTerminalChatROAgentFactory {
5
+ agentType = 'codex-terminal-chatro';
6
+ agentFamily = 'codex';
7
+ create(sessionId) {
8
+ return new CodexTerminalChatROAgent(sessionId);
9
+ }
10
+ getDescriptor() {
11
+ return {
12
+ agentType: this.agentType,
13
+ agentFamily: this.agentFamily,
14
+ name: 'Codex + ChatUI',
15
+ mode: 'terminal+chatRO',
16
+ // Codex logo (green terminal icon)
17
+ iconUrl: `data:image/svg+xml,${encodeURIComponent('<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#10a37f" viewBox="0 0 24 24"><path d="M22.282 9.821a5.985 5.985 0 0 0-.516-4.91 6.046 6.046 0 0 0-6.51-2.9A6.065 6.065 0 0 0 4.981 4.18a5.985 5.985 0 0 0-3.998 2.9 6.046 6.046 0 0 0 .743 7.097 5.98 5.98 0 0 0 .51 4.911 6.051 6.051 0 0 0 6.515 2.9A5.985 5.985 0 0 0 13.26 24a6.056 6.056 0 0 0 5.772-4.206 5.99 5.99 0 0 0 3.997-2.9 6.056 6.056 0 0 0-.747-7.073zM13.26 22.43a4.476 4.476 0 0 1-2.876-1.04l.141-.081 4.779-2.758a.795.795 0 0 0 .392-.681v-6.737l2.02 1.168a.071.071 0 0 1 .038.052v5.583a4.504 4.504 0 0 1-4.494 4.494zM3.6 18.304a4.47 4.47 0 0 1-.535-3.014l.142.085 4.783 2.759a.771.771 0 0 0 .78 0l5.843-3.369v2.332a.08.08 0 0 1-.033.062L9.74 19.95a4.5 4.5 0 0 1-6.14-1.646zM2.34 7.896a4.485 4.485 0 0 1 2.366-1.973V11.6a.766.766 0 0 0 .388.676l5.815 3.355-2.02 1.168a.076.076 0 0 1-.071 0l-4.83-2.786A4.504 4.504 0 0 1 2.34 7.872zm16.597 3.855l-5.833-3.387L15.119 7.2a.076.076 0 0 1 .071 0l4.83 2.791a4.494 4.494 0 0 1-.676 8.105v-5.678a.79.79 0 0 0-.407-.667zm2.01-3.023l-.141-.085-4.774-2.782a.776.776 0 0 0-.785 0L9.409 9.23V6.897a.066.066 0 0 1 .028-.061l4.83-2.787a4.5 4.5 0 0 1 6.68 4.66zm-12.64 4.135l-2.02-1.164a.08.08 0 0 1-.038-.057V6.075a4.5 4.5 0 0 1 7.375-3.453l-.142.08L8.704 5.46a.795.795 0 0 0-.393.681zm1.097-2.365l2.602-1.5 2.607 1.5v2.999l-2.597 1.5-2.607-1.5z"/></svg>')}`,
18
+ };
19
+ }
20
+ async getHistoricalSessions() {
21
+ const sessions = await codexSessionScanner.scan();
22
+ return sessions.map(s => ({
23
+ id: s.uuid,
24
+ agentType: this.agentType,
25
+ title: s.title,
26
+ directory: s.directory,
27
+ lastModified: s.lastModified,
28
+ eventCount: s.eventCount,
29
+ }));
30
+ }
31
+ async ownsSession(uuid) {
32
+ // Check if we can find this session in Codex's session storage
33
+ const meta = codexSessionScanner.getByUuid(uuid);
34
+ if (meta)
35
+ return true;
36
+ // Try scanning if cache is empty
37
+ codexSessionScanner.invalidate();
38
+ await codexSessionScanner.scan();
39
+ return !!codexSessionScanner.getByUuid(uuid);
40
+ }
41
+ async getSessionFilesForProject(cwds) {
42
+ return codexSessionScanner.getFilesForProject(cwds);
43
+ }
44
+ async readSessionEvents(uuid) {
45
+ return codexSessionScanner.readEvents(uuid);
46
+ }
47
+ writeSessionForResume(events, targetUuid, directory) {
48
+ return writeForkedCodexJsonl(events, targetUuid, directory);
49
+ }
50
+ }