@neverinfamous/mysql-mcp 2.3.1 → 3.0.1

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 (345) hide show
  1. package/.dockerignore +1 -0
  2. package/.gitattributes +18 -0
  3. package/.github/workflows/codeql.yml +2 -2
  4. package/.github/workflows/docker-publish.yml +5 -5
  5. package/CHANGELOG.md +348 -122
  6. package/DOCKER_README.md +81 -40
  7. package/README.md +87 -46
  8. package/VERSION +1 -1
  9. package/dist/__tests__/mocks/adapter.d.ts.map +1 -1
  10. package/dist/__tests__/mocks/adapter.js +2 -0
  11. package/dist/__tests__/mocks/adapter.js.map +1 -1
  12. package/dist/adapters/DatabaseAdapter.d.ts.map +1 -1
  13. package/dist/adapters/DatabaseAdapter.js +50 -9
  14. package/dist/adapters/DatabaseAdapter.js.map +1 -1
  15. package/dist/adapters/mysql/MySQLAdapter.d.ts +6 -0
  16. package/dist/adapters/mysql/MySQLAdapter.d.ts.map +1 -1
  17. package/dist/adapters/mysql/MySQLAdapter.js +8 -0
  18. package/dist/adapters/mysql/MySQLAdapter.js.map +1 -1
  19. package/dist/adapters/mysql/SchemaManager.js +16 -15
  20. package/dist/adapters/mysql/SchemaManager.js.map +1 -1
  21. package/dist/adapters/mysql/prompts/index.js +10 -20
  22. package/dist/adapters/mysql/prompts/index.js.map +1 -1
  23. package/dist/adapters/mysql/prompts/proxysqlSetup.js +1 -1
  24. package/dist/adapters/mysql/resources/docstore.d.ts.map +1 -1
  25. package/dist/adapters/mysql/resources/docstore.js +10 -7
  26. package/dist/adapters/mysql/resources/docstore.js.map +1 -1
  27. package/dist/adapters/mysql/resources/events.js +11 -8
  28. package/dist/adapters/mysql/resources/events.js.map +1 -1
  29. package/dist/adapters/mysql/resources/indexes.d.ts.map +1 -1
  30. package/dist/adapters/mysql/resources/indexes.js +12 -15
  31. package/dist/adapters/mysql/resources/indexes.js.map +1 -1
  32. package/dist/adapters/mysql/resources/innodb.d.ts.map +1 -1
  33. package/dist/adapters/mysql/resources/innodb.js +20 -17
  34. package/dist/adapters/mysql/resources/innodb.js.map +1 -1
  35. package/dist/adapters/mysql/resources/locks.d.ts.map +1 -1
  36. package/dist/adapters/mysql/resources/locks.js +9 -6
  37. package/dist/adapters/mysql/resources/locks.js.map +1 -1
  38. package/dist/adapters/mysql/resources/performance.d.ts.map +1 -1
  39. package/dist/adapters/mysql/resources/performance.js +15 -15
  40. package/dist/adapters/mysql/resources/performance.js.map +1 -1
  41. package/dist/adapters/mysql/resources/spatial.d.ts.map +1 -1
  42. package/dist/adapters/mysql/resources/spatial.js +9 -6
  43. package/dist/adapters/mysql/resources/spatial.js.map +1 -1
  44. package/dist/adapters/mysql/resources/sysschema.d.ts.map +1 -1
  45. package/dist/adapters/mysql/resources/sysschema.js +12 -9
  46. package/dist/adapters/mysql/resources/sysschema.js.map +1 -1
  47. package/dist/adapters/mysql/tools/admin/backup.d.ts.map +1 -1
  48. package/dist/adapters/mysql/tools/admin/backup.js +170 -121
  49. package/dist/adapters/mysql/tools/admin/backup.js.map +1 -1
  50. package/dist/adapters/mysql/tools/admin/maintenance.d.ts.map +1 -1
  51. package/dist/adapters/mysql/tools/admin/maintenance.js +106 -57
  52. package/dist/adapters/mysql/tools/admin/maintenance.js.map +1 -1
  53. package/dist/adapters/mysql/tools/admin/monitoring.d.ts.map +1 -1
  54. package/dist/adapters/mysql/tools/admin/monitoring.js +183 -101
  55. package/dist/adapters/mysql/tools/admin/monitoring.js.map +1 -1
  56. package/dist/adapters/mysql/tools/cluster/group-replication.d.ts.map +1 -1
  57. package/dist/adapters/mysql/tools/cluster/group-replication.js +164 -120
  58. package/dist/adapters/mysql/tools/cluster/group-replication.js.map +1 -1
  59. package/dist/adapters/mysql/tools/cluster/innodb-cluster.d.ts.map +1 -1
  60. package/dist/adapters/mysql/tools/cluster/innodb-cluster.js +212 -145
  61. package/dist/adapters/mysql/tools/cluster/innodb-cluster.js.map +1 -1
  62. package/dist/adapters/mysql/tools/codemode/index.d.ts.map +1 -1
  63. package/dist/adapters/mysql/tools/codemode/index.js +6 -4
  64. package/dist/adapters/mysql/tools/codemode/index.js.map +1 -1
  65. package/dist/adapters/mysql/tools/core.d.ts.map +1 -1
  66. package/dist/adapters/mysql/tools/core.js +152 -29
  67. package/dist/adapters/mysql/tools/core.js.map +1 -1
  68. package/dist/adapters/mysql/tools/docstore.d.ts.map +1 -1
  69. package/dist/adapters/mysql/tools/docstore.js +340 -163
  70. package/dist/adapters/mysql/tools/docstore.js.map +1 -1
  71. package/dist/adapters/mysql/tools/events.d.ts.map +1 -1
  72. package/dist/adapters/mysql/tools/events.js +284 -198
  73. package/dist/adapters/mysql/tools/events.js.map +1 -1
  74. package/dist/adapters/mysql/tools/json/core.d.ts.map +1 -1
  75. package/dist/adapters/mysql/tools/json/core.js +11 -39
  76. package/dist/adapters/mysql/tools/json/core.js.map +1 -1
  77. package/dist/adapters/mysql/tools/json/enhanced.d.ts.map +1 -1
  78. package/dist/adapters/mysql/tools/json/enhanced.js +15 -33
  79. package/dist/adapters/mysql/tools/json/enhanced.js.map +1 -1
  80. package/dist/adapters/mysql/tools/json/helpers.d.ts.map +1 -1
  81. package/dist/adapters/mysql/tools/json/helpers.js +13 -24
  82. package/dist/adapters/mysql/tools/json/helpers.js.map +1 -1
  83. package/dist/adapters/mysql/tools/partitioning.js +3 -0
  84. package/dist/adapters/mysql/tools/partitioning.js.map +1 -1
  85. package/dist/adapters/mysql/tools/performance/analysis.d.ts.map +1 -1
  86. package/dist/adapters/mysql/tools/performance/analysis.js +89 -60
  87. package/dist/adapters/mysql/tools/performance/analysis.js.map +1 -1
  88. package/dist/adapters/mysql/tools/performance/optimization.d.ts.map +1 -1
  89. package/dist/adapters/mysql/tools/performance/optimization.js +151 -127
  90. package/dist/adapters/mysql/tools/performance/optimization.js.map +1 -1
  91. package/dist/adapters/mysql/tools/proxysql.d.ts +1 -1
  92. package/dist/adapters/mysql/tools/proxysql.d.ts.map +1 -1
  93. package/dist/adapters/mysql/tools/proxysql.js +289 -176
  94. package/dist/adapters/mysql/tools/proxysql.js.map +1 -1
  95. package/dist/adapters/mysql/tools/replication.js +75 -49
  96. package/dist/adapters/mysql/tools/replication.js.map +1 -1
  97. package/dist/adapters/mysql/tools/roles.d.ts.map +1 -1
  98. package/dist/adapters/mysql/tools/roles.js +224 -182
  99. package/dist/adapters/mysql/tools/roles.js.map +1 -1
  100. package/dist/adapters/mysql/tools/router.d.ts.map +1 -1
  101. package/dist/adapters/mysql/tools/router.js +168 -67
  102. package/dist/adapters/mysql/tools/router.js.map +1 -1
  103. package/dist/adapters/mysql/tools/schema/constraints.d.ts.map +1 -1
  104. package/dist/adapters/mysql/tools/schema/constraints.js +21 -3
  105. package/dist/adapters/mysql/tools/schema/constraints.js.map +1 -1
  106. package/dist/adapters/mysql/tools/schema/management.d.ts.map +1 -1
  107. package/dist/adapters/mysql/tools/schema/management.js +61 -14
  108. package/dist/adapters/mysql/tools/schema/management.js.map +1 -1
  109. package/dist/adapters/mysql/tools/schema/routines.d.ts.map +1 -1
  110. package/dist/adapters/mysql/tools/schema/routines.js +27 -4
  111. package/dist/adapters/mysql/tools/schema/routines.js.map +1 -1
  112. package/dist/adapters/mysql/tools/schema/scheduled_events.d.ts.map +1 -1
  113. package/dist/adapters/mysql/tools/schema/scheduled_events.js +24 -3
  114. package/dist/adapters/mysql/tools/schema/scheduled_events.js.map +1 -1
  115. package/dist/adapters/mysql/tools/schema/triggers.d.ts.map +1 -1
  116. package/dist/adapters/mysql/tools/schema/triggers.js +23 -2
  117. package/dist/adapters/mysql/tools/schema/triggers.js.map +1 -1
  118. package/dist/adapters/mysql/tools/schema/views.d.ts.map +1 -1
  119. package/dist/adapters/mysql/tools/schema/views.js +47 -7
  120. package/dist/adapters/mysql/tools/schema/views.js.map +1 -1
  121. package/dist/adapters/mysql/tools/security/audit.d.ts.map +1 -1
  122. package/dist/adapters/mysql/tools/security/audit.js +102 -34
  123. package/dist/adapters/mysql/tools/security/audit.js.map +1 -1
  124. package/dist/adapters/mysql/tools/security/data-protection.d.ts.map +1 -1
  125. package/dist/adapters/mysql/tools/security/data-protection.js +264 -205
  126. package/dist/adapters/mysql/tools/security/data-protection.js.map +1 -1
  127. package/dist/adapters/mysql/tools/security/encryption.d.ts.map +1 -1
  128. package/dist/adapters/mysql/tools/security/encryption.js +137 -104
  129. package/dist/adapters/mysql/tools/security/encryption.js.map +1 -1
  130. package/dist/adapters/mysql/tools/shell/backup.d.ts.map +1 -1
  131. package/dist/adapters/mysql/tools/shell/backup.js +71 -59
  132. package/dist/adapters/mysql/tools/shell/backup.js.map +1 -1
  133. package/dist/adapters/mysql/tools/shell/restore.d.ts.map +1 -1
  134. package/dist/adapters/mysql/tools/shell/restore.js +61 -47
  135. package/dist/adapters/mysql/tools/shell/restore.js.map +1 -1
  136. package/dist/adapters/mysql/tools/spatial/geometry.d.ts.map +1 -1
  137. package/dist/adapters/mysql/tools/spatial/geometry.js +19 -5
  138. package/dist/adapters/mysql/tools/spatial/geometry.js.map +1 -1
  139. package/dist/adapters/mysql/tools/spatial/operations.d.ts.map +1 -1
  140. package/dist/adapters/mysql/tools/spatial/operations.js +42 -17
  141. package/dist/adapters/mysql/tools/spatial/operations.js.map +1 -1
  142. package/dist/adapters/mysql/tools/spatial/queries.d.ts.map +1 -1
  143. package/dist/adapters/mysql/tools/spatial/queries.js +109 -57
  144. package/dist/adapters/mysql/tools/spatial/queries.js.map +1 -1
  145. package/dist/adapters/mysql/tools/spatial/setup.d.ts.map +1 -1
  146. package/dist/adapters/mysql/tools/spatial/setup.js +103 -50
  147. package/dist/adapters/mysql/tools/spatial/setup.js.map +1 -1
  148. package/dist/adapters/mysql/tools/stats/comparative.d.ts.map +1 -1
  149. package/dist/adapters/mysql/tools/stats/comparative.js +128 -79
  150. package/dist/adapters/mysql/tools/stats/comparative.js.map +1 -1
  151. package/dist/adapters/mysql/tools/stats/descriptive.d.ts.map +1 -1
  152. package/dist/adapters/mysql/tools/stats/descriptive.js +174 -102
  153. package/dist/adapters/mysql/tools/stats/descriptive.js.map +1 -1
  154. package/dist/adapters/mysql/tools/sysschema/activity.d.ts.map +1 -1
  155. package/dist/adapters/mysql/tools/sysschema/activity.js +50 -25
  156. package/dist/adapters/mysql/tools/sysschema/activity.js.map +1 -1
  157. package/dist/adapters/mysql/tools/sysschema/performance.d.ts.map +1 -1
  158. package/dist/adapters/mysql/tools/sysschema/performance.js +121 -66
  159. package/dist/adapters/mysql/tools/sysschema/performance.js.map +1 -1
  160. package/dist/adapters/mysql/tools/sysschema/resources.d.ts.map +1 -1
  161. package/dist/adapters/mysql/tools/sysschema/resources.js +101 -64
  162. package/dist/adapters/mysql/tools/sysschema/resources.js.map +1 -1
  163. package/dist/adapters/mysql/tools/text/fulltext.d.ts.map +1 -1
  164. package/dist/adapters/mysql/tools/text/fulltext.js +18 -32
  165. package/dist/adapters/mysql/tools/text/fulltext.js.map +1 -1
  166. package/dist/adapters/mysql/tools/transactions.d.ts.map +1 -1
  167. package/dist/adapters/mysql/tools/transactions.js +48 -23
  168. package/dist/adapters/mysql/tools/transactions.js.map +1 -1
  169. package/dist/adapters/mysql/types/proxysql-types.d.ts +15 -0
  170. package/dist/adapters/mysql/types/proxysql-types.d.ts.map +1 -1
  171. package/dist/adapters/mysql/types/proxysql-types.js +33 -1
  172. package/dist/adapters/mysql/types/proxysql-types.js.map +1 -1
  173. package/dist/adapters/mysql/types/router-types.d.ts +1 -1
  174. package/dist/adapters/mysql/types/router-types.js +1 -1
  175. package/dist/adapters/mysql/types/router-types.js.map +1 -1
  176. package/dist/adapters/mysql/types/shell-types.js +2 -2
  177. package/dist/adapters/mysql/types/shell-types.js.map +1 -1
  178. package/dist/adapters/mysql/types.d.ts +485 -21
  179. package/dist/adapters/mysql/types.d.ts.map +1 -1
  180. package/dist/adapters/mysql/types.js +546 -19
  181. package/dist/adapters/mysql/types.js.map +1 -1
  182. package/dist/auth/scopes.js +1 -1
  183. package/dist/auth/scopes.js.map +1 -1
  184. package/dist/codemode/api.d.ts +3 -2
  185. package/dist/codemode/api.d.ts.map +1 -1
  186. package/dist/codemode/api.js +80 -5
  187. package/dist/codemode/api.js.map +1 -1
  188. package/dist/codemode/sandbox-factory.js +1 -1
  189. package/dist/codemode/sandbox-factory.js.map +1 -1
  190. package/dist/codemode/types.d.ts +26 -0
  191. package/dist/codemode/types.d.ts.map +1 -1
  192. package/dist/codemode/types.js +2 -0
  193. package/dist/codemode/types.js.map +1 -1
  194. package/dist/codemode/worker-sandbox.d.ts +4 -2
  195. package/dist/codemode/worker-sandbox.d.ts.map +1 -1
  196. package/dist/codemode/worker-sandbox.js +66 -7
  197. package/dist/codemode/worker-sandbox.js.map +1 -1
  198. package/dist/codemode/worker-script.d.ts +3 -0
  199. package/dist/codemode/worker-script.d.ts.map +1 -1
  200. package/dist/codemode/worker-script.js +128 -75
  201. package/dist/codemode/worker-script.js.map +1 -1
  202. package/dist/constants/ServerInstructions.d.ts +1 -1
  203. package/dist/constants/ServerInstructions.d.ts.map +1 -1
  204. package/dist/constants/ServerInstructions.js +37 -31
  205. package/dist/constants/ServerInstructions.js.map +1 -1
  206. package/dist/filtering/ToolConstants.d.ts +1 -1
  207. package/dist/filtering/ToolConstants.d.ts.map +1 -1
  208. package/dist/filtering/ToolConstants.js +1 -2
  209. package/dist/filtering/ToolConstants.js.map +1 -1
  210. package/dist/pool/ConnectionPool.d.ts.map +1 -1
  211. package/dist/pool/ConnectionPool.js.map +1 -1
  212. package/dist/transports/http.d.ts.map +1 -1
  213. package/dist/transports/http.js +6 -0
  214. package/dist/transports/http.js.map +1 -1
  215. package/dist/utils/validators.d.ts +1 -1
  216. package/dist/utils/validators.d.ts.map +1 -1
  217. package/dist/utils/validators.js.map +1 -1
  218. package/package.json +4 -4
  219. package/releases/v3.0.0-release-notes.md +81 -0
  220. package/releases/v3.0.1-release-notes.md +20 -0
  221. package/src/__tests__/mocks/adapter.ts +3 -0
  222. package/src/__tests__/perf.test.ts +6 -6
  223. package/src/adapters/DatabaseAdapter.ts +58 -9
  224. package/src/adapters/__tests__/DatabaseAdapter.test.ts +89 -8
  225. package/src/adapters/mysql/MySQLAdapter.ts +17 -2
  226. package/src/adapters/mysql/SchemaManager.ts +21 -21
  227. package/src/adapters/mysql/__tests__/MySQLAdapter.test.ts +1 -1
  228. package/src/adapters/mysql/prompts/index.ts +12 -22
  229. package/src/adapters/mysql/prompts/proxysqlSetup.ts +1 -1
  230. package/src/adapters/mysql/resources/docstore.ts +13 -10
  231. package/src/adapters/mysql/resources/events.ts +12 -12
  232. package/src/adapters/mysql/resources/indexes.ts +17 -19
  233. package/src/adapters/mysql/resources/innodb.ts +23 -22
  234. package/src/adapters/mysql/resources/locks.ts +9 -7
  235. package/src/adapters/mysql/resources/performance.ts +23 -18
  236. package/src/adapters/mysql/resources/spatial.ts +9 -7
  237. package/src/adapters/mysql/resources/sysschema.ts +12 -11
  238. package/src/adapters/mysql/tools/__tests__/core.test.ts +126 -55
  239. package/src/adapters/mysql/tools/__tests__/docstore.test.ts +459 -88
  240. package/src/adapters/mysql/tools/__tests__/events.test.ts +281 -103
  241. package/src/adapters/mysql/tools/__tests__/proxysql.test.ts +128 -28
  242. package/src/adapters/mysql/tools/__tests__/replication.test.ts +48 -2
  243. package/src/adapters/mysql/tools/__tests__/roles.test.ts +15 -18
  244. package/src/adapters/mysql/tools/__tests__/router.test.ts +32 -5
  245. package/src/adapters/mysql/tools/__tests__/security.test.ts +126 -2
  246. package/src/adapters/mysql/tools/__tests__/security_injection.test.ts +84 -76
  247. package/src/adapters/mysql/tools/__tests__/security_integration.test.ts +47 -51
  248. package/src/adapters/mysql/tools/__tests__/spatial.test.ts +11 -10
  249. package/src/adapters/mysql/tools/__tests__/spatial_handler.test.ts +54 -38
  250. package/src/adapters/mysql/tools/__tests__/stats.test.ts +285 -152
  251. package/src/adapters/mysql/tools/__tests__/transactions.test.ts +13 -13
  252. package/src/adapters/mysql/tools/admin/__tests__/backup.test.ts +171 -25
  253. package/src/adapters/mysql/tools/admin/__tests__/maintenance.test.ts +240 -4
  254. package/src/adapters/mysql/tools/admin/__tests__/monitoring-summary.test.ts +274 -0
  255. package/src/adapters/mysql/tools/admin/__tests__/monitoring.test.ts +94 -5
  256. package/src/adapters/mysql/tools/admin/backup.ts +193 -143
  257. package/src/adapters/mysql/tools/admin/maintenance.ts +118 -69
  258. package/src/adapters/mysql/tools/admin/monitoring.ts +201 -125
  259. package/src/adapters/mysql/tools/cluster/__tests__/group-replication.test.ts +69 -0
  260. package/src/adapters/mysql/tools/cluster/__tests__/innodb-cluster.test.ts +141 -0
  261. package/src/adapters/mysql/tools/cluster/group-replication.ts +172 -132
  262. package/src/adapters/mysql/tools/cluster/innodb-cluster.ts +231 -157
  263. package/src/adapters/mysql/tools/codemode/__tests__/codemode-tool.test.ts +227 -0
  264. package/src/adapters/mysql/tools/codemode/index.ts +5 -3
  265. package/src/adapters/mysql/tools/core.ts +152 -38
  266. package/src/adapters/mysql/tools/docstore.ts +422 -205
  267. package/src/adapters/mysql/tools/events.ts +334 -233
  268. package/src/adapters/mysql/tools/json/__tests__/core.test.ts +20 -0
  269. package/src/adapters/mysql/tools/json/__tests__/enhanced.test.ts +82 -50
  270. package/src/adapters/mysql/tools/json/__tests__/helpers.test.ts +42 -3
  271. package/src/adapters/mysql/tools/json/core.ts +21 -42
  272. package/src/adapters/mysql/tools/json/enhanced.ts +22 -37
  273. package/src/adapters/mysql/tools/json/helpers.ts +21 -25
  274. package/src/adapters/mysql/tools/partitioning.ts +3 -0
  275. package/src/adapters/mysql/tools/performance/__tests__/analysis.test.ts +98 -5
  276. package/src/adapters/mysql/tools/performance/__tests__/optimization-coverage.test.ts +515 -0
  277. package/src/adapters/mysql/tools/performance/__tests__/optimization.test.ts +187 -0
  278. package/src/adapters/mysql/tools/performance/analysis.ts +95 -69
  279. package/src/adapters/mysql/tools/performance/optimization.ts +182 -153
  280. package/src/adapters/mysql/tools/proxysql.ts +314 -209
  281. package/src/adapters/mysql/tools/replication.ts +84 -57
  282. package/src/adapters/mysql/tools/roles.ts +274 -226
  283. package/src/adapters/mysql/tools/router.ts +181 -85
  284. package/src/adapters/mysql/tools/schema/__tests__/constraints.test.ts +13 -0
  285. package/src/adapters/mysql/tools/schema/__tests__/management.test.ts +60 -25
  286. package/src/adapters/mysql/tools/schema/__tests__/scheduled_events.test.ts +11 -0
  287. package/src/adapters/mysql/tools/schema/__tests__/triggers.test.ts +25 -4
  288. package/src/adapters/mysql/tools/schema/__tests__/views.test.ts +46 -14
  289. package/src/adapters/mysql/tools/schema/constraints.ts +22 -3
  290. package/src/adapters/mysql/tools/schema/management.ts +60 -15
  291. package/src/adapters/mysql/tools/schema/routines.ts +26 -4
  292. package/src/adapters/mysql/tools/schema/scheduled_events.ts +25 -3
  293. package/src/adapters/mysql/tools/schema/triggers.ts +27 -2
  294. package/src/adapters/mysql/tools/schema/views.ts +46 -8
  295. package/src/adapters/mysql/tools/security/__tests__/audit.test.ts +90 -4
  296. package/src/adapters/mysql/tools/security/audit.ts +113 -39
  297. package/src/adapters/mysql/tools/security/data-protection.ts +293 -233
  298. package/src/adapters/mysql/tools/security/encryption.ts +172 -139
  299. package/src/adapters/mysql/tools/shell/__tests__/backup.test.ts +29 -0
  300. package/src/adapters/mysql/tools/shell/backup.ts +90 -73
  301. package/src/adapters/mysql/tools/shell/restore.ts +62 -48
  302. package/src/adapters/mysql/tools/spatial/__tests__/operations.test.ts +22 -14
  303. package/src/adapters/mysql/tools/spatial/__tests__/queries.test.ts +65 -51
  304. package/src/adapters/mysql/tools/spatial/geometry.ts +23 -7
  305. package/src/adapters/mysql/tools/spatial/operations.ts +60 -31
  306. package/src/adapters/mysql/tools/spatial/queries.ts +142 -65
  307. package/src/adapters/mysql/tools/spatial/setup.ts +121 -55
  308. package/src/adapters/mysql/tools/stats/__tests__/comparative.test.ts +12 -10
  309. package/src/adapters/mysql/tools/stats/comparative.ts +150 -98
  310. package/src/adapters/mysql/tools/stats/descriptive.ts +204 -127
  311. package/src/adapters/mysql/tools/sysschema/__tests__/error-paths.test.ts +222 -0
  312. package/src/adapters/mysql/tools/sysschema/__tests__/performance.test.ts +45 -0
  313. package/src/adapters/mysql/tools/sysschema/__tests__/resources.test.ts +6 -3
  314. package/src/adapters/mysql/tools/sysschema/activity.ts +52 -27
  315. package/src/adapters/mysql/tools/sysschema/performance.ts +132 -68
  316. package/src/adapters/mysql/tools/sysschema/resources.ts +105 -67
  317. package/src/adapters/mysql/tools/text/__tests__/fulltext.test.ts +45 -17
  318. package/src/adapters/mysql/tools/text/fulltext.ts +27 -38
  319. package/src/adapters/mysql/tools/transactions.ts +49 -24
  320. package/src/adapters/mysql/types/proxysql-types.ts +38 -1
  321. package/src/adapters/mysql/types/router-types.ts +1 -1
  322. package/src/adapters/mysql/types/shell-types.ts +2 -2
  323. package/src/adapters/mysql/types.ts +632 -19
  324. package/src/auth/__tests__/scopes.test.ts +2 -2
  325. package/src/auth/scopes.ts +1 -1
  326. package/src/codemode/__tests__/api.test.ts +417 -0
  327. package/src/codemode/__tests__/sandbox-factory.test.ts +158 -0
  328. package/src/codemode/__tests__/sandbox.test.ts +301 -0
  329. package/src/codemode/__tests__/security.test.ts +368 -0
  330. package/src/codemode/__tests__/worker-sandbox.test.ts +179 -0
  331. package/src/codemode/__tests__/worker-script.test.ts +226 -0
  332. package/src/codemode/api.ts +89 -5
  333. package/src/codemode/sandbox-factory.ts +1 -1
  334. package/src/codemode/types.ts +34 -0
  335. package/src/codemode/worker-sandbox.ts +74 -7
  336. package/src/codemode/worker-script.ts +157 -86
  337. package/src/constants/ServerInstructions.ts +37 -31
  338. package/src/filtering/ToolConstants.ts +1 -2
  339. package/src/filtering/__tests__/ToolFilter.test.ts +9 -9
  340. package/src/pool/ConnectionPool.ts +4 -1
  341. package/src/transports/__tests__/http.test.ts +15 -3
  342. package/src/transports/http.ts +12 -0
  343. package/src/utils/validators.ts +2 -1
  344. package/vitest.config.ts +3 -1
  345. 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
  }