@neverinfamous/mysql-mcp 2.3.1 → 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 (344) 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 +276 -1
  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/src/__tests__/mocks/adapter.ts +3 -0
  221. package/src/__tests__/perf.test.ts +6 -6
  222. package/src/adapters/DatabaseAdapter.ts +58 -9
  223. package/src/adapters/__tests__/DatabaseAdapter.test.ts +89 -8
  224. package/src/adapters/mysql/MySQLAdapter.ts +17 -2
  225. package/src/adapters/mysql/SchemaManager.ts +21 -21
  226. package/src/adapters/mysql/__tests__/MySQLAdapter.test.ts +1 -1
  227. package/src/adapters/mysql/prompts/index.ts +12 -22
  228. package/src/adapters/mysql/prompts/proxysqlSetup.ts +1 -1
  229. package/src/adapters/mysql/resources/docstore.ts +13 -10
  230. package/src/adapters/mysql/resources/events.ts +12 -12
  231. package/src/adapters/mysql/resources/indexes.ts +17 -19
  232. package/src/adapters/mysql/resources/innodb.ts +23 -22
  233. package/src/adapters/mysql/resources/locks.ts +9 -7
  234. package/src/adapters/mysql/resources/performance.ts +23 -18
  235. package/src/adapters/mysql/resources/spatial.ts +9 -7
  236. package/src/adapters/mysql/resources/sysschema.ts +12 -11
  237. package/src/adapters/mysql/tools/__tests__/core.test.ts +126 -55
  238. package/src/adapters/mysql/tools/__tests__/docstore.test.ts +459 -88
  239. package/src/adapters/mysql/tools/__tests__/events.test.ts +281 -103
  240. package/src/adapters/mysql/tools/__tests__/proxysql.test.ts +128 -28
  241. package/src/adapters/mysql/tools/__tests__/replication.test.ts +48 -2
  242. package/src/adapters/mysql/tools/__tests__/roles.test.ts +15 -18
  243. package/src/adapters/mysql/tools/__tests__/router.test.ts +32 -5
  244. package/src/adapters/mysql/tools/__tests__/security.test.ts +126 -2
  245. package/src/adapters/mysql/tools/__tests__/security_injection.test.ts +84 -76
  246. package/src/adapters/mysql/tools/__tests__/security_integration.test.ts +47 -50
  247. package/src/adapters/mysql/tools/__tests__/spatial.test.ts +11 -10
  248. package/src/adapters/mysql/tools/__tests__/spatial_handler.test.ts +54 -38
  249. package/src/adapters/mysql/tools/__tests__/stats.test.ts +285 -152
  250. package/src/adapters/mysql/tools/__tests__/transactions.test.ts +13 -13
  251. package/src/adapters/mysql/tools/admin/__tests__/backup.test.ts +171 -25
  252. package/src/adapters/mysql/tools/admin/__tests__/maintenance.test.ts +240 -4
  253. package/src/adapters/mysql/tools/admin/__tests__/monitoring-summary.test.ts +274 -0
  254. package/src/adapters/mysql/tools/admin/__tests__/monitoring.test.ts +94 -5
  255. package/src/adapters/mysql/tools/admin/backup.ts +193 -143
  256. package/src/adapters/mysql/tools/admin/maintenance.ts +118 -69
  257. package/src/adapters/mysql/tools/admin/monitoring.ts +201 -125
  258. package/src/adapters/mysql/tools/cluster/__tests__/group-replication.test.ts +69 -0
  259. package/src/adapters/mysql/tools/cluster/__tests__/innodb-cluster.test.ts +141 -0
  260. package/src/adapters/mysql/tools/cluster/group-replication.ts +172 -132
  261. package/src/adapters/mysql/tools/cluster/innodb-cluster.ts +231 -157
  262. package/src/adapters/mysql/tools/codemode/__tests__/codemode-tool.test.ts +227 -0
  263. package/src/adapters/mysql/tools/codemode/index.ts +5 -3
  264. package/src/adapters/mysql/tools/core.ts +152 -38
  265. package/src/adapters/mysql/tools/docstore.ts +422 -205
  266. package/src/adapters/mysql/tools/events.ts +334 -233
  267. package/src/adapters/mysql/tools/json/__tests__/core.test.ts +20 -0
  268. package/src/adapters/mysql/tools/json/__tests__/enhanced.test.ts +82 -50
  269. package/src/adapters/mysql/tools/json/__tests__/helpers.test.ts +42 -3
  270. package/src/adapters/mysql/tools/json/core.ts +21 -42
  271. package/src/adapters/mysql/tools/json/enhanced.ts +22 -37
  272. package/src/adapters/mysql/tools/json/helpers.ts +21 -25
  273. package/src/adapters/mysql/tools/partitioning.ts +3 -0
  274. package/src/adapters/mysql/tools/performance/__tests__/analysis.test.ts +98 -5
  275. package/src/adapters/mysql/tools/performance/__tests__/optimization-coverage.test.ts +515 -0
  276. package/src/adapters/mysql/tools/performance/__tests__/optimization.test.ts +187 -0
  277. package/src/adapters/mysql/tools/performance/analysis.ts +95 -69
  278. package/src/adapters/mysql/tools/performance/optimization.ts +182 -153
  279. package/src/adapters/mysql/tools/proxysql.ts +314 -209
  280. package/src/adapters/mysql/tools/replication.ts +84 -57
  281. package/src/adapters/mysql/tools/roles.ts +274 -226
  282. package/src/adapters/mysql/tools/router.ts +181 -85
  283. package/src/adapters/mysql/tools/schema/__tests__/constraints.test.ts +13 -0
  284. package/src/adapters/mysql/tools/schema/__tests__/management.test.ts +60 -25
  285. package/src/adapters/mysql/tools/schema/__tests__/scheduled_events.test.ts +11 -0
  286. package/src/adapters/mysql/tools/schema/__tests__/triggers.test.ts +25 -4
  287. package/src/adapters/mysql/tools/schema/__tests__/views.test.ts +46 -14
  288. package/src/adapters/mysql/tools/schema/constraints.ts +22 -3
  289. package/src/adapters/mysql/tools/schema/management.ts +60 -15
  290. package/src/adapters/mysql/tools/schema/routines.ts +26 -4
  291. package/src/adapters/mysql/tools/schema/scheduled_events.ts +25 -3
  292. package/src/adapters/mysql/tools/schema/triggers.ts +27 -2
  293. package/src/adapters/mysql/tools/schema/views.ts +46 -8
  294. package/src/adapters/mysql/tools/security/__tests__/audit.test.ts +90 -4
  295. package/src/adapters/mysql/tools/security/audit.ts +113 -39
  296. package/src/adapters/mysql/tools/security/data-protection.ts +293 -233
  297. package/src/adapters/mysql/tools/security/encryption.ts +172 -139
  298. package/src/adapters/mysql/tools/shell/__tests__/backup.test.ts +29 -0
  299. package/src/adapters/mysql/tools/shell/backup.ts +90 -73
  300. package/src/adapters/mysql/tools/shell/restore.ts +62 -48
  301. package/src/adapters/mysql/tools/spatial/__tests__/operations.test.ts +22 -14
  302. package/src/adapters/mysql/tools/spatial/__tests__/queries.test.ts +65 -51
  303. package/src/adapters/mysql/tools/spatial/geometry.ts +23 -7
  304. package/src/adapters/mysql/tools/spatial/operations.ts +60 -31
  305. package/src/adapters/mysql/tools/spatial/queries.ts +142 -65
  306. package/src/adapters/mysql/tools/spatial/setup.ts +121 -55
  307. package/src/adapters/mysql/tools/stats/__tests__/comparative.test.ts +12 -10
  308. package/src/adapters/mysql/tools/stats/comparative.ts +150 -98
  309. package/src/adapters/mysql/tools/stats/descriptive.ts +204 -127
  310. package/src/adapters/mysql/tools/sysschema/__tests__/error-paths.test.ts +222 -0
  311. package/src/adapters/mysql/tools/sysschema/__tests__/performance.test.ts +45 -0
  312. package/src/adapters/mysql/tools/sysschema/__tests__/resources.test.ts +6 -3
  313. package/src/adapters/mysql/tools/sysschema/activity.ts +52 -27
  314. package/src/adapters/mysql/tools/sysschema/performance.ts +132 -68
  315. package/src/adapters/mysql/tools/sysschema/resources.ts +105 -67
  316. package/src/adapters/mysql/tools/text/__tests__/fulltext.test.ts +45 -17
  317. package/src/adapters/mysql/tools/text/fulltext.ts +27 -38
  318. package/src/adapters/mysql/tools/transactions.ts +49 -24
  319. package/src/adapters/mysql/types/proxysql-types.ts +38 -1
  320. package/src/adapters/mysql/types/router-types.ts +1 -1
  321. package/src/adapters/mysql/types/shell-types.ts +2 -2
  322. package/src/adapters/mysql/types.ts +632 -19
  323. package/src/auth/__tests__/scopes.test.ts +2 -2
  324. package/src/auth/scopes.ts +1 -1
  325. package/src/codemode/__tests__/api.test.ts +417 -0
  326. package/src/codemode/__tests__/sandbox-factory.test.ts +158 -0
  327. package/src/codemode/__tests__/sandbox.test.ts +301 -0
  328. package/src/codemode/__tests__/security.test.ts +368 -0
  329. package/src/codemode/__tests__/worker-sandbox.test.ts +179 -0
  330. package/src/codemode/__tests__/worker-script.test.ts +226 -0
  331. package/src/codemode/api.ts +89 -5
  332. package/src/codemode/sandbox-factory.ts +1 -1
  333. package/src/codemode/types.ts +34 -0
  334. package/src/codemode/worker-sandbox.ts +74 -7
  335. package/src/codemode/worker-script.ts +157 -86
  336. package/src/constants/ServerInstructions.ts +37 -31
  337. package/src/filtering/ToolConstants.ts +1 -2
  338. package/src/filtering/__tests__/ToolFilter.test.ts +9 -9
  339. package/src/pool/ConnectionPool.ts +4 -1
  340. package/src/transports/__tests__/http.test.ts +15 -3
  341. package/src/transports/http.ts +12 -0
  342. package/src/utils/validators.ts +2 -1
  343. package/vitest.config.ts +3 -1
  344. package/CODE_MODE.md +0 -245
