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.
- package/LICENSE +21 -0
- package/README.github.md +322 -0
- package/README.md +112 -0
- package/README.npm.md +112 -0
- package/bin/atoo-studio.js +90 -0
- package/dist/src/agents/claude-code-terminal/adapter.d.ts +42 -0
- package/dist/src/agents/claude-code-terminal/adapter.js +166 -0
- package/dist/src/agents/claude-code-terminal/index.d.ts +13 -0
- package/dist/src/agents/claude-code-terminal/index.js +45 -0
- package/dist/src/agents/claude-code-terminal/spawner.d.ts +9 -0
- package/dist/src/agents/claude-code-terminal/spawner.js +37 -0
- package/dist/src/agents/claude-code-terminal-chatro/adapter.d.ts +51 -0
- package/dist/src/agents/claude-code-terminal-chatro/adapter.js +301 -0
- package/dist/src/agents/claude-code-terminal-chatro/index.d.ts +13 -0
- package/dist/src/agents/claude-code-terminal-chatro/index.js +45 -0
- package/dist/src/agents/claude-code-terminal-chatro/jsonl-watcher.d.ts +67 -0
- package/dist/src/agents/claude-code-terminal-chatro/jsonl-watcher.js +431 -0
- package/dist/src/agents/claude-code-terminal-chatro/spawner.d.ts +9 -0
- package/dist/src/agents/claude-code-terminal-chatro/spawner.js +37 -0
- package/dist/src/agents/codex-terminal/adapter.d.ts +40 -0
- package/dist/src/agents/codex-terminal/adapter.js +160 -0
- package/dist/src/agents/codex-terminal/index.d.ts +13 -0
- package/dist/src/agents/codex-terminal/index.js +47 -0
- package/dist/src/agents/codex-terminal/spawner.d.ts +9 -0
- package/dist/src/agents/codex-terminal/spawner.js +56 -0
- package/dist/src/agents/codex-terminal-chatro/adapter.d.ts +58 -0
- package/dist/src/agents/codex-terminal-chatro/adapter.js +266 -0
- package/dist/src/agents/codex-terminal-chatro/index.d.ts +13 -0
- package/dist/src/agents/codex-terminal-chatro/index.js +50 -0
- package/dist/src/agents/codex-terminal-chatro/jsonl-watcher.d.ts +36 -0
- package/dist/src/agents/codex-terminal-chatro/jsonl-watcher.js +205 -0
- package/dist/src/agents/codex-terminal-chatro/spawner.d.ts +9 -0
- package/dist/src/agents/codex-terminal-chatro/spawner.js +57 -0
- package/dist/src/agents/lib/chain-builder.d.ts +21 -0
- package/dist/src/agents/lib/chain-builder.js +139 -0
- package/dist/src/agents/lib/claude/fs-sessions.d.ts +31 -0
- package/dist/src/agents/lib/claude/fs-sessions.js +329 -0
- package/dist/src/agents/lib/claude/jsonl-writer.d.ts +32 -0
- package/dist/src/agents/lib/claude/jsonl-writer.js +342 -0
- package/dist/src/agents/lib/claude/workspace-trust.d.ts +1 -0
- package/dist/src/agents/lib/claude/workspace-trust.js +29 -0
- package/dist/src/agents/lib/codex/fs-sessions.d.ts +34 -0
- package/dist/src/agents/lib/codex/fs-sessions.js +255 -0
- package/dist/src/agents/lib/codex/jsonl-mapper.d.ts +11 -0
- package/dist/src/agents/lib/codex/jsonl-mapper.js +154 -0
- package/dist/src/agents/lib/codex/jsonl-writer.d.ts +8 -0
- package/dist/src/agents/lib/codex/jsonl-writer.js +440 -0
- package/dist/src/agents/lib/fs-tracking.d.ts +36 -0
- package/dist/src/agents/lib/fs-tracking.js +109 -0
- package/dist/src/agents/lib/pty-activity-tracker.d.ts +37 -0
- package/dist/src/agents/lib/pty-activity-tracker.js +105 -0
- package/dist/src/agents/lib/session-id-utils.d.ts +46 -0
- package/dist/src/agents/lib/session-id-utils.js +147 -0
- package/dist/src/agents/lib/session-precreate.d.ts +17 -0
- package/dist/src/agents/lib/session-precreate.js +177 -0
- package/dist/src/agents/registry.d.ts +72 -0
- package/dist/src/agents/registry.js +337 -0
- package/dist/src/agents/types.d.ts +135 -0
- package/dist/src/agents/types.js +1 -0
- package/dist/src/auth/crypto-key.d.ts +6 -0
- package/dist/src/auth/crypto-key.js +45 -0
- package/dist/src/auth/middleware.d.ts +18 -0
- package/dist/src/auth/middleware.js +54 -0
- package/dist/src/auth/password.d.ts +2 -0
- package/dist/src/auth/password.js +12 -0
- package/dist/src/auth/session.d.ts +10 -0
- package/dist/src/auth/session.js +33 -0
- package/dist/src/auth/totp.d.ts +12 -0
- package/dist/src/auth/totp.js +61 -0
- package/dist/src/auth/webauthn.d.ts +6 -0
- package/dist/src/auth/webauthn.js +117 -0
- package/dist/src/config.d.ts +10 -0
- package/dist/src/config.js +16 -0
- package/dist/src/database/connection-manager.d.ts +25 -0
- package/dist/src/database/connection-manager.js +211 -0
- package/dist/src/database/discovery/container.d.ts +6 -0
- package/dist/src/database/discovery/container.js +226 -0
- package/dist/src/database/discovery/env-parser.d.ts +9 -0
- package/dist/src/database/discovery/env-parser.js +525 -0
- package/dist/src/database/discovery/local-files.d.ts +6 -0
- package/dist/src/database/discovery/local-files.js +58 -0
- package/dist/src/database/discovery/port-scan.d.ts +7 -0
- package/dist/src/database/discovery/port-scan.js +61 -0
- package/dist/src/database/drivers/cassandra.d.ts +12 -0
- package/dist/src/database/drivers/cassandra.js +91 -0
- package/dist/src/database/drivers/clickhouse.d.ts +11 -0
- package/dist/src/database/drivers/clickhouse.js +127 -0
- package/dist/src/database/drivers/elasticsearch.d.ts +12 -0
- package/dist/src/database/drivers/elasticsearch.js +169 -0
- package/dist/src/database/drivers/influxdb.d.ts +14 -0
- package/dist/src/database/drivers/influxdb.js +194 -0
- package/dist/src/database/drivers/memcached.d.ts +11 -0
- package/dist/src/database/drivers/memcached.js +117 -0
- package/dist/src/database/drivers/mongodb.d.ts +12 -0
- package/dist/src/database/drivers/mongodb.js +128 -0
- package/dist/src/database/drivers/mysql.d.ts +11 -0
- package/dist/src/database/drivers/mysql.js +112 -0
- package/dist/src/database/drivers/neo4j.d.ts +11 -0
- package/dist/src/database/drivers/neo4j.js +158 -0
- package/dist/src/database/drivers/postgresql.d.ts +11 -0
- package/dist/src/database/drivers/postgresql.js +133 -0
- package/dist/src/database/drivers/redis.d.ts +11 -0
- package/dist/src/database/drivers/redis.js +91 -0
- package/dist/src/database/drivers/sqlite.d.ts +10 -0
- package/dist/src/database/drivers/sqlite.js +100 -0
- package/dist/src/database/query-stream.d.ts +5 -0
- package/dist/src/database/query-stream.js +75 -0
- package/dist/src/database/types.d.ts +71 -0
- package/dist/src/database/types.js +1 -0
- package/dist/src/events/index.d.ts +3 -0
- package/dist/src/events/index.js +3 -0
- package/dist/src/events/types.d.ts +214 -0
- package/dist/src/events/types.js +22 -0
- package/dist/src/events/wire.d.ts +114 -0
- package/dist/src/events/wire.js +296 -0
- package/dist/src/fs-monitor-types.d.ts +24 -0
- package/dist/src/fs-monitor-types.js +1 -0
- package/dist/src/fs-monitor.d.ts +80 -0
- package/dist/src/fs-monitor.js +637 -0
- package/dist/src/handlers/auth.d.ts +1 -0
- package/dist/src/handlers/auth.js +170 -0
- package/dist/src/handlers/changes.d.ts +1 -0
- package/dist/src/handlers/changes.js +203 -0
- package/dist/src/handlers/containers.d.ts +12 -0
- package/dist/src/handlers/containers.js +379 -0
- package/dist/src/handlers/databases.d.ts +3 -0
- package/dist/src/handlers/databases.js +327 -0
- package/dist/src/handlers/environments.d.ts +3 -0
- package/dist/src/handlers/environments.js +286 -0
- package/dist/src/handlers/github.d.ts +1 -0
- package/dist/src/handlers/github.js +153 -0
- package/dist/src/handlers/projects.d.ts +1 -0
- package/dist/src/handlers/projects.js +895 -0
- package/dist/src/handlers/ssh.d.ts +1 -0
- package/dist/src/handlers/ssh.js +162 -0
- package/dist/src/handlers/users.d.ts +1 -0
- package/dist/src/handlers/users.js +195 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +228 -0
- package/dist/src/mcp/config.d.ts +32 -0
- package/dist/src/mcp/config.js +227 -0
- package/dist/src/mcp/server.d.ts +1 -0
- package/dist/src/mcp/server.js +574 -0
- package/dist/src/serial/cuse-device.d.ts +19 -0
- package/dist/src/serial/cuse-device.js +260 -0
- package/dist/src/serial/manager.d.ts +63 -0
- package/dist/src/serial/manager.js +206 -0
- package/dist/src/serial/pty-pair.d.ts +16 -0
- package/dist/src/serial/pty-pair.js +68 -0
- package/dist/src/services/fs-browser.d.ts +14 -0
- package/dist/src/services/fs-browser.js +98 -0
- package/dist/src/services/git-ops.d.ts +78 -0
- package/dist/src/services/git-ops.js +288 -0
- package/dist/src/services/github-ops.d.ts +104 -0
- package/dist/src/services/github-ops.js +192 -0
- package/dist/src/services/obfuscation.d.ts +2 -0
- package/dist/src/services/obfuscation.js +16 -0
- package/dist/src/services/preview/headless-backend.d.ts +62 -0
- package/dist/src/services/preview/headless-backend.js +698 -0
- package/dist/src/services/preview/injected-scripts.d.ts +9 -0
- package/dist/src/services/preview/injected-scripts.js +232 -0
- package/dist/src/services/preview/preview-backend.d.ts +92 -0
- package/dist/src/services/preview/preview-backend.js +15 -0
- package/dist/src/services/preview/universal-setter.d.ts +7 -0
- package/dist/src/services/preview/universal-setter.js +46 -0
- package/dist/src/services/preview-manager.d.ts +50 -0
- package/dist/src/services/preview-manager.js +216 -0
- package/dist/src/services/project-watcher.d.ts +6 -0
- package/dist/src/services/project-watcher.js +307 -0
- package/dist/src/services/remote-fs-browser.d.ts +11 -0
- package/dist/src/services/remote-fs-browser.js +50 -0
- package/dist/src/services/remote-git-ops.d.ts +71 -0
- package/dist/src/services/remote-git-ops.js +215 -0
- package/dist/src/services/session-search.d.ts +56 -0
- package/dist/src/services/session-search.js +303 -0
- package/dist/src/services/ssh-manager.d.ts +44 -0
- package/dist/src/services/ssh-manager.js +359 -0
- package/dist/src/session-writer.d.ts +9 -0
- package/dist/src/session-writer.js +66 -0
- package/dist/src/spawner.d.ts +56 -0
- package/dist/src/spawner.js +135 -0
- package/dist/src/state/db.d.ts +214 -0
- package/dist/src/state/db.js +897 -0
- package/dist/src/state/store.d.ts +37 -0
- package/dist/src/state/store.js +108 -0
- package/dist/src/state/types.d.ts +13 -0
- package/dist/src/state/types.js +1 -0
- package/dist/src/web/devtools-proxy.d.ts +7 -0
- package/dist/src/web/devtools-proxy.js +176 -0
- package/dist/src/web/port-proxy.d.ts +15 -0
- package/dist/src/web/port-proxy.js +124 -0
- package/dist/src/web/preview-ws.d.ts +5 -0
- package/dist/src/web/preview-ws.js +207 -0
- package/dist/src/web/server.d.ts +6 -0
- package/dist/src/web/server.js +1694 -0
- package/dist/src/ws/agent-ws.d.ts +5 -0
- package/dist/src/ws/agent-ws.js +93 -0
- package/frontend/dist/assets/_basePickBy-B-LibQ4-.js +1 -0
- package/frontend/dist/assets/_baseUniq-CprifHap.js +1 -0
- package/frontend/dist/assets/_createAssigner-ByDUqGii.js +1 -0
- package/frontend/dist/assets/abap-DuT-3z4x.js +1 -0
- package/frontend/dist/assets/addon-fit-CxQet2ja.js +1 -0
- package/frontend/dist/assets/addon-web-links-D_jRkPIl.js +1 -0
- package/frontend/dist/assets/apex-B-em86xX.js +1 -0
- package/frontend/dist/assets/api-SUPuHhSY.js +2 -0
- package/frontend/dist/assets/arc-Z0_eVteO.js +1 -0
- package/frontend/dist/assets/architecture-PBZL5I3N-hvVXGhqd.js +1 -0
- package/frontend/dist/assets/architectureDiagram-2XIMDMQ5-DiHPxX4j.js +36 -0
- package/frontend/dist/assets/array-CwG8vNfn.js +1 -0
- package/frontend/dist/assets/auth-store-R7eW5SVu.js +1 -0
- package/frontend/dist/assets/azcli-Bg9wQloi.js +1 -0
- package/frontend/dist/assets/bat-BM46z99L.js +1 -0
- package/frontend/dist/assets/bicep-DcBsJUfh.js +2 -0
- package/frontend/dist/assets/blockDiagram-WCTKOSBZ-C40u_hLo.js +132 -0
- package/frontend/dist/assets/c4Diagram-IC4MRINW-Ct7LjWFQ.js +10 -0
- package/frontend/dist/assets/cameligo-zw7JTtim.js +1 -0
- package/frontend/dist/assets/channel-ClCsE6HN.js +1 -0
- package/frontend/dist/assets/chunk-4BX2VUAB-zZ6P90VO.js +1 -0
- package/frontend/dist/assets/chunk-55IACEB6-DXllTDQl.js +1 -0
- package/frontend/dist/assets/chunk-7E7YKBS2-7zRaOLjj.js +1 -0
- package/frontend/dist/assets/chunk-7R4GIKGN-Csst1274.js +80 -0
- package/frontend/dist/assets/chunk-C72U2L5F-_JbQPbLN.js +1 -0
- package/frontend/dist/assets/chunk-CFjPhJqf.js +1 -0
- package/frontend/dist/assets/chunk-EGIJ26TM-B--aFyPw.js +1 -0
- package/frontend/dist/assets/chunk-FMBD7UC4-DVR34RNb.js +15 -0
- package/frontend/dist/assets/chunk-GEFDOKGD-CnmN6cC8.js +2 -0
- package/frontend/dist/assets/chunk-JSJVCQXG-CWxHBzeJ.js +1 -0
- package/frontend/dist/assets/chunk-KX2RTZJC-DkRk56s7.js +1 -0
- package/frontend/dist/assets/chunk-KYZI473N-DCCsG2dK.js +53 -0
- package/frontend/dist/assets/chunk-L3YUKLVL-C-DkZTMr.js +1 -0
- package/frontend/dist/assets/chunk-MX3YWQON-OUdzv5sZ.js +1 -0
- package/frontend/dist/assets/chunk-NQ4KR5QH-Bpu9FsM7.js +220 -0
- package/frontend/dist/assets/chunk-O4XLMI2P-BMLK6_ib.js +7 -0
- package/frontend/dist/assets/chunk-OZEHJAEY-CNNiJtG0.js +1 -0
- package/frontend/dist/assets/chunk-PQ6SQG4A-evVHD3KM.js +1 -0
- package/frontend/dist/assets/chunk-PU5JKC2W-DPFTYuvl.js +70 -0
- package/frontend/dist/assets/chunk-QZHKN3VN-JRdddPvu.js +1 -0
- package/frontend/dist/assets/chunk-R5LLSJPH-CHQzVVOV.js +1 -0
- package/frontend/dist/assets/chunk-WL4C6EOR-BNFU6IIi.js +189 -0
- package/frontend/dist/assets/chunk-XIRO2GV7-98T93G85.js +1 -0
- package/frontend/dist/assets/chunk-XZSTWKYB-BcW3cyNp.js +94 -0
- package/frontend/dist/assets/chunk-YBOYWFTD-BgKO1qAJ.js +1 -0
- package/frontend/dist/assets/classDiagram-VBA2DB6C-DikXzgcD.js +1 -0
- package/frontend/dist/assets/classDiagram-v2-RAHNMMFH-D7E3tQUK.js +1 -0
- package/frontend/dist/assets/clojure-FspFoNNQ.js +1 -0
- package/frontend/dist/assets/clone-mOXuZa7C.js +1 -0
- package/frontend/dist/assets/codicon-ngg6Pgfi.ttf +0 -0
- package/frontend/dist/assets/coffee-13n8Bk2W.js +1 -0
- package/frontend/dist/assets/cose-bilkent-S5V4N54A-zUOWQqLe.js +1 -0
- package/frontend/dist/assets/cpp-BVm2xGEs.js +1 -0
- package/frontend/dist/assets/csharp-D2kAWmUm.js +1 -0
- package/frontend/dist/assets/csp-Ezvgpf0e.js +1 -0
- package/frontend/dist/assets/css-CYxRwcFy.js +3 -0
- package/frontend/dist/assets/css.worker-Cd5h-ZOL.js +89 -0
- package/frontend/dist/assets/cssMode-CrXej49V.js +1 -0
- package/frontend/dist/assets/cypher-jg3SGErc.js +1 -0
- package/frontend/dist/assets/cytoscape.esm-kyyvzxNV.js +321 -0
- package/frontend/dist/assets/dagre-DH4bgZO7.js +1 -0
- package/frontend/dist/assets/dagre-KLK3FWXG-DNSqDkwT.js +4 -0
- package/frontend/dist/assets/dart-179jqhK4.js +1 -0
- package/frontend/dist/assets/defaultLocale-Dda4OpKy.js +1 -0
- package/frontend/dist/assets/diagram-E7M64L7V-RqPNT5Vs.js +24 -0
- package/frontend/dist/assets/diagram-IFDJBPK2-B-5NRyaE.js +43 -0
- package/frontend/dist/assets/diagram-P4PSJMXO-BrP69Hk0.js +24 -0
- package/frontend/dist/assets/dist-CU_Nb1G5.js +1 -0
- package/frontend/dist/assets/dockerfile-CIAtSGxS.js +1 -0
- package/frontend/dist/assets/ecl-CGVKfDxD.js +1 -0
- package/frontend/dist/assets/editor-Br_kD0ds.css +1 -0
- package/frontend/dist/assets/editor.api2-YXkDn0Gm.js +872 -0
- package/frontend/dist/assets/editor.main-fBaXZjJ0.js +6 -0
- package/frontend/dist/assets/elixir-BZ-6w0y3.js +1 -0
- package/frontend/dist/assets/erDiagram-INFDFZHY-BYiB9NYg.js +70 -0
- package/frontend/dist/assets/flow9-CVuOjTMv.js +1 -0
- package/frontend/dist/assets/flowDiagram-PKNHOUZH-Cwq47rsR.js +162 -0
- package/frontend/dist/assets/freemarker2-DM-pztJU.js +3 -0
- package/frontend/dist/assets/fsharp-q0pGJYr6.js +1 -0
- package/frontend/dist/assets/ganttDiagram-A5KZAMGK-Dnx3szD9.js +292 -0
- package/frontend/dist/assets/gitGraph-HDMCJU4V-COlTQ7bA.js +1 -0
- package/frontend/dist/assets/gitGraphDiagram-K3NZZRJ6-BaUxboNc.js +65 -0
- package/frontend/dist/assets/go-dzSPfdEO.js +1 -0
- package/frontend/dist/assets/graphlib-kEFlkt3U.js +1 -0
- package/frontend/dist/assets/graphql-CG4OUoEV.js +1 -0
- package/frontend/dist/assets/handlebars-BbK53Vec.js +1 -0
- package/frontend/dist/assets/hcl-Cy14JPk3.js +1 -0
- package/frontend/dist/assets/html-DYtTQNOG.js +1 -0
- package/frontend/dist/assets/html.worker-BjVEKLoU.js +502 -0
- package/frontend/dist/assets/htmlMode-C6GTouth.js +1 -0
- package/frontend/dist/assets/index-DMLxes_u.js +157 -0
- package/frontend/dist/assets/index-DmzeqkB1.css +1 -0
- package/frontend/dist/assets/info-3K5VOQVL-DBtHyA4C.js +1 -0
- package/frontend/dist/assets/infoDiagram-LFFYTUFH-yBXLgMPI.js +2 -0
- package/frontend/dist/assets/ini-Pbg8HGVD.js +1 -0
- package/frontend/dist/assets/init-D6KNwrax.js +1 -0
- package/frontend/dist/assets/ishikawaDiagram-PHBUUO56-Bld4two_.js +70 -0
- package/frontend/dist/assets/java-BmVu6Qrl.js +1 -0
- package/frontend/dist/assets/javascript-PbfQEdcJ.js +1 -0
- package/frontend/dist/assets/journeyDiagram-4ABVD52K-4HyMd4R2.js +139 -0
- package/frontend/dist/assets/json.worker-DqU5Wxnl.js +58 -0
- package/frontend/dist/assets/jsonMode-CASsGppE.js +7 -0
- package/frontend/dist/assets/julia-3cGnieBq.js +1 -0
- package/frontend/dist/assets/kanban-definition-K7BYSVSG-DpgsZmpG.js +89 -0
- package/frontend/dist/assets/katex-CEw3x5bf.js +261 -0
- package/frontend/dist/assets/kotlin-BuWkVcfV.js +1 -0
- package/frontend/dist/assets/less-CJ_VPy2C.js +2 -0
- package/frontend/dist/assets/lexon-BygAuZPu.js +1 -0
- package/frontend/dist/assets/line-CA_wh_TY.js +1 -0
- package/frontend/dist/assets/linear-BAcLW45z.js +1 -0
- package/frontend/dist/assets/liquid-kz84dle6.js +1 -0
- package/frontend/dist/assets/lspLanguageFeatures-C7hAHFn1.js +4 -0
- package/frontend/dist/assets/lua-C8Xs3dCx.js +1 -0
- package/frontend/dist/assets/m3-DTJeKBk4.js +1 -0
- package/frontend/dist/assets/markdown-QCgx8JqZ.js +1 -0
- package/frontend/dist/assets/math-D0YcMJAn.js +1 -0
- package/frontend/dist/assets/mdx-yRw0ap-E.js +1 -0
- package/frontend/dist/assets/mermaid-parser.core-DAeTodBQ.js +4 -0
- package/frontend/dist/assets/mindmap-definition-YRQLILUH-CoNlFyVl.js +68 -0
- package/frontend/dist/assets/mips-DopWaYgE.js +1 -0
- package/frontend/dist/assets/monaco.contribution-DeY0Qei-.js +2 -0
- package/frontend/dist/assets/msdax-BDis4ARV.js +1 -0
- package/frontend/dist/assets/mysql-BV6MLsOI.js +1 -0
- package/frontend/dist/assets/objective-c-B1UuzKs6.js +1 -0
- package/frontend/dist/assets/ordinal-jM7S0YHN.js +1 -0
- package/frontend/dist/assets/packet-RMMSAZCW-FF6-Tmai.js +1 -0
- package/frontend/dist/assets/pascal-BkvESCrc.js +1 -0
- package/frontend/dist/assets/pascaligo-lTy0kZYr.js +1 -0
- package/frontend/dist/assets/path-DNPd7Py7.js +1 -0
- package/frontend/dist/assets/perl-CrtUPXLV.js +1 -0
- package/frontend/dist/assets/pgsql-B9IbNWx2.js +1 -0
- package/frontend/dist/assets/php-CXvQBY2p.js +1 -0
- package/frontend/dist/assets/pie-UPGHQEXC-CFvXY2o-.js +1 -0
- package/frontend/dist/assets/pieDiagram-SKSYHLDU-CM_hbCcn.js +30 -0
- package/frontend/dist/assets/pla-DxBxuqWu.js +1 -0
- package/frontend/dist/assets/postiats-OkEuT5YF.js +1 -0
- package/frontend/dist/assets/powerquery-CMx5Tq4K.js +1 -0
- package/frontend/dist/assets/powershell-CstRxrEc.js +1 -0
- package/frontend/dist/assets/preload-helper-D4M6sveU.js +1 -0
- package/frontend/dist/assets/protobuf-Bx0Z-uRj.js +2 -0
- package/frontend/dist/assets/pug--W8vanWl.js +1 -0
- package/frontend/dist/assets/python-DA0rnlw3.js +1 -0
- package/frontend/dist/assets/qsharp-CRtr0YbN.js +1 -0
- package/frontend/dist/assets/quadrantDiagram-337W2JSQ-B3n3IUhC.js +7 -0
- package/frontend/dist/assets/r-C6E1d6iv.js +1 -0
- package/frontend/dist/assets/radar-KQ55EAFF-MPZu7SdX.js +1 -0
- package/frontend/dist/assets/razor-yd73uata.js +1 -0
- package/frontend/dist/assets/redis-Dx13voP3.js +1 -0
- package/frontend/dist/assets/redshift-D66HwlyV.js +1 -0
- package/frontend/dist/assets/requirementDiagram-Z7DCOOCP-CorP7L7F.js +73 -0
- package/frontend/dist/assets/restructuredtext-DQT2NKJ2.js +1 -0
- package/frontend/dist/assets/rough.esm-DxAX5Vpo.js +1 -0
- package/frontend/dist/assets/ruby-iFXI8hwH.js +1 -0
- package/frontend/dist/assets/rust-CSKiei34.js +1 -0
- package/frontend/dist/assets/sankeyDiagram-WA2Y5GQK-RDx6Bd-B.js +10 -0
- package/frontend/dist/assets/sb-Bo3ttdP2.js +1 -0
- package/frontend/dist/assets/scala-BC1D-Nxp.js +1 -0
- package/frontend/dist/assets/scheme-Z4OAo4Lv.js +1 -0
- package/frontend/dist/assets/scss-BvrdPs6B.js +3 -0
- package/frontend/dist/assets/sequenceDiagram-2WXFIKYE-JMqJSFq6.js +145 -0
- package/frontend/dist/assets/shell-Bh_aCyF-.js +1 -0
- package/frontend/dist/assets/solidity-CWHj6tSe.js +1 -0
- package/frontend/dist/assets/sophia-raoNtKtm.js +1 -0
- package/frontend/dist/assets/sparql-XzmoGnue.js +1 -0
- package/frontend/dist/assets/sql-BD0i9Gvg.js +1 -0
- package/frontend/dist/assets/src-Bn-kKzs7.js +1 -0
- package/frontend/dist/assets/st-DtVKyms6.js +1 -0
- package/frontend/dist/assets/stateDiagram-RAJIS63D-CgFfENdy.js +1 -0
- package/frontend/dist/assets/stateDiagram-v2-FVOUBMTO-C4Hh2P-U.js +1 -0
- package/frontend/dist/assets/swift--UZs77wT.js +1 -0
- package/frontend/dist/assets/systemverilog-CDnBSWUd.js +1 -0
- package/frontend/dist/assets/tcl-DdCEuTHZ.js +1 -0
- package/frontend/dist/assets/timeline-definition-YZTLITO2-BnatPBR5.js +61 -0
- package/frontend/dist/assets/treemap-KZPCXAKY-qb1Pl9la.js +1 -0
- package/frontend/dist/assets/ts.worker-DyPAEIuH.js +67719 -0
- package/frontend/dist/assets/tsMode-iuvyEpyO.js +11 -0
- package/frontend/dist/assets/twig-SSL-Altf.js +1 -0
- package/frontend/dist/assets/typescript-17918Hud.js +1 -0
- package/frontend/dist/assets/typespec-BT7S0ETg.js +1 -0
- package/frontend/dist/assets/vb-CrIgucua.js +1 -0
- package/frontend/dist/assets/vennDiagram-LZ73GAT5-DygS4Zzd.js +34 -0
- package/frontend/dist/assets/wgsl-BeKc3oEp.js +298 -0
- package/frontend/dist/assets/workers-DTfwKVoM.js +1 -0
- package/frontend/dist/assets/xml-CBMr_Wbw.js +1 -0
- package/frontend/dist/assets/xterm-BrP-ENHg.css +1 -0
- package/frontend/dist/assets/xterm-CBX2m0YM.js +36 -0
- package/frontend/dist/assets/xychartDiagram-JWTSCODW-D6wY1Jwd.js +7 -0
- package/frontend/dist/assets/yaml-CTjCH7Bv.js +1 -0
- package/frontend/dist/fonts/inter-300.ttf +0 -0
- package/frontend/dist/fonts/inter-400.ttf +0 -0
- package/frontend/dist/fonts/inter-500.ttf +0 -0
- package/frontend/dist/fonts/inter-600.ttf +0 -0
- package/frontend/dist/fonts/inter-700.ttf +0 -0
- package/frontend/dist/index.html +49 -0
- package/frontend/dist/logo_192x192.png +0 -0
- package/frontend/dist/logo_32x32.png +0 -0
- package/frontend/dist/logo_512x512.png +0 -0
- package/frontend/dist/logo_64x64.png +0 -0
- package/frontend/dist/logobg_192x192.png +0 -0
- package/frontend/dist/logobg_512x512.png +0 -0
- package/frontend/dist/logobg_64x64.png +0 -0
- package/frontend/dist/manifest.json +25 -0
- package/frontend/dist/sw.js +22 -0
- package/package.json +74 -7
- package/preload/Makefile +12 -0
- package/preload/atoo-studio-preload.c +647 -0
- package/preload/atoo-studio-preload.so +0 -0
- package/setup-cuse.sh +260 -0
- package/setup.sh +81 -0
- package/src/serial/native/binding.gyp +10 -0
- 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
|
+
}
|