@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
|
@@ -10,8 +10,14 @@ import type {
|
|
|
10
10
|
ToolDefinition,
|
|
11
11
|
RequestContext,
|
|
12
12
|
} from "../../../../types/index.js";
|
|
13
|
+
import {
|
|
14
|
+
IndexRecommendationSchema,
|
|
15
|
+
IndexRecommendationSchemaBase,
|
|
16
|
+
ForceIndexSchema,
|
|
17
|
+
ForceIndexSchemaBase,
|
|
18
|
+
preprocessQueryOnlyParams,
|
|
19
|
+
} from "../../types.js";
|
|
13
20
|
import { z } from "zod";
|
|
14
|
-
import { preprocessQueryOnlyParams } from "../../types.js";
|
|
15
21
|
|
|
16
22
|
/** Trace summary decision type */
|
|
17
23
|
interface TraceSummaryDecision {
|
|
@@ -153,79 +159,80 @@ function extractTraceSummary(
|
|
|
153
159
|
export function createIndexRecommendationTool(
|
|
154
160
|
adapter: MySQLAdapter,
|
|
155
161
|
): ToolDefinition {
|
|
156
|
-
const schema = z.object({
|
|
157
|
-
table: z.string().describe("Table to analyze for missing indexes"),
|
|
158
|
-
});
|
|
159
|
-
|
|
160
162
|
return {
|
|
161
163
|
name: "mysql_index_recommendation",
|
|
162
164
|
title: "MySQL Index Recommendation",
|
|
163
165
|
description:
|
|
164
166
|
"Analyze table and suggest potentially missing indexes based on query patterns.",
|
|
165
167
|
group: "optimization",
|
|
166
|
-
inputSchema:
|
|
168
|
+
inputSchema: IndexRecommendationSchemaBase,
|
|
167
169
|
requiredScopes: ["read"],
|
|
168
170
|
annotations: {
|
|
169
171
|
readOnlyHint: true,
|
|
170
172
|
idempotentHint: true,
|
|
171
173
|
},
|
|
172
174
|
handler: async (params: unknown, _context: RequestContext) => {
|
|
173
|
-
|
|
175
|
+
try {
|
|
176
|
+
const { table } = IndexRecommendationSchema.parse(params);
|
|
174
177
|
|
|
175
|
-
|
|
176
|
-
|
|
178
|
+
// Get columns
|
|
179
|
+
const columns = await adapter.describeTable(table);
|
|
177
180
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
181
|
+
// Graceful handling for non-existent tables (P154)
|
|
182
|
+
if (!columns.columns || columns.columns.length === 0) {
|
|
183
|
+
return { exists: false, table };
|
|
184
|
+
}
|
|
182
185
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
186
|
+
// Get existing indexes
|
|
187
|
+
const indexes = await adapter.getTableIndexes(table);
|
|
188
|
+
const indexedColumns = new Set(indexes.flatMap((i) => i.columns));
|
|
189
|
+
|
|
190
|
+
// Analyze which columns might benefit from indexing
|
|
191
|
+
const recommendations: { column: string; reason: string }[] = [];
|
|
192
|
+
|
|
193
|
+
for (const col of columns.columns) {
|
|
194
|
+
if (indexedColumns.has(col.name)) continue;
|
|
195
|
+
|
|
196
|
+
// Suggest indexes for common patterns
|
|
197
|
+
if (col.name.endsWith("_id") || col.name === "id") {
|
|
198
|
+
recommendations.push({
|
|
199
|
+
column: col.name,
|
|
200
|
+
reason: "Foreign key or ID column often benefits from indexing",
|
|
201
|
+
});
|
|
202
|
+
} else if (
|
|
203
|
+
["created_at", "updated_at", "date", "timestamp"].some((s) =>
|
|
204
|
+
col.name.includes(s),
|
|
205
|
+
)
|
|
206
|
+
) {
|
|
207
|
+
recommendations.push({
|
|
208
|
+
column: col.name,
|
|
209
|
+
reason: "Timestamp columns often used in range queries",
|
|
210
|
+
});
|
|
211
|
+
} else if (
|
|
212
|
+
col.name === "status" ||
|
|
213
|
+
col.name === "type" ||
|
|
214
|
+
col.name === "category"
|
|
215
|
+
) {
|
|
216
|
+
recommendations.push({
|
|
217
|
+
column: col.name,
|
|
218
|
+
reason: "Status/type columns often used in filtering",
|
|
219
|
+
});
|
|
220
|
+
}
|
|
217
221
|
}
|
|
218
|
-
}
|
|
219
222
|
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
223
|
+
return {
|
|
224
|
+
exists: true,
|
|
225
|
+
table,
|
|
226
|
+
existingIndexes: indexes.map((i) => ({
|
|
227
|
+
name: i.name,
|
|
228
|
+
columns: i.columns,
|
|
229
|
+
})),
|
|
230
|
+
recommendations,
|
|
231
|
+
};
|
|
232
|
+
} catch (error) {
|
|
233
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
234
|
+
return { success: false, error: msg };
|
|
235
|
+
}
|
|
229
236
|
},
|
|
230
237
|
};
|
|
231
238
|
}
|
|
@@ -266,129 +273,141 @@ export function createQueryRewriteTool(adapter: MySQLAdapter): ToolDefinition {
|
|
|
266
273
|
idempotentHint: true,
|
|
267
274
|
},
|
|
268
275
|
handler: async (params: unknown, _context: RequestContext) => {
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
const suggestions: string[] = [];
|
|
272
|
-
const upperQuery = query.toUpperCase();
|
|
276
|
+
try {
|
|
277
|
+
const { query } = schema.parse(params);
|
|
273
278
|
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
suggestions.push(
|
|
277
|
-
"Consider selecting only needed columns instead of SELECT *",
|
|
278
|
-
);
|
|
279
|
-
}
|
|
279
|
+
const suggestions: string[] = [];
|
|
280
|
+
const upperQuery = query.toUpperCase();
|
|
280
281
|
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
282
|
+
// Basic query analysis
|
|
283
|
+
if (upperQuery.includes("SELECT *")) {
|
|
284
|
+
suggestions.push(
|
|
285
|
+
"Consider selecting only needed columns instead of SELECT *",
|
|
286
|
+
);
|
|
287
|
+
}
|
|
284
288
|
|
|
285
|
-
|
|
286
|
-
if (query.includes("LIKE '%")) {
|
|
289
|
+
if (!upperQuery.includes("LIMIT") && upperQuery.includes("SELECT")) {
|
|
287
290
|
suggestions.push(
|
|
288
|
-
"
|
|
291
|
+
"Consider adding LIMIT to prevent large result sets",
|
|
289
292
|
);
|
|
290
293
|
}
|
|
291
|
-
}
|
|
292
294
|
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
);
|
|
301
|
-
}
|
|
295
|
+
if (upperQuery.includes("LIKE") && query.includes("%")) {
|
|
296
|
+
if (query.includes("LIKE '%")) {
|
|
297
|
+
suggestions.push(
|
|
298
|
+
"Leading wildcard in LIKE prevents index usage; consider FULLTEXT search",
|
|
299
|
+
);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
302
|
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
303
|
+
// Check for OR in WHERE clause (not ORDER BY, FOR, etc.)
|
|
304
|
+
const wherePattern = /WHERE\s+(.+?)(?:ORDER BY|GROUP BY|LIMIT|$)/is;
|
|
305
|
+
const whereMatch = wherePattern.exec(upperQuery);
|
|
306
|
+
const whereClause = whereMatch?.[1];
|
|
307
|
+
if (whereClause && /\bOR\b/i.test(whereClause)) {
|
|
308
|
+
suggestions.push(
|
|
309
|
+
"OR conditions may prevent index usage; consider UNION instead",
|
|
310
|
+
);
|
|
311
|
+
}
|
|
306
312
|
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
);
|
|
311
|
-
}
|
|
313
|
+
if (upperQuery.includes("ORDER BY") && !upperQuery.includes("LIMIT")) {
|
|
314
|
+
suggestions.push("ORDER BY without LIMIT may cause full table sort");
|
|
315
|
+
}
|
|
312
316
|
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
317
|
+
if (
|
|
318
|
+
upperQuery.includes("NOT IN") ||
|
|
319
|
+
upperQuery.includes("NOT EXISTS")
|
|
320
|
+
) {
|
|
321
|
+
suggestions.push(
|
|
322
|
+
"NOT IN/NOT EXISTS can be slow; consider LEFT JOIN with NULL check",
|
|
323
|
+
);
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
// Get EXPLAIN for the query
|
|
327
|
+
let explainResult: unknown = null;
|
|
328
|
+
let explainError: string | undefined;
|
|
329
|
+
try {
|
|
330
|
+
const explainSql = `EXPLAIN FORMAT=JSON ${query}`;
|
|
331
|
+
const result = await adapter.executeReadQuery(explainSql);
|
|
332
|
+
if (result.rows?.[0]) {
|
|
333
|
+
const explainStr = result.rows[0]["EXPLAIN"];
|
|
334
|
+
if (typeof explainStr === "string") {
|
|
335
|
+
explainResult = JSON.parse(explainStr) as unknown;
|
|
336
|
+
}
|
|
323
337
|
}
|
|
338
|
+
} catch (err: unknown) {
|
|
339
|
+
const rawMsg =
|
|
340
|
+
err instanceof Error ? err.message : "Failed to generate EXPLAIN";
|
|
341
|
+
explainError = rawMsg
|
|
342
|
+
.replace(/^Query failed:\s*/i, "")
|
|
343
|
+
.replace(/^Execute failed:\s*/i, "");
|
|
324
344
|
}
|
|
325
|
-
} catch (err: unknown) {
|
|
326
|
-
explainError =
|
|
327
|
-
err instanceof Error ? err.message : "Failed to generate EXPLAIN";
|
|
328
|
-
}
|
|
329
345
|
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
346
|
+
const response: Record<string, unknown> = {
|
|
347
|
+
originalQuery: query,
|
|
348
|
+
suggestions,
|
|
349
|
+
explainPlan: explainResult,
|
|
350
|
+
};
|
|
335
351
|
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
352
|
+
if (explainError) {
|
|
353
|
+
response["explainError"] = explainError;
|
|
354
|
+
}
|
|
339
355
|
|
|
340
|
-
|
|
356
|
+
return response;
|
|
357
|
+
} catch (error) {
|
|
358
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
359
|
+
return { success: false, error: msg };
|
|
360
|
+
}
|
|
341
361
|
},
|
|
342
362
|
};
|
|
343
363
|
}
|
|
344
364
|
|
|
345
365
|
export function createForceIndexTool(adapter: MySQLAdapter): ToolDefinition {
|
|
346
|
-
const schema = z.object({
|
|
347
|
-
table: z.string(),
|
|
348
|
-
query: z.string().describe("Original query"),
|
|
349
|
-
indexName: z.string().describe("Index name to force"),
|
|
350
|
-
});
|
|
351
|
-
|
|
352
366
|
return {
|
|
353
367
|
name: "mysql_force_index",
|
|
354
368
|
title: "MySQL Force Index",
|
|
355
369
|
description: "Generate a query with FORCE INDEX hint.",
|
|
356
370
|
group: "optimization",
|
|
357
|
-
inputSchema:
|
|
371
|
+
inputSchema: ForceIndexSchemaBase,
|
|
358
372
|
requiredScopes: ["read"],
|
|
359
373
|
annotations: {
|
|
360
374
|
readOnlyHint: true,
|
|
361
375
|
idempotentHint: true,
|
|
362
376
|
},
|
|
363
377
|
handler: async (params: unknown, _context: RequestContext) => {
|
|
364
|
-
|
|
378
|
+
try {
|
|
379
|
+
const { table, query, indexName } = ForceIndexSchema.parse(params);
|
|
365
380
|
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
381
|
+
// P154: Check table existence first
|
|
382
|
+
const tableInfo = await adapter.describeTable(table);
|
|
383
|
+
if (!tableInfo.columns || tableInfo.columns.length === 0) {
|
|
384
|
+
return { exists: false, table };
|
|
385
|
+
}
|
|
371
386
|
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
const response: Record<string, unknown> = {
|
|
379
|
-
originalQuery: query,
|
|
380
|
-
rewrittenQuery: rewritten,
|
|
381
|
-
hint: `FORCE INDEX (\`${indexName}\`)`,
|
|
382
|
-
};
|
|
383
|
-
|
|
384
|
-
// Validate index existence and warn if not found
|
|
385
|
-
const indexes = await adapter.getTableIndexes(table);
|
|
386
|
-
if (!indexes.some((idx) => idx.name === indexName)) {
|
|
387
|
-
response["warning"] =
|
|
388
|
-
`Index '${indexName}' not found on table '${table}'`;
|
|
389
|
-
}
|
|
387
|
+
// Simple replacement - insert FORCE INDEX after table name
|
|
388
|
+
const rewritten = query.replace(
|
|
389
|
+
new RegExp(`FROM\\s+\`?${table}\`?`, "i"),
|
|
390
|
+
`FROM \`${table}\` FORCE INDEX (\`${indexName}\`)`,
|
|
391
|
+
);
|
|
390
392
|
|
|
391
|
-
|
|
393
|
+
const response: Record<string, unknown> = {
|
|
394
|
+
originalQuery: query,
|
|
395
|
+
rewrittenQuery: rewritten,
|
|
396
|
+
hint: `FORCE INDEX (\`${indexName}\`)`,
|
|
397
|
+
};
|
|
398
|
+
|
|
399
|
+
// Validate index existence and warn if not found
|
|
400
|
+
const indexes = await adapter.getTableIndexes(table);
|
|
401
|
+
if (!indexes.some((idx) => idx.name === indexName)) {
|
|
402
|
+
response["warning"] =
|
|
403
|
+
`Index '${indexName}' not found on table '${table}'`;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
return response;
|
|
407
|
+
} catch (error) {
|
|
408
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
409
|
+
return { success: false, error: msg };
|
|
410
|
+
}
|
|
392
411
|
},
|
|
393
412
|
};
|
|
394
413
|
}
|
|
@@ -435,18 +454,23 @@ export function createOptimizerTraceTool(
|
|
|
435
454
|
readOnlyHint: true,
|
|
436
455
|
},
|
|
437
456
|
handler: async (params: unknown, _context: RequestContext) => {
|
|
438
|
-
|
|
457
|
+
let tracingEnabled = false;
|
|
458
|
+
try {
|
|
459
|
+
const { query, summary } = schema.parse(params);
|
|
439
460
|
|
|
440
|
-
|
|
441
|
-
|
|
461
|
+
// Enable optimizer trace
|
|
462
|
+
await adapter.executeQuery('SET optimizer_trace="enabled=on"');
|
|
463
|
+
tracingEnabled = true;
|
|
442
464
|
|
|
443
|
-
try {
|
|
444
465
|
// Execute the query (may fail for nonexistent tables, etc.)
|
|
445
466
|
try {
|
|
446
467
|
await adapter.executeReadQuery(query);
|
|
447
468
|
} catch (err: unknown) {
|
|
448
|
-
const
|
|
469
|
+
const rawMsg =
|
|
449
470
|
err instanceof Error ? err.message : "Query execution failed";
|
|
471
|
+
const errorMsg = rawMsg
|
|
472
|
+
.replace(/^Query failed:\s*/i, "")
|
|
473
|
+
.replace(/^Execute failed:\s*/i, "");
|
|
450
474
|
if (summary) {
|
|
451
475
|
return { query, decisions: [], error: errorMsg };
|
|
452
476
|
}
|
|
@@ -464,9 +488,14 @@ export function createOptimizerTraceTool(
|
|
|
464
488
|
}
|
|
465
489
|
|
|
466
490
|
return { trace: traceResult.rows };
|
|
491
|
+
} catch (error) {
|
|
492
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
493
|
+
return { success: false, error: msg };
|
|
467
494
|
} finally {
|
|
468
|
-
|
|
469
|
-
|
|
495
|
+
if (tracingEnabled) {
|
|
496
|
+
// Disable optimizer trace
|
|
497
|
+
await adapter.executeQuery('SET optimizer_trace="enabled=off"');
|
|
498
|
+
}
|
|
470
499
|
}
|
|
471
500
|
},
|
|
472
501
|
};
|