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,56 @@
|
|
|
1
|
+
interface SearchMatch {
|
|
2
|
+
session: number;
|
|
3
|
+
message: number;
|
|
4
|
+
text: string;
|
|
5
|
+
}
|
|
6
|
+
interface SessionInfo {
|
|
7
|
+
number: number;
|
|
8
|
+
uuid: string;
|
|
9
|
+
}
|
|
10
|
+
interface SearchResult {
|
|
11
|
+
results: SearchMatch[];
|
|
12
|
+
totalMatches: number;
|
|
13
|
+
sessionsSearched: number;
|
|
14
|
+
sessions: SessionInfo[];
|
|
15
|
+
}
|
|
16
|
+
interface RangeMessage {
|
|
17
|
+
message: number;
|
|
18
|
+
text: string;
|
|
19
|
+
}
|
|
20
|
+
interface RangeResult {
|
|
21
|
+
session: number;
|
|
22
|
+
uuid: string | null;
|
|
23
|
+
messages: RangeMessage[];
|
|
24
|
+
totalMessages: number;
|
|
25
|
+
}
|
|
26
|
+
export type SearchType = 'FullProjectSearch' | 'CurrentSessionChain';
|
|
27
|
+
export type SortOrder = 'newest_first' | 'oldest_first';
|
|
28
|
+
export interface SearchOptions {
|
|
29
|
+
type?: SearchType;
|
|
30
|
+
sessionUuid?: string;
|
|
31
|
+
sort?: SortOrder;
|
|
32
|
+
}
|
|
33
|
+
export interface RangeOptions {
|
|
34
|
+
type?: SearchType;
|
|
35
|
+
sessionUuid?: string;
|
|
36
|
+
sort?: SortOrder;
|
|
37
|
+
session?: number;
|
|
38
|
+
targetSessionUuid?: string;
|
|
39
|
+
from: number;
|
|
40
|
+
to: number;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Search through session history returning results as session:message references.
|
|
44
|
+
*
|
|
45
|
+
* Results use abstract addressing (no file paths):
|
|
46
|
+
* session N = the Nth session (chainlink for chain mode, sort-order index for full search)
|
|
47
|
+
* message M = the Mth conversational message within that session
|
|
48
|
+
*/
|
|
49
|
+
export declare function searchSessionHistory(queries: string | string[], cwd: string, maxResultsPerQuery?: number, options?: SearchOptions): Promise<SearchResult>;
|
|
50
|
+
/**
|
|
51
|
+
* Fetch full messages from a specific session by session:from-to range.
|
|
52
|
+
*
|
|
53
|
+
* Returns complete message content (not truncated) for the requested range.
|
|
54
|
+
*/
|
|
55
|
+
export declare function fetchSessionRange(cwd: string, options: RangeOptions): Promise<RangeResult>;
|
|
56
|
+
export {};
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import os from 'os';
|
|
4
|
+
import { agentRegistry } from '../agents/registry.js';
|
|
5
|
+
import { walkChain } from '../agents/lib/session-id-utils.js';
|
|
6
|
+
const CLAUDE_PROJECTS_DIR = path.join(os.homedir(), '.claude', 'projects');
|
|
7
|
+
// --- Helpers ---
|
|
8
|
+
function extractUuidFromPath(filePath) {
|
|
9
|
+
const basename = path.basename(filePath, '.jsonl');
|
|
10
|
+
const uuidMatch = basename.match(/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})/);
|
|
11
|
+
return uuidMatch ? uuidMatch[1] : null;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Filter session files to only those in the current session chain.
|
|
15
|
+
* Returns files in chain order: oldest ancestor first (index 0 = chainlink 1).
|
|
16
|
+
*/
|
|
17
|
+
function filterChainFiles(allFiles, sessionUuid) {
|
|
18
|
+
const uuidToFile = new Map();
|
|
19
|
+
const allUuids = [];
|
|
20
|
+
for (const f of allFiles) {
|
|
21
|
+
const uuid = extractUuidFromPath(f);
|
|
22
|
+
if (uuid) {
|
|
23
|
+
uuidToFile.set(uuid, f);
|
|
24
|
+
allUuids.push(uuid);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const chainUuids = walkChain(sessionUuid, allUuids);
|
|
28
|
+
// Return files in chain order (oldest first), excluding current session
|
|
29
|
+
const chainFiles = [];
|
|
30
|
+
for (const uuid of chainUuids) {
|
|
31
|
+
if (uuid === sessionUuid)
|
|
32
|
+
continue;
|
|
33
|
+
const file = uuidToFile.get(uuid);
|
|
34
|
+
if (file)
|
|
35
|
+
chainFiles.push(file);
|
|
36
|
+
}
|
|
37
|
+
return chainFiles;
|
|
38
|
+
}
|
|
39
|
+
function buildRegex(query) {
|
|
40
|
+
try {
|
|
41
|
+
return new RegExp(query, 'i');
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return new RegExp(query.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'i');
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Parse a JSONL line into a structured message with role and full text.
|
|
49
|
+
* Returns null for non-message events (file-history-snapshot, empty, unparseable).
|
|
50
|
+
*/
|
|
51
|
+
function parseJsonlMessage(jsonLine) {
|
|
52
|
+
if (!jsonLine.trim())
|
|
53
|
+
return null;
|
|
54
|
+
try {
|
|
55
|
+
const event = JSON.parse(jsonLine);
|
|
56
|
+
if (event.type === 'file-history-snapshot')
|
|
57
|
+
return null;
|
|
58
|
+
// Detect Codex JSONL format: {type: "event_msg"|"response_item", payload: {...}}
|
|
59
|
+
if (event.payload && (event.type === 'event_msg' || event.type === 'response_item')) {
|
|
60
|
+
return parseCodexJsonlMessage(event);
|
|
61
|
+
}
|
|
62
|
+
const role = event.message?.role || event.type || 'unknown';
|
|
63
|
+
let text = '';
|
|
64
|
+
if (event.message?.content) {
|
|
65
|
+
const content = event.message.content;
|
|
66
|
+
if (typeof content === 'string') {
|
|
67
|
+
text = content;
|
|
68
|
+
}
|
|
69
|
+
else if (Array.isArray(content)) {
|
|
70
|
+
const parts = [];
|
|
71
|
+
for (const block of content) {
|
|
72
|
+
if (block.type === 'text' && block.text) {
|
|
73
|
+
parts.push(block.text);
|
|
74
|
+
}
|
|
75
|
+
else if (block.type === 'tool_use' && block.input) {
|
|
76
|
+
const inputStr = typeof block.input === 'string' ? block.input : JSON.stringify(block.input);
|
|
77
|
+
parts.push(`[tool:${block.name}] ${inputStr}`);
|
|
78
|
+
}
|
|
79
|
+
else if (block.type === 'tool_result' && block.content) {
|
|
80
|
+
if (typeof block.content === 'string') {
|
|
81
|
+
parts.push(block.content);
|
|
82
|
+
}
|
|
83
|
+
else if (Array.isArray(block.content)) {
|
|
84
|
+
for (const sub of block.content) {
|
|
85
|
+
if (sub.type === 'text' && sub.text)
|
|
86
|
+
parts.push(sub.text);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
text = parts.join(' ');
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (!text)
|
|
95
|
+
return null;
|
|
96
|
+
return { role, text };
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Parse a Codex JSONL message (event_msg or response_item wrapper format).
|
|
104
|
+
*/
|
|
105
|
+
function parseCodexJsonlMessage(event) {
|
|
106
|
+
const p = event.payload;
|
|
107
|
+
if (event.type === 'event_msg') {
|
|
108
|
+
switch (p.type) {
|
|
109
|
+
case 'user_message':
|
|
110
|
+
return p.message ? { role: 'user', text: p.message } : null;
|
|
111
|
+
case 'agent_message':
|
|
112
|
+
return p.message ? { role: 'assistant', text: p.message } : null;
|
|
113
|
+
case 'task_complete':
|
|
114
|
+
return p.last_agent_message ? { role: 'assistant', text: p.last_agent_message } : null;
|
|
115
|
+
default:
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
else if (event.type === 'response_item') {
|
|
120
|
+
switch (p.type) {
|
|
121
|
+
case 'function_call': {
|
|
122
|
+
const name = p.name || 'unknown';
|
|
123
|
+
const args = p.arguments || '';
|
|
124
|
+
return { role: 'assistant', text: `[tool:${name}] ${args}` };
|
|
125
|
+
}
|
|
126
|
+
case 'function_call_output':
|
|
127
|
+
return p.output ? { role: 'user', text: p.output } : null;
|
|
128
|
+
default:
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Get ordered session files with assigned session numbers.
|
|
136
|
+
*
|
|
137
|
+
* For CurrentSessionChain: files are in chain order (oldest = session 1).
|
|
138
|
+
* Chain numbering is always oldest-first regardless of sort order.
|
|
139
|
+
*
|
|
140
|
+
* For FullProjectSearch: files are sorted by mtime according to sort order.
|
|
141
|
+
* Session 1 = first in sort order (newest if newest_first, oldest if oldest_first).
|
|
142
|
+
*/
|
|
143
|
+
async function getOrderedSessionFiles(cwd, options) {
|
|
144
|
+
const { type = 'FullProjectSearch', sessionUuid, sort = 'newest_first' } = options;
|
|
145
|
+
let jsonlFiles = await agentRegistry.getSessionFilesForProject(cwd);
|
|
146
|
+
if (!jsonlFiles.length)
|
|
147
|
+
return [];
|
|
148
|
+
if (type === 'CurrentSessionChain' && sessionUuid) {
|
|
149
|
+
// Chain files come back in chain order (oldest first) — this order is stable
|
|
150
|
+
jsonlFiles = filterChainFiles(jsonlFiles, sessionUuid);
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
// Sort by mtime for full project search
|
|
154
|
+
const filesWithMtime = jsonlFiles.map(f => {
|
|
155
|
+
try {
|
|
156
|
+
return { path: f, mtime: fs.statSync(f).mtimeMs };
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
return { path: f, mtime: 0 };
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
filesWithMtime.sort((a, b) => sort === 'newest_first' ? b.mtime - a.mtime : a.mtime - b.mtime);
|
|
163
|
+
jsonlFiles = filesWithMtime.map(f => f.path);
|
|
164
|
+
}
|
|
165
|
+
return jsonlFiles.map((f, i) => ({ number: i + 1, path: f, uuid: extractUuidFromPath(f) }));
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Parse all messages from a JSONL file, assigning 1-indexed message numbers.
|
|
169
|
+
*/
|
|
170
|
+
function parseFileMessages(filePath) {
|
|
171
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
172
|
+
const lines = content.split('\n');
|
|
173
|
+
const messages = [];
|
|
174
|
+
let msgNum = 0;
|
|
175
|
+
for (const line of lines) {
|
|
176
|
+
const parsed = parseJsonlMessage(line);
|
|
177
|
+
if (parsed) {
|
|
178
|
+
msgNum++;
|
|
179
|
+
messages.push({ msgNum, parsed });
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return messages;
|
|
183
|
+
}
|
|
184
|
+
// --- Search ---
|
|
185
|
+
/**
|
|
186
|
+
* Search through session history returning results as session:message references.
|
|
187
|
+
*
|
|
188
|
+
* Results use abstract addressing (no file paths):
|
|
189
|
+
* session N = the Nth session (chainlink for chain mode, sort-order index for full search)
|
|
190
|
+
* message M = the Mth conversational message within that session
|
|
191
|
+
*/
|
|
192
|
+
export async function searchSessionHistory(queries, cwd, maxResultsPerQuery = 50, options = {}) {
|
|
193
|
+
const sessionFiles = await getOrderedSessionFiles(cwd, options);
|
|
194
|
+
if (!sessionFiles.length) {
|
|
195
|
+
return { results: [], totalMatches: 0, sessionsSearched: 0, sessions: [] };
|
|
196
|
+
}
|
|
197
|
+
const { sort = 'newest_first', type } = options;
|
|
198
|
+
const queryList = Array.isArray(queries) ? queries : [queries];
|
|
199
|
+
// For chain mode, session numbering is always oldest-first.
|
|
200
|
+
// For search iteration with newest_first, reverse the iteration order
|
|
201
|
+
// but keep the session numbers stable.
|
|
202
|
+
const isChainMode = type === 'CurrentSessionChain';
|
|
203
|
+
const iterFiles = (isChainMode && sort === 'newest_first')
|
|
204
|
+
? [...sessionFiles].reverse()
|
|
205
|
+
: sessionFiles;
|
|
206
|
+
const allMatches = [];
|
|
207
|
+
const seenKeys = new Set();
|
|
208
|
+
let totalMatches = 0;
|
|
209
|
+
for (const query of queryList) {
|
|
210
|
+
const regex = buildRegex(query);
|
|
211
|
+
let queryMatches = 0;
|
|
212
|
+
for (const sf of iterFiles) {
|
|
213
|
+
try {
|
|
214
|
+
const messages = parseFileMessages(sf.path);
|
|
215
|
+
// For newest_first, search messages in reverse order within each session
|
|
216
|
+
const searchOrder = sort === 'newest_first' ? [...messages].reverse() : messages;
|
|
217
|
+
for (const { msgNum, parsed } of searchOrder) {
|
|
218
|
+
if (!regex.test(parsed.text))
|
|
219
|
+
continue;
|
|
220
|
+
totalMatches++;
|
|
221
|
+
const dedupKey = `${sf.number}:${msgNum}`;
|
|
222
|
+
if (seenKeys.has(dedupKey))
|
|
223
|
+
continue;
|
|
224
|
+
seenKeys.add(dedupKey);
|
|
225
|
+
// Build snippet around match
|
|
226
|
+
const match = regex.exec(parsed.text);
|
|
227
|
+
let snippet;
|
|
228
|
+
if (match) {
|
|
229
|
+
const matchStart = match.index;
|
|
230
|
+
const contextStart = Math.max(0, matchStart - 80);
|
|
231
|
+
const contextEnd = Math.min(parsed.text.length, matchStart + match[0].length + 80);
|
|
232
|
+
snippet = (contextStart > 0 ? '...' : '') +
|
|
233
|
+
parsed.text.substring(contextStart, contextEnd) +
|
|
234
|
+
(contextEnd < parsed.text.length ? '...' : '');
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
snippet = parsed.text.substring(0, 300);
|
|
238
|
+
}
|
|
239
|
+
if (snippet.length > 300) {
|
|
240
|
+
snippet = snippet.substring(0, 300) + '...';
|
|
241
|
+
}
|
|
242
|
+
allMatches.push({
|
|
243
|
+
session: sf.number,
|
|
244
|
+
message: msgNum,
|
|
245
|
+
text: `[${parsed.role}] ${snippet}`,
|
|
246
|
+
});
|
|
247
|
+
queryMatches++;
|
|
248
|
+
if (queryMatches >= maxResultsPerQuery)
|
|
249
|
+
break;
|
|
250
|
+
}
|
|
251
|
+
if (queryMatches >= maxResultsPerQuery)
|
|
252
|
+
break;
|
|
253
|
+
}
|
|
254
|
+
catch {
|
|
255
|
+
// Skip unreadable files
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
// Build deduplicated list of sessions that had matches
|
|
260
|
+
const matchedSessionNumbers = new Set(allMatches.map(m => m.session));
|
|
261
|
+
const sessions = sessionFiles
|
|
262
|
+
.filter(sf => matchedSessionNumbers.has(sf.number) && sf.uuid)
|
|
263
|
+
.map(sf => ({ number: sf.number, uuid: sf.uuid }));
|
|
264
|
+
return { results: allMatches, totalMatches, sessionsSearched: sessionFiles.length, sessions };
|
|
265
|
+
}
|
|
266
|
+
// --- Range ---
|
|
267
|
+
/**
|
|
268
|
+
* Fetch full messages from a specific session by session:from-to range.
|
|
269
|
+
*
|
|
270
|
+
* Returns complete message content (not truncated) for the requested range.
|
|
271
|
+
*/
|
|
272
|
+
export async function fetchSessionRange(cwd, options) {
|
|
273
|
+
const sessionFiles = await getOrderedSessionFiles(cwd, {
|
|
274
|
+
type: options.type,
|
|
275
|
+
sessionUuid: options.sessionUuid,
|
|
276
|
+
sort: options.sort,
|
|
277
|
+
});
|
|
278
|
+
// Look up by UUID first, fall back to session number
|
|
279
|
+
const sf = options.targetSessionUuid
|
|
280
|
+
? sessionFiles.find(f => f.uuid === options.targetSessionUuid)
|
|
281
|
+
: sessionFiles.find(f => f.number === options.session);
|
|
282
|
+
if (!sf) {
|
|
283
|
+
return { session: options.session ?? 0, uuid: options.targetSessionUuid ?? null, messages: [], totalMessages: 0 };
|
|
284
|
+
}
|
|
285
|
+
const allMessages = parseFileMessages(sf.path);
|
|
286
|
+
const rangeMessages = [];
|
|
287
|
+
for (const { msgNum, parsed } of allMessages) {
|
|
288
|
+
if (msgNum < options.from)
|
|
289
|
+
continue;
|
|
290
|
+
if (msgNum > options.to)
|
|
291
|
+
break;
|
|
292
|
+
rangeMessages.push({
|
|
293
|
+
message: msgNum,
|
|
294
|
+
text: `[${parsed.role}] ${parsed.text}`,
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
return {
|
|
298
|
+
session: sf.number,
|
|
299
|
+
uuid: sf.uuid,
|
|
300
|
+
messages: rangeMessages,
|
|
301
|
+
totalMessages: allMessages.length,
|
|
302
|
+
};
|
|
303
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { type ClientChannel } from 'ssh2';
|
|
2
|
+
import type { SshConnection } from '../state/db.js';
|
|
3
|
+
interface DirEntry {
|
|
4
|
+
name: string;
|
|
5
|
+
type: 'file' | 'dir';
|
|
6
|
+
size?: number;
|
|
7
|
+
}
|
|
8
|
+
export interface PtyOpts {
|
|
9
|
+
rows?: number;
|
|
10
|
+
cols?: number;
|
|
11
|
+
cwd?: string;
|
|
12
|
+
env?: Record<string, string>;
|
|
13
|
+
}
|
|
14
|
+
declare class SshManager {
|
|
15
|
+
private connections;
|
|
16
|
+
connect(config: SshConnection): Promise<void>;
|
|
17
|
+
disconnect(id: string): Promise<void>;
|
|
18
|
+
disconnectAll(): Promise<void>;
|
|
19
|
+
isConnected(id: string): boolean;
|
|
20
|
+
getStatus(id: string): {
|
|
21
|
+
connected: boolean;
|
|
22
|
+
error?: string;
|
|
23
|
+
};
|
|
24
|
+
private getSftp;
|
|
25
|
+
sftpReaddir(id: string, dirPath: string): Promise<DirEntry[]>;
|
|
26
|
+
sftpMkdir(id: string, dirPath: string): Promise<void>;
|
|
27
|
+
sftpReadFile(id: string, filePath: string): Promise<string>;
|
|
28
|
+
sftpWriteFile(id: string, filePath: string, content: string): Promise<void>;
|
|
29
|
+
sftpStat(id: string, filePath: string): Promise<any>;
|
|
30
|
+
sftpUnlink(id: string, filePath: string): Promise<void>;
|
|
31
|
+
sftpRmdir(id: string, dirPath: string): Promise<void>;
|
|
32
|
+
sftpRename(id: string, oldPath: string, newPath: string): Promise<void>;
|
|
33
|
+
exec(id: string, cmd: string, opts?: {
|
|
34
|
+
cwd?: string;
|
|
35
|
+
}): Promise<string>;
|
|
36
|
+
execPty(id: string, cmd: string, opts: PtyOpts): Promise<ClientChannel>;
|
|
37
|
+
setupReverseTunnel(id: string, remotePort: number, localPort: number): Promise<void>;
|
|
38
|
+
getOrCreateForwardTunnel(id: string, remotePort: number): Promise<number>;
|
|
39
|
+
private uploadCaCert;
|
|
40
|
+
verifyClaudeCli(id: string): Promise<boolean>;
|
|
41
|
+
private cleanupConnection;
|
|
42
|
+
}
|
|
43
|
+
export declare const sshManager: SshManager;
|
|
44
|
+
export {};
|