@neverinfamous/postgres-mcp 2.0.0 → 2.2.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/LICENSE +1 -1
- package/README.md +119 -46
- package/dist/__tests__/benchmarks/codemode.bench.js +3 -3
- package/dist/__tests__/benchmarks/codemode.bench.js.map +1 -1
- package/dist/__tests__/benchmarks/connection-pool.bench.js +3 -3
- package/dist/__tests__/benchmarks/connection-pool.bench.js.map +1 -1
- package/dist/__tests__/benchmarks/introspection-migration.bench.d.ts +11 -0
- package/dist/__tests__/benchmarks/introspection-migration.bench.d.ts.map +1 -0
- package/dist/__tests__/benchmarks/introspection-migration.bench.js +143 -0
- package/dist/__tests__/benchmarks/introspection-migration.bench.js.map +1 -0
- package/dist/__tests__/benchmarks/resource-prompts.bench.js +0 -64
- package/dist/__tests__/benchmarks/resource-prompts.bench.js.map +1 -1
- package/dist/__tests__/benchmarks/schema-parsing.bench.js +5 -5
- package/dist/__tests__/benchmarks/schema-parsing.bench.js.map +1 -1
- package/dist/__tests__/benchmarks/tool-filtering.bench.js +17 -8
- package/dist/__tests__/benchmarks/tool-filtering.bench.js.map +1 -1
- package/dist/__tests__/mocks/adapter.d.ts.map +1 -1
- package/dist/__tests__/mocks/adapter.js +2 -1
- package/dist/__tests__/mocks/adapter.js.map +1 -1
- package/dist/adapters/DatabaseAdapter.d.ts +6 -5
- package/dist/adapters/DatabaseAdapter.d.ts.map +1 -1
- package/dist/adapters/DatabaseAdapter.js +11 -20
- package/dist/adapters/DatabaseAdapter.js.map +1 -1
- package/dist/adapters/postgresql/PostgresAdapter.d.ts +5 -26
- package/dist/adapters/postgresql/PostgresAdapter.d.ts.map +1 -1
- package/dist/adapters/postgresql/PostgresAdapter.js +31 -526
- package/dist/adapters/postgresql/PostgresAdapter.js.map +1 -1
- package/dist/adapters/postgresql/prompts/index.js +1 -1
- package/dist/adapters/postgresql/prompts/index.js.map +1 -1
- package/dist/adapters/postgresql/resources/index.d.ts +1 -1
- package/dist/adapters/postgresql/resources/index.js +3 -3
- package/dist/adapters/postgresql/resources/index.js.map +1 -1
- package/dist/adapters/postgresql/schema-operations.d.ts +71 -0
- package/dist/adapters/postgresql/schema-operations.d.ts.map +1 -0
- package/dist/adapters/postgresql/schema-operations.js +561 -0
- package/dist/adapters/postgresql/schema-operations.js.map +1 -0
- package/dist/adapters/postgresql/schemas/admin.d.ts +4 -4
- package/dist/adapters/postgresql/schemas/admin.js +4 -4
- package/dist/adapters/postgresql/schemas/admin.js.map +1 -1
- package/dist/adapters/postgresql/schemas/backup.d.ts +2 -2
- package/dist/adapters/postgresql/schemas/backup.d.ts.map +1 -1
- package/dist/adapters/postgresql/schemas/backup.js +1 -3
- package/dist/adapters/postgresql/schemas/backup.js.map +1 -1
- package/dist/adapters/postgresql/schemas/core/index.d.ts +6 -0
- package/dist/adapters/postgresql/schemas/core/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/core/index.js +6 -0
- package/dist/adapters/postgresql/schemas/core/index.js.map +1 -0
- package/dist/adapters/postgresql/schemas/{core.d.ts → core/queries.d.ts} +16 -171
- package/dist/adapters/postgresql/schemas/core/queries.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/{core.js → core/queries.js} +5 -213
- package/dist/adapters/postgresql/schemas/core/queries.js.map +1 -0
- package/dist/adapters/postgresql/schemas/core/transactions.d.ts +149 -0
- package/dist/adapters/postgresql/schemas/core/transactions.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/core/transactions.js +239 -0
- package/dist/adapters/postgresql/schemas/core/transactions.js.map +1 -0
- package/dist/adapters/postgresql/schemas/cron.d.ts +12 -12
- package/dist/adapters/postgresql/schemas/cron.d.ts.map +1 -1
- package/dist/adapters/postgresql/schemas/cron.js +38 -10
- package/dist/adapters/postgresql/schemas/cron.js.map +1 -1
- package/dist/adapters/postgresql/schemas/extensions/citext.d.ts +222 -0
- package/dist/adapters/postgresql/schemas/extensions/citext.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/extensions/citext.js +306 -0
- package/dist/adapters/postgresql/schemas/extensions/citext.js.map +1 -0
- package/dist/adapters/postgresql/schemas/extensions/index.d.ts +15 -0
- package/dist/adapters/postgresql/schemas/extensions/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/extensions/index.js +20 -0
- package/dist/adapters/postgresql/schemas/extensions/index.js.map +1 -0
- package/dist/adapters/postgresql/schemas/extensions/kcache.d.ts +164 -0
- package/dist/adapters/postgresql/schemas/extensions/kcache.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/extensions/kcache.js +225 -0
- package/dist/adapters/postgresql/schemas/extensions/kcache.js.map +1 -0
- package/dist/adapters/postgresql/schemas/extensions/ltree.d.ts +253 -0
- package/dist/adapters/postgresql/schemas/extensions/ltree.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/extensions/ltree.js +430 -0
- package/dist/adapters/postgresql/schemas/extensions/ltree.js.map +1 -0
- package/dist/adapters/postgresql/schemas/extensions/pgcrypto.d.ts +251 -0
- package/dist/adapters/postgresql/schemas/extensions/pgcrypto.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/extensions/pgcrypto.js +294 -0
- package/dist/adapters/postgresql/schemas/extensions/pgcrypto.js.map +1 -0
- package/dist/adapters/postgresql/schemas/extensions/shared.d.ts +10 -0
- package/dist/adapters/postgresql/schemas/extensions/shared.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/extensions/shared.js +15 -0
- package/dist/adapters/postgresql/schemas/extensions/shared.js.map +1 -0
- package/dist/adapters/postgresql/schemas/index.d.ts +6 -6
- package/dist/adapters/postgresql/schemas/index.d.ts.map +1 -1
- package/dist/adapters/postgresql/schemas/index.js +8 -8
- package/dist/adapters/postgresql/schemas/index.js.map +1 -1
- package/dist/adapters/postgresql/schemas/introspection.d.ts +19 -42
- package/dist/adapters/postgresql/schemas/introspection.d.ts.map +1 -1
- package/dist/adapters/postgresql/schemas/introspection.js +72 -27
- package/dist/adapters/postgresql/schemas/introspection.js.map +1 -1
- package/dist/adapters/postgresql/schemas/jsonb/advanced.d.ts +270 -0
- package/dist/adapters/postgresql/schemas/jsonb/advanced.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/jsonb/advanced.js +371 -0
- package/dist/adapters/postgresql/schemas/jsonb/advanced.js.map +1 -0
- package/dist/adapters/postgresql/schemas/jsonb/basic.d.ts +283 -0
- package/dist/adapters/postgresql/schemas/jsonb/basic.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/jsonb/basic.js +456 -0
- package/dist/adapters/postgresql/schemas/jsonb/basic.js.map +1 -0
- package/dist/adapters/postgresql/schemas/jsonb/index.d.ts +6 -0
- package/dist/adapters/postgresql/schemas/jsonb/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/jsonb/index.js +6 -0
- package/dist/adapters/postgresql/schemas/jsonb/index.js.map +1 -0
- package/dist/adapters/postgresql/schemas/monitoring.d.ts +4 -4
- package/dist/adapters/postgresql/schemas/monitoring.js +2 -2
- package/dist/adapters/postgresql/schemas/monitoring.js.map +1 -1
- package/dist/adapters/postgresql/schemas/partitioning.d.ts +14 -14
- package/dist/adapters/postgresql/schemas/partitioning.d.ts.map +1 -1
- package/dist/adapters/postgresql/schemas/partitioning.js +64 -46
- package/dist/adapters/postgresql/schemas/partitioning.js.map +1 -1
- package/dist/adapters/postgresql/schemas/partman.d.ts +16 -14
- package/dist/adapters/postgresql/schemas/partman.d.ts.map +1 -1
- package/dist/adapters/postgresql/schemas/partman.js +9 -9
- package/dist/adapters/postgresql/schemas/partman.js.map +1 -1
- package/dist/adapters/postgresql/schemas/postgis/advanced.d.ts +429 -0
- package/dist/adapters/postgresql/schemas/postgis/advanced.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/postgis/advanced.js +495 -0
- package/dist/adapters/postgresql/schemas/postgis/advanced.js.map +1 -0
- package/dist/adapters/postgresql/schemas/{postgis.d.ts → postgis/basic.d.ts} +1 -423
- package/dist/adapters/postgresql/schemas/postgis/basic.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/{postgis.js → postgis/basic.js} +1 -486
- package/dist/adapters/postgresql/schemas/postgis/basic.js.map +1 -0
- package/dist/adapters/postgresql/schemas/postgis/index.d.ts +6 -0
- package/dist/adapters/postgresql/schemas/postgis/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/postgis/index.js +6 -0
- package/dist/adapters/postgresql/schemas/postgis/index.js.map +1 -0
- package/dist/adapters/postgresql/schemas/schema-mgmt.d.ts +35 -25
- package/dist/adapters/postgresql/schemas/schema-mgmt.d.ts.map +1 -1
- package/dist/adapters/postgresql/schemas/schema-mgmt.js +57 -19
- package/dist/adapters/postgresql/schemas/schema-mgmt.js.map +1 -1
- package/dist/adapters/postgresql/schemas/stats/index.d.ts +6 -0
- package/dist/adapters/postgresql/schemas/stats/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/stats/index.js +6 -0
- package/dist/adapters/postgresql/schemas/stats/index.js.map +1 -0
- package/dist/adapters/postgresql/schemas/stats/input.d.ts +260 -0
- package/dist/adapters/postgresql/schemas/stats/input.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/{stats.js → stats/input.js} +2 -331
- package/dist/adapters/postgresql/schemas/stats/input.js.map +1 -0
- package/dist/adapters/postgresql/schemas/{stats.d.ts → stats/output.d.ts} +3 -246
- package/dist/adapters/postgresql/schemas/stats/output.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/stats/output.js +334 -0
- package/dist/adapters/postgresql/schemas/stats/output.js.map +1 -0
- package/dist/adapters/postgresql/schemas/text-search.d.ts +18 -18
- package/dist/adapters/postgresql/schemas/text-search.d.ts.map +1 -1
- package/dist/adapters/postgresql/schemas/text-search.js +12 -27
- package/dist/adapters/postgresql/schemas/text-search.js.map +1 -1
- package/dist/adapters/postgresql/schemas/vector.d.ts +10 -10
- package/dist/adapters/postgresql/schemas/vector.d.ts.map +1 -1
- package/dist/adapters/postgresql/schemas/vector.js +9 -15
- package/dist/adapters/postgresql/schemas/vector.js.map +1 -1
- package/dist/adapters/postgresql/tools/backup/dump.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/backup/dump.js +95 -76
- package/dist/adapters/postgresql/tools/backup/dump.js.map +1 -1
- package/dist/adapters/postgresql/tools/backup/planning.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/backup/planning.js +345 -287
- package/dist/adapters/postgresql/tools/backup/planning.js.map +1 -1
- package/dist/adapters/postgresql/tools/citext/analysis.d.ts +24 -0
- package/dist/adapters/postgresql/tools/citext/analysis.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/{citext.js → citext/analysis.js} +50 -232
- package/dist/adapters/postgresql/tools/citext/analysis.js.map +1 -0
- package/dist/adapters/postgresql/tools/citext/index.d.ts +15 -0
- package/dist/adapters/postgresql/tools/citext/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/citext/index.js +23 -0
- package/dist/adapters/postgresql/tools/citext/index.js.map +1 -0
- package/dist/adapters/postgresql/tools/citext/setup.d.ts +16 -0
- package/dist/adapters/postgresql/tools/citext/setup.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/citext/setup.js +193 -0
- package/dist/adapters/postgresql/tools/citext/setup.js.map +1 -0
- package/dist/adapters/postgresql/tools/codemode/index.js +1 -1
- package/dist/adapters/postgresql/tools/codemode/index.js.map +1 -1
- package/dist/adapters/postgresql/tools/core/convenience.d.ts +12 -22
- package/dist/adapters/postgresql/tools/core/convenience.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/core/convenience.js +100 -210
- package/dist/adapters/postgresql/tools/core/convenience.js.map +1 -1
- package/dist/adapters/postgresql/tools/core/error-helpers.d.ts +1 -0
- package/dist/adapters/postgresql/tools/core/error-helpers.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/core/error-helpers.js +8 -1
- package/dist/adapters/postgresql/tools/core/error-helpers.js.map +1 -1
- package/dist/adapters/postgresql/tools/core/health.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/core/health.js +124 -114
- package/dist/adapters/postgresql/tools/core/health.js.map +1 -1
- package/dist/adapters/postgresql/tools/core/index.d.ts +2 -1
- package/dist/adapters/postgresql/tools/core/index.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/core/index.js +3 -2
- package/dist/adapters/postgresql/tools/core/index.js.map +1 -1
- package/dist/adapters/postgresql/tools/core/indexes.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/core/indexes.js +151 -127
- package/dist/adapters/postgresql/tools/core/indexes.js.map +1 -1
- package/dist/adapters/postgresql/tools/core/objects.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/core/objects.js +186 -161
- package/dist/adapters/postgresql/tools/core/objects.js.map +1 -1
- package/dist/adapters/postgresql/tools/core/query.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/core/query.js +37 -25
- package/dist/adapters/postgresql/tools/core/query.js.map +1 -1
- package/dist/adapters/postgresql/tools/core/schemas.d.ts +6 -3
- package/dist/adapters/postgresql/tools/core/schemas.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/core/schemas.js +11 -2
- package/dist/adapters/postgresql/tools/core/schemas.js.map +1 -1
- package/dist/adapters/postgresql/tools/core/tables.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/core/tables.js +156 -129
- package/dist/adapters/postgresql/tools/core/tables.js.map +1 -1
- package/dist/adapters/postgresql/tools/core/utility.d.ts +26 -0
- package/dist/adapters/postgresql/tools/core/utility.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/core/utility.js +174 -0
- package/dist/adapters/postgresql/tools/core/utility.js.map +1 -0
- package/dist/adapters/postgresql/tools/cron.js +90 -43
- package/dist/adapters/postgresql/tools/cron.js.map +1 -1
- package/dist/adapters/postgresql/tools/introspection/analysis.d.ts +12 -0
- package/dist/adapters/postgresql/tools/introspection/analysis.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/introspection/analysis.js +605 -0
- package/dist/adapters/postgresql/tools/introspection/analysis.js.map +1 -0
- package/dist/adapters/postgresql/tools/introspection/graph.d.ts +55 -0
- package/dist/adapters/postgresql/tools/introspection/graph.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/introspection/graph.js +621 -0
- package/dist/adapters/postgresql/tools/introspection/graph.js.map +1 -0
- package/dist/adapters/postgresql/tools/introspection/index.d.ts +21 -0
- package/dist/adapters/postgresql/tools/introspection/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/introspection/index.js +31 -0
- package/dist/adapters/postgresql/tools/introspection/index.js.map +1 -0
- package/dist/adapters/postgresql/tools/introspection/migration.d.ts +15 -0
- package/dist/adapters/postgresql/tools/introspection/migration.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/introspection/migration.js +575 -0
- package/dist/adapters/postgresql/tools/introspection/migration.js.map +1 -0
- package/dist/adapters/postgresql/tools/jsonb/analytics.d.ts +20 -0
- package/dist/adapters/postgresql/tools/jsonb/analytics.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/jsonb/analytics.js +367 -0
- package/dist/adapters/postgresql/tools/jsonb/analytics.js.map +1 -0
- package/dist/adapters/postgresql/tools/jsonb/index.d.ts +4 -2
- package/dist/adapters/postgresql/tools/jsonb/index.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/jsonb/index.js +8 -4
- package/dist/adapters/postgresql/tools/jsonb/index.js.map +1 -1
- package/dist/adapters/postgresql/tools/jsonb/read.d.ts +38 -0
- package/dist/adapters/postgresql/tools/jsonb/read.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/jsonb/{basic.js → read.js} +41 -482
- package/dist/adapters/postgresql/tools/jsonb/read.js.map +1 -0
- package/dist/adapters/postgresql/tools/jsonb/{advanced.d.ts → transform.d.ts} +1 -13
- package/dist/adapters/postgresql/tools/jsonb/transform.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/jsonb/{advanced.js → transform.js} +26 -357
- package/dist/adapters/postgresql/tools/jsonb/transform.js.map +1 -0
- package/dist/adapters/postgresql/tools/jsonb/write.d.ts +14 -0
- package/dist/adapters/postgresql/tools/jsonb/write.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/jsonb/write.js +468 -0
- package/dist/adapters/postgresql/tools/jsonb/write.js.map +1 -0
- package/dist/adapters/postgresql/tools/kcache.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/kcache.js +116 -51
- package/dist/adapters/postgresql/tools/kcache.js.map +1 -1
- package/dist/adapters/postgresql/tools/ltree.js +346 -260
- package/dist/adapters/postgresql/tools/ltree.js.map +1 -1
- package/dist/adapters/postgresql/tools/migration/index.d.ts +15 -0
- package/dist/adapters/postgresql/tools/migration/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/migration/index.js +23 -0
- package/dist/adapters/postgresql/tools/migration/index.js.map +1 -0
- package/dist/adapters/postgresql/tools/monitoring/analysis.d.ts +15 -0
- package/dist/adapters/postgresql/tools/monitoring/analysis.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/{monitoring.js → monitoring/analysis.js} +24 -359
- package/dist/adapters/postgresql/tools/monitoring/analysis.js.map +1 -0
- package/dist/adapters/postgresql/tools/monitoring/basic.d.ts +17 -0
- package/dist/adapters/postgresql/tools/monitoring/basic.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/monitoring/basic.js +432 -0
- package/dist/adapters/postgresql/tools/monitoring/basic.js.map +1 -0
- package/dist/adapters/postgresql/tools/monitoring/index.d.ts +16 -0
- package/dist/adapters/postgresql/tools/monitoring/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/monitoring/index.js +31 -0
- package/dist/adapters/postgresql/tools/monitoring/index.js.map +1 -0
- package/dist/adapters/postgresql/tools/partitioning/index.d.ts +15 -0
- package/dist/adapters/postgresql/tools/partitioning/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/partitioning/index.js +23 -0
- package/dist/adapters/postgresql/tools/partitioning/index.js.map +1 -0
- package/dist/adapters/postgresql/tools/partitioning/info.d.ts +11 -0
- package/dist/adapters/postgresql/tools/partitioning/info.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/partitioning/info.js +302 -0
- package/dist/adapters/postgresql/tools/partitioning/info.js.map +1 -0
- package/dist/adapters/postgresql/tools/partitioning/management.d.ts +28 -0
- package/dist/adapters/postgresql/tools/partitioning/management.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/{partitioning.js → partitioning/management.js} +48 -307
- package/dist/adapters/postgresql/tools/partitioning/management.js.map +1 -0
- package/dist/adapters/postgresql/tools/partman/helpers.d.ts +29 -0
- package/dist/adapters/postgresql/tools/partman/helpers.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/partman/helpers.js +59 -0
- package/dist/adapters/postgresql/tools/partman/helpers.js.map +1 -0
- package/dist/adapters/postgresql/tools/partman/index.d.ts +2 -1
- package/dist/adapters/postgresql/tools/partman/index.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/partman/index.js +4 -2
- package/dist/adapters/postgresql/tools/partman/index.js.map +1 -1
- package/dist/adapters/postgresql/tools/partman/maintenance.d.ts +20 -0
- package/dist/adapters/postgresql/tools/partman/maintenance.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/partman/maintenance.js +496 -0
- package/dist/adapters/postgresql/tools/partman/maintenance.js.map +1 -0
- package/dist/adapters/postgresql/tools/partman/management.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/partman/management.js +438 -383
- package/dist/adapters/postgresql/tools/partman/management.js.map +1 -1
- package/dist/adapters/postgresql/tools/partman/operations.d.ts +1 -13
- package/dist/adapters/postgresql/tools/partman/operations.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/partman/operations.js +171 -652
- package/dist/adapters/postgresql/tools/partman/operations.js.map +1 -1
- package/dist/adapters/postgresql/tools/performance/analysis.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/performance/analysis.js +69 -42
- package/dist/adapters/postgresql/tools/performance/analysis.js.map +1 -1
- package/dist/adapters/postgresql/tools/performance/anomaly-detection.d.ts +18 -0
- package/dist/adapters/postgresql/tools/performance/anomaly-detection.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/performance/anomaly-detection.js +533 -0
- package/dist/adapters/postgresql/tools/performance/anomaly-detection.js.map +1 -0
- package/dist/adapters/postgresql/tools/performance/diagnostics.d.ts +11 -0
- package/dist/adapters/postgresql/tools/performance/diagnostics.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/performance/diagnostics.js +332 -0
- package/dist/adapters/postgresql/tools/performance/diagnostics.js.map +1 -0
- package/dist/adapters/postgresql/tools/performance/index.d.ts +1 -1
- package/dist/adapters/postgresql/tools/performance/index.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/performance/index.js +7 -1
- package/dist/adapters/postgresql/tools/performance/index.js.map +1 -1
- package/dist/adapters/postgresql/tools/performance/monitoring.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/performance/monitoring.js +80 -55
- package/dist/adapters/postgresql/tools/performance/monitoring.js.map +1 -1
- package/dist/adapters/postgresql/tools/performance/optimization.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/performance/optimization.js +18 -11
- package/dist/adapters/postgresql/tools/performance/optimization.js.map +1 -1
- package/dist/adapters/postgresql/tools/performance/stats.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/performance/stats.js +439 -318
- package/dist/adapters/postgresql/tools/performance/stats.js.map +1 -1
- package/dist/adapters/postgresql/tools/pgcrypto.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/pgcrypto.js +45 -77
- package/dist/adapters/postgresql/tools/pgcrypto.js.map +1 -1
- package/dist/adapters/postgresql/tools/postgis/basic.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/postgis/basic.js +121 -93
- package/dist/adapters/postgresql/tools/postgis/basic.js.map +1 -1
- package/dist/adapters/postgresql/tools/schema/index.d.ts +16 -0
- package/dist/adapters/postgresql/tools/schema/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/schema/index.js +32 -0
- package/dist/adapters/postgresql/tools/schema/index.js.map +1 -0
- package/dist/adapters/postgresql/tools/schema/objects.d.ts +15 -0
- package/dist/adapters/postgresql/tools/schema/objects.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/schema/objects.js +378 -0
- package/dist/adapters/postgresql/tools/schema/objects.js.map +1 -0
- package/dist/adapters/postgresql/tools/schema/views.d.ts +15 -0
- package/dist/adapters/postgresql/tools/schema/views.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/{schema.js → schema/views.js} +64 -386
- package/dist/adapters/postgresql/tools/schema/views.js.map +1 -0
- package/dist/adapters/postgresql/tools/stats/advanced.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/stats/advanced.js +1 -218
- package/dist/adapters/postgresql/tools/stats/advanced.js.map +1 -1
- package/dist/adapters/postgresql/tools/stats/math-utils.d.ts +33 -0
- package/dist/adapters/postgresql/tools/stats/math-utils.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/stats/math-utils.js +225 -0
- package/dist/adapters/postgresql/tools/stats/math-utils.js.map +1 -0
- package/dist/adapters/postgresql/tools/text/index.d.ts +16 -0
- package/dist/adapters/postgresql/tools/text/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/text/index.js +33 -0
- package/dist/adapters/postgresql/tools/text/index.js.map +1 -0
- package/dist/adapters/postgresql/tools/text/matching.d.ts +17 -0
- package/dist/adapters/postgresql/tools/text/matching.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/text/matching.js +565 -0
- package/dist/adapters/postgresql/tools/text/matching.js.map +1 -0
- package/dist/adapters/postgresql/tools/text/search.d.ts +17 -0
- package/dist/adapters/postgresql/tools/text/search.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/text/search.js +653 -0
- package/dist/adapters/postgresql/tools/text/search.js.map +1 -0
- package/dist/adapters/postgresql/tools/transactions.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/transactions.js +11 -27
- package/dist/adapters/postgresql/tools/transactions.js.map +1 -1
- package/dist/adapters/postgresql/tools/vector/{basic.d.ts → data.d.ts} +10 -8
- package/dist/adapters/postgresql/tools/vector/data.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/vector/data.js +540 -0
- package/dist/adapters/postgresql/tools/vector/data.js.map +1 -0
- package/dist/adapters/postgresql/tools/vector/index.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/vector/index.js +6 -2
- package/dist/adapters/postgresql/tools/vector/index.js.map +1 -1
- package/dist/adapters/postgresql/tools/vector/management.d.ts +11 -0
- package/dist/adapters/postgresql/tools/vector/management.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/vector/management.js +425 -0
- package/dist/adapters/postgresql/tools/vector/management.js.map +1 -0
- package/dist/adapters/postgresql/tools/vector/query.d.ts +14 -0
- package/dist/adapters/postgresql/tools/vector/query.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/vector/query.js +767 -0
- package/dist/adapters/postgresql/tools/vector/query.js.map +1 -0
- package/dist/adapters/postgresql/tools/vector/{advanced.d.ts → search-advanced.d.ts} +4 -5
- package/dist/adapters/postgresql/tools/vector/search-advanced.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/vector/search-advanced.js +626 -0
- package/dist/adapters/postgresql/tools/vector/search-advanced.js.map +1 -0
- package/dist/auth/scopes.d.ts.map +1 -1
- package/dist/auth/scopes.js +3 -1
- package/dist/auth/scopes.js.map +1 -1
- package/dist/cli/args.d.ts +3 -2
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +4 -3
- package/dist/cli/args.js.map +1 -1
- package/dist/cli.js +16 -4
- package/dist/cli.js.map +1 -1
- package/dist/codemode/api/aliases.d.ts +14 -0
- package/dist/codemode/api/aliases.d.ts.map +1 -0
- package/dist/codemode/api/aliases.js +503 -0
- package/dist/codemode/api/aliases.js.map +1 -0
- package/dist/codemode/api/group-api.d.ts +23 -0
- package/dist/codemode/api/group-api.d.ts.map +1 -0
- package/dist/codemode/api/group-api.js +179 -0
- package/dist/codemode/api/group-api.js.map +1 -0
- package/dist/codemode/{api.d.ts → api/index.d.ts} +5 -4
- package/dist/codemode/api/index.d.ts.map +1 -0
- package/dist/codemode/api/index.js +195 -0
- package/dist/codemode/api/index.js.map +1 -0
- package/dist/codemode/api/maps.d.ts +47 -0
- package/dist/codemode/api/maps.d.ts.map +1 -0
- package/dist/codemode/api/maps.js +529 -0
- package/dist/codemode/api/maps.js.map +1 -0
- package/dist/codemode/api/normalize.d.ts +13 -0
- package/dist/codemode/api/normalize.d.ts.map +1 -0
- package/dist/codemode/api/normalize.js +120 -0
- package/dist/codemode/api/normalize.js.map +1 -0
- package/dist/codemode/index.d.ts +1 -1
- package/dist/codemode/index.d.ts.map +1 -1
- package/dist/codemode/index.js +1 -1
- package/dist/codemode/index.js.map +1 -1
- package/dist/codemode/sandbox.d.ts.map +1 -1
- package/dist/codemode/sandbox.js +8 -25
- package/dist/codemode/sandbox.js.map +1 -1
- package/dist/filtering/ToolConstants.d.ts +11 -11
- package/dist/filtering/ToolConstants.d.ts.map +1 -1
- package/dist/filtering/ToolConstants.js +28 -15
- package/dist/filtering/ToolConstants.js.map +1 -1
- package/dist/filtering/ToolFilter.d.ts +0 -32
- package/dist/filtering/ToolFilter.d.ts.map +1 -1
- package/dist/filtering/ToolFilter.js +0 -43
- package/dist/filtering/ToolFilter.js.map +1 -1
- package/dist/server/McpServer.d.ts +1 -1
- package/dist/server/McpServer.d.ts.map +1 -1
- package/dist/server/McpServer.js +1 -2
- package/dist/server/McpServer.js.map +1 -1
- package/dist/transports/http.d.ts +55 -10
- package/dist/transports/http.d.ts.map +1 -1
- package/dist/transports/http.js +301 -50
- package/dist/transports/http.js.map +1 -1
- package/dist/types/filtering.d.ts +1 -1
- package/dist/types/filtering.d.ts.map +1 -1
- package/dist/types/index.d.ts +2 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/mcp.d.ts +0 -21
- package/dist/types/mcp.d.ts.map +1 -1
- package/dist/types/schema.d.ts +0 -79
- package/dist/types/schema.d.ts.map +1 -1
- package/dist/utils/fts-config.d.ts +0 -6
- package/dist/utils/fts-config.d.ts.map +1 -1
- package/dist/utils/fts-config.js +1 -1
- package/dist/utils/fts-config.js.map +1 -1
- package/dist/utils/icons.d.ts.map +1 -1
- package/dist/utils/icons.js +5 -0
- package/dist/utils/icons.js.map +1 -1
- package/dist/utils/identifiers.d.ts.map +1 -1
- package/dist/utils/identifiers.js +6 -6
- package/dist/utils/identifiers.js.map +1 -1
- package/dist/utils/logger.d.ts +6 -6
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +18 -15
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/progress-utils.d.ts +3 -14
- package/dist/utils/progress-utils.d.ts.map +1 -1
- package/dist/utils/progress-utils.js +2 -21
- package/dist/utils/progress-utils.js.map +1 -1
- package/dist/utils/version.d.ts +9 -0
- package/dist/utils/version.d.ts.map +1 -0
- package/dist/utils/version.js +12 -0
- package/dist/utils/version.js.map +1 -0
- package/dist/utils/where-clause.d.ts +4 -0
- package/dist/utils/where-clause.d.ts.map +1 -1
- package/dist/utils/where-clause.js +16 -0
- package/dist/utils/where-clause.js.map +1 -1
- package/package.json +6 -4
- package/dist/adapters/postgresql/schemas/core.d.ts.map +0 -1
- package/dist/adapters/postgresql/schemas/core.js.map +0 -1
- package/dist/adapters/postgresql/schemas/extensions.d.ts +0 -852
- package/dist/adapters/postgresql/schemas/extensions.d.ts.map +0 -1
- package/dist/adapters/postgresql/schemas/extensions.js +0 -1202
- package/dist/adapters/postgresql/schemas/extensions.js.map +0 -1
- package/dist/adapters/postgresql/schemas/jsonb.d.ts +0 -541
- package/dist/adapters/postgresql/schemas/jsonb.d.ts.map +0 -1
- package/dist/adapters/postgresql/schemas/jsonb.js +0 -814
- package/dist/adapters/postgresql/schemas/jsonb.js.map +0 -1
- package/dist/adapters/postgresql/schemas/postgis.d.ts.map +0 -1
- package/dist/adapters/postgresql/schemas/postgis.js.map +0 -1
- package/dist/adapters/postgresql/schemas/stats.d.ts.map +0 -1
- package/dist/adapters/postgresql/schemas/stats.js.map +0 -1
- package/dist/adapters/postgresql/tools/citext.d.ts +0 -18
- package/dist/adapters/postgresql/tools/citext.d.ts.map +0 -1
- package/dist/adapters/postgresql/tools/citext.js.map +0 -1
- package/dist/adapters/postgresql/tools/introspection.d.ts +0 -15
- package/dist/adapters/postgresql/tools/introspection.d.ts.map +0 -1
- package/dist/adapters/postgresql/tools/introspection.js +0 -1682
- package/dist/adapters/postgresql/tools/introspection.js.map +0 -1
- package/dist/adapters/postgresql/tools/jsonb/advanced.d.ts.map +0 -1
- package/dist/adapters/postgresql/tools/jsonb/advanced.js.map +0 -1
- package/dist/adapters/postgresql/tools/jsonb/basic.d.ts +0 -20
- package/dist/adapters/postgresql/tools/jsonb/basic.d.ts.map +0 -1
- package/dist/adapters/postgresql/tools/jsonb/basic.js.map +0 -1
- package/dist/adapters/postgresql/tools/monitoring.d.ts +0 -13
- package/dist/adapters/postgresql/tools/monitoring.d.ts.map +0 -1
- package/dist/adapters/postgresql/tools/monitoring.js.map +0 -1
- package/dist/adapters/postgresql/tools/partitioning.d.ts +0 -13
- package/dist/adapters/postgresql/tools/partitioning.d.ts.map +0 -1
- package/dist/adapters/postgresql/tools/partitioning.js.map +0 -1
- package/dist/adapters/postgresql/tools/schema.d.ts +0 -13
- package/dist/adapters/postgresql/tools/schema.d.ts.map +0 -1
- package/dist/adapters/postgresql/tools/schema.js.map +0 -1
- package/dist/adapters/postgresql/tools/text.d.ts +0 -13
- package/dist/adapters/postgresql/tools/text.d.ts.map +0 -1
- package/dist/adapters/postgresql/tools/text.js +0 -1082
- package/dist/adapters/postgresql/tools/text.js.map +0 -1
- package/dist/adapters/postgresql/tools/vector/advanced.d.ts.map +0 -1
- package/dist/adapters/postgresql/tools/vector/advanced.js +0 -958
- package/dist/adapters/postgresql/tools/vector/advanced.js.map +0 -1
- package/dist/adapters/postgresql/tools/vector/basic.d.ts.map +0 -1
- package/dist/adapters/postgresql/tools/vector/basic.js +0 -1165
- package/dist/adapters/postgresql/tools/vector/basic.js.map +0 -1
- package/dist/codemode/api.d.ts.map +0 -1
- package/dist/codemode/api.js +0 -1544
- package/dist/codemode/api.js.map +0 -1
- package/dist/utils/promptGenerator.d.ts +0 -20
- package/dist/utils/promptGenerator.d.ts.map +0 -1
- package/dist/utils/promptGenerator.js +0 -81
- package/dist/utils/promptGenerator.js.map +0 -1
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
import { z } from "zod";
|
|
7
7
|
import { readOnly } from "../../../../utils/annotations.js";
|
|
8
8
|
import { getToolIcons } from "../../../../utils/icons.js";
|
|
9
|
+
import { formatPostgresError } from "../core/error-helpers.js";
|
|
9
10
|
import { CreateBackupPlanOutputSchema, RestoreCommandOutputSchema, PhysicalBackupOutputSchema, RestoreValidateOutputSchema, BackupScheduleOptimizeOutputSchema, } from "../../schemas/index.js";
|
|
10
11
|
export function createBackupPlanTool(adapter) {
|
|
11
12
|
return {
|
|
@@ -17,7 +18,7 @@ export function createBackupPlanTool(adapter) {
|
|
|
17
18
|
.enum(["hourly", "daily", "weekly"])
|
|
18
19
|
.optional()
|
|
19
20
|
.describe("Backup frequency (default: daily)"),
|
|
20
|
-
retention: z
|
|
21
|
+
retention: z.coerce
|
|
21
22
|
.number()
|
|
22
23
|
.optional()
|
|
23
24
|
.describe("Number of backups to retain (default: 7)"),
|
|
@@ -26,64 +27,72 @@ export function createBackupPlanTool(adapter) {
|
|
|
26
27
|
annotations: readOnly("Create Backup Plan"),
|
|
27
28
|
icons: getToolIcons("backup", readOnly("Create Backup Plan")),
|
|
28
29
|
handler: async (params, _context) => {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
const retention = parsed.retention ?? 7;
|
|
41
|
-
// Generate cron schedule based on frequency
|
|
42
|
-
const getCronSchedule = (frequency) => {
|
|
43
|
-
switch (frequency) {
|
|
44
|
-
case "hourly":
|
|
45
|
-
return "0 * * * *"; // Every hour at minute 0
|
|
46
|
-
case "weekly":
|
|
47
|
-
return "0 2 * * 0"; // Sundays at 2 AM
|
|
48
|
-
default:
|
|
49
|
-
return "0 2 * * *"; // Daily at 2 AM
|
|
30
|
+
try {
|
|
31
|
+
// Parse params through schema to validate enum values
|
|
32
|
+
const schema = z.object({
|
|
33
|
+
frequency: z.enum(["hourly", "daily", "weekly"]).optional(),
|
|
34
|
+
retention: z.coerce.number().optional(),
|
|
35
|
+
});
|
|
36
|
+
const parsed = schema.parse(params);
|
|
37
|
+
const freq = parsed.frequency ?? "daily";
|
|
38
|
+
// Validate retention - must be at least 1
|
|
39
|
+
if (parsed.retention !== undefined && parsed.retention < 1) {
|
|
40
|
+
throw new Error("retention must be at least 1 (cannot retain zero or negative backups)");
|
|
50
41
|
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
42
|
+
const retention = parsed.retention ?? 7;
|
|
43
|
+
// Generate cron schedule based on frequency
|
|
44
|
+
const getCronSchedule = (frequency) => {
|
|
45
|
+
switch (frequency) {
|
|
46
|
+
case "hourly":
|
|
47
|
+
return "0 * * * *"; // Every hour at minute 0
|
|
48
|
+
case "weekly":
|
|
49
|
+
return "0 2 * * 0"; // Sundays at 2 AM
|
|
50
|
+
default:
|
|
51
|
+
return "0 2 * * *"; // Daily at 2 AM
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
const cronSchedule = getCronSchedule(freq);
|
|
55
|
+
const sizeResult = await adapter.executeQuery(`SELECT pg_database_size(current_database()) as bytes`);
|
|
56
|
+
const sizeBytes = Number(sizeResult.rows?.[0]?.["bytes"] ?? 0);
|
|
57
|
+
const sizeGB = (sizeBytes / (1024 * 1024 * 1024)).toFixed(2);
|
|
58
|
+
return {
|
|
59
|
+
strategy: {
|
|
60
|
+
fullBackup: {
|
|
61
|
+
// Use timestamp with hours/minutes for hourly backups to prevent overwrites
|
|
62
|
+
command: freq === "hourly"
|
|
63
|
+
? "pg_dump --format=custom --verbose --file=backup_$(date +%Y%m%d_%H%M).dump $POSTGRES_CONNECTION_STRING"
|
|
64
|
+
: "pg_dump --format=custom --verbose --file=backup_$(date +%Y%m%d).dump $POSTGRES_CONNECTION_STRING",
|
|
65
|
+
frequency: freq,
|
|
66
|
+
cronSchedule,
|
|
67
|
+
retention: `${String(retention)} backups`,
|
|
68
|
+
},
|
|
69
|
+
walArchiving: {
|
|
70
|
+
note: "Enable archive_mode and archive_command for point-in-time recovery",
|
|
71
|
+
configChanges: [
|
|
72
|
+
"archive_mode = on",
|
|
73
|
+
"archive_command = 'cp %p /path/to/wal_archive/%f'",
|
|
74
|
+
],
|
|
75
|
+
},
|
|
66
76
|
},
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
77
|
+
estimates: {
|
|
78
|
+
databaseSize: `${sizeGB} GB`,
|
|
79
|
+
// Per-backup size is ~30% of database due to compression
|
|
80
|
+
backupSizeEach: `~${(Number(sizeGB) * 0.3).toFixed(2)} GB (compressed)`,
|
|
81
|
+
// Use appropriate frequency label
|
|
82
|
+
...(freq === "weekly"
|
|
83
|
+
? { backupsPerWeek: 1 }
|
|
84
|
+
: { backupsPerDay: freq === "hourly" ? 24 : 1 }),
|
|
85
|
+
// Total = size per backup * retention count
|
|
86
|
+
totalStorageNeeded: `~${(Number(sizeGB) * 0.3 * retention).toFixed(2)} GB (${String(retention)} backups retained)`,
|
|
73
87
|
},
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
: { backupsPerDay: freq === "hourly" ? 24 : 1 }),
|
|
83
|
-
// Total = size per backup * retention count
|
|
84
|
-
totalStorageNeeded: `~${(Number(sizeGB) * 0.3 * retention).toFixed(2)} GB (${String(retention)} backups retained)`,
|
|
85
|
-
},
|
|
86
|
-
};
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
return {
|
|
92
|
+
success: false,
|
|
93
|
+
error: formatPostgresError(error, { tool: "pg_create_backup_plan" }),
|
|
94
|
+
};
|
|
95
|
+
}
|
|
87
96
|
},
|
|
88
97
|
};
|
|
89
98
|
}
|
|
@@ -107,45 +116,58 @@ export function createRestoreCommandTool(_adapter) {
|
|
|
107
116
|
annotations: readOnly("Restore Command"),
|
|
108
117
|
icons: getToolIcons("backup", readOnly("Restore Command")),
|
|
109
118
|
handler: (params, _context) => {
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
command
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
119
|
+
try {
|
|
120
|
+
return Promise.resolve()
|
|
121
|
+
.then(() => {
|
|
122
|
+
const parsed = params;
|
|
123
|
+
// Validate required param
|
|
124
|
+
if (parsed.backupFile === undefined || parsed.backupFile === "") {
|
|
125
|
+
throw new Error("backupFile parameter is required");
|
|
126
|
+
}
|
|
127
|
+
// Validate mutually exclusive options
|
|
128
|
+
if (parsed.dataOnly === true && parsed.schemaOnly === true) {
|
|
129
|
+
throw new Error("dataOnly and schemaOnly cannot both be true - pg_restore only supports one at a time");
|
|
130
|
+
}
|
|
131
|
+
let command = "pg_restore --verbose";
|
|
132
|
+
const warnings = [];
|
|
133
|
+
if (parsed.database !== undefined) {
|
|
134
|
+
command += ` --dbname="${parsed.database}"`;
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
warnings.push("No database specified - add --dbname=DBNAME to run this command");
|
|
138
|
+
}
|
|
139
|
+
if (parsed.schema !== undefined)
|
|
140
|
+
command += ` --schema="${parsed.schema}"`;
|
|
141
|
+
if (parsed.table !== undefined)
|
|
142
|
+
command += ` --table="${parsed.table}"`;
|
|
143
|
+
if (parsed.dataOnly === true)
|
|
144
|
+
command += " --data-only";
|
|
145
|
+
if (parsed.schemaOnly === true)
|
|
146
|
+
command += " --schema-only";
|
|
147
|
+
command += ` "${parsed.backupFile}"`;
|
|
148
|
+
return {
|
|
149
|
+
command,
|
|
150
|
+
...(warnings.length > 0 && { warnings }),
|
|
151
|
+
notes: [
|
|
152
|
+
"Add --clean to drop database objects before recreating",
|
|
153
|
+
"Add --if-exists to avoid errors on drop",
|
|
154
|
+
"Add --no-owner to skip ownership commands",
|
|
155
|
+
"Use -j N for parallel restore (N workers)",
|
|
156
|
+
"For remote restores, add -h HOST -p PORT -U USER to the command",
|
|
157
|
+
],
|
|
158
|
+
};
|
|
159
|
+
})
|
|
160
|
+
.catch((error) => ({
|
|
161
|
+
success: false,
|
|
162
|
+
error: formatPostgresError(error, { tool: "pg_restore_command" }),
|
|
163
|
+
}));
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
return Promise.resolve({
|
|
167
|
+
success: false,
|
|
168
|
+
error: formatPostgresError(error, { tool: "pg_restore_command" }),
|
|
169
|
+
});
|
|
170
|
+
}
|
|
149
171
|
},
|
|
150
172
|
};
|
|
151
173
|
}
|
|
@@ -164,68 +186,81 @@ export function createPhysicalBackupTool(_adapter) {
|
|
|
164
186
|
.enum(["fast", "spread"])
|
|
165
187
|
.optional()
|
|
166
188
|
.describe("Checkpoint mode"),
|
|
167
|
-
compress: z.number().optional().describe("Compression level 0-9"),
|
|
189
|
+
compress: z.coerce.number().optional().describe("Compression level 0-9"),
|
|
168
190
|
}),
|
|
169
191
|
outputSchema: PhysicalBackupOutputSchema,
|
|
170
192
|
annotations: readOnly("Physical Backup"),
|
|
171
193
|
icons: getToolIcons("backup", readOnly("Physical Backup")),
|
|
172
194
|
handler: (params, _context) => {
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
195
|
+
try {
|
|
196
|
+
return Promise.resolve()
|
|
197
|
+
.then(() => {
|
|
198
|
+
// Parse params through schema to validate enum values
|
|
199
|
+
const schema = z.object({
|
|
200
|
+
targetDir: z.string().optional(),
|
|
201
|
+
format: z.enum(["plain", "tar"]).optional(),
|
|
202
|
+
checkpoint: z.enum(["fast", "spread"]).optional(),
|
|
203
|
+
compress: z.coerce.number().optional(),
|
|
204
|
+
});
|
|
205
|
+
const parsed = schema.parse(params);
|
|
206
|
+
// Validate required param
|
|
207
|
+
if (parsed.targetDir === undefined || parsed.targetDir === "") {
|
|
208
|
+
throw new Error("targetDir parameter is required");
|
|
209
|
+
}
|
|
210
|
+
// Validate compress range
|
|
211
|
+
if (parsed.compress !== undefined &&
|
|
212
|
+
(parsed.compress < 0 || parsed.compress > 9)) {
|
|
213
|
+
throw new Error("compress must be between 0 and 9");
|
|
214
|
+
}
|
|
215
|
+
let command = "pg_basebackup";
|
|
216
|
+
command += ` -D "${parsed.targetDir}"`;
|
|
217
|
+
// Set format flag: plain (-Fp) if specified, otherwise tar (-Ft) as default
|
|
218
|
+
command += parsed.format === "plain" ? " -Fp" : " -Ft";
|
|
219
|
+
command += " -Xs";
|
|
220
|
+
command += " -P";
|
|
221
|
+
if (parsed.checkpoint === "fast") {
|
|
222
|
+
command += " -c fast";
|
|
223
|
+
}
|
|
224
|
+
else if (parsed.checkpoint === "spread") {
|
|
225
|
+
command += " -c spread";
|
|
226
|
+
}
|
|
227
|
+
if (parsed.compress !== undefined && parsed.compress > 0) {
|
|
228
|
+
// Use only -Z (--compress) with level, not -z (which is redundant)
|
|
229
|
+
command += ` -Z ${String(parsed.compress)}`;
|
|
230
|
+
}
|
|
231
|
+
// Connection flags should be provided by user or via environment
|
|
232
|
+
command +=
|
|
233
|
+
" -h ${PGHOST:-localhost} -p ${PGPORT:-5432} -U ${PGUSER:-postgres}";
|
|
234
|
+
return {
|
|
235
|
+
command,
|
|
236
|
+
notes: [
|
|
237
|
+
"Set PGHOST, PGPORT, PGUSER environment variables or replace the placeholders directly",
|
|
238
|
+
"Requires replication connection permission",
|
|
239
|
+
"Modify -h/-U flags above to change connection target",
|
|
240
|
+
"Add --slot=NAME to use a replication slot",
|
|
241
|
+
"Physical backups capture the entire cluster",
|
|
242
|
+
parsed.format === "plain"
|
|
243
|
+
? "Plain format (-Fp): Creates directory structure with individual data files"
|
|
244
|
+
: "Tar format (-Ft): Creates single compressed archive file",
|
|
245
|
+
],
|
|
246
|
+
requirements: [
|
|
247
|
+
"wal_level = replica (or higher)",
|
|
248
|
+
"max_wal_senders > 0",
|
|
249
|
+
"pg_hba.conf must allow replication connections",
|
|
250
|
+
],
|
|
251
|
+
};
|
|
252
|
+
})
|
|
253
|
+
.catch((error) => ({
|
|
254
|
+
success: false,
|
|
255
|
+
error: formatPostgresError(error, { tool: "pg_backup_physical" }),
|
|
256
|
+
}));
|
|
257
|
+
}
|
|
258
|
+
catch (error) {
|
|
259
|
+
return Promise.resolve({
|
|
260
|
+
success: false,
|
|
261
|
+
error: formatPostgresError(error, { tool: "pg_backup_physical" }),
|
|
180
262
|
});
|
|
181
|
-
|
|
182
|
-
// Validate required param
|
|
183
|
-
if (parsed.targetDir === undefined || parsed.targetDir === "") {
|
|
184
|
-
throw new Error("targetDir parameter is required");
|
|
185
|
-
}
|
|
186
|
-
// Validate compress range
|
|
187
|
-
if (parsed.compress !== undefined &&
|
|
188
|
-
(parsed.compress < 0 || parsed.compress > 9)) {
|
|
189
|
-
throw new Error("compress must be between 0 and 9");
|
|
190
|
-
}
|
|
191
|
-
let command = "pg_basebackup";
|
|
192
|
-
command += ` -D "${parsed.targetDir}"`;
|
|
193
|
-
// Set format flag: plain (-Fp) if specified, otherwise tar (-Ft) as default
|
|
194
|
-
command += parsed.format === "plain" ? " -Fp" : " -Ft";
|
|
195
|
-
command += " -Xs";
|
|
196
|
-
command += " -P";
|
|
197
|
-
if (parsed.checkpoint === "fast") {
|
|
198
|
-
command += " -c fast";
|
|
199
|
-
}
|
|
200
|
-
else if (parsed.checkpoint === "spread") {
|
|
201
|
-
command += " -c spread";
|
|
202
|
-
}
|
|
203
|
-
if (parsed.compress !== undefined && parsed.compress > 0) {
|
|
204
|
-
// Use only -Z (--compress) with level, not -z (which is redundant)
|
|
205
|
-
command += ` -Z ${String(parsed.compress)}`;
|
|
206
|
-
}
|
|
207
|
-
// Connection flags should be provided by user or via environment
|
|
208
|
-
command +=
|
|
209
|
-
" -h ${PGHOST:-localhost} -p ${PGPORT:-5432} -U ${PGUSER:-postgres}";
|
|
210
|
-
return {
|
|
211
|
-
command,
|
|
212
|
-
notes: [
|
|
213
|
-
"Set PGHOST, PGPORT, PGUSER environment variables or replace the placeholders directly",
|
|
214
|
-
"Requires replication connection permission",
|
|
215
|
-
"Modify -h/-U flags above to change connection target",
|
|
216
|
-
"Add --slot=NAME to use a replication slot",
|
|
217
|
-
"Physical backups capture the entire cluster",
|
|
218
|
-
parsed.format === "plain"
|
|
219
|
-
? "Plain format (-Fp): Creates directory structure with individual data files"
|
|
220
|
-
: "Tar format (-Ft): Creates single compressed archive file",
|
|
221
|
-
],
|
|
222
|
-
requirements: [
|
|
223
|
-
"wal_level = replica (or higher)",
|
|
224
|
-
"max_wal_senders > 0",
|
|
225
|
-
"pg_hba.conf must allow replication connections",
|
|
226
|
-
],
|
|
227
|
-
};
|
|
228
|
-
});
|
|
263
|
+
}
|
|
229
264
|
},
|
|
230
265
|
};
|
|
231
266
|
}
|
|
@@ -245,85 +280,98 @@ export function createRestoreValidateTool(_adapter) {
|
|
|
245
280
|
annotations: readOnly("Restore Validate"),
|
|
246
281
|
icons: getToolIcons("backup", readOnly("Restore Validate")),
|
|
247
282
|
handler: (params, _context) => {
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
283
|
+
try {
|
|
284
|
+
return Promise.resolve()
|
|
285
|
+
.then(() => {
|
|
286
|
+
// Parse params through schema to validate enum values
|
|
287
|
+
const schema = z.object({
|
|
288
|
+
backupFile: z.string().optional(),
|
|
289
|
+
backupType: z.enum(["pg_dump", "pg_basebackup"]).optional(),
|
|
290
|
+
});
|
|
291
|
+
const parsed = schema.parse(params);
|
|
292
|
+
// Validate required param
|
|
293
|
+
if (parsed.backupFile === undefined || parsed.backupFile === "") {
|
|
294
|
+
throw new Error("backupFile parameter is required");
|
|
295
|
+
}
|
|
296
|
+
const backupType = parsed.backupType ?? "pg_dump";
|
|
297
|
+
const defaultUsed = parsed.backupType === undefined;
|
|
298
|
+
if (backupType === "pg_dump") {
|
|
299
|
+
return {
|
|
300
|
+
...(defaultUsed && {
|
|
301
|
+
note: "No backupType specified - defaulting to pg_dump validation steps",
|
|
302
|
+
}),
|
|
303
|
+
validationSteps: [
|
|
304
|
+
{
|
|
305
|
+
step: 1,
|
|
306
|
+
name: "Check backup file integrity",
|
|
307
|
+
command: `pg_restore --list "${parsed.backupFile}"`,
|
|
308
|
+
},
|
|
309
|
+
{
|
|
310
|
+
step: 2,
|
|
311
|
+
name: "Test restore to temporary database",
|
|
312
|
+
commands: [
|
|
313
|
+
"createdb test_restore",
|
|
314
|
+
`pg_restore --dbname=test_restore "${parsed.backupFile}"`,
|
|
315
|
+
"-- Run validation queries",
|
|
316
|
+
"dropdb test_restore",
|
|
317
|
+
],
|
|
318
|
+
},
|
|
319
|
+
{
|
|
320
|
+
step: 3,
|
|
321
|
+
name: "Verify table counts match",
|
|
322
|
+
note: "Compare pg_class counts between source and restored database",
|
|
323
|
+
},
|
|
324
|
+
],
|
|
325
|
+
recommendations: [
|
|
326
|
+
"Automate validation as part of backup workflow",
|
|
327
|
+
"Keep validation logs for compliance",
|
|
328
|
+
"Test restores regularly, not just during incidents",
|
|
329
|
+
],
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
else {
|
|
333
|
+
return {
|
|
334
|
+
validationSteps: [
|
|
335
|
+
{
|
|
336
|
+
step: 1,
|
|
337
|
+
name: "Verify backup with pg_verifybackup (PostgreSQL 13+)",
|
|
338
|
+
command: `pg_verifybackup "${parsed.backupFile}"`,
|
|
339
|
+
},
|
|
340
|
+
{
|
|
341
|
+
step: 2,
|
|
342
|
+
name: "Verify base backup files",
|
|
343
|
+
command: `ls -la "${parsed.backupFile}"/`,
|
|
344
|
+
},
|
|
345
|
+
{
|
|
346
|
+
step: 3,
|
|
347
|
+
name: "Check backup_label file",
|
|
348
|
+
command: `cat "${parsed.backupFile}"/backup_label`,
|
|
349
|
+
},
|
|
350
|
+
{
|
|
351
|
+
step: 4,
|
|
352
|
+
name: "Test recovery in isolated environment",
|
|
353
|
+
note: "Configure recovery.conf/recovery.signal and start standby",
|
|
354
|
+
},
|
|
355
|
+
],
|
|
356
|
+
recommendations: [
|
|
357
|
+
"pg_verifybackup validates checksums (requires data checksums enabled)",
|
|
358
|
+
"Maintain WAL archives for point-in-time recovery testing",
|
|
359
|
+
"Document recovery procedures and test quarterly",
|
|
360
|
+
],
|
|
361
|
+
};
|
|
362
|
+
}
|
|
363
|
+
})
|
|
364
|
+
.catch((error) => ({
|
|
365
|
+
success: false,
|
|
366
|
+
error: formatPostgresError(error, { tool: "pg_restore_validate" }),
|
|
367
|
+
}));
|
|
368
|
+
}
|
|
369
|
+
catch (error) {
|
|
370
|
+
return Promise.resolve({
|
|
371
|
+
success: false,
|
|
372
|
+
error: formatPostgresError(error, { tool: "pg_restore_validate" }),
|
|
253
373
|
});
|
|
254
|
-
|
|
255
|
-
// Validate required param
|
|
256
|
-
if (parsed.backupFile === undefined || parsed.backupFile === "") {
|
|
257
|
-
throw new Error("backupFile parameter is required");
|
|
258
|
-
}
|
|
259
|
-
const backupType = parsed.backupType ?? "pg_dump";
|
|
260
|
-
const defaultUsed = parsed.backupType === undefined;
|
|
261
|
-
if (backupType === "pg_dump") {
|
|
262
|
-
return {
|
|
263
|
-
...(defaultUsed && {
|
|
264
|
-
note: "No backupType specified - defaulting to pg_dump validation steps",
|
|
265
|
-
}),
|
|
266
|
-
validationSteps: [
|
|
267
|
-
{
|
|
268
|
-
step: 1,
|
|
269
|
-
name: "Check backup file integrity",
|
|
270
|
-
command: `pg_restore --list "${parsed.backupFile}"`,
|
|
271
|
-
},
|
|
272
|
-
{
|
|
273
|
-
step: 2,
|
|
274
|
-
name: "Test restore to temporary database",
|
|
275
|
-
commands: [
|
|
276
|
-
"createdb test_restore",
|
|
277
|
-
`pg_restore --dbname=test_restore "${parsed.backupFile}"`,
|
|
278
|
-
"-- Run validation queries",
|
|
279
|
-
"dropdb test_restore",
|
|
280
|
-
],
|
|
281
|
-
},
|
|
282
|
-
{
|
|
283
|
-
step: 3,
|
|
284
|
-
name: "Verify table counts match",
|
|
285
|
-
note: "Compare pg_class counts between source and restored database",
|
|
286
|
-
},
|
|
287
|
-
],
|
|
288
|
-
recommendations: [
|
|
289
|
-
"Automate validation as part of backup workflow",
|
|
290
|
-
"Keep validation logs for compliance",
|
|
291
|
-
"Test restores regularly, not just during incidents",
|
|
292
|
-
],
|
|
293
|
-
};
|
|
294
|
-
}
|
|
295
|
-
else {
|
|
296
|
-
return {
|
|
297
|
-
validationSteps: [
|
|
298
|
-
{
|
|
299
|
-
step: 1,
|
|
300
|
-
name: "Verify backup with pg_verifybackup (PostgreSQL 13+)",
|
|
301
|
-
command: `pg_verifybackup "${parsed.backupFile}"`,
|
|
302
|
-
},
|
|
303
|
-
{
|
|
304
|
-
step: 2,
|
|
305
|
-
name: "Verify base backup files",
|
|
306
|
-
command: `ls -la "${parsed.backupFile}"/`,
|
|
307
|
-
},
|
|
308
|
-
{
|
|
309
|
-
step: 3,
|
|
310
|
-
name: "Check backup_label file",
|
|
311
|
-
command: `cat "${parsed.backupFile}"/backup_label`,
|
|
312
|
-
},
|
|
313
|
-
{
|
|
314
|
-
step: 4,
|
|
315
|
-
name: "Test recovery in isolated environment",
|
|
316
|
-
note: "Configure recovery.conf/recovery.signal and start standby",
|
|
317
|
-
},
|
|
318
|
-
],
|
|
319
|
-
recommendations: [
|
|
320
|
-
"pg_verifybackup validates checksums (requires data checksums enabled)",
|
|
321
|
-
"Maintain WAL archives for point-in-time recovery testing",
|
|
322
|
-
"Document recovery procedures and test quarterly",
|
|
323
|
-
],
|
|
324
|
-
};
|
|
325
|
-
}
|
|
326
|
-
});
|
|
374
|
+
}
|
|
327
375
|
},
|
|
328
376
|
};
|
|
329
377
|
}
|
|
@@ -340,20 +388,21 @@ export function createBackupScheduleOptimizeTool(adapter) {
|
|
|
340
388
|
annotations: readOnly("Backup Schedule Optimize"),
|
|
341
389
|
icons: getToolIcons("backup", readOnly("Backup Schedule Optimize")),
|
|
342
390
|
handler: async (_params, _context) => {
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
391
|
+
try {
|
|
392
|
+
const [dbSize, changeRate, connActivity] = await Promise.all([
|
|
393
|
+
adapter.executeQuery(`
|
|
394
|
+
SELECT
|
|
346
395
|
pg_database_size(current_database()) as size_bytes,
|
|
347
396
|
pg_size_pretty(pg_database_size(current_database())) as size
|
|
348
397
|
`),
|
|
349
|
-
|
|
350
|
-
SELECT
|
|
398
|
+
adapter.executeQuery(`
|
|
399
|
+
SELECT
|
|
351
400
|
sum(n_tup_ins + n_tup_upd + n_tup_del) as total_changes,
|
|
352
401
|
sum(n_live_tup) as total_rows
|
|
353
402
|
FROM pg_stat_user_tables
|
|
354
403
|
`),
|
|
355
|
-
|
|
356
|
-
SELECT
|
|
404
|
+
adapter.executeQuery(`
|
|
405
|
+
SELECT
|
|
357
406
|
extract(hour from backend_start) as hour,
|
|
358
407
|
count(*) as connection_count
|
|
359
408
|
FROM pg_stat_activity
|
|
@@ -361,59 +410,68 @@ export function createBackupScheduleOptimizeTool(adapter) {
|
|
|
361
410
|
GROUP BY extract(hour from backend_start)
|
|
362
411
|
ORDER BY hour
|
|
363
412
|
`),
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
413
|
+
]);
|
|
414
|
+
const sizeBytes = Number(dbSize.rows?.[0]?.["size_bytes"] ?? 0);
|
|
415
|
+
const totalChanges = Number(changeRate.rows?.[0]?.["total_changes"] ?? 0);
|
|
416
|
+
const totalRows = Number(changeRate.rows?.[0]?.["total_rows"] ?? 1);
|
|
417
|
+
const changePercent = (totalChanges / Math.max(totalRows, 1)) * 100;
|
|
418
|
+
let strategy;
|
|
419
|
+
let fullBackupFrequency;
|
|
420
|
+
let incrementalFrequency;
|
|
421
|
+
if (sizeBytes > 100 * 1024 * 1024 * 1024) {
|
|
422
|
+
strategy = "Large database - use incremental/WAL-based backups";
|
|
423
|
+
fullBackupFrequency = "Weekly";
|
|
424
|
+
incrementalFrequency = "Continuous WAL archiving";
|
|
425
|
+
}
|
|
426
|
+
else if (changePercent > 50) {
|
|
427
|
+
strategy = "High change rate - frequent backups recommended";
|
|
428
|
+
fullBackupFrequency = "Daily";
|
|
429
|
+
incrementalFrequency = "Every 6 hours";
|
|
430
|
+
}
|
|
431
|
+
else if (changePercent > 10) {
|
|
432
|
+
strategy = "Moderate activity - standard backup schedule";
|
|
433
|
+
fullBackupFrequency = "Daily";
|
|
434
|
+
incrementalFrequency = "Every 12 hours";
|
|
435
|
+
}
|
|
436
|
+
else {
|
|
437
|
+
strategy = "Low activity - conservative backup schedule";
|
|
438
|
+
fullBackupFrequency = "Daily";
|
|
439
|
+
incrementalFrequency = "Not required";
|
|
440
|
+
}
|
|
441
|
+
return {
|
|
442
|
+
analysis: {
|
|
443
|
+
databaseSize: dbSize.rows?.[0]?.["size"],
|
|
444
|
+
totalChanges,
|
|
445
|
+
// This is change velocity (total DML operations / current rows) - can exceed 100% for high-churn tables
|
|
446
|
+
changeVelocity: Number(changePercent.toFixed(2)),
|
|
447
|
+
changeVelocityRatio: changePercent.toFixed(2) + "%",
|
|
448
|
+
activityByHour: connActivity.rows?.map((row) => ({
|
|
449
|
+
hour: Number(row["hour"]),
|
|
450
|
+
connection_count: Number(row["connection_count"]),
|
|
451
|
+
})),
|
|
452
|
+
activityNote: "Activity data reflects current session connections only, not historical patterns",
|
|
453
|
+
},
|
|
454
|
+
recommendation: {
|
|
455
|
+
strategy,
|
|
456
|
+
fullBackupFrequency,
|
|
457
|
+
incrementalFrequency,
|
|
458
|
+
bestTimeForBackup: "Off-peak hours (typically 2-4 AM local time)",
|
|
459
|
+
retentionPolicy: "Keep 7 daily, 4 weekly, 12 monthly",
|
|
460
|
+
},
|
|
461
|
+
commands: {
|
|
462
|
+
cronSchedule: `0 2 * * * pg_dump -Fc -f /backups/daily_$(date +\\%Y\\%m\\%d).dump $POSTGRES_CONNECTION_STRING`,
|
|
463
|
+
walArchive: "archive_command = 'test ! -f /wal_archive/%f && cp %p /wal_archive/%f'",
|
|
464
|
+
},
|
|
465
|
+
};
|
|
386
466
|
}
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
467
|
+
catch (error) {
|
|
468
|
+
return {
|
|
469
|
+
success: false,
|
|
470
|
+
error: formatPostgresError(error, {
|
|
471
|
+
tool: "pg_backup_schedule_optimize",
|
|
472
|
+
}),
|
|
473
|
+
};
|
|
391
474
|
}
|
|
392
|
-
return {
|
|
393
|
-
analysis: {
|
|
394
|
-
databaseSize: dbSize.rows?.[0]?.["size"],
|
|
395
|
-
totalChanges,
|
|
396
|
-
// This is change velocity (total DML operations / current rows) - can exceed 100% for high-churn tables
|
|
397
|
-
changeVelocity: Number(changePercent.toFixed(2)),
|
|
398
|
-
changeVelocityRatio: changePercent.toFixed(2) + "%",
|
|
399
|
-
activityByHour: connActivity.rows?.map((row) => ({
|
|
400
|
-
hour: Number(row["hour"]),
|
|
401
|
-
connection_count: Number(row["connection_count"]),
|
|
402
|
-
})),
|
|
403
|
-
activityNote: "Activity data reflects current session connections only, not historical patterns",
|
|
404
|
-
},
|
|
405
|
-
recommendation: {
|
|
406
|
-
strategy,
|
|
407
|
-
fullBackupFrequency,
|
|
408
|
-
incrementalFrequency,
|
|
409
|
-
bestTimeForBackup: "Off-peak hours (typically 2-4 AM local time)",
|
|
410
|
-
retentionPolicy: "Keep 7 daily, 4 weekly, 12 monthly",
|
|
411
|
-
},
|
|
412
|
-
commands: {
|
|
413
|
-
cronSchedule: `0 2 * * * pg_dump -Fc -f /backups/daily_$(date +\\%Y\\%m\\%d).dump $POSTGRES_CONNECTION_STRING`,
|
|
414
|
-
walArchive: "archive_command = 'test ! -f /wal_archive/%f && cp %p /wal_archive/%f'",
|
|
415
|
-
},
|
|
416
|
-
};
|
|
417
475
|
},
|
|
418
476
|
};
|
|
419
477
|
}
|