@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,400 +1,640 @@
1
1
  /**
2
2
  * mysql-mcp - Admin Backup Tools Unit Tests
3
- *
3
+ *
4
4
  * Comprehensive tests for backup.ts module functions.
5
5
  */
6
6
 
7
- import { describe, it, expect, vi, beforeEach } from 'vitest';
7
+ import { describe, it, expect, vi, beforeEach } from "vitest";
8
8
  import {
9
- createExportTableTool,
10
- createImportDataTool,
11
- createCreateDumpTool,
12
- createRestoreDumpTool
13
- } from '../backup.js';
14
- import type { MySQLAdapter } from '../../../MySQLAdapter.js';
15
- import { createMockMySQLAdapter, createMockRequestContext, createMockQueryResult } from '../../../../../__tests__/mocks/index.js';
16
-
17
- describe('Admin Backup Tools', () => {
18
- let mockAdapter: ReturnType<typeof createMockMySQLAdapter>;
19
- let mockContext: ReturnType<typeof createMockRequestContext>;
20
-
21
- beforeEach(() => {
22
- vi.clearAllMocks();
23
- mockAdapter = createMockMySQLAdapter();
24
- mockContext = createMockRequestContext();
25
- });
26
-
27
- describe('createExportTableTool', () => {
28
- it('should create tool with correct definition', () => {
29
- const tool = createExportTableTool(mockAdapter as unknown as MySQLAdapter);
30
-
31
- expect(tool.name).toBe('mysql_export_table');
32
- expect(tool.group).toBe('backup');
33
- expect(tool.requiredScopes).toContain('read');
34
- expect(tool.annotations?.readOnlyHint).toBe(true);
35
- });
36
-
37
- it('should export table as SQL format', async () => {
38
- mockAdapter.executeReadQuery.mockResolvedValue(createMockQueryResult([
39
- { id: 1, name: 'Alice', email: 'alice@example.com' },
40
- { id: 2, name: 'Bob', email: 'bob@example.com' }
41
- ]));
42
-
43
- const tool = createExportTableTool(mockAdapter as unknown as MySQLAdapter);
44
- const result = await tool.handler({ table: 'users', format: 'SQL' }, mockContext) as { sql: string; rowCount: number };
45
-
46
- expect(mockAdapter.executeReadQuery).toHaveBeenCalled();
47
- expect(result.sql).toContain('INSERT INTO `users`');
48
- expect(result.sql).toContain('Alice');
49
- expect(result.rowCount).toBe(2);
50
- });
51
-
52
- it('should export table as CSV format', async () => {
53
- mockAdapter.executeReadQuery.mockResolvedValue(createMockQueryResult([
54
- { id: 1, name: 'Alice', active: true },
55
- { id: 2, name: 'Bob', active: false }
56
- ]));
57
-
58
- const tool = createExportTableTool(mockAdapter as unknown as MySQLAdapter);
59
- const result = await tool.handler({ table: 'users', format: 'CSV' }, mockContext) as { csv: string; rowCount: number };
60
-
61
- expect(result.csv).toContain('id,name,active');
62
- expect(result.csv).toContain('Alice');
63
- expect(result.csv).toContain('Bob');
64
- expect(result.rowCount).toBe(2);
65
- });
66
-
67
- it('should export empty table', async () => {
68
- mockAdapter.executeReadQuery.mockResolvedValue(createMockQueryResult([]));
69
-
70
- const tool = createExportTableTool(mockAdapter as unknown as MySQLAdapter);
71
- const result = await tool.handler({ table: 'empty_table', format: 'SQL' }, mockContext) as { sql: string; rowCount: number };
72
-
73
- expect(result.sql).toBe('');
74
- expect(result.rowCount).toBe(0);
75
- });
76
-
77
- it('should handle WHERE clause in SQL export', async () => {
78
- mockAdapter.executeReadQuery.mockResolvedValue(createMockQueryResult([
79
- { id: 5, status: 'active' }
80
- ]));
81
-
82
- const tool = createExportTableTool(mockAdapter as unknown as MySQLAdapter);
83
- await tool.handler({ table: 'orders', format: 'SQL', where: 'status = "active"' }, mockContext);
84
-
85
- const call = mockAdapter.executeReadQuery.mock.calls[0][0] as string;
86
- expect(call).toContain('WHERE status = "active"');
87
- });
88
-
89
- it('should handle NULL values in SQL export', async () => {
90
- mockAdapter.executeReadQuery.mockResolvedValue(createMockQueryResult([
91
- { id: 1, name: 'Test', description: null }
92
- ]));
93
-
94
- const tool = createExportTableTool(mockAdapter as unknown as MySQLAdapter);
95
- const result = await tool.handler({ table: 'products', format: 'SQL' }, mockContext) as { sql: string };
96
-
97
- expect(result.sql).toContain('NULL');
98
- });
99
-
100
- it('should handle JSON values in SQL export', async () => {
101
- mockAdapter.executeReadQuery.mockResolvedValue(createMockQueryResult([
102
- { id: 1, metadata: { key: 'value', nested: { prop: 123 } } }
103
- ]));
104
-
105
- const tool = createExportTableTool(mockAdapter as unknown as MySQLAdapter);
106
- const result = await tool.handler({ table: 'items', format: 'SQL' }, mockContext) as { sql: string };
107
-
108
- expect(result.sql).toContain('metadata');
109
- expect(result.sql).toContain('key');
110
- });
111
-
112
- it('should handle object values in CSV export', async () => {
113
- mockAdapter.executeReadQuery.mockResolvedValue(createMockQueryResult([
114
- { id: 1, config: { setting: 'value' } }
115
- ]));
116
-
117
- const tool = createExportTableTool(mockAdapter as unknown as MySQLAdapter);
118
- const result = await tool.handler({ table: 'configs', format: 'CSV' }, mockContext) as { csv: string };
119
-
120
- expect(result.csv).toContain('setting');
121
- });
122
-
123
- it('should validate table name for SQL injection', async () => {
124
- const tool = createExportTableTool(mockAdapter as unknown as MySQLAdapter);
125
-
126
- await expect(
127
- tool.handler({ table: 'users; DROP TABLE users;--', format: 'SQL' }, mockContext)
128
- ).rejects.toThrow();
129
- });
130
-
131
- it('should validate WHERE clause for SQL injection', async () => {
132
- const tool = createExportTableTool(mockAdapter as unknown as MySQLAdapter);
133
-
134
- await expect(
135
- tool.handler({
136
- table: 'users',
137
- format: 'SQL',
138
- where: '1=1; DELETE FROM users;--'
139
- }, mockContext)
140
- ).rejects.toThrow();
141
- });
142
-
143
- it('should generate proper INSERT statements with column names', async () => {
144
- mockAdapter.executeReadQuery.mockResolvedValue(createMockQueryResult([
145
- { id: 1, email: 'test@example.com', created_at: '2024-01-01' }
146
- ]));
147
-
148
- const tool = createExportTableTool(mockAdapter as unknown as MySQLAdapter);
149
- const result = await tool.handler({ table: 'logs', format: 'SQL' }, mockContext) as { sql: string };
150
-
151
- expect(result.sql).toContain('(`id`, `email`, `created_at`)');
152
- expect(result.sql).toContain('VALUES');
153
- });
154
- });
155
-
156
- describe('createImportDataTool', () => {
157
- it('should create tool with correct definition', () => {
158
- const tool = createImportDataTool(mockAdapter as unknown as MySQLAdapter);
159
-
160
- expect(tool.name).toBe('mysql_import_data');
161
- expect(tool.group).toBe('backup');
162
- expect(tool.requiredScopes).toContain('write');
163
- expect(tool.annotations?.readOnlyHint).toBe(false);
164
- });
165
-
166
- it('should import data rows', async () => {
167
- mockAdapter.executeWriteQuery.mockResolvedValue({ rows: [], rowsAffected: 1, executionTimeMs: 5 });
168
-
169
- const tool = createImportDataTool(mockAdapter as unknown as MySQLAdapter);
170
- const result = await tool.handler({
171
- table: 'users',
172
- data: [
173
- { name: 'Alice', email: 'alice@example.com' },
174
- { name: 'Bob', email: 'bob@example.com' }
175
- ]
176
- }, mockContext) as { success: boolean; rowsInserted: number };
177
-
178
- expect(mockAdapter.executeWriteQuery).toHaveBeenCalledTimes(2);
179
- expect(result.success).toBe(true);
180
- expect(result.rowsInserted).toBe(2);
181
- });
182
-
183
- it('should handle empty data array', async () => {
184
- const tool = createImportDataTool(mockAdapter as unknown as MySQLAdapter);
185
- const result = await tool.handler({
186
- table: 'users',
187
- data: []
188
- }, mockContext) as { success: boolean; rowsInserted: number };
189
-
190
- expect(mockAdapter.executeWriteQuery).not.toHaveBeenCalled();
191
- expect(result.success).toBe(true);
192
- expect(result.rowsInserted).toBe(0);
193
- });
194
-
195
- it('should use parameterized queries', async () => {
196
- mockAdapter.executeWriteQuery.mockResolvedValue({ rows: [], rowsAffected: 1, executionTimeMs: 5 });
197
-
198
- const tool = createImportDataTool(mockAdapter as unknown as MySQLAdapter);
199
- await tool.handler({
200
- table: 'users',
201
- data: [{ name: "O'Brien", email: 'obrien@example.com' }]
202
- }, mockContext);
203
-
204
- const call = mockAdapter.executeWriteQuery.mock.calls[0][0] as string;
205
- expect(call).toContain('INSERT INTO');
206
- expect(call).toContain('?');
207
- });
208
-
209
- it('should validate table name for SQL injection', async () => {
210
- const tool = createImportDataTool(mockAdapter as unknown as MySQLAdapter);
211
-
212
- await expect(
213
- tool.handler({
214
- table: 'users; DROP TABLE users;--',
215
- data: [{ name: 'test' }]
216
- }, mockContext)
217
- ).rejects.toThrow();
218
- });
219
-
220
- it('should handle various data types', async () => {
221
- mockAdapter.executeWriteQuery.mockResolvedValue({ rows: [], rowsAffected: 1, executionTimeMs: 5 });
222
-
223
- const tool = createImportDataTool(mockAdapter as unknown as MySQLAdapter);
224
- await tool.handler({
225
- table: 'mixed',
226
- data: [{
227
- str: 'text',
228
- num: 42,
229
- bool: true,
230
- nul: null,
231
- obj: { key: 'value' }
232
- }]
233
- }, mockContext);
234
-
235
- expect(mockAdapter.executeWriteQuery).toHaveBeenCalled();
236
- });
237
-
238
- it('should handle import errors gracefully', async () => {
239
- mockAdapter.executeWriteQuery
240
- .mockResolvedValueOnce({ rows: [], rowsAffected: 1, executionTimeMs: 5 })
241
- .mockRejectedValueOnce(new Error('Duplicate entry'));
242
-
243
- const tool = createImportDataTool(mockAdapter as unknown as MySQLAdapter);
244
-
245
- await expect(
246
- tool.handler({
247
- table: 'users',
248
- data: [
249
- { id: 1, name: 'First' },
250
- { id: 1, name: 'Duplicate' }
251
- ]
252
- }, mockContext)
253
- ).rejects.toThrow('Duplicate entry');
254
- });
255
- });
256
-
257
- describe('createCreateDumpTool', () => {
258
- it('should create tool with correct definition', () => {
259
- const tool = createCreateDumpTool(mockAdapter as unknown as MySQLAdapter);
260
-
261
- expect(tool.name).toBe('mysql_create_dump');
262
- expect(tool.group).toBe('backup');
263
- expect(tool.requiredScopes).toContain('admin');
264
- expect(tool.annotations?.readOnlyHint).toBe(true);
265
- });
266
-
267
- it('should generate mysqldump command for current database', async () => {
268
- mockAdapter.executeReadQuery.mockResolvedValue(createMockQueryResult([{ db: 'testdb' }]));
269
-
270
- const tool = createCreateDumpTool(mockAdapter as unknown as MySQLAdapter);
271
- const result = await tool.handler({}, mockContext) as { command: string; note: string };
272
-
273
- expect(mockAdapter.executeReadQuery).toHaveBeenCalledWith('SELECT DATABASE() as db');
274
- expect(result.command).toContain('mysqldump');
275
- expect(result.command).toContain('testdb');
276
- expect(result.note).toBeDefined();
277
- });
278
-
279
- it('should generate mysqldump command with specific database', async () => {
280
- const tool = createCreateDumpTool(mockAdapter as unknown as MySQLAdapter);
281
- const result = await tool.handler({ database: 'production_db' }, mockContext) as { command: string };
282
-
283
- expect(mockAdapter.executeReadQuery).not.toHaveBeenCalled();
284
- expect(result.command).toContain('production_db');
285
- });
286
-
287
- it('should include specific tables in command', async () => {
288
- mockAdapter.executeReadQuery.mockResolvedValue(createMockQueryResult([{ db: 'mydb' }]));
289
-
290
- const tool = createCreateDumpTool(mockAdapter as unknown as MySQLAdapter);
291
- const result = await tool.handler({
292
- tables: ['users', 'orders']
293
- }, mockContext) as { command: string };
294
-
295
- expect(result.command).toContain('users');
296
- expect(result.command).toContain('orders');
297
- });
298
-
299
- it('should add --no-data flag for schema-only dump', async () => {
300
- mockAdapter.executeReadQuery.mockResolvedValue(createMockQueryResult([{ db: 'mydb' }]));
301
-
302
- const tool = createCreateDumpTool(mockAdapter as unknown as MySQLAdapter);
303
- const result = await tool.handler({ noData: true }, mockContext) as { command: string };
304
-
305
- expect(result.command).toContain('--no-data');
306
- });
307
-
308
- it('should add --single-transaction flag when specified', async () => {
309
- mockAdapter.executeReadQuery.mockResolvedValue(createMockQueryResult([{ db: 'mydb' }]));
310
-
311
- const tool = createCreateDumpTool(mockAdapter as unknown as MySQLAdapter);
312
- const result = await tool.handler({ singleTransaction: true }, mockContext) as { command: string };
313
-
314
- expect(result.command).toContain('--single-transaction');
315
- });
316
-
317
- it('should combine multiple options', async () => {
318
- mockAdapter.executeReadQuery.mockResolvedValue(createMockQueryResult([{ db: 'mydb' }]));
9
+ createExportTableTool,
10
+ createImportDataTool,
11
+ createCreateDumpTool,
12
+ createRestoreDumpTool,
13
+ } from "../backup.js";
14
+ import type { MySQLAdapter } from "../../../MySQLAdapter.js";
15
+ import {
16
+ createMockMySQLAdapter,
17
+ createMockRequestContext,
18
+ createMockQueryResult,
19
+ } from "../../../../../__tests__/mocks/index.js";
20
+
21
+ describe("Admin Backup Tools", () => {
22
+ let mockAdapter: ReturnType<typeof createMockMySQLAdapter>;
23
+ let mockContext: ReturnType<typeof createMockRequestContext>;
24
+
25
+ beforeEach(() => {
26
+ vi.clearAllMocks();
27
+ mockAdapter = createMockMySQLAdapter();
28
+ mockContext = createMockRequestContext();
29
+ });
30
+
31
+ describe("createExportTableTool", () => {
32
+ it("should create tool with correct definition", () => {
33
+ const tool = createExportTableTool(
34
+ mockAdapter as unknown as MySQLAdapter,
35
+ );
36
+
37
+ expect(tool.name).toBe("mysql_export_table");
38
+ expect(tool.group).toBe("backup");
39
+ expect(tool.requiredScopes).toContain("read");
40
+ expect(tool.annotations?.readOnlyHint).toBe(true);
41
+ });
319
42
 
320
- const tool = createCreateDumpTool(mockAdapter as unknown as MySQLAdapter);
321
- const result = await tool.handler({
322
- tables: ['users'],
323
- noData: true,
324
- singleTransaction: true
325
- }, mockContext) as { command: string };
43
+ it("should export table as SQL format", async () => {
44
+ mockAdapter.executeReadQuery.mockResolvedValue(
45
+ createMockQueryResult([
46
+ { id: 1, name: "Alice", email: "alice@example.com" },
47
+ { id: 2, name: "Bob", email: "bob@example.com" },
48
+ ]),
49
+ );
50
+
51
+ const tool = createExportTableTool(
52
+ mockAdapter as unknown as MySQLAdapter,
53
+ );
54
+ const result = (await tool.handler(
55
+ { table: "users", format: "SQL" },
56
+ mockContext,
57
+ )) as { sql: string; rowCount: number };
58
+
59
+ expect(mockAdapter.executeReadQuery).toHaveBeenCalled();
60
+ expect(result.sql).toContain("INSERT INTO `users`");
61
+ expect(result.sql).toContain("Alice");
62
+ expect(result.rowCount).toBe(2);
63
+ });
326
64
 
327
- expect(result.command).toContain('--no-data');
328
- expect(result.command).toContain('--single-transaction');
329
- expect(result.command).toContain('users');
330
- });
65
+ it("should export table as CSV format", async () => {
66
+ mockAdapter.executeReadQuery.mockResolvedValue(
67
+ createMockQueryResult([
68
+ { id: 1, name: "Alice", active: true },
69
+ { id: 2, name: "Bob", active: false },
70
+ ]),
71
+ );
72
+
73
+ const tool = createExportTableTool(
74
+ mockAdapter as unknown as MySQLAdapter,
75
+ );
76
+ const result = (await tool.handler(
77
+ { table: "users", format: "CSV" },
78
+ mockContext,
79
+ )) as { csv: string; rowCount: number };
80
+
81
+ expect(result.csv).toContain("id,name,active");
82
+ expect(result.csv).toContain("Alice");
83
+ expect(result.csv).toContain("Bob");
84
+ expect(result.rowCount).toBe(2);
85
+ });
331
86
 
332
- it('should handle missing database gracefully', async () => {
333
- mockAdapter.executeReadQuery.mockResolvedValue(createMockQueryResult([{ db: null }]));
87
+ it("should export empty table", async () => {
88
+ mockAdapter.executeReadQuery.mockResolvedValue(createMockQueryResult([]));
334
89
 
335
- const tool = createCreateDumpTool(mockAdapter as unknown as MySQLAdapter);
336
- const result = await tool.handler({}, mockContext) as { command: string };
90
+ const tool = createExportTableTool(
91
+ mockAdapter as unknown as MySQLAdapter,
92
+ );
93
+ const result = (await tool.handler(
94
+ { table: "empty_table", format: "SQL" },
95
+ mockContext,
96
+ )) as { sql: string; rowCount: number };
337
97
 
338
- expect(result.command).toBeDefined();
339
- });
98
+ expect(result.sql).toBe("");
99
+ expect(result.rowCount).toBe(0);
340
100
  });
341
101
 
342
- describe('createRestoreDumpTool', () => {
343
- it('should create tool with correct definition', () => {
344
- const tool = createRestoreDumpTool(mockAdapter as unknown as MySQLAdapter);
102
+ it("should handle WHERE clause in SQL export", async () => {
103
+ mockAdapter.executeReadQuery.mockResolvedValue(
104
+ createMockQueryResult([{ id: 5, status: "active" }]),
105
+ );
106
+
107
+ const tool = createExportTableTool(
108
+ mockAdapter as unknown as MySQLAdapter,
109
+ );
110
+ await tool.handler(
111
+ { table: "orders", format: "SQL", where: 'status = "active"' },
112
+ mockContext,
113
+ );
114
+
115
+ const call = mockAdapter.executeReadQuery.mock.calls[0][0] as string;
116
+ expect(call).toContain('WHERE status = "active"');
117
+ });
345
118
 
346
- expect(tool.name).toBe('mysql_restore_dump');
347
- expect(tool.group).toBe('backup');
348
- expect(tool.requiredScopes).toContain('admin');
349
- expect(tool.annotations?.readOnlyHint).toBe(false);
350
- });
119
+ it("should handle NULL values in SQL export", async () => {
120
+ mockAdapter.executeReadQuery.mockResolvedValue(
121
+ createMockQueryResult([{ id: 1, name: "Test", description: null }]),
122
+ );
351
123
 
352
- it('should generate mysql restore command for current database', async () => {
353
- mockAdapter.executeReadQuery.mockResolvedValue(createMockQueryResult([{ db: 'testdb' }]));
124
+ const tool = createExportTableTool(
125
+ mockAdapter as unknown as MySQLAdapter,
126
+ );
127
+ const result = (await tool.handler(
128
+ { table: "products", format: "SQL" },
129
+ mockContext,
130
+ )) as { sql: string };
354
131
 
355
- const tool = createRestoreDumpTool(mockAdapter as unknown as MySQLAdapter);
356
- const result = await tool.handler({
357
- filename: 'backup.sql'
358
- }, mockContext) as { command: string; note: string };
132
+ expect(result.sql).toContain("NULL");
133
+ });
359
134
 
360
- expect(mockAdapter.executeReadQuery).toHaveBeenCalledWith('SELECT DATABASE() as db');
361
- expect(result.command).toContain('mysql');
362
- expect(result.command).toContain('testdb');
363
- expect(result.command).toContain('backup.sql');
364
- expect(result.note).toBeDefined();
365
- });
135
+ it("should handle JSON values in SQL export", async () => {
136
+ mockAdapter.executeReadQuery.mockResolvedValue(
137
+ createMockQueryResult([
138
+ { id: 1, metadata: { key: "value", nested: { prop: 123 } } },
139
+ ]),
140
+ );
141
+
142
+ const tool = createExportTableTool(
143
+ mockAdapter as unknown as MySQLAdapter,
144
+ );
145
+ const result = (await tool.handler(
146
+ { table: "items", format: "SQL" },
147
+ mockContext,
148
+ )) as { sql: string };
149
+
150
+ expect(result.sql).toContain("metadata");
151
+ expect(result.sql).toContain("key");
152
+ });
366
153
 
367
- it('should generate mysql restore command with specific database', async () => {
368
- const tool = createRestoreDumpTool(mockAdapter as unknown as MySQLAdapter);
369
- const result = await tool.handler({
370
- database: 'restore_target',
371
- filename: 'dump.sql'
372
- }, mockContext) as { command: string };
154
+ it("should handle object values in CSV export", async () => {
155
+ mockAdapter.executeReadQuery.mockResolvedValue(
156
+ createMockQueryResult([{ id: 1, config: { setting: "value" } }]),
157
+ );
373
158
 
374
- expect(mockAdapter.executeReadQuery).not.toHaveBeenCalled();
375
- expect(result.command).toContain('restore_target');
376
- expect(result.command).toContain('dump.sql');
377
- });
159
+ const tool = createExportTableTool(
160
+ mockAdapter as unknown as MySQLAdapter,
161
+ );
162
+ const result = (await tool.handler(
163
+ { table: "configs", format: "CSV" },
164
+ mockContext,
165
+ )) as { csv: string };
378
166
 
379
- it('should handle various filename formats', async () => {
380
- mockAdapter.executeReadQuery.mockResolvedValue(createMockQueryResult([{ db: 'mydb' }]));
167
+ expect(result.csv).toContain("setting");
168
+ });
381
169
 
382
- const tool = createRestoreDumpTool(mockAdapter as unknown as MySQLAdapter);
170
+ it("should validate table name for SQL injection", async () => {
171
+ const tool = createExportTableTool(
172
+ mockAdapter as unknown as MySQLAdapter,
173
+ );
174
+
175
+ await expect(
176
+ tool.handler(
177
+ { table: "users; DROP TABLE users;--", format: "SQL" },
178
+ mockContext,
179
+ ),
180
+ ).rejects.toThrow();
181
+ });
182
+
183
+ it("should validate WHERE clause for SQL injection", async () => {
184
+ const tool = createExportTableTool(
185
+ mockAdapter as unknown as MySQLAdapter,
186
+ );
187
+
188
+ await expect(
189
+ tool.handler(
190
+ {
191
+ table: "users",
192
+ format: "SQL",
193
+ where: "1=1; DELETE FROM users;--",
194
+ },
195
+ mockContext,
196
+ ),
197
+ ).rejects.toThrow();
198
+ });
199
+
200
+ it("should return exists: false for non-existent table", async () => {
201
+ mockAdapter.executeReadQuery.mockRejectedValue(
202
+ new Error("Table 'testdb.nonexistent' doesn't exist"),
203
+ );
204
+
205
+ const tool = createExportTableTool(
206
+ mockAdapter as unknown as MySQLAdapter,
207
+ );
208
+ const result = (await tool.handler(
209
+ { table: "nonexistent", format: "SQL" },
210
+ mockContext,
211
+ )) as { exists: boolean; table: string };
212
+
213
+ expect(result.exists).toBe(false);
214
+ expect(result.table).toBe("nonexistent");
215
+ });
216
+
217
+ it("should return structured error for query failures", async () => {
218
+ mockAdapter.executeReadQuery.mockRejectedValue(
219
+ new Error("Unknown column 'invalid_col' in 'where clause'"),
220
+ );
221
+
222
+ const tool = createExportTableTool(
223
+ mockAdapter as unknown as MySQLAdapter,
224
+ );
225
+ const result = (await tool.handler(
226
+ { table: "users", format: "SQL", where: "invalid_col = 'bad'" },
227
+ mockContext,
228
+ )) as { success: boolean; error: string };
229
+
230
+ expect(result.success).toBe(false);
231
+ expect(result.error).toContain("Unknown column");
232
+ });
233
+
234
+ it("should generate proper INSERT statements with column names", async () => {
235
+ mockAdapter.executeReadQuery.mockResolvedValue(
236
+ createMockQueryResult([
237
+ { id: 1, email: "test@example.com", created_at: "2024-01-01" },
238
+ ]),
239
+ );
240
+
241
+ const tool = createExportTableTool(
242
+ mockAdapter as unknown as MySQLAdapter,
243
+ );
244
+ const result = (await tool.handler(
245
+ { table: "logs", format: "SQL" },
246
+ mockContext,
247
+ )) as { sql: string };
248
+
249
+ expect(result.sql).toContain("(`id`, `email`, `created_at`)");
250
+ expect(result.sql).toContain("VALUES");
251
+ });
252
+ });
383
253
 
384
- let result = await tool.handler({ filename: '/path/to/backup.sql' }, mockContext) as { command: string };
385
- expect(result.command).toContain('/path/to/backup.sql');
254
+ describe("createImportDataTool", () => {
255
+ it("should create tool with correct definition", () => {
256
+ const tool = createImportDataTool(mockAdapter as unknown as MySQLAdapter);
257
+
258
+ expect(tool.name).toBe("mysql_import_data");
259
+ expect(tool.group).toBe("backup");
260
+ expect(tool.requiredScopes).toContain("write");
261
+ expect(tool.annotations?.readOnlyHint).toBe(false);
262
+ });
263
+
264
+ it("should import data rows", async () => {
265
+ mockAdapter.executeWriteQuery.mockResolvedValue({
266
+ rows: [],
267
+ rowsAffected: 1,
268
+ executionTimeMs: 5,
269
+ });
270
+
271
+ const tool = createImportDataTool(mockAdapter as unknown as MySQLAdapter);
272
+ const result = (await tool.handler(
273
+ {
274
+ table: "users",
275
+ data: [
276
+ { name: "Alice", email: "alice@example.com" },
277
+ { name: "Bob", email: "bob@example.com" },
278
+ ],
279
+ },
280
+ mockContext,
281
+ )) as { success: boolean; rowsInserted: number };
282
+
283
+ expect(mockAdapter.executeWriteQuery).toHaveBeenCalledTimes(2);
284
+ expect(result.success).toBe(true);
285
+ expect(result.rowsInserted).toBe(2);
286
+ });
287
+
288
+ it("should handle empty data array", async () => {
289
+ const tool = createImportDataTool(mockAdapter as unknown as MySQLAdapter);
290
+ const result = (await tool.handler(
291
+ {
292
+ table: "users",
293
+ data: [],
294
+ },
295
+ mockContext,
296
+ )) as { success: boolean; rowsInserted: number };
297
+
298
+ expect(mockAdapter.executeWriteQuery).not.toHaveBeenCalled();
299
+ expect(result.success).toBe(true);
300
+ expect(result.rowsInserted).toBe(0);
301
+ });
302
+
303
+ it("should use parameterized queries", async () => {
304
+ mockAdapter.executeWriteQuery.mockResolvedValue({
305
+ rows: [],
306
+ rowsAffected: 1,
307
+ executionTimeMs: 5,
308
+ });
309
+
310
+ const tool = createImportDataTool(mockAdapter as unknown as MySQLAdapter);
311
+ await tool.handler(
312
+ {
313
+ table: "users",
314
+ data: [{ name: "O'Brien", email: "obrien@example.com" }],
315
+ },
316
+ mockContext,
317
+ );
318
+
319
+ const call = mockAdapter.executeWriteQuery.mock.calls[0][0] as string;
320
+ expect(call).toContain("INSERT INTO");
321
+ expect(call).toContain("?");
322
+ });
323
+
324
+ it("should validate table name for SQL injection", async () => {
325
+ const tool = createImportDataTool(mockAdapter as unknown as MySQLAdapter);
326
+
327
+ await expect(
328
+ tool.handler(
329
+ {
330
+ table: "users; DROP TABLE users;--",
331
+ data: [{ name: "test" }],
332
+ },
333
+ mockContext,
334
+ ),
335
+ ).rejects.toThrow();
336
+ });
337
+
338
+ it("should handle various data types", async () => {
339
+ mockAdapter.executeWriteQuery.mockResolvedValue({
340
+ rows: [],
341
+ rowsAffected: 1,
342
+ executionTimeMs: 5,
343
+ });
344
+
345
+ const tool = createImportDataTool(mockAdapter as unknown as MySQLAdapter);
346
+ await tool.handler(
347
+ {
348
+ table: "mixed",
349
+ data: [
350
+ {
351
+ str: "text",
352
+ num: 42,
353
+ bool: true,
354
+ nul: null,
355
+ obj: { key: "value" },
356
+ },
357
+ ],
358
+ },
359
+ mockContext,
360
+ );
361
+
362
+ expect(mockAdapter.executeWriteQuery).toHaveBeenCalled();
363
+ });
364
+
365
+ it("should return structured error for duplicate key violations", async () => {
366
+ mockAdapter.executeWriteQuery
367
+ .mockResolvedValueOnce({
368
+ rows: [],
369
+ rowsAffected: 1,
370
+ executionTimeMs: 5,
371
+ })
372
+ .mockRejectedValueOnce(
373
+ new Error("Duplicate entry '1' for key 'users.PRIMARY'"),
374
+ );
375
+
376
+ const tool = createImportDataTool(mockAdapter as unknown as MySQLAdapter);
377
+ const result = (await tool.handler(
378
+ {
379
+ table: "users",
380
+ data: [
381
+ { id: 1, name: "First" },
382
+ { id: 1, name: "Duplicate" },
383
+ ],
384
+ },
385
+ mockContext,
386
+ )) as { success: boolean; error: string; rowsInserted: number };
387
+
388
+ expect(result.success).toBe(false);
389
+ expect(result.error).toContain("Duplicate entry");
390
+ expect(result.rowsInserted).toBe(1);
391
+ });
392
+
393
+ it("should return exists: false for non-existent table", async () => {
394
+ mockAdapter.executeWriteQuery.mockRejectedValue(
395
+ new Error("Table 'testdb.nonexistent' doesn't exist"),
396
+ );
397
+
398
+ const tool = createImportDataTool(mockAdapter as unknown as MySQLAdapter);
399
+ const result = (await tool.handler(
400
+ {
401
+ table: "nonexistent",
402
+ data: [{ name: "test" }],
403
+ },
404
+ mockContext,
405
+ )) as { exists: boolean; table: string };
406
+
407
+ expect(result.exists).toBe(false);
408
+ expect(result.table).toBe("nonexistent");
409
+ });
386
410
 
387
- result = await tool.handler({ filename: 'backup.sql.gz' }, mockContext) as { command: string };
388
- expect(result.command).toContain('backup.sql.gz');
389
- });
411
+ it("should return structured error for unknown column", async () => {
412
+ mockAdapter.executeWriteQuery.mockRejectedValue(
413
+ new Error("Unknown column 'nonexistent_col' in 'field list'"),
414
+ );
415
+
416
+ const tool = createImportDataTool(mockAdapter as unknown as MySQLAdapter);
417
+ const result = (await tool.handler(
418
+ {
419
+ table: "users",
420
+ data: [{ nonexistent_col: "test" }],
421
+ },
422
+ mockContext,
423
+ )) as { success: boolean; error: string; rowsInserted: number };
424
+
425
+ expect(result.success).toBe(false);
426
+ expect(result.error).toContain("Unknown column");
427
+ expect(result.rowsInserted).toBe(0);
428
+ });
429
+ });
430
+
431
+ describe("createCreateDumpTool", () => {
432
+ it("should create tool with correct definition", () => {
433
+ const tool = createCreateDumpTool(mockAdapter as unknown as MySQLAdapter);
434
+
435
+ expect(tool.name).toBe("mysql_create_dump");
436
+ expect(tool.group).toBe("backup");
437
+ expect(tool.requiredScopes).toContain("admin");
438
+ expect(tool.annotations?.readOnlyHint).toBe(true);
439
+ });
440
+
441
+ it("should generate mysqldump command for current database", async () => {
442
+ mockAdapter.executeReadQuery.mockResolvedValue(
443
+ createMockQueryResult([{ db: "testdb" }]),
444
+ );
445
+
446
+ const tool = createCreateDumpTool(mockAdapter as unknown as MySQLAdapter);
447
+ const result = (await tool.handler({}, mockContext)) as {
448
+ command: string;
449
+ note: string;
450
+ };
451
+
452
+ expect(mockAdapter.executeReadQuery).toHaveBeenCalledWith(
453
+ "SELECT DATABASE() as db",
454
+ );
455
+ expect(result.command).toContain("mysqldump");
456
+ expect(result.command).toContain("testdb");
457
+ expect(result.note).toBeDefined();
458
+ });
459
+
460
+ it("should generate mysqldump command with specific database", async () => {
461
+ const tool = createCreateDumpTool(mockAdapter as unknown as MySQLAdapter);
462
+ const result = (await tool.handler(
463
+ { database: "production_db" },
464
+ mockContext,
465
+ )) as { command: string };
466
+
467
+ expect(mockAdapter.executeReadQuery).not.toHaveBeenCalled();
468
+ expect(result.command).toContain("production_db");
469
+ });
470
+
471
+ it("should include specific tables in command", async () => {
472
+ mockAdapter.executeReadQuery.mockResolvedValue(
473
+ createMockQueryResult([{ db: "mydb" }]),
474
+ );
475
+
476
+ const tool = createCreateDumpTool(mockAdapter as unknown as MySQLAdapter);
477
+ const result = (await tool.handler(
478
+ {
479
+ tables: ["users", "orders"],
480
+ },
481
+ mockContext,
482
+ )) as { command: string };
483
+
484
+ expect(result.command).toContain("users");
485
+ expect(result.command).toContain("orders");
486
+ });
487
+
488
+ it("should add --no-data flag for schema-only dump", async () => {
489
+ mockAdapter.executeReadQuery.mockResolvedValue(
490
+ createMockQueryResult([{ db: "mydb" }]),
491
+ );
492
+
493
+ const tool = createCreateDumpTool(mockAdapter as unknown as MySQLAdapter);
494
+ const result = (await tool.handler({ noData: true }, mockContext)) as {
495
+ command: string;
496
+ };
497
+
498
+ expect(result.command).toContain("--no-data");
499
+ });
500
+
501
+ it("should add --single-transaction flag when specified", async () => {
502
+ mockAdapter.executeReadQuery.mockResolvedValue(
503
+ createMockQueryResult([{ db: "mydb" }]),
504
+ );
505
+
506
+ const tool = createCreateDumpTool(mockAdapter as unknown as MySQLAdapter);
507
+ const result = (await tool.handler(
508
+ { singleTransaction: true },
509
+ mockContext,
510
+ )) as { command: string };
511
+
512
+ expect(result.command).toContain("--single-transaction");
513
+ });
514
+
515
+ it("should combine multiple options", async () => {
516
+ mockAdapter.executeReadQuery.mockResolvedValue(
517
+ createMockQueryResult([{ db: "mydb" }]),
518
+ );
519
+
520
+ const tool = createCreateDumpTool(mockAdapter as unknown as MySQLAdapter);
521
+ const result = (await tool.handler(
522
+ {
523
+ tables: ["users"],
524
+ noData: true,
525
+ singleTransaction: true,
526
+ },
527
+ mockContext,
528
+ )) as { command: string };
529
+
530
+ expect(result.command).toContain("--no-data");
531
+ expect(result.command).toContain("--single-transaction");
532
+ expect(result.command).toContain("users");
533
+ });
534
+
535
+ it("should handle missing database gracefully", async () => {
536
+ mockAdapter.executeReadQuery.mockResolvedValue(
537
+ createMockQueryResult([{ db: null }]),
538
+ );
539
+
540
+ const tool = createCreateDumpTool(mockAdapter as unknown as MySQLAdapter);
541
+ const result = (await tool.handler({}, mockContext)) as {
542
+ command: string;
543
+ };
544
+
545
+ expect(result.command).toBeDefined();
546
+ });
547
+ });
548
+
549
+ describe("createRestoreDumpTool", () => {
550
+ it("should create tool with correct definition", () => {
551
+ const tool = createRestoreDumpTool(
552
+ mockAdapter as unknown as MySQLAdapter,
553
+ );
554
+
555
+ expect(tool.name).toBe("mysql_restore_dump");
556
+ expect(tool.group).toBe("backup");
557
+ expect(tool.requiredScopes).toContain("admin");
558
+ expect(tool.annotations?.readOnlyHint).toBe(false);
559
+ });
560
+
561
+ it("should generate mysql restore command for current database", async () => {
562
+ mockAdapter.executeReadQuery.mockResolvedValue(
563
+ createMockQueryResult([{ db: "testdb" }]),
564
+ );
565
+
566
+ const tool = createRestoreDumpTool(
567
+ mockAdapter as unknown as MySQLAdapter,
568
+ );
569
+ const result = (await tool.handler(
570
+ {
571
+ filename: "backup.sql",
572
+ },
573
+ mockContext,
574
+ )) as { command: string; note: string };
575
+
576
+ expect(mockAdapter.executeReadQuery).toHaveBeenCalledWith(
577
+ "SELECT DATABASE() as db",
578
+ );
579
+ expect(result.command).toContain("mysql");
580
+ expect(result.command).toContain("testdb");
581
+ expect(result.command).toContain("backup.sql");
582
+ expect(result.note).toBeDefined();
583
+ });
584
+
585
+ it("should generate mysql restore command with specific database", async () => {
586
+ const tool = createRestoreDumpTool(
587
+ mockAdapter as unknown as MySQLAdapter,
588
+ );
589
+ const result = (await tool.handler(
590
+ {
591
+ database: "restore_target",
592
+ filename: "dump.sql",
593
+ },
594
+ mockContext,
595
+ )) as { command: string };
596
+
597
+ expect(mockAdapter.executeReadQuery).not.toHaveBeenCalled();
598
+ expect(result.command).toContain("restore_target");
599
+ expect(result.command).toContain("dump.sql");
600
+ });
601
+
602
+ it("should handle various filename formats", async () => {
603
+ mockAdapter.executeReadQuery.mockResolvedValue(
604
+ createMockQueryResult([{ db: "mydb" }]),
605
+ );
606
+
607
+ const tool = createRestoreDumpTool(
608
+ mockAdapter as unknown as MySQLAdapter,
609
+ );
610
+
611
+ let result = (await tool.handler(
612
+ { filename: "/path/to/backup.sql" },
613
+ mockContext,
614
+ )) as { command: string };
615
+ expect(result.command).toContain("/path/to/backup.sql");
616
+
617
+ result = (await tool.handler(
618
+ { filename: "backup.sql.gz" },
619
+ mockContext,
620
+ )) as { command: string };
621
+ expect(result.command).toContain("backup.sql.gz");
622
+ });
390
623
 
391
- it('should handle missing database gracefully', async () => {
392
- mockAdapter.executeReadQuery.mockResolvedValue(createMockQueryResult([{ db: null }]));
624
+ it("should handle missing database gracefully", async () => {
625
+ mockAdapter.executeReadQuery.mockResolvedValue(
626
+ createMockQueryResult([{ db: null }]),
627
+ );
393
628
 
394
- const tool = createRestoreDumpTool(mockAdapter as unknown as MySQLAdapter);
395
- const result = await tool.handler({ filename: 'backup.sql' }, mockContext) as { command: string };
629
+ const tool = createRestoreDumpTool(
630
+ mockAdapter as unknown as MySQLAdapter,
631
+ );
632
+ const result = (await tool.handler(
633
+ { filename: "backup.sql" },
634
+ mockContext,
635
+ )) as { command: string };
396
636
 
397
- expect(result.command).toBeDefined();
398
- });
637
+ expect(result.command).toBeDefined();
399
638
  });
639
+ });
400
640
  });