@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,422 +1,658 @@
1
1
  /**
2
2
  * mysql-mcp - ProxySQL Tools Unit Tests
3
- *
3
+ *
4
4
  * Tests for proxysql tool definitions, annotations, and handler execution.
5
5
  * Mocks mysql2/promise to test ProxySQL admin interface queries.
6
6
  */
7
7
 
8
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
9
- import { getProxySQLTools } from '../proxysql.js';
10
- import type { MySQLAdapter } from '../../MySQLAdapter.js';
11
- import { createMockMySQLAdapter, createMockRequestContext } from '../../../../__tests__/mocks/index.js';
8
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
9
+ import { getProxySQLTools } from "../proxysql.js";
10
+ import type { MySQLAdapter } from "../../MySQLAdapter.js";
11
+ import {
12
+ createMockMySQLAdapter,
13
+ createMockRequestContext,
14
+ } from "../../../../__tests__/mocks/index.js";
12
15
 
13
16
  // Mock mysql2/promise for ProxySQL connection testing
14
17
  const mockQuery = vi.fn();
15
18
  const mockEnd = vi.fn();
16
19
  const mockCreateConnection = vi.fn();
17
20
 
18
- vi.mock('mysql2/promise', () => ({
19
- default: {
20
- createConnection: (...args: unknown[]) => mockCreateConnection(...args)
21
- }
21
+ vi.mock("mysql2/promise", () => ({
22
+ default: {
23
+ createConnection: (...args: unknown[]) => mockCreateConnection(...args),
24
+ },
22
25
  }));
23
26
 
24
- describe('getProxySQLTools', () => {
25
- let tools: ReturnType<typeof getProxySQLTools>;
27
+ describe("getProxySQLTools", () => {
28
+ let tools: ReturnType<typeof getProxySQLTools>;
26
29
 
27
- beforeEach(() => {
28
- vi.clearAllMocks();
29
- tools = getProxySQLTools(createMockMySQLAdapter() as unknown as MySQLAdapter);
30
- });
30
+ beforeEach(() => {
31
+ vi.clearAllMocks();
32
+ tools = getProxySQLTools(
33
+ createMockMySQLAdapter() as unknown as MySQLAdapter,
34
+ );
35
+ });
31
36
 
32
- it('should return 12 proxysql tools', () => {
33
- expect(tools).toHaveLength(12);
34
- });
37
+ it("should return 12 proxysql tools", () => {
38
+ expect(tools).toHaveLength(12);
39
+ });
35
40
 
36
- it('should have proxysql group for all tools', () => {
37
- for (const tool of tools) {
38
- expect(tool.group).toBe('proxysql');
39
- }
40
- });
41
-
42
- it('should have handler functions for all tools', () => {
43
- for (const tool of tools) {
44
- expect(typeof tool.handler).toBe('function');
45
- }
46
- });
41
+ it("should have proxysql group for all tools", () => {
42
+ for (const tool of tools) {
43
+ expect(tool.group).toBe("proxysql");
44
+ }
45
+ });
47
46
 
48
- it('should have inputSchema for all tools', () => {
49
- for (const tool of tools) {
50
- expect(tool.inputSchema).toBeDefined();
51
- }
52
- });
47
+ it("should have handler functions for all tools", () => {
48
+ for (const tool of tools) {
49
+ expect(typeof tool.handler).toBe("function");
50
+ }
51
+ });
53
52
 
54
- it('should include all expected tool names', () => {
55
- const toolNames = tools.map(t => t.name);
56
- expect(toolNames).toContain('proxysql_status');
57
- expect(toolNames).toContain('proxysql_servers');
58
- expect(toolNames).toContain('proxysql_hostgroups');
59
- expect(toolNames).toContain('proxysql_query_rules');
60
- expect(toolNames).toContain('proxysql_query_digest');
61
- expect(toolNames).toContain('proxysql_connection_pool');
62
- expect(toolNames).toContain('proxysql_users');
63
- expect(toolNames).toContain('proxysql_global_variables');
64
- expect(toolNames).toContain('proxysql_runtime_status');
65
- expect(toolNames).toContain('proxysql_memory_stats');
66
- expect(toolNames).toContain('proxysql_commands');
67
- expect(toolNames).toContain('proxysql_process_list');
68
- });
53
+ it("should have inputSchema for all tools", () => {
54
+ for (const tool of tools) {
55
+ expect(tool.inputSchema).toBeDefined();
56
+ }
57
+ });
58
+
59
+ it("should include all expected tool names", () => {
60
+ const toolNames = tools.map((t) => t.name);
61
+ expect(toolNames).toContain("proxysql_status");
62
+ expect(toolNames).toContain("proxysql_servers");
63
+ expect(toolNames).toContain("proxysql_hostgroups");
64
+ expect(toolNames).toContain("proxysql_query_rules");
65
+ expect(toolNames).toContain("proxysql_query_digest");
66
+ expect(toolNames).toContain("proxysql_connection_pool");
67
+ expect(toolNames).toContain("proxysql_users");
68
+ expect(toolNames).toContain("proxysql_global_variables");
69
+ expect(toolNames).toContain("proxysql_runtime_status");
70
+ expect(toolNames).toContain("proxysql_memory_stats");
71
+ expect(toolNames).toContain("proxysql_commands");
72
+ expect(toolNames).toContain("proxysql_process_list");
73
+ });
69
74
  });
70
75
 
71
- describe('Tool Structure Validation', () => {
72
- let tools: ReturnType<typeof getProxySQLTools>;
73
-
74
- beforeEach(() => {
75
- vi.clearAllMocks();
76
- tools = getProxySQLTools(createMockMySQLAdapter() as unknown as MySQLAdapter);
77
- });
78
-
79
- it('proxysql_status should have correct structure', () => {
80
- const tool = tools.find(t => t.name === 'proxysql_status')!;
81
- expect(tool.name).toBe('proxysql_status');
82
- expect(tool.description).toBeDefined();
83
- expect(tool.annotations?.readOnlyHint).toBe(true);
84
- expect(tool.annotations?.openWorldHint).toBe(true);
85
- });
76
+ describe("Tool Structure Validation", () => {
77
+ let tools: ReturnType<typeof getProxySQLTools>;
78
+
79
+ beforeEach(() => {
80
+ vi.clearAllMocks();
81
+ tools = getProxySQLTools(
82
+ createMockMySQLAdapter() as unknown as MySQLAdapter,
83
+ );
84
+ });
85
+
86
+ it("proxysql_status should have correct structure", () => {
87
+ const tool = tools.find((t) => t.name === "proxysql_status")!;
88
+ expect(tool.name).toBe("proxysql_status");
89
+ expect(tool.description).toBeDefined();
90
+ expect(tool.annotations?.readOnlyHint).toBe(true);
91
+ expect(tool.annotations?.openWorldHint).toBe(true);
92
+ });
93
+
94
+ it("proxysql_query_digest should be read-only", () => {
95
+ const tool = tools.find((t) => t.name === "proxysql_query_digest")!;
96
+ expect(tool.annotations?.readOnlyHint).toBe(true);
97
+ });
98
+
99
+ it("proxysql_commands should require admin scope", () => {
100
+ const tool = tools.find((t) => t.name === "proxysql_commands")!;
101
+ expect(tool.requiredScopes).toContain("admin");
102
+ });
103
+
104
+ it("all read-only tools should have read scope", () => {
105
+ const readOnlyTools = tools.filter((t) => t.annotations?.readOnlyHint);
106
+ for (const tool of readOnlyTools) {
107
+ expect(tool.requiredScopes).toContain("read");
108
+ }
109
+ });
86
110
 
87
- it('proxysql_query_digest should be read-only', () => {
88
- const tool = tools.find(t => t.name === 'proxysql_query_digest')!;
89
- expect(tool.annotations?.readOnlyHint).toBe(true);
90
- });
111
+ it("all tools should have openWorldHint true", () => {
112
+ for (const tool of tools) {
113
+ expect(tool.annotations?.openWorldHint).toBe(true);
114
+ }
115
+ });
116
+ });
91
117
 
92
- it('proxysql_commands should require admin scope', () => {
93
- const tool = tools.find(t => t.name === 'proxysql_commands')!;
94
- expect(tool.requiredScopes).toContain('admin');
118
+ describe("Handler Execution", () => {
119
+ let tools: ReturnType<typeof getProxySQLTools>;
120
+ let mockContext: ReturnType<typeof createMockRequestContext>;
121
+
122
+ beforeEach(() => {
123
+ vi.clearAllMocks();
124
+ tools = getProxySQLTools(
125
+ createMockMySQLAdapter() as unknown as MySQLAdapter,
126
+ );
127
+ mockContext = createMockRequestContext();
128
+
129
+ // Setup mock connection
130
+ mockCreateConnection.mockResolvedValue({
131
+ query: mockQuery,
132
+ end: mockEnd,
95
133
  });
96
-
97
- it('all read-only tools should have read scope', () => {
98
- const readOnlyTools = tools.filter(t => t.annotations?.readOnlyHint);
99
- for (const tool of readOnlyTools) {
100
- expect(tool.requiredScopes).toContain('read');
101
- }
134
+ });
135
+
136
+ afterEach(() => {
137
+ vi.restoreAllMocks();
138
+ });
139
+
140
+ describe("proxysql_status", () => {
141
+ it("should query stats_mysql_global and return stats", async () => {
142
+ const mockStats = [
143
+ { Variable_Name: "Client_Connections_connected", Variable_Value: "10" },
144
+ { Variable_Name: "Server_Connections_connected", Variable_Value: "5" },
145
+ ];
146
+ mockQuery.mockResolvedValue([mockStats]);
147
+
148
+ const tool = tools.find((t) => t.name === "proxysql_status")!;
149
+ const result = await tool.handler({}, mockContext);
150
+
151
+ expect(mockCreateConnection).toHaveBeenCalled();
152
+ expect(mockQuery).toHaveBeenCalledWith(
153
+ "SELECT * FROM stats_mysql_global",
154
+ );
155
+ expect(mockEnd).toHaveBeenCalled();
156
+ expect(result).toEqual({
157
+ success: true,
158
+ summary: false,
159
+ stats: mockStats,
160
+ totalVarsAvailable: 2,
161
+ });
102
162
  });
103
-
104
- it('all tools should have openWorldHint true', () => {
105
- for (const tool of tools) {
106
- expect(tool.annotations?.openWorldHint).toBe(true);
107
- }
163
+ });
164
+
165
+ describe("proxysql_runtime_status", () => {
166
+ it("should return version and admin variables", async () => {
167
+ mockQuery
168
+ .mockResolvedValueOnce([[{ variable_value: "3.0.3" }]])
169
+ .mockResolvedValueOnce([
170
+ [{ variable_name: "admin-read_only", variable_value: "false" }],
171
+ ]);
172
+
173
+ const tool = tools.find((t) => t.name === "proxysql_runtime_status")!;
174
+ const result = await tool.handler({}, mockContext);
175
+
176
+ expect(mockQuery).toHaveBeenCalledWith(
177
+ "SELECT variable_value FROM global_variables WHERE variable_name = 'admin-version'",
178
+ );
179
+ expect(result).toHaveProperty("success", true);
180
+ expect(result).toHaveProperty("version", "3.0.3");
181
+ expect(result).toHaveProperty("summary", false);
182
+ expect(result).toHaveProperty("totalAdminVarsAvailable", 1);
108
183
  });
109
- });
110
184
 
111
- describe('Handler Execution', () => {
112
- let tools: ReturnType<typeof getProxySQLTools>;
113
- let mockContext: ReturnType<typeof createMockRequestContext>;
185
+ it("should handle missing version", async () => {
186
+ mockQuery.mockResolvedValueOnce([[{}]]).mockResolvedValueOnce([[]]);
114
187
 
115
- beforeEach(() => {
116
- vi.clearAllMocks();
117
- tools = getProxySQLTools(createMockMySQLAdapter() as unknown as MySQLAdapter);
118
- mockContext = createMockRequestContext();
188
+ const tool = tools.find((t) => t.name === "proxysql_runtime_status")!;
189
+ const result = await tool.handler({}, mockContext);
119
190
 
120
- // Setup mock connection
121
- mockCreateConnection.mockResolvedValue({
122
- query: mockQuery,
123
- end: mockEnd
124
- });
191
+ expect(result).toHaveProperty("version", "unknown");
125
192
  });
126
193
 
127
- afterEach(() => {
128
- vi.restoreAllMocks();
194
+ it("should redact sensitive admin variables", async () => {
195
+ mockQuery
196
+ .mockResolvedValueOnce([[{ variable_value: "3.0.3" }]])
197
+ .mockResolvedValueOnce([
198
+ [
199
+ { variable_name: "admin-read_only", variable_value: "false" },
200
+ {
201
+ variable_name: "admin-admin_credentials",
202
+ variable_value: "admin:admin",
203
+ },
204
+ {
205
+ variable_name: "admin-cluster_password",
206
+ variable_value: "secret123",
207
+ },
208
+ ],
209
+ ]);
210
+
211
+ const tool = tools.find((t) => t.name === "proxysql_runtime_status")!;
212
+ const result = (await tool.handler({}, mockContext)) as {
213
+ adminVariables: { variable_name: string; variable_value: string }[];
214
+ };
215
+
216
+ const credVar = result.adminVariables.find(
217
+ (v) => v.variable_name === "admin-admin_credentials",
218
+ );
219
+ expect(credVar?.variable_value).toBe("********");
220
+
221
+ const pwVar = result.adminVariables.find(
222
+ (v) => v.variable_name === "admin-cluster_password",
223
+ );
224
+ expect(pwVar?.variable_value).toBe("********");
225
+
226
+ const safeVar = result.adminVariables.find(
227
+ (v) => v.variable_name === "admin-read_only",
228
+ );
229
+ expect(safeVar?.variable_value).toBe("false");
129
230
  });
130
231
 
131
- describe('proxysql_status', () => {
132
- it('should query stats_mysql_global and return stats', async () => {
133
- const mockStats = [
134
- { Variable_Name: 'Client_Connections_connected', Variable_Value: '10' },
135
- { Variable_Name: 'Server_Connections_connected', Variable_Value: '5' }
136
- ];
137
- mockQuery.mockResolvedValue([mockStats]);
138
-
139
- const tool = tools.find(t => t.name === 'proxysql_status')!;
140
- const result = await tool.handler({}, mockContext);
141
-
142
- expect(mockCreateConnection).toHaveBeenCalled();
143
- expect(mockQuery).toHaveBeenCalledWith('SELECT * FROM stats_mysql_global');
144
- expect(mockEnd).toHaveBeenCalled();
145
- expect(result).toEqual({
146
- success: true,
147
- stats: mockStats
148
- });
149
- });
232
+ it("should return summary with key variables only when summary: true", async () => {
233
+ const mockAdminVars = [
234
+ { variable_name: "admin-version", variable_value: "3.0.3" },
235
+ { variable_name: "admin-read_only", variable_value: "false" },
236
+ { variable_name: "admin-mysql_ifaces", variable_value: "0.0.0.0:6032" },
237
+ { variable_name: "admin-restapi_enabled", variable_value: "true" },
238
+ {
239
+ variable_name: "admin-admin_credentials",
240
+ variable_value: "admin:admin",
241
+ },
242
+ {
243
+ variable_name: "admin-cluster_password",
244
+ variable_value: "secret",
245
+ },
246
+ {
247
+ variable_name: "admin-hash_passwords",
248
+ variable_value: "true",
249
+ },
250
+ {
251
+ variable_name: "admin-refresh_interval",
252
+ variable_value: "2000",
253
+ },
254
+ ];
255
+ mockQuery
256
+ .mockResolvedValueOnce([[{ variable_value: "3.0.3" }]])
257
+ .mockResolvedValueOnce([mockAdminVars]);
258
+
259
+ const tool = tools.find((t) => t.name === "proxysql_runtime_status")!;
260
+ const result = (await tool.handler({ summary: true }, mockContext)) as {
261
+ success: boolean;
262
+ summary: boolean;
263
+ version: string;
264
+ adminVariables: { variable_name: string; variable_value: string }[];
265
+ totalAdminVarsAvailable: number;
266
+ };
267
+
268
+ expect(result.success).toBe(true);
269
+ expect(result.summary).toBe(true);
270
+ expect(result.version).toBe("3.0.3");
271
+ // Should have fewer variables than the full list
272
+ expect(result.adminVariables.length).toBeLessThan(mockAdminVars.length);
273
+ expect(result.totalAdminVarsAvailable).toBe(mockAdminVars.length);
274
+ // Should include key variables
275
+ const varNames = result.adminVariables.map((v) => v.variable_name);
276
+ expect(varNames).toContain("admin-version");
277
+ expect(varNames).toContain("admin-read_only");
278
+ expect(varNames).toContain("admin-mysql_ifaces");
279
+ // Should NOT include non-key variables
280
+ expect(varNames).not.toContain("admin-hash_passwords");
281
+ expect(varNames).not.toContain("admin-refresh_interval");
282
+ });
283
+ });
284
+
285
+ describe("proxysql_servers", () => {
286
+ it("should list all servers without hostgroup filter", async () => {
287
+ const mockServers = [
288
+ { hostgroup_id: 1, hostname: "mysql1", port: 3306, status: "ONLINE" },
289
+ { hostgroup_id: 2, hostname: "mysql2", port: 3306, status: "ONLINE" },
290
+ ];
291
+ mockQuery.mockResolvedValue([mockServers]);
292
+
293
+ const tool = tools.find((t) => t.name === "proxysql_servers")!;
294
+ const result = await tool.handler({}, mockContext);
295
+
296
+ expect(mockQuery).toHaveBeenCalledWith("SELECT * FROM mysql_servers");
297
+ expect(result).toEqual({
298
+ success: true,
299
+ servers: mockServers,
300
+ count: 2,
301
+ });
150
302
  });
151
303
 
152
- describe('proxysql_runtime_status', () => {
153
- it('should return version and admin variables', async () => {
154
- mockQuery
155
- .mockResolvedValueOnce([[{ variable_value: '3.0.3' }]])
156
- .mockResolvedValueOnce([[{ variable_name: 'admin-read_only', variable_value: 'false' }]]);
157
-
158
- const tool = tools.find(t => t.name === 'proxysql_runtime_status')!;
159
- const result = await tool.handler({}, mockContext);
160
-
161
- expect(mockQuery).toHaveBeenCalledWith("SELECT variable_value FROM global_variables WHERE variable_name = 'admin-version'");
162
- expect(result).toHaveProperty('success', true);
163
- expect(result).toHaveProperty('version', '3.0.3');
164
- });
165
-
166
- it('should handle missing version', async () => {
167
- mockQuery
168
- .mockResolvedValueOnce([[{}]])
169
- .mockResolvedValueOnce([[]]);
170
-
171
- const tool = tools.find(t => t.name === 'proxysql_runtime_status')!;
172
- const result = await tool.handler({}, mockContext);
304
+ it("should filter by hostgroup_id when provided", async () => {
305
+ const mockServers = [{ hostgroup_id: 1, hostname: "mysql1", port: 3306 }];
306
+ mockQuery.mockResolvedValue([mockServers]);
173
307
 
174
- expect(result).toHaveProperty('version', 'unknown');
175
- });
176
- });
308
+ const tool = tools.find((t) => t.name === "proxysql_servers")!;
309
+ const result = await tool.handler({ hostgroup_id: 1 }, mockContext);
177
310
 
178
- describe('proxysql_servers', () => {
179
- it('should list all servers without hostgroup filter', async () => {
180
- const mockServers = [
181
- { hostgroup_id: 1, hostname: 'mysql1', port: 3306, status: 'ONLINE' },
182
- { hostgroup_id: 2, hostname: 'mysql2', port: 3306, status: 'ONLINE' }
183
- ];
184
- mockQuery.mockResolvedValue([mockServers]);
185
-
186
- const tool = tools.find(t => t.name === 'proxysql_servers')!;
187
- const result = await tool.handler({}, mockContext);
188
-
189
- expect(mockQuery).toHaveBeenCalledWith('SELECT * FROM mysql_servers');
190
- expect(result).toEqual({
191
- success: true,
192
- servers: mockServers,
193
- count: 2
194
- });
195
- });
196
-
197
- it('should filter by hostgroup_id when provided', async () => {
198
- const mockServers = [{ hostgroup_id: 1, hostname: 'mysql1', port: 3306 }];
199
- mockQuery.mockResolvedValue([mockServers]);
200
-
201
- const tool = tools.find(t => t.name === 'proxysql_servers')!;
202
- const result = await tool.handler({ hostgroup_id: 1 }, mockContext);
203
-
204
- expect(mockQuery).toHaveBeenCalledWith('SELECT * FROM mysql_servers WHERE hostgroup_id = 1');
205
- expect(result).toHaveProperty('count', 1);
206
- });
311
+ expect(mockQuery).toHaveBeenCalledWith(
312
+ "SELECT * FROM mysql_servers WHERE hostgroup_id = 1",
313
+ );
314
+ expect(result).toHaveProperty("count", 1);
207
315
  });
208
-
209
- describe('proxysql_hostgroups', () => {
210
- it('should return connection pool stats', async () => {
211
- const mockPools = [
212
- { hostgroup: 1, srv_host: 'mysql1', ConnUsed: 5, ConnFree: 10 }
213
- ];
214
- mockQuery.mockResolvedValue([mockPools]);
215
-
216
- const tool = tools.find(t => t.name === 'proxysql_hostgroups')!;
217
- const result = await tool.handler({}, mockContext);
218
-
219
- expect(mockQuery).toHaveBeenCalledWith('SELECT * FROM stats_mysql_connection_pool');
220
- expect(result).toEqual({
221
- success: true,
222
- hostgroups: mockPools
223
- });
224
- });
316
+ });
317
+
318
+ describe("proxysql_hostgroups", () => {
319
+ it("should return connection pool stats", async () => {
320
+ const mockPools = [
321
+ { hostgroup: 1, srv_host: "mysql1", ConnUsed: 5, ConnFree: 10 },
322
+ ];
323
+ mockQuery.mockResolvedValue([mockPools]);
324
+
325
+ const tool = tools.find((t) => t.name === "proxysql_hostgroups")!;
326
+ const result = await tool.handler({}, mockContext);
327
+
328
+ expect(mockQuery).toHaveBeenCalledWith(
329
+ "SELECT * FROM stats_mysql_connection_pool",
330
+ );
331
+ expect(result).toEqual({
332
+ success: true,
333
+ hostgroups: mockPools,
334
+ count: 1,
335
+ });
225
336
  });
337
+ });
226
338
 
227
- describe('proxysql_query_rules', () => {
228
- it('should return query rules with default limit', async () => {
229
- const mockRules = [{ rule_id: 1, match_pattern: 'SELECT.*' }];
230
- mockQuery.mockResolvedValue([mockRules]);
231
-
232
- const tool = tools.find(t => t.name === 'proxysql_query_rules')!;
233
- const result = await tool.handler({}, mockContext);
339
+ describe("proxysql_query_rules", () => {
340
+ it("should return query rules with default limit", async () => {
341
+ const mockRules = [{ rule_id: 1, match_pattern: "SELECT.*" }];
342
+ mockQuery.mockResolvedValue([mockRules]);
234
343
 
235
- expect(mockQuery).toHaveBeenCalledWith('SELECT * FROM mysql_query_rules LIMIT 100');
236
- expect(result).toHaveProperty('queryRules', mockRules);
237
- });
344
+ const tool = tools.find((t) => t.name === "proxysql_query_rules")!;
345
+ const result = await tool.handler({}, mockContext);
238
346
 
239
- it('should respect custom limit', async () => {
240
- mockQuery.mockResolvedValue([[]]);
241
-
242
- const tool = tools.find(t => t.name === 'proxysql_query_rules')!;
243
- await tool.handler({ limit: 10 }, mockContext);
244
-
245
- expect(mockQuery).toHaveBeenCalledWith('SELECT * FROM mysql_query_rules LIMIT 10');
246
- });
347
+ expect(mockQuery).toHaveBeenCalledWith(
348
+ "SELECT * FROM mysql_query_rules LIMIT 100",
349
+ );
350
+ expect(result).toHaveProperty("queryRules", mockRules);
247
351
  });
248
352
 
249
- describe('proxysql_query_digest', () => {
250
- it('should return top queries by count', async () => {
251
- const mockDigests = [
252
- { digest: 'abc123', digest_text: 'SELECT ?', count_star: 1000, sum_time: 5000 }
253
- ];
254
- mockQuery.mockResolvedValue([mockDigests]);
255
-
256
- const tool = tools.find(t => t.name === 'proxysql_query_digest')!;
257
- const result = await tool.handler({}, mockContext);
353
+ it("should respect custom limit", async () => {
354
+ mockQuery.mockResolvedValue([[]]);
258
355
 
259
- expect(mockQuery).toHaveBeenCalledWith(expect.stringContaining('ORDER BY count_star DESC'));
260
- expect(result).toHaveProperty('queryDigests', mockDigests);
261
- });
356
+ const tool = tools.find((t) => t.name === "proxysql_query_rules")!;
357
+ await tool.handler({ limit: 10 }, mockContext);
262
358
 
263
- it('should respect custom limit', async () => {
264
- mockQuery.mockResolvedValue([[]]);
265
-
266
- const tool = tools.find(t => t.name === 'proxysql_query_digest')!;
267
- await tool.handler({ limit: 25 }, mockContext);
268
-
269
- expect(mockQuery).toHaveBeenCalledWith(expect.stringContaining('LIMIT 25'));
270
- });
359
+ expect(mockQuery).toHaveBeenCalledWith(
360
+ "SELECT * FROM mysql_query_rules LIMIT 10",
361
+ );
271
362
  });
272
-
273
- describe('proxysql_connection_pool', () => {
274
- it('should return all connection pools', async () => {
275
- const mockPools = [{ hostgroup: 1, srv_host: 'localhost' }];
276
- mockQuery.mockResolvedValue([mockPools]);
277
-
278
- const tool = tools.find(t => t.name === 'proxysql_connection_pool')!;
279
- const result = await tool.handler({}, mockContext);
280
-
281
- expect(mockQuery).toHaveBeenCalledWith('SELECT * FROM stats_mysql_connection_pool');
282
- expect(result).toHaveProperty('connectionPools', mockPools);
283
- });
284
-
285
- it('should filter by hostgroup', async () => {
286
- mockQuery.mockResolvedValue([[]]);
287
-
288
- const tool = tools.find(t => t.name === 'proxysql_connection_pool')!;
289
- await tool.handler({ hostgroup_id: 2 }, mockContext);
290
-
291
- expect(mockQuery).toHaveBeenCalledWith('SELECT * FROM stats_mysql_connection_pool WHERE hostgroup = 2');
292
- });
363
+ });
364
+
365
+ describe("proxysql_query_digest", () => {
366
+ it("should return top queries by count", async () => {
367
+ const mockDigests = [
368
+ {
369
+ digest: "abc123",
370
+ digest_text: "SELECT ?",
371
+ count_star: 1000,
372
+ sum_time: 5000,
373
+ },
374
+ ];
375
+ mockQuery.mockResolvedValue([mockDigests]);
376
+
377
+ const tool = tools.find((t) => t.name === "proxysql_query_digest")!;
378
+ const result = await tool.handler({}, mockContext);
379
+
380
+ expect(mockQuery).toHaveBeenCalledWith(
381
+ expect.stringContaining("ORDER BY count_star DESC"),
382
+ );
383
+ expect(result).toHaveProperty("queryDigests", mockDigests);
293
384
  });
294
385
 
295
- describe('proxysql_users', () => {
296
- it('should return users without passwords', async () => {
297
- const mockUsers = [
298
- { username: 'app_user', active: 1, default_hostgroup: 1 }
299
- ];
300
- mockQuery.mockResolvedValue([mockUsers]);
386
+ it("should respect custom limit", async () => {
387
+ mockQuery.mockResolvedValue([[]]);
301
388
 
302
- const tool = tools.find(t => t.name === 'proxysql_users')!;
303
- const result = await tool.handler({}, mockContext);
389
+ const tool = tools.find((t) => t.name === "proxysql_query_digest")!;
390
+ await tool.handler({ limit: 25 }, mockContext);
304
391
 
305
- // Should not include password column
306
- expect(mockQuery).toHaveBeenCalledWith(expect.not.stringContaining('password'));
307
- expect(result).toHaveProperty('users', mockUsers);
308
- });
392
+ expect(mockQuery).toHaveBeenCalledWith(
393
+ expect.stringContaining("LIMIT 25"),
394
+ );
309
395
  });
396
+ });
310
397
 
311
- describe('proxysql_global_variables', () => {
312
- it('should return all variables by default', async () => {
313
- const mockVars = [{ variable_name: 'mysql-threads', variable_value: '4' }];
314
- mockQuery.mockResolvedValue([mockVars]);
398
+ describe("proxysql_connection_pool", () => {
399
+ it("should return all connection pools", async () => {
400
+ const mockPools = [{ hostgroup: 1, srv_host: "localhost" }];
401
+ mockQuery.mockResolvedValue([mockPools]);
315
402
 
316
- const tool = tools.find(t => t.name === 'proxysql_global_variables')!;
317
- const result = await tool.handler({}, mockContext);
403
+ const tool = tools.find((t) => t.name === "proxysql_connection_pool")!;
404
+ const result = await tool.handler({}, mockContext);
318
405
 
319
- expect(mockQuery).toHaveBeenCalledWith('SELECT * FROM global_variables');
320
- expect(result).toHaveProperty('variables', mockVars);
321
- });
406
+ expect(mockQuery).toHaveBeenCalledWith(
407
+ "SELECT * FROM stats_mysql_connection_pool",
408
+ );
409
+ expect(result).toHaveProperty("connectionPools", mockPools);
410
+ });
322
411
 
323
- it('should filter by mysql prefix', async () => {
324
- mockQuery.mockResolvedValue([[]]);
412
+ it("should filter by hostgroup", async () => {
413
+ mockQuery.mockResolvedValue([[]]);
325
414
 
326
- const tool = tools.find(t => t.name === 'proxysql_global_variables')!;
327
- await tool.handler({ prefix: 'mysql' }, mockContext);
415
+ const tool = tools.find((t) => t.name === "proxysql_connection_pool")!;
416
+ await tool.handler({ hostgroup_id: 2 }, mockContext);
328
417
 
329
- expect(mockQuery).toHaveBeenCalledWith("SELECT * FROM global_variables WHERE variable_name LIKE 'mysql-%'");
330
- });
418
+ expect(mockQuery).toHaveBeenCalledWith(
419
+ "SELECT * FROM stats_mysql_connection_pool WHERE hostgroup = 2",
420
+ );
421
+ });
422
+ });
423
+
424
+ describe("proxysql_users", () => {
425
+ it("should return users without passwords", async () => {
426
+ const mockUsers = [
427
+ { username: "app_user", active: 1, default_hostgroup: 1 },
428
+ ];
429
+ mockQuery.mockResolvedValue([mockUsers]);
430
+
431
+ const tool = tools.find((t) => t.name === "proxysql_users")!;
432
+ const result = await tool.handler({}, mockContext);
433
+
434
+ // Should not include password column
435
+ expect(mockQuery).toHaveBeenCalledWith(
436
+ expect.not.stringContaining("password"),
437
+ );
438
+ expect(result).toHaveProperty("users", mockUsers);
439
+ });
440
+ });
441
+
442
+ describe("proxysql_global_variables", () => {
443
+ it("should return all variables by default", async () => {
444
+ const mockVars = [
445
+ { variable_name: "mysql-threads", variable_value: "4" },
446
+ ];
447
+ mockQuery
448
+ .mockResolvedValueOnce([[{ cnt: 1 }]])
449
+ .mockResolvedValueOnce([mockVars]);
450
+
451
+ const tool = tools.find((t) => t.name === "proxysql_global_variables")!;
452
+ const result = await tool.handler({}, mockContext);
453
+
454
+ expect(mockQuery).toHaveBeenCalledWith(
455
+ "SELECT COUNT(*) AS cnt FROM global_variables",
456
+ );
457
+ expect(mockQuery).toHaveBeenCalledWith(
458
+ "SELECT * FROM global_variables LIMIT 50",
459
+ );
460
+ expect(result).toHaveProperty("variables", mockVars);
461
+ expect(result).toHaveProperty("totalVarsAvailable", 1);
462
+ });
331
463
 
332
- it('should filter by admin prefix', async () => {
333
- mockQuery.mockResolvedValue([[]]);
464
+ it("should filter by mysql prefix", async () => {
465
+ mockQuery
466
+ .mockResolvedValueOnce([[{ cnt: 0 }]])
467
+ .mockResolvedValueOnce([[]]);
334
468
 
335
- const tool = tools.find(t => t.name === 'proxysql_global_variables')!;
336
- await tool.handler({ prefix: 'admin' }, mockContext);
469
+ const tool = tools.find((t) => t.name === "proxysql_global_variables")!;
470
+ await tool.handler({ prefix: "mysql" }, mockContext);
337
471
 
338
- expect(mockQuery).toHaveBeenCalledWith("SELECT * FROM global_variables WHERE variable_name LIKE 'admin-%'");
339
- });
472
+ expect(mockQuery).toHaveBeenCalledWith(
473
+ "SELECT COUNT(*) AS cnt FROM global_variables WHERE variable_name LIKE 'mysql-%'",
474
+ );
475
+ expect(mockQuery).toHaveBeenCalledWith(
476
+ "SELECT * FROM global_variables WHERE variable_name LIKE 'mysql-%' LIMIT 50",
477
+ );
340
478
  });
341
479
 
342
- describe('proxysql_memory_stats', () => {
343
- it('should return memory metrics', async () => {
344
- const mockMemory = [{ Variable_Name: 'SQLite3_memory_bytes', Variable_Value: '1048576' }];
345
- mockQuery.mockResolvedValue([mockMemory]);
480
+ it("should filter by admin prefix", async () => {
481
+ mockQuery
482
+ .mockResolvedValueOnce([[{ cnt: 0 }]])
483
+ .mockResolvedValueOnce([[]]);
346
484
 
347
- const tool = tools.find(t => t.name === 'proxysql_memory_stats')!;
348
- const result = await tool.handler({}, mockContext);
485
+ const tool = tools.find((t) => t.name === "proxysql_global_variables")!;
486
+ await tool.handler({ prefix: "admin" }, mockContext);
349
487
 
350
- expect(mockQuery).toHaveBeenCalledWith('SELECT * FROM stats_memory_metrics');
351
- expect(result).toEqual({
352
- success: true,
353
- memoryStats: mockMemory
354
- });
355
- });
488
+ expect(mockQuery).toHaveBeenCalledWith(
489
+ "SELECT COUNT(*) AS cnt FROM global_variables WHERE variable_name LIKE 'admin-%'",
490
+ );
491
+ expect(mockQuery).toHaveBeenCalledWith(
492
+ "SELECT * FROM global_variables WHERE variable_name LIKE 'admin-%' LIMIT 50",
493
+ );
356
494
  });
357
495
 
358
- describe('proxysql_commands', () => {
359
- it('should execute admin command', async () => {
360
- mockQuery.mockResolvedValue([]);
496
+ it("should respect custom limit", async () => {
497
+ mockQuery
498
+ .mockResolvedValueOnce([[{ cnt: 0 }]])
499
+ .mockResolvedValueOnce([[]]);
361
500
 
362
- const tool = tools.find(t => t.name === 'proxysql_commands')!;
363
- const result = await tool.handler({ command: 'LOAD MYSQL USERS TO RUNTIME' }, mockContext);
501
+ const tool = tools.find((t) => t.name === "proxysql_global_variables")!;
502
+ await tool.handler({ limit: 50 }, mockContext);
364
503
 
365
- expect(mockQuery).toHaveBeenCalledWith('LOAD MYSQL USERS TO RUNTIME');
366
- expect(result).toEqual({
367
- success: true,
368
- command: 'LOAD MYSQL USERS TO RUNTIME',
369
- message: 'Command executed: LOAD MYSQL USERS TO RUNTIME'
370
- });
371
- });
504
+ expect(mockQuery).toHaveBeenCalledWith(
505
+ "SELECT * FROM global_variables LIMIT 50",
506
+ );
372
507
  });
373
508
 
374
- describe('proxysql_process_list', () => {
375
- it('should return active processes', async () => {
376
- const mockProcesses = [
377
- { ThreadID: 1, user: 'app', db: 'test', command: 'Query' }
378
- ];
379
- mockQuery.mockResolvedValue([mockProcesses]);
380
-
381
- const tool = tools.find(t => t.name === 'proxysql_process_list')!;
382
- const result = await tool.handler({}, mockContext);
383
-
384
- expect(mockQuery).toHaveBeenCalledWith('SELECT * FROM stats_mysql_processlist');
385
- expect(result).toEqual({
386
- success: true,
387
- processes: mockProcesses,
388
- count: 1
389
- });
390
- });
509
+ it("should redact sensitive credential variables", async () => {
510
+ const mockVars = [
511
+ { variable_name: "mysql-threads", variable_value: "4" },
512
+ {
513
+ variable_name: "admin-admin_credentials",
514
+ variable_value: "admin:admin",
515
+ },
516
+ {
517
+ variable_name: "mysql-monitor_password",
518
+ variable_value: "monpass",
519
+ },
520
+ {
521
+ variable_name: "admin-stats_credentials",
522
+ variable_value: "stats:stats",
523
+ },
524
+ ];
525
+ mockQuery
526
+ .mockResolvedValueOnce([[{ cnt: 4 }]])
527
+ .mockResolvedValueOnce([mockVars]);
528
+
529
+ const tool = tools.find((t) => t.name === "proxysql_global_variables")!;
530
+ const result = (await tool.handler({}, mockContext)) as {
531
+ variables: { variable_name: string; variable_value: string }[];
532
+ totalVarsAvailable: number;
533
+ };
534
+
535
+ // Non-sensitive should be preserved
536
+ const threads = result.variables.find(
537
+ (v) => v.variable_name === "mysql-threads",
538
+ );
539
+ expect(threads?.variable_value).toBe("4");
540
+
541
+ // Sensitive should be redacted
542
+ const creds = result.variables.find(
543
+ (v) => v.variable_name === "admin-admin_credentials",
544
+ );
545
+ expect(creds?.variable_value).toBe("********");
546
+
547
+ const monPw = result.variables.find(
548
+ (v) => v.variable_name === "mysql-monitor_password",
549
+ );
550
+ expect(monPw?.variable_value).toBe("********");
551
+
552
+ const statsCreds = result.variables.find(
553
+ (v) => v.variable_name === "admin-stats_credentials",
554
+ );
555
+ expect(statsCreds?.variable_value).toBe("********");
556
+
557
+ // totalVarsAvailable should reflect total count
558
+ expect(result.totalVarsAvailable).toBe(4);
559
+ });
560
+ });
561
+
562
+ describe("proxysql_memory_stats", () => {
563
+ it("should return memory metrics", async () => {
564
+ const mockMemory = [
565
+ { Variable_Name: "SQLite3_memory_bytes", Variable_Value: "1048576" },
566
+ ];
567
+ mockQuery.mockResolvedValue([mockMemory]);
568
+
569
+ const tool = tools.find((t) => t.name === "proxysql_memory_stats")!;
570
+ const result = await tool.handler({}, mockContext);
571
+
572
+ expect(mockQuery).toHaveBeenCalledWith(
573
+ "SELECT * FROM stats_memory_metrics",
574
+ );
575
+ expect(result).toEqual({
576
+ success: true,
577
+ memoryStats: mockMemory,
578
+ count: 1,
579
+ });
391
580
  });
581
+ });
582
+
583
+ describe("proxysql_commands", () => {
584
+ it("should execute admin command", async () => {
585
+ mockQuery.mockResolvedValue([]);
586
+
587
+ const tool = tools.find((t) => t.name === "proxysql_commands")!;
588
+ const result = await tool.handler(
589
+ { command: "LOAD MYSQL USERS TO RUNTIME" },
590
+ mockContext,
591
+ );
592
+
593
+ expect(mockQuery).toHaveBeenCalledWith("LOAD MYSQL USERS TO RUNTIME");
594
+ expect(result).toEqual({
595
+ success: true,
596
+ command: "LOAD MYSQL USERS TO RUNTIME",
597
+ message: "Command executed: LOAD MYSQL USERS TO RUNTIME",
598
+ });
599
+ });
600
+ });
601
+
602
+ describe("proxysql_process_list", () => {
603
+ it("should return active processes", async () => {
604
+ const mockProcesses = [
605
+ { ThreadID: 1, user: "app", db: "test", command: "Query" },
606
+ ];
607
+ mockQuery.mockResolvedValue([mockProcesses]);
608
+
609
+ const tool = tools.find((t) => t.name === "proxysql_process_list")!;
610
+ const result = await tool.handler({}, mockContext);
611
+
612
+ expect(mockQuery).toHaveBeenCalledWith(
613
+ "SELECT * FROM stats_mysql_processlist",
614
+ );
615
+ expect(result).toEqual({
616
+ success: true,
617
+ processes: mockProcesses,
618
+ count: 1,
619
+ });
620
+ });
621
+ });
392
622
  });
393
623
 
394
- describe('Connection Error Handling', () => {
395
- let tools: ReturnType<typeof getProxySQLTools>;
396
- let mockContext: ReturnType<typeof createMockRequestContext>;
624
+ describe("Connection Error Handling", () => {
625
+ let tools: ReturnType<typeof getProxySQLTools>;
626
+ let mockContext: ReturnType<typeof createMockRequestContext>;
397
627
 
398
- beforeEach(() => {
399
- vi.clearAllMocks();
400
- tools = getProxySQLTools(createMockMySQLAdapter() as unknown as MySQLAdapter);
401
- mockContext = createMockRequestContext();
402
- });
628
+ beforeEach(() => {
629
+ vi.clearAllMocks();
630
+ tools = getProxySQLTools(
631
+ createMockMySQLAdapter() as unknown as MySQLAdapter,
632
+ );
633
+ mockContext = createMockRequestContext();
634
+ });
403
635
 
404
- it('should propagate connection errors', async () => {
405
- mockCreateConnection.mockRejectedValue(new Error('Connection refused'));
636
+ it("should propagate connection errors", async () => {
637
+ mockCreateConnection.mockRejectedValue(new Error("Connection refused"));
406
638
 
407
- const tool = tools.find(t => t.name === 'proxysql_status')!;
639
+ const tool = tools.find((t) => t.name === "proxysql_status")!;
408
640
 
409
- await expect(tool.handler({}, mockContext)).rejects.toThrow('Connection refused');
410
- });
641
+ await expect(tool.handler({}, mockContext)).rejects.toThrow(
642
+ "Connection refused",
643
+ );
644
+ });
411
645
 
412
- it('should propagate query errors', async () => {
413
- mockCreateConnection.mockResolvedValue({
414
- query: vi.fn().mockRejectedValue(new Error('Access denied')),
415
- end: mockEnd
416
- });
646
+ it("should propagate query errors", async () => {
647
+ mockCreateConnection.mockResolvedValue({
648
+ query: vi.fn().mockRejectedValue(new Error("Access denied")),
649
+ end: mockEnd,
650
+ });
417
651
 
418
- const tool = tools.find(t => t.name === 'proxysql_status')!;
652
+ const tool = tools.find((t) => t.name === "proxysql_status")!;
419
653
 
420
- await expect(tool.handler({}, mockContext)).rejects.toThrow('Access denied');
421
- });
654
+ await expect(tool.handler({}, mockContext)).rejects.toThrow(
655
+ "Access denied",
656
+ );
657
+ });
422
658
  });