@neverinfamous/mysql-mcp 2.3.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (347) hide show
  1. package/.dockerignore +1 -0
  2. package/.gitattributes +18 -0
  3. package/.github/workflows/codeql.yml +2 -10
  4. package/.github/workflows/docker-publish.yml +15 -13
  5. package/CHANGELOG.md +287 -1
  6. package/DOCKER_README.md +100 -265
  7. package/Dockerfile +5 -0
  8. package/README.md +124 -59
  9. package/VERSION +1 -1
  10. package/dist/__tests__/mocks/adapter.d.ts.map +1 -1
  11. package/dist/__tests__/mocks/adapter.js +2 -0
  12. package/dist/__tests__/mocks/adapter.js.map +1 -1
  13. package/dist/adapters/DatabaseAdapter.d.ts.map +1 -1
  14. package/dist/adapters/DatabaseAdapter.js +50 -9
  15. package/dist/adapters/DatabaseAdapter.js.map +1 -1
  16. package/dist/adapters/mysql/MySQLAdapter.d.ts +6 -0
  17. package/dist/adapters/mysql/MySQLAdapter.d.ts.map +1 -1
  18. package/dist/adapters/mysql/MySQLAdapter.js +8 -0
  19. package/dist/adapters/mysql/MySQLAdapter.js.map +1 -1
  20. package/dist/adapters/mysql/SchemaManager.js +16 -15
  21. package/dist/adapters/mysql/SchemaManager.js.map +1 -1
  22. package/dist/adapters/mysql/prompts/index.js +10 -20
  23. package/dist/adapters/mysql/prompts/index.js.map +1 -1
  24. package/dist/adapters/mysql/prompts/proxysqlSetup.js +1 -1
  25. package/dist/adapters/mysql/resources/docstore.d.ts.map +1 -1
  26. package/dist/adapters/mysql/resources/docstore.js +10 -7
  27. package/dist/adapters/mysql/resources/docstore.js.map +1 -1
  28. package/dist/adapters/mysql/resources/events.js +11 -8
  29. package/dist/adapters/mysql/resources/events.js.map +1 -1
  30. package/dist/adapters/mysql/resources/indexes.d.ts.map +1 -1
  31. package/dist/adapters/mysql/resources/indexes.js +12 -15
  32. package/dist/adapters/mysql/resources/indexes.js.map +1 -1
  33. package/dist/adapters/mysql/resources/innodb.d.ts.map +1 -1
  34. package/dist/adapters/mysql/resources/innodb.js +20 -17
  35. package/dist/adapters/mysql/resources/innodb.js.map +1 -1
  36. package/dist/adapters/mysql/resources/locks.d.ts.map +1 -1
  37. package/dist/adapters/mysql/resources/locks.js +9 -6
  38. package/dist/adapters/mysql/resources/locks.js.map +1 -1
  39. package/dist/adapters/mysql/resources/performance.d.ts.map +1 -1
  40. package/dist/adapters/mysql/resources/performance.js +15 -15
  41. package/dist/adapters/mysql/resources/performance.js.map +1 -1
  42. package/dist/adapters/mysql/resources/spatial.d.ts.map +1 -1
  43. package/dist/adapters/mysql/resources/spatial.js +9 -6
  44. package/dist/adapters/mysql/resources/spatial.js.map +1 -1
  45. package/dist/adapters/mysql/resources/sysschema.d.ts.map +1 -1
  46. package/dist/adapters/mysql/resources/sysschema.js +12 -9
  47. package/dist/adapters/mysql/resources/sysschema.js.map +1 -1
  48. package/dist/adapters/mysql/tools/admin/backup.d.ts.map +1 -1
  49. package/dist/adapters/mysql/tools/admin/backup.js +170 -121
  50. package/dist/adapters/mysql/tools/admin/backup.js.map +1 -1
  51. package/dist/adapters/mysql/tools/admin/maintenance.d.ts.map +1 -1
  52. package/dist/adapters/mysql/tools/admin/maintenance.js +106 -57
  53. package/dist/adapters/mysql/tools/admin/maintenance.js.map +1 -1
  54. package/dist/adapters/mysql/tools/admin/monitoring.d.ts.map +1 -1
  55. package/dist/adapters/mysql/tools/admin/monitoring.js +183 -101
  56. package/dist/adapters/mysql/tools/admin/monitoring.js.map +1 -1
  57. package/dist/adapters/mysql/tools/cluster/group-replication.d.ts.map +1 -1
  58. package/dist/adapters/mysql/tools/cluster/group-replication.js +164 -120
  59. package/dist/adapters/mysql/tools/cluster/group-replication.js.map +1 -1
  60. package/dist/adapters/mysql/tools/cluster/innodb-cluster.d.ts.map +1 -1
  61. package/dist/adapters/mysql/tools/cluster/innodb-cluster.js +212 -145
  62. package/dist/adapters/mysql/tools/cluster/innodb-cluster.js.map +1 -1
  63. package/dist/adapters/mysql/tools/codemode/index.d.ts.map +1 -1
  64. package/dist/adapters/mysql/tools/codemode/index.js +6 -4
  65. package/dist/adapters/mysql/tools/codemode/index.js.map +1 -1
  66. package/dist/adapters/mysql/tools/core.d.ts.map +1 -1
  67. package/dist/adapters/mysql/tools/core.js +152 -29
  68. package/dist/adapters/mysql/tools/core.js.map +1 -1
  69. package/dist/adapters/mysql/tools/docstore.d.ts.map +1 -1
  70. package/dist/adapters/mysql/tools/docstore.js +340 -163
  71. package/dist/adapters/mysql/tools/docstore.js.map +1 -1
  72. package/dist/adapters/mysql/tools/events.d.ts.map +1 -1
  73. package/dist/adapters/mysql/tools/events.js +284 -198
  74. package/dist/adapters/mysql/tools/events.js.map +1 -1
  75. package/dist/adapters/mysql/tools/json/core.d.ts.map +1 -1
  76. package/dist/adapters/mysql/tools/json/core.js +11 -39
  77. package/dist/adapters/mysql/tools/json/core.js.map +1 -1
  78. package/dist/adapters/mysql/tools/json/enhanced.d.ts.map +1 -1
  79. package/dist/adapters/mysql/tools/json/enhanced.js +15 -33
  80. package/dist/adapters/mysql/tools/json/enhanced.js.map +1 -1
  81. package/dist/adapters/mysql/tools/json/helpers.d.ts.map +1 -1
  82. package/dist/adapters/mysql/tools/json/helpers.js +13 -24
  83. package/dist/adapters/mysql/tools/json/helpers.js.map +1 -1
  84. package/dist/adapters/mysql/tools/partitioning.js +3 -0
  85. package/dist/adapters/mysql/tools/partitioning.js.map +1 -1
  86. package/dist/adapters/mysql/tools/performance/analysis.d.ts.map +1 -1
  87. package/dist/adapters/mysql/tools/performance/analysis.js +89 -60
  88. package/dist/adapters/mysql/tools/performance/analysis.js.map +1 -1
  89. package/dist/adapters/mysql/tools/performance/optimization.d.ts.map +1 -1
  90. package/dist/adapters/mysql/tools/performance/optimization.js +151 -127
  91. package/dist/adapters/mysql/tools/performance/optimization.js.map +1 -1
  92. package/dist/adapters/mysql/tools/proxysql.d.ts +1 -1
  93. package/dist/adapters/mysql/tools/proxysql.d.ts.map +1 -1
  94. package/dist/adapters/mysql/tools/proxysql.js +289 -176
  95. package/dist/adapters/mysql/tools/proxysql.js.map +1 -1
  96. package/dist/adapters/mysql/tools/replication.js +75 -49
  97. package/dist/adapters/mysql/tools/replication.js.map +1 -1
  98. package/dist/adapters/mysql/tools/roles.d.ts.map +1 -1
  99. package/dist/adapters/mysql/tools/roles.js +224 -182
  100. package/dist/adapters/mysql/tools/roles.js.map +1 -1
  101. package/dist/adapters/mysql/tools/router.d.ts.map +1 -1
  102. package/dist/adapters/mysql/tools/router.js +168 -67
  103. package/dist/adapters/mysql/tools/router.js.map +1 -1
  104. package/dist/adapters/mysql/tools/schema/constraints.d.ts.map +1 -1
  105. package/dist/adapters/mysql/tools/schema/constraints.js +21 -3
  106. package/dist/adapters/mysql/tools/schema/constraints.js.map +1 -1
  107. package/dist/adapters/mysql/tools/schema/management.d.ts.map +1 -1
  108. package/dist/adapters/mysql/tools/schema/management.js +61 -14
  109. package/dist/adapters/mysql/tools/schema/management.js.map +1 -1
  110. package/dist/adapters/mysql/tools/schema/routines.d.ts.map +1 -1
  111. package/dist/adapters/mysql/tools/schema/routines.js +27 -4
  112. package/dist/adapters/mysql/tools/schema/routines.js.map +1 -1
  113. package/dist/adapters/mysql/tools/schema/scheduled_events.d.ts.map +1 -1
  114. package/dist/adapters/mysql/tools/schema/scheduled_events.js +24 -3
  115. package/dist/adapters/mysql/tools/schema/scheduled_events.js.map +1 -1
  116. package/dist/adapters/mysql/tools/schema/triggers.d.ts.map +1 -1
  117. package/dist/adapters/mysql/tools/schema/triggers.js +23 -2
  118. package/dist/adapters/mysql/tools/schema/triggers.js.map +1 -1
  119. package/dist/adapters/mysql/tools/schema/views.d.ts.map +1 -1
  120. package/dist/adapters/mysql/tools/schema/views.js +47 -7
  121. package/dist/adapters/mysql/tools/schema/views.js.map +1 -1
  122. package/dist/adapters/mysql/tools/security/audit.d.ts.map +1 -1
  123. package/dist/adapters/mysql/tools/security/audit.js +102 -34
  124. package/dist/adapters/mysql/tools/security/audit.js.map +1 -1
  125. package/dist/adapters/mysql/tools/security/data-protection.d.ts.map +1 -1
  126. package/dist/adapters/mysql/tools/security/data-protection.js +264 -205
  127. package/dist/adapters/mysql/tools/security/data-protection.js.map +1 -1
  128. package/dist/adapters/mysql/tools/security/encryption.d.ts.map +1 -1
  129. package/dist/adapters/mysql/tools/security/encryption.js +137 -104
  130. package/dist/adapters/mysql/tools/security/encryption.js.map +1 -1
  131. package/dist/adapters/mysql/tools/shell/backup.d.ts.map +1 -1
  132. package/dist/adapters/mysql/tools/shell/backup.js +71 -59
  133. package/dist/adapters/mysql/tools/shell/backup.js.map +1 -1
  134. package/dist/adapters/mysql/tools/shell/restore.d.ts.map +1 -1
  135. package/dist/adapters/mysql/tools/shell/restore.js +61 -47
  136. package/dist/adapters/mysql/tools/shell/restore.js.map +1 -1
  137. package/dist/adapters/mysql/tools/spatial/geometry.d.ts.map +1 -1
  138. package/dist/adapters/mysql/tools/spatial/geometry.js +19 -5
  139. package/dist/adapters/mysql/tools/spatial/geometry.js.map +1 -1
  140. package/dist/adapters/mysql/tools/spatial/operations.d.ts.map +1 -1
  141. package/dist/adapters/mysql/tools/spatial/operations.js +42 -17
  142. package/dist/adapters/mysql/tools/spatial/operations.js.map +1 -1
  143. package/dist/adapters/mysql/tools/spatial/queries.d.ts.map +1 -1
  144. package/dist/adapters/mysql/tools/spatial/queries.js +109 -57
  145. package/dist/adapters/mysql/tools/spatial/queries.js.map +1 -1
  146. package/dist/adapters/mysql/tools/spatial/setup.d.ts.map +1 -1
  147. package/dist/adapters/mysql/tools/spatial/setup.js +103 -50
  148. package/dist/adapters/mysql/tools/spatial/setup.js.map +1 -1
  149. package/dist/adapters/mysql/tools/stats/comparative.d.ts.map +1 -1
  150. package/dist/adapters/mysql/tools/stats/comparative.js +128 -79
  151. package/dist/adapters/mysql/tools/stats/comparative.js.map +1 -1
  152. package/dist/adapters/mysql/tools/stats/descriptive.d.ts.map +1 -1
  153. package/dist/adapters/mysql/tools/stats/descriptive.js +174 -102
  154. package/dist/adapters/mysql/tools/stats/descriptive.js.map +1 -1
  155. package/dist/adapters/mysql/tools/sysschema/activity.d.ts.map +1 -1
  156. package/dist/adapters/mysql/tools/sysschema/activity.js +50 -25
  157. package/dist/adapters/mysql/tools/sysschema/activity.js.map +1 -1
  158. package/dist/adapters/mysql/tools/sysschema/performance.d.ts.map +1 -1
  159. package/dist/adapters/mysql/tools/sysschema/performance.js +121 -66
  160. package/dist/adapters/mysql/tools/sysschema/performance.js.map +1 -1
  161. package/dist/adapters/mysql/tools/sysschema/resources.d.ts.map +1 -1
  162. package/dist/adapters/mysql/tools/sysschema/resources.js +101 -64
  163. package/dist/adapters/mysql/tools/sysschema/resources.js.map +1 -1
  164. package/dist/adapters/mysql/tools/text/fulltext.d.ts.map +1 -1
  165. package/dist/adapters/mysql/tools/text/fulltext.js +18 -32
  166. package/dist/adapters/mysql/tools/text/fulltext.js.map +1 -1
  167. package/dist/adapters/mysql/tools/transactions.d.ts.map +1 -1
  168. package/dist/adapters/mysql/tools/transactions.js +48 -23
  169. package/dist/adapters/mysql/tools/transactions.js.map +1 -1
  170. package/dist/adapters/mysql/types/proxysql-types.d.ts +15 -0
  171. package/dist/adapters/mysql/types/proxysql-types.d.ts.map +1 -1
  172. package/dist/adapters/mysql/types/proxysql-types.js +33 -1
  173. package/dist/adapters/mysql/types/proxysql-types.js.map +1 -1
  174. package/dist/adapters/mysql/types/router-types.d.ts +1 -1
  175. package/dist/adapters/mysql/types/router-types.js +1 -1
  176. package/dist/adapters/mysql/types/router-types.js.map +1 -1
  177. package/dist/adapters/mysql/types/shell-types.js +2 -2
  178. package/dist/adapters/mysql/types/shell-types.js.map +1 -1
  179. package/dist/adapters/mysql/types.d.ts +485 -21
  180. package/dist/adapters/mysql/types.d.ts.map +1 -1
  181. package/dist/adapters/mysql/types.js +546 -19
  182. package/dist/adapters/mysql/types.js.map +1 -1
  183. package/dist/auth/scopes.js +1 -1
  184. package/dist/auth/scopes.js.map +1 -1
  185. package/dist/codemode/api.d.ts +3 -2
  186. package/dist/codemode/api.d.ts.map +1 -1
  187. package/dist/codemode/api.js +80 -5
  188. package/dist/codemode/api.js.map +1 -1
  189. package/dist/codemode/sandbox-factory.js +1 -1
  190. package/dist/codemode/sandbox-factory.js.map +1 -1
  191. package/dist/codemode/types.d.ts +26 -0
  192. package/dist/codemode/types.d.ts.map +1 -1
  193. package/dist/codemode/types.js +2 -0
  194. package/dist/codemode/types.js.map +1 -1
  195. package/dist/codemode/worker-sandbox.d.ts +4 -2
  196. package/dist/codemode/worker-sandbox.d.ts.map +1 -1
  197. package/dist/codemode/worker-sandbox.js +66 -7
  198. package/dist/codemode/worker-sandbox.js.map +1 -1
  199. package/dist/codemode/worker-script.d.ts +3 -0
  200. package/dist/codemode/worker-script.d.ts.map +1 -1
  201. package/dist/codemode/worker-script.js +128 -75
  202. package/dist/codemode/worker-script.js.map +1 -1
  203. package/dist/constants/ServerInstructions.d.ts +1 -1
  204. package/dist/constants/ServerInstructions.d.ts.map +1 -1
  205. package/dist/constants/ServerInstructions.js +37 -31
  206. package/dist/constants/ServerInstructions.js.map +1 -1
  207. package/dist/filtering/ToolConstants.d.ts +1 -1
  208. package/dist/filtering/ToolConstants.d.ts.map +1 -1
  209. package/dist/filtering/ToolConstants.js +1 -2
  210. package/dist/filtering/ToolConstants.js.map +1 -1
  211. package/dist/pool/ConnectionPool.d.ts.map +1 -1
  212. package/dist/pool/ConnectionPool.js.map +1 -1
  213. package/dist/transports/http.d.ts.map +1 -1
  214. package/dist/transports/http.js +6 -0
  215. package/dist/transports/http.js.map +1 -1
  216. package/dist/utils/validators.d.ts +1 -1
  217. package/dist/utils/validators.d.ts.map +1 -1
  218. package/dist/utils/validators.js.map +1 -1
  219. package/package.json +4 -4
  220. package/releases/v2.3.0-release-notes.md +20 -20
  221. package/releases/v2.3.1-release-notes.md +34 -0
  222. package/releases/v3.0.0-release-notes.md +81 -0
  223. package/src/__tests__/mocks/adapter.ts +3 -0
  224. package/src/__tests__/perf.test.ts +6 -6
  225. package/src/adapters/DatabaseAdapter.ts +58 -9
  226. package/src/adapters/__tests__/DatabaseAdapter.test.ts +89 -8
  227. package/src/adapters/mysql/MySQLAdapter.ts +17 -2
  228. package/src/adapters/mysql/SchemaManager.ts +21 -21
  229. package/src/adapters/mysql/__tests__/MySQLAdapter.test.ts +1 -1
  230. package/src/adapters/mysql/prompts/index.ts +12 -22
  231. package/src/adapters/mysql/prompts/proxysqlSetup.ts +1 -1
  232. package/src/adapters/mysql/resources/docstore.ts +13 -10
  233. package/src/adapters/mysql/resources/events.ts +12 -12
  234. package/src/adapters/mysql/resources/indexes.ts +17 -19
  235. package/src/adapters/mysql/resources/innodb.ts +23 -22
  236. package/src/adapters/mysql/resources/locks.ts +9 -7
  237. package/src/adapters/mysql/resources/performance.ts +23 -18
  238. package/src/adapters/mysql/resources/spatial.ts +9 -7
  239. package/src/adapters/mysql/resources/sysschema.ts +12 -11
  240. package/src/adapters/mysql/tools/__tests__/core.test.ts +126 -55
  241. package/src/adapters/mysql/tools/__tests__/docstore.test.ts +459 -88
  242. package/src/adapters/mysql/tools/__tests__/events.test.ts +281 -103
  243. package/src/adapters/mysql/tools/__tests__/proxysql.test.ts +128 -28
  244. package/src/adapters/mysql/tools/__tests__/replication.test.ts +48 -2
  245. package/src/adapters/mysql/tools/__tests__/roles.test.ts +15 -18
  246. package/src/adapters/mysql/tools/__tests__/router.test.ts +32 -5
  247. package/src/adapters/mysql/tools/__tests__/security.test.ts +126 -2
  248. package/src/adapters/mysql/tools/__tests__/security_injection.test.ts +84 -76
  249. package/src/adapters/mysql/tools/__tests__/security_integration.test.ts +47 -50
  250. package/src/adapters/mysql/tools/__tests__/spatial.test.ts +11 -10
  251. package/src/adapters/mysql/tools/__tests__/spatial_handler.test.ts +54 -38
  252. package/src/adapters/mysql/tools/__tests__/stats.test.ts +285 -152
  253. package/src/adapters/mysql/tools/__tests__/transactions.test.ts +13 -13
  254. package/src/adapters/mysql/tools/admin/__tests__/backup.test.ts +171 -25
  255. package/src/adapters/mysql/tools/admin/__tests__/maintenance.test.ts +240 -4
  256. package/src/adapters/mysql/tools/admin/__tests__/monitoring-summary.test.ts +274 -0
  257. package/src/adapters/mysql/tools/admin/__tests__/monitoring.test.ts +94 -5
  258. package/src/adapters/mysql/tools/admin/backup.ts +193 -143
  259. package/src/adapters/mysql/tools/admin/maintenance.ts +118 -69
  260. package/src/adapters/mysql/tools/admin/monitoring.ts +201 -125
  261. package/src/adapters/mysql/tools/cluster/__tests__/group-replication.test.ts +69 -0
  262. package/src/adapters/mysql/tools/cluster/__tests__/innodb-cluster.test.ts +141 -0
  263. package/src/adapters/mysql/tools/cluster/group-replication.ts +172 -132
  264. package/src/adapters/mysql/tools/cluster/innodb-cluster.ts +231 -157
  265. package/src/adapters/mysql/tools/codemode/__tests__/codemode-tool.test.ts +227 -0
  266. package/src/adapters/mysql/tools/codemode/index.ts +5 -3
  267. package/src/adapters/mysql/tools/core.ts +152 -38
  268. package/src/adapters/mysql/tools/docstore.ts +422 -205
  269. package/src/adapters/mysql/tools/events.ts +334 -233
  270. package/src/adapters/mysql/tools/json/__tests__/core.test.ts +20 -0
  271. package/src/adapters/mysql/tools/json/__tests__/enhanced.test.ts +82 -50
  272. package/src/adapters/mysql/tools/json/__tests__/helpers.test.ts +42 -3
  273. package/src/adapters/mysql/tools/json/core.ts +21 -42
  274. package/src/adapters/mysql/tools/json/enhanced.ts +22 -37
  275. package/src/adapters/mysql/tools/json/helpers.ts +21 -25
  276. package/src/adapters/mysql/tools/partitioning.ts +3 -0
  277. package/src/adapters/mysql/tools/performance/__tests__/analysis.test.ts +98 -5
  278. package/src/adapters/mysql/tools/performance/__tests__/optimization-coverage.test.ts +515 -0
  279. package/src/adapters/mysql/tools/performance/__tests__/optimization.test.ts +187 -0
  280. package/src/adapters/mysql/tools/performance/analysis.ts +95 -69
  281. package/src/adapters/mysql/tools/performance/optimization.ts +182 -153
  282. package/src/adapters/mysql/tools/proxysql.ts +314 -209
  283. package/src/adapters/mysql/tools/replication.ts +84 -57
  284. package/src/adapters/mysql/tools/roles.ts +274 -226
  285. package/src/adapters/mysql/tools/router.ts +181 -85
  286. package/src/adapters/mysql/tools/schema/__tests__/constraints.test.ts +13 -0
  287. package/src/adapters/mysql/tools/schema/__tests__/management.test.ts +60 -25
  288. package/src/adapters/mysql/tools/schema/__tests__/scheduled_events.test.ts +11 -0
  289. package/src/adapters/mysql/tools/schema/__tests__/triggers.test.ts +25 -4
  290. package/src/adapters/mysql/tools/schema/__tests__/views.test.ts +46 -14
  291. package/src/adapters/mysql/tools/schema/constraints.ts +22 -3
  292. package/src/adapters/mysql/tools/schema/management.ts +60 -15
  293. package/src/adapters/mysql/tools/schema/routines.ts +26 -4
  294. package/src/adapters/mysql/tools/schema/scheduled_events.ts +25 -3
  295. package/src/adapters/mysql/tools/schema/triggers.ts +27 -2
  296. package/src/adapters/mysql/tools/schema/views.ts +46 -8
  297. package/src/adapters/mysql/tools/security/__tests__/audit.test.ts +90 -4
  298. package/src/adapters/mysql/tools/security/audit.ts +113 -39
  299. package/src/adapters/mysql/tools/security/data-protection.ts +293 -233
  300. package/src/adapters/mysql/tools/security/encryption.ts +172 -139
  301. package/src/adapters/mysql/tools/shell/__tests__/backup.test.ts +29 -0
  302. package/src/adapters/mysql/tools/shell/backup.ts +90 -73
  303. package/src/adapters/mysql/tools/shell/restore.ts +62 -48
  304. package/src/adapters/mysql/tools/spatial/__tests__/operations.test.ts +22 -14
  305. package/src/adapters/mysql/tools/spatial/__tests__/queries.test.ts +65 -51
  306. package/src/adapters/mysql/tools/spatial/geometry.ts +23 -7
  307. package/src/adapters/mysql/tools/spatial/operations.ts +60 -31
  308. package/src/adapters/mysql/tools/spatial/queries.ts +142 -65
  309. package/src/adapters/mysql/tools/spatial/setup.ts +121 -55
  310. package/src/adapters/mysql/tools/stats/__tests__/comparative.test.ts +12 -10
  311. package/src/adapters/mysql/tools/stats/comparative.ts +150 -98
  312. package/src/adapters/mysql/tools/stats/descriptive.ts +204 -127
  313. package/src/adapters/mysql/tools/sysschema/__tests__/error-paths.test.ts +222 -0
  314. package/src/adapters/mysql/tools/sysschema/__tests__/performance.test.ts +45 -0
  315. package/src/adapters/mysql/tools/sysschema/__tests__/resources.test.ts +6 -3
  316. package/src/adapters/mysql/tools/sysschema/activity.ts +52 -27
  317. package/src/adapters/mysql/tools/sysschema/performance.ts +132 -68
  318. package/src/adapters/mysql/tools/sysschema/resources.ts +105 -67
  319. package/src/adapters/mysql/tools/text/__tests__/fulltext.test.ts +45 -17
  320. package/src/adapters/mysql/tools/text/fulltext.ts +27 -38
  321. package/src/adapters/mysql/tools/transactions.ts +49 -24
  322. package/src/adapters/mysql/types/proxysql-types.ts +38 -1
  323. package/src/adapters/mysql/types/router-types.ts +1 -1
  324. package/src/adapters/mysql/types/shell-types.ts +2 -2
  325. package/src/adapters/mysql/types.ts +632 -19
  326. package/src/auth/__tests__/scopes.test.ts +2 -2
  327. package/src/auth/scopes.ts +1 -1
  328. package/src/codemode/__tests__/api.test.ts +417 -0
  329. package/src/codemode/__tests__/sandbox-factory.test.ts +158 -0
  330. package/src/codemode/__tests__/sandbox.test.ts +301 -0
  331. package/src/codemode/__tests__/security.test.ts +368 -0
  332. package/src/codemode/__tests__/worker-sandbox.test.ts +179 -0
  333. package/src/codemode/__tests__/worker-script.test.ts +226 -0
  334. package/src/codemode/api.ts +89 -5
  335. package/src/codemode/sandbox-factory.ts +1 -1
  336. package/src/codemode/types.ts +34 -0
  337. package/src/codemode/worker-sandbox.ts +74 -7
  338. package/src/codemode/worker-script.ts +157 -86
  339. package/src/constants/ServerInstructions.ts +37 -31
  340. package/src/filtering/ToolConstants.ts +1 -2
  341. package/src/filtering/__tests__/ToolFilter.test.ts +9 -9
  342. package/src/pool/ConnectionPool.ts +4 -1
  343. package/src/transports/__tests__/http.test.ts +15 -3
  344. package/src/transports/http.ts +12 -0
  345. package/src/utils/validators.ts +2 -1
  346. package/vitest.config.ts +3 -1
  347. package/CODE_MODE.md +0 -245
