spindb 0.37.2 → 0.38.0

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 (811) hide show
  1. package/dist/cli/bin.js +9 -0
  2. package/dist/cli/bin.js.map +1 -0
  3. package/dist/cli/commands/attach.js +102 -0
  4. package/dist/cli/commands/attach.js.map +1 -0
  5. package/dist/cli/commands/backup.js +197 -0
  6. package/dist/cli/commands/backup.js.map +1 -0
  7. package/dist/cli/commands/backups.js +190 -0
  8. package/dist/cli/commands/backups.js.map +1 -0
  9. package/dist/cli/commands/clone.js +119 -0
  10. package/dist/cli/commands/clone.js.map +1 -0
  11. package/dist/cli/commands/config.js +276 -0
  12. package/dist/cli/commands/config.js.map +1 -0
  13. package/dist/cli/commands/connect.js +559 -0
  14. package/dist/cli/commands/connect.js.map +1 -0
  15. package/dist/cli/commands/create.js +952 -0
  16. package/dist/cli/commands/create.js.map +1 -0
  17. package/dist/cli/commands/databases.js +485 -0
  18. package/dist/cli/commands/databases.js.map +1 -0
  19. package/dist/cli/commands/delete.js +106 -0
  20. package/dist/cli/commands/delete.js.map +1 -0
  21. package/dist/cli/commands/deps.js +238 -0
  22. package/dist/cli/commands/deps.js.map +1 -0
  23. package/dist/cli/commands/detach.js +81 -0
  24. package/dist/cli/commands/detach.js.map +1 -0
  25. package/dist/cli/commands/doctor.js +567 -0
  26. package/dist/cli/commands/doctor.js.map +1 -0
  27. package/dist/cli/commands/duckdb.js +207 -0
  28. package/dist/cli/commands/duckdb.js.map +1 -0
  29. package/dist/cli/commands/edit.js +524 -0
  30. package/dist/cli/commands/edit.js.map +1 -0
  31. package/dist/cli/commands/engines.js +1414 -0
  32. package/dist/cli/commands/engines.js.map +1 -0
  33. package/dist/cli/commands/export.js +383 -0
  34. package/dist/cli/commands/export.js.map +1 -0
  35. package/dist/cli/commands/info.js +270 -0
  36. package/dist/cli/commands/info.js.map +1 -0
  37. package/dist/cli/commands/list.js +215 -0
  38. package/dist/cli/commands/list.js.map +1 -0
  39. package/dist/cli/commands/logs.js +81 -0
  40. package/dist/cli/commands/logs.js.map +1 -0
  41. package/dist/cli/commands/menu/backup-handlers.js +1202 -0
  42. package/dist/cli/commands/menu/backup-handlers.js.map +1 -0
  43. package/dist/cli/commands/menu/container-handlers.js +1788 -0
  44. package/dist/cli/commands/menu/container-handlers.js.map +1 -0
  45. package/dist/cli/commands/menu/engine-handlers.js +235 -0
  46. package/dist/cli/commands/menu/engine-handlers.js.map +1 -0
  47. package/dist/cli/commands/menu/index.js +266 -0
  48. package/dist/cli/commands/menu/index.js.map +1 -0
  49. package/dist/cli/commands/menu/settings-handlers.js +320 -0
  50. package/dist/cli/commands/menu/settings-handlers.js.map +1 -0
  51. package/dist/cli/commands/menu/shared.js +13 -0
  52. package/dist/cli/commands/menu/shared.js.map +1 -0
  53. package/dist/cli/commands/menu/shell-handlers.js +1573 -0
  54. package/dist/cli/commands/menu/shell-handlers.js.map +1 -0
  55. package/dist/cli/commands/menu/sql-handlers.js +185 -0
  56. package/dist/cli/commands/menu/sql-handlers.js.map +1 -0
  57. package/dist/cli/commands/menu/update-handlers.js +322 -0
  58. package/dist/cli/commands/menu/update-handlers.js.map +1 -0
  59. package/dist/cli/commands/menu/validators.js +9 -0
  60. package/dist/cli/commands/menu/validators.js.map +1 -0
  61. package/dist/cli/commands/ports.js +166 -0
  62. package/dist/cli/commands/ports.js.map +1 -0
  63. package/dist/cli/commands/pull.js +166 -0
  64. package/dist/cli/commands/pull.js.map +1 -0
  65. package/dist/cli/commands/query.js +180 -0
  66. package/dist/cli/commands/query.js.map +1 -0
  67. package/dist/cli/commands/restore.js +428 -0
  68. package/dist/cli/commands/restore.js.map +1 -0
  69. package/dist/cli/commands/run.js +115 -0
  70. package/dist/cli/commands/run.js.map +1 -0
  71. package/dist/cli/commands/self-update.js +99 -0
  72. package/dist/cli/commands/self-update.js.map +1 -0
  73. package/dist/cli/commands/sqlite.js +207 -0
  74. package/dist/cli/commands/sqlite.js.map +1 -0
  75. package/dist/cli/commands/start.js +196 -0
  76. package/dist/cli/commands/start.js.map +1 -0
  77. package/dist/cli/commands/stop.js +182 -0
  78. package/dist/cli/commands/stop.js.map +1 -0
  79. package/dist/cli/commands/url.js +88 -0
  80. package/dist/cli/commands/url.js.map +1 -0
  81. package/dist/cli/commands/users.js +189 -0
  82. package/dist/cli/commands/users.js.map +1 -0
  83. package/dist/cli/commands/version.js +52 -0
  84. package/dist/cli/commands/version.js.map +1 -0
  85. package/dist/cli/commands/which.js +258 -0
  86. package/dist/cli/commands/which.js.map +1 -0
  87. package/dist/cli/constants.js +212 -0
  88. package/dist/cli/constants.js.map +1 -0
  89. package/dist/cli/helpers.js +1120 -0
  90. package/dist/cli/helpers.js.map +1 -0
  91. package/dist/cli/index.js +146 -0
  92. package/dist/cli/index.js.map +1 -0
  93. package/dist/cli/ui/prompts.js +1002 -0
  94. package/dist/cli/ui/prompts.js.map +1 -0
  95. package/dist/cli/ui/spinner.js +74 -0
  96. package/dist/cli/ui/spinner.js.map +1 -0
  97. package/dist/cli/ui/theme.js +99 -0
  98. package/dist/cli/ui/theme.js.map +1 -0
  99. package/dist/cli/utils/file-follower.js +79 -0
  100. package/dist/cli/utils/file-follower.js.map +1 -0
  101. package/dist/config/backup-formats.js +363 -0
  102. package/dist/config/backup-formats.js.map +1 -0
  103. package/dist/config/defaults.js +25 -0
  104. package/dist/config/defaults.js.map +1 -0
  105. package/dist/config/engine-defaults.js +303 -0
  106. package/dist/config/engine-defaults.js.map +1 -0
  107. package/dist/config/engines-registry.js +103 -0
  108. package/dist/config/engines-registry.js.map +1 -0
  109. package/dist/config/os-dependencies.js +767 -0
  110. package/dist/config/os-dependencies.js.map +1 -0
  111. package/dist/config/paths.js +156 -0
  112. package/dist/config/paths.js.map +1 -0
  113. package/dist/config/version.js +3 -0
  114. package/dist/config/version.js.map +1 -0
  115. package/dist/core/backup-restore.js +219 -0
  116. package/dist/core/backup-restore.js.map +1 -0
  117. package/dist/core/base-binary-manager.js +403 -0
  118. package/dist/core/base-binary-manager.js.map +1 -0
  119. package/dist/core/base-document-binary-manager.js +364 -0
  120. package/dist/core/base-document-binary-manager.js.map +1 -0
  121. package/dist/core/base-embedded-binary-manager.js +364 -0
  122. package/dist/core/base-embedded-binary-manager.js.map +1 -0
  123. package/dist/core/base-server-binary-manager.js +368 -0
  124. package/dist/core/base-server-binary-manager.js.map +1 -0
  125. package/dist/core/config-manager.js +495 -0
  126. package/dist/core/config-manager.js.map +1 -0
  127. package/dist/core/container-manager.js +609 -0
  128. package/dist/core/container-manager.js.map +1 -0
  129. package/dist/core/credential-generator.js +67 -0
  130. package/dist/core/credential-generator.js.map +1 -0
  131. package/dist/core/credential-manager.js +211 -0
  132. package/dist/core/credential-manager.js.map +1 -0
  133. package/dist/core/dblab-utils.js +105 -0
  134. package/dist/core/dblab-utils.js.map +1 -0
  135. package/dist/core/dependency-manager.js +359 -0
  136. package/dist/core/dependency-manager.js.map +1 -0
  137. package/dist/core/docker-exporter.js +1077 -0
  138. package/dist/core/docker-exporter.js.map +1 -0
  139. package/dist/core/error-handler.js +295 -0
  140. package/dist/core/error-handler.js.map +1 -0
  141. package/dist/core/fs-error-utils.js +74 -0
  142. package/dist/core/fs-error-utils.js.map +1 -0
  143. package/dist/core/homebrew-version-manager.js +280 -0
  144. package/dist/core/homebrew-version-manager.js.map +1 -0
  145. package/dist/core/hostdb-client.js +252 -0
  146. package/dist/core/hostdb-client.js.map +1 -0
  147. package/dist/core/hostdb-metadata.js +243 -0
  148. package/dist/core/hostdb-metadata.js.map +1 -0
  149. package/dist/core/hostdb-releases-factory.js +161 -0
  150. package/dist/core/hostdb-releases-factory.js.map +1 -0
  151. package/dist/core/library-env.js +88 -0
  152. package/dist/core/library-env.js.map +1 -0
  153. package/dist/core/pgweb-utils.js +53 -0
  154. package/dist/core/pgweb-utils.js.map +1 -0
  155. package/dist/core/platform-service.js +632 -0
  156. package/dist/core/platform-service.js.map +1 -0
  157. package/dist/core/port-manager.js +136 -0
  158. package/dist/core/port-manager.js.map +1 -0
  159. package/dist/core/process-manager.js +445 -0
  160. package/dist/core/process-manager.js.map +1 -0
  161. package/dist/core/pull-manager.js +418 -0
  162. package/dist/core/pull-manager.js.map +1 -0
  163. package/dist/core/query-parser.js +449 -0
  164. package/dist/core/query-parser.js.map +1 -0
  165. package/dist/core/spawn-utils.js +90 -0
  166. package/dist/core/spawn-utils.js.map +1 -0
  167. package/dist/core/start-with-retry.js +90 -0
  168. package/dist/core/start-with-retry.js.map +1 -0
  169. package/dist/core/test-cleanup.js +85 -0
  170. package/dist/core/test-cleanup.js.map +1 -0
  171. package/dist/core/tls-generator.js +84 -0
  172. package/dist/core/tls-generator.js.map +1 -0
  173. package/dist/core/transaction-manager.js +139 -0
  174. package/dist/core/transaction-manager.js.map +1 -0
  175. package/dist/core/update-manager.js +241 -0
  176. package/dist/core/update-manager.js.map +1 -0
  177. package/dist/core/version-migration.js +260 -0
  178. package/dist/core/version-migration.js.map +1 -0
  179. package/dist/core/version-utils.js +91 -0
  180. package/dist/core/version-utils.js.map +1 -0
  181. package/dist/engines/base-engine.js +179 -0
  182. package/dist/engines/base-engine.js.map +1 -0
  183. package/dist/engines/clickhouse/backup.js +289 -0
  184. package/dist/engines/clickhouse/backup.js.map +1 -0
  185. package/dist/engines/clickhouse/binary-manager.js +145 -0
  186. package/dist/engines/clickhouse/binary-manager.js.map +1 -0
  187. package/dist/engines/clickhouse/binary-urls.js +100 -0
  188. package/dist/engines/clickhouse/binary-urls.js.map +1 -0
  189. package/dist/engines/clickhouse/cli-utils.js +143 -0
  190. package/dist/engines/clickhouse/cli-utils.js.map +1 -0
  191. package/dist/engines/clickhouse/hostdb-releases.js +24 -0
  192. package/dist/engines/clickhouse/hostdb-releases.js.map +1 -0
  193. package/dist/engines/clickhouse/index.js +1077 -0
  194. package/dist/engines/clickhouse/index.js.map +1 -0
  195. package/dist/engines/clickhouse/restore.js +335 -0
  196. package/dist/engines/clickhouse/restore.js.map +1 -0
  197. package/dist/engines/clickhouse/version-maps.js +83 -0
  198. package/dist/engines/clickhouse/version-maps.js.map +1 -0
  199. package/dist/engines/clickhouse/version-validator.js +133 -0
  200. package/dist/engines/clickhouse/version-validator.js.map +1 -0
  201. package/dist/engines/cockroachdb/backup.js +261 -0
  202. package/dist/engines/cockroachdb/backup.js.map +1 -0
  203. package/dist/engines/cockroachdb/binary-manager.js +33 -0
  204. package/dist/engines/cockroachdb/binary-manager.js.map +1 -0
  205. package/dist/engines/cockroachdb/binary-urls.js +33 -0
  206. package/dist/engines/cockroachdb/binary-urls.js.map +1 -0
  207. package/dist/engines/cockroachdb/cli-utils.js +338 -0
  208. package/dist/engines/cockroachdb/cli-utils.js.map +1 -0
  209. package/dist/engines/cockroachdb/hostdb-releases.js +21 -0
  210. package/dist/engines/cockroachdb/hostdb-releases.js.map +1 -0
  211. package/dist/engines/cockroachdb/index.js +1016 -0
  212. package/dist/engines/cockroachdb/index.js.map +1 -0
  213. package/dist/engines/cockroachdb/restore.js +323 -0
  214. package/dist/engines/cockroachdb/restore.js.map +1 -0
  215. package/dist/engines/cockroachdb/version-maps.js +37 -0
  216. package/dist/engines/cockroachdb/version-maps.js.map +1 -0
  217. package/dist/engines/couchdb/api-client.js +64 -0
  218. package/dist/engines/couchdb/api-client.js.map +1 -0
  219. package/dist/engines/couchdb/backup.js +90 -0
  220. package/dist/engines/couchdb/backup.js.map +1 -0
  221. package/dist/engines/couchdb/binary-manager.js +62 -0
  222. package/dist/engines/couchdb/binary-manager.js.map +1 -0
  223. package/dist/engines/couchdb/binary-urls.js +92 -0
  224. package/dist/engines/couchdb/binary-urls.js.map +1 -0
  225. package/dist/engines/couchdb/hostdb-releases.js +21 -0
  226. package/dist/engines/couchdb/hostdb-releases.js.map +1 -0
  227. package/dist/engines/couchdb/index.js +1043 -0
  228. package/dist/engines/couchdb/index.js.map +1 -0
  229. package/dist/engines/couchdb/restore.js +198 -0
  230. package/dist/engines/couchdb/restore.js.map +1 -0
  231. package/dist/engines/couchdb/version-maps.js +67 -0
  232. package/dist/engines/couchdb/version-maps.js.map +1 -0
  233. package/dist/engines/couchdb/version-validator.js +88 -0
  234. package/dist/engines/couchdb/version-validator.js.map +1 -0
  235. package/dist/engines/duckdb/binary-manager.js +33 -0
  236. package/dist/engines/duckdb/binary-manager.js.map +1 -0
  237. package/{engines/duckdb/binary-urls.ts → dist/engines/duckdb/binary-urls.js} +11 -16
  238. package/dist/engines/duckdb/binary-urls.js.map +1 -0
  239. package/dist/engines/duckdb/hostdb-releases.js +21 -0
  240. package/dist/engines/duckdb/hostdb-releases.js.map +1 -0
  241. package/dist/engines/duckdb/index.js +594 -0
  242. package/dist/engines/duckdb/index.js.map +1 -0
  243. package/dist/engines/duckdb/registry.js +265 -0
  244. package/dist/engines/duckdb/registry.js.map +1 -0
  245. package/dist/engines/duckdb/scanner.js +12 -0
  246. package/dist/engines/duckdb/scanner.js.map +1 -0
  247. package/dist/engines/duckdb/version-maps.js +67 -0
  248. package/dist/engines/duckdb/version-maps.js.map +1 -0
  249. package/dist/engines/duckdb/version-validator.js +62 -0
  250. package/dist/engines/duckdb/version-validator.js.map +1 -0
  251. package/dist/engines/ferretdb/backup.js +170 -0
  252. package/dist/engines/ferretdb/backup.js.map +1 -0
  253. package/dist/engines/ferretdb/binary-manager.js +765 -0
  254. package/dist/engines/ferretdb/binary-manager.js.map +1 -0
  255. package/dist/engines/ferretdb/binary-urls.js +135 -0
  256. package/dist/engines/ferretdb/binary-urls.js.map +1 -0
  257. package/dist/engines/ferretdb/index.js +1517 -0
  258. package/dist/engines/ferretdb/index.js.map +1 -0
  259. package/dist/engines/ferretdb/restore.js +310 -0
  260. package/dist/engines/ferretdb/restore.js.map +1 -0
  261. package/{engines/ferretdb/version-maps.ts → dist/engines/ferretdb/version-maps.js} +62 -79
  262. package/dist/engines/ferretdb/version-maps.js.map +1 -0
  263. package/dist/engines/file-based-utils.js +184 -0
  264. package/dist/engines/file-based-utils.js.map +1 -0
  265. package/dist/engines/index.js +124 -0
  266. package/dist/engines/index.js.map +1 -0
  267. package/dist/engines/influxdb/api-client.js +54 -0
  268. package/dist/engines/influxdb/api-client.js.map +1 -0
  269. package/dist/engines/influxdb/backup.js +119 -0
  270. package/dist/engines/influxdb/backup.js.map +1 -0
  271. package/dist/engines/influxdb/binary-manager.js +87 -0
  272. package/dist/engines/influxdb/binary-manager.js.map +1 -0
  273. package/dist/engines/influxdb/binary-urls.js +56 -0
  274. package/dist/engines/influxdb/binary-urls.js.map +1 -0
  275. package/dist/engines/influxdb/hostdb-releases.js +21 -0
  276. package/dist/engines/influxdb/hostdb-releases.js.map +1 -0
  277. package/dist/engines/influxdb/index.js +962 -0
  278. package/dist/engines/influxdb/index.js.map +1 -0
  279. package/dist/engines/influxdb/restore.js +329 -0
  280. package/dist/engines/influxdb/restore.js.map +1 -0
  281. package/dist/engines/influxdb/version-maps.js +64 -0
  282. package/dist/engines/influxdb/version-maps.js.map +1 -0
  283. package/dist/engines/influxdb/version-validator.js +109 -0
  284. package/dist/engines/influxdb/version-validator.js.map +1 -0
  285. package/dist/engines/mariadb/backup.js +178 -0
  286. package/dist/engines/mariadb/backup.js.map +1 -0
  287. package/dist/engines/mariadb/binary-manager.js +33 -0
  288. package/dist/engines/mariadb/binary-manager.js.map +1 -0
  289. package/{engines/mariadb/binary-urls.ts → dist/engines/mariadb/binary-urls.js} +38 -55
  290. package/dist/engines/mariadb/binary-urls.js.map +1 -0
  291. package/dist/engines/mariadb/hostdb-releases.js +21 -0
  292. package/dist/engines/mariadb/hostdb-releases.js.map +1 -0
  293. package/dist/engines/mariadb/index.js +1011 -0
  294. package/dist/engines/mariadb/index.js.map +1 -0
  295. package/dist/engines/mariadb/restore.js +322 -0
  296. package/dist/engines/mariadb/restore.js.map +1 -0
  297. package/dist/engines/mariadb/version-maps.js +63 -0
  298. package/dist/engines/mariadb/version-maps.js.map +1 -0
  299. package/dist/engines/mariadb/version-validator.js +143 -0
  300. package/dist/engines/mariadb/version-validator.js.map +1 -0
  301. package/dist/engines/meilisearch/api-client.js +50 -0
  302. package/dist/engines/meilisearch/api-client.js.map +1 -0
  303. package/dist/engines/meilisearch/backup.js +167 -0
  304. package/dist/engines/meilisearch/backup.js.map +1 -0
  305. package/dist/engines/meilisearch/binary-manager.js +31 -0
  306. package/dist/engines/meilisearch/binary-manager.js.map +1 -0
  307. package/dist/engines/meilisearch/binary-urls.js +56 -0
  308. package/dist/engines/meilisearch/binary-urls.js.map +1 -0
  309. package/dist/engines/meilisearch/hostdb-releases.js +21 -0
  310. package/dist/engines/meilisearch/hostdb-releases.js.map +1 -0
  311. package/dist/engines/meilisearch/index.js +992 -0
  312. package/dist/engines/meilisearch/index.js.map +1 -0
  313. package/dist/engines/meilisearch/restore.js +167 -0
  314. package/dist/engines/meilisearch/restore.js.map +1 -0
  315. package/dist/engines/meilisearch/version-maps.js +67 -0
  316. package/dist/engines/meilisearch/version-maps.js.map +1 -0
  317. package/dist/engines/meilisearch/version-validator.js +109 -0
  318. package/dist/engines/meilisearch/version-validator.js.map +1 -0
  319. package/dist/engines/mongodb/backup.js +109 -0
  320. package/dist/engines/mongodb/backup.js.map +1 -0
  321. package/dist/engines/mongodb/binary-manager.js +36 -0
  322. package/dist/engines/mongodb/binary-manager.js.map +1 -0
  323. package/dist/engines/mongodb/binary-urls.js +46 -0
  324. package/dist/engines/mongodb/binary-urls.js.map +1 -0
  325. package/dist/engines/mongodb/cli-utils.js +131 -0
  326. package/dist/engines/mongodb/cli-utils.js.map +1 -0
  327. package/dist/engines/mongodb/hostdb-releases.js +77 -0
  328. package/dist/engines/mongodb/hostdb-releases.js.map +1 -0
  329. package/dist/engines/mongodb/index.js +873 -0
  330. package/dist/engines/mongodb/index.js.map +1 -0
  331. package/dist/engines/mongodb/restore.js +276 -0
  332. package/dist/engines/mongodb/restore.js.map +1 -0
  333. package/dist/engines/mongodb/version-maps.js +79 -0
  334. package/dist/engines/mongodb/version-maps.js.map +1 -0
  335. package/dist/engines/mongodb/version-validator.js +133 -0
  336. package/dist/engines/mongodb/version-validator.js.map +1 -0
  337. package/dist/engines/mysql/backup.js +210 -0
  338. package/dist/engines/mysql/backup.js.map +1 -0
  339. package/dist/engines/mysql/binary-detection.js +325 -0
  340. package/dist/engines/mysql/binary-detection.js.map +1 -0
  341. package/dist/engines/mysql/binary-manager.js +30 -0
  342. package/dist/engines/mysql/binary-manager.js.map +1 -0
  343. package/dist/engines/mysql/binary-urls.js +87 -0
  344. package/dist/engines/mysql/binary-urls.js.map +1 -0
  345. package/{engines/mysql/hostdb-releases.ts → dist/engines/mysql/hostdb-releases.js} +20 -23
  346. package/dist/engines/mysql/hostdb-releases.js.map +1 -0
  347. package/dist/engines/mysql/index.js +1066 -0
  348. package/dist/engines/mysql/index.js.map +1 -0
  349. package/dist/engines/mysql/restore.js +361 -0
  350. package/dist/engines/mysql/restore.js.map +1 -0
  351. package/dist/engines/mysql/version-maps.js +79 -0
  352. package/dist/engines/mysql/version-maps.js.map +1 -0
  353. package/dist/engines/mysql/version-validator.js +266 -0
  354. package/dist/engines/mysql/version-validator.js.map +1 -0
  355. package/dist/engines/postgresql/backup.js +118 -0
  356. package/dist/engines/postgresql/backup.js.map +1 -0
  357. package/dist/engines/postgresql/binary-manager.js +85 -0
  358. package/dist/engines/postgresql/binary-manager.js.map +1 -0
  359. package/dist/engines/postgresql/binary-urls.js +80 -0
  360. package/dist/engines/postgresql/binary-urls.js.map +1 -0
  361. package/dist/engines/postgresql/hostdb-releases.js +21 -0
  362. package/dist/engines/postgresql/hostdb-releases.js.map +1 -0
  363. package/dist/engines/postgresql/index.js +852 -0
  364. package/dist/engines/postgresql/index.js.map +1 -0
  365. package/dist/engines/postgresql/remote-version.js +109 -0
  366. package/dist/engines/postgresql/remote-version.js.map +1 -0
  367. package/dist/engines/postgresql/restore.js +254 -0
  368. package/dist/engines/postgresql/restore.js.map +1 -0
  369. package/dist/engines/postgresql/version-maps.js +73 -0
  370. package/dist/engines/postgresql/version-maps.js.map +1 -0
  371. package/dist/engines/postgresql/version-validator.js +286 -0
  372. package/dist/engines/postgresql/version-validator.js.map +1 -0
  373. package/dist/engines/qdrant/api-client.js +50 -0
  374. package/dist/engines/qdrant/api-client.js.map +1 -0
  375. package/dist/engines/qdrant/backup.js +115 -0
  376. package/dist/engines/qdrant/backup.js.map +1 -0
  377. package/dist/engines/qdrant/binary-manager.js +31 -0
  378. package/dist/engines/qdrant/binary-manager.js.map +1 -0
  379. package/dist/engines/qdrant/binary-urls.js +92 -0
  380. package/dist/engines/qdrant/binary-urls.js.map +1 -0
  381. package/dist/engines/qdrant/cli-utils.js +39 -0
  382. package/dist/engines/qdrant/cli-utils.js.map +1 -0
  383. package/dist/engines/qdrant/hostdb-releases.js +21 -0
  384. package/dist/engines/qdrant/hostdb-releases.js.map +1 -0
  385. package/dist/engines/qdrant/index.js +1002 -0
  386. package/dist/engines/qdrant/index.js.map +1 -0
  387. package/dist/engines/qdrant/restore.js +154 -0
  388. package/dist/engines/qdrant/restore.js.map +1 -0
  389. package/dist/engines/qdrant/version-maps.js +67 -0
  390. package/dist/engines/qdrant/version-maps.js.map +1 -0
  391. package/dist/engines/qdrant/version-validator.js +109 -0
  392. package/dist/engines/qdrant/version-validator.js.map +1 -0
  393. package/dist/engines/questdb/backup.js +191 -0
  394. package/dist/engines/questdb/backup.js.map +1 -0
  395. package/dist/engines/questdb/binary-manager.js +247 -0
  396. package/dist/engines/questdb/binary-manager.js.map +1 -0
  397. package/dist/engines/questdb/binary-urls.js +27 -0
  398. package/dist/engines/questdb/binary-urls.js.map +1 -0
  399. package/dist/engines/questdb/hostdb-releases.js +21 -0
  400. package/dist/engines/questdb/hostdb-releases.js.map +1 -0
  401. package/dist/engines/questdb/index.js +814 -0
  402. package/dist/engines/questdb/index.js.map +1 -0
  403. package/dist/engines/questdb/restore.js +202 -0
  404. package/dist/engines/questdb/restore.js.map +1 -0
  405. package/dist/engines/questdb/version-maps.js +33 -0
  406. package/dist/engines/questdb/version-maps.js.map +1 -0
  407. package/dist/engines/questdb/version-validator.js +99 -0
  408. package/dist/engines/questdb/version-validator.js.map +1 -0
  409. package/dist/engines/redis/backup.js +292 -0
  410. package/dist/engines/redis/backup.js.map +1 -0
  411. package/dist/engines/redis/binary-manager.js +32 -0
  412. package/dist/engines/redis/binary-manager.js.map +1 -0
  413. package/dist/engines/redis/binary-urls.js +96 -0
  414. package/dist/engines/redis/binary-urls.js.map +1 -0
  415. package/dist/engines/redis/cli-utils.js +38 -0
  416. package/dist/engines/redis/cli-utils.js.map +1 -0
  417. package/dist/engines/redis/hostdb-releases.js +21 -0
  418. package/dist/engines/redis/hostdb-releases.js.map +1 -0
  419. package/dist/engines/redis/index.js +1263 -0
  420. package/dist/engines/redis/index.js.map +1 -0
  421. package/dist/engines/redis/restore.js +338 -0
  422. package/dist/engines/redis/restore.js.map +1 -0
  423. package/dist/engines/redis/version-maps.js +70 -0
  424. package/dist/engines/redis/version-maps.js.map +1 -0
  425. package/dist/engines/redis/version-validator.js +109 -0
  426. package/dist/engines/redis/version-validator.js.map +1 -0
  427. package/dist/engines/sqlite/binary-manager.js +39 -0
  428. package/dist/engines/sqlite/binary-manager.js.map +1 -0
  429. package/{engines/sqlite/binary-urls.ts → dist/engines/sqlite/binary-urls.js} +11 -16
  430. package/dist/engines/sqlite/binary-urls.js.map +1 -0
  431. package/dist/engines/sqlite/hostdb-releases.js +21 -0
  432. package/dist/engines/sqlite/hostdb-releases.js.map +1 -0
  433. package/dist/engines/sqlite/index.js +493 -0
  434. package/dist/engines/sqlite/index.js.map +1 -0
  435. package/dist/engines/sqlite/registry.js +163 -0
  436. package/dist/engines/sqlite/registry.js.map +1 -0
  437. package/dist/engines/sqlite/scanner.js +12 -0
  438. package/dist/engines/sqlite/scanner.js.map +1 -0
  439. package/dist/engines/sqlite/version-maps.js +57 -0
  440. package/dist/engines/sqlite/version-maps.js.map +1 -0
  441. package/dist/engines/surrealdb/backup.js +97 -0
  442. package/dist/engines/surrealdb/backup.js.map +1 -0
  443. package/dist/engines/surrealdb/binary-manager.js +33 -0
  444. package/dist/engines/surrealdb/binary-manager.js.map +1 -0
  445. package/dist/engines/surrealdb/binary-urls.js +33 -0
  446. package/dist/engines/surrealdb/binary-urls.js.map +1 -0
  447. package/dist/engines/surrealdb/cli-utils.js +147 -0
  448. package/dist/engines/surrealdb/cli-utils.js.map +1 -0
  449. package/dist/engines/surrealdb/hostdb-releases.js +21 -0
  450. package/dist/engines/surrealdb/hostdb-releases.js.map +1 -0
  451. package/dist/engines/surrealdb/index.js +1022 -0
  452. package/dist/engines/surrealdb/index.js.map +1 -0
  453. package/dist/engines/surrealdb/restore.js +224 -0
  454. package/dist/engines/surrealdb/restore.js.map +1 -0
  455. package/dist/engines/surrealdb/version-maps.js +36 -0
  456. package/dist/engines/surrealdb/version-maps.js.map +1 -0
  457. package/dist/engines/tigerbeetle/backup.js +36 -0
  458. package/dist/engines/tigerbeetle/backup.js.map +1 -0
  459. package/dist/engines/tigerbeetle/binary-manager.js +72 -0
  460. package/dist/engines/tigerbeetle/binary-manager.js.map +1 -0
  461. package/dist/engines/tigerbeetle/binary-urls.js +49 -0
  462. package/dist/engines/tigerbeetle/binary-urls.js.map +1 -0
  463. package/dist/engines/tigerbeetle/hostdb-releases.js +21 -0
  464. package/dist/engines/tigerbeetle/hostdb-releases.js.map +1 -0
  465. package/dist/engines/tigerbeetle/index.js +559 -0
  466. package/dist/engines/tigerbeetle/index.js.map +1 -0
  467. package/dist/engines/tigerbeetle/restore.js +91 -0
  468. package/dist/engines/tigerbeetle/restore.js.map +1 -0
  469. package/{engines/tigerbeetle/version-maps.ts → dist/engines/tigerbeetle/version-maps.js} +22 -31
  470. package/dist/engines/tigerbeetle/version-maps.js.map +1 -0
  471. package/dist/engines/tigerbeetle/version-validator.js +108 -0
  472. package/dist/engines/tigerbeetle/version-validator.js.map +1 -0
  473. package/dist/engines/typedb/backup.js +129 -0
  474. package/dist/engines/typedb/backup.js.map +1 -0
  475. package/dist/engines/typedb/binary-manager.js +151 -0
  476. package/dist/engines/typedb/binary-manager.js.map +1 -0
  477. package/dist/engines/typedb/binary-urls.js +33 -0
  478. package/dist/engines/typedb/binary-urls.js.map +1 -0
  479. package/dist/engines/typedb/cli-utils.js +163 -0
  480. package/dist/engines/typedb/cli-utils.js.map +1 -0
  481. package/dist/engines/typedb/hostdb-releases.js +21 -0
  482. package/dist/engines/typedb/hostdb-releases.js.map +1 -0
  483. package/dist/engines/typedb/index.js +1003 -0
  484. package/dist/engines/typedb/index.js.map +1 -0
  485. package/dist/engines/typedb/restore.js +279 -0
  486. package/dist/engines/typedb/restore.js.map +1 -0
  487. package/dist/engines/typedb/version-maps.js +40 -0
  488. package/dist/engines/typedb/version-maps.js.map +1 -0
  489. package/dist/engines/typedb/version-validator.js +103 -0
  490. package/dist/engines/typedb/version-validator.js.map +1 -0
  491. package/dist/engines/valkey/backup.js +292 -0
  492. package/dist/engines/valkey/backup.js.map +1 -0
  493. package/dist/engines/valkey/binary-manager.js +33 -0
  494. package/dist/engines/valkey/binary-manager.js.map +1 -0
  495. package/dist/engines/valkey/binary-urls.js +98 -0
  496. package/dist/engines/valkey/binary-urls.js.map +1 -0
  497. package/dist/engines/valkey/cli-utils.js +38 -0
  498. package/dist/engines/valkey/cli-utils.js.map +1 -0
  499. package/dist/engines/valkey/hostdb-releases.js +21 -0
  500. package/dist/engines/valkey/hostdb-releases.js.map +1 -0
  501. package/dist/engines/valkey/index.js +1257 -0
  502. package/dist/engines/valkey/index.js.map +1 -0
  503. package/dist/engines/valkey/restore.js +340 -0
  504. package/dist/engines/valkey/restore.js.map +1 -0
  505. package/dist/engines/valkey/version-maps.js +70 -0
  506. package/dist/engines/valkey/version-maps.js.map +1 -0
  507. package/dist/engines/valkey/version-validator.js +112 -0
  508. package/dist/engines/valkey/version-validator.js.map +1 -0
  509. package/dist/engines/weaviate/api-client.js +50 -0
  510. package/dist/engines/weaviate/api-client.js.map +1 -0
  511. package/dist/engines/weaviate/backup.js +95 -0
  512. package/dist/engines/weaviate/backup.js.map +1 -0
  513. package/dist/engines/weaviate/binary-manager.js +58 -0
  514. package/dist/engines/weaviate/binary-manager.js.map +1 -0
  515. package/dist/engines/weaviate/binary-urls.js +92 -0
  516. package/dist/engines/weaviate/binary-urls.js.map +1 -0
  517. package/dist/engines/weaviate/cli-utils.js +39 -0
  518. package/dist/engines/weaviate/cli-utils.js.map +1 -0
  519. package/dist/engines/weaviate/hostdb-releases.js +21 -0
  520. package/dist/engines/weaviate/hostdb-releases.js.map +1 -0
  521. package/dist/engines/weaviate/index.js +871 -0
  522. package/dist/engines/weaviate/index.js.map +1 -0
  523. package/dist/engines/weaviate/restore.js +185 -0
  524. package/dist/engines/weaviate/restore.js.map +1 -0
  525. package/dist/engines/weaviate/version-maps.js +67 -0
  526. package/dist/engines/weaviate/version-maps.js.map +1 -0
  527. package/dist/engines/weaviate/version-validator.js +109 -0
  528. package/dist/engines/weaviate/version-validator.js.map +1 -0
  529. package/dist/types/index.js +102 -0
  530. package/dist/types/index.js.map +1 -0
  531. package/package.json +12 -9
  532. package/bin/cli.js +0 -68
  533. package/cli/bin.ts +0 -10
  534. package/cli/commands/attach.ts +0 -139
  535. package/cli/commands/backup.ts +0 -290
  536. package/cli/commands/backups.ts +0 -247
  537. package/cli/commands/clone.ts +0 -159
  538. package/cli/commands/config.ts +0 -367
  539. package/cli/commands/connect.ts +0 -684
  540. package/cli/commands/create.ts +0 -1201
  541. package/cli/commands/databases.ts +0 -630
  542. package/cli/commands/delete.ts +0 -133
  543. package/cli/commands/deps.ts +0 -342
  544. package/cli/commands/detach.ts +0 -107
  545. package/cli/commands/doctor.ts +0 -689
  546. package/cli/commands/duckdb.ts +0 -273
  547. package/cli/commands/edit.ts +0 -683
  548. package/cli/commands/engines.ts +0 -1914
  549. package/cli/commands/export.ts +0 -544
  550. package/cli/commands/info.ts +0 -340
  551. package/cli/commands/list.ts +0 -284
  552. package/cli/commands/logs.ts +0 -102
  553. package/cli/commands/menu/backup-handlers.ts +0 -1571
  554. package/cli/commands/menu/container-handlers.ts +0 -2288
  555. package/cli/commands/menu/engine-handlers.ts +0 -355
  556. package/cli/commands/menu/index.ts +0 -342
  557. package/cli/commands/menu/settings-handlers.ts +0 -365
  558. package/cli/commands/menu/shared.ts +0 -23
  559. package/cli/commands/menu/shell-handlers.ts +0 -1811
  560. package/cli/commands/menu/sql-handlers.ts +0 -231
  561. package/cli/commands/menu/update-handlers.ts +0 -378
  562. package/cli/commands/menu/validators.ts +0 -8
  563. package/cli/commands/ports.ts +0 -211
  564. package/cli/commands/pull.ts +0 -223
  565. package/cli/commands/query.ts +0 -241
  566. package/cli/commands/restore.ts +0 -587
  567. package/cli/commands/run.ts +0 -178
  568. package/cli/commands/self-update.ts +0 -121
  569. package/cli/commands/sqlite.ts +0 -273
  570. package/cli/commands/start.ts +0 -218
  571. package/cli/commands/stop.ts +0 -241
  572. package/cli/commands/url.ts +0 -104
  573. package/cli/commands/users.ts +0 -264
  574. package/cli/commands/version.ts +0 -55
  575. package/cli/commands/which.ts +0 -290
  576. package/cli/constants.ts +0 -233
  577. package/cli/helpers.ts +0 -1593
  578. package/cli/index.ts +0 -162
  579. package/cli/ui/prompts.ts +0 -1525
  580. package/cli/ui/spinner.ts +0 -88
  581. package/cli/ui/theme.ts +0 -128
  582. package/cli/utils/file-follower.ts +0 -93
  583. package/config/backup-formats.ts +0 -446
  584. package/config/defaults.ts +0 -56
  585. package/config/engine-defaults.ts +0 -336
  586. package/config/engines-registry.ts +0 -150
  587. package/config/engines.schema.json +0 -135
  588. package/config/os-dependencies.ts +0 -888
  589. package/config/paths.ts +0 -200
  590. package/core/backup-restore.ts +0 -330
  591. package/core/base-binary-manager.ts +0 -562
  592. package/core/base-document-binary-manager.ts +0 -523
  593. package/core/base-embedded-binary-manager.ts +0 -547
  594. package/core/base-server-binary-manager.ts +0 -523
  595. package/core/config-manager.ts +0 -652
  596. package/core/container-manager.ts +0 -787
  597. package/core/credential-generator.ts +0 -93
  598. package/core/credential-manager.ts +0 -259
  599. package/core/dblab-utils.ts +0 -113
  600. package/core/dependency-manager.ts +0 -512
  601. package/core/docker-exporter.ts +0 -1345
  602. package/core/error-handler.ts +0 -419
  603. package/core/fs-error-utils.ts +0 -82
  604. package/core/homebrew-version-manager.ts +0 -352
  605. package/core/hostdb-client.ts +0 -344
  606. package/core/hostdb-metadata.ts +0 -350
  607. package/core/hostdb-releases-factory.ts +0 -237
  608. package/core/library-env.ts +0 -118
  609. package/core/pgweb-utils.ts +0 -62
  610. package/core/platform-service.ts +0 -829
  611. package/core/port-manager.ts +0 -165
  612. package/core/process-manager.ts +0 -576
  613. package/core/pull-manager.ts +0 -511
  614. package/core/query-parser.ts +0 -514
  615. package/core/spawn-utils.ts +0 -122
  616. package/core/start-with-retry.ts +0 -130
  617. package/core/test-cleanup.ts +0 -108
  618. package/core/tls-generator.ts +0 -116
  619. package/core/transaction-manager.ts +0 -158
  620. package/core/update-manager.ts +0 -308
  621. package/core/version-migration.ts +0 -346
  622. package/core/version-utils.ts +0 -104
  623. package/engines/base-engine.ts +0 -340
  624. package/engines/clickhouse/README.md +0 -231
  625. package/engines/clickhouse/backup.ts +0 -398
  626. package/engines/clickhouse/binary-manager.ts +0 -201
  627. package/engines/clickhouse/binary-urls.ts +0 -125
  628. package/engines/clickhouse/cli-utils.ts +0 -176
  629. package/engines/clickhouse/hostdb-releases.ts +0 -30
  630. package/engines/clickhouse/index.ts +0 -1345
  631. package/engines/clickhouse/restore.ts +0 -466
  632. package/engines/clickhouse/version-maps.ts +0 -95
  633. package/engines/clickhouse/version-validator.ts +0 -154
  634. package/engines/cockroachdb/README.md +0 -170
  635. package/engines/cockroachdb/backup.ts +0 -376
  636. package/engines/cockroachdb/binary-manager.ts +0 -45
  637. package/engines/cockroachdb/binary-urls.ts +0 -40
  638. package/engines/cockroachdb/cli-utils.ts +0 -384
  639. package/engines/cockroachdb/hostdb-releases.ts +0 -26
  640. package/engines/cockroachdb/index.ts +0 -1276
  641. package/engines/cockroachdb/restore.ts +0 -455
  642. package/engines/cockroachdb/version-maps.ts +0 -42
  643. package/engines/couchdb/README.md +0 -257
  644. package/engines/couchdb/api-client.ts +0 -81
  645. package/engines/couchdb/backup.ts +0 -137
  646. package/engines/couchdb/binary-manager.ts +0 -86
  647. package/engines/couchdb/binary-urls.ts +0 -115
  648. package/engines/couchdb/hostdb-releases.ts +0 -23
  649. package/engines/couchdb/index.ts +0 -1429
  650. package/engines/couchdb/restore.ts +0 -290
  651. package/engines/couchdb/version-maps.ts +0 -78
  652. package/engines/couchdb/version-validator.ts +0 -111
  653. package/engines/duckdb/README.md +0 -154
  654. package/engines/duckdb/binary-manager.ts +0 -45
  655. package/engines/duckdb/hostdb-releases.ts +0 -23
  656. package/engines/duckdb/index.ts +0 -749
  657. package/engines/duckdb/registry.ts +0 -303
  658. package/engines/duckdb/scanner.ts +0 -22
  659. package/engines/duckdb/version-maps.ts +0 -78
  660. package/engines/duckdb/version-validator.ts +0 -78
  661. package/engines/ferretdb/README.md +0 -262
  662. package/engines/ferretdb/backup.ts +0 -173
  663. package/engines/ferretdb/binary-manager.ts +0 -1095
  664. package/engines/ferretdb/binary-urls.ts +0 -183
  665. package/engines/ferretdb/index.ts +0 -1907
  666. package/engines/ferretdb/restore.ts +0 -357
  667. package/engines/file-based-utils.ts +0 -262
  668. package/engines/index.ts +0 -131
  669. package/engines/influxdb/README.md +0 -180
  670. package/engines/influxdb/api-client.ts +0 -64
  671. package/engines/influxdb/backup.ts +0 -160
  672. package/engines/influxdb/binary-manager.ts +0 -110
  673. package/engines/influxdb/binary-urls.ts +0 -69
  674. package/engines/influxdb/hostdb-releases.ts +0 -23
  675. package/engines/influxdb/index.ts +0 -1272
  676. package/engines/influxdb/restore.ts +0 -417
  677. package/engines/influxdb/version-maps.ts +0 -75
  678. package/engines/influxdb/version-validator.ts +0 -128
  679. package/engines/mariadb/README.md +0 -141
  680. package/engines/mariadb/backup.ts +0 -233
  681. package/engines/mariadb/binary-manager.ts +0 -45
  682. package/engines/mariadb/hostdb-releases.ts +0 -23
  683. package/engines/mariadb/index.ts +0 -1300
  684. package/engines/mariadb/restore.ts +0 -447
  685. package/engines/mariadb/version-maps.ts +0 -72
  686. package/engines/mariadb/version-validator.ts +0 -181
  687. package/engines/meilisearch/README.md +0 -255
  688. package/engines/meilisearch/api-client.ts +0 -61
  689. package/engines/meilisearch/backup.ts +0 -233
  690. package/engines/meilisearch/binary-manager.ts +0 -43
  691. package/engines/meilisearch/binary-urls.ts +0 -69
  692. package/engines/meilisearch/hostdb-releases.ts +0 -26
  693. package/engines/meilisearch/index.ts +0 -1292
  694. package/engines/meilisearch/restore.ts +0 -219
  695. package/engines/meilisearch/version-maps.ts +0 -78
  696. package/engines/meilisearch/version-validator.ts +0 -128
  697. package/engines/mongodb/README.md +0 -162
  698. package/engines/mongodb/backup.ts +0 -127
  699. package/engines/mongodb/binary-manager.ts +0 -48
  700. package/engines/mongodb/binary-urls.ts +0 -63
  701. package/engines/mongodb/cli-utils.ts +0 -171
  702. package/engines/mongodb/hostdb-releases.ts +0 -91
  703. package/engines/mongodb/index.ts +0 -1118
  704. package/engines/mongodb/restore.ts +0 -361
  705. package/engines/mongodb/version-maps.ts +0 -91
  706. package/engines/mongodb/version-validator.ts +0 -160
  707. package/engines/mysql/README.md +0 -142
  708. package/engines/mysql/backup.ts +0 -270
  709. package/engines/mysql/binary-detection.ts +0 -408
  710. package/engines/mysql/binary-manager.ts +0 -42
  711. package/engines/mysql/binary-urls.ts +0 -104
  712. package/engines/mysql/index.ts +0 -1361
  713. package/engines/mysql/restore.ts +0 -500
  714. package/engines/mysql/version-maps.ts +0 -91
  715. package/engines/mysql/version-validator.ts +0 -369
  716. package/engines/postgresql/README.md +0 -158
  717. package/engines/postgresql/backup.ts +0 -151
  718. package/engines/postgresql/binary-manager.ts +0 -114
  719. package/engines/postgresql/binary-urls.ts +0 -99
  720. package/engines/postgresql/hostdb-releases.ts +0 -26
  721. package/engines/postgresql/index.ts +0 -1143
  722. package/engines/postgresql/remote-version.ts +0 -161
  723. package/engines/postgresql/restore.ts +0 -342
  724. package/engines/postgresql/version-maps.ts +0 -83
  725. package/engines/postgresql/version-validator.ts +0 -413
  726. package/engines/qdrant/README.md +0 -222
  727. package/engines/qdrant/api-client.ts +0 -61
  728. package/engines/qdrant/backup.ts +0 -165
  729. package/engines/qdrant/binary-manager.ts +0 -43
  730. package/engines/qdrant/binary-urls.ts +0 -115
  731. package/engines/qdrant/cli-utils.ts +0 -43
  732. package/engines/qdrant/hostdb-releases.ts +0 -23
  733. package/engines/qdrant/index.ts +0 -1312
  734. package/engines/qdrant/restore.ts +0 -203
  735. package/engines/qdrant/version-maps.ts +0 -78
  736. package/engines/qdrant/version-validator.ts +0 -128
  737. package/engines/questdb/README.md +0 -334
  738. package/engines/questdb/backup.ts +0 -220
  739. package/engines/questdb/binary-manager.ts +0 -310
  740. package/engines/questdb/binary-urls.ts +0 -34
  741. package/engines/questdb/hostdb-releases.ts +0 -23
  742. package/engines/questdb/index.ts +0 -1023
  743. package/engines/questdb/restore.ts +0 -260
  744. package/engines/questdb/version-maps.ts +0 -37
  745. package/engines/questdb/version-validator.ts +0 -121
  746. package/engines/redis/README.md +0 -173
  747. package/engines/redis/backup.ts +0 -389
  748. package/engines/redis/binary-manager.ts +0 -44
  749. package/engines/redis/binary-urls.ts +0 -117
  750. package/engines/redis/cli-utils.ts +0 -42
  751. package/engines/redis/hostdb-releases.ts +0 -23
  752. package/engines/redis/index.ts +0 -1583
  753. package/engines/redis/restore.ts +0 -443
  754. package/engines/redis/version-maps.ts +0 -81
  755. package/engines/redis/version-validator.ts +0 -131
  756. package/engines/sqlite/README.md +0 -162
  757. package/engines/sqlite/binary-manager.ts +0 -52
  758. package/engines/sqlite/hostdb-releases.ts +0 -23
  759. package/engines/sqlite/index.ts +0 -641
  760. package/engines/sqlite/registry.ts +0 -198
  761. package/engines/sqlite/scanner.ts +0 -22
  762. package/engines/sqlite/version-maps.ts +0 -64
  763. package/engines/surrealdb/README.md +0 -218
  764. package/engines/surrealdb/backup.ts +0 -131
  765. package/engines/surrealdb/binary-manager.ts +0 -45
  766. package/engines/surrealdb/binary-urls.ts +0 -40
  767. package/engines/surrealdb/cli-utils.ts +0 -173
  768. package/engines/surrealdb/hostdb-releases.ts +0 -23
  769. package/engines/surrealdb/index.ts +0 -1246
  770. package/engines/surrealdb/restore.ts +0 -302
  771. package/engines/surrealdb/version-maps.ts +0 -41
  772. package/engines/tigerbeetle/README.md +0 -61
  773. package/engines/tigerbeetle/backup.ts +0 -49
  774. package/engines/tigerbeetle/binary-manager.ts +0 -95
  775. package/engines/tigerbeetle/binary-urls.ts +0 -62
  776. package/engines/tigerbeetle/hostdb-releases.ts +0 -26
  777. package/engines/tigerbeetle/index.ts +0 -746
  778. package/engines/tigerbeetle/restore.ts +0 -130
  779. package/engines/tigerbeetle/version-validator.ts +0 -126
  780. package/engines/typedb/backup.ts +0 -167
  781. package/engines/typedb/binary-manager.ts +0 -200
  782. package/engines/typedb/binary-urls.ts +0 -40
  783. package/engines/typedb/cli-utils.ts +0 -210
  784. package/engines/typedb/hostdb-releases.ts +0 -23
  785. package/engines/typedb/index.ts +0 -1275
  786. package/engines/typedb/restore.ts +0 -377
  787. package/engines/typedb/version-maps.ts +0 -48
  788. package/engines/typedb/version-validator.ts +0 -127
  789. package/engines/valkey/README.md +0 -219
  790. package/engines/valkey/backup.ts +0 -389
  791. package/engines/valkey/binary-manager.ts +0 -45
  792. package/engines/valkey/binary-urls.ts +0 -122
  793. package/engines/valkey/cli-utils.ts +0 -42
  794. package/engines/valkey/hostdb-releases.ts +0 -23
  795. package/engines/valkey/index.ts +0 -1585
  796. package/engines/valkey/restore.ts +0 -446
  797. package/engines/valkey/version-maps.ts +0 -81
  798. package/engines/valkey/version-validator.ts +0 -131
  799. package/engines/weaviate/README.md +0 -302
  800. package/engines/weaviate/api-client.ts +0 -61
  801. package/engines/weaviate/backup.ts +0 -145
  802. package/engines/weaviate/binary-manager.ts +0 -80
  803. package/engines/weaviate/binary-urls.ts +0 -115
  804. package/engines/weaviate/cli-utils.ts +0 -43
  805. package/engines/weaviate/hostdb-releases.ts +0 -23
  806. package/engines/weaviate/index.ts +0 -1139
  807. package/engines/weaviate/restore.ts +0 -235
  808. package/engines/weaviate/version-maps.ts +0 -78
  809. package/engines/weaviate/version-validator.ts +0 -128
  810. package/types/index.ts +0 -624
  811. /package/{config → dist/config}/engines.json +0 -0