@@ -172,12 +172,13 @@ describe("Admin Backup Tools", () => {
172
172
  mockAdapter as unknown as MySQLAdapter,
173
173
  );
174
174
 
175
- await expect(
176
- tool.handler(
177
- { table: "users; DROP TABLE users;--", format: "SQL" },
178
- mockContext,
179
- ),
180
- ).rejects.toThrow();
175
+ const result = (await tool.handler(
176
+ { table: "users; DROP TABLE users;--", format: "SQL" },
177
+ mockContext,
178
+ )) as { success: boolean; error: string };
179
+
180
+ expect(result.success).toBe(false);
181
+ expect(result.error).toContain("Invalid table name");
181
182
  });
182
183
 
183
184
  it("should validate WHERE clause for SQL injection", async () => {
@@ -185,16 +186,17 @@ describe("Admin Backup Tools", () => {
185
186
  mockAdapter as unknown as MySQLAdapter,
186
187
  );
187
188
 
188
- await expect(
189
- tool.handler(
190
- {
191
- table: "users",
192
- format: "SQL",
193
- where: "1=1; DELETE FROM users;--",
194
- },
195
- mockContext,
196
- ),
197
- ).rejects.toThrow();
189
+ const result = (await tool.handler(
190
+ {
191
+ table: "users",
192
+ format: "SQL",
193
+ where: "1=1; DELETE FROM users;--",
194
+ },
195
+ mockContext,
196
+ )) as { success: boolean; error: string };
197
+
198
+ expect(result.success).toBe(false);
199
+ expect(result.error).toContain("dangerous SQL patterns");
198
200
  });
199
201
 
200
202
  it("should return exists: false for non-existent table", async () => {
@@ -249,6 +251,106 @@ describe("Admin Backup Tools", () => {
249
251
  expect(result.sql).toContain("(`id`, `email`, `created_at`)");
250
252
  expect(result.sql).toContain("VALUES");
251
253
  });
254
+
255
+ it("should return structured error for Zod validation failures", async () => {
256
+ const tool = createExportTableTool(
257
+ mockAdapter as unknown as MySQLAdapter,
258
+ );
259
+ const result = (await tool.handler(
260
+ { table: "users", limit: -1 },
261
+ mockContext,
262
+ )) as { success: boolean; error: string };
263
+
264
+ expect(result.success).toBe(false);
265
+ expect(result.error).toBeDefined();
266
+ });
267
+
268
+ it("should return structured error for limit: 0", async () => {
269
+ const tool = createExportTableTool(
270
+ mockAdapter as unknown as MySQLAdapter,
271
+ );
272
+ const result = (await tool.handler(
273
+ { table: "users", limit: 0 },
274
+ mockContext,
275
+ )) as { success: boolean; error: string };
276
+
277
+ expect(result.success).toBe(false);
278
+ expect(result.error).toBeDefined();
279
+ });
280
+
281
+ it("should batch rows into multi-row INSERT statements", async () => {
282
+ mockAdapter.executeReadQuery.mockResolvedValue(
283
+ createMockQueryResult([
284
+ { id: 1, name: "Alice" },
285
+ { id: 2, name: "Bob" },
286
+ { id: 3, name: "Charlie" },
287
+ { id: 4, name: "Diana" },
288
+ ]),
289
+ );
290
+
291
+ const tool = createExportTableTool(
292
+ mockAdapter as unknown as MySQLAdapter,
293
+ );
294
+ const result = (await tool.handler(
295
+ { table: "users", format: "SQL", batch: 2 },
296
+ mockContext,
297
+ )) as { sql: string; rowCount: number };
298
+
299
+ expect(result.rowCount).toBe(4);
300
+ const statements = result.sql.split("\n");
301
+ expect(statements).toHaveLength(2);
302
+ // Each statement should have 2 value groups
303
+ expect(statements[0]).toContain("VALUES (1, 'Alice'), (2, 'Bob')");
304
+ expect(statements[1]).toContain("VALUES (3, 'Charlie'), (4, 'Diana')");
305
+ });
306
+
307
+ it("should handle batch larger than row count", async () => {
308
+ mockAdapter.executeReadQuery.mockResolvedValue(
309
+ createMockQueryResult([
310
+ { id: 1, name: "Alice" },
311
+ { id: 2, name: "Bob" },
312
+ { id: 3, name: "Charlie" },
313
+ ]),
314
+ );
315
+
316
+ const tool = createExportTableTool(
317
+ mockAdapter as unknown as MySQLAdapter,
318
+ );
319
+ const result = (await tool.handler(
320
+ { table: "users", format: "SQL", batch: 10 },
321
+ mockContext,
322
+ )) as { sql: string; rowCount: number };
323
+
324
+ expect(result.rowCount).toBe(3);
325
+ const statements = result.sql.split("\n");
326
+ expect(statements).toHaveLength(1);
327
+ expect(statements[0]).toContain(
328
+ "VALUES (1, 'Alice'), (2, 'Bob'), (3, 'Charlie')",
329
+ );
330
+ });
331
+
332
+ it("should default to batch: 1 producing individual INSERT statements", async () => {
333
+ mockAdapter.executeReadQuery.mockResolvedValue(
334
+ createMockQueryResult([
335
+ { id: 1, name: "Alice" },
336
+ { id: 2, name: "Bob" },
337
+ ]),
338
+ );
339
+
340
+ const tool = createExportTableTool(
341
+ mockAdapter as unknown as MySQLAdapter,
342
+ );
343
+ const result = (await tool.handler(
344
+ { table: "users", format: "SQL" },
345
+ mockContext,
346
+ )) as { sql: string; rowCount: number };
347
+
348
+ expect(result.rowCount).toBe(2);
349
+ const statements = result.sql.split("\n");
350
+ expect(statements).toHaveLength(2);
351
+ expect(statements[0]).toContain("VALUES (1, 'Alice');");
352
+ expect(statements[1]).toContain("VALUES (2, 'Bob');");
353
+ });
252
354
  });
253
355
 
254
356
  describe("createImportDataTool", () => {
@@ -324,15 +426,16 @@ describe("Admin Backup Tools", () => {
324
426
  it("should validate table name for SQL injection", async () => {
325
427
  const tool = createImportDataTool(mockAdapter as unknown as MySQLAdapter);
326
428
 
327
- await expect(
328
- tool.handler(
329
- {
330
- table: "users; DROP TABLE users;--",
331
- data: [{ name: "test" }],
332
- },
333
- mockContext,
334
- ),
335
- ).rejects.toThrow();
429
+ const result = (await tool.handler(
430
+ {
431
+ table: "users; DROP TABLE users;--",
432
+ data: [{ name: "test" }],
433
+ },
434
+ mockContext,
435
+ )) as { success: boolean; error: string };
436
+
437
+ expect(result.success).toBe(false);
438
+ expect(result.error).toContain("Invalid table name");
336
439
  });
337
440
 
338
441
  it("should handle various data types", async () => {
@@ -426,6 +529,17 @@ describe("Admin Backup Tools", () => {
426
529
  expect(result.error).toContain("Unknown column");
427
530
  expect(result.rowsInserted).toBe(0);
428
531
  });
532
+
533
+ it("should return structured error for Zod validation failures", async () => {
534
+ const tool = createImportDataTool(mockAdapter as unknown as MySQLAdapter);
535
+ const result = (await tool.handler(
536
+ { data: [{ name: "test" }] },
537
+ mockContext,
538
+ )) as { success: boolean; error: string };
539
+
540
+ expect(result.success).toBe(false);
541
+ expect(result.error).toBeDefined();
542
+ });
429
543
  });
430
544
 
431
545
  describe("createCreateDumpTool", () => {
@@ -544,6 +658,21 @@ describe("Admin Backup Tools", () => {
544
658
 
545
659
  expect(result.command).toBeDefined();
546
660
  });
661
+
662
+ it("should return structured error on query failure", async () => {
663
+ mockAdapter.executeReadQuery.mockRejectedValue(
664
+ new Error("Connection lost"),
665
+ );
666
+
667
+ const tool = createCreateDumpTool(mockAdapter as unknown as MySQLAdapter);
668
+ const result = (await tool.handler({}, mockContext)) as {
669
+ success: boolean;
670
+ error: string;
671
+ };
672
+
673
+ expect(result.success).toBe(false);
674
+ expect(result.error).toContain("Connection lost");
675
+ });
547
676
  });
548
677
 
549
678
  describe("createRestoreDumpTool", () => {
@@ -636,5 +765,22 @@ describe("Admin Backup Tools", () => {
636
765
 
637
766
  expect(result.command).toBeDefined();
638
767
  });
768
+
769
+ it("should return structured error on query failure", async () => {
770
+ mockAdapter.executeReadQuery.mockRejectedValue(
771
+ new Error("Connection lost"),
772
+ );
773
+
774
+ const tool = createRestoreDumpTool(
775
+ mockAdapter as unknown as MySQLAdapter,
776
+ );
777
+ const result = (await tool.handler(
778
+ { filename: "backup.sql" },
779
+ mockContext,
780
+ )) as { success: boolean; error: string };
781
+
782
+ expect(result.success).toBe(false);
783
+ expect(result.error).toContain("Connection lost");
784
+ });
639
785
  });
640
786
  });
@@ -241,6 +241,18 @@ describe("Admin Maintenance Tools", () => {
241
241
  expect(result.results).toEqual([]);
242
242
  expect(result.rowCount).toBe(0);
243
243
  });
244
+
245
+ it("should return structured error for invalid option value", async () => {
246
+ const tool = createCheckTableTool(mockAdapter as unknown as MySQLAdapter);
247
+ const result = await tool.handler(
248
+ { tables: ["users"], option: "INVALID_OPTION" },
249
+ mockContext,
250
+ );
251
+
252
+ expect(result).toHaveProperty("success", false);
253
+ expect(result).toHaveProperty("error");
254
+ expect(typeof (result as { error: string }).error).toBe("string");
255
+ });
244
256
  });
245
257
 
246
258
  describe("createRepairTableTool", () => {
@@ -492,13 +504,172 @@ describe("Admin Maintenance Tools", () => {
492
504
  });
493
505
  });
494
506
 
495
- it("should rethrow non-thread-id errors", async () => {
507
+ it("should return structured error for non-thread-id errors", async () => {
496
508
  mockAdapter.executeQuery.mockRejectedValue(new Error("Connection lost"));
497
509
 
498
510
  const tool = createKillQueryTool(mockAdapter as unknown as MySQLAdapter);
499
- await expect(
500
- tool.handler({ processId: 123 }, mockContext),
501
- ).rejects.toThrow("Connection lost");
511
+ const result = await tool.handler({ processId: 123 }, mockContext);
512
+
513
+ expect(result).toEqual({ success: false, error: "Connection lost" });
514
+ });
515
+ });
516
+
517
+ describe("DDL handler error handling", () => {
518
+ it("mysql_optimize_table should return structured error on adapter failure", async () => {
519
+ mockAdapter.executeQuery.mockRejectedValue(
520
+ new Error("Table storage engine mismatch"),
521
+ );
522
+
523
+ const tool = createOptimizeTableTool(
524
+ mockAdapter as unknown as MySQLAdapter,
525
+ );
526
+ const result = await tool.handler({ tables: ["users"] }, mockContext);
527
+
528
+ expect(result).toEqual({
529
+ success: false,
530
+ error: "Table storage engine mismatch",
531
+ });
532
+ });
533
+
534
+ it("mysql_optimize_table should return structured error on empty tables", async () => {
535
+ const tool = createOptimizeTableTool(
536
+ mockAdapter as unknown as MySQLAdapter,
537
+ );
538
+ const result = await tool.handler({}, mockContext);
539
+
540
+ expect(result).toHaveProperty("success", false);
541
+ expect(result).toHaveProperty("error");
542
+ });
543
+
544
+ it("mysql_analyze_table should return structured error on adapter failure", async () => {
545
+ mockAdapter.executeQuery.mockRejectedValue(
546
+ new Error("Access denied for user"),
547
+ );
548
+
549
+ const tool = createAnalyzeTableTool(
550
+ mockAdapter as unknown as MySQLAdapter,
551
+ );
552
+ const result = await tool.handler({ tables: ["products"] }, mockContext);
553
+
554
+ expect(result).toEqual({
555
+ success: false,
556
+ error: "Access denied for user",
557
+ });
558
+ });
559
+
560
+ it("mysql_analyze_table should return structured error on empty tables", async () => {
561
+ const tool = createAnalyzeTableTool(
562
+ mockAdapter as unknown as MySQLAdapter,
563
+ );
564
+ const result = await tool.handler({}, mockContext);
565
+
566
+ expect(result).toHaveProperty("success", false);
567
+ expect(result).toHaveProperty("error");
568
+ });
569
+
570
+ it("mysql_check_table should return structured error on adapter failure", async () => {
571
+ mockAdapter.rawQuery.mockRejectedValue(
572
+ new Error("Lock wait timeout exceeded"),
573
+ );
574
+
575
+ const tool = createCheckTableTool(mockAdapter as unknown as MySQLAdapter);
576
+ const result = await tool.handler({ tables: ["orders"] }, mockContext);
577
+
578
+ expect(result).toEqual({
579
+ success: false,
580
+ error: "Lock wait timeout exceeded",
581
+ });
582
+ });
583
+
584
+ it("mysql_check_table should return structured error on empty tables", async () => {
585
+ const tool = createCheckTableTool(mockAdapter as unknown as MySQLAdapter);
586
+ const result = await tool.handler({}, mockContext);
587
+
588
+ expect(result).toHaveProperty("success", false);
589
+ expect(result).toHaveProperty("error");
590
+ });
591
+
592
+ it("mysql_repair_table should return structured error on adapter failure", async () => {
593
+ mockAdapter.executeQuery.mockRejectedValue(
594
+ new Error("Table is read only"),
595
+ );
596
+
597
+ const tool = createRepairTableTool(
598
+ mockAdapter as unknown as MySQLAdapter,
599
+ );
600
+ const result = await tool.handler({ tables: ["broken"] }, mockContext);
601
+
602
+ expect(result).toEqual({
603
+ success: false,
604
+ error: "Table is read only",
605
+ });
606
+ });
607
+
608
+ it("mysql_repair_table should return structured error on empty tables", async () => {
609
+ const tool = createRepairTableTool(
610
+ mockAdapter as unknown as MySQLAdapter,
611
+ );
612
+ const result = await tool.handler({}, mockContext);
613
+
614
+ expect(result).toHaveProperty("success", false);
615
+ expect(result).toHaveProperty("error");
616
+ });
617
+ });
618
+
619
+ describe("repair_table alias support", () => {
620
+ it("should accept table alias (singular string)", async () => {
621
+ mockAdapter.executeQuery.mockResolvedValue(createMockQueryResult([]));
622
+
623
+ const tool = createRepairTableTool(
624
+ mockAdapter as unknown as MySQLAdapter,
625
+ );
626
+ await tool.handler({ table: "users" }, mockContext);
627
+
628
+ expect(mockAdapter.executeQuery).toHaveBeenCalledWith(
629
+ "REPAIR TABLE `users`",
630
+ );
631
+ });
632
+
633
+ it("should accept tableName alias", async () => {
634
+ mockAdapter.executeQuery.mockResolvedValue(createMockQueryResult([]));
635
+
636
+ const tool = createRepairTableTool(
637
+ mockAdapter as unknown as MySQLAdapter,
638
+ );
639
+ await tool.handler({ tableName: "orders" }, mockContext);
640
+
641
+ expect(mockAdapter.executeQuery).toHaveBeenCalledWith(
642
+ "REPAIR TABLE `orders`",
643
+ );
644
+ });
645
+
646
+ it("should accept name alias", async () => {
647
+ mockAdapter.executeQuery.mockResolvedValue(createMockQueryResult([]));
648
+
649
+ const tool = createRepairTableTool(
650
+ mockAdapter as unknown as MySQLAdapter,
651
+ );
652
+ await tool.handler({ name: "products" }, mockContext);
653
+
654
+ expect(mockAdapter.executeQuery).toHaveBeenCalledWith(
655
+ "REPAIR TABLE `products`",
656
+ );
657
+ });
658
+
659
+ it("should prefer tables array over aliases", async () => {
660
+ mockAdapter.executeQuery.mockResolvedValue(createMockQueryResult([]));
661
+
662
+ const tool = createRepairTableTool(
663
+ mockAdapter as unknown as MySQLAdapter,
664
+ );
665
+ await tool.handler(
666
+ { tables: ["t1", "t2"], table: "ignored" },
667
+ mockContext,
668
+ );
669
+
670
+ expect(mockAdapter.executeQuery).toHaveBeenCalledWith(
671
+ "REPAIR TABLE `t1`, `t2`",
672
+ );
502
673
  });
503
674
  });
504
675
 
@@ -581,6 +752,7 @@ describe("Admin Maintenance Tools", () => {
581
752
 
582
753
  expect(result).toEqual({
583
754
  success: false,
755
+ error: "Tables not found: nonexistent_xyz",
584
756
  notFound: ["nonexistent_xyz"],
585
757
  flushed: ["users"],
586
758
  });
@@ -603,6 +775,7 @@ describe("Admin Maintenance Tools", () => {
603
775
 
604
776
  expect(result).toEqual({
605
777
  success: false,
778
+ error: "Tables not found: nonexistent_a, nonexistent_b",
606
779
  notFound: ["nonexistent_a", "nonexistent_b"],
607
780
  flushed: [],
608
781
  });
@@ -632,5 +805,68 @@ describe("Admin Maintenance Tools", () => {
632
805
  "FLUSH TABLES `users`, `orders`",
633
806
  );
634
807
  });
808
+
809
+ it("should return structured error on Zod validation failure", async () => {
810
+ const tool = createFlushTablesTool(
811
+ mockAdapter as unknown as MySQLAdapter,
812
+ );
813
+ // Pass invalid type for tables (number instead of array)
814
+ const result = await tool.handler(
815
+ { tables: 12345 as unknown },
816
+ mockContext,
817
+ );
818
+
819
+ expect(result).toHaveProperty("success", false);
820
+ expect(result).toHaveProperty("error");
821
+ // Should NOT throw — should return structured response
822
+ expect(typeof (result as { error: string }).error).toBe("string");
823
+ });
824
+
825
+ it("should return structured error on adapter failure", async () => {
826
+ mockAdapter.executeQuery.mockRejectedValue(
827
+ new Error("Access denied; you need the RELOAD privilege"),
828
+ );
829
+
830
+ const tool = createFlushTablesTool(
831
+ mockAdapter as unknown as MySQLAdapter,
832
+ );
833
+ const result = await tool.handler({}, mockContext);
834
+
835
+ expect(result).toEqual({
836
+ success: false,
837
+ error: "Access denied; you need the RELOAD privilege",
838
+ });
839
+ });
840
+ });
841
+
842
+ describe("kill_query Zod validation", () => {
843
+ it("should return structured error when processId is missing", async () => {
844
+ const tool = createKillQueryTool(mockAdapter as unknown as MySQLAdapter);
845
+ // Pass empty params — processId is required
846
+ const result = await tool.handler({}, mockContext);
847
+
848
+ expect(result).toHaveProperty("success", false);
849
+ expect(result).toHaveProperty("error");
850
+ expect(typeof (result as { error: string }).error).toBe("string");
851
+ });
852
+ });
853
+
854
+ describe("Zod error human-readability", () => {
855
+ it("should return human-readable error messages, not raw JSON arrays", async () => {
856
+ const tool = createOptimizeTableTool(
857
+ mockAdapter as unknown as MySQLAdapter,
858
+ );
859
+ // Empty params triggers Zod validation error
860
+ const result = (await tool.handler({}, mockContext)) as {
861
+ success: boolean;
862
+ error: string;
863
+ };
864
+
865
+ expect(result.success).toBe(false);
866
+ // The error should NOT be a raw JSON array string (starting with "[{")
867
+ expect(result.error).not.toMatch(/^\s*\[/);
868
+ // Should be a clean human-readable message
869
+ expect(result.error).toBeTruthy();
870
+ });
635
871
  });
636
872
  });