@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
|
@@ -323,7 +323,7 @@ export const DropTableSchemaBase = z.object({
|
|
|
323
323
|
ifExists: z
|
|
324
324
|
.boolean()
|
|
325
325
|
.optional()
|
|
326
|
-
.default(
|
|
326
|
+
.default(false)
|
|
327
327
|
.describe("Add IF EXISTS clause"),
|
|
328
328
|
});
|
|
329
329
|
|
|
@@ -397,6 +397,12 @@ export const GetIndexesSchema = z
|
|
|
397
397
|
|
|
398
398
|
// --- TransactionBegin ---
|
|
399
399
|
|
|
400
|
+
// Base schema for MCP visibility
|
|
401
|
+
export const TransactionBeginSchemaBase = z.object({
|
|
402
|
+
isolationLevel: z.string().optional().describe("Transaction isolation level"),
|
|
403
|
+
});
|
|
404
|
+
|
|
405
|
+
// Transformed schema for handler parsing
|
|
400
406
|
export const TransactionBeginSchema = z.preprocess(
|
|
401
407
|
defaultToEmpty,
|
|
402
408
|
z.object({
|
|
@@ -467,24 +473,31 @@ export const TransactionExecuteSchemaBase = z.object({
|
|
|
467
473
|
.optional()
|
|
468
474
|
.describe("SQL statements to execute atomically"),
|
|
469
475
|
queries: z.array(z.string()).optional().describe("Alias for statements"),
|
|
470
|
-
isolationLevel: z
|
|
471
|
-
.enum([
|
|
472
|
-
"READ UNCOMMITTED",
|
|
473
|
-
"READ COMMITTED",
|
|
474
|
-
"REPEATABLE READ",
|
|
475
|
-
"SERIALIZABLE",
|
|
476
|
-
])
|
|
477
|
-
.optional()
|
|
478
|
-
.describe("Transaction isolation level"),
|
|
476
|
+
isolationLevel: z.string().optional().describe("Transaction isolation level"),
|
|
479
477
|
});
|
|
480
478
|
|
|
481
|
-
// Transformed schema for handler parsing
|
|
482
479
|
export const TransactionExecuteSchema = z
|
|
483
480
|
.preprocess(preprocessTransactionExecuteParams, TransactionExecuteSchemaBase)
|
|
484
481
|
.transform((data) => ({
|
|
485
482
|
statements: data.statements ?? data.queries ?? [],
|
|
486
483
|
isolationLevel: data.isolationLevel,
|
|
487
|
-
}))
|
|
484
|
+
}))
|
|
485
|
+
.refine(
|
|
486
|
+
(data) => {
|
|
487
|
+
if (!data.isolationLevel) return true;
|
|
488
|
+
const validLevels = [
|
|
489
|
+
"READ UNCOMMITTED",
|
|
490
|
+
"READ COMMITTED",
|
|
491
|
+
"REPEATABLE READ",
|
|
492
|
+
"SERIALIZABLE",
|
|
493
|
+
];
|
|
494
|
+
return validLevels.includes(data.isolationLevel);
|
|
495
|
+
},
|
|
496
|
+
{
|
|
497
|
+
message:
|
|
498
|
+
"Invalid isolationLevel. Expected one of: READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE",
|
|
499
|
+
},
|
|
500
|
+
);
|
|
488
501
|
|
|
489
502
|
// =============================================================================
|
|
490
503
|
// Preprocess: JSON/Text column params (table, column, where aliases)
|
|
@@ -710,6 +723,378 @@ export const JsonSearchSchema = z
|
|
|
710
723
|
message: "column (or col alias) is required",
|
|
711
724
|
});
|
|
712
725
|
|
|
726
|
+
// --- JsonInsert ---
|
|
727
|
+
export const JsonInsertSchemaBase = z.object({
|
|
728
|
+
table: z.string().optional().describe("Table name"),
|
|
729
|
+
tableName: z.string().optional().describe("Alias for table"),
|
|
730
|
+
name: z.string().optional().describe("Alias for table"),
|
|
731
|
+
column: z.string().optional().describe("JSON column name"),
|
|
732
|
+
col: z.string().optional().describe("Alias for column"),
|
|
733
|
+
path: z.string().describe("JSON path to insert at"),
|
|
734
|
+
value: z.unknown().describe("Value to insert"),
|
|
735
|
+
where: z.string().optional().describe("WHERE clause to identify rows"),
|
|
736
|
+
filter: z.string().optional().describe("Alias for where"),
|
|
737
|
+
});
|
|
738
|
+
|
|
739
|
+
export const JsonInsertSchema = z
|
|
740
|
+
.preprocess(
|
|
741
|
+
preprocessJsonColumnParams,
|
|
742
|
+
z.object({
|
|
743
|
+
table: z.string().optional(),
|
|
744
|
+
tableName: z.string().optional(),
|
|
745
|
+
name: z.string().optional(),
|
|
746
|
+
column: z.string().optional(),
|
|
747
|
+
col: z.string().optional(),
|
|
748
|
+
path: z.string(),
|
|
749
|
+
value: z.unknown(),
|
|
750
|
+
where: z.string().optional(),
|
|
751
|
+
filter: z.string().optional(),
|
|
752
|
+
}),
|
|
753
|
+
)
|
|
754
|
+
.transform((data) => ({
|
|
755
|
+
table: data.table ?? data.tableName ?? data.name ?? "",
|
|
756
|
+
column: data.column ?? data.col ?? "",
|
|
757
|
+
path: data.path,
|
|
758
|
+
value: data.value,
|
|
759
|
+
where: data.where ?? data.filter ?? "",
|
|
760
|
+
}))
|
|
761
|
+
.refine((data) => data.table !== "", {
|
|
762
|
+
message: "table (or tableName/name alias) is required",
|
|
763
|
+
})
|
|
764
|
+
.refine((data) => data.column !== "", {
|
|
765
|
+
message: "column (or col alias) is required",
|
|
766
|
+
})
|
|
767
|
+
.refine((data) => data.where !== "", {
|
|
768
|
+
message: "where (or filter alias) is required",
|
|
769
|
+
});
|
|
770
|
+
|
|
771
|
+
// --- JsonReplace ---
|
|
772
|
+
export const JsonReplaceSchemaBase = z.object({
|
|
773
|
+
table: z.string().optional().describe("Table name"),
|
|
774
|
+
tableName: z.string().optional().describe("Alias for table"),
|
|
775
|
+
name: z.string().optional().describe("Alias for table"),
|
|
776
|
+
column: z.string().optional().describe("JSON column name"),
|
|
777
|
+
col: z.string().optional().describe("Alias for column"),
|
|
778
|
+
path: z.string().describe("JSON path to replace"),
|
|
779
|
+
value: z.unknown().describe("Replacement value"),
|
|
780
|
+
where: z.string().optional().describe("WHERE clause to identify rows"),
|
|
781
|
+
filter: z.string().optional().describe("Alias for where"),
|
|
782
|
+
});
|
|
783
|
+
|
|
784
|
+
export const JsonReplaceSchema = z
|
|
785
|
+
.preprocess(
|
|
786
|
+
preprocessJsonColumnParams,
|
|
787
|
+
z.object({
|
|
788
|
+
table: z.string().optional(),
|
|
789
|
+
tableName: z.string().optional(),
|
|
790
|
+
name: z.string().optional(),
|
|
791
|
+
column: z.string().optional(),
|
|
792
|
+
col: z.string().optional(),
|
|
793
|
+
path: z.string(),
|
|
794
|
+
value: z.unknown(),
|
|
795
|
+
where: z.string().optional(),
|
|
796
|
+
filter: z.string().optional(),
|
|
797
|
+
}),
|
|
798
|
+
)
|
|
799
|
+
.transform((data) => ({
|
|
800
|
+
table: data.table ?? data.tableName ?? data.name ?? "",
|
|
801
|
+
column: data.column ?? data.col ?? "",
|
|
802
|
+
path: data.path,
|
|
803
|
+
value: data.value,
|
|
804
|
+
where: data.where ?? data.filter ?? "",
|
|
805
|
+
}))
|
|
806
|
+
.refine((data) => data.table !== "", {
|
|
807
|
+
message: "table (or tableName/name alias) is required",
|
|
808
|
+
})
|
|
809
|
+
.refine((data) => data.column !== "", {
|
|
810
|
+
message: "column (or col alias) is required",
|
|
811
|
+
})
|
|
812
|
+
.refine((data) => data.where !== "", {
|
|
813
|
+
message: "where (or filter alias) is required",
|
|
814
|
+
});
|
|
815
|
+
|
|
816
|
+
// --- JsonRemove ---
|
|
817
|
+
export const JsonRemoveSchemaBase = z.object({
|
|
818
|
+
table: z.string().optional().describe("Table name"),
|
|
819
|
+
tableName: z.string().optional().describe("Alias for table"),
|
|
820
|
+
name: z.string().optional().describe("Alias for table"),
|
|
821
|
+
column: z.string().optional().describe("JSON column name"),
|
|
822
|
+
col: z.string().optional().describe("Alias for column"),
|
|
823
|
+
paths: z.array(z.string()).describe("JSON paths to remove"),
|
|
824
|
+
where: z.string().optional().describe("WHERE clause to identify rows"),
|
|
825
|
+
filter: z.string().optional().describe("Alias for where"),
|
|
826
|
+
});
|
|
827
|
+
|
|
828
|
+
export const JsonRemoveSchema = z
|
|
829
|
+
.preprocess(
|
|
830
|
+
preprocessJsonColumnParams,
|
|
831
|
+
z.object({
|
|
832
|
+
table: z.string().optional(),
|
|
833
|
+
tableName: z.string().optional(),
|
|
834
|
+
name: z.string().optional(),
|
|
835
|
+
column: z.string().optional(),
|
|
836
|
+
col: z.string().optional(),
|
|
837
|
+
paths: z.array(z.string()),
|
|
838
|
+
where: z.string().optional(),
|
|
839
|
+
filter: z.string().optional(),
|
|
840
|
+
}),
|
|
841
|
+
)
|
|
842
|
+
.transform((data) => ({
|
|
843
|
+
table: data.table ?? data.tableName ?? data.name ?? "",
|
|
844
|
+
column: data.column ?? data.col ?? "",
|
|
845
|
+
paths: data.paths,
|
|
846
|
+
where: data.where ?? data.filter ?? "",
|
|
847
|
+
}))
|
|
848
|
+
.refine((data) => data.table !== "", {
|
|
849
|
+
message: "table (or tableName/name alias) is required",
|
|
850
|
+
})
|
|
851
|
+
.refine((data) => data.column !== "", {
|
|
852
|
+
message: "column (or col alias) is required",
|
|
853
|
+
})
|
|
854
|
+
.refine((data) => data.where !== "", {
|
|
855
|
+
message: "where (or filter alias) is required",
|
|
856
|
+
});
|
|
857
|
+
|
|
858
|
+
// --- JsonArrayAppend ---
|
|
859
|
+
export const JsonArrayAppendSchemaBase = z.object({
|
|
860
|
+
table: z.string().optional().describe("Table name"),
|
|
861
|
+
tableName: z.string().optional().describe("Alias for table"),
|
|
862
|
+
name: z.string().optional().describe("Alias for table"),
|
|
863
|
+
column: z.string().optional().describe("JSON column name"),
|
|
864
|
+
col: z.string().optional().describe("Alias for column"),
|
|
865
|
+
path: z.string().describe("JSON path to array"),
|
|
866
|
+
value: z.unknown().describe("Value to append"),
|
|
867
|
+
where: z.string().optional().describe("WHERE clause to identify rows"),
|
|
868
|
+
filter: z.string().optional().describe("Alias for where"),
|
|
869
|
+
});
|
|
870
|
+
|
|
871
|
+
export const JsonArrayAppendSchema = z
|
|
872
|
+
.preprocess(
|
|
873
|
+
preprocessJsonColumnParams,
|
|
874
|
+
z.object({
|
|
875
|
+
table: z.string().optional(),
|
|
876
|
+
tableName: z.string().optional(),
|
|
877
|
+
name: z.string().optional(),
|
|
878
|
+
column: z.string().optional(),
|
|
879
|
+
col: z.string().optional(),
|
|
880
|
+
path: z.string(),
|
|
881
|
+
value: z.unknown(),
|
|
882
|
+
where: z.string().optional(),
|
|
883
|
+
filter: z.string().optional(),
|
|
884
|
+
}),
|
|
885
|
+
)
|
|
886
|
+
.transform((data) => ({
|
|
887
|
+
table: data.table ?? data.tableName ?? data.name ?? "",
|
|
888
|
+
column: data.column ?? data.col ?? "",
|
|
889
|
+
path: data.path,
|
|
890
|
+
value: data.value,
|
|
891
|
+
where: data.where ?? data.filter ?? "",
|
|
892
|
+
}))
|
|
893
|
+
.refine((data) => data.table !== "", {
|
|
894
|
+
message: "table (or tableName/name alias) is required",
|
|
895
|
+
})
|
|
896
|
+
.refine((data) => data.column !== "", {
|
|
897
|
+
message: "column (or col alias) is required",
|
|
898
|
+
})
|
|
899
|
+
.refine((data) => data.where !== "", {
|
|
900
|
+
message: "where (or filter alias) is required",
|
|
901
|
+
});
|
|
902
|
+
|
|
903
|
+
// --- JsonGet ---
|
|
904
|
+
export const JsonGetSchemaBase = z.object({
|
|
905
|
+
table: z.string().optional().describe("Table name"),
|
|
906
|
+
tableName: z.string().optional().describe("Alias for table"),
|
|
907
|
+
name: z.string().optional().describe("Alias for table"),
|
|
908
|
+
column: z.string().optional().describe("JSON column name"),
|
|
909
|
+
col: z.string().optional().describe("Alias for column"),
|
|
910
|
+
path: z.string().describe("JSON path to extract"),
|
|
911
|
+
id: z.union([z.string(), z.number()]).describe("Row ID"),
|
|
912
|
+
idColumn: z.string().default("id").describe("ID column name"),
|
|
913
|
+
});
|
|
914
|
+
|
|
915
|
+
export const JsonGetSchema = z
|
|
916
|
+
.preprocess(
|
|
917
|
+
preprocessJsonColumnParams,
|
|
918
|
+
z.object({
|
|
919
|
+
table: z.string().optional(),
|
|
920
|
+
tableName: z.string().optional(),
|
|
921
|
+
name: z.string().optional(),
|
|
922
|
+
column: z.string().optional(),
|
|
923
|
+
col: z.string().optional(),
|
|
924
|
+
path: z.string(),
|
|
925
|
+
id: z.union([z.string(), z.number()]),
|
|
926
|
+
idColumn: z.string().default("id"),
|
|
927
|
+
}),
|
|
928
|
+
)
|
|
929
|
+
.transform((data) => ({
|
|
930
|
+
table: data.table ?? data.tableName ?? data.name ?? "",
|
|
931
|
+
column: data.column ?? data.col ?? "",
|
|
932
|
+
path: data.path,
|
|
933
|
+
id: data.id,
|
|
934
|
+
idColumn: data.idColumn,
|
|
935
|
+
}))
|
|
936
|
+
.refine((data) => data.table !== "", {
|
|
937
|
+
message: "table (or tableName/name alias) is required",
|
|
938
|
+
})
|
|
939
|
+
.refine((data) => data.column !== "", {
|
|
940
|
+
message: "column (or col alias) is required",
|
|
941
|
+
});
|
|
942
|
+
|
|
943
|
+
// --- JsonUpdate ---
|
|
944
|
+
export const JsonUpdateSchemaBase = z.object({
|
|
945
|
+
table: z.string().optional().describe("Table name"),
|
|
946
|
+
tableName: z.string().optional().describe("Alias for table"),
|
|
947
|
+
name: z.string().optional().describe("Alias for table"),
|
|
948
|
+
column: z.string().optional().describe("JSON column name"),
|
|
949
|
+
col: z.string().optional().describe("Alias for column"),
|
|
950
|
+
path: z.string().describe("JSON path to update"),
|
|
951
|
+
value: z.unknown().describe("New value"),
|
|
952
|
+
id: z.union([z.string(), z.number()]).describe("Row ID"),
|
|
953
|
+
idColumn: z.string().default("id").describe("ID column name"),
|
|
954
|
+
});
|
|
955
|
+
|
|
956
|
+
export const JsonUpdateSchema = z
|
|
957
|
+
.preprocess(
|
|
958
|
+
preprocessJsonColumnParams,
|
|
959
|
+
z.object({
|
|
960
|
+
table: z.string().optional(),
|
|
961
|
+
tableName: z.string().optional(),
|
|
962
|
+
name: z.string().optional(),
|
|
963
|
+
column: z.string().optional(),
|
|
964
|
+
col: z.string().optional(),
|
|
965
|
+
path: z.string(),
|
|
966
|
+
value: z.unknown(),
|
|
967
|
+
id: z.union([z.string(), z.number()]),
|
|
968
|
+
idColumn: z.string().default("id"),
|
|
969
|
+
}),
|
|
970
|
+
)
|
|
971
|
+
.transform((data) => ({
|
|
972
|
+
table: data.table ?? data.tableName ?? data.name ?? "",
|
|
973
|
+
column: data.column ?? data.col ?? "",
|
|
974
|
+
path: data.path,
|
|
975
|
+
value: data.value,
|
|
976
|
+
id: data.id,
|
|
977
|
+
idColumn: data.idColumn,
|
|
978
|
+
}))
|
|
979
|
+
.refine((data) => data.table !== "", {
|
|
980
|
+
message: "table (or tableName/name alias) is required",
|
|
981
|
+
})
|
|
982
|
+
.refine((data) => data.column !== "", {
|
|
983
|
+
message: "column (or col alias) is required",
|
|
984
|
+
});
|
|
985
|
+
|
|
986
|
+
// --- JsonNormalize ---
|
|
987
|
+
export const JsonNormalizeSchemaBase = z.object({
|
|
988
|
+
table: z.string().optional().describe("Table name"),
|
|
989
|
+
tableName: z.string().optional().describe("Alias for table"),
|
|
990
|
+
name: z.string().optional().describe("Alias for table"),
|
|
991
|
+
column: z.string().optional().describe("JSON column name"),
|
|
992
|
+
col: z.string().optional().describe("Alias for column"),
|
|
993
|
+
where: z.string().optional().describe("WHERE clause"),
|
|
994
|
+
filter: z.string().optional().describe("Alias for where"),
|
|
995
|
+
limit: z.number().default(100).describe("Maximum rows to process"),
|
|
996
|
+
});
|
|
997
|
+
|
|
998
|
+
export const JsonNormalizeSchema = z
|
|
999
|
+
.preprocess(
|
|
1000
|
+
preprocessJsonColumnParams,
|
|
1001
|
+
z.object({
|
|
1002
|
+
table: z.string().optional(),
|
|
1003
|
+
tableName: z.string().optional(),
|
|
1004
|
+
name: z.string().optional(),
|
|
1005
|
+
column: z.string().optional(),
|
|
1006
|
+
col: z.string().optional(),
|
|
1007
|
+
where: z.string().optional(),
|
|
1008
|
+
filter: z.string().optional(),
|
|
1009
|
+
limit: z.number().default(100),
|
|
1010
|
+
}),
|
|
1011
|
+
)
|
|
1012
|
+
.transform((data) => ({
|
|
1013
|
+
table: data.table ?? data.tableName ?? data.name ?? "",
|
|
1014
|
+
column: data.column ?? data.col ?? "",
|
|
1015
|
+
where: data.where ?? data.filter,
|
|
1016
|
+
limit: data.limit,
|
|
1017
|
+
}))
|
|
1018
|
+
.refine((data) => data.table !== "", {
|
|
1019
|
+
message: "table (or tableName/name alias) is required",
|
|
1020
|
+
})
|
|
1021
|
+
.refine((data) => data.column !== "", {
|
|
1022
|
+
message: "column (or col alias) is required",
|
|
1023
|
+
});
|
|
1024
|
+
|
|
1025
|
+
// --- JsonStats ---
|
|
1026
|
+
export const JsonStatsSchemaBase = z.object({
|
|
1027
|
+
table: z.string().optional().describe("Table name"),
|
|
1028
|
+
tableName: z.string().optional().describe("Alias for table"),
|
|
1029
|
+
name: z.string().optional().describe("Alias for table"),
|
|
1030
|
+
column: z.string().optional().describe("JSON column name"),
|
|
1031
|
+
col: z.string().optional().describe("Alias for column"),
|
|
1032
|
+
where: z.string().optional().describe("Optional WHERE clause"),
|
|
1033
|
+
filter: z.string().optional().describe("Alias for where"),
|
|
1034
|
+
sampleSize: z.number().default(1000).describe("Sample size for statistics"),
|
|
1035
|
+
});
|
|
1036
|
+
|
|
1037
|
+
export const JsonStatsSchema = z
|
|
1038
|
+
.preprocess(
|
|
1039
|
+
preprocessJsonColumnParams,
|
|
1040
|
+
z.object({
|
|
1041
|
+
table: z.string().optional(),
|
|
1042
|
+
tableName: z.string().optional(),
|
|
1043
|
+
name: z.string().optional(),
|
|
1044
|
+
column: z.string().optional(),
|
|
1045
|
+
col: z.string().optional(),
|
|
1046
|
+
where: z.string().optional(),
|
|
1047
|
+
filter: z.string().optional(),
|
|
1048
|
+
sampleSize: z.number().default(1000),
|
|
1049
|
+
}),
|
|
1050
|
+
)
|
|
1051
|
+
.transform((data) => ({
|
|
1052
|
+
table: data.table ?? data.tableName ?? data.name ?? "",
|
|
1053
|
+
column: data.column ?? data.col ?? "",
|
|
1054
|
+
where: data.where ?? data.filter,
|
|
1055
|
+
sampleSize: data.sampleSize,
|
|
1056
|
+
}))
|
|
1057
|
+
.refine((data) => data.table !== "", {
|
|
1058
|
+
message: "table (or tableName/name alias) is required",
|
|
1059
|
+
})
|
|
1060
|
+
.refine((data) => data.column !== "", {
|
|
1061
|
+
message: "column (or col alias) is required",
|
|
1062
|
+
});
|
|
1063
|
+
|
|
1064
|
+
// --- JsonIndexSuggest ---
|
|
1065
|
+
export const JsonIndexSuggestSchemaBase = z.object({
|
|
1066
|
+
table: z.string().optional().describe("Table name"),
|
|
1067
|
+
tableName: z.string().optional().describe("Alias for table"),
|
|
1068
|
+
name: z.string().optional().describe("Alias for table"),
|
|
1069
|
+
column: z.string().optional().describe("JSON column name"),
|
|
1070
|
+
col: z.string().optional().describe("Alias for column"),
|
|
1071
|
+
sampleSize: z.number().default(100).describe("Sample size to analyze"),
|
|
1072
|
+
});
|
|
1073
|
+
|
|
1074
|
+
export const JsonIndexSuggestSchema = z
|
|
1075
|
+
.preprocess(
|
|
1076
|
+
preprocessJsonColumnParams,
|
|
1077
|
+
z.object({
|
|
1078
|
+
table: z.string().optional(),
|
|
1079
|
+
tableName: z.string().optional(),
|
|
1080
|
+
name: z.string().optional(),
|
|
1081
|
+
column: z.string().optional(),
|
|
1082
|
+
col: z.string().optional(),
|
|
1083
|
+
sampleSize: z.number().default(100),
|
|
1084
|
+
}),
|
|
1085
|
+
)
|
|
1086
|
+
.transform((data) => ({
|
|
1087
|
+
table: data.table ?? data.tableName ?? data.name ?? "",
|
|
1088
|
+
column: data.column ?? data.col ?? "",
|
|
1089
|
+
sampleSize: data.sampleSize,
|
|
1090
|
+
}))
|
|
1091
|
+
.refine((data) => data.table !== "", {
|
|
1092
|
+
message: "table (or tableName/name alias) is required",
|
|
1093
|
+
})
|
|
1094
|
+
.refine((data) => data.column !== "", {
|
|
1095
|
+
message: "column (or col alias) is required",
|
|
1096
|
+
});
|
|
1097
|
+
|
|
713
1098
|
// --- JsonValidate (no table/column — no aliases needed) ---
|
|
714
1099
|
export const JsonValidateSchema = z.object({
|
|
715
1100
|
value: z.string().describe("JSON string to validate"),
|
|
@@ -1070,6 +1455,119 @@ export const FulltextSearchSchema = z
|
|
|
1070
1455
|
message: "query (or sql alias) is required",
|
|
1071
1456
|
});
|
|
1072
1457
|
|
|
1458
|
+
// --- FulltextDrop ---
|
|
1459
|
+
export const FulltextDropSchemaBase = z.object({
|
|
1460
|
+
table: z.string().optional().describe("Table containing the index"),
|
|
1461
|
+
tableName: z.string().optional().describe("Alias for table"),
|
|
1462
|
+
name: z.string().optional().describe("Alias for table"),
|
|
1463
|
+
indexName: z
|
|
1464
|
+
.string()
|
|
1465
|
+
.optional()
|
|
1466
|
+
.describe("Name of the FULLTEXT index to drop"),
|
|
1467
|
+
});
|
|
1468
|
+
|
|
1469
|
+
export const FulltextDropSchema = z
|
|
1470
|
+
.preprocess(
|
|
1471
|
+
preprocessTableParams,
|
|
1472
|
+
z.object({
|
|
1473
|
+
table: z.string().optional(),
|
|
1474
|
+
tableName: z.string().optional(),
|
|
1475
|
+
name: z.string().optional(),
|
|
1476
|
+
indexName: z.string().optional(),
|
|
1477
|
+
}),
|
|
1478
|
+
)
|
|
1479
|
+
.transform((data) => ({
|
|
1480
|
+
table: data.table ?? data.tableName ?? data.name ?? "",
|
|
1481
|
+
indexName: data.indexName ?? "",
|
|
1482
|
+
}))
|
|
1483
|
+
.refine((data) => data.table !== "", {
|
|
1484
|
+
message: "table (or tableName/name alias) is required",
|
|
1485
|
+
})
|
|
1486
|
+
.refine((data) => data.indexName !== "", {
|
|
1487
|
+
message: "indexName is required",
|
|
1488
|
+
});
|
|
1489
|
+
|
|
1490
|
+
// --- FulltextBoolean ---
|
|
1491
|
+
export const FulltextBooleanSchemaBase = z.object({
|
|
1492
|
+
table: z.string().optional().describe("Table name"),
|
|
1493
|
+
tableName: z.string().optional().describe("Alias for table"),
|
|
1494
|
+
name: z.string().optional().describe("Alias for table"),
|
|
1495
|
+
columns: z.array(z.string()).optional().describe("Columns to search"),
|
|
1496
|
+
query: z
|
|
1497
|
+
.string()
|
|
1498
|
+
.optional()
|
|
1499
|
+
.describe("Boolean search query with +, -, *, etc."),
|
|
1500
|
+
maxLength: z
|
|
1501
|
+
.number()
|
|
1502
|
+
.optional()
|
|
1503
|
+
.describe(
|
|
1504
|
+
"Optional max characters per text column in results. Truncates with '...' if exceeded.",
|
|
1505
|
+
),
|
|
1506
|
+
});
|
|
1507
|
+
|
|
1508
|
+
export const FulltextBooleanSchema = z
|
|
1509
|
+
.preprocess(
|
|
1510
|
+
preprocessTableParams,
|
|
1511
|
+
z.object({
|
|
1512
|
+
table: z.string().optional(),
|
|
1513
|
+
tableName: z.string().optional(),
|
|
1514
|
+
name: z.string().optional(),
|
|
1515
|
+
columns: z.array(z.string()).optional(),
|
|
1516
|
+
query: z.string().optional(),
|
|
1517
|
+
maxLength: z.number().optional(),
|
|
1518
|
+
}),
|
|
1519
|
+
)
|
|
1520
|
+
.transform((data) => ({
|
|
1521
|
+
table: data.table ?? data.tableName ?? data.name ?? "",
|
|
1522
|
+
columns: data.columns ?? [],
|
|
1523
|
+
query: data.query ?? "",
|
|
1524
|
+
maxLength: data.maxLength,
|
|
1525
|
+
}))
|
|
1526
|
+
.refine((data) => data.table !== "", {
|
|
1527
|
+
message: "table (or tableName/name alias) is required",
|
|
1528
|
+
})
|
|
1529
|
+
.refine((data) => data.columns.length > 0, { message: "columns is required" })
|
|
1530
|
+
.refine((data) => data.query !== "", { message: "query is required" });
|
|
1531
|
+
|
|
1532
|
+
// --- FulltextExpand ---
|
|
1533
|
+
export const FulltextExpandSchemaBase = z.object({
|
|
1534
|
+
table: z.string().optional().describe("Table name"),
|
|
1535
|
+
tableName: z.string().optional().describe("Alias for table"),
|
|
1536
|
+
name: z.string().optional().describe("Alias for table"),
|
|
1537
|
+
columns: z.array(z.string()).optional().describe("Columns to search"),
|
|
1538
|
+
query: z.string().optional().describe("Search query to expand"),
|
|
1539
|
+
maxLength: z
|
|
1540
|
+
.number()
|
|
1541
|
+
.optional()
|
|
1542
|
+
.describe(
|
|
1543
|
+
"Optional max characters per text column in results. Truncates with '...' if exceeded.",
|
|
1544
|
+
),
|
|
1545
|
+
});
|
|
1546
|
+
|
|
1547
|
+
export const FulltextExpandSchema = z
|
|
1548
|
+
.preprocess(
|
|
1549
|
+
preprocessTableParams,
|
|
1550
|
+
z.object({
|
|
1551
|
+
table: z.string().optional(),
|
|
1552
|
+
tableName: z.string().optional(),
|
|
1553
|
+
name: z.string().optional(),
|
|
1554
|
+
columns: z.array(z.string()).optional(),
|
|
1555
|
+
query: z.string().optional(),
|
|
1556
|
+
maxLength: z.number().optional(),
|
|
1557
|
+
}),
|
|
1558
|
+
)
|
|
1559
|
+
.transform((data) => ({
|
|
1560
|
+
table: data.table ?? data.tableName ?? data.name ?? "",
|
|
1561
|
+
columns: data.columns ?? [],
|
|
1562
|
+
query: data.query ?? "",
|
|
1563
|
+
maxLength: data.maxLength,
|
|
1564
|
+
}))
|
|
1565
|
+
.refine((data) => data.table !== "", {
|
|
1566
|
+
message: "table (or tableName/name alias) is required",
|
|
1567
|
+
})
|
|
1568
|
+
.refine((data) => data.columns.length > 0, { message: "columns is required" })
|
|
1569
|
+
.refine((data) => data.query !== "", { message: "query is required" });
|
|
1570
|
+
|
|
1073
1571
|
// =============================================================================
|
|
1074
1572
|
// Performance Schemas
|
|
1075
1573
|
// =============================================================================
|
|
@@ -1143,6 +1641,20 @@ export const SlowQuerySchema = z.object({
|
|
|
1143
1641
|
minTime: z.number().optional().describe("Minimum query time in seconds"),
|
|
1144
1642
|
});
|
|
1145
1643
|
|
|
1644
|
+
// --- QueryStats (no table/query aliases — simple passthrough) ---
|
|
1645
|
+
export const QueryStatsSchema = z.object({
|
|
1646
|
+
orderBy: z
|
|
1647
|
+
.enum(["total_time", "avg_time", "executions"])
|
|
1648
|
+
.optional()
|
|
1649
|
+
.default("total_time")
|
|
1650
|
+
.describe("Order results by metric"),
|
|
1651
|
+
limit: z
|
|
1652
|
+
.number()
|
|
1653
|
+
.optional()
|
|
1654
|
+
.default(10)
|
|
1655
|
+
.describe("Maximum number of queries to return"),
|
|
1656
|
+
});
|
|
1657
|
+
|
|
1146
1658
|
// --- IndexUsage ---
|
|
1147
1659
|
export const IndexUsageSchemaBase = z.object({
|
|
1148
1660
|
table: z.string().optional().describe("Filter by table name"),
|
|
@@ -1195,6 +1707,48 @@ export const TableStatsSchema = z
|
|
|
1195
1707
|
message: "table (or tableName/name alias) is required",
|
|
1196
1708
|
});
|
|
1197
1709
|
|
|
1710
|
+
// --- IndexRecommendation ---
|
|
1711
|
+
|
|
1712
|
+
// Base schema for MCP visibility
|
|
1713
|
+
export const IndexRecommendationSchemaBase = z.object({
|
|
1714
|
+
table: z.string().optional().describe("Table to analyze for missing indexes"),
|
|
1715
|
+
tableName: z.string().optional().describe("Alias for table"),
|
|
1716
|
+
name: z.string().optional().describe("Alias for table"),
|
|
1717
|
+
});
|
|
1718
|
+
|
|
1719
|
+
// Transformed schema for handler parsing
|
|
1720
|
+
export const IndexRecommendationSchema = z
|
|
1721
|
+
.preprocess(preprocessTableParams, IndexRecommendationSchemaBase)
|
|
1722
|
+
.transform((data) => ({
|
|
1723
|
+
table: data.table ?? data.tableName ?? data.name ?? "",
|
|
1724
|
+
}))
|
|
1725
|
+
.refine((data) => data.table !== "", {
|
|
1726
|
+
message: "table (or tableName/name alias) is required",
|
|
1727
|
+
});
|
|
1728
|
+
|
|
1729
|
+
// --- ForceIndex ---
|
|
1730
|
+
|
|
1731
|
+
// Base schema for MCP visibility
|
|
1732
|
+
export const ForceIndexSchemaBase = z.object({
|
|
1733
|
+
table: z.string().optional().describe("Table name"),
|
|
1734
|
+
tableName: z.string().optional().describe("Alias for table"),
|
|
1735
|
+
name: z.string().optional().describe("Alias for table"),
|
|
1736
|
+
query: z.string().describe("Original query"),
|
|
1737
|
+
indexName: z.string().describe("Index name to force"),
|
|
1738
|
+
});
|
|
1739
|
+
|
|
1740
|
+
// Transformed schema for handler parsing
|
|
1741
|
+
export const ForceIndexSchema = z
|
|
1742
|
+
.preprocess(preprocessTableParams, ForceIndexSchemaBase)
|
|
1743
|
+
.transform((data) => ({
|
|
1744
|
+
table: data.table ?? data.tableName ?? data.name ?? "",
|
|
1745
|
+
query: data.query,
|
|
1746
|
+
indexName: data.indexName,
|
|
1747
|
+
}))
|
|
1748
|
+
.refine((data) => data.table !== "", {
|
|
1749
|
+
message: "table (or tableName/name alias) is required",
|
|
1750
|
+
});
|
|
1751
|
+
|
|
1198
1752
|
// =============================================================================
|
|
1199
1753
|
// Preprocess: Admin table params (normalizes singular 'table' to 'tables' array)
|
|
1200
1754
|
// =============================================================================
|
|
@@ -1276,10 +1830,7 @@ export const CheckTableSchemaBase = z.object({
|
|
|
1276
1830
|
table: z.string().optional().describe("Single table name (alias for tables)"),
|
|
1277
1831
|
tableName: z.string().optional().describe("Alias for table"),
|
|
1278
1832
|
name: z.string().optional().describe("Alias for table"),
|
|
1279
|
-
option: z
|
|
1280
|
-
.enum(["QUICK", "FAST", "MEDIUM", "EXTENDED", "CHANGED"])
|
|
1281
|
-
.optional()
|
|
1282
|
-
.describe("Check option"),
|
|
1833
|
+
option: z.string().optional().describe("Check option"),
|
|
1283
1834
|
});
|
|
1284
1835
|
|
|
1285
1836
|
export const CheckTableSchema = z
|
|
@@ -1303,6 +1854,38 @@ export const CheckTableSchema = z
|
|
|
1303
1854
|
message: "tables (or table/tableName/name alias) is required",
|
|
1304
1855
|
});
|
|
1305
1856
|
|
|
1857
|
+
// --- RepairTable ---
|
|
1858
|
+
export const RepairTableSchemaBase = z.object({
|
|
1859
|
+
tables: z.array(z.string()).optional().describe("Table names to repair"),
|
|
1860
|
+
table: z.string().optional().describe("Single table name (alias for tables)"),
|
|
1861
|
+
tableName: z.string().optional().describe("Alias for table"),
|
|
1862
|
+
name: z.string().optional().describe("Alias for table"),
|
|
1863
|
+
quick: z
|
|
1864
|
+
.boolean()
|
|
1865
|
+
.optional()
|
|
1866
|
+
.default(false)
|
|
1867
|
+
.describe("Quick repair (MyISAM only)"),
|
|
1868
|
+
});
|
|
1869
|
+
|
|
1870
|
+
export const RepairTableSchema = z
|
|
1871
|
+
.preprocess(
|
|
1872
|
+
preprocessAdminTableParams,
|
|
1873
|
+
z.object({
|
|
1874
|
+
tables: z.array(z.string()).optional(),
|
|
1875
|
+
table: z.string().optional(),
|
|
1876
|
+
tableName: z.string().optional(),
|
|
1877
|
+
name: z.string().optional(),
|
|
1878
|
+
quick: z.boolean().optional().default(false),
|
|
1879
|
+
}),
|
|
1880
|
+
)
|
|
1881
|
+
.transform((data) => ({
|
|
1882
|
+
tables: data.tables ?? [],
|
|
1883
|
+
quick: data.quick,
|
|
1884
|
+
}))
|
|
1885
|
+
.refine((data) => data.tables.length > 0, {
|
|
1886
|
+
message: "tables (or table/tableName/name alias) is required",
|
|
1887
|
+
});
|
|
1888
|
+
|
|
1306
1889
|
// --- FlushTables ---
|
|
1307
1890
|
export const FlushTablesSchemaBase = z.object({
|
|
1308
1891
|
tables: z
|
|
@@ -1328,6 +1911,15 @@ export const FlushTablesSchema = z
|
|
|
1328
1911
|
tables: data.tables,
|
|
1329
1912
|
}));
|
|
1330
1913
|
|
|
1914
|
+
export const KillQuerySchemaBase = z.object({
|
|
1915
|
+
processId: z.number().describe("Process ID to kill"),
|
|
1916
|
+
connection: z
|
|
1917
|
+
.boolean()
|
|
1918
|
+
.optional()
|
|
1919
|
+
.default(false)
|
|
1920
|
+
.describe("Kill connection instead of query"),
|
|
1921
|
+
});
|
|
1922
|
+
|
|
1331
1923
|
export const KillQuerySchema = z.object({
|
|
1332
1924
|
processId: z.number().describe("Process ID to kill"),
|
|
1333
1925
|
connection: z
|
|
@@ -1347,7 +1939,6 @@ export const ShowStatusSchema = z.object({
|
|
|
1347
1939
|
limit: z
|
|
1348
1940
|
.number()
|
|
1349
1941
|
.int()
|
|
1350
|
-
.positive()
|
|
1351
1942
|
.optional()
|
|
1352
1943
|
.describe(
|
|
1353
1944
|
"Maximum number of variables to return (default: 100). Set higher to see all.",
|
|
@@ -1364,7 +1955,6 @@ export const ShowVariablesSchema = z.object({
|
|
|
1364
1955
|
limit: z
|
|
1365
1956
|
.number()
|
|
1366
1957
|
.int()
|
|
1367
|
-
.positive()
|
|
1368
1958
|
.optional()
|
|
1369
1959
|
.describe(
|
|
1370
1960
|
"Maximum number of variables to return (default: 100). Set higher to see all.",
|
|
@@ -1390,12 +1980,20 @@ export const ExportTableSchemaBase = z.object({
|
|
|
1390
1980
|
limit: z
|
|
1391
1981
|
.number()
|
|
1392
1982
|
.int()
|
|
1393
|
-
.positive()
|
|
1394
1983
|
.optional()
|
|
1395
1984
|
.default(100)
|
|
1396
1985
|
.describe(
|
|
1397
1986
|
"Maximum number of rows to export (default: 100). Set higher to export more rows.",
|
|
1398
1987
|
),
|
|
1988
|
+
batch: z
|
|
1989
|
+
.number()
|
|
1990
|
+
.int()
|
|
1991
|
+
.positive()
|
|
1992
|
+
.optional()
|
|
1993
|
+
.default(1)
|
|
1994
|
+
.describe(
|
|
1995
|
+
"Rows per INSERT statement (default: 1). Higher values produce multi-row INSERT ... VALUES (...), (...) for smaller payloads.",
|
|
1996
|
+
),
|
|
1399
1997
|
});
|
|
1400
1998
|
|
|
1401
1999
|
export const ExportTableSchema = z
|
|
@@ -1409,6 +2007,7 @@ export const ExportTableSchema = z
|
|
|
1409
2007
|
where: z.string().optional(),
|
|
1410
2008
|
filter: z.string().optional(),
|
|
1411
2009
|
limit: z.number().int().positive().optional().default(100),
|
|
2010
|
+
batch: z.number().int().positive().optional().default(1),
|
|
1412
2011
|
}),
|
|
1413
2012
|
)
|
|
1414
2013
|
.transform((data) => ({
|
|
@@ -1416,6 +2015,7 @@ export const ExportTableSchema = z
|
|
|
1416
2015
|
format: data.format,
|
|
1417
2016
|
where: data.where ?? data.filter,
|
|
1418
2017
|
limit: data.limit,
|
|
2018
|
+
batch: data.batch,
|
|
1419
2019
|
}))
|
|
1420
2020
|
.refine((data) => data.table !== "", {
|
|
1421
2021
|
message: "table (or tableName/name alias) is required",
|
|
@@ -1453,11 +2053,24 @@ export const ImportDataSchema = z
|
|
|
1453
2053
|
// Replication Schemas
|
|
1454
2054
|
// =============================================================================
|
|
1455
2055
|
|
|
2056
|
+
export const BinlogEventsSchemaBase = z.object({
|
|
2057
|
+
logFile: z.string().optional().describe("Binlog file name"),
|
|
2058
|
+
position: z.number().optional().describe("Starting position"),
|
|
2059
|
+
limit: z
|
|
2060
|
+
.number()
|
|
2061
|
+
.optional()
|
|
2062
|
+
.default(20)
|
|
2063
|
+
.describe(
|
|
2064
|
+
"Maximum events to return (default: 20). Set higher for more events.",
|
|
2065
|
+
),
|
|
2066
|
+
});
|
|
2067
|
+
|
|
1456
2068
|
export const BinlogEventsSchema = z.object({
|
|
1457
2069
|
logFile: z.string().optional().describe("Binlog file name"),
|
|
1458
2070
|
position: z.number().optional().describe("Starting position"),
|
|
1459
2071
|
limit: z
|
|
1460
2072
|
.number()
|
|
2073
|
+
.nonnegative()
|
|
1461
2074
|
.optional()
|
|
1462
2075
|
.default(20)
|
|
1463
2076
|
.describe(
|