claude-flow-novice 2.15.3 → 2.15.5
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 +29 -6
- 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 +238 -29
- 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 +6 -2
- package/.claude/skills/cfn-redis-coordination/redis-cli-wrapper.sh +24 -3
- package/.claude/skills/cfn-redis-coordination/redis-functions.sh +34 -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 +29 -6
- 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 +238 -29
- 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 +6 -2
- package/claude-assets/skills/cfn-redis-coordination/redis-cli-wrapper.sh +24 -3
- package/claude-assets/skills/cfn-redis-coordination/redis-functions.sh +34 -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/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 +109 -91
- package/dist/cli/config-manager.js.map +1 -1
- package/dist/cli/conversation-fork-cleanup.js +201 -0
- package/dist/cli/conversation-fork-cleanup.js.map +1 -0
- package/dist/cli/conversation-fork.js +16 -3
- package/dist/cli/conversation-fork.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/docs/BUG_19_MEMORY_LEAK_TASK_MODE.md +405 -0
- package/docs/MEMORY_CLEANUP_GUIDE.md +358 -0
- package/docs/MEMORY_LEAK_FIX_SUMMARY.md +322 -0
- package/docs/REDIS_CLEANUP_EXECUTIVE_SUMMARY.md +319 -0
- package/docs/REDIS_CLEANUP_VERIFICATION_REPORT.md +574 -0
- package/package.json +35 -4
- package/readme/README.md +53 -5
- 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/scripts/verify-redis-cleanup.sh +173 -0
- package/tests/README.md +84 -0
- package/tests/test-memory-leak-task-mode.sh +435 -0
- 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,453 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enhanced Retry Manager with Circuit Breaker Integration
|
|
3
|
+
*
|
|
4
|
+
* Provides advanced retry logic with:
|
|
5
|
+
* - Exponential backoff with jitter
|
|
6
|
+
* - Circuit breaker integration
|
|
7
|
+
* - Correlation ID tracking
|
|
8
|
+
* - Configurable retry policies
|
|
9
|
+
* - Detailed retry attempt logging
|
|
10
|
+
* - Retryable error classification
|
|
11
|
+
*
|
|
12
|
+
* Part of HIGH-PRIORITY retry logic implementation
|
|
13
|
+
*
|
|
14
|
+
* Usage:
|
|
15
|
+
* const manager = new RetryManager({ correlationId: 'req-123' });
|
|
16
|
+
* const result = await manager.executeWithRetry(
|
|
17
|
+
* async () => await databaseQuery(),
|
|
18
|
+
* { maxAttempts: 3, baseDelayMs: 1000 }
|
|
19
|
+
* );
|
|
20
|
+
*/ import { withRetry } from './retry.js';
|
|
21
|
+
import { StandardError, ErrorCode, isRetryableError } from './errors.js';
|
|
22
|
+
import { createLogger } from './logging.js';
|
|
23
|
+
const logger = createLogger('retry-manager');
|
|
24
|
+
/**
|
|
25
|
+
* Circuit breaker state
|
|
26
|
+
*/ export var CircuitState = /*#__PURE__*/ function(CircuitState) {
|
|
27
|
+
CircuitState["CLOSED"] = "CLOSED";
|
|
28
|
+
CircuitState["OPEN"] = "OPEN";
|
|
29
|
+
CircuitState["HALF_OPEN"] = "HALF_OPEN";
|
|
30
|
+
return CircuitState;
|
|
31
|
+
}({});
|
|
32
|
+
/**
|
|
33
|
+
* Predefined retry policies
|
|
34
|
+
*/ export const RetryPolicies = {
|
|
35
|
+
/** Quick retry for fast operations (3 attempts, 500ms base, 5s max) */ QUICK: {
|
|
36
|
+
name: 'QUICK',
|
|
37
|
+
maxAttempts: 3,
|
|
38
|
+
baseDelayMs: 500,
|
|
39
|
+
maxDelayMs: 5000,
|
|
40
|
+
exponential: true,
|
|
41
|
+
jitter: true
|
|
42
|
+
},
|
|
43
|
+
/** Standard retry for typical operations (3 attempts, 1s base, 30s max) */ STANDARD: {
|
|
44
|
+
name: 'STANDARD',
|
|
45
|
+
maxAttempts: 3,
|
|
46
|
+
baseDelayMs: 1000,
|
|
47
|
+
maxDelayMs: 30000,
|
|
48
|
+
exponential: true,
|
|
49
|
+
jitter: true
|
|
50
|
+
},
|
|
51
|
+
/** Aggressive retry for critical operations (5 attempts, 2s base, 60s max) */ AGGRESSIVE: {
|
|
52
|
+
name: 'AGGRESSIVE',
|
|
53
|
+
maxAttempts: 5,
|
|
54
|
+
baseDelayMs: 2000,
|
|
55
|
+
maxDelayMs: 60000,
|
|
56
|
+
exponential: true,
|
|
57
|
+
jitter: true
|
|
58
|
+
},
|
|
59
|
+
/** Database-specific retry (3 attempts, 1s base, 30s max, only retryable errors) */ DATABASE: {
|
|
60
|
+
name: 'DATABASE',
|
|
61
|
+
maxAttempts: 3,
|
|
62
|
+
baseDelayMs: 1000,
|
|
63
|
+
maxDelayMs: 30000,
|
|
64
|
+
exponential: true,
|
|
65
|
+
jitter: true,
|
|
66
|
+
shouldRetry: (error)=>{
|
|
67
|
+
// Only retry specific database errors
|
|
68
|
+
if (error instanceof StandardError) {
|
|
69
|
+
return error.isRetryable;
|
|
70
|
+
}
|
|
71
|
+
return isRetryableError(error);
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
/** Network-specific retry (4 attempts, 2s base, 45s max) */ NETWORK: {
|
|
75
|
+
name: 'NETWORK',
|
|
76
|
+
maxAttempts: 4,
|
|
77
|
+
baseDelayMs: 2000,
|
|
78
|
+
maxDelayMs: 45000,
|
|
79
|
+
exponential: true,
|
|
80
|
+
jitter: true,
|
|
81
|
+
shouldRetry: (error)=>{
|
|
82
|
+
if (error instanceof StandardError) {
|
|
83
|
+
return error.code === ErrorCode.NETWORK_ERROR || error.isRetryable;
|
|
84
|
+
}
|
|
85
|
+
return isRetryableError(error);
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
/** File system retry (2 attempts, 500ms base, 5s max) */ FILE_SYSTEM: {
|
|
89
|
+
name: 'FILE_SYSTEM',
|
|
90
|
+
maxAttempts: 2,
|
|
91
|
+
baseDelayMs: 500,
|
|
92
|
+
maxDelayMs: 5000,
|
|
93
|
+
exponential: false,
|
|
94
|
+
jitter: false
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
/**
|
|
98
|
+
* Enhanced Retry Manager with circuit breaker and correlation tracking
|
|
99
|
+
*/ export class RetryManager {
|
|
100
|
+
config;
|
|
101
|
+
circuitState = "CLOSED";
|
|
102
|
+
failureCount = 0;
|
|
103
|
+
successCount = 0;
|
|
104
|
+
lastFailureTime;
|
|
105
|
+
retryAttempts = [];
|
|
106
|
+
constructor(config = {}){
|
|
107
|
+
this.config = {
|
|
108
|
+
correlationId: config.correlationId,
|
|
109
|
+
circuitBreaker: {
|
|
110
|
+
failureThreshold: 5,
|
|
111
|
+
successThreshold: 2,
|
|
112
|
+
openTimeoutMs: 60000,
|
|
113
|
+
enabled: false,
|
|
114
|
+
...config.circuitBreaker
|
|
115
|
+
},
|
|
116
|
+
defaultPolicy: config.defaultPolicy || RetryPolicies.STANDARD,
|
|
117
|
+
enableLogging: config.enableLogging ?? true
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Execute operation with retry logic
|
|
122
|
+
*
|
|
123
|
+
* @param fn - Async function to execute
|
|
124
|
+
* @param policyOrOptions - Retry policy or custom options
|
|
125
|
+
* @returns Result of the function
|
|
126
|
+
* @throws Error if all retry attempts fail or circuit is open
|
|
127
|
+
*/ async executeWithRetry(fn, policyOrOptions) {
|
|
128
|
+
// Check circuit breaker
|
|
129
|
+
if (this.config.circuitBreaker.enabled) {
|
|
130
|
+
this.checkCircuitBreaker();
|
|
131
|
+
}
|
|
132
|
+
// Determine retry options
|
|
133
|
+
const options = this.buildRetryOptions(policyOrOptions);
|
|
134
|
+
const policyName = policyOrOptions?.name;
|
|
135
|
+
// Clear retry attempts for new operation
|
|
136
|
+
this.retryAttempts = [];
|
|
137
|
+
// Log operation start
|
|
138
|
+
if (this.config.enableLogging) {
|
|
139
|
+
logger.debug('Starting operation with retry', {
|
|
140
|
+
correlationId: this.config.correlationId,
|
|
141
|
+
policy: policyName || 'custom',
|
|
142
|
+
maxAttempts: options.maxAttempts,
|
|
143
|
+
circuitState: this.circuitState
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
try {
|
|
147
|
+
// Execute with retry
|
|
148
|
+
const result = await withRetry(fn, {
|
|
149
|
+
...options,
|
|
150
|
+
onRetry: (attempt, error, delayMs)=>{
|
|
151
|
+
// Track retry attempt
|
|
152
|
+
this.retryAttempts.push({
|
|
153
|
+
attemptNumber: attempt,
|
|
154
|
+
correlationId: this.config.correlationId,
|
|
155
|
+
error,
|
|
156
|
+
delayMs,
|
|
157
|
+
timestamp: new Date(),
|
|
158
|
+
policyName
|
|
159
|
+
});
|
|
160
|
+
// Log retry attempt
|
|
161
|
+
if (this.config.enableLogging) {
|
|
162
|
+
logger.warn('Retry attempt', {
|
|
163
|
+
correlationId: this.config.correlationId,
|
|
164
|
+
attempt,
|
|
165
|
+
maxAttempts: options.maxAttempts,
|
|
166
|
+
error: error.message,
|
|
167
|
+
delayMs,
|
|
168
|
+
policyName,
|
|
169
|
+
isRetryable: error instanceof StandardError ? error.isRetryable : isRetryableError(error)
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
// Call custom onRetry if provided
|
|
173
|
+
if (options.onRetry) {
|
|
174
|
+
options.onRetry(attempt, error, delayMs);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
// Record success for circuit breaker
|
|
179
|
+
if (this.config.circuitBreaker.enabled) {
|
|
180
|
+
this.recordSuccess();
|
|
181
|
+
}
|
|
182
|
+
// Log success
|
|
183
|
+
if (this.config.enableLogging) {
|
|
184
|
+
logger.debug('Operation succeeded', {
|
|
185
|
+
correlationId: this.config.correlationId,
|
|
186
|
+
retryAttempts: this.retryAttempts.length,
|
|
187
|
+
circuitState: this.circuitState
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
return result;
|
|
191
|
+
} catch (error) {
|
|
192
|
+
// Record failure for circuit breaker
|
|
193
|
+
if (this.config.circuitBreaker.enabled) {
|
|
194
|
+
this.recordFailure();
|
|
195
|
+
}
|
|
196
|
+
// Log failure
|
|
197
|
+
if (this.config.enableLogging) {
|
|
198
|
+
logger.error('Operation failed after retries', {
|
|
199
|
+
correlationId: this.config.correlationId,
|
|
200
|
+
retryAttempts: this.retryAttempts.length,
|
|
201
|
+
finalError: error instanceof Error ? error.message : String(error),
|
|
202
|
+
circuitState: this.circuitState
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
throw error;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Execute operation with retry and return statistics
|
|
210
|
+
*
|
|
211
|
+
* @param fn - Async function to execute
|
|
212
|
+
* @param policyOrOptions - Retry policy or custom options
|
|
213
|
+
* @returns Result and retry statistics
|
|
214
|
+
*/ async executeWithRetryStats(fn, policyOrOptions) {
|
|
215
|
+
const startTime = Date.now();
|
|
216
|
+
let result;
|
|
217
|
+
try {
|
|
218
|
+
result = await this.executeWithRetry(fn, policyOrOptions);
|
|
219
|
+
} catch (error) {
|
|
220
|
+
const stats = {
|
|
221
|
+
totalAttempts: this.retryAttempts.length + 1,
|
|
222
|
+
succeeded: false,
|
|
223
|
+
totalTimeMs: Date.now() - startTime,
|
|
224
|
+
delays: this.retryAttempts.map((a)=>a.delayMs),
|
|
225
|
+
errors: this.retryAttempts.map((a)=>a.error)
|
|
226
|
+
};
|
|
227
|
+
throw error;
|
|
228
|
+
}
|
|
229
|
+
const stats = {
|
|
230
|
+
totalAttempts: this.retryAttempts.length + 1,
|
|
231
|
+
succeeded: true,
|
|
232
|
+
totalTimeMs: Date.now() - startTime,
|
|
233
|
+
delays: this.retryAttempts.map((a)=>a.delayMs),
|
|
234
|
+
errors: this.retryAttempts.map((a)=>a.error)
|
|
235
|
+
};
|
|
236
|
+
return {
|
|
237
|
+
result,
|
|
238
|
+
stats,
|
|
239
|
+
attempts: [
|
|
240
|
+
...this.retryAttempts
|
|
241
|
+
]
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Get current circuit breaker state
|
|
246
|
+
*/ getCircuitState() {
|
|
247
|
+
return this.circuitState;
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Get circuit breaker statistics
|
|
251
|
+
*/ getCircuitStats() {
|
|
252
|
+
return {
|
|
253
|
+
state: this.circuitState,
|
|
254
|
+
failureCount: this.failureCount,
|
|
255
|
+
successCount: this.successCount,
|
|
256
|
+
lastFailureTime: this.lastFailureTime
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Manually reset circuit breaker
|
|
261
|
+
*/ resetCircuit() {
|
|
262
|
+
this.circuitState = "CLOSED";
|
|
263
|
+
this.failureCount = 0;
|
|
264
|
+
this.successCount = 0;
|
|
265
|
+
this.lastFailureTime = undefined;
|
|
266
|
+
if (this.config.enableLogging) {
|
|
267
|
+
logger.info('Circuit breaker manually reset', {
|
|
268
|
+
correlationId: this.config.correlationId
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Build retry options from policy or custom options
|
|
274
|
+
*/ buildRetryOptions(policyOrOptions) {
|
|
275
|
+
if (!policyOrOptions) {
|
|
276
|
+
// Use default policy
|
|
277
|
+
return {
|
|
278
|
+
maxAttempts: this.config.defaultPolicy.maxAttempts,
|
|
279
|
+
baseDelayMs: this.config.defaultPolicy.baseDelayMs,
|
|
280
|
+
maxDelayMs: this.config.defaultPolicy.maxDelayMs,
|
|
281
|
+
exponential: this.config.defaultPolicy.exponential,
|
|
282
|
+
jitter: this.config.defaultPolicy.jitter,
|
|
283
|
+
shouldRetry: this.config.defaultPolicy.shouldRetry
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
// Check if it's a retry policy
|
|
287
|
+
if ('name' in policyOrOptions) {
|
|
288
|
+
const policy = policyOrOptions;
|
|
289
|
+
return {
|
|
290
|
+
maxAttempts: policy.maxAttempts,
|
|
291
|
+
baseDelayMs: policy.baseDelayMs,
|
|
292
|
+
maxDelayMs: policy.maxDelayMs,
|
|
293
|
+
exponential: policy.exponential,
|
|
294
|
+
jitter: policy.jitter,
|
|
295
|
+
shouldRetry: policy.shouldRetry
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
// It's custom retry options
|
|
299
|
+
return policyOrOptions;
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Check circuit breaker state and throw if open
|
|
303
|
+
*/ checkCircuitBreaker() {
|
|
304
|
+
const now = Date.now();
|
|
305
|
+
switch(this.circuitState){
|
|
306
|
+
case "OPEN":
|
|
307
|
+
// Check if timeout has elapsed
|
|
308
|
+
if (this.lastFailureTime && now - this.lastFailureTime.getTime() >= this.config.circuitBreaker.openTimeoutMs) {
|
|
309
|
+
// Transition to half-open
|
|
310
|
+
this.circuitState = "HALF_OPEN";
|
|
311
|
+
this.successCount = 0;
|
|
312
|
+
if (this.config.enableLogging) {
|
|
313
|
+
logger.info('Circuit breaker transitioning to half-open', {
|
|
314
|
+
correlationId: this.config.correlationId,
|
|
315
|
+
timeSinceOpen: now - this.lastFailureTime.getTime()
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
} else {
|
|
319
|
+
// Circuit is still open, reject request
|
|
320
|
+
throw new StandardError(ErrorCode.OPERATION_TIMEOUT, 'Circuit breaker is open - service unavailable', {
|
|
321
|
+
circuitState: this.circuitState,
|
|
322
|
+
failureCount: this.failureCount,
|
|
323
|
+
timeSinceOpen: this.lastFailureTime ? now - this.lastFailureTime.getTime() : 0
|
|
324
|
+
}, undefined, false // Not retryable
|
|
325
|
+
);
|
|
326
|
+
}
|
|
327
|
+
break;
|
|
328
|
+
case "HALF_OPEN":
|
|
329
|
+
// Allow request through for testing
|
|
330
|
+
if (this.config.enableLogging) {
|
|
331
|
+
logger.debug('Allowing request through half-open circuit', {
|
|
332
|
+
correlationId: this.config.correlationId,
|
|
333
|
+
successCount: this.successCount,
|
|
334
|
+
successThreshold: this.config.circuitBreaker.successThreshold
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
break;
|
|
338
|
+
case "CLOSED":
|
|
339
|
+
break;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* Record successful operation for circuit breaker
|
|
344
|
+
*/ recordSuccess() {
|
|
345
|
+
switch(this.circuitState){
|
|
346
|
+
case "HALF_OPEN":
|
|
347
|
+
this.successCount++;
|
|
348
|
+
if (this.successCount >= this.config.circuitBreaker.successThreshold) {
|
|
349
|
+
// Close the circuit
|
|
350
|
+
this.circuitState = "CLOSED";
|
|
351
|
+
this.failureCount = 0;
|
|
352
|
+
this.successCount = 0;
|
|
353
|
+
if (this.config.enableLogging) {
|
|
354
|
+
logger.info('Circuit breaker closed after recovery', {
|
|
355
|
+
correlationId: this.config.correlationId
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
break;
|
|
360
|
+
case "CLOSED":
|
|
361
|
+
// Reset failure count on success
|
|
362
|
+
if (this.failureCount > 0) {
|
|
363
|
+
this.failureCount = 0;
|
|
364
|
+
}
|
|
365
|
+
break;
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* Record failed operation for circuit breaker
|
|
370
|
+
*/ recordFailure() {
|
|
371
|
+
this.lastFailureTime = new Date();
|
|
372
|
+
switch(this.circuitState){
|
|
373
|
+
case "HALF_OPEN":
|
|
374
|
+
// Failed during recovery, reopen circuit
|
|
375
|
+
this.circuitState = "OPEN";
|
|
376
|
+
this.successCount = 0;
|
|
377
|
+
if (this.config.enableLogging) {
|
|
378
|
+
logger.warn('Circuit breaker reopened after failed recovery', {
|
|
379
|
+
correlationId: this.config.correlationId
|
|
380
|
+
});
|
|
381
|
+
}
|
|
382
|
+
break;
|
|
383
|
+
case "CLOSED":
|
|
384
|
+
this.failureCount++;
|
|
385
|
+
if (this.failureCount >= this.config.circuitBreaker.failureThreshold) {
|
|
386
|
+
// Open the circuit
|
|
387
|
+
this.circuitState = "OPEN";
|
|
388
|
+
if (this.config.enableLogging) {
|
|
389
|
+
logger.error('Circuit breaker opened due to failures', {
|
|
390
|
+
correlationId: this.config.correlationId,
|
|
391
|
+
failureCount: this.failureCount,
|
|
392
|
+
threshold: this.config.circuitBreaker.failureThreshold
|
|
393
|
+
});
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
break;
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* Create a retry manager instance with correlation ID
|
|
402
|
+
*
|
|
403
|
+
* @param correlationId - Correlation ID for tracking
|
|
404
|
+
* @param config - Additional configuration
|
|
405
|
+
* @returns RetryManager instance
|
|
406
|
+
*/ export function createRetryManager(correlationId, config) {
|
|
407
|
+
return new RetryManager({
|
|
408
|
+
...config,
|
|
409
|
+
correlationId
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
/**
|
|
413
|
+
* Execute operation with standard retry policy
|
|
414
|
+
*
|
|
415
|
+
* @param fn - Async function to execute
|
|
416
|
+
* @param correlationId - Optional correlation ID
|
|
417
|
+
* @returns Result of the function
|
|
418
|
+
*/ export async function withStandardRetry(fn, correlationId) {
|
|
419
|
+
const manager = createRetryManager(correlationId);
|
|
420
|
+
return manager.executeWithRetry(fn, RetryPolicies.STANDARD);
|
|
421
|
+
}
|
|
422
|
+
/**
|
|
423
|
+
* Execute database operation with retry policy
|
|
424
|
+
*
|
|
425
|
+
* @param fn - Async function to execute
|
|
426
|
+
* @param correlationId - Optional correlation ID
|
|
427
|
+
* @returns Result of the function
|
|
428
|
+
*/ export async function withDatabaseRetry(fn, correlationId) {
|
|
429
|
+
const manager = createRetryManager(correlationId);
|
|
430
|
+
return manager.executeWithRetry(fn, RetryPolicies.DATABASE);
|
|
431
|
+
}
|
|
432
|
+
/**
|
|
433
|
+
* Execute network operation with retry policy
|
|
434
|
+
*
|
|
435
|
+
* @param fn - Async function to execute
|
|
436
|
+
* @param correlationId - Optional correlation ID
|
|
437
|
+
* @returns Result of the function
|
|
438
|
+
*/ export async function withNetworkRetry(fn, correlationId) {
|
|
439
|
+
const manager = createRetryManager(correlationId);
|
|
440
|
+
return manager.executeWithRetry(fn, RetryPolicies.NETWORK);
|
|
441
|
+
}
|
|
442
|
+
/**
|
|
443
|
+
* Execute file system operation with retry policy
|
|
444
|
+
*
|
|
445
|
+
* @param fn - Async function to execute
|
|
446
|
+
* @param correlationId - Optional correlation ID
|
|
447
|
+
* @returns Result of the function
|
|
448
|
+
*/ export async function withFileSystemRetry(fn, correlationId) {
|
|
449
|
+
const manager = createRetryManager(correlationId);
|
|
450
|
+
return manager.executeWithRetry(fn, RetryPolicies.FILE_SYSTEM);
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
//# sourceMappingURL=retry-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/retry-manager.ts"],"sourcesContent":["/**\r\n * Enhanced Retry Manager with Circuit Breaker Integration\r\n *\r\n * Provides advanced retry logic with:\r\n * - Exponential backoff with jitter\r\n * - Circuit breaker integration\r\n * - Correlation ID tracking\r\n * - Configurable retry policies\r\n * - Detailed retry attempt logging\r\n * - Retryable error classification\r\n *\r\n * Part of HIGH-PRIORITY retry logic implementation\r\n *\r\n * Usage:\r\n * const manager = new RetryManager({ correlationId: 'req-123' });\r\n * const result = await manager.executeWithRetry(\r\n * async () => await databaseQuery(),\r\n * { maxAttempts: 3, baseDelayMs: 1000 }\r\n * );\r\n */\r\n\r\nimport { withRetry, RetryOptions, RetryStats, sleep } from './retry.js';\r\nimport { StandardError, ErrorCode, isRetryableError } from './errors.js';\r\nimport { createLogger } from './logging.js';\r\n\r\nconst logger = createLogger('retry-manager');\r\n\r\n/**\r\n * Circuit breaker state\r\n */\r\nexport enum CircuitState {\r\n CLOSED = 'CLOSED', // Normal operation\r\n OPEN = 'OPEN', // Failing, reject all requests\r\n HALF_OPEN = 'HALF_OPEN', // Testing if service recovered\r\n}\r\n\r\n/**\r\n * Circuit breaker configuration\r\n */\r\nexport interface CircuitBreakerConfig {\r\n /** Failure threshold to open circuit (default: 5) */\r\n failureThreshold?: number;\r\n /** Success threshold to close circuit from half-open (default: 2) */\r\n successThreshold?: number;\r\n /** Timeout in ms before attempting recovery (default: 60000) */\r\n openTimeoutMs?: number;\r\n /** Enable circuit breaker (default: false) */\r\n enabled?: boolean;\r\n}\r\n\r\n/**\r\n * Retry policy configuration\r\n */\r\nexport interface RetryPolicy {\r\n /** Policy name for logging */\r\n name: string;\r\n /** Maximum retry attempts */\r\n maxAttempts: number;\r\n /** Base delay in milliseconds */\r\n baseDelayMs: number;\r\n /** Maximum delay in milliseconds */\r\n maxDelayMs: number;\r\n /** Use exponential backoff */\r\n exponential: boolean;\r\n /** Add jitter to delays */\r\n jitter: boolean;\r\n /** Custom retry condition */\r\n shouldRetry?: (error: Error) => boolean;\r\n}\r\n\r\n/**\r\n * Predefined retry policies\r\n */\r\nexport const RetryPolicies = {\r\n /** Quick retry for fast operations (3 attempts, 500ms base, 5s max) */\r\n QUICK: {\r\n name: 'QUICK',\r\n maxAttempts: 3,\r\n baseDelayMs: 500,\r\n maxDelayMs: 5000,\r\n exponential: true,\r\n jitter: true,\r\n } as RetryPolicy,\r\n\r\n /** Standard retry for typical operations (3 attempts, 1s base, 30s max) */\r\n STANDARD: {\r\n name: 'STANDARD',\r\n maxAttempts: 3,\r\n baseDelayMs: 1000,\r\n maxDelayMs: 30000,\r\n exponential: true,\r\n jitter: true,\r\n } as RetryPolicy,\r\n\r\n /** Aggressive retry for critical operations (5 attempts, 2s base, 60s max) */\r\n AGGRESSIVE: {\r\n name: 'AGGRESSIVE',\r\n maxAttempts: 5,\r\n baseDelayMs: 2000,\r\n maxDelayMs: 60000,\r\n exponential: true,\r\n jitter: true,\r\n } as RetryPolicy,\r\n\r\n /** Database-specific retry (3 attempts, 1s base, 30s max, only retryable errors) */\r\n DATABASE: {\r\n name: 'DATABASE',\r\n maxAttempts: 3,\r\n baseDelayMs: 1000,\r\n maxDelayMs: 30000,\r\n exponential: true,\r\n jitter: true,\r\n shouldRetry: (error: Error) => {\r\n // Only retry specific database errors\r\n if (error instanceof StandardError) {\r\n return error.isRetryable;\r\n }\r\n return isRetryableError(error);\r\n },\r\n } as RetryPolicy,\r\n\r\n /** Network-specific retry (4 attempts, 2s base, 45s max) */\r\n NETWORK: {\r\n name: 'NETWORK',\r\n maxAttempts: 4,\r\n baseDelayMs: 2000,\r\n maxDelayMs: 45000,\r\n exponential: true,\r\n jitter: true,\r\n shouldRetry: (error: Error) => {\r\n if (error instanceof StandardError) {\r\n return error.code === ErrorCode.NETWORK_ERROR || error.isRetryable;\r\n }\r\n return isRetryableError(error);\r\n },\r\n } as RetryPolicy,\r\n\r\n /** File system retry (2 attempts, 500ms base, 5s max) */\r\n FILE_SYSTEM: {\r\n name: 'FILE_SYSTEM',\r\n maxAttempts: 2,\r\n baseDelayMs: 500,\r\n maxDelayMs: 5000,\r\n exponential: false,\r\n jitter: false,\r\n } as RetryPolicy,\r\n};\r\n\r\n/**\r\n * Retry manager configuration\r\n */\r\nexport interface RetryManagerConfig {\r\n /** Correlation ID for tracking related operations */\r\n correlationId?: string;\r\n /** Circuit breaker configuration */\r\n circuitBreaker?: CircuitBreakerConfig;\r\n /** Default retry policy */\r\n defaultPolicy?: RetryPolicy;\r\n /** Enable detailed logging */\r\n enableLogging?: boolean;\r\n}\r\n\r\n/**\r\n * Retry attempt metadata\r\n */\r\nexport interface RetryAttemptMetadata {\r\n attemptNumber: number;\r\n correlationId?: string;\r\n error: Error;\r\n delayMs: number;\r\n timestamp: Date;\r\n policyName?: string;\r\n}\r\n\r\n/**\r\n * Enhanced Retry Manager with circuit breaker and correlation tracking\r\n */\r\nexport class RetryManager {\r\n private readonly config: Required<RetryManagerConfig>;\r\n private circuitState: CircuitState = CircuitState.CLOSED;\r\n private failureCount: number = 0;\r\n private successCount: number = 0;\r\n private lastFailureTime?: Date;\r\n private retryAttempts: RetryAttemptMetadata[] = [];\r\n\r\n constructor(config: RetryManagerConfig = {}) {\r\n this.config = {\r\n correlationId: config.correlationId,\r\n circuitBreaker: {\r\n failureThreshold: 5,\r\n successThreshold: 2,\r\n openTimeoutMs: 60000,\r\n enabled: false,\r\n ...config.circuitBreaker,\r\n },\r\n defaultPolicy: config.defaultPolicy || RetryPolicies.STANDARD,\r\n enableLogging: config.enableLogging ?? true,\r\n };\r\n }\r\n\r\n /**\r\n * Execute operation with retry logic\r\n *\r\n * @param fn - Async function to execute\r\n * @param policyOrOptions - Retry policy or custom options\r\n * @returns Result of the function\r\n * @throws Error if all retry attempts fail or circuit is open\r\n */\r\n async executeWithRetry<T>(\r\n fn: () => Promise<T>,\r\n policyOrOptions?: RetryPolicy | RetryOptions\r\n ): Promise<T> {\r\n // Check circuit breaker\r\n if (this.config.circuitBreaker.enabled) {\r\n this.checkCircuitBreaker();\r\n }\r\n\r\n // Determine retry options\r\n const options = this.buildRetryOptions(policyOrOptions);\r\n const policyName = (policyOrOptions as RetryPolicy)?.name;\r\n\r\n // Clear retry attempts for new operation\r\n this.retryAttempts = [];\r\n\r\n // Log operation start\r\n if (this.config.enableLogging) {\r\n logger.debug('Starting operation with retry', {\r\n correlationId: this.config.correlationId,\r\n policy: policyName || 'custom',\r\n maxAttempts: options.maxAttempts,\r\n circuitState: this.circuitState,\r\n });\r\n }\r\n\r\n try {\r\n // Execute with retry\r\n const result = await withRetry(fn, {\r\n ...options,\r\n onRetry: (attempt, error, delayMs) => {\r\n // Track retry attempt\r\n this.retryAttempts.push({\r\n attemptNumber: attempt,\r\n correlationId: this.config.correlationId,\r\n error,\r\n delayMs,\r\n timestamp: new Date(),\r\n policyName,\r\n });\r\n\r\n // Log retry attempt\r\n if (this.config.enableLogging) {\r\n logger.warn('Retry attempt', {\r\n correlationId: this.config.correlationId,\r\n attempt,\r\n maxAttempts: options.maxAttempts,\r\n error: error.message,\r\n delayMs,\r\n policyName,\r\n isRetryable: error instanceof StandardError ? error.isRetryable : isRetryableError(error),\r\n });\r\n }\r\n\r\n // Call custom onRetry if provided\r\n if (options.onRetry) {\r\n options.onRetry(attempt, error, delayMs);\r\n }\r\n },\r\n });\r\n\r\n // Record success for circuit breaker\r\n if (this.config.circuitBreaker.enabled) {\r\n this.recordSuccess();\r\n }\r\n\r\n // Log success\r\n if (this.config.enableLogging) {\r\n logger.debug('Operation succeeded', {\r\n correlationId: this.config.correlationId,\r\n retryAttempts: this.retryAttempts.length,\r\n circuitState: this.circuitState,\r\n });\r\n }\r\n\r\n return result;\r\n } catch (error) {\r\n // Record failure for circuit breaker\r\n if (this.config.circuitBreaker.enabled) {\r\n this.recordFailure();\r\n }\r\n\r\n // Log failure\r\n if (this.config.enableLogging) {\r\n logger.error('Operation failed after retries', {\r\n correlationId: this.config.correlationId,\r\n retryAttempts: this.retryAttempts.length,\r\n finalError: error instanceof Error ? error.message : String(error),\r\n circuitState: this.circuitState,\r\n });\r\n }\r\n\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Execute operation with retry and return statistics\r\n *\r\n * @param fn - Async function to execute\r\n * @param policyOrOptions - Retry policy or custom options\r\n * @returns Result and retry statistics\r\n */\r\n async executeWithRetryStats<T>(\r\n fn: () => Promise<T>,\r\n policyOrOptions?: RetryPolicy | RetryOptions\r\n ): Promise<{ result: T; stats: RetryStats; attempts: RetryAttemptMetadata[] }> {\r\n const startTime = Date.now();\r\n let result: T;\r\n\r\n try {\r\n result = await this.executeWithRetry(fn, policyOrOptions);\r\n } catch (error) {\r\n const stats: RetryStats = {\r\n totalAttempts: this.retryAttempts.length + 1,\r\n succeeded: false,\r\n totalTimeMs: Date.now() - startTime,\r\n delays: this.retryAttempts.map((a) => a.delayMs),\r\n errors: this.retryAttempts.map((a) => a.error),\r\n };\r\n throw error;\r\n }\r\n\r\n const stats: RetryStats = {\r\n totalAttempts: this.retryAttempts.length + 1,\r\n succeeded: true,\r\n totalTimeMs: Date.now() - startTime,\r\n delays: this.retryAttempts.map((a) => a.delayMs),\r\n errors: this.retryAttempts.map((a) => a.error),\r\n };\r\n\r\n return {\r\n result,\r\n stats,\r\n attempts: [...this.retryAttempts],\r\n };\r\n }\r\n\r\n /**\r\n * Get current circuit breaker state\r\n */\r\n getCircuitState(): CircuitState {\r\n return this.circuitState;\r\n }\r\n\r\n /**\r\n * Get circuit breaker statistics\r\n */\r\n getCircuitStats() {\r\n return {\r\n state: this.circuitState,\r\n failureCount: this.failureCount,\r\n successCount: this.successCount,\r\n lastFailureTime: this.lastFailureTime,\r\n };\r\n }\r\n\r\n /**\r\n * Manually reset circuit breaker\r\n */\r\n resetCircuit(): void {\r\n this.circuitState = CircuitState.CLOSED;\r\n this.failureCount = 0;\r\n this.successCount = 0;\r\n this.lastFailureTime = undefined;\r\n\r\n if (this.config.enableLogging) {\r\n logger.info('Circuit breaker manually reset', {\r\n correlationId: this.config.correlationId,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Build retry options from policy or custom options\r\n */\r\n private buildRetryOptions(policyOrOptions?: RetryPolicy | RetryOptions): RetryOptions {\r\n if (!policyOrOptions) {\r\n // Use default policy\r\n return {\r\n maxAttempts: this.config.defaultPolicy.maxAttempts,\r\n baseDelayMs: this.config.defaultPolicy.baseDelayMs,\r\n maxDelayMs: this.config.defaultPolicy.maxDelayMs,\r\n exponential: this.config.defaultPolicy.exponential,\r\n jitter: this.config.defaultPolicy.jitter,\r\n shouldRetry: this.config.defaultPolicy.shouldRetry,\r\n };\r\n }\r\n\r\n // Check if it's a retry policy\r\n if ('name' in policyOrOptions) {\r\n const policy = policyOrOptions as RetryPolicy;\r\n return {\r\n maxAttempts: policy.maxAttempts,\r\n baseDelayMs: policy.baseDelayMs,\r\n maxDelayMs: policy.maxDelayMs,\r\n exponential: policy.exponential,\r\n jitter: policy.jitter,\r\n shouldRetry: policy.shouldRetry,\r\n };\r\n }\r\n\r\n // It's custom retry options\r\n return policyOrOptions as RetryOptions;\r\n }\r\n\r\n /**\r\n * Check circuit breaker state and throw if open\r\n */\r\n private checkCircuitBreaker(): void {\r\n const now = Date.now();\r\n\r\n switch (this.circuitState) {\r\n case CircuitState.OPEN:\r\n // Check if timeout has elapsed\r\n if (\r\n this.lastFailureTime &&\r\n now - this.lastFailureTime.getTime() >= this.config.circuitBreaker.openTimeoutMs\r\n ) {\r\n // Transition to half-open\r\n this.circuitState = CircuitState.HALF_OPEN;\r\n this.successCount = 0;\r\n\r\n if (this.config.enableLogging) {\r\n logger.info('Circuit breaker transitioning to half-open', {\r\n correlationId: this.config.correlationId,\r\n timeSinceOpen: now - this.lastFailureTime.getTime(),\r\n });\r\n }\r\n } else {\r\n // Circuit is still open, reject request\r\n throw new StandardError(\r\n ErrorCode.OPERATION_TIMEOUT,\r\n 'Circuit breaker is open - service unavailable',\r\n {\r\n circuitState: this.circuitState,\r\n failureCount: this.failureCount,\r\n timeSinceOpen: this.lastFailureTime\r\n ? now - this.lastFailureTime.getTime()\r\n : 0,\r\n },\r\n undefined,\r\n false // Not retryable\r\n );\r\n }\r\n break;\r\n\r\n case CircuitState.HALF_OPEN:\r\n // Allow request through for testing\r\n if (this.config.enableLogging) {\r\n logger.debug('Allowing request through half-open circuit', {\r\n correlationId: this.config.correlationId,\r\n successCount: this.successCount,\r\n successThreshold: this.config.circuitBreaker.successThreshold,\r\n });\r\n }\r\n break;\r\n\r\n case CircuitState.CLOSED:\r\n // Normal operation\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Record successful operation for circuit breaker\r\n */\r\n private recordSuccess(): void {\r\n switch (this.circuitState) {\r\n case CircuitState.HALF_OPEN:\r\n this.successCount++;\r\n\r\n if (this.successCount >= this.config.circuitBreaker.successThreshold) {\r\n // Close the circuit\r\n this.circuitState = CircuitState.CLOSED;\r\n this.failureCount = 0;\r\n this.successCount = 0;\r\n\r\n if (this.config.enableLogging) {\r\n logger.info('Circuit breaker closed after recovery', {\r\n correlationId: this.config.correlationId,\r\n });\r\n }\r\n }\r\n break;\r\n\r\n case CircuitState.CLOSED:\r\n // Reset failure count on success\r\n if (this.failureCount > 0) {\r\n this.failureCount = 0;\r\n }\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Record failed operation for circuit breaker\r\n */\r\n private recordFailure(): void {\r\n this.lastFailureTime = new Date();\r\n\r\n switch (this.circuitState) {\r\n case CircuitState.HALF_OPEN:\r\n // Failed during recovery, reopen circuit\r\n this.circuitState = CircuitState.OPEN;\r\n this.successCount = 0;\r\n\r\n if (this.config.enableLogging) {\r\n logger.warn('Circuit breaker reopened after failed recovery', {\r\n correlationId: this.config.correlationId,\r\n });\r\n }\r\n break;\r\n\r\n case CircuitState.CLOSED:\r\n this.failureCount++;\r\n\r\n if (this.failureCount >= this.config.circuitBreaker.failureThreshold) {\r\n // Open the circuit\r\n this.circuitState = CircuitState.OPEN;\r\n\r\n if (this.config.enableLogging) {\r\n logger.error('Circuit breaker opened due to failures', {\r\n correlationId: this.config.correlationId,\r\n failureCount: this.failureCount,\r\n threshold: this.config.circuitBreaker.failureThreshold,\r\n });\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Create a retry manager instance with correlation ID\r\n *\r\n * @param correlationId - Correlation ID for tracking\r\n * @param config - Additional configuration\r\n * @returns RetryManager instance\r\n */\r\nexport function createRetryManager(\r\n correlationId?: string,\r\n config?: Omit<RetryManagerConfig, 'correlationId'>\r\n): RetryManager {\r\n return new RetryManager({\r\n ...config,\r\n correlationId,\r\n });\r\n}\r\n\r\n/**\r\n * Execute operation with standard retry policy\r\n *\r\n * @param fn - Async function to execute\r\n * @param correlationId - Optional correlation ID\r\n * @returns Result of the function\r\n */\r\nexport async function withStandardRetry<T>(\r\n fn: () => Promise<T>,\r\n correlationId?: string\r\n): Promise<T> {\r\n const manager = createRetryManager(correlationId);\r\n return manager.executeWithRetry(fn, RetryPolicies.STANDARD);\r\n}\r\n\r\n/**\r\n * Execute database operation with retry policy\r\n *\r\n * @param fn - Async function to execute\r\n * @param correlationId - Optional correlation ID\r\n * @returns Result of the function\r\n */\r\nexport async function withDatabaseRetry<T>(\r\n fn: () => Promise<T>,\r\n correlationId?: string\r\n): Promise<T> {\r\n const manager = createRetryManager(correlationId);\r\n return manager.executeWithRetry(fn, RetryPolicies.DATABASE);\r\n}\r\n\r\n/**\r\n * Execute network operation with retry policy\r\n *\r\n * @param fn - Async function to execute\r\n * @param correlationId - Optional correlation ID\r\n * @returns Result of the function\r\n */\r\nexport async function withNetworkRetry<T>(\r\n fn: () => Promise<T>,\r\n correlationId?: string\r\n): Promise<T> {\r\n const manager = createRetryManager(correlationId);\r\n return manager.executeWithRetry(fn, RetryPolicies.NETWORK);\r\n}\r\n\r\n/**\r\n * Execute file system operation with retry policy\r\n *\r\n * @param fn - Async function to execute\r\n * @param correlationId - Optional correlation ID\r\n * @returns Result of the function\r\n */\r\nexport async function withFileSystemRetry<T>(\r\n fn: () => Promise<T>,\r\n correlationId?: string\r\n): Promise<T> {\r\n const manager = createRetryManager(correlationId);\r\n return manager.executeWithRetry(fn, RetryPolicies.FILE_SYSTEM);\r\n}\r\n"],"names":["withRetry","StandardError","ErrorCode","isRetryableError","createLogger","logger","CircuitState","RetryPolicies","QUICK","name","maxAttempts","baseDelayMs","maxDelayMs","exponential","jitter","STANDARD","AGGRESSIVE","DATABASE","shouldRetry","error","isRetryable","NETWORK","code","NETWORK_ERROR","FILE_SYSTEM","RetryManager","config","circuitState","failureCount","successCount","lastFailureTime","retryAttempts","correlationId","circuitBreaker","failureThreshold","successThreshold","openTimeoutMs","enabled","defaultPolicy","enableLogging","executeWithRetry","fn","policyOrOptions","checkCircuitBreaker","options","buildRetryOptions","policyName","debug","policy","result","onRetry","attempt","delayMs","push","attemptNumber","timestamp","Date","warn","message","recordSuccess","length","recordFailure","finalError","Error","String","executeWithRetryStats","startTime","now","stats","totalAttempts","succeeded","totalTimeMs","delays","map","a","errors","attempts","getCircuitState","getCircuitStats","state","resetCircuit","undefined","info","getTime","timeSinceOpen","OPERATION_TIMEOUT","threshold","createRetryManager","withStandardRetry","manager","withDatabaseRetry","withNetworkRetry","withFileSystemRetry"],"mappings":"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"}
|