@neverinfamous/mysql-mcp 2.3.1 → 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.
- package/.dockerignore +1 -0
- package/.gitattributes +18 -0
- package/.github/workflows/codeql.yml +2 -2
- package/.github/workflows/docker-publish.yml +5 -5
- package/CHANGELOG.md +276 -1
- package/DOCKER_README.md +81 -40
- package/README.md +87 -46
- package/VERSION +1 -1
- package/dist/__tests__/mocks/adapter.d.ts.map +1 -1
- package/dist/__tests__/mocks/adapter.js +2 -0
- package/dist/__tests__/mocks/adapter.js.map +1 -1
- package/dist/adapters/DatabaseAdapter.d.ts.map +1 -1
- package/dist/adapters/DatabaseAdapter.js +50 -9
- package/dist/adapters/DatabaseAdapter.js.map +1 -1
- package/dist/adapters/mysql/MySQLAdapter.d.ts +6 -0
- package/dist/adapters/mysql/MySQLAdapter.d.ts.map +1 -1
- package/dist/adapters/mysql/MySQLAdapter.js +8 -0
- package/dist/adapters/mysql/MySQLAdapter.js.map +1 -1
- package/dist/adapters/mysql/SchemaManager.js +16 -15
- package/dist/adapters/mysql/SchemaManager.js.map +1 -1
- package/dist/adapters/mysql/prompts/index.js +10 -20
- package/dist/adapters/mysql/prompts/index.js.map +1 -1
- package/dist/adapters/mysql/prompts/proxysqlSetup.js +1 -1
- package/dist/adapters/mysql/resources/docstore.d.ts.map +1 -1
- package/dist/adapters/mysql/resources/docstore.js +10 -7
- package/dist/adapters/mysql/resources/docstore.js.map +1 -1
- package/dist/adapters/mysql/resources/events.js +11 -8
- package/dist/adapters/mysql/resources/events.js.map +1 -1
- package/dist/adapters/mysql/resources/indexes.d.ts.map +1 -1
- package/dist/adapters/mysql/resources/indexes.js +12 -15
- package/dist/adapters/mysql/resources/indexes.js.map +1 -1
- package/dist/adapters/mysql/resources/innodb.d.ts.map +1 -1
- package/dist/adapters/mysql/resources/innodb.js +20 -17
- package/dist/adapters/mysql/resources/innodb.js.map +1 -1
- package/dist/adapters/mysql/resources/locks.d.ts.map +1 -1
- package/dist/adapters/mysql/resources/locks.js +9 -6
- package/dist/adapters/mysql/resources/locks.js.map +1 -1
- package/dist/adapters/mysql/resources/performance.d.ts.map +1 -1
- package/dist/adapters/mysql/resources/performance.js +15 -15
- package/dist/adapters/mysql/resources/performance.js.map +1 -1
- package/dist/adapters/mysql/resources/spatial.d.ts.map +1 -1
- package/dist/adapters/mysql/resources/spatial.js +9 -6
- package/dist/adapters/mysql/resources/spatial.js.map +1 -1
- package/dist/adapters/mysql/resources/sysschema.d.ts.map +1 -1
- package/dist/adapters/mysql/resources/sysschema.js +12 -9
- package/dist/adapters/mysql/resources/sysschema.js.map +1 -1
- package/dist/adapters/mysql/tools/admin/backup.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/admin/backup.js +170 -121
- package/dist/adapters/mysql/tools/admin/backup.js.map +1 -1
- package/dist/adapters/mysql/tools/admin/maintenance.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/admin/maintenance.js +106 -57
- package/dist/adapters/mysql/tools/admin/maintenance.js.map +1 -1
- package/dist/adapters/mysql/tools/admin/monitoring.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/admin/monitoring.js +183 -101
- package/dist/adapters/mysql/tools/admin/monitoring.js.map +1 -1
- package/dist/adapters/mysql/tools/cluster/group-replication.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/cluster/group-replication.js +164 -120
- package/dist/adapters/mysql/tools/cluster/group-replication.js.map +1 -1
- package/dist/adapters/mysql/tools/cluster/innodb-cluster.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/cluster/innodb-cluster.js +212 -145
- package/dist/adapters/mysql/tools/cluster/innodb-cluster.js.map +1 -1
- package/dist/adapters/mysql/tools/codemode/index.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/codemode/index.js +6 -4
- package/dist/adapters/mysql/tools/codemode/index.js.map +1 -1
- package/dist/adapters/mysql/tools/core.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/core.js +152 -29
- package/dist/adapters/mysql/tools/core.js.map +1 -1
- package/dist/adapters/mysql/tools/docstore.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/docstore.js +340 -163
- package/dist/adapters/mysql/tools/docstore.js.map +1 -1
- package/dist/adapters/mysql/tools/events.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/events.js +284 -198
- package/dist/adapters/mysql/tools/events.js.map +1 -1
- package/dist/adapters/mysql/tools/json/core.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/json/core.js +11 -39
- package/dist/adapters/mysql/tools/json/core.js.map +1 -1
- package/dist/adapters/mysql/tools/json/enhanced.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/json/enhanced.js +15 -33
- package/dist/adapters/mysql/tools/json/enhanced.js.map +1 -1
- package/dist/adapters/mysql/tools/json/helpers.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/json/helpers.js +13 -24
- package/dist/adapters/mysql/tools/json/helpers.js.map +1 -1
- package/dist/adapters/mysql/tools/partitioning.js +3 -0
- package/dist/adapters/mysql/tools/partitioning.js.map +1 -1
- package/dist/adapters/mysql/tools/performance/analysis.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/performance/analysis.js +89 -60
- package/dist/adapters/mysql/tools/performance/analysis.js.map +1 -1
- package/dist/adapters/mysql/tools/performance/optimization.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/performance/optimization.js +151 -127
- package/dist/adapters/mysql/tools/performance/optimization.js.map +1 -1
- package/dist/adapters/mysql/tools/proxysql.d.ts +1 -1
- package/dist/adapters/mysql/tools/proxysql.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/proxysql.js +289 -176
- package/dist/adapters/mysql/tools/proxysql.js.map +1 -1
- package/dist/adapters/mysql/tools/replication.js +75 -49
- package/dist/adapters/mysql/tools/replication.js.map +1 -1
- package/dist/adapters/mysql/tools/roles.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/roles.js +224 -182
- package/dist/adapters/mysql/tools/roles.js.map +1 -1
- package/dist/adapters/mysql/tools/router.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/router.js +168 -67
- package/dist/adapters/mysql/tools/router.js.map +1 -1
- package/dist/adapters/mysql/tools/schema/constraints.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/schema/constraints.js +21 -3
- package/dist/adapters/mysql/tools/schema/constraints.js.map +1 -1
- package/dist/adapters/mysql/tools/schema/management.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/schema/management.js +61 -14
- package/dist/adapters/mysql/tools/schema/management.js.map +1 -1
- package/dist/adapters/mysql/tools/schema/routines.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/schema/routines.js +27 -4
- package/dist/adapters/mysql/tools/schema/routines.js.map +1 -1
- package/dist/adapters/mysql/tools/schema/scheduled_events.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/schema/scheduled_events.js +24 -3
- package/dist/adapters/mysql/tools/schema/scheduled_events.js.map +1 -1
- package/dist/adapters/mysql/tools/schema/triggers.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/schema/triggers.js +23 -2
- package/dist/adapters/mysql/tools/schema/triggers.js.map +1 -1
- package/dist/adapters/mysql/tools/schema/views.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/schema/views.js +47 -7
- package/dist/adapters/mysql/tools/schema/views.js.map +1 -1
- package/dist/adapters/mysql/tools/security/audit.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/security/audit.js +102 -34
- package/dist/adapters/mysql/tools/security/audit.js.map +1 -1
- package/dist/adapters/mysql/tools/security/data-protection.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/security/data-protection.js +264 -205
- package/dist/adapters/mysql/tools/security/data-protection.js.map +1 -1
- package/dist/adapters/mysql/tools/security/encryption.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/security/encryption.js +137 -104
- package/dist/adapters/mysql/tools/security/encryption.js.map +1 -1
- package/dist/adapters/mysql/tools/shell/backup.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/shell/backup.js +71 -59
- package/dist/adapters/mysql/tools/shell/backup.js.map +1 -1
- package/dist/adapters/mysql/tools/shell/restore.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/shell/restore.js +61 -47
- package/dist/adapters/mysql/tools/shell/restore.js.map +1 -1
- package/dist/adapters/mysql/tools/spatial/geometry.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/spatial/geometry.js +19 -5
- package/dist/adapters/mysql/tools/spatial/geometry.js.map +1 -1
- package/dist/adapters/mysql/tools/spatial/operations.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/spatial/operations.js +42 -17
- package/dist/adapters/mysql/tools/spatial/operations.js.map +1 -1
- package/dist/adapters/mysql/tools/spatial/queries.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/spatial/queries.js +109 -57
- package/dist/adapters/mysql/tools/spatial/queries.js.map +1 -1
- package/dist/adapters/mysql/tools/spatial/setup.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/spatial/setup.js +103 -50
- package/dist/adapters/mysql/tools/spatial/setup.js.map +1 -1
- package/dist/adapters/mysql/tools/stats/comparative.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/stats/comparative.js +128 -79
- package/dist/adapters/mysql/tools/stats/comparative.js.map +1 -1
- package/dist/adapters/mysql/tools/stats/descriptive.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/stats/descriptive.js +174 -102
- package/dist/adapters/mysql/tools/stats/descriptive.js.map +1 -1
- package/dist/adapters/mysql/tools/sysschema/activity.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/sysschema/activity.js +50 -25
- package/dist/adapters/mysql/tools/sysschema/activity.js.map +1 -1
- package/dist/adapters/mysql/tools/sysschema/performance.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/sysschema/performance.js +121 -66
- package/dist/adapters/mysql/tools/sysschema/performance.js.map +1 -1
- package/dist/adapters/mysql/tools/sysschema/resources.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/sysschema/resources.js +101 -64
- package/dist/adapters/mysql/tools/sysschema/resources.js.map +1 -1
- package/dist/adapters/mysql/tools/text/fulltext.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/text/fulltext.js +18 -32
- package/dist/adapters/mysql/tools/text/fulltext.js.map +1 -1
- package/dist/adapters/mysql/tools/transactions.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/transactions.js +48 -23
- package/dist/adapters/mysql/tools/transactions.js.map +1 -1
- package/dist/adapters/mysql/types/proxysql-types.d.ts +15 -0
- package/dist/adapters/mysql/types/proxysql-types.d.ts.map +1 -1
- package/dist/adapters/mysql/types/proxysql-types.js +33 -1
- package/dist/adapters/mysql/types/proxysql-types.js.map +1 -1
- package/dist/adapters/mysql/types/router-types.d.ts +1 -1
- package/dist/adapters/mysql/types/router-types.js +1 -1
- package/dist/adapters/mysql/types/router-types.js.map +1 -1
- package/dist/adapters/mysql/types/shell-types.js +2 -2
- package/dist/adapters/mysql/types/shell-types.js.map +1 -1
- package/dist/adapters/mysql/types.d.ts +485 -21
- package/dist/adapters/mysql/types.d.ts.map +1 -1
- package/dist/adapters/mysql/types.js +546 -19
- package/dist/adapters/mysql/types.js.map +1 -1
- package/dist/auth/scopes.js +1 -1
- package/dist/auth/scopes.js.map +1 -1
- package/dist/codemode/api.d.ts +3 -2
- package/dist/codemode/api.d.ts.map +1 -1
- package/dist/codemode/api.js +80 -5
- package/dist/codemode/api.js.map +1 -1
- package/dist/codemode/sandbox-factory.js +1 -1
- package/dist/codemode/sandbox-factory.js.map +1 -1
- package/dist/codemode/types.d.ts +26 -0
- package/dist/codemode/types.d.ts.map +1 -1
- package/dist/codemode/types.js +2 -0
- package/dist/codemode/types.js.map +1 -1
- package/dist/codemode/worker-sandbox.d.ts +4 -2
- package/dist/codemode/worker-sandbox.d.ts.map +1 -1
- package/dist/codemode/worker-sandbox.js +66 -7
- package/dist/codemode/worker-sandbox.js.map +1 -1
- package/dist/codemode/worker-script.d.ts +3 -0
- package/dist/codemode/worker-script.d.ts.map +1 -1
- package/dist/codemode/worker-script.js +128 -75
- package/dist/codemode/worker-script.js.map +1 -1
- package/dist/constants/ServerInstructions.d.ts +1 -1
- package/dist/constants/ServerInstructions.d.ts.map +1 -1
- package/dist/constants/ServerInstructions.js +37 -31
- package/dist/constants/ServerInstructions.js.map +1 -1
- package/dist/filtering/ToolConstants.d.ts +1 -1
- package/dist/filtering/ToolConstants.d.ts.map +1 -1
- package/dist/filtering/ToolConstants.js +1 -2
- package/dist/filtering/ToolConstants.js.map +1 -1
- package/dist/pool/ConnectionPool.d.ts.map +1 -1
- package/dist/pool/ConnectionPool.js.map +1 -1
- package/dist/transports/http.d.ts.map +1 -1
- package/dist/transports/http.js +6 -0
- package/dist/transports/http.js.map +1 -1
- package/dist/utils/validators.d.ts +1 -1
- package/dist/utils/validators.d.ts.map +1 -1
- package/dist/utils/validators.js.map +1 -1
- package/package.json +4 -4
- package/releases/v3.0.0-release-notes.md +81 -0
- package/src/__tests__/mocks/adapter.ts +3 -0
- package/src/__tests__/perf.test.ts +6 -6
- package/src/adapters/DatabaseAdapter.ts +58 -9
- package/src/adapters/__tests__/DatabaseAdapter.test.ts +89 -8
- package/src/adapters/mysql/MySQLAdapter.ts +17 -2
- package/src/adapters/mysql/SchemaManager.ts +21 -21
- package/src/adapters/mysql/__tests__/MySQLAdapter.test.ts +1 -1
- package/src/adapters/mysql/prompts/index.ts +12 -22
- package/src/adapters/mysql/prompts/proxysqlSetup.ts +1 -1
- package/src/adapters/mysql/resources/docstore.ts +13 -10
- package/src/adapters/mysql/resources/events.ts +12 -12
- package/src/adapters/mysql/resources/indexes.ts +17 -19
- package/src/adapters/mysql/resources/innodb.ts +23 -22
- package/src/adapters/mysql/resources/locks.ts +9 -7
- package/src/adapters/mysql/resources/performance.ts +23 -18
- package/src/adapters/mysql/resources/spatial.ts +9 -7
- package/src/adapters/mysql/resources/sysschema.ts +12 -11
- package/src/adapters/mysql/tools/__tests__/core.test.ts +126 -55
- package/src/adapters/mysql/tools/__tests__/docstore.test.ts +459 -88
- package/src/adapters/mysql/tools/__tests__/events.test.ts +281 -103
- package/src/adapters/mysql/tools/__tests__/proxysql.test.ts +128 -28
- package/src/adapters/mysql/tools/__tests__/replication.test.ts +48 -2
- package/src/adapters/mysql/tools/__tests__/roles.test.ts +15 -18
- package/src/adapters/mysql/tools/__tests__/router.test.ts +32 -5
- package/src/adapters/mysql/tools/__tests__/security.test.ts +126 -2
- package/src/adapters/mysql/tools/__tests__/security_injection.test.ts +84 -76
- package/src/adapters/mysql/tools/__tests__/security_integration.test.ts +47 -50
- package/src/adapters/mysql/tools/__tests__/spatial.test.ts +11 -10
- package/src/adapters/mysql/tools/__tests__/spatial_handler.test.ts +54 -38
- package/src/adapters/mysql/tools/__tests__/stats.test.ts +285 -152
- package/src/adapters/mysql/tools/__tests__/transactions.test.ts +13 -13
- package/src/adapters/mysql/tools/admin/__tests__/backup.test.ts +171 -25
- package/src/adapters/mysql/tools/admin/__tests__/maintenance.test.ts +240 -4
- package/src/adapters/mysql/tools/admin/__tests__/monitoring-summary.test.ts +274 -0
- package/src/adapters/mysql/tools/admin/__tests__/monitoring.test.ts +94 -5
- package/src/adapters/mysql/tools/admin/backup.ts +193 -143
- package/src/adapters/mysql/tools/admin/maintenance.ts +118 -69
- package/src/adapters/mysql/tools/admin/monitoring.ts +201 -125
- package/src/adapters/mysql/tools/cluster/__tests__/group-replication.test.ts +69 -0
- package/src/adapters/mysql/tools/cluster/__tests__/innodb-cluster.test.ts +141 -0
- package/src/adapters/mysql/tools/cluster/group-replication.ts +172 -132
- package/src/adapters/mysql/tools/cluster/innodb-cluster.ts +231 -157
- package/src/adapters/mysql/tools/codemode/__tests__/codemode-tool.test.ts +227 -0
- package/src/adapters/mysql/tools/codemode/index.ts +5 -3
- package/src/adapters/mysql/tools/core.ts +152 -38
- package/src/adapters/mysql/tools/docstore.ts +422 -205
- package/src/adapters/mysql/tools/events.ts +334 -233
- package/src/adapters/mysql/tools/json/__tests__/core.test.ts +20 -0
- package/src/adapters/mysql/tools/json/__tests__/enhanced.test.ts +82 -50
- package/src/adapters/mysql/tools/json/__tests__/helpers.test.ts +42 -3
- package/src/adapters/mysql/tools/json/core.ts +21 -42
- package/src/adapters/mysql/tools/json/enhanced.ts +22 -37
- package/src/adapters/mysql/tools/json/helpers.ts +21 -25
- package/src/adapters/mysql/tools/partitioning.ts +3 -0
- package/src/adapters/mysql/tools/performance/__tests__/analysis.test.ts +98 -5
- package/src/adapters/mysql/tools/performance/__tests__/optimization-coverage.test.ts +515 -0
- package/src/adapters/mysql/tools/performance/__tests__/optimization.test.ts +187 -0
- package/src/adapters/mysql/tools/performance/analysis.ts +95 -69
- package/src/adapters/mysql/tools/performance/optimization.ts +182 -153
- package/src/adapters/mysql/tools/proxysql.ts +314 -209
- package/src/adapters/mysql/tools/replication.ts +84 -57
- package/src/adapters/mysql/tools/roles.ts +274 -226
- package/src/adapters/mysql/tools/router.ts +181 -85
- package/src/adapters/mysql/tools/schema/__tests__/constraints.test.ts +13 -0
- package/src/adapters/mysql/tools/schema/__tests__/management.test.ts +60 -25
- package/src/adapters/mysql/tools/schema/__tests__/scheduled_events.test.ts +11 -0
- package/src/adapters/mysql/tools/schema/__tests__/triggers.test.ts +25 -4
- package/src/adapters/mysql/tools/schema/__tests__/views.test.ts +46 -14
- package/src/adapters/mysql/tools/schema/constraints.ts +22 -3
- package/src/adapters/mysql/tools/schema/management.ts +60 -15
- package/src/adapters/mysql/tools/schema/routines.ts +26 -4
- package/src/adapters/mysql/tools/schema/scheduled_events.ts +25 -3
- package/src/adapters/mysql/tools/schema/triggers.ts +27 -2
- package/src/adapters/mysql/tools/schema/views.ts +46 -8
- package/src/adapters/mysql/tools/security/__tests__/audit.test.ts +90 -4
- package/src/adapters/mysql/tools/security/audit.ts +113 -39
- package/src/adapters/mysql/tools/security/data-protection.ts +293 -233
- package/src/adapters/mysql/tools/security/encryption.ts +172 -139
- package/src/adapters/mysql/tools/shell/__tests__/backup.test.ts +29 -0
- package/src/adapters/mysql/tools/shell/backup.ts +90 -73
- package/src/adapters/mysql/tools/shell/restore.ts +62 -48
- package/src/adapters/mysql/tools/spatial/__tests__/operations.test.ts +22 -14
- package/src/adapters/mysql/tools/spatial/__tests__/queries.test.ts +65 -51
- package/src/adapters/mysql/tools/spatial/geometry.ts +23 -7
- package/src/adapters/mysql/tools/spatial/operations.ts +60 -31
- package/src/adapters/mysql/tools/spatial/queries.ts +142 -65
- package/src/adapters/mysql/tools/spatial/setup.ts +121 -55
- package/src/adapters/mysql/tools/stats/__tests__/comparative.test.ts +12 -10
- package/src/adapters/mysql/tools/stats/comparative.ts +150 -98
- package/src/adapters/mysql/tools/stats/descriptive.ts +204 -127
- package/src/adapters/mysql/tools/sysschema/__tests__/error-paths.test.ts +222 -0
- package/src/adapters/mysql/tools/sysschema/__tests__/performance.test.ts +45 -0
- package/src/adapters/mysql/tools/sysschema/__tests__/resources.test.ts +6 -3
- package/src/adapters/mysql/tools/sysschema/activity.ts +52 -27
- package/src/adapters/mysql/tools/sysschema/performance.ts +132 -68
- package/src/adapters/mysql/tools/sysschema/resources.ts +105 -67
- package/src/adapters/mysql/tools/text/__tests__/fulltext.test.ts +45 -17
- package/src/adapters/mysql/tools/text/fulltext.ts +27 -38
- package/src/adapters/mysql/tools/transactions.ts +49 -24
- package/src/adapters/mysql/types/proxysql-types.ts +38 -1
- package/src/adapters/mysql/types/router-types.ts +1 -1
- package/src/adapters/mysql/types/shell-types.ts +2 -2
- package/src/adapters/mysql/types.ts +632 -19
- package/src/auth/__tests__/scopes.test.ts +2 -2
- package/src/auth/scopes.ts +1 -1
- package/src/codemode/__tests__/api.test.ts +417 -0
- package/src/codemode/__tests__/sandbox-factory.test.ts +158 -0
- package/src/codemode/__tests__/sandbox.test.ts +301 -0
- package/src/codemode/__tests__/security.test.ts +368 -0
- package/src/codemode/__tests__/worker-sandbox.test.ts +179 -0
- package/src/codemode/__tests__/worker-script.test.ts +226 -0
- package/src/codemode/api.ts +89 -5
- package/src/codemode/sandbox-factory.ts +1 -1
- package/src/codemode/types.ts +34 -0
- package/src/codemode/worker-sandbox.ts +74 -7
- package/src/codemode/worker-script.ts +157 -86
- package/src/constants/ServerInstructions.ts +37 -31
- package/src/filtering/ToolConstants.ts +1 -2
- package/src/filtering/__tests__/ToolFilter.test.ts +9 -9
- package/src/pool/ConnectionPool.ts +4 -1
- package/src/transports/__tests__/http.test.ts +15 -3
- package/src/transports/http.ts +12 -0
- package/src/utils/validators.ts +2 -1
- package/vitest.config.ts +3 -1
- package/CODE_MODE.md +0 -245
|
@@ -172,12 +172,13 @@ describe("Admin Backup Tools", () => {
|
|
|
172
172
|
mockAdapter as unknown as MySQLAdapter,
|
|
173
173
|
);
|
|
174
174
|
|
|
175
|
-
await
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
).
|
|
175
|
+
const result = (await tool.handler(
|
|
176
|
+
{ table: "users; DROP TABLE users;--", format: "SQL" },
|
|
177
|
+
mockContext,
|
|
178
|
+
)) as { success: boolean; error: string };
|
|
179
|
+
|
|
180
|
+
expect(result.success).toBe(false);
|
|
181
|
+
expect(result.error).toContain("Invalid table name");
|
|
181
182
|
});
|
|
182
183
|
|
|
183
184
|
it("should validate WHERE clause for SQL injection", async () => {
|
|
@@ -185,16 +186,17 @@ describe("Admin Backup Tools", () => {
|
|
|
185
186
|
mockAdapter as unknown as MySQLAdapter,
|
|
186
187
|
);
|
|
187
188
|
|
|
188
|
-
await
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
).
|
|
189
|
+
const result = (await tool.handler(
|
|
190
|
+
{
|
|
191
|
+
table: "users",
|
|
192
|
+
format: "SQL",
|
|
193
|
+
where: "1=1; DELETE FROM users;--",
|
|
194
|
+
},
|
|
195
|
+
mockContext,
|
|
196
|
+
)) as { success: boolean; error: string };
|
|
197
|
+
|
|
198
|
+
expect(result.success).toBe(false);
|
|
199
|
+
expect(result.error).toContain("dangerous SQL patterns");
|
|
198
200
|
});
|
|
199
201
|
|
|
200
202
|
it("should return exists: false for non-existent table", async () => {
|
|
@@ -249,6 +251,106 @@ describe("Admin Backup Tools", () => {
|
|
|
249
251
|
expect(result.sql).toContain("(`id`, `email`, `created_at`)");
|
|
250
252
|
expect(result.sql).toContain("VALUES");
|
|
251
253
|
});
|
|
254
|
+
|
|
255
|
+
it("should return structured error for Zod validation failures", async () => {
|
|
256
|
+
const tool = createExportTableTool(
|
|
257
|
+
mockAdapter as unknown as MySQLAdapter,
|
|
258
|
+
);
|
|
259
|
+
const result = (await tool.handler(
|
|
260
|
+
{ table: "users", limit: -1 },
|
|
261
|
+
mockContext,
|
|
262
|
+
)) as { success: boolean; error: string };
|
|
263
|
+
|
|
264
|
+
expect(result.success).toBe(false);
|
|
265
|
+
expect(result.error).toBeDefined();
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
it("should return structured error for limit: 0", async () => {
|
|
269
|
+
const tool = createExportTableTool(
|
|
270
|
+
mockAdapter as unknown as MySQLAdapter,
|
|
271
|
+
);
|
|
272
|
+
const result = (await tool.handler(
|
|
273
|
+
{ table: "users", limit: 0 },
|
|
274
|
+
mockContext,
|
|
275
|
+
)) as { success: boolean; error: string };
|
|
276
|
+
|
|
277
|
+
expect(result.success).toBe(false);
|
|
278
|
+
expect(result.error).toBeDefined();
|
|
279
|
+
});
|
|
280
|
+
|
|
281
|
+
it("should batch rows into multi-row INSERT statements", async () => {
|
|
282
|
+
mockAdapter.executeReadQuery.mockResolvedValue(
|
|
283
|
+
createMockQueryResult([
|
|
284
|
+
{ id: 1, name: "Alice" },
|
|
285
|
+
{ id: 2, name: "Bob" },
|
|
286
|
+
{ id: 3, name: "Charlie" },
|
|
287
|
+
{ id: 4, name: "Diana" },
|
|
288
|
+
]),
|
|
289
|
+
);
|
|
290
|
+
|
|
291
|
+
const tool = createExportTableTool(
|
|
292
|
+
mockAdapter as unknown as MySQLAdapter,
|
|
293
|
+
);
|
|
294
|
+
const result = (await tool.handler(
|
|
295
|
+
{ table: "users", format: "SQL", batch: 2 },
|
|
296
|
+
mockContext,
|
|
297
|
+
)) as { sql: string; rowCount: number };
|
|
298
|
+
|
|
299
|
+
expect(result.rowCount).toBe(4);
|
|
300
|
+
const statements = result.sql.split("\n");
|
|
301
|
+
expect(statements).toHaveLength(2);
|
|
302
|
+
// Each statement should have 2 value groups
|
|
303
|
+
expect(statements[0]).toContain("VALUES (1, 'Alice'), (2, 'Bob')");
|
|
304
|
+
expect(statements[1]).toContain("VALUES (3, 'Charlie'), (4, 'Diana')");
|
|
305
|
+
});
|
|
306
|
+
|
|
307
|
+
it("should handle batch larger than row count", async () => {
|
|
308
|
+
mockAdapter.executeReadQuery.mockResolvedValue(
|
|
309
|
+
createMockQueryResult([
|
|
310
|
+
{ id: 1, name: "Alice" },
|
|
311
|
+
{ id: 2, name: "Bob" },
|
|
312
|
+
{ id: 3, name: "Charlie" },
|
|
313
|
+
]),
|
|
314
|
+
);
|
|
315
|
+
|
|
316
|
+
const tool = createExportTableTool(
|
|
317
|
+
mockAdapter as unknown as MySQLAdapter,
|
|
318
|
+
);
|
|
319
|
+
const result = (await tool.handler(
|
|
320
|
+
{ table: "users", format: "SQL", batch: 10 },
|
|
321
|
+
mockContext,
|
|
322
|
+
)) as { sql: string; rowCount: number };
|
|
323
|
+
|
|
324
|
+
expect(result.rowCount).toBe(3);
|
|
325
|
+
const statements = result.sql.split("\n");
|
|
326
|
+
expect(statements).toHaveLength(1);
|
|
327
|
+
expect(statements[0]).toContain(
|
|
328
|
+
"VALUES (1, 'Alice'), (2, 'Bob'), (3, 'Charlie')",
|
|
329
|
+
);
|
|
330
|
+
});
|
|
331
|
+
|
|
332
|
+
it("should default to batch: 1 producing individual INSERT statements", async () => {
|
|
333
|
+
mockAdapter.executeReadQuery.mockResolvedValue(
|
|
334
|
+
createMockQueryResult([
|
|
335
|
+
{ id: 1, name: "Alice" },
|
|
336
|
+
{ id: 2, name: "Bob" },
|
|
337
|
+
]),
|
|
338
|
+
);
|
|
339
|
+
|
|
340
|
+
const tool = createExportTableTool(
|
|
341
|
+
mockAdapter as unknown as MySQLAdapter,
|
|
342
|
+
);
|
|
343
|
+
const result = (await tool.handler(
|
|
344
|
+
{ table: "users", format: "SQL" },
|
|
345
|
+
mockContext,
|
|
346
|
+
)) as { sql: string; rowCount: number };
|
|
347
|
+
|
|
348
|
+
expect(result.rowCount).toBe(2);
|
|
349
|
+
const statements = result.sql.split("\n");
|
|
350
|
+
expect(statements).toHaveLength(2);
|
|
351
|
+
expect(statements[0]).toContain("VALUES (1, 'Alice');");
|
|
352
|
+
expect(statements[1]).toContain("VALUES (2, 'Bob');");
|
|
353
|
+
});
|
|
252
354
|
});
|
|
253
355
|
|
|
254
356
|
describe("createImportDataTool", () => {
|
|
@@ -324,15 +426,16 @@ describe("Admin Backup Tools", () => {
|
|
|
324
426
|
it("should validate table name for SQL injection", async () => {
|
|
325
427
|
const tool = createImportDataTool(mockAdapter as unknown as MySQLAdapter);
|
|
326
428
|
|
|
327
|
-
await
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
).
|
|
429
|
+
const result = (await tool.handler(
|
|
430
|
+
{
|
|
431
|
+
table: "users; DROP TABLE users;--",
|
|
432
|
+
data: [{ name: "test" }],
|
|
433
|
+
},
|
|
434
|
+
mockContext,
|
|
435
|
+
)) as { success: boolean; error: string };
|
|
436
|
+
|
|
437
|
+
expect(result.success).toBe(false);
|
|
438
|
+
expect(result.error).toContain("Invalid table name");
|
|
336
439
|
});
|
|
337
440
|
|
|
338
441
|
it("should handle various data types", async () => {
|
|
@@ -426,6 +529,17 @@ describe("Admin Backup Tools", () => {
|
|
|
426
529
|
expect(result.error).toContain("Unknown column");
|
|
427
530
|
expect(result.rowsInserted).toBe(0);
|
|
428
531
|
});
|
|
532
|
+
|
|
533
|
+
it("should return structured error for Zod validation failures", async () => {
|
|
534
|
+
const tool = createImportDataTool(mockAdapter as unknown as MySQLAdapter);
|
|
535
|
+
const result = (await tool.handler(
|
|
536
|
+
{ data: [{ name: "test" }] },
|
|
537
|
+
mockContext,
|
|
538
|
+
)) as { success: boolean; error: string };
|
|
539
|
+
|
|
540
|
+
expect(result.success).toBe(false);
|
|
541
|
+
expect(result.error).toBeDefined();
|
|
542
|
+
});
|
|
429
543
|
});
|
|
430
544
|
|
|
431
545
|
describe("createCreateDumpTool", () => {
|
|
@@ -544,6 +658,21 @@ describe("Admin Backup Tools", () => {
|
|
|
544
658
|
|
|
545
659
|
expect(result.command).toBeDefined();
|
|
546
660
|
});
|
|
661
|
+
|
|
662
|
+
it("should return structured error on query failure", async () => {
|
|
663
|
+
mockAdapter.executeReadQuery.mockRejectedValue(
|
|
664
|
+
new Error("Connection lost"),
|
|
665
|
+
);
|
|
666
|
+
|
|
667
|
+
const tool = createCreateDumpTool(mockAdapter as unknown as MySQLAdapter);
|
|
668
|
+
const result = (await tool.handler({}, mockContext)) as {
|
|
669
|
+
success: boolean;
|
|
670
|
+
error: string;
|
|
671
|
+
};
|
|
672
|
+
|
|
673
|
+
expect(result.success).toBe(false);
|
|
674
|
+
expect(result.error).toContain("Connection lost");
|
|
675
|
+
});
|
|
547
676
|
});
|
|
548
677
|
|
|
549
678
|
describe("createRestoreDumpTool", () => {
|
|
@@ -636,5 +765,22 @@ describe("Admin Backup Tools", () => {
|
|
|
636
765
|
|
|
637
766
|
expect(result.command).toBeDefined();
|
|
638
767
|
});
|
|
768
|
+
|
|
769
|
+
it("should return structured error on query failure", async () => {
|
|
770
|
+
mockAdapter.executeReadQuery.mockRejectedValue(
|
|
771
|
+
new Error("Connection lost"),
|
|
772
|
+
);
|
|
773
|
+
|
|
774
|
+
const tool = createRestoreDumpTool(
|
|
775
|
+
mockAdapter as unknown as MySQLAdapter,
|
|
776
|
+
);
|
|
777
|
+
const result = (await tool.handler(
|
|
778
|
+
{ filename: "backup.sql" },
|
|
779
|
+
mockContext,
|
|
780
|
+
)) as { success: boolean; error: string };
|
|
781
|
+
|
|
782
|
+
expect(result.success).toBe(false);
|
|
783
|
+
expect(result.error).toContain("Connection lost");
|
|
784
|
+
});
|
|
639
785
|
});
|
|
640
786
|
});
|
|
@@ -241,6 +241,18 @@ describe("Admin Maintenance Tools", () => {
|
|
|
241
241
|
expect(result.results).toEqual([]);
|
|
242
242
|
expect(result.rowCount).toBe(0);
|
|
243
243
|
});
|
|
244
|
+
|
|
245
|
+
it("should return structured error for invalid option value", async () => {
|
|
246
|
+
const tool = createCheckTableTool(mockAdapter as unknown as MySQLAdapter);
|
|
247
|
+
const result = await tool.handler(
|
|
248
|
+
{ tables: ["users"], option: "INVALID_OPTION" },
|
|
249
|
+
mockContext,
|
|
250
|
+
);
|
|
251
|
+
|
|
252
|
+
expect(result).toHaveProperty("success", false);
|
|
253
|
+
expect(result).toHaveProperty("error");
|
|
254
|
+
expect(typeof (result as { error: string }).error).toBe("string");
|
|
255
|
+
});
|
|
244
256
|
});
|
|
245
257
|
|
|
246
258
|
describe("createRepairTableTool", () => {
|
|
@@ -492,13 +504,172 @@ describe("Admin Maintenance Tools", () => {
|
|
|
492
504
|
});
|
|
493
505
|
});
|
|
494
506
|
|
|
495
|
-
it("should
|
|
507
|
+
it("should return structured error for non-thread-id errors", async () => {
|
|
496
508
|
mockAdapter.executeQuery.mockRejectedValue(new Error("Connection lost"));
|
|
497
509
|
|
|
498
510
|
const tool = createKillQueryTool(mockAdapter as unknown as MySQLAdapter);
|
|
499
|
-
await
|
|
500
|
-
|
|
501
|
-
).
|
|
511
|
+
const result = await tool.handler({ processId: 123 }, mockContext);
|
|
512
|
+
|
|
513
|
+
expect(result).toEqual({ success: false, error: "Connection lost" });
|
|
514
|
+
});
|
|
515
|
+
});
|
|
516
|
+
|
|
517
|
+
describe("DDL handler error handling", () => {
|
|
518
|
+
it("mysql_optimize_table should return structured error on adapter failure", async () => {
|
|
519
|
+
mockAdapter.executeQuery.mockRejectedValue(
|
|
520
|
+
new Error("Table storage engine mismatch"),
|
|
521
|
+
);
|
|
522
|
+
|
|
523
|
+
const tool = createOptimizeTableTool(
|
|
524
|
+
mockAdapter as unknown as MySQLAdapter,
|
|
525
|
+
);
|
|
526
|
+
const result = await tool.handler({ tables: ["users"] }, mockContext);
|
|
527
|
+
|
|
528
|
+
expect(result).toEqual({
|
|
529
|
+
success: false,
|
|
530
|
+
error: "Table storage engine mismatch",
|
|
531
|
+
});
|
|
532
|
+
});
|
|
533
|
+
|
|
534
|
+
it("mysql_optimize_table should return structured error on empty tables", async () => {
|
|
535
|
+
const tool = createOptimizeTableTool(
|
|
536
|
+
mockAdapter as unknown as MySQLAdapter,
|
|
537
|
+
);
|
|
538
|
+
const result = await tool.handler({}, mockContext);
|
|
539
|
+
|
|
540
|
+
expect(result).toHaveProperty("success", false);
|
|
541
|
+
expect(result).toHaveProperty("error");
|
|
542
|
+
});
|
|
543
|
+
|
|
544
|
+
it("mysql_analyze_table should return structured error on adapter failure", async () => {
|
|
545
|
+
mockAdapter.executeQuery.mockRejectedValue(
|
|
546
|
+
new Error("Access denied for user"),
|
|
547
|
+
);
|
|
548
|
+
|
|
549
|
+
const tool = createAnalyzeTableTool(
|
|
550
|
+
mockAdapter as unknown as MySQLAdapter,
|
|
551
|
+
);
|
|
552
|
+
const result = await tool.handler({ tables: ["products"] }, mockContext);
|
|
553
|
+
|
|
554
|
+
expect(result).toEqual({
|
|
555
|
+
success: false,
|
|
556
|
+
error: "Access denied for user",
|
|
557
|
+
});
|
|
558
|
+
});
|
|
559
|
+
|
|
560
|
+
it("mysql_analyze_table should return structured error on empty tables", async () => {
|
|
561
|
+
const tool = createAnalyzeTableTool(
|
|
562
|
+
mockAdapter as unknown as MySQLAdapter,
|
|
563
|
+
);
|
|
564
|
+
const result = await tool.handler({}, mockContext);
|
|
565
|
+
|
|
566
|
+
expect(result).toHaveProperty("success", false);
|
|
567
|
+
expect(result).toHaveProperty("error");
|
|
568
|
+
});
|
|
569
|
+
|
|
570
|
+
it("mysql_check_table should return structured error on adapter failure", async () => {
|
|
571
|
+
mockAdapter.rawQuery.mockRejectedValue(
|
|
572
|
+
new Error("Lock wait timeout exceeded"),
|
|
573
|
+
);
|
|
574
|
+
|
|
575
|
+
const tool = createCheckTableTool(mockAdapter as unknown as MySQLAdapter);
|
|
576
|
+
const result = await tool.handler({ tables: ["orders"] }, mockContext);
|
|
577
|
+
|
|
578
|
+
expect(result).toEqual({
|
|
579
|
+
success: false,
|
|
580
|
+
error: "Lock wait timeout exceeded",
|
|
581
|
+
});
|
|
582
|
+
});
|
|
583
|
+
|
|
584
|
+
it("mysql_check_table should return structured error on empty tables", async () => {
|
|
585
|
+
const tool = createCheckTableTool(mockAdapter as unknown as MySQLAdapter);
|
|
586
|
+
const result = await tool.handler({}, mockContext);
|
|
587
|
+
|
|
588
|
+
expect(result).toHaveProperty("success", false);
|
|
589
|
+
expect(result).toHaveProperty("error");
|
|
590
|
+
});
|
|
591
|
+
|
|
592
|
+
it("mysql_repair_table should return structured error on adapter failure", async () => {
|
|
593
|
+
mockAdapter.executeQuery.mockRejectedValue(
|
|
594
|
+
new Error("Table is read only"),
|
|
595
|
+
);
|
|
596
|
+
|
|
597
|
+
const tool = createRepairTableTool(
|
|
598
|
+
mockAdapter as unknown as MySQLAdapter,
|
|
599
|
+
);
|
|
600
|
+
const result = await tool.handler({ tables: ["broken"] }, mockContext);
|
|
601
|
+
|
|
602
|
+
expect(result).toEqual({
|
|
603
|
+
success: false,
|
|
604
|
+
error: "Table is read only",
|
|
605
|
+
});
|
|
606
|
+
});
|
|
607
|
+
|
|
608
|
+
it("mysql_repair_table should return structured error on empty tables", async () => {
|
|
609
|
+
const tool = createRepairTableTool(
|
|
610
|
+
mockAdapter as unknown as MySQLAdapter,
|
|
611
|
+
);
|
|
612
|
+
const result = await tool.handler({}, mockContext);
|
|
613
|
+
|
|
614
|
+
expect(result).toHaveProperty("success", false);
|
|
615
|
+
expect(result).toHaveProperty("error");
|
|
616
|
+
});
|
|
617
|
+
});
|
|
618
|
+
|
|
619
|
+
describe("repair_table alias support", () => {
|
|
620
|
+
it("should accept table alias (singular string)", async () => {
|
|
621
|
+
mockAdapter.executeQuery.mockResolvedValue(createMockQueryResult([]));
|
|
622
|
+
|
|
623
|
+
const tool = createRepairTableTool(
|
|
624
|
+
mockAdapter as unknown as MySQLAdapter,
|
|
625
|
+
);
|
|
626
|
+
await tool.handler({ table: "users" }, mockContext);
|
|
627
|
+
|
|
628
|
+
expect(mockAdapter.executeQuery).toHaveBeenCalledWith(
|
|
629
|
+
"REPAIR TABLE `users`",
|
|
630
|
+
);
|
|
631
|
+
});
|
|
632
|
+
|
|
633
|
+
it("should accept tableName alias", async () => {
|
|
634
|
+
mockAdapter.executeQuery.mockResolvedValue(createMockQueryResult([]));
|
|
635
|
+
|
|
636
|
+
const tool = createRepairTableTool(
|
|
637
|
+
mockAdapter as unknown as MySQLAdapter,
|
|
638
|
+
);
|
|
639
|
+
await tool.handler({ tableName: "orders" }, mockContext);
|
|
640
|
+
|
|
641
|
+
expect(mockAdapter.executeQuery).toHaveBeenCalledWith(
|
|
642
|
+
"REPAIR TABLE `orders`",
|
|
643
|
+
);
|
|
644
|
+
});
|
|
645
|
+
|
|
646
|
+
it("should accept name alias", async () => {
|
|
647
|
+
mockAdapter.executeQuery.mockResolvedValue(createMockQueryResult([]));
|
|
648
|
+
|
|
649
|
+
const tool = createRepairTableTool(
|
|
650
|
+
mockAdapter as unknown as MySQLAdapter,
|
|
651
|
+
);
|
|
652
|
+
await tool.handler({ name: "products" }, mockContext);
|
|
653
|
+
|
|
654
|
+
expect(mockAdapter.executeQuery).toHaveBeenCalledWith(
|
|
655
|
+
"REPAIR TABLE `products`",
|
|
656
|
+
);
|
|
657
|
+
});
|
|
658
|
+
|
|
659
|
+
it("should prefer tables array over aliases", async () => {
|
|
660
|
+
mockAdapter.executeQuery.mockResolvedValue(createMockQueryResult([]));
|
|
661
|
+
|
|
662
|
+
const tool = createRepairTableTool(
|
|
663
|
+
mockAdapter as unknown as MySQLAdapter,
|
|
664
|
+
);
|
|
665
|
+
await tool.handler(
|
|
666
|
+
{ tables: ["t1", "t2"], table: "ignored" },
|
|
667
|
+
mockContext,
|
|
668
|
+
);
|
|
669
|
+
|
|
670
|
+
expect(mockAdapter.executeQuery).toHaveBeenCalledWith(
|
|
671
|
+
"REPAIR TABLE `t1`, `t2`",
|
|
672
|
+
);
|
|
502
673
|
});
|
|
503
674
|
});
|
|
504
675
|
|
|
@@ -581,6 +752,7 @@ describe("Admin Maintenance Tools", () => {
|
|
|
581
752
|
|
|
582
753
|
expect(result).toEqual({
|
|
583
754
|
success: false,
|
|
755
|
+
error: "Tables not found: nonexistent_xyz",
|
|
584
756
|
notFound: ["nonexistent_xyz"],
|
|
585
757
|
flushed: ["users"],
|
|
586
758
|
});
|
|
@@ -603,6 +775,7 @@ describe("Admin Maintenance Tools", () => {
|
|
|
603
775
|
|
|
604
776
|
expect(result).toEqual({
|
|
605
777
|
success: false,
|
|
778
|
+
error: "Tables not found: nonexistent_a, nonexistent_b",
|
|
606
779
|
notFound: ["nonexistent_a", "nonexistent_b"],
|
|
607
780
|
flushed: [],
|
|
608
781
|
});
|
|
@@ -632,5 +805,68 @@ describe("Admin Maintenance Tools", () => {
|
|
|
632
805
|
"FLUSH TABLES `users`, `orders`",
|
|
633
806
|
);
|
|
634
807
|
});
|
|
808
|
+
|
|
809
|
+
it("should return structured error on Zod validation failure", async () => {
|
|
810
|
+
const tool = createFlushTablesTool(
|
|
811
|
+
mockAdapter as unknown as MySQLAdapter,
|
|
812
|
+
);
|
|
813
|
+
// Pass invalid type for tables (number instead of array)
|
|
814
|
+
const result = await tool.handler(
|
|
815
|
+
{ tables: 12345 as unknown },
|
|
816
|
+
mockContext,
|
|
817
|
+
);
|
|
818
|
+
|
|
819
|
+
expect(result).toHaveProperty("success", false);
|
|
820
|
+
expect(result).toHaveProperty("error");
|
|
821
|
+
// Should NOT throw — should return structured response
|
|
822
|
+
expect(typeof (result as { error: string }).error).toBe("string");
|
|
823
|
+
});
|
|
824
|
+
|
|
825
|
+
it("should return structured error on adapter failure", async () => {
|
|
826
|
+
mockAdapter.executeQuery.mockRejectedValue(
|
|
827
|
+
new Error("Access denied; you need the RELOAD privilege"),
|
|
828
|
+
);
|
|
829
|
+
|
|
830
|
+
const tool = createFlushTablesTool(
|
|
831
|
+
mockAdapter as unknown as MySQLAdapter,
|
|
832
|
+
);
|
|
833
|
+
const result = await tool.handler({}, mockContext);
|
|
834
|
+
|
|
835
|
+
expect(result).toEqual({
|
|
836
|
+
success: false,
|
|
837
|
+
error: "Access denied; you need the RELOAD privilege",
|
|
838
|
+
});
|
|
839
|
+
});
|
|
840
|
+
});
|
|
841
|
+
|
|
842
|
+
describe("kill_query Zod validation", () => {
|
|
843
|
+
it("should return structured error when processId is missing", async () => {
|
|
844
|
+
const tool = createKillQueryTool(mockAdapter as unknown as MySQLAdapter);
|
|
845
|
+
// Pass empty params — processId is required
|
|
846
|
+
const result = await tool.handler({}, mockContext);
|
|
847
|
+
|
|
848
|
+
expect(result).toHaveProperty("success", false);
|
|
849
|
+
expect(result).toHaveProperty("error");
|
|
850
|
+
expect(typeof (result as { error: string }).error).toBe("string");
|
|
851
|
+
});
|
|
852
|
+
});
|
|
853
|
+
|
|
854
|
+
describe("Zod error human-readability", () => {
|
|
855
|
+
it("should return human-readable error messages, not raw JSON arrays", async () => {
|
|
856
|
+
const tool = createOptimizeTableTool(
|
|
857
|
+
mockAdapter as unknown as MySQLAdapter,
|
|
858
|
+
);
|
|
859
|
+
// Empty params triggers Zod validation error
|
|
860
|
+
const result = (await tool.handler({}, mockContext)) as {
|
|
861
|
+
success: boolean;
|
|
862
|
+
error: string;
|
|
863
|
+
};
|
|
864
|
+
|
|
865
|
+
expect(result.success).toBe(false);
|
|
866
|
+
// The error should NOT be a raw JSON array string (starting with "[{")
|
|
867
|
+
expect(result.error).not.toMatch(/^\s*\[/);
|
|
868
|
+
// Should be a clean human-readable message
|
|
869
|
+
expect(result.error).toBeTruthy();
|
|
870
|
+
});
|
|
635
871
|
});
|
|
636
872
|
});
|