kynjal-cli 4.0.0 → 4.0.1
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/dist/src/appliance/gguf-engine.d.ts +91 -0
- package/dist/src/appliance/gguf-engine.d.ts.map +1 -0
- package/dist/src/appliance/gguf-engine.js +286 -525
- package/dist/src/appliance/gguf-engine.js.map +1 -1
- package/dist/src/appliance/ruvllm-bridge.d.ts +102 -0
- package/dist/src/appliance/ruvllm-bridge.d.ts.map +1 -0
- package/dist/src/appliance/ruvllm-bridge.js +203 -403
- package/dist/src/appliance/ruvllm-bridge.js.map +1 -1
- package/dist/src/appliance/rvfa-builder.d.ts +44 -0
- package/dist/src/appliance/rvfa-builder.d.ts.map +1 -0
- package/dist/src/appliance/rvfa-builder.js +154 -208
- package/dist/src/appliance/rvfa-builder.js.map +1 -1
- package/dist/src/appliance/rvfa-distribution.d.ts +97 -0
- package/dist/src/appliance/rvfa-distribution.d.ts.map +1 -0
- package/dist/src/appliance/rvfa-distribution.js +260 -423
- package/dist/src/appliance/rvfa-distribution.js.map +1 -1
- package/dist/src/appliance/rvfa-format.d.ts +111 -0
- package/dist/src/appliance/rvfa-format.d.ts.map +1 -0
- package/dist/src/appliance/rvfa-format.js +128 -200
- package/dist/src/appliance/rvfa-format.js.map +1 -1
- package/dist/src/appliance/rvfa-runner.d.ts +69 -0
- package/dist/src/appliance/rvfa-runner.d.ts.map +1 -0
- package/dist/src/appliance/rvfa-runner.js +168 -304
- package/dist/src/appliance/rvfa-runner.js.map +1 -1
- package/dist/src/appliance/rvfa-signing.d.ts +123 -0
- package/dist/src/appliance/rvfa-signing.d.ts.map +1 -0
- package/dist/src/appliance/rvfa-signing.js +173 -295
- package/dist/src/appliance/rvfa-signing.js.map +1 -1
- package/dist/src/benchmarks/pretrain/index.d.ts +58 -0
- package/dist/src/benchmarks/pretrain/index.d.ts.map +1 -0
- package/dist/src/benchmarks/pretrain/index.js +331 -542
- package/dist/src/benchmarks/pretrain/index.js.map +1 -1
- package/dist/src/commands/agent.js +574 -697
- package/dist/src/commands/agent.js.map +1 -1
- package/dist/src/commands/analyze.js +1218 -1548
- package/dist/src/commands/analyze.js.map +1 -1
- package/dist/src/commands/appliance-advanced.js +158 -267
- package/dist/src/commands/appliance-advanced.js.map +1 -1
- package/dist/src/commands/appliance.js +318 -493
- package/dist/src/commands/appliance.js.map +1 -1
- package/dist/src/commands/benchmark.js +372 -523
- package/dist/src/commands/benchmark.js.map +1 -1
- package/dist/src/commands/claims.js +274 -364
- package/dist/src/commands/claims.js.map +1 -1
- package/dist/src/commands/cleanup.js +113 -157
- package/dist/src/commands/cleanup.js.map +1 -1
- package/dist/src/commands/completions.js +477 -118
- package/dist/src/commands/completions.js.map +1 -1
- package/dist/src/commands/config.js +237 -303
- package/dist/src/commands/config.js.map +1 -1
- package/dist/src/commands/daemon.js +487 -596
- package/dist/src/commands/daemon.js.map +1 -1
- package/dist/src/commands/deployment.js +194 -275
- package/dist/src/commands/deployment.js.map +1 -1
- package/dist/src/commands/doctor.js +504 -686
- package/dist/src/commands/doctor.js.map +1 -1
- package/dist/src/commands/embeddings.js +1293 -1543
- package/dist/src/commands/embeddings.js.map +1 -1
- package/dist/src/commands/guidance.js +449 -596
- package/dist/src/commands/guidance.js.map +1 -1
- package/dist/src/commands/hive-mind.js +854 -938
- package/dist/src/commands/hive-mind.js.map +1 -1
- package/dist/src/commands/hooks.js +3112 -3519
- package/dist/src/commands/hooks.js.map +1 -1
- package/dist/src/commands/index.d.ts +115 -0
- package/dist/src/commands/index.d.ts.map +1 -0
- package/dist/src/commands/index.js +126 -308
- package/dist/src/commands/index.js.map +1 -1
- package/dist/src/commands/init.js +788 -940
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/issues.js +383 -558
- package/dist/src/commands/issues.js.map +1 -1
- package/dist/src/commands/mcp.js +493 -605
- package/dist/src/commands/mcp.js.map +1 -1
- package/dist/src/commands/memory.js +833 -1026
- package/dist/src/commands/memory.js.map +1 -1
- package/dist/src/commands/migrate.js +282 -347
- package/dist/src/commands/migrate.js.map +1 -1
- package/dist/src/commands/neural.js +1289 -1563
- package/dist/src/commands/neural.js.map +1 -1
- package/dist/src/commands/performance.js +497 -643
- package/dist/src/commands/performance.js.map +1 -1
- package/dist/src/commands/plugins.js +668 -841
- package/dist/src/commands/plugins.js.map +1 -1
- package/dist/src/commands/process.js +392 -447
- package/dist/src/commands/process.js.map +1 -1
- package/dist/src/commands/progress.js +162 -256
- package/dist/src/commands/progress.js.map +1 -1
- package/dist/src/commands/providers.js +150 -220
- package/dist/src/commands/providers.js.map +1 -1
- package/dist/src/commands/route.js +520 -665
- package/dist/src/commands/route.js.map +1 -1
- package/dist/src/commands/ruvector/backup.js +505 -651
- package/dist/src/commands/ruvector/backup.js.map +1 -1
- package/dist/src/commands/ruvector/benchmark.js +349 -401
- package/dist/src/commands/ruvector/benchmark.js.map +1 -1
- package/dist/src/commands/ruvector/import.js +224 -266
- package/dist/src/commands/ruvector/import.js.map +1 -1
- package/dist/src/commands/ruvector/index.js +37 -75
- package/dist/src/commands/ruvector/index.js.map +1 -1
- package/dist/src/commands/ruvector/init.js +336 -359
- package/dist/src/commands/ruvector/init.js.map +1 -1
- package/dist/src/commands/ruvector/migrate.js +335 -322
- package/dist/src/commands/ruvector/migrate.js.map +1 -1
- package/dist/src/commands/ruvector/optimize.js +375 -431
- package/dist/src/commands/ruvector/optimize.js.map +1 -1
- package/dist/src/commands/ruvector/setup.js +703 -117
- package/dist/src/commands/ruvector/setup.js.map +1 -1
- package/dist/src/commands/ruvector/status.js +364 -419
- package/dist/src/commands/ruvector/status.js.map +1 -1
- package/dist/src/commands/security.js +485 -608
- package/dist/src/commands/security.js.map +1 -1
- package/dist/src/commands/session.js +504 -626
- package/dist/src/commands/session.js.map +1 -1
- package/dist/src/commands/start.js +267 -364
- package/dist/src/commands/start.js.map +1 -1
- package/dist/src/commands/status.js +380 -486
- package/dist/src/commands/status.js.map +1 -1
- package/dist/src/commands/swarm.js +408 -488
- package/dist/src/commands/swarm.js.map +1 -1
- package/dist/src/commands/task.js +423 -538
- package/dist/src/commands/task.js.map +1 -1
- package/dist/src/commands/transfer-store.js +322 -412
- package/dist/src/commands/transfer-store.js.map +1 -1
- package/dist/src/commands/update.js +196 -291
- package/dist/src/commands/update.js.map +1 -1
- package/dist/src/commands/workflow.js +386 -486
- package/dist/src/commands/workflow.js.map +1 -1
- package/dist/src/config-adapter.d.ts +15 -0
- package/dist/src/config-adapter.d.ts.map +1 -0
- package/dist/src/config-adapter.js +38 -39
- package/dist/src/config-adapter.js.map +1 -1
- package/dist/src/index.d.ts +77 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +309 -411
- package/dist/src/index.js.map +1 -1
- package/dist/src/infrastructure/in-memory-repositories.d.ts +68 -0
- package/dist/src/infrastructure/in-memory-repositories.d.ts.map +1 -0
- package/dist/src/infrastructure/in-memory-repositories.js +246 -507
- package/dist/src/infrastructure/in-memory-repositories.js.map +1 -1
- package/dist/src/init/claudemd-generator.d.ts +25 -0
- package/dist/src/init/claudemd-generator.d.ts.map +1 -0
- package/dist/src/init/claudemd-generator.js +368 -78
- package/dist/src/init/claudemd-generator.js.map +1 -1
- package/dist/src/init/executor.d.ts +41 -0
- package/dist/src/init/executor.d.ts.map +1 -0
- package/dist/src/init/executor.js +1307 -996
- package/dist/src/init/executor.js.map +1 -1
- package/dist/src/init/helpers-generator.d.ts +60 -0
- package/dist/src/init/helpers-generator.d.ts.map +1 -0
- package/dist/src/init/helpers-generator.js +657 -12
- package/dist/src/init/helpers-generator.js.map +1 -1
- package/dist/src/init/index.d.ts +1 -1
- package/dist/src/init/index.d.ts.map +1 -1
- package/dist/src/init/index.js +1 -1
- package/dist/src/init/index.js.map +1 -1
- package/dist/src/init/mcp-generator.js +33 -37
- package/dist/src/init/mcp-generator.js.map +1 -1
- package/dist/src/init/settings-generator.js +76 -77
- package/dist/src/init/settings-generator.js.map +1 -1
- package/dist/src/init/statusline-generator.js +801 -3
- package/dist/src/init/statusline-generator.js.map +1 -1
- package/dist/src/init/types.d.ts +1 -1
- package/dist/src/init/types.d.ts.map +1 -1
- package/dist/src/init/types.js +76 -59
- package/dist/src/init/types.js.map +1 -1
- package/dist/src/mcp-client.d.ts +92 -0
- package/dist/src/mcp-client.d.ts.map +1 -0
- package/dist/src/mcp-client.js +81 -125
- package/dist/src/mcp-client.js.map +1 -1
- package/dist/src/mcp-server.d.ts +161 -0
- package/dist/src/mcp-server.d.ts.map +1 -0
- package/dist/src/mcp-server.js +470 -757
- package/dist/src/mcp-server.js.map +1 -1
- package/dist/src/mcp-tools/agent-tools.js +391 -492
- package/dist/src/mcp-tools/agent-tools.js.map +1 -1
- package/dist/src/mcp-tools/agentdb-tools.js +332 -533
- package/dist/src/mcp-tools/agentdb-tools.js.map +1 -1
- package/dist/src/mcp-tools/analyze-tools.js +172 -236
- package/dist/src/mcp-tools/analyze-tools.js.map +1 -1
- package/dist/src/mcp-tools/auto-install.d.ts +83 -0
- package/dist/src/mcp-tools/auto-install.d.ts.map +1 -0
- package/dist/src/mcp-tools/auto-install.js +80 -142
- package/dist/src/mcp-tools/auto-install.js.map +1 -1
- package/dist/src/mcp-tools/browser-tools.js +252 -375
- package/dist/src/mcp-tools/browser-tools.js.map +1 -1
- package/dist/src/mcp-tools/claims-tools.js +473 -565
- package/dist/src/mcp-tools/claims-tools.js.map +1 -1
- package/dist/src/mcp-tools/config-tools.js +197 -272
- package/dist/src/mcp-tools/config-tools.js.map +1 -1
- package/dist/src/mcp-tools/coordination-tools.js +500 -572
- package/dist/src/mcp-tools/coordination-tools.js.map +1 -1
- package/dist/src/mcp-tools/daa-tools.js +286 -364
- package/dist/src/mcp-tools/daa-tools.js.map +1 -1
- package/dist/src/mcp-tools/embeddings-tools.js +582 -693
- package/dist/src/mcp-tools/embeddings-tools.js.map +1 -1
- package/dist/src/mcp-tools/github-tools.js +260 -311
- package/dist/src/mcp-tools/github-tools.js.map +1 -1
- package/dist/src/mcp-tools/hive-mind-tools.js +573 -640
- package/dist/src/mcp-tools/hive-mind-tools.js.map +1 -1
- package/dist/src/mcp-tools/hooks-tools.js +2215 -2648
- package/dist/src/mcp-tools/hooks-tools.js.map +1 -1
- package/dist/src/mcp-tools/memory-tools.js +350 -505
- package/dist/src/mcp-tools/memory-tools.js.map +1 -1
- package/dist/src/mcp-tools/neural-tools.js +315 -412
- package/dist/src/mcp-tools/neural-tools.js.map +1 -1
- package/dist/src/mcp-tools/performance-tools.js +420 -480
- package/dist/src/mcp-tools/performance-tools.js.map +1 -1
- package/dist/src/mcp-tools/progress-tools.js +204 -278
- package/dist/src/mcp-tools/progress-tools.js.map +1 -1
- package/dist/src/mcp-tools/ruvllm-tools.js +163 -279
- package/dist/src/mcp-tools/ruvllm-tools.js.map +1 -1
- package/dist/src/mcp-tools/security-tools.js +297 -429
- package/dist/src/mcp-tools/security-tools.js.map +1 -1
- package/dist/src/mcp-tools/session-tools.js +185 -234
- package/dist/src/mcp-tools/session-tools.js.map +1 -1
- package/dist/src/mcp-tools/swarm-tools.js +207 -260
- package/dist/src/mcp-tools/swarm-tools.js.map +1 -1
- package/dist/src/mcp-tools/system-tools.js +276 -325
- package/dist/src/mcp-tools/system-tools.js.map +1 -1
- package/dist/src/mcp-tools/task-tools.js +270 -336
- package/dist/src/mcp-tools/task-tools.js.map +1 -1
- package/dist/src/mcp-tools/terminal-tools.js +148 -196
- package/dist/src/mcp-tools/terminal-tools.js.map +1 -1
- package/dist/src/mcp-tools/transfer-tools.js +186 -333
- package/dist/src/mcp-tools/transfer-tools.js.map +1 -1
- package/dist/src/mcp-tools/types.d.ts +31 -0
- package/dist/src/mcp-tools/types.d.ts.map +1 -0
- package/dist/src/mcp-tools/wasm-agent-tools.js +133 -280
- package/dist/src/mcp-tools/wasm-agent-tools.js.map +1 -1
- package/dist/src/mcp-tools/workflow-tools.js +405 -450
- package/dist/src/mcp-tools/workflow-tools.js.map +1 -1
- package/dist/src/memory/ewc-consolidation.d.ts +295 -0
- package/dist/src/memory/ewc-consolidation.d.ts.map +1 -0
- package/dist/src/memory/ewc-consolidation.js +190 -303
- package/dist/src/memory/ewc-consolidation.js.map +1 -1
- package/dist/src/memory/intelligence.d.ts +338 -0
- package/dist/src/memory/intelligence.d.ts.map +1 -0
- package/dist/src/memory/intelligence.js +569 -794
- package/dist/src/memory/intelligence.js.map +1 -1
- package/dist/src/memory/memory-bridge.d.ts +407 -0
- package/dist/src/memory/memory-bridge.d.ts.map +1 -0
- package/dist/src/memory/memory-bridge.js +1170 -1640
- package/dist/src/memory/memory-bridge.js.map +1 -1
- package/dist/src/memory/memory-initializer.d.ts +412 -0
- package/dist/src/memory/memory-initializer.d.ts.map +1 -0
- package/dist/src/memory/memory-initializer.js +1836 -1851
- package/dist/src/memory/memory-initializer.js.map +1 -1
- package/dist/src/memory/sona-optimizer.d.ts +227 -0
- package/dist/src/memory/sona-optimizer.d.ts.map +1 -0
- package/dist/src/memory/sona-optimizer.js +199 -329
- package/dist/src/memory/sona-optimizer.js.map +1 -1
- package/dist/src/output.d.ts +2 -2
- package/dist/src/output.d.ts.map +1 -1
- package/dist/src/output.js +242 -272
- package/dist/src/output.js.map +1 -1
- package/dist/src/parser.d.ts +51 -0
- package/dist/src/parser.d.ts.map +1 -0
- package/dist/src/parser.js +140 -187
- package/dist/src/parser.js.map +1 -1
- package/dist/src/plugins/manager.d.ts +133 -0
- package/dist/src/plugins/manager.d.ts.map +1 -0
- package/dist/src/plugins/manager.js +285 -521
- package/dist/src/plugins/manager.js.map +1 -1
- package/dist/src/plugins/store/discovery.d.ts +88 -0
- package/dist/src/plugins/store/discovery.d.ts.map +1 -0
- package/dist/src/plugins/store/discovery.js +271 -358
- package/dist/src/plugins/store/discovery.js.map +1 -1
- package/dist/src/plugins/store/index.d.ts +76 -0
- package/dist/src/plugins/store/index.d.ts.map +1 -0
- package/dist/src/plugins/store/index.js +48 -105
- package/dist/src/plugins/store/index.js.map +1 -1
- package/dist/src/plugins/store/search.d.ts +46 -0
- package/dist/src/plugins/store/search.d.ts.map +1 -0
- package/dist/src/plugins/store/search.js +69 -107
- package/dist/src/plugins/store/search.js.map +1 -1
- package/dist/src/plugins/store/types.d.ts +274 -0
- package/dist/src/plugins/store/types.d.ts.map +1 -0
- package/dist/src/plugins/tests/demo-plugin-store.js +113 -160
- package/dist/src/plugins/tests/demo-plugin-store.js.map +1 -1
- package/dist/src/plugins/tests/standalone-test.js +172 -223
- package/dist/src/plugins/tests/standalone-test.js.map +1 -1
- package/dist/src/plugins/tests/test-plugin-store.js +190 -228
- package/dist/src/plugins/tests/test-plugin-store.js.map +1 -1
- package/dist/src/production/circuit-breaker.d.ts +101 -0
- package/dist/src/production/circuit-breaker.d.ts.map +1 -0
- package/dist/src/production/circuit-breaker.js +62 -126
- package/dist/src/production/circuit-breaker.js.map +1 -1
- package/dist/src/production/error-handler.d.ts +92 -0
- package/dist/src/production/error-handler.d.ts.map +1 -0
- package/dist/src/production/error-handler.js +86 -156
- package/dist/src/production/error-handler.js.map +1 -1
- package/dist/src/production/monitoring.d.ts +161 -0
- package/dist/src/production/monitoring.d.ts.map +1 -0
- package/dist/src/production/monitoring.js +139 -220
- package/dist/src/production/monitoring.js.map +1 -1
- package/dist/src/production/rate-limiter.d.ts +80 -0
- package/dist/src/production/rate-limiter.d.ts.map +1 -0
- package/dist/src/production/rate-limiter.js +74 -93
- package/dist/src/production/rate-limiter.js.map +1 -1
- package/dist/src/production/retry.d.ts +48 -0
- package/dist/src/production/retry.d.ts.map +1 -0
- package/dist/src/production/retry.js +75 -167
- package/dist/src/production/retry.js.map +1 -1
- package/dist/src/prompt.d.ts +44 -0
- package/dist/src/prompt.d.ts.map +1 -0
- package/dist/src/prompt.js +436 -560
- package/dist/src/prompt.js.map +1 -1
- package/dist/src/runtime/headless.d.ts +60 -0
- package/dist/src/runtime/headless.d.ts.map +1 -0
- package/dist/src/runtime/headless.js +197 -286
- package/dist/src/runtime/headless.js.map +1 -1
- package/dist/src/ruvector/agent-wasm.d.ts +182 -0
- package/dist/src/ruvector/agent-wasm.d.ts.map +1 -0
- package/dist/src/ruvector/agent-wasm.js +156 -351
- package/dist/src/ruvector/agent-wasm.js.map +1 -1
- package/dist/src/ruvector/ast-analyzer.d.ts +67 -0
- package/dist/src/ruvector/ast-analyzer.d.ts.map +1 -0
- package/dist/src/ruvector/ast-analyzer.js +145 -232
- package/dist/src/ruvector/ast-analyzer.js.map +1 -1
- package/dist/src/ruvector/coverage-router.d.ts +160 -0
- package/dist/src/ruvector/coverage-router.d.ts.map +1 -0
- package/dist/src/ruvector/coverage-router.js +287 -419
- package/dist/src/ruvector/coverage-router.js.map +1 -1
- package/dist/src/ruvector/coverage-tools.js +56 -101
- package/dist/src/ruvector/coverage-tools.js.map +1 -1
- package/dist/src/ruvector/diff-classifier.d.ts +175 -0
- package/dist/src/ruvector/diff-classifier.d.ts.map +1 -0
- package/dist/src/ruvector/diff-classifier.js +324 -451
- package/dist/src/ruvector/diff-classifier.js.map +1 -1
- package/dist/src/ruvector/enhanced-model-router.d.ts +146 -0
- package/dist/src/ruvector/enhanced-model-router.d.ts.map +1 -0
- package/dist/src/ruvector/enhanced-model-router.js +260 -336
- package/dist/src/ruvector/enhanced-model-router.js.map +1 -1
- package/dist/src/ruvector/flash-attention.d.ts +195 -0
- package/dist/src/ruvector/flash-attention.d.ts.map +1 -0
- package/dist/src/ruvector/flash-attention.js +223 -254
- package/dist/src/ruvector/flash-attention.js.map +1 -1
- package/dist/src/ruvector/graph-analyzer.d.ts +187 -0
- package/dist/src/ruvector/graph-analyzer.d.ts.map +1 -0
- package/dist/src/ruvector/graph-analyzer.js +486 -680
- package/dist/src/ruvector/graph-analyzer.js.map +1 -1
- package/dist/src/ruvector/index.d.ts +40 -0
- package/dist/src/ruvector/index.d.ts.map +1 -0
- package/dist/src/ruvector/index.js +36 -106
- package/dist/src/ruvector/index.js.map +1 -1
- package/dist/src/ruvector/lora-adapter.d.ts +218 -0
- package/dist/src/ruvector/lora-adapter.d.ts.map +1 -0
- package/dist/src/ruvector/lora-adapter.js +155 -248
- package/dist/src/ruvector/lora-adapter.js.map +1 -1
- package/dist/src/ruvector/model-router.d.ts +220 -0
- package/dist/src/ruvector/model-router.d.ts.map +1 -0
- package/dist/src/ruvector/model-router.js +175 -248
- package/dist/src/ruvector/model-router.js.map +1 -1
- package/dist/src/ruvector/moe-router.d.ts +206 -0
- package/dist/src/ruvector/moe-router.d.ts.map +1 -0
- package/dist/src/ruvector/moe-router.js +228 -286
- package/dist/src/ruvector/moe-router.js.map +1 -1
- package/dist/src/ruvector/q-learning-router.d.ts +211 -0
- package/dist/src/ruvector/q-learning-router.d.ts.map +1 -0
- package/dist/src/ruvector/q-learning-router.js +257 -338
- package/dist/src/ruvector/q-learning-router.js.map +1 -1
- package/dist/src/ruvector/ruvllm-wasm.d.ts +179 -0
- package/dist/src/ruvector/ruvllm-wasm.d.ts.map +1 -0
- package/dist/src/ruvector/ruvllm-wasm.js +270 -434
- package/dist/src/ruvector/ruvllm-wasm.js.map +1 -1
- package/dist/src/ruvector/semantic-router.d.ts +77 -0
- package/dist/src/ruvector/semantic-router.d.ts.map +1 -0
- package/dist/src/ruvector/semantic-router.js +60 -67
- package/dist/src/ruvector/semantic-router.js.map +1 -1
- package/dist/src/ruvector/vector-db.d.ts +69 -0
- package/dist/src/ruvector/vector-db.d.ts.map +1 -0
- package/dist/src/ruvector/vector-db.js +119 -205
- package/dist/src/ruvector/vector-db.js.map +1 -1
- package/dist/src/services/agentic-flow-bridge.d.ts +50 -0
- package/dist/src/services/agentic-flow-bridge.d.ts.map +1 -0
- package/dist/src/services/agentic-flow-bridge.js +32 -105
- package/dist/src/services/agentic-flow-bridge.js.map +1 -1
- package/dist/src/services/claim-service.d.ts +204 -0
- package/dist/src/services/claim-service.d.ts.map +1 -0
- package/dist/src/services/claim-service.js +615 -940
- package/dist/src/services/claim-service.js.map +1 -1
- package/dist/src/services/container-worker-pool.d.ts +197 -0
- package/dist/src/services/container-worker-pool.d.ts.map +1 -0
- package/dist/src/services/container-worker-pool.js +398 -666
- package/dist/src/services/container-worker-pool.js.map +1 -1
- package/dist/src/services/headless-worker-executor.d.ts +304 -0
- package/dist/src/services/headless-worker-executor.d.ts.map +1 -0
- package/dist/src/services/headless-worker-executor.js +441 -467
- package/dist/src/services/headless-worker-executor.js.map +1 -1
- package/dist/src/services/index.d.ts +4 -4
- package/dist/src/services/index.d.ts.map +1 -1
- package/dist/src/services/index.js +4 -4
- package/dist/src/services/index.js.map +1 -1
- package/dist/src/services/registry-api.d.ts +58 -0
- package/dist/src/services/registry-api.d.ts.map +1 -0
- package/dist/src/services/registry-api.js +92 -200
- package/dist/src/services/registry-api.js.map +1 -1
- package/dist/src/services/ruvector-training.d.ts +222 -0
- package/dist/src/services/ruvector-training.d.ts.map +1 -0
- package/dist/src/services/ruvector-training.js +257 -337
- package/dist/src/services/ruvector-training.js.map +1 -1
- package/dist/src/services/worker-daemon.d.ts +228 -0
- package/dist/src/services/worker-daemon.d.ts.map +1 -0
- package/dist/src/services/worker-daemon.js +591 -849
- package/dist/src/services/worker-daemon.js.map +1 -1
- package/dist/src/services/worker-queue.d.ts +194 -0
- package/dist/src/services/worker-queue.d.ts.map +1 -0
- package/dist/src/services/worker-queue.js +331 -548
- package/dist/src/services/worker-queue.js.map +1 -1
- package/dist/src/suggest.d.ts +53 -0
- package/dist/src/suggest.d.ts.map +1 -0
- package/dist/src/suggest.js +45 -55
- package/dist/src/suggest.js.map +1 -1
- package/dist/src/transfer/anonymization/index.js +29 -37
- package/dist/src/transfer/anonymization/index.js.map +1 -1
- package/dist/src/transfer/deploy-seraphine.js +128 -155
- package/dist/src/transfer/deploy-seraphine.js.map +1 -1
- package/dist/src/transfer/export.d.ts +25 -0
- package/dist/src/transfer/export.d.ts.map +1 -0
- package/dist/src/transfer/export.js +84 -142
- package/dist/src/transfer/export.js.map +1 -1
- package/dist/src/transfer/index.d.ts +1 -1
- package/dist/src/transfer/index.d.ts.map +1 -1
- package/dist/src/transfer/index.js +0 -2
- package/dist/src/transfer/index.js.map +1 -1
- package/dist/src/transfer/ipfs/client.d.ts +109 -0
- package/dist/src/transfer/ipfs/client.d.ts.map +1 -0
- package/dist/src/transfer/ipfs/client.js +187 -337
- package/dist/src/transfer/ipfs/client.js.map +1 -1
- package/dist/src/transfer/ipfs/upload.d.ts +95 -0
- package/dist/src/transfer/ipfs/upload.d.ts.map +1 -0
- package/dist/src/transfer/ipfs/upload.js +288 -434
- package/dist/src/transfer/ipfs/upload.js.map +1 -1
- package/dist/src/transfer/models/seraphine.d.ts +72 -0
- package/dist/src/transfer/models/seraphine.d.ts.map +1 -0
- package/dist/src/transfer/models/seraphine.js +55 -55
- package/dist/src/transfer/models/seraphine.js.map +1 -1
- package/dist/src/transfer/serialization/cfp.d.ts +49 -0
- package/dist/src/transfer/serialization/cfp.d.ts.map +1 -0
- package/dist/src/transfer/serialization/cfp.js +30 -31
- package/dist/src/transfer/serialization/cfp.js.map +1 -1
- package/dist/src/transfer/storage/gcs.d.ts +82 -0
- package/dist/src/transfer/storage/gcs.d.ts.map +1 -0
- package/dist/src/transfer/storage/gcs.js +165 -232
- package/dist/src/transfer/storage/gcs.js.map +1 -1
- package/dist/src/transfer/store/discovery.d.ts +84 -0
- package/dist/src/transfer/store/discovery.d.ts.map +1 -0
- package/dist/src/transfer/store/discovery.js +239 -349
- package/dist/src/transfer/store/discovery.js.map +1 -1
- package/dist/src/transfer/store/download.d.ts +70 -0
- package/dist/src/transfer/store/download.d.ts.map +1 -0
- package/dist/src/transfer/store/download.js +243 -365
- package/dist/src/transfer/store/download.js.map +1 -1
- package/dist/src/transfer/store/index.d.ts +84 -0
- package/dist/src/transfer/store/index.d.ts.map +1 -0
- package/dist/src/transfer/store/index.js +63 -130
- package/dist/src/transfer/store/index.js.map +1 -1
- package/dist/src/transfer/store/publish.d.ts +76 -0
- package/dist/src/transfer/store/publish.d.ts.map +1 -0
- package/dist/src/transfer/store/publish.js +184 -258
- package/dist/src/transfer/store/publish.js.map +1 -1
- package/dist/src/transfer/store/registry.js +50 -72
- package/dist/src/transfer/store/registry.js.map +1 -1
- package/dist/src/transfer/store/search.d.ts +54 -0
- package/dist/src/transfer/store/search.d.ts.map +1 -0
- package/dist/src/transfer/store/search.js +64 -96
- package/dist/src/transfer/store/search.js.map +1 -1
- package/dist/src/transfer/store/tests/standalone-test.js +174 -231
- package/dist/src/transfer/store/tests/standalone-test.js.map +1 -1
- package/dist/src/transfer/test-seraphine.js +95 -130
- package/dist/src/transfer/test-seraphine.js.map +1 -1
- package/dist/src/transfer/tests/test-store.js +194 -239
- package/dist/src/transfer/tests/test-store.js.map +1 -1
- package/dist/src/transfer/types.d.ts +245 -0
- package/dist/src/transfer/types.d.ts.map +1 -0
- package/dist/src/types.d.ts +198 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +26 -55
- package/dist/src/types.js.map +1 -1
- package/dist/src/update/checker.d.ts +34 -0
- package/dist/src/update/checker.d.ts.map +1 -0
- package/dist/src/update/checker.js +106 -183
- package/dist/src/update/checker.js.map +1 -1
- package/dist/src/update/executor.d.ts +32 -0
- package/dist/src/update/executor.d.ts.map +1 -0
- package/dist/src/update/executor.js +135 -198
- package/dist/src/update/executor.js.map +1 -1
- package/dist/src/update/index.d.ts +33 -0
- package/dist/src/update/index.d.ts.map +1 -0
- package/dist/src/update/index.js +38 -85
- package/dist/src/update/index.js.map +1 -1
- package/dist/src/update/rate-limiter.d.ts +20 -0
- package/dist/src/update/rate-limiter.d.ts.map +1 -0
- package/dist/src/update/rate-limiter.js +19 -31
- package/dist/src/update/rate-limiter.js.map +1 -1
- package/dist/src/update/validator.d.ts +17 -0
- package/dist/src/update/validator.d.ts.map +1 -0
- package/dist/src/update/validator.js +38 -64
- package/dist/src/update/validator.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -2,42 +2,6 @@
|
|
|
2
2
|
* V3 CLI RuVector Backup Command
|
|
3
3
|
* Backup and restore for RuVector PostgreSQL data
|
|
4
4
|
*/
|
|
5
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
6
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
7
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
8
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
9
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
10
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
11
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
12
|
-
});
|
|
13
|
-
};
|
|
14
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
15
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
16
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
17
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
18
|
-
function step(op) {
|
|
19
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
20
|
-
while (_) try {
|
|
21
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
22
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
23
|
-
switch (op[0]) {
|
|
24
|
-
case 0: case 1: t = op; break;
|
|
25
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
26
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
27
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
28
|
-
default:
|
|
29
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
30
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
31
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
32
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
33
|
-
if (t[2]) _.ops.pop();
|
|
34
|
-
_.trys.pop(); continue;
|
|
35
|
-
}
|
|
36
|
-
op = body.call(thisArg, _);
|
|
37
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
38
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
39
|
-
}
|
|
40
|
-
};
|
|
41
5
|
import { output } from '../../output.js';
|
|
42
6
|
import { confirm, input } from '../../prompt.js';
|
|
43
7
|
/**
|
|
@@ -51,7 +15,7 @@ function getConnectionConfig(ctx) {
|
|
|
51
15
|
user: ctx.flags.user || process.env.PGUSER || 'postgres',
|
|
52
16
|
password: ctx.flags.password || process.env.PGPASSWORD || '',
|
|
53
17
|
ssl: ctx.flags.ssl || process.env.PGSSLMODE === 'require',
|
|
54
|
-
schema: ctx.flags.schema || 'claude_flow'
|
|
18
|
+
schema: ctx.flags.schema || 'claude_flow',
|
|
55
19
|
};
|
|
56
20
|
}
|
|
57
21
|
/**
|
|
@@ -60,15 +24,15 @@ function getConnectionConfig(ctx) {
|
|
|
60
24
|
function formatBytes(bytes) {
|
|
61
25
|
if (bytes === 0)
|
|
62
26
|
return '0 B';
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
27
|
+
const k = 1024;
|
|
28
|
+
const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
|
|
29
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
66
30
|
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
|
|
67
31
|
}
|
|
68
32
|
/**
|
|
69
33
|
* RuVector backup subcommand
|
|
70
34
|
*/
|
|
71
|
-
|
|
35
|
+
const backupSubcommand = {
|
|
72
36
|
name: 'create',
|
|
73
37
|
description: 'Create a backup of RuVector data',
|
|
74
38
|
options: [
|
|
@@ -77,78 +41,78 @@ var backupSubcommand = {
|
|
|
77
41
|
short: 'o',
|
|
78
42
|
description: 'Output file path',
|
|
79
43
|
type: 'string',
|
|
80
|
-
required: true
|
|
44
|
+
required: true,
|
|
81
45
|
},
|
|
82
46
|
{
|
|
83
47
|
name: 'tables',
|
|
84
48
|
short: 't',
|
|
85
49
|
description: 'Specific tables (comma-separated)',
|
|
86
|
-
type: 'string'
|
|
50
|
+
type: 'string',
|
|
87
51
|
},
|
|
88
52
|
{
|
|
89
53
|
name: 'format',
|
|
90
54
|
short: 'f',
|
|
91
55
|
description: 'Output format',
|
|
92
56
|
type: 'string',
|
|
93
|
-
|
|
94
|
-
choices: ['sql', 'json', 'csv']
|
|
57
|
+
default: 'sql',
|
|
58
|
+
choices: ['sql', 'json', 'csv'],
|
|
95
59
|
},
|
|
96
60
|
{
|
|
97
61
|
name: 'compress',
|
|
98
62
|
short: 'c',
|
|
99
63
|
description: 'Compress output (gzip)',
|
|
100
64
|
type: 'boolean',
|
|
101
|
-
|
|
65
|
+
default: false,
|
|
102
66
|
},
|
|
103
67
|
{
|
|
104
68
|
name: 'include-indexes',
|
|
105
69
|
description: 'Include index definitions',
|
|
106
70
|
type: 'boolean',
|
|
107
|
-
|
|
71
|
+
default: true,
|
|
108
72
|
},
|
|
109
73
|
{
|
|
110
74
|
name: 'host',
|
|
111
75
|
short: 'h',
|
|
112
76
|
description: 'PostgreSQL host',
|
|
113
77
|
type: 'string',
|
|
114
|
-
|
|
78
|
+
default: 'localhost',
|
|
115
79
|
},
|
|
116
80
|
{
|
|
117
81
|
name: 'port',
|
|
118
82
|
short: 'p',
|
|
119
83
|
description: 'PostgreSQL port',
|
|
120
84
|
type: 'number',
|
|
121
|
-
|
|
85
|
+
default: 5432,
|
|
122
86
|
},
|
|
123
87
|
{
|
|
124
88
|
name: 'database',
|
|
125
89
|
short: 'd',
|
|
126
90
|
description: 'Database name',
|
|
127
|
-
type: 'string'
|
|
91
|
+
type: 'string',
|
|
128
92
|
},
|
|
129
93
|
{
|
|
130
94
|
name: 'user',
|
|
131
95
|
short: 'u',
|
|
132
96
|
description: 'Database user',
|
|
133
|
-
type: 'string'
|
|
97
|
+
type: 'string',
|
|
134
98
|
},
|
|
135
99
|
{
|
|
136
100
|
name: 'password',
|
|
137
101
|
description: 'Database password',
|
|
138
|
-
type: 'string'
|
|
102
|
+
type: 'string',
|
|
139
103
|
},
|
|
140
104
|
{
|
|
141
105
|
name: 'ssl',
|
|
142
106
|
description: 'Enable SSL',
|
|
143
107
|
type: 'boolean',
|
|
144
|
-
|
|
108
|
+
default: false,
|
|
145
109
|
},
|
|
146
110
|
{
|
|
147
111
|
name: 'schema',
|
|
148
112
|
short: 's',
|
|
149
113
|
description: 'Schema name',
|
|
150
114
|
type: 'string',
|
|
151
|
-
|
|
115
|
+
default: 'claude_flow',
|
|
152
116
|
},
|
|
153
117
|
],
|
|
154
118
|
examples: [
|
|
@@ -156,275 +120,246 @@ var backupSubcommand = {
|
|
|
156
120
|
{ command: 'claude-flow ruvector backup create -o backup.json --format json', description: 'Create JSON backup' },
|
|
157
121
|
{ command: 'claude-flow ruvector backup create -o backup.sql.gz --compress', description: 'Compressed backup' },
|
|
158
122
|
],
|
|
159
|
-
action:
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
if (
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
lines.push(
|
|
315
|
-
lines.push('');
|
|
316
|
-
if (table.rows.length > 0) {
|
|
317
|
-
_loop_1 = function (row) {
|
|
318
|
-
var values = table.columns.map(function (col) {
|
|
319
|
-
var val = row[col];
|
|
320
|
-
if (val === null || val === undefined)
|
|
321
|
-
return 'NULL';
|
|
322
|
-
if (typeof val === 'string')
|
|
323
|
-
return "'" + val.replace(/'/g, "''") + "'";
|
|
324
|
-
if (typeof val === 'object')
|
|
325
|
-
return "'" + JSON.stringify(val).replace(/'/g, "''") + "'";
|
|
326
|
-
return String(val);
|
|
327
|
-
});
|
|
328
|
-
lines.push("INSERT INTO " + config.schema + "." + table.name + " (" + table.columns.join(', ') + ") VALUES (" + values.join(', ') + ");");
|
|
329
|
-
};
|
|
330
|
-
for (_d = 0, _e = table.rows; _d < _e.length; _d++) {
|
|
331
|
-
row = _e[_d];
|
|
332
|
-
_loop_1(row);
|
|
333
|
-
}
|
|
334
|
-
lines.push('');
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
// Add indexes
|
|
338
|
-
if (includeIndexes && backupData.indexes.length > 0) {
|
|
339
|
-
lines.push('-- Indexes');
|
|
340
|
-
for (_f = 0, _g = backupData.indexes; _f < _g.length; _f++) {
|
|
341
|
-
idx = _g[_f];
|
|
342
|
-
lines.push(idx + ";");
|
|
343
|
-
}
|
|
123
|
+
action: async (ctx) => {
|
|
124
|
+
const config = getConnectionConfig(ctx);
|
|
125
|
+
let outputPath = ctx.flags.output;
|
|
126
|
+
const tablesFilter = ctx.flags.tables;
|
|
127
|
+
const format = ctx.flags.format || 'sql';
|
|
128
|
+
const compress = ctx.flags.compress;
|
|
129
|
+
const includeIndexes = ctx.flags['include-indexes'] !== false;
|
|
130
|
+
output.writeln();
|
|
131
|
+
output.writeln(output.bold('RuVector Backup'));
|
|
132
|
+
output.writeln(output.dim('='.repeat(60)));
|
|
133
|
+
output.writeln();
|
|
134
|
+
if (!config.database) {
|
|
135
|
+
output.printError('Database name is required. Use --database or -d flag, or set PGDATABASE env.');
|
|
136
|
+
return { success: false, exitCode: 1 };
|
|
137
|
+
}
|
|
138
|
+
// Interactive mode
|
|
139
|
+
if (!outputPath && ctx.interactive) {
|
|
140
|
+
outputPath = await input({
|
|
141
|
+
message: 'Output file path:',
|
|
142
|
+
default: `ruvector_backup_${new Date().toISOString().split('T')[0]}.${format}`,
|
|
143
|
+
validate: (v) => v.length > 0 || 'Output path is required',
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
if (!outputPath) {
|
|
147
|
+
output.printError('Output path is required. Use --output or -o flag.');
|
|
148
|
+
return { success: false, exitCode: 1 };
|
|
149
|
+
}
|
|
150
|
+
const spinner = output.createSpinner({ text: 'Connecting to PostgreSQL...', spinner: 'dots' });
|
|
151
|
+
spinner.start();
|
|
152
|
+
try {
|
|
153
|
+
// Import dependencies
|
|
154
|
+
const fs = await import('fs');
|
|
155
|
+
const path = await import('path');
|
|
156
|
+
const { promisify } = await import('util');
|
|
157
|
+
let pg = null;
|
|
158
|
+
try {
|
|
159
|
+
pg = await import('pg');
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
spinner.fail('PostgreSQL driver not found');
|
|
163
|
+
output.printError('Install pg package: npm install pg');
|
|
164
|
+
return { success: false, exitCode: 1 };
|
|
165
|
+
}
|
|
166
|
+
const client = new pg.Client({
|
|
167
|
+
host: config.host,
|
|
168
|
+
port: config.port,
|
|
169
|
+
database: config.database,
|
|
170
|
+
user: config.user,
|
|
171
|
+
password: config.password,
|
|
172
|
+
ssl: config.ssl ? { rejectUnauthorized: false } : false,
|
|
173
|
+
});
|
|
174
|
+
await client.connect();
|
|
175
|
+
spinner.succeed('Connected to PostgreSQL');
|
|
176
|
+
// Get tables to backup
|
|
177
|
+
spinner.setText('Discovering tables...');
|
|
178
|
+
spinner.start();
|
|
179
|
+
let tables = [];
|
|
180
|
+
if (tablesFilter) {
|
|
181
|
+
tables = tablesFilter.split(',').map(t => t.trim());
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
const tablesResult = await client.query(`
|
|
185
|
+
SELECT table_name FROM information_schema.tables
|
|
186
|
+
WHERE table_schema = $1 AND table_type = 'BASE TABLE'
|
|
187
|
+
ORDER BY table_name
|
|
188
|
+
`, [config.schema]);
|
|
189
|
+
tables = tablesResult.rows.map(r => r.table_name);
|
|
190
|
+
}
|
|
191
|
+
spinner.succeed(`Found ${tables.length} tables to backup`);
|
|
192
|
+
// Prepare backup data
|
|
193
|
+
const backupData = {
|
|
194
|
+
metadata: {
|
|
195
|
+
backupDate: new Date().toISOString(),
|
|
196
|
+
database: config.database,
|
|
197
|
+
schema: config.schema,
|
|
198
|
+
format,
|
|
199
|
+
version: '1.0.0',
|
|
200
|
+
},
|
|
201
|
+
schema: config.schema,
|
|
202
|
+
tables: [],
|
|
203
|
+
indexes: [],
|
|
204
|
+
};
|
|
205
|
+
let totalRows = 0;
|
|
206
|
+
// Export each table
|
|
207
|
+
for (const tableName of tables) {
|
|
208
|
+
spinner.setText(`Exporting ${tableName}...`);
|
|
209
|
+
spinner.start();
|
|
210
|
+
// Get columns
|
|
211
|
+
const columnsResult = await client.query(`
|
|
212
|
+
SELECT column_name, data_type
|
|
213
|
+
FROM information_schema.columns
|
|
214
|
+
WHERE table_schema = $1 AND table_name = $2
|
|
215
|
+
ORDER BY ordinal_position
|
|
216
|
+
`, [config.schema, tableName]);
|
|
217
|
+
const columns = columnsResult.rows.map(r => r.column_name);
|
|
218
|
+
// Get data
|
|
219
|
+
const dataResult = await client.query(`
|
|
220
|
+
SELECT * FROM ${config.schema}.${tableName}
|
|
221
|
+
`);
|
|
222
|
+
backupData.tables.push({
|
|
223
|
+
name: tableName,
|
|
224
|
+
columns,
|
|
225
|
+
rows: dataResult.rows,
|
|
226
|
+
});
|
|
227
|
+
totalRows += dataResult.rows.length;
|
|
228
|
+
spinner.setText(`Exporting ${tableName}... (${dataResult.rows.length} rows)`);
|
|
229
|
+
}
|
|
230
|
+
spinner.succeed(`Exported ${totalRows.toLocaleString()} rows from ${tables.length} tables`);
|
|
231
|
+
// Get indexes
|
|
232
|
+
if (includeIndexes) {
|
|
233
|
+
spinner.setText('Exporting index definitions...');
|
|
234
|
+
spinner.start();
|
|
235
|
+
const indexResult = await client.query(`
|
|
236
|
+
SELECT pg_get_indexdef(i.oid) as indexdef
|
|
237
|
+
FROM pg_index idx
|
|
238
|
+
JOIN pg_class i ON i.oid = idx.indexrelid
|
|
239
|
+
JOIN pg_class t ON t.oid = idx.indrelid
|
|
240
|
+
JOIN pg_namespace n ON n.oid = t.relnamespace
|
|
241
|
+
WHERE n.nspname = $1
|
|
242
|
+
AND NOT idx.indisprimary
|
|
243
|
+
`, [config.schema]);
|
|
244
|
+
backupData.indexes = indexResult.rows.map(r => r.indexdef);
|
|
245
|
+
spinner.succeed(`Exported ${backupData.indexes.length} index definitions`);
|
|
246
|
+
}
|
|
247
|
+
await client.end();
|
|
248
|
+
// Write backup file
|
|
249
|
+
spinner.setText(`Writing backup to ${outputPath}...`);
|
|
250
|
+
spinner.start();
|
|
251
|
+
let content;
|
|
252
|
+
if (format === 'sql') {
|
|
253
|
+
// Generate SQL format
|
|
254
|
+
const lines = [];
|
|
255
|
+
lines.push(`-- RuVector Backup`);
|
|
256
|
+
lines.push(`-- Generated: ${backupData.metadata.backupDate}`);
|
|
257
|
+
lines.push(`-- Database: ${config.database}`);
|
|
258
|
+
lines.push(`-- Schema: ${config.schema}`);
|
|
259
|
+
lines.push('');
|
|
260
|
+
lines.push(`CREATE SCHEMA IF NOT EXISTS ${config.schema};`);
|
|
261
|
+
lines.push('');
|
|
262
|
+
for (const table of backupData.tables) {
|
|
263
|
+
lines.push(`-- Table: ${table.name}`);
|
|
264
|
+
lines.push(`-- Rows: ${table.rows.length}`);
|
|
265
|
+
lines.push('');
|
|
266
|
+
if (table.rows.length > 0) {
|
|
267
|
+
for (const row of table.rows) {
|
|
268
|
+
const values = table.columns.map(col => {
|
|
269
|
+
const val = row[col];
|
|
270
|
+
if (val === null || val === undefined)
|
|
271
|
+
return 'NULL';
|
|
272
|
+
if (typeof val === 'string')
|
|
273
|
+
return `'${val.replace(/'/g, "''")}'`;
|
|
274
|
+
if (typeof val === 'object')
|
|
275
|
+
return `'${JSON.stringify(val).replace(/'/g, "''")}'`;
|
|
276
|
+
return String(val);
|
|
277
|
+
});
|
|
278
|
+
lines.push(`INSERT INTO ${config.schema}.${table.name} (${table.columns.join(', ')}) VALUES (${values.join(', ')});`);
|
|
344
279
|
}
|
|
345
|
-
|
|
280
|
+
lines.push('');
|
|
346
281
|
}
|
|
347
|
-
|
|
348
|
-
|
|
282
|
+
}
|
|
283
|
+
// Add indexes
|
|
284
|
+
if (includeIndexes && backupData.indexes.length > 0) {
|
|
285
|
+
lines.push('-- Indexes');
|
|
286
|
+
for (const idx of backupData.indexes) {
|
|
287
|
+
lines.push(`${idx};`);
|
|
349
288
|
}
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
}
|
|
372
|
-
content = lines.join('\n');
|
|
289
|
+
}
|
|
290
|
+
content = lines.join('\n');
|
|
291
|
+
}
|
|
292
|
+
else if (format === 'json') {
|
|
293
|
+
content = JSON.stringify(backupData, null, 2);
|
|
294
|
+
}
|
|
295
|
+
else {
|
|
296
|
+
// CSV format - one file per table would be better, but we'll concatenate
|
|
297
|
+
const lines = [];
|
|
298
|
+
for (const table of backupData.tables) {
|
|
299
|
+
lines.push(`# Table: ${table.name}`);
|
|
300
|
+
lines.push(table.columns.join(','));
|
|
301
|
+
for (const row of table.rows) {
|
|
302
|
+
const values = table.columns.map(col => {
|
|
303
|
+
const val = row[col];
|
|
304
|
+
if (val === null || val === undefined)
|
|
305
|
+
return '';
|
|
306
|
+
const str = typeof val === 'object' ? JSON.stringify(val) : String(val);
|
|
307
|
+
return str.includes(',') || str.includes('"') ? `"${str.replace(/"/g, '""')}"` : str;
|
|
308
|
+
});
|
|
309
|
+
lines.push(values.join(','));
|
|
373
310
|
}
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
case 25:
|
|
386
|
-
fs.writeFileSync(outputPath, content, 'utf-8');
|
|
387
|
-
_m.label = 26;
|
|
388
|
-
case 26:
|
|
389
|
-
fileSize = fs.statSync(outputPath).size;
|
|
390
|
-
spinner.succeed("Backup written to " + outputPath + " (" + formatBytes(fileSize) + ")");
|
|
391
|
-
output.writeln();
|
|
392
|
-
output.printSuccess('Backup completed successfully!');
|
|
393
|
-
output.writeln();
|
|
394
|
-
output.printBox([
|
|
395
|
-
"Output: " + outputPath,
|
|
396
|
-
"Format: " + format.toUpperCase() + (compress ? ' (gzip compressed)' : ''),
|
|
397
|
-
"Size: " + formatBytes(fileSize),
|
|
398
|
-
"Tables: " + tables.length,
|
|
399
|
-
"Total Rows: " + totalRows.toLocaleString(),
|
|
400
|
-
"Indexes: " + backupData.indexes.length,
|
|
401
|
-
].join('\n'), 'Backup Summary');
|
|
402
|
-
return [2 /*return*/, {
|
|
403
|
-
success: true,
|
|
404
|
-
data: {
|
|
405
|
-
outputPath: outputPath,
|
|
406
|
-
format: format,
|
|
407
|
-
compressed: compress,
|
|
408
|
-
tables: tables.length,
|
|
409
|
-
totalRows: totalRows,
|
|
410
|
-
indexes: backupData.indexes.length,
|
|
411
|
-
fileSize: fileSize
|
|
412
|
-
}
|
|
413
|
-
}];
|
|
414
|
-
case 27:
|
|
415
|
-
error_1 = _m.sent();
|
|
416
|
-
spinner.fail('Backup failed');
|
|
417
|
-
output.printError(error_1 instanceof Error ? error_1.message : String(error_1));
|
|
418
|
-
return [2 /*return*/, { success: false, exitCode: 1 }];
|
|
419
|
-
case 28: return [2 /*return*/];
|
|
311
|
+
lines.push('');
|
|
312
|
+
}
|
|
313
|
+
content = lines.join('\n');
|
|
314
|
+
}
|
|
315
|
+
// Compress if requested
|
|
316
|
+
if (compress) {
|
|
317
|
+
const zlib = await import('zlib');
|
|
318
|
+
const gzip = promisify(zlib.gzip);
|
|
319
|
+
const compressed = await gzip(Buffer.from(content, 'utf-8'));
|
|
320
|
+
outputPath = outputPath.endsWith('.gz') ? outputPath : `${outputPath}.gz`;
|
|
321
|
+
fs.writeFileSync(outputPath, compressed);
|
|
420
322
|
}
|
|
421
|
-
|
|
422
|
-
|
|
323
|
+
else {
|
|
324
|
+
fs.writeFileSync(outputPath, content, 'utf-8');
|
|
325
|
+
}
|
|
326
|
+
const fileSize = fs.statSync(outputPath).size;
|
|
327
|
+
spinner.succeed(`Backup written to ${outputPath} (${formatBytes(fileSize)})`);
|
|
328
|
+
output.writeln();
|
|
329
|
+
output.printSuccess('Backup completed successfully!');
|
|
330
|
+
output.writeln();
|
|
331
|
+
output.printBox([
|
|
332
|
+
`Output: ${outputPath}`,
|
|
333
|
+
`Format: ${format.toUpperCase()}${compress ? ' (gzip compressed)' : ''}`,
|
|
334
|
+
`Size: ${formatBytes(fileSize)}`,
|
|
335
|
+
`Tables: ${tables.length}`,
|
|
336
|
+
`Total Rows: ${totalRows.toLocaleString()}`,
|
|
337
|
+
`Indexes: ${backupData.indexes.length}`,
|
|
338
|
+
].join('\n'), 'Backup Summary');
|
|
339
|
+
return {
|
|
340
|
+
success: true,
|
|
341
|
+
data: {
|
|
342
|
+
outputPath,
|
|
343
|
+
format,
|
|
344
|
+
compressed: compress,
|
|
345
|
+
tables: tables.length,
|
|
346
|
+
totalRows,
|
|
347
|
+
indexes: backupData.indexes.length,
|
|
348
|
+
fileSize,
|
|
349
|
+
},
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
catch (error) {
|
|
353
|
+
spinner.fail('Backup failed');
|
|
354
|
+
output.printError(error instanceof Error ? error.message : String(error));
|
|
355
|
+
return { success: false, exitCode: 1 };
|
|
356
|
+
}
|
|
357
|
+
},
|
|
423
358
|
};
|
|
424
359
|
/**
|
|
425
360
|
* RuVector restore subcommand
|
|
426
361
|
*/
|
|
427
|
-
|
|
362
|
+
const restoreSubcommand = {
|
|
428
363
|
name: 'restore',
|
|
429
364
|
description: 'Restore RuVector data from backup',
|
|
430
365
|
options: [
|
|
@@ -433,63 +368,63 @@ var restoreSubcommand = {
|
|
|
433
368
|
short: 'i',
|
|
434
369
|
description: 'Input file path',
|
|
435
370
|
type: 'string',
|
|
436
|
-
required: true
|
|
371
|
+
required: true,
|
|
437
372
|
},
|
|
438
373
|
{
|
|
439
374
|
name: 'clean',
|
|
440
375
|
description: 'Drop existing tables first',
|
|
441
376
|
type: 'boolean',
|
|
442
|
-
|
|
377
|
+
default: false,
|
|
443
378
|
},
|
|
444
379
|
{
|
|
445
380
|
name: 'dry-run',
|
|
446
381
|
description: 'Show what would be restored without executing',
|
|
447
382
|
type: 'boolean',
|
|
448
|
-
|
|
383
|
+
default: false,
|
|
449
384
|
},
|
|
450
385
|
{
|
|
451
386
|
name: 'host',
|
|
452
387
|
short: 'h',
|
|
453
388
|
description: 'PostgreSQL host',
|
|
454
389
|
type: 'string',
|
|
455
|
-
|
|
390
|
+
default: 'localhost',
|
|
456
391
|
},
|
|
457
392
|
{
|
|
458
393
|
name: 'port',
|
|
459
394
|
short: 'p',
|
|
460
395
|
description: 'PostgreSQL port',
|
|
461
396
|
type: 'number',
|
|
462
|
-
|
|
397
|
+
default: 5432,
|
|
463
398
|
},
|
|
464
399
|
{
|
|
465
400
|
name: 'database',
|
|
466
401
|
short: 'd',
|
|
467
402
|
description: 'Database name',
|
|
468
|
-
type: 'string'
|
|
403
|
+
type: 'string',
|
|
469
404
|
},
|
|
470
405
|
{
|
|
471
406
|
name: 'user',
|
|
472
407
|
short: 'u',
|
|
473
408
|
description: 'Database user',
|
|
474
|
-
type: 'string'
|
|
409
|
+
type: 'string',
|
|
475
410
|
},
|
|
476
411
|
{
|
|
477
412
|
name: 'password',
|
|
478
413
|
description: 'Database password',
|
|
479
|
-
type: 'string'
|
|
414
|
+
type: 'string',
|
|
480
415
|
},
|
|
481
416
|
{
|
|
482
417
|
name: 'ssl',
|
|
483
418
|
description: 'Enable SSL',
|
|
484
419
|
type: 'boolean',
|
|
485
|
-
|
|
420
|
+
default: false,
|
|
486
421
|
},
|
|
487
422
|
{
|
|
488
423
|
name: 'schema',
|
|
489
424
|
short: 's',
|
|
490
425
|
description: 'Schema name',
|
|
491
426
|
type: 'string',
|
|
492
|
-
|
|
427
|
+
default: 'claude_flow',
|
|
493
428
|
},
|
|
494
429
|
],
|
|
495
430
|
examples: [
|
|
@@ -497,315 +432,236 @@ var restoreSubcommand = {
|
|
|
497
432
|
{ command: 'claude-flow ruvector backup restore -i backup.json --clean', description: 'Clean restore' },
|
|
498
433
|
{ command: 'claude-flow ruvector backup restore -i backup.sql --dry-run', description: 'Preview restore' },
|
|
499
434
|
],
|
|
500
|
-
action:
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
435
|
+
action: async (ctx) => {
|
|
436
|
+
const config = getConnectionConfig(ctx);
|
|
437
|
+
const inputPath = ctx.flags.input;
|
|
438
|
+
const clean = ctx.flags.clean;
|
|
439
|
+
const dryRun = ctx.flags['dry-run'];
|
|
440
|
+
output.writeln();
|
|
441
|
+
output.writeln(output.bold('RuVector Restore'));
|
|
442
|
+
output.writeln(output.dim('='.repeat(60)));
|
|
443
|
+
output.writeln();
|
|
444
|
+
if (!config.database) {
|
|
445
|
+
output.printError('Database name is required. Use --database or -d flag, or set PGDATABASE env.');
|
|
446
|
+
return { success: false, exitCode: 1 };
|
|
447
|
+
}
|
|
448
|
+
if (!inputPath) {
|
|
449
|
+
output.printError('Input path is required. Use --input or -i flag.');
|
|
450
|
+
return { success: false, exitCode: 1 };
|
|
451
|
+
}
|
|
452
|
+
const spinner = output.createSpinner({ text: 'Reading backup file...', spinner: 'dots' });
|
|
453
|
+
spinner.start();
|
|
454
|
+
try {
|
|
455
|
+
const fs = await import('fs');
|
|
456
|
+
const path = await import('path');
|
|
457
|
+
const { promisify } = await import('util');
|
|
458
|
+
// Check file exists
|
|
459
|
+
if (!fs.existsSync(inputPath)) {
|
|
460
|
+
spinner.fail('Backup file not found');
|
|
461
|
+
output.printError(`File not found: ${inputPath}`);
|
|
462
|
+
return { success: false, exitCode: 1 };
|
|
463
|
+
}
|
|
464
|
+
// Read file
|
|
465
|
+
let content;
|
|
466
|
+
if (inputPath.endsWith('.gz')) {
|
|
467
|
+
const zlib = await import('zlib');
|
|
468
|
+
const gunzip = promisify(zlib.gunzip);
|
|
469
|
+
const compressed = fs.readFileSync(inputPath);
|
|
470
|
+
const decompressed = await gunzip(compressed);
|
|
471
|
+
content = decompressed.toString('utf-8');
|
|
472
|
+
}
|
|
473
|
+
else {
|
|
474
|
+
content = fs.readFileSync(inputPath, 'utf-8');
|
|
475
|
+
}
|
|
476
|
+
const fileSize = fs.statSync(inputPath).size;
|
|
477
|
+
spinner.succeed(`Read backup file (${formatBytes(fileSize)})`);
|
|
478
|
+
// Determine format
|
|
479
|
+
const isJson = content.trim().startsWith('{');
|
|
480
|
+
const format = isJson ? 'json' : 'sql';
|
|
481
|
+
if (dryRun) {
|
|
482
|
+
output.printInfo('Dry run mode: showing what would be restored');
|
|
483
|
+
output.writeln();
|
|
484
|
+
if (isJson) {
|
|
485
|
+
const data = JSON.parse(content);
|
|
486
|
+
output.writeln(output.highlight('Backup metadata:'));
|
|
487
|
+
output.printTable({
|
|
488
|
+
columns: [
|
|
489
|
+
{ key: 'property', header: 'Property', width: 20 },
|
|
490
|
+
{ key: 'value', header: 'Value', width: 40 },
|
|
491
|
+
],
|
|
492
|
+
data: [
|
|
493
|
+
{ property: 'Backup Date', value: data.metadata?.backupDate || 'Unknown' },
|
|
494
|
+
{ property: 'Database', value: data.metadata?.database || 'Unknown' },
|
|
495
|
+
{ property: 'Schema', value: data.schema || 'Unknown' },
|
|
496
|
+
{ property: 'Tables', value: String(data.tables?.length || 0) },
|
|
497
|
+
{ property: 'Total Rows', value: String(data.tables?.reduce((sum, t) => sum + t.rows.length, 0) || 0) },
|
|
498
|
+
{ property: 'Indexes', value: String(data.indexes?.length || 0) },
|
|
499
|
+
],
|
|
500
|
+
});
|
|
501
|
+
}
|
|
502
|
+
else {
|
|
503
|
+
// Count SQL statements
|
|
504
|
+
const insertCount = (content.match(/INSERT INTO/gi) || []).length;
|
|
505
|
+
const createCount = (content.match(/CREATE (TABLE|INDEX)/gi) || []).length;
|
|
506
|
+
output.writeln(`SQL statements: ${insertCount} inserts, ${createCount} creates`);
|
|
507
|
+
}
|
|
508
|
+
return { success: true, data: { dryRun: true } };
|
|
509
|
+
}
|
|
510
|
+
// Confirm clean operation
|
|
511
|
+
if (clean && ctx.interactive) {
|
|
512
|
+
const confirmClean = await confirm({
|
|
513
|
+
message: 'This will drop existing tables. Continue?',
|
|
514
|
+
default: false,
|
|
515
|
+
});
|
|
516
|
+
if (!confirmClean) {
|
|
517
|
+
output.printInfo('Restore cancelled');
|
|
518
|
+
return { success: false, exitCode: 0 };
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
// Connect and restore
|
|
522
|
+
let pg = null;
|
|
523
|
+
try {
|
|
524
|
+
pg = await import('pg');
|
|
525
|
+
}
|
|
526
|
+
catch {
|
|
527
|
+
spinner.fail('PostgreSQL driver not found');
|
|
528
|
+
output.printError('Install pg package: npm install pg');
|
|
529
|
+
return { success: false, exitCode: 1 };
|
|
530
|
+
}
|
|
531
|
+
const client = new pg.Client({
|
|
532
|
+
host: config.host,
|
|
533
|
+
port: config.port,
|
|
534
|
+
database: config.database,
|
|
535
|
+
user: config.user,
|
|
536
|
+
password: config.password,
|
|
537
|
+
ssl: config.ssl ? { rejectUnauthorized: false } : false,
|
|
538
|
+
});
|
|
539
|
+
await client.connect();
|
|
540
|
+
spinner.succeed('Connected to PostgreSQL');
|
|
541
|
+
// Clean if requested
|
|
542
|
+
if (clean) {
|
|
543
|
+
spinner.setText(`Dropping schema "${config.schema}"...`);
|
|
544
|
+
spinner.start();
|
|
545
|
+
await client.query(`DROP SCHEMA IF EXISTS ${config.schema} CASCADE`);
|
|
546
|
+
await client.query(`CREATE SCHEMA ${config.schema}`);
|
|
547
|
+
spinner.succeed('Schema cleaned');
|
|
548
|
+
}
|
|
549
|
+
// Restore
|
|
550
|
+
let restoredRows = 0;
|
|
551
|
+
let restoredTables = 0;
|
|
552
|
+
let restoredIndexes = 0;
|
|
553
|
+
if (isJson) {
|
|
554
|
+
// Restore from JSON
|
|
555
|
+
const data = JSON.parse(content);
|
|
556
|
+
for (const table of data.tables || []) {
|
|
557
|
+
spinner.setText(`Restoring ${table.name}...`);
|
|
523
558
|
spinner.start();
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
output.printError("File not found: " + inputPath);
|
|
540
|
-
return [2 /*return*/, { success: false, exitCode: 1 }];
|
|
541
|
-
}
|
|
542
|
-
content = void 0;
|
|
543
|
-
if (!inputPath.endsWith('.gz')) return [3 /*break*/, 7];
|
|
544
|
-
return [4 /*yield*/, import('zlib')];
|
|
545
|
-
case 5:
|
|
546
|
-
zlib = _p.sent();
|
|
547
|
-
gunzip = promisify(zlib.gunzip);
|
|
548
|
-
compressed = fs.readFileSync(inputPath);
|
|
549
|
-
return [4 /*yield*/, gunzip(compressed)];
|
|
550
|
-
case 6:
|
|
551
|
-
decompressed = _p.sent();
|
|
552
|
-
content = decompressed.toString('utf-8');
|
|
553
|
-
return [3 /*break*/, 8];
|
|
554
|
-
case 7:
|
|
555
|
-
content = fs.readFileSync(inputPath, 'utf-8');
|
|
556
|
-
_p.label = 8;
|
|
557
|
-
case 8:
|
|
558
|
-
fileSize = fs.statSync(inputPath).size;
|
|
559
|
-
spinner.succeed("Read backup file (" + formatBytes(fileSize) + ")");
|
|
560
|
-
isJson = content.trim().startsWith('{');
|
|
561
|
-
format = isJson ? 'json' : 'sql';
|
|
562
|
-
if (dryRun) {
|
|
563
|
-
output.printInfo('Dry run mode: showing what would be restored');
|
|
564
|
-
output.writeln();
|
|
565
|
-
if (isJson) {
|
|
566
|
-
data = JSON.parse(content);
|
|
567
|
-
output.writeln(output.highlight('Backup metadata:'));
|
|
568
|
-
output.printTable({
|
|
569
|
-
columns: [
|
|
570
|
-
{ key: 'property', header: 'Property', width: 20 },
|
|
571
|
-
{ key: 'value', header: 'Value', width: 40 },
|
|
572
|
-
],
|
|
573
|
-
data: [
|
|
574
|
-
{ property: 'Backup Date', value: ((_j = data.metadata) === null || _j === void 0 ? void 0 : _j.backupDate) || 'Unknown' },
|
|
575
|
-
{ property: 'Database', value: ((_k = data.metadata) === null || _k === void 0 ? void 0 : _k.database) || 'Unknown' },
|
|
576
|
-
{ property: 'Schema', value: data.schema || 'Unknown' },
|
|
577
|
-
{ property: 'Tables', value: String(((_l = data.tables) === null || _l === void 0 ? void 0 : _l.length) || 0) },
|
|
578
|
-
{ property: 'Total Rows', value: String(((_m = data.tables) === null || _m === void 0 ? void 0 : _m.reduce(function (sum, t) { return sum + t.rows.length; }, 0)) || 0) },
|
|
579
|
-
{ property: 'Indexes', value: String(((_o = data.indexes) === null || _o === void 0 ? void 0 : _o.length) || 0) },
|
|
580
|
-
]
|
|
581
|
-
});
|
|
559
|
+
// Create table if needed (assuming schema matches)
|
|
560
|
+
for (const row of table.rows) {
|
|
561
|
+
const columns = Object.keys(row);
|
|
562
|
+
const values = columns.map((col, idx) => `$${idx + 1}`);
|
|
563
|
+
const params = columns.map(col => {
|
|
564
|
+
const val = row[col];
|
|
565
|
+
return typeof val === 'object' ? JSON.stringify(val) : val;
|
|
566
|
+
});
|
|
567
|
+
try {
|
|
568
|
+
await client.query(`
|
|
569
|
+
INSERT INTO ${config.schema}.${table.name} (${columns.join(', ')})
|
|
570
|
+
VALUES (${values.join(', ')})
|
|
571
|
+
ON CONFLICT DO NOTHING
|
|
572
|
+
`, params);
|
|
573
|
+
restoredRows++;
|
|
582
574
|
}
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
createCount = (content.match(/CREATE (TABLE|INDEX)/gi) || []).length;
|
|
586
|
-
output.writeln("SQL statements: " + insertCount + " inserts, " + createCount + " creates");
|
|
575
|
+
catch {
|
|
576
|
+
// Skip conflicts
|
|
587
577
|
}
|
|
588
|
-
return [2 /*return*/, { success: true, data: { dryRun: true } }];
|
|
589
578
|
}
|
|
590
|
-
if (!(clean && ctx.interactive)) return [3 /*break*/, 10];
|
|
591
|
-
return [4 /*yield*/, confirm({
|
|
592
|
-
message: 'This will drop existing tables. Continue?',
|
|
593
|
-
"default": false
|
|
594
|
-
})];
|
|
595
|
-
case 9:
|
|
596
|
-
confirmClean = _p.sent();
|
|
597
|
-
if (!confirmClean) {
|
|
598
|
-
output.printInfo('Restore cancelled');
|
|
599
|
-
return [2 /*return*/, { success: false, exitCode: 0 }];
|
|
600
|
-
}
|
|
601
|
-
_p.label = 10;
|
|
602
|
-
case 10:
|
|
603
|
-
pg = null;
|
|
604
|
-
_p.label = 11;
|
|
605
|
-
case 11:
|
|
606
|
-
_p.trys.push([11, 13, , 14]);
|
|
607
|
-
return [4 /*yield*/, import('pg')];
|
|
608
|
-
case 12:
|
|
609
|
-
pg = _p.sent();
|
|
610
|
-
return [3 /*break*/, 14];
|
|
611
|
-
case 13:
|
|
612
|
-
_a = _p.sent();
|
|
613
|
-
spinner.fail('PostgreSQL driver not found');
|
|
614
|
-
output.printError('Install pg package: npm install pg');
|
|
615
|
-
return [2 /*return*/, { success: false, exitCode: 1 }];
|
|
616
|
-
case 14:
|
|
617
|
-
client = new pg.Client({
|
|
618
|
-
host: config.host,
|
|
619
|
-
port: config.port,
|
|
620
|
-
database: config.database,
|
|
621
|
-
user: config.user,
|
|
622
|
-
password: config.password,
|
|
623
|
-
ssl: config.ssl ? { rejectUnauthorized: false } : false
|
|
624
|
-
});
|
|
625
|
-
return [4 /*yield*/, client.connect()];
|
|
626
|
-
case 15:
|
|
627
|
-
_p.sent();
|
|
628
|
-
spinner.succeed('Connected to PostgreSQL');
|
|
629
|
-
if (!clean) return [3 /*break*/, 18];
|
|
630
|
-
spinner.setText("Dropping schema \"" + config.schema + "\"...");
|
|
631
|
-
spinner.start();
|
|
632
|
-
return [4 /*yield*/, client.query("DROP SCHEMA IF EXISTS " + config.schema + " CASCADE")];
|
|
633
|
-
case 16:
|
|
634
|
-
_p.sent();
|
|
635
|
-
return [4 /*yield*/, client.query("CREATE SCHEMA " + config.schema)];
|
|
636
|
-
case 17:
|
|
637
|
-
_p.sent();
|
|
638
|
-
spinner.succeed('Schema cleaned');
|
|
639
|
-
_p.label = 18;
|
|
640
|
-
case 18:
|
|
641
|
-
restoredRows = 0;
|
|
642
|
-
restoredTables = 0;
|
|
643
|
-
restoredIndexes = 0;
|
|
644
|
-
if (!isJson) return [3 /*break*/, 33];
|
|
645
|
-
data = JSON.parse(content);
|
|
646
|
-
_i = 0, _b = data.tables || [];
|
|
647
|
-
_p.label = 19;
|
|
648
|
-
case 19:
|
|
649
|
-
if (!(_i < _b.length)) return [3 /*break*/, 25];
|
|
650
|
-
table = _b[_i];
|
|
651
|
-
spinner.setText("Restoring " + table.name + "...");
|
|
652
|
-
spinner.start();
|
|
653
|
-
_loop_3 = function (row) {
|
|
654
|
-
var columns, values, params, _q;
|
|
655
|
-
return __generator(this, function (_r) {
|
|
656
|
-
switch (_r.label) {
|
|
657
|
-
case 0:
|
|
658
|
-
columns = Object.keys(row);
|
|
659
|
-
values = columns.map(function (col, idx) { return "$" + (idx + 1); });
|
|
660
|
-
params = columns.map(function (col) {
|
|
661
|
-
var val = row[col];
|
|
662
|
-
return typeof val === 'object' ? JSON.stringify(val) : val;
|
|
663
|
-
});
|
|
664
|
-
_r.label = 1;
|
|
665
|
-
case 1:
|
|
666
|
-
_r.trys.push([1, 3, , 4]);
|
|
667
|
-
return [4 /*yield*/, client.query("\n INSERT INTO " + config.schema + "." + table.name + " (" + columns.join(', ') + ")\n VALUES (" + values.join(', ') + ")\n ON CONFLICT DO NOTHING\n ", params)];
|
|
668
|
-
case 2:
|
|
669
|
-
_r.sent();
|
|
670
|
-
restoredRows++;
|
|
671
|
-
return [3 /*break*/, 4];
|
|
672
|
-
case 3:
|
|
673
|
-
_q = _r.sent();
|
|
674
|
-
return [3 /*break*/, 4];
|
|
675
|
-
case 4: return [2 /*return*/];
|
|
676
|
-
}
|
|
677
|
-
});
|
|
678
|
-
};
|
|
679
|
-
_c = 0, _d = table.rows;
|
|
680
|
-
_p.label = 20;
|
|
681
|
-
case 20:
|
|
682
|
-
if (!(_c < _d.length)) return [3 /*break*/, 23];
|
|
683
|
-
row = _d[_c];
|
|
684
|
-
return [5 /*yield**/, _loop_3(row)];
|
|
685
|
-
case 21:
|
|
686
|
-
_p.sent();
|
|
687
|
-
_p.label = 22;
|
|
688
|
-
case 22:
|
|
689
|
-
_c++;
|
|
690
|
-
return [3 /*break*/, 20];
|
|
691
|
-
case 23:
|
|
692
579
|
restoredTables++;
|
|
693
|
-
spinner.setText(
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
case 25:
|
|
699
|
-
spinner.succeed("Restored " + restoredTables + " tables, " + restoredRows + " rows");
|
|
700
|
-
if (!(data.indexes && data.indexes.length > 0)) return [3 /*break*/, 32];
|
|
580
|
+
spinner.setText(`Restoring ${table.name}... (${table.rows.length} rows)`);
|
|
581
|
+
}
|
|
582
|
+
spinner.succeed(`Restored ${restoredTables} tables, ${restoredRows} rows`);
|
|
583
|
+
// Restore indexes
|
|
584
|
+
if (data.indexes && data.indexes.length > 0) {
|
|
701
585
|
spinner.setText('Restoring indexes...');
|
|
702
586
|
spinner.start();
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
return [4 /*yield*/, client.query(indexDef)];
|
|
712
|
-
case 28:
|
|
713
|
-
_p.sent();
|
|
714
|
-
restoredIndexes++;
|
|
715
|
-
return [3 /*break*/, 30];
|
|
716
|
-
case 29:
|
|
717
|
-
_g = _p.sent();
|
|
718
|
-
return [3 /*break*/, 30];
|
|
719
|
-
case 30:
|
|
720
|
-
_e++;
|
|
721
|
-
return [3 /*break*/, 26];
|
|
722
|
-
case 31:
|
|
723
|
-
spinner.succeed("Restored " + restoredIndexes + " indexes");
|
|
724
|
-
_p.label = 32;
|
|
725
|
-
case 32: return [3 /*break*/, 41];
|
|
726
|
-
case 33:
|
|
727
|
-
// Restore from SQL
|
|
728
|
-
spinner.setText('Executing SQL restore...');
|
|
729
|
-
spinner.start();
|
|
730
|
-
statements = content
|
|
731
|
-
.split(';')
|
|
732
|
-
.map(function (s) { return s.trim(); })
|
|
733
|
-
.filter(function (s) { return s.length > 0 && !s.startsWith('--'); });
|
|
734
|
-
executed = 0;
|
|
735
|
-
_h = 0, statements_1 = statements;
|
|
736
|
-
_p.label = 34;
|
|
737
|
-
case 34:
|
|
738
|
-
if (!(_h < statements_1.length)) return [3 /*break*/, 40];
|
|
739
|
-
stmt = statements_1[_h];
|
|
740
|
-
_p.label = 35;
|
|
741
|
-
case 35:
|
|
742
|
-
_p.trys.push([35, 37, , 38]);
|
|
743
|
-
return [4 /*yield*/, client.query(stmt)];
|
|
744
|
-
case 36:
|
|
745
|
-
_p.sent();
|
|
746
|
-
executed++;
|
|
747
|
-
if (stmt.toUpperCase().includes('INSERT INTO')) {
|
|
748
|
-
restoredRows++;
|
|
587
|
+
for (const indexDef of data.indexes) {
|
|
588
|
+
try {
|
|
589
|
+
await client.query(indexDef);
|
|
590
|
+
restoredIndexes++;
|
|
591
|
+
}
|
|
592
|
+
catch {
|
|
593
|
+
// Index may already exist
|
|
594
|
+
}
|
|
749
595
|
}
|
|
750
|
-
|
|
751
|
-
|
|
596
|
+
spinner.succeed(`Restored ${restoredIndexes} indexes`);
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
else {
|
|
600
|
+
// Restore from SQL
|
|
601
|
+
spinner.setText('Executing SQL restore...');
|
|
602
|
+
spinner.start();
|
|
603
|
+
// Split by semicolons and execute
|
|
604
|
+
const statements = content
|
|
605
|
+
.split(';')
|
|
606
|
+
.map(s => s.trim())
|
|
607
|
+
.filter(s => s.length > 0 && !s.startsWith('--'));
|
|
608
|
+
let executed = 0;
|
|
609
|
+
for (const stmt of statements) {
|
|
610
|
+
try {
|
|
611
|
+
await client.query(stmt);
|
|
612
|
+
executed++;
|
|
613
|
+
if (stmt.toUpperCase().includes('INSERT INTO')) {
|
|
614
|
+
restoredRows++;
|
|
615
|
+
}
|
|
616
|
+
else if (stmt.toUpperCase().includes('CREATE INDEX')) {
|
|
617
|
+
restoredIndexes++;
|
|
618
|
+
}
|
|
752
619
|
}
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
console.error('Statement failed:', stmt.substring(0, 100));
|
|
620
|
+
catch (error) {
|
|
621
|
+
// Log but continue
|
|
622
|
+
if (process.env.DEBUG) {
|
|
623
|
+
console.error('Statement failed:', stmt.substring(0, 100));
|
|
624
|
+
}
|
|
759
625
|
}
|
|
760
|
-
return [3 /*break*/, 38];
|
|
761
|
-
case 38:
|
|
762
626
|
if (executed % 100 === 0) {
|
|
763
|
-
spinner.setText(
|
|
627
|
+
spinner.setText(`Executing SQL restore... ${executed}/${statements.length}`);
|
|
764
628
|
}
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
_h++;
|
|
768
|
-
return [3 /*break*/, 34];
|
|
769
|
-
case 40:
|
|
770
|
-
spinner.succeed("Executed " + executed + " SQL statements");
|
|
771
|
-
_p.label = 41;
|
|
772
|
-
case 41: return [4 /*yield*/, client.end()];
|
|
773
|
-
case 42:
|
|
774
|
-
_p.sent();
|
|
775
|
-
output.writeln();
|
|
776
|
-
output.printSuccess('Restore completed successfully!');
|
|
777
|
-
output.writeln();
|
|
778
|
-
output.printBox([
|
|
779
|
-
"Source: " + inputPath,
|
|
780
|
-
"Format: " + format.toUpperCase(),
|
|
781
|
-
"Tables Restored: " + restoredTables,
|
|
782
|
-
"Rows Restored: " + restoredRows.toLocaleString(),
|
|
783
|
-
"Indexes Restored: " + restoredIndexes,
|
|
784
|
-
].join('\n'), 'Restore Summary');
|
|
785
|
-
return [2 /*return*/, {
|
|
786
|
-
success: true,
|
|
787
|
-
data: {
|
|
788
|
-
inputPath: inputPath,
|
|
789
|
-
format: format,
|
|
790
|
-
restoredTables: restoredTables,
|
|
791
|
-
restoredRows: restoredRows,
|
|
792
|
-
restoredIndexes: restoredIndexes
|
|
793
|
-
}
|
|
794
|
-
}];
|
|
795
|
-
case 43:
|
|
796
|
-
error_3 = _p.sent();
|
|
797
|
-
spinner.fail('Restore failed');
|
|
798
|
-
output.printError(error_3 instanceof Error ? error_3.message : String(error_3));
|
|
799
|
-
return [2 /*return*/, { success: false, exitCode: 1 }];
|
|
800
|
-
case 44: return [2 /*return*/];
|
|
629
|
+
}
|
|
630
|
+
spinner.succeed(`Executed ${executed} SQL statements`);
|
|
801
631
|
}
|
|
802
|
-
|
|
803
|
-
|
|
632
|
+
await client.end();
|
|
633
|
+
output.writeln();
|
|
634
|
+
output.printSuccess('Restore completed successfully!');
|
|
635
|
+
output.writeln();
|
|
636
|
+
output.printBox([
|
|
637
|
+
`Source: ${inputPath}`,
|
|
638
|
+
`Format: ${format.toUpperCase()}`,
|
|
639
|
+
`Tables Restored: ${restoredTables}`,
|
|
640
|
+
`Rows Restored: ${restoredRows.toLocaleString()}`,
|
|
641
|
+
`Indexes Restored: ${restoredIndexes}`,
|
|
642
|
+
].join('\n'), 'Restore Summary');
|
|
643
|
+
return {
|
|
644
|
+
success: true,
|
|
645
|
+
data: {
|
|
646
|
+
inputPath,
|
|
647
|
+
format,
|
|
648
|
+
restoredTables,
|
|
649
|
+
restoredRows,
|
|
650
|
+
restoredIndexes,
|
|
651
|
+
},
|
|
652
|
+
};
|
|
653
|
+
}
|
|
654
|
+
catch (error) {
|
|
655
|
+
spinner.fail('Restore failed');
|
|
656
|
+
output.printError(error instanceof Error ? error.message : String(error));
|
|
657
|
+
return { success: false, exitCode: 1 };
|
|
658
|
+
}
|
|
659
|
+
},
|
|
804
660
|
};
|
|
805
661
|
/**
|
|
806
662
|
* RuVector backup main command
|
|
807
663
|
*/
|
|
808
|
-
export
|
|
664
|
+
export const backupCommand = {
|
|
809
665
|
name: 'backup',
|
|
810
666
|
description: 'Backup and restore RuVector data',
|
|
811
667
|
subcommands: [backupSubcommand, restoreSubcommand],
|
|
@@ -815,78 +671,76 @@ export var backupCommand = {
|
|
|
815
671
|
short: 'h',
|
|
816
672
|
description: 'PostgreSQL host',
|
|
817
673
|
type: 'string',
|
|
818
|
-
|
|
674
|
+
default: 'localhost',
|
|
819
675
|
},
|
|
820
676
|
{
|
|
821
677
|
name: 'port',
|
|
822
678
|
short: 'p',
|
|
823
679
|
description: 'PostgreSQL port',
|
|
824
680
|
type: 'number',
|
|
825
|
-
|
|
681
|
+
default: 5432,
|
|
826
682
|
},
|
|
827
683
|
{
|
|
828
684
|
name: 'database',
|
|
829
685
|
short: 'd',
|
|
830
686
|
description: 'Database name',
|
|
831
|
-
type: 'string'
|
|
687
|
+
type: 'string',
|
|
832
688
|
},
|
|
833
689
|
{
|
|
834
690
|
name: 'user',
|
|
835
691
|
short: 'u',
|
|
836
692
|
description: 'Database user',
|
|
837
|
-
type: 'string'
|
|
693
|
+
type: 'string',
|
|
838
694
|
},
|
|
839
695
|
{
|
|
840
696
|
name: 'password',
|
|
841
697
|
description: 'Database password',
|
|
842
|
-
type: 'string'
|
|
698
|
+
type: 'string',
|
|
843
699
|
},
|
|
844
700
|
{
|
|
845
701
|
name: 'ssl',
|
|
846
702
|
description: 'Enable SSL',
|
|
847
703
|
type: 'boolean',
|
|
848
|
-
|
|
704
|
+
default: false,
|
|
849
705
|
},
|
|
850
706
|
{
|
|
851
707
|
name: 'schema',
|
|
852
708
|
short: 's',
|
|
853
709
|
description: 'Schema name',
|
|
854
710
|
type: 'string',
|
|
855
|
-
|
|
711
|
+
default: 'claude_flow',
|
|
856
712
|
},
|
|
857
713
|
],
|
|
858
714
|
examples: [
|
|
859
715
|
{ command: 'claude-flow ruvector backup create -o backup.sql', description: 'Create backup' },
|
|
860
716
|
{ command: 'claude-flow ruvector backup restore -i backup.sql', description: 'Restore backup' },
|
|
861
717
|
],
|
|
862
|
-
action:
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
});
|
|
889
|
-
}); }
|
|
718
|
+
action: async (ctx) => {
|
|
719
|
+
output.writeln();
|
|
720
|
+
output.writeln(output.bold('RuVector Backup'));
|
|
721
|
+
output.writeln(output.dim('='.repeat(60)));
|
|
722
|
+
output.writeln();
|
|
723
|
+
output.printBox([
|
|
724
|
+
'RuVector Backup provides data backup and restore capabilities:',
|
|
725
|
+
'',
|
|
726
|
+
' create Create a backup of RuVector data',
|
|
727
|
+
' restore Restore RuVector data from backup',
|
|
728
|
+
'',
|
|
729
|
+
'Supported formats:',
|
|
730
|
+
' SQL - PostgreSQL-compatible SQL statements',
|
|
731
|
+
' JSON - Portable JSON format with metadata',
|
|
732
|
+
' CSV - Comma-separated values',
|
|
733
|
+
'',
|
|
734
|
+
'Features:',
|
|
735
|
+
' - Selective table backup',
|
|
736
|
+
' - Gzip compression',
|
|
737
|
+
' - Index preservation',
|
|
738
|
+
' - Incremental restore',
|
|
739
|
+
].join('\n'), 'Backup Commands');
|
|
740
|
+
output.writeln();
|
|
741
|
+
output.printInfo('Run `claude-flow ruvector backup <command> --help` for details');
|
|
742
|
+
return { success: true };
|
|
743
|
+
},
|
|
890
744
|
};
|
|
891
745
|
export default backupCommand;
|
|
892
746
|
//# sourceMappingURL=backup.js.map
|