@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
|
@@ -4,13 +4,30 @@
|
|
|
4
4
|
* Tools for SSL/TLS monitoring, encryption status, and password validation.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import { z } from "zod";
|
|
7
|
+
import { z, ZodError } from "zod";
|
|
8
8
|
import type { MySQLAdapter } from "../../MySQLAdapter.js";
|
|
9
9
|
import type {
|
|
10
10
|
ToolDefinition,
|
|
11
11
|
RequestContext,
|
|
12
12
|
} from "../../../../types/index.js";
|
|
13
13
|
|
|
14
|
+
// =============================================================================
|
|
15
|
+
// Helpers
|
|
16
|
+
// =============================================================================
|
|
17
|
+
|
|
18
|
+
/** Extract human-readable messages from a ZodError instead of raw JSON array */
|
|
19
|
+
function formatZodError(error: ZodError): string {
|
|
20
|
+
return error.issues.map((i) => i.message).join("; ");
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** Strip verbose adapter prefixes from error messages */
|
|
24
|
+
function stripErrorPrefix(msg: string): string {
|
|
25
|
+
return msg
|
|
26
|
+
.replace(/^Query failed:\s*/i, "")
|
|
27
|
+
.replace(/^Execute failed:\s*/i, "")
|
|
28
|
+
.trim();
|
|
29
|
+
}
|
|
30
|
+
|
|
14
31
|
// =============================================================================
|
|
15
32
|
// Zod Schemas
|
|
16
33
|
// =============================================================================
|
|
@@ -41,73 +58,69 @@ export function createSecuritySSLStatusTool(
|
|
|
41
58
|
idempotentHint: true,
|
|
42
59
|
},
|
|
43
60
|
handler: async (_params: unknown, _context: RequestContext) => {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
const status: Record<string, unknown> = Object.fromEntries(
|
|
50
|
-
(statusResult.rows ?? []).map((r) => {
|
|
51
|
-
const record = r;
|
|
52
|
-
const varName =
|
|
53
|
-
typeof record["Variable_name"] === "string"
|
|
54
|
-
? record["Variable_name"]
|
|
55
|
-
: "";
|
|
56
|
-
return [varName, record["Value"]];
|
|
57
|
-
}),
|
|
58
|
-
);
|
|
59
|
-
|
|
60
|
-
// Get SSL variables
|
|
61
|
-
const varsResult = await adapter.executeQuery(
|
|
62
|
-
"SHOW VARIABLES LIKE '%ssl%'",
|
|
63
|
-
);
|
|
64
|
-
|
|
65
|
-
const variables: Record<string, unknown> = Object.fromEntries(
|
|
66
|
-
(varsResult.rows ?? []).map((r) => {
|
|
67
|
-
const record = r;
|
|
68
|
-
const varName =
|
|
69
|
-
typeof record["Variable_name"] === "string"
|
|
70
|
-
? record["Variable_name"]
|
|
71
|
-
: "";
|
|
72
|
-
return [varName, record["Value"]];
|
|
73
|
-
}),
|
|
74
|
-
);
|
|
61
|
+
try {
|
|
62
|
+
// Get SSL status
|
|
63
|
+
const statusResult = await adapter.executeQuery(
|
|
64
|
+
"SHOW STATUS LIKE 'Ssl%'",
|
|
65
|
+
);
|
|
75
66
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
67
|
+
const status: Record<string, unknown> = Object.fromEntries(
|
|
68
|
+
(statusResult.rows ?? []).map((r) => {
|
|
69
|
+
const record = r;
|
|
70
|
+
const varName =
|
|
71
|
+
typeof record["Variable_name"] === "string"
|
|
72
|
+
? record["Variable_name"]
|
|
73
|
+
: "";
|
|
74
|
+
return [varName, record["Value"]];
|
|
75
|
+
}),
|
|
76
|
+
);
|
|
79
77
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
// Let's just remove the unused query entirely.
|
|
78
|
+
// Get SSL variables
|
|
79
|
+
const varsResult = await adapter.executeQuery(
|
|
80
|
+
"SHOW VARIABLES LIKE '%ssl%'",
|
|
81
|
+
);
|
|
85
82
|
|
|
86
|
-
|
|
83
|
+
const variables: Record<string, unknown> = Object.fromEntries(
|
|
84
|
+
(varsResult.rows ?? []).map((r) => {
|
|
85
|
+
const record = r;
|
|
86
|
+
const varName =
|
|
87
|
+
typeof record["Variable_name"] === "string"
|
|
88
|
+
? record["Variable_name"]
|
|
89
|
+
: "";
|
|
90
|
+
return [varName, record["Value"]];
|
|
91
|
+
}),
|
|
92
|
+
);
|
|
87
93
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
94
|
+
// Helper to safely extract string values
|
|
95
|
+
const str = (val: unknown, defaultVal = ""): string =>
|
|
96
|
+
typeof val === "string" && val !== "" ? val : defaultVal;
|
|
91
97
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
98
|
+
return {
|
|
99
|
+
sslEnabled: str(status["Ssl_cipher"]) !== "",
|
|
100
|
+
currentCipher: str(status["Ssl_cipher"], "None"),
|
|
101
|
+
sslVersion: str(status["Ssl_version"], "N/A"),
|
|
102
|
+
serverCertVerification: false, // Unknown in recent versions via variables
|
|
103
|
+
configuration: {
|
|
104
|
+
sslCa: str(variables["ssl_ca"]),
|
|
105
|
+
sslCert: str(variables["ssl_cert"]),
|
|
106
|
+
sslKey: str(variables["ssl_key"]),
|
|
107
|
+
requireSecureTransport: str(
|
|
108
|
+
variables["require_secure_transport"],
|
|
109
|
+
"OFF",
|
|
110
|
+
),
|
|
111
|
+
},
|
|
112
|
+
sessionStats: {
|
|
113
|
+
acceptedConnects: str(status["Ssl_accepts"], "0"),
|
|
114
|
+
finishedConnects: str(status["Ssl_finished_accepts"], "0"),
|
|
115
|
+
},
|
|
116
|
+
};
|
|
117
|
+
} catch (error) {
|
|
118
|
+
if (error instanceof ZodError) {
|
|
119
|
+
return { success: false, error: formatZodError(error) };
|
|
120
|
+
}
|
|
121
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
122
|
+
return { success: false, error: stripErrorPrefix(message) };
|
|
123
|
+
}
|
|
111
124
|
},
|
|
112
125
|
};
|
|
113
126
|
}
|
|
@@ -130,15 +143,16 @@ export function createSecurityEncryptionStatusTool(
|
|
|
130
143
|
idempotentHint: true,
|
|
131
144
|
},
|
|
132
145
|
handler: async (_params: unknown, _context: RequestContext) => {
|
|
133
|
-
|
|
134
|
-
|
|
146
|
+
try {
|
|
147
|
+
// Check for keyring plugins
|
|
148
|
+
const keyringResult = await adapter.executeQuery(`
|
|
135
149
|
SELECT PLUGIN_NAME, PLUGIN_STATUS
|
|
136
150
|
FROM information_schema.PLUGINS
|
|
137
151
|
WHERE PLUGIN_NAME LIKE 'keyring%'
|
|
138
152
|
`);
|
|
139
153
|
|
|
140
|
-
|
|
141
|
-
|
|
154
|
+
// Check encrypted tablespaces
|
|
155
|
+
const tablespaceResult = await adapter.executeQuery(`
|
|
142
156
|
SELECT
|
|
143
157
|
NAME,
|
|
144
158
|
ENCRYPTION
|
|
@@ -146,49 +160,56 @@ export function createSecurityEncryptionStatusTool(
|
|
|
146
160
|
WHERE ENCRYPTION = 'Y'
|
|
147
161
|
`);
|
|
148
162
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
163
|
+
// Check encryption variables
|
|
164
|
+
const varsResult = await adapter.executeQuery(
|
|
165
|
+
"SHOW VARIABLES LIKE '%encrypt%'",
|
|
166
|
+
);
|
|
153
167
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
168
|
+
const variables: Record<string, unknown> = Object.fromEntries(
|
|
169
|
+
(varsResult.rows ?? []).map((r) => {
|
|
170
|
+
const record = r;
|
|
171
|
+
const varName =
|
|
172
|
+
typeof record["Variable_name"] === "string"
|
|
173
|
+
? record["Variable_name"]
|
|
174
|
+
: "";
|
|
175
|
+
return [varName, record["Value"]];
|
|
176
|
+
}),
|
|
177
|
+
);
|
|
164
178
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
179
|
+
// Check redo/undo log encryption
|
|
180
|
+
const innodbVarsResult = await adapter.executeQuery(
|
|
181
|
+
"SHOW VARIABLES LIKE 'innodb_%encrypt%'",
|
|
182
|
+
);
|
|
169
183
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
184
|
+
const innodbVars: Record<string, unknown> = Object.fromEntries(
|
|
185
|
+
(innodbVarsResult.rows ?? []).map((r) => {
|
|
186
|
+
const record = r;
|
|
187
|
+
const varName =
|
|
188
|
+
typeof record["Variable_name"] === "string"
|
|
189
|
+
? record["Variable_name"]
|
|
190
|
+
: "";
|
|
191
|
+
return [varName, record["Value"]];
|
|
192
|
+
}),
|
|
193
|
+
);
|
|
180
194
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
195
|
+
return {
|
|
196
|
+
keyringPlugins: keyringResult.rows ?? [],
|
|
197
|
+
keyringInstalled: (keyringResult.rows?.length ?? 0) > 0,
|
|
198
|
+
encryptedTablespaces: tablespaceResult.rows ?? [],
|
|
199
|
+
encryptedTablespaceCount: tablespaceResult.rows?.length ?? 0,
|
|
200
|
+
encryptionSettings: {
|
|
201
|
+
...variables,
|
|
202
|
+
...innodbVars,
|
|
203
|
+
},
|
|
204
|
+
tdeAvailable: (keyringResult.rows?.length ?? 0) > 0,
|
|
205
|
+
};
|
|
206
|
+
} catch (error) {
|
|
207
|
+
if (error instanceof ZodError) {
|
|
208
|
+
return { success: false, error: formatZodError(error) };
|
|
209
|
+
}
|
|
210
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
211
|
+
return { success: false, error: stripErrorPrefix(message) };
|
|
212
|
+
}
|
|
192
213
|
},
|
|
193
214
|
};
|
|
194
215
|
}
|
|
@@ -212,36 +233,36 @@ export function createSecurityPasswordValidateTool(
|
|
|
212
233
|
idempotentHint: true,
|
|
213
234
|
},
|
|
214
235
|
handler: async (params: unknown, _context: RequestContext) => {
|
|
215
|
-
|
|
236
|
+
try {
|
|
237
|
+
const { password } = PasswordValidateSchema.parse(params);
|
|
216
238
|
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
239
|
+
// First check if validate_password component is installed
|
|
240
|
+
// by checking for its variables
|
|
241
|
+
const policyResult = await adapter.executeQuery(
|
|
242
|
+
"SHOW VARIABLES LIKE 'validate_password%'",
|
|
243
|
+
);
|
|
222
244
|
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
245
|
+
const policy: Record<string, unknown> = Object.fromEntries(
|
|
246
|
+
(policyResult.rows ?? []).map((r) => {
|
|
247
|
+
const record = r;
|
|
248
|
+
const varName =
|
|
249
|
+
typeof record["Variable_name"] === "string"
|
|
250
|
+
? record["Variable_name"]
|
|
251
|
+
: "";
|
|
252
|
+
return [varName, record["Value"]];
|
|
253
|
+
}),
|
|
254
|
+
);
|
|
233
255
|
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
256
|
+
// If no validate_password variables exist, component is not installed
|
|
257
|
+
if (Object.keys(policy).length === 0) {
|
|
258
|
+
return {
|
|
259
|
+
available: false,
|
|
260
|
+
message: "Password validation component not installed",
|
|
261
|
+
suggestion:
|
|
262
|
+
'Install with: INSTALL COMPONENT "file://component_validate_password"',
|
|
263
|
+
};
|
|
264
|
+
}
|
|
243
265
|
|
|
244
|
-
try {
|
|
245
266
|
// Use validate_password function
|
|
246
267
|
const result = await adapter.executeQuery(
|
|
247
268
|
"SELECT VALIDATE_PASSWORD_STRENGTH(?) as strength",
|
|
@@ -264,13 +285,25 @@ export function createSecurityPasswordValidateTool(
|
|
|
264
285
|
meetsPolicy: strength >= 50, // General guideline
|
|
265
286
|
policy,
|
|
266
287
|
};
|
|
267
|
-
} catch {
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
288
|
+
} catch (error) {
|
|
289
|
+
if (error instanceof ZodError) {
|
|
290
|
+
return { success: false, error: formatZodError(error) };
|
|
291
|
+
}
|
|
292
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
293
|
+
// Check for known component-not-installed errors
|
|
294
|
+
const lower = message.toLowerCase();
|
|
295
|
+
if (
|
|
296
|
+
lower.includes("validate_password_strength") ||
|
|
297
|
+
lower.includes("function")
|
|
298
|
+
) {
|
|
299
|
+
return {
|
|
300
|
+
available: false,
|
|
301
|
+
message: "Password validation function failed",
|
|
302
|
+
suggestion:
|
|
303
|
+
'Reinstall with: INSTALL COMPONENT "file://component_validate_password"',
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
return { success: false, error: stripErrorPrefix(message) };
|
|
274
307
|
}
|
|
275
308
|
},
|
|
276
309
|
};
|
|
@@ -299,6 +299,20 @@ describe("Shell Backup Tools", () => {
|
|
|
299
299
|
expect(result.success).toBe(false);
|
|
300
300
|
expect(result.error).toContain("Table not found");
|
|
301
301
|
});
|
|
302
|
+
|
|
303
|
+
it("should return structured error for empty schemas array", async () => {
|
|
304
|
+
const tool = createShellDumpSchemasTool();
|
|
305
|
+
const result = (await tool.handler(
|
|
306
|
+
{
|
|
307
|
+
schemas: [],
|
|
308
|
+
outputDir: "/backup",
|
|
309
|
+
},
|
|
310
|
+
mockContext,
|
|
311
|
+
)) as any;
|
|
312
|
+
|
|
313
|
+
expect(result.success).toBe(false);
|
|
314
|
+
expect(result.error).toContain("At least one schema name is required");
|
|
315
|
+
});
|
|
302
316
|
});
|
|
303
317
|
|
|
304
318
|
describe("mysqlsh_dump_tables", () => {
|
|
@@ -454,5 +468,20 @@ describe("Shell Backup Tools", () => {
|
|
|
454
468
|
expect(result.success).toBe(false);
|
|
455
469
|
expect(result.error).toContain("Connection timeout");
|
|
456
470
|
});
|
|
471
|
+
|
|
472
|
+
it("should return structured error for empty tables array", async () => {
|
|
473
|
+
const tool = createShellDumpTablesTool();
|
|
474
|
+
const result = (await tool.handler(
|
|
475
|
+
{
|
|
476
|
+
schema: "s",
|
|
477
|
+
tables: [],
|
|
478
|
+
outputDir: "/o",
|
|
479
|
+
},
|
|
480
|
+
mockContext,
|
|
481
|
+
)) as any;
|
|
482
|
+
|
|
483
|
+
expect(result.success).toBe(false);
|
|
484
|
+
expect(result.error).toContain("At least one table name is required");
|
|
485
|
+
});
|
|
457
486
|
});
|
|
458
487
|
});
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* Tools for creating database dumps using MySQL Shell.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
+
import { ZodError } from "zod";
|
|
7
8
|
import type {
|
|
8
9
|
ToolDefinition,
|
|
9
10
|
RequestContext,
|
|
@@ -15,6 +16,11 @@ import {
|
|
|
15
16
|
} from "../../types/shell-types.js";
|
|
16
17
|
import { escapeForJS, execShellJS } from "./common.js";
|
|
17
18
|
|
|
19
|
+
/** Extract human-readable messages from a ZodError instead of raw JSON array */
|
|
20
|
+
function formatZodError(error: ZodError): string {
|
|
21
|
+
return error.issues.map((i) => i.message).join("; ");
|
|
22
|
+
}
|
|
23
|
+
|
|
18
24
|
/**
|
|
19
25
|
* Dump entire MySQL instance
|
|
20
26
|
*/
|
|
@@ -126,47 +132,54 @@ export function createShellDumpSchemasTool(): ToolDefinition {
|
|
|
126
132
|
openWorldHint: true,
|
|
127
133
|
},
|
|
128
134
|
handler: async (params: unknown, _context: RequestContext) => {
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
135
|
+
try {
|
|
136
|
+
const {
|
|
137
|
+
schemas,
|
|
138
|
+
outputDir,
|
|
139
|
+
threads,
|
|
140
|
+
compression,
|
|
141
|
+
dryRun,
|
|
142
|
+
includeTables,
|
|
143
|
+
excludeTables,
|
|
144
|
+
ddlOnly,
|
|
145
|
+
} = ShellDumpSchemasInputSchema.parse(params);
|
|
139
146
|
|
|
140
|
-
|
|
147
|
+
if (schemas.length === 0) {
|
|
148
|
+
return {
|
|
149
|
+
success: false,
|
|
150
|
+
error: "At least one schema name is required",
|
|
151
|
+
};
|
|
152
|
+
}
|
|
141
153
|
|
|
142
|
-
|
|
143
|
-
if (threads) {
|
|
144
|
-
options.push(`threads: ${threads}`);
|
|
145
|
-
}
|
|
146
|
-
if (compression && compression !== "zstd") {
|
|
147
|
-
options.push(`compression: "${compression}"`);
|
|
148
|
-
}
|
|
149
|
-
if (dryRun) {
|
|
150
|
-
options.push("dryRun: true");
|
|
151
|
-
}
|
|
152
|
-
if (includeTables && includeTables.length > 0) {
|
|
153
|
-
options.push(`includeTables: ${JSON.stringify(includeTables)}`);
|
|
154
|
-
}
|
|
155
|
-
if (excludeTables && excludeTables.length > 0) {
|
|
156
|
-
options.push(`excludeTables: ${JSON.stringify(excludeTables)}`);
|
|
157
|
-
}
|
|
158
|
-
// ddlOnly mode disables all metadata that requires extra privileges
|
|
159
|
-
if (ddlOnly) {
|
|
160
|
-
options.push("events: false");
|
|
161
|
-
options.push("triggers: false");
|
|
162
|
-
options.push("routines: false");
|
|
163
|
-
}
|
|
154
|
+
const escapedPath = outputDir.replace(/\\/g, "\\\\");
|
|
164
155
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
156
|
+
const options: string[] = [];
|
|
157
|
+
if (threads) {
|
|
158
|
+
options.push(`threads: ${threads}`);
|
|
159
|
+
}
|
|
160
|
+
if (compression && compression !== "zstd") {
|
|
161
|
+
options.push(`compression: "${compression}"`);
|
|
162
|
+
}
|
|
163
|
+
if (dryRun) {
|
|
164
|
+
options.push("dryRun: true");
|
|
165
|
+
}
|
|
166
|
+
if (includeTables && includeTables.length > 0) {
|
|
167
|
+
options.push(`includeTables: ${JSON.stringify(includeTables)}`);
|
|
168
|
+
}
|
|
169
|
+
if (excludeTables && excludeTables.length > 0) {
|
|
170
|
+
options.push(`excludeTables: ${JSON.stringify(excludeTables)}`);
|
|
171
|
+
}
|
|
172
|
+
// ddlOnly mode disables all metadata that requires extra privileges
|
|
173
|
+
if (ddlOnly) {
|
|
174
|
+
options.push("events: false");
|
|
175
|
+
options.push("triggers: false");
|
|
176
|
+
options.push("routines: false");
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
const optionsStr =
|
|
180
|
+
options.length > 0 ? `, { ${options.join(", ")} }` : "";
|
|
181
|
+
const jsCode = `return util.dumpSchemas(${JSON.stringify(schemas)}, "${escapedPath}"${optionsStr});`;
|
|
168
182
|
|
|
169
|
-
try {
|
|
170
183
|
const result = await execShellJS(jsCode, { timeout: 3600000 });
|
|
171
184
|
return {
|
|
172
185
|
success: true,
|
|
@@ -177,6 +190,9 @@ export function createShellDumpSchemasTool(): ToolDefinition {
|
|
|
177
190
|
result,
|
|
178
191
|
};
|
|
179
192
|
} catch (error) {
|
|
193
|
+
if (error instanceof ZodError) {
|
|
194
|
+
return { success: false, error: formatZodError(error) };
|
|
195
|
+
}
|
|
180
196
|
const errorMessage =
|
|
181
197
|
error instanceof Error ? error.message : String(error);
|
|
182
198
|
if (
|
|
@@ -186,13 +202,11 @@ export function createShellDumpSchemasTool(): ToolDefinition {
|
|
|
186
202
|
) {
|
|
187
203
|
return {
|
|
188
204
|
success: false,
|
|
189
|
-
schemas,
|
|
190
|
-
outputDir,
|
|
191
205
|
error: `Dump failed due to missing privileges: ${errorMessage}.`,
|
|
192
206
|
hint: "Set ddlOnly: true to skip events, triggers, and routines.",
|
|
193
207
|
};
|
|
194
208
|
}
|
|
195
|
-
return { success: false,
|
|
209
|
+
return { success: false, error: errorMessage };
|
|
196
210
|
}
|
|
197
211
|
},
|
|
198
212
|
};
|
|
@@ -215,34 +229,43 @@ export function createShellDumpTablesTool(): ToolDefinition {
|
|
|
215
229
|
openWorldHint: true,
|
|
216
230
|
},
|
|
217
231
|
handler: async (params: unknown, _context: RequestContext) => {
|
|
218
|
-
|
|
219
|
-
|
|
232
|
+
try {
|
|
233
|
+
const { schema, tables, outputDir, threads, compression, where, all } =
|
|
234
|
+
ShellDumpTablesInputSchema.parse(params);
|
|
220
235
|
|
|
221
|
-
|
|
236
|
+
if (tables.length === 0) {
|
|
237
|
+
return {
|
|
238
|
+
success: false,
|
|
239
|
+
error: "At least one table name is required",
|
|
240
|
+
};
|
|
241
|
+
}
|
|
222
242
|
|
|
223
|
-
|
|
224
|
-
if (threads) {
|
|
225
|
-
options.push(`threads: ${threads}`);
|
|
226
|
-
}
|
|
227
|
-
if (compression && compression !== "zstd") {
|
|
228
|
-
options.push(`compression: "${compression}"`);
|
|
229
|
-
}
|
|
230
|
-
if (where && Object.keys(where).length > 0) {
|
|
231
|
-
const whereEntries = Object.entries(where)
|
|
232
|
-
.map(([tbl, cond]) => `"${escapeForJS(tbl)}": "${escapeForJS(cond)}"`)
|
|
233
|
-
.join(", ");
|
|
234
|
-
options.push(`where: { ${whereEntries} }`);
|
|
235
|
-
}
|
|
236
|
-
// When all is explicitly false, disable triggers/routines dumping
|
|
237
|
-
if (!all) {
|
|
238
|
-
options.push("triggers: false");
|
|
239
|
-
}
|
|
243
|
+
const escapedPath = outputDir.replace(/\\/g, "\\\\");
|
|
240
244
|
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
245
|
+
const options: string[] = [];
|
|
246
|
+
if (threads) {
|
|
247
|
+
options.push(`threads: ${threads}`);
|
|
248
|
+
}
|
|
249
|
+
if (compression && compression !== "zstd") {
|
|
250
|
+
options.push(`compression: "${compression}"`);
|
|
251
|
+
}
|
|
252
|
+
if (where && Object.keys(where).length > 0) {
|
|
253
|
+
const whereEntries = Object.entries(where)
|
|
254
|
+
.map(
|
|
255
|
+
([tbl, cond]) => `"${escapeForJS(tbl)}": "${escapeForJS(cond)}"`,
|
|
256
|
+
)
|
|
257
|
+
.join(", ");
|
|
258
|
+
options.push(`where: { ${whereEntries} }`);
|
|
259
|
+
}
|
|
260
|
+
// When all is explicitly false, disable triggers/routines dumping
|
|
261
|
+
if (!all) {
|
|
262
|
+
options.push("triggers: false");
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
const optionsStr =
|
|
266
|
+
options.length > 0 ? `, { ${options.join(", ")} }` : "";
|
|
267
|
+
const jsCode = `return util.dumpTables("${schema}", ${JSON.stringify(tables)}, "${escapedPath}"${optionsStr});`;
|
|
244
268
|
|
|
245
|
-
try {
|
|
246
269
|
const result = await execShellJS(jsCode, { timeout: 3600000 });
|
|
247
270
|
return {
|
|
248
271
|
success: true,
|
|
@@ -253,6 +276,9 @@ export function createShellDumpTablesTool(): ToolDefinition {
|
|
|
253
276
|
result,
|
|
254
277
|
};
|
|
255
278
|
} catch (error) {
|
|
279
|
+
if (error instanceof ZodError) {
|
|
280
|
+
return { success: false, error: formatZodError(error) };
|
|
281
|
+
}
|
|
256
282
|
const errorMessage =
|
|
257
283
|
error instanceof Error ? error.message : String(error);
|
|
258
284
|
|
|
@@ -269,9 +295,6 @@ export function createShellDumpTablesTool(): ToolDefinition {
|
|
|
269
295
|
|
|
270
296
|
return {
|
|
271
297
|
success: false,
|
|
272
|
-
schema,
|
|
273
|
-
tables,
|
|
274
|
-
outputDir,
|
|
275
298
|
error: `Dump failed due to missing privileges: ${errorMessage}.`,
|
|
276
299
|
hint:
|
|
277
300
|
specificPrivilege === "EVENT" || specificPrivilege === "TRIGGER"
|
|
@@ -284,9 +307,6 @@ export function createShellDumpTablesTool(): ToolDefinition {
|
|
|
284
307
|
if (errorMessage.includes("Fatal error during dump")) {
|
|
285
308
|
return {
|
|
286
309
|
success: false,
|
|
287
|
-
schema,
|
|
288
|
-
tables,
|
|
289
|
-
outputDir,
|
|
290
310
|
error: errorMessage.includes("Writing schema metadata")
|
|
291
311
|
? `Dump failed while writing schema metadata: ${errorMessage}.`
|
|
292
312
|
: `Dump failed: ${errorMessage}.`,
|
|
@@ -296,9 +316,6 @@ export function createShellDumpTablesTool(): ToolDefinition {
|
|
|
296
316
|
|
|
297
317
|
return {
|
|
298
318
|
success: false,
|
|
299
|
-
schema,
|
|
300
|
-
tables,
|
|
301
|
-
outputDir,
|
|
302
319
|
error: errorMessage,
|
|
303
320
|
};
|
|
304
321
|
}
|