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,91 @@
|
|
|
1
|
+
import { Client } from 'cassandra-driver';
|
|
2
|
+
export class CassandraDriver {
|
|
3
|
+
client = null;
|
|
4
|
+
keyspace = '';
|
|
5
|
+
async connect(params) {
|
|
6
|
+
const host = params.host || 'localhost';
|
|
7
|
+
const port = params.port || 9042;
|
|
8
|
+
this.keyspace = params.database || '';
|
|
9
|
+
const opts = {
|
|
10
|
+
contactPoints: [`${host}:${port}`],
|
|
11
|
+
localDataCenter: 'datacenter1',
|
|
12
|
+
};
|
|
13
|
+
if (this.keyspace) {
|
|
14
|
+
opts.keyspace = this.keyspace;
|
|
15
|
+
}
|
|
16
|
+
if (params.username && params.password) {
|
|
17
|
+
opts.credentials = { username: params.username, password: params.password };
|
|
18
|
+
}
|
|
19
|
+
this.client = new Client(opts);
|
|
20
|
+
await this.client.connect();
|
|
21
|
+
}
|
|
22
|
+
async disconnect() {
|
|
23
|
+
if (this.client) {
|
|
24
|
+
await this.client.shutdown();
|
|
25
|
+
this.client = null;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
isConnected() {
|
|
29
|
+
return this.client !== null;
|
|
30
|
+
}
|
|
31
|
+
async query(cql, limit = 100) {
|
|
32
|
+
if (!this.client)
|
|
33
|
+
throw new Error('Not connected');
|
|
34
|
+
const start = Date.now();
|
|
35
|
+
const result = await this.client.execute(cql);
|
|
36
|
+
const elapsed = Date.now() - start;
|
|
37
|
+
const columns = result.columns ? result.columns.map((c) => c.name) : [];
|
|
38
|
+
const rows = (result.rows || []).slice(0, limit).map((row) => {
|
|
39
|
+
const obj = {};
|
|
40
|
+
for (const col of columns) {
|
|
41
|
+
obj[col] = row[col];
|
|
42
|
+
}
|
|
43
|
+
return obj;
|
|
44
|
+
});
|
|
45
|
+
return {
|
|
46
|
+
columns,
|
|
47
|
+
rows,
|
|
48
|
+
row_count: rows.length,
|
|
49
|
+
execution_time_ms: elapsed,
|
|
50
|
+
truncated: (result.rows || []).length > limit,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
async getTables() {
|
|
54
|
+
if (!this.client)
|
|
55
|
+
throw new Error('Not connected');
|
|
56
|
+
const keyspace = this.keyspace || this.client.keyspace;
|
|
57
|
+
if (!keyspace)
|
|
58
|
+
throw new Error('No keyspace selected');
|
|
59
|
+
const result = await this.client.execute('SELECT table_name FROM system_schema.tables WHERE keyspace_name = ?', [keyspace]);
|
|
60
|
+
return (result.rows || []).map((row) => ({
|
|
61
|
+
name: row.table_name,
|
|
62
|
+
type: 'table',
|
|
63
|
+
}));
|
|
64
|
+
}
|
|
65
|
+
async describeTable(table) {
|
|
66
|
+
if (!this.client)
|
|
67
|
+
throw new Error('Not connected');
|
|
68
|
+
const keyspace = this.keyspace || this.client.keyspace;
|
|
69
|
+
if (!keyspace)
|
|
70
|
+
throw new Error('No keyspace selected');
|
|
71
|
+
const result = await this.client.execute('SELECT column_name, type, kind FROM system_schema.columns WHERE keyspace_name = ? AND table_name = ?', [keyspace, table]);
|
|
72
|
+
const columns = (result.rows || []).map((row) => ({
|
|
73
|
+
name: row.column_name,
|
|
74
|
+
type: row.type,
|
|
75
|
+
nullable: row.kind !== 'partition_key' && row.kind !== 'clustering',
|
|
76
|
+
primary_key: row.kind === 'partition_key' || row.kind === 'clustering',
|
|
77
|
+
}));
|
|
78
|
+
return {
|
|
79
|
+
table,
|
|
80
|
+
columns,
|
|
81
|
+
indexes: [],
|
|
82
|
+
foreign_keys: [],
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
async getDatabases() {
|
|
86
|
+
if (!this.client)
|
|
87
|
+
throw new Error('Not connected');
|
|
88
|
+
const result = await this.client.execute('SELECT keyspace_name FROM system_schema.keyspaces');
|
|
89
|
+
return (result.rows || []).map((row) => row.keyspace_name);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ConnectionParams, DatabaseDriver, QueryResult, TableInfo, SchemaInfo } from '../types.js';
|
|
2
|
+
export declare class ClickHouseDriver implements DatabaseDriver {
|
|
3
|
+
private client;
|
|
4
|
+
connect(params: ConnectionParams): Promise<void>;
|
|
5
|
+
disconnect(): Promise<void>;
|
|
6
|
+
isConnected(): boolean;
|
|
7
|
+
query(sql: string, limit?: number): Promise<QueryResult>;
|
|
8
|
+
getTables(): Promise<TableInfo[]>;
|
|
9
|
+
describeTable(table: string): Promise<SchemaInfo>;
|
|
10
|
+
getDatabases(): Promise<string[]>;
|
|
11
|
+
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { createClient } from '@clickhouse/client';
|
|
2
|
+
export class ClickHouseDriver {
|
|
3
|
+
client = null;
|
|
4
|
+
async connect(params) {
|
|
5
|
+
if (params.connection_string) {
|
|
6
|
+
this.client = createClient({ url: params.connection_string });
|
|
7
|
+
}
|
|
8
|
+
else {
|
|
9
|
+
const host = params.host || 'localhost';
|
|
10
|
+
const port = params.port || 8123;
|
|
11
|
+
this.client = createClient({
|
|
12
|
+
url: `http://${host}:${port}`,
|
|
13
|
+
username: params.username || 'default',
|
|
14
|
+
password: params.password || '',
|
|
15
|
+
database: params.database || 'default',
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
// Test connection
|
|
19
|
+
await this.client.query({ query: 'SELECT 1', format: 'JSONEachRow' });
|
|
20
|
+
}
|
|
21
|
+
async disconnect() {
|
|
22
|
+
if (this.client) {
|
|
23
|
+
await this.client.close();
|
|
24
|
+
this.client = null;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
isConnected() {
|
|
28
|
+
return this.client !== null;
|
|
29
|
+
}
|
|
30
|
+
async query(sql, limit = 100) {
|
|
31
|
+
if (!this.client)
|
|
32
|
+
throw new Error('Not connected');
|
|
33
|
+
const start = Date.now();
|
|
34
|
+
const result = await this.client.query({ query: sql, format: 'JSONEachRow' });
|
|
35
|
+
const rows = await result.json();
|
|
36
|
+
const elapsed = Date.now() - start;
|
|
37
|
+
const columns = rows.length > 0 ? Object.keys(rows[0]) : [];
|
|
38
|
+
const truncated = rows.length > limit;
|
|
39
|
+
return {
|
|
40
|
+
columns,
|
|
41
|
+
rows: rows.slice(0, limit),
|
|
42
|
+
row_count: rows.length,
|
|
43
|
+
execution_time_ms: elapsed,
|
|
44
|
+
truncated,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
async getTables() {
|
|
48
|
+
if (!this.client)
|
|
49
|
+
throw new Error('Not connected');
|
|
50
|
+
const result = await this.client.query({
|
|
51
|
+
query: `
|
|
52
|
+
SELECT
|
|
53
|
+
name,
|
|
54
|
+
engine AS type,
|
|
55
|
+
total_rows,
|
|
56
|
+
total_bytes
|
|
57
|
+
FROM system.tables
|
|
58
|
+
WHERE database = currentDatabase()
|
|
59
|
+
ORDER BY name
|
|
60
|
+
`,
|
|
61
|
+
format: 'JSONEachRow',
|
|
62
|
+
});
|
|
63
|
+
const rows = await result.json();
|
|
64
|
+
return rows.map(r => ({
|
|
65
|
+
name: r.name,
|
|
66
|
+
type: inferTableType(r.type),
|
|
67
|
+
row_count: r.total_rows != null ? Number(r.total_rows) : undefined,
|
|
68
|
+
size_bytes: r.total_bytes != null ? Number(r.total_bytes) : undefined,
|
|
69
|
+
}));
|
|
70
|
+
}
|
|
71
|
+
async describeTable(table) {
|
|
72
|
+
if (!this.client)
|
|
73
|
+
throw new Error('Not connected');
|
|
74
|
+
const result = await this.client.query({
|
|
75
|
+
query: `DESCRIBE TABLE ${quoteIdentifier(table)}`,
|
|
76
|
+
format: 'JSONEachRow',
|
|
77
|
+
});
|
|
78
|
+
const rows = await result.json();
|
|
79
|
+
const columns = rows.map(r => ({
|
|
80
|
+
name: r.name,
|
|
81
|
+
type: r.type,
|
|
82
|
+
nullable: /Nullable/.test(r.type),
|
|
83
|
+
default_value: r.default_expression || undefined,
|
|
84
|
+
comment: r.comment || undefined,
|
|
85
|
+
}));
|
|
86
|
+
// Fetch primary key columns
|
|
87
|
+
const pkResult = await this.client.query({
|
|
88
|
+
query: `
|
|
89
|
+
SELECT name, sorting_key
|
|
90
|
+
FROM system.tables
|
|
91
|
+
WHERE database = currentDatabase() AND name = {tableName:String}
|
|
92
|
+
`,
|
|
93
|
+
format: 'JSONEachRow',
|
|
94
|
+
query_params: { tableName: table },
|
|
95
|
+
});
|
|
96
|
+
const pkRows = await pkResult.json();
|
|
97
|
+
if (pkRows.length > 0 && pkRows[0].sorting_key) {
|
|
98
|
+
const pkCols = new Set(pkRows[0].sorting_key.split(',').map(s => s.trim()));
|
|
99
|
+
for (const col of columns) {
|
|
100
|
+
if (pkCols.has(col.name)) {
|
|
101
|
+
col.primary_key = true;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return { table, columns };
|
|
106
|
+
}
|
|
107
|
+
async getDatabases() {
|
|
108
|
+
if (!this.client)
|
|
109
|
+
throw new Error('Not connected');
|
|
110
|
+
const result = await this.client.query({
|
|
111
|
+
query: 'SHOW DATABASES',
|
|
112
|
+
format: 'JSONEachRow',
|
|
113
|
+
});
|
|
114
|
+
const rows = await result.json();
|
|
115
|
+
return rows.map(r => r.name);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
function quoteIdentifier(id) {
|
|
119
|
+
return `\`${id.replace(/`/g, '``')}\``;
|
|
120
|
+
}
|
|
121
|
+
function inferTableType(engine) {
|
|
122
|
+
if (/MaterializedView/i.test(engine))
|
|
123
|
+
return 'materialized_view';
|
|
124
|
+
if (/View/i.test(engine))
|
|
125
|
+
return 'view';
|
|
126
|
+
return 'table';
|
|
127
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ConnectionParams, DatabaseDriver, QueryResult, TableInfo, SchemaInfo } from '../types.js';
|
|
2
|
+
export declare class ElasticsearchDriver implements DatabaseDriver {
|
|
3
|
+
private client;
|
|
4
|
+
private connected;
|
|
5
|
+
connect(params: ConnectionParams): Promise<void>;
|
|
6
|
+
disconnect(): Promise<void>;
|
|
7
|
+
isConnected(): boolean;
|
|
8
|
+
query(queryStr: string, limit?: number): Promise<QueryResult>;
|
|
9
|
+
getTables(): Promise<TableInfo[]>;
|
|
10
|
+
describeTable(index: string): Promise<SchemaInfo>;
|
|
11
|
+
getDatabases(): Promise<string[]>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { Client } from '@elastic/elasticsearch';
|
|
2
|
+
export class ElasticsearchDriver {
|
|
3
|
+
client = null;
|
|
4
|
+
connected = false;
|
|
5
|
+
async connect(params) {
|
|
6
|
+
const port = params.port || 9200;
|
|
7
|
+
const node = params.connection_string || `http://${params.host || 'localhost'}:${port}`;
|
|
8
|
+
const opts = { node };
|
|
9
|
+
if (params.username && params.password) {
|
|
10
|
+
opts.auth = { username: params.username, password: params.password };
|
|
11
|
+
}
|
|
12
|
+
this.client = new Client(opts);
|
|
13
|
+
// Verify connectivity
|
|
14
|
+
const ok = await this.client.ping();
|
|
15
|
+
if (!ok) {
|
|
16
|
+
this.client = null;
|
|
17
|
+
throw new Error('Elasticsearch ping failed');
|
|
18
|
+
}
|
|
19
|
+
this.connected = true;
|
|
20
|
+
}
|
|
21
|
+
async disconnect() {
|
|
22
|
+
if (this.client) {
|
|
23
|
+
await this.client.close();
|
|
24
|
+
this.client = null;
|
|
25
|
+
this.connected = false;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
isConnected() {
|
|
29
|
+
return this.client !== null && this.connected;
|
|
30
|
+
}
|
|
31
|
+
async query(queryStr, limit = 100) {
|
|
32
|
+
if (!this.client)
|
|
33
|
+
throw new Error('Not connected');
|
|
34
|
+
const start = Date.now();
|
|
35
|
+
const trimmed = queryStr.trim();
|
|
36
|
+
let searchParams;
|
|
37
|
+
if (trimmed.startsWith('{')) {
|
|
38
|
+
// JSON query DSL: {"index": "my-index", "query": {"match_all": {}}}
|
|
39
|
+
searchParams = JSON.parse(trimmed);
|
|
40
|
+
if (!searchParams.size && limit) {
|
|
41
|
+
searchParams.size = limit;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
// Simple format: index_name or index_name {"match": {"field": "value"}}
|
|
46
|
+
const firstSpace = trimmed.indexOf(' ');
|
|
47
|
+
let index;
|
|
48
|
+
let queryBody = { match_all: {} };
|
|
49
|
+
if (firstSpace === -1) {
|
|
50
|
+
index = trimmed;
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
index = trimmed.substring(0, firstSpace);
|
|
54
|
+
const rest = trimmed.substring(firstSpace + 1).trim();
|
|
55
|
+
if (rest) {
|
|
56
|
+
queryBody = JSON.parse(rest);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
searchParams = {
|
|
60
|
+
index,
|
|
61
|
+
query: queryBody,
|
|
62
|
+
size: limit,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
const response = await this.client.search(searchParams);
|
|
66
|
+
const elapsed = Date.now() - start;
|
|
67
|
+
const hits = (response.hits?.hits || []);
|
|
68
|
+
const rows = hits.map(hit => {
|
|
69
|
+
const source = (hit._source || {});
|
|
70
|
+
return {
|
|
71
|
+
_id: hit._id,
|
|
72
|
+
_index: hit._index,
|
|
73
|
+
...source,
|
|
74
|
+
};
|
|
75
|
+
});
|
|
76
|
+
const columns = rows.length > 0
|
|
77
|
+
? [...new Set(rows.flatMap(r => Object.keys(r)))]
|
|
78
|
+
: [];
|
|
79
|
+
const totalHits = typeof response.hits?.total === 'number'
|
|
80
|
+
? response.hits.total
|
|
81
|
+
: response.hits?.total?.value ?? rows.length;
|
|
82
|
+
return {
|
|
83
|
+
columns,
|
|
84
|
+
rows,
|
|
85
|
+
row_count: rows.length,
|
|
86
|
+
execution_time_ms: elapsed,
|
|
87
|
+
truncated: totalHits > rows.length,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
async getTables() {
|
|
91
|
+
if (!this.client)
|
|
92
|
+
throw new Error('Not connected');
|
|
93
|
+
const indices = await this.client.cat.indices({ format: 'json' });
|
|
94
|
+
const tables = indices.map(idx => ({
|
|
95
|
+
name: idx.index,
|
|
96
|
+
type: 'index',
|
|
97
|
+
row_count: idx['docs.count'] != null ? parseInt(idx['docs.count'], 10) : undefined,
|
|
98
|
+
size_bytes: idx['store.size'] ? parseStorageSize(idx['store.size']) : undefined,
|
|
99
|
+
}));
|
|
100
|
+
return tables.sort((a, b) => a.name.localeCompare(b.name));
|
|
101
|
+
}
|
|
102
|
+
async describeTable(index) {
|
|
103
|
+
if (!this.client)
|
|
104
|
+
throw new Error('Not connected');
|
|
105
|
+
const mappingResponse = await this.client.indices.getMapping({ index });
|
|
106
|
+
const indexMapping = mappingResponse[index];
|
|
107
|
+
const properties = indexMapping?.mappings?.properties || {};
|
|
108
|
+
const columns = flattenMappingProperties(properties);
|
|
109
|
+
return {
|
|
110
|
+
table: index,
|
|
111
|
+
columns,
|
|
112
|
+
indexes: [],
|
|
113
|
+
foreign_keys: [],
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
async getDatabases() {
|
|
117
|
+
if (!this.client)
|
|
118
|
+
throw new Error('Not connected');
|
|
119
|
+
const indices = await this.client.cat.indices({ format: 'json' });
|
|
120
|
+
return indices
|
|
121
|
+
.map(idx => idx.index)
|
|
122
|
+
.filter(Boolean)
|
|
123
|
+
.sort();
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Flatten nested Elasticsearch mapping properties into a flat list of ColumnInfo.
|
|
128
|
+
* Nested objects are represented with dot notation (e.g. "address.city").
|
|
129
|
+
*/
|
|
130
|
+
function flattenMappingProperties(properties, prefix = '') {
|
|
131
|
+
const columns = [];
|
|
132
|
+
for (const [field, mapping] of Object.entries(properties)) {
|
|
133
|
+
const fullName = prefix ? `${prefix}.${field}` : field;
|
|
134
|
+
if (mapping.properties) {
|
|
135
|
+
// Nested object — recurse
|
|
136
|
+
columns.push(...flattenMappingProperties(mapping.properties, fullName));
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
columns.push({
|
|
140
|
+
name: fullName,
|
|
141
|
+
type: mapping.type || 'object',
|
|
142
|
+
nullable: true, // ES fields are always optional
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return columns;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Parse Elasticsearch human-readable storage sizes (e.g. "1.2mb", "500kb") to bytes.
|
|
150
|
+
*/
|
|
151
|
+
function parseStorageSize(size) {
|
|
152
|
+
if (typeof size === 'number')
|
|
153
|
+
return size;
|
|
154
|
+
if (!size)
|
|
155
|
+
return undefined;
|
|
156
|
+
const match = size.match(/^([\d.]+)\s*(b|kb|mb|gb|tb)$/i);
|
|
157
|
+
if (!match)
|
|
158
|
+
return undefined;
|
|
159
|
+
const value = parseFloat(match[1]);
|
|
160
|
+
const unit = match[2].toLowerCase();
|
|
161
|
+
const multipliers = {
|
|
162
|
+
b: 1,
|
|
163
|
+
kb: 1024,
|
|
164
|
+
mb: 1024 ** 2,
|
|
165
|
+
gb: 1024 ** 3,
|
|
166
|
+
tb: 1024 ** 4,
|
|
167
|
+
};
|
|
168
|
+
return Math.round(value * (multipliers[unit] || 1));
|
|
169
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ConnectionParams, DatabaseDriver, QueryResult, TableInfo, SchemaInfo } from '../types.js';
|
|
2
|
+
export declare class InfluxDBDriver implements DatabaseDriver {
|
|
3
|
+
private client;
|
|
4
|
+
private queryApi;
|
|
5
|
+
private org;
|
|
6
|
+
private bucket;
|
|
7
|
+
connect(params: ConnectionParams): Promise<void>;
|
|
8
|
+
disconnect(): Promise<void>;
|
|
9
|
+
isConnected(): boolean;
|
|
10
|
+
query(flux: string, limit?: number): Promise<QueryResult>;
|
|
11
|
+
getTables(): Promise<TableInfo[]>;
|
|
12
|
+
describeTable(measurement: string): Promise<SchemaInfo>;
|
|
13
|
+
getDatabases(): Promise<string[]>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { InfluxDB } from '@influxdata/influxdb-client';
|
|
2
|
+
export class InfluxDBDriver {
|
|
3
|
+
client = null;
|
|
4
|
+
queryApi = null;
|
|
5
|
+
org = '';
|
|
6
|
+
bucket = '';
|
|
7
|
+
async connect(params) {
|
|
8
|
+
let url;
|
|
9
|
+
let token;
|
|
10
|
+
if (params.connection_string) {
|
|
11
|
+
// Parse connection string: http://host:port?org=myorg&bucket=mybucket or similar
|
|
12
|
+
const parsed = new URL(params.connection_string);
|
|
13
|
+
url = `${parsed.protocol}//${parsed.host}`;
|
|
14
|
+
token = params.password || parsed.searchParams.get('token') || '';
|
|
15
|
+
this.org = parsed.searchParams.get('org') || params.database || '';
|
|
16
|
+
this.bucket = parsed.searchParams.get('bucket') || '';
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
const port = params.port || 8086;
|
|
20
|
+
const host = params.host || 'localhost';
|
|
21
|
+
url = `http://${host}:${port}`;
|
|
22
|
+
token = params.password || '';
|
|
23
|
+
}
|
|
24
|
+
// Handle org/bucket format in the database field
|
|
25
|
+
if (params.database && !this.org) {
|
|
26
|
+
if (params.database.includes('/')) {
|
|
27
|
+
const parts = params.database.split('/');
|
|
28
|
+
this.org = parts[0];
|
|
29
|
+
this.bucket = parts[1];
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
this.org = params.database;
|
|
33
|
+
this.bucket = params.database;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
if (!this.bucket && this.org) {
|
|
37
|
+
this.bucket = this.org;
|
|
38
|
+
}
|
|
39
|
+
this.client = new InfluxDB({ url, token });
|
|
40
|
+
this.queryApi = this.client.getQueryApi(this.org);
|
|
41
|
+
// Verify connectivity by running a simple query
|
|
42
|
+
try {
|
|
43
|
+
await this.queryApi.collectRows('buckets() |> limit(n: 1)');
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
this.client = null;
|
|
47
|
+
this.queryApi = null;
|
|
48
|
+
throw new Error(`InfluxDB connection failed: ${err.message}`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async disconnect() {
|
|
52
|
+
this.client = null;
|
|
53
|
+
this.queryApi = null;
|
|
54
|
+
this.org = '';
|
|
55
|
+
this.bucket = '';
|
|
56
|
+
}
|
|
57
|
+
isConnected() {
|
|
58
|
+
return this.client !== null;
|
|
59
|
+
}
|
|
60
|
+
async query(flux, limit) {
|
|
61
|
+
if (!this.queryApi)
|
|
62
|
+
throw new Error('Not connected');
|
|
63
|
+
const start = Date.now();
|
|
64
|
+
let effectiveQuery = flux.trim();
|
|
65
|
+
if (limit && !effectiveQuery.includes('|> limit(')) {
|
|
66
|
+
effectiveQuery += ` |> limit(n: ${limit})`;
|
|
67
|
+
}
|
|
68
|
+
const rawRows = await this.queryApi.collectRows(effectiveQuery);
|
|
69
|
+
const elapsed = Date.now() - start;
|
|
70
|
+
// Convert InfluxDB row objects — strip internal metadata prefixes
|
|
71
|
+
const rows = rawRows.map(row => {
|
|
72
|
+
const record = {};
|
|
73
|
+
for (const [key, value] of Object.entries(row)) {
|
|
74
|
+
record[key] = value;
|
|
75
|
+
}
|
|
76
|
+
return record;
|
|
77
|
+
});
|
|
78
|
+
const columns = rows.length > 0
|
|
79
|
+
? [...new Set(rows.flatMap(r => Object.keys(r)))]
|
|
80
|
+
: [];
|
|
81
|
+
return {
|
|
82
|
+
columns,
|
|
83
|
+
rows,
|
|
84
|
+
row_count: rows.length,
|
|
85
|
+
execution_time_ms: elapsed,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
async getTables() {
|
|
89
|
+
if (!this.queryApi)
|
|
90
|
+
throw new Error('Not connected');
|
|
91
|
+
const tables = [];
|
|
92
|
+
// If we have a specific bucket, list measurements within it
|
|
93
|
+
if (this.bucket) {
|
|
94
|
+
try {
|
|
95
|
+
const flux = `import "influxdata/influxdb/schema"\nschema.measurements(bucket: "${escapeBucket(this.bucket)}")`;
|
|
96
|
+
const rows = await this.queryApi.collectRows(flux);
|
|
97
|
+
for (const row of rows) {
|
|
98
|
+
const name = row._value || row.name;
|
|
99
|
+
if (name) {
|
|
100
|
+
tables.push({ name: String(name), type: 'measurement' });
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
// Fall back to listing buckets if measurement listing fails
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// If no measurements found, or no bucket specified, list buckets
|
|
109
|
+
if (tables.length === 0) {
|
|
110
|
+
const flux = 'buckets()';
|
|
111
|
+
const rows = await this.queryApi.collectRows(flux);
|
|
112
|
+
for (const row of rows) {
|
|
113
|
+
const name = row.name;
|
|
114
|
+
if (name && !String(name).startsWith('_')) {
|
|
115
|
+
tables.push({ name: String(name), type: 'bucket' });
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return tables.sort((a, b) => a.name.localeCompare(b.name));
|
|
120
|
+
}
|
|
121
|
+
async describeTable(measurement) {
|
|
122
|
+
if (!this.queryApi)
|
|
123
|
+
throw new Error('Not connected');
|
|
124
|
+
const bucket = escapeBucket(this.bucket);
|
|
125
|
+
const meas = escapeMeasurement(measurement);
|
|
126
|
+
const columns = [];
|
|
127
|
+
// Get field keys
|
|
128
|
+
try {
|
|
129
|
+
const fieldFlux = `import "influxdata/influxdb/schema"\nschema.measurementFieldKeys(bucket: "${bucket}", measurement: "${meas}")`;
|
|
130
|
+
const fieldRows = await this.queryApi.collectRows(fieldFlux);
|
|
131
|
+
for (const row of fieldRows) {
|
|
132
|
+
const name = row._value || row.name;
|
|
133
|
+
if (name) {
|
|
134
|
+
columns.push({
|
|
135
|
+
name: String(name),
|
|
136
|
+
type: 'field',
|
|
137
|
+
nullable: true,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
// Field key listing not supported on all versions
|
|
144
|
+
}
|
|
145
|
+
// Get tag keys
|
|
146
|
+
try {
|
|
147
|
+
const tagFlux = `import "influxdata/influxdb/schema"\nschema.measurementTagKeys(bucket: "${bucket}", measurement: "${meas}")`;
|
|
148
|
+
const tagRows = await this.queryApi.collectRows(tagFlux);
|
|
149
|
+
for (const row of tagRows) {
|
|
150
|
+
const name = row._value || row.name;
|
|
151
|
+
if (name && !String(name).startsWith('_')) {
|
|
152
|
+
columns.push({
|
|
153
|
+
name: String(name),
|
|
154
|
+
type: 'tag',
|
|
155
|
+
nullable: true,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
// Tag key listing not supported on all versions
|
|
162
|
+
}
|
|
163
|
+
// Always include the implicit _time column
|
|
164
|
+
if (!columns.some(c => c.name === '_time')) {
|
|
165
|
+
columns.unshift({
|
|
166
|
+
name: '_time',
|
|
167
|
+
type: 'timestamp',
|
|
168
|
+
nullable: false,
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
return {
|
|
172
|
+
table: measurement,
|
|
173
|
+
columns,
|
|
174
|
+
indexes: [],
|
|
175
|
+
foreign_keys: [],
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
async getDatabases() {
|
|
179
|
+
if (!this.queryApi)
|
|
180
|
+
throw new Error('Not connected');
|
|
181
|
+
const flux = 'buckets() |> keep(columns: ["name"])';
|
|
182
|
+
const rows = await this.queryApi.collectRows(flux);
|
|
183
|
+
return rows
|
|
184
|
+
.map(row => String(row.name || ''))
|
|
185
|
+
.filter(name => name && !name.startsWith('_'))
|
|
186
|
+
.sort();
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
function escapeBucket(bucket) {
|
|
190
|
+
return bucket.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
|
|
191
|
+
}
|
|
192
|
+
function escapeMeasurement(measurement) {
|
|
193
|
+
return measurement.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
|
|
194
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ConnectionParams, DatabaseDriver, QueryResult, TableInfo, SchemaInfo } from '../types.js';
|
|
2
|
+
export declare class MemcachedDriver implements DatabaseDriver {
|
|
3
|
+
private client;
|
|
4
|
+
connect(params: ConnectionParams): Promise<void>;
|
|
5
|
+
disconnect(): Promise<void>;
|
|
6
|
+
isConnected(): boolean;
|
|
7
|
+
query(command: string, limit?: number): Promise<QueryResult>;
|
|
8
|
+
getTables(): Promise<TableInfo[]>;
|
|
9
|
+
describeTable(_table: string): Promise<SchemaInfo>;
|
|
10
|
+
getDatabases(): Promise<string[]>;
|
|
11
|
+
}
|