@neverinfamous/mysql-mcp 2.1.0 → 2.3.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 (802) hide show
  1. package/.env.example +14 -4
  2. package/.github/ISSUE_TEMPLATE/bug_report.md +7 -1
  3. package/.github/ISSUE_TEMPLATE/feature_request.md +6 -1
  4. package/.github/dependabot.yml +15 -0
  5. package/.github/pull_request_template.md +5 -0
  6. package/.github/workflows/codeql.yml +41 -42
  7. package/.github/workflows/docker-publish.yml +247 -210
  8. package/.github/workflows/publish-npm.yml +16 -6
  9. package/CHANGELOG.md +357 -22
  10. package/CODE_MODE.md +245 -0
  11. package/CODE_OF_CONDUCT.md +2 -0
  12. package/DOCKER_README.md +250 -161
  13. package/Dockerfile +2 -2
  14. package/README.md +239 -182
  15. package/SECURITY.md +0 -8
  16. package/VERSION +1 -1
  17. package/dist/__tests__/mocks/adapter.d.ts +3 -3
  18. package/dist/__tests__/mocks/adapter.d.ts.map +1 -1
  19. package/dist/__tests__/mocks/adapter.js +51 -35
  20. package/dist/__tests__/mocks/adapter.js.map +1 -1
  21. package/dist/__tests__/mocks/index.d.ts +4 -4
  22. package/dist/__tests__/mocks/index.d.ts.map +1 -1
  23. package/dist/__tests__/mocks/index.js +2 -2
  24. package/dist/__tests__/mocks/index.js.map +1 -1
  25. package/dist/__tests__/mocks/mysql.d.ts +2 -2
  26. package/dist/__tests__/mocks/mysql.d.ts.map +1 -1
  27. package/dist/__tests__/mocks/mysql.js +14 -14
  28. package/dist/__tests__/mocks/mysql.js.map +1 -1
  29. package/dist/__tests__/setup.d.ts.map +1 -1
  30. package/dist/__tests__/setup.js +7 -7
  31. package/dist/__tests__/setup.js.map +1 -1
  32. package/dist/adapters/DatabaseAdapter.d.ts +2 -2
  33. package/dist/adapters/DatabaseAdapter.d.ts.map +1 -1
  34. package/dist/adapters/DatabaseAdapter.js +69 -40
  35. package/dist/adapters/DatabaseAdapter.js.map +1 -1
  36. package/dist/adapters/mysql/MySQLAdapter.d.ts +14 -4
  37. package/dist/adapters/mysql/MySQLAdapter.d.ts.map +1 -1
  38. package/dist/adapters/mysql/MySQLAdapter.js +152 -116
  39. package/dist/adapters/mysql/MySQLAdapter.js.map +1 -1
  40. package/dist/adapters/mysql/SchemaManager.d.ts +1 -1
  41. package/dist/adapters/mysql/SchemaManager.d.ts.map +1 -1
  42. package/dist/adapters/mysql/SchemaManager.js +76 -56
  43. package/dist/adapters/mysql/SchemaManager.js.map +1 -1
  44. package/dist/adapters/mysql/index.d.ts +2 -2
  45. package/dist/adapters/mysql/index.js +2 -2
  46. package/dist/adapters/mysql/prompts/backupStrategy.d.ts +1 -1
  47. package/dist/adapters/mysql/prompts/backupStrategy.d.ts.map +1 -1
  48. package/dist/adapters/mysql/prompts/backupStrategy.js +21 -9
  49. package/dist/adapters/mysql/prompts/backupStrategy.js.map +1 -1
  50. package/dist/adapters/mysql/prompts/clusterSetup.d.ts +1 -1
  51. package/dist/adapters/mysql/prompts/clusterSetup.d.ts.map +1 -1
  52. package/dist/adapters/mysql/prompts/clusterSetup.js +3 -3
  53. package/dist/adapters/mysql/prompts/clusterSetup.js.map +1 -1
  54. package/dist/adapters/mysql/prompts/docstoreSetup.d.ts +1 -1
  55. package/dist/adapters/mysql/prompts/docstoreSetup.js +3 -3
  56. package/dist/adapters/mysql/prompts/docstoreSetup.js.map +1 -1
  57. package/dist/adapters/mysql/prompts/eventScheduler.d.ts +1 -1
  58. package/dist/adapters/mysql/prompts/eventScheduler.js +3 -3
  59. package/dist/adapters/mysql/prompts/eventScheduler.js.map +1 -1
  60. package/dist/adapters/mysql/prompts/healthCheck.d.ts +1 -1
  61. package/dist/adapters/mysql/prompts/healthCheck.d.ts.map +1 -1
  62. package/dist/adapters/mysql/prompts/healthCheck.js +10 -6
  63. package/dist/adapters/mysql/prompts/healthCheck.js.map +1 -1
  64. package/dist/adapters/mysql/prompts/index.d.ts +10 -3
  65. package/dist/adapters/mysql/prompts/index.d.ts.map +1 -1
  66. package/dist/adapters/mysql/prompts/index.js +106 -63
  67. package/dist/adapters/mysql/prompts/index.js.map +1 -1
  68. package/dist/adapters/mysql/prompts/indexTuning.d.ts +1 -1
  69. package/dist/adapters/mysql/prompts/indexTuning.d.ts.map +1 -1
  70. package/dist/adapters/mysql/prompts/indexTuning.js +11 -7
  71. package/dist/adapters/mysql/prompts/indexTuning.js.map +1 -1
  72. package/dist/adapters/mysql/prompts/mysqlshSetup.d.ts +1 -1
  73. package/dist/adapters/mysql/prompts/mysqlshSetup.js +4 -4
  74. package/dist/adapters/mysql/prompts/mysqlshSetup.js.map +1 -1
  75. package/dist/adapters/mysql/prompts/proxysqlSetup.d.ts +1 -1
  76. package/dist/adapters/mysql/prompts/proxysqlSetup.js +3 -3
  77. package/dist/adapters/mysql/prompts/proxysqlSetup.js.map +1 -1
  78. package/dist/adapters/mysql/prompts/replicationSetup.d.ts +1 -1
  79. package/dist/adapters/mysql/prompts/replicationSetup.d.ts.map +1 -1
  80. package/dist/adapters/mysql/prompts/replicationSetup.js +13 -7
  81. package/dist/adapters/mysql/prompts/replicationSetup.js.map +1 -1
  82. package/dist/adapters/mysql/prompts/routerSetup.d.ts +1 -1
  83. package/dist/adapters/mysql/prompts/routerSetup.d.ts.map +1 -1
  84. package/dist/adapters/mysql/prompts/routerSetup.js +8 -3
  85. package/dist/adapters/mysql/prompts/routerSetup.js.map +1 -1
  86. package/dist/adapters/mysql/prompts/spatialSetup.d.ts +1 -1
  87. package/dist/adapters/mysql/prompts/spatialSetup.js +3 -3
  88. package/dist/adapters/mysql/prompts/spatialSetup.js.map +1 -1
  89. package/dist/adapters/mysql/prompts/sysSchema.d.ts +1 -1
  90. package/dist/adapters/mysql/prompts/sysSchema.d.ts.map +1 -1
  91. package/dist/adapters/mysql/prompts/sysSchema.js +3 -3
  92. package/dist/adapters/mysql/prompts/sysSchema.js.map +1 -1
  93. package/dist/adapters/mysql/resources/capabilities.d.ts +2 -2
  94. package/dist/adapters/mysql/resources/capabilities.d.ts.map +1 -1
  95. package/dist/adapters/mysql/resources/capabilities.js +19 -16
  96. package/dist/adapters/mysql/resources/capabilities.js.map +1 -1
  97. package/dist/adapters/mysql/resources/cluster.d.ts +2 -2
  98. package/dist/adapters/mysql/resources/cluster.d.ts.map +1 -1
  99. package/dist/adapters/mysql/resources/cluster.js +17 -15
  100. package/dist/adapters/mysql/resources/cluster.js.map +1 -1
  101. package/dist/adapters/mysql/resources/docstore.d.ts +2 -2
  102. package/dist/adapters/mysql/resources/docstore.d.ts.map +1 -1
  103. package/dist/adapters/mysql/resources/docstore.js +12 -12
  104. package/dist/adapters/mysql/resources/docstore.js.map +1 -1
  105. package/dist/adapters/mysql/resources/events.d.ts +2 -2
  106. package/dist/adapters/mysql/resources/events.d.ts.map +1 -1
  107. package/dist/adapters/mysql/resources/events.js +12 -12
  108. package/dist/adapters/mysql/resources/events.js.map +1 -1
  109. package/dist/adapters/mysql/resources/health.d.ts +2 -2
  110. package/dist/adapters/mysql/resources/health.d.ts.map +1 -1
  111. package/dist/adapters/mysql/resources/health.js +36 -32
  112. package/dist/adapters/mysql/resources/health.js.map +1 -1
  113. package/dist/adapters/mysql/resources/index.d.ts +11 -3
  114. package/dist/adapters/mysql/resources/index.d.ts.map +1 -1
  115. package/dist/adapters/mysql/resources/index.js +28 -20
  116. package/dist/adapters/mysql/resources/index.js.map +1 -1
  117. package/dist/adapters/mysql/resources/indexes.d.ts +2 -2
  118. package/dist/adapters/mysql/resources/indexes.d.ts.map +1 -1
  119. package/dist/adapters/mysql/resources/indexes.js +12 -12
  120. package/dist/adapters/mysql/resources/indexes.js.map +1 -1
  121. package/dist/adapters/mysql/resources/innodb.d.ts +2 -2
  122. package/dist/adapters/mysql/resources/innodb.d.ts.map +1 -1
  123. package/dist/adapters/mysql/resources/innodb.js +37 -36
  124. package/dist/adapters/mysql/resources/innodb.js.map +1 -1
  125. package/dist/adapters/mysql/resources/locks.d.ts +2 -2
  126. package/dist/adapters/mysql/resources/locks.d.ts.map +1 -1
  127. package/dist/adapters/mysql/resources/locks.js +14 -14
  128. package/dist/adapters/mysql/resources/locks.js.map +1 -1
  129. package/dist/adapters/mysql/resources/performance.d.ts +2 -2
  130. package/dist/adapters/mysql/resources/performance.d.ts.map +1 -1
  131. package/dist/adapters/mysql/resources/performance.js +30 -29
  132. package/dist/adapters/mysql/resources/performance.js.map +1 -1
  133. package/dist/adapters/mysql/resources/pool.d.ts +2 -2
  134. package/dist/adapters/mysql/resources/pool.d.ts.map +1 -1
  135. package/dist/adapters/mysql/resources/pool.js +9 -9
  136. package/dist/adapters/mysql/resources/pool.js.map +1 -1
  137. package/dist/adapters/mysql/resources/processlist.d.ts +2 -2
  138. package/dist/adapters/mysql/resources/processlist.d.ts.map +1 -1
  139. package/dist/adapters/mysql/resources/processlist.js +9 -9
  140. package/dist/adapters/mysql/resources/processlist.js.map +1 -1
  141. package/dist/adapters/mysql/resources/replication.d.ts +2 -2
  142. package/dist/adapters/mysql/resources/replication.d.ts.map +1 -1
  143. package/dist/adapters/mysql/resources/replication.js +42 -35
  144. package/dist/adapters/mysql/resources/replication.js.map +1 -1
  145. package/dist/adapters/mysql/resources/schema.d.ts +2 -2
  146. package/dist/adapters/mysql/resources/schema.d.ts.map +1 -1
  147. package/dist/adapters/mysql/resources/schema.js +8 -8
  148. package/dist/adapters/mysql/resources/schema.js.map +1 -1
  149. package/dist/adapters/mysql/resources/spatial.d.ts +2 -2
  150. package/dist/adapters/mysql/resources/spatial.d.ts.map +1 -1
  151. package/dist/adapters/mysql/resources/spatial.js +9 -9
  152. package/dist/adapters/mysql/resources/spatial.js.map +1 -1
  153. package/dist/adapters/mysql/resources/status.d.ts +2 -2
  154. package/dist/adapters/mysql/resources/status.d.ts.map +1 -1
  155. package/dist/adapters/mysql/resources/status.js +10 -10
  156. package/dist/adapters/mysql/resources/status.js.map +1 -1
  157. package/dist/adapters/mysql/resources/sysschema.d.ts +2 -2
  158. package/dist/adapters/mysql/resources/sysschema.d.ts.map +1 -1
  159. package/dist/adapters/mysql/resources/sysschema.js +10 -10
  160. package/dist/adapters/mysql/resources/sysschema.js.map +1 -1
  161. package/dist/adapters/mysql/resources/tables.d.ts +2 -2
  162. package/dist/adapters/mysql/resources/tables.d.ts.map +1 -1
  163. package/dist/adapters/mysql/resources/tables.js +8 -8
  164. package/dist/adapters/mysql/resources/tables.js.map +1 -1
  165. package/dist/adapters/mysql/resources/variables.d.ts +2 -2
  166. package/dist/adapters/mysql/resources/variables.d.ts.map +1 -1
  167. package/dist/adapters/mysql/resources/variables.js +10 -10
  168. package/dist/adapters/mysql/resources/variables.js.map +1 -1
  169. package/dist/adapters/mysql/tools/admin/backup.d.ts +2 -2
  170. package/dist/adapters/mysql/tools/admin/backup.d.ts.map +1 -1
  171. package/dist/adapters/mysql/tools/admin/backup.js +193 -101
  172. package/dist/adapters/mysql/tools/admin/backup.js.map +1 -1
  173. package/dist/adapters/mysql/tools/admin/index.d.ts +2 -2
  174. package/dist/adapters/mysql/tools/admin/index.js +6 -6
  175. package/dist/adapters/mysql/tools/admin/index.js.map +1 -1
  176. package/dist/adapters/mysql/tools/admin/maintenance.d.ts +2 -2
  177. package/dist/adapters/mysql/tools/admin/maintenance.d.ts.map +1 -1
  178. package/dist/adapters/mysql/tools/admin/maintenance.js +97 -66
  179. package/dist/adapters/mysql/tools/admin/maintenance.js.map +1 -1
  180. package/dist/adapters/mysql/tools/admin/monitoring.d.ts +2 -2
  181. package/dist/adapters/mysql/tools/admin/monitoring.d.ts.map +1 -1
  182. package/dist/adapters/mysql/tools/admin/monitoring.js +215 -79
  183. package/dist/adapters/mysql/tools/admin/monitoring.js.map +1 -1
  184. package/dist/adapters/mysql/tools/cluster/group-replication.d.ts +2 -2
  185. package/dist/adapters/mysql/tools/cluster/group-replication.d.ts.map +1 -1
  186. package/dist/adapters/mysql/tools/cluster/group-replication.js +90 -74
  187. package/dist/adapters/mysql/tools/cluster/group-replication.js.map +1 -1
  188. package/dist/adapters/mysql/tools/cluster/index.d.ts +2 -2
  189. package/dist/adapters/mysql/tools/cluster/index.js +3 -3
  190. package/dist/adapters/mysql/tools/cluster/index.js.map +1 -1
  191. package/dist/adapters/mysql/tools/cluster/innodb-cluster.d.ts +2 -2
  192. package/dist/adapters/mysql/tools/cluster/innodb-cluster.d.ts.map +1 -1
  193. package/dist/adapters/mysql/tools/cluster/innodb-cluster.js +225 -97
  194. package/dist/adapters/mysql/tools/cluster/innodb-cluster.js.map +1 -1
  195. package/dist/adapters/mysql/tools/codemode/index.d.ts +38 -0
  196. package/dist/adapters/mysql/tools/codemode/index.d.ts.map +1 -0
  197. package/dist/adapters/mysql/tools/codemode/index.js +203 -0
  198. package/dist/adapters/mysql/tools/codemode/index.js.map +1 -0
  199. package/dist/adapters/mysql/tools/core.d.ts +2 -2
  200. package/dist/adapters/mysql/tools/core.d.ts.map +1 -1
  201. package/dist/adapters/mysql/tools/core.js +234 -114
  202. package/dist/adapters/mysql/tools/core.js.map +1 -1
  203. package/dist/adapters/mysql/tools/docstore.d.ts +2 -2
  204. package/dist/adapters/mysql/tools/docstore.d.ts.map +1 -1
  205. package/dist/adapters/mysql/tools/docstore.js +252 -117
  206. package/dist/adapters/mysql/tools/docstore.js.map +1 -1
  207. package/dist/adapters/mysql/tools/events.d.ts +2 -2
  208. package/dist/adapters/mysql/tools/events.d.ts.map +1 -1
  209. package/dist/adapters/mysql/tools/events.js +236 -113
  210. package/dist/adapters/mysql/tools/events.js.map +1 -1
  211. package/dist/adapters/mysql/tools/index.d.ts +19 -19
  212. package/dist/adapters/mysql/tools/index.d.ts.map +1 -1
  213. package/dist/adapters/mysql/tools/index.js +19 -19
  214. package/dist/adapters/mysql/tools/index.js.map +1 -1
  215. package/dist/adapters/mysql/tools/json/core.d.ts +2 -2
  216. package/dist/adapters/mysql/tools/json/core.d.ts.map +1 -1
  217. package/dist/adapters/mysql/tools/json/core.js +225 -131
  218. package/dist/adapters/mysql/tools/json/core.js.map +1 -1
  219. package/dist/adapters/mysql/tools/json/enhanced.d.ts +2 -2
  220. package/dist/adapters/mysql/tools/json/enhanced.d.ts.map +1 -1
  221. package/dist/adapters/mysql/tools/json/enhanced.js +274 -163
  222. package/dist/adapters/mysql/tools/json/enhanced.js.map +1 -1
  223. package/dist/adapters/mysql/tools/json/helpers.d.ts +2 -2
  224. package/dist/adapters/mysql/tools/json/helpers.d.ts.map +1 -1
  225. package/dist/adapters/mysql/tools/json/helpers.js +141 -57
  226. package/dist/adapters/mysql/tools/json/helpers.js.map +1 -1
  227. package/dist/adapters/mysql/tools/json/index.d.ts +2 -2
  228. package/dist/adapters/mysql/tools/json/index.js +6 -6
  229. package/dist/adapters/mysql/tools/json/index.js.map +1 -1
  230. package/dist/adapters/mysql/tools/partitioning.d.ts +2 -2
  231. package/dist/adapters/mysql/tools/partitioning.d.ts.map +1 -1
  232. package/dist/adapters/mysql/tools/partitioning.js +180 -64
  233. package/dist/adapters/mysql/tools/partitioning.js.map +1 -1
  234. package/dist/adapters/mysql/tools/performance/analysis.d.ts +2 -2
  235. package/dist/adapters/mysql/tools/performance/analysis.d.ts.map +1 -1
  236. package/dist/adapters/mysql/tools/performance/analysis.js +184 -101
  237. package/dist/adapters/mysql/tools/performance/analysis.js.map +1 -1
  238. package/dist/adapters/mysql/tools/performance/index.d.ts +2 -2
  239. package/dist/adapters/mysql/tools/performance/index.js +4 -4
  240. package/dist/adapters/mysql/tools/performance/index.js.map +1 -1
  241. package/dist/adapters/mysql/tools/performance/optimization.d.ts +3 -3
  242. package/dist/adapters/mysql/tools/performance/optimization.d.ts.map +1 -1
  243. package/dist/adapters/mysql/tools/performance/optimization.js +229 -77
  244. package/dist/adapters/mysql/tools/performance/optimization.js.map +1 -1
  245. package/dist/adapters/mysql/tools/proxysql.d.ts +2 -2
  246. package/dist/adapters/mysql/tools/proxysql.d.ts.map +1 -1
  247. package/dist/adapters/mysql/tools/proxysql.js +213 -125
  248. package/dist/adapters/mysql/tools/proxysql.js.map +1 -1
  249. package/dist/adapters/mysql/tools/replication.d.ts +2 -2
  250. package/dist/adapters/mysql/tools/replication.d.ts.map +1 -1
  251. package/dist/adapters/mysql/tools/replication.js +117 -66
  252. package/dist/adapters/mysql/tools/replication.js.map +1 -1
  253. package/dist/adapters/mysql/tools/roles.d.ts +2 -2
  254. package/dist/adapters/mysql/tools/roles.d.ts.map +1 -1
  255. package/dist/adapters/mysql/tools/roles.js +276 -84
  256. package/dist/adapters/mysql/tools/roles.js.map +1 -1
  257. package/dist/adapters/mysql/tools/router.d.ts +2 -2
  258. package/dist/adapters/mysql/tools/router.d.ts.map +1 -1
  259. package/dist/adapters/mysql/tools/router.js +174 -109
  260. package/dist/adapters/mysql/tools/router.js.map +1 -1
  261. package/dist/adapters/mysql/tools/schema/constraints.d.ts +2 -2
  262. package/dist/adapters/mysql/tools/schema/constraints.d.ts.map +1 -1
  263. package/dist/adapters/mysql/tools/schema/constraints.js +24 -15
  264. package/dist/adapters/mysql/tools/schema/constraints.js.map +1 -1
  265. package/dist/adapters/mysql/tools/schema/index.d.ts +2 -2
  266. package/dist/adapters/mysql/tools/schema/index.d.ts.map +1 -1
  267. package/dist/adapters/mysql/tools/schema/index.js +7 -7
  268. package/dist/adapters/mysql/tools/schema/index.js.map +1 -1
  269. package/dist/adapters/mysql/tools/schema/management.d.ts +2 -2
  270. package/dist/adapters/mysql/tools/schema/management.d.ts.map +1 -1
  271. package/dist/adapters/mysql/tools/schema/management.js +99 -42
  272. package/dist/adapters/mysql/tools/schema/management.js.map +1 -1
  273. package/dist/adapters/mysql/tools/schema/routines.d.ts +2 -2
  274. package/dist/adapters/mysql/tools/schema/routines.d.ts.map +1 -1
  275. package/dist/adapters/mysql/tools/schema/routines.js +36 -19
  276. package/dist/adapters/mysql/tools/schema/routines.js.map +1 -1
  277. package/dist/adapters/mysql/tools/schema/scheduled_events.d.ts +2 -2
  278. package/dist/adapters/mysql/tools/schema/scheduled_events.d.ts.map +1 -1
  279. package/dist/adapters/mysql/tools/schema/scheduled_events.js +26 -13
  280. package/dist/adapters/mysql/tools/schema/scheduled_events.js.map +1 -1
  281. package/dist/adapters/mysql/tools/schema/triggers.d.ts +2 -2
  282. package/dist/adapters/mysql/tools/schema/triggers.d.ts.map +1 -1
  283. package/dist/adapters/mysql/tools/schema/triggers.js +24 -13
  284. package/dist/adapters/mysql/tools/schema/triggers.js.map +1 -1
  285. package/dist/adapters/mysql/tools/schema/views.d.ts +2 -2
  286. package/dist/adapters/mysql/tools/schema/views.d.ts.map +1 -1
  287. package/dist/adapters/mysql/tools/schema/views.js +59 -28
  288. package/dist/adapters/mysql/tools/schema/views.js.map +1 -1
  289. package/dist/adapters/mysql/tools/security/audit.d.ts +2 -2
  290. package/dist/adapters/mysql/tools/security/audit.d.ts.map +1 -1
  291. package/dist/adapters/mysql/tools/security/audit.js +61 -55
  292. package/dist/adapters/mysql/tools/security/audit.js.map +1 -1
  293. package/dist/adapters/mysql/tools/security/data-protection.d.ts +2 -2
  294. package/dist/adapters/mysql/tools/security/data-protection.d.ts.map +1 -1
  295. package/dist/adapters/mysql/tools/security/data-protection.js +193 -80
  296. package/dist/adapters/mysql/tools/security/data-protection.js.map +1 -1
  297. package/dist/adapters/mysql/tools/security/encryption.d.ts +2 -2
  298. package/dist/adapters/mysql/tools/security/encryption.d.ts.map +1 -1
  299. package/dist/adapters/mysql/tools/security/encryption.js +86 -67
  300. package/dist/adapters/mysql/tools/security/encryption.js.map +1 -1
  301. package/dist/adapters/mysql/tools/security/index.d.ts +2 -2
  302. package/dist/adapters/mysql/tools/security/index.js +4 -4
  303. package/dist/adapters/mysql/tools/security/index.js.map +1 -1
  304. package/dist/adapters/mysql/tools/shell/backup.d.ts +1 -1
  305. package/dist/adapters/mysql/tools/shell/backup.d.ts.map +1 -1
  306. package/dist/adapters/mysql/tools/shell/backup.js +122 -63
  307. package/dist/adapters/mysql/tools/shell/backup.js.map +1 -1
  308. package/dist/adapters/mysql/tools/shell/common.d.ts.map +1 -1
  309. package/dist/adapters/mysql/tools/shell/common.js +61 -37
  310. package/dist/adapters/mysql/tools/shell/common.js.map +1 -1
  311. package/dist/adapters/mysql/tools/shell/data-transfer.d.ts +1 -1
  312. package/dist/adapters/mysql/tools/shell/data-transfer.d.ts.map +1 -1
  313. package/dist/adapters/mysql/tools/shell/data-transfer.js +125 -69
  314. package/dist/adapters/mysql/tools/shell/data-transfer.js.map +1 -1
  315. package/dist/adapters/mysql/tools/shell/index.d.ts +2 -2
  316. package/dist/adapters/mysql/tools/shell/index.js +6 -6
  317. package/dist/adapters/mysql/tools/shell/index.js.map +1 -1
  318. package/dist/adapters/mysql/tools/shell/info.d.ts +1 -1
  319. package/dist/adapters/mysql/tools/shell/info.d.ts.map +1 -1
  320. package/dist/adapters/mysql/tools/shell/info.js +12 -12
  321. package/dist/adapters/mysql/tools/shell/info.js.map +1 -1
  322. package/dist/adapters/mysql/tools/shell/restore.d.ts +1 -1
  323. package/dist/adapters/mysql/tools/shell/restore.d.ts.map +1 -1
  324. package/dist/adapters/mysql/tools/shell/restore.js +128 -43
  325. package/dist/adapters/mysql/tools/shell/restore.js.map +1 -1
  326. package/dist/adapters/mysql/tools/shell/utilities.d.ts +1 -1
  327. package/dist/adapters/mysql/tools/shell/utilities.d.ts.map +1 -1
  328. package/dist/adapters/mysql/tools/shell/utilities.js +42 -18
  329. package/dist/adapters/mysql/tools/shell/utilities.js.map +1 -1
  330. package/dist/adapters/mysql/tools/spatial/geometry.d.ts +2 -2
  331. package/dist/adapters/mysql/tools/spatial/geometry.d.ts.map +1 -1
  332. package/dist/adapters/mysql/tools/spatial/geometry.js +85 -46
  333. package/dist/adapters/mysql/tools/spatial/geometry.js.map +1 -1
  334. package/dist/adapters/mysql/tools/spatial/index.d.ts +2 -2
  335. package/dist/adapters/mysql/tools/spatial/index.js +5 -5
  336. package/dist/adapters/mysql/tools/spatial/index.js.map +1 -1
  337. package/dist/adapters/mysql/tools/spatial/operations.d.ts +2 -2
  338. package/dist/adapters/mysql/tools/spatial/operations.d.ts.map +1 -1
  339. package/dist/adapters/mysql/tools/spatial/operations.js +175 -106
  340. package/dist/adapters/mysql/tools/spatial/operations.js.map +1 -1
  341. package/dist/adapters/mysql/tools/spatial/queries.d.ts +2 -2
  342. package/dist/adapters/mysql/tools/spatial/queries.d.ts.map +1 -1
  343. package/dist/adapters/mysql/tools/spatial/queries.js +144 -100
  344. package/dist/adapters/mysql/tools/spatial/queries.js.map +1 -1
  345. package/dist/adapters/mysql/tools/spatial/setup.d.ts +2 -2
  346. package/dist/adapters/mysql/tools/spatial/setup.d.ts.map +1 -1
  347. package/dist/adapters/mysql/tools/spatial/setup.js +122 -34
  348. package/dist/adapters/mysql/tools/spatial/setup.js.map +1 -1
  349. package/dist/adapters/mysql/tools/stats/comparative.d.ts +2 -2
  350. package/dist/adapters/mysql/tools/stats/comparative.d.ts.map +1 -1
  351. package/dist/adapters/mysql/tools/stats/comparative.js +159 -107
  352. package/dist/adapters/mysql/tools/stats/comparative.js.map +1 -1
  353. package/dist/adapters/mysql/tools/stats/descriptive.d.ts +2 -2
  354. package/dist/adapters/mysql/tools/stats/descriptive.d.ts.map +1 -1
  355. package/dist/adapters/mysql/tools/stats/descriptive.js +268 -205
  356. package/dist/adapters/mysql/tools/stats/descriptive.js.map +1 -1
  357. package/dist/adapters/mysql/tools/stats/index.d.ts +2 -2
  358. package/dist/adapters/mysql/tools/stats/index.js +3 -3
  359. package/dist/adapters/mysql/tools/stats/index.js.map +1 -1
  360. package/dist/adapters/mysql/tools/sysschema/activity.d.ts +2 -2
  361. package/dist/adapters/mysql/tools/sysschema/activity.d.ts.map +1 -1
  362. package/dist/adapters/mysql/tools/sysschema/activity.js +23 -23
  363. package/dist/adapters/mysql/tools/sysschema/activity.js.map +1 -1
  364. package/dist/adapters/mysql/tools/sysschema/index.d.ts +2 -2
  365. package/dist/adapters/mysql/tools/sysschema/index.js +4 -4
  366. package/dist/adapters/mysql/tools/sysschema/index.js.map +1 -1
  367. package/dist/adapters/mysql/tools/sysschema/performance.d.ts +2 -2
  368. package/dist/adapters/mysql/tools/sysschema/performance.d.ts.map +1 -1
  369. package/dist/adapters/mysql/tools/sysschema/performance.js +58 -43
  370. package/dist/adapters/mysql/tools/sysschema/performance.js.map +1 -1
  371. package/dist/adapters/mysql/tools/sysschema/resources.d.ts +2 -2
  372. package/dist/adapters/mysql/tools/sysschema/resources.d.ts.map +1 -1
  373. package/dist/adapters/mysql/tools/sysschema/resources.js +58 -33
  374. package/dist/adapters/mysql/tools/sysschema/resources.js.map +1 -1
  375. package/dist/adapters/mysql/tools/text/fulltext.d.ts +4 -3
  376. package/dist/adapters/mysql/tools/text/fulltext.d.ts.map +1 -1
  377. package/dist/adapters/mysql/tools/text/fulltext.js +214 -55
  378. package/dist/adapters/mysql/tools/text/fulltext.js.map +1 -1
  379. package/dist/adapters/mysql/tools/text/index.d.ts +3 -3
  380. package/dist/adapters/mysql/tools/text/index.d.ts.map +1 -1
  381. package/dist/adapters/mysql/tools/text/index.js +6 -5
  382. package/dist/adapters/mysql/tools/text/index.js.map +1 -1
  383. package/dist/adapters/mysql/tools/text/processing.d.ts +2 -2
  384. package/dist/adapters/mysql/tools/text/processing.d.ts.map +1 -1
  385. package/dist/adapters/mysql/tools/text/processing.js +175 -122
  386. package/dist/adapters/mysql/tools/text/processing.js.map +1 -1
  387. package/dist/adapters/mysql/tools/transactions.d.ts +2 -2
  388. package/dist/adapters/mysql/tools/transactions.d.ts.map +1 -1
  389. package/dist/adapters/mysql/tools/transactions.js +162 -85
  390. package/dist/adapters/mysql/tools/transactions.js.map +1 -1
  391. package/dist/adapters/mysql/types/proxysql-types.d.ts +7 -2
  392. package/dist/adapters/mysql/types/proxysql-types.d.ts.map +1 -1
  393. package/dist/adapters/mysql/types/proxysql-types.js +52 -30
  394. package/dist/adapters/mysql/types/proxysql-types.js.map +1 -1
  395. package/dist/adapters/mysql/types/router-types.d.ts +1 -1
  396. package/dist/adapters/mysql/types/router-types.js +17 -17
  397. package/dist/adapters/mysql/types/router-types.js.map +1 -1
  398. package/dist/adapters/mysql/types/shell-types.d.ts +1 -2
  399. package/dist/adapters/mysql/types/shell-types.d.ts.map +1 -1
  400. package/dist/adapters/mysql/types/shell-types.js +255 -82
  401. package/dist/adapters/mysql/types/shell-types.js.map +1 -1
  402. package/dist/adapters/mysql/types.d.ts +976 -80
  403. package/dist/adapters/mysql/types.d.ts.map +1 -1
  404. package/dist/adapters/mysql/types.js +1317 -170
  405. package/dist/adapters/mysql/types.js.map +1 -1
  406. package/dist/auth/AuthorizationServerDiscovery.d.ts +1 -1
  407. package/dist/auth/AuthorizationServerDiscovery.d.ts.map +1 -1
  408. package/dist/auth/AuthorizationServerDiscovery.js +16 -14
  409. package/dist/auth/AuthorizationServerDiscovery.js.map +1 -1
  410. package/dist/auth/OAuthResourceServer.d.ts +1 -1
  411. package/dist/auth/OAuthResourceServer.d.ts.map +1 -1
  412. package/dist/auth/OAuthResourceServer.js +4 -4
  413. package/dist/auth/OAuthResourceServer.js.map +1 -1
  414. package/dist/auth/TokenValidator.d.ts +1 -1
  415. package/dist/auth/TokenValidator.d.ts.map +1 -1
  416. package/dist/auth/TokenValidator.js +30 -20
  417. package/dist/auth/TokenValidator.js.map +1 -1
  418. package/dist/auth/errors.d.ts.map +1 -1
  419. package/dist/auth/errors.js +24 -24
  420. package/dist/auth/errors.js.map +1 -1
  421. package/dist/auth/index.d.ts +7 -7
  422. package/dist/auth/index.d.ts.map +1 -1
  423. package/dist/auth/index.js +6 -6
  424. package/dist/auth/index.js.map +1 -1
  425. package/dist/auth/middleware.d.ts +2 -2
  426. package/dist/auth/middleware.d.ts.map +1 -1
  427. package/dist/auth/middleware.js +28 -24
  428. package/dist/auth/middleware.js.map +1 -1
  429. package/dist/auth/scopes.d.ts +2 -2
  430. package/dist/auth/scopes.d.ts.map +1 -1
  431. package/dist/auth/scopes.js +23 -16
  432. package/dist/auth/scopes.js.map +1 -1
  433. package/dist/auth/types.d.ts +2 -2
  434. package/dist/auth/types.d.ts.map +1 -1
  435. package/dist/cli/args.d.ts +1 -1
  436. package/dist/cli/args.d.ts.map +1 -1
  437. package/dist/cli/args.js +82 -68
  438. package/dist/cli/args.js.map +1 -1
  439. package/dist/cli.d.ts +1 -1
  440. package/dist/cli.d.ts.map +1 -1
  441. package/dist/cli.js +44 -34
  442. package/dist/cli.js.map +1 -1
  443. package/dist/codemode/api.d.ts +69 -0
  444. package/dist/codemode/api.d.ts.map +1 -0
  445. package/dist/codemode/api.js +1035 -0
  446. package/dist/codemode/api.js.map +1 -0
  447. package/dist/codemode/index.d.ts +13 -0
  448. package/dist/codemode/index.d.ts.map +1 -0
  449. package/dist/codemode/index.js +17 -0
  450. package/dist/codemode/index.js.map +1 -0
  451. package/dist/codemode/sandbox-factory.d.ts +72 -0
  452. package/dist/codemode/sandbox-factory.d.ts.map +1 -0
  453. package/dist/codemode/sandbox-factory.js +88 -0
  454. package/dist/codemode/sandbox-factory.js.map +1 -0
  455. package/dist/codemode/sandbox.d.ts +96 -0
  456. package/dist/codemode/sandbox.d.ts.map +1 -0
  457. package/dist/codemode/sandbox.js +345 -0
  458. package/dist/codemode/sandbox.js.map +1 -0
  459. package/dist/codemode/security.d.ts +44 -0
  460. package/dist/codemode/security.d.ts.map +1 -0
  461. package/dist/codemode/security.js +149 -0
  462. package/dist/codemode/security.js.map +1 -0
  463. package/dist/codemode/types.d.ts +137 -0
  464. package/dist/codemode/types.d.ts.map +1 -0
  465. package/dist/codemode/types.js +46 -0
  466. package/dist/codemode/types.js.map +1 -0
  467. package/dist/codemode/worker-sandbox.d.ts +82 -0
  468. package/dist/codemode/worker-sandbox.d.ts.map +1 -0
  469. package/dist/codemode/worker-sandbox.js +244 -0
  470. package/dist/codemode/worker-sandbox.js.map +1 -0
  471. package/dist/codemode/worker-script.d.ts +8 -0
  472. package/dist/codemode/worker-script.d.ts.map +1 -0
  473. package/dist/codemode/worker-script.js +113 -0
  474. package/dist/codemode/worker-script.js.map +1 -0
  475. package/dist/constants/ServerInstructions.d.ts +2 -2
  476. package/dist/constants/ServerInstructions.d.ts.map +1 -1
  477. package/dist/constants/ServerInstructions.js +252 -36
  478. package/dist/constants/ServerInstructions.js.map +1 -1
  479. package/dist/filtering/ToolConstants.d.ts +12 -12
  480. package/dist/filtering/ToolConstants.d.ts.map +1 -1
  481. package/dist/filtering/ToolConstants.js +253 -214
  482. package/dist/filtering/ToolConstants.js.map +1 -1
  483. package/dist/filtering/ToolFilter.d.ts +2 -2
  484. package/dist/filtering/ToolFilter.d.ts.map +1 -1
  485. package/dist/filtering/ToolFilter.js +47 -36
  486. package/dist/filtering/ToolFilter.js.map +1 -1
  487. package/dist/index.d.ts +9 -9
  488. package/dist/index.d.ts.map +1 -1
  489. package/dist/index.js +7 -7
  490. package/dist/index.js.map +1 -1
  491. package/dist/logging/McpLogging.d.ts +2 -2
  492. package/dist/logging/McpLogging.d.ts.map +1 -1
  493. package/dist/logging/McpLogging.js +16 -13
  494. package/dist/logging/McpLogging.js.map +1 -1
  495. package/dist/logging/index.d.ts +1 -1
  496. package/dist/logging/index.js +1 -1
  497. package/dist/pool/ConnectionPool.d.ts +3 -3
  498. package/dist/pool/ConnectionPool.d.ts.map +1 -1
  499. package/dist/pool/ConnectionPool.js +30 -26
  500. package/dist/pool/ConnectionPool.js.map +1 -1
  501. package/dist/progress/ProgressReporter.d.ts +1 -1
  502. package/dist/progress/ProgressReporter.d.ts.map +1 -1
  503. package/dist/progress/ProgressReporter.js +5 -5
  504. package/dist/progress/ProgressReporter.js.map +1 -1
  505. package/dist/progress/index.d.ts +1 -1
  506. package/dist/progress/index.d.ts.map +1 -1
  507. package/dist/progress/index.js +1 -1
  508. package/dist/progress/index.js.map +1 -1
  509. package/dist/server/McpServer.d.ts +3 -3
  510. package/dist/server/McpServer.d.ts.map +1 -1
  511. package/dist/server/McpServer.js +58 -53
  512. package/dist/server/McpServer.js.map +1 -1
  513. package/dist/transports/http.d.ts +3 -3
  514. package/dist/transports/http.d.ts.map +1 -1
  515. package/dist/transports/http.js +36 -33
  516. package/dist/transports/http.js.map +1 -1
  517. package/dist/transports/index.d.ts +1 -1
  518. package/dist/transports/index.d.ts.map +1 -1
  519. package/dist/transports/index.js +1 -1
  520. package/dist/transports/index.js.map +1 -1
  521. package/dist/types/index.d.ts +6 -6
  522. package/dist/types/index.d.ts.map +1 -1
  523. package/dist/types/index.js +1 -1
  524. package/dist/types/index.js.map +1 -1
  525. package/dist/types/modules/database.d.ts +1 -1
  526. package/dist/types/modules/database.d.ts.map +1 -1
  527. package/dist/types/modules/errors.d.ts.map +1 -1
  528. package/dist/types/modules/errors.js +15 -15
  529. package/dist/types/modules/errors.js.map +1 -1
  530. package/dist/types/modules/oauth.d.ts +1 -1
  531. package/dist/types/modules/oauth.d.ts.map +1 -1
  532. package/dist/types/modules/query.d.ts +8 -8
  533. package/dist/types/modules/query.d.ts.map +1 -1
  534. package/dist/types/modules/server.d.ts +5 -3
  535. package/dist/types/modules/server.d.ts.map +1 -1
  536. package/dist/types/modules/tools.d.ts +6 -6
  537. package/dist/types/modules/tools.d.ts.map +1 -1
  538. package/dist/utils/logger.d.ts +2 -2
  539. package/dist/utils/logger.d.ts.map +1 -1
  540. package/dist/utils/logger.js +58 -55
  541. package/dist/utils/logger.js.map +1 -1
  542. package/dist/utils/promptGenerator.d.ts +1 -1
  543. package/dist/utils/promptGenerator.d.ts.map +1 -1
  544. package/dist/utils/promptGenerator.js +24 -16
  545. package/dist/utils/promptGenerator.js.map +1 -1
  546. package/dist/utils/validators.d.ts +21 -2
  547. package/dist/utils/validators.d.ts.map +1 -1
  548. package/dist/utils/validators.js +101 -13
  549. package/dist/utils/validators.js.map +1 -1
  550. package/eslint.config.js +117 -81
  551. package/package.json +66 -64
  552. package/releases/release-notes.md +32 -26
  553. package/releases/v2.0.0-release-notes.md +99 -51
  554. package/releases/v2.1.0-release-notes.md +14 -5
  555. package/releases/v2.2.0-release-notes.md +239 -0
  556. package/releases/v2.3.0-release-notes.md +191 -0
  557. package/server.json +1 -1
  558. package/src/__tests__/cli.test.ts +302 -247
  559. package/src/__tests__/index.test.ts +21 -21
  560. package/src/__tests__/mocks/adapter.ts +204 -163
  561. package/src/__tests__/mocks/index.ts +30 -23
  562. package/src/__tests__/mocks/mysql.ts +94 -84
  563. package/src/__tests__/perf.test.ts +207 -203
  564. package/src/__tests__/performance.test.ts +173 -164
  565. package/src/__tests__/setup.ts +26 -21
  566. package/src/adapters/DatabaseAdapter.ts +386 -340
  567. package/src/adapters/__tests__/DatabaseAdapter.test.ts +455 -377
  568. package/src/adapters/mysql/MySQLAdapter.ts +560 -486
  569. package/src/adapters/mysql/SchemaManager.ts +251 -208
  570. package/src/adapters/mysql/__tests__/MySQLAdapter.integration.test.ts +150 -147
  571. package/src/adapters/mysql/__tests__/MySQLAdapter.test.ts +590 -477
  572. package/src/adapters/mysql/__tests__/SchemaManager.test.ts +196 -154
  573. package/src/adapters/mysql/index.ts +2 -2
  574. package/src/adapters/mysql/prompts/__tests__/indexTuning.test.ts +33 -26
  575. package/src/adapters/mysql/prompts/__tests__/prompts.test.ts +277 -239
  576. package/src/adapters/mysql/prompts/backupStrategy.ts +29 -17
  577. package/src/adapters/mysql/prompts/clusterSetup.ts +11 -10
  578. package/src/adapters/mysql/prompts/docstoreSetup.ts +10 -10
  579. package/src/adapters/mysql/prompts/eventScheduler.ts +10 -10
  580. package/src/adapters/mysql/prompts/healthCheck.ts +20 -15
  581. package/src/adapters/mysql/prompts/index.ts +202 -145
  582. package/src/adapters/mysql/prompts/indexTuning.ts +22 -17
  583. package/src/adapters/mysql/prompts/mysqlshSetup.ts +11 -11
  584. package/src/adapters/mysql/prompts/proxysqlSetup.ts +10 -10
  585. package/src/adapters/mysql/prompts/replicationSetup.ts +24 -16
  586. package/src/adapters/mysql/prompts/routerSetup.ts +15 -10
  587. package/src/adapters/mysql/prompts/spatialSetup.ts +10 -10
  588. package/src/adapters/mysql/prompts/sysSchema.ts +11 -10
  589. package/src/adapters/mysql/resources/__tests__/capabilities.test.ts +118 -47
  590. package/src/adapters/mysql/resources/__tests__/cluster.test.ts +163 -104
  591. package/src/adapters/mysql/resources/__tests__/docstore.test.ts +88 -81
  592. package/src/adapters/mysql/resources/__tests__/events.test.ts +94 -83
  593. package/src/adapters/mysql/resources/__tests__/health.test.ts +131 -91
  594. package/src/adapters/mysql/resources/__tests__/indexes.test.ts +125 -102
  595. package/src/adapters/mysql/resources/__tests__/innodb.test.ts +86 -62
  596. package/src/adapters/mysql/resources/__tests__/locks.test.ts +142 -104
  597. package/src/adapters/mysql/resources/__tests__/performance.test.ts +81 -58
  598. package/src/adapters/mysql/resources/__tests__/pool.test.ts +45 -40
  599. package/src/adapters/mysql/resources/__tests__/processlist.test.ts +39 -23
  600. package/src/adapters/mysql/resources/__tests__/replication.test.ts +265 -211
  601. package/src/adapters/mysql/resources/__tests__/resources.test.ts +121 -109
  602. package/src/adapters/mysql/resources/__tests__/schema.test.ts +29 -23
  603. package/src/adapters/mysql/resources/__tests__/spatial.test.ts +58 -45
  604. package/src/adapters/mysql/resources/__tests__/status.test.ts +62 -45
  605. package/src/adapters/mysql/resources/__tests__/sysschema.test.ts +99 -60
  606. package/src/adapters/mysql/resources/__tests__/tables.test.ts +41 -32
  607. package/src/adapters/mysql/resources/__tests__/variables.test.ts +77 -49
  608. package/src/adapters/mysql/resources/capabilities.ts +61 -42
  609. package/src/adapters/mysql/resources/cluster.ts +58 -49
  610. package/src/adapters/mysql/resources/docstore.ts +46 -41
  611. package/src/adapters/mysql/resources/events.ts +37 -31
  612. package/src/adapters/mysql/resources/health.ts +98 -74
  613. package/src/adapters/mysql/resources/index.ts +55 -47
  614. package/src/adapters/mysql/resources/indexes.ts +66 -51
  615. package/src/adapters/mysql/resources/innodb.ts +98 -81
  616. package/src/adapters/mysql/resources/locks.ts +43 -40
  617. package/src/adapters/mysql/resources/performance.ts +80 -67
  618. package/src/adapters/mysql/resources/pool.ts +23 -20
  619. package/src/adapters/mysql/resources/processlist.ts +23 -18
  620. package/src/adapters/mysql/resources/replication.ts +124 -105
  621. package/src/adapters/mysql/resources/schema.ts +23 -18
  622. package/src/adapters/mysql/resources/spatial.ts +31 -26
  623. package/src/adapters/mysql/resources/status.ts +27 -22
  624. package/src/adapters/mysql/resources/sysschema.ts +41 -36
  625. package/src/adapters/mysql/resources/tables.ts +23 -18
  626. package/src/adapters/mysql/resources/variables.ts +27 -22
  627. package/src/adapters/mysql/tools/__tests__/cluster.test.ts +419 -311
  628. package/src/adapters/mysql/tools/__tests__/core.test.ts +701 -382
  629. package/src/adapters/mysql/tools/__tests__/docstore.test.ts +782 -413
  630. package/src/adapters/mysql/tools/__tests__/events.test.ts +806 -486
  631. package/src/adapters/mysql/tools/__tests__/json_core.test.ts +326 -259
  632. package/src/adapters/mysql/tools/__tests__/json_enhanced.test.ts +452 -352
  633. package/src/adapters/mysql/tools/__tests__/json_helpers.test.ts +203 -128
  634. package/src/adapters/mysql/tools/__tests__/proxysql.test.ts +576 -340
  635. package/src/adapters/mysql/tools/__tests__/replication.test.ts +796 -390
  636. package/src/adapters/mysql/tools/__tests__/roles.test.ts +423 -166
  637. package/src/adapters/mysql/tools/__tests__/router.test.ts +644 -540
  638. package/src/adapters/mysql/tools/__tests__/security.test.ts +746 -421
  639. package/src/adapters/mysql/tools/__tests__/security_injection.test.ts +246 -173
  640. package/src/adapters/mysql/tools/__tests__/security_integration.test.ts +244 -205
  641. package/src/adapters/mysql/tools/__tests__/spatial.test.ts +443 -298
  642. package/src/adapters/mysql/tools/__tests__/spatial_handler.test.ts +535 -150
  643. package/src/adapters/mysql/tools/__tests__/stats.test.ts +861 -553
  644. package/src/adapters/mysql/tools/__tests__/transactions.test.ts +452 -263
  645. package/src/adapters/mysql/tools/admin/__tests__/backup.test.ts +612 -372
  646. package/src/adapters/mysql/tools/admin/__tests__/maintenance.test.ts +550 -257
  647. package/src/adapters/mysql/tools/admin/__tests__/monitoring.test.ts +549 -352
  648. package/src/adapters/mysql/tools/admin/backup.ts +339 -215
  649. package/src/adapters/mysql/tools/admin/index.ts +46 -46
  650. package/src/adapters/mysql/tools/admin/maintenance.ts +180 -130
  651. package/src/adapters/mysql/tools/admin/monitoring.ts +373 -199
  652. package/src/adapters/mysql/tools/cluster/__tests__/group-replication.test.ts +200 -186
  653. package/src/adapters/mysql/tools/cluster/__tests__/innodb-cluster.test.ts +399 -95
  654. package/src/adapters/mysql/tools/cluster/group-replication.ts +218 -183
  655. package/src/adapters/mysql/tools/cluster/index.ts +27 -27
  656. package/src/adapters/mysql/tools/cluster/innodb-cluster.ts +413 -251
  657. package/src/adapters/mysql/tools/codemode/index.ts +249 -0
  658. package/src/adapters/mysql/tools/core.ts +425 -285
  659. package/src/adapters/mysql/tools/docstore.ts +478 -276
  660. package/src/adapters/mysql/tools/events.ts +441 -285
  661. package/src/adapters/mysql/tools/index.ts +31 -20
  662. package/src/adapters/mysql/tools/json/__tests__/core.test.ts +456 -199
  663. package/src/adapters/mysql/tools/json/__tests__/enhanced.test.ts +554 -298
  664. package/src/adapters/mysql/tools/json/__tests__/helpers.test.ts +195 -74
  665. package/src/adapters/mysql/tools/json/__tests__/validation.test.ts +106 -72
  666. package/src/adapters/mysql/tools/json/core.ts +368 -263
  667. package/src/adapters/mysql/tools/json/enhanced.ts +368 -229
  668. package/src/adapters/mysql/tools/json/helpers.ts +205 -113
  669. package/src/adapters/mysql/tools/json/index.ts +46 -46
  670. package/src/adapters/mysql/tools/partitioning.ts +289 -140
  671. package/src/adapters/mysql/tools/performance/__tests__/analysis.test.ts +664 -249
  672. package/src/adapters/mysql/tools/performance/__tests__/optimization.test.ts +436 -179
  673. package/src/adapters/mysql/tools/performance/analysis.ts +319 -215
  674. package/src/adapters/mysql/tools/performance/index.ts +33 -33
  675. package/src/adapters/mysql/tools/performance/optimization.ts +438 -183
  676. package/src/adapters/mysql/tools/proxysql.ts +462 -320
  677. package/src/adapters/mysql/tools/replication.ts +233 -180
  678. package/src/adapters/mysql/tools/roles.ts +429 -171
  679. package/src/adapters/mysql/tools/router.ts +410 -292
  680. package/src/adapters/mysql/tools/schema/__tests__/constraints.test.ts +157 -82
  681. package/src/adapters/mysql/tools/schema/__tests__/management.test.ts +226 -101
  682. package/src/adapters/mysql/tools/schema/__tests__/routines.test.ts +80 -35
  683. package/src/adapters/mysql/tools/schema/__tests__/scheduled_events.test.ts +59 -40
  684. package/src/adapters/mysql/tools/schema/__tests__/triggers.test.ts +65 -40
  685. package/src/adapters/mysql/tools/schema/__tests__/views.test.ts +146 -77
  686. package/src/adapters/mysql/tools/schema/constraints.ts +61 -42
  687. package/src/adapters/mysql/tools/schema/index.ts +26 -35
  688. package/src/adapters/mysql/tools/schema/management.ts +167 -94
  689. package/src/adapters/mysql/tools/schema/routines.ts +79 -48
  690. package/src/adapters/mysql/tools/schema/scheduled_events.ts +53 -32
  691. package/src/adapters/mysql/tools/schema/triggers.ts +51 -33
  692. package/src/adapters/mysql/tools/schema/views.ts +96 -53
  693. package/src/adapters/mysql/tools/security/__tests__/audit.test.ts +216 -158
  694. package/src/adapters/mysql/tools/security/__tests__/data-protection.test.ts +154 -98
  695. package/src/adapters/mysql/tools/security/__tests__/encryption.test.ts +174 -138
  696. package/src/adapters/mysql/tools/security/audit.ts +213 -193
  697. package/src/adapters/mysql/tools/security/data-protection.ts +342 -198
  698. package/src/adapters/mysql/tools/security/encryption.ts +233 -193
  699. package/src/adapters/mysql/tools/security/index.ts +26 -26
  700. package/src/adapters/mysql/tools/shell/__tests__/backup.test.ts +443 -283
  701. package/src/adapters/mysql/tools/shell/__tests__/common.test.ts +183 -130
  702. package/src/adapters/mysql/tools/shell/__tests__/data-transfer.test.ts +516 -353
  703. package/src/adapters/mysql/tools/shell/__tests__/info.test.ts +65 -63
  704. package/src/adapters/mysql/tools/shell/__tests__/restore.test.ts +260 -174
  705. package/src/adapters/mysql/tools/shell/__tests__/utilities.test.ts +161 -143
  706. package/src/adapters/mysql/tools/shell/backup.ts +280 -188
  707. package/src/adapters/mysql/tools/shell/common.ts +203 -153
  708. package/src/adapters/mysql/tools/shell/data-transfer.ts +286 -200
  709. package/src/adapters/mysql/tools/shell/index.ts +29 -29
  710. package/src/adapters/mysql/tools/shell/info.ts +35 -31
  711. package/src/adapters/mysql/tools/shell/restore.ts +236 -121
  712. package/src/adapters/mysql/tools/shell/utilities.ts +86 -45
  713. package/src/adapters/mysql/tools/spatial/__tests__/geometry.test.ts +129 -89
  714. package/src/adapters/mysql/tools/spatial/__tests__/operations.test.ts +284 -148
  715. package/src/adapters/mysql/tools/spatial/__tests__/queries.test.ts +340 -245
  716. package/src/adapters/mysql/tools/spatial/geometry.ts +120 -74
  717. package/src/adapters/mysql/tools/spatial/index.ts +33 -33
  718. package/src/adapters/mysql/tools/spatial/operations.ts +254 -171
  719. package/src/adapters/mysql/tools/spatial/queries.ts +221 -165
  720. package/src/adapters/mysql/tools/spatial/setup.ts +180 -73
  721. package/src/adapters/mysql/tools/stats/__tests__/comparative.test.ts +188 -130
  722. package/src/adapters/mysql/tools/stats/comparative.ts +261 -187
  723. package/src/adapters/mysql/tools/stats/descriptive.ts +414 -322
  724. package/src/adapters/mysql/tools/stats/index.ts +23 -23
  725. package/src/adapters/mysql/tools/sysschema/__tests__/activity.test.ts +99 -71
  726. package/src/adapters/mysql/tools/sysschema/__tests__/io_summary_fix.test.ts +21 -18
  727. package/src/adapters/mysql/tools/sysschema/__tests__/performance.test.ts +149 -108
  728. package/src/adapters/mysql/tools/sysschema/__tests__/resources.test.ts +243 -104
  729. package/src/adapters/mysql/tools/sysschema/activity.ts +72 -64
  730. package/src/adapters/mysql/tools/sysschema/index.ts +24 -24
  731. package/src/adapters/mysql/tools/sysschema/performance.ts +140 -115
  732. package/src/adapters/mysql/tools/sysschema/resources.ts +140 -99
  733. package/src/adapters/mysql/tools/text/__tests__/fulltext.test.ts +526 -145
  734. package/src/adapters/mysql/tools/text/__tests__/processing.test.ts +452 -193
  735. package/src/adapters/mysql/tools/text/fulltext.ts +327 -123
  736. package/src/adapters/mysql/tools/text/index.ts +32 -30
  737. package/src/adapters/mysql/tools/text/processing.ts +281 -212
  738. package/src/adapters/mysql/tools/transactions.ts +288 -197
  739. package/src/adapters/mysql/types/__tests__/shell-types.test.ts +204 -202
  740. package/src/adapters/mysql/types/proxysql-types.ts +142 -109
  741. package/src/adapters/mysql/types/router-types.ts +36 -36
  742. package/src/adapters/mysql/types/shell-types.ts +280 -94
  743. package/src/adapters/mysql/types.ts +1475 -164
  744. package/src/auth/AuthorizationServerDiscovery.ts +127 -113
  745. package/src/auth/OAuthResourceServer.ts +67 -62
  746. package/src/auth/TokenValidator.ts +136 -119
  747. package/src/auth/__tests__/AuthorizationServerDiscovery.test.ts +295 -274
  748. package/src/auth/__tests__/OAuthResourceServer.test.ts +180 -169
  749. package/src/auth/__tests__/TokenValidator.test.ts +297 -285
  750. package/src/auth/__tests__/errors.test.ts +180 -175
  751. package/src/auth/__tests__/middleware.test.ts +281 -247
  752. package/src/auth/__tests__/scopes.test.ts +136 -134
  753. package/src/auth/errors.ts +56 -56
  754. package/src/auth/index.ts +23 -17
  755. package/src/auth/middleware.ts +161 -139
  756. package/src/auth/scopes.ts +134 -107
  757. package/src/auth/types.ts +155 -155
  758. package/src/cli/__tests__/args.test.ts +241 -216
  759. package/src/cli/__tests__/main.test.ts +191 -158
  760. package/src/cli/args.ts +285 -258
  761. package/src/cli.ts +150 -127
  762. package/src/codemode/api.ts +1224 -0
  763. package/src/codemode/index.ts +51 -0
  764. package/src/codemode/sandbox-factory.ts +146 -0
  765. package/src/codemode/sandbox.ts +450 -0
  766. package/src/codemode/security.ts +188 -0
  767. package/src/codemode/types.ts +194 -0
  768. package/src/codemode/worker-sandbox.ts +326 -0
  769. package/src/codemode/worker-script.ts +144 -0
  770. package/src/constants/ServerInstructions.ts +295 -70
  771. package/src/filtering/ToolConstants.ts +311 -272
  772. package/src/filtering/ToolFilter.ts +254 -220
  773. package/src/filtering/__tests__/ToolFilter.test.ts +469 -396
  774. package/src/index.ts +62 -57
  775. package/src/logging/McpLogging.ts +128 -119
  776. package/src/logging/__tests__/McpLogging.test.ts +223 -223
  777. package/src/logging/index.ts +2 -2
  778. package/src/pool/ConnectionPool.ts +260 -246
  779. package/src/pool/__tests__/ConnectionPool.test.ts +452 -418
  780. package/src/progress/ProgressReporter.ts +123 -123
  781. package/src/progress/__tests__/ProgressReporter.test.ts +235 -229
  782. package/src/progress/index.ts +6 -2
  783. package/src/server/McpServer.ts +305 -285
  784. package/src/server/__tests__/McpServer.test.ts +333 -291
  785. package/src/transports/__tests__/http.test.ts +658 -527
  786. package/src/transports/http.ts +237 -203
  787. package/src/transports/index.ts +6 -2
  788. package/src/types/__tests__/types.test.ts +197 -193
  789. package/src/types/index.ts +49 -37
  790. package/src/types/modules/database.ts +65 -63
  791. package/src/types/modules/errors.ts +41 -37
  792. package/src/types/modules/oauth.ts +46 -46
  793. package/src/types/modules/query.ts +75 -75
  794. package/src/types/modules/server.ts +21 -18
  795. package/src/types/modules/tools.ts +182 -178
  796. package/src/utils/__tests__/logger.test.ts +424 -414
  797. package/src/utils/__tests__/validators.test.ts +250 -165
  798. package/src/utils/logger.ts +344 -330
  799. package/src/utils/promptGenerator.ts +58 -47
  800. package/src/utils/validators.ts +217 -91
  801. package/tsconfig.json +41 -50
  802. package/vitest.config.ts +23 -23
