clawsql 0.1.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 (311) hide show
  1. package/.env.example +97 -0
  2. package/README.md +372 -0
  3. package/dist/__tests__/config/settings.test.d.ts +5 -0
  4. package/dist/__tests__/config/settings.test.d.ts.map +1 -0
  5. package/dist/__tests__/config/settings.test.js +154 -0
  6. package/dist/__tests__/config/settings.test.js.map +1 -0
  7. package/dist/__tests__/core/discovery/topology.test.d.ts +5 -0
  8. package/dist/__tests__/core/discovery/topology.test.d.ts.map +1 -0
  9. package/dist/__tests__/core/discovery/topology.test.js +191 -0
  10. package/dist/__tests__/core/discovery/topology.test.js.map +1 -0
  11. package/dist/__tests__/core/failover/executor.test.d.ts +5 -0
  12. package/dist/__tests__/core/failover/executor.test.d.ts.map +1 -0
  13. package/dist/__tests__/core/failover/executor.test.js +256 -0
  14. package/dist/__tests__/core/failover/executor.test.js.map +1 -0
  15. package/dist/__tests__/core/monitoring/collector.test.d.ts +5 -0
  16. package/dist/__tests__/core/monitoring/collector.test.d.ts.map +1 -0
  17. package/dist/__tests__/core/monitoring/collector.test.js +131 -0
  18. package/dist/__tests__/core/monitoring/collector.test.js.map +1 -0
  19. package/dist/__tests__/core/monitoring/exporters.test.d.ts +5 -0
  20. package/dist/__tests__/core/monitoring/exporters.test.d.ts.map +1 -0
  21. package/dist/__tests__/core/monitoring/exporters.test.js +90 -0
  22. package/dist/__tests__/core/monitoring/exporters.test.js.map +1 -0
  23. package/dist/__tests__/core/routing/proxysql-manager.test.d.ts +5 -0
  24. package/dist/__tests__/core/routing/proxysql-manager.test.d.ts.map +1 -0
  25. package/dist/__tests__/core/routing/proxysql-manager.test.js +155 -0
  26. package/dist/__tests__/core/routing/proxysql-manager.test.js.map +1 -0
  27. package/dist/__tests__/types/index.test.d.ts +5 -0
  28. package/dist/__tests__/types/index.test.d.ts.map +1 -0
  29. package/dist/__tests__/types/index.test.js +290 -0
  30. package/dist/__tests__/types/index.test.js.map +1 -0
  31. package/dist/__tests__/utils/exceptions.test.d.ts +5 -0
  32. package/dist/__tests__/utils/exceptions.test.d.ts.map +1 -0
  33. package/dist/__tests__/utils/exceptions.test.js +142 -0
  34. package/dist/__tests__/utils/exceptions.test.js.map +1 -0
  35. package/dist/api/routes/clusters.d.ts +7 -0
  36. package/dist/api/routes/clusters.d.ts.map +1 -0
  37. package/dist/api/routes/clusters.js +123 -0
  38. package/dist/api/routes/clusters.js.map +1 -0
  39. package/dist/api/routes/config.d.ts +7 -0
  40. package/dist/api/routes/config.d.ts.map +1 -0
  41. package/dist/api/routes/config.js +65 -0
  42. package/dist/api/routes/config.js.map +1 -0
  43. package/dist/api/routes/failover.d.ts +7 -0
  44. package/dist/api/routes/failover.d.ts.map +1 -0
  45. package/dist/api/routes/failover.js +100 -0
  46. package/dist/api/routes/failover.js.map +1 -0
  47. package/dist/api/routes/instances.d.ts +11 -0
  48. package/dist/api/routes/instances.d.ts.map +1 -0
  49. package/dist/api/routes/instances.js +315 -0
  50. package/dist/api/routes/instances.js.map +1 -0
  51. package/dist/api/routes/monitoring.d.ts +7 -0
  52. package/dist/api/routes/monitoring.d.ts.map +1 -0
  53. package/dist/api/routes/monitoring.js +72 -0
  54. package/dist/api/routes/monitoring.js.map +1 -0
  55. package/dist/api/routes/webhooks.d.ts +12 -0
  56. package/dist/api/routes/webhooks.d.ts.map +1 -0
  57. package/dist/api/routes/webhooks.js +232 -0
  58. package/dist/api/routes/webhooks.js.map +1 -0
  59. package/dist/api/schemas/index.d.ts +965 -0
  60. package/dist/api/schemas/index.d.ts.map +1 -0
  61. package/dist/api/schemas/index.js +171 -0
  62. package/dist/api/schemas/index.js.map +1 -0
  63. package/dist/app.d.ts +13 -0
  64. package/dist/app.d.ts.map +1 -0
  65. package/dist/app.js +197 -0
  66. package/dist/app.js.map +1 -0
  67. package/dist/bin/clawsql.d.ts +12 -0
  68. package/dist/bin/clawsql.d.ts.map +1 -0
  69. package/dist/bin/clawsql.js +43 -0
  70. package/dist/bin/clawsql.js.map +1 -0
  71. package/dist/cli/agent/handler.d.ts +73 -0
  72. package/dist/cli/agent/handler.d.ts.map +1 -0
  73. package/dist/cli/agent/handler.js +258 -0
  74. package/dist/cli/agent/handler.js.map +1 -0
  75. package/dist/cli/agent/index.d.ts +14 -0
  76. package/dist/cli/agent/index.d.ts.map +1 -0
  77. package/dist/cli/agent/index.js +30 -0
  78. package/dist/cli/agent/index.js.map +1 -0
  79. package/dist/cli/agent/openclaw-integration.d.ts +81 -0
  80. package/dist/cli/agent/openclaw-integration.d.ts.map +1 -0
  81. package/dist/cli/agent/openclaw-integration.js +341 -0
  82. package/dist/cli/agent/openclaw-integration.js.map +1 -0
  83. package/dist/cli/agent/providers/anthropic.d.ts +27 -0
  84. package/dist/cli/agent/providers/anthropic.d.ts.map +1 -0
  85. package/dist/cli/agent/providers/anthropic.js +106 -0
  86. package/dist/cli/agent/providers/anthropic.js.map +1 -0
  87. package/dist/cli/agent/providers/base.d.ts +91 -0
  88. package/dist/cli/agent/providers/base.d.ts.map +1 -0
  89. package/dist/cli/agent/providers/base.js +24 -0
  90. package/dist/cli/agent/providers/base.js.map +1 -0
  91. package/dist/cli/agent/providers/openai.d.ts +27 -0
  92. package/dist/cli/agent/providers/openai.d.ts.map +1 -0
  93. package/dist/cli/agent/providers/openai.js +98 -0
  94. package/dist/cli/agent/providers/openai.js.map +1 -0
  95. package/dist/cli/agent/tools/index.d.ts +32 -0
  96. package/dist/cli/agent/tools/index.d.ts.map +1 -0
  97. package/dist/cli/agent/tools/index.js +263 -0
  98. package/dist/cli/agent/tools/index.js.map +1 -0
  99. package/dist/cli/commands/cleanup.d.ts +12 -0
  100. package/dist/cli/commands/cleanup.d.ts.map +1 -0
  101. package/dist/cli/commands/cleanup.js +205 -0
  102. package/dist/cli/commands/cleanup.js.map +1 -0
  103. package/dist/cli/commands/clusters.d.ts +12 -0
  104. package/dist/cli/commands/clusters.d.ts.map +1 -0
  105. package/dist/cli/commands/clusters.js +468 -0
  106. package/dist/cli/commands/clusters.js.map +1 -0
  107. package/dist/cli/commands/config.d.ts +12 -0
  108. package/dist/cli/commands/config.d.ts.map +1 -0
  109. package/dist/cli/commands/config.js +406 -0
  110. package/dist/cli/commands/config.js.map +1 -0
  111. package/dist/cli/commands/cron.d.ts +12 -0
  112. package/dist/cli/commands/cron.d.ts.map +1 -0
  113. package/dist/cli/commands/cron.js +215 -0
  114. package/dist/cli/commands/cron.js.map +1 -0
  115. package/dist/cli/commands/doctor.d.ts +13 -0
  116. package/dist/cli/commands/doctor.d.ts.map +1 -0
  117. package/dist/cli/commands/doctor.js +687 -0
  118. package/dist/cli/commands/doctor.js.map +1 -0
  119. package/dist/cli/commands/failover.d.ts +16 -0
  120. package/dist/cli/commands/failover.d.ts.map +1 -0
  121. package/dist/cli/commands/failover.js +333 -0
  122. package/dist/cli/commands/failover.js.map +1 -0
  123. package/dist/cli/commands/health.d.ts +12 -0
  124. package/dist/cli/commands/health.d.ts.map +1 -0
  125. package/dist/cli/commands/health.js +125 -0
  126. package/dist/cli/commands/health.js.map +1 -0
  127. package/dist/cli/commands/help.d.ts +12 -0
  128. package/dist/cli/commands/help.d.ts.map +1 -0
  129. package/dist/cli/commands/help.js +52 -0
  130. package/dist/cli/commands/help.js.map +1 -0
  131. package/dist/cli/commands/instances.d.ts +12 -0
  132. package/dist/cli/commands/instances.d.ts.map +1 -0
  133. package/dist/cli/commands/instances.js +801 -0
  134. package/dist/cli/commands/instances.js.map +1 -0
  135. package/dist/cli/commands/notify.d.ts +12 -0
  136. package/dist/cli/commands/notify.d.ts.map +1 -0
  137. package/dist/cli/commands/notify.js +43 -0
  138. package/dist/cli/commands/notify.js.map +1 -0
  139. package/dist/cli/commands/sql.d.ts +12 -0
  140. package/dist/cli/commands/sql.d.ts.map +1 -0
  141. package/dist/cli/commands/sql.js +90 -0
  142. package/dist/cli/commands/sql.js.map +1 -0
  143. package/dist/cli/commands/start.d.ts +12 -0
  144. package/dist/cli/commands/start.d.ts.map +1 -0
  145. package/dist/cli/commands/start.js +174 -0
  146. package/dist/cli/commands/start.js.map +1 -0
  147. package/dist/cli/commands/status.d.ts +12 -0
  148. package/dist/cli/commands/status.d.ts.map +1 -0
  149. package/dist/cli/commands/status.js +218 -0
  150. package/dist/cli/commands/status.js.map +1 -0
  151. package/dist/cli/commands/stop.d.ts +12 -0
  152. package/dist/cli/commands/stop.d.ts.map +1 -0
  153. package/dist/cli/commands/stop.js +128 -0
  154. package/dist/cli/commands/stop.js.map +1 -0
  155. package/dist/cli/commands/topology.d.ts +12 -0
  156. package/dist/cli/commands/topology.d.ts.map +1 -0
  157. package/dist/cli/commands/topology.js +106 -0
  158. package/dist/cli/commands/topology.js.map +1 -0
  159. package/dist/cli/completer.d.ts +47 -0
  160. package/dist/cli/completer.d.ts.map +1 -0
  161. package/dist/cli/completer.js +332 -0
  162. package/dist/cli/completer.js.map +1 -0
  163. package/dist/cli/formatter.d.ts +165 -0
  164. package/dist/cli/formatter.d.ts.map +1 -0
  165. package/dist/cli/formatter.js +408 -0
  166. package/dist/cli/formatter.js.map +1 -0
  167. package/dist/cli/index.d.ts +21 -0
  168. package/dist/cli/index.d.ts.map +1 -0
  169. package/dist/cli/index.js +79 -0
  170. package/dist/cli/index.js.map +1 -0
  171. package/dist/cli/raw-input.d.ts +97 -0
  172. package/dist/cli/raw-input.d.ts.map +1 -0
  173. package/dist/cli/raw-input.js +493 -0
  174. package/dist/cli/raw-input.js.map +1 -0
  175. package/dist/cli/registry.d.ts +103 -0
  176. package/dist/cli/registry.d.ts.map +1 -0
  177. package/dist/cli/registry.js +205 -0
  178. package/dist/cli/registry.js.map +1 -0
  179. package/dist/cli/repl.d.ts +83 -0
  180. package/dist/cli/repl.d.ts.map +1 -0
  181. package/dist/cli/repl.js +447 -0
  182. package/dist/cli/repl.js.map +1 -0
  183. package/dist/cli/ui/components.d.ts +144 -0
  184. package/dist/cli/ui/components.d.ts.map +1 -0
  185. package/dist/cli/ui/components.js +331 -0
  186. package/dist/cli/ui/components.js.map +1 -0
  187. package/dist/cli/ui/index.d.ts +7 -0
  188. package/dist/cli/ui/index.d.ts.map +1 -0
  189. package/dist/cli/ui/index.js +23 -0
  190. package/dist/cli/ui/index.js.map +1 -0
  191. package/dist/cli/utils/docker-files.d.ts +39 -0
  192. package/dist/cli/utils/docker-files.d.ts.map +1 -0
  193. package/dist/cli/utils/docker-files.js +223 -0
  194. package/dist/cli/utils/docker-files.js.map +1 -0
  195. package/dist/cli/utils/docker-prereq.d.ts +48 -0
  196. package/dist/cli/utils/docker-prereq.d.ts.map +1 -0
  197. package/dist/cli/utils/docker-prereq.js +203 -0
  198. package/dist/cli/utils/docker-prereq.js.map +1 -0
  199. package/dist/config/settings.d.ts +594 -0
  200. package/dist/config/settings.d.ts.map +1 -0
  201. package/dist/config/settings.js +250 -0
  202. package/dist/config/settings.js.map +1 -0
  203. package/dist/core/discovery/cluster-view.d.ts +50 -0
  204. package/dist/core/discovery/cluster-view.d.ts.map +1 -0
  205. package/dist/core/discovery/cluster-view.js +235 -0
  206. package/dist/core/discovery/cluster-view.js.map +1 -0
  207. package/dist/core/discovery/scanner.d.ts +70 -0
  208. package/dist/core/discovery/scanner.d.ts.map +1 -0
  209. package/dist/core/discovery/scanner.js +197 -0
  210. package/dist/core/discovery/scanner.js.map +1 -0
  211. package/dist/core/discovery/topology.d.ts +118 -0
  212. package/dist/core/discovery/topology.d.ts.map +1 -0
  213. package/dist/core/discovery/topology.js +550 -0
  214. package/dist/core/discovery/topology.js.map +1 -0
  215. package/dist/core/failover/candidate-selector.d.ts +46 -0
  216. package/dist/core/failover/candidate-selector.d.ts.map +1 -0
  217. package/dist/core/failover/candidate-selector.js +70 -0
  218. package/dist/core/failover/candidate-selector.js.map +1 -0
  219. package/dist/core/failover/executor.d.ts +104 -0
  220. package/dist/core/failover/executor.d.ts.map +1 -0
  221. package/dist/core/failover/executor.js +248 -0
  222. package/dist/core/failover/executor.js.map +1 -0
  223. package/dist/core/failover/operation-builder.d.ts +71 -0
  224. package/dist/core/failover/operation-builder.d.ts.map +1 -0
  225. package/dist/core/failover/operation-builder.js +157 -0
  226. package/dist/core/failover/operation-builder.js.map +1 -0
  227. package/dist/core/failover/operation-runner.d.ts +75 -0
  228. package/dist/core/failover/operation-runner.d.ts.map +1 -0
  229. package/dist/core/failover/operation-runner.js +191 -0
  230. package/dist/core/failover/operation-runner.js.map +1 -0
  231. package/dist/core/failover/promoter.d.ts +33 -0
  232. package/dist/core/failover/promoter.d.ts.map +1 -0
  233. package/dist/core/failover/promoter.js +97 -0
  234. package/dist/core/failover/promoter.js.map +1 -0
  235. package/dist/core/failover/recovery-manager.d.ts +47 -0
  236. package/dist/core/failover/recovery-manager.d.ts.map +1 -0
  237. package/dist/core/failover/recovery-manager.js +145 -0
  238. package/dist/core/failover/recovery-manager.js.map +1 -0
  239. package/dist/core/failover/types.d.ts +54 -0
  240. package/dist/core/failover/types.d.ts.map +1 -0
  241. package/dist/core/failover/types.js +8 -0
  242. package/dist/core/failover/types.js.map +1 -0
  243. package/dist/core/monitoring/collector.d.ts +25 -0
  244. package/dist/core/monitoring/collector.d.ts.map +1 -0
  245. package/dist/core/monitoring/collector.js +115 -0
  246. package/dist/core/monitoring/collector.js.map +1 -0
  247. package/dist/core/monitoring/exporters.d.ts +49 -0
  248. package/dist/core/monitoring/exporters.d.ts.map +1 -0
  249. package/dist/core/monitoring/exporters.js +126 -0
  250. package/dist/core/monitoring/exporters.js.map +1 -0
  251. package/dist/core/routing/proxysql-manager.d.ts +213 -0
  252. package/dist/core/routing/proxysql-manager.d.ts.map +1 -0
  253. package/dist/core/routing/proxysql-manager.js +632 -0
  254. package/dist/core/routing/proxysql-manager.js.map +1 -0
  255. package/dist/core/sync/replica-recovery.d.ts +40 -0
  256. package/dist/core/sync/replica-recovery.d.ts.map +1 -0
  257. package/dist/core/sync/replica-recovery.js +134 -0
  258. package/dist/core/sync/replica-recovery.js.map +1 -0
  259. package/dist/core/sync/sync-coordinator.d.ts +83 -0
  260. package/dist/core/sync/sync-coordinator.d.ts.map +1 -0
  261. package/dist/core/sync/sync-coordinator.js +254 -0
  262. package/dist/core/sync/sync-coordinator.js.map +1 -0
  263. package/dist/core/sync/topology-watcher.d.ts +76 -0
  264. package/dist/core/sync/topology-watcher.d.ts.map +1 -0
  265. package/dist/core/sync/topology-watcher.js +222 -0
  266. package/dist/core/sync/topology-watcher.js.map +1 -0
  267. package/dist/core/sync/types.d.ts +85 -0
  268. package/dist/core/sync/types.d.ts.map +1 -0
  269. package/dist/core/sync/types.js +8 -0
  270. package/dist/core/sync/types.js.map +1 -0
  271. package/dist/index.d.ts +5 -0
  272. package/dist/index.d.ts.map +1 -0
  273. package/dist/index.js +9 -0
  274. package/dist/index.js.map +1 -0
  275. package/dist/types/index.d.ts +212 -0
  276. package/dist/types/index.d.ts.map +1 -0
  277. package/dist/types/index.js +153 -0
  278. package/dist/types/index.js.map +1 -0
  279. package/dist/utils/database.d.ts +62 -0
  280. package/dist/utils/database.d.ts.map +1 -0
  281. package/dist/utils/database.js +257 -0
  282. package/dist/utils/database.js.map +1 -0
  283. package/dist/utils/exceptions.d.ts +69 -0
  284. package/dist/utils/exceptions.d.ts.map +1 -0
  285. package/dist/utils/exceptions.js +121 -0
  286. package/dist/utils/exceptions.js.map +1 -0
  287. package/dist/utils/logger.d.ts +20 -0
  288. package/dist/utils/logger.d.ts.map +1 -0
  289. package/dist/utils/logger.js +90 -0
  290. package/dist/utils/logger.js.map +1 -0
  291. package/dist/utils/mysql-client.d.ts +43 -0
  292. package/dist/utils/mysql-client.d.ts.map +1 -0
  293. package/dist/utils/mysql-client.js +125 -0
  294. package/dist/utils/mysql-client.js.map +1 -0
  295. package/docker/Dockerfile +61 -0
  296. package/docker/Dockerfile.node +41 -0
  297. package/docker/grafana/dashboards/clawsql.json +212 -0
  298. package/docker/grafana/provisioning/dashboards/dashboards.yml +13 -0
  299. package/docker/grafana/provisioning/datasources/datasources.yml +12 -0
  300. package/docker/init/primary.sql +26 -0
  301. package/docker/init/replica.sql +16 -0
  302. package/docker/orchestrator/orchestrator.conf.json +98 -0
  303. package/docker/prometheus/prometheus.yml +45 -0
  304. package/docker/proxysql/entrypoint.sh +8 -0
  305. package/docker/proxysql/init.sql.demo +30 -0
  306. package/docker/proxysql/proxysql.cnf +38 -0
  307. package/docker-compose.demo.yml +115 -0
  308. package/docker-compose.yml +217 -0
  309. package/init/primary.sql +19 -0
  310. package/init/replica.sql +13 -0
  311. package/package.json +84 -0
