@neverinfamous/mysql-mcp 2.3.0 → 3.0.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 (347) hide show
  1. package/.dockerignore +1 -0
  2. package/.gitattributes +18 -0
  3. package/.github/workflows/codeql.yml +2 -10
  4. package/.github/workflows/docker-publish.yml +15 -13
  5. package/CHANGELOG.md +287 -1
  6. package/DOCKER_README.md +100 -265
  7. package/Dockerfile +5 -0
  8. package/README.md +124 -59
  9. package/VERSION +1 -1
  10. package/dist/__tests__/mocks/adapter.d.ts.map +1 -1
  11. package/dist/__tests__/mocks/adapter.js +2 -0
  12. package/dist/__tests__/mocks/adapter.js.map +1 -1
  13. package/dist/adapters/DatabaseAdapter.d.ts.map +1 -1
  14. package/dist/adapters/DatabaseAdapter.js +50 -9
  15. package/dist/adapters/DatabaseAdapter.js.map +1 -1
  16. package/dist/adapters/mysql/MySQLAdapter.d.ts +6 -0
  17. package/dist/adapters/mysql/MySQLAdapter.d.ts.map +1 -1
  18. package/dist/adapters/mysql/MySQLAdapter.js +8 -0
  19. package/dist/adapters/mysql/MySQLAdapter.js.map +1 -1
  20. package/dist/adapters/mysql/SchemaManager.js +16 -15
  21. package/dist/adapters/mysql/SchemaManager.js.map +1 -1
  22. package/dist/adapters/mysql/prompts/index.js +10 -20
  23. package/dist/adapters/mysql/prompts/index.js.map +1 -1
  24. package/dist/adapters/mysql/prompts/proxysqlSetup.js +1 -1
  25. package/dist/adapters/mysql/resources/docstore.d.ts.map +1 -1
  26. package/dist/adapters/mysql/resources/docstore.js +10 -7
  27. package/dist/adapters/mysql/resources/docstore.js.map +1 -1
  28. package/dist/adapters/mysql/resources/events.js +11 -8
  29. package/dist/adapters/mysql/resources/events.js.map +1 -1
  30. package/dist/adapters/mysql/resources/indexes.d.ts.map +1 -1
  31. package/dist/adapters/mysql/resources/indexes.js +12 -15
  32. package/dist/adapters/mysql/resources/indexes.js.map +1 -1
  33. package/dist/adapters/mysql/resources/innodb.d.ts.map +1 -1
  34. package/dist/adapters/mysql/resources/innodb.js +20 -17
  35. package/dist/adapters/mysql/resources/innodb.js.map +1 -1
  36. package/dist/adapters/mysql/resources/locks.d.ts.map +1 -1
  37. package/dist/adapters/mysql/resources/locks.js +9 -6
  38. package/dist/adapters/mysql/resources/locks.js.map +1 -1
  39. package/dist/adapters/mysql/resources/performance.d.ts.map +1 -1
  40. package/dist/adapters/mysql/resources/performance.js +15 -15
  41. package/dist/adapters/mysql/resources/performance.js.map +1 -1
  42. package/dist/adapters/mysql/resources/spatial.d.ts.map +1 -1
  43. package/dist/adapters/mysql/resources/spatial.js +9 -6
  44. package/dist/adapters/mysql/resources/spatial.js.map +1 -1
  45. package/dist/adapters/mysql/resources/sysschema.d.ts.map +1 -1
  46. package/dist/adapters/mysql/resources/sysschema.js +12 -9
  47. package/dist/adapters/mysql/resources/sysschema.js.map +1 -1
  48. package/dist/adapters/mysql/tools/admin/backup.d.ts.map +1 -1
  49. package/dist/adapters/mysql/tools/admin/backup.js +170 -121
  50. package/dist/adapters/mysql/tools/admin/backup.js.map +1 -1
  51. package/dist/adapters/mysql/tools/admin/maintenance.d.ts.map +1 -1
  52. package/dist/adapters/mysql/tools/admin/maintenance.js +106 -57
  53. package/dist/adapters/mysql/tools/admin/maintenance.js.map +1 -1
  54. package/dist/adapters/mysql/tools/admin/monitoring.d.ts.map +1 -1
  55. package/dist/adapters/mysql/tools/admin/monitoring.js +183 -101
  56. package/dist/adapters/mysql/tools/admin/monitoring.js.map +1 -1
  57. package/dist/adapters/mysql/tools/cluster/group-replication.d.ts.map +1 -1
  58. package/dist/adapters/mysql/tools/cluster/group-replication.js +164 -120
  59. package/dist/adapters/mysql/tools/cluster/group-replication.js.map +1 -1
  60. package/dist/adapters/mysql/tools/cluster/innodb-cluster.d.ts.map +1 -1
  61. package/dist/adapters/mysql/tools/cluster/innodb-cluster.js +212 -145
  62. package/dist/adapters/mysql/tools/cluster/innodb-cluster.js.map +1 -1
  63. package/dist/adapters/mysql/tools/codemode/index.d.ts.map +1 -1
  64. package/dist/adapters/mysql/tools/codemode/index.js +6 -4
  65. package/dist/adapters/mysql/tools/codemode/index.js.map +1 -1
  66. package/dist/adapters/mysql/tools/core.d.ts.map +1 -1
  67. package/dist/adapters/mysql/tools/core.js +152 -29
  68. package/dist/adapters/mysql/tools/core.js.map +1 -1
  69. package/dist/adapters/mysql/tools/docstore.d.ts.map +1 -1
  70. package/dist/adapters/mysql/tools/docstore.js +340 -163
  71. package/dist/adapters/mysql/tools/docstore.js.map +1 -1
  72. package/dist/adapters/mysql/tools/events.d.ts.map +1 -1
  73. package/dist/adapters/mysql/tools/events.js +284 -198
  74. package/dist/adapters/mysql/tools/events.js.map +1 -1
  75. package/dist/adapters/mysql/tools/json/core.d.ts.map +1 -1
  76. package/dist/adapters/mysql/tools/json/core.js +11 -39
  77. package/dist/adapters/mysql/tools/json/core.js.map +1 -1
  78. package/dist/adapters/mysql/tools/json/enhanced.d.ts.map +1 -1
  79. package/dist/adapters/mysql/tools/json/enhanced.js +15 -33
  80. package/dist/adapters/mysql/tools/json/enhanced.js.map +1 -1
  81. package/dist/adapters/mysql/tools/json/helpers.d.ts.map +1 -1
  82. package/dist/adapters/mysql/tools/json/helpers.js +13 -24
  83. package/dist/adapters/mysql/tools/json/helpers.js.map +1 -1
  84. package/dist/adapters/mysql/tools/partitioning.js +3 -0
  85. package/dist/adapters/mysql/tools/partitioning.js.map +1 -1
  86. package/dist/adapters/mysql/tools/performance/analysis.d.ts.map +1 -1
  87. package/dist/adapters/mysql/tools/performance/analysis.js +89 -60
  88. package/dist/adapters/mysql/tools/performance/analysis.js.map +1 -1
  89. package/dist/adapters/mysql/tools/performance/optimization.d.ts.map +1 -1
  90. package/dist/adapters/mysql/tools/performance/optimization.js +151 -127
  91. package/dist/adapters/mysql/tools/performance/optimization.js.map +1 -1
  92. package/dist/adapters/mysql/tools/proxysql.d.ts +1 -1
  93. package/dist/adapters/mysql/tools/proxysql.d.ts.map +1 -1
  94. package/dist/adapters/mysql/tools/proxysql.js +289 -176
  95. package/dist/adapters/mysql/tools/proxysql.js.map +1 -1
  96. package/dist/adapters/mysql/tools/replication.js +75 -49
  97. package/dist/adapters/mysql/tools/replication.js.map +1 -1
  98. package/dist/adapters/mysql/tools/roles.d.ts.map +1 -1
  99. package/dist/adapters/mysql/tools/roles.js +224 -182
  100. package/dist/adapters/mysql/tools/roles.js.map +1 -1
  101. package/dist/adapters/mysql/tools/router.d.ts.map +1 -1
  102. package/dist/adapters/mysql/tools/router.js +168 -67
  103. package/dist/adapters/mysql/tools/router.js.map +1 -1
  104. package/dist/adapters/mysql/tools/schema/constraints.d.ts.map +1 -1
  105. package/dist/adapters/mysql/tools/schema/constraints.js +21 -3
  106. package/dist/adapters/mysql/tools/schema/constraints.js.map +1 -1
  107. package/dist/adapters/mysql/tools/schema/management.d.ts.map +1 -1
  108. package/dist/adapters/mysql/tools/schema/management.js +61 -14
  109. package/dist/adapters/mysql/tools/schema/management.js.map +1 -1
  110. package/dist/adapters/mysql/tools/schema/routines.d.ts.map +1 -1
  111. package/dist/adapters/mysql/tools/schema/routines.js +27 -4
  112. package/dist/adapters/mysql/tools/schema/routines.js.map +1 -1
  113. package/dist/adapters/mysql/tools/schema/scheduled_events.d.ts.map +1 -1
  114. package/dist/adapters/mysql/tools/schema/scheduled_events.js +24 -3
  115. package/dist/adapters/mysql/tools/schema/scheduled_events.js.map +1 -1
  116. package/dist/adapters/mysql/tools/schema/triggers.d.ts.map +1 -1
  117. package/dist/adapters/mysql/tools/schema/triggers.js +23 -2
  118. package/dist/adapters/mysql/tools/schema/triggers.js.map +1 -1
  119. package/dist/adapters/mysql/tools/schema/views.d.ts.map +1 -1
  120. package/dist/adapters/mysql/tools/schema/views.js +47 -7
  121. package/dist/adapters/mysql/tools/schema/views.js.map +1 -1
  122. package/dist/adapters/mysql/tools/security/audit.d.ts.map +1 -1
  123. package/dist/adapters/mysql/tools/security/audit.js +102 -34
  124. package/dist/adapters/mysql/tools/security/audit.js.map +1 -1
  125. package/dist/adapters/mysql/tools/security/data-protection.d.ts.map +1 -1
  126. package/dist/adapters/mysql/tools/security/data-protection.js +264 -205
  127. package/dist/adapters/mysql/tools/security/data-protection.js.map +1 -1
  128. package/dist/adapters/mysql/tools/security/encryption.d.ts.map +1 -1
  129. package/dist/adapters/mysql/tools/security/encryption.js +137 -104
  130. package/dist/adapters/mysql/tools/security/encryption.js.map +1 -1
  131. package/dist/adapters/mysql/tools/shell/backup.d.ts.map +1 -1
  132. package/dist/adapters/mysql/tools/shell/backup.js +71 -59
  133. package/dist/adapters/mysql/tools/shell/backup.js.map +1 -1
  134. package/dist/adapters/mysql/tools/shell/restore.d.ts.map +1 -1
  135. package/dist/adapters/mysql/tools/shell/restore.js +61 -47
  136. package/dist/adapters/mysql/tools/shell/restore.js.map +1 -1
  137. package/dist/adapters/mysql/tools/spatial/geometry.d.ts.map +1 -1
  138. package/dist/adapters/mysql/tools/spatial/geometry.js +19 -5
  139. package/dist/adapters/mysql/tools/spatial/geometry.js.map +1 -1
  140. package/dist/adapters/mysql/tools/spatial/operations.d.ts.map +1 -1
  141. package/dist/adapters/mysql/tools/spatial/operations.js +42 -17
  142. package/dist/adapters/mysql/tools/spatial/operations.js.map +1 -1
  143. package/dist/adapters/mysql/tools/spatial/queries.d.ts.map +1 -1
  144. package/dist/adapters/mysql/tools/spatial/queries.js +109 -57
  145. package/dist/adapters/mysql/tools/spatial/queries.js.map +1 -1
  146. package/dist/adapters/mysql/tools/spatial/setup.d.ts.map +1 -1
  147. package/dist/adapters/mysql/tools/spatial/setup.js +103 -50
  148. package/dist/adapters/mysql/tools/spatial/setup.js.map +1 -1
  149. package/dist/adapters/mysql/tools/stats/comparative.d.ts.map +1 -1
  150. package/dist/adapters/mysql/tools/stats/comparative.js +128 -79
  151. package/dist/adapters/mysql/tools/stats/comparative.js.map +1 -1
  152. package/dist/adapters/mysql/tools/stats/descriptive.d.ts.map +1 -1
  153. package/dist/adapters/mysql/tools/stats/descriptive.js +174 -102
  154. package/dist/adapters/mysql/tools/stats/descriptive.js.map +1 -1
  155. package/dist/adapters/mysql/tools/sysschema/activity.d.ts.map +1 -1
  156. package/dist/adapters/mysql/tools/sysschema/activity.js +50 -25
  157. package/dist/adapters/mysql/tools/sysschema/activity.js.map +1 -1
  158. package/dist/adapters/mysql/tools/sysschema/performance.d.ts.map +1 -1
  159. package/dist/adapters/mysql/tools/sysschema/performance.js +121 -66
  160. package/dist/adapters/mysql/tools/sysschema/performance.js.map +1 -1
  161. package/dist/adapters/mysql/tools/sysschema/resources.d.ts.map +1 -1
  162. package/dist/adapters/mysql/tools/sysschema/resources.js +101 -64
  163. package/dist/adapters/mysql/tools/sysschema/resources.js.map +1 -1
  164. package/dist/adapters/mysql/tools/text/fulltext.d.ts.map +1 -1
  165. package/dist/adapters/mysql/tools/text/fulltext.js +18 -32
  166. package/dist/adapters/mysql/tools/text/fulltext.js.map +1 -1
  167. package/dist/adapters/mysql/tools/transactions.d.ts.map +1 -1
  168. package/dist/adapters/mysql/tools/transactions.js +48 -23
  169. package/dist/adapters/mysql/tools/transactions.js.map +1 -1
  170. package/dist/adapters/mysql/types/proxysql-types.d.ts +15 -0
  171. package/dist/adapters/mysql/types/proxysql-types.d.ts.map +1 -1
  172. package/dist/adapters/mysql/types/proxysql-types.js +33 -1
  173. package/dist/adapters/mysql/types/proxysql-types.js.map +1 -1
  174. package/dist/adapters/mysql/types/router-types.d.ts +1 -1
  175. package/dist/adapters/mysql/types/router-types.js +1 -1
  176. package/dist/adapters/mysql/types/router-types.js.map +1 -1
  177. package/dist/adapters/mysql/types/shell-types.js +2 -2
  178. package/dist/adapters/mysql/types/shell-types.js.map +1 -1
  179. package/dist/adapters/mysql/types.d.ts +485 -21
  180. package/dist/adapters/mysql/types.d.ts.map +1 -1
  181. package/dist/adapters/mysql/types.js +546 -19
  182. package/dist/adapters/mysql/types.js.map +1 -1
  183. package/dist/auth/scopes.js +1 -1
  184. package/dist/auth/scopes.js.map +1 -1
  185. package/dist/codemode/api.d.ts +3 -2
  186. package/dist/codemode/api.d.ts.map +1 -1
  187. package/dist/codemode/api.js +80 -5
  188. package/dist/codemode/api.js.map +1 -1
  189. package/dist/codemode/sandbox-factory.js +1 -1
  190. package/dist/codemode/sandbox-factory.js.map +1 -1
  191. package/dist/codemode/types.d.ts +26 -0
  192. package/dist/codemode/types.d.ts.map +1 -1
  193. package/dist/codemode/types.js +2 -0
  194. package/dist/codemode/types.js.map +1 -1
  195. package/dist/codemode/worker-sandbox.d.ts +4 -2
  196. package/dist/codemode/worker-sandbox.d.ts.map +1 -1
  197. package/dist/codemode/worker-sandbox.js +66 -7
  198. package/dist/codemode/worker-sandbox.js.map +1 -1
  199. package/dist/codemode/worker-script.d.ts +3 -0
  200. package/dist/codemode/worker-script.d.ts.map +1 -1
  201. package/dist/codemode/worker-script.js +128 -75
  202. package/dist/codemode/worker-script.js.map +1 -1
  203. package/dist/constants/ServerInstructions.d.ts +1 -1
  204. package/dist/constants/ServerInstructions.d.ts.map +1 -1
  205. package/dist/constants/ServerInstructions.js +37 -31
  206. package/dist/constants/ServerInstructions.js.map +1 -1
  207. package/dist/filtering/ToolConstants.d.ts +1 -1
  208. package/dist/filtering/ToolConstants.d.ts.map +1 -1
  209. package/dist/filtering/ToolConstants.js +1 -2
  210. package/dist/filtering/ToolConstants.js.map +1 -1
  211. package/dist/pool/ConnectionPool.d.ts.map +1 -1
  212. package/dist/pool/ConnectionPool.js.map +1 -1
  213. package/dist/transports/http.d.ts.map +1 -1
  214. package/dist/transports/http.js +6 -0
  215. package/dist/transports/http.js.map +1 -1
  216. package/dist/utils/validators.d.ts +1 -1
  217. package/dist/utils/validators.d.ts.map +1 -1
  218. package/dist/utils/validators.js.map +1 -1
  219. package/package.json +4 -4
  220. package/releases/v2.3.0-release-notes.md +20 -20
  221. package/releases/v2.3.1-release-notes.md +34 -0
  222. package/releases/v3.0.0-release-notes.md +81 -0
  223. package/src/__tests__/mocks/adapter.ts +3 -0
  224. package/src/__tests__/perf.test.ts +6 -6
  225. package/src/adapters/DatabaseAdapter.ts +58 -9
  226. package/src/adapters/__tests__/DatabaseAdapter.test.ts +89 -8
  227. package/src/adapters/mysql/MySQLAdapter.ts +17 -2
  228. package/src/adapters/mysql/SchemaManager.ts +21 -21
  229. package/src/adapters/mysql/__tests__/MySQLAdapter.test.ts +1 -1
  230. package/src/adapters/mysql/prompts/index.ts +12 -22
  231. package/src/adapters/mysql/prompts/proxysqlSetup.ts +1 -1
  232. package/src/adapters/mysql/resources/docstore.ts +13 -10
  233. package/src/adapters/mysql/resources/events.ts +12 -12
  234. package/src/adapters/mysql/resources/indexes.ts +17 -19
  235. package/src/adapters/mysql/resources/innodb.ts +23 -22
  236. package/src/adapters/mysql/resources/locks.ts +9 -7
  237. package/src/adapters/mysql/resources/performance.ts +23 -18
  238. package/src/adapters/mysql/resources/spatial.ts +9 -7
  239. package/src/adapters/mysql/resources/sysschema.ts +12 -11
  240. package/src/adapters/mysql/tools/__tests__/core.test.ts +126 -55
  241. package/src/adapters/mysql/tools/__tests__/docstore.test.ts +459 -88
  242. package/src/adapters/mysql/tools/__tests__/events.test.ts +281 -103
  243. package/src/adapters/mysql/tools/__tests__/proxysql.test.ts +128 -28
  244. package/src/adapters/mysql/tools/__tests__/replication.test.ts +48 -2
  245. package/src/adapters/mysql/tools/__tests__/roles.test.ts +15 -18
  246. package/src/adapters/mysql/tools/__tests__/router.test.ts +32 -5
  247. package/src/adapters/mysql/tools/__tests__/security.test.ts +126 -2
  248. package/src/adapters/mysql/tools/__tests__/security_injection.test.ts +84 -76
  249. package/src/adapters/mysql/tools/__tests__/security_integration.test.ts +47 -50
  250. package/src/adapters/mysql/tools/__tests__/spatial.test.ts +11 -10
  251. package/src/adapters/mysql/tools/__tests__/spatial_handler.test.ts +54 -38
  252. package/src/adapters/mysql/tools/__tests__/stats.test.ts +285 -152
  253. package/src/adapters/mysql/tools/__tests__/transactions.test.ts +13 -13
  254. package/src/adapters/mysql/tools/admin/__tests__/backup.test.ts +171 -25
  255. package/src/adapters/mysql/tools/admin/__tests__/maintenance.test.ts +240 -4
  256. package/src/adapters/mysql/tools/admin/__tests__/monitoring-summary.test.ts +274 -0
  257. package/src/adapters/mysql/tools/admin/__tests__/monitoring.test.ts +94 -5
  258. package/src/adapters/mysql/tools/admin/backup.ts +193 -143
  259. package/src/adapters/mysql/tools/admin/maintenance.ts +118 -69
  260. package/src/adapters/mysql/tools/admin/monitoring.ts +201 -125
  261. package/src/adapters/mysql/tools/cluster/__tests__/group-replication.test.ts +69 -0
  262. package/src/adapters/mysql/tools/cluster/__tests__/innodb-cluster.test.ts +141 -0
  263. package/src/adapters/mysql/tools/cluster/group-replication.ts +172 -132
  264. package/src/adapters/mysql/tools/cluster/innodb-cluster.ts +231 -157
  265. package/src/adapters/mysql/tools/codemode/__tests__/codemode-tool.test.ts +227 -0
  266. package/src/adapters/mysql/tools/codemode/index.ts +5 -3
  267. package/src/adapters/mysql/tools/core.ts +152 -38
  268. package/src/adapters/mysql/tools/docstore.ts +422 -205
  269. package/src/adapters/mysql/tools/events.ts +334 -233
  270. package/src/adapters/mysql/tools/json/__tests__/core.test.ts +20 -0
  271. package/src/adapters/mysql/tools/json/__tests__/enhanced.test.ts +82 -50
  272. package/src/adapters/mysql/tools/json/__tests__/helpers.test.ts +42 -3
  273. package/src/adapters/mysql/tools/json/core.ts +21 -42
  274. package/src/adapters/mysql/tools/json/enhanced.ts +22 -37
  275. package/src/adapters/mysql/tools/json/helpers.ts +21 -25
  276. package/src/adapters/mysql/tools/partitioning.ts +3 -0
  277. package/src/adapters/mysql/tools/performance/__tests__/analysis.test.ts +98 -5
  278. package/src/adapters/mysql/tools/performance/__tests__/optimization-coverage.test.ts +515 -0
  279. package/src/adapters/mysql/tools/performance/__tests__/optimization.test.ts +187 -0
  280. package/src/adapters/mysql/tools/performance/analysis.ts +95 -69
  281. package/src/adapters/mysql/tools/performance/optimization.ts +182 -153
  282. package/src/adapters/mysql/tools/proxysql.ts +314 -209
  283. package/src/adapters/mysql/tools/replication.ts +84 -57
  284. package/src/adapters/mysql/tools/roles.ts +274 -226
  285. package/src/adapters/mysql/tools/router.ts +181 -85
  286. package/src/adapters/mysql/tools/schema/__tests__/constraints.test.ts +13 -0
  287. package/src/adapters/mysql/tools/schema/__tests__/management.test.ts +60 -25
  288. package/src/adapters/mysql/tools/schema/__tests__/scheduled_events.test.ts +11 -0
  289. package/src/adapters/mysql/tools/schema/__tests__/triggers.test.ts +25 -4
  290. package/src/adapters/mysql/tools/schema/__tests__/views.test.ts +46 -14
  291. package/src/adapters/mysql/tools/schema/constraints.ts +22 -3
  292. package/src/adapters/mysql/tools/schema/management.ts +60 -15
  293. package/src/adapters/mysql/tools/schema/routines.ts +26 -4
  294. package/src/adapters/mysql/tools/schema/scheduled_events.ts +25 -3
  295. package/src/adapters/mysql/tools/schema/triggers.ts +27 -2
  296. package/src/adapters/mysql/tools/schema/views.ts +46 -8
  297. package/src/adapters/mysql/tools/security/__tests__/audit.test.ts +90 -4
  298. package/src/adapters/mysql/tools/security/audit.ts +113 -39
  299. package/src/adapters/mysql/tools/security/data-protection.ts +293 -233
  300. package/src/adapters/mysql/tools/security/encryption.ts +172 -139
  301. package/src/adapters/mysql/tools/shell/__tests__/backup.test.ts +29 -0
  302. package/src/adapters/mysql/tools/shell/backup.ts +90 -73
  303. package/src/adapters/mysql/tools/shell/restore.ts +62 -48
  304. package/src/adapters/mysql/tools/spatial/__tests__/operations.test.ts +22 -14
  305. package/src/adapters/mysql/tools/spatial/__tests__/queries.test.ts +65 -51
  306. package/src/adapters/mysql/tools/spatial/geometry.ts +23 -7
  307. package/src/adapters/mysql/tools/spatial/operations.ts +60 -31
  308. package/src/adapters/mysql/tools/spatial/queries.ts +142 -65
  309. package/src/adapters/mysql/tools/spatial/setup.ts +121 -55
  310. package/src/adapters/mysql/tools/stats/__tests__/comparative.test.ts +12 -10
  311. package/src/adapters/mysql/tools/stats/comparative.ts +150 -98
  312. package/src/adapters/mysql/tools/stats/descriptive.ts +204 -127
  313. package/src/adapters/mysql/tools/sysschema/__tests__/error-paths.test.ts +222 -0
  314. package/src/adapters/mysql/tools/sysschema/__tests__/performance.test.ts +45 -0
  315. package/src/adapters/mysql/tools/sysschema/__tests__/resources.test.ts +6 -3
  316. package/src/adapters/mysql/tools/sysschema/activity.ts +52 -27
  317. package/src/adapters/mysql/tools/sysschema/performance.ts +132 -68
  318. package/src/adapters/mysql/tools/sysschema/resources.ts +105 -67
  319. package/src/adapters/mysql/tools/text/__tests__/fulltext.test.ts +45 -17
  320. package/src/adapters/mysql/tools/text/fulltext.ts +27 -38
  321. package/src/adapters/mysql/tools/transactions.ts +49 -24
  322. package/src/adapters/mysql/types/proxysql-types.ts +38 -1
  323. package/src/adapters/mysql/types/router-types.ts +1 -1
  324. package/src/adapters/mysql/types/shell-types.ts +2 -2
  325. package/src/adapters/mysql/types.ts +632 -19
  326. package/src/auth/__tests__/scopes.test.ts +2 -2
  327. package/src/auth/scopes.ts +1 -1
  328. package/src/codemode/__tests__/api.test.ts +417 -0
  329. package/src/codemode/__tests__/sandbox-factory.test.ts +158 -0
  330. package/src/codemode/__tests__/sandbox.test.ts +301 -0
  331. package/src/codemode/__tests__/security.test.ts +368 -0
  332. package/src/codemode/__tests__/worker-sandbox.test.ts +179 -0
  333. package/src/codemode/__tests__/worker-script.test.ts +226 -0
  334. package/src/codemode/api.ts +89 -5
  335. package/src/codemode/sandbox-factory.ts +1 -1
  336. package/src/codemode/types.ts +34 -0
  337. package/src/codemode/worker-sandbox.ts +74 -7
  338. package/src/codemode/worker-script.ts +157 -86
  339. package/src/constants/ServerInstructions.ts +37 -31
  340. package/src/filtering/ToolConstants.ts +1 -2
  341. package/src/filtering/__tests__/ToolFilter.test.ts +9 -9
  342. package/src/pool/ConnectionPool.ts +4 -1
  343. package/src/transports/__tests__/http.test.ts +15 -3
  344. package/src/transports/http.ts +12 -0
  345. package/src/utils/validators.ts +2 -1
  346. package/vitest.config.ts +3 -1
  347. package/CODE_MODE.md +0 -245