@@ -0,0 +1,1573 @@
1
+ import chalk from 'chalk';
2
+ import inquirer from 'inquirer';
3
+ import { spawn } from 'child_process';
4
+ import { escapeablePrompt } from '../../ui/prompts.js';
5
+ import { getPageSize } from '../../constants.js';
6
+ import { existsSync } from 'fs';
7
+ import { chmod, mkdir, writeFile, rm } from 'fs/promises';
8
+ import { join, dirname, resolve, sep } from 'path';
9
+ import { containerManager } from '../../../core/container-manager.js';
10
+ import { isUsqlInstalled, isPgcliInstalled, isMycliInstalled, isLitecliInstalled, isIredisInstalled, detectPackageManager, installUsql, installPgcli, installMycli, installLitecli, installIredis, getUsqlManualInstructions, getPgcliManualInstructions, getMycliManualInstructions, getLitecliManualInstructions, getIredisManualInstructions, } from '../../../core/dependency-manager.js';
11
+ import { platformService } from '../../../core/platform-service.js';
12
+ import { portManager } from '../../../core/port-manager.js';
13
+ import { configManager } from '../../../core/config-manager.js';
14
+ import { getPgwebStatus, stopPgweb, PGWEB_VERSION, } from '../../../core/pgweb-utils.js';
15
+ import { DBLAB_ENGINES, DBLAB_VERSION, getDblabArgs, getDblabPlatformSuffix, } from '../../../core/dblab-utils.js';
16
+ import { getEngine } from '../../../engines/index.js';
17
+ import { createSpinner } from '../../ui/spinner.js';
18
+ import { uiError, uiWarning, uiInfo, uiSuccess } from '../../ui/theme.js';
19
+ import { logDebug } from '../../../core/error-handler.js';
20
+ import { pressEnterToContinue } from './shared.js';
21
+ import { paths } from '../../../config/paths.js';
22
+ import { getEngineConfig } from '../../../config/engines-registry.js';
23
+ import { getConsoleBaseArgs } from '../../../engines/typedb/cli-utils.js';
24
+ /**
25
+ * Open a URL in the system's default browser
26
+ */
27
+ function openInBrowser(url) {
28
+ const platform = process.platform;
29
+ let cmd;
30
+ let args;
31
+ if (platform === 'darwin') {
32
+ cmd = 'open';
33
+ args = [url];
34
+ }
35
+ else if (platform === 'win32') {
36
+ cmd = 'cmd';
37
+ args = ['/c', 'start', '', url];
38
+ }
39
+ else {
40
+ // Linux and others
41
+ cmd = 'xdg-open';
42
+ args = [url];
43
+ }
44
+ spawn(cmd, args, { detached: true, stdio: 'ignore' }).unref();
45
+ }
46
+ export async function handleCopyConnectionString(containerName, database) {
47
+ const config = await containerManager.getConfig(containerName);
48
+ if (!config) {
49
+ console.error(uiError(`Container "${containerName}" not found`));
50
+ return;
51
+ }
52
+ const engine = getEngine(config.engine);
53
+ // Use provided database or fall back to container's default
54
+ const connectionString = engine.getConnectionString(config, database);
55
+ const copied = await platformService.copyToClipboard(connectionString);
56
+ console.log();
57
+ if (copied) {
58
+ console.log(uiSuccess('Connection string copied to clipboard'));
59
+ console.log(chalk.gray(` ${connectionString}`));
60
+ }
61
+ else {
62
+ console.log(uiWarning('Could not copy to clipboard. Connection string:'));
63
+ console.log(chalk.cyan(` ${connectionString}`));
64
+ }
65
+ console.log();
66
+ await escapeablePrompt([
67
+ {
68
+ type: 'input',
69
+ name: 'continue',
70
+ message: chalk.gray('Press Enter to continue...'),
71
+ },
72
+ ]);
73
+ }
74
+ export async function handleOpenShell(containerName, database) {
75
+ const config = await containerManager.getConfig(containerName);
76
+ if (!config) {
77
+ console.error(uiError(`Container "${containerName}" not found`));
78
+ return;
79
+ }
80
+ const engine = getEngine(config.engine);
81
+ // Use provided database or fall back to container's default
82
+ const activeDatabase = database || config.database;
83
+ const connectionString = engine.getConnectionString(config, activeDatabase);
84
+ const shellCheckSpinner = createSpinner('Checking available shells...');
85
+ shellCheckSpinner.start();
86
+ const [usqlInstalled, pgcliInstalled, mycliInstalled, litecliInstalled, iredisInstalled,] = await Promise.all([
87
+ isUsqlInstalled(),
88
+ isPgcliInstalled(),
89
+ isMycliInstalled(),
90
+ isLitecliInstalled(),
91
+ isIredisInstalled(),
92
+ ]);
93
+ shellCheckSpinner.stop();
94
+ // Clear the spinner line
95
+ process.stdout.write('\x1b[1A\x1b[2K');
96
+ // Engine-specific shell names
97
+ let defaultShellName;
98
+ let engineSpecificCli;
99
+ let engineSpecificInstalled;
100
+ let engineSpecificValue;
101
+ let engineSpecificInstallValue;
102
+ if (config.engine === 'sqlite') {
103
+ defaultShellName = 'sqlite3';
104
+ engineSpecificCli = 'litecli';
105
+ engineSpecificInstalled = litecliInstalled;
106
+ engineSpecificValue = 'litecli';
107
+ engineSpecificInstallValue = 'install-litecli';
108
+ }
109
+ else if (config.engine === 'duckdb') {
110
+ defaultShellName = 'duckdb';
111
+ // DuckDB has no separate enhanced CLI tool
112
+ engineSpecificCli = null;
113
+ engineSpecificInstalled = false;
114
+ engineSpecificValue = null;
115
+ engineSpecificInstallValue = null;
116
+ }
117
+ else if (config.engine === 'mysql') {
118
+ defaultShellName = 'mysql';
119
+ engineSpecificCli = 'mycli';
120
+ engineSpecificInstalled = mycliInstalled;
121
+ engineSpecificValue = 'mycli';
122
+ engineSpecificInstallValue = 'install-mycli';
123
+ }
124
+ else if (config.engine === 'mariadb') {
125
+ defaultShellName = 'mariadb';
126
+ engineSpecificCli = 'mycli';
127
+ engineSpecificInstalled = mycliInstalled;
128
+ engineSpecificValue = 'mycli';
129
+ engineSpecificInstallValue = 'install-mycli';
130
+ }
131
+ else if (config.engine === 'mongodb' || config.engine === 'ferretdb') {
132
+ defaultShellName = 'mongosh';
133
+ // mongosh IS the enhanced shell for MongoDB/FerretDB (no separate enhanced CLI like pgcli/mycli)
134
+ engineSpecificCli = null;
135
+ engineSpecificInstalled = false;
136
+ engineSpecificValue = null;
137
+ engineSpecificInstallValue = null;
138
+ }
139
+ else if (config.engine === 'redis') {
140
+ defaultShellName = 'redis-cli';
141
+ engineSpecificCli = 'iredis';
142
+ engineSpecificInstalled = iredisInstalled;
143
+ engineSpecificValue = 'iredis';
144
+ engineSpecificInstallValue = 'install-iredis';
145
+ }
146
+ else if (config.engine === 'valkey') {
147
+ defaultShellName = 'valkey-cli';
148
+ engineSpecificCli = 'iredis'; // iredis is protocol-compatible with Valkey
149
+ engineSpecificInstalled = iredisInstalled;
150
+ engineSpecificValue = 'iredis';
151
+ engineSpecificInstallValue = 'install-iredis';
152
+ }
153
+ else if (config.engine === 'clickhouse') {
154
+ defaultShellName = 'clickhouse client';
155
+ // ClickHouse client is bundled, no separate enhanced CLI
156
+ engineSpecificCli = null;
157
+ engineSpecificInstalled = false;
158
+ engineSpecificValue = null;
159
+ engineSpecificInstallValue = null;
160
+ }
161
+ else if (config.engine === 'qdrant') {
162
+ // Qdrant uses REST API, open dashboard in browser
163
+ defaultShellName = 'Web Dashboard';
164
+ engineSpecificCli = null;
165
+ engineSpecificInstalled = false;
166
+ engineSpecificValue = null;
167
+ engineSpecificInstallValue = null;
168
+ }
169
+ else if (config.engine === 'meilisearch') {
170
+ // Meilisearch uses REST API, open dashboard in browser
171
+ defaultShellName = 'Web Dashboard';
172
+ engineSpecificCli = null;
173
+ engineSpecificInstalled = false;
174
+ engineSpecificValue = null;
175
+ engineSpecificInstallValue = null;
176
+ }
177
+ else if (config.engine === 'influxdb') {
178
+ // InfluxDB uses influxdb3 query subcommand (same binary as server)
179
+ defaultShellName = 'influxdb3 query';
180
+ engineSpecificCli = null;
181
+ engineSpecificInstalled = false;
182
+ engineSpecificValue = null;
183
+ engineSpecificInstallValue = null;
184
+ }
185
+ else if (config.engine === 'weaviate') {
186
+ // Weaviate uses REST API, open web dashboard in browser
187
+ defaultShellName = 'REST API';
188
+ engineSpecificCli = null;
189
+ engineSpecificInstalled = false;
190
+ engineSpecificValue = null;
191
+ engineSpecificInstallValue = null;
192
+ }
193
+ else if (config.engine === 'couchdb') {
194
+ // CouchDB uses REST API, open Fauxton dashboard in browser
195
+ defaultShellName = 'Fauxton Dashboard';
196
+ engineSpecificCli = null;
197
+ engineSpecificInstalled = false;
198
+ engineSpecificValue = null;
199
+ engineSpecificInstallValue = null;
200
+ }
201
+ else if (config.engine === 'surrealdb') {
202
+ // SurrealDB uses surreal sql command
203
+ defaultShellName = 'surreal sql';
204
+ engineSpecificCli = null;
205
+ engineSpecificInstalled = false;
206
+ engineSpecificValue = null;
207
+ engineSpecificInstallValue = null;
208
+ }
209
+ else if (config.engine === 'questdb') {
210
+ // QuestDB uses PostgreSQL wire protocol, can use psql or Web Console
211
+ // Note: Don't recommend pgcli for QuestDB - pgcli uses PostgreSQL functions
212
+ // like unnest() that QuestDB doesn't support, causing autocompletion errors
213
+ defaultShellName = 'psql';
214
+ engineSpecificCli = null;
215
+ engineSpecificInstalled = false;
216
+ engineSpecificValue = null;
217
+ engineSpecificInstallValue = null;
218
+ }
219
+ else if (config.engine === 'cockroachdb') {
220
+ // CockroachDB uses cockroach sql command
221
+ defaultShellName = 'cockroach sql';
222
+ engineSpecificCli = null;
223
+ engineSpecificInstalled = false;
224
+ engineSpecificValue = null;
225
+ engineSpecificInstallValue = null;
226
+ }
227
+ else if (config.engine === 'typedb') {
228
+ // TypeDB uses typedb console
229
+ defaultShellName = 'typedb console';
230
+ engineSpecificCli = null;
231
+ engineSpecificInstalled = false;
232
+ engineSpecificValue = null;
233
+ engineSpecificInstallValue = null;
234
+ }
235
+ else if (config.engine === 'tigerbeetle') {
236
+ // TigerBeetle uses tigerbeetle repl command
237
+ defaultShellName = 'tigerbeetle repl';
238
+ engineSpecificCli = null;
239
+ engineSpecificInstalled = false;
240
+ engineSpecificValue = null;
241
+ engineSpecificInstallValue = null;
242
+ }
243
+ else {
244
+ defaultShellName = 'psql';
245
+ engineSpecificCli = 'pgcli';
246
+ engineSpecificInstalled = pgcliInstalled;
247
+ engineSpecificValue = 'pgcli';
248
+ engineSpecificInstallValue = 'install-pgcli';
249
+ }
250
+ // Check if Qdrant Web UI is installed by verifying actual Web UI files exist
251
+ // (not just an empty static directory)
252
+ let qdrantWebUiInstalled = false;
253
+ if (config.engine === 'qdrant') {
254
+ const containerDir = paths.getContainerPath(config.name, {
255
+ engine: 'qdrant',
256
+ });
257
+ const staticDir = join(containerDir, 'static');
258
+ // Check for index.html which is always present in a valid Web UI install
259
+ qdrantWebUiInstalled = existsSync(join(staticDir, 'index.html'));
260
+ }
261
+ const choices = [];
262
+ // For Qdrant: show either "Open Web UI" or "Download Web UI" based on installation status
263
+ if (config.engine === 'qdrant') {
264
+ if (qdrantWebUiInstalled) {
265
+ choices.push({
266
+ name: `◎ Open Web UI in browser`,
267
+ value: 'default',
268
+ });
269
+ }
270
+ else {
271
+ choices.push({
272
+ name: `↓ Download Web UI (enables dashboard)`,
273
+ value: 'install-webui',
274
+ });
275
+ }
276
+ // Always show API info option for Qdrant
277
+ choices.push({
278
+ name: `ℹ Show API info`,
279
+ value: 'api-info',
280
+ });
281
+ }
282
+ else if (config.engine === 'meilisearch') {
283
+ // Meilisearch: dashboard is built-in at root URL
284
+ choices.push({
285
+ name: `◎ Open Dashboard in browser`,
286
+ value: 'default',
287
+ });
288
+ // Always show API info option for Meilisearch
289
+ choices.push({
290
+ name: `ℹ Show API info`,
291
+ value: 'api-info',
292
+ });
293
+ }
294
+ else if (config.engine === 'influxdb') {
295
+ // InfluxDB: influxdb3 query CLI + API info
296
+ choices.push({
297
+ name: `▸ Use default shell (influxdb3 query)`,
298
+ value: 'default',
299
+ });
300
+ choices.push({
301
+ name: `ℹ Show API info`,
302
+ value: 'api-info',
303
+ });
304
+ }
305
+ else if (config.engine === 'weaviate') {
306
+ // Weaviate: REST API dashboard + API info
307
+ choices.push({
308
+ name: `◎ Open Dashboard in browser`,
309
+ value: 'default',
310
+ });
311
+ choices.push({
312
+ name: `ℹ Show API info`,
313
+ value: 'api-info',
314
+ });
315
+ }
316
+ else if (config.engine === 'couchdb') {
317
+ // CouchDB: Fauxton dashboard is built-in at /_utils
318
+ choices.push({
319
+ name: `◎ Open Fauxton Dashboard in browser`,
320
+ value: 'default',
321
+ });
322
+ // Always show API info option for CouchDB
323
+ choices.push({
324
+ name: `ℹ Show API info`,
325
+ value: 'api-info',
326
+ });
327
+ }
328
+ else {
329
+ // Non-REST-API engines: show default shell option
330
+ choices.push({
331
+ name: `▸ Use default shell (${defaultShellName})`,
332
+ value: 'default',
333
+ });
334
+ }
335
+ // Only show engine-specific CLI option if one exists (MongoDB's mongosh IS the default)
336
+ if (engineSpecificCli !== null) {
337
+ if (engineSpecificInstalled) {
338
+ choices.push({
339
+ name: `★ Use ${engineSpecificCli} (enhanced features, recommended)`,
340
+ value: engineSpecificValue,
341
+ });
342
+ }
343
+ else {
344
+ choices.push({
345
+ name: `↓ Install ${engineSpecificCli} (enhanced features, recommended)`,
346
+ value: engineSpecificInstallValue,
347
+ });
348
+ }
349
+ }
350
+ // usql supports SQL databases - skip for non-SQL engines
351
+ const engineConfig = await getEngineConfig(config.engine);
352
+ if (engineConfig.queryLanguage === 'sql') {
353
+ if (usqlInstalled) {
354
+ choices.push({
355
+ name: '★ Use usql (universal SQL client)',
356
+ value: 'usql',
357
+ });
358
+ }
359
+ else {
360
+ choices.push({
361
+ name: '↓ Install usql (universal SQL client)',
362
+ value: 'install-usql',
363
+ });
364
+ }
365
+ }
366
+ // dblab visual TUI (supports PostgreSQL, MySQL, MariaDB, CockroachDB, SQLite, QuestDB)
367
+ if (DBLAB_ENGINES.has(config.engine)) {
368
+ const dblabPath = await configManager.getBinaryPath('dblab');
369
+ if (dblabPath) {
370
+ choices.push({
371
+ name: '★ Use dblab (visual TUI)',
372
+ value: 'dblab',
373
+ });
374
+ }
375
+ else {
376
+ choices.push({
377
+ name: '↓ Download dblab (visual TUI)',
378
+ value: 'install-dblab',
379
+ });
380
+ }
381
+ }
382
+ // Web Panel section for engines with browser-based UIs
383
+ if (config.engine === 'clickhouse') {
384
+ const httpPort = config.port + 1;
385
+ choices.push(new inquirer.Separator(chalk.gray(`───── Web Panel ─────`)));
386
+ choices.push({
387
+ name: `◎ Open Play UI (port ${httpPort})`,
388
+ value: 'browser',
389
+ });
390
+ }
391
+ if (config.engine === 'questdb') {
392
+ const httpPort = config.port + 188;
393
+ choices.push(new inquirer.Separator(chalk.gray(`───── Web Panel ─────`)));
394
+ choices.push({
395
+ name: `◎ Open Web Console (port ${httpPort})`,
396
+ value: 'browser',
397
+ });
398
+ }
399
+ if (config.engine === 'duckdb') {
400
+ choices.push(new inquirer.Separator(chalk.gray(`───── Web Panel ─────`)));
401
+ choices.push({
402
+ name: `◎ Open Web UI (built-in, port 4213)`,
403
+ value: 'duckdb-ui',
404
+ });
405
+ }
406
+ if (config.engine === 'postgresql' ||
407
+ config.engine === 'cockroachdb' ||
408
+ config.engine === 'ferretdb') {
409
+ choices.push(new inquirer.Separator(chalk.gray(`───── Web Panel ─────`)));
410
+ const pgwebPath = await configManager.getBinaryPath('pgweb');
411
+ if (pgwebPath) {
412
+ const pgwebStatus = await getPgwebStatus(containerName, config.engine);
413
+ if (pgwebStatus.running) {
414
+ choices.push({
415
+ name: `◎ Open pgweb (port ${pgwebStatus.port})`,
416
+ value: 'pgweb',
417
+ });
418
+ choices.push({
419
+ name: `■ Stop pgweb`,
420
+ value: 'stop-pgweb',
421
+ });
422
+ }
423
+ else {
424
+ choices.push({
425
+ name: `◎ Open pgweb`,
426
+ value: 'pgweb',
427
+ });
428
+ }
429
+ }
430
+ else {
431
+ choices.push({
432
+ name: `↓ Download pgweb`,
433
+ value: 'install-pgweb',
434
+ });
435
+ }
436
+ }
437
+ choices.push(new inquirer.Separator());
438
+ choices.push({
439
+ name: `${chalk.blue('←')} Back`,
440
+ value: 'back',
441
+ });
442
+ const { shellChoice } = await escapeablePrompt([
443
+ {
444
+ type: 'list',
445
+ name: 'shellChoice',
446
+ message: 'Select console option:',
447
+ choices,
448
+ pageSize: getPageSize(),
449
+ },
450
+ ]);
451
+ if (shellChoice === 'back') {
452
+ return;
453
+ }
454
+ // Handle browser option for ClickHouse Play UI
455
+ if (shellChoice === 'browser') {
456
+ if (config.engine === 'clickhouse') {
457
+ // ClickHouse HTTP port is native port + 1 (e.g., 9000 -> 9001)
458
+ const httpPort = config.port + 1;
459
+ const playUrl = `http://127.0.0.1:${httpPort}/play`;
460
+ console.log();
461
+ console.log(uiInfo(`Opening ClickHouse Play UI in browser...`));
462
+ console.log(chalk.gray(` ${playUrl}`));
463
+ console.log();
464
+ openInBrowser(playUrl);
465
+ await pressEnterToContinue();
466
+ }
467
+ else if (config.engine === 'questdb') {
468
+ // QuestDB Web Console on HTTP port (PG port + 188)
469
+ const httpPort = config.port + 188;
470
+ const consoleUrl = `http://127.0.0.1:${httpPort}`;
471
+ console.log();
472
+ console.log(uiInfo(`Opening QuestDB Web Console in browser...`));
473
+ console.log(chalk.gray(` ${consoleUrl}`));
474
+ console.log();
475
+ openInBrowser(consoleUrl);
476
+ await pressEnterToContinue();
477
+ }
478
+ return;
479
+ }
480
+ // Handle DuckDB built-in Web UI (duckdb -ui)
481
+ if (shellChoice === 'duckdb-ui') {
482
+ const duckdbPath = await configManager.getBinaryPath('duckdb');
483
+ if (!duckdbPath) {
484
+ console.error(uiError('DuckDB binary not found. Download it with: spindb engines download duckdb'));
485
+ await pressEnterToContinue();
486
+ return;
487
+ }
488
+ console.log();
489
+ console.log(uiInfo('Launching DuckDB Web UI...'));
490
+ console.log(chalk.gray(' http://localhost:4213'));
491
+ console.log();
492
+ const uiProcess = spawn(duckdbPath, [config.database, '-ui'], {
493
+ stdio: 'inherit',
494
+ });
495
+ await new Promise((resolve) => {
496
+ let settled = false;
497
+ const settle = () => {
498
+ if (!settled) {
499
+ settled = true;
500
+ resolve();
501
+ }
502
+ };
503
+ uiProcess.on('error', (err) => {
504
+ if (err.code === 'ENOENT') {
505
+ console.log(uiWarning('DuckDB binary not found.'));
506
+ }
507
+ else {
508
+ console.log(uiError(`Failed to start DuckDB UI: ${err.message}`));
509
+ }
510
+ settle();
511
+ });
512
+ uiProcess.on('close', () => {
513
+ if (process.stdout.isTTY) {
514
+ process.stdout.write('\x1b[2J\x1b[3J\x1b[H');
515
+ }
516
+ settle();
517
+ });
518
+ });
519
+ return;
520
+ }
521
+ // Handle Qdrant/Meilisearch API info display
522
+ if (shellChoice === 'api-info') {
523
+ console.log();
524
+ if (config.engine === 'qdrant') {
525
+ console.log(chalk.cyan('Qdrant REST API:'));
526
+ console.log(chalk.white(` HTTP: http://127.0.0.1:${config.port}`));
527
+ console.log(chalk.white(` gRPC: 127.0.0.1:${config.port + 1}`));
528
+ console.log();
529
+ console.log(chalk.gray('Example curl commands:'));
530
+ console.log(chalk.gray(` curl http://127.0.0.1:${config.port}/collections`));
531
+ console.log(chalk.gray(` curl http://127.0.0.1:${config.port}/healthz`));
532
+ }
533
+ else if (config.engine === 'meilisearch') {
534
+ console.log(chalk.cyan('Meilisearch REST API:'));
535
+ console.log(chalk.white(` HTTP: http://127.0.0.1:${config.port}`));
536
+ console.log();
537
+ console.log(chalk.gray('Example curl commands:'));
538
+ console.log(chalk.gray(` curl http://127.0.0.1:${config.port}/indexes`));
539
+ console.log(chalk.gray(` curl http://127.0.0.1:${config.port}/health`));
540
+ console.log(chalk.gray(` curl http://127.0.0.1:${config.port}/stats`));
541
+ }
542
+ else if (config.engine === 'influxdb') {
543
+ console.log(chalk.cyan('InfluxDB REST API:'));
544
+ console.log(chalk.white(` HTTP: http://127.0.0.1:${config.port}`));
545
+ console.log();
546
+ console.log(chalk.gray('Example curl commands:'));
547
+ console.log(chalk.gray(` curl http://127.0.0.1:${config.port}/health`));
548
+ console.log(chalk.gray(` curl -H "Content-Type: application/json" http://127.0.0.1:${config.port}/api/v3/query_sql -d '{"db":"mydb","q":"SELECT 1"}'`));
549
+ }
550
+ else if (config.engine === 'weaviate') {
551
+ console.log(chalk.cyan('Weaviate REST API:'));
552
+ console.log(chalk.white(` HTTP: http://127.0.0.1:${config.port}`));
553
+ console.log(chalk.white(` gRPC: 127.0.0.1:${config.port + 1}`));
554
+ console.log();
555
+ console.log(chalk.gray('Example curl commands:'));
556
+ console.log(chalk.gray(` curl http://127.0.0.1:${config.port}/v1/.well-known/ready`));
557
+ console.log(chalk.gray(` curl http://127.0.0.1:${config.port}/v1/schema`));
558
+ }
559
+ else if (config.engine === 'couchdb') {
560
+ console.log(chalk.cyan('CouchDB REST API:'));
561
+ console.log(chalk.white(` HTTP: http://127.0.0.1:${config.port}`));
562
+ console.log(chalk.white(` Fauxton: http://127.0.0.1:${config.port}/_utils`));
563
+ console.log();
564
+ console.log(chalk.cyan('Credentials:'));
565
+ console.log(chalk.white(` Username: admin`));
566
+ console.log(chalk.white(` Password: admin`));
567
+ console.log();
568
+ console.log(chalk.gray('Example curl commands:'));
569
+ console.log(chalk.gray(` curl http://127.0.0.1:${config.port}`));
570
+ console.log(chalk.gray(` curl http://127.0.0.1:${config.port}/_all_dbs`));
571
+ console.log(chalk.gray(` curl -X PUT http://127.0.0.1:${config.port}/mydb`));
572
+ }
573
+ console.log();
574
+ await pressEnterToContinue();
575
+ return;
576
+ }
577
+ if (shellChoice === 'install-pgcli') {
578
+ console.log();
579
+ console.log(uiInfo('Installing pgcli for enhanced PostgreSQL shell...'));
580
+ const pm = await detectPackageManager();
581
+ if (pm) {
582
+ const result = await installPgcli(pm);
583
+ if (result.success) {
584
+ console.log(uiSuccess('pgcli installed successfully!'));
585
+ console.log();
586
+ await launchShell(containerName, config, connectionString, 'pgcli', activeDatabase);
587
+ }
588
+ else {
589
+ console.error(uiError(`Failed to install pgcli: ${result.error}`));
590
+ console.log();
591
+ console.log(chalk.gray('Manual installation:'));
592
+ for (const instruction of getPgcliManualInstructions()) {
593
+ console.log(chalk.cyan(` ${instruction}`));
594
+ }
595
+ console.log();
596
+ await pressEnterToContinue();
597
+ }
598
+ }
599
+ else {
600
+ console.error(uiError('No supported package manager found'));
601
+ console.log();
602
+ console.log(chalk.gray('Manual installation:'));
603
+ for (const instruction of getPgcliManualInstructions()) {
604
+ console.log(chalk.cyan(` ${instruction}`));
605
+ }
606
+ console.log();
607
+ await pressEnterToContinue();
608
+ }
609
+ return;
610
+ }
611
+ if (shellChoice === 'install-mycli') {
612
+ console.log();
613
+ console.log(uiInfo('Installing mycli for enhanced MySQL shell...'));
614
+ const pm = await detectPackageManager();
615
+ if (pm) {
616
+ const result = await installMycli(pm);
617
+ if (result.success) {
618
+ console.log(uiSuccess('mycli installed successfully!'));
619
+ console.log();
620
+ await launchShell(containerName, config, connectionString, 'mycli', activeDatabase);
621
+ }
622
+ else {
623
+ console.error(uiError(`Failed to install mycli: ${result.error}`));
624
+ console.log();
625
+ console.log(chalk.gray('Manual installation:'));
626
+ for (const instruction of getMycliManualInstructions()) {
627
+ console.log(chalk.cyan(` ${instruction}`));
628
+ }
629
+ console.log();
630
+ await pressEnterToContinue();
631
+ }
632
+ }
633
+ else {
634
+ console.error(uiError('No supported package manager found'));
635
+ console.log();
636
+ console.log(chalk.gray('Manual installation:'));
637
+ for (const instruction of getMycliManualInstructions()) {
638
+ console.log(chalk.cyan(` ${instruction}`));
639
+ }
640
+ console.log();
641
+ await pressEnterToContinue();
642
+ }
643
+ return;
644
+ }
645
+ if (shellChoice === 'install-usql') {
646
+ console.log();
647
+ console.log(uiInfo('Installing usql for enhanced shell experience...'));
648
+ const pm = await detectPackageManager();
649
+ if (pm) {
650
+ const result = await installUsql(pm);
651
+ if (result.success) {
652
+ console.log(uiSuccess('usql installed successfully!'));
653
+ console.log();
654
+ await launchShell(containerName, config, connectionString, 'usql', activeDatabase);
655
+ }
656
+ else {
657
+ console.error(uiError(`Failed to install usql: ${result.error}`));
658
+ console.log();
659
+ console.log(chalk.gray('Manual installation:'));
660
+ for (const instruction of getUsqlManualInstructions()) {
661
+ console.log(chalk.cyan(` ${instruction}`));
662
+ }
663
+ console.log();
664
+ await pressEnterToContinue();
665
+ }
666
+ }
667
+ else {
668
+ console.error(uiError('No supported package manager found'));
669
+ console.log();
670
+ console.log(chalk.gray('Manual installation:'));
671
+ for (const instruction of getUsqlManualInstructions()) {
672
+ console.log(chalk.cyan(` ${instruction}`));
673
+ }
674
+ console.log();
675
+ await pressEnterToContinue();
676
+ }
677
+ return;
678
+ }
679
+ if (shellChoice === 'install-litecli') {
680
+ console.log();
681
+ console.log(uiInfo('Installing litecli for enhanced SQLite shell...'));
682
+ const pm = await detectPackageManager();
683
+ if (pm) {
684
+ const result = await installLitecli(pm);
685
+ if (result.success) {
686
+ console.log(uiSuccess('litecli installed successfully!'));
687
+ console.log();
688
+ await launchShell(containerName, config, connectionString, 'litecli', activeDatabase);
689
+ }
690
+ else {
691
+ console.error(uiError(`Failed to install litecli: ${result.error}`));
692
+ console.log();
693
+ console.log(chalk.gray('Manual installation:'));
694
+ for (const instruction of getLitecliManualInstructions()) {
695
+ console.log(chalk.cyan(` ${instruction}`));
696
+ }
697
+ console.log();
698
+ await pressEnterToContinue();
699
+ }
700
+ }
701
+ else {
702
+ console.error(uiError('No supported package manager found'));
703
+ console.log();
704
+ console.log(chalk.gray('Manual installation:'));
705
+ for (const instruction of getLitecliManualInstructions()) {
706
+ console.log(chalk.cyan(` ${instruction}`));
707
+ }
708
+ console.log();
709
+ await pressEnterToContinue();
710
+ }
711
+ return;
712
+ }
713
+ if (shellChoice === 'install-iredis') {
714
+ console.log();
715
+ console.log(uiInfo('Installing iredis for enhanced Redis shell...'));
716
+ const pm = await detectPackageManager();
717
+ if (pm) {
718
+ const result = await installIredis(pm);
719
+ if (result.success) {
720
+ console.log(uiSuccess('iredis installed successfully!'));
721
+ console.log();
722
+ await launchShell(containerName, config, connectionString, 'iredis', activeDatabase);
723
+ }
724
+ else {
725
+ console.error(uiError(`Failed to install iredis: ${result.error}`));
726
+ console.log();
727
+ console.log(chalk.gray('Manual installation:'));
728
+ for (const instruction of getIredisManualInstructions(platformService.getPlatformInfo().platform)) {
729
+ console.log(chalk.cyan(` ${instruction}`));
730
+ }
731
+ console.log();
732
+ await pressEnterToContinue();
733
+ }
734
+ }
735
+ else {
736
+ console.error(uiError('No supported package manager found'));
737
+ console.log();
738
+ console.log(chalk.gray('Manual installation:'));
739
+ for (const instruction of getIredisManualInstructions(platformService.getPlatformInfo().platform)) {
740
+ console.log(chalk.cyan(` ${instruction}`));
741
+ }
742
+ console.log();
743
+ await pressEnterToContinue();
744
+ }
745
+ return;
746
+ }
747
+ // Handle dblab download → launch immediately after install
748
+ if (shellChoice === 'install-dblab') {
749
+ const dblabBinaryPath = await downloadDblabCli();
750
+ if (dblabBinaryPath) {
751
+ await launchDblab(config, activeDatabase);
752
+ }
753
+ return;
754
+ }
755
+ // Handle dblab launch
756
+ if (shellChoice === 'dblab') {
757
+ await launchDblab(config, activeDatabase);
758
+ return;
759
+ }
760
+ // Handle pgweb download → launch immediately after install
761
+ if (shellChoice === 'install-pgweb') {
762
+ const pgwebBinaryPath = await downloadPgweb();
763
+ if (pgwebBinaryPath) {
764
+ await launchPgweb(containerName, config, activeDatabase);
765
+ }
766
+ return;
767
+ }
768
+ // Handle pgweb launch
769
+ if (shellChoice === 'pgweb') {
770
+ await launchPgweb(containerName, config, activeDatabase);
771
+ return;
772
+ }
773
+ // Handle pgweb stop
774
+ if (shellChoice === 'stop-pgweb') {
775
+ await stopPgwebProcess(containerName, config.engine);
776
+ return;
777
+ }
778
+ // Handle install-webui option for Qdrant
779
+ if (shellChoice === 'install-webui') {
780
+ if (config.engine === 'qdrant') {
781
+ await downloadQdrantWebUI(config.name);
782
+ }
783
+ return;
784
+ }
785
+ await launchShell(containerName, config, connectionString, shellChoice, activeDatabase);
786
+ }
787
+ /**
788
+ * Download and install Qdrant Web UI from GitHub releases
789
+ */
790
+ async function downloadQdrantWebUI(containerName) {
791
+ console.log();
792
+ const spinner = createSpinner('Downloading Qdrant Web UI...');
793
+ spinner.start();
794
+ try {
795
+ // Get latest release info from GitHub
796
+ const releaseUrl = 'https://api.github.com/repos/qdrant/qdrant-web-ui/releases/latest';
797
+ const releaseResponse = await fetch(releaseUrl, {
798
+ headers: { 'User-Agent': 'spindb' },
799
+ });
800
+ if (!releaseResponse.ok) {
801
+ throw new Error(`Failed to fetch release info: ${releaseResponse.status}`);
802
+ }
803
+ const releaseData = (await releaseResponse.json());
804
+ // Find dist-qdrant.zip asset
805
+ const zipAsset = releaseData.assets.find((a) => a.name === 'dist-qdrant.zip');
806
+ if (!zipAsset) {
807
+ throw new Error('Could not find dist-qdrant.zip in latest release');
808
+ }
809
+ spinner.text = `Downloading Qdrant Web UI ${releaseData.tag_name}...`;
810
+ // Download the zip file
811
+ const downloadResponse = await fetch(zipAsset.browser_download_url);
812
+ if (!downloadResponse.ok || !downloadResponse.body) {
813
+ throw new Error(`Failed to download: ${downloadResponse.status}`);
814
+ }
815
+ // Get container directory and create static folder
816
+ const containerDir = paths.getContainerPath(containerName, {
817
+ engine: 'qdrant',
818
+ });
819
+ const staticDir = join(containerDir, 'static');
820
+ // Remove existing static dir if present
821
+ await rm(staticDir, { recursive: true, force: true });
822
+ await mkdir(staticDir, { recursive: true });
823
+ spinner.text = 'Extracting Web UI...';
824
+ // Save and extract zip
825
+ const tempZip = join(containerDir, 'webui-temp.zip');
826
+ const buffer = Buffer.from(await downloadResponse.arrayBuffer());
827
+ await writeFile(tempZip, buffer);
828
+ try {
829
+ // Extract zip - the zip contains a 'dist' folder, we need its contents
830
+ const unzipper = await import('unzipper');
831
+ const directory = await unzipper.Open.file(tempZip);
832
+ // Resolve staticDir to absolute path for zip-slip protection
833
+ const resolvedStaticDir = resolve(staticDir);
834
+ for (const entry of directory.files) {
835
+ // Skip directories and files not in dist/
836
+ if (entry.type === 'Directory')
837
+ continue;
838
+ if (!entry.path.startsWith('dist/'))
839
+ continue;
840
+ // Remove 'dist/' prefix to get relative path
841
+ const relativePath = entry.path.replace(/^dist\//, '');
842
+ if (!relativePath)
843
+ continue;
844
+ // Zip-slip protection: ensure resolved path is within staticDir
845
+ // Use path.sep for platform-safe comparison (backslash on Windows, forward slash on Unix)
846
+ const targetPath = resolve(staticDir, relativePath);
847
+ if (!targetPath.startsWith(resolvedStaticDir + sep)) {
848
+ // Path traversal attempt - skip this entry
849
+ continue;
850
+ }
851
+ const targetDir = dirname(targetPath);
852
+ await mkdir(targetDir, { recursive: true });
853
+ const content = await entry.buffer();
854
+ await writeFile(targetPath, content);
855
+ }
856
+ }
857
+ finally {
858
+ // Clean up temp zip even if extraction fails
859
+ await rm(tempZip, { force: true });
860
+ }
861
+ spinner.succeed(`Qdrant Web UI ${releaseData.tag_name} installed`);
862
+ console.log();
863
+ console.log(uiWarning('Restart Qdrant for the Web UI to take effect:'));
864
+ console.log(chalk.gray(` spindb stop ${containerName} && spindb start ${containerName}`));
865
+ console.log();
866
+ }
867
+ catch (error) {
868
+ spinner.fail('Failed to download Qdrant Web UI');
869
+ console.error(uiError(error.message));
870
+ console.log();
871
+ console.log(chalk.gray('You can manually download from:'));
872
+ console.log(chalk.cyan(' https://github.com/qdrant/qdrant-web-ui/releases'));
873
+ console.log(chalk.gray(`\nExtract dist-qdrant.zip contents to:`));
874
+ console.log(chalk.cyan(` ${paths.getContainerPath(containerName, { engine: 'qdrant' })}/static/`));
875
+ console.log();
876
+ }
877
+ await pressEnterToContinue();
878
+ }
879
+ /**
880
+ * Stop a running pgweb process for a container (with UI feedback)
881
+ */
882
+ export async function stopPgwebProcess(containerName, engine) {
883
+ const stopped = await stopPgweb(containerName, engine);
884
+ console.log();
885
+ if (stopped) {
886
+ console.log(uiSuccess('pgweb stopped'));
887
+ }
888
+ else {
889
+ console.log(uiInfo('pgweb is not running'));
890
+ }
891
+ console.log();
892
+ await pressEnterToContinue();
893
+ }
894
+ /**
895
+ * Download and install pgweb from GitHub releases
896
+ */
897
+ async function downloadPgweb() {
898
+ console.log();
899
+ const spinner = createSpinner('Downloading pgweb...');
900
+ spinner.start();
901
+ try {
902
+ const platform = process.platform;
903
+ const arch = process.arch;
904
+ let suffix;
905
+ if (platform === 'darwin' && arch === 'arm64') {
906
+ suffix = 'darwin_arm64';
907
+ }
908
+ else if (platform === 'darwin' && arch === 'x64') {
909
+ suffix = 'darwin_amd64';
910
+ }
911
+ else if (platform === 'linux' && arch === 'arm64') {
912
+ suffix = 'linux_arm64';
913
+ }
914
+ else if (platform === 'linux' && arch === 'x64') {
915
+ suffix = 'linux_amd64';
916
+ }
917
+ else if (platform === 'win32' && arch === 'x64') {
918
+ suffix = 'windows_amd64.exe';
919
+ }
920
+ else {
921
+ throw new Error(`Unsupported platform: ${platform} ${arch}`);
922
+ }
923
+ const zipUrl = `https://github.com/sosedoff/pgweb/releases/download/v${PGWEB_VERSION}/pgweb_${suffix}.zip`;
924
+ spinner.text = `Downloading pgweb v${PGWEB_VERSION}...`;
925
+ const response = await fetch(zipUrl);
926
+ if (!response.ok || !response.body) {
927
+ throw new Error(`Failed to download: ${response.status}`);
928
+ }
929
+ const isWin = platform === 'win32';
930
+ const binaryName = isWin ? 'pgweb.exe' : 'pgweb';
931
+ const platformArch = `${platform}-${arch}`;
932
+ const installDir = join(paths.bin, `pgweb-${PGWEB_VERSION}-${platformArch}`, 'bin');
933
+ await mkdir(installDir, { recursive: true });
934
+ const tempZip = join(paths.bin, 'pgweb-temp.zip');
935
+ const buffer = Buffer.from(await response.arrayBuffer());
936
+ await writeFile(tempZip, buffer);
937
+ spinner.text = 'Extracting pgweb...';
938
+ try {
939
+ const unzipper = await import('unzipper');
940
+ const directory = await unzipper.Open.file(tempZip);
941
+ const resolvedInstallDir = resolve(installDir);
942
+ let extracted = false;
943
+ for (const entry of directory.files) {
944
+ if (entry.type === 'Directory')
945
+ continue;
946
+ // Zip-slip protection
947
+ const targetPath = resolve(installDir, binaryName);
948
+ if (!targetPath.startsWith(resolvedInstallDir + sep)) {
949
+ continue;
950
+ }
951
+ // The zip contains the binary (possibly named pgweb_<platform>_<arch> or pgweb_<platform>_<arch>.exe)
952
+ const content = await entry.buffer();
953
+ await writeFile(targetPath, content);
954
+ extracted = true;
955
+ break; // Only one file in the zip
956
+ }
957
+ if (!extracted) {
958
+ throw new Error('Could not find pgweb binary in zip archive');
959
+ }
960
+ }
961
+ finally {
962
+ await rm(tempZip, { force: true });
963
+ }
964
+ const binaryPath = join(installDir, binaryName);
965
+ // chmod on Unix
966
+ if (!isWin) {
967
+ await chmod(binaryPath, 0o755);
968
+ }
969
+ // Register in config
970
+ await configManager.setBinaryPath('pgweb', binaryPath, 'bundled');
971
+ spinner.succeed(`pgweb v${PGWEB_VERSION} installed`);
972
+ console.log();
973
+ return binaryPath;
974
+ }
975
+ catch (error) {
976
+ spinner.fail('Failed to download pgweb');
977
+ console.error(uiError(error.message));
978
+ console.log();
979
+ console.log(chalk.gray('You can manually download from:'));
980
+ console.log(chalk.cyan(' https://github.com/sosedoff/pgweb/releases'));
981
+ console.log();
982
+ await pressEnterToContinue();
983
+ return null;
984
+ }
985
+ }
986
+ /**
987
+ * Download and install dblab from GitHub releases.
988
+ * Exported as downloadDblabCli for use from the CLI connect command.
989
+ */
990
+ export async function downloadDblabCli() {
991
+ console.log();
992
+ const spinner = createSpinner('Downloading dblab...');
993
+ spinner.start();
994
+ try {
995
+ const suffix = getDblabPlatformSuffix();
996
+ const tarUrl = `https://github.com/danvergara/dblab/releases/download/v${DBLAB_VERSION}/dblab_${DBLAB_VERSION}_${suffix}.tar.gz`;
997
+ spinner.text = `Downloading dblab v${DBLAB_VERSION}...`;
998
+ const response = await fetch(tarUrl);
999
+ if (!response.ok || !response.body) {
1000
+ throw new Error(`Failed to download: ${response.status}`);
1001
+ }
1002
+ const isWin = process.platform === 'win32';
1003
+ const binaryName = isWin ? 'dblab.exe' : 'dblab';
1004
+ const platformArch = `${process.platform}-${process.arch}`;
1005
+ const installDir = join(paths.bin, `dblab-${DBLAB_VERSION}-${platformArch}`, 'bin');
1006
+ await mkdir(installDir, { recursive: true });
1007
+ const tempTar = join(paths.bin, 'dblab-temp.tar.gz');
1008
+ const buffer = Buffer.from(await response.arrayBuffer());
1009
+ await writeFile(tempTar, buffer);
1010
+ spinner.text = 'Extracting dblab...';
1011
+ try {
1012
+ const { spawnSync } = await import('child_process');
1013
+ const result = spawnSync('tar', ['-xzf', tempTar, '-C', installDir], {
1014
+ stdio: 'pipe',
1015
+ });
1016
+ if (result.status !== 0) {
1017
+ throw new Error(`tar extraction failed: ${result.stderr?.toString() || 'unknown error'}`);
1018
+ }
1019
+ }
1020
+ finally {
1021
+ await rm(tempTar, { force: true });
1022
+ }
1023
+ const binaryPath = join(installDir, binaryName);
1024
+ if (!existsSync(binaryPath)) {
1025
+ throw new Error('Could not find dblab binary after extraction');
1026
+ }
1027
+ // chmod on Unix
1028
+ if (!isWin) {
1029
+ await chmod(binaryPath, 0o755);
1030
+ }
1031
+ // Register in config
1032
+ await configManager.setBinaryPath('dblab', binaryPath, 'bundled');
1033
+ spinner.succeed(`dblab v${DBLAB_VERSION} installed`);
1034
+ console.log();
1035
+ return binaryPath;
1036
+ }
1037
+ catch (error) {
1038
+ spinner.fail('Failed to download dblab');
1039
+ console.error(uiError(error.message));
1040
+ console.log();
1041
+ console.log(chalk.gray('You can manually download from:'));
1042
+ console.log(chalk.cyan(' https://github.com/danvergara/dblab/releases'));
1043
+ console.log();
1044
+ await pressEnterToContinue();
1045
+ return null;
1046
+ }
1047
+ }
1048
+ /**
1049
+ * Launch dblab visual TUI for a container
1050
+ */
1051
+ async function launchDblab(config, database) {
1052
+ const dblabPath = await configManager.getBinaryPath('dblab');
1053
+ if (!dblabPath) {
1054
+ console.error(uiError('dblab not found. Download it first.'));
1055
+ await pressEnterToContinue();
1056
+ return;
1057
+ }
1058
+ const args = getDblabArgs(config, database);
1059
+ console.log();
1060
+ console.log(chalk.gray(' dblab keybindings:'));
1061
+ console.log(chalk.gray(' Ctrl+Space: run query | Ctrl+H/J/K/L: navigate panels | Ctrl+S: structure view'));
1062
+ console.log();
1063
+ await escapeablePrompt([
1064
+ {
1065
+ type: 'input',
1066
+ name: 'continue',
1067
+ message: chalk.gray('Press Enter to launch dblab...'),
1068
+ },
1069
+ ]);
1070
+ const dblabProcess = spawn(dblabPath, args, {
1071
+ stdio: 'inherit',
1072
+ });
1073
+ await new Promise((resolve) => {
1074
+ let settled = false;
1075
+ const settle = () => {
1076
+ if (!settled) {
1077
+ settled = true;
1078
+ resolve();
1079
+ }
1080
+ };
1081
+ dblabProcess.on('error', (err) => {
1082
+ if (err.code === 'ENOENT') {
1083
+ console.log(uiWarning('dblab not found on your system.'));
1084
+ console.log();
1085
+ console.log(chalk.gray(' Download it with:'));
1086
+ console.log(chalk.cyan(' spindb connect --install-dblab'));
1087
+ }
1088
+ else {
1089
+ console.log(uiError(`Failed to start dblab: ${err.message}`));
1090
+ }
1091
+ settle();
1092
+ });
1093
+ dblabProcess.on('close', () => {
1094
+ if (process.stdout.isTTY) {
1095
+ process.stdout.write('\x1b[2J\x1b[3J\x1b[H');
1096
+ }
1097
+ settle();
1098
+ });
1099
+ });
1100
+ }
1101
+ /**
1102
+ * Launch pgweb for a PostgreSQL-compatible container
1103
+ */
1104
+ async function launchPgweb(containerName, config, database) {
1105
+ const pgwebPath = await configManager.getBinaryPath('pgweb');
1106
+ if (!pgwebPath) {
1107
+ console.error(uiError('pgweb not found. Download it first.'));
1108
+ await pressEnterToContinue();
1109
+ return;
1110
+ }
1111
+ const containerDir = paths.getContainerPath(containerName, {
1112
+ engine: config.engine,
1113
+ });
1114
+ const pidFile = join(containerDir, 'pgweb.pid');
1115
+ const portFile = join(containerDir, 'pgweb.port');
1116
+ // Check if already running — just open browser
1117
+ const status = await getPgwebStatus(containerName, config.engine);
1118
+ if (status.running && status.port) {
1119
+ const url = `http://127.0.0.1:${status.port}`;
1120
+ console.log();
1121
+ console.log(uiInfo(`Opening pgweb`));
1122
+ console.log(chalk.gray(` ${url}`));
1123
+ console.log();
1124
+ openInBrowser(url);
1125
+ await pressEnterToContinue();
1126
+ return;
1127
+ }
1128
+ // Find available port starting at 8081
1129
+ let port = 8081;
1130
+ while (!(await portManager.isPortAvailable(port)) && port < 8200) {
1131
+ port++;
1132
+ }
1133
+ if (port >= 8200) {
1134
+ console.error(uiError('Could not find an available port for pgweb (scanned 8081–8199). ' +
1135
+ 'Check for other pgweb or server processes using those ports.'));
1136
+ await pressEnterToContinue();
1137
+ return;
1138
+ }
1139
+ // Build connection URL
1140
+ let connectionUrl;
1141
+ if (config.engine === 'ferretdb') {
1142
+ // FerretDB has a PostgreSQL backend on backendPort — always connects to 'ferretdb' database
1143
+ if (!config.backendPort) {
1144
+ console.log();
1145
+ console.error(uiError('PostgreSQL backend port not set — restart the container first'));
1146
+ console.log();
1147
+ await pressEnterToContinue();
1148
+ return;
1149
+ }
1150
+ connectionUrl = `postgresql://postgres@127.0.0.1:${config.backendPort}/ferretdb?sslmode=disable`;
1151
+ }
1152
+ else if (config.engine === 'cockroachdb') {
1153
+ connectionUrl = `postgresql://root@127.0.0.1:${config.port}/${database}?sslmode=disable`;
1154
+ }
1155
+ else {
1156
+ connectionUrl = `postgresql://postgres@127.0.0.1:${config.port}/${database}?sslmode=disable`;
1157
+ }
1158
+ // Spawn pgweb detached
1159
+ const pgwebProcess = spawn(pgwebPath, ['--url', connectionUrl, '--bind', '127.0.0.1', '--listen', String(port)], {
1160
+ stdio: ['ignore', 'ignore', 'ignore'],
1161
+ detached: true,
1162
+ });
1163
+ pgwebProcess.unref();
1164
+ // Write PID and port files
1165
+ if (pgwebProcess.pid) {
1166
+ await writeFile(pidFile, String(pgwebProcess.pid));
1167
+ await writeFile(portFile, String(port));
1168
+ }
1169
+ // Brief wait for startup
1170
+ await new Promise((resolve) => setTimeout(resolve, 1000));
1171
+ const url = `http://127.0.0.1:${port}`;
1172
+ console.log();
1173
+ console.log(uiSuccess(`pgweb started on ${url}`));
1174
+ console.log(chalk.gray(` PID: ${pgwebProcess.pid}`));
1175
+ console.log();
1176
+ openInBrowser(url);
1177
+ await pressEnterToContinue();
1178
+ }
1179
+ async function launchShell(containerName, config, connectionString, shellType, database) {
1180
+ console.log(uiInfo(`Connecting to ${containerName}...`));
1181
+ console.log();
1182
+ let shellCmd;
1183
+ let shellArgs;
1184
+ let installHint;
1185
+ let spawnCwd;
1186
+ if (shellType === 'pgcli') {
1187
+ // pgcli accepts connection strings
1188
+ shellCmd = 'pgcli';
1189
+ shellArgs = [connectionString];
1190
+ installHint = 'brew install pgcli';
1191
+ }
1192
+ else if (shellType === 'mycli') {
1193
+ // mycli: mycli -h host -P port -u user database
1194
+ shellCmd = 'mycli';
1195
+ shellArgs = [
1196
+ '-h',
1197
+ '127.0.0.1',
1198
+ '-P',
1199
+ String(config.port),
1200
+ '-u',
1201
+ 'root',
1202
+ database,
1203
+ ];
1204
+ installHint = 'brew install mycli';
1205
+ }
1206
+ else if (shellType === 'litecli') {
1207
+ // litecli takes the database file path directly
1208
+ shellCmd = 'litecli';
1209
+ shellArgs = [config.database];
1210
+ installHint = 'brew install litecli';
1211
+ }
1212
+ else if (shellType === 'usql') {
1213
+ // usql accepts connection strings directly for PostgreSQL, MySQL, and SQLite
1214
+ shellCmd = 'usql';
1215
+ shellArgs = [connectionString];
1216
+ installHint = 'brew tap xo/xo && brew install xo/xo/usql';
1217
+ }
1218
+ else if (config.engine === 'sqlite') {
1219
+ // Default SQLite shell
1220
+ shellCmd = 'sqlite3';
1221
+ shellArgs = [config.database];
1222
+ installHint = 'brew install sqlite3';
1223
+ }
1224
+ else if (config.engine === 'duckdb') {
1225
+ // DuckDB shell
1226
+ const duckdbPath = await configManager.getBinaryPath('duckdb');
1227
+ shellCmd = duckdbPath || 'duckdb';
1228
+ shellArgs = [config.database];
1229
+ installHint = 'spindb engines download duckdb';
1230
+ }
1231
+ else if (config.engine === 'mysql') {
1232
+ // MySQL uses downloaded binaries - get the actual path
1233
+ const mysqlPath = await configManager.getBinaryPath('mysql');
1234
+ shellCmd = mysqlPath || 'mysql';
1235
+ shellArgs = [
1236
+ '-u',
1237
+ 'root',
1238
+ '-h',
1239
+ '127.0.0.1',
1240
+ '-P',
1241
+ String(config.port),
1242
+ database,
1243
+ ];
1244
+ installHint = 'spindb engines download mysql';
1245
+ }
1246
+ else if (config.engine === 'mariadb') {
1247
+ // MariaDB uses downloaded binaries, not system PATH - get the actual path
1248
+ const mariadbPath = await configManager.getBinaryPath('mariadb');
1249
+ shellCmd = mariadbPath || 'mariadb';
1250
+ shellArgs = [
1251
+ '-u',
1252
+ 'root',
1253
+ '-h',
1254
+ '127.0.0.1',
1255
+ '-P',
1256
+ String(config.port),
1257
+ database,
1258
+ ];
1259
+ installHint = 'spindb engines download mariadb';
1260
+ }
1261
+ else if (config.engine === 'mongodb' || config.engine === 'ferretdb') {
1262
+ shellCmd = 'mongosh';
1263
+ shellArgs = [connectionString];
1264
+ installHint = 'brew install mongosh';
1265
+ }
1266
+ else if (shellType === 'iredis') {
1267
+ // iredis: enhanced Redis CLI
1268
+ shellCmd = 'iredis';
1269
+ shellArgs = ['-h', '127.0.0.1', '-p', String(config.port), '-n', database];
1270
+ installHint = 'brew install iredis';
1271
+ }
1272
+ else if (config.engine === 'redis') {
1273
+ // Default Redis shell
1274
+ shellCmd = 'redis-cli';
1275
+ shellArgs = ['-h', '127.0.0.1', '-p', String(config.port), '-n', database];
1276
+ installHint = 'brew install redis';
1277
+ }
1278
+ else if (config.engine === 'valkey') {
1279
+ // Default Valkey shell
1280
+ const valkeyCliPath = await configManager.getBinaryPath('valkey-cli');
1281
+ shellCmd = valkeyCliPath || 'valkey-cli';
1282
+ shellArgs = ['-h', '127.0.0.1', '-p', String(config.port), '-n', database];
1283
+ installHint = 'spindb engines download valkey';
1284
+ }
1285
+ else if (config.engine === 'clickhouse') {
1286
+ // ClickHouse uses a unified binary with subcommands
1287
+ const clickhousePath = await configManager.getBinaryPath('clickhouse');
1288
+ shellCmd = clickhousePath || 'clickhouse';
1289
+ shellArgs = [
1290
+ 'client',
1291
+ '--host',
1292
+ '127.0.0.1',
1293
+ '--port',
1294
+ String(config.port),
1295
+ '--database',
1296
+ database,
1297
+ ];
1298
+ installHint = 'spindb engines download clickhouse';
1299
+ }
1300
+ else if (config.engine === 'qdrant') {
1301
+ // Qdrant: Open Web UI in browser (only shown when Web UI is installed)
1302
+ const dashboardUrl = `http://127.0.0.1:${config.port}/dashboard`;
1303
+ console.log(uiInfo(`Opening Qdrant Dashboard in browser...`));
1304
+ console.log(chalk.gray(` ${dashboardUrl}`));
1305
+ console.log();
1306
+ openInBrowser(dashboardUrl);
1307
+ await pressEnterToContinue();
1308
+ return;
1309
+ }
1310
+ else if (config.engine === 'meilisearch') {
1311
+ // Meilisearch: Open dashboard in browser (served at root URL)
1312
+ const dashboardUrl = `http://127.0.0.1:${config.port}`;
1313
+ console.log(uiInfo(`Opening Meilisearch Dashboard in browser...`));
1314
+ console.log(chalk.gray(` ${dashboardUrl}`));
1315
+ console.log();
1316
+ openInBrowser(dashboardUrl);
1317
+ await pressEnterToContinue();
1318
+ return;
1319
+ }
1320
+ else if (config.engine === 'weaviate') {
1321
+ // Weaviate: Open REST API root in browser
1322
+ const dashboardUrl = `http://127.0.0.1:${config.port}`;
1323
+ console.log(uiInfo(`Opening Weaviate in browser...`));
1324
+ console.log(chalk.gray(` ${dashboardUrl}`));
1325
+ console.log();
1326
+ openInBrowser(dashboardUrl);
1327
+ await pressEnterToContinue();
1328
+ return;
1329
+ }
1330
+ else if (config.engine === 'influxdb') {
1331
+ // InfluxDB: influxdb3 query is one-shot (no REPL), use interactive loop
1332
+ const engine = getEngine(config.engine);
1333
+ const influxdbPath = await engine
1334
+ .getInfluxDBPath(config.version)
1335
+ .catch(() => null);
1336
+ if (!influxdbPath) {
1337
+ console.log(uiWarning('influxdb3 not found. Run: spindb engines download influxdb'));
1338
+ await pressEnterToContinue();
1339
+ return;
1340
+ }
1341
+ // Query available databases from the REST API
1342
+ let db = database || config.name;
1343
+ try {
1344
+ const resp = await fetch(`http://127.0.0.1:${config.port}/api/v3/configure/database?format=json`);
1345
+ if (resp.ok) {
1346
+ const databases = (await resp.json());
1347
+ const dbNames = databases
1348
+ .map((d) => d['iox::database'] || d.name)
1349
+ .filter((n) => n && n !== '_internal');
1350
+ if (dbNames.length === 0) {
1351
+ console.log(uiWarning('No databases exist yet. Write data first to create a database.'));
1352
+ console.log(chalk.gray(` curl -X POST "http://127.0.0.1:${config.port}/api/v3/write_lp?db=${db}" -H "Content-Type: text/plain" -d 'measurement,tag=value field=1'`));
1353
+ console.log();
1354
+ await pressEnterToContinue();
1355
+ return;
1356
+ }
1357
+ if (!dbNames.includes(db)) {
1358
+ if (dbNames.length === 1) {
1359
+ db = dbNames[0];
1360
+ }
1361
+ else {
1362
+ const { chosenDb } = await escapeablePrompt([
1363
+ {
1364
+ type: 'list',
1365
+ name: 'chosenDb',
1366
+ message: 'Select database:',
1367
+ choices: dbNames,
1368
+ },
1369
+ ]);
1370
+ db = chosenDb;
1371
+ }
1372
+ }
1373
+ }
1374
+ }
1375
+ catch {
1376
+ // Server may not support this endpoint; proceed with default db
1377
+ }
1378
+ console.log(chalk.cyan(`InfluxDB SQL Console (${db})`));
1379
+ console.log(chalk.gray(` Type SQL queries, or "exit" to quit.\n`));
1380
+ let running = true;
1381
+ while (running) {
1382
+ const { sql } = await escapeablePrompt([
1383
+ {
1384
+ type: 'input',
1385
+ name: 'sql',
1386
+ message: chalk.blue('sql>'),
1387
+ },
1388
+ ]);
1389
+ const trimmed = (sql || '').trim();
1390
+ if (trimmed.toLowerCase() === 'exit' ||
1391
+ trimmed.toLowerCase() === 'quit') {
1392
+ running = false;
1393
+ break;
1394
+ }
1395
+ if (!trimmed) {
1396
+ continue;
1397
+ }
1398
+ const queryProcess = spawn(influxdbPath, [
1399
+ 'query',
1400
+ '--host',
1401
+ `http://127.0.0.1:${config.port}`,
1402
+ '--database',
1403
+ db,
1404
+ '--',
1405
+ trimmed,
1406
+ ], { stdio: 'inherit' });
1407
+ await new Promise((resolve) => {
1408
+ queryProcess.on('error', (err) => {
1409
+ console.error(uiError(`Query failed: ${err.message}`));
1410
+ resolve();
1411
+ });
1412
+ queryProcess.on('close', () => {
1413
+ logDebug('influxdb query process exited');
1414
+ resolve();
1415
+ });
1416
+ });
1417
+ }
1418
+ return;
1419
+ }
1420
+ else if (config.engine === 'couchdb') {
1421
+ // CouchDB: Open Fauxton dashboard in browser (served at /_utils)
1422
+ const dashboardUrl = `http://127.0.0.1:${config.port}/_utils`;
1423
+ console.log();
1424
+ console.log(chalk.cyan('CouchDB Fauxton Dashboard'));
1425
+ console.log(chalk.gray(` ${dashboardUrl}`));
1426
+ console.log();
1427
+ console.log(chalk.cyan('Credentials (if prompted):'));
1428
+ console.log(chalk.white(` Username: admin`));
1429
+ console.log(chalk.white(` Password: admin`));
1430
+ console.log();
1431
+ // Prompt before opening so user can see credentials
1432
+ await escapeablePrompt([
1433
+ {
1434
+ type: 'input',
1435
+ name: 'continue',
1436
+ message: chalk.gray('Press Enter to open in browser...'),
1437
+ },
1438
+ ]);
1439
+ openInBrowser(dashboardUrl);
1440
+ return;
1441
+ }
1442
+ else if (config.engine === 'surrealdb') {
1443
+ // SurrealDB uses surreal sql command
1444
+ const engine = getEngine(config.engine);
1445
+ const surrealPath = await engine
1446
+ .getSurrealPath(config.version)
1447
+ .catch(() => 'surreal');
1448
+ const namespace = config.name.replace(/-/g, '_');
1449
+ shellCmd = surrealPath;
1450
+ shellArgs = [
1451
+ 'sql',
1452
+ '--endpoint',
1453
+ `ws://127.0.0.1:${config.port}`,
1454
+ '--namespace',
1455
+ namespace,
1456
+ '--database',
1457
+ database || 'default',
1458
+ '--username',
1459
+ 'root',
1460
+ '--password',
1461
+ 'root',
1462
+ ];
1463
+ installHint = 'spindb engines download surrealdb';
1464
+ // SurrealDB writes history.txt to cwd - use container directory
1465
+ spawnCwd = join(paths.containers, 'surrealdb', config.name);
1466
+ }
1467
+ else if (config.engine === 'cockroachdb') {
1468
+ // CockroachDB uses cockroach sql command
1469
+ const engine = getEngine(config.engine);
1470
+ const cockroachPath = await engine
1471
+ .getCockroachPath(config.version)
1472
+ .catch(() => 'cockroach');
1473
+ shellCmd = cockroachPath;
1474
+ shellArgs = [
1475
+ 'sql',
1476
+ '--insecure',
1477
+ '--host',
1478
+ `127.0.0.1:${config.port}`,
1479
+ '--database',
1480
+ database,
1481
+ ];
1482
+ installHint = 'spindb engines download cockroachdb';
1483
+ }
1484
+ else if (config.engine === 'questdb') {
1485
+ // QuestDB uses PostgreSQL wire protocol on port 8812
1486
+ // Default credentials: admin/quest
1487
+ shellCmd = 'psql';
1488
+ const db = database || 'qdb';
1489
+ // QuestDB connection string with explicit password
1490
+ const questDbConnStr = `postgresql://admin:quest@127.0.0.1:${config.port}/${db}`;
1491
+ shellArgs = [questDbConnStr];
1492
+ installHint = 'brew install libpq && brew link --force libpq';
1493
+ }
1494
+ else if (config.engine === 'typedb') {
1495
+ // TypeDB uses typedb console with address and tls-disabled flags
1496
+ const engine = getEngine(config.engine);
1497
+ const consolePath = await engine
1498
+ .getTypeDBConsolePath(config.version)
1499
+ .catch(() => null);
1500
+ if (consolePath) {
1501
+ shellCmd = consolePath;
1502
+ shellArgs = getConsoleBaseArgs(config.port);
1503
+ }
1504
+ else {
1505
+ // Fallback: use the typedb launcher with 'console' subcommand
1506
+ shellCmd = 'typedb';
1507
+ shellArgs = ['console', ...getConsoleBaseArgs(config.port)];
1508
+ }
1509
+ installHint = 'spindb engines download typedb';
1510
+ }
1511
+ else if (config.engine === 'tigerbeetle') {
1512
+ // TigerBeetle uses tigerbeetle repl command
1513
+ // Cluster ID 0 is the default for local single-node development.
1514
+ // TigerBeetle format/start also use cluster 0 (see engines/tigerbeetle/index.ts).
1515
+ const clusterId = 0;
1516
+ const engine = getEngine(config.engine);
1517
+ const tigerbeetlePath = await engine
1518
+ .getTigerBeetlePath(config.version)
1519
+ .catch(() => null);
1520
+ shellCmd = tigerbeetlePath || 'tigerbeetle';
1521
+ shellArgs = [
1522
+ 'repl',
1523
+ `--cluster=${clusterId}`,
1524
+ `--addresses=127.0.0.1:${config.port}`,
1525
+ ];
1526
+ installHint = 'spindb engines download tigerbeetle';
1527
+ }
1528
+ else {
1529
+ // PostgreSQL default shell - look up downloaded binary path
1530
+ const psqlPath = await configManager.getBinaryPath('psql');
1531
+ shellCmd = psqlPath || 'psql';
1532
+ shellArgs = [connectionString];
1533
+ installHint = 'spindb engines download postgresql';
1534
+ }
1535
+ const shellProcess = spawn(shellCmd, shellArgs, {
1536
+ stdio: 'inherit',
1537
+ cwd: spawnCwd,
1538
+ });
1539
+ await new Promise((resolve) => {
1540
+ let settled = false;
1541
+ const settle = () => {
1542
+ if (!settled) {
1543
+ settled = true;
1544
+ resolve();
1545
+ }
1546
+ };
1547
+ shellProcess.on('error', (err) => {
1548
+ if (err.code === 'ENOENT') {
1549
+ console.log(uiWarning(`${shellCmd} not found on your system.`));
1550
+ console.log();
1551
+ console.log(chalk.gray(' Connect manually with:'));
1552
+ console.log(chalk.cyan(` ${connectionString}`));
1553
+ console.log();
1554
+ console.log(chalk.gray(` Install ${shellCmd}:`));
1555
+ console.log(chalk.cyan(` ${installHint}`));
1556
+ }
1557
+ else {
1558
+ console.log(uiError(`Failed to start ${shellCmd}: ${err.message}`));
1559
+ }
1560
+ settle();
1561
+ });
1562
+ shellProcess.on('close', () => {
1563
+ // Clear terminal to remove any residual graphics from shells (e.g., usql logo)
1564
+ // Use aggressive ANSI sequences: clear screen + scrollback + reset cursor
1565
+ // Only emit ANSI escape codes when output is a TTY
1566
+ if (process.stdout.isTTY) {
1567
+ process.stdout.write('\x1b[2J\x1b[3J\x1b[H');
1568
+ }
1569
+ settle();
1570
+ });
1571
+ });
1572
+ }
1573
+ //# sourceMappingURL=shell-handlers.js.map