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,154 @@
1
+ /**
2
+ * Map Codex CLI JSONL lines → SessionEvent[].
3
+ *
4
+ * Codex JSONL uses a wrapper format with top-level `type` + `payload`:
5
+ * session_meta → SystemEvent (init)
6
+ * event_msg → UserEvent / AssistantEvent / ResultEvent
7
+ * response_item → AssistantEvent (function_call) / UserEvent (function_call_output)
8
+ * turn_context → skipped
9
+ */
10
+ import { v4 as uuidv4 } from 'uuid';
11
+ // ═══════════════════════════════════════════════════════
12
+ // Mapper
13
+ // ═══════════════════════════════════════════════════════
14
+ /**
15
+ * Convert a single parsed Codex JSONL line into zero or more SessionEvents.
16
+ */
17
+ export function mapCodexJsonlLine(line) {
18
+ const ts = line.timestamp;
19
+ switch (line.type) {
20
+ case 'session_meta':
21
+ return mapSessionMeta(line.payload, ts);
22
+ case 'event_msg':
23
+ return mapEventMsg(line.payload, ts);
24
+ case 'response_item':
25
+ return mapResponseItem(line.payload, ts);
26
+ // turn_context — per-turn metadata, skip
27
+ default:
28
+ return [];
29
+ }
30
+ }
31
+ // ───────────────────────────────────────────────────────
32
+ // session_meta → SystemEvent (init)
33
+ // ───────────────────────────────────────────────────────
34
+ function mapSessionMeta(payload, ts) {
35
+ const model = payload.model_provider === 'openai'
36
+ ? 'gpt-5.4'
37
+ : (payload.model_provider || 'unknown');
38
+ return [{
39
+ type: 'system',
40
+ uuid: uuidv4(),
41
+ subtype: 'init',
42
+ model,
43
+ timestamp: ts,
44
+ cwd: payload.cwd,
45
+ }];
46
+ }
47
+ // ───────────────────────────────────────────────────────
48
+ // event_msg → various events
49
+ // ───────────────────────────────────────────────────────
50
+ function mapEventMsg(payload, ts) {
51
+ switch (payload.type) {
52
+ case 'user_message':
53
+ return [{
54
+ type: 'user',
55
+ uuid: uuidv4(),
56
+ timestamp: ts,
57
+ message: {
58
+ role: 'user',
59
+ content: payload.message || '',
60
+ },
61
+ }];
62
+ case 'agent_message':
63
+ return [{
64
+ type: 'assistant',
65
+ uuid: uuidv4(),
66
+ timestamp: ts,
67
+ message: {
68
+ role: 'assistant',
69
+ content: [{ type: 'text', text: payload.message || '' }],
70
+ },
71
+ }];
72
+ case 'task_complete':
73
+ return [{
74
+ type: 'result',
75
+ uuid: uuidv4(),
76
+ timestamp: ts,
77
+ subtype: 'task_complete',
78
+ result: payload.last_agent_message,
79
+ }];
80
+ // task_started, token_count — skip
81
+ default:
82
+ return [];
83
+ }
84
+ }
85
+ // ───────────────────────────────────────────────────────
86
+ // response_item → tool use / tool result
87
+ // ───────────────────────────────────────────────────────
88
+ function mapResponseItem(payload, ts) {
89
+ switch (payload.type) {
90
+ case 'function_call':
91
+ return mapFunctionCall(payload, ts);
92
+ case 'function_call_output':
93
+ return mapFunctionCallOutput(payload, ts);
94
+ // Skip: message (duplicates event_msg), reasoning (encrypted), web_search_call
95
+ default:
96
+ return [];
97
+ }
98
+ }
99
+ function mapFunctionCall(payload, ts) {
100
+ const callId = payload.call_id || uuidv4();
101
+ const name = payload.name || 'unknown';
102
+ let input = {};
103
+ try {
104
+ input = JSON.parse(payload.arguments || '{}');
105
+ }
106
+ catch {
107
+ input = { raw: payload.arguments };
108
+ }
109
+ // Map request_user_input to ControlRequestEvent (question UI)
110
+ if (name === 'request_user_input') {
111
+ return [{
112
+ type: 'control_request',
113
+ uuid: uuidv4(),
114
+ timestamp: ts,
115
+ request_id: callId,
116
+ request: {
117
+ subtype: 'tool_use',
118
+ tool_use: { name: 'AskUserQuestion', input },
119
+ },
120
+ }];
121
+ }
122
+ // Regular tool call → AssistantEvent with tool_use block
123
+ return [{
124
+ type: 'assistant',
125
+ uuid: uuidv4(),
126
+ timestamp: ts,
127
+ message: {
128
+ role: 'assistant',
129
+ content: [{
130
+ type: 'tool_use',
131
+ id: callId,
132
+ name,
133
+ input,
134
+ }],
135
+ },
136
+ }];
137
+ }
138
+ function mapFunctionCallOutput(payload, ts) {
139
+ const callId = payload.call_id || '';
140
+ const output = payload.output || '';
141
+ return [{
142
+ type: 'user',
143
+ uuid: uuidv4(),
144
+ timestamp: ts,
145
+ message: {
146
+ role: 'user',
147
+ content: [{
148
+ type: 'tool_result',
149
+ tool_use_id: callId,
150
+ content: output,
151
+ }],
152
+ },
153
+ }];
154
+ }
@@ -0,0 +1,8 @@
1
+ import type { SessionEvent } from '../../../events/types.js';
2
+ /**
3
+ * Write SessionEvent[] as a Codex JSONL file for `codex resume`.
4
+ * Path: ~/.codex/sessions/YYYY/MM/DD/rollout-{timestamp}-{uuid}.jsonl
5
+ *
6
+ * @returns The full path to the written JSONL file
7
+ */
8
+ export declare function writeForkedCodexJsonl(events: SessionEvent[], targetUuid: string, directory: string): string;
@@ -0,0 +1,440 @@
1
+ /**
2
+ * Reconstruct Codex CLI JSONL from SessionEvent[] for fork/resume.
3
+ *
4
+ * Codex JSONL format:
5
+ * {"timestamp":"...","type":"session_meta","payload":{...}}
6
+ * {"timestamp":"...","type":"event_msg","payload":{"type":"user_message","message":"..."}}
7
+ * {"timestamp":"...","type":"event_msg","payload":{"type":"agent_message","message":"...","phase":"final_answer"}}
8
+ * {"timestamp":"...","type":"response_item","payload":{"type":"function_call","name":"...","arguments":"...","call_id":"..."}}
9
+ * {"timestamp":"...","type":"response_item","payload":{"type":"function_call_output","call_id":"...","output":"..."}}
10
+ */
11
+ import fs from 'fs';
12
+ import path from 'path';
13
+ import os from 'os';
14
+ import { v4 as uuidv4 } from 'uuid';
15
+ import { findMostRecentCodexSession } from '../session-precreate.js';
16
+ const CODEX_SESSIONS_DIR = path.join(os.homedir(), '.codex', 'sessions');
17
+ /**
18
+ * Build the Codex session directory path for the current date.
19
+ * ~/.codex/sessions/YYYY/MM/DD/
20
+ */
21
+ function getDateDir() {
22
+ const now = new Date();
23
+ const y = now.getFullYear().toString();
24
+ const m = (now.getMonth() + 1).toString().padStart(2, '0');
25
+ const d = now.getDate().toString().padStart(2, '0');
26
+ return path.join(CODEX_SESSIONS_DIR, y, m, d);
27
+ }
28
+ /**
29
+ * Build the Codex JSONL filename.
30
+ * rollout-YYYY-MM-DDTHH-MM-SS-{uuid}.jsonl
31
+ */
32
+ function buildFilename(uuid) {
33
+ const now = new Date();
34
+ const ts = now.toISOString().replace(/:/g, '-').replace(/\.\d+Z$/, '');
35
+ return `rollout-${ts}-${uuid}.jsonl`;
36
+ }
37
+ // ═══════════════════════════════════════════════════════
38
+ // SessionEvent → Codex JSONL line reconstruction
39
+ // ═══════════════════════════════════════════════════════
40
+ function reconstructSessionMeta(event, sessionUuid, cwd) {
41
+ return {
42
+ timestamp: event.timestamp || new Date().toISOString(),
43
+ type: 'session_meta',
44
+ payload: {
45
+ id: sessionUuid,
46
+ timestamp: event.timestamp || new Date().toISOString(),
47
+ cwd,
48
+ originator: 'codex_cli_rs',
49
+ cli_version: '0.111.0',
50
+ source: 'cli',
51
+ model_provider: 'openai',
52
+ },
53
+ };
54
+ }
55
+ function reconstructUserMessage(event) {
56
+ const content = event.message.content;
57
+ const ts = event.timestamp || new Date().toISOString();
58
+ // Tool result events — map to function_call_output
59
+ if (Array.isArray(content)) {
60
+ const results = [];
61
+ for (const block of content) {
62
+ if (block.type === 'tool_result' && 'tool_use_id' in block) {
63
+ const output = typeof block.content === 'string'
64
+ ? block.content
65
+ : Array.isArray(block.content)
66
+ ? block.content.map((b) => b.text || '').join('')
67
+ : JSON.stringify(block.content || '');
68
+ results.push({
69
+ timestamp: ts,
70
+ type: 'response_item',
71
+ payload: {
72
+ type: 'function_call_output',
73
+ call_id: block.tool_use_id,
74
+ output,
75
+ },
76
+ });
77
+ }
78
+ }
79
+ if (results.length > 0)
80
+ return results;
81
+ }
82
+ // Plain text user message — handle both string and array-of-text-blocks formats
83
+ let text = '';
84
+ if (typeof content === 'string') {
85
+ text = content;
86
+ }
87
+ else if (Array.isArray(content)) {
88
+ // Extract text from text blocks (e.g. [{ type: 'text', text: '...' }])
89
+ text = content
90
+ .filter((b) => b.type === 'text' || b.type === 'input_text')
91
+ .map((b) => b.text || '')
92
+ .join('\n');
93
+ }
94
+ if (!text)
95
+ return [];
96
+ return [
97
+ // response_item with role:"user" — this is what Codex uses to rebuild context
98
+ {
99
+ timestamp: ts,
100
+ type: 'response_item',
101
+ payload: {
102
+ type: 'message',
103
+ role: 'user',
104
+ content: [{ type: 'input_text', text }],
105
+ },
106
+ },
107
+ // event_msg for UI display
108
+ {
109
+ timestamp: ts,
110
+ type: 'event_msg',
111
+ payload: {
112
+ type: 'user_message',
113
+ message: text,
114
+ images: [],
115
+ local_images: [],
116
+ text_elements: [],
117
+ },
118
+ },
119
+ ];
120
+ }
121
+ function reconstructAssistantMessage(event) {
122
+ const lines = [];
123
+ const content = event.message.content;
124
+ const ts = event.timestamp || new Date().toISOString();
125
+ // Collect text blocks for the response_item with role:"assistant"
126
+ const outputTextBlocks = [];
127
+ if (Array.isArray(content)) {
128
+ for (const block of content) {
129
+ if (block.type === 'text') {
130
+ outputTextBlocks.push({ type: 'output_text', text: block.text });
131
+ // event_msg for UI display
132
+ lines.push({
133
+ timestamp: ts,
134
+ type: 'event_msg',
135
+ payload: {
136
+ type: 'agent_message',
137
+ message: block.text,
138
+ phase: 'final_answer',
139
+ },
140
+ });
141
+ }
142
+ else if (block.type === 'tool_use' && 'id' in block && 'name' in block) {
143
+ lines.push({
144
+ timestamp: ts,
145
+ type: 'response_item',
146
+ payload: {
147
+ type: 'function_call',
148
+ name: block.name,
149
+ arguments: JSON.stringify(block.input || {}),
150
+ call_id: block.id,
151
+ },
152
+ });
153
+ }
154
+ }
155
+ }
156
+ else if (typeof content === 'string') {
157
+ outputTextBlocks.push({ type: 'output_text', text: content });
158
+ lines.push({
159
+ timestamp: ts,
160
+ type: 'event_msg',
161
+ payload: {
162
+ type: 'agent_message',
163
+ message: content,
164
+ phase: 'final_answer',
165
+ },
166
+ });
167
+ }
168
+ // response_item with role:"assistant" — this is what Codex uses to rebuild context
169
+ if (outputTextBlocks.length > 0) {
170
+ lines.push({
171
+ timestamp: ts,
172
+ type: 'response_item',
173
+ payload: {
174
+ type: 'message',
175
+ role: 'assistant',
176
+ content: outputTextBlocks,
177
+ phase: 'final_answer',
178
+ },
179
+ });
180
+ }
181
+ return lines;
182
+ }
183
+ function reconstructResult(event) {
184
+ return {
185
+ timestamp: event.timestamp || new Date().toISOString(),
186
+ type: 'event_msg',
187
+ payload: {
188
+ type: 'task_complete',
189
+ turn_id: uuidv4(),
190
+ last_agent_message: event.result || '',
191
+ },
192
+ };
193
+ }
194
+ function reconstructControlRequest(event) {
195
+ const toolUse = event.request?.tool_use;
196
+ if (!toolUse)
197
+ return null;
198
+ // Map AskUserQuestion back to request_user_input
199
+ const name = toolUse.name === 'AskUserQuestion' ? 'request_user_input' : toolUse.name;
200
+ return {
201
+ timestamp: event.timestamp || new Date().toISOString(),
202
+ type: 'response_item',
203
+ payload: {
204
+ type: 'function_call',
205
+ name,
206
+ arguments: JSON.stringify(toolUse.input || {}),
207
+ call_id: event.request_id || uuidv4(),
208
+ },
209
+ };
210
+ }
211
+ function reconstructTurnContext(turnId, cwd, model) {
212
+ return {
213
+ timestamp: new Date().toISOString(),
214
+ type: 'turn_context',
215
+ payload: {
216
+ turn_id: turnId,
217
+ cwd,
218
+ current_date: new Date().toISOString().split('T')[0],
219
+ timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
220
+ approval_policy: 'on-request',
221
+ sandbox_policy: {
222
+ type: 'workspace-write',
223
+ writable_roots: [],
224
+ network_access: false,
225
+ exclude_tmpdir_env_var: false,
226
+ exclude_slash_tmp: false,
227
+ },
228
+ model,
229
+ personality: 'pragmatic',
230
+ collaboration_mode: { mode: 'default', settings: {} },
231
+ realtime_active: false,
232
+ summary: 'none',
233
+ user_instructions: '',
234
+ truncation_policy: { mode: 'tokens', limit: 10000 },
235
+ },
236
+ };
237
+ }
238
+ function reconstructTaskStarted(turnId, ts) {
239
+ return {
240
+ timestamp: ts,
241
+ type: 'event_msg',
242
+ payload: {
243
+ type: 'task_started',
244
+ turn_id: turnId,
245
+ model_context_window: 258400,
246
+ collaboration_mode_kind: 'default',
247
+ },
248
+ };
249
+ }
250
+ function reconstructTaskComplete(turnId, ts, lastMessage) {
251
+ return {
252
+ timestamp: ts,
253
+ type: 'event_msg',
254
+ payload: {
255
+ type: 'task_complete',
256
+ turn_id: turnId,
257
+ last_agent_message: lastMessage,
258
+ },
259
+ };
260
+ }
261
+ /**
262
+ * Convert SessionEvent to zero or more Codex JSONL line objects.
263
+ */
264
+ function toCodexJsonlLines(event, sessionUuid, cwd) {
265
+ switch (event.type) {
266
+ case 'system': {
267
+ const se = event;
268
+ if (se.subtype === 'init') {
269
+ return [reconstructSessionMeta(se, sessionUuid, cwd)];
270
+ }
271
+ return [];
272
+ }
273
+ case 'user': {
274
+ return reconstructUserMessage(event);
275
+ }
276
+ case 'assistant':
277
+ return reconstructAssistantMessage(event);
278
+ case 'result':
279
+ return [reconstructResult(event)];
280
+ case 'control_request': {
281
+ const cr = reconstructControlRequest(event);
282
+ return cr ? [cr] : [];
283
+ }
284
+ default:
285
+ return [];
286
+ }
287
+ }
288
+ // ═══════════════════════════════════════════════════════
289
+ // Public API
290
+ // ═══════════════════════════════════════════════════════
291
+ /**
292
+ * Group events into turns (user message + following assistant/result events).
293
+ * Each turn gets wrapped with task_started, turn_context, task_complete.
294
+ */
295
+ function groupIntoTurns(events) {
296
+ const system = [];
297
+ const turns = [];
298
+ let currentTurn = [];
299
+ for (const event of events) {
300
+ if (event.type === 'system') {
301
+ system.push(event);
302
+ continue;
303
+ }
304
+ // Skip non-conversation events (progress, last-prompt, etc.)
305
+ if (!['user', 'assistant', 'result', 'control_request'].includes(event.type)) {
306
+ continue;
307
+ }
308
+ if (event.type === 'user') {
309
+ // Tool results belong to the current turn, not a new one
310
+ const ue = event;
311
+ const content = ue.message.content;
312
+ const isToolResult = Array.isArray(content) && content.some((b) => b.type === 'tool_result');
313
+ if (!isToolResult && currentTurn.length > 0) {
314
+ turns.push(currentTurn);
315
+ currentTurn = [];
316
+ }
317
+ }
318
+ currentTurn.push(event);
319
+ }
320
+ if (currentTurn.length > 0)
321
+ turns.push(currentTurn);
322
+ return { system, turns };
323
+ }
324
+ /**
325
+ * Extract the last assistant text message from a turn for task_complete.
326
+ */
327
+ function getLastAssistantText(turn) {
328
+ for (let i = turn.length - 1; i >= 0; i--) {
329
+ if (turn[i].type === 'assistant') {
330
+ const ae = turn[i];
331
+ const content = ae.message.content;
332
+ if (typeof content === 'string')
333
+ return content;
334
+ if (Array.isArray(content)) {
335
+ const textBlock = [...content].reverse().find((b) => b.type === 'text');
336
+ if (textBlock && 'text' in textBlock)
337
+ return textBlock.text;
338
+ }
339
+ }
340
+ }
341
+ return '';
342
+ }
343
+ /**
344
+ * Write SessionEvent[] as a Codex JSONL file for `codex resume`.
345
+ * Path: ~/.codex/sessions/YYYY/MM/DD/rollout-{timestamp}-{uuid}.jsonl
346
+ *
347
+ * @returns The full path to the written JSONL file
348
+ */
349
+ export function writeForkedCodexJsonl(events, targetUuid, directory) {
350
+ const dateDir = getDateDir();
351
+ fs.mkdirSync(dateDir, { recursive: true });
352
+ const filename = buildFilename(targetUuid);
353
+ const jsonlPath = path.join(dateDir, filename);
354
+ const cwd = directory || process.cwd();
355
+ const model = 'gpt-5.4';
356
+ const lines = [];
357
+ // Ensure there's a session_meta + developer prompt at the start.
358
+ // Codex CLI requires the developer prompt (permissions, sandbox config) to resume.
359
+ // Clone the header (session_meta + developer prompt) from the most recent real session.
360
+ const hasInit = events.some(e => e.type === 'system' && e.subtype === 'init');
361
+ if (!hasInit) {
362
+ const donorFile = findMostRecentCodexSession();
363
+ if (donorFile) {
364
+ try {
365
+ const donorContent = fs.readFileSync(donorFile, 'utf-8');
366
+ const donorLines = donorContent.split('\n').filter(l => l.trim());
367
+ const headerLines = donorLines.slice(0, 2); // session_meta + developer prompt
368
+ // Extract donor UUID to replace with ours
369
+ const donorMeta = JSON.parse(headerLines[0]);
370
+ const donorUuid = donorMeta?.payload?.id;
371
+ for (const line of headerLines) {
372
+ const replaced = donorUuid ? line.replace(new RegExp(donorUuid, 'g'), targetUuid) : line;
373
+ lines.push(replaced);
374
+ }
375
+ }
376
+ catch {
377
+ // Fallback to minimal session_meta if donor read fails
378
+ lines.push(JSON.stringify({
379
+ timestamp: new Date().toISOString(),
380
+ type: 'session_meta',
381
+ payload: {
382
+ id: targetUuid,
383
+ timestamp: new Date().toISOString(),
384
+ cwd,
385
+ originator: 'codex_cli_rs',
386
+ cli_version: '0.111.0',
387
+ source: 'cli',
388
+ model_provider: 'openai',
389
+ },
390
+ }));
391
+ }
392
+ }
393
+ else {
394
+ lines.push(JSON.stringify({
395
+ timestamp: new Date().toISOString(),
396
+ type: 'session_meta',
397
+ payload: {
398
+ id: targetUuid,
399
+ timestamp: new Date().toISOString(),
400
+ cwd,
401
+ originator: 'codex_cli_rs',
402
+ cli_version: '0.111.0',
403
+ source: 'cli',
404
+ model_provider: 'openai',
405
+ },
406
+ }));
407
+ }
408
+ }
409
+ const { system, turns } = groupIntoTurns(events);
410
+ // Emit system events (session_meta from init)
411
+ for (const event of system) {
412
+ const codexLines = toCodexJsonlLines(event, targetUuid, cwd);
413
+ for (const line of codexLines) {
414
+ lines.push(JSON.stringify(line));
415
+ }
416
+ }
417
+ // Emit each turn with proper Codex structure
418
+ for (const turn of turns) {
419
+ const turnId = uuidv4();
420
+ const turnTs = turn[0]?.timestamp || new Date().toISOString();
421
+ // task_started
422
+ lines.push(JSON.stringify(reconstructTaskStarted(turnId, turnTs)));
423
+ // turn_context
424
+ lines.push(JSON.stringify(reconstructTurnContext(turnId, cwd, model)));
425
+ // Turn events (response_items + event_msgs)
426
+ for (const event of turn) {
427
+ const codexLines = toCodexJsonlLines(event, targetUuid, cwd);
428
+ for (const line of codexLines) {
429
+ lines.push(JSON.stringify(line));
430
+ }
431
+ }
432
+ // task_complete
433
+ const lastMsg = getLastAssistantText(turn);
434
+ const lastTs = turn[turn.length - 1]?.timestamp || new Date().toISOString();
435
+ lines.push(JSON.stringify(reconstructTaskComplete(turnId, lastTs, lastMsg)));
436
+ }
437
+ fs.writeFileSync(jsonlPath, lines.join('\n') + '\n');
438
+ console.log(`[codex-jsonl-writer] Reconstructed ${lines.length} lines to ${jsonlPath}`);
439
+ return jsonlPath;
440
+ }
@@ -0,0 +1,36 @@
1
+ import type { SessionEvent } from '../../events/types.js';
2
+ /**
3
+ * Add LD_PRELOAD environment variables to an env record.
4
+ * Only adds them if the preload .so exists on disk.
5
+ */
6
+ export declare function addPreloadEnv(env: Record<string, string | undefined>, preloadSessionId: string): void;
7
+ /**
8
+ * Initialize all three levels of file change detection for an agent session.
9
+ *
10
+ * Call this after spawning the CLI process and obtaining the envId/pid.
11
+ */
12
+ export declare function initFileTracking(opts: {
13
+ sessionId: string;
14
+ cwd: string;
15
+ pid: number;
16
+ preloadSessionId?: string;
17
+ }): void;
18
+ /**
19
+ * Tracks pending tool_use blocks and detects completed file-modifying tools.
20
+ * Create one instance per agent session and call `processEvent()` for each
21
+ * SessionEvent received from the JSONL watcher.
22
+ */
23
+ export declare class ToolResultFileTracker {
24
+ private pendingToolUses;
25
+ private sessionId;
26
+ constructor(sessionId: string);
27
+ /**
28
+ * Process a SessionEvent. Indexes tool_use blocks from assistant messages
29
+ * and detects tool_result blocks from user messages, notifying fsMonitor
30
+ * for Write/Edit/NotebookEdit completions.
31
+ */
32
+ processEvent(event: SessionEvent): void;
33
+ private indexToolUses;
34
+ private matchToolResults;
35
+ private notifyIfFileChange;
36
+ }