@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
@@ -10,8 +10,14 @@ import type {
10
10
  ToolDefinition,
11
11
  RequestContext,
12
12
  } from "../../../../types/index.js";
13
+ import {
14
+ IndexRecommendationSchema,
15
+ IndexRecommendationSchemaBase,
16
+ ForceIndexSchema,
17
+ ForceIndexSchemaBase,
18
+ preprocessQueryOnlyParams,
19
+ } from "../../types.js";
13
20
  import { z } from "zod";
14
- import { preprocessQueryOnlyParams } from "../../types.js";
15
21
 
16
22
  /** Trace summary decision type */
17
23
  interface TraceSummaryDecision {
@@ -153,79 +159,80 @@ function extractTraceSummary(
153
159
  export function createIndexRecommendationTool(
154
160
  adapter: MySQLAdapter,
155
161
  ): ToolDefinition {
156
- const schema = z.object({
157
- table: z.string().describe("Table to analyze for missing indexes"),
158
- });
159
-
160
162
  return {
161
163
  name: "mysql_index_recommendation",
162
164
  title: "MySQL Index Recommendation",
163
165
  description:
164
166
  "Analyze table and suggest potentially missing indexes based on query patterns.",
165
167
  group: "optimization",
166
- inputSchema: schema,
168
+ inputSchema: IndexRecommendationSchemaBase,
167
169
  requiredScopes: ["read"],
168
170
  annotations: {
169
171
  readOnlyHint: true,
170
172
  idempotentHint: true,
171
173
  },
172
174
  handler: async (params: unknown, _context: RequestContext) => {
173
- const { table } = schema.parse(params);
175
+ try {
176
+ const { table } = IndexRecommendationSchema.parse(params);
174
177
 
175
- // Get columns
176
- const columns = await adapter.describeTable(table);
178
+ // Get columns
179
+ const columns = await adapter.describeTable(table);
177
180
 
178
- // Graceful handling for non-existent tables (P154)
179
- if (!columns.columns || columns.columns.length === 0) {
180
- return { exists: false, table };
181
- }
181
+ // Graceful handling for non-existent tables (P154)
182
+ if (!columns.columns || columns.columns.length === 0) {
183
+ return { exists: false, table };
184
+ }
182
185
 
183
- // Get existing indexes
184
- const indexes = await adapter.getTableIndexes(table);
185
- const indexedColumns = new Set(indexes.flatMap((i) => i.columns));
186
-
187
- // Analyze which columns might benefit from indexing
188
- const recommendations: { column: string; reason: string }[] = [];
189
-
190
- for (const col of columns.columns) {
191
- if (indexedColumns.has(col.name)) continue;
192
-
193
- // Suggest indexes for common patterns
194
- if (col.name.endsWith("_id") || col.name === "id") {
195
- recommendations.push({
196
- column: col.name,
197
- reason: "Foreign key or ID column often benefits from indexing",
198
- });
199
- } else if (
200
- ["created_at", "updated_at", "date", "timestamp"].some((s) =>
201
- col.name.includes(s),
202
- )
203
- ) {
204
- recommendations.push({
205
- column: col.name,
206
- reason: "Timestamp columns often used in range queries",
207
- });
208
- } else if (
209
- col.name === "status" ||
210
- col.name === "type" ||
211
- col.name === "category"
212
- ) {
213
- recommendations.push({
214
- column: col.name,
215
- reason: "Status/type columns often used in filtering",
216
- });
186
+ // Get existing indexes
187
+ const indexes = await adapter.getTableIndexes(table);
188
+ const indexedColumns = new Set(indexes.flatMap((i) => i.columns));
189
+
190
+ // Analyze which columns might benefit from indexing
191
+ const recommendations: { column: string; reason: string }[] = [];
192
+
193
+ for (const col of columns.columns) {
194
+ if (indexedColumns.has(col.name)) continue;
195
+
196
+ // Suggest indexes for common patterns
197
+ if (col.name.endsWith("_id") || col.name === "id") {
198
+ recommendations.push({
199
+ column: col.name,
200
+ reason: "Foreign key or ID column often benefits from indexing",
201
+ });
202
+ } else if (
203
+ ["created_at", "updated_at", "date", "timestamp"].some((s) =>
204
+ col.name.includes(s),
205
+ )
206
+ ) {
207
+ recommendations.push({
208
+ column: col.name,
209
+ reason: "Timestamp columns often used in range queries",
210
+ });
211
+ } else if (
212
+ col.name === "status" ||
213
+ col.name === "type" ||
214
+ col.name === "category"
215
+ ) {
216
+ recommendations.push({
217
+ column: col.name,
218
+ reason: "Status/type columns often used in filtering",
219
+ });
220
+ }
217
221
  }
218
- }
219
222
 
220
- return {
221
- exists: true,
222
- table,
223
- existingIndexes: indexes.map((i) => ({
224
- name: i.name,
225
- columns: i.columns,
226
- })),
227
- recommendations,
228
- };
223
+ return {
224
+ exists: true,
225
+ table,
226
+ existingIndexes: indexes.map((i) => ({
227
+ name: i.name,
228
+ columns: i.columns,
229
+ })),
230
+ recommendations,
231
+ };
232
+ } catch (error) {
233
+ const msg = error instanceof Error ? error.message : String(error);
234
+ return { success: false, error: msg };
235
+ }
229
236
  },
230
237
  };
231
238
  }
@@ -266,129 +273,141 @@ export function createQueryRewriteTool(adapter: MySQLAdapter): ToolDefinition {
266
273
  idempotentHint: true,
267
274
  },
268
275
  handler: async (params: unknown, _context: RequestContext) => {
269
- const { query } = schema.parse(params);
270
-
271
- const suggestions: string[] = [];
272
- const upperQuery = query.toUpperCase();
276
+ try {
277
+ const { query } = schema.parse(params);
273
278
 
274
- // Basic query analysis
275
- if (upperQuery.includes("SELECT *")) {
276
- suggestions.push(
277
- "Consider selecting only needed columns instead of SELECT *",
278
- );
279
- }
279
+ const suggestions: string[] = [];
280
+ const upperQuery = query.toUpperCase();
280
281
 
281
- if (!upperQuery.includes("LIMIT") && upperQuery.includes("SELECT")) {
282
- suggestions.push("Consider adding LIMIT to prevent large result sets");
283
- }
282
+ // Basic query analysis
283
+ if (upperQuery.includes("SELECT *")) {
284
+ suggestions.push(
285
+ "Consider selecting only needed columns instead of SELECT *",
286
+ );
287
+ }
284
288
 
285
- if (upperQuery.includes("LIKE") && query.includes("%")) {
286
- if (query.includes("LIKE '%")) {
289
+ if (!upperQuery.includes("LIMIT") && upperQuery.includes("SELECT")) {
287
290
  suggestions.push(
288
- "Leading wildcard in LIKE prevents index usage; consider FULLTEXT search",
291
+ "Consider adding LIMIT to prevent large result sets",
289
292
  );
290
293
  }
291
- }
292
294
 
293
- // Check for OR in WHERE clause (not ORDER BY, FOR, etc.)
294
- const wherePattern = /WHERE\s+(.+?)(?:ORDER BY|GROUP BY|LIMIT|$)/is;
295
- const whereMatch = wherePattern.exec(upperQuery);
296
- const whereClause = whereMatch?.[1];
297
- if (whereClause && /\bOR\b/i.test(whereClause)) {
298
- suggestions.push(
299
- "OR conditions may prevent index usage; consider UNION instead",
300
- );
301
- }
295
+ if (upperQuery.includes("LIKE") && query.includes("%")) {
296
+ if (query.includes("LIKE '%")) {
297
+ suggestions.push(
298
+ "Leading wildcard in LIKE prevents index usage; consider FULLTEXT search",
299
+ );
300
+ }
301
+ }
302
302
 
303
- if (upperQuery.includes("ORDER BY") && !upperQuery.includes("LIMIT")) {
304
- suggestions.push("ORDER BY without LIMIT may cause full table sort");
305
- }
303
+ // Check for OR in WHERE clause (not ORDER BY, FOR, etc.)
304
+ const wherePattern = /WHERE\s+(.+?)(?:ORDER BY|GROUP BY|LIMIT|$)/is;
305
+ const whereMatch = wherePattern.exec(upperQuery);
306
+ const whereClause = whereMatch?.[1];
307
+ if (whereClause && /\bOR\b/i.test(whereClause)) {
308
+ suggestions.push(
309
+ "OR conditions may prevent index usage; consider UNION instead",
310
+ );
311
+ }
306
312
 
307
- if (upperQuery.includes("NOT IN") || upperQuery.includes("NOT EXISTS")) {
308
- suggestions.push(
309
- "NOT IN/NOT EXISTS can be slow; consider LEFT JOIN with NULL check",
310
- );
311
- }
313
+ if (upperQuery.includes("ORDER BY") && !upperQuery.includes("LIMIT")) {
314
+ suggestions.push("ORDER BY without LIMIT may cause full table sort");
315
+ }
312
316
 
313
- // Get EXPLAIN for the query
314
- let explainResult: unknown = null;
315
- let explainError: string | undefined;
316
- try {
317
- const explainSql = `EXPLAIN FORMAT=JSON ${query}`;
318
- const result = await adapter.executeReadQuery(explainSql);
319
- if (result.rows?.[0]) {
320
- const explainStr = result.rows[0]["EXPLAIN"];
321
- if (typeof explainStr === "string") {
322
- explainResult = JSON.parse(explainStr) as unknown;
317
+ if (
318
+ upperQuery.includes("NOT IN") ||
319
+ upperQuery.includes("NOT EXISTS")
320
+ ) {
321
+ suggestions.push(
322
+ "NOT IN/NOT EXISTS can be slow; consider LEFT JOIN with NULL check",
323
+ );
324
+ }
325
+
326
+ // Get EXPLAIN for the query
327
+ let explainResult: unknown = null;
328
+ let explainError: string | undefined;
329
+ try {
330
+ const explainSql = `EXPLAIN FORMAT=JSON ${query}`;
331
+ const result = await adapter.executeReadQuery(explainSql);
332
+ if (result.rows?.[0]) {
333
+ const explainStr = result.rows[0]["EXPLAIN"];
334
+ if (typeof explainStr === "string") {
335
+ explainResult = JSON.parse(explainStr) as unknown;
336
+ }
323
337
  }
338
+ } catch (err: unknown) {
339
+ const rawMsg =
340
+ err instanceof Error ? err.message : "Failed to generate EXPLAIN";
341
+ explainError = rawMsg
342
+ .replace(/^Query failed:\s*/i, "")
343
+ .replace(/^Execute failed:\s*/i, "");
324
344
  }
325
- } catch (err: unknown) {
326
- explainError =
327
- err instanceof Error ? err.message : "Failed to generate EXPLAIN";
328
- }
329
345
 
330
- const response: Record<string, unknown> = {
331
- originalQuery: query,
332
- suggestions,
333
- explainPlan: explainResult,
334
- };
346
+ const response: Record<string, unknown> = {
347
+ originalQuery: query,
348
+ suggestions,
349
+ explainPlan: explainResult,
350
+ };
335
351
 
336
- if (explainError) {
337
- response["explainError"] = explainError;
338
- }
352
+ if (explainError) {
353
+ response["explainError"] = explainError;
354
+ }
339
355
 
340
- return response;
356
+ return response;
357
+ } catch (error) {
358
+ const msg = error instanceof Error ? error.message : String(error);
359
+ return { success: false, error: msg };
360
+ }
341
361
  },
342
362
  };
343
363
  }
344
364
 
345
365
  export function createForceIndexTool(adapter: MySQLAdapter): ToolDefinition {
346
- const schema = z.object({
347
- table: z.string(),
348
- query: z.string().describe("Original query"),
349
- indexName: z.string().describe("Index name to force"),
350
- });
351
-
352
366
  return {
353
367
  name: "mysql_force_index",
354
368
  title: "MySQL Force Index",
355
369
  description: "Generate a query with FORCE INDEX hint.",
356
370
  group: "optimization",
357
- inputSchema: schema,
371
+ inputSchema: ForceIndexSchemaBase,
358
372
  requiredScopes: ["read"],
359
373
  annotations: {
360
374
  readOnlyHint: true,
361
375
  idempotentHint: true,
362
376
  },
363
377
  handler: async (params: unknown, _context: RequestContext) => {
364
- const { table, query, indexName } = schema.parse(params);
378
+ try {
379
+ const { table, query, indexName } = ForceIndexSchema.parse(params);
365
380
 
366
- // P154: Check table existence first
367
- const tableInfo = await adapter.describeTable(table);
368
- if (!tableInfo.columns || tableInfo.columns.length === 0) {
369
- return { exists: false, table };
370
- }
381
+ // P154: Check table existence first
382
+ const tableInfo = await adapter.describeTable(table);
383
+ if (!tableInfo.columns || tableInfo.columns.length === 0) {
384
+ return { exists: false, table };
385
+ }
371
386
 
372
- // Simple replacement - insert FORCE INDEX after table name
373
- const rewritten = query.replace(
374
- new RegExp(`FROM\\s+\`?${table}\`?`, "i"),
375
- `FROM \`${table}\` FORCE INDEX (\`${indexName}\`)`,
376
- );
377
-
378
- const response: Record<string, unknown> = {
379
- originalQuery: query,
380
- rewrittenQuery: rewritten,
381
- hint: `FORCE INDEX (\`${indexName}\`)`,
382
- };
383
-
384
- // Validate index existence and warn if not found
385
- const indexes = await adapter.getTableIndexes(table);
386
- if (!indexes.some((idx) => idx.name === indexName)) {
387
- response["warning"] =
388
- `Index '${indexName}' not found on table '${table}'`;
389
- }
387
+ // Simple replacement - insert FORCE INDEX after table name
388
+ const rewritten = query.replace(
389
+ new RegExp(`FROM\\s+\`?${table}\`?`, "i"),
390
+ `FROM \`${table}\` FORCE INDEX (\`${indexName}\`)`,
391
+ );
390
392
 
391
- return response;
393
+ const response: Record<string, unknown> = {
394
+ originalQuery: query,
395
+ rewrittenQuery: rewritten,
396
+ hint: `FORCE INDEX (\`${indexName}\`)`,
397
+ };
398
+
399
+ // Validate index existence and warn if not found
400
+ const indexes = await adapter.getTableIndexes(table);
401
+ if (!indexes.some((idx) => idx.name === indexName)) {
402
+ response["warning"] =
403
+ `Index '${indexName}' not found on table '${table}'`;
404
+ }
405
+
406
+ return response;
407
+ } catch (error) {
408
+ const msg = error instanceof Error ? error.message : String(error);
409
+ return { success: false, error: msg };
410
+ }
392
411
  },
393
412
  };
394
413
  }
@@ -435,18 +454,23 @@ export function createOptimizerTraceTool(
435
454
  readOnlyHint: true,
436
455
  },
437
456
  handler: async (params: unknown, _context: RequestContext) => {
438
- const { query, summary } = schema.parse(params);
457
+ let tracingEnabled = false;
458
+ try {
459
+ const { query, summary } = schema.parse(params);
439
460
 
440
- // Enable optimizer trace
441
- await adapter.executeQuery('SET optimizer_trace="enabled=on"');
461
+ // Enable optimizer trace
462
+ await adapter.executeQuery('SET optimizer_trace="enabled=on"');
463
+ tracingEnabled = true;
442
464
 
443
- try {
444
465
  // Execute the query (may fail for nonexistent tables, etc.)
445
466
  try {
446
467
  await adapter.executeReadQuery(query);
447
468
  } catch (err: unknown) {
448
- const errorMsg =
469
+ const rawMsg =
449
470
  err instanceof Error ? err.message : "Query execution failed";
471
+ const errorMsg = rawMsg
472
+ .replace(/^Query failed:\s*/i, "")
473
+ .replace(/^Execute failed:\s*/i, "");
450
474
  if (summary) {
451
475
  return { query, decisions: [], error: errorMsg };
452
476
  }
@@ -464,9 +488,14 @@ export function createOptimizerTraceTool(
464
488
  }
465
489
 
466
490
  return { trace: traceResult.rows };
491
+ } catch (error) {
492
+ const msg = error instanceof Error ? error.message : String(error);
493
+ return { success: false, error: msg };
467
494
  } finally {
468
- // Disable optimizer trace
469
- await adapter.executeQuery('SET optimizer_trace="enabled=off"');
495
+ if (tracingEnabled) {
496
+ // Disable optimizer trace
497
+ await adapter.executeQuery('SET optimizer_trace="enabled=off"');
498
+ }
470
499
  }
471
500
  },
472
501
  };