@neverinfamous/mysql-mcp 2.3.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.dockerignore +1 -0
- package/.gitattributes +18 -0
- package/.github/workflows/codeql.yml +2 -10
- package/.github/workflows/docker-publish.yml +15 -13
- package/CHANGELOG.md +287 -1
- package/DOCKER_README.md +100 -265
- package/Dockerfile +5 -0
- package/README.md +124 -59
- package/VERSION +1 -1
- package/dist/__tests__/mocks/adapter.d.ts.map +1 -1
- package/dist/__tests__/mocks/adapter.js +2 -0
- package/dist/__tests__/mocks/adapter.js.map +1 -1
- package/dist/adapters/DatabaseAdapter.d.ts.map +1 -1
- package/dist/adapters/DatabaseAdapter.js +50 -9
- package/dist/adapters/DatabaseAdapter.js.map +1 -1
- package/dist/adapters/mysql/MySQLAdapter.d.ts +6 -0
- package/dist/adapters/mysql/MySQLAdapter.d.ts.map +1 -1
- package/dist/adapters/mysql/MySQLAdapter.js +8 -0
- package/dist/adapters/mysql/MySQLAdapter.js.map +1 -1
- package/dist/adapters/mysql/SchemaManager.js +16 -15
- package/dist/adapters/mysql/SchemaManager.js.map +1 -1
- package/dist/adapters/mysql/prompts/index.js +10 -20
- package/dist/adapters/mysql/prompts/index.js.map +1 -1
- package/dist/adapters/mysql/prompts/proxysqlSetup.js +1 -1
- package/dist/adapters/mysql/resources/docstore.d.ts.map +1 -1
- package/dist/adapters/mysql/resources/docstore.js +10 -7
- package/dist/adapters/mysql/resources/docstore.js.map +1 -1
- package/dist/adapters/mysql/resources/events.js +11 -8
- package/dist/adapters/mysql/resources/events.js.map +1 -1
- package/dist/adapters/mysql/resources/indexes.d.ts.map +1 -1
- package/dist/adapters/mysql/resources/indexes.js +12 -15
- package/dist/adapters/mysql/resources/indexes.js.map +1 -1
- package/dist/adapters/mysql/resources/innodb.d.ts.map +1 -1
- package/dist/adapters/mysql/resources/innodb.js +20 -17
- package/dist/adapters/mysql/resources/innodb.js.map +1 -1
- package/dist/adapters/mysql/resources/locks.d.ts.map +1 -1
- package/dist/adapters/mysql/resources/locks.js +9 -6
- package/dist/adapters/mysql/resources/locks.js.map +1 -1
- package/dist/adapters/mysql/resources/performance.d.ts.map +1 -1
- package/dist/adapters/mysql/resources/performance.js +15 -15
- package/dist/adapters/mysql/resources/performance.js.map +1 -1
- package/dist/adapters/mysql/resources/spatial.d.ts.map +1 -1
- package/dist/adapters/mysql/resources/spatial.js +9 -6
- package/dist/adapters/mysql/resources/spatial.js.map +1 -1
- package/dist/adapters/mysql/resources/sysschema.d.ts.map +1 -1
- package/dist/adapters/mysql/resources/sysschema.js +12 -9
- package/dist/adapters/mysql/resources/sysschema.js.map +1 -1
- package/dist/adapters/mysql/tools/admin/backup.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/admin/backup.js +170 -121
- package/dist/adapters/mysql/tools/admin/backup.js.map +1 -1
- package/dist/adapters/mysql/tools/admin/maintenance.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/admin/maintenance.js +106 -57
- package/dist/adapters/mysql/tools/admin/maintenance.js.map +1 -1
- package/dist/adapters/mysql/tools/admin/monitoring.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/admin/monitoring.js +183 -101
- package/dist/adapters/mysql/tools/admin/monitoring.js.map +1 -1
- package/dist/adapters/mysql/tools/cluster/group-replication.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/cluster/group-replication.js +164 -120
- package/dist/adapters/mysql/tools/cluster/group-replication.js.map +1 -1
- package/dist/adapters/mysql/tools/cluster/innodb-cluster.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/cluster/innodb-cluster.js +212 -145
- package/dist/adapters/mysql/tools/cluster/innodb-cluster.js.map +1 -1
- package/dist/adapters/mysql/tools/codemode/index.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/codemode/index.js +6 -4
- package/dist/adapters/mysql/tools/codemode/index.js.map +1 -1
- package/dist/adapters/mysql/tools/core.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/core.js +152 -29
- package/dist/adapters/mysql/tools/core.js.map +1 -1
- package/dist/adapters/mysql/tools/docstore.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/docstore.js +340 -163
- package/dist/adapters/mysql/tools/docstore.js.map +1 -1
- package/dist/adapters/mysql/tools/events.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/events.js +284 -198
- package/dist/adapters/mysql/tools/events.js.map +1 -1
- package/dist/adapters/mysql/tools/json/core.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/json/core.js +11 -39
- package/dist/adapters/mysql/tools/json/core.js.map +1 -1
- package/dist/adapters/mysql/tools/json/enhanced.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/json/enhanced.js +15 -33
- package/dist/adapters/mysql/tools/json/enhanced.js.map +1 -1
- package/dist/adapters/mysql/tools/json/helpers.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/json/helpers.js +13 -24
- package/dist/adapters/mysql/tools/json/helpers.js.map +1 -1
- package/dist/adapters/mysql/tools/partitioning.js +3 -0
- package/dist/adapters/mysql/tools/partitioning.js.map +1 -1
- package/dist/adapters/mysql/tools/performance/analysis.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/performance/analysis.js +89 -60
- package/dist/adapters/mysql/tools/performance/analysis.js.map +1 -1
- package/dist/adapters/mysql/tools/performance/optimization.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/performance/optimization.js +151 -127
- package/dist/adapters/mysql/tools/performance/optimization.js.map +1 -1
- package/dist/adapters/mysql/tools/proxysql.d.ts +1 -1
- package/dist/adapters/mysql/tools/proxysql.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/proxysql.js +289 -176
- package/dist/adapters/mysql/tools/proxysql.js.map +1 -1
- package/dist/adapters/mysql/tools/replication.js +75 -49
- package/dist/adapters/mysql/tools/replication.js.map +1 -1
- package/dist/adapters/mysql/tools/roles.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/roles.js +224 -182
- package/dist/adapters/mysql/tools/roles.js.map +1 -1
- package/dist/adapters/mysql/tools/router.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/router.js +168 -67
- package/dist/adapters/mysql/tools/router.js.map +1 -1
- package/dist/adapters/mysql/tools/schema/constraints.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/schema/constraints.js +21 -3
- package/dist/adapters/mysql/tools/schema/constraints.js.map +1 -1
- package/dist/adapters/mysql/tools/schema/management.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/schema/management.js +61 -14
- package/dist/adapters/mysql/tools/schema/management.js.map +1 -1
- package/dist/adapters/mysql/tools/schema/routines.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/schema/routines.js +27 -4
- package/dist/adapters/mysql/tools/schema/routines.js.map +1 -1
- package/dist/adapters/mysql/tools/schema/scheduled_events.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/schema/scheduled_events.js +24 -3
- package/dist/adapters/mysql/tools/schema/scheduled_events.js.map +1 -1
- package/dist/adapters/mysql/tools/schema/triggers.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/schema/triggers.js +23 -2
- package/dist/adapters/mysql/tools/schema/triggers.js.map +1 -1
- package/dist/adapters/mysql/tools/schema/views.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/schema/views.js +47 -7
- package/dist/adapters/mysql/tools/schema/views.js.map +1 -1
- package/dist/adapters/mysql/tools/security/audit.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/security/audit.js +102 -34
- package/dist/adapters/mysql/tools/security/audit.js.map +1 -1
- package/dist/adapters/mysql/tools/security/data-protection.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/security/data-protection.js +264 -205
- package/dist/adapters/mysql/tools/security/data-protection.js.map +1 -1
- package/dist/adapters/mysql/tools/security/encryption.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/security/encryption.js +137 -104
- package/dist/adapters/mysql/tools/security/encryption.js.map +1 -1
- package/dist/adapters/mysql/tools/shell/backup.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/shell/backup.js +71 -59
- package/dist/adapters/mysql/tools/shell/backup.js.map +1 -1
- package/dist/adapters/mysql/tools/shell/restore.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/shell/restore.js +61 -47
- package/dist/adapters/mysql/tools/shell/restore.js.map +1 -1
- package/dist/adapters/mysql/tools/spatial/geometry.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/spatial/geometry.js +19 -5
- package/dist/adapters/mysql/tools/spatial/geometry.js.map +1 -1
- package/dist/adapters/mysql/tools/spatial/operations.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/spatial/operations.js +42 -17
- package/dist/adapters/mysql/tools/spatial/operations.js.map +1 -1
- package/dist/adapters/mysql/tools/spatial/queries.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/spatial/queries.js +109 -57
- package/dist/adapters/mysql/tools/spatial/queries.js.map +1 -1
- package/dist/adapters/mysql/tools/spatial/setup.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/spatial/setup.js +103 -50
- package/dist/adapters/mysql/tools/spatial/setup.js.map +1 -1
- package/dist/adapters/mysql/tools/stats/comparative.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/stats/comparative.js +128 -79
- package/dist/adapters/mysql/tools/stats/comparative.js.map +1 -1
- package/dist/adapters/mysql/tools/stats/descriptive.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/stats/descriptive.js +174 -102
- package/dist/adapters/mysql/tools/stats/descriptive.js.map +1 -1
- package/dist/adapters/mysql/tools/sysschema/activity.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/sysschema/activity.js +50 -25
- package/dist/adapters/mysql/tools/sysschema/activity.js.map +1 -1
- package/dist/adapters/mysql/tools/sysschema/performance.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/sysschema/performance.js +121 -66
- package/dist/adapters/mysql/tools/sysschema/performance.js.map +1 -1
- package/dist/adapters/mysql/tools/sysschema/resources.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/sysschema/resources.js +101 -64
- package/dist/adapters/mysql/tools/sysschema/resources.js.map +1 -1
- package/dist/adapters/mysql/tools/text/fulltext.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/text/fulltext.js +18 -32
- package/dist/adapters/mysql/tools/text/fulltext.js.map +1 -1
- package/dist/adapters/mysql/tools/transactions.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/transactions.js +48 -23
- package/dist/adapters/mysql/tools/transactions.js.map +1 -1
- package/dist/adapters/mysql/types/proxysql-types.d.ts +15 -0
- package/dist/adapters/mysql/types/proxysql-types.d.ts.map +1 -1
- package/dist/adapters/mysql/types/proxysql-types.js +33 -1
- package/dist/adapters/mysql/types/proxysql-types.js.map +1 -1
- package/dist/adapters/mysql/types/router-types.d.ts +1 -1
- package/dist/adapters/mysql/types/router-types.js +1 -1
- package/dist/adapters/mysql/types/router-types.js.map +1 -1
- package/dist/adapters/mysql/types/shell-types.js +2 -2
- package/dist/adapters/mysql/types/shell-types.js.map +1 -1
- package/dist/adapters/mysql/types.d.ts +485 -21
- package/dist/adapters/mysql/types.d.ts.map +1 -1
- package/dist/adapters/mysql/types.js +546 -19
- package/dist/adapters/mysql/types.js.map +1 -1
- package/dist/auth/scopes.js +1 -1
- package/dist/auth/scopes.js.map +1 -1
- package/dist/codemode/api.d.ts +3 -2
- package/dist/codemode/api.d.ts.map +1 -1
- package/dist/codemode/api.js +80 -5
- package/dist/codemode/api.js.map +1 -1
- package/dist/codemode/sandbox-factory.js +1 -1
- package/dist/codemode/sandbox-factory.js.map +1 -1
- package/dist/codemode/types.d.ts +26 -0
- package/dist/codemode/types.d.ts.map +1 -1
- package/dist/codemode/types.js +2 -0
- package/dist/codemode/types.js.map +1 -1
- package/dist/codemode/worker-sandbox.d.ts +4 -2
- package/dist/codemode/worker-sandbox.d.ts.map +1 -1
- package/dist/codemode/worker-sandbox.js +66 -7
- package/dist/codemode/worker-sandbox.js.map +1 -1
- package/dist/codemode/worker-script.d.ts +3 -0
- package/dist/codemode/worker-script.d.ts.map +1 -1
- package/dist/codemode/worker-script.js +128 -75
- package/dist/codemode/worker-script.js.map +1 -1
- package/dist/constants/ServerInstructions.d.ts +1 -1
- package/dist/constants/ServerInstructions.d.ts.map +1 -1
- package/dist/constants/ServerInstructions.js +37 -31
- package/dist/constants/ServerInstructions.js.map +1 -1
- package/dist/filtering/ToolConstants.d.ts +1 -1
- package/dist/filtering/ToolConstants.d.ts.map +1 -1
- package/dist/filtering/ToolConstants.js +1 -2
- package/dist/filtering/ToolConstants.js.map +1 -1
- package/dist/pool/ConnectionPool.d.ts.map +1 -1
- package/dist/pool/ConnectionPool.js.map +1 -1
- package/dist/transports/http.d.ts.map +1 -1
- package/dist/transports/http.js +6 -0
- package/dist/transports/http.js.map +1 -1
- package/dist/utils/validators.d.ts +1 -1
- package/dist/utils/validators.d.ts.map +1 -1
- package/dist/utils/validators.js.map +1 -1
- package/package.json +4 -4
- package/releases/v2.3.0-release-notes.md +20 -20
- package/releases/v2.3.1-release-notes.md +34 -0
- package/releases/v3.0.0-release-notes.md +81 -0
- package/src/__tests__/mocks/adapter.ts +3 -0
- package/src/__tests__/perf.test.ts +6 -6
- package/src/adapters/DatabaseAdapter.ts +58 -9
- package/src/adapters/__tests__/DatabaseAdapter.test.ts +89 -8
- package/src/adapters/mysql/MySQLAdapter.ts +17 -2
- package/src/adapters/mysql/SchemaManager.ts +21 -21
- package/src/adapters/mysql/__tests__/MySQLAdapter.test.ts +1 -1
- package/src/adapters/mysql/prompts/index.ts +12 -22
- package/src/adapters/mysql/prompts/proxysqlSetup.ts +1 -1
- package/src/adapters/mysql/resources/docstore.ts +13 -10
- package/src/adapters/mysql/resources/events.ts +12 -12
- package/src/adapters/mysql/resources/indexes.ts +17 -19
- package/src/adapters/mysql/resources/innodb.ts +23 -22
- package/src/adapters/mysql/resources/locks.ts +9 -7
- package/src/adapters/mysql/resources/performance.ts +23 -18
- package/src/adapters/mysql/resources/spatial.ts +9 -7
- package/src/adapters/mysql/resources/sysschema.ts +12 -11
- package/src/adapters/mysql/tools/__tests__/core.test.ts +126 -55
- package/src/adapters/mysql/tools/__tests__/docstore.test.ts +459 -88
- package/src/adapters/mysql/tools/__tests__/events.test.ts +281 -103
- package/src/adapters/mysql/tools/__tests__/proxysql.test.ts +128 -28
- package/src/adapters/mysql/tools/__tests__/replication.test.ts +48 -2
- package/src/adapters/mysql/tools/__tests__/roles.test.ts +15 -18
- package/src/adapters/mysql/tools/__tests__/router.test.ts +32 -5
- package/src/adapters/mysql/tools/__tests__/security.test.ts +126 -2
- package/src/adapters/mysql/tools/__tests__/security_injection.test.ts +84 -76
- package/src/adapters/mysql/tools/__tests__/security_integration.test.ts +47 -50
- package/src/adapters/mysql/tools/__tests__/spatial.test.ts +11 -10
- package/src/adapters/mysql/tools/__tests__/spatial_handler.test.ts +54 -38
- package/src/adapters/mysql/tools/__tests__/stats.test.ts +285 -152
- package/src/adapters/mysql/tools/__tests__/transactions.test.ts +13 -13
- package/src/adapters/mysql/tools/admin/__tests__/backup.test.ts +171 -25
- package/src/adapters/mysql/tools/admin/__tests__/maintenance.test.ts +240 -4
- package/src/adapters/mysql/tools/admin/__tests__/monitoring-summary.test.ts +274 -0
- package/src/adapters/mysql/tools/admin/__tests__/monitoring.test.ts +94 -5
- package/src/adapters/mysql/tools/admin/backup.ts +193 -143
- package/src/adapters/mysql/tools/admin/maintenance.ts +118 -69
- package/src/adapters/mysql/tools/admin/monitoring.ts +201 -125
- package/src/adapters/mysql/tools/cluster/__tests__/group-replication.test.ts +69 -0
- package/src/adapters/mysql/tools/cluster/__tests__/innodb-cluster.test.ts +141 -0
- package/src/adapters/mysql/tools/cluster/group-replication.ts +172 -132
- package/src/adapters/mysql/tools/cluster/innodb-cluster.ts +231 -157
- package/src/adapters/mysql/tools/codemode/__tests__/codemode-tool.test.ts +227 -0
- package/src/adapters/mysql/tools/codemode/index.ts +5 -3
- package/src/adapters/mysql/tools/core.ts +152 -38
- package/src/adapters/mysql/tools/docstore.ts +422 -205
- package/src/adapters/mysql/tools/events.ts +334 -233
- package/src/adapters/mysql/tools/json/__tests__/core.test.ts +20 -0
- package/src/adapters/mysql/tools/json/__tests__/enhanced.test.ts +82 -50
- package/src/adapters/mysql/tools/json/__tests__/helpers.test.ts +42 -3
- package/src/adapters/mysql/tools/json/core.ts +21 -42
- package/src/adapters/mysql/tools/json/enhanced.ts +22 -37
- package/src/adapters/mysql/tools/json/helpers.ts +21 -25
- package/src/adapters/mysql/tools/partitioning.ts +3 -0
- package/src/adapters/mysql/tools/performance/__tests__/analysis.test.ts +98 -5
- package/src/adapters/mysql/tools/performance/__tests__/optimization-coverage.test.ts +515 -0
- package/src/adapters/mysql/tools/performance/__tests__/optimization.test.ts +187 -0
- package/src/adapters/mysql/tools/performance/analysis.ts +95 -69
- package/src/adapters/mysql/tools/performance/optimization.ts +182 -153
- package/src/adapters/mysql/tools/proxysql.ts +314 -209
- package/src/adapters/mysql/tools/replication.ts +84 -57
- package/src/adapters/mysql/tools/roles.ts +274 -226
- package/src/adapters/mysql/tools/router.ts +181 -85
- package/src/adapters/mysql/tools/schema/__tests__/constraints.test.ts +13 -0
- package/src/adapters/mysql/tools/schema/__tests__/management.test.ts +60 -25
- package/src/adapters/mysql/tools/schema/__tests__/scheduled_events.test.ts +11 -0
- package/src/adapters/mysql/tools/schema/__tests__/triggers.test.ts +25 -4
- package/src/adapters/mysql/tools/schema/__tests__/views.test.ts +46 -14
- package/src/adapters/mysql/tools/schema/constraints.ts +22 -3
- package/src/adapters/mysql/tools/schema/management.ts +60 -15
- package/src/adapters/mysql/tools/schema/routines.ts +26 -4
- package/src/adapters/mysql/tools/schema/scheduled_events.ts +25 -3
- package/src/adapters/mysql/tools/schema/triggers.ts +27 -2
- package/src/adapters/mysql/tools/schema/views.ts +46 -8
- package/src/adapters/mysql/tools/security/__tests__/audit.test.ts +90 -4
- package/src/adapters/mysql/tools/security/audit.ts +113 -39
- package/src/adapters/mysql/tools/security/data-protection.ts +293 -233
- package/src/adapters/mysql/tools/security/encryption.ts +172 -139
- package/src/adapters/mysql/tools/shell/__tests__/backup.test.ts +29 -0
- package/src/adapters/mysql/tools/shell/backup.ts +90 -73
- package/src/adapters/mysql/tools/shell/restore.ts +62 -48
- package/src/adapters/mysql/tools/spatial/__tests__/operations.test.ts +22 -14
- package/src/adapters/mysql/tools/spatial/__tests__/queries.test.ts +65 -51
- package/src/adapters/mysql/tools/spatial/geometry.ts +23 -7
- package/src/adapters/mysql/tools/spatial/operations.ts +60 -31
- package/src/adapters/mysql/tools/spatial/queries.ts +142 -65
- package/src/adapters/mysql/tools/spatial/setup.ts +121 -55
- package/src/adapters/mysql/tools/stats/__tests__/comparative.test.ts +12 -10
- package/src/adapters/mysql/tools/stats/comparative.ts +150 -98
- package/src/adapters/mysql/tools/stats/descriptive.ts +204 -127
- package/src/adapters/mysql/tools/sysschema/__tests__/error-paths.test.ts +222 -0
- package/src/adapters/mysql/tools/sysschema/__tests__/performance.test.ts +45 -0
- package/src/adapters/mysql/tools/sysschema/__tests__/resources.test.ts +6 -3
- package/src/adapters/mysql/tools/sysschema/activity.ts +52 -27
- package/src/adapters/mysql/tools/sysschema/performance.ts +132 -68
- package/src/adapters/mysql/tools/sysschema/resources.ts +105 -67
- package/src/adapters/mysql/tools/text/__tests__/fulltext.test.ts +45 -17
- package/src/adapters/mysql/tools/text/fulltext.ts +27 -38
- package/src/adapters/mysql/tools/transactions.ts +49 -24
- package/src/adapters/mysql/types/proxysql-types.ts +38 -1
- package/src/adapters/mysql/types/router-types.ts +1 -1
- package/src/adapters/mysql/types/shell-types.ts +2 -2
- package/src/adapters/mysql/types.ts +632 -19
- package/src/auth/__tests__/scopes.test.ts +2 -2
- package/src/auth/scopes.ts +1 -1
- package/src/codemode/__tests__/api.test.ts +417 -0
- package/src/codemode/__tests__/sandbox-factory.test.ts +158 -0
- package/src/codemode/__tests__/sandbox.test.ts +301 -0
- package/src/codemode/__tests__/security.test.ts +368 -0
- package/src/codemode/__tests__/worker-sandbox.test.ts +179 -0
- package/src/codemode/__tests__/worker-script.test.ts +226 -0
- package/src/codemode/api.ts +89 -5
- package/src/codemode/sandbox-factory.ts +1 -1
- package/src/codemode/types.ts +34 -0
- package/src/codemode/worker-sandbox.ts +74 -7
- package/src/codemode/worker-script.ts +157 -86
- package/src/constants/ServerInstructions.ts +37 -31
- package/src/filtering/ToolConstants.ts +1 -2
- package/src/filtering/__tests__/ToolFilter.test.ts +9 -9
- package/src/pool/ConnectionPool.ts +4 -1
- package/src/transports/__tests__/http.test.ts +15 -3
- package/src/transports/http.ts +12 -0
- package/src/utils/validators.ts +2 -1
- package/vitest.config.ts +3 -1
- package/CODE_MODE.md +0 -245
|
@@ -4,33 +4,49 @@
|
|
|
4
4
|
* Tools for security auditing, firewall monitoring, and compliance.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import { z } from "zod";
|
|
7
|
+
import { z, ZodError } from "zod";
|
|
8
8
|
import type { MySQLAdapter } from "../../MySQLAdapter.js";
|
|
9
9
|
import type {
|
|
10
10
|
ToolDefinition,
|
|
11
11
|
RequestContext,
|
|
12
12
|
} from "../../../../types/index.js";
|
|
13
13
|
|
|
14
|
+
// =============================================================================
|
|
15
|
+
// Helpers
|
|
16
|
+
// =============================================================================
|
|
17
|
+
|
|
18
|
+
/** Extract human-readable messages from a ZodError instead of raw JSON array */
|
|
19
|
+
function formatZodError(error: ZodError): string {
|
|
20
|
+
return error.issues.map((i) => i.message).join("; ");
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** Strip verbose adapter prefixes from error messages */
|
|
24
|
+
function stripErrorPrefix(msg: string): string {
|
|
25
|
+
return msg
|
|
26
|
+
.replace(/^Query failed:\s*/i, "")
|
|
27
|
+
.replace(/^Execute failed:\s*/i, "")
|
|
28
|
+
.trim();
|
|
29
|
+
}
|
|
30
|
+
|
|
14
31
|
// =============================================================================
|
|
15
32
|
// Zod Schemas
|
|
16
33
|
// ============================================================================
|
|
17
34
|
|
|
18
35
|
const AuditLogSchema = z.object({
|
|
19
|
-
limit: z.number().default(
|
|
36
|
+
limit: z.number().default(20).describe("Maximum number of records"),
|
|
20
37
|
user: z.string().optional().describe("Filter by username"),
|
|
21
38
|
eventType: z
|
|
22
39
|
.string()
|
|
23
40
|
.optional()
|
|
24
|
-
.describe(
|
|
41
|
+
.describe(
|
|
42
|
+
'Filter by event type (e.g., "Execute", "Ping", "begin"). Uses LIKE matching against performance_schema EVENT_NAME.',
|
|
43
|
+
),
|
|
25
44
|
startTime: z.string().optional().describe("Start time filter (ISO 8601)"),
|
|
26
45
|
});
|
|
27
46
|
|
|
28
47
|
const FirewallRulesSchema = z.object({
|
|
29
48
|
user: z.string().optional().describe("Filter by username"),
|
|
30
|
-
mode: z
|
|
31
|
-
.enum(["RECORDING", "PROTECTING", "DETECTING", "OFF"])
|
|
32
|
-
.optional()
|
|
33
|
-
.describe("Filter by mode"),
|
|
49
|
+
mode: z.string().optional().describe("Filter by mode"),
|
|
34
50
|
});
|
|
35
51
|
|
|
36
52
|
// =============================================================================
|
|
@@ -54,11 +70,10 @@ export function createSecurityAuditTool(adapter: MySQLAdapter): ToolDefinition {
|
|
|
54
70
|
idempotentHint: true,
|
|
55
71
|
},
|
|
56
72
|
handler: async (params: unknown, _context: RequestContext) => {
|
|
57
|
-
const { limit, user, eventType, startTime } =
|
|
58
|
-
AuditLogSchema.parse(params);
|
|
59
|
-
|
|
60
73
|
// First check if audit log table exists
|
|
61
74
|
try {
|
|
75
|
+
const { limit, user, eventType, startTime } =
|
|
76
|
+
AuditLogSchema.parse(params);
|
|
62
77
|
const checkResult = await adapter.executeQuery(`
|
|
63
78
|
SELECT TABLE_NAME
|
|
64
79
|
FROM information_schema.TABLES
|
|
@@ -70,36 +85,59 @@ export function createSecurityAuditTool(adapter: MySQLAdapter): ToolDefinition {
|
|
|
70
85
|
// Try performance_schema alternative
|
|
71
86
|
let query = `
|
|
72
87
|
SELECT
|
|
73
|
-
EVENT_NAME as event,
|
|
74
|
-
OBJECT_TYPE as objectType,
|
|
75
|
-
OBJECT_NAME as objectName,
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
TIMER_START as startTime
|
|
79
|
-
FROM performance_schema.events_statements_history
|
|
88
|
+
e.EVENT_NAME as event,
|
|
89
|
+
e.OBJECT_TYPE as objectType,
|
|
90
|
+
e.OBJECT_NAME as objectName,
|
|
91
|
+
t.PROCESSLIST_USER as user,
|
|
92
|
+
t.PROCESSLIST_HOST as host,
|
|
93
|
+
e.TIMER_START as startTime
|
|
94
|
+
FROM performance_schema.events_statements_history e
|
|
95
|
+
JOIN performance_schema.threads t
|
|
96
|
+
ON e.THREAD_ID = t.THREAD_ID
|
|
80
97
|
`;
|
|
81
98
|
|
|
82
99
|
const conditions: string[] = [];
|
|
83
|
-
const
|
|
100
|
+
const filtersApplied: string[] = [];
|
|
101
|
+
const filtersIgnored: string[] = [];
|
|
84
102
|
|
|
85
103
|
if (user) {
|
|
86
|
-
|
|
87
|
-
|
|
104
|
+
// Safe: escape single quotes in user input for LIKE clause
|
|
105
|
+
const escaped = user.replace(/'/g, "''");
|
|
106
|
+
conditions.push(`t.PROCESSLIST_USER LIKE '%${escaped}%'`);
|
|
107
|
+
filtersApplied.push("user");
|
|
108
|
+
}
|
|
109
|
+
if (eventType) {
|
|
110
|
+
const escaped = eventType.replace(/'/g, "''");
|
|
111
|
+
conditions.push(`e.EVENT_NAME LIKE '%${escaped}%'`);
|
|
112
|
+
filtersApplied.push("eventType");
|
|
113
|
+
}
|
|
114
|
+
if (startTime) {
|
|
115
|
+
// TIMER_START is a picosecond counter, not an ISO timestamp —
|
|
116
|
+
// this filter is best-effort and unlikely to match user intent.
|
|
117
|
+
filtersIgnored.push("startTime");
|
|
88
118
|
}
|
|
89
119
|
|
|
90
120
|
if (conditions.length > 0) {
|
|
91
121
|
query += " WHERE " + conditions.join(" AND ");
|
|
92
122
|
}
|
|
93
123
|
|
|
94
|
-
|
|
124
|
+
// limit is Zod-validated as z.number(), safe to interpolate.
|
|
125
|
+
// performance_schema does not support prepared statement parameters.
|
|
126
|
+
query += ` ORDER BY e.TIMER_START DESC LIMIT ${limit}`;
|
|
95
127
|
|
|
96
|
-
const result = await adapter.executeQuery(query,
|
|
97
|
-
|
|
128
|
+
const result = await adapter.executeQuery(query, []);
|
|
129
|
+
const response: Record<string, unknown> = {
|
|
98
130
|
source: "performance_schema",
|
|
99
131
|
message: "Using performance_schema as audit log is not available",
|
|
100
132
|
events: result.rows ?? [],
|
|
101
133
|
count: result.rows?.length ?? 0,
|
|
102
134
|
};
|
|
135
|
+
if (filtersIgnored.length > 0) {
|
|
136
|
+
response["filtersIgnored"] = filtersIgnored;
|
|
137
|
+
response["note"] =
|
|
138
|
+
"startTime filter not applied: performance_schema uses picosecond counters, not ISO timestamps";
|
|
139
|
+
}
|
|
140
|
+
return response;
|
|
103
141
|
}
|
|
104
142
|
|
|
105
143
|
// Query actual audit log
|
|
@@ -128,7 +166,8 @@ export function createSecurityAuditTool(adapter: MySQLAdapter): ToolDefinition {
|
|
|
128
166
|
query += " WHERE " + conditions.join(" AND ");
|
|
129
167
|
}
|
|
130
168
|
|
|
131
|
-
query +=
|
|
169
|
+
query += " ORDER BY timestamp DESC LIMIT ?";
|
|
170
|
+
queryParams.push(limit);
|
|
132
171
|
|
|
133
172
|
const result = await adapter.executeQuery(query, queryParams);
|
|
134
173
|
return {
|
|
@@ -136,14 +175,28 @@ export function createSecurityAuditTool(adapter: MySQLAdapter): ToolDefinition {
|
|
|
136
175
|
events: result.rows ?? [],
|
|
137
176
|
count: result.rows?.length ?? 0,
|
|
138
177
|
};
|
|
139
|
-
} catch {
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
178
|
+
} catch (error: unknown) {
|
|
179
|
+
if (error instanceof ZodError) {
|
|
180
|
+
return { success: false, error: formatZodError(error) };
|
|
181
|
+
}
|
|
182
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
183
|
+
const stripped = stripErrorPrefix(msg);
|
|
184
|
+
const lower = stripped.toLowerCase();
|
|
185
|
+
if (
|
|
186
|
+
lower.includes("doesn't exist") ||
|
|
187
|
+
lower.includes("does not exist") ||
|
|
188
|
+
lower.includes("access denied")
|
|
189
|
+
) {
|
|
190
|
+
return {
|
|
191
|
+
success: false,
|
|
192
|
+
available: false,
|
|
193
|
+
error:
|
|
194
|
+
"Audit logging is not enabled. Install MySQL Enterprise Audit or Percona Audit plugin.",
|
|
195
|
+
suggestion:
|
|
196
|
+
'Install audit plugin with: INSTALL PLUGIN audit_log SONAME "audit_log.so"',
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
return { success: false, error: stripped };
|
|
147
200
|
}
|
|
148
201
|
},
|
|
149
202
|
};
|
|
@@ -203,11 +256,16 @@ export function createSecurityFirewallStatusTool(
|
|
|
203
256
|
plugins: pluginResult.rows,
|
|
204
257
|
configuration: variables,
|
|
205
258
|
};
|
|
206
|
-
} catch {
|
|
259
|
+
} catch (error) {
|
|
260
|
+
if (error instanceof ZodError) {
|
|
261
|
+
return { success: false, error: formatZodError(error) };
|
|
262
|
+
}
|
|
263
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
207
264
|
return {
|
|
265
|
+
success: false,
|
|
208
266
|
installed: false,
|
|
209
|
-
|
|
210
|
-
suggestion:
|
|
267
|
+
error: `Firewall plugin check failed: ${stripErrorPrefix(message)}`,
|
|
268
|
+
suggestion: stripErrorPrefix(message),
|
|
211
269
|
};
|
|
212
270
|
}
|
|
213
271
|
},
|
|
@@ -232,9 +290,21 @@ export function createSecurityFirewallRulesTool(
|
|
|
232
290
|
idempotentHint: true,
|
|
233
291
|
},
|
|
234
292
|
handler: async (params: unknown, _context: RequestContext) => {
|
|
235
|
-
const { user, mode } = FirewallRulesSchema.parse(params);
|
|
236
|
-
|
|
237
293
|
try {
|
|
294
|
+
const { user, mode } = FirewallRulesSchema.parse(params);
|
|
295
|
+
|
|
296
|
+
const validModes = [
|
|
297
|
+
"RECORDING",
|
|
298
|
+
"PROTECTING",
|
|
299
|
+
"DETECTING",
|
|
300
|
+
"OFF",
|
|
301
|
+
] as const;
|
|
302
|
+
if (mode && !validModes.includes(mode as (typeof validModes)[number])) {
|
|
303
|
+
return {
|
|
304
|
+
success: false,
|
|
305
|
+
error: `Invalid mode: '${mode}' — expected one of: ${validModes.join(", ")}`,
|
|
306
|
+
};
|
|
307
|
+
}
|
|
238
308
|
// Get firewall users
|
|
239
309
|
let usersQuery = `
|
|
240
310
|
SELECT USERHOST, MODE
|
|
@@ -280,10 +350,14 @@ export function createSecurityFirewallRulesTool(
|
|
|
280
350
|
userCount: usersResult.rows?.length ?? 0,
|
|
281
351
|
ruleCount: rulesResult.rows?.length ?? 0,
|
|
282
352
|
};
|
|
283
|
-
} catch {
|
|
353
|
+
} catch (error) {
|
|
354
|
+
if (error instanceof ZodError) {
|
|
355
|
+
return { success: false, error: formatZodError(error) };
|
|
356
|
+
}
|
|
284
357
|
return {
|
|
358
|
+
success: false,
|
|
285
359
|
available: false,
|
|
286
|
-
|
|
360
|
+
error:
|
|
287
361
|
"Firewall tables not accessible. Ensure MySQL Enterprise Firewall is installed and you have appropriate privileges.",
|
|
288
362
|
};
|
|
289
363
|
}
|