@@ -5,6 +5,7 @@
5
5
  * 4 tools: export, import, dump, restore.
6
6
  */
7
7
 
8
+ import { z, ZodError } from "zod";
8
9
  import type { MySQLAdapter } from "../../MySQLAdapter.js";
9
10
  import type {
10
11
  ToolDefinition,
@@ -16,12 +17,21 @@ import {
16
17
  ImportDataSchema,
17
18
  ImportDataSchemaBase,
18
19
  } from "../../types.js";
19
- import { z } from "zod";
20
20
  import {
21
21
  validateIdentifier,
22
22
  validateWhereClause,
23
23
  } from "../../../../utils/validators.js";
24
24
 
25
+ /** Extract human-readable messages from a ZodError instead of raw JSON array */
26
+ function formatZodError(error: ZodError): string {
27
+ return error.issues.map((i) => i.message).join("; ");
28
+ }
29
+
30
+ /** Strip verbose adapter prefixes from MySQL error messages */
31
+ function stripErrorPrefix(msg: string): string {
32
+ return msg.replace(/^(Query failed:\s*)?(Execute failed:\s*)?/i, "");
33
+ }
34
+
25
35
  /**
26
36
  * Format a value for MySQL export.
27
37
  * Handles Date objects, null, undefined, and other types.
@@ -105,71 +115,87 @@ export function createExportTableTool(adapter: MySQLAdapter): ToolDefinition {
105
115
  readOnlyHint: true,
106
116
  },
107
117
  handler: async (params: unknown, _context: RequestContext) => {
108
- const { table, format, where, limit } = ExportTableSchema.parse(params);
109
-
110
- // Validate inputs for SQL injection prevention
111
- validateIdentifier(table, "table");
112
- if (where) {
113
- validateWhereClause(where);
114
- }
115
-
116
- // Get table data
117
- let sql = `SELECT * FROM \`${table}\``;
118
- if (where) {
119
- sql += ` WHERE ${where}`;
120
- }
121
- if (limit !== undefined) {
122
- sql += ` LIMIT ${limit}`;
123
- }
124
-
125
- let rows: Record<string, unknown>[];
126
118
  try {
127
- const result = await adapter.executeReadQuery(sql);
128
- rows = result.rows ?? [];
129
- } catch (error) {
130
- const msg = error instanceof Error ? error.message : String(error);
131
- if (msg.includes("doesn't exist")) {
132
- return { exists: false, table };
119
+ const { table, format, where, limit, batch } =
120
+ ExportTableSchema.parse(params);
121
+
122
+ // Validate inputs for SQL injection prevention
123
+ validateIdentifier(table, "table");
124
+ if (where) {
125
+ validateWhereClause(where);
133
126
  }
134
- return { success: false, error: msg };
135
- }
136
127
 
137
- if (format === "CSV") {
138
- if (rows.length === 0) {
139
- return { csv: "", rowCount: 0 };
128
+ // Get table data
129
+ let sql = `SELECT * FROM \`${table}\``;
130
+ if (where) {
131
+ sql += ` WHERE ${where}`;
132
+ }
133
+ if (limit !== undefined) {
134
+ sql += ` LIMIT ${limit}`;
140
135
  }
141
136
 
142
- const firstRow = rows[0];
143
- if (!firstRow) {
144
- return { csv: "", rowCount: 0 };
137
+ let rows: Record<string, unknown>[];
138
+ try {
139
+ const result = await adapter.executeReadQuery(sql);
140
+ rows = result.rows ?? [];
141
+ } catch (error) {
142
+ const msg = error instanceof Error ? error.message : String(error);
143
+ if (msg.includes("doesn't exist")) {
144
+ return { exists: false, table };
145
+ }
146
+ return { success: false, error: stripErrorPrefix(msg) };
145
147
  }
146
148
 
147
- const headers = Object.keys(firstRow);
148
- const csvLines = [headers.join(",")];
149
+ if (format === "CSV") {
150
+ if (rows.length === 0) {
151
+ return { csv: "", rowCount: 0 };
152
+ }
149
153
 
150
- for (const row of rows) {
151
- const values = headers.map((h) => formatForCSV(row[h]));
152
- csvLines.push(values.join(","));
153
- }
154
+ const firstRow = rows[0];
155
+ if (!firstRow) {
156
+ return { csv: "", rowCount: 0 };
157
+ }
154
158
 
155
- return { csv: csvLines.join("\n"), rowCount: rows.length };
156
- }
159
+ const headers = Object.keys(firstRow);
160
+ const csvLines = [headers.join(",")];
161
+
162
+ for (const row of rows) {
163
+ const values = headers.map((h) => formatForCSV(row[h]));
164
+ csvLines.push(values.join(","));
165
+ }
166
+
167
+ return { csv: csvLines.join("\n"), rowCount: rows.length };
168
+ }
157
169
 
158
- // SQL format
159
- const insertStatements: string[] = [];
170
+ // SQL format
171
+ const firstRow = rows[0];
172
+ if (!firstRow) {
173
+ return { sql: "", rowCount: 0 };
174
+ }
160
175
 
161
- for (const row of rows) {
162
- const columns = Object.keys(row)
176
+ const columns = Object.keys(firstRow)
163
177
  .map((c) => `\`${c}\``)
164
178
  .join(", ");
165
- const values = Object.values(row).map(formatForMySQL).join(", ");
179
+ const insertStatements: string[] = [];
180
+
181
+ for (let i = 0; i < rows.length; i += batch) {
182
+ const chunk = rows.slice(i, i + batch);
183
+ const valueGroups = chunk.map(
184
+ (row) => `(${Object.values(row).map(formatForMySQL).join(", ")})`,
185
+ );
186
+ insertStatements.push(
187
+ `INSERT INTO \`${table}\` (${columns}) VALUES ${valueGroups.join(", ")};`,
188
+ );
189
+ }
166
190
 
167
- insertStatements.push(
168
- `INSERT INTO \`${table}\` (${columns}) VALUES (${values});`,
169
- );
191
+ return { sql: insertStatements.join("\n"), rowCount: rows.length };
192
+ } catch (error) {
193
+ if (error instanceof ZodError) {
194
+ return { success: false, error: formatZodError(error) };
195
+ }
196
+ const message = error instanceof Error ? error.message : String(error);
197
+ return { success: false, error: message };
170
198
  }
171
-
172
- return { sql: insertStatements.join("\n"), rowCount: rows.length };
173
199
  },
174
200
  };
175
201
  }
@@ -186,62 +212,70 @@ export function createImportDataTool(adapter: MySQLAdapter): ToolDefinition {
186
212
  readOnlyHint: false,
187
213
  },
188
214
  handler: async (params: unknown, _context: RequestContext) => {
189
- const { table, data } = ImportDataSchema.parse(params);
190
-
191
- // Validate table name for SQL injection prevention
192
- validateIdentifier(table, "table");
215
+ try {
216
+ const { table, data } = ImportDataSchema.parse(params);
193
217
 
194
- if (data.length === 0) {
195
- return { success: true, rowsInserted: 0 };
196
- }
218
+ // Validate table name for SQL injection prevention
219
+ validateIdentifier(table, "table");
197
220
 
198
- // Validate all column names upfront (throws for SQL injection - must not be caught)
199
- for (const row of data) {
200
- for (const colName of Object.keys(row)) {
201
- validateIdentifier(colName, "column");
221
+ if (data.length === 0) {
222
+ return { success: true, rowsInserted: 0 };
202
223
  }
203
- }
204
224
 
205
- let totalInserted = 0;
206
-
207
- try {
225
+ // Validate all column names upfront (throws for SQL injection - must not be caught)
208
226
  for (const row of data) {
209
- const columns = Object.keys(row)
210
- .map((c) => `\`${c}\``)
211
- .join(", ");
212
- const placeholders = Object.keys(row)
213
- .map(() => "?")
214
- .join(", ");
215
- const values = Object.values(row);
216
-
217
- const sql = `INSERT INTO \`${table}\` (${columns}) VALUES (${placeholders})`;
218
- await adapter.executeWriteQuery(sql, values);
219
- totalInserted++;
220
- }
221
- } catch (error) {
222
- const errorMessage =
223
- error instanceof Error ? error.message : String(error);
224
- // Graceful handling for missing table (P154)
225
- if (errorMessage.includes("doesn't exist")) {
226
- return { exists: false, table };
227
+ for (const colName of Object.keys(row)) {
228
+ validateIdentifier(colName, "column");
229
+ }
227
230
  }
228
- // Graceful handling for duplicate key violations
229
- if (errorMessage.includes("Duplicate entry")) {
231
+
232
+ let totalInserted = 0;
233
+
234
+ try {
235
+ for (const row of data) {
236
+ const columns = Object.keys(row)
237
+ .map((c) => `\`${c}\``)
238
+ .join(", ");
239
+ const placeholders = Object.keys(row)
240
+ .map(() => "?")
241
+ .join(", ");
242
+ const values = Object.values(row);
243
+
244
+ const sql = `INSERT INTO \`${table}\` (${columns}) VALUES (${placeholders})`;
245
+ await adapter.executeWriteQuery(sql, values);
246
+ totalInserted++;
247
+ }
248
+ } catch (error) {
249
+ const errorMessage =
250
+ error instanceof Error ? error.message : String(error);
251
+ // Graceful handling for missing table (P154)
252
+ if (errorMessage.includes("doesn't exist")) {
253
+ return { exists: false, table };
254
+ }
255
+ // Graceful handling for duplicate key violations
256
+ if (errorMessage.includes("Duplicate entry")) {
257
+ return {
258
+ success: false,
259
+ error: stripErrorPrefix(errorMessage),
260
+ rowsInserted: totalInserted,
261
+ };
262
+ }
263
+ // Catch-all for other MySQL errors (unknown column, data truncation, etc.)
230
264
  return {
231
265
  success: false,
232
- error: errorMessage,
266
+ error: stripErrorPrefix(errorMessage),
233
267
  rowsInserted: totalInserted,
234
268
  };
235
269
  }
236
- // Catch-all for other MySQL errors (unknown column, data truncation, etc.)
237
- return {
238
- success: false,
239
- error: errorMessage,
240
- rowsInserted: totalInserted,
241
- };
242
- }
243
270
 
244
- return { success: true, rowsInserted: totalInserted };
271
+ return { success: true, rowsInserted: totalInserted };
272
+ } catch (error) {
273
+ if (error instanceof ZodError) {
274
+ return { success: false, error: formatZodError(error) };
275
+ }
276
+ const message = error instanceof Error ? error.message : String(error);
277
+ return { success: false, error: message };
278
+ }
245
279
  },
246
280
  };
247
281
  }
@@ -277,43 +311,51 @@ export function createCreateDumpTool(adapter: MySQLAdapter): ToolDefinition {
277
311
  idempotentHint: true,
278
312
  },
279
313
  handler: async (params: unknown, _context: RequestContext) => {
280
- const { database, tables, noData, singleTransaction } =
281
- schema.parse(params);
282
-
283
- // Get current database if not specified
284
- let dbName = database;
285
- if (!dbName) {
286
- const result = await adapter.executeReadQuery(
287
- "SELECT DATABASE() as db",
288
- );
289
- const dbValue = result.rows?.[0]?.["db"];
290
- if (typeof dbValue === "string") {
291
- dbName = dbValue;
292
- } else {
293
- dbName = "";
314
+ try {
315
+ const { database, tables, noData, singleTransaction } =
316
+ schema.parse(params);
317
+
318
+ // Get current database if not specified
319
+ let dbName = database;
320
+ if (!dbName) {
321
+ const result = await adapter.executeReadQuery(
322
+ "SELECT DATABASE() as db",
323
+ );
324
+ const dbValue = result.rows?.[0]?.["db"];
325
+ if (typeof dbValue === "string") {
326
+ dbName = dbValue;
327
+ } else {
328
+ dbName = "";
329
+ }
294
330
  }
295
- }
296
331
 
297
- let command = `mysqldump -u [username] -p ${dbName}`;
332
+ let command = `mysqldump -u [username] -p ${dbName}`;
298
333
 
299
- if (tables && tables.length > 0) {
300
- command += ` ${tables.join(" ")}`;
301
- }
334
+ if (tables && tables.length > 0) {
335
+ command += ` ${tables.join(" ")}`;
336
+ }
302
337
 
303
- if (noData) {
304
- command += " --no-data";
305
- }
338
+ if (noData) {
339
+ command += " --no-data";
340
+ }
306
341
 
307
- if (singleTransaction) {
308
- command += " --single-transaction";
309
- }
342
+ if (singleTransaction) {
343
+ command += " --single-transaction";
344
+ }
310
345
 
311
- command += " > backup.sql";
346
+ command += " > backup.sql";
312
347
 
313
- return {
314
- command,
315
- note: "Replace [username] with your MySQL username. Add -h [host] if connecting to a remote server.",
316
- };
348
+ return {
349
+ command,
350
+ note: "Replace [username] with your MySQL username. Add -h [host] if connecting to a remote server.",
351
+ };
352
+ } catch (error) {
353
+ if (error instanceof ZodError) {
354
+ return { success: false, error: formatZodError(error) };
355
+ }
356
+ const message = error instanceof Error ? error.message : String(error);
357
+ return { success: false, error: message };
358
+ }
317
359
  },
318
360
  };
319
361
  }
@@ -336,27 +378,35 @@ export function createRestoreDumpTool(adapter: MySQLAdapter): ToolDefinition {
336
378
  idempotentHint: true,
337
379
  },
338
380
  handler: async (params: unknown, _context: RequestContext) => {
339
- const { database, filename } = schema.parse(params);
340
-
341
- let dbName = database;
342
- if (!dbName) {
343
- const result = await adapter.executeReadQuery(
344
- "SELECT DATABASE() as db",
345
- );
346
- const dbValue = result.rows?.[0]?.["db"];
347
- if (typeof dbValue === "string") {
348
- dbName = dbValue;
349
- } else {
350
- dbName = "";
381
+ try {
382
+ const { database, filename } = schema.parse(params);
383
+
384
+ let dbName = database;
385
+ if (!dbName) {
386
+ const result = await adapter.executeReadQuery(
387
+ "SELECT DATABASE() as db",
388
+ );
389
+ const dbValue = result.rows?.[0]?.["db"];
390
+ if (typeof dbValue === "string") {
391
+ dbName = dbValue;
392
+ } else {
393
+ dbName = "";
394
+ }
351
395
  }
352
- }
353
396
 
354
- const command = `mysql -u [username] -p ${dbName} < ${filename}`;
397
+ const command = `mysql -u [username] -p ${dbName} < ${filename}`;
355
398
 
356
- return {
357
- command,
358
- note: "Replace [username] with your MySQL username. Add -h [host] if connecting to a remote server.",
359
- };
399
+ return {
400
+ command,
401
+ note: "Replace [username] with your MySQL username. Add -h [host] if connecting to a remote server.",
402
+ };
403
+ } catch (error) {
404
+ if (error instanceof ZodError) {
405
+ return { success: false, error: formatZodError(error) };
406
+ }
407
+ const message = error instanceof Error ? error.message : String(error);
408
+ return { success: false, error: message };
409
+ }
360
410
  },
361
411
  };
362
412
  }