@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
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* 6 tools: optimize, analyze, check, repair, flush, kill.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
+
import { ZodError } from "zod";
|
|
8
9
|
import type { MySQLAdapter } from "../../MySQLAdapter.js";
|
|
9
10
|
import type {
|
|
10
11
|
ToolDefinition,
|
|
@@ -17,11 +18,18 @@ import {
|
|
|
17
18
|
AnalyzeTableSchemaBase,
|
|
18
19
|
CheckTableSchema,
|
|
19
20
|
CheckTableSchemaBase,
|
|
21
|
+
RepairTableSchema,
|
|
22
|
+
RepairTableSchemaBase,
|
|
20
23
|
FlushTablesSchema,
|
|
21
24
|
FlushTablesSchemaBase,
|
|
22
25
|
KillQuerySchema,
|
|
26
|
+
KillQuerySchemaBase,
|
|
23
27
|
} from "../../types.js";
|
|
24
|
-
|
|
28
|
+
|
|
29
|
+
/** Extract human-readable messages from a ZodError instead of raw JSON array */
|
|
30
|
+
function formatZodError(error: ZodError): string {
|
|
31
|
+
return error.issues.map((i) => i.message).join("; ");
|
|
32
|
+
}
|
|
25
33
|
|
|
26
34
|
export function createOptimizeTableTool(adapter: MySQLAdapter): ToolDefinition {
|
|
27
35
|
return {
|
|
@@ -36,10 +44,20 @@ export function createOptimizeTableTool(adapter: MySQLAdapter): ToolDefinition {
|
|
|
36
44
|
idempotentHint: true,
|
|
37
45
|
},
|
|
38
46
|
handler: async (params: unknown, _context: RequestContext) => {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
47
|
+
try {
|
|
48
|
+
const { tables } = OptimizeTableSchema.parse(params);
|
|
49
|
+
const tableList = tables.map((t) => `\`${t}\``).join(", ");
|
|
50
|
+
const result = await adapter.executeQuery(
|
|
51
|
+
`OPTIMIZE TABLE ${tableList}`,
|
|
52
|
+
);
|
|
53
|
+
return { results: result.rows, rowCount: result.rows?.length ?? 0 };
|
|
54
|
+
} catch (error) {
|
|
55
|
+
if (error instanceof ZodError) {
|
|
56
|
+
return { success: false, error: formatZodError(error) };
|
|
57
|
+
}
|
|
58
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
59
|
+
return { success: false, error: message };
|
|
60
|
+
}
|
|
43
61
|
},
|
|
44
62
|
};
|
|
45
63
|
}
|
|
@@ -58,10 +76,18 @@ export function createAnalyzeTableTool(adapter: MySQLAdapter): ToolDefinition {
|
|
|
58
76
|
idempotentHint: true,
|
|
59
77
|
},
|
|
60
78
|
handler: async (params: unknown, _context: RequestContext) => {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
79
|
+
try {
|
|
80
|
+
const { tables } = AnalyzeTableSchema.parse(params);
|
|
81
|
+
const tableList = tables.map((t) => `\`${t}\``).join(", ");
|
|
82
|
+
const result = await adapter.executeQuery(`ANALYZE TABLE ${tableList}`);
|
|
83
|
+
return { results: result.rows, rowCount: result.rows?.length ?? 0 };
|
|
84
|
+
} catch (error) {
|
|
85
|
+
if (error instanceof ZodError) {
|
|
86
|
+
return { success: false, error: formatZodError(error) };
|
|
87
|
+
}
|
|
88
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
89
|
+
return { success: false, error: message };
|
|
90
|
+
}
|
|
65
91
|
},
|
|
66
92
|
};
|
|
67
93
|
}
|
|
@@ -79,46 +105,57 @@ export function createCheckTableTool(adapter: MySQLAdapter): ToolDefinition {
|
|
|
79
105
|
idempotentHint: true,
|
|
80
106
|
},
|
|
81
107
|
handler: async (params: unknown, _context: RequestContext) => {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
108
|
+
try {
|
|
109
|
+
const { tables, option } = CheckTableSchema.parse(params);
|
|
110
|
+
const tableList = tables.map((t) => `\`${t}\``).join(", ");
|
|
111
|
+
const optionClause = option ? ` ${option}` : "";
|
|
112
|
+
// Use rawQuery - CHECK TABLE not supported in prepared statement protocol
|
|
113
|
+
const result = await adapter.rawQuery(
|
|
114
|
+
`CHECK TABLE ${tableList}${optionClause}`,
|
|
115
|
+
);
|
|
116
|
+
return {
|
|
117
|
+
results: result.rows ?? [],
|
|
118
|
+
rowCount: result.rows?.length ?? 0,
|
|
119
|
+
};
|
|
120
|
+
} catch (error) {
|
|
121
|
+
if (error instanceof ZodError) {
|
|
122
|
+
return { success: false, error: formatZodError(error) };
|
|
123
|
+
}
|
|
124
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
125
|
+
return { success: false, error: message };
|
|
126
|
+
}
|
|
93
127
|
},
|
|
94
128
|
};
|
|
95
129
|
}
|
|
96
130
|
|
|
97
131
|
export function createRepairTableTool(adapter: MySQLAdapter): ToolDefinition {
|
|
98
|
-
const schema = z.object({
|
|
99
|
-
tables: z.array(z.string()),
|
|
100
|
-
quick: z.boolean().optional().default(false),
|
|
101
|
-
});
|
|
102
|
-
|
|
103
132
|
return {
|
|
104
133
|
name: "mysql_repair_table",
|
|
105
134
|
title: "MySQL Repair Table",
|
|
106
135
|
description: "Repair corrupted tables (MyISAM only).",
|
|
107
136
|
group: "admin",
|
|
108
|
-
inputSchema:
|
|
137
|
+
inputSchema: RepairTableSchemaBase,
|
|
109
138
|
requiredScopes: ["admin"],
|
|
110
139
|
annotations: {
|
|
111
140
|
readOnlyHint: false,
|
|
112
141
|
idempotentHint: true,
|
|
113
142
|
},
|
|
114
143
|
handler: async (params: unknown, _context: RequestContext) => {
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
144
|
+
try {
|
|
145
|
+
const { tables, quick } = RepairTableSchema.parse(params);
|
|
146
|
+
const tableList = tables.map((t) => `\`${t}\``).join(", ");
|
|
147
|
+
const quickClause = quick ? " QUICK" : "";
|
|
148
|
+
const result = await adapter.executeQuery(
|
|
149
|
+
`REPAIR TABLE ${tableList}${quickClause}`,
|
|
150
|
+
);
|
|
151
|
+
return { results: result.rows, rowCount: result.rows?.length ?? 0 };
|
|
152
|
+
} catch (error) {
|
|
153
|
+
if (error instanceof ZodError) {
|
|
154
|
+
return { success: false, error: formatZodError(error) };
|
|
155
|
+
}
|
|
156
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
157
|
+
return { success: false, error: message };
|
|
158
|
+
}
|
|
122
159
|
},
|
|
123
160
|
};
|
|
124
161
|
}
|
|
@@ -136,43 +173,52 @@ export function createFlushTablesTool(adapter: MySQLAdapter): ToolDefinition {
|
|
|
136
173
|
idempotentHint: true,
|
|
137
174
|
},
|
|
138
175
|
handler: async (params: unknown, _context: RequestContext) => {
|
|
139
|
-
|
|
176
|
+
try {
|
|
177
|
+
const { tables } = FlushTablesSchema.parse(params);
|
|
140
178
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
179
|
+
if (tables && tables.length > 0) {
|
|
180
|
+
// Pre-check table existence since FLUSH TABLES silently succeeds for nonexistent tables
|
|
181
|
+
const placeholders = tables.map(() => "?").join(", ");
|
|
182
|
+
const checkResult = await adapter.executeReadQuery(
|
|
183
|
+
`SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME IN (${placeholders})`,
|
|
184
|
+
tables,
|
|
185
|
+
);
|
|
186
|
+
const foundTables = new Set(
|
|
187
|
+
(checkResult.rows ?? []).map(
|
|
188
|
+
(r: Record<string, unknown>) => r["TABLE_NAME"] as string,
|
|
189
|
+
),
|
|
190
|
+
);
|
|
191
|
+
const notFound = tables.filter((t) => !foundTables.has(t));
|
|
154
192
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
193
|
+
if (notFound.length > 0) {
|
|
194
|
+
// Flush valid tables before reporting missing ones
|
|
195
|
+
const validTables = tables.filter((t) => foundTables.has(t));
|
|
196
|
+
if (validTables.length > 0) {
|
|
197
|
+
const validList = validTables.map((t) => `\`${t}\``).join(", ");
|
|
198
|
+
await adapter.executeQuery(`FLUSH TABLES ${validList}`);
|
|
199
|
+
}
|
|
200
|
+
return {
|
|
201
|
+
success: false,
|
|
202
|
+
error: `Tables not found: ${notFound.join(", ")}`,
|
|
203
|
+
notFound,
|
|
204
|
+
flushed: validTables,
|
|
205
|
+
};
|
|
161
206
|
}
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
207
|
+
|
|
208
|
+
const tableList = tables.map((t) => `\`${t}\``).join(", ");
|
|
209
|
+
await adapter.executeQuery(`FLUSH TABLES ${tableList}`);
|
|
210
|
+
} else {
|
|
211
|
+
await adapter.executeQuery("FLUSH TABLES");
|
|
167
212
|
}
|
|
168
213
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
214
|
+
return { success: true };
|
|
215
|
+
} catch (error) {
|
|
216
|
+
if (error instanceof ZodError) {
|
|
217
|
+
return { success: false, error: formatZodError(error) };
|
|
218
|
+
}
|
|
219
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
220
|
+
return { success: false, error: message };
|
|
173
221
|
}
|
|
174
|
-
|
|
175
|
-
return { success: true };
|
|
176
222
|
},
|
|
177
223
|
};
|
|
178
224
|
}
|
|
@@ -183,27 +229,30 @@ export function createKillQueryTool(adapter: MySQLAdapter): ToolDefinition {
|
|
|
183
229
|
title: "MySQL Kill Query",
|
|
184
230
|
description: "Kill a running query or connection.",
|
|
185
231
|
group: "admin",
|
|
186
|
-
inputSchema:
|
|
232
|
+
inputSchema: KillQuerySchemaBase,
|
|
187
233
|
requiredScopes: ["admin"],
|
|
188
234
|
annotations: {
|
|
189
235
|
readOnlyHint: false,
|
|
190
236
|
destructiveHint: true,
|
|
191
237
|
},
|
|
192
238
|
handler: async (params: unknown, _context: RequestContext) => {
|
|
193
|
-
const { processId, connection } = KillQuerySchema.parse(params);
|
|
194
|
-
const killType = connection ? "CONNECTION" : "QUERY";
|
|
195
239
|
try {
|
|
240
|
+
const { processId, connection } = KillQuerySchema.parse(params);
|
|
241
|
+
const killType = connection ? "CONNECTION" : "QUERY";
|
|
196
242
|
await adapter.executeQuery(`KILL ${killType} ${processId}`);
|
|
197
243
|
return { success: true, killed: processId, type: killType };
|
|
198
244
|
} catch (error) {
|
|
245
|
+
if (error instanceof ZodError) {
|
|
246
|
+
return { success: false, error: formatZodError(error) };
|
|
247
|
+
}
|
|
199
248
|
const message = error instanceof Error ? error.message : String(error);
|
|
200
249
|
if (message.includes("Unknown thread id")) {
|
|
201
250
|
return {
|
|
202
251
|
success: false,
|
|
203
|
-
error: `Process ID ${
|
|
252
|
+
error: `Process ID ${/\d+/.exec(message)?.[0] ?? "unknown"} not found`,
|
|
204
253
|
};
|
|
205
254
|
}
|
|
206
|
-
|
|
255
|
+
return { success: false, error: message };
|
|
207
256
|
}
|
|
208
257
|
},
|
|
209
258
|
};
|
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
ShowStatusSchema,
|
|
16
16
|
ShowVariablesSchema,
|
|
17
17
|
} from "../../types.js";
|
|
18
|
-
import { z } from "zod";
|
|
18
|
+
import { z, ZodError } from "zod";
|
|
19
19
|
|
|
20
20
|
export function createShowProcesslistTool(
|
|
21
21
|
adapter: MySQLAdapter,
|
|
@@ -32,10 +32,21 @@ export function createShowProcesslistTool(
|
|
|
32
32
|
idempotentHint: true,
|
|
33
33
|
},
|
|
34
34
|
handler: async (params: unknown, _context: RequestContext) => {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
35
|
+
try {
|
|
36
|
+
const { full } = ShowProcesslistSchema.parse(params);
|
|
37
|
+
const sql = full ? "SHOW FULL PROCESSLIST" : "SHOW PROCESSLIST";
|
|
38
|
+
const result = await adapter.executeQuery(sql);
|
|
39
|
+
return { processes: result.rows };
|
|
40
|
+
} catch (err) {
|
|
41
|
+
if (err instanceof ZodError) {
|
|
42
|
+
const messages = err.issues.map((i) => i.message).join("; ");
|
|
43
|
+
return { success: false as const, error: messages };
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
success: false as const,
|
|
47
|
+
error: err instanceof Error ? err.message : String(err),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
39
50
|
},
|
|
40
51
|
};
|
|
41
52
|
}
|
|
@@ -53,49 +64,68 @@ export function createShowStatusTool(adapter: MySQLAdapter): ToolDefinition {
|
|
|
53
64
|
idempotentHint: true,
|
|
54
65
|
},
|
|
55
66
|
handler: async (params: unknown, _context: RequestContext) => {
|
|
56
|
-
|
|
57
|
-
|
|
67
|
+
try {
|
|
68
|
+
const { like, global, limit } = ShowStatusSchema.parse(params);
|
|
69
|
+
if (limit !== undefined && limit < 1) {
|
|
70
|
+
return {
|
|
71
|
+
success: false as const,
|
|
72
|
+
error: "limit must be a positive integer",
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
const effectiveLimit = limit ?? 100;
|
|
58
76
|
|
|
59
|
-
|
|
77
|
+
let sql = global ? "SHOW GLOBAL STATUS" : "SHOW STATUS";
|
|
60
78
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
79
|
+
// SHOW commands don't support parameter binding - build SQL directly
|
|
80
|
+
if (like) {
|
|
81
|
+
// Escape the like pattern for safety
|
|
82
|
+
const escapedLike = like.replace(/'/g, "''");
|
|
83
|
+
sql += ` LIKE '${escapedLike}'`;
|
|
84
|
+
}
|
|
67
85
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
86
|
+
const result = await adapter.rawQuery(sql);
|
|
87
|
+
|
|
88
|
+
// Convert to object for easier use
|
|
89
|
+
// Handle both uppercase and Pascal case column names
|
|
90
|
+
const status: Record<string, string> = {};
|
|
91
|
+
for (const row of result.rows ?? []) {
|
|
92
|
+
const name = (row["Variable_name"] ??
|
|
93
|
+
row["VARIABLE_NAME"] ??
|
|
94
|
+
row["variable_name"]) as string;
|
|
95
|
+
const value = (row["Value"] ??
|
|
96
|
+
row["VALUE"] ??
|
|
97
|
+
row["value"]) as string;
|
|
98
|
+
if (name) {
|
|
99
|
+
// Redact RSA public key blobs (multi-line PEM certificates)
|
|
100
|
+
status[name] = value?.includes("-----BEGIN PUBLIC KEY-----")
|
|
101
|
+
? "[REDACTED]"
|
|
102
|
+
: value;
|
|
103
|
+
}
|
|
83
104
|
}
|
|
84
|
-
}
|
|
85
105
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
106
|
+
const totalAvailable = Object.keys(status).length;
|
|
107
|
+
const entries = Object.entries(status);
|
|
108
|
+
const limited = entries.length > effectiveLimit;
|
|
109
|
+
const truncated = limited
|
|
110
|
+
? Object.fromEntries(entries.slice(0, effectiveLimit))
|
|
111
|
+
: status;
|
|
112
|
+
|
|
113
|
+
return {
|
|
114
|
+
status: truncated,
|
|
115
|
+
rowCount: Object.keys(truncated).length,
|
|
116
|
+
totalAvailable,
|
|
117
|
+
...(limited && { limited: true }),
|
|
118
|
+
};
|
|
119
|
+
} catch (err) {
|
|
120
|
+
if (err instanceof ZodError) {
|
|
121
|
+
const messages = err.issues.map((i) => i.message).join("; ");
|
|
122
|
+
return { success: false as const, error: messages };
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
success: false as const,
|
|
126
|
+
error: err instanceof Error ? err.message : String(err),
|
|
127
|
+
};
|
|
128
|
+
}
|
|
99
129
|
},
|
|
100
130
|
};
|
|
101
131
|
}
|
|
@@ -113,46 +143,65 @@ export function createShowVariablesTool(adapter: MySQLAdapter): ToolDefinition {
|
|
|
113
143
|
idempotentHint: true,
|
|
114
144
|
},
|
|
115
145
|
handler: async (params: unknown, _context: RequestContext) => {
|
|
116
|
-
|
|
117
|
-
|
|
146
|
+
try {
|
|
147
|
+
const { like, global, limit } = ShowVariablesSchema.parse(params);
|
|
148
|
+
if (limit !== undefined && limit < 1) {
|
|
149
|
+
return {
|
|
150
|
+
success: false as const,
|
|
151
|
+
error: "limit must be a positive integer",
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
const effectiveLimit = limit ?? 100;
|
|
118
155
|
|
|
119
|
-
|
|
156
|
+
let sql = global ? "SHOW GLOBAL VARIABLES" : "SHOW VARIABLES";
|
|
120
157
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
158
|
+
// SHOW commands don't support parameter binding - build SQL directly
|
|
159
|
+
if (like) {
|
|
160
|
+
// Escape the like pattern for safety
|
|
161
|
+
const escapedLike = like.replace(/'/g, "''");
|
|
162
|
+
sql += ` LIKE '${escapedLike}'`;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
const result = await adapter.rawQuery(sql);
|
|
166
|
+
|
|
167
|
+
// Convert to object
|
|
168
|
+
// Handle both uppercase and Pascal case column names
|
|
169
|
+
const variables: Record<string, string> = {};
|
|
170
|
+
for (const row of result.rows ?? []) {
|
|
171
|
+
const name = (row["Variable_name"] ??
|
|
172
|
+
row["VARIABLE_NAME"] ??
|
|
173
|
+
row["variable_name"]) as string;
|
|
174
|
+
const value = (row["Value"] ??
|
|
175
|
+
row["VALUE"] ??
|
|
176
|
+
row["value"]) as string;
|
|
177
|
+
if (name) {
|
|
178
|
+
variables[name] = value;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
127
181
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
182
|
+
const totalAvailable = Object.keys(variables).length;
|
|
183
|
+
const entries = Object.entries(variables);
|
|
184
|
+
const limited = entries.length > effectiveLimit;
|
|
185
|
+
const truncated = limited
|
|
186
|
+
? Object.fromEntries(entries.slice(0, effectiveLimit))
|
|
187
|
+
: variables;
|
|
188
|
+
|
|
189
|
+
return {
|
|
190
|
+
variables: truncated,
|
|
191
|
+
rowCount: Object.keys(truncated).length,
|
|
192
|
+
totalAvailable,
|
|
193
|
+
...(limited && { limited: true }),
|
|
194
|
+
};
|
|
195
|
+
} catch (err) {
|
|
196
|
+
if (err instanceof ZodError) {
|
|
197
|
+
const messages = err.issues.map((i) => i.message).join("; ");
|
|
198
|
+
return { success: false as const, error: messages };
|
|
140
199
|
}
|
|
200
|
+
return {
|
|
201
|
+
success: false as const,
|
|
202
|
+
error: err instanceof Error ? err.message : String(err),
|
|
203
|
+
};
|
|
141
204
|
}
|
|
142
|
-
|
|
143
|
-
const totalAvailable = Object.keys(variables).length;
|
|
144
|
-
const entries = Object.entries(variables);
|
|
145
|
-
const limited = entries.length > effectiveLimit;
|
|
146
|
-
const truncated = limited
|
|
147
|
-
? Object.fromEntries(entries.slice(0, effectiveLimit))
|
|
148
|
-
: variables;
|
|
149
|
-
|
|
150
|
-
return {
|
|
151
|
-
variables: truncated,
|
|
152
|
-
rowCount: Object.keys(truncated).length,
|
|
153
|
-
totalAvailable,
|
|
154
|
-
...(limited && { limited: true }),
|
|
155
|
-
};
|
|
156
205
|
},
|
|
157
206
|
};
|
|
158
207
|
}
|
|
@@ -263,17 +312,30 @@ export function createInnodbStatusTool(adapter: MySQLAdapter): ToolDefinition {
|
|
|
263
312
|
idempotentHint: true,
|
|
264
313
|
},
|
|
265
314
|
handler: async (params: unknown, _context: RequestContext) => {
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
315
|
+
try {
|
|
316
|
+
const { summary } = InnodbStatusSchema.parse(params);
|
|
317
|
+
const result = await adapter.executeQuery("SHOW ENGINE INNODB STATUS");
|
|
318
|
+
const rawRow = result.rows?.[0];
|
|
319
|
+
const rawStatus =
|
|
320
|
+
(rawRow?.["Status"] as string) ??
|
|
321
|
+
(rawRow?.["STATUS"] as string) ??
|
|
322
|
+
"";
|
|
323
|
+
|
|
324
|
+
if (summary) {
|
|
325
|
+
return { summary: parseInnodbStatusSummary(rawStatus) };
|
|
326
|
+
}
|
|
275
327
|
|
|
276
|
-
|
|
328
|
+
return { status: rawRow };
|
|
329
|
+
} catch (err) {
|
|
330
|
+
if (err instanceof ZodError) {
|
|
331
|
+
const messages = err.issues.map((i) => i.message).join("; ");
|
|
332
|
+
return { success: false as const, error: messages };
|
|
333
|
+
}
|
|
334
|
+
return {
|
|
335
|
+
success: false as const,
|
|
336
|
+
error: err instanceof Error ? err.message : String(err),
|
|
337
|
+
};
|
|
338
|
+
}
|
|
277
339
|
},
|
|
278
340
|
};
|
|
279
341
|
}
|
|
@@ -341,11 +403,18 @@ export function createPoolStatsTool(adapter: MySQLAdapter): ToolDefinition {
|
|
|
341
403
|
idempotentHint: true,
|
|
342
404
|
},
|
|
343
405
|
handler: async (_params: unknown, _context: RequestContext) => {
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
406
|
+
try {
|
|
407
|
+
const pool = await Promise.resolve(adapter.getPool());
|
|
408
|
+
if (!pool) {
|
|
409
|
+
return { success: false as const, error: "Pool not available" };
|
|
410
|
+
}
|
|
411
|
+
return { poolStats: pool.getStats() };
|
|
412
|
+
} catch (err) {
|
|
413
|
+
return {
|
|
414
|
+
success: false as const,
|
|
415
|
+
error: err instanceof Error ? err.message : String(err),
|
|
416
|
+
};
|
|
347
417
|
}
|
|
348
|
-
return { poolStats: pool.getStats() };
|
|
349
418
|
},
|
|
350
419
|
};
|
|
351
420
|
}
|
|
@@ -365,39 +434,46 @@ export function createServerHealthTool(adapter: MySQLAdapter): ToolDefinition {
|
|
|
365
434
|
idempotentHint: true,
|
|
366
435
|
},
|
|
367
436
|
handler: async (_params: unknown, _context: RequestContext) => {
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
uptime
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
437
|
+
try {
|
|
438
|
+
const health = await adapter.getHealth();
|
|
439
|
+
|
|
440
|
+
// Get additional metrics
|
|
441
|
+
const uptimeResult = await adapter.executeQuery(
|
|
442
|
+
"SHOW GLOBAL STATUS LIKE 'Uptime'",
|
|
443
|
+
);
|
|
444
|
+
const uptime = uptimeResult.rows?.[0]?.["Value"];
|
|
445
|
+
|
|
446
|
+
const connectionsResult = await adapter.executeQuery(
|
|
447
|
+
"SHOW GLOBAL STATUS LIKE 'Threads_connected'",
|
|
448
|
+
);
|
|
449
|
+
const connections = connectionsResult.rows?.[0]?.["Value"];
|
|
450
|
+
|
|
451
|
+
const queriesResult = await adapter.executeQuery(
|
|
452
|
+
"SHOW GLOBAL STATUS LIKE 'Questions'",
|
|
453
|
+
);
|
|
454
|
+
const queries = queriesResult.rows?.[0]?.["Value"];
|
|
455
|
+
|
|
456
|
+
return {
|
|
457
|
+
...health,
|
|
458
|
+
uptime:
|
|
459
|
+
uptime != null && typeof uptime === "string"
|
|
460
|
+
? parseInt(uptime, 10)
|
|
461
|
+
: undefined,
|
|
462
|
+
activeConnections:
|
|
463
|
+
connections != null && typeof connections === "string"
|
|
464
|
+
? parseInt(connections, 10)
|
|
465
|
+
: undefined,
|
|
466
|
+
totalQueries:
|
|
467
|
+
queries != null && typeof queries === "string"
|
|
468
|
+
? parseInt(queries, 10)
|
|
469
|
+
: undefined,
|
|
470
|
+
};
|
|
471
|
+
} catch (err) {
|
|
472
|
+
return {
|
|
473
|
+
success: false as const,
|
|
474
|
+
error: err instanceof Error ? err.message : String(err),
|
|
475
|
+
};
|
|
476
|
+
}
|
|
401
477
|
},
|
|
402
478
|
};
|
|
403
479
|
}
|