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,525 @@
1
+ import { readFileSync, existsSync } from 'fs';
2
+ import { join } from 'path';
3
+ import { randomUUID } from 'crypto';
4
+ // ---------------------------------------------------------------------------
5
+ // Connection-string parser
6
+ // ---------------------------------------------------------------------------
7
+ const SCHEME_TO_DB = {
8
+ postgres: 'postgresql',
9
+ postgresql: 'postgresql',
10
+ mysql: 'mysql',
11
+ mariadb: 'mariadb',
12
+ mongodb: 'mongodb',
13
+ 'mongodb+srv': 'mongodb',
14
+ redis: 'redis',
15
+ rediss: 'redis',
16
+ cockroachdb: 'cockroachdb',
17
+ clickhouse: 'clickhouse',
18
+ };
19
+ export function parseConnectionString(url) {
20
+ try {
21
+ const match = url.match(/^([a-z+]+):\/\//i);
22
+ if (!match)
23
+ return null;
24
+ const scheme = match[1].toLowerCase();
25
+ const dbType = SCHEME_TO_DB[scheme];
26
+ if (!dbType)
27
+ return null;
28
+ // Use URL parser for everything after the scheme
29
+ // Normalise the scheme to 'http' so the built-in URL class works
30
+ const asHttp = url.replace(/^[a-z+]+:\/\//i, 'http://');
31
+ const parsed = new URL(asHttp);
32
+ const params = {
33
+ connection_string: url,
34
+ };
35
+ if (parsed.hostname)
36
+ params.host = decodeURIComponent(parsed.hostname);
37
+ if (parsed.port)
38
+ params.port = parseInt(parsed.port, 10);
39
+ if (parsed.username)
40
+ params.username = decodeURIComponent(parsed.username);
41
+ if (parsed.password)
42
+ params.password = decodeURIComponent(parsed.password);
43
+ // Remove leading slash
44
+ const db = decodeURIComponent(parsed.pathname).replace(/^\//, '');
45
+ if (db)
46
+ params.database = db;
47
+ return { db_type: dbType, params };
48
+ }
49
+ catch {
50
+ return null;
51
+ }
52
+ }
53
+ // ---------------------------------------------------------------------------
54
+ // .env file parser
55
+ // ---------------------------------------------------------------------------
56
+ /** Known env var names that carry database URLs. */
57
+ const URL_VARS = {
58
+ DATABASE_URL: null, // infer from scheme
59
+ REDIS_URL: 'redis',
60
+ MONGODB_URI: 'mongodb',
61
+ MONGO_URL: 'mongodb',
62
+ MYSQL_URL: 'mysql',
63
+ PG_CONNECTION_STRING: 'postgresql',
64
+ POSTGRES_URL: 'postgresql',
65
+ };
66
+ /** Discrete credential env vars (host/port/user/pass/name). */
67
+ const DISCRETE_VARS = [
68
+ 'DB_HOST',
69
+ 'DB_PORT',
70
+ 'DB_USER',
71
+ 'DB_PASSWORD',
72
+ 'DB_NAME',
73
+ ];
74
+ const ENV_FILES = ['.env', '.env.local', '.env.development', '.env.production'];
75
+ function parseEnvFile(filePath) {
76
+ const vars = {};
77
+ const content = readFileSync(filePath, 'utf-8');
78
+ for (const line of content.split('\n')) {
79
+ const trimmed = line.trim();
80
+ if (!trimmed || trimmed.startsWith('#'))
81
+ continue;
82
+ const eqIdx = trimmed.indexOf('=');
83
+ if (eqIdx < 1)
84
+ continue;
85
+ const key = trimmed.slice(0, eqIdx).trim();
86
+ let value = trimmed.slice(eqIdx + 1).trim();
87
+ // Strip surrounding quotes
88
+ if ((value.startsWith('"') && value.endsWith('"')) ||
89
+ (value.startsWith("'") && value.endsWith("'"))) {
90
+ value = value.slice(1, -1);
91
+ }
92
+ vars[key] = value;
93
+ }
94
+ return vars;
95
+ }
96
+ function makeId() {
97
+ return randomUUID();
98
+ }
99
+ function discoverFromSingleEnv(projectDir, envFileName) {
100
+ const filePath = join(projectDir, envFileName);
101
+ if (!existsSync(filePath))
102
+ return [];
103
+ const results = [];
104
+ const vars = parseEnvFile(filePath);
105
+ // --- URL-style vars ---
106
+ for (const [varName, hintType] of Object.entries(URL_VARS)) {
107
+ const value = vars[varName];
108
+ if (!value)
109
+ continue;
110
+ const parsed = parseConnectionString(value);
111
+ if (parsed) {
112
+ const dbType = hintType ?? parsed.db_type;
113
+ results.push({
114
+ id: makeId(),
115
+ name: `${dbType}${parsed.params.database ? ':' + parsed.params.database : ''} (${envFileName})`,
116
+ db_type: dbType,
117
+ source: 'manual',
118
+ source_detail: `${envFileName} -> ${varName}`,
119
+ params: parsed.params,
120
+ });
121
+ }
122
+ }
123
+ // --- Discrete vars (DB_HOST etc.) ---
124
+ const dbHost = vars['DB_HOST'];
125
+ if (dbHost) {
126
+ const params = {
127
+ host: dbHost,
128
+ };
129
+ if (vars['DB_PORT'])
130
+ params.port = parseInt(vars['DB_PORT'], 10);
131
+ if (vars['DB_USER'])
132
+ params.username = vars['DB_USER'];
133
+ if (vars['DB_PASSWORD'])
134
+ params.password = vars['DB_PASSWORD'];
135
+ if (vars['DB_NAME'])
136
+ params.database = vars['DB_NAME'];
137
+ // Try to guess the type from the port or default to postgresql
138
+ let dbType = 'postgresql';
139
+ if (params.port === 3306)
140
+ dbType = 'mysql';
141
+ else if (params.port === 27017)
142
+ dbType = 'mongodb';
143
+ else if (params.port === 6379)
144
+ dbType = 'redis';
145
+ results.push({
146
+ id: makeId(),
147
+ name: `${dbType}${params.database ? ':' + params.database : ''}@${dbHost} (${envFileName})`,
148
+ db_type: dbType,
149
+ source: 'manual',
150
+ source_detail: `${envFileName} -> DB_HOST/DB_PORT/...`,
151
+ params,
152
+ });
153
+ }
154
+ return results;
155
+ }
156
+ // ---------------------------------------------------------------------------
157
+ // Framework config parsers
158
+ // ---------------------------------------------------------------------------
159
+ function readFileIfExists(path) {
160
+ if (!existsSync(path))
161
+ return null;
162
+ try {
163
+ return readFileSync(path, 'utf-8');
164
+ }
165
+ catch {
166
+ return null;
167
+ }
168
+ }
169
+ /**
170
+ * Extract URLs from a text blob using a broad regex.
171
+ * Returns all database-like connection strings found.
172
+ */
173
+ function extractUrls(text) {
174
+ const urlPattern = /(?:postgres(?:ql)?|mysql|mariadb|mongodb(?:\+srv)?|redis(?:s)?|cockroachdb|clickhouse):\/\/[^\s"'`,;)}\]]+/gi;
175
+ return [...text.matchAll(urlPattern)].map((m) => m[0]);
176
+ }
177
+ function discoverPrisma(projectDir) {
178
+ const schemaPath = join(projectDir, 'prisma', 'schema.prisma');
179
+ const content = readFileIfExists(schemaPath);
180
+ if (!content)
181
+ return [];
182
+ const results = [];
183
+ // Look for datasource block
184
+ const datasourceMatch = content.match(/datasource\s+\w+\s*\{([\s\S]*?)\}/);
185
+ if (!datasourceMatch)
186
+ return [];
187
+ const block = datasourceMatch[1];
188
+ // Check for env("SOME_VAR") reference
189
+ const envRef = block.match(/url\s*=\s*env\(\s*"([^"]+)"\s*\)/);
190
+ if (envRef) {
191
+ // The actual URL will be found from .env files; just note the reference.
192
+ // But we still report it so the caller knows Prisma is configured.
193
+ // We don't duplicate if the .env parser already found it.
194
+ }
195
+ // Check for direct URL in url = "..."
196
+ const directUrl = block.match(/url\s*=\s*"([^"]+)"/);
197
+ if (directUrl) {
198
+ const parsed = parseConnectionString(directUrl[1]);
199
+ if (parsed) {
200
+ results.push({
201
+ id: makeId(),
202
+ name: `${parsed.db_type}${parsed.params.database ? ':' + parsed.params.database : ''} (prisma/schema.prisma)`,
203
+ db_type: parsed.db_type,
204
+ source: 'manual',
205
+ source_detail: 'prisma/schema.prisma -> datasource url',
206
+ params: parsed.params,
207
+ });
208
+ }
209
+ }
210
+ return results;
211
+ }
212
+ function discoverRailsDatabase(projectDir) {
213
+ const ymlPath = join(projectDir, 'config', 'database.yml');
214
+ const content = readFileIfExists(ymlPath);
215
+ if (!content)
216
+ return [];
217
+ const results = [];
218
+ // Extract URLs from the YAML content
219
+ const urls = extractUrls(content);
220
+ for (const url of urls) {
221
+ const parsed = parseConnectionString(url);
222
+ if (parsed) {
223
+ results.push({
224
+ id: makeId(),
225
+ name: `${parsed.db_type}${parsed.params.database ? ':' + parsed.params.database : ''} (config/database.yml)`,
226
+ db_type: parsed.db_type,
227
+ source: 'manual',
228
+ source_detail: 'config/database.yml',
229
+ params: parsed.params,
230
+ });
231
+ }
232
+ }
233
+ // Look for adapter/host/port/database/username/password via simple regex
234
+ // Match development/production/test sections
235
+ const sections = content.split(/\n(?=\w+:)/);
236
+ for (const section of sections) {
237
+ const sectionName = section.match(/^(\w+):/)?.[1];
238
+ if (!sectionName)
239
+ continue;
240
+ const adapter = section.match(/adapter:\s*(\S+)/)?.[1];
241
+ const host = section.match(/host:\s*(\S+)/)?.[1];
242
+ const database = section.match(/database:\s*(\S+)/)?.[1];
243
+ if (!adapter && !host)
244
+ continue;
245
+ let dbType = 'postgresql';
246
+ if (adapter === 'mysql2' || adapter === 'mysql')
247
+ dbType = 'mysql';
248
+ else if (adapter === 'sqlite3')
249
+ dbType = 'sqlite';
250
+ else if (adapter === 'postgresql' || adapter === 'postgres')
251
+ dbType = 'postgresql';
252
+ else
253
+ continue; // unknown adapter
254
+ if (dbType === 'sqlite' && database) {
255
+ results.push({
256
+ id: makeId(),
257
+ name: `sqlite:${database} (config/database.yml:${sectionName})`,
258
+ db_type: 'sqlite',
259
+ source: 'manual',
260
+ source_detail: `config/database.yml -> ${sectionName}`,
261
+ params: { filename: database },
262
+ });
263
+ continue;
264
+ }
265
+ if (!host)
266
+ continue;
267
+ const params = { host };
268
+ const port = section.match(/port:\s*(\d+)/)?.[1];
269
+ const username = section.match(/username:\s*(\S+)/)?.[1];
270
+ const password = section.match(/password:\s*(\S+)/)?.[1];
271
+ if (port)
272
+ params.port = parseInt(port, 10);
273
+ if (username)
274
+ params.username = username;
275
+ if (password)
276
+ params.password = password;
277
+ if (database)
278
+ params.database = database;
279
+ results.push({
280
+ id: makeId(),
281
+ name: `${dbType}${database ? ':' + database : ''}@${host} (config/database.yml:${sectionName})`,
282
+ db_type: dbType,
283
+ source: 'manual',
284
+ source_detail: `config/database.yml -> ${sectionName}`,
285
+ params,
286
+ });
287
+ }
288
+ return results;
289
+ }
290
+ function discoverKnex(projectDir) {
291
+ const results = [];
292
+ for (const filename of ['knexfile.js', 'knexfile.ts']) {
293
+ const filePath = join(projectDir, filename);
294
+ const content = readFileIfExists(filePath);
295
+ if (!content)
296
+ continue;
297
+ const urls = extractUrls(content);
298
+ for (const url of urls) {
299
+ const parsed = parseConnectionString(url);
300
+ if (parsed) {
301
+ results.push({
302
+ id: makeId(),
303
+ name: `${parsed.db_type}${parsed.params.database ? ':' + parsed.params.database : ''} (${filename})`,
304
+ db_type: parsed.db_type,
305
+ source: 'manual',
306
+ source_detail: filename,
307
+ params: parsed.params,
308
+ });
309
+ }
310
+ }
311
+ }
312
+ return results;
313
+ }
314
+ function discoverDjango(projectDir) {
315
+ const settingsPath = join(projectDir, 'settings.py');
316
+ const content = readFileIfExists(settingsPath);
317
+ if (!content)
318
+ return [];
319
+ const results = [];
320
+ // Extract any connection URLs
321
+ const urls = extractUrls(content);
322
+ for (const url of urls) {
323
+ const parsed = parseConnectionString(url);
324
+ if (parsed) {
325
+ results.push({
326
+ id: makeId(),
327
+ name: `${parsed.db_type}${parsed.params.database ? ':' + parsed.params.database : ''} (settings.py)`,
328
+ db_type: parsed.db_type,
329
+ source: 'manual',
330
+ source_detail: 'settings.py -> DATABASES',
331
+ params: parsed.params,
332
+ });
333
+ }
334
+ }
335
+ // Try to extract ENGINE/HOST/PORT/NAME/USER/PASSWORD from DATABASES config
336
+ const engineMatch = content.match(/'ENGINE'\s*:\s*'([^']+)'/);
337
+ const hostMatch = content.match(/'HOST'\s*:\s*'([^']+)'/);
338
+ const nameMatch = content.match(/'NAME'\s*:\s*'([^']+)'/);
339
+ if (engineMatch) {
340
+ const engine = engineMatch[1];
341
+ let dbType = null;
342
+ if (engine.includes('postgresql') || engine.includes('psycopg'))
343
+ dbType = 'postgresql';
344
+ else if (engine.includes('mysql'))
345
+ dbType = 'mysql';
346
+ else if (engine.includes('sqlite'))
347
+ dbType = 'sqlite';
348
+ if (dbType === 'sqlite' && nameMatch) {
349
+ results.push({
350
+ id: makeId(),
351
+ name: `sqlite:${nameMatch[1]} (settings.py)`,
352
+ db_type: 'sqlite',
353
+ source: 'manual',
354
+ source_detail: 'settings.py -> DATABASES',
355
+ params: { filename: nameMatch[1] },
356
+ });
357
+ }
358
+ else if (dbType && hostMatch) {
359
+ const params = { host: hostMatch[1] };
360
+ const portMatch = content.match(/'PORT'\s*:\s*'?(\d+)'?/);
361
+ const userMatch = content.match(/'USER'\s*:\s*'([^']+)'/);
362
+ const passMatch = content.match(/'PASSWORD'\s*:\s*'([^']+)'/);
363
+ if (portMatch)
364
+ params.port = parseInt(portMatch[1], 10);
365
+ if (userMatch)
366
+ params.username = userMatch[1];
367
+ if (passMatch)
368
+ params.password = passMatch[1];
369
+ if (nameMatch)
370
+ params.database = nameMatch[1];
371
+ results.push({
372
+ id: makeId(),
373
+ name: `${dbType}${nameMatch ? ':' + nameMatch[1] : ''}@${hostMatch[1]} (settings.py)`,
374
+ db_type: dbType,
375
+ source: 'manual',
376
+ source_detail: 'settings.py -> DATABASES',
377
+ params,
378
+ });
379
+ }
380
+ }
381
+ return results;
382
+ }
383
+ function discoverLaravel(projectDir) {
384
+ const phpPath = join(projectDir, 'database.php');
385
+ const configPhpPath = join(projectDir, 'config', 'database.php');
386
+ const content = readFileIfExists(phpPath) ?? readFileIfExists(configPhpPath);
387
+ if (!content)
388
+ return [];
389
+ const results = [];
390
+ const sourceName = existsSync(phpPath) ? 'database.php' : 'config/database.php';
391
+ // Extract URLs
392
+ const urls = extractUrls(content);
393
+ for (const url of urls) {
394
+ const parsed = parseConnectionString(url);
395
+ if (parsed) {
396
+ results.push({
397
+ id: makeId(),
398
+ name: `${parsed.db_type}${parsed.params.database ? ':' + parsed.params.database : ''} (${sourceName})`,
399
+ db_type: parsed.db_type,
400
+ source: 'manual',
401
+ source_detail: sourceName,
402
+ params: parsed.params,
403
+ });
404
+ }
405
+ }
406
+ return results;
407
+ }
408
+ function discoverSequelize(projectDir) {
409
+ const results = [];
410
+ const candidates = [
411
+ join(projectDir, '.sequelizerc'),
412
+ join(projectDir, 'config', 'config.json'),
413
+ ];
414
+ for (const filePath of candidates) {
415
+ const content = readFileIfExists(filePath);
416
+ if (!content)
417
+ continue;
418
+ const sourceName = filePath.startsWith(join(projectDir, 'config'))
419
+ ? 'config/config.json'
420
+ : '.sequelizerc';
421
+ // Extract URLs
422
+ const urls = extractUrls(content);
423
+ for (const url of urls) {
424
+ const parsed = parseConnectionString(url);
425
+ if (parsed) {
426
+ results.push({
427
+ id: makeId(),
428
+ name: `${parsed.db_type}${parsed.params.database ? ':' + parsed.params.database : ''} (${sourceName})`,
429
+ db_type: parsed.db_type,
430
+ source: 'manual',
431
+ source_detail: sourceName,
432
+ params: parsed.params,
433
+ });
434
+ }
435
+ }
436
+ // For config.json, try to extract host/port/database/username/password/dialect
437
+ if (sourceName === 'config/config.json') {
438
+ try {
439
+ const json = JSON.parse(content);
440
+ for (const env of ['development', 'test', 'production']) {
441
+ const cfg = json[env];
442
+ if (!cfg || typeof cfg !== 'object')
443
+ continue;
444
+ let dbType = null;
445
+ if (cfg.dialect === 'postgres' || cfg.dialect === 'postgresql')
446
+ dbType = 'postgresql';
447
+ else if (cfg.dialect === 'mysql')
448
+ dbType = 'mysql';
449
+ else if (cfg.dialect === 'mariadb')
450
+ dbType = 'mariadb';
451
+ else if (cfg.dialect === 'sqlite')
452
+ dbType = 'sqlite';
453
+ else
454
+ continue;
455
+ if (dbType === 'sqlite' && cfg.storage) {
456
+ results.push({
457
+ id: makeId(),
458
+ name: `sqlite:${cfg.storage} (config/config.json:${env})`,
459
+ db_type: 'sqlite',
460
+ source: 'manual',
461
+ source_detail: `config/config.json -> ${env}`,
462
+ params: { filename: cfg.storage },
463
+ });
464
+ continue;
465
+ }
466
+ if (!cfg.host)
467
+ continue;
468
+ const params = { host: cfg.host };
469
+ if (cfg.port)
470
+ params.port = parseInt(String(cfg.port), 10);
471
+ if (cfg.username)
472
+ params.username = cfg.username;
473
+ if (cfg.password)
474
+ params.password = cfg.password;
475
+ if (cfg.database)
476
+ params.database = cfg.database;
477
+ results.push({
478
+ id: makeId(),
479
+ name: `${dbType}${cfg.database ? ':' + cfg.database : ''}@${cfg.host} (config/config.json:${env})`,
480
+ db_type: dbType,
481
+ source: 'manual',
482
+ source_detail: `config/config.json -> ${env}`,
483
+ params,
484
+ });
485
+ }
486
+ }
487
+ catch {
488
+ // Not valid JSON; URL extraction above is the fallback
489
+ }
490
+ }
491
+ }
492
+ return results;
493
+ }
494
+ // ---------------------------------------------------------------------------
495
+ // Main entry point
496
+ // ---------------------------------------------------------------------------
497
+ /**
498
+ * Parse .env files and framework config files to discover database credentials.
499
+ */
500
+ export function discoverFromEnvFiles(projectDir) {
501
+ if (!projectDir || !existsSync(projectDir))
502
+ return [];
503
+ const results = [];
504
+ // 1. .env files
505
+ for (const envFile of ENV_FILES) {
506
+ results.push(...discoverFromSingleEnv(projectDir, envFile));
507
+ }
508
+ // 2. Framework config files
509
+ results.push(...discoverPrisma(projectDir));
510
+ results.push(...discoverRailsDatabase(projectDir));
511
+ results.push(...discoverKnex(projectDir));
512
+ results.push(...discoverDjango(projectDir));
513
+ results.push(...discoverLaravel(projectDir));
514
+ results.push(...discoverSequelize(projectDir));
515
+ // Deduplicate by connection string when available
516
+ const seen = new Set();
517
+ return results.filter((r) => {
518
+ const key = r.params.connection_string
519
+ ?? `${r.db_type}://${r.params.host ?? ''}:${r.params.port ?? ''}/${r.params.database ?? r.params.filename ?? ''}`;
520
+ if (seen.has(key))
521
+ return false;
522
+ seen.add(key);
523
+ return true;
524
+ });
525
+ }
@@ -0,0 +1,6 @@
1
+ import type { DiscoveredDatabase } from '../types.js';
2
+ /**
3
+ * Scan a project directory for local database files.
4
+ * Uses git ls-files + find to respect .gitignore.
5
+ */
6
+ export declare function discoverLocalFiles(projectDir: string): DiscoveredDatabase[];
@@ -0,0 +1,58 @@
1
+ import { existsSync } from 'fs';
2
+ import { join, basename, relative } from 'path';
3
+ import { execFileSync } from 'child_process';
4
+ const DB_EXTENSIONS = {
5
+ '.sqlite': 'sqlite',
6
+ '.sqlite3': 'sqlite',
7
+ '.db': 'sqlite',
8
+ };
9
+ /**
10
+ * Scan a project directory for local database files.
11
+ * Uses git ls-files + find to respect .gitignore.
12
+ */
13
+ export function discoverLocalFiles(projectDir) {
14
+ if (!projectDir || !existsSync(projectDir))
15
+ return [];
16
+ const extensions = Object.keys(DB_EXTENSIONS);
17
+ const pattern = extensions.map(e => `*${e}`).join(' -o -name ');
18
+ let files = [];
19
+ try {
20
+ // Try git ls-files first (respects .gitignore)
21
+ const gitOut = execFileSync('git', ['ls-files', '--cached', '--others', '--exclude-standard'], {
22
+ cwd: projectDir,
23
+ timeout: 5000,
24
+ stdio: ['pipe', 'pipe', 'pipe'],
25
+ }).toString().trim();
26
+ if (gitOut) {
27
+ files = gitOut.split('\n').filter(f => extensions.some(ext => f.toLowerCase().endsWith(ext)));
28
+ }
29
+ }
30
+ catch {
31
+ // Fallback: simple find, limited depth
32
+ try {
33
+ const findOut = execFileSync('find', [
34
+ projectDir, '-maxdepth', '4', '-type', 'f',
35
+ '(', ...extensions.flatMap((ext, i) => i === 0 ? ['-name', `*${ext}`] : ['-o', '-name', `*${ext}`]), ')',
36
+ '-not', '-path', '*/node_modules/*',
37
+ '-not', '-path', '*/.git/*',
38
+ ], { timeout: 5000, stdio: ['pipe', 'pipe', 'pipe'] }).toString().trim();
39
+ if (findOut) {
40
+ files = findOut.split('\n').map(f => relative(projectDir, f));
41
+ }
42
+ }
43
+ catch { }
44
+ }
45
+ return files.map(file => {
46
+ const ext = '.' + file.split('.').pop().toLowerCase();
47
+ const dbType = DB_EXTENSIONS[ext] || 'sqlite';
48
+ const absPath = join(projectDir, file);
49
+ return {
50
+ id: `local:${file}`,
51
+ name: basename(file),
52
+ db_type: dbType,
53
+ source: 'local',
54
+ params: { filename: absPath },
55
+ source_detail: file,
56
+ };
57
+ });
58
+ }
@@ -0,0 +1,7 @@
1
+ import type { DiscoveredDatabase } from '../types.js';
2
+ /**
3
+ * Probe common database ports on localhost.
4
+ * Returns discovered databases for any open port.
5
+ * Excludes ports already found by other discovery methods.
6
+ */
7
+ export declare function scanLocalPorts(excludePorts?: Set<number>): Promise<DiscoveredDatabase[]>;
@@ -0,0 +1,61 @@
1
+ import { createConnection } from 'net';
2
+ const DEFAULT_PORTS = [
3
+ [5432, 'postgresql', 'PostgreSQL'],
4
+ [3306, 'mysql', 'MySQL'],
5
+ [6379, 'redis', 'Redis'],
6
+ [27017, 'mongodb', 'MongoDB'],
7
+ [9200, 'elasticsearch', 'Elasticsearch'],
8
+ [8123, 'clickhouse', 'ClickHouse (HTTP)'],
9
+ [7687, 'neo4j', 'Neo4j'],
10
+ [8086, 'influxdb', 'InfluxDB'],
11
+ [9042, 'cassandra', 'Cassandra'],
12
+ [26257, 'cockroachdb', 'CockroachDB'],
13
+ [11211, 'memcached', 'Memcached'],
14
+ ];
15
+ function probePort(host, port, timeoutMs = 500) {
16
+ return new Promise(resolve => {
17
+ const socket = createConnection({ host, port });
18
+ const timer = setTimeout(() => {
19
+ socket.destroy();
20
+ resolve(false);
21
+ }, timeoutMs);
22
+ socket.on('connect', () => {
23
+ clearTimeout(timer);
24
+ socket.destroy();
25
+ resolve(true);
26
+ });
27
+ socket.on('error', () => {
28
+ clearTimeout(timer);
29
+ resolve(false);
30
+ });
31
+ });
32
+ }
33
+ /**
34
+ * Probe common database ports on localhost.
35
+ * Returns discovered databases for any open port.
36
+ * Excludes ports already found by other discovery methods.
37
+ */
38
+ export async function scanLocalPorts(excludePorts = new Set()) {
39
+ const results = [];
40
+ // Probe all ports in parallel
41
+ const probes = DEFAULT_PORTS
42
+ .filter(([port]) => !excludePorts.has(port))
43
+ .map(async ([port, dbType, label]) => {
44
+ const open = await probePort('127.0.0.1', port);
45
+ if (open) {
46
+ results.push({
47
+ id: `port:${port}`,
48
+ name: `${label} (localhost:${port})`,
49
+ db_type: dbType,
50
+ source: 'manual',
51
+ params: {
52
+ host: 'localhost',
53
+ port,
54
+ },
55
+ source_detail: `Port scan: localhost:${port}`,
56
+ });
57
+ }
58
+ });
59
+ await Promise.all(probes);
60
+ return results;
61
+ }
@@ -0,0 +1,12 @@
1
+ import type { ConnectionParams, DatabaseDriver, QueryResult, TableInfo, SchemaInfo } from '../types.js';
2
+ export declare class CassandraDriver implements DatabaseDriver {
3
+ private client;
4
+ private keyspace;
5
+ connect(params: ConnectionParams): Promise<void>;
6
+ disconnect(): Promise<void>;
7
+ isConnected(): boolean;
8
+ query(cql: string, limit?: number): Promise<QueryResult>;
9
+ getTables(): Promise<TableInfo[]>;
10
+ describeTable(table: string): Promise<SchemaInfo>;
11
+ getDatabases(): Promise<string[]>;
12
+ }