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,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSONL session file tailer for Codex CLI.
|
|
3
|
+
*
|
|
4
|
+
* Codex stores sessions at:
|
|
5
|
+
* ~/.codex/sessions/YYYY/MM/DD/rollout-{timestamp}-{uuid}.jsonl
|
|
6
|
+
*
|
|
7
|
+
* Session discovery is handled by the notify callback (notify.ts).
|
|
8
|
+
* This watcher only tails a known file by UUID.
|
|
9
|
+
*/
|
|
10
|
+
import { EventEmitter } from 'events';
|
|
11
|
+
export declare class CodexJsonlWatcher extends EventEmitter {
|
|
12
|
+
private targetPath;
|
|
13
|
+
private lastReadOffset;
|
|
14
|
+
private lineBuffer;
|
|
15
|
+
private fileWatcher;
|
|
16
|
+
private debounceTimer;
|
|
17
|
+
private waitTimer;
|
|
18
|
+
private stopped;
|
|
19
|
+
private initialOffset;
|
|
20
|
+
/**
|
|
21
|
+
* Set the initial read offset to skip content already loaded historically.
|
|
22
|
+
* Must be called before startTailingUuid().
|
|
23
|
+
*/
|
|
24
|
+
setInitialOffset(bytes: number): void;
|
|
25
|
+
/**
|
|
26
|
+
* Start tailing the session file for a known UUID.
|
|
27
|
+
* Finds the file on disk, waits for it to appear if needed, then tails.
|
|
28
|
+
*/
|
|
29
|
+
startTailingUuid(uuid: string): void;
|
|
30
|
+
stop(): void;
|
|
31
|
+
private clearWaitTimer;
|
|
32
|
+
private findFileByUuid;
|
|
33
|
+
private beginTailing;
|
|
34
|
+
private debouncedRead;
|
|
35
|
+
private readFromOffset;
|
|
36
|
+
}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSONL session file tailer for Codex CLI.
|
|
3
|
+
*
|
|
4
|
+
* Codex stores sessions at:
|
|
5
|
+
* ~/.codex/sessions/YYYY/MM/DD/rollout-{timestamp}-{uuid}.jsonl
|
|
6
|
+
*
|
|
7
|
+
* Session discovery is handled by the notify callback (notify.ts).
|
|
8
|
+
* This watcher only tails a known file by UUID.
|
|
9
|
+
*/
|
|
10
|
+
import { EventEmitter } from 'events';
|
|
11
|
+
import fs from 'fs';
|
|
12
|
+
import path from 'path';
|
|
13
|
+
import os from 'os';
|
|
14
|
+
import { mapCodexJsonlLine } from '../lib/codex/jsonl-mapper.js';
|
|
15
|
+
const CODEX_SESSIONS_DIR = path.join(os.homedir(), '.codex', 'sessions');
|
|
16
|
+
const DEBOUNCE_MS = 50;
|
|
17
|
+
const FILE_WAIT_INTERVAL = 200;
|
|
18
|
+
const FILE_WAIT_TIMEOUT = 30_000;
|
|
19
|
+
export class CodexJsonlWatcher extends EventEmitter {
|
|
20
|
+
targetPath = null;
|
|
21
|
+
lastReadOffset = 0;
|
|
22
|
+
lineBuffer = '';
|
|
23
|
+
fileWatcher = null;
|
|
24
|
+
debounceTimer = null;
|
|
25
|
+
waitTimer = null;
|
|
26
|
+
stopped = false;
|
|
27
|
+
initialOffset = 0;
|
|
28
|
+
/**
|
|
29
|
+
* Set the initial read offset to skip content already loaded historically.
|
|
30
|
+
* Must be called before startTailingUuid().
|
|
31
|
+
*/
|
|
32
|
+
setInitialOffset(bytes) {
|
|
33
|
+
this.initialOffset = bytes;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Start tailing the session file for a known UUID.
|
|
37
|
+
* Finds the file on disk, waits for it to appear if needed, then tails.
|
|
38
|
+
*/
|
|
39
|
+
startTailingUuid(uuid) {
|
|
40
|
+
const filePath = this.findFileByUuid(uuid);
|
|
41
|
+
if (filePath) {
|
|
42
|
+
this.targetPath = filePath;
|
|
43
|
+
this.beginTailing();
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
// File doesn't exist yet — poll until it appears
|
|
47
|
+
console.log(`[codex-jsonl-watcher] Waiting for session file for ${uuid}...`);
|
|
48
|
+
const startTime = Date.now();
|
|
49
|
+
this.waitTimer = setInterval(() => {
|
|
50
|
+
if (this.stopped) {
|
|
51
|
+
this.clearWaitTimer();
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const found = this.findFileByUuid(uuid);
|
|
55
|
+
if (found) {
|
|
56
|
+
this.clearWaitTimer();
|
|
57
|
+
this.targetPath = found;
|
|
58
|
+
console.log(`[codex-jsonl-watcher] Found session file: ${path.basename(found)}`);
|
|
59
|
+
this.beginTailing();
|
|
60
|
+
}
|
|
61
|
+
else if (Date.now() - startTime > FILE_WAIT_TIMEOUT) {
|
|
62
|
+
this.clearWaitTimer();
|
|
63
|
+
console.warn(`[codex-jsonl-watcher] Timed out waiting for session file for ${uuid}`);
|
|
64
|
+
}
|
|
65
|
+
}, FILE_WAIT_INTERVAL);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
stop() {
|
|
69
|
+
this.stopped = true;
|
|
70
|
+
this.clearWaitTimer();
|
|
71
|
+
if (this.fileWatcher) {
|
|
72
|
+
this.fileWatcher.close();
|
|
73
|
+
this.fileWatcher = null;
|
|
74
|
+
}
|
|
75
|
+
if (this.debounceTimer) {
|
|
76
|
+
clearTimeout(this.debounceTimer);
|
|
77
|
+
this.debounceTimer = null;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
clearWaitTimer() {
|
|
81
|
+
if (this.waitTimer) {
|
|
82
|
+
clearInterval(this.waitTimer);
|
|
83
|
+
this.waitTimer = null;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
findFileByUuid(uuid) {
|
|
87
|
+
try {
|
|
88
|
+
const yearDirs = fs.readdirSync(CODEX_SESSIONS_DIR);
|
|
89
|
+
for (const year of yearDirs) {
|
|
90
|
+
const yearPath = path.join(CODEX_SESSIONS_DIR, year);
|
|
91
|
+
let monthDirs;
|
|
92
|
+
try {
|
|
93
|
+
monthDirs = fs.readdirSync(yearPath);
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
for (const month of monthDirs) {
|
|
99
|
+
const monthPath = path.join(yearPath, month);
|
|
100
|
+
let dayDirs;
|
|
101
|
+
try {
|
|
102
|
+
dayDirs = fs.readdirSync(monthPath);
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
for (const day of dayDirs) {
|
|
108
|
+
const dayPath = path.join(monthPath, day);
|
|
109
|
+
let files;
|
|
110
|
+
try {
|
|
111
|
+
files = fs.readdirSync(dayPath);
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
for (const file of files) {
|
|
117
|
+
if (file.includes(uuid) && file.endsWith('.jsonl')) {
|
|
118
|
+
return path.join(dayPath, file);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
catch { }
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
beginTailing() {
|
|
129
|
+
if (this.stopped || !this.targetPath)
|
|
130
|
+
return;
|
|
131
|
+
// Skip content already loaded by historical pre-load
|
|
132
|
+
if (this.initialOffset > 0) {
|
|
133
|
+
this.lastReadOffset = this.initialOffset;
|
|
134
|
+
this.initialOffset = 0;
|
|
135
|
+
}
|
|
136
|
+
// Read any new content since the offset
|
|
137
|
+
this.readFromOffset();
|
|
138
|
+
// Watch for future changes
|
|
139
|
+
try {
|
|
140
|
+
this.fileWatcher = fs.watch(this.targetPath, (eventType) => {
|
|
141
|
+
if (this.stopped || eventType !== 'change')
|
|
142
|
+
return;
|
|
143
|
+
this.debouncedRead();
|
|
144
|
+
});
|
|
145
|
+
this.emit('ready');
|
|
146
|
+
}
|
|
147
|
+
catch (err) {
|
|
148
|
+
console.error(`[codex-jsonl-watcher] Cannot watch file ${this.targetPath}:`, err.message);
|
|
149
|
+
this.emit('error', err);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
debouncedRead() {
|
|
153
|
+
if (this.debounceTimer)
|
|
154
|
+
return;
|
|
155
|
+
this.debounceTimer = setTimeout(() => {
|
|
156
|
+
this.debounceTimer = null;
|
|
157
|
+
this.readFromOffset();
|
|
158
|
+
}, DEBOUNCE_MS);
|
|
159
|
+
}
|
|
160
|
+
readFromOffset() {
|
|
161
|
+
if (!this.targetPath)
|
|
162
|
+
return;
|
|
163
|
+
let stat;
|
|
164
|
+
try {
|
|
165
|
+
stat = fs.statSync(this.targetPath);
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
if (stat.size < this.lastReadOffset) {
|
|
171
|
+
console.warn('[codex-jsonl-watcher] File truncated, re-reading from start');
|
|
172
|
+
this.lastReadOffset = 0;
|
|
173
|
+
this.lineBuffer = '';
|
|
174
|
+
}
|
|
175
|
+
if (stat.size <= this.lastReadOffset)
|
|
176
|
+
return;
|
|
177
|
+
try {
|
|
178
|
+
const fd = fs.openSync(this.targetPath, 'r');
|
|
179
|
+
const buf = Buffer.alloc(stat.size - this.lastReadOffset);
|
|
180
|
+
fs.readSync(fd, buf, 0, buf.length, this.lastReadOffset);
|
|
181
|
+
fs.closeSync(fd);
|
|
182
|
+
this.lastReadOffset = stat.size;
|
|
183
|
+
const chunk = this.lineBuffer + buf.toString('utf-8');
|
|
184
|
+
const lines = chunk.split('\n');
|
|
185
|
+
this.lineBuffer = lines.pop() || '';
|
|
186
|
+
for (const line of lines) {
|
|
187
|
+
if (!line.trim())
|
|
188
|
+
continue;
|
|
189
|
+
try {
|
|
190
|
+
const parsed = JSON.parse(line);
|
|
191
|
+
const events = mapCodexJsonlLine(parsed);
|
|
192
|
+
for (const event of events) {
|
|
193
|
+
this.emit('event', event);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
// Skip unparseable lines
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
catch (err) {
|
|
202
|
+
console.error('[codex-jsonl-watcher] Read error:', err.message);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codex Terminal+ChatRO spawn logic.
|
|
3
|
+
* Spawns a plain `codex` PTY or `codex resume <uuid>`.
|
|
4
|
+
*/
|
|
5
|
+
import crypto from 'crypto';
|
|
6
|
+
import os from 'os';
|
|
7
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
8
|
+
import { spawnProcess } from '../../spawner.js';
|
|
9
|
+
import { getMcpServerDef, MCP_SYSTEM_PROMPT, CHAIN_SYSTEM_PROMPT, registerMcpToken } from '../../mcp/config.js';
|
|
10
|
+
import { addPreloadEnv } from '../lib/fs-tracking.js';
|
|
11
|
+
export function spawnCodexCliProcess(options) {
|
|
12
|
+
const cwd = options.cwd || process.env.HOME || os.homedir();
|
|
13
|
+
let command;
|
|
14
|
+
let args;
|
|
15
|
+
const baseArgs = [];
|
|
16
|
+
if (options.skipPermissions)
|
|
17
|
+
baseArgs.push('--full-auto');
|
|
18
|
+
// Inject MCP server config via -c flags (per-process, doesn't affect other codex instances)
|
|
19
|
+
const mcpToken = crypto.randomUUID();
|
|
20
|
+
registerMcpToken(mcpToken);
|
|
21
|
+
const mcp = getMcpServerDef();
|
|
22
|
+
const mcpEnv = { ...mcp.env, ATOO_MCP_TOKEN: mcpToken };
|
|
23
|
+
if (options.resumeSessionUuid) {
|
|
24
|
+
mcpEnv.ATOO_CURRENT_SESSION_UUID = options.resumeSessionUuid;
|
|
25
|
+
}
|
|
26
|
+
baseArgs.push('-c', `mcp_servers.atoo-studio.command="${mcp.command}"`);
|
|
27
|
+
baseArgs.push('-c', `mcp_servers.atoo-studio.args=${JSON.stringify(mcp.args)}`);
|
|
28
|
+
for (const [key, value] of Object.entries(mcpEnv)) {
|
|
29
|
+
baseArgs.push('-c', `mcp_servers.atoo-studio.env.${key}="${value}"`);
|
|
30
|
+
}
|
|
31
|
+
// Inject system prompt with MCP tool usage instructions
|
|
32
|
+
const systemPrompt = options.isChainContinuation
|
|
33
|
+
? MCP_SYSTEM_PROMPT + CHAIN_SYSTEM_PROMPT
|
|
34
|
+
: MCP_SYSTEM_PROMPT;
|
|
35
|
+
baseArgs.push('-c', `developer_instructions=${JSON.stringify(systemPrompt)}`);
|
|
36
|
+
if (options.resumeSessionUuid) {
|
|
37
|
+
// codex resume <session_id> [flags]
|
|
38
|
+
command = 'codex';
|
|
39
|
+
args = ['resume', options.resumeSessionUuid, ...baseArgs];
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
command = 'codex';
|
|
43
|
+
args = [...baseArgs];
|
|
44
|
+
}
|
|
45
|
+
const preloadSessionId = uuidv4();
|
|
46
|
+
const env = { ...process.env };
|
|
47
|
+
addPreloadEnv(env, preloadSessionId);
|
|
48
|
+
const { envId } = spawnProcess({
|
|
49
|
+
command,
|
|
50
|
+
args,
|
|
51
|
+
cwd,
|
|
52
|
+
env,
|
|
53
|
+
preloadSessionId,
|
|
54
|
+
logPrefix: 'codex-terminal-chatro',
|
|
55
|
+
});
|
|
56
|
+
return { envId, preloadSessionId };
|
|
57
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chain builder: creates a new chain-linked session from a source session.
|
|
3
|
+
*
|
|
4
|
+
* Instead of compacting context (which loses information), a chain link:
|
|
5
|
+
* 1. Carries forward the last N log entries + all user messages from the source
|
|
6
|
+
* 2. Tells the LLM to use search_session_history(CurrentSessionChain) for deeper context
|
|
7
|
+
* 3. Links to the source via the session ID schema ({parent-last16}c{random15})
|
|
8
|
+
*/
|
|
9
|
+
import type { SessionEvent } from '../../events/types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Build chain link events and UUID from a source session's events.
|
|
12
|
+
* Does NOT write to disk — the caller decides which format to write (Claude/Codex).
|
|
13
|
+
*
|
|
14
|
+
* @param sourceEvents - Events from the source session
|
|
15
|
+
* @param parentSessionId - The source session's ID (for parent-linking)
|
|
16
|
+
* @returns { uuid, events } or null if source has no conversation content
|
|
17
|
+
*/
|
|
18
|
+
export declare function buildChainSession(sourceEvents: SessionEvent[], parentSessionId: string): {
|
|
19
|
+
uuid: string;
|
|
20
|
+
events: SessionEvent[];
|
|
21
|
+
} | null;
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { buildLinkedUuid } from './session-id-utils.js';
|
|
2
|
+
const MAX_PAIRS = 10;
|
|
3
|
+
/**
|
|
4
|
+
* Extract text from an assistant event's content, stripping tool_use blocks and thinking.
|
|
5
|
+
* Returns only the final text response, or null if there's no text.
|
|
6
|
+
*/
|
|
7
|
+
function extractAssistantText(event) {
|
|
8
|
+
const content = event.message?.content;
|
|
9
|
+
if (typeof content === 'string')
|
|
10
|
+
return content || null;
|
|
11
|
+
if (Array.isArray(content)) {
|
|
12
|
+
const texts = content
|
|
13
|
+
.filter((b) => b.type === 'text')
|
|
14
|
+
.map((b) => b.text || '');
|
|
15
|
+
const joined = texts.join('\n').trim();
|
|
16
|
+
return joined || null;
|
|
17
|
+
}
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Extract the last N user messages + their final assistant text responses.
|
|
22
|
+
* No tool calls, no tool results, no thinking, no intermediate events —
|
|
23
|
+
* just the clean conversation thread.
|
|
24
|
+
*/
|
|
25
|
+
function extractChainEvents(events) {
|
|
26
|
+
if (events.length === 0)
|
|
27
|
+
return [];
|
|
28
|
+
// Walk through events and pair each real user text message with the
|
|
29
|
+
// last assistant text response before the next user message.
|
|
30
|
+
// Also count hidden events (tool calls, tool results, thinking, etc.)
|
|
31
|
+
// between each user message so we can inform the LLM.
|
|
32
|
+
const pairs = [];
|
|
33
|
+
let lastUserIdx = -1;
|
|
34
|
+
let hiddenCount = 0;
|
|
35
|
+
for (let i = 0; i < events.length; i++) {
|
|
36
|
+
const e = events[i];
|
|
37
|
+
// Real user text message (not tool_result)
|
|
38
|
+
if (e.type === 'user') {
|
|
39
|
+
const content = e.message?.content;
|
|
40
|
+
const isToolResult = Array.isArray(content) && content.some((b) => b.type === 'tool_result');
|
|
41
|
+
if (isToolResult) {
|
|
42
|
+
hiddenCount++;
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
// Attribute accumulated hidden events to the previous pair
|
|
46
|
+
if (lastUserIdx >= 0) {
|
|
47
|
+
pairs[lastUserIdx].hiddenCount = hiddenCount;
|
|
48
|
+
}
|
|
49
|
+
hiddenCount = 0;
|
|
50
|
+
pairs.push({ user: e, assistant: null, hiddenCount: 0 });
|
|
51
|
+
lastUserIdx = pairs.length - 1;
|
|
52
|
+
}
|
|
53
|
+
else if (e.type === 'assistant' && lastUserIdx >= 0) {
|
|
54
|
+
const text = extractAssistantText(e);
|
|
55
|
+
if (text) {
|
|
56
|
+
// Build a clean assistant event with text-only content
|
|
57
|
+
pairs[lastUserIdx].assistant = {
|
|
58
|
+
...e,
|
|
59
|
+
message: {
|
|
60
|
+
...e.message,
|
|
61
|
+
content: [{ type: 'text', text }],
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
// Count assistant events with only tool_use (no text) as hidden
|
|
66
|
+
if (!text)
|
|
67
|
+
hiddenCount++;
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
// All other event types (progress, system, result, etc.) are hidden
|
|
71
|
+
hiddenCount++;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Attribute final hidden count to last pair
|
|
75
|
+
if (lastUserIdx >= 0) {
|
|
76
|
+
pairs[lastUserIdx].hiddenCount = hiddenCount;
|
|
77
|
+
}
|
|
78
|
+
if (pairs.length === 0)
|
|
79
|
+
return [];
|
|
80
|
+
// Take the last N pairs
|
|
81
|
+
const selected = pairs.slice(-MAX_PAIRS);
|
|
82
|
+
// Flatten to event list: user, assistant, user, assistant, ...
|
|
83
|
+
// Prepend hidden count to assistant responses
|
|
84
|
+
const result = [];
|
|
85
|
+
for (const pair of selected) {
|
|
86
|
+
result.push(pair.user);
|
|
87
|
+
if (pair.assistant && pair.hiddenCount > 0) {
|
|
88
|
+
const a = pair.assistant;
|
|
89
|
+
const text = a.message.content[0].text;
|
|
90
|
+
result.push({
|
|
91
|
+
...a,
|
|
92
|
+
message: {
|
|
93
|
+
...a.message,
|
|
94
|
+
content: [{ type: 'text', text: `[${pair.hiddenCount} intermediate tool calls/results hidden]\n\n${text}` }],
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
else if (pair.assistant) {
|
|
99
|
+
result.push(pair.assistant);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// Inject chain context header into the first user message
|
|
103
|
+
if (result.length > 0) {
|
|
104
|
+
const header = '[This is a chain continuation session. The messages below are carried forward from the previous session in this chain. For full context from earlier in the conversation, use the search_session_history tool with type "CurrentSessionChain".]';
|
|
105
|
+
const first = result[0];
|
|
106
|
+
const msg = first.message;
|
|
107
|
+
const content = typeof msg.content === 'string'
|
|
108
|
+
? `${header}\n\n${msg.content}`
|
|
109
|
+
: Array.isArray(msg.content)
|
|
110
|
+
? [{ type: 'text', text: header }, ...msg.content]
|
|
111
|
+
: msg.content;
|
|
112
|
+
result[0] = { ...first, message: { ...msg, content } };
|
|
113
|
+
}
|
|
114
|
+
return result;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Build chain link events and UUID from a source session's events.
|
|
118
|
+
* Does NOT write to disk — the caller decides which format to write (Claude/Codex).
|
|
119
|
+
*
|
|
120
|
+
* @param sourceEvents - Events from the source session
|
|
121
|
+
* @param parentSessionId - The source session's ID (for parent-linking)
|
|
122
|
+
* @returns { uuid, events } or null if source has no conversation content
|
|
123
|
+
*/
|
|
124
|
+
export function buildChainSession(sourceEvents, parentSessionId) {
|
|
125
|
+
if (sourceEvents.length === 0)
|
|
126
|
+
return null;
|
|
127
|
+
const chainEvents = extractChainEvents(sourceEvents);
|
|
128
|
+
if (chainEvents.length === 0)
|
|
129
|
+
return null;
|
|
130
|
+
// Verify there are actual conversational events (user/assistant) that will
|
|
131
|
+
// survive JSONL reconstruction. Non-conversational events (progress, etc.)
|
|
132
|
+
// are filtered out by the writers, which would produce an empty file.
|
|
133
|
+
const CONVERSATIONAL_TYPES = new Set(['user', 'assistant', 'system', 'result', 'control_request', 'control_response']);
|
|
134
|
+
const hasConversation = chainEvents.some(e => CONVERSATIONAL_TYPES.has(e.type));
|
|
135
|
+
if (!hasConversation)
|
|
136
|
+
return null;
|
|
137
|
+
const chainUuid = buildLinkedUuid(parentSessionId, 'chain');
|
|
138
|
+
return { uuid: chainUuid, events: chainEvents };
|
|
139
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export interface FsSessionMeta {
|
|
2
|
+
uuid: string;
|
|
3
|
+
dirHash: string;
|
|
4
|
+
directory: string;
|
|
5
|
+
title: string;
|
|
6
|
+
lastModified: string;
|
|
7
|
+
fileSize: number;
|
|
8
|
+
eventCount: number;
|
|
9
|
+
jsonlPath: string;
|
|
10
|
+
}
|
|
11
|
+
declare class FsSessionScanner {
|
|
12
|
+
private cache;
|
|
13
|
+
private lastScanTime;
|
|
14
|
+
scan(): Promise<FsSessionMeta[]>;
|
|
15
|
+
private parseSessionMeta;
|
|
16
|
+
readEvents(uuid: string): Promise<any[]>;
|
|
17
|
+
getByUuid(uuid: string): FsSessionMeta | undefined;
|
|
18
|
+
invalidate(): void;
|
|
19
|
+
/**
|
|
20
|
+
* Find the most recently modified session UUID for a given working directory.
|
|
21
|
+
* Useful as a fallback when hook-based CLI session discovery fails.
|
|
22
|
+
*/
|
|
23
|
+
findMostRecentForCwd(cwd: string): Promise<string | null>;
|
|
24
|
+
/**
|
|
25
|
+
* Return all JSONL file paths (sessions + subagents) for sessions
|
|
26
|
+
* whose working directory matches any of the given cwds.
|
|
27
|
+
*/
|
|
28
|
+
getFilesForProject(cwds: string[]): Promise<string[]>;
|
|
29
|
+
}
|
|
30
|
+
export declare const fsSessionScanner: FsSessionScanner;
|
|
31
|
+
export {};
|