@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
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* mysql-mcp - Monitoring Summary & Edge Cases Tests
|
|
3
|
+
*
|
|
4
|
+
* Tests for parseInnodbStatusSummary (via summary=true),
|
|
5
|
+
* InnoDB ZodError path, and replication double-failure path.
|
|
6
|
+
* These target lines 209-289, 330-332, 374, 381 in monitoring.ts.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
10
|
+
import {
|
|
11
|
+
createInnodbStatusTool,
|
|
12
|
+
createReplicationStatusTool,
|
|
13
|
+
createShowStatusTool,
|
|
14
|
+
createShowVariablesTool,
|
|
15
|
+
} from "../monitoring.js";
|
|
16
|
+
import type { MySQLAdapter } from "../../../MySQLAdapter.js";
|
|
17
|
+
import {
|
|
18
|
+
createMockMySQLAdapter,
|
|
19
|
+
createMockRequestContext,
|
|
20
|
+
createMockQueryResult,
|
|
21
|
+
} from "../../../../../__tests__/mocks/index.js";
|
|
22
|
+
|
|
23
|
+
describe("Monitoring Summary & Edge Cases", () => {
|
|
24
|
+
let mockAdapter: ReturnType<typeof createMockMySQLAdapter>;
|
|
25
|
+
let mockContext: ReturnType<typeof createMockRequestContext>;
|
|
26
|
+
|
|
27
|
+
beforeEach(() => {
|
|
28
|
+
vi.clearAllMocks();
|
|
29
|
+
mockAdapter = createMockMySQLAdapter();
|
|
30
|
+
mockContext = createMockRequestContext();
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
// ===========================================================================
|
|
34
|
+
// InnoDB Status with summary=true (exercises parseInnodbStatusSummary)
|
|
35
|
+
// ===========================================================================
|
|
36
|
+
describe("InnoDB status summary mode", () => {
|
|
37
|
+
it("should parse buffer pool metrics from raw status", async () => {
|
|
38
|
+
const rawStatus = [
|
|
39
|
+
"BACKGROUND THREAD",
|
|
40
|
+
"Buffer pool size 16384",
|
|
41
|
+
"Free buffers 1024",
|
|
42
|
+
"Buffer pool hit rate 999 / 1000",
|
|
43
|
+
"END OF INNODB MONITOR OUTPUT",
|
|
44
|
+
].join("\n");
|
|
45
|
+
|
|
46
|
+
mockAdapter.executeQuery.mockResolvedValue(
|
|
47
|
+
createMockQueryResult([{ Status: rawStatus }]),
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
const tool = createInnodbStatusTool(
|
|
51
|
+
mockAdapter as unknown as MySQLAdapter,
|
|
52
|
+
);
|
|
53
|
+
const result = (await tool.handler({ summary: true }, mockContext)) as {
|
|
54
|
+
summary: Record<string, unknown>;
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
expect(result.summary).toBeDefined();
|
|
58
|
+
const bp = result.summary["bufferPool"] as Record<string, unknown>;
|
|
59
|
+
expect(bp).toBeDefined();
|
|
60
|
+
expect(bp["size"]).toBe(16384);
|
|
61
|
+
expect(bp["freeBuffers"]).toBe(1024);
|
|
62
|
+
expect(bp["hitRate"]).toBe("999/1000");
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it("should parse row operations metrics", async () => {
|
|
66
|
+
const rawStatus =
|
|
67
|
+
"1.50 inserts/s, 2.75 updates/s, 0.25 deletes/s, 100.00 reads/s";
|
|
68
|
+
|
|
69
|
+
mockAdapter.executeQuery.mockResolvedValue(
|
|
70
|
+
createMockQueryResult([{ Status: rawStatus }]),
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
const tool = createInnodbStatusTool(
|
|
74
|
+
mockAdapter as unknown as MySQLAdapter,
|
|
75
|
+
);
|
|
76
|
+
const result = (await tool.handler({ summary: true }, mockContext)) as {
|
|
77
|
+
summary: Record<string, unknown>;
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
const ops = result.summary["rowOperations"] as Record<string, number>;
|
|
81
|
+
expect(ops).toBeDefined();
|
|
82
|
+
expect(ops["insertsPerSec"]).toBe(1.5);
|
|
83
|
+
expect(ops["updatesPerSec"]).toBe(2.75);
|
|
84
|
+
expect(ops["deletesPerSec"]).toBe(0.25);
|
|
85
|
+
expect(ops["readsPerSec"]).toBe(100.0);
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
it("should parse log section metrics", async () => {
|
|
89
|
+
const rawStatus = [
|
|
90
|
+
"Log sequence number 123456789",
|
|
91
|
+
"Last checkpoint at 123456000",
|
|
92
|
+
].join("\n");
|
|
93
|
+
|
|
94
|
+
mockAdapter.executeQuery.mockResolvedValue(
|
|
95
|
+
createMockQueryResult([{ Status: rawStatus }]),
|
|
96
|
+
);
|
|
97
|
+
|
|
98
|
+
const tool = createInnodbStatusTool(
|
|
99
|
+
mockAdapter as unknown as MySQLAdapter,
|
|
100
|
+
);
|
|
101
|
+
const result = (await tool.handler({ summary: true }, mockContext)) as {
|
|
102
|
+
summary: Record<string, unknown>;
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
const log = result.summary["log"] as Record<string, number>;
|
|
106
|
+
expect(log).toBeDefined();
|
|
107
|
+
expect(log["sequenceNumber"]).toBe(123456789);
|
|
108
|
+
expect(log["lastCheckpoint"]).toBe(123456000);
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
it("should parse transactions section", async () => {
|
|
112
|
+
const rawStatus = [
|
|
113
|
+
"History list length 100",
|
|
114
|
+
"Trx id counter 456789",
|
|
115
|
+
].join("\n");
|
|
116
|
+
|
|
117
|
+
mockAdapter.executeQuery.mockResolvedValue(
|
|
118
|
+
createMockQueryResult([{ Status: rawStatus }]),
|
|
119
|
+
);
|
|
120
|
+
|
|
121
|
+
const tool = createInnodbStatusTool(
|
|
122
|
+
mockAdapter as unknown as MySQLAdapter,
|
|
123
|
+
);
|
|
124
|
+
const result = (await tool.handler({ summary: true }, mockContext)) as {
|
|
125
|
+
summary: Record<string, unknown>;
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
const trx = result.summary["transactions"] as Record<string, number>;
|
|
129
|
+
expect(trx).toBeDefined();
|
|
130
|
+
expect(trx["historyListLength"]).toBe(100);
|
|
131
|
+
expect(trx["trxIdCounter"]).toBe(456789);
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
it("should parse semaphores section", async () => {
|
|
135
|
+
const rawStatus = "OS WAIT ARRAY INFO: reservation count 42";
|
|
136
|
+
|
|
137
|
+
mockAdapter.executeQuery.mockResolvedValue(
|
|
138
|
+
createMockQueryResult([{ Status: rawStatus }]),
|
|
139
|
+
);
|
|
140
|
+
|
|
141
|
+
const tool = createInnodbStatusTool(
|
|
142
|
+
mockAdapter as unknown as MySQLAdapter,
|
|
143
|
+
);
|
|
144
|
+
const result = (await tool.handler({ summary: true }, mockContext)) as {
|
|
145
|
+
summary: Record<string, unknown>;
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
const sem = result.summary["semaphores"] as Record<string, number>;
|
|
149
|
+
expect(sem).toBeDefined();
|
|
150
|
+
expect(sem["osWaitReservations"]).toBe(42);
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
it("should return empty summary for status without matching patterns", async () => {
|
|
154
|
+
mockAdapter.executeQuery.mockResolvedValue(
|
|
155
|
+
createMockQueryResult([{ Status: "Nothing relevant here" }]),
|
|
156
|
+
);
|
|
157
|
+
|
|
158
|
+
const tool = createInnodbStatusTool(
|
|
159
|
+
mockAdapter as unknown as MySQLAdapter,
|
|
160
|
+
);
|
|
161
|
+
const result = (await tool.handler({ summary: true }, mockContext)) as {
|
|
162
|
+
summary: Record<string, unknown>;
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
expect(result.summary).toBeDefined();
|
|
166
|
+
expect(Object.keys(result.summary)).toHaveLength(0);
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
it("should handle empty rows for summary mode", async () => {
|
|
170
|
+
mockAdapter.executeQuery.mockResolvedValue(createMockQueryResult([]));
|
|
171
|
+
|
|
172
|
+
const tool = createInnodbStatusTool(
|
|
173
|
+
mockAdapter as unknown as MySQLAdapter,
|
|
174
|
+
);
|
|
175
|
+
const result = (await tool.handler({ summary: true }, mockContext)) as {
|
|
176
|
+
summary: Record<string, unknown>;
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
expect(result.summary).toBeDefined();
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
it("should handle STATUS column name in uppercase", async () => {
|
|
183
|
+
mockAdapter.executeQuery.mockResolvedValue(
|
|
184
|
+
createMockQueryResult([{ STATUS: "Buffer pool size 8192" }]),
|
|
185
|
+
);
|
|
186
|
+
|
|
187
|
+
const tool = createInnodbStatusTool(
|
|
188
|
+
mockAdapter as unknown as MySQLAdapter,
|
|
189
|
+
);
|
|
190
|
+
const result = (await tool.handler({ summary: true }, mockContext)) as {
|
|
191
|
+
summary: Record<string, unknown>;
|
|
192
|
+
};
|
|
193
|
+
|
|
194
|
+
expect(result.summary).toBeDefined();
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
// ===========================================================================
|
|
199
|
+
// Replication double-failure and SHOW SLAVE STATUS fallback
|
|
200
|
+
// ===========================================================================
|
|
201
|
+
describe("replication edge cases", () => {
|
|
202
|
+
it("should handle both REPLICA and SLAVE STATUS failing", async () => {
|
|
203
|
+
mockAdapter.executeQuery
|
|
204
|
+
.mockRejectedValueOnce(new Error("REPLICA not supported"))
|
|
205
|
+
.mockRejectedValueOnce(new Error("SLAVE not supported"));
|
|
206
|
+
|
|
207
|
+
const tool = createReplicationStatusTool(
|
|
208
|
+
mockAdapter as unknown as MySQLAdapter,
|
|
209
|
+
);
|
|
210
|
+
const result = (await tool.handler({}, mockContext)) as {
|
|
211
|
+
configured: boolean;
|
|
212
|
+
message: string;
|
|
213
|
+
};
|
|
214
|
+
|
|
215
|
+
expect(result.configured).toBe(false);
|
|
216
|
+
expect(result.message).toContain("not configured");
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
it("should handle SHOW SLAVE STATUS returning empty rows", async () => {
|
|
220
|
+
mockAdapter.executeQuery
|
|
221
|
+
.mockRejectedValueOnce(new Error("REPLICA not supported"))
|
|
222
|
+
.mockResolvedValueOnce(createMockQueryResult([]));
|
|
223
|
+
|
|
224
|
+
const tool = createReplicationStatusTool(
|
|
225
|
+
mockAdapter as unknown as MySQLAdapter,
|
|
226
|
+
);
|
|
227
|
+
const result = (await tool.handler({}, mockContext)) as {
|
|
228
|
+
configured: boolean;
|
|
229
|
+
message: string;
|
|
230
|
+
};
|
|
231
|
+
|
|
232
|
+
expect(result.configured).toBe(false);
|
|
233
|
+
expect(result.message).toContain("not configured");
|
|
234
|
+
});
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
// ===========================================================================
|
|
238
|
+
// ShowStatus and ShowVariables - limit < 1 validation path
|
|
239
|
+
// ===========================================================================
|
|
240
|
+
describe("status/variables limit validation", () => {
|
|
241
|
+
it("should reject limit < 1 in showStatus", async () => {
|
|
242
|
+
const tool = createShowStatusTool(mockAdapter as unknown as MySQLAdapter);
|
|
243
|
+
const result = (await tool.handler({ limit: 0 }, mockContext)) as {
|
|
244
|
+
success: boolean;
|
|
245
|
+
error: string;
|
|
246
|
+
};
|
|
247
|
+
expect(result.success).toBe(false);
|
|
248
|
+
expect(result.error).toContain("limit must be a positive integer");
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
it("should reject limit < 1 in showVariables", async () => {
|
|
252
|
+
const tool = createShowVariablesTool(
|
|
253
|
+
mockAdapter as unknown as MySQLAdapter,
|
|
254
|
+
);
|
|
255
|
+
const result = (await tool.handler({ limit: 0 }, mockContext)) as {
|
|
256
|
+
success: boolean;
|
|
257
|
+
error: string;
|
|
258
|
+
};
|
|
259
|
+
expect(result.success).toBe(false);
|
|
260
|
+
expect(result.error).toContain("limit must be a positive integer");
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
it("should handle showVariables with LIKE and session", async () => {
|
|
264
|
+
mockAdapter.rawQuery.mockResolvedValue(createMockQueryResult([]));
|
|
265
|
+
const tool = createShowVariablesTool(
|
|
266
|
+
mockAdapter as unknown as MySQLAdapter,
|
|
267
|
+
);
|
|
268
|
+
await tool.handler({ global: false, like: "max_%" }, mockContext);
|
|
269
|
+
const call = mockAdapter.rawQuery.mock.calls[0][0] as string;
|
|
270
|
+
expect(call).not.toContain("GLOBAL");
|
|
271
|
+
expect(call).toContain("LIKE 'max_%'");
|
|
272
|
+
});
|
|
273
|
+
});
|
|
274
|
+
});
|
|
@@ -81,6 +81,21 @@ describe("Admin Monitoring Tools", () => {
|
|
|
81
81
|
expect(result).toHaveProperty("processes");
|
|
82
82
|
expect((result as { processes: unknown[] }).processes).toEqual([]);
|
|
83
83
|
});
|
|
84
|
+
|
|
85
|
+
it("should return structured error on query failure", async () => {
|
|
86
|
+
mockAdapter.executeQuery.mockRejectedValue(new Error("Connection lost"));
|
|
87
|
+
|
|
88
|
+
const tool = createShowProcesslistTool(
|
|
89
|
+
mockAdapter as unknown as MySQLAdapter,
|
|
90
|
+
);
|
|
91
|
+
const result = (await tool.handler({}, mockContext)) as {
|
|
92
|
+
success: false;
|
|
93
|
+
error: string;
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
expect(result.success).toBe(false);
|
|
97
|
+
expect(result.error).toBe("Connection lost");
|
|
98
|
+
});
|
|
84
99
|
});
|
|
85
100
|
|
|
86
101
|
describe("createShowStatusTool", () => {
|
|
@@ -226,6 +241,33 @@ describe("Admin Monitoring Tools", () => {
|
|
|
226
241
|
"[REDACTED]",
|
|
227
242
|
);
|
|
228
243
|
});
|
|
244
|
+
|
|
245
|
+
it("should return structured error on query failure", async () => {
|
|
246
|
+
mockAdapter.rawQuery.mockRejectedValue(new Error("Access denied"));
|
|
247
|
+
|
|
248
|
+
const tool = createShowStatusTool(mockAdapter as unknown as MySQLAdapter);
|
|
249
|
+
const result = (await tool.handler({}, mockContext)) as {
|
|
250
|
+
success: false;
|
|
251
|
+
error: string;
|
|
252
|
+
};
|
|
253
|
+
|
|
254
|
+
expect(result.success).toBe(false);
|
|
255
|
+
expect(result.error).toBe("Access denied");
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
it("should return structured error on Zod validation failure", async () => {
|
|
259
|
+
const tool = createShowStatusTool(mockAdapter as unknown as MySQLAdapter);
|
|
260
|
+
const result = (await tool.handler(
|
|
261
|
+
{ limit: "not-a-number" },
|
|
262
|
+
mockContext,
|
|
263
|
+
)) as {
|
|
264
|
+
success: false;
|
|
265
|
+
error: string;
|
|
266
|
+
};
|
|
267
|
+
|
|
268
|
+
expect(result.success).toBe(false);
|
|
269
|
+
expect(result.error).toBeDefined();
|
|
270
|
+
});
|
|
229
271
|
});
|
|
230
272
|
|
|
231
273
|
describe("createShowVariablesTool", () => {
|
|
@@ -327,6 +369,21 @@ describe("Admin Monitoring Tools", () => {
|
|
|
327
369
|
expect(result.totalAvailable).toBe(200);
|
|
328
370
|
expect(result.limited).toBe(true);
|
|
329
371
|
});
|
|
372
|
+
|
|
373
|
+
it("should return structured error on query failure", async () => {
|
|
374
|
+
mockAdapter.rawQuery.mockRejectedValue(new Error("Connection refused"));
|
|
375
|
+
|
|
376
|
+
const tool = createShowVariablesTool(
|
|
377
|
+
mockAdapter as unknown as MySQLAdapter,
|
|
378
|
+
);
|
|
379
|
+
const result = (await tool.handler({}, mockContext)) as {
|
|
380
|
+
success: false;
|
|
381
|
+
error: string;
|
|
382
|
+
};
|
|
383
|
+
|
|
384
|
+
expect(result.success).toBe(false);
|
|
385
|
+
expect(result.error).toBe("Connection refused");
|
|
386
|
+
});
|
|
330
387
|
});
|
|
331
388
|
|
|
332
389
|
describe("createInnodbStatusTool", () => {
|
|
@@ -373,6 +430,23 @@ describe("Admin Monitoring Tools", () => {
|
|
|
373
430
|
|
|
374
431
|
expect(result).toHaveProperty("status");
|
|
375
432
|
});
|
|
433
|
+
|
|
434
|
+
it("should return structured error on query failure", async () => {
|
|
435
|
+
mockAdapter.executeQuery.mockRejectedValue(
|
|
436
|
+
new Error("PROCESS privilege required"),
|
|
437
|
+
);
|
|
438
|
+
|
|
439
|
+
const tool = createInnodbStatusTool(
|
|
440
|
+
mockAdapter as unknown as MySQLAdapter,
|
|
441
|
+
);
|
|
442
|
+
const result = (await tool.handler({}, mockContext)) as {
|
|
443
|
+
success: false;
|
|
444
|
+
error: string;
|
|
445
|
+
};
|
|
446
|
+
|
|
447
|
+
expect(result.success).toBe(false);
|
|
448
|
+
expect(result.error).toBe("PROCESS privilege required");
|
|
449
|
+
});
|
|
376
450
|
});
|
|
377
451
|
|
|
378
452
|
describe("createReplicationStatusTool", () => {
|
|
@@ -473,12 +547,16 @@ describe("Admin Monitoring Tools", () => {
|
|
|
473
547
|
mockAdapter.getPool = vi.fn().mockReturnValue(undefined);
|
|
474
548
|
|
|
475
549
|
const tool = createPoolStatsTool(mockAdapter as unknown as MySQLAdapter);
|
|
476
|
-
const result = (await tool.handler({}, mockContext)) as {
|
|
550
|
+
const result = (await tool.handler({}, mockContext)) as {
|
|
551
|
+
success: false;
|
|
552
|
+
error: string;
|
|
553
|
+
};
|
|
477
554
|
|
|
555
|
+
expect(result.success).toBe(false);
|
|
478
556
|
expect(result.error).toBe("Pool not available");
|
|
479
557
|
});
|
|
480
558
|
|
|
481
|
-
it("should
|
|
559
|
+
it("should return structured error on pool error", async () => {
|
|
482
560
|
const mockPool = {
|
|
483
561
|
getStats: vi.fn().mockImplementation(() => {
|
|
484
562
|
throw new Error("Pool error");
|
|
@@ -487,7 +565,13 @@ describe("Admin Monitoring Tools", () => {
|
|
|
487
565
|
mockAdapter.getPool = vi.fn().mockReturnValue(mockPool);
|
|
488
566
|
|
|
489
567
|
const tool = createPoolStatsTool(mockAdapter as unknown as MySQLAdapter);
|
|
490
|
-
await
|
|
568
|
+
const result = (await tool.handler({}, mockContext)) as {
|
|
569
|
+
success: false;
|
|
570
|
+
error: string;
|
|
571
|
+
};
|
|
572
|
+
|
|
573
|
+
expect(result.success).toBe(false);
|
|
574
|
+
expect(result.error).toBe("Pool error");
|
|
491
575
|
});
|
|
492
576
|
});
|
|
493
577
|
|
|
@@ -586,14 +670,19 @@ describe("Admin Monitoring Tools", () => {
|
|
|
586
670
|
expect(result.activeConnections).toBeUndefined();
|
|
587
671
|
});
|
|
588
672
|
|
|
589
|
-
it("should
|
|
673
|
+
it("should return structured error on connection failure", async () => {
|
|
590
674
|
mockAdapter.executeQuery.mockRejectedValue(new Error("Connection lost"));
|
|
591
675
|
|
|
592
676
|
const tool = createServerHealthTool(
|
|
593
677
|
mockAdapter as unknown as MySQLAdapter,
|
|
594
678
|
);
|
|
679
|
+
const result = (await tool.handler({}, mockContext)) as {
|
|
680
|
+
success: false;
|
|
681
|
+
error: string;
|
|
682
|
+
};
|
|
595
683
|
|
|
596
|
-
|
|
684
|
+
expect(result.success).toBe(false);
|
|
685
|
+
expect(result.error).toBe("Connection lost");
|
|
597
686
|
});
|
|
598
687
|
});
|
|
599
688
|
});
|