@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
@@ -23,10 +23,30 @@ export function createInnodbResource(
23
23
  priority: 0.7,
24
24
  },
25
25
  handler: async (_uri: string, _context: RequestContext) => {
26
- // Get buffer pool status
27
- const bufferPoolResult = await adapter.executeQuery(`
26
+ // Performance optimization: run all three independent queries in parallel
27
+ const [bufferPoolResult, configResult, opsResult] = await Promise.all([
28
+ // Get buffer pool status
29
+ adapter.executeQuery(`
28
30
  SHOW GLOBAL STATUS WHERE Variable_name LIKE 'Innodb_buffer_pool%'
29
- `);
31
+ `),
32
+ // Get buffer pool size configuration
33
+ adapter.executeQuery(`
34
+ SHOW GLOBAL VARIABLES WHERE Variable_name IN (
35
+ 'innodb_buffer_pool_size', 'innodb_buffer_pool_instances',
36
+ 'innodb_log_file_size', 'innodb_log_files_in_group',
37
+ 'innodb_flush_log_at_trx_commit', 'innodb_file_per_table'
38
+ )
39
+ `),
40
+ // Get row operations
41
+ adapter.executeQuery(`
42
+ SHOW GLOBAL STATUS WHERE Variable_name IN (
43
+ 'Innodb_rows_read', 'Innodb_rows_inserted',
44
+ 'Innodb_rows_updated', 'Innodb_rows_deleted',
45
+ 'Innodb_data_reads', 'Innodb_data_writes',
46
+ 'Innodb_os_log_written', 'Innodb_log_writes'
47
+ )
48
+ `),
49
+ ]);
30
50
 
31
51
  const bufferPool: Record<string, number> = {};
32
52
  for (const row of bufferPoolResult.rows ?? []) {
@@ -36,30 +56,11 @@ export function createInnodbResource(
36
56
  );
37
57
  }
38
58
 
39
- // Get buffer pool size configuration
40
- const configResult = await adapter.executeQuery(`
41
- SHOW GLOBAL VARIABLES WHERE Variable_name IN (
42
- 'innodb_buffer_pool_size', 'innodb_buffer_pool_instances',
43
- 'innodb_log_file_size', 'innodb_log_files_in_group',
44
- 'innodb_flush_log_at_trx_commit', 'innodb_file_per_table'
45
- )
46
- `);
47
-
48
59
  const config: Record<string, string> = {};
49
60
  for (const row of configResult.rows ?? []) {
50
61
  config[row["Variable_name"] as string] = row["Value"] as string;
51
62
  }
52
63
 
53
- // Get row operations
54
- const opsResult = await adapter.executeQuery(`
55
- SHOW GLOBAL STATUS WHERE Variable_name IN (
56
- 'Innodb_rows_read', 'Innodb_rows_inserted',
57
- 'Innodb_rows_updated', 'Innodb_rows_deleted',
58
- 'Innodb_data_reads', 'Innodb_data_writes',
59
- 'Innodb_os_log_written', 'Innodb_log_writes'
60
- )
61
- `);
62
-
63
64
  const operations: Record<string, number> = {};
