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,234 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error Aggregation System
|
|
3
|
+
*
|
|
4
|
+
* Provides error aggregation, correlation tracking, and circuit breaker patterns
|
|
5
|
+
* for multi-database operations.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Aggregates errors from multiple database systems
|
|
9
|
+
* - Tracks error correlation across operations
|
|
10
|
+
* - Implements circuit breaker for repeated failures
|
|
11
|
+
* - Provides error analysis and reporting
|
|
12
|
+
*
|
|
13
|
+
* Part of: Critical Error Handling Fixes (Architecture Review)
|
|
14
|
+
*/ import { DatabaseErrorCode } from './database-service/types.js';
|
|
15
|
+
import { createLogger } from './logging.js';
|
|
16
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
17
|
+
import { CircuitBreakerState, CircuitBreakerConfig, CircuitBreakerRegistry } from './circuit-breaker.js';
|
|
18
|
+
// Re-export circuit breaker types for backward compatibility
|
|
19
|
+
export { CircuitBreakerState, CircuitBreakerConfig };
|
|
20
|
+
/**
|
|
21
|
+
* Error severity levels
|
|
22
|
+
*/ export var ErrorSeverity = /*#__PURE__*/ function(ErrorSeverity) {
|
|
23
|
+
ErrorSeverity["LOW"] = "low";
|
|
24
|
+
ErrorSeverity["MEDIUM"] = "medium";
|
|
25
|
+
ErrorSeverity["HIGH"] = "high";
|
|
26
|
+
ErrorSeverity["CRITICAL"] = "critical";
|
|
27
|
+
return ErrorSeverity;
|
|
28
|
+
}({});
|
|
29
|
+
// Circuit breaker types now imported from ./circuit-breaker module
|
|
30
|
+
/**
|
|
31
|
+
* Error aggregator class
|
|
32
|
+
*/ export class ErrorAggregator {
|
|
33
|
+
logger;
|
|
34
|
+
errors = [];
|
|
35
|
+
correlationId;
|
|
36
|
+
circuitBreakerConfig;
|
|
37
|
+
constructor(correlationId, circuitBreakerConfig){
|
|
38
|
+
this.correlationId = correlationId || uuidv4();
|
|
39
|
+
this.logger = createLogger('error-aggregator');
|
|
40
|
+
// Store circuit breaker configuration for registry
|
|
41
|
+
this.circuitBreakerConfig = {
|
|
42
|
+
failureThreshold: circuitBreakerConfig?.failureThreshold ?? 5,
|
|
43
|
+
successThreshold: circuitBreakerConfig?.successThreshold ?? 2,
|
|
44
|
+
timeout: circuitBreakerConfig?.timeout ?? 60000,
|
|
45
|
+
windowSize: circuitBreakerConfig?.windowSize ?? 120000
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Add error to aggregation
|
|
50
|
+
*/ addError(system, error, operationContext) {
|
|
51
|
+
const aggregatedError = {
|
|
52
|
+
correlationId: uuidv4(),
|
|
53
|
+
timestamp: new Date(),
|
|
54
|
+
system,
|
|
55
|
+
error,
|
|
56
|
+
severity: this.determineSeverity(error),
|
|
57
|
+
operationContext,
|
|
58
|
+
stackTrace: error.originalError?.stack
|
|
59
|
+
};
|
|
60
|
+
this.errors.push(aggregatedError);
|
|
61
|
+
// Update circuit breaker
|
|
62
|
+
this.recordFailure(system);
|
|
63
|
+
// Log error with correlation ID
|
|
64
|
+
this.logger.error('Database operation failed', error.originalError, {
|
|
65
|
+
correlationId: this.correlationId,
|
|
66
|
+
errorCorrelationId: aggregatedError.correlationId,
|
|
67
|
+
system,
|
|
68
|
+
errorCode: error.code,
|
|
69
|
+
message: error.message,
|
|
70
|
+
severity: aggregatedError.severity
|
|
71
|
+
});
|
|
72
|
+
return aggregatedError;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Record successful operation (for circuit breaker)
|
|
76
|
+
*/ recordSuccess(system) {
|
|
77
|
+
// Use circuit breaker registry - success is tracked automatically via execute()
|
|
78
|
+
// This method is kept for backward compatibility but delegates to registry
|
|
79
|
+
const breaker = CircuitBreakerRegistry.getOrCreate(system, this.circuitBreakerConfig);
|
|
80
|
+
// Success tracking is handled internally by CircuitBreaker.execute()
|
|
81
|
+
// This is just a manual success recording for compatibility
|
|
82
|
+
this.logger.debug('Manual success recorded', {
|
|
83
|
+
system,
|
|
84
|
+
correlationId: this.correlationId
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Record failed operation (for circuit breaker)
|
|
89
|
+
*/ recordFailure(system) {
|
|
90
|
+
// Failure tracking is handled by the circuit breaker registry
|
|
91
|
+
// This is called when addError is invoked
|
|
92
|
+
const breaker = CircuitBreakerRegistry.getOrCreate(system, this.circuitBreakerConfig);
|
|
93
|
+
this.logger.debug('Failure recorded via error aggregation', {
|
|
94
|
+
system,
|
|
95
|
+
state: breaker.getState(),
|
|
96
|
+
correlationId: this.correlationId
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Check if circuit breaker allows operation
|
|
101
|
+
*/ isCircuitOpen(system) {
|
|
102
|
+
const breaker = CircuitBreakerRegistry.get(system);
|
|
103
|
+
return breaker ? !breaker.isHealthy() : false;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Get aggregation result
|
|
107
|
+
*/ getResult(expectedSystems) {
|
|
108
|
+
const errorsBySystem = {};
|
|
109
|
+
const errorsBySeverity = {
|
|
110
|
+
["low"]: [],
|
|
111
|
+
["medium"]: [],
|
|
112
|
+
["high"]: [],
|
|
113
|
+
["critical"]: []
|
|
114
|
+
};
|
|
115
|
+
// Group errors
|
|
116
|
+
for (const error of this.errors){
|
|
117
|
+
// By system
|
|
118
|
+
if (!errorsBySystem[error.system]) {
|
|
119
|
+
errorsBySystem[error.system] = [];
|
|
120
|
+
}
|
|
121
|
+
errorsBySystem[error.system].push(error);
|
|
122
|
+
// By severity
|
|
123
|
+
errorsBySeverity[error.severity].push(error);
|
|
124
|
+
}
|
|
125
|
+
// Check if all systems failed
|
|
126
|
+
const failedSystems = Object.keys(errorsBySystem);
|
|
127
|
+
const allSystemsFailed = expectedSystems.every((system)=>failedSystems.includes(system));
|
|
128
|
+
// Check for critical errors
|
|
129
|
+
const hasCriticalErrors = errorsBySeverity["critical"].length > 0;
|
|
130
|
+
return {
|
|
131
|
+
totalErrors: this.errors.length,
|
|
132
|
+
errorsBySystem,
|
|
133
|
+
errorsBySeverity,
|
|
134
|
+
allErrors: [
|
|
135
|
+
...this.errors
|
|
136
|
+
],
|
|
137
|
+
correlationId: this.correlationId,
|
|
138
|
+
allSystemsFailed,
|
|
139
|
+
hasCriticalErrors
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Determine error severity
|
|
144
|
+
*/ determineSeverity(error) {
|
|
145
|
+
switch(error.code){
|
|
146
|
+
case DatabaseErrorCode.CONNECTION_FAILED:
|
|
147
|
+
case DatabaseErrorCode.TRANSACTION_FAILED:
|
|
148
|
+
return "critical";
|
|
149
|
+
case DatabaseErrorCode.QUERY_FAILED:
|
|
150
|
+
case DatabaseErrorCode.TIMEOUT:
|
|
151
|
+
return "high";
|
|
152
|
+
case DatabaseErrorCode.VALIDATION_FAILED:
|
|
153
|
+
case DatabaseErrorCode.CONSTRAINT_VIOLATION:
|
|
154
|
+
return "medium";
|
|
155
|
+
case DatabaseErrorCode.NOT_FOUND:
|
|
156
|
+
case DatabaseErrorCode.DUPLICATE_KEY:
|
|
157
|
+
return "low";
|
|
158
|
+
default:
|
|
159
|
+
return "medium";
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Check if errors should cause operation failure
|
|
164
|
+
*/ shouldFailOperation(expectedSystems) {
|
|
165
|
+
const result = this.getResult(expectedSystems);
|
|
166
|
+
// Fail if all systems failed
|
|
167
|
+
if (result.allSystemsFailed) {
|
|
168
|
+
return true;
|
|
169
|
+
}
|
|
170
|
+
// Fail if any critical errors
|
|
171
|
+
if (result.hasCriticalErrors) {
|
|
172
|
+
return true;
|
|
173
|
+
}
|
|
174
|
+
return false;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Create error report
|
|
178
|
+
*/ createReport() {
|
|
179
|
+
const result = this.getResult([]);
|
|
180
|
+
const lines = [
|
|
181
|
+
'=== Error Aggregation Report ===',
|
|
182
|
+
`Correlation ID: ${this.correlationId}`,
|
|
183
|
+
`Total Errors: ${result.totalErrors}`,
|
|
184
|
+
`All Systems Failed: ${result.allSystemsFailed}`,
|
|
185
|
+
`Critical Errors: ${result.hasCriticalErrors}`,
|
|
186
|
+
'',
|
|
187
|
+
'--- Errors by System ---'
|
|
188
|
+
];
|
|
189
|
+
for (const [system, errors] of Object.entries(result.errorsBySystem)){
|
|
190
|
+
lines.push(`${system}: ${errors.length} error(s)`);
|
|
191
|
+
for (const error of errors){
|
|
192
|
+
lines.push(` - [${error.severity}] ${error.error.message}`);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
lines.push('');
|
|
196
|
+
lines.push('--- Errors by Severity ---');
|
|
197
|
+
for (const [severity, errors] of Object.entries(result.errorsBySeverity)){
|
|
198
|
+
if (errors.length > 0) {
|
|
199
|
+
lines.push(`${severity}: ${errors.length} error(s)`);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
lines.push('');
|
|
203
|
+
lines.push('--- Circuit Breaker Status ---');
|
|
204
|
+
const allMetrics = CircuitBreakerRegistry.getAllMetrics();
|
|
205
|
+
for (const [system, metrics] of Object.entries(allMetrics)){
|
|
206
|
+
lines.push(`${system}: ${metrics.state} (failures: ${metrics.failures}, successes: ${metrics.successes})`);
|
|
207
|
+
}
|
|
208
|
+
return lines.join('\n');
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Get correlation ID
|
|
212
|
+
*/ getCorrelationId() {
|
|
213
|
+
return this.correlationId;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Reset aggregator (for reuse)
|
|
217
|
+
*/ reset() {
|
|
218
|
+
this.errors = [];
|
|
219
|
+
this.correlationId = uuidv4();
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Get circuit breaker state for system
|
|
223
|
+
*/ getCircuitBreakerState(system) {
|
|
224
|
+
const breaker = CircuitBreakerRegistry.get(system);
|
|
225
|
+
return breaker?.getState() || CircuitBreakerState.CLOSED;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Create error aggregator
|
|
230
|
+
*/ export function createErrorAggregator(correlationId, circuitBreakerConfig) {
|
|
231
|
+
return new ErrorAggregator(correlationId, circuitBreakerConfig);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
//# sourceMappingURL=error-aggregator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/error-aggregator.ts"],"sourcesContent":["/**\r\n * Error Aggregation System\r\n *\r\n * Provides error aggregation, correlation tracking, and circuit breaker patterns\r\n * for multi-database operations.\r\n *\r\n * Features:\r\n * - Aggregates errors from multiple database systems\r\n * - Tracks error correlation across operations\r\n * - Implements circuit breaker for repeated failures\r\n * - Provides error analysis and reporting\r\n *\r\n * Part of: Critical Error Handling Fixes (Architecture Review)\r\n */\r\n\r\nimport { DatabaseError, DatabaseErrorCode } from './database-service/types.js';\r\nimport { createLogger, Logger } from './logging.js';\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport {\r\n CircuitBreakerState,\r\n CircuitBreakerConfig,\r\n CircuitBreakerRegistry,\r\n} from './circuit-breaker.js';\r\n\r\n// Re-export circuit breaker types for backward compatibility\r\nexport { CircuitBreakerState, CircuitBreakerConfig };\r\n\r\n/**\r\n * Error severity levels\r\n */\r\nexport enum ErrorSeverity {\r\n LOW = 'low',\r\n MEDIUM = 'medium',\r\n HIGH = 'high',\r\n CRITICAL = 'critical',\r\n}\r\n\r\n/**\r\n * Aggregated error with context\r\n */\r\nexport interface AggregatedError {\r\n /** Unique correlation ID for tracking */\r\n correlationId: string;\r\n /** Timestamp when error occurred */\r\n timestamp: Date;\r\n /** Database system that failed */\r\n system: string;\r\n /** Original database error */\r\n error: DatabaseError;\r\n /** Error severity */\r\n severity: ErrorSeverity;\r\n /** Operation context */\r\n operationContext?: Record<string, any>;\r\n /** Stack trace */\r\n stackTrace?: string;\r\n}\r\n\r\n/**\r\n * Error aggregation result\r\n */\r\nexport interface ErrorAggregationResult {\r\n /** Total number of errors */\r\n totalErrors: number;\r\n /** Errors by system */\r\n errorsBySystem: Record<string, AggregatedError[]>;\r\n /** Errors by severity */\r\n errorsBySeverity: Record<ErrorSeverity, AggregatedError[]>;\r\n /** All aggregated errors */\r\n allErrors: AggregatedError[];\r\n /** Correlation ID for this aggregation */\r\n correlationId: string;\r\n /** Whether all systems failed */\r\n allSystemsFailed: boolean;\r\n /** Whether any critical errors occurred */\r\n hasCriticalErrors: boolean;\r\n}\r\n\r\n// Circuit breaker types now imported from ./circuit-breaker module\r\n\r\n/**\r\n * Error aggregator class\r\n */\r\nexport class ErrorAggregator {\r\n private logger: Logger;\r\n private errors: AggregatedError[] = [];\r\n private correlationId: string;\r\n private circuitBreakerConfig: Partial<CircuitBreakerConfig>;\r\n\r\n constructor(\r\n correlationId?: string,\r\n circuitBreakerConfig?: Partial<CircuitBreakerConfig>\r\n ) {\r\n this.correlationId = correlationId || uuidv4();\r\n this.logger = createLogger('error-aggregator');\r\n\r\n // Store circuit breaker configuration for registry\r\n this.circuitBreakerConfig = {\r\n failureThreshold: circuitBreakerConfig?.failureThreshold ?? 5,\r\n successThreshold: circuitBreakerConfig?.successThreshold ?? 2,\r\n timeout: circuitBreakerConfig?.timeout ?? 60000,\r\n windowSize: circuitBreakerConfig?.windowSize ?? 120000,\r\n };\r\n }\r\n\r\n /**\r\n * Add error to aggregation\r\n */\r\n addError(\r\n system: string,\r\n error: DatabaseError,\r\n operationContext?: Record<string, any>\r\n ): AggregatedError {\r\n const aggregatedError: AggregatedError = {\r\n correlationId: uuidv4(),\r\n timestamp: new Date(),\r\n system,\r\n error,\r\n severity: this.determineSeverity(error),\r\n operationContext,\r\n stackTrace: error.originalError?.stack,\r\n };\r\n\r\n this.errors.push(aggregatedError);\r\n\r\n // Update circuit breaker\r\n this.recordFailure(system);\r\n\r\n // Log error with correlation ID\r\n this.logger.error(\r\n 'Database operation failed',\r\n error.originalError,\r\n {\r\n correlationId: this.correlationId,\r\n errorCorrelationId: aggregatedError.correlationId,\r\n system,\r\n errorCode: error.code,\r\n message: error.message,\r\n severity: aggregatedError.severity,\r\n }\r\n );\r\n\r\n return aggregatedError;\r\n }\r\n\r\n /**\r\n * Record successful operation (for circuit breaker)\r\n */\r\n recordSuccess(system: string): void {\r\n // Use circuit breaker registry - success is tracked automatically via execute()\r\n // This method is kept for backward compatibility but delegates to registry\r\n const breaker = CircuitBreakerRegistry.getOrCreate(system, this.circuitBreakerConfig);\r\n // Success tracking is handled internally by CircuitBreaker.execute()\r\n // This is just a manual success recording for compatibility\r\n this.logger.debug('Manual success recorded', { system, correlationId: this.correlationId });\r\n }\r\n\r\n /**\r\n * Record failed operation (for circuit breaker)\r\n */\r\n private recordFailure(system: string): void {\r\n // Failure tracking is handled by the circuit breaker registry\r\n // This is called when addError is invoked\r\n const breaker = CircuitBreakerRegistry.getOrCreate(system, this.circuitBreakerConfig);\r\n this.logger.debug('Failure recorded via error aggregation', {\r\n system,\r\n state: breaker.getState(),\r\n correlationId: this.correlationId,\r\n });\r\n }\r\n\r\n /**\r\n * Check if circuit breaker allows operation\r\n */\r\n isCircuitOpen(system: string): boolean {\r\n const breaker = CircuitBreakerRegistry.get(system);\r\n return breaker ? !breaker.isHealthy() : false;\r\n }\r\n\r\n /**\r\n * Get aggregation result\r\n */\r\n getResult(expectedSystems: string[]): ErrorAggregationResult {\r\n const errorsBySystem: Record<string, AggregatedError[]> = {};\r\n const errorsBySeverity: Record<ErrorSeverity, AggregatedError[]> = {\r\n [ErrorSeverity.LOW]: [],\r\n [ErrorSeverity.MEDIUM]: [],\r\n [ErrorSeverity.HIGH]: [],\r\n [ErrorSeverity.CRITICAL]: [],\r\n };\r\n\r\n // Group errors\r\n for (const error of this.errors) {\r\n // By system\r\n if (!errorsBySystem[error.system]) {\r\n errorsBySystem[error.system] = [];\r\n }\r\n errorsBySystem[error.system].push(error);\r\n\r\n // By severity\r\n errorsBySeverity[error.severity].push(error);\r\n }\r\n\r\n // Check if all systems failed\r\n const failedSystems = Object.keys(errorsBySystem);\r\n const allSystemsFailed = expectedSystems.every(system =>\r\n failedSystems.includes(system)\r\n );\r\n\r\n // Check for critical errors\r\n const hasCriticalErrors = errorsBySeverity[ErrorSeverity.CRITICAL].length > 0;\r\n\r\n return {\r\n totalErrors: this.errors.length,\r\n errorsBySystem,\r\n errorsBySeverity,\r\n allErrors: [...this.errors],\r\n correlationId: this.correlationId,\r\n allSystemsFailed,\r\n hasCriticalErrors,\r\n };\r\n }\r\n\r\n /**\r\n * Determine error severity\r\n */\r\n private determineSeverity(error: DatabaseError): ErrorSeverity {\r\n switch (error.code) {\r\n case DatabaseErrorCode.CONNECTION_FAILED:\r\n case DatabaseErrorCode.TRANSACTION_FAILED:\r\n return ErrorSeverity.CRITICAL;\r\n\r\n case DatabaseErrorCode.QUERY_FAILED:\r\n case DatabaseErrorCode.TIMEOUT:\r\n return ErrorSeverity.HIGH;\r\n\r\n case DatabaseErrorCode.VALIDATION_FAILED:\r\n case DatabaseErrorCode.CONSTRAINT_VIOLATION:\r\n return ErrorSeverity.MEDIUM;\r\n\r\n case DatabaseErrorCode.NOT_FOUND:\r\n case DatabaseErrorCode.DUPLICATE_KEY:\r\n return ErrorSeverity.LOW;\r\n\r\n default:\r\n return ErrorSeverity.MEDIUM;\r\n }\r\n }\r\n\r\n /**\r\n * Check if errors should cause operation failure\r\n */\r\n shouldFailOperation(expectedSystems: string[]): boolean {\r\n const result = this.getResult(expectedSystems);\r\n\r\n // Fail if all systems failed\r\n if (result.allSystemsFailed) {\r\n return true;\r\n }\r\n\r\n // Fail if any critical errors\r\n if (result.hasCriticalErrors) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Create error report\r\n */\r\n createReport(): string {\r\n const result = this.getResult([]);\r\n const lines: string[] = [\r\n '=== Error Aggregation Report ===',\r\n `Correlation ID: ${this.correlationId}`,\r\n `Total Errors: ${result.totalErrors}`,\r\n `All Systems Failed: ${result.allSystemsFailed}`,\r\n `Critical Errors: ${result.hasCriticalErrors}`,\r\n '',\r\n '--- Errors by System ---',\r\n ];\r\n\r\n for (const [system, errors] of Object.entries(result.errorsBySystem)) {\r\n lines.push(`${system}: ${errors.length} error(s)`);\r\n for (const error of errors) {\r\n lines.push(` - [${error.severity}] ${error.error.message}`);\r\n }\r\n }\r\n\r\n lines.push('');\r\n lines.push('--- Errors by Severity ---');\r\n for (const [severity, errors] of Object.entries(result.errorsBySeverity)) {\r\n if (errors.length > 0) {\r\n lines.push(`${severity}: ${errors.length} error(s)`);\r\n }\r\n }\r\n\r\n lines.push('');\r\n lines.push('--- Circuit Breaker Status ---');\r\n const allMetrics = CircuitBreakerRegistry.getAllMetrics();\r\n for (const [system, metrics] of Object.entries(allMetrics)) {\r\n lines.push(\r\n `${system}: ${metrics.state} (failures: ${metrics.failures}, successes: ${metrics.successes})`\r\n );\r\n }\r\n\r\n return lines.join('\\n');\r\n }\r\n\r\n /**\r\n * Get correlation ID\r\n */\r\n getCorrelationId(): string {\r\n return this.correlationId;\r\n }\r\n\r\n /**\r\n * Reset aggregator (for reuse)\r\n */\r\n reset(): void {\r\n this.errors = [];\r\n this.correlationId = uuidv4();\r\n }\r\n\r\n /**\r\n * Get circuit breaker state for system\r\n */\r\n getCircuitBreakerState(system: string): CircuitBreakerState {\r\n const breaker = CircuitBreakerRegistry.get(system);\r\n return breaker?.getState() || CircuitBreakerState.CLOSED;\r\n }\r\n}\r\n\r\n/**\r\n * Create error aggregator\r\n */\r\nexport function createErrorAggregator(\r\n correlationId?: string,\r\n circuitBreakerConfig?: Partial<CircuitBreakerConfig>\r\n): ErrorAggregator {\r\n return new ErrorAggregator(correlationId, circuitBreakerConfig);\r\n}\r\n"],"names":["DatabaseErrorCode","createLogger","v4","uuidv4","CircuitBreakerState","CircuitBreakerConfig","CircuitBreakerRegistry","ErrorSeverity","ErrorAggregator","logger","errors","correlationId","circuitBreakerConfig","failureThreshold","successThreshold","timeout","windowSize","addError","system","error","operationContext","aggregatedError","timestamp","Date","severity","determineSeverity","stackTrace","originalError","stack","push","recordFailure","errorCorrelationId","errorCode","code","message","recordSuccess","breaker","getOrCreate","debug","state","getState","isCircuitOpen","get","isHealthy","getResult","expectedSystems","errorsBySystem","errorsBySeverity","failedSystems","Object","keys","allSystemsFailed","every","includes","hasCriticalErrors","length","totalErrors","allErrors","CONNECTION_FAILED","TRANSACTION_FAILED","QUERY_FAILED","TIMEOUT","VALIDATION_FAILED","CONSTRAINT_VIOLATION","NOT_FOUND","DUPLICATE_KEY","shouldFailOperation","result","createReport","lines","entries","allMetrics","getAllMetrics","metrics","failures","successes","join","getCorrelationId","reset","getCircuitBreakerState","CLOSED","createErrorAggregator"],"mappings":"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"}
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standard Error Utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides standardized error handling with typed error codes and context.
|
|
5
|
+
* Part of Task 0.5: Implementation Tooling & Utilities (Foundation)
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* throw createError(ErrorCode.VALIDATION_FAILED, 'Invalid input', { field: 'email' });
|
|
9
|
+
* if (isErrorCode(error, ErrorCode.RETRY_EXHAUSTED)) { ... }
|
|
10
|
+
*/ /**
|
|
11
|
+
* Generic error codes (extends DatabaseErrorCode)
|
|
12
|
+
*/ export var ErrorCode = /*#__PURE__*/ function(ErrorCode) {
|
|
13
|
+
// Database error codes (re-exported for convenience)
|
|
14
|
+
ErrorCode["DB_CONNECTION_FAILED"] = "DB_CONNECTION_FAILED";
|
|
15
|
+
ErrorCode["DB_QUERY_FAILED"] = "DB_QUERY_FAILED";
|
|
16
|
+
ErrorCode["DB_TRANSACTION_FAILED"] = "DB_TRANSACTION_FAILED";
|
|
17
|
+
ErrorCode["DB_VALIDATION_FAILED"] = "DB_VALIDATION_FAILED";
|
|
18
|
+
ErrorCode["DB_NOT_FOUND"] = "DB_NOT_FOUND";
|
|
19
|
+
ErrorCode["DB_DUPLICATE_KEY"] = "DB_DUPLICATE_KEY";
|
|
20
|
+
ErrorCode["DB_TIMEOUT"] = "DB_TIMEOUT";
|
|
21
|
+
ErrorCode["DB_CONSTRAINT_VIOLATION"] = "DB_CONSTRAINT_VIOLATION";
|
|
22
|
+
ErrorCode["DB_UNKNOWN_ERROR"] = "DB_UNKNOWN_ERROR";
|
|
23
|
+
// Generic error codes (new in Task 0.5)
|
|
24
|
+
ErrorCode["RETRY_EXHAUSTED"] = "RETRY_EXHAUSTED";
|
|
25
|
+
ErrorCode["LOCK_TIMEOUT"] = "LOCK_TIMEOUT";
|
|
26
|
+
ErrorCode["VALIDATION_FAILED"] = "VALIDATION_FAILED";
|
|
27
|
+
ErrorCode["INVALID_INPUT"] = "INVALID_INPUT";
|
|
28
|
+
ErrorCode["FILE_NOT_FOUND"] = "FILE_NOT_FOUND";
|
|
29
|
+
ErrorCode["FILE_WRITE_FAILED"] = "FILE_WRITE_FAILED";
|
|
30
|
+
ErrorCode["OPERATION_TIMEOUT"] = "OPERATION_TIMEOUT";
|
|
31
|
+
ErrorCode["NETWORK_ERROR"] = "NETWORK_ERROR";
|
|
32
|
+
ErrorCode["PARSE_ERROR"] = "PARSE_ERROR";
|
|
33
|
+
ErrorCode["CONFIGURATION_ERROR"] = "CONFIGURATION_ERROR";
|
|
34
|
+
ErrorCode["UNKNOWN_ERROR"] = "UNKNOWN_ERROR";
|
|
35
|
+
return ErrorCode;
|
|
36
|
+
}({});
|
|
37
|
+
/**
|
|
38
|
+
* Standard error class with typed error codes and context
|
|
39
|
+
*/ export class StandardError extends Error {
|
|
40
|
+
/**
|
|
41
|
+
* Error code for programmatic error handling
|
|
42
|
+
*/ code;
|
|
43
|
+
/**
|
|
44
|
+
* Additional context about the error
|
|
45
|
+
*/ context;
|
|
46
|
+
/**
|
|
47
|
+
* Timestamp when error was created
|
|
48
|
+
*/ timestamp;
|
|
49
|
+
/**
|
|
50
|
+
* Original error that caused this error (if any)
|
|
51
|
+
*/ cause;
|
|
52
|
+
/**
|
|
53
|
+
* Whether this error is retryable (for retry logic)
|
|
54
|
+
*/ isRetryable;
|
|
55
|
+
/**
|
|
56
|
+
* Create a new StandardError
|
|
57
|
+
*
|
|
58
|
+
* @param code - Error code
|
|
59
|
+
* @param message - Human-readable error message
|
|
60
|
+
* @param context - Additional context about the error
|
|
61
|
+
* @param cause - Original error that caused this error
|
|
62
|
+
* @param isRetryable - Whether this error is retryable (auto-detected if not provided)
|
|
63
|
+
*/ constructor(code, message, context, cause, isRetryable){
|
|
64
|
+
super(message);
|
|
65
|
+
this.name = 'StandardError';
|
|
66
|
+
this.code = code;
|
|
67
|
+
this.context = context;
|
|
68
|
+
this.timestamp = new Date();
|
|
69
|
+
this.cause = cause;
|
|
70
|
+
// Auto-detect retryable status if not explicitly provided
|
|
71
|
+
if (isRetryable !== undefined) {
|
|
72
|
+
this.isRetryable = isRetryable;
|
|
73
|
+
} else {
|
|
74
|
+
this.isRetryable = this.detectRetryable(code);
|
|
75
|
+
}
|
|
76
|
+
// Maintain proper stack trace for where our error was thrown (V8 only)
|
|
77
|
+
if (Error.captureStackTrace) {
|
|
78
|
+
Error.captureStackTrace(this, StandardError);
|
|
79
|
+
}
|
|
80
|
+
// Append original error stack if available
|
|
81
|
+
if (cause && cause.stack) {
|
|
82
|
+
this.stack = `${this.stack}\nCaused by: ${cause.stack}`;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Auto-detect if error code indicates retryable condition
|
|
87
|
+
*/ detectRetryable(code) {
|
|
88
|
+
const retryableCodes = [
|
|
89
|
+
"DB_TIMEOUT",
|
|
90
|
+
"DB_CONNECTION_FAILED",
|
|
91
|
+
"OPERATION_TIMEOUT",
|
|
92
|
+
"NETWORK_ERROR",
|
|
93
|
+
"LOCK_TIMEOUT"
|
|
94
|
+
];
|
|
95
|
+
return retryableCodes.includes(code);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Convert error to JSON representation
|
|
99
|
+
*/ toJSON() {
|
|
100
|
+
return {
|
|
101
|
+
name: this.name,
|
|
102
|
+
code: this.code,
|
|
103
|
+
message: this.message,
|
|
104
|
+
context: this.context,
|
|
105
|
+
timestamp: this.timestamp.toISOString(),
|
|
106
|
+
isRetryable: this.isRetryable,
|
|
107
|
+
stack: this.stack,
|
|
108
|
+
cause: this.cause ? {
|
|
109
|
+
name: this.cause.name,
|
|
110
|
+
message: this.cause.message,
|
|
111
|
+
stack: this.cause.stack
|
|
112
|
+
} : undefined
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Convert error to string representation
|
|
117
|
+
*/ toString() {
|
|
118
|
+
let str = `${this.name} [${this.code}]: ${this.message}`;
|
|
119
|
+
if (this.context && Object.keys(this.context).length > 0) {
|
|
120
|
+
str += `\nContext: ${JSON.stringify(this.context, null, 2)}`;
|
|
121
|
+
}
|
|
122
|
+
if (this.cause) {
|
|
123
|
+
str += `\nCaused by: ${this.cause.message}`;
|
|
124
|
+
}
|
|
125
|
+
return str;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Create a StandardError instance
|
|
130
|
+
*
|
|
131
|
+
* @param code - Error code
|
|
132
|
+
* @param message - Human-readable error message
|
|
133
|
+
* @param context - Additional context about the error
|
|
134
|
+
* @param cause - Original error that caused this error
|
|
135
|
+
* @returns StandardError instance
|
|
136
|
+
*/ export function createError(code, message, context, cause) {
|
|
137
|
+
return new StandardError(code, message, context, cause);
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Check if an error has a specific error code
|
|
141
|
+
*
|
|
142
|
+
* @param error - Error to check
|
|
143
|
+
* @param code - Error code to match
|
|
144
|
+
* @returns True if error has the specified code
|
|
145
|
+
*/ export function isErrorCode(error, code) {
|
|
146
|
+
if (!error) {
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
// Check StandardError
|
|
150
|
+
if (error instanceof StandardError) {
|
|
151
|
+
return error.code === code;
|
|
152
|
+
}
|
|
153
|
+
// Check DatabaseError pattern (object with code property)
|
|
154
|
+
if (typeof error === 'object' && 'code' in error) {
|
|
155
|
+
return error.code === code;
|
|
156
|
+
}
|
|
157
|
+
return false;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Check if error is a StandardError instance
|
|
161
|
+
*
|
|
162
|
+
* @param error - Error to check
|
|
163
|
+
* @returns True if error is a StandardError
|
|
164
|
+
*/ export function isStandardError(error) {
|
|
165
|
+
return error instanceof StandardError;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Wrap an unknown error into a StandardError
|
|
169
|
+
*
|
|
170
|
+
* @param error - Unknown error to wrap
|
|
171
|
+
* @param code - Error code to use (default: UNKNOWN_ERROR)
|
|
172
|
+
* @param context - Additional context
|
|
173
|
+
* @returns StandardError instance
|
|
174
|
+
*/ export function wrapError(error, code = "UNKNOWN_ERROR", context) {
|
|
175
|
+
if (error instanceof StandardError) {
|
|
176
|
+
// Already a StandardError, return as-is or with additional context
|
|
177
|
+
if (context) {
|
|
178
|
+
return new StandardError(error.code, error.message, {
|
|
179
|
+
...error.context,
|
|
180
|
+
...context
|
|
181
|
+
}, error.cause);
|
|
182
|
+
}
|
|
183
|
+
return error;
|
|
184
|
+
}
|
|
185
|
+
if (error instanceof Error) {
|
|
186
|
+
return new StandardError(code, error.message, context, error);
|
|
187
|
+
}
|
|
188
|
+
// Handle non-Error objects
|
|
189
|
+
const message = typeof error === 'string' ? error : String(error);
|
|
190
|
+
return new StandardError(code, message, context);
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Extract error message from unknown error
|
|
194
|
+
*
|
|
195
|
+
* @param error - Unknown error
|
|
196
|
+
* @returns Error message string
|
|
197
|
+
*/ export function getErrorMessage(error) {
|
|
198
|
+
if (error instanceof Error) {
|
|
199
|
+
return error.message;
|
|
200
|
+
}
|
|
201
|
+
if (typeof error === 'string') {
|
|
202
|
+
return error;
|
|
203
|
+
}
|
|
204
|
+
if (error && typeof error === 'object' && 'message' in error) {
|
|
205
|
+
return String(error.message);
|
|
206
|
+
}
|
|
207
|
+
return String(error);
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Extract error code from unknown error
|
|
211
|
+
*
|
|
212
|
+
* @param error - Unknown error
|
|
213
|
+
* @returns Error code or undefined
|
|
214
|
+
*/ export function getErrorCode(error) {
|
|
215
|
+
if (error instanceof StandardError) {
|
|
216
|
+
return error.code;
|
|
217
|
+
}
|
|
218
|
+
if (error && typeof error === 'object' && 'code' in error) {
|
|
219
|
+
return String(error.code);
|
|
220
|
+
}
|
|
221
|
+
return undefined;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Check if error indicates a retryable condition
|
|
225
|
+
*
|
|
226
|
+
* @param error - Error to check
|
|
227
|
+
* @returns True if error is retryable
|
|
228
|
+
*/ export function isRetryableError(error) {
|
|
229
|
+
// Check StandardError with isRetryable flag
|
|
230
|
+
if (error instanceof StandardError) {
|
|
231
|
+
return error.isRetryable;
|
|
232
|
+
}
|
|
233
|
+
// Fallback: check error code for retryable codes
|
|
234
|
+
const retryableCodes = [
|
|
235
|
+
"DB_TIMEOUT",
|
|
236
|
+
"DB_CONNECTION_FAILED",
|
|
237
|
+
"OPERATION_TIMEOUT",
|
|
238
|
+
"NETWORK_ERROR",
|
|
239
|
+
"LOCK_TIMEOUT"
|
|
240
|
+
];
|
|
241
|
+
if (typeof error === 'object' && 'code' in error) {
|
|
242
|
+
return retryableCodes.includes(error.code);
|
|
243
|
+
}
|
|
244
|
+
return false;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Create a validation error
|
|
248
|
+
*
|
|
249
|
+
* @param message - Validation error message
|
|
250
|
+
* @param field - Field that failed validation
|
|
251
|
+
* @param value - Invalid value (optional)
|
|
252
|
+
* @returns StandardError instance
|
|
253
|
+
*/ export function createValidationError(message, field, value) {
|
|
254
|
+
const context = {};
|
|
255
|
+
if (field) {
|
|
256
|
+
context.field = field;
|
|
257
|
+
}
|
|
258
|
+
if (value !== undefined) {
|
|
259
|
+
context.value = value;
|
|
260
|
+
}
|
|
261
|
+
return new StandardError("VALIDATION_FAILED", message, context);
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Create a retry exhausted error
|
|
265
|
+
*
|
|
266
|
+
* @param attempts - Number of retry attempts made
|
|
267
|
+
* @param lastError - Last error encountered
|
|
268
|
+
* @returns StandardError instance
|
|
269
|
+
*/ export function createRetryExhaustedError(attempts, lastError) {
|
|
270
|
+
return new StandardError("RETRY_EXHAUSTED", `Operation failed after ${attempts} retry attempts`, {
|
|
271
|
+
attempts
|
|
272
|
+
}, lastError);
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Create a timeout error
|
|
276
|
+
*
|
|
277
|
+
* @param operation - Operation that timed out
|
|
278
|
+
* @param timeoutMs - Timeout duration in milliseconds
|
|
279
|
+
* @returns StandardError instance
|
|
280
|
+
*/ export function createTimeoutError(operation, timeoutMs) {
|
|
281
|
+
return new StandardError("OPERATION_TIMEOUT", `Operation '${operation}' timed out after ${timeoutMs}ms`, {
|
|
282
|
+
operation,
|
|
283
|
+
timeoutMs
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/errors.ts"],"sourcesContent":["/**\r\n * Standard Error Utilities\r\n *\r\n * Provides standardized error handling with typed error codes and context.\r\n * Part of Task 0.5: Implementation Tooling & Utilities (Foundation)\r\n *\r\n * Usage:\r\n * throw createError(ErrorCode.VALIDATION_FAILED, 'Invalid input', { field: 'email' });\r\n * if (isErrorCode(error, ErrorCode.RETRY_EXHAUSTED)) { ... }\r\n */\r\n\r\nimport { DatabaseErrorCode } from './database-service/errors.js';\r\n\r\n/**\r\n * Generic error codes (extends DatabaseErrorCode)\r\n */\r\nexport enum ErrorCode {\r\n // Database error codes (re-exported for convenience)\r\n DB_CONNECTION_FAILED = 'DB_CONNECTION_FAILED',\r\n DB_QUERY_FAILED = 'DB_QUERY_FAILED',\r\n DB_TRANSACTION_FAILED = 'DB_TRANSACTION_FAILED',\r\n DB_VALIDATION_FAILED = 'DB_VALIDATION_FAILED',\r\n DB_NOT_FOUND = 'DB_NOT_FOUND',\r\n DB_DUPLICATE_KEY = 'DB_DUPLICATE_KEY',\r\n DB_TIMEOUT = 'DB_TIMEOUT',\r\n DB_CONSTRAINT_VIOLATION = 'DB_CONSTRAINT_VIOLATION',\r\n DB_UNKNOWN_ERROR = 'DB_UNKNOWN_ERROR',\r\n\r\n // Generic error codes (new in Task 0.5)\r\n RETRY_EXHAUSTED = 'RETRY_EXHAUSTED',\r\n LOCK_TIMEOUT = 'LOCK_TIMEOUT',\r\n VALIDATION_FAILED = 'VALIDATION_FAILED',\r\n INVALID_INPUT = 'INVALID_INPUT',\r\n FILE_NOT_FOUND = 'FILE_NOT_FOUND',\r\n FILE_WRITE_FAILED = 'FILE_WRITE_FAILED',\r\n OPERATION_TIMEOUT = 'OPERATION_TIMEOUT',\r\n NETWORK_ERROR = 'NETWORK_ERROR',\r\n PARSE_ERROR = 'PARSE_ERROR',\r\n CONFIGURATION_ERROR = 'CONFIGURATION_ERROR',\r\n UNKNOWN_ERROR = 'UNKNOWN_ERROR',\r\n}\r\n\r\n/**\r\n * Standard error class with typed error codes and context\r\n */\r\nexport class StandardError extends Error {\r\n /**\r\n * Error code for programmatic error handling\r\n */\r\n public readonly code: ErrorCode | string;\r\n\r\n /**\r\n * Additional context about the error\r\n */\r\n public readonly context?: Record<string, any>;\r\n\r\n /**\r\n * Timestamp when error was created\r\n */\r\n public readonly timestamp: Date;\r\n\r\n /**\r\n * Original error that caused this error (if any)\r\n */\r\n public readonly cause?: Error;\r\n\r\n /**\r\n * Whether this error is retryable (for retry logic)\r\n */\r\n public readonly isRetryable: boolean;\r\n\r\n /**\r\n * Create a new StandardError\r\n *\r\n * @param code - Error code\r\n * @param message - Human-readable error message\r\n * @param context - Additional context about the error\r\n * @param cause - Original error that caused this error\r\n * @param isRetryable - Whether this error is retryable (auto-detected if not provided)\r\n */\r\n constructor(\r\n code: ErrorCode | string,\r\n message: string,\r\n context?: Record<string, any>,\r\n cause?: Error,\r\n isRetryable?: boolean\r\n ) {\r\n super(message);\r\n this.name = 'StandardError';\r\n this.code = code;\r\n this.context = context;\r\n this.timestamp = new Date();\r\n this.cause = cause;\r\n\r\n // Auto-detect retryable status if not explicitly provided\r\n if (isRetryable !== undefined) {\r\n this.isRetryable = isRetryable;\r\n } else {\r\n this.isRetryable = this.detectRetryable(code);\r\n }\r\n\r\n // Maintain proper stack trace for where our error was thrown (V8 only)\r\n if (Error.captureStackTrace) {\r\n Error.captureStackTrace(this, StandardError);\r\n }\r\n\r\n // Append original error stack if available\r\n if (cause && cause.stack) {\r\n this.stack = `${this.stack}\\nCaused by: ${cause.stack}`;\r\n }\r\n }\r\n\r\n /**\r\n * Auto-detect if error code indicates retryable condition\r\n */\r\n private detectRetryable(code: ErrorCode | string): boolean {\r\n const retryableCodes = [\r\n ErrorCode.DB_TIMEOUT,\r\n ErrorCode.DB_CONNECTION_FAILED,\r\n ErrorCode.OPERATION_TIMEOUT,\r\n ErrorCode.NETWORK_ERROR,\r\n ErrorCode.LOCK_TIMEOUT,\r\n ];\r\n return retryableCodes.includes(code as ErrorCode);\r\n }\r\n\r\n /**\r\n * Convert error to JSON representation\r\n */\r\n toJSON(): Record<string, any> {\r\n return {\r\n name: this.name,\r\n code: this.code,\r\n message: this.message,\r\n context: this.context,\r\n timestamp: this.timestamp.toISOString(),\r\n isRetryable: this.isRetryable,\r\n stack: this.stack,\r\n cause: this.cause\r\n ? {\r\n name: this.cause.name,\r\n message: this.cause.message,\r\n stack: this.cause.stack,\r\n }\r\n : undefined,\r\n };\r\n }\r\n\r\n /**\r\n * Convert error to string representation\r\n */\r\n toString(): string {\r\n let str = `${this.name} [${this.code}]: ${this.message}`;\r\n\r\n if (this.context && Object.keys(this.context).length > 0) {\r\n str += `\\nContext: ${JSON.stringify(this.context, null, 2)}`;\r\n }\r\n\r\n if (this.cause) {\r\n str += `\\nCaused by: ${this.cause.message}`;\r\n }\r\n\r\n return str;\r\n }\r\n}\r\n\r\n/**\r\n * Create a StandardError instance\r\n *\r\n * @param code - Error code\r\n * @param message - Human-readable error message\r\n * @param context - Additional context about the error\r\n * @param cause - Original error that caused this error\r\n * @returns StandardError instance\r\n */\r\nexport function createError(\r\n code: ErrorCode | string,\r\n message: string,\r\n context?: Record<string, any>,\r\n cause?: Error\r\n): StandardError {\r\n return new StandardError(code, message, context, cause);\r\n}\r\n\r\n/**\r\n * Check if an error has a specific error code\r\n *\r\n * @param error - Error to check\r\n * @param code - Error code to match\r\n * @returns True if error has the specified code\r\n */\r\nexport function isErrorCode(error: any, code: ErrorCode | string): boolean {\r\n if (!error) {\r\n return false;\r\n }\r\n\r\n // Check StandardError\r\n if (error instanceof StandardError) {\r\n return error.code === code;\r\n }\r\n\r\n // Check DatabaseError pattern (object with code property)\r\n if (typeof error === 'object' && 'code' in error) {\r\n return error.code === code;\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * Check if error is a StandardError instance\r\n *\r\n * @param error - Error to check\r\n * @returns True if error is a StandardError\r\n */\r\nexport function isStandardError(error: any): error is StandardError {\r\n return error instanceof StandardError;\r\n}\r\n\r\n/**\r\n * Wrap an unknown error into a StandardError\r\n *\r\n * @param error - Unknown error to wrap\r\n * @param code - Error code to use (default: UNKNOWN_ERROR)\r\n * @param context - Additional context\r\n * @returns StandardError instance\r\n */\r\nexport function wrapError(\r\n error: unknown,\r\n code: ErrorCode | string = ErrorCode.UNKNOWN_ERROR,\r\n context?: Record<string, any>\r\n): StandardError {\r\n if (error instanceof StandardError) {\r\n // Already a StandardError, return as-is or with additional context\r\n if (context) {\r\n return new StandardError(\r\n error.code,\r\n error.message,\r\n { ...error.context, ...context },\r\n error.cause\r\n );\r\n }\r\n return error;\r\n }\r\n\r\n if (error instanceof Error) {\r\n return new StandardError(code, error.message, context, error);\r\n }\r\n\r\n // Handle non-Error objects\r\n const message = typeof error === 'string' ? error : String(error);\r\n return new StandardError(code, message, context);\r\n}\r\n\r\n/**\r\n * Extract error message from unknown error\r\n *\r\n * @param error - Unknown error\r\n * @returns Error message string\r\n */\r\nexport function getErrorMessage(error: unknown): string {\r\n if (error instanceof Error) {\r\n return error.message;\r\n }\r\n\r\n if (typeof error === 'string') {\r\n return error;\r\n }\r\n\r\n if (error && typeof error === 'object' && 'message' in error) {\r\n return String(error.message);\r\n }\r\n\r\n return String(error);\r\n}\r\n\r\n/**\r\n * Extract error code from unknown error\r\n *\r\n * @param error - Unknown error\r\n * @returns Error code or undefined\r\n */\r\nexport function getErrorCode(error: unknown): string | undefined {\r\n if (error instanceof StandardError) {\r\n return error.code;\r\n }\r\n\r\n if (error && typeof error === 'object' && 'code' in error) {\r\n return String(error.code);\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Check if error indicates a retryable condition\r\n *\r\n * @param error - Error to check\r\n * @returns True if error is retryable\r\n */\r\nexport function isRetryableError(error: any): boolean {\r\n // Check StandardError with isRetryable flag\r\n if (error instanceof StandardError) {\r\n return error.isRetryable;\r\n }\r\n\r\n // Fallback: check error code for retryable codes\r\n const retryableCodes = [\r\n ErrorCode.DB_TIMEOUT,\r\n ErrorCode.DB_CONNECTION_FAILED,\r\n ErrorCode.OPERATION_TIMEOUT,\r\n ErrorCode.NETWORK_ERROR,\r\n ErrorCode.LOCK_TIMEOUT,\r\n ];\r\n\r\n if (typeof error === 'object' && 'code' in error) {\r\n return retryableCodes.includes(error.code);\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * Create a validation error\r\n *\r\n * @param message - Validation error message\r\n * @param field - Field that failed validation\r\n * @param value - Invalid value (optional)\r\n * @returns StandardError instance\r\n */\r\nexport function createValidationError(\r\n message: string,\r\n field?: string,\r\n value?: any\r\n): StandardError {\r\n const context: Record<string, any> = {};\r\n\r\n if (field) {\r\n context.field = field;\r\n }\r\n\r\n if (value !== undefined) {\r\n context.value = value;\r\n }\r\n\r\n return new StandardError(ErrorCode.VALIDATION_FAILED, message, context);\r\n}\r\n\r\n/**\r\n * Create a retry exhausted error\r\n *\r\n * @param attempts - Number of retry attempts made\r\n * @param lastError - Last error encountered\r\n * @returns StandardError instance\r\n */\r\nexport function createRetryExhaustedError(\r\n attempts: number,\r\n lastError?: Error\r\n): StandardError {\r\n return new StandardError(\r\n ErrorCode.RETRY_EXHAUSTED,\r\n `Operation failed after ${attempts} retry attempts`,\r\n { attempts },\r\n lastError\r\n );\r\n}\r\n\r\n/**\r\n * Create a timeout error\r\n *\r\n * @param operation - Operation that timed out\r\n * @param timeoutMs - Timeout duration in milliseconds\r\n * @returns StandardError instance\r\n */\r\nexport function createTimeoutError(operation: string, timeoutMs: number): StandardError {\r\n return new StandardError(\r\n ErrorCode.OPERATION_TIMEOUT,\r\n `Operation '${operation}' timed out after ${timeoutMs}ms`,\r\n { operation, timeoutMs }\r\n );\r\n}\r\n"],"names":["ErrorCode","StandardError","Error","code","context","timestamp","cause","isRetryable","message","name","Date","undefined","detectRetryable","captureStackTrace","stack","retryableCodes","includes","toJSON","toISOString","toString","str","Object","keys","length","JSON","stringify","createError","isErrorCode","error","isStandardError","wrapError","String","getErrorMessage","getErrorCode","isRetryableError","createValidationError","field","value","createRetryExhaustedError","attempts","lastError","createTimeoutError","operation","timeoutMs"],"mappings":"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"}
|