package/.env.example ADDED
@@ -0,0 +1,97 @@
1
+ # ClawSQL Configuration Template
2
+ # Copy this file to .env and customize for your environment
3
+
4
+ # =============================================================================
5
+ # Quick Start
6
+ # =============================================================================
7
+ # Run: ./start.sh
8
+ # Then register your MySQL instances via API:
9
+ # curl -X POST http://localhost:8080/api/v1/instances \
10
+ # -H 'Content-Type: application/json' \
11
+ # -d '{"host": "your-mysql", "port": 3306}'
12
+
13
+ # =============================================================================
14
+ # API Configuration
15
+ # =============================================================================
16
+ API_HOST=0.0.0.0
17
+ API_PORT=8080
18
+ API_TOKEN_SECRET=change-me-in-production
19
+ API_TOKEN_EXPIRY_HOURS=24
20
+
21
+ # =============================================================================
22
+ # Metadata Database Configuration
23
+ # =============================================================================
24
+ # Shared MySQL database for ClawSQL and Orchestrator metadata
25
+ # Leave METADATA_DB_HOST empty to auto-provision a MySQL container
26
+
27
+ # Metadata Database (optional - auto-provisioned if METADATA_DB_HOST is empty)
28
+ METADATA_DB_HOST=
29
+ METADATA_DB_PORT=3306
30
+ METADATA_DB_NAME=clawsql_meta
31
+ METADATA_DB_USER=clawsql
32
+ METADATA_DB_PASSWORD=clawsql_password
33
+ METADATA_DB_ROOT_PASSWORD=metadata_root
34
+ METADATA_DB_POOL_SIZE=10
35
+
36
+ # =============================================================================
37
+ # Orchestrator Configuration
38
+ # =============================================================================
39
+ ORCHESTRATOR_URL=http://orchestrator:3000
40
+ ORCHESTRATOR_TIMEOUT=30.0
41
+ ORCHESTRATOR_TLS_ENABLED=false
42
+ ORCHESTRATOR_TLS_CERT=
43
+ ORCHESTRATOR_TLS_KEY=
44
+
45
+ # =============================================================================
46
+ # ProxySQL Configuration
47
+ # =============================================================================
48
+ PROXYSQL_HOST=proxysql
49
+ PROXYSQL_ADMIN_PORT=6032
50
+ PROXYSQL_MYSQL_PORT=6033
51
+ PROXYSQL_ADMIN_USER=admin
52
+ PROXYSQL_ADMIN_PASSWORD=admin
53
+
54
+ # =============================================================================
55
+ # Prometheus Configuration
56
+ # =============================================================================
57
+ PROMETHEUS_URL=http://prometheus:9090
58
+ PROMETHEUS_RETENTION_DAYS=15
59
+
60
+ # =============================================================================
61
+ # Monitoring Settings
62
+ # =============================================================================
63
+ COLLECTION_INTERVAL=15.0
64
+ HEALTH_CHECK_INTERVAL=10.0
65
+ ALERT_COOLDOWN_MINUTES=5
66
+
67
+ # =============================================================================
68
+ # Failover Settings
69
+ # =============================================================================
70
+ AUTO_FAILOVER_ENABLED=true
71
+ FAILOVER_TIMEOUT_SECONDS=30
72
+ MIN_REPLICAS_FOR_FAILOVER=2
73
+ CONFIRMATION_CHECKS=3
74
+
75
+ # =============================================================================
76
+ # MySQL Connection Credentials
77
+ # These are used to connect to YOUR MySQL instances for monitoring and management
78
+ # =============================================================================
79
+ # Admin user for SQL queries, monitoring, and metadata management
80
+ MYSQL_ADMIN_USER=clawsql
81
+ MYSQL_ADMIN_PASSWORD=clawsql_password
82
+ # Replication user (required for MySQL replication)
83
+ MYSQL_REPLICATION_USER=repl
84
+ MYSQL_REPLICATION_PASSWORD=repl_password
85
+
86
+ # =============================================================================
87
+ # Logging Configuration
88
+ # =============================================================================
89
+ LOG_LEVEL=INFO
90
+ LOG_FORMAT=json
91
+
92
+ # =============================================================================
93
+ # TLS Configuration (optional)
94
+ # =============================================================================
95
+ TLS_ENABLED=false
96
+ TLS_CERT_PATH=
97
+ TLS_KEY_PATH=
package/README.md ADDED
@@ -0,0 +1,372 @@
1
+ # ClawSQL
2
+
3
+ MySQL High Availability Management Platform with automatic failover, read/write splitting, and topology management.
4
+
5
+ ## Features
6
+
7
+ - **Automatic Failover**: Detect primary failures and promote replicas automatically
8
+ - **Read/Write Splitting**: ProxySQL integration for transparent traffic routing
9
+ - **Topology Management**: Orchestrator-powered MySQL cluster management
10
+ - **Instance Discovery**: Network scanning to find MySQL instances automatically
11
+ - **Monitoring**: Built-in Prometheus metrics and Grafana dashboards
12
+ - **Interactive CLI**: Full-featured command-line interface for all operations
13
+
14
+ ## Prerequisites
15
+
16
+ - **Container Runtime**: Docker or Podman
17
+ - **Docker Compose**: docker-compose or podman-compose
18
+ - **Node.js**: v18+ (for CLI development)
19
+
20
+ ## Quick Start
21
+
22
+ **New to ClawSQL?** See the **[Getting Started Guide](docs/GET_STARTED.md)** for a step-by-step tutorial.
23
+
24
+ ### Option 1: Demo Mode (Recommended for Testing)
25
+
26
+ Start with a pre-configured demo MySQL cluster:
27
+
28
+ ```bash
29
+ ./start.sh --demo
30
+ ```
31
+
32
+ This starts:
33
+ - ClawSQL platform (API, Orchestrator, ProxySQL, Prometheus, Grafana)
34
+ - Demo MySQL cluster (1 primary + 2 replicas)
35
+
36
+ ### Option 2: Production Mode (Bring Your Own MySQL)
37
+
38
+ Start the platform and connect to your existing MySQL instances:
39
+
40
+ ```bash
41
+ # Start platform
42
+ ./start.sh
43
+
44
+ # Configure MySQL credentials
45
+ node dist/bin/clawsql.js -c "/config set mysql.admin_user root"
46
+ node dist/bin/clawsql.js -c "/config set mysql.admin_password yourpassword"
47
+
48
+ # Create Orchestrator user on your MySQL instances
49
+ mysql -e "CREATE USER 'clawsql'@'%' IDENTIFIED BY 'clawsql_password'; GRANT ALL ON *.* TO 'clawsql'@'%' WITH GRANT OPTION;"
50
+
51
+ # Discover MySQL instances on your network
52
+ node dist/bin/clawsql.js -c "/instances discover 172.18.0.0/24 --user root --password yourpassword"
53
+
54
+ # Or register instances manually
55
+ node dist/bin/clawsql.js -c "/instances register --host mysql-primary --port 3306"
56
+
57
+ # Sync to ProxySQL
58
+ node dist/bin/clawsql.js -c "/clusters sync"
59
+
60
+ # Verify health
61
+ node dist/bin/clawsql.js -c "/doctor"
62
+ ```
63
+
64
+ ## Services
65
+
66
+ After starting, access these services:
67
+
68
+ | Service | URL | Description |
69
+ |---------|-----|-------------|
70
+ | ClawSQL API | http://localhost:8080 | REST API |
71
+ | API Docs | http://localhost:8080/docs | OpenAPI documentation |
72
+ | Orchestrator | http://localhost:3000 | MySQL topology manager |
73
+ | Prometheus | http://localhost:9090 | Metrics collection |
74
+ | Grafana | http://localhost:3001 | Dashboards (admin/admin) |
75
+ | ProxySQL | localhost:6033 | MySQL traffic (read/write split) |
76
+
77
+ ### Demo MySQL Cluster
78
+
79
+ When started with `--demo`:
80
+
81
+ | Instance | Port | Credentials |
82
+ |----------|------|-------------|
83
+ | Primary | 3306 | root/rootpassword |
84
+ | Replica 1 | 3307 | root/rootpassword |
85
+ | Replica 2 | 3308 | root/rootpassword |
86
+
87
+ ## CLI Commands
88
+
89
+ ### Platform Lifecycle
90
+
91
+ ```bash
92
+ /start [--demo] # Start ClawSQL platform
93
+ /stop # Stop all services
94
+ /status # Show platform status
95
+ /cleanup # Remove all containers and data
96
+ /doctor # Run diagnostics and suggest fixes
97
+ ```
98
+
99
+ ### Configuration
100
+
101
+ ```bash
102
+ /config show # Display current configuration
103
+ /config init # Interactive configuration wizard
104
+ /config set <key> <value> # Set configuration value
105
+ /config get <key> # Get configuration value
106
+ ```
107
+
108
+ Available configuration keys:
109
+ - `mysql.admin_user` - MySQL admin username
110
+ - `mysql.admin_password` - MySQL admin password
111
+ - `mysql.repl_user` - MySQL replication username
112
+ - `mysql.repl_password` - MySQL replication password
113
+ - `orchestrator.url` - Orchestrator URL
114
+ - `proxysql.host` - ProxySQL hostname
115
+ - `proxysql.admin_port` - ProxySQL admin port
116
+ - `failover.auto_enabled` - Enable auto failover (true/false)
117
+ - `log.level` - Log level (DEBUG/INFO/WARNING/ERROR/SILENT)
118
+
119
+ ### Instance Management
120
+
121
+ ```bash
122
+ /instances list # List discovered instances
123
+ /instances discover <network> [options] # Scan network for MySQL
124
+ --user <user> MySQL username for discovery
125
+ --password <pass> MySQL password
126
+ --port <port> Port range (default: 3306)
127
+ --auto-register Auto-register discovered instances
128
+
129
+ /instances register --host <host> [options] # Register instance manually
130
+ --port <port> MySQL port (default: 3306)
131
+ --user <user> MySQL username
132
+ --password <pass> MySQL password
133
+
134
+ /instances remove --host <host> [--port <port>] # Remove instance
135
+ ```
136
+
137
+ ### Cluster Management
138
+
139
+ ```bash
140
+ /clusters list # List all clusters
141
+ /clusters topology [--name <cluster>] # Show topology
142
+ /clusters import --primary <host:port> # Import existing topology
143
+ /clusters create --name <name> --primary <h:p> # Create new cluster
144
+ --replicas <h:p,...> Replica instances (optional)
145
+
146
+ /clusters sync [--name <cluster>] # Sync to ProxySQL
147
+ /clusters add-replica --name <cluster> --host <h:p> # Add replica
148
+ /clusters remove-replica --name <cluster> --host <h:p> # Remove replica
149
+ ```
150
+
151
+ ### Failover Operations
152
+
153
+ ```bash
154
+ /failover status # Show failover configuration
155
+ /failover history # Show operation history
156
+ /failover switchover <cluster> [target] # Planned primary change (primary healthy)
157
+ /failover failover <cluster> [target] # Emergency failover (primary down)
158
+ /failover recover list # List instances pending recovery
159
+ /failover recover <instance> # Recover specific instance
160
+ /failover recover --all # Recover all pending instances
161
+ ```
162
+
163
+ > **Note:** For promoting replicas, use `/failover switchover` instead of `/clusters promote`.
164
+
165
+ ### Additional Commands
166
+
167
+ ```bash
168
+ /topology [--name <cluster>] # Quick topology view
169
+ /sql <host:port> "<query>" # Execute SQL query on instance
170
+ /cron list # List scheduled tasks
171
+ /cron create "<cron>" "<command>" # Schedule a recurring task
172
+ /cron remove <task-id> # Remove scheduled task
173
+ /notify send --message "<msg>" # Send notification
174
+ ```
175
+
176
+ ## MySQL Configuration Requirements
177
+
178
+ ### Orchestrator User
179
+
180
+ Create a user for Orchestrator on your MySQL instances:
181
+
182
+ ```sql
183
+ CREATE USER 'clawsql'@'%' IDENTIFIED BY 'clawsql_password';
184
+ GRANT ALL PRIVILEGES ON *.* TO 'clawsql'@'%' WITH GRANT OPTION;
185
+ FLUSH PRIVILEGES;
186
+ ```
187
+
188
+ ### Replication User (for GTID replication)
189
+
190
+ ```sql
191
+ CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'repl_password';
192
+ GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
193
+ FLUSH PRIVILEGES;
194
+ ```
195
+
196
+ ### MySQL Server Configuration
197
+
198
+ For replication, your MySQL instances should have:
199
+
200
+ ```ini
201
+ [mysqld]
202
+ server-id = 1 # Unique for each server
203
+ log-bin = mysql-bin
204
+ binlog-format = ROW
205
+ gtid-mode = ON
206
+ enforce-gtid-consistency = ON
207
+ log-slave-updates = ON
208
+ ```
209
+
210
+ ## Configuration
211
+
212
+ Configuration is managed via environment variables. Copy `.env.example` to `.env`:
213
+
214
+ ```bash
215
+ cp .env.example .env
216
+ ```
217
+
218
+ Key settings:
219
+
220
+ | Variable | Default | Description |
221
+ |----------|---------|-------------|
222
+ | `API_PORT` | 8080 | API server port |
223
+ | `API_TOKEN_SECRET` | change-me | JWT secret (change in production!) |
224
+ | `MYSQL_ADMIN_USER` | clawsql | MySQL admin username |
225
+ | `MYSQL_ADMIN_PASSWORD` | clawsql_password | MySQL admin password |
226
+ | `AUTO_FAILOVER_ENABLED` | true | Enable automatic failover |
227
+ | `LOG_LEVEL` | INFO | Logging level |
228
+
229
+ ## Architecture
230
+
231
+ ```
232
+ ┌─────────────────────────────────────────────────────────────────┐
233
+ │ Your Application │
234
+ └───────────────────────────────┬─────────────────────────────────┘
235
+
236
+
237
+ ┌─────────────────────────────────────────────────────────────────┐
238
+ │ ProxySQL │
239
+ │ (Read/Write Splitting) │
240
+ │ Port 6033 - MySQL Traffic | Port 6032 - Admin │
241
+ └───────────────┬─────────────────────────────┬───────────────────┘
242
+ │ │
243
+ ┌───────▼───────┐ ┌───────▼───────┐
244
+ │ Primary │ │ Replica │
245
+ │ (Writer) │────────────▶│ (Reader) │
246
+ │ Port 3306 │ Repl │ Port 3306 │
247
+ └───────────────┘ └───────────────┘
248
+ │ │
249
+ └──────────────┬──────────────┘
250
+
251
+ ┌──────────────────────────────▼──────────────────────────────────┐
252
+ │ ClawSQL │
253
+ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
254
+ │ │ Orchestrator│ │ Failover │ │ Monitoring │ │
255
+ │ │ Client │ │ Engine │ │ Service │ │
256
+ │ └─────────────┘ └─────────────┘ └─────────────┘ │
257
+ └─────────────────────────────────────────────────────────────────┘
258
+ ```
259
+
260
+ ## AI Agent Integration
261
+
262
+ ClawSQL includes an AI-powered assistant for database operations using [OpenClaw](https://github.com/anthropics/openclaw).
263
+
264
+ ### Prerequisites
265
+
266
+ Install and configure the OpenClaw CLI following the [OpenClaw documentation](https://github.com/anthropics/openclaw#installation).
267
+
268
+ ### Using the AI Agent
269
+
270
+ Start the CLI and interact naturally:
271
+
272
+ ```
273
+ clawsql> show me the cluster topology
274
+ clawsql> what's the replication lag on replica-1?
275
+ clawsql> help me set up a new replica
276
+ clawsql> explain the failover process
277
+ ```
278
+
279
+ ### Supported Operations
280
+
281
+ - **Topology queries**: "show me the cluster", "what's the primary?"
282
+ - **Status checks**: "check replication status", "is the cluster healthy?"
283
+ - **Guided operations**: "how do I add a replica?", "help me set up failover"
284
+ - **Troubleshooting**: "why is replication lag high?", "diagnose connection issues"
285
+ - **Explanations**: "explain read/write splitting", "how does failover work?"
286
+
287
+ ### Stopping AI Operations
288
+
289
+ During AI processing, press **ESC twice** (within 500ms) to stop the current operation.
290
+
291
+ ## Development
292
+
293
+ ```bash
294
+ # Install dependencies
295
+ npm install
296
+
297
+ # Build TypeScript
298
+ npm run build
299
+
300
+ # Run CLI
301
+ node dist/bin/clawsql.js
302
+
303
+ # Run tests
304
+ npm test
305
+
306
+ # Run with file watcher
307
+ npm run dev
308
+ ```
309
+
310
+ ### Project Structure
311
+
312
+ ```
313
+ clawsql/
314
+ ├── src/
315
+ │ ├── index.ts # Entry point
316
+ │ ├── app.ts # Fastify application setup
317
+ │ ├── config/ # Configuration management
318
+ │ ├── types/ # TypeScript types and interfaces
319
+ │ ├── core/ # Core business logic
320
+ │ │ ├── discovery/ # Instance discovery and topology
321
+ │ │ ├── monitoring/ # Metrics and health checks
322
+ │ │ ├── failover/ # Failover operations
323
+ │ │ └── routing/ # ProxySQL integration
324
+ │ ├── api/ # REST API routes
325
+ │ ├── cli/ # CLI commands
326
+ │ ├── utils/ # Utilities
327
+ │ └── __tests__/ # Test files
328
+ ├── docker/ # Docker configurations
329
+ ├── scripts/ # Utility scripts
330
+ ├── package.json # Node.js dependencies
331
+ └── tsconfig.json # TypeScript configuration
332
+ ```
333
+
334
+ ## Troubleshooting
335
+
336
+ ### Check Platform Health
337
+
338
+ ```bash
339
+ node dist/bin/clawsql.js -c "/doctor"
340
+ ```
341
+
342
+ ### View Logs
343
+
344
+ ```bash
345
+ docker-compose logs -f clawsql
346
+ docker-compose logs -f orchestrator
347
+ docker-compose logs -f proxysql
348
+ ```
349
+
350
+ ### Check MySQL Replication
351
+
352
+ ```bash
353
+ docker exec mysql-replica-1 mysql -uroot -prootpassword -e "SHOW REPLICA STATUS\G"
354
+ ```
355
+
356
+ ### Reset ProxySQL
357
+
358
+ ```bash
359
+ docker exec proxysql mysql -h127.0.0.1 -P6032 -uadmin -padmin -e "DELETE FROM mysql_servers; LOAD MYSQL SERVERS TO RUNTIME;"
360
+ ```
361
+
362
+ ## Documentation
363
+
364
+ - [Getting Started](docs/GET_STARTED.md) - Step-by-step tutorial
365
+ - [API Documentation](docs/API.md) - REST API reference
366
+ - [Demo Guide](docs/DEMO.md) - Testing with demo cluster
367
+ - [Failover Documentation](docs/failover.md) - Failover architecture and operations
368
+ - [System Architecture](docs/architecture/system_design.md) - Technical details
369
+
370
+ ## License
371
+
372
+ MIT
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for ClawSQL configuration settings
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=settings.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/config/settings.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,154 @@
1
+ "use strict";
2
+ /**
3
+ * Tests for ClawSQL configuration settings
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ // Store original env
7
+ const originalEnv = { ...process.env };
8
+ // Mock dotenv to prevent loading .env
9
+ jest.mock('dotenv', () => ({
10
+ config: jest.fn(),
11
+ }));
12
+ const settings_1 = require("../../config/settings");
13
+ describe('Settings', () => {
14
+ beforeEach(() => {
15
+ // Clear all env vars that affect settings
16
+ delete process.env.API_PORT;
17
+ delete process.env.DB_TYPE;
18
+ delete process.env.AUTO_FAILOVER_ENABLED;
19
+ delete process.env.PROXYSQL_ADMIN_USER;
20
+ delete process.env.PROXYSQL_ADMIN_PASSWORD;
21
+ delete process.env.API_TOKEN_SECRET;
22
+ delete process.env.MYSQL_MONITOR_PASSWORD;
23
+ // Reset settings cache before each test
24
+ (0, settings_1.resetSettings)();
25
+ });
26
+ afterEach(() => {
27
+ // Restore original env
28
+ process.env = { ...originalEnv };
29
+ (0, settings_1.resetSettings)();
30
+ });
31
+ describe('getSettings', () => {
32
+ it('should return default settings when no env vars set', () => {
33
+ const settings = (0, settings_1.getSettings)();
34
+ expect(settings.appName).toBe('ClawSQL');
35
+ expect(settings.appVersion).toBe('0.1.0');
36
+ expect(settings.debug).toBe(false);
37
+ });
38
+ it('should return cached settings on subsequent calls', () => {
39
+ const settings1 = (0, settings_1.getSettings)();
40
+ const settings2 = (0, settings_1.getSettings)();
41
+ expect(settings1).toBe(settings2);
42
+ });
43
+ it('should load new settings after reset', () => {
44
+ const settings1 = (0, settings_1.getSettings)();
45
+ (0, settings_1.resetSettings)();
46
+ const settings2 = (0, settings_1.getSettings)();
47
+ // Different object references but same values
48
+ expect(settings1).not.toBe(settings2);
49
+ expect(settings1.appName).toBe(settings2.appName);
50
+ });
51
+ });
52
+ describe('DatabaseSettings', () => {
53
+ it('should have correct defaults', () => {
54
+ const settings = (0, settings_1.getSettings)();
55
+ expect(settings.database.type).toBe('sqlite');
56
+ expect(settings.database.sqlitePath).toBe('/data/clawsql.db');
57
+ expect(settings.database.host).toBe('localhost');
58
+ expect(settings.database.port).toBe(3306);
59
+ expect(settings.database.name).toBe('clawsql');
60
+ expect(settings.database.user).toBe('clawsql');
61
+ expect(settings.database.poolSize).toBe(10);
62
+ });
63
+ });
64
+ describe('OrchestratorSettings', () => {
65
+ it('should have correct defaults', () => {
66
+ const settings = (0, settings_1.getSettings)();
67
+ expect(settings.orchestrator.url).toBe('http://orchestrator:3000');
68
+ expect(settings.orchestrator.timeout).toBe(30);
69
+ expect(settings.orchestrator.tlsEnabled).toBe(false);
70
+ });
71
+ });
72
+ describe('ProxySQLSettings', () => {
73
+ it('should have correct defaults', () => {
74
+ const settings = (0, settings_1.getSettings)();
75
+ expect(settings.proxysql.host).toBe('proxysql');
76
+ expect(settings.proxysql.adminPort).toBe(6032);
77
+ expect(settings.proxysql.mysqlPort).toBe(6033);
78
+ expect(settings.proxysql.adminUser).toBe('clawsql');
79
+ expect(settings.proxysql.adminPassword).toBe('clawsql');
80
+ });
81
+ });
82
+ describe('PrometheusSettings', () => {
83
+ it('should have correct defaults', () => {
84
+ const settings = (0, settings_1.getSettings)();
85
+ expect(settings.prometheus.url).toBe('http://prometheus:9090');
86
+ expect(settings.prometheus.retentionDays).toBe(15);
87
+ });
88
+ });
89
+ describe('MonitoringSettings', () => {
90
+ it('should have correct defaults', () => {
91
+ const settings = (0, settings_1.getSettings)();
92
+ expect(settings.monitoring.collectionInterval).toBe(15);
93
+ expect(settings.monitoring.healthCheckInterval).toBe(10);
94
+ expect(settings.monitoring.alertCooldownMinutes).toBe(5);
95
+ });
96
+ });
97
+ describe('FailoverSettings', () => {
98
+ it('should have correct defaults', () => {
99
+ const settings = (0, settings_1.getSettings)();
100
+ expect(settings.failover.autoFailoverEnabled).toBe(true);
101
+ expect(settings.failover.timeoutSeconds).toBe(30);
102
+ expect(settings.failover.minReplicasForFailover).toBe(2);
103
+ expect(settings.failover.confirmationChecks).toBe(3);
104
+ });
105
+ });
106
+ describe('DiscoverySettings', () => {
107
+ it('should have correct defaults', () => {
108
+ const settings = (0, settings_1.getSettings)();
109
+ expect(settings.discovery.networkSegments).toBe('172.18.0.0/24');
110
+ expect(settings.discovery.portRangeStart).toBe(3306);
111
+ expect(settings.discovery.portRangeEnd).toBe(3306);
112
+ expect(settings.discovery.timeout).toBe(2);
113
+ expect(settings.discovery.maxConcurrent).toBe(100);
114
+ });
115
+ });
116
+ describe('APISettings', () => {
117
+ it('should have correct defaults', () => {
118
+ const settings = (0, settings_1.getSettings)();
119
+ expect(settings.api.host).toBe('0.0.0.0');
120
+ expect(settings.api.port).toBe(8080);
121
+ expect(settings.api.tokenSecret).toBe('change-me-in-production');
122
+ expect(settings.api.tokenExpiryHours).toBe(24);
123
+ });
124
+ });
125
+ describe('MySQLCredentials', () => {
126
+ it('should have correct defaults', () => {
127
+ const settings = (0, settings_1.getSettings)();
128
+ expect(settings.mysql.monitorUser).toBe('monitor');
129
+ expect(settings.mysql.monitorPassword).toBe('');
130
+ expect(settings.mysql.replicationUser).toBe('repl');
131
+ expect(settings.mysql.replicationPassword).toBe('');
132
+ });
133
+ });
134
+ describe('LogSettings', () => {
135
+ it('should have correct defaults', () => {
136
+ const settings = (0, settings_1.getSettings)();
137
+ expect(settings.logging.level).toBe('INFO');
138
+ expect(settings.logging.format).toBe('json');
139
+ });
140
+ });
141
+ describe('Environment variable loading', () => {
142
+ it('should load settings from environment variables', () => {
143
+ process.env.API_PORT = '9090';
144
+ process.env.DB_TYPE = 'mysql';
145
+ process.env.AUTO_FAILOVER_ENABLED = 'false';
146
+ (0, settings_1.resetSettings)();
147
+ const settings = (0, settings_1.getSettings)();
148
+ expect(settings.api.port).toBe(9090);
149
+ expect(settings.database.type).toBe('mysql');
150
+ expect(settings.failover.autoFailoverEnabled).toBe(false);
151
+ });
152
+ });
153
+ });
154
+ //# sourceMappingURL=settings.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.test.js","sourceRoot":"","sources":["../../../src/__tests__/config/settings.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for Orchestrator client
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=topology.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"topology.test.d.ts","sourceRoot":"","sources":["../../../../src/__tests__/core/discovery/topology.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}