@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.
- package/.dockerignore +1 -0
- package/.gitattributes +18 -0
- package/.github/workflows/codeql.yml +2 -10
- package/.github/workflows/docker-publish.yml +15 -13
- package/CHANGELOG.md +287 -1
- package/DOCKER_README.md +100 -265
- package/Dockerfile +5 -0
- package/README.md +124 -59
- 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/v2.3.0-release-notes.md +20 -20
- package/releases/v2.3.1-release-notes.md +34 -0
- 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
|
@@ -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
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
).
|
|
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
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
).
|
|
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
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
).
|
|
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
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
).
|
|
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
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
).
|
|
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
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
).
|
|
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
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
).
|
|
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
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
).
|
|
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
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
).
|
|
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
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
).
|
|
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
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
).
|
|
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
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
).
|
|
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
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
).
|
|
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
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
).
|
|
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
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
).
|
|
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
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
).
|
|
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("
|
|
172
|
-
expect((result as {
|
|
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("
|
|
201
|
-
expect((result as {
|
|
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("
|
|
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 {
|
|
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("
|
|
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 {
|
|
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("
|
|
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 {
|
|
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("
|
|
387
|
-
expect((result as {
|
|
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 {
|
|
476
|
+
expect((result as { error: string }).error).toContain(
|
|
477
477
|
"Transaction failed and was rolled back",
|
|
478
478
|
);
|
|
479
479
|
});
|