atoo-studio 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (408) hide show
  1. package/LICENSE +21 -0
  2. package/README.github.md +322 -0
  3. package/README.md +112 -0
  4. package/README.npm.md +112 -0
  5. package/bin/atoo-studio.js +90 -0
  6. package/dist/src/agents/claude-code-terminal/adapter.d.ts +42 -0
  7. package/dist/src/agents/claude-code-terminal/adapter.js +166 -0
  8. package/dist/src/agents/claude-code-terminal/index.d.ts +13 -0
  9. package/dist/src/agents/claude-code-terminal/index.js +45 -0
  10. package/dist/src/agents/claude-code-terminal/spawner.d.ts +9 -0
  11. package/dist/src/agents/claude-code-terminal/spawner.js +37 -0
  12. package/dist/src/agents/claude-code-terminal-chatro/adapter.d.ts +51 -0
  13. package/dist/src/agents/claude-code-terminal-chatro/adapter.js +301 -0
  14. package/dist/src/agents/claude-code-terminal-chatro/index.d.ts +13 -0
  15. package/dist/src/agents/claude-code-terminal-chatro/index.js +45 -0
  16. package/dist/src/agents/claude-code-terminal-chatro/jsonl-watcher.d.ts +67 -0
  17. package/dist/src/agents/claude-code-terminal-chatro/jsonl-watcher.js +431 -0
  18. package/dist/src/agents/claude-code-terminal-chatro/spawner.d.ts +9 -0
  19. package/dist/src/agents/claude-code-terminal-chatro/spawner.js +37 -0
  20. package/dist/src/agents/codex-terminal/adapter.d.ts +40 -0
  21. package/dist/src/agents/codex-terminal/adapter.js +160 -0
  22. package/dist/src/agents/codex-terminal/index.d.ts +13 -0
  23. package/dist/src/agents/codex-terminal/index.js +47 -0
  24. package/dist/src/agents/codex-terminal/spawner.d.ts +9 -0
  25. package/dist/src/agents/codex-terminal/spawner.js +56 -0
  26. package/dist/src/agents/codex-terminal-chatro/adapter.d.ts +58 -0
  27. package/dist/src/agents/codex-terminal-chatro/adapter.js +266 -0
  28. package/dist/src/agents/codex-terminal-chatro/index.d.ts +13 -0
  29. package/dist/src/agents/codex-terminal-chatro/index.js +50 -0
  30. package/dist/src/agents/codex-terminal-chatro/jsonl-watcher.d.ts +36 -0
  31. package/dist/src/agents/codex-terminal-chatro/jsonl-watcher.js +205 -0
  32. package/dist/src/agents/codex-terminal-chatro/spawner.d.ts +9 -0
  33. package/dist/src/agents/codex-terminal-chatro/spawner.js +57 -0
  34. package/dist/src/agents/lib/chain-builder.d.ts +21 -0
  35. package/dist/src/agents/lib/chain-builder.js +139 -0
  36. package/dist/src/agents/lib/claude/fs-sessions.d.ts +31 -0
  37. package/dist/src/agents/lib/claude/fs-sessions.js +329 -0
  38. package/dist/src/agents/lib/claude/jsonl-writer.d.ts +32 -0
  39. package/dist/src/agents/lib/claude/jsonl-writer.js +342 -0
  40. package/dist/src/agents/lib/claude/workspace-trust.d.ts +1 -0
  41. package/dist/src/agents/lib/claude/workspace-trust.js +29 -0
  42. package/dist/src/agents/lib/codex/fs-sessions.d.ts +34 -0
  43. package/dist/src/agents/lib/codex/fs-sessions.js +255 -0
  44. package/dist/src/agents/lib/codex/jsonl-mapper.d.ts +11 -0
  45. package/dist/src/agents/lib/codex/jsonl-mapper.js +154 -0
  46. package/dist/src/agents/lib/codex/jsonl-writer.d.ts +8 -0
  47. package/dist/src/agents/lib/codex/jsonl-writer.js +440 -0
  48. package/dist/src/agents/lib/fs-tracking.d.ts +36 -0
  49. package/dist/src/agents/lib/fs-tracking.js +109 -0
  50. package/dist/src/agents/lib/pty-activity-tracker.d.ts +37 -0
  51. package/dist/src/agents/lib/pty-activity-tracker.js +105 -0
  52. package/dist/src/agents/lib/session-id-utils.d.ts +46 -0
  53. package/dist/src/agents/lib/session-id-utils.js +147 -0
  54. package/dist/src/agents/lib/session-precreate.d.ts +17 -0
  55. package/dist/src/agents/lib/session-precreate.js +177 -0
  56. package/dist/src/agents/registry.d.ts +72 -0
  57. package/dist/src/agents/registry.js +337 -0
  58. package/dist/src/agents/types.d.ts +135 -0
  59. package/dist/src/agents/types.js +1 -0
  60. package/dist/src/auth/crypto-key.d.ts +6 -0
  61. package/dist/src/auth/crypto-key.js +45 -0
  62. package/dist/src/auth/middleware.d.ts +18 -0
  63. package/dist/src/auth/middleware.js +54 -0
  64. package/dist/src/auth/password.d.ts +2 -0
  65. package/dist/src/auth/password.js +12 -0
  66. package/dist/src/auth/session.d.ts +10 -0
  67. package/dist/src/auth/session.js +33 -0
  68. package/dist/src/auth/totp.d.ts +12 -0
  69. package/dist/src/auth/totp.js +61 -0
  70. package/dist/src/auth/webauthn.d.ts +6 -0
  71. package/dist/src/auth/webauthn.js +117 -0
  72. package/dist/src/config.d.ts +10 -0
  73. package/dist/src/config.js +16 -0
  74. package/dist/src/database/connection-manager.d.ts +25 -0
  75. package/dist/src/database/connection-manager.js +211 -0
  76. package/dist/src/database/discovery/container.d.ts +6 -0
  77. package/dist/src/database/discovery/container.js +226 -0
  78. package/dist/src/database/discovery/env-parser.d.ts +9 -0
  79. package/dist/src/database/discovery/env-parser.js +525 -0
  80. package/dist/src/database/discovery/local-files.d.ts +6 -0
  81. package/dist/src/database/discovery/local-files.js +58 -0
  82. package/dist/src/database/discovery/port-scan.d.ts +7 -0
  83. package/dist/src/database/discovery/port-scan.js +61 -0
  84. package/dist/src/database/drivers/cassandra.d.ts +12 -0
  85. package/dist/src/database/drivers/cassandra.js +91 -0
  86. package/dist/src/database/drivers/clickhouse.d.ts +11 -0
  87. package/dist/src/database/drivers/clickhouse.js +127 -0
  88. package/dist/src/database/drivers/elasticsearch.d.ts +12 -0
  89. package/dist/src/database/drivers/elasticsearch.js +169 -0
  90. package/dist/src/database/drivers/influxdb.d.ts +14 -0
  91. package/dist/src/database/drivers/influxdb.js +194 -0
  92. package/dist/src/database/drivers/memcached.d.ts +11 -0
  93. package/dist/src/database/drivers/memcached.js +117 -0
  94. package/dist/src/database/drivers/mongodb.d.ts +12 -0
  95. package/dist/src/database/drivers/mongodb.js +128 -0
  96. package/dist/src/database/drivers/mysql.d.ts +11 -0
  97. package/dist/src/database/drivers/mysql.js +112 -0
  98. package/dist/src/database/drivers/neo4j.d.ts +11 -0
  99. package/dist/src/database/drivers/neo4j.js +158 -0
  100. package/dist/src/database/drivers/postgresql.d.ts +11 -0
  101. package/dist/src/database/drivers/postgresql.js +133 -0
  102. package/dist/src/database/drivers/redis.d.ts +11 -0
  103. package/dist/src/database/drivers/redis.js +91 -0
  104. package/dist/src/database/drivers/sqlite.d.ts +10 -0
  105. package/dist/src/database/drivers/sqlite.js +100 -0
  106. package/dist/src/database/query-stream.d.ts +5 -0
  107. package/dist/src/database/query-stream.js +75 -0
  108. package/dist/src/database/types.d.ts +71 -0
  109. package/dist/src/database/types.js +1 -0
  110. package/dist/src/events/index.d.ts +3 -0
  111. package/dist/src/events/index.js +3 -0
  112. package/dist/src/events/types.d.ts +214 -0
  113. package/dist/src/events/types.js +22 -0
  114. package/dist/src/events/wire.d.ts +114 -0
  115. package/dist/src/events/wire.js +296 -0
  116. package/dist/src/fs-monitor-types.d.ts +24 -0
  117. package/dist/src/fs-monitor-types.js +1 -0
  118. package/dist/src/fs-monitor.d.ts +80 -0
  119. package/dist/src/fs-monitor.js +637 -0
  120. package/dist/src/handlers/auth.d.ts +1 -0
  121. package/dist/src/handlers/auth.js +170 -0
  122. package/dist/src/handlers/changes.d.ts +1 -0
  123. package/dist/src/handlers/changes.js +203 -0
  124. package/dist/src/handlers/containers.d.ts +12 -0
  125. package/dist/src/handlers/containers.js +379 -0
  126. package/dist/src/handlers/databases.d.ts +3 -0
  127. package/dist/src/handlers/databases.js +327 -0
  128. package/dist/src/handlers/environments.d.ts +3 -0
  129. package/dist/src/handlers/environments.js +286 -0
  130. package/dist/src/handlers/github.d.ts +1 -0
  131. package/dist/src/handlers/github.js +153 -0
  132. package/dist/src/handlers/projects.d.ts +1 -0
  133. package/dist/src/handlers/projects.js +895 -0
  134. package/dist/src/handlers/ssh.d.ts +1 -0
  135. package/dist/src/handlers/ssh.js +162 -0
  136. package/dist/src/handlers/users.d.ts +1 -0
  137. package/dist/src/handlers/users.js +195 -0
  138. package/dist/src/index.d.ts +1 -0
  139. package/dist/src/index.js +228 -0
  140. package/dist/src/mcp/config.d.ts +32 -0
  141. package/dist/src/mcp/config.js +227 -0
  142. package/dist/src/mcp/server.d.ts +1 -0
  143. package/dist/src/mcp/server.js +574 -0
  144. package/dist/src/serial/cuse-device.d.ts +19 -0
  145. package/dist/src/serial/cuse-device.js +260 -0
  146. package/dist/src/serial/manager.d.ts +63 -0
  147. package/dist/src/serial/manager.js +206 -0
  148. package/dist/src/serial/pty-pair.d.ts +16 -0
  149. package/dist/src/serial/pty-pair.js +68 -0
  150. package/dist/src/services/fs-browser.d.ts +14 -0
  151. package/dist/src/services/fs-browser.js +98 -0
  152. package/dist/src/services/git-ops.d.ts +78 -0
  153. package/dist/src/services/git-ops.js +288 -0
  154. package/dist/src/services/github-ops.d.ts +104 -0
  155. package/dist/src/services/github-ops.js +192 -0
  156. package/dist/src/services/obfuscation.d.ts +2 -0
  157. package/dist/src/services/obfuscation.js +16 -0
  158. package/dist/src/services/preview/headless-backend.d.ts +62 -0
  159. package/dist/src/services/preview/headless-backend.js +698 -0
  160. package/dist/src/services/preview/injected-scripts.d.ts +9 -0
  161. package/dist/src/services/preview/injected-scripts.js +232 -0
  162. package/dist/src/services/preview/preview-backend.d.ts +92 -0
  163. package/dist/src/services/preview/preview-backend.js +15 -0
  164. package/dist/src/services/preview/universal-setter.d.ts +7 -0
  165. package/dist/src/services/preview/universal-setter.js +46 -0
  166. package/dist/src/services/preview-manager.d.ts +50 -0
  167. package/dist/src/services/preview-manager.js +216 -0
  168. package/dist/src/services/project-watcher.d.ts +6 -0
  169. package/dist/src/services/project-watcher.js +307 -0
  170. package/dist/src/services/remote-fs-browser.d.ts +11 -0
  171. package/dist/src/services/remote-fs-browser.js +50 -0
  172. package/dist/src/services/remote-git-ops.d.ts +71 -0
  173. package/dist/src/services/remote-git-ops.js +215 -0
  174. package/dist/src/services/session-search.d.ts +56 -0
  175. package/dist/src/services/session-search.js +303 -0
  176. package/dist/src/services/ssh-manager.d.ts +44 -0
  177. package/dist/src/services/ssh-manager.js +359 -0
  178. package/dist/src/session-writer.d.ts +9 -0
  179. package/dist/src/session-writer.js +66 -0
  180. package/dist/src/spawner.d.ts +56 -0
  181. package/dist/src/spawner.js +135 -0
  182. package/dist/src/state/db.d.ts +214 -0
  183. package/dist/src/state/db.js +897 -0
  184. package/dist/src/state/store.d.ts +37 -0
  185. package/dist/src/state/store.js +108 -0
  186. package/dist/src/state/types.d.ts +13 -0
  187. package/dist/src/state/types.js +1 -0
  188. package/dist/src/web/devtools-proxy.d.ts +7 -0
  189. package/dist/src/web/devtools-proxy.js +176 -0
  190. package/dist/src/web/port-proxy.d.ts +15 -0
  191. package/dist/src/web/port-proxy.js +124 -0
  192. package/dist/src/web/preview-ws.d.ts +5 -0
  193. package/dist/src/web/preview-ws.js +207 -0
  194. package/dist/src/web/server.d.ts +6 -0
  195. package/dist/src/web/server.js +1694 -0
  196. package/dist/src/ws/agent-ws.d.ts +5 -0
  197. package/dist/src/ws/agent-ws.js +93 -0
  198. package/frontend/dist/assets/_basePickBy-B-LibQ4-.js +1 -0
  199. package/frontend/dist/assets/_baseUniq-CprifHap.js +1 -0
  200. package/frontend/dist/assets/_createAssigner-ByDUqGii.js +1 -0
  201. package/frontend/dist/assets/abap-DuT-3z4x.js +1 -0
  202. package/frontend/dist/assets/addon-fit-CxQet2ja.js +1 -0
  203. package/frontend/dist/assets/addon-web-links-D_jRkPIl.js +1 -0
  204. package/frontend/dist/assets/apex-B-em86xX.js +1 -0
  205. package/frontend/dist/assets/api-SUPuHhSY.js +2 -0
  206. package/frontend/dist/assets/arc-Z0_eVteO.js +1 -0
  207. package/frontend/dist/assets/architecture-PBZL5I3N-hvVXGhqd.js +1 -0
  208. package/frontend/dist/assets/architectureDiagram-2XIMDMQ5-DiHPxX4j.js +36 -0
  209. package/frontend/dist/assets/array-CwG8vNfn.js +1 -0
  210. package/frontend/dist/assets/auth-store-R7eW5SVu.js +1 -0
  211. package/frontend/dist/assets/azcli-Bg9wQloi.js +1 -0
  212. package/frontend/dist/assets/bat-BM46z99L.js +1 -0
  213. package/frontend/dist/assets/bicep-DcBsJUfh.js +2 -0
  214. package/frontend/dist/assets/blockDiagram-WCTKOSBZ-C40u_hLo.js +132 -0
  215. package/frontend/dist/assets/c4Diagram-IC4MRINW-Ct7LjWFQ.js +10 -0
  216. package/frontend/dist/assets/cameligo-zw7JTtim.js +1 -0
  217. package/frontend/dist/assets/channel-ClCsE6HN.js +1 -0
  218. package/frontend/dist/assets/chunk-4BX2VUAB-zZ6P90VO.js +1 -0
  219. package/frontend/dist/assets/chunk-55IACEB6-DXllTDQl.js +1 -0
  220. package/frontend/dist/assets/chunk-7E7YKBS2-7zRaOLjj.js +1 -0
  221. package/frontend/dist/assets/chunk-7R4GIKGN-Csst1274.js +80 -0
  222. package/frontend/dist/assets/chunk-C72U2L5F-_JbQPbLN.js +1 -0
  223. package/frontend/dist/assets/chunk-CFjPhJqf.js +1 -0
  224. package/frontend/dist/assets/chunk-EGIJ26TM-B--aFyPw.js +1 -0
  225. package/frontend/dist/assets/chunk-FMBD7UC4-DVR34RNb.js +15 -0
  226. package/frontend/dist/assets/chunk-GEFDOKGD-CnmN6cC8.js +2 -0
  227. package/frontend/dist/assets/chunk-JSJVCQXG-CWxHBzeJ.js +1 -0
  228. package/frontend/dist/assets/chunk-KX2RTZJC-DkRk56s7.js +1 -0
  229. package/frontend/dist/assets/chunk-KYZI473N-DCCsG2dK.js +53 -0
  230. package/frontend/dist/assets/chunk-L3YUKLVL-C-DkZTMr.js +1 -0
  231. package/frontend/dist/assets/chunk-MX3YWQON-OUdzv5sZ.js +1 -0
  232. package/frontend/dist/assets/chunk-NQ4KR5QH-Bpu9FsM7.js +220 -0
  233. package/frontend/dist/assets/chunk-O4XLMI2P-BMLK6_ib.js +7 -0
  234. package/frontend/dist/assets/chunk-OZEHJAEY-CNNiJtG0.js +1 -0
  235. package/frontend/dist/assets/chunk-PQ6SQG4A-evVHD3KM.js +1 -0
  236. package/frontend/dist/assets/chunk-PU5JKC2W-DPFTYuvl.js +70 -0
  237. package/frontend/dist/assets/chunk-QZHKN3VN-JRdddPvu.js +1 -0
  238. package/frontend/dist/assets/chunk-R5LLSJPH-CHQzVVOV.js +1 -0
  239. package/frontend/dist/assets/chunk-WL4C6EOR-BNFU6IIi.js +189 -0
  240. package/frontend/dist/assets/chunk-XIRO2GV7-98T93G85.js +1 -0
  241. package/frontend/dist/assets/chunk-XZSTWKYB-BcW3cyNp.js +94 -0
  242. package/frontend/dist/assets/chunk-YBOYWFTD-BgKO1qAJ.js +1 -0
  243. package/frontend/dist/assets/classDiagram-VBA2DB6C-DikXzgcD.js +1 -0
  244. package/frontend/dist/assets/classDiagram-v2-RAHNMMFH-D7E3tQUK.js +1 -0
  245. package/frontend/dist/assets/clojure-FspFoNNQ.js +1 -0
  246. package/frontend/dist/assets/clone-mOXuZa7C.js +1 -0
  247. package/frontend/dist/assets/codicon-ngg6Pgfi.ttf +0 -0
  248. package/frontend/dist/assets/coffee-13n8Bk2W.js +1 -0
  249. package/frontend/dist/assets/cose-bilkent-S5V4N54A-zUOWQqLe.js +1 -0
  250. package/frontend/dist/assets/cpp-BVm2xGEs.js +1 -0
  251. package/frontend/dist/assets/csharp-D2kAWmUm.js +1 -0
  252. package/frontend/dist/assets/csp-Ezvgpf0e.js +1 -0
  253. package/frontend/dist/assets/css-CYxRwcFy.js +3 -0
  254. package/frontend/dist/assets/css.worker-Cd5h-ZOL.js +89 -0
  255. package/frontend/dist/assets/cssMode-CrXej49V.js +1 -0
  256. package/frontend/dist/assets/cypher-jg3SGErc.js +1 -0
  257. package/frontend/dist/assets/cytoscape.esm-kyyvzxNV.js +321 -0
  258. package/frontend/dist/assets/dagre-DH4bgZO7.js +1 -0
  259. package/frontend/dist/assets/dagre-KLK3FWXG-DNSqDkwT.js +4 -0
  260. package/frontend/dist/assets/dart-179jqhK4.js +1 -0
  261. package/frontend/dist/assets/defaultLocale-Dda4OpKy.js +1 -0
  262. package/frontend/dist/assets/diagram-E7M64L7V-RqPNT5Vs.js +24 -0
  263. package/frontend/dist/assets/diagram-IFDJBPK2-B-5NRyaE.js +43 -0
  264. package/frontend/dist/assets/diagram-P4PSJMXO-BrP69Hk0.js +24 -0
  265. package/frontend/dist/assets/dist-CU_Nb1G5.js +1 -0
  266. package/frontend/dist/assets/dockerfile-CIAtSGxS.js +1 -0
  267. package/frontend/dist/assets/ecl-CGVKfDxD.js +1 -0
  268. package/frontend/dist/assets/editor-Br_kD0ds.css +1 -0
  269. package/frontend/dist/assets/editor.api2-YXkDn0Gm.js +872 -0
  270. package/frontend/dist/assets/editor.main-fBaXZjJ0.js +6 -0
  271. package/frontend/dist/assets/elixir-BZ-6w0y3.js +1 -0
  272. package/frontend/dist/assets/erDiagram-INFDFZHY-BYiB9NYg.js +70 -0
  273. package/frontend/dist/assets/flow9-CVuOjTMv.js +1 -0
  274. package/frontend/dist/assets/flowDiagram-PKNHOUZH-Cwq47rsR.js +162 -0
  275. package/frontend/dist/assets/freemarker2-DM-pztJU.js +3 -0
  276. package/frontend/dist/assets/fsharp-q0pGJYr6.js +1 -0
  277. package/frontend/dist/assets/ganttDiagram-A5KZAMGK-Dnx3szD9.js +292 -0
  278. package/frontend/dist/assets/gitGraph-HDMCJU4V-COlTQ7bA.js +1 -0
  279. package/frontend/dist/assets/gitGraphDiagram-K3NZZRJ6-BaUxboNc.js +65 -0
  280. package/frontend/dist/assets/go-dzSPfdEO.js +1 -0
  281. package/frontend/dist/assets/graphlib-kEFlkt3U.js +1 -0
  282. package/frontend/dist/assets/graphql-CG4OUoEV.js +1 -0
  283. package/frontend/dist/assets/handlebars-BbK53Vec.js +1 -0
  284. package/frontend/dist/assets/hcl-Cy14JPk3.js +1 -0
  285. package/frontend/dist/assets/html-DYtTQNOG.js +1 -0
  286. package/frontend/dist/assets/html.worker-BjVEKLoU.js +502 -0
  287. package/frontend/dist/assets/htmlMode-C6GTouth.js +1 -0
  288. package/frontend/dist/assets/index-DMLxes_u.js +157 -0
  289. package/frontend/dist/assets/index-DmzeqkB1.css +1 -0
  290. package/frontend/dist/assets/info-3K5VOQVL-DBtHyA4C.js +1 -0
  291. package/frontend/dist/assets/infoDiagram-LFFYTUFH-yBXLgMPI.js +2 -0
  292. package/frontend/dist/assets/ini-Pbg8HGVD.js +1 -0
  293. package/frontend/dist/assets/init-D6KNwrax.js +1 -0
  294. package/frontend/dist/assets/ishikawaDiagram-PHBUUO56-Bld4two_.js +70 -0
  295. package/frontend/dist/assets/java-BmVu6Qrl.js +1 -0
  296. package/frontend/dist/assets/javascript-PbfQEdcJ.js +1 -0
  297. package/frontend/dist/assets/journeyDiagram-4ABVD52K-4HyMd4R2.js +139 -0
  298. package/frontend/dist/assets/json.worker-DqU5Wxnl.js +58 -0
  299. package/frontend/dist/assets/jsonMode-CASsGppE.js +7 -0
  300. package/frontend/dist/assets/julia-3cGnieBq.js +1 -0
  301. package/frontend/dist/assets/kanban-definition-K7BYSVSG-DpgsZmpG.js +89 -0
  302. package/frontend/dist/assets/katex-CEw3x5bf.js +261 -0
  303. package/frontend/dist/assets/kotlin-BuWkVcfV.js +1 -0
  304. package/frontend/dist/assets/less-CJ_VPy2C.js +2 -0
  305. package/frontend/dist/assets/lexon-BygAuZPu.js +1 -0
  306. package/frontend/dist/assets/line-CA_wh_TY.js +1 -0
  307. package/frontend/dist/assets/linear-BAcLW45z.js +1 -0
  308. package/frontend/dist/assets/liquid-kz84dle6.js +1 -0
  309. package/frontend/dist/assets/lspLanguageFeatures-C7hAHFn1.js +4 -0
  310. package/frontend/dist/assets/lua-C8Xs3dCx.js +1 -0
  311. package/frontend/dist/assets/m3-DTJeKBk4.js +1 -0
  312. package/frontend/dist/assets/markdown-QCgx8JqZ.js +1 -0
  313. package/frontend/dist/assets/math-D0YcMJAn.js +1 -0
  314. package/frontend/dist/assets/mdx-yRw0ap-E.js +1 -0
  315. package/frontend/dist/assets/mermaid-parser.core-DAeTodBQ.js +4 -0
  316. package/frontend/dist/assets/mindmap-definition-YRQLILUH-CoNlFyVl.js +68 -0
  317. package/frontend/dist/assets/mips-DopWaYgE.js +1 -0
  318. package/frontend/dist/assets/monaco.contribution-DeY0Qei-.js +2 -0
  319. package/frontend/dist/assets/msdax-BDis4ARV.js +1 -0
  320. package/frontend/dist/assets/mysql-BV6MLsOI.js +1 -0
  321. package/frontend/dist/assets/objective-c-B1UuzKs6.js +1 -0
  322. package/frontend/dist/assets/ordinal-jM7S0YHN.js +1 -0
  323. package/frontend/dist/assets/packet-RMMSAZCW-FF6-Tmai.js +1 -0
  324. package/frontend/dist/assets/pascal-BkvESCrc.js +1 -0
  325. package/frontend/dist/assets/pascaligo-lTy0kZYr.js +1 -0
  326. package/frontend/dist/assets/path-DNPd7Py7.js +1 -0
  327. package/frontend/dist/assets/perl-CrtUPXLV.js +1 -0
  328. package/frontend/dist/assets/pgsql-B9IbNWx2.js +1 -0
  329. package/frontend/dist/assets/php-CXvQBY2p.js +1 -0
  330. package/frontend/dist/assets/pie-UPGHQEXC-CFvXY2o-.js +1 -0
  331. package/frontend/dist/assets/pieDiagram-SKSYHLDU-CM_hbCcn.js +30 -0
  332. package/frontend/dist/assets/pla-DxBxuqWu.js +1 -0
  333. package/frontend/dist/assets/postiats-OkEuT5YF.js +1 -0
  334. package/frontend/dist/assets/powerquery-CMx5Tq4K.js +1 -0
  335. package/frontend/dist/assets/powershell-CstRxrEc.js +1 -0
  336. package/frontend/dist/assets/preload-helper-D4M6sveU.js +1 -0
  337. package/frontend/dist/assets/protobuf-Bx0Z-uRj.js +2 -0
  338. package/frontend/dist/assets/pug--W8vanWl.js +1 -0
  339. package/frontend/dist/assets/python-DA0rnlw3.js +1 -0
  340. package/frontend/dist/assets/qsharp-CRtr0YbN.js +1 -0
  341. package/frontend/dist/assets/quadrantDiagram-337W2JSQ-B3n3IUhC.js +7 -0
  342. package/frontend/dist/assets/r-C6E1d6iv.js +1 -0
  343. package/frontend/dist/assets/radar-KQ55EAFF-MPZu7SdX.js +1 -0
  344. package/frontend/dist/assets/razor-yd73uata.js +1 -0
  345. package/frontend/dist/assets/redis-Dx13voP3.js +1 -0
  346. package/frontend/dist/assets/redshift-D66HwlyV.js +1 -0
  347. package/frontend/dist/assets/requirementDiagram-Z7DCOOCP-CorP7L7F.js +73 -0
  348. package/frontend/dist/assets/restructuredtext-DQT2NKJ2.js +1 -0
  349. package/frontend/dist/assets/rough.esm-DxAX5Vpo.js +1 -0
  350. package/frontend/dist/assets/ruby-iFXI8hwH.js +1 -0
  351. package/frontend/dist/assets/rust-CSKiei34.js +1 -0
  352. package/frontend/dist/assets/sankeyDiagram-WA2Y5GQK-RDx6Bd-B.js +10 -0
  353. package/frontend/dist/assets/sb-Bo3ttdP2.js +1 -0
  354. package/frontend/dist/assets/scala-BC1D-Nxp.js +1 -0
  355. package/frontend/dist/assets/scheme-Z4OAo4Lv.js +1 -0
  356. package/frontend/dist/assets/scss-BvrdPs6B.js +3 -0
  357. package/frontend/dist/assets/sequenceDiagram-2WXFIKYE-JMqJSFq6.js +145 -0
  358. package/frontend/dist/assets/shell-Bh_aCyF-.js +1 -0
  359. package/frontend/dist/assets/solidity-CWHj6tSe.js +1 -0
  360. package/frontend/dist/assets/sophia-raoNtKtm.js +1 -0
  361. package/frontend/dist/assets/sparql-XzmoGnue.js +1 -0
  362. package/frontend/dist/assets/sql-BD0i9Gvg.js +1 -0
  363. package/frontend/dist/assets/src-Bn-kKzs7.js +1 -0
  364. package/frontend/dist/assets/st-DtVKyms6.js +1 -0
  365. package/frontend/dist/assets/stateDiagram-RAJIS63D-CgFfENdy.js +1 -0
  366. package/frontend/dist/assets/stateDiagram-v2-FVOUBMTO-C4Hh2P-U.js +1 -0
  367. package/frontend/dist/assets/swift--UZs77wT.js +1 -0
  368. package/frontend/dist/assets/systemverilog-CDnBSWUd.js +1 -0
  369. package/frontend/dist/assets/tcl-DdCEuTHZ.js +1 -0
  370. package/frontend/dist/assets/timeline-definition-YZTLITO2-BnatPBR5.js +61 -0
  371. package/frontend/dist/assets/treemap-KZPCXAKY-qb1Pl9la.js +1 -0
  372. package/frontend/dist/assets/ts.worker-DyPAEIuH.js +67719 -0
  373. package/frontend/dist/assets/tsMode-iuvyEpyO.js +11 -0
  374. package/frontend/dist/assets/twig-SSL-Altf.js +1 -0
  375. package/frontend/dist/assets/typescript-17918Hud.js +1 -0
  376. package/frontend/dist/assets/typespec-BT7S0ETg.js +1 -0
  377. package/frontend/dist/assets/vb-CrIgucua.js +1 -0
  378. package/frontend/dist/assets/vennDiagram-LZ73GAT5-DygS4Zzd.js +34 -0
  379. package/frontend/dist/assets/wgsl-BeKc3oEp.js +298 -0
  380. package/frontend/dist/assets/workers-DTfwKVoM.js +1 -0
  381. package/frontend/dist/assets/xml-CBMr_Wbw.js +1 -0
  382. package/frontend/dist/assets/xterm-BrP-ENHg.css +1 -0
  383. package/frontend/dist/assets/xterm-CBX2m0YM.js +36 -0
  384. package/frontend/dist/assets/xychartDiagram-JWTSCODW-D6wY1Jwd.js +7 -0
  385. package/frontend/dist/assets/yaml-CTjCH7Bv.js +1 -0
  386. package/frontend/dist/fonts/inter-300.ttf +0 -0
  387. package/frontend/dist/fonts/inter-400.ttf +0 -0
  388. package/frontend/dist/fonts/inter-500.ttf +0 -0
  389. package/frontend/dist/fonts/inter-600.ttf +0 -0
  390. package/frontend/dist/fonts/inter-700.ttf +0 -0
  391. package/frontend/dist/index.html +49 -0
  392. package/frontend/dist/logo_192x192.png +0 -0
  393. package/frontend/dist/logo_32x32.png +0 -0
  394. package/frontend/dist/logo_512x512.png +0 -0
  395. package/frontend/dist/logo_64x64.png +0 -0
  396. package/frontend/dist/logobg_192x192.png +0 -0
  397. package/frontend/dist/logobg_512x512.png +0 -0
  398. package/frontend/dist/logobg_64x64.png +0 -0
  399. package/frontend/dist/manifest.json +25 -0
  400. package/frontend/dist/sw.js +22 -0
  401. package/package.json +74 -7
  402. package/preload/Makefile +12 -0
  403. package/preload/atoo-studio-preload.c +647 -0
  404. package/preload/atoo-studio-preload.so +0 -0
  405. package/setup-cuse.sh +260 -0
  406. package/setup.sh +81 -0
  407. package/src/serial/native/binding.gyp +10 -0
  408. package/src/serial/native/pty_pair.c +222 -0
@@ -0,0 +1,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
+ }