@@ -1,515 +1,835 @@
1
1
  /**
2
2
  * mysql-mcp - Events Tools Unit Tests
3
- *
3
+ *
4
4
  * Tests for events tool definitions, annotations, and handler execution.
5
5
  */
6
6
 
7
- import { describe, it, expect, vi, beforeEach } from 'vitest';
8
- import { getEventTools } from '../events.js';
9
- import type { MySQLAdapter } from '../../MySQLAdapter.js';
10
- import { createMockMySQLAdapter, createMockRequestContext, createMockQueryResult } from '../../../../__tests__/mocks/index.js';
11
-
12
- describe('getEventTools', () => {
13
- let tools: ReturnType<typeof getEventTools>;
14
-
15
- beforeEach(() => {
16
- vi.clearAllMocks();
17
- tools = getEventTools(createMockMySQLAdapter() as unknown as MySQLAdapter);
18
- });
19
-
20
- it('should return 6 event tools', () => {
21
- expect(tools).toHaveLength(6);
22
- });
23
-
24
- it('should have events group for all tools', () => {
25
- for (const tool of tools) {
26
- expect(tool.group).toBe('events');
27
- }
28
- });
29
-
30
- it('should have handler functions for all tools', () => {
31
- for (const tool of tools) {
32
- expect(typeof tool.handler).toBe('function');
33
- }
34
- });
35
-
36
- it('should have inputSchema for all tools', () => {
37
- for (const tool of tools) {
38
- expect(tool.inputSchema).toBeDefined();
39
- }
40
- });
41
-
42
- it('should include expected tool names', () => {
43
- const names = tools.map(t => t.name);
44
- expect(names).toContain('mysql_event_create');
45
- expect(names).toContain('mysql_event_alter');
46
- expect(names).toContain('mysql_event_drop');
47
- expect(names).toContain('mysql_event_list');
48
- expect(names).toContain('mysql_event_status');
49
- expect(names).toContain('mysql_scheduler_status');
50
- });
7
+ import { describe, it, expect, vi, beforeEach } from "vitest";
8
+ import { getEventTools } from "../events.js";
9
+ import type { MySQLAdapter } from "../../MySQLAdapter.js";
10
+ import {
11
+ createMockMySQLAdapter,
12
+ createMockRequestContext,
13
+ createMockQueryResult,
14
+ } from "../../../../__tests__/mocks/index.js";
15
+
16
+ describe("getEventTools", () => {
17
+ let tools: ReturnType<typeof getEventTools>;
18
+
19
+ beforeEach(() => {
20
+ vi.clearAllMocks();
21
+ tools = getEventTools(createMockMySQLAdapter() as unknown as MySQLAdapter);
22
+ });
23
+
24
+ it("should return 6 event tools", () => {
25
+ expect(tools).toHaveLength(6);
26
+ });
27
+
28
+ it("should have events group for all tools", () => {
29
+ for (const tool of tools) {
30
+ expect(tool.group).toBe("events");
31
+ }
32
+ });
33
+
34
+ it("should have handler functions for all tools", () => {
35
+ for (const tool of tools) {
36
+ expect(typeof tool.handler).toBe("function");
37
+ }
38
+ });
39
+
40
+ it("should have inputSchema for all tools", () => {
41
+ for (const tool of tools) {
42
+ expect(tool.inputSchema).toBeDefined();
43
+ }
44
+ });
45
+
46
+ it("should include expected tool names", () => {
47
+ const names = tools.map((t) => t.name);
48
+ expect(names).toContain("mysql_event_create");
49
+ expect(names).toContain("mysql_event_alter");
50
+ expect(names).toContain("mysql_event_drop");
51
+ expect(names).toContain("mysql_event_list");
52
+ expect(names).toContain("mysql_event_status");
53
+ expect(names).toContain("mysql_scheduler_status");
54
+ });
51
55
  });
52
56
 
53
- describe('Handler Execution', () => {
54
- let mockAdapter: ReturnType<typeof createMockMySQLAdapter>;
55
- let tools: ReturnType<typeof getEventTools>;
56
- let mockContext: ReturnType<typeof createMockRequestContext>;
57
+ describe("Handler Execution", () => {
58
+ let mockAdapter: ReturnType<typeof createMockMySQLAdapter>;
59
+ let tools: ReturnType<typeof getEventTools>;
60
+ let mockContext: ReturnType<typeof createMockRequestContext>;
61
+
62
+ beforeEach(() => {
63
+ vi.clearAllMocks();
64
+ mockAdapter = createMockMySQLAdapter();
65
+ tools = getEventTools(mockAdapter as unknown as MySQLAdapter);
66
+ mockContext = createMockRequestContext();
67
+ });
68
+
69
+ describe("mysql_event_create", () => {
70
+ it("should create a one-time event", async () => {
71
+ mockAdapter.executeQuery.mockResolvedValue(createMockQueryResult([]));
72
+
73
+ const tool = tools.find((t) => t.name === "mysql_event_create")!;
74
+ const result = await tool.handler(
75
+ {
76
+ name: "cleanup_once",
77
+ schedule: {
78
+ type: "ONE TIME",
79
+ executeAt: "2024-12-31 23:59:59",
80
+ },
81
+ body: "DELETE FROM temp_data",
82
+ },
83
+ mockContext,
84
+ );
85
+
86
+ expect(mockAdapter.executeQuery).toHaveBeenCalled();
87
+ const call = mockAdapter.executeQuery.mock.calls[0][0] as string;
88
+ expect(call).toContain("CREATE EVENT");
89
+ expect(call).toContain("ON SCHEDULE AT");
90
+ expect(result).toHaveProperty("success", true);
91
+ });
92
+
93
+ it("should create a recurring event", async () => {
94
+ mockAdapter.executeQuery.mockResolvedValue(createMockQueryResult([]));
95
+
96
+ const tool = tools.find((t) => t.name === "mysql_event_create")!;
97
+ await tool.handler(
98
+ {
99
+ name: "daily_cleanup",
100
+ schedule: {
101
+ type: "RECURRING",
102
+ interval: 1,
103
+ intervalUnit: "DAY",
104
+ },
105
+ body: "DELETE FROM logs WHERE created_at < DATE_SUB(NOW(), INTERVAL 30 DAY)",
106
+ },
107
+ mockContext,
108
+ );
109
+
110
+ const call = mockAdapter.executeQuery.mock.calls[0][0] as string;
111
+ expect(call).toContain("EVERY 1 DAY");
112
+ });
113
+ });
114
+
115
+ describe("mysql_event_alter", () => {
116
+ it("should alter an existing event", async () => {
117
+ mockAdapter.executeQuery.mockResolvedValue(createMockQueryResult([]));
118
+
119
+ const tool = tools.find((t) => t.name === "mysql_event_alter")!;
120
+ const result = await tool.handler(
121
+ {
122
+ name: "cleanup_job",
123
+ enabled: false,
124
+ },
125
+ mockContext,
126
+ );
127
+
128
+ expect(mockAdapter.executeQuery).toHaveBeenCalled();
129
+ const call = mockAdapter.executeQuery.mock.calls[0][0] as string;
130
+ expect(call).toContain("ALTER EVENT");
131
+ expect(result).toHaveProperty("success", true);
132
+ });
133
+
134
+ it("should rename an event", async () => {
135
+ mockAdapter.executeQuery.mockResolvedValue(createMockQueryResult([]));
136
+
137
+ const tool = tools.find((t) => t.name === "mysql_event_alter")!;
138
+ await tool.handler(
139
+ {
140
+ name: "old_event",
141
+ newName: "new_event",
142
+ },
143
+ mockContext,
144
+ );
145
+
146
+ const call = mockAdapter.executeQuery.mock.calls[0][0] as string;
147
+ expect(call).toContain("RENAME TO");
148
+ });
149
+
150
+ it("should place RENAME TO before COMMENT and DO body in combined alter", async () => {
151
+ mockAdapter.executeQuery.mockResolvedValue(createMockQueryResult([]));
152
+
153
+ const tool = tools.find((t) => t.name === "mysql_event_alter")!;
154
+ await tool.handler(
155
+ {
156
+ name: "old_event",
157
+ newName: "new_event",
158
+ body: "SELECT 1",
159
+ comment: "updated",
160
+ },
161
+ mockContext,
162
+ );
163
+
164
+ const call = mockAdapter.executeQuery.mock.calls[0][0] as string;
165
+ const renameIndex = call.indexOf("RENAME TO");
166
+ const commentIndex = call.indexOf("COMMENT");
167
+ const doIndex = call.indexOf("DO ");
168
+ expect(renameIndex).toBeGreaterThan(-1);
169
+ expect(commentIndex).toBeGreaterThan(-1);
170
+ expect(doIndex).toBeGreaterThan(-1);
171
+ expect(renameIndex).toBeLessThan(commentIndex);
172
+ expect(commentIndex).toBeLessThan(doIndex);
173
+ });
174
+ });
175
+
176
+ describe("mysql_event_drop", () => {
177
+ it("should drop an event", async () => {
178
+ // First call: pre-check returns event exists (ifExists defaults to true)
179
+ mockAdapter.executeQuery.mockResolvedValueOnce(
180
+ createMockQueryResult([{ EVENT_NAME: "old_event" }]),
181
+ );
182
+ // Second call: actual DROP
183
+ mockAdapter.executeQuery.mockResolvedValueOnce(createMockQueryResult([]));
184
+
185
+ const tool = tools.find((t) => t.name === "mysql_event_drop")!;
186
+ const result = await tool.handler(
187
+ {
188
+ name: "old_event",
189
+ },
190
+ mockContext,
191
+ );
192
+
193
+ expect(mockAdapter.executeQuery).toHaveBeenCalledTimes(2);
194
+ const dropCall = mockAdapter.executeQuery.mock.calls[1][0] as string;
195
+ expect(dropCall).toContain("DROP EVENT");
196
+ expect(result).toHaveProperty("success", true);
197
+ });
198
+
199
+ it("should use IF EXISTS clause", async () => {
200
+ // First call: pre-check returns event exists
201
+ mockAdapter.executeQuery.mockResolvedValueOnce(
202
+ createMockQueryResult([{ EVENT_NAME: "maybe_exists" }]),
203
+ );
204
+ // Second call: actual DROP
205
+ mockAdapter.executeQuery.mockResolvedValueOnce(createMockQueryResult([]));
206
+
207
+ const tool = tools.find((t) => t.name === "mysql_event_drop")!;
208
+ await tool.handler(
209
+ {
210
+ name: "maybe_exists",
211
+ ifExists: true,
212
+ },
213
+ mockContext,
214
+ );
215
+
216
+ const dropCall = mockAdapter.executeQuery.mock.calls[1][0] as string;
217
+ expect(dropCall).toContain("IF EXISTS");
218
+ });
219
+
220
+ it("should return skipped when ifExists is true and event does not exist", async () => {
221
+ // Pre-check returns empty (event doesn't exist)
222
+ mockAdapter.executeQuery.mockResolvedValueOnce(createMockQueryResult([]));
223
+
224
+ const tool = tools.find((t) => t.name === "mysql_event_drop")!;
225
+ const result = await tool.handler(
226
+ {
227
+ name: "ghost_event",
228
+ ifExists: true,
229
+ },
230
+ mockContext,
231
+ );
232
+
233
+ expect(result).toEqual({
234
+ success: true,
235
+ skipped: true,
236
+ reason: "Event did not exist",
237
+ eventName: "ghost_event",
238
+ });
239
+ // Should only have the pre-check query, no DROP
240
+ expect(mockAdapter.executeQuery).toHaveBeenCalledTimes(1);
241
+ });
242
+ });
243
+
244
+ describe("mysql_event_list", () => {
245
+ it("should list scheduled events", async () => {
246
+ mockAdapter.executeQuery.mockResolvedValue(
247
+ createMockQueryResult([
248
+ { name: "cleanup_job", eventType: "RECURRING", status: "ENABLED" },
249
+ ]),
250
+ );
251
+
252
+ const tool = tools.find((t) => t.name === "mysql_event_list")!;
253
+ const result = await tool.handler({}, mockContext);
254
+
255
+ expect(mockAdapter.executeQuery).toHaveBeenCalled();
256
+ expect(result).toHaveProperty("events");
257
+ });
258
+
259
+ it("should accept schema filter via params", async () => {
260
+ // First call: schema existence check
261
+ mockAdapter.executeQuery.mockResolvedValueOnce(
262
+ createMockQueryResult([{ SCHEMA_NAME: "mydb" }]),
263
+ );
264
+ // Second call: actual event list query
265
+ mockAdapter.executeQuery.mockResolvedValueOnce(createMockQueryResult([]));
266
+
267
+ const tool = tools.find((t) => t.name === "mysql_event_list")!;
268
+ // Uses parameterized query
269
+ await tool.handler({ schema: "mydb" }, mockContext);
270
+
271
+ expect(mockAdapter.executeQuery).toHaveBeenCalledTimes(2);
272
+ // Second call should contain the schema param
273
+ expect(mockAdapter.executeQuery).toHaveBeenNthCalledWith(
274
+ 2,
275
+ expect.any(String),
276
+ expect.arrayContaining(["mydb"]),
277
+ );
278
+ });
279
+
280
+ it("should return exists false for nonexistent schema", async () => {
281
+ mockAdapter.executeQuery.mockResolvedValueOnce(createMockQueryResult([]));
282
+
283
+ const tool = tools.find((t) => t.name === "mysql_event_list")!;
284
+ const result = await tool.handler(
285
+ { schema: "nonexistent_db" },
286
+ mockContext,
287
+ );
288
+
289
+ expect(result).toEqual({ exists: false, schema: "nonexistent_db" });
290
+ // Should only have the schema check query, no event list query
291
+ expect(mockAdapter.executeQuery).toHaveBeenCalledTimes(1);
292
+ });
293
+
294
+ it("should exclude disabled events when includeDisabled is false", async () => {
295
+ mockAdapter.executeQuery.mockResolvedValue(createMockQueryResult([]));
296
+
297
+ const tool = tools.find((t) => t.name === "mysql_event_list")!;
298
+ await tool.handler({ includeDisabled: false }, mockContext);
299
+
300
+ const call = mockAdapter.executeQuery.mock.calls[0][0] as string;
301
+ expect(call).toContain("ENABLED");
302
+ });
303
+ });
304
+
305
+ describe("mysql_event_status", () => {
306
+ it("should get detailed event status", async () => {
307
+ mockAdapter.executeQuery.mockResolvedValue(
308
+ createMockQueryResult([
309
+ { name: "test_event", lastExecuted: "2024-01-01" },
310
+ ]),
311
+ );
57
312
 
58
- beforeEach(() => {
59
- vi.clearAllMocks();
60
- mockAdapter = createMockMySQLAdapter();
61
- tools = getEventTools(mockAdapter as unknown as MySQLAdapter);
62
- mockContext = createMockRequestContext();
63
- });
313
+ const tool = tools.find((t) => t.name === "mysql_event_status")!;
314
+ const result = await tool.handler({ name: "test_event" }, mockContext);
64
315
 
65
- describe('mysql_event_create', () => {
66
- it('should create a one-time event', async () => {
67
- mockAdapter.executeQuery.mockResolvedValue(createMockQueryResult([]));
68
-
69
- const tool = tools.find(t => t.name === 'mysql_event_create')!;
70
- const result = await tool.handler({
71
- name: 'cleanup_once',
72
- schedule: {
73
- type: 'ONE TIME',
74
- executeAt: '2024-12-31 23:59:59'
75
- },
76
- body: 'DELETE FROM temp_data'
77
- }, mockContext);
78
-
79
- expect(mockAdapter.executeQuery).toHaveBeenCalled();
80
- const call = mockAdapter.executeQuery.mock.calls[0][0] as string;
81
- expect(call).toContain('CREATE EVENT');
82
- expect(call).toContain('ON SCHEDULE AT');
83
- expect(result).toHaveProperty('success', true);
84
- });
85
-
86
- it('should create a recurring event', async () => {
87
- mockAdapter.executeQuery.mockResolvedValue(createMockQueryResult([]));
88
-
89
- const tool = tools.find(t => t.name === 'mysql_event_create')!;
90
- await tool.handler({
91
- name: 'daily_cleanup',
92
- schedule: {
93
- type: 'RECURRING',
94
- interval: 1,
95
- intervalUnit: 'DAY'
96
- },
97
- body: 'DELETE FROM logs WHERE created_at < DATE_SUB(NOW(), INTERVAL 30 DAY)'
98
- }, mockContext);
99
-
100
- const call = mockAdapter.executeQuery.mock.calls[0][0] as string;
101
- expect(call).toContain('EVERY 1 DAY');
102
- });
316
+ expect(mockAdapter.executeQuery).toHaveBeenCalled();
317
+ // Returns the query result row directly
318
+ expect(result).toBeDefined();
103
319
  });
104
320
 
105
- describe('mysql_event_alter', () => {
106
- it('should alter an existing event', async () => {
107
- mockAdapter.executeQuery.mockResolvedValue(createMockQueryResult([]));
108
-
109
- const tool = tools.find(t => t.name === 'mysql_event_alter')!;
110
- const result = await tool.handler({
111
- name: 'cleanup_job',
112
- enabled: false
113
- }, mockContext);
114
-
115
- expect(mockAdapter.executeQuery).toHaveBeenCalled();
116
- const call = mockAdapter.executeQuery.mock.calls[0][0] as string;
117
- expect(call).toContain('ALTER EVENT');
118
- expect(result).toHaveProperty('success', true);
119
- });
120
-
121
- it('should rename an event', async () => {
122
- mockAdapter.executeQuery.mockResolvedValue(createMockQueryResult([]));
123
-
124
- const tool = tools.find(t => t.name === 'mysql_event_alter')!;
125
- await tool.handler({
126
- name: 'old_event',
127
- newName: 'new_event'
128
- }, mockContext);
129
-
130
- const call = mockAdapter.executeQuery.mock.calls[0][0] as string;
131
- expect(call).toContain('RENAME TO');
132
- });
133
- });
321
+ it("should return exists false when event is not found", async () => {
322
+ mockAdapter.executeQuery.mockResolvedValue(createMockQueryResult([]));
323
+
324
+ const tool = tools.find((t) => t.name === "mysql_event_status")!;
325
+ const result = await tool.handler(
326
+ { name: "nonexistent_event" },
327
+ mockContext,
328
+ );
134
329
 
135
- describe('mysql_event_drop', () => {
136
- it('should drop an event', async () => {
137
- mockAdapter.executeQuery.mockResolvedValue(createMockQueryResult([]));
138
-
139
- const tool = tools.find(t => t.name === 'mysql_event_drop')!;
140
- const result = await tool.handler({
141
- name: 'old_event'
142
- }, mockContext);
143
-
144
- expect(mockAdapter.executeQuery).toHaveBeenCalled();
145
- const call = mockAdapter.executeQuery.mock.calls[0][0] as string;
146
- expect(call).toContain('DROP EVENT');
147
- expect(result).toHaveProperty('success', true);
148
- });
149
-
150
- it('should use IF EXISTS clause', async () => {
151
- mockAdapter.executeQuery.mockResolvedValue(createMockQueryResult([]));
152
-
153
- const tool = tools.find(t => t.name === 'mysql_event_drop')!;
154
- await tool.handler({
155
- name: 'maybe_exists',
156
- ifExists: true
157
- }, mockContext);
158
-
159
- const call = mockAdapter.executeQuery.mock.calls[0][0] as string;
160
- expect(call).toContain('IF EXISTS');
161
- });
330
+ expect(result).toEqual({ exists: false, name: "nonexistent_event" });
162
331
  });
163
332
 
164
- describe('mysql_event_list', () => {
165
- it('should list scheduled events', async () => {
166
- mockAdapter.executeQuery.mockResolvedValue(
167
- createMockQueryResult([
168
- { name: 'cleanup_job', eventType: 'RECURRING', status: 'ENABLED' }
169
- ])
170
- );
171
-
172
- const tool = tools.find(t => t.name === 'mysql_event_list')!;
173
- const result = await tool.handler({}, mockContext);
174
-
175
- expect(mockAdapter.executeQuery).toHaveBeenCalled();
176
- expect(result).toHaveProperty('events');
177
- });
178
-
179
- it('should accept schema filter via params', async () => {
180
- mockAdapter.executeQuery.mockResolvedValue(createMockQueryResult([]));
181
-
182
- const tool = tools.find(t => t.name === 'mysql_event_list')!;
183
- // Uses parameterized query
184
- await tool.handler({ schema: 'mydb' }, mockContext);
333
+ it("should return exists false for nonexistent schema", async () => {
334
+ mockAdapter.executeQuery.mockResolvedValueOnce(createMockQueryResult([]));
185
335
 
186
- expect(mockAdapter.executeQuery).toHaveBeenCalledWith(
187
- expect.any(String),
188
- expect.arrayContaining(['mydb'])
189
- );
190
- });
336
+ const tool = tools.find((t) => t.name === "mysql_event_status")!;
337
+ const result = await tool.handler(
338
+ { name: "any_event", schema: "nonexistent_db" },
339
+ mockContext,
340
+ );
191
341
 
192
- it('should exclude disabled events when includeDisabled is false', async () => {
193
- mockAdapter.executeQuery.mockResolvedValue(createMockQueryResult([]));
194
-
195
- const tool = tools.find(t => t.name === 'mysql_event_list')!;
196
- await tool.handler({ includeDisabled: false }, mockContext);
197
-
198
- const call = mockAdapter.executeQuery.mock.calls[0][0] as string;
199
- expect(call).toContain("ENABLED");
200
- });
342
+ expect(result).toEqual({ exists: false, schema: "nonexistent_db" });
343
+ // Should only have the schema check query, no event status query
344
+ expect(mockAdapter.executeQuery).toHaveBeenCalledTimes(1);
201
345
  });
346
+ });
202
347
 
203
- describe('mysql_event_status', () => {
204
- it('should get detailed event status', async () => {
205
- mockAdapter.executeQuery.mockResolvedValue(createMockQueryResult([
206
- { name: 'test_event', lastExecuted: '2024-01-01' }
207
- ]));
208
-
209
- const tool = tools.find(t => t.name === 'mysql_event_status')!;
210
- const result = await tool.handler({ name: 'test_event' }, mockContext);
348
+ describe("mysql_scheduler_status", () => {
349
+ it("should get scheduler status", async () => {
350
+ mockAdapter.executeQuery.mockResolvedValue(
351
+ createMockQueryResult([
352
+ { Variable_name: "event_scheduler", Value: "ON" },
353
+ ]),
354
+ );
211
355
 
212
- expect(mockAdapter.executeQuery).toHaveBeenCalled();
213
- // Returns the query result row directly
214
- expect(result).toBeDefined();
215
- });
356
+ const tool = tools.find((t) => t.name === "mysql_scheduler_status")!;
357
+ const result = await tool.handler({}, mockContext);
216
358
 
217
- it('should throw error when event is not found', async () => {
218
- mockAdapter.executeQuery.mockResolvedValue(createMockQueryResult([]));
219
-
220
- const tool = tools.find(t => t.name === 'mysql_event_status')!;
221
- await expect(tool.handler({ name: 'nonexistent_event' }, mockContext))
222
- .rejects.toThrow("Event 'nonexistent_event' not found");
223
- });
224
- });
225
-
226
- describe('mysql_scheduler_status', () => {
227
- it('should get scheduler status', async () => {
228
- mockAdapter.executeQuery.mockResolvedValue(
229
- createMockQueryResult([{ Variable_name: 'event_scheduler', Value: 'ON' }])
230
- );
231
-
232
- const tool = tools.find(t => t.name === 'mysql_scheduler_status')!;
233
- const result = await tool.handler({}, mockContext);
234
-
235
- expect(mockAdapter.executeQuery).toHaveBeenCalled();
236
- // Returns schedulerEnabled, processlist, etc
237
- expect(result).toHaveProperty('schedulerEnabled');
238
- });
359
+ expect(mockAdapter.executeQuery).toHaveBeenCalled();
360
+ // Returns schedulerEnabled, processlist, etc
361
+ expect(result).toHaveProperty("schedulerEnabled");
239
362
  });
363
+ });
240
364
  });
241
365
 
242
- describe('Event Create Advanced', () => {
243
- let mockAdapter: ReturnType<typeof createMockMySQLAdapter>;
244
- let tools: ReturnType<typeof getEventTools>;
245
- let mockContext: ReturnType<typeof createMockRequestContext>;
246
-
247
- beforeEach(() => {
248
- vi.clearAllMocks();
249
- mockAdapter = createMockMySQLAdapter();
250
- tools = getEventTools(mockAdapter as unknown as MySQLAdapter);
251
- mockContext = createMockRequestContext();
252
- });
253
-
254
- it('should add IF NOT EXISTS clause when specified', async () => {
255
- mockAdapter.executeQuery.mockResolvedValue(createMockQueryResult([]));
256
-
257
- const tool = tools.find(t => t.name === 'mysql_event_create')!;
258
- await tool.handler({
259
- name: 'my_event',
260
- schedule: { type: 'ONE TIME', executeAt: '2024-12-31 23:59:59' },
261
- body: 'DELETE FROM temp',
262
- ifNotExists: true
263
- }, mockContext);
264
-
265
- const call = mockAdapter.executeQuery.mock.calls[0][0] as string;
266
- expect(call).toContain('IF NOT EXISTS');
267
- });
268
-
269
- it('should include STARTS and ENDS for recurring events', async () => {
270
- mockAdapter.executeQuery.mockResolvedValue(createMockQueryResult([]));
271
-
272
- const tool = tools.find(t => t.name === 'mysql_event_create')!;
273
- await tool.handler({
274
- name: 'recurring_event',
275
- schedule: {
276
- type: 'RECURRING',
277
- interval: 1,
278
- intervalUnit: 'HOUR',
279
- starts: '2024-01-01 00:00:00',
280
- ends: '2024-12-31 23:59:59'
281
- },
282
- body: 'CALL cleanup_proc()'
283
- }, mockContext);
284
-
285
- const call = mockAdapter.executeQuery.mock.calls[0][0] as string;
286
- expect(call).toContain('STARTS');
287
- expect(call).toContain('ENDS');
288
- });
289
-
290
- it('should include comment when provided', async () => {
291
- mockAdapter.executeQuery.mockResolvedValue(createMockQueryResult([]));
292
-
293
- const tool = tools.find(t => t.name === 'mysql_event_create')!;
294
- await tool.handler({
295
- name: 'commented_event',
296
- schedule: { type: 'ONE TIME', executeAt: '2024-12-31 23:59:59' },
297
- body: 'SELECT 1',
298
- comment: 'This is a test event'
299
- }, mockContext);
300
-
301
- const call = mockAdapter.executeQuery.mock.calls[0][0] as string;
302
- expect(call).toContain('COMMENT');
303
- expect(call).toContain('This is a test event');
304
- });
305
-
306
- it('should add DISABLE clause when enabled is false', async () => {
307
- mockAdapter.executeQuery.mockResolvedValue(createMockQueryResult([]));
308
-
309
- const tool = tools.find(t => t.name === 'mysql_event_create')!;
310
- await tool.handler({
311
- name: 'disabled_event',
312
- schedule: { type: 'ONE TIME', executeAt: '2024-12-31 23:59:59' },
313
- body: 'SELECT 1',
314
- enabled: false
315
- }, mockContext);
316
-
317
- const call = mockAdapter.executeQuery.mock.calls[0][0] as string;
318
- expect(call).toContain('DISABLE');
319
- });
320
-
321
- it('should throw error for invalid event name', async () => {
322
- const tool = tools.find(t => t.name === 'mysql_event_create')!;
323
-
324
- await expect(tool.handler({
325
- name: '123-invalid',
326
- schedule: { type: 'ONE TIME', executeAt: '2024-12-31 23:59:59' },
327
- body: 'SELECT 1'
328
- }, mockContext)).rejects.toThrow('Invalid event name');
329
- });
330
-
331
- it('should throw error when executeAt is missing for ONE TIME events', async () => {
332
- const tool = tools.find(t => t.name === 'mysql_event_create')!;
333
-
334
- await expect(tool.handler({
335
- name: 'bad_event',
336
- schedule: { type: 'ONE TIME' },
337
- body: 'SELECT 1'
338
- }, mockContext)).rejects.toThrow('executeAt is required');
339
- });
340
-
341
- it('should throw error when interval is missing for RECURRING events', async () => {
342
- const tool = tools.find(t => t.name === 'mysql_event_create')!;
343
-
344
- await expect(tool.handler({
345
- name: 'bad_recurring',
346
- schedule: { type: 'RECURRING' },
347
- body: 'SELECT 1'
348
- }, mockContext)).rejects.toThrow('interval and intervalUnit are required');
349
- });
366
+ describe("Event Create Advanced", () => {
367
+ let mockAdapter: ReturnType<typeof createMockMySQLAdapter>;
368
+ let tools: ReturnType<typeof getEventTools>;
369
+ let mockContext: ReturnType<typeof createMockRequestContext>;
370
+
371
+ beforeEach(() => {
372
+ vi.clearAllMocks();
373
+ mockAdapter = createMockMySQLAdapter();
374
+ tools = getEventTools(mockAdapter as unknown as MySQLAdapter);
375
+ mockContext = createMockRequestContext();
376
+ });
377
+
378
+ it("should add IF NOT EXISTS clause when specified", async () => {
379
+ // Pre-check returns empty (event doesn't exist), then CREATE succeeds
380
+ mockAdapter.executeQuery.mockResolvedValueOnce(createMockQueryResult([]));
381
+ mockAdapter.executeQuery.mockResolvedValueOnce(createMockQueryResult([]));
382
+
383
+ const tool = tools.find((t) => t.name === "mysql_event_create")!;
384
+ await tool.handler(
385
+ {
386
+ name: "my_event",
387
+ schedule: { type: "ONE TIME", executeAt: "2024-12-31 23:59:59" },
388
+ body: "DELETE FROM temp",
389
+ ifNotExists: true,
390
+ },
391
+ mockContext,
392
+ );
393
+
394
+ const call = mockAdapter.executeQuery.mock.calls[1][0] as string;
395
+ expect(call).toContain("IF NOT EXISTS");
396
+ });
397
+
398
+ it("should return skipped when ifNotExists is true and event already exists", async () => {
399
+ // Pre-check returns existing event
400
+ mockAdapter.executeQuery.mockResolvedValueOnce(
401
+ createMockQueryResult([{ EVENT_NAME: "my_event" }]),
402
+ );
403
+
404
+ const tool = tools.find((t) => t.name === "mysql_event_create")!;
405
+ const result = await tool.handler(
406
+ {
407
+ name: "my_event",
408
+ schedule: { type: "ONE TIME", executeAt: "2024-12-31 23:59:59" },
409
+ body: "DELETE FROM temp",
410
+ ifNotExists: true,
411
+ },
412
+ mockContext,
413
+ );
414
+
415
+ expect(result).toEqual({
416
+ success: true,
417
+ skipped: true,
418
+ reason: "Event already exists",
419
+ eventName: "my_event",
420
+ });
421
+ // Should only have the pre-check query, no CREATE
422
+ expect(mockAdapter.executeQuery).toHaveBeenCalledTimes(1);
423
+ });
424
+
425
+ it("should include STARTS and ENDS for recurring events", async () => {
426
+ mockAdapter.executeQuery.mockResolvedValue(createMockQueryResult([]));
427
+
428
+ const tool = tools.find((t) => t.name === "mysql_event_create")!;
429
+ await tool.handler(
430
+ {
431
+ name: "recurring_event",
432
+ schedule: {
433
+ type: "RECURRING",
434
+ interval: 1,
435
+ intervalUnit: "HOUR",
436
+ starts: "2024-01-01 00:00:00",
437
+ ends: "2024-12-31 23:59:59",
438
+ },
439
+ body: "CALL cleanup_proc()",
440
+ },
441
+ mockContext,
442
+ );
443
+
444
+ const call = mockAdapter.executeQuery.mock.calls[0][0] as string;
445
+ expect(call).toContain("STARTS");
446
+ expect(call).toContain("ENDS");
447
+ });
448
+
449
+ it("should include comment when provided", async () => {
450
+ mockAdapter.executeQuery.mockResolvedValue(createMockQueryResult([]));
451
+
452
+ const tool = tools.find((t) => t.name === "mysql_event_create")!;
453
+ await tool.handler(
454
+ {
455
+ name: "commented_event",
456
+ schedule: { type: "ONE TIME", executeAt: "2024-12-31 23:59:59" },
457
+ body: "SELECT 1",
458
+ comment: "This is a test event",
459
+ },
460
+ mockContext,
461
+ );
462
+
463
+ const call = mockAdapter.executeQuery.mock.calls[0][0] as string;
464
+ expect(call).toContain("COMMENT");
465
+ expect(call).toContain("This is a test event");
466
+ });
467
+
468
+ it("should add DISABLE clause when enabled is false", async () => {
469
+ mockAdapter.executeQuery.mockResolvedValue(createMockQueryResult([]));
470
+
471
+ const tool = tools.find((t) => t.name === "mysql_event_create")!;
472
+ await tool.handler(
473
+ {
474
+ name: "disabled_event",
475
+ schedule: { type: "ONE TIME", executeAt: "2024-12-31 23:59:59" },
476
+ body: "SELECT 1",
477
+ enabled: false,
478
+ },
479
+ mockContext,
480
+ );
481
+
482
+ const call = mockAdapter.executeQuery.mock.calls[0][0] as string;
483
+ expect(call).toContain("DISABLE");
484
+ });
485
+
486
+ it("should throw error for invalid event name", async () => {
487
+ const tool = tools.find((t) => t.name === "mysql_event_create")!;
488
+
489
+ await expect(
490
+ tool.handler(
491
+ {
492
+ name: "123-invalid",
493
+ schedule: { type: "ONE TIME", executeAt: "2024-12-31 23:59:59" },
494
+ body: "SELECT 1",
495
+ },
496
+ mockContext,
497
+ ),
498
+ ).rejects.toThrow("Invalid event name");
499
+ });
500
+
501
+ it("should throw error when executeAt is missing for ONE TIME events", async () => {
502
+ const tool = tools.find((t) => t.name === "mysql_event_create")!;
503
+
504
+ await expect(
505
+ tool.handler(
506
+ {
507
+ name: "bad_event",
508
+ schedule: { type: "ONE TIME" },
509
+ body: "SELECT 1",
510
+ },
511
+ mockContext,
512
+ ),
513
+ ).rejects.toThrow("executeAt is required");
514
+ });
515
+
516
+ it("should throw error when interval is missing for RECURRING events", async () => {
517
+ const tool = tools.find((t) => t.name === "mysql_event_create")!;
518
+
519
+ await expect(
520
+ tool.handler(
521
+ {
522
+ name: "bad_recurring",
523
+ schedule: { type: "RECURRING" },
524
+ body: "SELECT 1",
525
+ },
526
+ mockContext,
527
+ ),
528
+ ).rejects.toThrow("interval and intervalUnit are required");
529
+ });
350
530
  });
351
531
 
352
- describe('Event Alter Advanced', () => {
353
- let mockAdapter: ReturnType<typeof createMockMySQLAdapter>;
354
- let tools: ReturnType<typeof getEventTools>;
355
- let mockContext: ReturnType<typeof createMockRequestContext>;
356
-
357
- beforeEach(() => {
358
- vi.clearAllMocks();
359
- mockAdapter = createMockMySQLAdapter();
360
- tools = getEventTools(mockAdapter as unknown as MySQLAdapter);
361
- mockContext = createMockRequestContext();
362
- });
363
-
364
- it('should alter schedule to ONE TIME', async () => {
365
- mockAdapter.executeQuery.mockResolvedValue(createMockQueryResult([]));
366
-
367
- const tool = tools.find(t => t.name === 'mysql_event_alter')!;
368
- await tool.handler({
369
- name: 'my_event',
370
- schedule: { type: 'ONE TIME', executeAt: '2024-12-31 23:59:59' }
371
- }, mockContext);
372
-
373
- const call = mockAdapter.executeQuery.mock.calls[0][0] as string;
374
- expect(call).toContain('ON SCHEDULE AT');
375
- });
376
-
377
- it('should alter schedule to RECURRING with starts/ends', async () => {
378
- mockAdapter.executeQuery.mockResolvedValue(createMockQueryResult([]));
379
-
380
- const tool = tools.find(t => t.name === 'mysql_event_alter')!;
381
- await tool.handler({
382
- name: 'my_event',
383
- schedule: {
384
- type: 'RECURRING',
385
- interval: 2,
386
- intervalUnit: 'HOUR',
387
- starts: '2024-01-01 00:00:00',
388
- ends: '2024-12-31 23:59:59'
389
- }
390
- }, mockContext);
391
-
392
- const call = mockAdapter.executeQuery.mock.calls[0][0] as string;
393
- expect(call).toContain('EVERY 2 HOUR');
394
- expect(call).toContain('STARTS');
395
- expect(call).toContain('ENDS');
396
- });
397
-
398
- it('should alter event body', async () => {
399
- mockAdapter.executeQuery.mockResolvedValue(createMockQueryResult([]));
400
-
401
- const tool = tools.find(t => t.name === 'mysql_event_alter')!;
402
- await tool.handler({
403
- name: 'my_event',
404
- body: 'CALL new_procedure()'
405
- }, mockContext);
406
-
407
- const call = mockAdapter.executeQuery.mock.calls[0][0] as string;
408
- expect(call).toContain('DO CALL new_procedure()');
409
- });
410
-
411
- it('should alter on completion behavior', async () => {
412
- mockAdapter.executeQuery.mockResolvedValue(createMockQueryResult([]));
413
-
414
- const tool = tools.find(t => t.name === 'mysql_event_alter')!;
415
- await tool.handler({
416
- name: 'my_event',
417
- onCompletion: 'PRESERVE'
418
- }, mockContext);
419
-
420
- const call = mockAdapter.executeQuery.mock.calls[0][0] as string;
421
- expect(call).toContain('ON COMPLETION PRESERVE');
422
- });
423
-
424
- it('should alter event comment', async () => {
425
- mockAdapter.executeQuery.mockResolvedValue(createMockQueryResult([]));
426
-
427
- const tool = tools.find(t => t.name === 'mysql_event_alter')!;
428
- await tool.handler({
429
- name: 'my_event',
430
- comment: 'Updated comment'
431
- }, mockContext);
432
-
433
- const call = mockAdapter.executeQuery.mock.calls[0][0] as string;
434
- expect(call).toContain("COMMENT 'Updated comment'");
435
- });
436
-
437
- it('should throw error for invalid event name', async () => {
438
- const tool = tools.find(t => t.name === 'mysql_event_alter')!;
439
-
440
- await expect(tool.handler({
441
- name: 'invalid-name',
442
- enabled: true
443
- }, mockContext)).rejects.toThrow('Invalid event name');
444
- });
445
-
446
- it('should throw error for invalid new event name', async () => {
447
- const tool = tools.find(t => t.name === 'mysql_event_alter')!;
448
-
449
- await expect(tool.handler({
450
- name: 'valid_name',
451
- newName: '123-invalid'
452
- }, mockContext)).rejects.toThrow('Invalid new event name');
453
- });
454
-
455
- it('should throw error when no modifications specified', async () => {
456
- const tool = tools.find(t => t.name === 'mysql_event_alter')!;
457
-
458
- await expect(tool.handler({
459
- name: 'my_event'
460
- }, mockContext)).rejects.toThrow('No modifications specified');
461
- });
462
-
463
- it('should throw error when executeAt missing for ONE TIME alter', async () => {
464
- const tool = tools.find(t => t.name === 'mysql_event_alter')!;
465
-
466
- await expect(tool.handler({
467
- name: 'my_event',
468
- schedule: { type: 'ONE TIME' }
469
- }, mockContext)).rejects.toThrow('executeAt is required');
470
- });
471
-
472
- it('should throw error when interval missing for RECURRING alter', async () => {
473
- const tool = tools.find(t => t.name === 'mysql_event_alter')!;
474
-
475
- await expect(tool.handler({
476
- name: 'my_event',
477
- schedule: { type: 'RECURRING' }
478
- }, mockContext)).rejects.toThrow('interval and intervalUnit are required');
479
- });
532
+ describe("Event Alter Advanced", () => {
533
+ let mockAdapter: ReturnType<typeof createMockMySQLAdapter>;
534
+ let tools: ReturnType<typeof getEventTools>;
535
+ let mockContext: ReturnType<typeof createMockRequestContext>;
536
+
537
+ beforeEach(() => {
538
+ vi.clearAllMocks();
539
+ mockAdapter = createMockMySQLAdapter();
540
+ tools = getEventTools(mockAdapter as unknown as MySQLAdapter);
541
+ mockContext = createMockRequestContext();
542
+ });
543
+
544
+ it("should alter schedule to ONE TIME", async () => {
545
+ mockAdapter.executeQuery.mockResolvedValue(createMockQueryResult([]));
546
+
547
+ const tool = tools.find((t) => t.name === "mysql_event_alter")!;
548
+ await tool.handler(
549
+ {
550
+ name: "my_event",
551
+ schedule: { type: "ONE TIME", executeAt: "2024-12-31 23:59:59" },
552
+ },
553
+ mockContext,
554
+ );
555
+
556
+ const call = mockAdapter.executeQuery.mock.calls[0][0] as string;
557
+ expect(call).toContain("ON SCHEDULE AT");
558
+ });
559
+
560
+ it("should alter schedule to RECURRING with starts/ends", async () => {
561
+ mockAdapter.executeQuery.mockResolvedValue(createMockQueryResult([]));
562
+
563
+ const tool = tools.find((t) => t.name === "mysql_event_alter")!;
564
+ await tool.handler(
565
+ {
566
+ name: "my_event",
567
+ schedule: {
568
+ type: "RECURRING",
569
+ interval: 2,
570
+ intervalUnit: "HOUR",
571
+ starts: "2024-01-01 00:00:00",
572
+ ends: "2024-12-31 23:59:59",
573
+ },
574
+ },
575
+ mockContext,
576
+ );
577
+
578
+ const call = mockAdapter.executeQuery.mock.calls[0][0] as string;
579
+ expect(call).toContain("EVERY 2 HOUR");
580
+ expect(call).toContain("STARTS");
581
+ expect(call).toContain("ENDS");
582
+ });
583
+
584
+ it("should alter event body", async () => {
585
+ mockAdapter.executeQuery.mockResolvedValue(createMockQueryResult([]));
586
+
587
+ const tool = tools.find((t) => t.name === "mysql_event_alter")!;
588
+ await tool.handler(
589
+ {
590
+ name: "my_event",
591
+ body: "CALL new_procedure()",
592
+ },
593
+ mockContext,
594
+ );
595
+
596
+ const call = mockAdapter.executeQuery.mock.calls[0][0] as string;
597
+ expect(call).toContain("DO CALL new_procedure()");
598
+ });
599
+
600
+ it("should alter on completion behavior", async () => {
601
+ mockAdapter.executeQuery.mockResolvedValue(createMockQueryResult([]));
602
+
603
+ const tool = tools.find((t) => t.name === "mysql_event_alter")!;
604
+ await tool.handler(
605
+ {
606
+ name: "my_event",
607
+ onCompletion: "PRESERVE",
608
+ },
609
+ mockContext,
610
+ );
611
+
612
+ const call = mockAdapter.executeQuery.mock.calls[0][0] as string;
613
+ expect(call).toContain("ON COMPLETION PRESERVE");
614
+ });
615
+
616
+ it("should alter event comment", async () => {
617
+ mockAdapter.executeQuery.mockResolvedValue(createMockQueryResult([]));
618
+
619
+ const tool = tools.find((t) => t.name === "mysql_event_alter")!;
620
+ await tool.handler(
621
+ {
622
+ name: "my_event",
623
+ comment: "Updated comment",
624
+ },
625
+ mockContext,
626
+ );
627
+
628
+ const call = mockAdapter.executeQuery.mock.calls[0][0] as string;
629
+ expect(call).toContain("COMMENT 'Updated comment'");
630
+ });
631
+
632
+ it("should throw error for invalid event name", async () => {
633
+ const tool = tools.find((t) => t.name === "mysql_event_alter")!;
634
+
635
+ await expect(
636
+ tool.handler(
637
+ {
638
+ name: "invalid-name",
639
+ enabled: true,
640
+ },
641
+ mockContext,
642
+ ),
643
+ ).rejects.toThrow("Invalid event name");
644
+ });
645
+
646
+ it("should throw error for invalid new event name", async () => {
647
+ const tool = tools.find((t) => t.name === "mysql_event_alter")!;
648
+
649
+ await expect(
650
+ tool.handler(
651
+ {
652
+ name: "valid_name",
653
+ newName: "123-invalid",
654
+ },
655
+ mockContext,
656
+ ),
657
+ ).rejects.toThrow("Invalid new event name");
658
+ });
659
+
660
+ it("should throw error when no modifications specified", async () => {
661
+ const tool = tools.find((t) => t.name === "mysql_event_alter")!;
662
+
663
+ await expect(
664
+ tool.handler(
665
+ {
666
+ name: "my_event",
667
+ },
668
+ mockContext,
669
+ ),
670
+ ).rejects.toThrow("No modifications specified");
671
+ });
672
+
673
+ it("should throw error when executeAt missing for ONE TIME alter", async () => {
674
+ const tool = tools.find((t) => t.name === "mysql_event_alter")!;
675
+
676
+ await expect(
677
+ tool.handler(
678
+ {
679
+ name: "my_event",
680
+ schedule: { type: "ONE TIME" },
681
+ },
682
+ mockContext,
683
+ ),
684
+ ).rejects.toThrow("executeAt is required");
685
+ });
686
+
687
+ it("should throw error when interval missing for RECURRING alter", async () => {
688
+ const tool = tools.find((t) => t.name === "mysql_event_alter")!;
689
+
690
+ await expect(
691
+ tool.handler(
692
+ {
693
+ name: "my_event",
694
+ schedule: { type: "RECURRING" },
695
+ },
696
+ mockContext,
697
+ ),
698
+ ).rejects.toThrow("interval and intervalUnit are required");
699
+ });
480
700
  });
481
701
 
482
- describe('Event Drop Advanced', () => {
483
- let mockAdapter: ReturnType<typeof createMockMySQLAdapter>;
484
- let tools: ReturnType<typeof getEventTools>;
485
- let mockContext: ReturnType<typeof createMockRequestContext>;
486
-
487
- beforeEach(() => {
488
- vi.clearAllMocks();
489
- mockAdapter = createMockMySQLAdapter();
490
- tools = getEventTools(mockAdapter as unknown as MySQLAdapter);
491
- mockContext = createMockRequestContext();
492
- });
493
-
494
- it('should throw error for invalid event name', async () => {
495
- const tool = tools.find(t => t.name === 'mysql_event_drop')!;
496
-
497
- await expect(tool.handler({
498
- name: 'invalid-event-name'
499
- }, mockContext)).rejects.toThrow('Invalid event name');
500
- });
501
-
502
- it('should drop without IF EXISTS when ifExists is false', async () => {
503
- mockAdapter.executeQuery.mockResolvedValue(createMockQueryResult([]));
504
-
505
- const tool = tools.find(t => t.name === 'mysql_event_drop')!;
506
- await tool.handler({
507
- name: 'my_event',
508
- ifExists: false
509
- }, mockContext);
510
-
511
- const call = mockAdapter.executeQuery.mock.calls[0][0] as string;
512
- expect(call).not.toContain('IF EXISTS');
513
- });
702
+ describe("Event Drop Advanced", () => {
703
+ let mockAdapter: ReturnType<typeof createMockMySQLAdapter>;
704
+ let tools: ReturnType<typeof getEventTools>;
705
+ let mockContext: ReturnType<typeof createMockRequestContext>;
706
+
707
+ beforeEach(() => {
708
+ vi.clearAllMocks();
709
+ mockAdapter = createMockMySQLAdapter();
710
+ tools = getEventTools(mockAdapter as unknown as MySQLAdapter);
711
+ mockContext = createMockRequestContext();
712
+ });
713
+
714
+ it("should throw error for invalid event name", async () => {
715
+ const tool = tools.find((t) => t.name === "mysql_event_drop")!;
716
+
717
+ await expect(
718
+ tool.handler(
719
+ {
720
+ name: "invalid-event-name",
721
+ },
722
+ mockContext,
723
+ ),
724
+ ).rejects.toThrow("Invalid event name");
725
+ });
726
+
727
+ it("should drop without IF EXISTS when ifExists is false", async () => {
728
+ mockAdapter.executeQuery.mockResolvedValue(createMockQueryResult([]));
729
+
730
+ const tool = tools.find((t) => t.name === "mysql_event_drop")!;
731
+ await tool.handler(
732
+ {
733
+ name: "my_event",
734
+ ifExists: false,
735
+ },
736
+ mockContext,
737
+ );
738
+
739
+ const call = mockAdapter.executeQuery.mock.calls[0][0] as string;
740
+ expect(call).not.toContain("IF EXISTS");
741
+ });
514
742
  });
515
743
 
744
+ describe("Event Graceful Error Handling", () => {
745
+ let mockAdapter: ReturnType<typeof createMockMySQLAdapter>;
746
+ let tools: ReturnType<typeof getEventTools>;
747
+ let mockContext: ReturnType<typeof createMockRequestContext>;
748
+
749
+ beforeEach(() => {
750
+ vi.clearAllMocks();
751
+ mockAdapter = createMockMySQLAdapter();
752
+ tools = getEventTools(mockAdapter as unknown as MySQLAdapter);
753
+ mockContext = createMockRequestContext();
754
+ });
755
+
756
+ it("should return success false when creating duplicate event", async () => {
757
+ const mysqlError = new Error(
758
+ "Query failed: Execute failed: Event 'my_event' already exists",
759
+ );
760
+ mockAdapter.executeQuery.mockRejectedValue(mysqlError);
761
+
762
+ const tool = tools.find((t) => t.name === "mysql_event_create")!;
763
+ const result = await tool.handler(
764
+ {
765
+ name: "my_event",
766
+ schedule: { type: "ONE TIME", executeAt: "2024-12-31 23:59:59" },
767
+ body: "SELECT 1",
768
+ },
769
+ mockContext,
770
+ );
771
+
772
+ expect(result).toEqual({
773
+ success: false,
774
+ reason: "Event 'my_event' already exists",
775
+ });
776
+ });
777
+
778
+ it("should return success false when altering nonexistent event", async () => {
779
+ const mysqlError = new Error(
780
+ "Query failed: Execute failed: Unknown event 'ghost_event'",
781
+ );
782
+ mockAdapter.executeQuery.mockRejectedValue(mysqlError);
783
+
784
+ const tool = tools.find((t) => t.name === "mysql_event_alter")!;
785
+ const result = await tool.handler(
786
+ {
787
+ name: "ghost_event",
788
+ enabled: true,
789
+ },
790
+ mockContext,
791
+ );
792
+
793
+ expect(result).toEqual({
794
+ success: false,
795
+ reason: "Event 'ghost_event' does not exist",
796
+ });
797
+ });
798
+
799
+ it("should return success false when dropping nonexistent event without ifExists", async () => {
800
+ const mysqlError = new Error(
801
+ "Query failed: Execute failed: Unknown event 'ghost_event'",
802
+ );
803
+ mockAdapter.executeQuery.mockRejectedValue(mysqlError);
804
+
805
+ const tool = tools.find((t) => t.name === "mysql_event_drop")!;
806
+ const result = await tool.handler(
807
+ {
808
+ name: "ghost_event",
809
+ ifExists: false,
810
+ },
811
+ mockContext,
812
+ );
813
+
814
+ expect(result).toEqual({
815
+ success: false,
816
+ reason: "Event 'ghost_event' does not exist",
817
+ });
818
+ });
819
+
820
+ it("should rethrow unexpected errors from create", async () => {
821
+ mockAdapter.executeQuery.mockRejectedValue(new Error("Connection lost"));
822
+
823
+ const tool = tools.find((t) => t.name === "mysql_event_create")!;
824
+ await expect(
825
+ tool.handler(
826
+ {
827
+ name: "my_event",
828
+ schedule: { type: "ONE TIME", executeAt: "2024-12-31 23:59:59" },
829
+ body: "SELECT 1",
830
+ },
831
+ mockContext,
832
+ ),
833
+ ).rejects.toThrow("Connection lost");
834
+ });
835
+ });