@@ -380,6 +380,29 @@ describe("Handler Execution", () => {
380
380
  expect(calls.some((c) => c.includes("ANALYZE TABLE"))).toBe(true);
381
381
  });
382
382
 
383
+ it("should include warning when buckets exceed 1024", async () => {
384
+ mockAdapter.executeQuery.mockResolvedValue(
385
+ createMockQueryResult([{ TABLE_NAME: "orders" }]),
386
+ );
387
+
388
+ const tool = tools.find((t) => t.name === "mysql_stats_histogram")!;
389
+ const result = (await tool.handler(
390
+ { table: "orders", column: "total", update: true, buckets: 2000 },
391
+ mockContext,
392
+ )) as { warning?: string };
393
+
394
+ // Verify ANALYZE TABLE used clamped value
395
+ const calls = mockAdapter.executeQuery.mock.calls.map(
396
+ (c) => c[0] as string,
397
+ );
398
+ const analyzeCall = calls.find((c) => c.includes("ANALYZE TABLE"));
399
+ expect(analyzeCall).toContain("1024 BUCKETS");
400
+
401
+ expect(result.warning).toBe(
402
+ "Requested 2000 buckets; clamped to max 1024",
403
+ );
404
+ });
405
+
383
406
  it("should return histogram metadata when exists", async () => {
384
407
  mockAdapter.executeQuery.mockResolvedValue(
385
408
  createMockQueryResult([
@@ -421,56 +444,60 @@ describe("Stats Validation Errors", () => {
421
444
  describe("mysql_stats_descriptive", () => {
422
445
  it("should reject invalid table name", async () => {
423
446
  const tool = tools.find((t) => t.name === "mysql_stats_descriptive")!;
424
- await expect(
425
- tool.handler(
426
- {
427
- table: "123-invalid",
428
- column: "total",
429
- },
430
- mockContext,
431
- ),
432
- ).rejects.toThrow("Invalid table name");
447
+ const result = (await tool.handler(
448
+ {
449
+ table: "123-invalid",
450
+ column: "total",
451
+ },
452
+ mockContext,
453
+ )) as { success: boolean; error: string };
454
+
455
+ expect(result.success).toBe(false);
456
+ expect(result.error).toContain("Invalid table name");
433
457
  });
434
458
 
435
459
  it("should reject invalid column name", async () => {
436
460
  const tool = tools.find((t) => t.name === "mysql_stats_descriptive")!;
437
- await expect(
438
- tool.handler(
439
- {
440
- table: "orders",
441
- column: "123-bad",
442
- },
443
- mockContext,
444
- ),
445
- ).rejects.toThrow("Invalid column name");
461
+ const result = (await tool.handler(
462
+ {
463
+ table: "orders",
464
+ column: "123-bad",
465
+ },
466
+ mockContext,
467
+ )) as { success: boolean; error: string };
468
+
469
+ expect(result.success).toBe(false);
470
+ expect(result.error).toContain("Invalid column name");
446
471
  });
447
472
  });
448
473
 
449
474
  describe("mysql_stats_percentiles", () => {
450
475
  it("should reject invalid table name", async () => {
451
476
  const tool = tools.find((t) => t.name === "mysql_stats_percentiles")!;
452
- await expect(
453
- tool.handler(
454
- {
455
- table: "123-invalid",
456
- column: "amount",
457
- },
458
- mockContext,
459
- ),
460
- ).rejects.toThrow("Invalid table name");
477
+ const result = (await tool.handler(
478
+ {
479
+ table: "123-invalid",
480
+ column: "amount",
481
+ },
482
+ mockContext,
483
+ )) as { success: boolean; error: string };
484
+
485
+ expect(result.success).toBe(false);
486
+ expect(result.error).toContain("Invalid table name");
461
487
  });
462
488
 
463
489
  it("should reject invalid column name", async () => {
464
490
  const tool = tools.find((t) => t.name === "mysql_stats_percentiles")!;
465
- await expect(
466
- tool.handler(
467
- {
468
- table: "orders",
469
- column: "bad-col",
470
- },
471
- mockContext,
472
- ),
473
- ).rejects.toThrow("Invalid column name");
491
+ const result = (await tool.handler(
492
+ {
493
+ table: "orders",
494
+ column: "bad-col",
495
+ },
496
+ mockContext,
497
+ )) as { success: boolean; error: string };
498
+
499
+ expect(result.success).toBe(false);
500
+ expect(result.error).toContain("Invalid column name");
474
501
  });
475
502
 
476
503
  it("should return empty percentiles when table is empty", async () => {
@@ -494,58 +521,62 @@ describe("Stats Validation Errors", () => {
494
521
  describe("mysql_stats_correlation", () => {
495
522
  it("should reject invalid table name", async () => {
496
523
  const tool = tools.find((t) => t.name === "mysql_stats_correlation")!;
497
- await expect(
498
- tool.handler(
499
- {
500
- table: "123-bad",
501
- column1: "x",
502
- column2: "y",
503
- },
504
- mockContext,
505
- ),
506
- ).rejects.toThrow("Invalid table name");
524
+ const result = (await tool.handler(
525
+ {
526
+ table: "123-bad",
527
+ column1: "x",
528
+ column2: "y",
529
+ },
530
+ mockContext,
531
+ )) as { success: boolean; error: string };
532
+
533
+ expect(result.success).toBe(false);
534
+ expect(result.error).toContain("Invalid table name");
507
535
  });
508
536
 
509
537
  it("should reject invalid column names", async () => {
510
538
  const tool = tools.find((t) => t.name === "mysql_stats_correlation")!;
511
- await expect(
512
- tool.handler(
513
- {
514
- table: "data",
515
- column1: "bad-col",
516
- column2: "y",
517
- },
518
- mockContext,
519
- ),
520
- ).rejects.toThrow("Invalid column name");
539
+ const result = (await tool.handler(
540
+ {
541
+ table: "data",
542
+ column1: "bad-col",
543
+ column2: "y",
544
+ },
545
+ mockContext,
546
+ )) as { success: boolean; error: string };
547
+
548
+ expect(result.success).toBe(false);
549
+ expect(result.error).toContain("Invalid column name");
521
550
  });
522
551
  });
523
552
 
524
553
  describe("mysql_stats_distribution", () => {
525
554
  it("should reject invalid table name", async () => {
526
555
  const tool = tools.find((t) => t.name === "mysql_stats_distribution")!;
527
- await expect(
528
- tool.handler(
529
- {
530
- table: "123-bad",
531
- column: "amount",
532
- },
533
- mockContext,
534
- ),
535
- ).rejects.toThrow("Invalid table name");
556
+ const result = (await tool.handler(
557
+ {
558
+ table: "123-bad",
559
+ column: "amount",
560
+ },
561
+ mockContext,
562
+ )) as { success: boolean; error: string };
563
+
564
+ expect(result.success).toBe(false);
565
+ expect(result.error).toContain("Invalid table name");
536
566
  });
537
567
 
538
568
  it("should reject invalid column name", async () => {
539
569
  const tool = tools.find((t) => t.name === "mysql_stats_distribution")!;
540
- await expect(
541
- tool.handler(
542
- {
543
- table: "orders",
544
- column: "bad-col",
545
- },
546
- mockContext,
547
- ),
548
- ).rejects.toThrow("Invalid column name");
570
+ const result = (await tool.handler(
571
+ {
572
+ table: "orders",
573
+ column: "bad-col",
574
+ },
575
+ mockContext,
576
+ )) as { success: boolean; error: string };
577
+
578
+ expect(result.success).toBe(false);
579
+ expect(result.error).toContain("Invalid column name");
549
580
  });
550
581
 
551
582
  it("should handle same min/max values", async () => {
@@ -569,30 +600,32 @@ describe("Stats Validation Errors", () => {
569
600
  describe("mysql_stats_time_series", () => {
570
601
  it("should reject invalid table name", async () => {
571
602
  const tool = tools.find((t) => t.name === "mysql_stats_time_series")!;
572
- await expect(
573
- tool.handler(
574
- {
575
- table: "123-bad",
576
- valueColumn: "amount",
577
- timeColumn: "created_at",
578
- },
579
- mockContext,
580
- ),
581
- ).rejects.toThrow("Invalid table name");
603
+ const result = (await tool.handler(
604
+ {
605
+ table: "123-bad",
606
+ valueColumn: "amount",
607
+ timeColumn: "created_at",
608
+ },
609
+ mockContext,
610
+ )) as { success: boolean; error: string };
611
+
612
+ expect(result.success).toBe(false);
613
+ expect(result.error).toContain("Invalid table name");
582
614
  });
583
615
 
584
616
  it("should reject invalid column names", async () => {
585
617
  const tool = tools.find((t) => t.name === "mysql_stats_time_series")!;
586
- await expect(
587
- tool.handler(
588
- {
589
- table: "sales",
590
- valueColumn: "bad-col",
591
- timeColumn: "created_at",
592
- },
593
- mockContext,
594
- ),
595
- ).rejects.toThrow("Invalid column name");
618
+ const result = (await tool.handler(
619
+ {
620
+ table: "sales",
621
+ valueColumn: "bad-col",
622
+ timeColumn: "created_at",
623
+ },
624
+ mockContext,
625
+ )) as { success: boolean; error: string };
626
+
627
+ expect(result.success).toBe(false);
628
+ expect(result.error).toContain("Invalid column name");
596
629
  });
597
630
 
598
631
  it("should use different interval formats", async () => {
@@ -618,30 +651,32 @@ describe("Stats Validation Errors", () => {
618
651
  describe("mysql_stats_regression", () => {
619
652
  it("should reject invalid table name", async () => {
620
653
  const tool = tools.find((t) => t.name === "mysql_stats_regression")!;
621
- await expect(
622
- tool.handler(
623
- {
624
- table: "123-bad",
625
- xColumn: "x",
626
- yColumn: "y",
627
- },
628
- mockContext,
629
- ),
630
- ).rejects.toThrow("Invalid table name");
654
+ const result = (await tool.handler(
655
+ {
656
+ table: "123-bad",
657
+ xColumn: "x",
658
+ yColumn: "y",
659
+ },
660
+ mockContext,
661
+ )) as { success: boolean; error: string };
662
+
663
+ expect(result.success).toBe(false);
664
+ expect(result.error).toContain("Invalid table name");
631
665
  });
632
666
 
633
667
  it("should reject invalid column names", async () => {
634
668
  const tool = tools.find((t) => t.name === "mysql_stats_regression")!;
635
- await expect(
636
- tool.handler(
637
- {
638
- table: "data",
639
- xColumn: "bad-x",
640
- yColumn: "y",
641
- },
642
- mockContext,
643
- ),
644
- ).rejects.toThrow("Invalid column name");
669
+ const result = (await tool.handler(
670
+ {
671
+ table: "data",
672
+ xColumn: "bad-x",
673
+ yColumn: "y",
674
+ },
675
+ mockContext,
676
+ )) as { success: boolean; error: string };
677
+
678
+ expect(result.success).toBe(false);
679
+ expect(result.error).toContain("Invalid column name");
645
680
  });
646
681
 
647
682
  it("should return error for insufficient data points", async () => {
@@ -663,8 +698,9 @@ describe("Stats Validation Errors", () => {
663
698
  yColumn: "y",
664
699
  },
665
700
  mockContext,
666
- )) as { error: string };
701
+ )) as { success: boolean; error: string };
667
702
 
703
+ expect(result.success).toBe(false);
668
704
  expect(result.error).toContain("Insufficient");
669
705
  });
670
706
  });
@@ -672,29 +708,31 @@ describe("Stats Validation Errors", () => {
672
708
  describe("mysql_stats_sampling", () => {
673
709
  it("should reject invalid table name", async () => {
674
710
  const tool = tools.find((t) => t.name === "mysql_stats_sampling")!;
675
- await expect(
676
- tool.handler(
677
- {
678
- table: "123-bad",
679
- sampleSize: 10,
680
- },
681
- mockContext,
682
- ),
683
- ).rejects.toThrow("Invalid table name");
711
+ const result = (await tool.handler(
712
+ {
713
+ table: "123-bad",
714
+ sampleSize: 10,
715
+ },
716
+ mockContext,
717
+ )) as { success: boolean; error: string };
718
+
719
+ expect(result.success).toBe(false);
720
+ expect(result.error).toContain("Invalid table name");
684
721
  });
685
722
 
686
723
  it("should reject invalid column names", async () => {
687
724
  const tool = tools.find((t) => t.name === "mysql_stats_sampling")!;
688
- await expect(
689
- tool.handler(
690
- {
691
- table: "users",
692
- sampleSize: 10,
693
- columns: ["valid", "bad-column"],
694
- },
695
- mockContext,
696
- ),
697
- ).rejects.toThrow("Invalid column name");
725
+ const result = (await tool.handler(
726
+ {
727
+ table: "users",
728
+ sampleSize: 10,
729
+ columns: ["valid", "bad-column"],
730
+ },
731
+ mockContext,
732
+ )) as { success: boolean; error: string };
733
+
734
+ expect(result.success).toBe(false);
735
+ expect(result.error).toContain("Invalid column name");
698
736
  });
699
737
 
700
738
  it("should use seed for reproducibility", async () => {
@@ -718,28 +756,30 @@ describe("Stats Validation Errors", () => {
718
756
  describe("mysql_stats_histogram", () => {
719
757
  it("should reject invalid table name", async () => {
720
758
  const tool = tools.find((t) => t.name === "mysql_stats_histogram")!;
721
- await expect(
722
- tool.handler(
723
- {
724
- table: "123-bad",
725
- column: "amount",
726
- },
727
- mockContext,
728
- ),
729
- ).rejects.toThrow("Invalid table name");
759
+ const result = (await tool.handler(
760
+ {
761
+ table: "123-bad",
762
+ column: "amount",
763
+ },
764
+ mockContext,
765
+ )) as { success: boolean; error: string };
766
+
767
+ expect(result.success).toBe(false);
768
+ expect(result.error).toContain("Invalid table name");
730
769
  });
731
770
 
732
771
  it("should reject invalid column name", async () => {
733
772
  const tool = tools.find((t) => t.name === "mysql_stats_histogram")!;
734
- await expect(
735
- tool.handler(
736
- {
737
- table: "orders",
738
- column: "bad-col",
739
- },
740
- mockContext,
741
- ),
742
- ).rejects.toThrow("Invalid column name");
773
+ const result = (await tool.handler(
774
+ {
775
+ table: "orders",
776
+ column: "bad-col",
777
+ },
778
+ mockContext,
779
+ )) as { success: boolean; error: string };
780
+
781
+ expect(result.success).toBe(false);
782
+ expect(result.error).toContain("Invalid column name");
743
783
  });
744
784
  });
745
785
  });
@@ -883,3 +923,96 @@ describe("Stats Nonexistent Table Handling", () => {
883
923
  expect(result.error).toContain("Unknown column");
884
924
  });
885
925
  });
926
+
927
+ describe("Stats Zod Validation Guards", () => {
928
+ let tools: ReturnType<typeof getStatsTools>;
929
+ let mockContext: ReturnType<typeof createMockRequestContext>;
930
+
931
+ beforeEach(() => {
932
+ vi.clearAllMocks();
933
+ const mockAdapter = createMockMySQLAdapter();
934
+ tools = getStatsTools(mockAdapter as unknown as MySQLAdapter);
935
+ mockContext = createMockRequestContext();
936
+ });
937
+
938
+ it("mysql_stats_time_series returns structured error for invalid interval", async () => {
939
+ const tool = tools.find((t) => t.name === "mysql_stats_time_series")!;
940
+ const result = (await tool.handler(
941
+ {
942
+ table: "sales",
943
+ valueColumn: "amount",
944
+ timeColumn: "created_at",
945
+ interval: "invalid_interval",
946
+ },
947
+ mockContext,
948
+ )) as { success: boolean; error: string };
949
+
950
+ expect(result.success).toBe(false);
951
+ expect(result.error).toContain("Invalid interval");
952
+ expect(result.error).toContain("invalid_interval");
953
+ });
954
+
955
+ it("mysql_stats_time_series returns structured error for invalid aggregation", async () => {
956
+ const tool = tools.find((t) => t.name === "mysql_stats_time_series")!;
957
+ const result = (await tool.handler(
958
+ {
959
+ table: "sales",
960
+ valueColumn: "amount",
961
+ timeColumn: "created_at",
962
+ aggregation: "invalid_agg",
963
+ },
964
+ mockContext,
965
+ )) as { success: boolean; error: string };
966
+
967
+ expect(result.success).toBe(false);
968
+ expect(result.error).toContain("Invalid aggregation");
969
+ expect(result.error).toContain("invalid_agg");
970
+ });
971
+
972
+ it("mysql_stats_sampling returns structured error for negative sampleSize", async () => {
973
+ const tool = tools.find((t) => t.name === "mysql_stats_sampling")!;
974
+ const result = (await tool.handler(
975
+ {
976
+ table: "users",
977
+ sampleSize: -1,
978
+ },
979
+ mockContext,
980
+ )) as { success: boolean; error: string };
981
+
982
+ expect(result.success).toBe(false);
983
+ expect(result.error).toContain("sampleSize");
984
+ });
985
+
986
+ it("mysql_stats_correlation returns structured error for missing required fields", async () => {
987
+ const tool = tools.find((t) => t.name === "mysql_stats_correlation")!;
988
+ const result = (await tool.handler({}, mockContext)) as {
989
+ success: boolean;
990
+ error: string;
991
+ };
992
+
993
+ expect(result.success).toBe(false);
994
+ expect(result.error).toBeDefined();
995
+ });
996
+
997
+ it("mysql_stats_regression returns structured error for missing required fields", async () => {
998
+ const tool = tools.find((t) => t.name === "mysql_stats_regression")!;
999
+ const result = (await tool.handler({}, mockContext)) as {
1000
+ success: boolean;
1001
+ error: string;
1002
+ };
1003
+
1004
+ expect(result.success).toBe(false);
1005
+ expect(result.error).toBeDefined();
1006
+ });
1007
+
1008
+ it("mysql_stats_histogram returns structured error for missing required fields", async () => {
1009
+ const tool = tools.find((t) => t.name === "mysql_stats_histogram")!;
1010
+ const result = (await tool.handler({}, mockContext)) as {
1011
+ success: boolean;
1012
+ error: string;
1013
+ };
1014
+
1015
+ expect(result.success).toBe(false);
1016
+ expect(result.error).toBeDefined();
1017
+ });
1018
+ });
@@ -168,8 +168,8 @@ describe("Handler Execution", () => {
168
168
  const result = await tool.handler({ transactionId: "gone" }, mockContext);
169
169
 
170
170
  expect(result).toHaveProperty("success", false);
171
- expect(result).toHaveProperty("reason");
172
- expect((result as { reason: string }).reason).toContain(
171
+ expect(result).toHaveProperty("error");
172
+ expect((result as { error: string }).error).toContain(
173
173
  "Transaction not found",
174
174
  );
175
175
  });
@@ -197,8 +197,8 @@ describe("Handler Execution", () => {
197
197
  const result = await tool.handler({ transactionId: "gone" }, mockContext);
198
198
 
199
199
  expect(result).toHaveProperty("success", false);
200
- expect(result).toHaveProperty("reason");
201
- expect((result as { reason: string }).reason).toContain(
200
+ expect(result).toHaveProperty("error");
201
+ expect((result as { error: string }).error).toContain(
202
202
  "Transaction not found",
203
203
  );
204
204
  });
@@ -237,7 +237,7 @@ describe("Handler Execution", () => {
237
237
  );
238
238
 
239
239
  expect(result).toHaveProperty("success", false);
240
- expect(result).toHaveProperty("reason", "Invalid savepoint name");
240
+ expect(result).toHaveProperty("error", "Invalid savepoint name");
241
241
  });
242
242
 
243
243
  it("should return structured error for non-existent transaction", async () => {
@@ -256,7 +256,7 @@ describe("Handler Execution", () => {
256
256
  );
257
257
 
258
258
  expect(result).toHaveProperty("success", false);
259
- expect((result as { reason: string }).reason).toContain(
259
+ expect((result as { error: string }).error).toContain(
260
260
  "Transaction not found",
261
261
  );
262
262
  });
@@ -292,7 +292,7 @@ describe("Handler Execution", () => {
292
292
  );
293
293
 
294
294
  expect(result).toHaveProperty("success", false);
295
- expect(result).toHaveProperty("reason", "Invalid savepoint name");
295
+ expect(result).toHaveProperty("error", "Invalid savepoint name");
296
296
  });
297
297
 
298
298
  it("should return structured error for non-existent transaction", async () => {
@@ -311,7 +311,7 @@ describe("Handler Execution", () => {
311
311
  );
312
312
 
313
313
  expect(result).toHaveProperty("success", false);
314
- expect((result as { reason: string }).reason).toContain(
314
+ expect((result as { error: string }).error).toContain(
315
315
  "Transaction not found",
316
316
  );
317
317
  });
@@ -351,7 +351,7 @@ describe("Handler Execution", () => {
351
351
  );
352
352
 
353
353
  expect(result).toHaveProperty("success", false);
354
- expect(result).toHaveProperty("reason", "Invalid savepoint name");
354
+ expect(result).toHaveProperty("error", "Invalid savepoint name");
355
355
  });
356
356
 
357
357
  it("should return structured error for non-existent transaction", async () => {
@@ -372,7 +372,7 @@ describe("Handler Execution", () => {
372
372
  );
373
373
 
374
374
  expect(result).toHaveProperty("success", false);
375
- expect((result as { reason: string }).reason).toContain(
375
+ expect((result as { error: string }).error).toContain(
376
376
  "Transaction not found",
377
377
  );
378
378
  });
@@ -383,8 +383,8 @@ describe("Handler Execution", () => {
383
383
  const tool = tools.find((t) => t.name === "mysql_transaction_execute")!;
384
384
  const result = await tool.handler({ statements: [] }, mockContext);
385
385
  expect(result).toHaveProperty("success", false);
386
- expect(result).toHaveProperty("reason");
387
- expect((result as { reason: string }).reason).toContain("No statements");
386
+ expect(result).toHaveProperty("error");
387
+ expect((result as { error: string }).error).toContain("No statements");
388
388
  expect(mockAdapter.beginTransaction).not.toHaveBeenCalled();
389
389
  });
390
390
 
@@ -473,7 +473,7 @@ describe("Handler Execution", () => {
473
473
  expect(mockAdapter.rollbackTransaction).toHaveBeenCalled();
474
474
  expect(result).toHaveProperty("success", false);
475
475
  expect(result).toHaveProperty("rolledBack", true);
476
- expect((result as { reason: string }).reason).toContain(
476
+ expect((result as { error: string }).error).toContain(
477
477
  "Transaction failed and was rolled back",
478
478
  );
479
479
  });