@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
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
import { promises as fs } from "fs";
|
|
8
8
|
import { tmpdir } from "os";
|
|
9
9
|
import { join } from "path";
|
|
10
|
+
import { ZodError } from "zod";
|
|
10
11
|
import type {
|
|
11
12
|
ToolDefinition,
|
|
12
13
|
RequestContext,
|
|
@@ -17,6 +18,11 @@ import {
|
|
|
17
18
|
} from "../../types/shell-types.js";
|
|
18
19
|
import { getShellConfig, execShellJS, execMySQLShell } from "./common.js";
|
|
19
20
|
|
|
21
|
+
/** Extract human-readable messages from a ZodError instead of raw JSON array */
|
|
22
|
+
function formatZodError(error: ZodError): string {
|
|
23
|
+
return error.issues.map((i) => i.message).join("; ");
|
|
24
|
+
}
|
|
25
|
+
|
|
20
26
|
/**
|
|
21
27
|
* Load dump to instance
|
|
22
28
|
*/
|
|
@@ -210,59 +216,67 @@ export function createShellRunScriptTool(): ToolDefinition {
|
|
|
210
216
|
openWorldHint: true,
|
|
211
217
|
},
|
|
212
218
|
handler: async (params: unknown, _context: RequestContext) => {
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
219
|
+
try {
|
|
220
|
+
const { script, language, timeout } =
|
|
221
|
+
ShellRunScriptInputSchema.parse(params);
|
|
222
|
+
const config = getShellConfig();
|
|
216
223
|
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
224
|
+
// Build command based on language
|
|
225
|
+
let langFlag: string;
|
|
226
|
+
switch (language) {
|
|
227
|
+
case "js":
|
|
228
|
+
langFlag = "--js";
|
|
229
|
+
break;
|
|
230
|
+
case "py":
|
|
231
|
+
langFlag = "--py";
|
|
232
|
+
break;
|
|
233
|
+
case "sql":
|
|
234
|
+
langFlag = "--sql";
|
|
235
|
+
break;
|
|
236
|
+
}
|
|
230
237
|
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
238
|
+
let result;
|
|
239
|
+
// SQL scripts with comments or multi-line content break when passed via -e
|
|
240
|
+
// Use --file approach for SQL to properly handle all syntax
|
|
241
|
+
if (language === "sql") {
|
|
242
|
+
// Create a secure temp directory via mkdtemp (restrictive permissions,
|
|
243
|
+
// unique path) to avoid CodeQL js/insecure-temporary-file alert.
|
|
244
|
+
const tempDir = await fs.mkdtemp(join(tmpdir(), `mysqlsh_script_`));
|
|
245
|
+
const tempFile = join(tempDir, "script.sql");
|
|
246
|
+
try {
|
|
247
|
+
await fs.writeFile(tempFile, script, "utf8");
|
|
248
|
+
const args = [
|
|
249
|
+
"--uri",
|
|
250
|
+
config.connectionUri,
|
|
251
|
+
langFlag,
|
|
252
|
+
"--file",
|
|
253
|
+
tempFile,
|
|
254
|
+
];
|
|
255
|
+
result = await execMySQLShell(args, { timeout });
|
|
256
|
+
} finally {
|
|
257
|
+
// Cleanup temp directory and its contents
|
|
258
|
+
await fs.rm(tempDir, { recursive: true }).catch(() => void 0);
|
|
259
|
+
}
|
|
260
|
+
} else {
|
|
261
|
+
// JS and Python work fine with -e
|
|
262
|
+
const args = ["--uri", config.connectionUri, langFlag, "-e", script];
|
|
248
263
|
result = await execMySQLShell(args, { timeout });
|
|
249
|
-
} finally {
|
|
250
|
-
// Cleanup temp directory and its contents
|
|
251
|
-
await fs.rm(tempDir, { recursive: true }).catch(() => void 0);
|
|
252
264
|
}
|
|
253
|
-
} else {
|
|
254
|
-
// JS and Python work fine with -e
|
|
255
|
-
const args = ["--uri", config.connectionUri, langFlag, "-e", script];
|
|
256
|
-
result = await execMySQLShell(args, { timeout });
|
|
257
|
-
}
|
|
258
265
|
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
+
return {
|
|
267
|
+
success: result.exitCode === 0,
|
|
268
|
+
language,
|
|
269
|
+
exitCode: result.exitCode,
|
|
270
|
+
stdout: result.stdout,
|
|
271
|
+
stderr: result.stderr,
|
|
272
|
+
};
|
|
273
|
+
} catch (error) {
|
|
274
|
+
if (error instanceof ZodError) {
|
|
275
|
+
return { success: false, error: formatZodError(error) };
|
|
276
|
+
}
|
|
277
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
278
|
+
return { success: false, error: message };
|
|
279
|
+
}
|
|
266
280
|
},
|
|
267
281
|
};
|
|
268
282
|
}
|
|
@@ -272,29 +272,37 @@ describe("Spatial Operations Tools", () => {
|
|
|
272
272
|
expect(result.wkt).toBe("POINT(10 20)");
|
|
273
273
|
});
|
|
274
274
|
|
|
275
|
-
it("should
|
|
275
|
+
it("should return structured error if neither geometry nor geoJson provided", async () => {
|
|
276
276
|
const tool = createSpatialGeoJSONTool(
|
|
277
277
|
mockAdapter as unknown as MySQLAdapter,
|
|
278
278
|
);
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
279
|
+
const result = await tool.handler({}, mockContext);
|
|
280
|
+
expect(result).toEqual({
|
|
281
|
+
success: false,
|
|
282
|
+
error: expect.stringContaining(
|
|
283
|
+
"Either geometry or geoJson must be provided",
|
|
284
|
+
),
|
|
285
|
+
});
|
|
283
286
|
});
|
|
284
287
|
|
|
285
|
-
it("should
|
|
288
|
+
it("should return structured error if both geometry and geoJson provided", async () => {
|
|
286
289
|
const tool = createSpatialGeoJSONTool(
|
|
287
290
|
mockAdapter as unknown as MySQLAdapter,
|
|
288
291
|
);
|
|
289
|
-
await
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
292
|
+
const result = await tool.handler(
|
|
293
|
+
{
|
|
294
|
+
geometry: "POINT(0 0)",
|
|
295
|
+
geoJson: "{}",
|
|
296
|
+
},
|
|
297
|
+
mockContext,
|
|
298
|
+
);
|
|
299
|
+
|
|
300
|
+
expect(result).toEqual({
|
|
301
|
+
success: false,
|
|
302
|
+
error: expect.stringContaining(
|
|
303
|
+
"Either geometry or geoJson must be provided",
|
|
296
304
|
),
|
|
297
|
-
)
|
|
305
|
+
});
|
|
298
306
|
});
|
|
299
307
|
});
|
|
300
308
|
});
|
|
@@ -97,32 +97,38 @@ describe("Spatial Queries Tools", () => {
|
|
|
97
97
|
const tool = createSpatialDistanceTool(
|
|
98
98
|
mockAdapter as unknown as MySQLAdapter,
|
|
99
99
|
);
|
|
100
|
-
await
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
).
|
|
100
|
+
const result = await tool.handler(
|
|
101
|
+
{
|
|
102
|
+
table: "invalid; drop table",
|
|
103
|
+
spatialColumn: "geom",
|
|
104
|
+
point: { longitude: 0, latitude: 0 },
|
|
105
|
+
},
|
|
106
|
+
mockContext,
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
expect(result).toEqual({
|
|
110
|
+
success: false,
|
|
111
|
+
error: expect.stringContaining("Invalid table name"),
|
|
112
|
+
});
|
|
110
113
|
});
|
|
111
114
|
|
|
112
115
|
it("should validate column name", async () => {
|
|
113
116
|
const tool = createSpatialDistanceTool(
|
|
114
117
|
mockAdapter as unknown as MySQLAdapter,
|
|
115
118
|
);
|
|
116
|
-
await
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
).
|
|
119
|
+
const result = await tool.handler(
|
|
120
|
+
{
|
|
121
|
+
table: "valid_table",
|
|
122
|
+
spatialColumn: "invalid column",
|
|
123
|
+
point: { longitude: 0, latitude: 0 },
|
|
124
|
+
},
|
|
125
|
+
mockContext,
|
|
126
|
+
);
|
|
127
|
+
|
|
128
|
+
expect(result).toEqual({
|
|
129
|
+
success: false,
|
|
130
|
+
error: "Invalid column name",
|
|
131
|
+
});
|
|
126
132
|
});
|
|
127
133
|
|
|
128
134
|
it("should handle undefined rows result", async () => {
|
|
@@ -200,17 +206,19 @@ describe("Spatial Queries Tools", () => {
|
|
|
200
206
|
const tool = createSpatialDistanceSphereTool(
|
|
201
207
|
mockAdapter as unknown as MySQLAdapter,
|
|
202
208
|
);
|
|
203
|
-
await
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
209
|
+
const result = await tool.handler(
|
|
210
|
+
{
|
|
211
|
+
table: "invalid",
|
|
212
|
+
spatialColumn: "bad-column",
|
|
213
|
+
point: { longitude: 0, latitude: 0 },
|
|
214
|
+
},
|
|
215
|
+
mockContext,
|
|
216
|
+
);
|
|
217
|
+
|
|
218
|
+
expect(result).toEqual({
|
|
219
|
+
success: false,
|
|
220
|
+
error: "Invalid column name",
|
|
221
|
+
});
|
|
214
222
|
});
|
|
215
223
|
});
|
|
216
224
|
|
|
@@ -267,16 +275,19 @@ describe("Spatial Queries Tools", () => {
|
|
|
267
275
|
const tool = createSpatialContainsTool(
|
|
268
276
|
mockAdapter as unknown as MySQLAdapter,
|
|
269
277
|
);
|
|
270
|
-
await
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
).
|
|
278
|
+
const result = await tool.handler(
|
|
279
|
+
{
|
|
280
|
+
table: "bad-table",
|
|
281
|
+
spatialColumn: "boundary",
|
|
282
|
+
polygon: "P",
|
|
283
|
+
},
|
|
284
|
+
mockContext,
|
|
285
|
+
);
|
|
286
|
+
|
|
287
|
+
expect(result).toEqual({
|
|
288
|
+
success: false,
|
|
289
|
+
error: expect.stringContaining("Invalid table name"),
|
|
290
|
+
});
|
|
280
291
|
});
|
|
281
292
|
});
|
|
282
293
|
|
|
@@ -333,16 +344,19 @@ describe("Spatial Queries Tools", () => {
|
|
|
333
344
|
const tool = createSpatialWithinTool(
|
|
334
345
|
mockAdapter as unknown as MySQLAdapter,
|
|
335
346
|
);
|
|
336
|
-
await
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
).
|
|
347
|
+
const result = await tool.handler(
|
|
348
|
+
{
|
|
349
|
+
table: "t",
|
|
350
|
+
spatialColumn: "bad col",
|
|
351
|
+
geometry: "P",
|
|
352
|
+
},
|
|
353
|
+
mockContext,
|
|
354
|
+
);
|
|
355
|
+
|
|
356
|
+
expect(result).toEqual({
|
|
357
|
+
success: false,
|
|
358
|
+
error: "Invalid column name",
|
|
359
|
+
});
|
|
346
360
|
});
|
|
347
361
|
});
|
|
348
362
|
});
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* 2 tools: point and polygon creation.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import { z } from "zod";
|
|
8
|
+
import { z, ZodError } from "zod";
|
|
9
9
|
import type { MySQLAdapter } from "../../MySQLAdapter.js";
|
|
10
10
|
import type {
|
|
11
11
|
ToolDefinition,
|
|
@@ -16,6 +16,16 @@ import type {
|
|
|
16
16
|
// Helpers
|
|
17
17
|
// =============================================================================
|
|
18
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
|
+
|
|
24
|
+
/** Strip verbose adapter prefixes from MySQL error messages */
|
|
25
|
+
function stripErrorPrefix(msg: string): string {
|
|
26
|
+
return msg.replace(/^(Query failed:\s*)?(Execute failed:\s*)?/i, "");
|
|
27
|
+
}
|
|
28
|
+
|
|
19
29
|
/**
|
|
20
30
|
* Parse GeoJSON result from MySQL.
|
|
21
31
|
* MySQL returns ST_AsGeoJSON as a string, but mysql2 driver may auto-parse JSON.
|
|
@@ -73,9 +83,9 @@ export function createSpatialPointTool(adapter: MySQLAdapter): ToolDefinition {
|
|
|
73
83
|
idempotentHint: true,
|
|
74
84
|
},
|
|
75
85
|
handler: async (params: unknown, _context: RequestContext) => {
|
|
76
|
-
const { longitude, latitude, srid } = PointSchema.parse(params);
|
|
77
|
-
|
|
78
86
|
try {
|
|
87
|
+
const { longitude, latitude, srid } = PointSchema.parse(params);
|
|
88
|
+
|
|
79
89
|
const result = await adapter.executeQuery(
|
|
80
90
|
`SELECT ST_AsText(ST_SRID(ST_GeomFromText('POINT(${String(longitude)} ${String(latitude)})', ${String(srid)}, 'axis-order=long-lat'), ${String(srid)})) as wkt,
|
|
81
91
|
ST_AsGeoJSON(ST_SRID(ST_GeomFromText('POINT(${String(longitude)} ${String(latitude)})', ${String(srid)}, 'axis-order=long-lat'), ${String(srid)})) as geoJson`,
|
|
@@ -90,8 +100,11 @@ export function createSpatialPointTool(adapter: MySQLAdapter): ToolDefinition {
|
|
|
90
100
|
latitude,
|
|
91
101
|
};
|
|
92
102
|
} catch (error) {
|
|
103
|
+
if (error instanceof ZodError) {
|
|
104
|
+
return { success: false, error: formatZodError(error) };
|
|
105
|
+
}
|
|
93
106
|
const msg = error instanceof Error ? error.message : String(error);
|
|
94
|
-
return { success: false, error: msg };
|
|
107
|
+
return { success: false, error: stripErrorPrefix(msg) };
|
|
95
108
|
}
|
|
96
109
|
},
|
|
97
110
|
};
|
|
@@ -115,9 +128,9 @@ export function createSpatialPolygonTool(
|
|
|
115
128
|
idempotentHint: true,
|
|
116
129
|
},
|
|
117
130
|
handler: async (params: unknown, _context: RequestContext) => {
|
|
118
|
-
const { coordinates, srid } = PolygonSchema.parse(params);
|
|
119
|
-
|
|
120
131
|
try {
|
|
132
|
+
const { coordinates, srid } = PolygonSchema.parse(params);
|
|
133
|
+
|
|
121
134
|
// Build WKT polygon
|
|
122
135
|
const rings = coordinates.map(
|
|
123
136
|
(ring) =>
|
|
@@ -144,8 +157,11 @@ export function createSpatialPolygonTool(
|
|
|
144
157
|
srid,
|
|
145
158
|
};
|
|
146
159
|
} catch (error) {
|
|
160
|
+
if (error instanceof ZodError) {
|
|
161
|
+
return { success: false, error: formatZodError(error) };
|
|
162
|
+
}
|
|
147
163
|
const msg = error instanceof Error ? error.message : String(error);
|
|
148
|
-
return { success: false, error: msg };
|
|
164
|
+
return { success: false, error: stripErrorPrefix(msg) };
|
|
149
165
|
}
|
|
150
166
|
},
|
|
151
167
|
};
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* 4 tools: intersection, buffer, transform, geojson.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import { z } from "zod";
|
|
8
|
+
import { z, ZodError } from "zod";
|
|
9
9
|
import type { MySQLAdapter } from "../../MySQLAdapter.js";
|
|
10
10
|
import type {
|
|
11
11
|
ToolDefinition,
|
|
@@ -16,6 +16,16 @@ import type {
|
|
|
16
16
|
// Helpers
|
|
17
17
|
// =============================================================================
|
|
18
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
|
+
|
|
24
|
+
/** Strip verbose adapter prefixes from MySQL error messages */
|
|
25
|
+
function stripErrorPrefix(msg: string): string {
|
|
26
|
+
return msg.replace(/^(Query failed:\s*)?(Execute failed:\s*)?/i, "");
|
|
27
|
+
}
|
|
28
|
+
|
|
19
29
|
/**
|
|
20
30
|
* Parse GeoJSON result from MySQL.
|
|
21
31
|
* MySQL returns ST_AsGeoJSON as a string, but mysql2 driver may auto-parse JSON.
|
|
@@ -55,10 +65,9 @@ const BufferSchema = z.object({
|
|
|
55
65
|
segments: z
|
|
56
66
|
.number()
|
|
57
67
|
.int()
|
|
58
|
-
.min(1)
|
|
59
68
|
.default(8)
|
|
60
69
|
.describe(
|
|
61
|
-
"Number of segments per quarter-circle for buffer polygon approximation (default: 8, MySQL default: 32). Lower values produce simpler polygons with smaller payloads. Only effective with Cartesian geometries (SRID 0); geographic SRIDs use MySQL's internal algorithm.",
|
|
70
|
+
"Number of segments per quarter-circle for buffer polygon approximation (default: 8, MySQL default: 32). Must be >= 1. Lower values produce simpler polygons with smaller payloads. Only effective with Cartesian geometries (SRID 0); geographic SRIDs use MySQL's internal algorithm.",
|
|
62
71
|
),
|
|
63
72
|
precision: z
|
|
64
73
|
.number()
|
|
@@ -77,19 +86,19 @@ const TransformSchema = z.object({
|
|
|
77
86
|
toSrid: z.number().describe("Target SRID"),
|
|
78
87
|
});
|
|
79
88
|
|
|
80
|
-
const
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
89
|
+
const GeoJSONSchemaBase = z.object({
|
|
90
|
+
geometry: z
|
|
91
|
+
.string()
|
|
92
|
+
.optional()
|
|
93
|
+
.describe("WKT geometry to convert to GeoJSON"),
|
|
94
|
+
geoJson: z.string().optional().describe("GeoJSON to convert to WKT"),
|
|
95
|
+
srid: z.number().default(4326).describe("SRID for conversion"),
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
const GeoJSONSchema = GeoJSONSchemaBase.refine(
|
|
99
|
+
(data) => (data.geometry !== undefined) !== (data.geoJson !== undefined),
|
|
100
|
+
"Either geometry or geoJson must be provided, but not both",
|
|
101
|
+
);
|
|
93
102
|
|
|
94
103
|
/**
|
|
95
104
|
* Calculate intersection of two geometries
|
|
@@ -109,9 +118,9 @@ export function createSpatialIntersectionTool(
|
|
|
109
118
|
idempotentHint: true,
|
|
110
119
|
},
|
|
111
120
|
handler: async (params: unknown, _context: RequestContext) => {
|
|
112
|
-
const { geometry1, geometry2, srid } = IntersectionSchema.parse(params);
|
|
113
|
-
|
|
114
121
|
try {
|
|
122
|
+
const { geometry1, geometry2, srid } = IntersectionSchema.parse(params);
|
|
123
|
+
|
|
115
124
|
const result = await adapter.executeQuery(
|
|
116
125
|
`SELECT
|
|
117
126
|
ST_Intersects(
|
|
@@ -138,8 +147,11 @@ export function createSpatialIntersectionTool(
|
|
|
138
147
|
),
|
|
139
148
|
};
|
|
140
149
|
} catch (error) {
|
|
150
|
+
if (error instanceof ZodError) {
|
|
151
|
+
return { success: false, error: formatZodError(error) };
|
|
152
|
+
}
|
|
141
153
|
const msg = error instanceof Error ? error.message : String(error);
|
|
142
|
-
return { success: false, error: msg };
|
|
154
|
+
return { success: false, error: stripErrorPrefix(msg) };
|
|
143
155
|
}
|
|
144
156
|
},
|
|
145
157
|
};
|
|
@@ -161,10 +173,15 @@ export function createSpatialBufferTool(adapter: MySQLAdapter): ToolDefinition {
|
|
|
161
173
|
idempotentHint: true,
|
|
162
174
|
},
|
|
163
175
|
handler: async (params: unknown, _context: RequestContext) => {
|
|
164
|
-
const { geometry, distance, srid, segments, precision } =
|
|
165
|
-
BufferSchema.parse(params);
|
|
166
|
-
|
|
167
176
|
try {
|
|
177
|
+
const { geometry, distance, srid, segments, precision } =
|
|
178
|
+
BufferSchema.parse(params);
|
|
179
|
+
|
|
180
|
+
// Handler-level validation for segments (replaces schema .min(1))
|
|
181
|
+
if (segments < 1) {
|
|
182
|
+
return { success: false, error: "segments must be >= 1" };
|
|
183
|
+
}
|
|
184
|
+
|
|
168
185
|
// ST_Buffer_Strategy only works with Cartesian (non-geographic) SRIDs.
|
|
169
186
|
// Geographic SRIDs (e.g., 4326) use MySQL's internal geographic buffer algorithm.
|
|
170
187
|
const isGeographic = srid !== 0;
|
|
@@ -189,8 +206,11 @@ export function createSpatialBufferTool(adapter: MySQLAdapter): ToolDefinition {
|
|
|
189
206
|
srid,
|
|
190
207
|
};
|
|
191
208
|
} catch (error) {
|
|
209
|
+
if (error instanceof ZodError) {
|
|
210
|
+
return { success: false, error: formatZodError(error) };
|
|
211
|
+
}
|
|
192
212
|
const msg = error instanceof Error ? error.message : String(error);
|
|
193
|
-
return { success: false, error: msg };
|
|
213
|
+
return { success: false, error: stripErrorPrefix(msg) };
|
|
194
214
|
}
|
|
195
215
|
},
|
|
196
216
|
};
|
|
@@ -215,9 +235,9 @@ export function createSpatialTransformTool(
|
|
|
215
235
|
idempotentHint: true,
|
|
216
236
|
},
|
|
217
237
|
handler: async (params: unknown, _context: RequestContext) => {
|
|
218
|
-
const { geometry, fromSrid, toSrid } = TransformSchema.parse(params);
|
|
219
|
-
|
|
220
238
|
try {
|
|
239
|
+
const { geometry, fromSrid, toSrid } = TransformSchema.parse(params);
|
|
240
|
+
|
|
221
241
|
const result = await adapter.executeQuery(
|
|
222
242
|
`SELECT
|
|
223
243
|
ST_AsText(ST_Transform(ST_GeomFromText(?, ${String(fromSrid)}, 'axis-order=long-lat'), ${String(toSrid)})) as transformed_wkt,
|
|
@@ -234,8 +254,11 @@ export function createSpatialTransformTool(
|
|
|
234
254
|
toSrid,
|
|
235
255
|
};
|
|
236
256
|
} catch (error) {
|
|
257
|
+
if (error instanceof ZodError) {
|
|
258
|
+
return { success: false, error: formatZodError(error) };
|
|
259
|
+
}
|
|
237
260
|
const msg = error instanceof Error ? error.message : String(error);
|
|
238
|
-
return { success: false, error: msg };
|
|
261
|
+
return { success: false, error: stripErrorPrefix(msg) };
|
|
239
262
|
}
|
|
240
263
|
},
|
|
241
264
|
};
|
|
@@ -252,16 +275,16 @@ export function createSpatialGeoJSONTool(
|
|
|
252
275
|
title: "MySQL GeoJSON Conversion",
|
|
253
276
|
description: "Convert geometry between WKT and GeoJSON formats.",
|
|
254
277
|
group: "spatial",
|
|
255
|
-
inputSchema:
|
|
278
|
+
inputSchema: GeoJSONSchemaBase,
|
|
256
279
|
requiredScopes: ["read"],
|
|
257
280
|
annotations: {
|
|
258
281
|
readOnlyHint: true,
|
|
259
282
|
idempotentHint: true,
|
|
260
283
|
},
|
|
261
284
|
handler: async (params: unknown, _context: RequestContext) => {
|
|
262
|
-
const { geometry, geoJson, srid } = GeoJSONSchema.parse(params);
|
|
263
|
-
|
|
264
285
|
try {
|
|
286
|
+
const { geometry, geoJson, srid } = GeoJSONSchema.parse(params);
|
|
287
|
+
|
|
265
288
|
if (geometry) {
|
|
266
289
|
// Convert WKT to GeoJSON
|
|
267
290
|
const result = await adapter.executeQuery(
|
|
@@ -290,10 +313,16 @@ export function createSpatialGeoJSONTool(
|
|
|
290
313
|
};
|
|
291
314
|
}
|
|
292
315
|
|
|
293
|
-
|
|
316
|
+
return {
|
|
317
|
+
success: false,
|
|
318
|
+
error: "Either geometry or geoJson must be provided",
|
|
319
|
+
};
|
|
294
320
|
} catch (error) {
|
|
321
|
+
if (error instanceof ZodError) {
|
|
322
|
+
return { success: false, error: formatZodError(error) };
|
|
323
|
+
}
|
|
295
324
|
const msg = error instanceof Error ? error.message : String(error);
|
|
296
|
-
return { success: false, error: msg };
|
|
325
|
+
return { success: false, error: stripErrorPrefix(msg) };
|
|
297
326
|
}
|
|
298
327
|
},
|
|
299
328
|
};
|