claude-flow-novice 2.15.2 → 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-BACKUP_USAGE.md +243 -243
- package/.claude/hooks/cfn-invoke-security-validation.sh +69 -69
- package/.claude/hooks/cfn-lint-sql-injection.sh +61 -0
- package/.claude/hooks/cfn-post-edit-cfn-retrospective.sh +109 -78
- package/.claude/hooks/cfn-post-edit.config.json +44 -44
- 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-hybrid-routing/check-dependencies.sh +51 -51
- 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-loop-validation/orchestrate-cfn-loop.sh +252 -252
- 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 +74 -74
- package/.claude/skills/cfn-redis-coordination/collect-confidence-scores.sh +30 -0
- package/.claude/skills/cfn-redis-coordination/get-context.sh +145 -112
- 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/middleware-config.sh +28 -28
- package/.claude/skills/cfn-transparency-middleware/performance-benchmark.sh +78 -78
- package/.claude/skills/cfn-transparency-middleware/test-e2e.sh +15 -0
- package/.claude/skills/cfn-transparency-middleware/test-integration.sh +161 -161
- package/.claude/skills/cfn-transparency-middleware/test-transparency-skill.sh +367 -367
- package/.claude/skills/cfn-transparency-middleware/tests/input-validation.sh +107 -92
- package/.claude/skills/cfn-transparency-middleware/wrap-agent.sh +131 -131
- 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-BACKUP_USAGE.md +243 -243
- package/claude-assets/hooks/cfn-invoke-security-validation.sh +69 -69
- package/claude-assets/hooks/cfn-lint-sql-injection.sh +61 -0
- package/claude-assets/hooks/cfn-post-edit-cfn-retrospective.sh +109 -78
- package/claude-assets/hooks/cfn-post-edit.config.json +44 -44
- package/claude-assets/hooks/cfn-post-execution/memory-cleanup.sh +19 -19
- package/claude-assets/hooks/cfn-pre-edit-security-warning.sh +40 -0
- package/claude-assets/hooks/cfn-pre-execution/memory-check.sh +19 -19
- 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 +543 -572
- package/claude-assets/skills/agent-lifecycle/simple-audit.sh +57 -30
- 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/persist-agent-output.sh +48 -48
- package/claude-assets/skills/cfn-automatic-memory-persistence/query-agent-history.sh +34 -34
- package/claude-assets/skills/cfn-automatic-memory-persistence/test-memory-persistence.sh +17 -16
- package/claude-assets/skills/cfn-deliverable-validation/confidence-calculator.sh +261 -261
- 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-expert-update/update-expert.sh +345 -345
- 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-hybrid-routing/check-dependencies.sh +51 -51
- package/claude-assets/skills/cfn-intervention-detector/detect-intervention.sh +110 -110
- package/claude-assets/skills/cfn-intervention-orchestrator/execute-intervention.sh +58 -58
- 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-loop-validation/orchestrate-cfn-loop.sh +252 -252
- package/claude-assets/skills/cfn-loop2-output-processing/process-validator-output.sh +275 -275
- package/claude-assets/skills/cfn-memory-management/check-memory.sh +159 -159
- package/claude-assets/skills/cfn-memory-management/cleanup-memory.sh +196 -196
- package/claude-assets/skills/cfn-node-heap-sizer/task-mode-heap-limiter.sh +325 -325
- 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-playbook-auto-update/auto-update-playbook.sh +85 -85
- 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 +74 -74
- package/claude-assets/skills/cfn-redis-coordination/collect-confidence-scores.sh +30 -0
- package/claude-assets/skills/cfn-redis-coordination/get-context.sh +145 -112
- 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-scope-simplifier/simplify-scope.sh +67 -67
- 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-specialist-injection/recommend-specialist.sh +56 -56
- package/claude-assets/skills/cfn-sqlite-memory/ttl-cleanup.sh +17 -25
- package/claude-assets/skills/cfn-standardized-error-handling/capture-agent-error.sh +86 -86
- package/claude-assets/skills/cfn-standardized-error-handling/test-error-handling.sh +165 -165
- 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-task-config-init/initialize-config.sh +264 -264
- package/claude-assets/skills/cfn-task-decomposition/task-decomposer.sh +278 -278
- 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/middleware-config.sh +28 -28
- package/claude-assets/skills/cfn-transparency-middleware/performance-benchmark.sh +78 -78
- package/claude-assets/skills/cfn-transparency-middleware/test-e2e.sh +15 -0
- package/claude-assets/skills/cfn-transparency-middleware/test-integration.sh +161 -161
- package/claude-assets/skills/cfn-transparency-middleware/test-transparency-skill.sh +367 -367
- package/claude-assets/skills/cfn-transparency-middleware/tests/input-validation.sh +107 -92
- package/claude-assets/skills/cfn-transparency-middleware/wrap-agent.sh +131 -131
- 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/docker-build/SKILL.md +96 -203
- package/claude-assets/skills/docker-build/build.sh +73 -73
- package/claude-assets/skills/integration/agent-handoff.sh +492 -0
- package/claude-assets/skills/integration/file-operations.sh +414 -0
- 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/APPROVAL_WORKFLOW.md +806 -0
- package/claude-assets/skills/workflow-codification/COST_TRACKING.md +637 -0
- package/claude-assets/skills/workflow-codification/DEPLOY_QUICK_REFERENCE.md +106 -0
- package/claude-assets/skills/workflow-codification/EDGE_CASE_TRACKING.md +404 -0
- package/claude-assets/skills/workflow-codification/PROPAGATE_UPDATE_QUICK_REFERENCE.md +366 -0
- package/claude-assets/skills/workflow-codification/README_PHASE4.md +457 -0
- package/claude-assets/skills/workflow-codification/SKILL.md +110 -0
- package/claude-assets/skills/workflow-codification/analyze-patterns.sh +899 -0
- package/claude-assets/skills/workflow-codification/approval-workflow.sh +514 -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/generate-skill-update.sh +525 -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/review-skill.sh +643 -0
- package/claude-assets/skills/workflow-codification/templates/email-notification.txt +114 -0
- package/claude-assets/skills/workflow-codification/templates/slack-notification.md +85 -0
- package/claude-assets/skills/workflow-codification/test-integration.sh +296 -0
- package/claude-assets/skills/workflow-codification/test-metadata-update.sh +350 -0
- package/claude-assets/skills/workflow-codification/track-cost-savings.sh +486 -0
- package/claude-assets/skills/workflow-codification/track-cost-savings.sh.backup-1763392821 +445 -0
- package/claude-assets/skills/workflow-codification/track-edge-case.sh +290 -0
- 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/config-manager.js +91 -109
- package/dist/cli/config-manager.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 +507 -0
- package/dist/integration/DatabaseHandoff.js.map +1 -0
- package/dist/integration/StandardAdapter.js +291 -0
- package/dist/integration/StandardAdapter.js.map +1 -0
- 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 +518 -0
- package/dist/lib/agent-output-parser.js.map +1 -0
- package/dist/lib/agent-output-validator.js +950 -0
- package/dist/lib/agent-output-validator.js.map +1 -0
- package/dist/lib/agent-workspace.js +281 -0
- package/dist/lib/agent-workspace.js.map +1 -0
- package/dist/lib/artifact-registry.js +443 -0
- package/dist/lib/artifact-registry.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 +687 -0
- package/dist/lib/config-validator.js.map +1 -0
- 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/agent-output.js +44 -0
- package/dist/types/agent-output.js.map +1 -0
- package/dist/types/config.js +28 -0
- package/dist/types/config.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 -176
- package/readme/README.md +19 -4
- package/scripts/artifact-cleanup.sh +392 -0
- 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/deploy-production.sh +355 -355
- package/scripts/docker-playwright-fix.sh +311 -311
- package/scripts/docker-rebuild-all-agents.sh +127 -127
- 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/memory-leak-prevention.sh +305 -305
- package/scripts/migrate-artifacts.sh +563 -0
- package/scripts/migrate-schema.sh +533 -0
- package/scripts/migrate-yaml-to-json.sh +465 -0
- package/scripts/promote-staged-skills.sh +423 -0
- package/scripts/run-marketing-tests.sh +42 -42
- package/scripts/update_paths.sh +46 -46
- 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/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,360 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Redis Database Adapter
|
|
3
|
+
*
|
|
4
|
+
* Implements IDatabaseAdapter for Redis key-value store.
|
|
5
|
+
* Part of Task 0.4: Database Query Abstraction Layer (MVP)
|
|
6
|
+
*
|
|
7
|
+
* UPDATED: Now uses ConnectionPoolManager for proper connection pool initialization,
|
|
8
|
+
* health checks, automatic reconnection with exponential backoff, and connection metrics.
|
|
9
|
+
*
|
|
10
|
+
* SECURITY: Supports Redis authentication via requirepass with secure password handling
|
|
11
|
+
*/ import { randomUUID } from 'crypto';
|
|
12
|
+
import { DatabaseErrorCode, createDatabaseError, createSuccessResult, createFailedResult, mapRedisError } from './errors.js';
|
|
13
|
+
import { ConnectionPoolManager } from './connection-pool-manager.js';
|
|
14
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
15
|
+
export class RedisAdapter {
|
|
16
|
+
poolManager = null;
|
|
17
|
+
client = null;
|
|
18
|
+
config;
|
|
19
|
+
connected = false;
|
|
20
|
+
errorAggregator;
|
|
21
|
+
correlationId;
|
|
22
|
+
constructor(config, errorAggregator){
|
|
23
|
+
this.config = config;
|
|
24
|
+
this.errorAggregator = errorAggregator;
|
|
25
|
+
this.correlationId = uuidv4();
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Track error with error aggregator
|
|
29
|
+
* @private
|
|
30
|
+
*/ trackError(error, operation, context) {
|
|
31
|
+
if (this.errorAggregator) {
|
|
32
|
+
const dbError = error.code ? error : createDatabaseError(DatabaseErrorCode.QUERY_FAILED, `Redis ${operation} failed`, error instanceof Error ? error : new Error(String(error)), context);
|
|
33
|
+
this.errorAggregator.addError('redis', dbError, {
|
|
34
|
+
...context,
|
|
35
|
+
operation,
|
|
36
|
+
correlationId: this.correlationId
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Record successful operation with error aggregator
|
|
42
|
+
* @private
|
|
43
|
+
*/ recordSuccess() {
|
|
44
|
+
if (this.errorAggregator) {
|
|
45
|
+
this.errorAggregator.recordSuccess('redis');
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
getType() {
|
|
49
|
+
return 'redis';
|
|
50
|
+
}
|
|
51
|
+
async connect() {
|
|
52
|
+
try {
|
|
53
|
+
// Initialize connection pool manager
|
|
54
|
+
this.poolManager = new ConnectionPoolManager(this.config);
|
|
55
|
+
await this.poolManager.initialize();
|
|
56
|
+
// Get the Redis client from pool manager
|
|
57
|
+
this.client = await this.poolManager.acquire();
|
|
58
|
+
// Start health checks (ping every 30s)
|
|
59
|
+
this.poolManager.startHealthChecks();
|
|
60
|
+
this.connected = true;
|
|
61
|
+
this.recordSuccess();
|
|
62
|
+
} catch (err) {
|
|
63
|
+
const error = createDatabaseError(DatabaseErrorCode.CONNECTION_FAILED, 'Failed to connect to Redis', err instanceof Error ? err : new Error(String(err)), {
|
|
64
|
+
config: this.config,
|
|
65
|
+
correlationId: this.correlationId
|
|
66
|
+
});
|
|
67
|
+
this.trackError(error, 'connect');
|
|
68
|
+
throw error;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
async disconnect() {
|
|
72
|
+
if (this.poolManager) {
|
|
73
|
+
await this.poolManager.shutdown();
|
|
74
|
+
this.poolManager = null;
|
|
75
|
+
this.client = null;
|
|
76
|
+
this.connected = false;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
isConnected() {
|
|
80
|
+
return this.connected && this.poolManager !== null && this.client !== null;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Get connection pool statistics
|
|
84
|
+
*/ getPoolStats() {
|
|
85
|
+
return this.poolManager?.getStats();
|
|
86
|
+
}
|
|
87
|
+
async get(key) {
|
|
88
|
+
this.ensureConnected();
|
|
89
|
+
try {
|
|
90
|
+
const value = await this.client.get(key);
|
|
91
|
+
if (value === null) {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
// Try to parse as JSON, fall back to raw string
|
|
95
|
+
try {
|
|
96
|
+
this.recordSuccess();
|
|
97
|
+
return JSON.parse(value);
|
|
98
|
+
} catch {
|
|
99
|
+
this.recordSuccess();
|
|
100
|
+
return value;
|
|
101
|
+
}
|
|
102
|
+
} catch (err) {
|
|
103
|
+
const errorCode = mapRedisError(err instanceof Error ? err : new Error(String(err)));
|
|
104
|
+
const error = createDatabaseError(errorCode, `Failed to get key: ${key}`, err instanceof Error ? err : new Error(String(err)), {
|
|
105
|
+
key,
|
|
106
|
+
correlationId: this.correlationId
|
|
107
|
+
});
|
|
108
|
+
this.trackError(error, 'get', {
|
|
109
|
+
key
|
|
110
|
+
});
|
|
111
|
+
throw error;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
async list(pattern, options) {
|
|
115
|
+
this.ensureConnected();
|
|
116
|
+
try {
|
|
117
|
+
const keys = await this.client.keys(pattern);
|
|
118
|
+
if (keys.length === 0) {
|
|
119
|
+
return [];
|
|
120
|
+
}
|
|
121
|
+
const values = await this.client.mGet(keys);
|
|
122
|
+
const results = values.map((value, index)=>{
|
|
123
|
+
if (value === null) {
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
try {
|
|
127
|
+
return JSON.parse(value);
|
|
128
|
+
} catch {
|
|
129
|
+
return value;
|
|
130
|
+
}
|
|
131
|
+
}).filter((v)=>v !== null);
|
|
132
|
+
// Apply limit and offset
|
|
133
|
+
const start = options?.offset || 0;
|
|
134
|
+
const end = options?.limit ? start + options.limit : undefined;
|
|
135
|
+
this.recordSuccess();
|
|
136
|
+
return results.slice(start, end);
|
|
137
|
+
} catch (err) {
|
|
138
|
+
const errorCode = mapRedisError(err instanceof Error ? err : new Error(String(err)));
|
|
139
|
+
const error = createDatabaseError(errorCode, `Failed to list keys: ${pattern}`, err instanceof Error ? err : new Error(String(err)), {
|
|
140
|
+
pattern,
|
|
141
|
+
options,
|
|
142
|
+
correlationId: this.correlationId
|
|
143
|
+
});
|
|
144
|
+
this.trackError(error, 'list', {
|
|
145
|
+
pattern
|
|
146
|
+
});
|
|
147
|
+
throw error;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
async query(pattern, filters) {
|
|
151
|
+
// For Redis, query is similar to list but with additional filtering
|
|
152
|
+
const results = await this.list(pattern);
|
|
153
|
+
// Apply filters
|
|
154
|
+
return results.filter((item)=>{
|
|
155
|
+
return filters.every((filter)=>{
|
|
156
|
+
const value = item[filter.field];
|
|
157
|
+
switch(filter.operator){
|
|
158
|
+
case 'eq':
|
|
159
|
+
return value === filter.value;
|
|
160
|
+
case 'ne':
|
|
161
|
+
return value !== filter.value;
|
|
162
|
+
case 'gt':
|
|
163
|
+
return value > filter.value;
|
|
164
|
+
case 'gte':
|
|
165
|
+
return value >= filter.value;
|
|
166
|
+
case 'lt':
|
|
167
|
+
return value < filter.value;
|
|
168
|
+
case 'lte':
|
|
169
|
+
return value <= filter.value;
|
|
170
|
+
case 'in':
|
|
171
|
+
return Array.isArray(filter.value) && filter.value.includes(value);
|
|
172
|
+
case 'like':
|
|
173
|
+
return String(value).includes(String(filter.value));
|
|
174
|
+
default:
|
|
175
|
+
return true;
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
async insert(key, data) {
|
|
181
|
+
this.ensureConnected();
|
|
182
|
+
try {
|
|
183
|
+
const value = typeof data === 'string' ? data : JSON.stringify(data);
|
|
184
|
+
await this.client.set(key, value);
|
|
185
|
+
this.recordSuccess();
|
|
186
|
+
return createSuccessResult(data, 1);
|
|
187
|
+
} catch (err) {
|
|
188
|
+
const errorCode = mapRedisError(err instanceof Error ? err : new Error(String(err)));
|
|
189
|
+
const error = createDatabaseError(errorCode, `Failed to insert key: ${key}`, err instanceof Error ? err : new Error(String(err)), {
|
|
190
|
+
key,
|
|
191
|
+
data,
|
|
192
|
+
correlationId: this.correlationId
|
|
193
|
+
});
|
|
194
|
+
this.trackError(error, 'insert', {
|
|
195
|
+
key
|
|
196
|
+
});
|
|
197
|
+
return createFailedResult(error);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
async insertMany(pattern, data) {
|
|
201
|
+
this.ensureConnected();
|
|
202
|
+
try {
|
|
203
|
+
const pipeline = this.client.multi();
|
|
204
|
+
data.forEach((item, index)=>{
|
|
205
|
+
const key = `${pattern}:${index}`;
|
|
206
|
+
const value = typeof item === 'string' ? item : JSON.stringify(item);
|
|
207
|
+
pipeline.set(key, value);
|
|
208
|
+
});
|
|
209
|
+
await pipeline.exec();
|
|
210
|
+
this.recordSuccess();
|
|
211
|
+
return createSuccessResult(data, data.length);
|
|
212
|
+
} catch (err) {
|
|
213
|
+
const errorCode = mapRedisError(err instanceof Error ? err : new Error(String(err)));
|
|
214
|
+
const error = createDatabaseError(errorCode, `Failed to insert multiple keys with pattern: ${pattern}`, err instanceof Error ? err : new Error(String(err)), {
|
|
215
|
+
pattern,
|
|
216
|
+
count: data.length,
|
|
217
|
+
correlationId: this.correlationId
|
|
218
|
+
});
|
|
219
|
+
this.trackError(error, 'insertMany', {
|
|
220
|
+
pattern,
|
|
221
|
+
count: data.length
|
|
222
|
+
});
|
|
223
|
+
return createFailedResult(error);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
async update(key, data) {
|
|
227
|
+
this.ensureConnected();
|
|
228
|
+
try {
|
|
229
|
+
// Get existing data
|
|
230
|
+
const existing = await this.get(key);
|
|
231
|
+
if (existing === null) {
|
|
232
|
+
const error = createDatabaseError(DatabaseErrorCode.NOT_FOUND, `Key not found: ${key}`, undefined, {
|
|
233
|
+
key,
|
|
234
|
+
correlationId: this.correlationId
|
|
235
|
+
});
|
|
236
|
+
this.trackError(error, 'update', {
|
|
237
|
+
key
|
|
238
|
+
});
|
|
239
|
+
return createFailedResult(error);
|
|
240
|
+
}
|
|
241
|
+
// Merge with updates
|
|
242
|
+
const updated = {
|
|
243
|
+
...existing,
|
|
244
|
+
...data
|
|
245
|
+
};
|
|
246
|
+
const value = JSON.stringify(updated);
|
|
247
|
+
await this.client.set(key, value);
|
|
248
|
+
this.recordSuccess();
|
|
249
|
+
return createSuccessResult(updated, 1);
|
|
250
|
+
} catch (err) {
|
|
251
|
+
const errorCode = mapRedisError(err instanceof Error ? err : new Error(String(err)));
|
|
252
|
+
const error = createDatabaseError(errorCode, `Failed to update key: ${key}`, err instanceof Error ? err : new Error(String(err)), {
|
|
253
|
+
key,
|
|
254
|
+
data,
|
|
255
|
+
correlationId: this.correlationId
|
|
256
|
+
});
|
|
257
|
+
this.trackError(error, 'update', {
|
|
258
|
+
key
|
|
259
|
+
});
|
|
260
|
+
return createFailedResult(error);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
async delete(_table, key) {
|
|
264
|
+
this.ensureConnected();
|
|
265
|
+
try {
|
|
266
|
+
const count = await this.client.del(key);
|
|
267
|
+
if (count === 0) {
|
|
268
|
+
const error = createDatabaseError(DatabaseErrorCode.NOT_FOUND, `Key not found: ${key}`, undefined, {
|
|
269
|
+
key,
|
|
270
|
+
correlationId: this.correlationId
|
|
271
|
+
});
|
|
272
|
+
this.trackError(error, 'delete', {
|
|
273
|
+
key
|
|
274
|
+
});
|
|
275
|
+
return createFailedResult(error);
|
|
276
|
+
}
|
|
277
|
+
this.recordSuccess();
|
|
278
|
+
return createSuccessResult(undefined, count);
|
|
279
|
+
} catch (err) {
|
|
280
|
+
const errorCode = mapRedisError(err instanceof Error ? err : new Error(String(err)));
|
|
281
|
+
const error = createDatabaseError(errorCode, `Failed to delete key: ${key}`, err instanceof Error ? err : new Error(String(err)), {
|
|
282
|
+
key,
|
|
283
|
+
correlationId: this.correlationId
|
|
284
|
+
});
|
|
285
|
+
this.trackError(error, 'delete', {
|
|
286
|
+
key
|
|
287
|
+
});
|
|
288
|
+
return createFailedResult(error);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
async raw(command, params) {
|
|
292
|
+
this.ensureConnected();
|
|
293
|
+
try {
|
|
294
|
+
const result = await this.client.sendCommand([
|
|
295
|
+
command,
|
|
296
|
+
...params || []
|
|
297
|
+
]);
|
|
298
|
+
this.recordSuccess();
|
|
299
|
+
return result;
|
|
300
|
+
} catch (err) {
|
|
301
|
+
const errorCode = mapRedisError(err instanceof Error ? err : new Error(String(err)));
|
|
302
|
+
const error = createDatabaseError(errorCode, `Failed to execute raw command: ${command}`, err instanceof Error ? err : new Error(String(err)), {
|
|
303
|
+
command,
|
|
304
|
+
params,
|
|
305
|
+
correlationId: this.correlationId
|
|
306
|
+
});
|
|
307
|
+
this.trackError(error, 'raw', {
|
|
308
|
+
command
|
|
309
|
+
});
|
|
310
|
+
throw error;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
async beginTransaction() {
|
|
314
|
+
return {
|
|
315
|
+
id: `redis-tx-${randomUUID()}`,
|
|
316
|
+
databases: [
|
|
317
|
+
'redis'
|
|
318
|
+
],
|
|
319
|
+
startTime: new Date(),
|
|
320
|
+
status: 'pending'
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
async prepareTransaction(context) {
|
|
324
|
+
try {
|
|
325
|
+
// Redis doesn't support traditional two-phase commit
|
|
326
|
+
// PREPARE validation: Check if Redis is available and can accept commands
|
|
327
|
+
this.ensureConnected();
|
|
328
|
+
// Test connection and command execution
|
|
329
|
+
await this.client.ping();
|
|
330
|
+
// Mark as prepared
|
|
331
|
+
context.status = 'prepared';
|
|
332
|
+
context.preparedAt = new Date();
|
|
333
|
+
return true;
|
|
334
|
+
} catch (err) {
|
|
335
|
+
// Prepare failed - typically due to connection issues
|
|
336
|
+
throw createDatabaseError(DatabaseErrorCode.TRANSACTION_FAILED, 'Failed to prepare transaction - Redis unavailable', err instanceof Error ? err : new Error(String(err)), {
|
|
337
|
+
transactionId: context.id
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
async commitTransaction(context) {
|
|
342
|
+
// Redis transactions are handled via MULTI/EXEC
|
|
343
|
+
// This is a placeholder for cross-database transaction support
|
|
344
|
+
context.status = 'committed';
|
|
345
|
+
}
|
|
346
|
+
async rollbackTransaction(context) {
|
|
347
|
+
// Redis doesn't support traditional rollback
|
|
348
|
+
// This is a placeholder for cross-database transaction support
|
|
349
|
+
context.status = 'rolled_back';
|
|
350
|
+
}
|
|
351
|
+
ensureConnected() {
|
|
352
|
+
if (!this.isConnected()) {
|
|
353
|
+
throw createDatabaseError(DatabaseErrorCode.CONNECTION_FAILED, 'Not connected to Redis', undefined, {
|
|
354
|
+
config: this.config
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
//# sourceMappingURL=redis-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/database-service/redis-adapter.ts"],"sourcesContent":["/**\r\n * Redis Database Adapter\r\n *\r\n * Implements IDatabaseAdapter for Redis key-value store.\r\n * Part of Task 0.4: Database Query Abstraction Layer (MVP)\r\n *\r\n * UPDATED: Now uses ConnectionPoolManager for proper connection pool initialization,\r\n * health checks, automatic reconnection with exponential backoff, and connection metrics.\r\n *\r\n * SECURITY: Supports Redis authentication via requirepass with secure password handling\r\n */\r\n\r\nimport { createClient, RedisClientType } from 'redis';\r\nimport { randomUUID } from 'crypto';\r\nimport {\r\n IDatabaseAdapter,\r\n DatabaseConfig,\r\n QueryOptions,\r\n QueryFilter,\r\n OperationResult,\r\n TransactionContext,\r\n} from './types.js';\r\nimport {\r\n DatabaseErrorCode,\r\n createDatabaseError,\r\n createSuccessResult,\r\n createFailedResult,\r\n mapRedisError,\r\n} from './errors.js';\r\nimport { ConnectionPoolManager } from './connection-pool-manager.js';\r\nimport { ErrorAggregator } from '../error-aggregator.js';\r\nimport { v4 as uuidv4 } from 'uuid';\r\n\r\nexport class RedisAdapter implements IDatabaseAdapter {\r\n private poolManager: ConnectionPoolManager | null = null;\r\n private client: RedisClientType | null = null;\r\n private config: DatabaseConfig;\r\n private connected: boolean = false;\r\n private errorAggregator?: ErrorAggregator;\r\n private correlationId: string;\r\n\r\n constructor(config: DatabaseConfig, errorAggregator?: ErrorAggregator) {\r\n this.config = config;\r\n this.errorAggregator = errorAggregator;\r\n this.correlationId = uuidv4();\r\n }\r\n\r\n /**\r\n * Track error with error aggregator\r\n * @private\r\n */\r\n private trackError(error: any, operation: string, context?: Record<string, any>): void {\r\n if (this.errorAggregator) {\r\n const dbError = error.code ? error : createDatabaseError(\r\n DatabaseErrorCode.QUERY_FAILED,\r\n `Redis ${operation} failed`,\r\n error instanceof Error ? error : new Error(String(error)),\r\n context\r\n );\r\n\r\n this.errorAggregator.addError('redis', dbError, {\r\n ...context,\r\n operation,\r\n correlationId: this.correlationId,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Record successful operation with error aggregator\r\n * @private\r\n */\r\n private recordSuccess(): void {\r\n if (this.errorAggregator) {\r\n this.errorAggregator.recordSuccess('redis');\r\n }\r\n }\r\n\r\n getType(): 'redis' {\r\n return 'redis';\r\n }\r\n\r\n async connect(): Promise<void> {\r\n try {\r\n // Initialize connection pool manager\r\n this.poolManager = new ConnectionPoolManager(this.config);\r\n await this.poolManager.initialize();\r\n\r\n // Get the Redis client from pool manager\r\n this.client = await this.poolManager.acquire();\r\n\r\n // Start health checks (ping every 30s)\r\n this.poolManager.startHealthChecks();\r\n\r\n this.connected = true;\r\n this.recordSuccess();\r\n } catch (err) {\r\n const error = createDatabaseError(\r\n DatabaseErrorCode.CONNECTION_FAILED,\r\n 'Failed to connect to Redis',\r\n err instanceof Error ? err : new Error(String(err)),\r\n { config: this.config, correlationId: this.correlationId }\r\n );\r\n this.trackError(error, 'connect');\r\n throw error;\r\n }\r\n }\r\n\r\n async disconnect(): Promise<void> {\r\n if (this.poolManager) {\r\n await this.poolManager.shutdown();\r\n this.poolManager = null;\r\n this.client = null;\r\n this.connected = false;\r\n }\r\n }\r\n\r\n isConnected(): boolean {\r\n return this.connected && this.poolManager !== null && this.client !== null;\r\n }\r\n\r\n /**\r\n * Get connection pool statistics\r\n */\r\n getPoolStats() {\r\n return this.poolManager?.getStats();\r\n }\r\n\r\n async get<T = any>(key: string): Promise<T | null> {\r\n this.ensureConnected();\r\n\r\n try {\r\n const value = await this.client!.get(key);\r\n\r\n if (value === null) {\r\n return null;\r\n }\r\n\r\n // Try to parse as JSON, fall back to raw string\r\n try {\r\n this.recordSuccess();\r\n return JSON.parse(value) as T;\r\n } catch {\r\n this.recordSuccess();\r\n return value as unknown as T;\r\n }\r\n } catch (err) {\r\n const errorCode = mapRedisError(err instanceof Error ? err : new Error(String(err)));\r\n const error = createDatabaseError(\r\n errorCode,\r\n `Failed to get key: ${key}`,\r\n err instanceof Error ? err : new Error(String(err)),\r\n { key, correlationId: this.correlationId }\r\n );\r\n this.trackError(error, 'get', { key });\r\n throw error;\r\n }\r\n }\r\n\r\n async list<T = any>(pattern: string, options?: QueryOptions<T>): Promise<T[]> {\r\n this.ensureConnected();\r\n\r\n try {\r\n const keys = await this.client!.keys(pattern);\r\n\r\n if (keys.length === 0) {\r\n return [];\r\n }\r\n\r\n const values = await this.client!.mGet(keys);\r\n\r\n const results = values\r\n .map((value, index) => {\r\n if (value === null) {\r\n return null;\r\n }\r\n\r\n try {\r\n return JSON.parse(value) as T;\r\n } catch {\r\n return value as unknown as T;\r\n }\r\n })\r\n .filter((v): v is T => v !== null);\r\n\r\n // Apply limit and offset\r\n const start = options?.offset || 0;\r\n const end = options?.limit ? start + options.limit : undefined;\r\n\r\n this.recordSuccess();\r\n return results.slice(start, end);\r\n } catch (err) {\r\n const errorCode = mapRedisError(err instanceof Error ? err : new Error(String(err)));\r\n const error = createDatabaseError(\r\n errorCode,\r\n `Failed to list keys: ${pattern}`,\r\n err instanceof Error ? err : new Error(String(err)),\r\n { pattern, options, correlationId: this.correlationId }\r\n );\r\n this.trackError(error, 'list', { pattern });\r\n throw error;\r\n }\r\n }\r\n\r\n async query<T = any>(pattern: string, filters: QueryFilter<T>[]): Promise<T[]> {\r\n // For Redis, query is similar to list but with additional filtering\r\n const results = await this.list<T>(pattern);\r\n\r\n // Apply filters\r\n return results.filter(item => {\r\n return filters.every(filter => {\r\n const value = (item as any)[filter.field];\r\n\r\n switch (filter.operator) {\r\n case 'eq':\r\n return value === filter.value;\r\n case 'ne':\r\n return value !== filter.value;\r\n case 'gt':\r\n return value > filter.value;\r\n case 'gte':\r\n return value >= filter.value;\r\n case 'lt':\r\n return value < filter.value;\r\n case 'lte':\r\n return value <= filter.value;\r\n case 'in':\r\n return Array.isArray(filter.value) && filter.value.includes(value);\r\n case 'like':\r\n return String(value).includes(String(filter.value));\r\n default:\r\n return true;\r\n }\r\n });\r\n });\r\n }\r\n\r\n async insert<T = any>(key: string, data: T): Promise<OperationResult<T>> {\r\n this.ensureConnected();\r\n\r\n try {\r\n const value = typeof data === 'string' ? data : JSON.stringify(data);\r\n await this.client!.set(key, value);\r\n\r\n this.recordSuccess();\r\n return createSuccessResult(data, 1);\r\n } catch (err) {\r\n const errorCode = mapRedisError(err instanceof Error ? err : new Error(String(err)));\r\n const error = createDatabaseError(\r\n errorCode,\r\n `Failed to insert key: ${key}`,\r\n err instanceof Error ? err : new Error(String(err)),\r\n { key, data, correlationId: this.correlationId }\r\n );\r\n this.trackError(error, 'insert', { key });\r\n return createFailedResult(error);\r\n }\r\n }\r\n\r\n async insertMany<T = any>(pattern: string, data: T[]): Promise<OperationResult<T[]>> {\r\n this.ensureConnected();\r\n\r\n try {\r\n const pipeline = this.client!.multi();\r\n\r\n data.forEach((item, index) => {\r\n const key = `${pattern}:${index}`;\r\n const value = typeof item === 'string' ? item : JSON.stringify(item);\r\n pipeline.set(key, value);\r\n });\r\n\r\n await pipeline.exec();\r\n\r\n this.recordSuccess();\r\n return createSuccessResult(data, data.length);\r\n } catch (err) {\r\n const errorCode = mapRedisError(err instanceof Error ? err : new Error(String(err)));\r\n const error = createDatabaseError(\r\n errorCode,\r\n `Failed to insert multiple keys with pattern: ${pattern}`,\r\n err instanceof Error ? err : new Error(String(err)),\r\n { pattern, count: data.length, correlationId: this.correlationId }\r\n );\r\n this.trackError(error, 'insertMany', { pattern, count: data.length });\r\n return createFailedResult(error);\r\n }\r\n }\r\n\r\n async update<T = any>(key: string, data: Partial<T>): Promise<OperationResult<T>> {\r\n this.ensureConnected();\r\n\r\n try {\r\n // Get existing data\r\n const existing = await this.get<T>(key);\r\n\r\n if (existing === null) {\r\n const error = createDatabaseError(\r\n DatabaseErrorCode.NOT_FOUND,\r\n `Key not found: ${key}`,\r\n undefined,\r\n { key, correlationId: this.correlationId }\r\n );\r\n this.trackError(error, 'update', { key });\r\n return createFailedResult(error);\r\n }\r\n\r\n // Merge with updates\r\n const updated = { ...existing, ...data } as T;\r\n const value = JSON.stringify(updated);\r\n\r\n await this.client!.set(key, value);\r\n\r\n this.recordSuccess();\r\n return createSuccessResult(updated, 1);\r\n } catch (err) {\r\n const errorCode = mapRedisError(err instanceof Error ? err : new Error(String(err)));\r\n const error = createDatabaseError(\r\n errorCode,\r\n `Failed to update key: ${key}`,\r\n err instanceof Error ? err : new Error(String(err)),\r\n { key, data, correlationId: this.correlationId }\r\n );\r\n this.trackError(error, 'update', { key });\r\n return createFailedResult(error);\r\n }\r\n }\r\n\r\n async delete(_table: string, key: string): Promise<OperationResult<void>> {\r\n this.ensureConnected();\r\n\r\n try {\r\n const count = await this.client!.del(key);\r\n\r\n if (count === 0) {\r\n const error = createDatabaseError(\r\n DatabaseErrorCode.NOT_FOUND,\r\n `Key not found: ${key}`,\r\n undefined,\r\n { key, correlationId: this.correlationId }\r\n );\r\n this.trackError(error, 'delete', { key });\r\n return createFailedResult(error);\r\n }\r\n\r\n this.recordSuccess();\r\n return createSuccessResult(undefined, count);\r\n } catch (err) {\r\n const errorCode = mapRedisError(err instanceof Error ? err : new Error(String(err)));\r\n const error = createDatabaseError(\r\n errorCode,\r\n `Failed to delete key: ${key}`,\r\n err instanceof Error ? err : new Error(String(err)),\r\n { key, correlationId: this.correlationId }\r\n );\r\n this.trackError(error, 'delete', { key });\r\n return createFailedResult(error);\r\n }\r\n }\r\n\r\n async raw<T = any>(command: string, params?: any[]): Promise<T> {\r\n this.ensureConnected();\r\n\r\n try {\r\n const result = await this.client!.sendCommand([command, ...(params || [])]);\r\n this.recordSuccess();\r\n return result as T;\r\n } catch (err) {\r\n const errorCode = mapRedisError(err instanceof Error ? err : new Error(String(err)));\r\n const error = createDatabaseError(\r\n errorCode,\r\n `Failed to execute raw command: ${command}`,\r\n err instanceof Error ? err : new Error(String(err)),\r\n { command, params, correlationId: this.correlationId }\r\n );\r\n this.trackError(error, 'raw', { command });\r\n throw error;\r\n }\r\n }\r\n\r\n async beginTransaction(): Promise<TransactionContext> {\r\n return {\r\n id: `redis-tx-${randomUUID()}`,\r\n databases: ['redis'],\r\n startTime: new Date(),\r\n status: 'pending',\r\n };\r\n }\r\n\r\n async prepareTransaction(context: TransactionContext): Promise<boolean> {\r\n try {\r\n // Redis doesn't support traditional two-phase commit\r\n // PREPARE validation: Check if Redis is available and can accept commands\r\n this.ensureConnected();\r\n\r\n // Test connection and command execution\r\n await this.client!.ping();\r\n\r\n // Mark as prepared\r\n context.status = 'prepared';\r\n context.preparedAt = new Date();\r\n\r\n return true;\r\n } catch (err) {\r\n // Prepare failed - typically due to connection issues\r\n throw createDatabaseError(\r\n DatabaseErrorCode.TRANSACTION_FAILED,\r\n 'Failed to prepare transaction - Redis unavailable',\r\n err instanceof Error ? err : new Error(String(err)),\r\n { transactionId: context.id }\r\n );\r\n }\r\n }\r\n\r\n async commitTransaction(context: TransactionContext): Promise<void> {\r\n // Redis transactions are handled via MULTI/EXEC\r\n // This is a placeholder for cross-database transaction support\r\n context.status = 'committed';\r\n }\r\n\r\n async rollbackTransaction(context: TransactionContext): Promise<void> {\r\n // Redis doesn't support traditional rollback\r\n // This is a placeholder for cross-database transaction support\r\n context.status = 'rolled_back';\r\n }\r\n\r\n private ensureConnected(): void {\r\n if (!this.isConnected()) {\r\n throw createDatabaseError(\r\n DatabaseErrorCode.CONNECTION_FAILED,\r\n 'Not connected to Redis',\r\n undefined,\r\n { config: this.config }\r\n );\r\n }\r\n }\r\n}\r\n"],"names":["randomUUID","DatabaseErrorCode","createDatabaseError","createSuccessResult","createFailedResult","mapRedisError","ConnectionPoolManager","v4","uuidv4","RedisAdapter","poolManager","client","config","connected","errorAggregator","correlationId","trackError","error","operation","context","dbError","code","QUERY_FAILED","Error","String","addError","recordSuccess","getType","connect","initialize","acquire","startHealthChecks","err","CONNECTION_FAILED","disconnect","shutdown","isConnected","getPoolStats","getStats","get","key","ensureConnected","value","JSON","parse","errorCode","list","pattern","options","keys","length","values","mGet","results","map","index","filter","v","start","offset","end","limit","undefined","slice","query","filters","item","every","field","operator","Array","isArray","includes","insert","data","stringify","set","insertMany","pipeline","multi","forEach","exec","count","update","existing","NOT_FOUND","updated","delete","_table","del","raw","command","params","result","sendCommand","beginTransaction","id","databases","startTime","Date","status","prepareTransaction","ping","preparedAt","TRANSACTION_FAILED","transactionId","commitTransaction","rollbackTransaction"],"mappings":"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"}
|