@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
@@ -88,12 +88,12 @@ describe("hasAllScopes", () => {
88
88
 
89
89
  describe("getScopeForToolGroup", () => {
90
90
  it("should return read for query tools", () => {
91
- expect(getScopeForToolGroup("core")).toBe(SCOPES.READ);
92
91
  expect(getScopeForToolGroup("json")).toBe(SCOPES.READ);
93
92
  expect(getScopeForToolGroup("text")).toBe(SCOPES.READ);
94
93
  });
95
94
 
96
- it("should return write for transaction tools", () => {
95
+ it("should return write for core and transaction tools", () => {
96
+ expect(getScopeForToolGroup("core")).toBe(SCOPES.WRITE);
97
97
  expect(getScopeForToolGroup("transactions")).toBe(SCOPES.WRITE);
98
98
  });
99
99
 
@@ -48,7 +48,7 @@ export const ALL_SCOPES = [
48
48
  * Map tool groups to required minimum scopes
49
49
  */
50
50
  export const TOOL_GROUP_SCOPES: Record<ToolGroup, StandardScope> = {
51
- core: SCOPES.READ,
51
+ core: SCOPES.WRITE,
52
52
  json: SCOPES.READ,
53
53
  text: SCOPES.READ,
54
54
  fulltext: SCOPES.READ,
@@ -0,0 +1,417 @@
1
+ /**
2
+ * mysql-mcp - Code Mode API Unit Tests
3
+ *
4
+ * Tests for MysqlApi, normalizeParams, toolNameToMethodName, and createGroupApi.
5
+ */
6
+
7
+ import { describe, it, expect, vi, beforeEach } from "vitest";
8
+ import { MysqlApi } from "../api.js";
9
+ import type { MySQLAdapter } from "../../adapters/mysql/MySQLAdapter.js";
10
+
11
+ // Suppress logger
12
+ vi.mock("../../utils/logger.js", () => ({
13
+ logger: { info: vi.fn(), warning: vi.fn(), error: vi.fn() },
14
+ }));
15
+
16
+ /**
17
+ * Create a minimal mock adapter that provides tool definitions
18
+ * for testing the MysqlApi class.
19
+ */
20
+ function createMockAdapterWithTools(): MySQLAdapter {
21
+ const mockTools = [
22
+ {
23
+ name: "mysql_read_query",
24
+ group: "core",
25
+ title: "Read Query",
26
+ description: "Execute a read query",
27
+ inputSchema: { parse: (v: unknown) => v },
28
+ requiredScopes: ["read"],
29
+ annotations: { readOnlyHint: true },
30
+ handler: vi.fn().mockResolvedValue({ rows: [], rowsAffected: 0 }),
31
+ },
32
+ {
33
+ name: "mysql_write_query",
34
+ group: "core",
35
+ title: "Write Query",
36
+ description: "Execute a write query",
37
+ inputSchema: { parse: (v: unknown) => v },
38
+ requiredScopes: ["write"],
39
+ annotations: {},
40
+ handler: vi.fn().mockResolvedValue({ rows: [], rowsAffected: 1 }),
41
+ },
42
+ {
43
+ name: "mysql_describe_table",
44
+ group: "core",
45
+ title: "Describe Table",
46
+ description: "Describe a table",
47
+ inputSchema: { parse: (v: unknown) => v },
48
+ requiredScopes: ["read"],
49
+ annotations: { readOnlyHint: true },
50
+ handler: vi.fn().mockResolvedValue({ columns: [] }),
51
+ },
52
+ {
53
+ name: "mysql_json_extract",
54
+ group: "json",
55
+ title: "JSON Extract",
56
+ description: "Extract JSON value",
57
+ inputSchema: { parse: (v: unknown) => v },
58
+ requiredScopes: ["read"],
59
+ annotations: { readOnlyHint: true },
60
+ handler: vi.fn().mockResolvedValue({ rows: [] }),
61
+ },
62
+ {
63
+ name: "mysql_fulltext_search",
64
+ group: "fulltext",
65
+ title: "Fulltext Search",
66
+ description: "Search fulltext index",
67
+ inputSchema: { parse: (v: unknown) => v },
68
+ requiredScopes: ["read"],
69
+ annotations: { readOnlyHint: true },
70
+ handler: vi.fn().mockResolvedValue({ rows: [] }),
71
+ },
72
+ {
73
+ name: "mysql_transaction_begin",
74
+ group: "transactions",
75
+ title: "Begin Transaction",
76
+ description: "Begin a transaction",
77
+ inputSchema: { parse: (v: unknown) => v },
78
+ requiredScopes: ["write"],
79
+ annotations: {},
80
+ handler: vi.fn().mockResolvedValue({ transactionId: "txn-1" }),
81
+ },
82
+ {
83
+ name: "mysql_transaction_commit",
84
+ group: "transactions",
85
+ title: "Commit Transaction",
86
+ description: "Commit a transaction",
87
+ inputSchema: { parse: (v: unknown) => v },
88
+ requiredScopes: ["write"],
89
+ annotations: {},
90
+ handler: vi.fn().mockResolvedValue({ success: true }),
91
+ },
92
+ {
93
+ name: "mysql_sys_schema_stats",
94
+ group: "sysschema",
95
+ title: "Schema Stats",
96
+ description: "Get schema stats from sys schema",
97
+ inputSchema: { parse: (v: unknown) => v },
98
+ requiredScopes: ["read"],
99
+ annotations: { readOnlyHint: true },
100
+ handler: vi.fn().mockResolvedValue({ stats: [] }),
101
+ },
102
+ {
103
+ name: "mysql_doc_add",
104
+ group: "docstore",
105
+ title: "Add Document",
106
+ description: "Add document to collection",
107
+ inputSchema: { parse: (v: unknown) => v },
108
+ requiredScopes: ["write"],
109
+ annotations: {},
110
+ handler: vi.fn().mockResolvedValue({ success: true }),
111
+ },
112
+ {
113
+ name: "mysql_mysqlsh_run_script",
114
+ group: "shell",
115
+ title: "Run Script",
116
+ description: "Run MySQL Shell script",
117
+ inputSchema: { parse: (v: unknown) => v },
118
+ requiredScopes: ["admin"],
119
+ annotations: {},
120
+ handler: vi.fn().mockResolvedValue({ output: "" }),
121
+ },
122
+ ];
123
+
124
+ return {
125
+ getToolDefinitions: vi.fn().mockReturnValue(mockTools),
126
+ createContext: vi.fn().mockReturnValue({
127
+ timestamp: new Date(),
128
+ requestId: "test-ctx",
129
+ }),
130
+ } as unknown as MySQLAdapter;
131
+ }
132
+
133
+ describe("MysqlApi", () => {
134
+ let api: MysqlApi;
135
+ let mockAdapter: MySQLAdapter;
136
+
137
+ beforeEach(() => {
138
+ vi.clearAllMocks();
139
+ mockAdapter = createMockAdapterWithTools();
140
+ api = new MysqlApi(mockAdapter);
141
+ });
142
+
143
+ // ===========================================================================
144
+ // Constructor / Group creation
145
+ // ===========================================================================
146
+ describe("constructor", () => {
147
+ it("should create API with group properties", () => {
148
+ expect(api.core).toBeDefined();
149
+ expect(api.json).toBeDefined();
150
+ expect(api.fulltext).toBeDefined();
151
+ expect(api.transactions).toBeDefined();
152
+ expect(api.sysschema).toBeDefined();
153
+ expect(api.docstore).toBeDefined();
154
+ expect(api.shell).toBeDefined();
155
+ });
156
+
157
+ it("should create methods for each tool", () => {
158
+ expect(api.core.readQuery).toBeTypeOf("function");
159
+ expect(api.core.writeQuery).toBeTypeOf("function");
160
+ expect(api.core.describeTable).toBeTypeOf("function");
161
+ });
162
+
163
+ it("should handle readonly flag", () => {
164
+ const readonlyApi = new MysqlApi(mockAdapter, true);
165
+ expect(readonlyApi).toBeDefined();
166
+ });
167
+ });
168
+
169
+ // ===========================================================================
170
+ // Tool name to method name conversion
171
+ // ===========================================================================
172
+ describe("toolNameToMethodName (via generated methods)", () => {
173
+ it("should strip mysql_ prefix and convert to camelCase for core", () => {
174
+ // mysql_read_query -> readQuery (strips mysql_ and core_)
175
+ expect(api.core).toHaveProperty("readQuery");
176
+ });
177
+
178
+ it("should strip mysql_ but keep group prefix for keepPrefix groups", () => {
179
+ // mysql_fulltext_search -> fulltextSearch (keeps fulltext prefix)
180
+ expect(api.fulltext).toHaveProperty("fulltextSearch");
181
+ });
182
+
183
+ it("should keep prefix for sysschema group", () => {
184
+ // mysql_sys_schema_stats -> sysSchemaStats
185
+ expect(api.sysschema).toHaveProperty("sysSchemaStats");
186
+ });
187
+
188
+ it("should keep prefix for transactions group", () => {
189
+ // mysql_transaction_begin -> transactionBegin
190
+ expect(api.transactions).toHaveProperty("transactionBegin");
191
+ });
192
+
193
+ it("should keep prefix for docstore group", () => {
194
+ // mysql_doc_add -> docAdd
195
+ expect(api.docstore).toHaveProperty("docAdd");
196
+ });
197
+
198
+ it("should strip mysqlsh_ prefix for shell group", () => {
199
+ // mysql_mysqlsh_run_script -> runScript
200
+ expect(api.shell).toHaveProperty("runScript");
201
+ });
202
+
203
+ it("should strip json_ prefix for json group", () => {
204
+ // mysql_json_extract -> extract
205
+ expect(api.json).toHaveProperty("extract");
206
+ });
207
+ });
208
+
209
+ // ===========================================================================
210
+ // Method execution
211
+ // ===========================================================================
212
+ describe("method execution", () => {
213
+ it("should call tool handler with object params", async () => {
214
+ await api.core.readQuery({ sql: "SELECT 1" });
215
+ const tools = mockAdapter.getToolDefinitions();
216
+ const readTool = tools.find(
217
+ (t: { name: string }) => t.name === "mysql_read_query",
218
+ );
219
+ expect(readTool.handler).toHaveBeenCalled();
220
+ });
221
+
222
+ it("should normalize positional string argument", async () => {
223
+ await api.core.readQuery("SELECT 1");
224
+ const tools = mockAdapter.getToolDefinitions();
225
+ const readTool = tools.find(
226
+ (t: { name: string }) => t.name === "mysql_read_query",
227
+ );
228
+ // Should have been called with { sql: "SELECT 1" } after normalization
229
+ expect(readTool.handler).toHaveBeenCalled();
230
+ });
231
+
232
+ it("should pass empty params for no-arg calls", async () => {
233
+ await api.core.readQuery();
234
+ const tools = mockAdapter.getToolDefinitions();
235
+ const readTool = tools.find(
236
+ (t: { name: string }) => t.name === "mysql_read_query",
237
+ );
238
+ expect(readTool.handler).toHaveBeenCalled();
239
+ });
240
+
241
+ it("should create context for each call", async () => {
242
+ await api.core.readQuery("SELECT 1");
243
+ expect(mockAdapter.createContext).toHaveBeenCalled();
244
+ });
245
+ });
246
+
247
+ // ===========================================================================
248
+ // Method aliases
249
+ // ===========================================================================
250
+ describe("method aliases", () => {
251
+ it("should create aliases for json group", () => {
252
+ // jsonExtract -> extract alias
253
+ if (api.json.jsonExtract) {
254
+ expect(api.json.jsonExtract).toBe(api.json.extract);
255
+ }
256
+ });
257
+
258
+ it("should create aliases for transaction group", () => {
259
+ // begin -> transactionBegin alias
260
+ if (api.transactions.begin) {
261
+ expect(api.transactions.begin).toBe(api.transactions.transactionBegin);
262
+ }
263
+ });
264
+ });
265
+
266
+ // ===========================================================================
267
+ // getAvailableGroups
268
+ // ===========================================================================
269
+ describe("getAvailableGroups", () => {
270
+ it("should return all groups with method counts", () => {
271
+ const groups = api.getAvailableGroups();
272
+ expect(groups).toHaveProperty("core");
273
+ expect(groups["core"]).toBe(3); // readQuery, writeQuery, describeTable
274
+ expect(groups).toHaveProperty("json");
275
+ expect(groups["json"]).toBe(1); // extract
276
+ });
277
+ });
278
+
279
+ // ===========================================================================
280
+ // getGroupMethods
281
+ // ===========================================================================
282
+ describe("getGroupMethods", () => {
283
+ it("should return method names for valid group", () => {
284
+ const methods = api.getGroupMethods("core");
285
+ expect(methods).toContain("readQuery");
286
+ expect(methods).toContain("writeQuery");
287
+ });
288
+
289
+ it("should return empty array for unknown group", () => {
290
+ const methods = api.getGroupMethods("nonexistent");
291
+ expect(methods).toHaveLength(0);
292
+ });
293
+ });
294
+
295
+ // ===========================================================================
296
+ // help
297
+ // ===========================================================================
298
+ describe("help", () => {
299
+ it("should return all groups with their methods", () => {
300
+ const help = api.help();
301
+ expect(help).toHaveProperty("core");
302
+ expect(help["core"]).toContain("readQuery");
303
+ });
304
+
305
+ it("should include examples in help output", () => {
306
+ const help = api.help();
307
+ // help() returns methods and potentially examples
308
+ expect(Object.keys(help).length).toBeGreaterThan(0);
309
+ });
310
+ });
311
+ });
312
+
313
+ // =============================================================================
314
+ // normalizeParams (tested indirectly through method calls)
315
+ // =============================================================================
316
+ describe("normalizeParams (indirect)", () => {
317
+ let api: MysqlApi;
318
+ let mockAdapter: MySQLAdapter;
319
+
320
+ beforeEach(() => {
321
+ const mockTools = [
322
+ {
323
+ name: "mysql_read_query",
324
+ group: "core",
325
+ title: "Read Query",
326
+ description: "Execute read query",
327
+ inputSchema: { parse: (v: unknown) => v },
328
+ requiredScopes: ["read"],
329
+ annotations: {},
330
+ handler: vi.fn().mockResolvedValue({ rows: [] }),
331
+ },
332
+ {
333
+ name: "mysql_create_table",
334
+ group: "core",
335
+ title: "Create Table",
336
+ description: "Create a table",
337
+ inputSchema: { parse: (v: unknown) => v },
338
+ requiredScopes: ["write"],
339
+ annotations: {},
340
+ handler: vi.fn().mockResolvedValue({ success: true }),
341
+ },
342
+ {
343
+ name: "mysql_transaction_execute",
344
+ group: "transactions",
345
+ title: "Transaction Execute",
346
+ description: "Execute statements in transaction",
347
+ inputSchema: { parse: (v: unknown) => v },
348
+ requiredScopes: ["write"],
349
+ annotations: {},
350
+ handler: vi.fn().mockResolvedValue({ success: true }),
351
+ },
352
+ ];
353
+
354
+ mockAdapter = {
355
+ getToolDefinitions: vi.fn().mockReturnValue(mockTools),
356
+ createContext: vi.fn().mockReturnValue({
357
+ timestamp: new Date(),
358
+ requestId: "test",
359
+ }),
360
+ } as unknown as MySQLAdapter;
361
+
362
+ api = new MysqlApi(mockAdapter);
363
+ });
364
+
365
+ it("should pass object params through unchanged", async () => {
366
+ const tools = mockAdapter.getToolDefinitions();
367
+ const readTool = tools.find(
368
+ (t: { name: string }) => t.name === "mysql_read_query",
369
+ );
370
+ await api.core.readQuery({ sql: "SELECT 1", limit: 10 });
371
+ expect(readTool.handler).toHaveBeenCalledWith(
372
+ { sql: "SELECT 1", limit: 10 },
373
+ expect.anything(),
374
+ );
375
+ });
376
+
377
+ it("should map single string arg to parameter key", async () => {
378
+ const tools = mockAdapter.getToolDefinitions();
379
+ const readTool = tools.find(
380
+ (t: { name: string }) => t.name === "mysql_read_query",
381
+ );
382
+ await api.core.readQuery("SELECT 1");
383
+ const calledWith = readTool.handler.mock.calls[0][0];
384
+ expect(calledWith).toHaveProperty("sql", "SELECT 1");
385
+ });
386
+
387
+ it("should map multi positional args to array keys", async () => {
388
+ const tools = mockAdapter.getToolDefinitions();
389
+ const createTool = tools.find(
390
+ (t: { name: string }) => t.name === "mysql_create_table",
391
+ );
392
+ await api.core.createTable("orders", [{ name: "id", type: "INT" }]);
393
+ const calledWith = createTool.handler.mock.calls[0][0];
394
+ expect(calledWith).toHaveProperty("name", "orders");
395
+ expect(calledWith).toHaveProperty("columns");
396
+ });
397
+
398
+ it("should wrap array arg in ARRAY_WRAP_MAP key", async () => {
399
+ const tools = mockAdapter.getToolDefinitions();
400
+ const execTool = tools.find(
401
+ (t: { name: string }) => t.name === "mysql_transaction_execute",
402
+ );
403
+ const stmts = [{ sql: "INSERT INTO t VALUES(1)" }];
404
+ await api.transactions.transactionExecute(stmts);
405
+ const calledWith = execTool.handler.mock.calls[0][0];
406
+ expect(calledWith).toHaveProperty("statements");
407
+ });
408
+
409
+ it("should handle no-arg calls", async () => {
410
+ const tools = mockAdapter.getToolDefinitions();
411
+ const readTool = tools.find(
412
+ (t: { name: string }) => t.name === "mysql_read_query",
413
+ );
414
+ await api.core.readQuery();
415
+ expect(readTool.handler).toHaveBeenCalledWith({}, expect.anything());
416
+ });
417
+ });
@@ -0,0 +1,158 @@
1
+ /**
2
+ * mysql-mcp - Sandbox Factory Unit Tests
3
+ *
4
+ * Tests for sandbox factory functions: mode management,
5
+ * sandbox/pool creation, and mode info retrieval.
6
+ */
7
+
8
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
9
+ import {
10
+ setDefaultSandboxMode,
11
+ getDefaultSandboxMode,
12
+ getAvailableSandboxModes,
13
+ createSandbox,
14
+ createSandboxPool,
15
+ getSandboxModeInfo,
16
+ } from "../sandbox-factory.js";
17
+
18
+ // Suppress logger
19
+ vi.mock("../../utils/logger.js", () => ({
20
+ logger: { info: vi.fn(), warning: vi.fn(), error: vi.fn() },
21
+ }));
22
+
23
+ describe("Sandbox Factory", () => {
24
+ afterEach(() => {
25
+ // Reset default mode to 'worker' after each test
26
+ setDefaultSandboxMode("worker");
27
+ });
28
+
29
+ // ===========================================================================
30
+ // Mode management
31
+ // ===========================================================================
32
+ describe("setDefaultSandboxMode / getDefaultSandboxMode", () => {
33
+ it("should default to 'worker'", () => {
34
+ expect(getDefaultSandboxMode()).toBe("worker");
35
+ });
36
+
37
+ it("should allow setting to 'vm'", () => {
38
+ setDefaultSandboxMode("vm");
39
+ expect(getDefaultSandboxMode()).toBe("vm");
40
+ });
41
+
42
+ it("should allow setting back to 'worker'", () => {
43
+ setDefaultSandboxMode("vm");
44
+ setDefaultSandboxMode("worker");
45
+ expect(getDefaultSandboxMode()).toBe("worker");
46
+ });
47
+ });
48
+
49
+ describe("getAvailableSandboxModes", () => {
50
+ it("should return both modes", () => {
51
+ const modes = getAvailableSandboxModes();
52
+ expect(modes).toContain("vm");
53
+ expect(modes).toContain("worker");
54
+ expect(modes).toHaveLength(2);
55
+ });
56
+ });
57
+
58
+ // ===========================================================================
59
+ // createSandbox
60
+ // ===========================================================================
61
+ describe("createSandbox", () => {
62
+ it("should create a vm sandbox when mode is 'vm'", () => {
63
+ const sandbox = createSandbox("vm");
64
+ expect(sandbox).toBeDefined();
65
+ expect(sandbox.isHealthy()).toBe(true);
66
+ expect(sandbox.execute).toBeTypeOf("function");
67
+ expect(sandbox.dispose).toBeTypeOf("function");
68
+ sandbox.dispose();
69
+ });
70
+
71
+ it("should create a worker sandbox when mode is 'worker'", () => {
72
+ const sandbox = createSandbox("worker");
73
+ expect(sandbox).toBeDefined();
74
+ expect(sandbox.isHealthy()).toBe(true);
75
+ sandbox.dispose();
76
+ });
77
+
78
+ it("should use default mode when no mode specified", () => {
79
+ setDefaultSandboxMode("vm");
80
+ const sandbox = createSandbox();
81
+ expect(sandbox).toBeDefined();
82
+ expect(sandbox.isHealthy()).toBe(true);
83
+ sandbox.dispose();
84
+ });
85
+
86
+ it("should accept sandbox options", () => {
87
+ const sandbox = createSandbox("vm", {
88
+ memoryLimitMb: 64,
89
+ timeoutMs: 5000,
90
+ });
91
+ expect(sandbox).toBeDefined();
92
+ sandbox.dispose();
93
+ });
94
+ });
95
+
96
+ // ===========================================================================
97
+ // createSandboxPool
98
+ // ===========================================================================
99
+ describe("createSandboxPool", () => {
100
+ it("should create a vm pool", () => {
101
+ const pool = createSandboxPool("vm", {
102
+ minInstances: 0,
103
+ maxInstances: 2,
104
+ });
105
+ expect(pool).toBeDefined();
106
+ expect(pool.getStats).toBeTypeOf("function");
107
+ pool.dispose();
108
+ });
109
+
110
+ it("should create a worker pool", () => {
111
+ const pool = createSandboxPool("worker", {
112
+ minInstances: 0,
113
+ maxInstances: 2,
114
+ });
115
+ expect(pool).toBeDefined();
116
+ pool.dispose();
117
+ });
118
+
119
+ it("should use default mode when no mode specified", () => {
120
+ setDefaultSandboxMode("vm");
121
+ const pool = createSandboxPool(undefined, {
122
+ minInstances: 0,
123
+ maxInstances: 2,
124
+ });
125
+ expect(pool).toBeDefined();
126
+ pool.dispose();
127
+ });
128
+ });
129
+
130
+ // ===========================================================================
131
+ // getSandboxModeInfo
132
+ // ===========================================================================
133
+ describe("getSandboxModeInfo", () => {
134
+ it("should return worker mode info", () => {
135
+ const info = getSandboxModeInfo("worker");
136
+ expect(info.name).toBe("Worker Thread");
137
+ expect(info.isolation).toContain("V8");
138
+ expect(info.security).toContain("Enhanced");
139
+ });
140
+
141
+ it("should return vm mode info", () => {
142
+ const info = getSandboxModeInfo("vm");
143
+ expect(info.name).toBe("VM Context");
144
+ expect(info.isolation).toContain("Script isolation");
145
+ });
146
+
147
+ it("should have all required fields", () => {
148
+ for (const mode of getAvailableSandboxModes()) {
149
+ const info = getSandboxModeInfo(mode);
150
+ expect(info.name).toBeTruthy();
151
+ expect(info.isolation).toBeTruthy();
152
+ expect(info.performance).toBeTruthy();
153
+ expect(info.security).toBeTruthy();
154
+ expect(info.requirements).toBeTruthy();
155
+ }
156
+ });
157
+ });
158
+ });