64
65
  for (const row of opsResult.rows ?? []) {
65
66
  operations[row["Variable_name"] as string] = parseInt(
@@ -20,8 +20,10 @@ export function createLocksResource(adapter: MySQLAdapter): ResourceDefinition {
20
20
  },
21
21
  handler: async (_uri: string, _context: RequestContext) => {
22
22
  try {
23
- // Get current lock waits from performance_schema
24
- const lockWaitsResult = await adapter.executeQuery(`
23
+ // Performance optimization: run both independent queries in parallel
24
+ const [lockWaitsResult, lockStatusResult] = await Promise.all([
25
+ // Get current lock waits from performance_schema
26
+ adapter.executeQuery(`
25
27
  SELECT
26
28
  r.trx_id AS waiting_trx_id,
27
29
  r.trx_mysql_thread_id AS waiting_thread,
@@ -34,12 +36,12 @@ export function createLocksResource(adapter: MySQLAdapter): ResourceDefinition {
34
36
  JOIN information_schema.innodb_trx r ON r.trx_id = w.REQUESTING_ENGINE_TRANSACTION_ID
35
37
  JOIN information_schema.innodb_trx b ON b.trx_id = w.BLOCKING_ENGINE_TRANSACTION_ID
36
38
  LIMIT 20
37
- `);
38
-
39
- // Get global lock status
40
- const lockStatusResult = await adapter.executeQuery(`
39
+ `),
40
+ // Get global lock status
41
+ adapter.executeQuery(`
41
42
  SHOW STATUS LIKE 'Innodb_row_lock%'
42
- `);
43
+ `),
44
+ ]);
43
45
 
44
46
  const lockStats: Record<string, unknown> = {};
45
47
  for (const row of lockStatusResult.rows ?? []) {
@@ -23,8 +23,9 @@ export function createPerformanceResource(
23
23
  priority: 0.8,
24
24
  },
25
25
  handler: async (_uri: string, _context: RequestContext) => {
26
- // Get performance-related status variables
27
- const statusResult = await adapter.executeQuery(`
26
+ // Performance optimization: run both queries in parallel
27
+ // The performance_schema query may fail, but we handle that gracefully
28
+ const statusPromise = adapter.executeQuery(`
28
29
  SHOW GLOBAL STATUS WHERE Variable_name IN (
29
30
  'Queries', 'Questions', 'Slow_queries',
30
31
  'Select_full_join', 'Select_range_check', 'Select_scan',
@@ -35,18 +36,9 @@ export function createPerformanceResource(
35
36
  )
36
37
  `);
37
38
 
38
- const status: Record<string, number> = {};
39
- for (const row of statusResult.rows ?? []) {
40
- status[row["Variable_name"] as string] = parseInt(
41
- row["Value"] as string,
42
- 10,
43
- );
44
- }
45
-
46
- // Get performance schema if available (MySQL 5.6+)
47
- let topQueries: unknown[] = [];
48
- try {
49
- const perfResult = await adapter.executeQuery(`
39
+ const perfPromise = adapter
40
+ .executeQuery(
41
+ `
50
42
  SELECT
51
43
  DIGEST_TEXT as query_pattern,
52
44
  COUNT_STAR as execution_count,
@@ -59,12 +51,25 @@ export function createPerformanceResource(
59
51
  WHERE DIGEST_TEXT IS NOT NULL
60
52
  ORDER BY SUM_TIMER_WAIT DESC
61
53
  LIMIT 10
62
- `);
63
- topQueries = perfResult.rows ?? [];
64
- } catch {
65
- // Performance schema may not be available
54
+ `,
55
+ )
56
+ .catch(() => ({ rows: [] as Record<string, unknown>[] }));
57
+
58
+ const [statusResult, perfResult] = await Promise.all([
59
+ statusPromise,
60
+ perfPromise,
61
+ ]);
62
+
63
+ const status: Record<string, number> = {};
64
+ for (const row of statusResult.rows ?? []) {
65
+ status[row["Variable_name"] as string] = parseInt(
66
+ row["Value"] as string,
67
+ 10,
68
+ );
66
69
  }
67
70
 
71
+ const topQueries = perfResult.rows ?? [];
72
+
68
73
  // Calculate derived metrics
69
74
  const tmpTablesCreated = status["Created_tmp_tables"] ?? 0;
70
75
  const tmpDiskRatio =
@@ -21,8 +21,10 @@ export function createSpatialResource(
21
21
  priority: 0.5,
22
22
  },
23
23
  handler: async (_uri: string, _context: RequestContext) => {
24
- // Get spatial columns
25
- const columnsResult = await adapter.executeQuery(`
24
+ // Performance optimization: run both independent queries in parallel
25
+ const [columnsResult, indexesResult] = await Promise.all([
26
+ // Get spatial columns
27
+ adapter.executeQuery(`
26
28
  SELECT
27
29
  TABLE_SCHEMA as schema_name,
28
30
  TABLE_NAME as table_name,
@@ -34,10 +36,9 @@ export function createSpatialResource(
34
36
  'multipoint', 'multilinestring', 'multipolygon', 'geometrycollection')
35
37
  AND TABLE_SCHEMA = DATABASE()
36
38
  ORDER BY TABLE_NAME, COLUMN_NAME
37
- `);
38
-
39
- // Get spatial indexes
40
- const indexesResult = await adapter.executeQuery(`
39
+ `),
40
+ // Get spatial indexes
41
+ adapter.executeQuery(`
41
42
  SELECT
42
43
  TABLE_NAME as table_name,
43
44
  INDEX_NAME as index_name,
@@ -46,7 +47,8 @@ export function createSpatialResource(
46
47
  WHERE INDEX_TYPE = 'SPATIAL'
47
48
  AND TABLE_SCHEMA = DATABASE()
48
49
  ORDER BY TABLE_NAME, INDEX_NAME
49
- `);
50
+ `),
51
+ ]);
50
52
 
51
53
  return {
52
54
  spatialColumnCount: columnsResult.rows?.length ?? 0,
@@ -22,27 +22,28 @@ export function createSysSchemaResource(
22
22
  },
23
23
  handler: async (_uri: string, _context: RequestContext) => {
24
24
  try {
25
- // Top resource consumers
26
- const usersResult = await adapter.executeQuery(`
25
+ // Performance optimization: run all three independent queries in parallel
26
+ const [usersResult, statementsResult, locksResult] = await Promise.all([
27
+ // Top resource consumers
28
+ adapter.executeQuery(`
27
29
  SELECT user, total_connections, current_connections,
28
30
  total_memory_allocated as memory_bytes
29
31
  FROM sys.user_summary
30
32
  ORDER BY total_memory_allocated DESC
31
33
  LIMIT 5
32
- `);
33
-
34
- // Slow statements
35
- const statementsResult = await adapter.executeQuery(`
34
+ `),
35
+ // Slow statements
36
+ adapter.executeQuery(`
36
37
  SELECT SUBSTRING(query, 1, 100) as query_preview,
37
38
  exec_count, total_latency, avg_latency
38
39
  FROM sys.statements_with_runtimes_in_95th_percentile
39
40
  LIMIT 5
40
- `);
41
-
42
- // Current lock waits
43
- const locksResult = await adapter.executeQuery(`
41
+ `),
42
+ // Current lock waits
43
+ adapter.executeQuery(`
44
44
  SELECT COUNT(*) as lock_wait_count FROM sys.innodb_lock_waits
45
- `);
45
+ `),
46
+ ]);
46
47
  const lockRow = locksResult.rows?.[0];
47
48
 
48
49
  return {
@@ -300,6 +300,16 @@ describe("Handler Execution", () => {
300
300
 
301
301
  expect(mockAdapter.listTables).toHaveBeenCalled();
302
302
  });
303
+
304
+ it("should return exists: false for nonexistent database", async () => {
305
+ mockAdapter.executeReadQuery.mockResolvedValue(createMockQueryResult([]));
306
+
307
+ const tool = tools.find((t) => t.name === "mysql_list_tables")!;
308
+ const result = await tool.handler({ database: "fake_db" }, mockContext);
309
+
310
+ expect(result).toHaveProperty("exists", false);
311
+ expect(result).toHaveProperty("database", "fake_db");
312
+ });
303
313
  });
304
314
 
305
315
  describe("mysql_describe_table", () => {
@@ -380,6 +390,7 @@ describe("Handler Execution", () => {
380
390
  });
381
391
 
382
392
  it("should handle IF NOT EXISTS clause", async () => {
393
+ mockAdapter.describeTable.mockResolvedValue({ columns: [] });
383
394
  mockAdapter.executeQuery.mockResolvedValue({ rows: [], rowsAffected: 0 });
384
395
 
385
396
  const tool = tools.find((t) => t.name === "mysql_create_table")!;
@@ -458,25 +469,49 @@ describe("Handler Execution", () => {
458
469
 
459
470
  expect(result).toHaveProperty("success", false);
460
471
  expect(result).toHaveProperty(
461
- "reason",
472
+ "error",
462
473
  "Table 'test_table' already exists",
463
474
  );
464
475
  });
465
476
 
466
- it("should re-throw non-existence errors in create table", async () => {
477
+ it("should return structured error for non-existence errors in create table", async () => {
467
478
  mockAdapter.executeQuery.mockRejectedValue(new Error("Access denied"));
468
479
 
469
480
  const tool = tools.find((t) => t.name === "mysql_create_table")!;
481
+ const result = await tool.handler(
482
+ {
483
+ name: "test_table",
484
+ columns: [{ name: "id", type: "INT" }],
485
+ },
486
+ mockContext,
487
+ );
470
488
 
471
- await expect(
472
- tool.handler(
473
- {
474
- name: "test_table",
475
- columns: [{ name: "id", type: "INT" }],
476
- },
477
- mockContext,
478
- ),
479
- ).rejects.toThrow("Access denied");
489
+ expect(result).toHaveProperty("success", false);
490
+ expect((result as Record<string, unknown>).error).toContain(
491
+ "Access denied",
492
+ );
493
+ });
494
+
495
+ it("should return skipped indicator when ifNotExists is true and table exists", async () => {
496
+ mockAdapter.describeTable.mockResolvedValue({
497
+ columns: [{ name: "id", type: "int" }],
498
+ });
499
+
500
+ const tool = tools.find((t) => t.name === "mysql_create_table")!;
501
+ const result = await tool.handler(
502
+ {
503
+ name: "existing_table",
504
+ columns: [{ name: "id", type: "INT" }],
505
+ ifNotExists: true,
506
+ },
507
+ mockContext,
508
+ );
509
+
510
+ expect(result).toHaveProperty("success", true);
511
+ expect(result).toHaveProperty("skipped", true);
512
+ expect(result).toHaveProperty("reason", "Table already exists");
513
+ // Should NOT call executeQuery since it short-circuits
514
+ expect(mockAdapter.executeQuery).not.toHaveBeenCalled();
480
515
  });
481
516
  });
482
517
 
@@ -503,12 +538,14 @@ describe("Handler Execution", () => {
503
538
  expect(sqlCall).toContain("IF EXISTS");
504
539
  });
505
540
 
506
- it("should reject invalid table names", async () => {
541
+ it("should return structured error for invalid table names", async () => {
507
542
  const tool = tools.find((t) => t.name === "mysql_drop_table")!;
543
+ const result = await tool.handler({ table: "invalid-name" }, mockContext);
508
544
 
509
- await expect(
510
- tool.handler({ table: "invalid-name" }, mockContext),
511
- ).rejects.toThrow("Invalid table name");
545
+ expect(result).toHaveProperty("success", false);
546
+ expect((result as Record<string, unknown>).error).toBe(
547
+ "Invalid table name",
548
+ );
512
549
  });
513
550
 
514
551
  it("should handle qualified table names", async () => {
@@ -518,7 +555,7 @@ describe("Handler Execution", () => {
518
555
  await tool.handler({ table: "db.table" }, mockContext);
519
556
 
520
557
  const sqlCall = mockAdapter.executeQuery.mock.calls[0]?.[0] as string;
521
- expect(sqlCall).toContain("DROP TABLE IF EXISTS `db`.`table`");
558
+ expect(sqlCall).toContain("DROP TABLE `db`.`table`");
522
559
  });
523
560
 
524
561
  it("should return graceful error when table does not exist", async () => {
@@ -534,7 +571,7 @@ describe("Handler Execution", () => {
534
571
 
535
572
  expect(result).toHaveProperty("success", false);
536
573
  expect(result).toHaveProperty(
537
- "reason",
574
+ "error",
538
575
  "Table 'nonexistent' does not exist",
539
576
  );
540
577
  });
@@ -554,14 +591,19 @@ describe("Handler Execution", () => {
554
591
  expect(result).toHaveProperty("reason", "Table did not exist");
555
592
  });
556
593
 
557
- it("should re-throw non-existence errors in drop table", async () => {
594
+ it("should return structured error for non-existence errors in drop table", async () => {
558
595
  mockAdapter.executeQuery.mockRejectedValue(new Error("Access denied"));
559
596
 
560
597
  const tool = tools.find((t) => t.name === "mysql_drop_table")!;
598
+ const result = await tool.handler(
599
+ { table: "some_table", ifExists: false },
600
+ mockContext,
601
+ );
561
602
 
562
- await expect(
563
- tool.handler({ table: "some_table", ifExists: false }, mockContext),
564
- ).rejects.toThrow("Access denied");
603
+ expect(result).toHaveProperty("success", false);
604
+ expect((result as Record<string, unknown>).error).toContain(
605
+ "Access denied",
606
+ );
565
607
  });
566
608
  });
567
609
 
@@ -629,34 +671,38 @@ describe("Handler Execution", () => {
629
671
  expect(mockAdapter.executeQuery).not.toHaveBeenCalled();
630
672
  });
631
673
 
632
- it("should reject invalid index names", async () => {
674
+ it("should return structured error for invalid index names", async () => {
633
675
  const tool = tools.find((t) => t.name === "mysql_create_index")!;
676
+ const result = await tool.handler(
677
+ {
678
+ name: "invalid-name",
679
+ table: "users",
680
+ columns: ["email"],
681
+ },
682
+ mockContext,
683
+ );
634
684
 
635
- await expect(
636
- tool.handler(
637
- {
638
- name: "invalid-name",
639
- table: "users",
640
- columns: ["email"],
641
- },
642
- mockContext,
643
- ),
644
- ).rejects.toThrow("Invalid index name");
685
+ expect(result).toHaveProperty("success", false);
686
+ expect((result as Record<string, unknown>).error).toBe(
687
+ "Invalid index name",
688
+ );
645
689
  });
646
690
 
647
- it("should reject invalid table names", async () => {
691
+ it("should return structured error for invalid table names", async () => {
648
692
  const tool = tools.find((t) => t.name === "mysql_create_index")!;
693
+ const result = await tool.handler(
694
+ {
695
+ name: "valid_name",
696
+ table: "invalid-table",
697
+ columns: ["email"],
698
+ },
699
+ mockContext,
700
+ );
649
701
 
650
- await expect(
651
- tool.handler(
652
- {
653
- name: "valid_name",
654
- table: "invalid-table",
655
- columns: ["email"],
656
- },
657
- mockContext,
658
- ),
659
- ).rejects.toThrow("Invalid table name");
702
+ expect(result).toHaveProperty("success", false);
703
+ expect((result as Record<string, unknown>).error).toBe(
704
+ "Invalid table name",
705
+ );
660
706
  });
661
707
 
662
708
  it("should handle qualified table names", async () => {
@@ -714,7 +760,7 @@ describe("Handler Execution", () => {
714
760
 
715
761
  expect(result).toHaveProperty("success", false);
716
762
  expect(result).toHaveProperty(
717
- "reason",
763
+ "error",
718
764
  "Index 'idx_existing' already exists on table 'users'",
719
765
  );
720
766
  });
@@ -738,21 +784,46 @@ describe("Handler Execution", () => {
738
784
  expect(result).toHaveProperty("table", "nonexistent");
739
785
  });
740
786
 
741
- it("should re-throw non-index errors in create index", async () => {
787
+ it("should return structured error for non-index errors in create index", async () => {
742
788
  mockAdapter.executeQuery.mockRejectedValue(new Error("Access denied"));
743
789
 
744
790
  const tool = tools.find((t) => t.name === "mysql_create_index")!;
791
+ const result = await tool.handler(
792
+ {
793
+ name: "idx_test",
794
+ table: "users",
795
+ columns: ["email"],
796
+ },
797
+ mockContext,
798
+ );
799
+
800
+ expect(result).toHaveProperty("success", false);
801
+ expect((result as Record<string, unknown>).error).toContain(
802
+ "Access denied",
803
+ );
804
+ });
805
+
806
+ it("should return column-specific error for invalid column names", async () => {
807
+ mockAdapter.executeQuery.mockRejectedValue(
808
+ new Error("Key column 'nonexistent_col' doesn't exist in table"),
809
+ );
810
+
811
+ const tool = tools.find((t) => t.name === "mysql_create_index")!;
812
+ const result = await tool.handler(
813
+ {
814
+ name: "idx_test",
815
+ table: "users",
816
+ columns: ["nonexistent_col"],
817
+ },
818
+ mockContext,
819
+ );
745
820
 
746
- await expect(
747
- tool.handler(
748
- {
749
- name: "idx_test",
750
- table: "users",
751
- columns: ["email"],
752
- },
753
- mockContext,
754
- ),
755
- ).rejects.toThrow("Access denied");
821
+ expect(result).toHaveProperty("success", false);
822
+ expect((result as Record<string, unknown>).error).toContain(
823
+ "Column 'nonexistent_col' does not exist",
824
+ );
825
+ // Should NOT return exists: false (table exists, column doesn't)
826
+ expect(result).not.toHaveProperty("exists", false);
756
827
  });
757
828
  });
758
829
  });