claude-flow-novice 2.15.3 → 2.15.4
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/.claude/cfn-extras/skills/advanced-features/cfn-agent-swap/recommend-swap.sh +59 -59
- package/.claude/cfn-extras/skills/analytics/cfn-improvement-recommender/recommend-improvements.sh +91 -91
- package/.claude/cfn-extras/skills/analytics/cfn-pattern-extraction/extract-patterns.sh +79 -79
- package/.claude/cfn-extras/skills/analytics/cfn-retrospective-report/generate-report.sh +100 -100
- package/.claude/cfn-extras/skills/analytics/cfn-telemetry/start-telemetry.sh +110 -110
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/add-bullet.sh +145 -145
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/log-merge.sh +67 -67
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/monitor-injection-performance.sh +137 -137
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/optimize-injection-pipeline.sh +168 -168
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/query-reflections.sh +35 -35
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/store-reflection.sh +45 -45
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/track-ab-test.sh +41 -41
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/update-reflection.sh +41 -41
- package/.claude/cfn-extras/skills/deprecated/cfn-cli-setup/validate-cli-environment.sh +191 -191
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/create-campaign.sh +231 -231
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/get-campaign-performance.sh +190 -190
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/pause-campaign.sh +142 -142
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/set-budget.sh +181 -181
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/update-bid-strategy.sh +133 -133
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/get-conversation-history.sh +121 -121
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/qualify-lead.sh +156 -156
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/schedule-demo.sh +181 -181
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/send-message.sh +137 -137
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/transfer-to-human.sh +179 -179
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/create-campaign.sh +183 -183
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/get-delivery-status.sh +139 -139
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/opt-out.sh +150 -150
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/schedule-campaign.sh +187 -187
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/send-sms.sh +181 -181
- package/.claude/cfn-extras/skills/ui-portal/cfn-web-portal/test-web-portal-skill.sh +50 -50
- package/.claude/cfn-extras/skills/ui-portal/cfn-web-portal/validate-deployment.sh +84 -84
- package/.claude/cfn-extras/skills/utility/cfn-environment-sanitization/sanitize-environment.sh +243 -243
- package/.claude/commands/cfn-loop-cli.md +16 -2
- package/.claude/commands/switch-api.md +31 -10
- package/.claude/hooks/cfn-lint-sql-injection.sh +61 -0
- package/.claude/hooks/cfn-post-edit-cfn-retrospective.sh +33 -2
- package/.claude/hooks/cfn-pre-edit-security-warning.sh +40 -0
- package/.claude/skills/cfn-agent-spawning/spawn-agent.sh +22 -24
- package/.claude/skills/cfn-docker-agent-spawning/SKILL.md +28 -4
- package/.claude/skills/cfn-docker-agent-spawning/spawn-agent.sh +3 -1
- package/.claude/skills/cfn-docker-loop-orchestration/orchestrate.sh +224 -20
- package/.claude/skills/cfn-loop-orchestration/helpers/gate-check.sh +550 -46
- package/.claude/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +277 -0
- package/.claude/skills/cfn-loop-orchestration/orchestrate.sh +184 -23
- package/.claude/skills/cfn-loop-orchestration/security_utils.sh +24 -0
- package/.claude/skills/cfn-loop-orchestration/test-iteration-context-injection.sh +366 -0
- package/.claude/skills/cfn-redis-coordination/CENTRALIZED_REDIS_WRAPPER.md +319 -0
- package/.claude/skills/cfn-redis-coordination/agent-log.sh +4 -0
- package/.claude/skills/cfn-redis-coordination/agent-log.sh.bak +124 -0
- package/.claude/skills/cfn-redis-coordination/agent-recovery.sh +2 -2
- package/.claude/skills/cfn-redis-coordination/collect-confidence-scores.sh +30 -0
- package/.claude/skills/cfn-redis-coordination/get-context.sh +33 -0
- package/.claude/skills/cfn-redis-coordination/get-success-criteria.sh +54 -0
- package/.claude/skills/cfn-redis-coordination/invoke-waiting-mode.sh +3 -0
- package/.claude/skills/cfn-redis-coordination/redis-cli-wrapper.sh +24 -3
- package/.claude/skills/cfn-redis-coordination/redis-functions.sh +33 -0
- package/.claude/skills/cfn-redis-coordination/report-completion.sh +24 -31
- package/.claude/skills/cfn-redis-coordination/store-context.sh +4 -0
- package/.claude/skills/cfn-redis-coordination/store-success-criteria.sh +85 -0
- package/.claude/skills/cfn-redis-coordination/update-all-scripts.sh +67 -0
- package/.claude/skills/cfn-sqlite-memory/ttl-cleanup.sh +17 -25
- package/.claude/skills/cfn-transparency-middleware/test-e2e.sh +15 -0
- package/.claude/skills/cfn-transparency-middleware/tests/input-validation.sh +15 -0
- package/README.md +116 -475
- package/claude-assets/agents/cfn-dev-team/README.md +103 -0
- package/claude-assets/agents/cfn-dev-team/architecture/goal-planner.md +1 -1
- package/claude-assets/agents/cfn-dev-team/coordinators/cfn-frontend-coordinator.md +77 -15
- package/claude-assets/agents/cfn-dev-team/coordinators/cfn-v3-coordinator.md +355 -6
- package/claude-assets/agents/cfn-dev-team/coordinators/consensus-builder.md +82 -1
- package/claude-assets/agents/cfn-dev-team/coordinators/handoff-coordinator.md +82 -1
- package/claude-assets/agents/cfn-dev-team/coordinators/multi-sprint-coordinator.md +77 -15
- package/claude-assets/agents/cfn-dev-team/dev-ops/docker-specialist.md +99 -12
- package/claude-assets/agents/cfn-dev-team/dev-ops/github-commit-agent.md +1 -1
- package/claude-assets/agents/cfn-dev-team/dev-ops/kubernetes-specialist.md +97 -0
- package/claude-assets/agents/cfn-dev-team/dev-ops/monitoring-specialist.md +20 -1
- package/claude-assets/agents/cfn-dev-team/developers/api-gateway-specialist.md +97 -0
- package/claude-assets/agents/cfn-dev-team/developers/backend-developer.md +110 -13
- package/claude-assets/agents/cfn-dev-team/developers/data/data-engineer.md +106 -15
- package/claude-assets/agents/cfn-dev-team/developers/database/database-architect.md +115 -11
- package/claude-assets/agents/cfn-dev-team/developers/frontend/mobile-dev.md +94 -7
- package/claude-assets/agents/cfn-dev-team/developers/frontend/react-frontend-engineer.md +87 -9
- package/claude-assets/agents/cfn-dev-team/developers/frontend/typescript-specialist.md +85 -7
- package/claude-assets/agents/cfn-dev-team/developers/frontend/ui-designer.md +160 -28
- package/claude-assets/agents/cfn-dev-team/developers/graphql-specialist.md +101 -19
- package/claude-assets/agents/cfn-dev-team/developers/rust-developer.md +108 -14
- package/claude-assets/agents/cfn-dev-team/reviewers/{reviewer.md → code-reviewer.md} +95 -8
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/code-quality-validator.md +107 -7
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/perf-analyzer.md +98 -7
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/performance-benchmarker.md +95 -7
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/security-specialist.md +136 -9
- package/claude-assets/agents/cfn-dev-team/testers/api-testing-specialist.md +108 -1
- package/claude-assets/agents/cfn-dev-team/testers/chaos-engineering-specialist.md +107 -13
- package/claude-assets/agents/cfn-dev-team/testers/contract-tester.md +737 -0
- package/claude-assets/agents/cfn-dev-team/testers/e2e/playwright-tester.md +1 -1
- package/claude-assets/agents/cfn-dev-team/testers/integration-tester.md +828 -0
- package/claude-assets/agents/cfn-dev-team/testers/interaction-tester.md +106 -7
- package/claude-assets/agents/cfn-dev-team/testers/load-testing-specialist.md +77 -0
- package/claude-assets/agents/cfn-dev-team/testers/mutation-testing-specialist.md +684 -0
- package/claude-assets/agents/cfn-dev-team/testers/playwright-tester.md +110 -1
- package/claude-assets/agents/cfn-dev-team/testers/tester.md +94 -7
- package/claude-assets/agents/cfn-dev-team/utility/code-booster.md +1 -3
- package/claude-assets/agents/cfn-dev-team/utility/epic-creator.md +87 -13
- package/claude-assets/agents/cfn-dev-team/utility/memory-leak-specialist.md +103 -7
- package/claude-assets/agents/cfn-dev-team/utility/researcher.md +1 -3
- package/claude-assets/agents/cfn-dev-team/utility/z-ai-specialist.md +94 -7
- package/claude-assets/agents/docker-coordinators/cfn-docker-v3-coordinator.md +46 -0
- package/claude-assets/agents/project-only-agents/npm-package-specialist.md +1 -1
- package/claude-assets/cfn-extras/skills/advanced-features/cfn-agent-swap/recommend-swap.sh +59 -59
- package/claude-assets/cfn-extras/skills/analytics/cfn-improvement-recommender/recommend-improvements.sh +91 -91
- package/claude-assets/cfn-extras/skills/analytics/cfn-pattern-extraction/extract-patterns.sh +79 -79
- package/claude-assets/cfn-extras/skills/analytics/cfn-retrospective-report/generate-report.sh +100 -100
- package/claude-assets/cfn-extras/skills/analytics/cfn-telemetry/start-telemetry.sh +110 -110
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/add-bullet.sh +145 -145
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/log-merge.sh +67 -67
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/monitor-injection-performance.sh +137 -137
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/optimize-injection-pipeline.sh +168 -168
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/query-reflections.sh +35 -35
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/store-reflection.sh +45 -45
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/track-ab-test.sh +41 -41
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/update-reflection.sh +41 -41
- package/claude-assets/cfn-extras/skills/deprecated/cfn-cli-setup/validate-cli-environment.sh +191 -191
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/create-campaign.sh +231 -231
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/get-campaign-performance.sh +190 -190
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/pause-campaign.sh +142 -142
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/set-budget.sh +181 -181
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/update-bid-strategy.sh +133 -133
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/get-conversation-history.sh +121 -121
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/qualify-lead.sh +156 -156
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/schedule-demo.sh +181 -181
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/send-message.sh +137 -137
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/transfer-to-human.sh +179 -179
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/create-campaign.sh +183 -183
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/get-delivery-status.sh +139 -139
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/opt-out.sh +150 -150
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/schedule-campaign.sh +187 -187
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/send-sms.sh +181 -181
- package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/test-web-portal-skill.sh +50 -50
- package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/validate-deployment.sh +84 -84
- package/claude-assets/cfn-extras/skills/utility/cfn-environment-sanitization/sanitize-environment.sh +243 -243
- package/claude-assets/commands/cfn-loop-cli.md +16 -2
- package/claude-assets/commands/switch-api.md +31 -10
- package/claude-assets/hooks/cfn-lint-sql-injection.sh +61 -0
- package/claude-assets/hooks/cfn-post-edit-cfn-retrospective.sh +33 -2
- package/claude-assets/hooks/cfn-pre-edit-security-warning.sh +40 -0
- package/claude-assets/hooks/detect-hardcoded-credentials.sh +212 -0
- package/claude-assets/skills/SKILL_TEMPLATE.md +774 -0
- package/claude-assets/skills/agent-lifecycle/execute-lifecycle-hook.sh +84 -113
- package/claude-assets/skills/agent-lifecycle/simple-audit.sh +33 -6
- package/claude-assets/skills/agent-template-generator/SKILL.md +440 -0
- package/claude-assets/skills/agent-template-generator/generate-agent.sh +405 -0
- package/claude-assets/skills/agent-validation-linter/SKILL.md +589 -0
- package/claude-assets/skills/agent-validation-linter/lint-agents.sh +271 -0
- package/claude-assets/skills/bootstrap/bash-fundamentals.md +786 -0
- package/claude-assets/skills/bootstrap/database-connection.md +464 -0
- package/claude-assets/skills/bootstrap/error-handling.md +580 -0
- package/claude-assets/skills/bootstrap/file-operations.md +699 -0
- package/claude-assets/skills/bootstrap/skill-loader.md +616 -0
- package/claude-assets/skills/bootstrap/sqlite-params.sh +287 -0
- package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh +22 -24
- package/claude-assets/skills/cfn-automatic-memory-persistence/test-memory-persistence.sh +17 -16
- package/claude-assets/skills/cfn-deployment/SKILL.md +293 -0
- package/claude-assets/skills/cfn-deployment/execute.sh +21 -0
- package/claude-assets/skills/cfn-docker-agent-spawning/SKILL.md +28 -4
- package/claude-assets/skills/cfn-docker-agent-spawning/spawn-agent.sh +3 -1
- package/claude-assets/skills/cfn-docker-loop-orchestration/orchestrate.sh +224 -20
- package/claude-assets/skills/cfn-environment-sanitization/sanitize-environment.sh +38 -0
- package/claude-assets/skills/cfn-error-batching-strategy/lib/core-functions.sh +47 -47
- package/claude-assets/skills/cfn-file-operations/SKILL.md +290 -0
- package/claude-assets/skills/cfn-file-operations/execute.sh +129 -0
- package/claude-assets/skills/cfn-file-operations/lib/atomic-write.sh +294 -0
- package/claude-assets/skills/cfn-file-operations/lib/lock.sh +361 -0
- package/claude-assets/skills/cfn-file-operations/test.sh +369 -0
- package/claude-assets/skills/cfn-log-operations/SKILL.md +308 -0
- package/claude-assets/skills/cfn-log-operations/execute.sh +420 -0
- package/claude-assets/skills/cfn-log-operations/lib/rotate.sh +406 -0
- package/claude-assets/skills/cfn-log-operations/lib/search.sh +448 -0
- package/claude-assets/skills/cfn-log-operations/test.sh +394 -0
- package/claude-assets/skills/cfn-loop-orchestration/helpers/gate-check.sh +550 -46
- package/claude-assets/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +277 -0
- package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh +184 -23
- package/claude-assets/skills/cfn-loop-orchestration/security_utils.sh +24 -0
- package/claude-assets/skills/cfn-loop-orchestration/test-iteration-context-injection.sh +366 -0
- package/claude-assets/skills/cfn-parameterized-queries/SKILL.md +339 -0
- package/claude-assets/skills/cfn-playbook/query-playbook.sh +19 -15
- package/claude-assets/skills/cfn-playbook/update-playbook.sh +25 -14
- package/claude-assets/skills/cfn-process-instrumentation/instrument-process.sh +44 -0
- package/claude-assets/skills/cfn-promotion/SKILL.md +305 -0
- package/claude-assets/skills/cfn-redis-coordination/CENTRALIZED_REDIS_WRAPPER.md +319 -0
- package/claude-assets/skills/cfn-redis-coordination/agent-log.sh +4 -0
- package/claude-assets/skills/cfn-redis-coordination/agent-log.sh.bak +124 -0
- package/claude-assets/skills/cfn-redis-coordination/agent-recovery.sh +2 -2
- package/claude-assets/skills/cfn-redis-coordination/collect-confidence-scores.sh +30 -0
- package/claude-assets/skills/cfn-redis-coordination/get-context.sh +33 -0
- package/claude-assets/skills/cfn-redis-coordination/get-success-criteria.sh +54 -0
- package/claude-assets/skills/cfn-redis-coordination/invoke-waiting-mode.sh +3 -0
- package/claude-assets/skills/cfn-redis-coordination/redis-cli-wrapper.sh +24 -3
- package/claude-assets/skills/cfn-redis-coordination/redis-functions.sh +33 -0
- package/claude-assets/skills/cfn-redis-coordination/report-completion.sh +24 -31
- package/claude-assets/skills/cfn-redis-coordination/store-context.sh +4 -0
- package/claude-assets/skills/cfn-redis-coordination/store-success-criteria.sh +85 -0
- package/claude-assets/skills/cfn-redis-coordination/update-all-scripts.sh +67 -0
- package/claude-assets/skills/cfn-skill-loader/SKILL.md +466 -0
- package/claude-assets/skills/cfn-skill-loader/execute.sh +344 -0
- package/claude-assets/skills/cfn-sqlite-memory/ttl-cleanup.sh +17 -25
- package/claude-assets/skills/cfn-task-audit/get-audit-data.sh +42 -21
- package/claude-assets/skills/cfn-task-audit/store-task-audit.sh +17 -10
- package/claude-assets/skills/cfn-test-runner/detect-regressions.sh +17 -14
- package/claude-assets/skills/cfn-test-runner/detect-regressions.sh.backup-1763392821 +55 -0
- package/claude-assets/skills/cfn-test-runner/store-benchmarks.sh +17 -19
- package/claude-assets/skills/cfn-transparency-middleware/test-e2e.sh +15 -0
- package/claude-assets/skills/cfn-transparency-middleware/tests/input-validation.sh +15 -0
- package/claude-assets/skills/cfn-utilities/SKILL.md +237 -0
- package/claude-assets/skills/cfn-utilities/execute.sh +32 -0
- package/claude-assets/skills/cfn-utilities/lib/errors.sh +56 -0
- package/claude-assets/skills/cfn-utilities/lib/file-ops.sh +164 -0
- package/claude-assets/skills/cfn-utilities/lib/logging.sh +77 -0
- package/claude-assets/skills/cfn-utilities/lib/retry.sh +127 -0
- package/claude-assets/skills/cfn-utilities/test.sh +317 -0
- package/claude-assets/skills/integration/agent-handoff.sh +62 -64
- package/claude-assets/skills/json-validation/SKILL.md +431 -0
- package/claude-assets/skills/json-validation/test-validate-success-criteria.sh +421 -0
- package/claude-assets/skills/json-validation/validate-success-criteria.sh +197 -0
- package/claude-assets/skills/redis-coordination/validate-parameters.sh +34 -0
- package/claude-assets/skills/workflow-codification/DEPLOY_QUICK_REFERENCE.md +106 -0
- package/claude-assets/skills/workflow-codification/PROPAGATE_UPDATE_QUICK_REFERENCE.md +366 -0
- package/claude-assets/skills/workflow-codification/deploy-approved-skill.sh +481 -0
- package/claude-assets/skills/workflow-codification/deploy-approved-skill.sh.backup-1763392820 +512 -0
- package/claude-assets/skills/workflow-codification/lib/security-utils.sh +204 -0
- package/claude-assets/skills/workflow-codification/propagate-skill-update.sh +648 -0
- package/claude-assets/skills/workflow-codification/propagate-skill-update.sh.backup-1763392820 +664 -0
- package/claude-assets/skills/workflow-codification/test-integration.sh +15 -0
- package/claude-assets/skills/workflow-codification/test-metadata-update.sh +350 -0
- package/claude-assets/skills/workflow-codification/track-cost-savings.sh +55 -14
- package/claude-assets/skills/workflow-codification/track-cost-savings.sh.backup-1763392821 +445 -0
- package/claude-assets/skills/workflow-codification/track-edge-case.sh +27 -60
- package/claude-assets/skills/workflow-codification/workflow-codification.db +0 -0
- package/dist/ace/ace-curator.js +10 -2
- package/dist/ace/ace-curator.js.map +1 -1
- package/dist/ace/ace-generator.js +4 -0
- package/dist/ace/ace-generator.js.map +1 -1
- package/dist/ace/ace-reflector.js +1 -1
- package/dist/ace/ace-reflector.js.map +1 -1
- package/dist/ace/context-injection.js +24 -2
- package/dist/ace/context-injection.js.map +1 -1
- package/dist/agents/agent-loader.js +146 -165
- package/dist/agents/agent-loader.js.map +1 -1
- package/dist/agents/task-agent-integration.js +1 -1
- package/dist/agents/task-agent-integration.js.map +1 -1
- package/dist/api/health-endpoints.js +390 -0
- package/dist/api/health-endpoints.js.map +1 -0
- package/dist/cli/agent-executor.js +4 -1
- package/dist/cli/agent-executor.js.map +1 -1
- package/dist/cli/agent-prompt-builder.js +89 -1
- package/dist/cli/agent-prompt-builder.js.map +1 -1
- package/dist/cli/agent-spawn.js +130 -37
- package/dist/cli/agent-spawn.js.map +1 -1
- package/dist/cli/skill-cache-validator.js +412 -0
- package/dist/cli/skill-cache-validator.js.map +1 -0
- package/dist/cli/skill-cli.js +991 -0
- package/dist/cli/skill-cli.js.map +1 -0
- package/dist/cli/skill-execution-logger.js +284 -0
- package/dist/cli/skill-execution-logger.js.map +1 -0
- package/dist/cli/skill-loader.js +457 -0
- package/dist/cli/skill-loader.js.map +1 -0
- package/dist/coordination/event-bus.js +2 -2
- package/dist/coordination/event-bus.js.map +1 -1
- package/dist/coordination/fleet-manager.js +1 -1
- package/dist/coordination/fleet-manager.js.map +1 -1
- package/dist/coordination/index.js +23 -9
- package/dist/coordination/index.js.map +1 -1
- package/dist/coordination/types/fleet-manager.types.js.map +1 -1
- package/dist/db/migration-manager.js +483 -0
- package/dist/db/migration-manager.js.map +1 -0
- package/dist/db/skills-query.js +535 -0
- package/dist/db/skills-query.js.map +1 -0
- package/dist/integration/DatabaseHandoff.js +1 -1
- package/dist/integration/DatabaseHandoff.js.map +1 -1
- package/dist/jobs/edge-case-analyzer.js +367 -0
- package/dist/jobs/edge-case-analyzer.js.map +1 -0
- package/dist/jobs/promotion-sla-enforcer.js +288 -0
- package/dist/jobs/promotion-sla-enforcer.js.map +1 -0
- package/dist/lib/agent-output-parser.js.map +1 -1
- package/dist/lib/agent-output-validator.js.map +1 -1
- package/dist/lib/agent-workspace.js +281 -0
- package/dist/lib/agent-workspace.js.map +1 -0
- package/dist/lib/atomic-file-writer.js +377 -0
- package/dist/lib/atomic-file-writer.js.map +1 -0
- package/dist/lib/backup-manager.js +779 -0
- package/dist/lib/backup-manager.js.map +1 -0
- package/dist/lib/checkpoint-manager.js +837 -0
- package/dist/lib/checkpoint-manager.js.map +1 -0
- package/dist/lib/circuit-breaker.js +340 -0
- package/dist/lib/circuit-breaker.js.map +1 -0
- package/dist/lib/completion-signal-handler.js +243 -0
- package/dist/lib/completion-signal-handler.js.map +1 -0
- package/dist/lib/config-manager.js +312 -0
- package/dist/lib/config-manager.js.map +1 -0
- package/dist/lib/config-migrator.js +386 -0
- package/dist/lib/config-migrator.js.map +1 -0
- package/dist/lib/config-validator.js.map +1 -1
- package/dist/lib/correlation-cache.js +311 -0
- package/dist/lib/correlation-cache.js.map +1 -0
- package/dist/lib/correlation.js +263 -0
- package/dist/lib/correlation.js.map +1 -0
- package/dist/lib/database-service/connection-pool-manager.js +520 -0
- package/dist/lib/database-service/connection-pool-manager.js.map +1 -0
- package/dist/lib/database-service/correlation.js +329 -0
- package/dist/lib/database-service/correlation.js.map +1 -0
- package/dist/lib/database-service/errors.js +120 -0
- package/dist/lib/database-service/errors.js.map +1 -0
- package/dist/lib/database-service/index.js +168 -0
- package/dist/lib/database-service/index.js.map +1 -0
- package/dist/lib/database-service/postgres-adapter.js +526 -0
- package/dist/lib/database-service/postgres-adapter.js.map +1 -0
- package/dist/lib/database-service/redis-adapter.js +360 -0
- package/dist/lib/database-service/redis-adapter.js.map +1 -0
- package/dist/lib/database-service/sqlite-adapter.js +544 -0
- package/dist/lib/database-service/sqlite-adapter.js.map +1 -0
- package/dist/lib/database-service/transaction-manager.js +773 -0
- package/dist/lib/database-service/transaction-manager.js.map +1 -0
- package/dist/lib/database-service/types.js +23 -0
- package/dist/lib/database-service/types.js.map +1 -0
- package/dist/lib/deadlock-resolver.js +292 -0
- package/dist/lib/deadlock-resolver.js.map +1 -0
- package/dist/lib/distributed-lock.js +451 -0
- package/dist/lib/distributed-lock.js.map +1 -0
- package/dist/lib/edge-case-deduplicator.js +227 -0
- package/dist/lib/edge-case-deduplicator.js.map +1 -0
- package/dist/lib/encryption-manager.js +322 -0
- package/dist/lib/encryption-manager.js.map +1 -0
- package/dist/lib/error-aggregator.js +234 -0
- package/dist/lib/error-aggregator.js.map +1 -0
- package/dist/lib/errors.js +287 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/file-lock-manager.js +578 -0
- package/dist/lib/file-lock-manager.js.map +1 -0
- package/dist/lib/file-operations.js +367 -0
- package/dist/lib/file-operations.js.map +1 -0
- package/dist/lib/idempotent-write.js +237 -0
- package/dist/lib/idempotent-write.js.map +1 -0
- package/dist/lib/integration-schema-validator.js +522 -0
- package/dist/lib/integration-schema-validator.js.map +1 -0
- package/dist/lib/lock-health-monitor.js +298 -0
- package/dist/lib/lock-health-monitor.js.map +1 -0
- package/dist/lib/log-shipper.js +422 -0
- package/dist/lib/log-shipper.js.map +1 -0
- package/dist/lib/logging.js +146 -0
- package/dist/lib/logging.js.map +1 -0
- package/dist/lib/message-deduplicator.js +439 -0
- package/dist/lib/message-deduplicator.js.map +1 -0
- package/dist/lib/multi-system-query.js +604 -0
- package/dist/lib/multi-system-query.js.map +1 -0
- package/dist/lib/orphan-detector.js +332 -0
- package/dist/lib/orphan-detector.js.map +1 -0
- package/dist/lib/password-generator.js +166 -0
- package/dist/lib/password-generator.js.map +1 -0
- package/dist/lib/path-validator.js +429 -0
- package/dist/lib/path-validator.js.map +1 -0
- package/dist/lib/query-translator.js +905 -0
- package/dist/lib/query-translator.js.map +1 -0
- package/dist/lib/queue-recovery.js +469 -0
- package/dist/lib/queue-recovery.js.map +1 -0
- package/dist/lib/redis-queue-manager.js +512 -0
- package/dist/lib/redis-queue-manager.js.map +1 -0
- package/dist/lib/reflection-archiver.js +272 -0
- package/dist/lib/reflection-archiver.js.map +1 -0
- package/dist/lib/retry-manager.js +453 -0
- package/dist/lib/retry-manager.js.map +1 -0
- package/dist/lib/retry.js +262 -0
- package/dist/lib/retry.js.map +1 -0
- package/dist/lib/schema-transform.js +695 -0
- package/dist/lib/schema-transform.js.map +1 -0
- package/dist/lib/schema-validator.js +491 -0
- package/dist/lib/schema-validator.js.map +1 -0
- package/dist/lib/skill-cache.js +297 -0
- package/dist/lib/skill-cache.js.map +1 -0
- package/dist/lib/skill-content-manager.js +337 -0
- package/dist/lib/skill-content-manager.js.map +1 -0
- package/dist/lib/skill-frontmatter-parser.js +237 -0
- package/dist/lib/skill-frontmatter-parser.js.map +1 -0
- package/dist/lib/skill-git-integration.js +275 -0
- package/dist/lib/skill-git-integration.js.map +1 -0
- package/dist/lib/skill-markdown-validator.js +396 -0
- package/dist/lib/skill-markdown-validator.js.map +1 -0
- package/dist/lib/skill-output-parser.js +312 -0
- package/dist/lib/skill-output-parser.js.map +1 -0
- package/dist/lib/unified-query-api.js +467 -0
- package/dist/lib/unified-query-api.js.map +1 -0
- package/dist/middleware/auth-middleware.js +350 -0
- package/dist/middleware/auth-middleware.js.map +1 -0
- package/dist/middleware/schema-validation.js +347 -0
- package/dist/middleware/schema-validation.js.map +1 -0
- package/dist/providers/anthropic-provider.js +1 -1
- package/dist/providers/anthropic-provider.js.map +1 -1
- package/dist/providers/provider-factory.js +2 -2
- package/dist/providers/provider-factory.js.map +1 -1
- package/dist/services/edge-case-analyzer.js +321 -0
- package/dist/services/edge-case-analyzer.js.map +1 -0
- package/dist/services/edge-case-deduplicator.js +266 -0
- package/dist/services/edge-case-deduplicator.js.map +1 -0
- package/dist/services/edge-case-detector.js +337 -0
- package/dist/services/edge-case-detector.js.map +1 -0
- package/dist/services/edge-case-tracker.js +547 -0
- package/dist/services/edge-case-tracker.js.map +1 -0
- package/dist/services/health-check-system.js +586 -0
- package/dist/services/health-check-system.js.map +1 -0
- package/dist/services/metrics-logger.js +412 -0
- package/dist/services/metrics-logger.js.map +1 -0
- package/dist/services/patch-generator.js +378 -0
- package/dist/services/patch-generator.js.map +1 -0
- package/dist/services/patch-validator.js +337 -0
- package/dist/services/patch-validator.js.map +1 -0
- package/dist/services/performance-monitor.js +811 -0
- package/dist/services/performance-monitor.js.map +1 -0
- package/dist/services/promotion-pipeline.js +918 -0
- package/dist/services/promotion-pipeline.js.map +1 -0
- package/dist/services/promotion-validator.js +394 -0
- package/dist/services/promotion-validator.js.map +1 -0
- package/dist/services/reflection-logger.js +388 -0
- package/dist/services/reflection-logger.js.map +1 -0
- package/dist/services/skill-deployment.js +472 -0
- package/dist/services/skill-deployment.js.map +1 -0
- package/dist/services/skill-loader.js +427 -0
- package/dist/services/skill-loader.js.map +1 -0
- package/dist/services/skill-promotion.js +372 -0
- package/dist/services/skill-promotion.js.map +1 -0
- package/dist/services/skill-validator.js +454 -0
- package/dist/services/skill-validator.js.map +1 -0
- package/dist/services/skill-versioning.js +244 -0
- package/dist/services/skill-versioning.js.map +1 -0
- package/dist/services/workspace-supervisor.js +597 -0
- package/dist/services/workspace-supervisor.js.map +1 -0
- package/dist/types/edge-case.js +45 -0
- package/dist/types/edge-case.js.map +1 -0
- package/package.json +201 -177
- package/readme/README.md +19 -4
- package/scripts/backup-cleanup.sh +627 -0
- package/scripts/cleanup-workspaces.sh +412 -0
- package/scripts/cleanup-yaml-configs.sh +141 -0
- package/scripts/deploy-approved-skills.sh +263 -0
- package/scripts/health-check.sh +447 -0
- package/scripts/log-aggregator.sh +554 -0
- package/scripts/log-monitor.sh +629 -0
- package/scripts/manage-agent-workspaces.sh +434 -0
- package/scripts/migrate-schema.sh +533 -0
- package/scripts/promote-staged-skills.sh +423 -0
- package/scripts/verify-no-secrets.sh +88 -35
- package/.claude/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +0 -161
- package/.claude/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +0 -728
- package/.claude/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +0 -131
- package/.claude/skills/agent-lifecycle/SKILL.md +0 -60
- package/.claude/skills/agent-lifecycle/execute-lifecycle-hook.sh +0 -573
- package/.claude/skills/agent-lifecycle/simple-audit.sh +0 -31
- package/.claude/skills/cfn-agent-spawning/spawn-agent.sh.backup +0 -273
- package/.claude/skills/cfn-loop-orchestration/orchestrate.sh.backup +0 -949
- package/README.md.backup_before_replace +0 -781
- package/claude-assets/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +0 -161
- package/claude-assets/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +0 -728
- package/claude-assets/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +0 -131
- package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh.backup +0 -273
- package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh.backup +0 -949
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/backup-manager.ts"],"sourcesContent":["/**\r\n * Unified Backup & Restore Manager\r\n *\r\n * Centralized backup and restore system for all critical file operations.\r\n * Part of Task 4.3: Unified Backup & Restore System\r\n *\r\n * Features:\r\n * - Multiple backup types (pre-edit, checkpoint, manual)\r\n * - SQLite metadata storage with queryability\r\n * - Restore operations (latest, by timestamp, by hash)\r\n * - Restore verification with hash comparison\r\n * - Dry-run mode for restore preview\r\n * - Automatic rollback on verification failure\r\n * - Rate limiting for restore operations\r\n * - Comprehensive audit trail\r\n * - Disk usage monitoring\r\n * - Automatic cleanup based on TTL\r\n * - Integration with FileLockManager\r\n *\r\n * Usage:\r\n * const manager = new BackupManager();\r\n * const backup = await manager.createBackup('/path/to/file.txt', {\r\n * agentId: 'backend-dev-001',\r\n * backupType: 'pre-edit'\r\n * });\r\n *\r\n * // Restore latest backup\r\n * await manager.restoreLatest('/path/to/file.txt', {\r\n * agentId: 'backend-dev-001',\r\n * verify: true\r\n * });\r\n */\r\n\r\nimport * as fs from 'fs';\r\nimport * as path from 'path';\r\nimport * as crypto from 'crypto';\r\nimport { promisify } from 'util';\r\nimport { randomUUID } from 'crypto';\r\nimport Database from 'better-sqlite3';\r\nimport { createLogger } from './logging.js';\r\nimport { createError, ErrorCode, StandardError } from './errors.js';\r\nimport { getFileLockManager, FileLockManager } from './file-lock-manager.js';\r\nimport { withFileSystemRetry } from './retry-manager.js';\r\nimport { getEncryptionManager, EncryptionManager, EncryptedBackup } from './encryption-manager.js';\r\n\r\nconst logger = createLogger('backup-manager');\r\n\r\nconst fsReadFile = promisify(fs.readFile);\r\nconst fsWriteFile = promisify(fs.writeFile);\r\nconst fsCopyFile = promisify(fs.copyFile);\r\nconst fsStat = promisify(fs.stat);\r\nconst fsMkdir = promisify(fs.mkdir);\r\nconst fsAccess = promisify(fs.access);\r\nconst fsReaddir = promisify(fs.readdir);\r\nconst fsUnlink = promisify(fs.unlink);\r\n\r\n/**\r\n * Backup type classification\r\n */\r\nexport enum BackupType {\r\n PRE_EDIT = 'pre-edit',\r\n CHECKPOINT = 'checkpoint',\r\n MANUAL = 'manual',\r\n}\r\n\r\n/**\r\n * Backup creation options\r\n */\r\nexport interface BackupOptions {\r\n /** Agent ID performing the backup */\r\n agentId: string;\r\n /** Backup type */\r\n backupType: BackupType;\r\n /** TTL in milliseconds (default: 24 hours) */\r\n ttlMs?: number;\r\n /** Additional metadata (JSON) */\r\n metadata?: Record<string, any>;\r\n /** Project root directory */\r\n projectRoot?: string;\r\n}\r\n\r\n/**\r\n * Restore operation options\r\n */\r\nexport interface RestoreOptions {\r\n /** Agent ID performing restore */\r\n agentId: string;\r\n /** Verify hash after restore (default: true) */\r\n verify?: boolean;\r\n /** Dry-run mode (preview only, default: false) */\r\n dryRun?: boolean;\r\n /** Force restore even if rate limit exceeded */\r\n force?: boolean;\r\n /** Create backup before restore (default: true) */\r\n createBackupBeforeRestore?: boolean;\r\n}\r\n\r\n/**\r\n * Backup metadata from database\r\n */\r\nexport interface BackupMetadata {\r\n id: string;\r\n agentId: string;\r\n filePath: string;\r\n backupPath: string;\r\n originalHash: string;\r\n backupHash: string;\r\n fileSize: number;\r\n backupSize?: number;\r\n backupType: BackupType;\r\n createdAt: string;\r\n expiresAt: string;\r\n isCompressed: boolean;\r\n compressedAt?: string;\r\n compressionRatio?: number;\r\n // ENCRYPTION SUPPORT (CVSS 7.2 mitigation)\r\n isEncrypted?: boolean;\r\n encryptedAt?: string;\r\n encryptionAlgorithm?: string;\r\n encryptionIv?: string;\r\n encryptionAuthTag?: string;\r\n encryptionHmac?: string;\r\n encryptionKeyVersion?: string;\r\n metadata?: string;\r\n deletedAt?: string;\r\n}\r\n\r\n/**\r\n * Backup instance\r\n */\r\nexport interface Backup {\r\n id: string;\r\n filePath: string;\r\n backupPath: string;\r\n agentId: string;\r\n backupType: BackupType;\r\n originalHash: string;\r\n backupHash: string;\r\n fileSize: number;\r\n createdAt: Date;\r\n expiresAt: Date;\r\n metadata?: Record<string, any>;\r\n}\r\n\r\n/**\r\n * Restore result\r\n */\r\nexport interface RestoreResult {\r\n success: boolean;\r\n backupId: string;\r\n filePath: string;\r\n backupPath: string;\r\n verified: boolean;\r\n dryRun: boolean;\r\n restoredAt: Date;\r\n verificationHash?: string;\r\n expectedHash?: string;\r\n rollbackPerformed?: boolean;\r\n error?: string;\r\n}\r\n\r\n/**\r\n * Disk usage statistics\r\n */\r\nexport interface DiskUsageStats {\r\n totalBackups: number;\r\n activeBackups: number;\r\n expiredBackups: number;\r\n totalSizeBytes: number;\r\n compressedSizeBytes: number;\r\n averageCompressionRatio: number;\r\n oldestBackupDate: Date | null;\r\n newestBackupDate: Date | null;\r\n backupsByType: Record<BackupType, number>;\r\n backupsByAgent: Record<string, number>;\r\n}\r\n\r\n/**\r\n * Rate limit configuration\r\n */\r\nexport interface RateLimitConfig {\r\n /** Maximum restores per hour (default: 100) */\r\n maxRestoresPerHour: number;\r\n}\r\n\r\n/**\r\n * Backup Manager Configuration\r\n */\r\nexport interface BackupManagerConfig {\r\n /** Backup directory (default: .backups) */\r\n backupDir?: string;\r\n /** Database path (default: ./data/backups.db) */\r\n dbPath?: string;\r\n /** Default TTL in milliseconds (default: 24 hours) */\r\n defaultTtlMs?: number;\r\n /** Rate limit configuration */\r\n rateLimit?: RateLimitConfig;\r\n /** Project root directory */\r\n projectRoot?: string;\r\n}\r\n\r\n/**\r\n * Unified Backup & Restore Manager\r\n */\r\nexport class BackupManager {\r\n private db: Database.Database;\r\n private lockManager: FileLockManager;\r\n private encryptionManager: EncryptionManager;\r\n private backupDir: string;\r\n private defaultTtlMs: number;\r\n private rateLimitConfig: RateLimitConfig;\r\n private projectRoot: string;\r\n\r\n constructor(config: BackupManagerConfig = {}) {\r\n this.projectRoot = config.projectRoot || process.cwd();\r\n this.backupDir = config.backupDir || path.join(this.projectRoot, '.backups');\r\n this.defaultTtlMs = config.defaultTtlMs || 24 * 60 * 60 * 1000; // 24 hours\r\n this.rateLimitConfig = config.rateLimit || { maxRestoresPerHour: 100 };\r\n\r\n const dbPath =\r\n config.dbPath ||\r\n path.join(this.projectRoot, 'claude-assets/skills/cfn-redis-coordination/data/backups.db');\r\n\r\n // Initialize database\r\n this.db = this.initializeDatabase(dbPath);\r\n\r\n // Initialize file lock manager\r\n this.lockManager = getFileLockManager();\r\n\r\n // Initialize encryption manager (CVSS 7.2 mitigation)\r\n this.encryptionManager = getEncryptionManager();\r\n\r\n // Ensure backup directory exists\r\n this.ensureBackupDirectory();\r\n\r\n logger.info('Backup manager initialized', {\r\n backupDir: this.backupDir,\r\n dbPath,\r\n defaultTtlMs: this.defaultTtlMs,\r\n encryptionEnabled: this.encryptionManager.isEnabled(),\r\n });\r\n }\r\n\r\n /**\r\n * Create a backup of a file\r\n *\r\n * @param filePath - Path to file to backup\r\n * @param options - Backup options\r\n * @returns Backup instance\r\n */\r\n async createBackup(filePath: string, options: BackupOptions): Promise<Backup> {\r\n const startTime = Date.now();\r\n const absolutePath = path.resolve(filePath);\r\n\r\n logger.info('Creating backup', {\r\n filePath: absolutePath,\r\n agentId: options.agentId,\r\n backupType: options.backupType,\r\n });\r\n\r\n // Acquire file lock\r\n const lock = await this.lockManager.acquireLock(absolutePath, {\r\n agentId: options.agentId,\r\n timeout: 30000,\r\n });\r\n\r\n try {\r\n // Check if file exists\r\n const exists = await this.fileExists(absolutePath);\r\n\r\n if (!exists) {\r\n throw createError(\r\n ErrorCode.FILE_NOT_FOUND,\r\n `File does not exist: ${absolutePath}`,\r\n { filePath: absolutePath }\r\n );\r\n }\r\n\r\n // Read file and calculate hash\r\n const fileContent = await fsReadFile(absolutePath);\r\n const originalHash = this.calculateHash(fileContent);\r\n const fileSize = fileContent.length;\r\n\r\n // Create backup directory structure\r\n const timestamp = Date.now();\r\n const backupPath = this.getBackupPath(options.agentId, timestamp, originalHash);\r\n\r\n await this.ensureDirectory(path.dirname(backupPath));\r\n\r\n // Copy file to backup location with retry logic for transient failures\r\n await withFileSystemRetry(async () => {\r\n await fsCopyFile(absolutePath, backupPath);\r\n });\r\n\r\n // Verify backup with retry logic\r\n const backupContent = await withFileSystemRetry(async () => {\r\n return await fsReadFile(backupPath);\r\n });\r\n const backupHash = this.calculateHash(backupContent);\r\n\r\n if (!this.constantTimeHashCompare(originalHash, backupHash)) {\r\n // Cleanup failed backup\r\n await this.safeUnlink(backupPath);\r\n throw createError(\r\n ErrorCode.VALIDATION_FAILED,\r\n 'Backup verification failed: hash mismatch',\r\n { originalHash, backupHash, filePath: absolutePath }\r\n );\r\n }\r\n\r\n // Calculate expiration\r\n const ttlMs = options.ttlMs || this.defaultTtlMs;\r\n const expiresAt = new Date(Date.now() + ttlMs);\r\n\r\n // Store metadata in database\r\n const backupId = randomUUID();\r\n const backup: Backup = {\r\n id: backupId,\r\n filePath: absolutePath,\r\n backupPath,\r\n agentId: options.agentId,\r\n backupType: options.backupType,\r\n originalHash,\r\n backupHash,\r\n fileSize,\r\n createdAt: new Date(),\r\n expiresAt,\r\n metadata: options.metadata,\r\n };\r\n\r\n // ENCRYPTION SUPPORT (CVSS 7.2 mitigation)\r\n let encryptionMetadata: any = null;\r\n if (this.encryptionManager.isEnabled()) {\r\n try {\r\n const encrypted = await this.encryptionManager.encrypt(backupContent, backupId);\r\n encryptionMetadata = encrypted.metadata;\r\n\r\n // Write encrypted backup\r\n await withFileSystemRetry(async () => {\r\n await fsWriteFile(backupPath, encrypted.data);\r\n });\r\n\r\n logger.info('Backup encrypted successfully', {\r\n backupId,\r\n algorithm: encrypted.metadata.algorithm,\r\n originalSize: backupContent.length,\r\n encryptedSize: encrypted.data.length,\r\n });\r\n } catch (encryptError) {\r\n logger.error(\r\n 'Backup encryption failed',\r\n encryptError instanceof Error ? encryptError : undefined,\r\n { backupId, filePath: absolutePath }\r\n );\r\n\r\n // Cleanup failed backup\r\n await this.safeUnlink(backupPath);\r\n throw encryptError;\r\n }\r\n }\r\n\r\n this.insertBackup(backup, encryptionMetadata);\r\n\r\n const duration = Date.now() - startTime;\r\n logger.info('Backup created successfully', {\r\n backupId,\r\n filePath: absolutePath,\r\n backupPath,\r\n fileSize,\r\n durationMs: duration,\r\n });\r\n\r\n return backup;\r\n } catch (error) {\r\n const duration = Date.now() - startTime;\r\n logger.error(\r\n 'Backup creation failed',\r\n error instanceof Error ? error : undefined,\r\n { filePath: absolutePath, durationMs: duration }\r\n );\r\n\r\n // Log failed backup to audit trail\r\n this.logAuditEntry({\r\n backupId: null,\r\n operation: 'create',\r\n agentId: options.agentId,\r\n status: 'failure',\r\n filePath: absolutePath,\r\n errorMessage: error instanceof Error ? error.message : String(error),\r\n errorCode: error instanceof StandardError ? error.code : ErrorCode.UNKNOWN_ERROR,\r\n durationMs: duration,\r\n });\r\n\r\n throw error;\r\n } finally {\r\n await this.lockManager.releaseLock(lock.id);\r\n }\r\n }\r\n\r\n /**\r\n * Restore the latest backup for a file\r\n *\r\n * @param filePath - Path to file to restore\r\n * @param options - Restore options\r\n * @returns Restore result\r\n */\r\n async restoreLatest(filePath: string, options: RestoreOptions): Promise<RestoreResult> {\r\n const absolutePath = path.resolve(filePath);\r\n const backup = this.getLatestBackup(absolutePath);\r\n\r\n if (!backup) {\r\n throw createError(ErrorCode.FILE_NOT_FOUND, `No backup found for: ${absolutePath}`, {\r\n filePath: absolutePath,\r\n });\r\n }\r\n\r\n return this.restoreBackup(backup.id, options);\r\n }\r\n\r\n /**\r\n * Restore backup by timestamp\r\n *\r\n * @param filePath - Path to file\r\n * @param timestamp - Backup timestamp\r\n * @param options - Restore options\r\n * @returns Restore result\r\n */\r\n async restoreByTimestamp(\r\n filePath: string,\r\n timestamp: Date,\r\n options: RestoreOptions\r\n ): Promise<RestoreResult> {\r\n const absolutePath = path.resolve(filePath);\r\n const backup = this.getBackupByTimestamp(absolutePath, timestamp);\r\n\r\n if (!backup) {\r\n throw createError(\r\n ErrorCode.FILE_NOT_FOUND,\r\n `No backup found for: ${absolutePath} at timestamp ${timestamp.toISOString()}`,\r\n { filePath: absolutePath, timestamp: timestamp.toISOString() }\r\n );\r\n }\r\n\r\n return this.restoreBackup(backup.id, options);\r\n }\r\n\r\n /**\r\n * Restore backup by hash\r\n *\r\n * @param filePath - Path to file\r\n * @param hash - File hash\r\n * @param options - Restore options\r\n * @returns Restore result\r\n */\r\n async restoreByHash(filePath: string, hash: string, options: RestoreOptions): Promise<RestoreResult> {\r\n const absolutePath = path.resolve(filePath);\r\n const backup = this.getBackupByHash(absolutePath, hash);\r\n\r\n if (!backup) {\r\n throw createError(\r\n ErrorCode.FILE_NOT_FOUND,\r\n `No backup found for: ${absolutePath} with hash ${hash}`,\r\n { filePath: absolutePath, hash }\r\n );\r\n }\r\n\r\n return this.restoreBackup(backup.id, options);\r\n }\r\n\r\n /**\r\n * Restore a specific backup by ID\r\n *\r\n * @param backupId - Backup ID\r\n * @param options - Restore options\r\n * @returns Restore result\r\n */\r\n async restoreBackup(backupId: string, options: RestoreOptions): Promise<RestoreResult> {\r\n const startTime = Date.now();\r\n const verify = options.verify !== false;\r\n const dryRun = options.dryRun || false;\r\n const force = options.force || false;\r\n const createBackupBeforeRestore = options.createBackupBeforeRestore !== false;\r\n\r\n logger.info('Restoring backup', {\r\n backupId,\r\n agentId: options.agentId,\r\n verify,\r\n dryRun,\r\n });\r\n\r\n // Get backup metadata\r\n const metadata = this.getBackupMetadata(backupId);\r\n\r\n if (!metadata) {\r\n throw createError(ErrorCode.FILE_NOT_FOUND, `Backup not found: ${backupId}`, {\r\n backupId,\r\n });\r\n }\r\n\r\n // Check rate limit\r\n if (!force && !dryRun) {\r\n const rateLimitOk = this.checkRateLimit(options.agentId);\r\n if (!rateLimitOk) {\r\n throw createError(\r\n ErrorCode.LOCK_TIMEOUT,\r\n 'Restore rate limit exceeded',\r\n {\r\n agentId: options.agentId,\r\n maxRestoresPerHour: this.rateLimitConfig.maxRestoresPerHour,\r\n }\r\n );\r\n }\r\n }\r\n\r\n // Verify backup file exists\r\n const backupExists = await this.fileExists(metadata.backupPath);\r\n\r\n if (!backupExists) {\r\n throw createError(\r\n ErrorCode.FILE_NOT_FOUND,\r\n `Backup file not found: ${metadata.backupPath}`,\r\n { backupId, backupPath: metadata.backupPath }\r\n );\r\n }\r\n\r\n // Dry-run mode: just verify and return\r\n if (dryRun) {\r\n const backupContent = await fsReadFile(metadata.backupPath);\r\n const verificationHash = this.calculateHash(backupContent);\r\n\r\n return {\r\n success: true,\r\n backupId,\r\n filePath: metadata.filePath,\r\n backupPath: metadata.backupPath,\r\n verified: this.constantTimeHashCompare(verificationHash, metadata.backupHash),\r\n dryRun: true,\r\n restoredAt: new Date(),\r\n verificationHash,\r\n expectedHash: metadata.backupHash,\r\n };\r\n }\r\n\r\n // Acquire file lock\r\n const lock = await this.lockManager.acquireLock(metadata.filePath, {\r\n agentId: options.agentId,\r\n timeout: 30000,\r\n });\r\n\r\n let rollbackBackupId: string | undefined;\r\n\r\n try {\r\n // Create backup of current file before restore\r\n if (createBackupBeforeRestore && (await this.fileExists(metadata.filePath))) {\r\n const rollbackBackup = await this.createBackup(metadata.filePath, {\r\n agentId: options.agentId,\r\n backupType: BackupType.PRE_EDIT,\r\n metadata: { reason: 'pre-restore-backup', restoringBackupId: backupId },\r\n });\r\n rollbackBackupId = rollbackBackup.id;\r\n }\r\n\r\n // DECRYPTION SUPPORT (CVSS 7.2 mitigation)\r\n let backupDataToRestore: Buffer;\r\n\r\n if (metadata.isEncrypted && this.encryptionManager.isEnabled()) {\r\n try {\r\n const encryptedBackupContent = await withFileSystemRetry(async () => {\r\n return await fsReadFile(metadata.backupPath);\r\n });\r\n\r\n const encryptedPayload: EncryptedBackup = {\r\n data: encryptedBackupContent,\r\n metadata: {\r\n algorithm: 'AES-256-GCM',\r\n iv: metadata.encryptionIv!,\r\n authTag: metadata.encryptionAuthTag!,\r\n hmac: metadata.encryptionHmac!,\r\n encryptedAt: metadata.encryptedAt!,\r\n keyVersion: metadata.encryptionKeyVersion!,\r\n },\r\n };\r\n\r\n const decryptionResult = await this.encryptionManager.decrypt(encryptedPayload, backupId);\r\n\r\n if (!decryptionResult.integrityVerified) {\r\n logger.warn('Backup integrity check failed during restore', {\r\n backupId,\r\n integrityVerified: false,\r\n });\r\n }\r\n\r\n backupDataToRestore = decryptionResult.data;\r\n\r\n logger.info('Backup decrypted successfully', {\r\n backupId,\r\n integrityVerified: decryptionResult.integrityVerified,\r\n });\r\n } catch (decryptError) {\r\n logger.error(\r\n 'Backup decryption failed',\r\n decryptError instanceof Error ? decryptError : undefined,\r\n { backupId, filePath: metadata.filePath }\r\n );\r\n\r\n throw decryptError;\r\n }\r\n } else {\r\n // Load unencrypted backup\r\n backupDataToRestore = await withFileSystemRetry(async () => {\r\n return await fsReadFile(metadata.backupPath);\r\n });\r\n }\r\n\r\n // Perform restore with retry logic for transient failures\r\n await withFileSystemRetry(async () => {\r\n await fsWriteFile(metadata.filePath, backupDataToRestore);\r\n });\r\n\r\n // Verify restore if requested\r\n let verified = false;\r\n let verificationHash: string | undefined;\r\n\r\n if (verify) {\r\n const restoredContent = await withFileSystemRetry(async () => {\r\n return await fsReadFile(metadata.filePath);\r\n });\r\n verificationHash = this.calculateHash(restoredContent);\r\n verified = this.constantTimeHashCompare(verificationHash, metadata.originalHash);\r\n\r\n if (!verified) {\r\n // Verification failed - rollback if we created a backup\r\n let rollbackPerformed = false;\r\n\r\n if (rollbackBackupId) {\r\n try {\r\n await this.restoreBackup(rollbackBackupId, {\r\n agentId: options.agentId,\r\n verify: false,\r\n dryRun: false,\r\n force: true,\r\n createBackupBeforeRestore: false,\r\n });\r\n rollbackPerformed = true;\r\n } catch (rollbackError) {\r\n logger.error(\r\n 'Rollback failed after verification failure',\r\n rollbackError instanceof Error ? rollbackError : undefined,\r\n { backupId, rollbackBackupId }\r\n );\r\n }\r\n }\r\n\r\n throw createError(\r\n ErrorCode.VALIDATION_FAILED,\r\n 'Restore verification failed: hash mismatch',\r\n {\r\n backupId,\r\n filePath: metadata.filePath,\r\n verificationHash,\r\n expectedHash: metadata.originalHash,\r\n rollbackPerformed,\r\n }\r\n );\r\n }\r\n }\r\n\r\n // Record restore in rate limit table\r\n this.recordRestore(backupId, options.agentId, metadata.filePath);\r\n\r\n // Log successful restore to audit trail\r\n const duration = Date.now() - startTime;\r\n this.logAuditEntry({\r\n backupId,\r\n operation: 'restore',\r\n agentId: options.agentId,\r\n status: 'success',\r\n filePath: metadata.filePath,\r\n backupPath: metadata.backupPath,\r\n durationMs: duration,\r\n metadata: { verified, rollbackBackupId },\r\n });\r\n\r\n logger.info('Restore completed successfully', {\r\n backupId,\r\n filePath: metadata.filePath,\r\n verified,\r\n durationMs: duration,\r\n });\r\n\r\n return {\r\n success: true,\r\n backupId,\r\n filePath: metadata.filePath,\r\n backupPath: metadata.backupPath,\r\n verified,\r\n dryRun: false,\r\n restoredAt: new Date(),\r\n verificationHash,\r\n expectedHash: metadata.originalHash,\r\n };\r\n } catch (error) {\r\n const duration = Date.now() - startTime;\r\n logger.error(\r\n 'Restore failed',\r\n error instanceof Error ? error : undefined,\r\n { backupId, filePath: metadata.filePath, durationMs: duration }\r\n );\r\n\r\n // Log failed restore to audit trail\r\n this.logAuditEntry({\r\n backupId,\r\n operation: 'restore',\r\n agentId: options.agentId,\r\n status: 'failure',\r\n filePath: metadata.filePath,\r\n backupPath: metadata.backupPath,\r\n errorMessage: error instanceof Error ? error.message : String(error),\r\n errorCode: error instanceof StandardError ? error.code : ErrorCode.UNKNOWN_ERROR,\r\n durationMs: duration,\r\n });\r\n\r\n throw error;\r\n } finally {\r\n await this.lockManager.releaseLock(lock.id);\r\n }\r\n }\r\n\r\n /**\r\n * Get disk usage statistics\r\n */\r\n getDiskUsage(): DiskUsageStats {\r\n const stmt = this.db.prepare(`\r\n SELECT\r\n COUNT(*) as total_backups,\r\n SUM(CASE WHEN deleted_at IS NULL AND expires_at > datetime('now') THEN 1 ELSE 0 END) as active_backups,\r\n SUM(CASE WHEN deleted_at IS NULL AND expires_at <= datetime('now') THEN 1 ELSE 0 END) as expired_backups,\r\n SUM(file_size) as total_size_bytes,\r\n SUM(CASE WHEN is_compressed = 1 THEN file_size ELSE 0 END) as compressed_size_bytes,\r\n AVG(CASE WHEN is_compressed = 1 THEN compression_ratio ELSE NULL END) as avg_compression_ratio,\r\n MIN(created_at) as oldest_backup,\r\n MAX(created_at) as newest_backup\r\n FROM backups\r\n WHERE deleted_at IS NULL\r\n `);\r\n\r\n const result = stmt.get() as any;\r\n\r\n const byTypeStmt = this.db.prepare(`\r\n SELECT backup_type, COUNT(*) as count\r\n FROM backups\r\n WHERE deleted_at IS NULL\r\n GROUP BY backup_type\r\n `);\r\n\r\n const byType = byTypeStmt.all() as Array<{ backup_type: string; count: number }>;\r\n\r\n const byAgentStmt = this.db.prepare(`\r\n SELECT agent_id, COUNT(*) as count\r\n FROM backups\r\n WHERE deleted_at IS NULL\r\n GROUP BY agent_id\r\n `);\r\n\r\n const byAgent = byAgentStmt.all() as Array<{ agent_id: string; count: number }>;\r\n\r\n return {\r\n totalBackups: result.total_backups || 0,\r\n activeBackups: result.active_backups || 0,\r\n expiredBackups: result.expired_backups || 0,\r\n totalSizeBytes: result.total_size_bytes || 0,\r\n compressedSizeBytes: result.compressed_size_bytes || 0,\r\n averageCompressionRatio: result.avg_compression_ratio || 0,\r\n oldestBackupDate: result.oldest_backup ? new Date(result.oldest_backup) : null,\r\n newestBackupDate: result.newest_backup ? new Date(result.newest_backup) : null,\r\n backupsByType: byType.reduce(\r\n (acc, row) => {\r\n acc[row.backup_type as BackupType] = row.count;\r\n return acc;\r\n },\r\n {} as Record<BackupType, number>\r\n ),\r\n backupsByAgent: byAgent.reduce(\r\n (acc, row) => {\r\n acc[row.agent_id] = row.count;\r\n return acc;\r\n },\r\n {} as Record<string, number>\r\n ),\r\n };\r\n }\r\n\r\n /**\r\n * List backups for a file\r\n */\r\n listBackups(filePath: string): BackupMetadata[] {\r\n const absolutePath = path.resolve(filePath);\r\n const stmt = this.db.prepare(`\r\n SELECT * FROM backups\r\n WHERE file_path = ? AND deleted_at IS NULL\r\n ORDER BY created_at DESC\r\n `);\r\n\r\n return stmt.all(absolutePath) as BackupMetadata[];\r\n }\r\n\r\n /**\r\n * Delete expired backups\r\n */\r\n deleteExpiredBackups(): number {\r\n const expiredBackups = this.db\r\n .prepare(`\r\n SELECT id, backup_path FROM backups\r\n WHERE deleted_at IS NULL AND expires_at <= datetime('now')\r\n `)\r\n .all() as Array<{ id: string; backup_path: string }>;\r\n\r\n let deletedCount = 0;\r\n\r\n for (const backup of expiredBackups) {\r\n try {\r\n // Delete backup file\r\n fs.unlinkSync(backup.backup_path);\r\n\r\n // Mark as deleted in database\r\n this.db\r\n .prepare(`\r\n UPDATE backups SET deleted_at = datetime('now')\r\n WHERE id = ?\r\n `)\r\n .run(backup.id);\r\n\r\n deletedCount++;\r\n } catch (error) {\r\n logger.error(\r\n 'Failed to delete expired backup',\r\n error instanceof Error ? error : undefined,\r\n { backupId: backup.id, backupPath: backup.backup_path }\r\n );\r\n }\r\n }\r\n\r\n logger.info('Expired backups deleted', { count: deletedCount });\r\n\r\n return deletedCount;\r\n }\r\n\r\n /**\r\n * Close database connection\r\n */\r\n close(): void {\r\n this.db.close();\r\n logger.info('Backup manager closed');\r\n }\r\n\r\n // ============================================================================\r\n // Private Helper Methods\r\n // ============================================================================\r\n\r\n private initializeDatabase(dbPath: string): Database.Database {\r\n const dbDir = path.dirname(dbPath);\r\n\r\n if (!fs.existsSync(dbDir)) {\r\n fs.mkdirSync(dbDir, { recursive: true });\r\n }\r\n\r\n const db = new Database(dbPath);\r\n\r\n // Run migration\r\n const migrationPath = path.join(\r\n this.projectRoot,\r\n 'src/db/migrations/up/004-backup-metadata-schema.sql'\r\n );\r\n\r\n if (fs.existsSync(migrationPath)) {\r\n const migration = fs.readFileSync(migrationPath, 'utf8');\r\n db.exec(migration);\r\n logger.info('Database migration applied', { migrationPath });\r\n }\r\n\r\n return db;\r\n }\r\n\r\n private ensureBackupDirectory(): void {\r\n if (!fs.existsSync(this.backupDir)) {\r\n fs.mkdirSync(this.backupDir, { recursive: true, mode: 0o755 });\r\n logger.info('Created backup directory', { directory: this.backupDir });\r\n }\r\n }\r\n\r\n private async ensureDirectory(dirPath: string): Promise<void> {\r\n try {\r\n await fsMkdir(dirPath, { recursive: true, mode: 0o755 });\r\n } catch (error) {\r\n // Ignore if directory already exists\r\n if ((error as NodeJS.ErrnoException).code !== 'EEXIST') {\r\n throw error;\r\n }\r\n }\r\n }\r\n\r\n private getBackupPath(agentId: string, timestamp: number, hash: string): string {\r\n return path.join(this.backupDir, agentId, `${timestamp}_${hash}`, 'original');\r\n }\r\n\r\n private calculateHash(content: Buffer): string {\r\n return crypto.createHash('sha256').update(content).digest('hex');\r\n }\r\n\r\n /**\r\n * Constant-time hash comparison to prevent timing attacks\r\n * @param hash1 First hash (hex string)\r\n * @param hash2 Second hash (hex string)\r\n * @returns true if hashes match, false otherwise\r\n */\r\n private constantTimeHashCompare(hash1: string, hash2: string): boolean {\r\n try {\r\n // Convert hex strings to buffers\r\n const buffer1 = Buffer.from(hash1, 'hex');\r\n const buffer2 = Buffer.from(hash2, 'hex');\r\n\r\n // Length check (not timing-sensitive as length is not secret)\r\n if (buffer1.length !== buffer2.length) {\r\n return false;\r\n }\r\n\r\n // Constant-time comparison\r\n return crypto.timingSafeEqual(buffer1, buffer2);\r\n } catch (error) {\r\n // Handle Buffer conversion failures\r\n logger.error(\r\n 'Hash comparison failed',\r\n error instanceof Error ? error : undefined,\r\n { hash1Length: hash1?.length, hash2Length: hash2?.length }\r\n );\r\n return false;\r\n }\r\n }\r\n\r\n private async fileExists(filePath: string): Promise<boolean> {\r\n try {\r\n await fsAccess(filePath, fs.constants.F_OK);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n private async safeUnlink(filePath: string): Promise<void> {\r\n try {\r\n await fsUnlink(filePath);\r\n } catch {\r\n // Ignore errors\r\n }\r\n }\r\n\r\n private insertBackup(backup: Backup, encryptionMetadata?: any): void {\r\n const stmt = this.db.prepare(`\r\n INSERT INTO backups (\r\n id, agent_id, file_path, backup_path, original_hash, backup_hash,\r\n file_size, backup_type, created_at, expires_at, metadata,\r\n is_encrypted, encrypted_at, encryption_algorithm, encryption_iv,\r\n encryption_auth_tag, encryption_hmac, encryption_key_version\r\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\r\n `);\r\n\r\n stmt.run(\r\n backup.id,\r\n backup.agentId,\r\n backup.filePath,\r\n backup.backupPath,\r\n backup.originalHash,\r\n backup.backupHash,\r\n backup.fileSize,\r\n backup.backupType,\r\n backup.createdAt.toISOString(),\r\n backup.expiresAt.toISOString(),\r\n backup.metadata ? JSON.stringify(backup.metadata) : null,\r\n // ENCRYPTION SUPPORT (CVSS 7.2 mitigation)\r\n encryptionMetadata ? 1 : 0,\r\n encryptionMetadata ? encryptionMetadata.encryptedAt : null,\r\n encryptionMetadata ? encryptionMetadata.algorithm : null,\r\n encryptionMetadata ? encryptionMetadata.iv : null,\r\n encryptionMetadata ? encryptionMetadata.authTag : null,\r\n encryptionMetadata ? encryptionMetadata.hmac : null,\r\n encryptionMetadata ? encryptionMetadata.keyVersion : null\r\n );\r\n }\r\n\r\n private getBackupMetadata(backupId: string): BackupMetadata | null {\r\n const stmt = this.db.prepare(`\r\n SELECT * FROM backups WHERE id = ? AND deleted_at IS NULL\r\n `);\r\n\r\n return (stmt.get(backupId) as BackupMetadata) || null;\r\n }\r\n\r\n private getLatestBackup(filePath: string): BackupMetadata | null {\r\n const stmt = this.db.prepare(`\r\n SELECT * FROM backups\r\n WHERE file_path = ? AND deleted_at IS NULL\r\n ORDER BY created_at DESC\r\n LIMIT 1\r\n `);\r\n\r\n return (stmt.get(filePath) as BackupMetadata) || null;\r\n }\r\n\r\n private getBackupByTimestamp(filePath: string, timestamp: Date): BackupMetadata | null {\r\n const stmt = this.db.prepare(`\r\n SELECT * FROM backups\r\n WHERE file_path = ? AND deleted_at IS NULL AND created_at <= ?\r\n ORDER BY created_at DESC\r\n LIMIT 1\r\n `);\r\n\r\n return (stmt.get(filePath, timestamp.toISOString()) as BackupMetadata) || null;\r\n }\r\n\r\n private getBackupByHash(filePath: string, hash: string): BackupMetadata | null {\r\n const stmt = this.db.prepare(`\r\n SELECT * FROM backups\r\n WHERE file_path = ? AND original_hash = ? AND deleted_at IS NULL\r\n ORDER BY created_at DESC\r\n LIMIT 1\r\n `);\r\n\r\n return (stmt.get(filePath, hash) as BackupMetadata) || null;\r\n }\r\n\r\n private checkRateLimit(agentId: string): boolean {\r\n const stmt = this.db.prepare(`\r\n SELECT COUNT(*) as count\r\n FROM restore_rate_limits\r\n WHERE agent_id = ? AND restored_at > datetime('now', '-1 hour')\r\n `);\r\n\r\n const result = stmt.get(agentId) as { count: number };\r\n\r\n return result.count < this.rateLimitConfig.maxRestoresPerHour;\r\n }\r\n\r\n private recordRestore(backupId: string, agentId: string, filePath: string): void {\r\n const stmt = this.db.prepare(`\r\n INSERT INTO restore_rate_limits (id, backup_id, agent_id, file_path, restored_at)\r\n VALUES (?, ?, ?, ?, datetime('now'))\r\n `);\r\n\r\n stmt.run(randomUUID(), backupId, agentId, filePath);\r\n }\r\n\r\n private logAuditEntry(entry: {\r\n backupId: string | null;\r\n operation: string;\r\n agentId: string;\r\n status: string;\r\n filePath: string;\r\n backupPath?: string;\r\n errorMessage?: string;\r\n errorCode?: string;\r\n durationMs?: number;\r\n metadata?: Record<string, any>;\r\n }): void {\r\n const stmt = this.db.prepare(`\r\n INSERT INTO backup_audit_log (\r\n id, backup_id, operation, agent_id, status, file_path, backup_path,\r\n timestamp, duration_ms, error_message, error_code, metadata\r\n ) VALUES (?, ?, ?, ?, ?, ?, ?, datetime('now'), ?, ?, ?, ?)\r\n `);\r\n\r\n stmt.run(\r\n randomUUID(),\r\n entry.backupId,\r\n entry.operation,\r\n entry.agentId,\r\n entry.status,\r\n entry.filePath,\r\n entry.backupPath || null,\r\n entry.durationMs || null,\r\n entry.errorMessage || null,\r\n entry.errorCode || null,\r\n entry.metadata ? JSON.stringify(entry.metadata) : null\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Singleton instance\r\n */\r\nlet defaultManager: BackupManager | null = null;\r\n\r\n/**\r\n * Get the default backup manager instance\r\n */\r\nexport function getBackupManager(config?: BackupManagerConfig): BackupManager {\r\n if (!defaultManager) {\r\n defaultManager = new BackupManager(config);\r\n }\r\n return defaultManager;\r\n}\r\n\r\n/**\r\n * Execute a function with automatic backup\r\n *\r\n * @param filePath - File to backup\r\n * @param fn - Function to execute\r\n * @param options - Backup options\r\n * @returns Promise that resolves with function result\r\n */\r\nexport async function withBackup<T>(\r\n filePath: string,\r\n fn: () => Promise<T>,\r\n options: BackupOptions\r\n): Promise<T> {\r\n const manager = getBackupManager();\r\n await manager.createBackup(filePath, options);\r\n\r\n return fn();\r\n}\r\n"],"names":["fs","path","crypto","promisify","randomUUID","Database","createLogger","createError","ErrorCode","StandardError","getFileLockManager","withFileSystemRetry","getEncryptionManager","logger","fsReadFile","readFile","fsWriteFile","writeFile","fsCopyFile","copyFile","fsStat","stat","fsMkdir","mkdir","fsAccess","access","fsReaddir","readdir","fsUnlink","unlink","BackupType","BackupManager","db","lockManager","encryptionManager","backupDir","defaultTtlMs","rateLimitConfig","projectRoot","config","process","cwd","join","rateLimit","maxRestoresPerHour","dbPath","initializeDatabase","ensureBackupDirectory","info","encryptionEnabled","isEnabled","createBackup","filePath","options","startTime","Date","now","absolutePath","resolve","agentId","backupType","lock","acquireLock","timeout","exists","fileExists","FILE_NOT_FOUND","fileContent","originalHash","calculateHash","fileSize","length","timestamp","backupPath","getBackupPath","ensureDirectory","dirname","backupContent","backupHash","constantTimeHashCompare","safeUnlink","VALIDATION_FAILED","ttlMs","expiresAt","backupId","backup","id","createdAt","metadata","encryptionMetadata","encrypted","encrypt","data","algorithm","originalSize","encryptedSize","encryptError","error","Error","undefined","insertBackup","duration","durationMs","logAuditEntry","operation","status","errorMessage","message","String","errorCode","code","UNKNOWN_ERROR","releaseLock","restoreLatest","getLatestBackup","restoreBackup","restoreByTimestamp","getBackupByTimestamp","toISOString","restoreByHash","hash","getBackupByHash","verify","dryRun","force","createBackupBeforeRestore","getBackupMetadata","rateLimitOk","checkRateLimit","LOCK_TIMEOUT","backupExists","verificationHash","success","verified","restoredAt","expectedHash","rollbackBackupId","rollbackBackup","reason","restoringBackupId","backupDataToRestore","isEncrypted","encryptedBackupContent","encryptedPayload","iv","encryptionIv","authTag","encryptionAuthTag","hmac","encryptionHmac","encryptedAt","keyVersion","encryptionKeyVersion","decryptionResult","decrypt","integrityVerified","warn","decryptError","restoredContent","rollbackPerformed","rollbackError","recordRestore","getDiskUsage","stmt","prepare","result","get","byTypeStmt","byType","all","byAgentStmt","byAgent","totalBackups","total_backups","activeBackups","active_backups","expiredBackups","expired_backups","totalSizeBytes","total_size_bytes","compressedSizeBytes","compressed_size_bytes","averageCompressionRatio","avg_compression_ratio","oldestBackupDate","oldest_backup","newestBackupDate","newest_backup","backupsByType","reduce","acc","row","backup_type","count","backupsByAgent","agent_id","listBackups","deleteExpiredBackups","deletedCount","unlinkSync","backup_path","run","close","dbDir","existsSync","mkdirSync","recursive","migrationPath","migration","readFileSync","exec","mode","directory","dirPath","content","createHash","update","digest","hash1","hash2","buffer1","Buffer","from","buffer2","timingSafeEqual","hash1Length","hash2Length","constants","F_OK","JSON","stringify","entry","defaultManager","getBackupManager","withBackup","fn","manager"],"mappings":"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"}
|