claude-flow-novice 1.3.5 → 1.5.0
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/agents/analysis/code-analyzer.md +3 -20
- package/.claude/agents/analysis/code-review/analyze-code-quality.md +1 -1
- package/.claude/agents/analyst.md +300 -0
- package/.claude/agents/architect.md +557 -0
- package/.claude/agents/architecture/system-architect.md +630 -0
- package/.claude/agents/architecture/system-design/arch-system-design.md +1 -1
- package/.claude/agents/base-template-generator.md +24 -1
- package/.claude/agents/coder.md +180 -0
- package/.claude/agents/consensus/byzantine-coordinator.md +4 -21
- package/.claude/agents/consensus/consensus-builder.md +3 -20
- package/.claude/agents/consensus/crdt-synchronizer.md +4 -21
- package/.claude/agents/consensus/gossip-coordinator.md +4 -21
- package/.claude/agents/consensus/performance-benchmarker.md +4 -21
- package/.claude/agents/consensus/quorum-manager.md +4 -21
- package/.claude/agents/consensus/raft-manager.md +4 -21
- package/.claude/agents/consensus/security-manager.md +4 -21
- package/.claude/agents/coordinator.md +842 -0
- package/.claude/agents/data/ml/data-ml-model.md +2 -2
- package/.claude/agents/development/backend/dev-backend-api.md +2 -2
- package/.claude/agents/devops/ci-cd/ops-cicd-github.md +2 -2
- package/.claude/agents/devops/devops-engineer.md +638 -0
- package/.claude/agents/documentation/api-docs/docs-api-openapi.md +2 -2
- package/.claude/agents/github/code-review-swarm.md +1 -1
- package/.claude/agents/github/github-specialist.md +856 -0
- package/.claude/agents/github/pr-manager.md +1 -1
- package/.claude/agents/github/release-manager.md +1 -1
- package/.claude/agents/neural/neural-pattern-agent.md +762 -0
- package/.claude/agents/optimization/benchmark-suite.md +1 -1
- package/.claude/agents/optimization/perf-analyzer.md +725 -0
- package/.claude/agents/optimization/performance-monitor.md +1 -1
- package/.claude/agents/planner.md +135 -0
- package/.claude/agents/researcher.md +185 -0
- package/.claude/agents/reviewer.md +291 -0
- package/.claude/agents/security/security-specialist.md +978 -0
- package/.claude/agents/sparc/architecture.md +1 -1
- package/.claude/agents/sparc/pseudocode.md +1 -1
- package/.claude/agents/sparc/refinement.md +1 -1
- package/.claude/agents/sparc/specification.md +1 -1
- package/.claude/agents/specialized/mobile/spec-mobile-react-native.md +2 -2
- package/.claude/agents/swarm/adaptive-coordinator-enhanced.md +746 -0
- package/.claude/agents/tester.md +663 -0
- package/.claude/agents/testing/unit/tdd-london-swarm.md +1 -1
- package/.claude/agents/testing/validation/production-validator.md +1 -1
- package/.claude/commands/claude-soul.js +1 -1
- package/.claude/hooks.json +12 -15
- package/{.claude → .claude-flow-novice/.claude}/agents/MIGRATION_SUMMARY.md +1 -1
- package/.claude-flow-novice/.claude/agents/analysis/code-analyzer.md +192 -0
- package/.claude-flow-novice/.claude/agents/analysis/code-review/analyze-code-quality.md +180 -0
- package/.claude-flow-novice/.claude/agents/analyst.md +300 -0
- package/.claude-flow-novice/.claude/agents/architect.md +557 -0
- package/.claude-flow-novice/.claude/agents/architecture/system-architect.md +630 -0
- package/.claude-flow-novice/.claude/agents/architecture/system-design/arch-system-design.md +156 -0
- package/.claude-flow-novice/.claude/agents/backend-dev.json +42 -0
- package/.claude-flow-novice/.claude/agents/base-template-generator.md +65 -0
- package/.claude-flow-novice/.claude/agents/code-analyzer.json +39 -0
- package/.claude-flow-novice/.claude/agents/coder.json +42 -0
- package/.claude-flow-novice/.claude/agents/coder.md +180 -0
- package/.claude-flow-novice/.claude/agents/consensus/byzantine-coordinator.md +46 -0
- package/.claude-flow-novice/.claude/agents/consensus/consensus-builder.md +225 -0
- package/.claude-flow-novice/.claude/agents/consensus/crdt-synchronizer.md +980 -0
- package/.claude-flow-novice/.claude/agents/consensus/gossip-coordinator.md +46 -0
- package/.claude-flow-novice/.claude/agents/consensus/performance-benchmarker.md +834 -0
- package/.claude-flow-novice/.claude/agents/consensus/quorum-manager.md +806 -0
- package/.claude-flow-novice/.claude/agents/consensus/raft-manager.md +46 -0
- package/.claude-flow-novice/.claude/agents/consensus/security-manager.md +605 -0
- package/.claude-flow-novice/.claude/agents/coordinator.md +842 -0
- package/.claude-flow-novice/.claude/agents/data/ml/data-ml-model.md +193 -0
- package/.claude-flow-novice/.claude/agents/development/backend/dev-backend-api.md +142 -0
- package/.claude-flow-novice/.claude/agents/devops/ci-cd/ops-cicd-github.md +164 -0
- package/.claude-flow-novice/.claude/agents/devops/devops-engineer.md +638 -0
- package/.claude-flow-novice/.claude/agents/documentation/api-docs/docs-api-openapi.md +174 -0
- package/.claude-flow-novice/.claude/agents/github/code-review-swarm.md +538 -0
- package/.claude-flow-novice/.claude/agents/github/github-modes.md +173 -0
- package/.claude-flow-novice/.claude/agents/github/github-specialist.md +856 -0
- package/.claude-flow-novice/.claude/agents/github/issue-tracker.md +319 -0
- package/.claude-flow-novice/.claude/agents/github/multi-repo-swarm.md +553 -0
- package/.claude-flow-novice/.claude/agents/github/pr-manager.md +191 -0
- package/.claude-flow-novice/.claude/agents/github/project-board-sync.md +509 -0
- package/.claude-flow-novice/.claude/agents/github/release-manager.md +367 -0
- package/.claude-flow-novice/.claude/agents/github/release-swarm.md +583 -0
- package/.claude-flow-novice/.claude/agents/github/repo-architect.md +398 -0
- package/.claude-flow-novice/.claude/agents/github/swarm-issue.md +573 -0
- package/.claude-flow-novice/.claude/agents/github/swarm-pr.md +428 -0
- package/.claude-flow-novice/.claude/agents/github/sync-coordinator.md +452 -0
- package/.claude-flow-novice/.claude/agents/github/workflow-automation.md +635 -0
- package/.claude-flow-novice/.claude/agents/goal/goal-planner.md +73 -0
- package/.claude-flow-novice/.claude/agents/neural/neural-pattern-agent.md +762 -0
- package/.claude-flow-novice/.claude/agents/neural/safla-neural.md +74 -0
- package/.claude-flow-novice/.claude/agents/optimization/benchmark-suite.md +665 -0
- package/.claude-flow-novice/.claude/agents/optimization/load-balancer.md +431 -0
- package/.claude-flow-novice/.claude/agents/optimization/perf-analyzer.md +725 -0
- package/.claude-flow-novice/.claude/agents/optimization/performance-monitor.md +672 -0
- package/.claude-flow-novice/.claude/agents/optimization/resource-allocator.md +674 -0
- package/.claude-flow-novice/.claude/agents/optimization/topology-optimizer.md +808 -0
- package/.claude-flow-novice/.claude/agents/planner.json +41 -0
- package/.claude-flow-novice/.claude/agents/planner.md +135 -0
- package/.claude-flow-novice/.claude/agents/researcher.json +41 -0
- package/.claude-flow-novice/.claude/agents/researcher.md +185 -0
- package/.claude-flow-novice/.claude/agents/reviewer.json +39 -0
- package/.claude-flow-novice/.claude/agents/reviewer.md +291 -0
- package/.claude-flow-novice/.claude/agents/security/security-specialist.md +978 -0
- package/.claude-flow-novice/.claude/agents/sparc/architecture.md +472 -0
- package/.claude-flow-novice/.claude/agents/sparc/pseudocode.md +318 -0
- package/.claude-flow-novice/.claude/agents/sparc/refinement.md +525 -0
- package/.claude-flow-novice/.claude/agents/sparc/specification.md +276 -0
- package/.claude-flow-novice/.claude/agents/specialized/mobile/spec-mobile-react-native.md +226 -0
- package/.claude-flow-novice/.claude/agents/sublinear/consciousness-evolution-agent.md +499 -0
- package/.claude-flow-novice/.claude/agents/sublinear/matrix-solver-agent.md +113 -0
- package/.claude-flow-novice/.claude/agents/sublinear/nanosecond-scheduler-agent.md +644 -0
- package/.claude-flow-novice/.claude/agents/sublinear/pagerank-agent.md +699 -0
- package/.claude-flow-novice/.claude/agents/sublinear/phi-calculator-agent.md +749 -0
- package/.claude-flow-novice/.claude/agents/sublinear/psycho-symbolic-agent.md +543 -0
- package/.claude-flow-novice/.claude/agents/sublinear/sublinear.md +816 -0
- package/.claude-flow-novice/.claude/agents/sublinear/temporal-advantage-agent.md +360 -0
- package/.claude-flow-novice/.claude/agents/swarm/adaptive-coordinator-enhanced.md +746 -0
- package/.claude-flow-novice/.claude/agents/swarm/adaptive-coordinator.md +396 -0
- package/.claude-flow-novice/.claude/agents/swarm/hierarchical-coordinator.md +300 -0
- package/.claude-flow-novice/.claude/agents/swarm/mesh-coordinator.md +435 -0
- package/.claude-flow-novice/.claude/agents/system-architect.json +40 -0
- package/.claude-flow-novice/.claude/agents/templates/automation-smart-agent.md +205 -0
- package/.claude-flow-novice/.claude/agents/templates/coordinator-swarm-init.md +90 -0
- package/.claude-flow-novice/.claude/agents/templates/github-pr-manager.md +177 -0
- package/.claude-flow-novice/.claude/agents/templates/implementer-sparc-coder.md +259 -0
- package/.claude-flow-novice/.claude/agents/templates/memory-coordinator.md +187 -0
- package/.claude-flow-novice/.claude/agents/templates/migration-plan.md +746 -0
- package/.claude-flow-novice/.claude/agents/templates/orchestrator-task.md +139 -0
- package/.claude-flow-novice/.claude/agents/templates/performance-analyzer.md +199 -0
- package/.claude-flow-novice/.claude/agents/templates/sparc-coordinator.md +183 -0
- package/.claude-flow-novice/.claude/agents/tester.json +40 -0
- package/.claude-flow-novice/.claude/agents/tester.md +663 -0
- package/.claude-flow-novice/.claude/agents/testing/e2e/playwright-agent.md +249 -0
- package/.claude-flow-novice/.claude/agents/testing/unit/tdd-london-swarm.md +244 -0
- package/.claude-flow-novice/.claude/agents/testing/validation/production-validator.md +395 -0
- package/.claude-flow-novice/dist/index.js +12 -24
- package/.claude-flow-novice/dist/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/agents/agent-manager.js +123 -69
- package/.claude-flow-novice/dist/src/agents/agent-manager.js.map +1 -1
- package/.claude-flow-novice/dist/src/agents/github/utils/hook-integration.js +7 -7
- package/.claude-flow-novice/dist/src/agents/github/utils/hook-integration.js.map +1 -1
- package/.claude-flow-novice/dist/src/agents/stage3-integration-validator.js +485 -0
- package/.claude-flow-novice/dist/src/agents/stage3-integration-validator.js.map +1 -0
- package/.claude-flow-novice/dist/src/agents/unified-ultra-fast-agent-manager.js +630 -0
- package/.claude-flow-novice/dist/src/agents/unified-ultra-fast-agent-manager.js.map +1 -0
- package/.claude-flow-novice/dist/src/cli/commands/agent.js +1 -1
- package/.claude-flow-novice/dist/src/cli/commands/agent.js.map +1 -1
- package/.claude-flow-novice/dist/src/cli/commands/config-integration.js +6 -6
- package/.claude-flow-novice/dist/src/cli/commands/enterprise.js +18 -18
- package/.claude-flow-novice/dist/src/cli/commands/enterprise.js.map +1 -1
- package/.claude-flow-novice/dist/src/cli/commands/goal-init.js +4 -4
- package/.claude-flow-novice/dist/src/cli/commands/help-new.js +23 -23
- package/.claude-flow-novice/dist/src/cli/commands/help-new.js.map +1 -1
- package/.claude-flow-novice/dist/src/cli/commands/help.js +74 -74
- package/.claude-flow-novice/dist/src/cli/commands/help.js.map +1 -1
- package/.claude-flow-novice/dist/src/cli/commands/hive-mind/pause.js +2 -2
- package/.claude-flow-novice/dist/src/cli/commands/hive-mind/pause.js.map +1 -1
- package/.claude-flow-novice/dist/src/cli/commands/hive.js +4 -4
- package/.claude-flow-novice/dist/src/cli/commands/index.js +103 -132
- package/.claude-flow-novice/dist/src/cli/commands/index.js.map +1 -1
- package/.claude-flow-novice/dist/src/cli/commands/mcp.js +1 -1
- package/.claude-flow-novice/dist/src/cli/commands/migrate.js +4 -4
- package/.claude-flow-novice/dist/src/cli/commands/migrate.js.map +1 -1
- package/.claude-flow-novice/dist/src/cli/commands/monitor.js +1 -1
- package/.claude-flow-novice/dist/src/cli/commands/neural-init.js +4 -4
- package/.claude-flow-novice/dist/src/cli/commands/ruv-swarm.js +8 -8
- package/.claude-flow-novice/dist/src/cli/commands/sparc.js +12 -12
- package/.claude-flow-novice/dist/src/cli/commands/sparc.js.map +1 -1
- package/.claude-flow-novice/dist/src/cli/commands/start/start-command.js +3 -3
- package/.claude-flow-novice/dist/src/cli/commands/status.js +1 -1
- package/.claude-flow-novice/dist/src/cli/commands/swarm.js +7 -7
- package/.claude-flow-novice/dist/src/cli/commands/swarm.js.map +1 -1
- package/.claude-flow-novice/dist/src/cli/commands/verification.js +18 -18
- package/.claude-flow-novice/dist/src/cli/completion.js +54 -54
- package/.claude-flow-novice/dist/src/cli/completion.js.map +1 -1
- package/.claude-flow-novice/dist/src/cli/consolidated/ConsolidatedCLI.js +11 -11
- package/.claude-flow-novice/dist/src/cli/consolidated/ConsolidatedCLI.js.map +1 -1
- package/.claude-flow-novice/dist/src/cli/consolidated/core/CommandHandlers.js +31 -31
- package/.claude-flow-novice/dist/src/cli/consolidated/core/TierManager.js +39 -39
- package/.claude-flow-novice/dist/src/cli/consolidated/core/TierManager.js.map +1 -1
- package/.claude-flow-novice/dist/src/cli/consolidated/help/InteractiveHelp.js +25 -25
- package/.claude-flow-novice/dist/src/cli/consolidated/help/InteractiveHelp.js.map +1 -1
- package/.claude-flow-novice/dist/src/cli/consolidated/routing/CommandRouter.js +8 -8
- package/.claude-flow-novice/dist/src/cli/consolidated/routing/CommandRouter.js.map +1 -1
- package/.claude-flow-novice/dist/src/cli/consolidated/utils/IntelligentDefaults.js +6 -6
- package/.claude-flow-novice/dist/src/cli/consolidated/utils/IntelligentDefaults.js.map +1 -1
- package/.claude-flow-novice/dist/src/cli/consolidated/utils/PerformanceOptimizer.js +7 -7
- package/.claude-flow-novice/dist/src/cli/consolidated/utils/PerformanceOptimizer.js.map +1 -1
- package/.claude-flow-novice/dist/src/cli/index-remote.js +10 -10
- package/.claude-flow-novice/dist/src/cli/index.js +1 -1
- package/.claude-flow-novice/dist/src/cli/init/directory-structure.js +8 -8
- package/.claude-flow-novice/dist/src/cli/init/index.js +3 -3
- package/.claude-flow-novice/dist/src/cli/init/sparc-environment.js +67 -67
- package/.claude-flow-novice/dist/src/cli/init/swarm-commands.js +18 -18
- package/.claude-flow-novice/dist/src/cli/node-repl.js +2 -2
- package/.claude-flow-novice/dist/src/cli/repl.js +1 -1
- package/.claude-flow-novice/dist/src/cli/simple-cli.js +68 -68
- package/.claude-flow-novice/dist/src/cli/simple-cli.js.map +1 -1
- package/.claude-flow-novice/dist/src/cli/simple-commands/session-start-soul.js +271 -0
- package/.claude-flow-novice/dist/src/cli/simple-orchestrator.js +7 -7
- package/.claude-flow-novice/dist/src/cli/simple-orchestrator.js.map +1 -1
- package/.claude-flow-novice/dist/src/cli/ui/fallback-handler.js +7 -7
- package/.claude-flow-novice/dist/src/communication/enhanced-event-bus.js +816 -0
- package/.claude-flow-novice/dist/src/communication/enhanced-event-bus.js.map +1 -0
- package/.claude-flow-novice/dist/src/communication/failure-recovery-system.js +812 -0
- package/.claude-flow-novice/dist/src/communication/failure-recovery-system.js.map +1 -0
- package/.claude-flow-novice/dist/src/communication/optimized-serialization.js +369 -0
- package/.claude-flow-novice/dist/src/communication/optimized-serialization.js.map +1 -0
- package/.claude-flow-novice/dist/src/communication/performance-optimizations.js +526 -0
- package/.claude-flow-novice/dist/src/communication/performance-optimizations.js.map +1 -0
- package/.claude-flow-novice/dist/src/communication/performance-validator.js +532 -0
- package/.claude-flow-novice/dist/src/communication/performance-validator.js.map +1 -0
- package/.claude-flow-novice/dist/src/communication/priority-message-queue.js +525 -0
- package/.claude-flow-novice/dist/src/communication/priority-message-queue.js.map +1 -0
- package/.claude-flow-novice/dist/src/communication/shared-buffer-bus.js +218 -0
- package/.claude-flow-novice/dist/src/communication/shared-buffer-bus.js.map +1 -0
- package/.claude-flow-novice/dist/src/communication/ultra-fast-communication-bus.js +521 -0
- package/.claude-flow-novice/dist/src/communication/ultra-fast-communication-bus.js.map +1 -0
- package/.claude-flow-novice/dist/src/communication/ultra-fast-serialization.js +563 -0
- package/.claude-flow-novice/dist/src/communication/ultra-fast-serialization.js.map +1 -0
- package/.claude-flow-novice/dist/src/communication/websocket-cluster.js +344 -0
- package/.claude-flow-novice/dist/src/communication/websocket-cluster.js.map +1 -0
- package/.claude-flow-novice/dist/src/communication/zero-copy-structures.js +369 -0
- package/.claude-flow-novice/dist/src/communication/zero-copy-structures.js.map +1 -0
- package/.claude-flow-novice/dist/src/config/config-manager.js +1 -1
- package/.claude-flow-novice/dist/src/config/config-manager.js.map +1 -1
- package/.claude-flow-novice/dist/src/config/core/intelligent-configuration-manager.js +1 -1
- package/.claude-flow-novice/dist/src/config/integration/hooks-integration.js +6 -6
- package/.claude-flow-novice/dist/src/config/integration/hooks-integration.js.map +1 -1
- package/.claude-flow-novice/dist/src/config/migration/config-migration.js +1 -1
- package/.claude-flow-novice/dist/src/config/ruv-swarm-integration.js +1 -1
- package/.claude-flow-novice/dist/src/config/utils/zero-config-setup.js +1 -1
- package/.claude-flow-novice/dist/src/config/utils/zero-config-setup.js.map +1 -1
- package/.claude-flow-novice/dist/src/config/web-portal-config.js +0 -9
- package/.claude-flow-novice/dist/src/config/web-portal-config.js.map +1 -1
- package/.claude-flow-novice/dist/src/config/zero-config-setup.js +18 -18
- package/.claude-flow-novice/dist/src/config/zero-config-setup.js.map +1 -1
- package/.claude-flow-novice/dist/src/core/logger.js +33 -10
- package/.claude-flow-novice/dist/src/core/logger.js.map +1 -1
- package/.claude-flow-novice/dist/src/migration/index.js +1 -1
- package/.claude-flow-novice/dist/src/migration/index.js.map +1 -1
- package/.claude-flow-novice/dist/src/migration/migration-runner.js +4 -4
- package/.claude-flow-novice/dist/src/migration/migration-runner.js.map +1 -1
- package/.claude-flow-novice/dist/src/monitoring/agent-health-monitor.js +430 -0
- package/.claude-flow-novice/dist/src/monitoring/agent-health-monitor.js.map +1 -0
- package/.claude-flow-novice/dist/src/slash-commands/claude-soul.js +248 -365
- package/.claude-flow-novice/dist/src/slash-commands/register-all-commands.js +1 -1
- package/.claude-flow-novice/dist/src/swarm/claude-code-interface.js +1 -1
- package/.claude-flow-novice/dist/src/swarm/claude-flow-executor.js +1 -1
- package/.claude-flow-novice/dist/src/swarm/consensus-coordinator.js +471 -0
- package/.claude-flow-novice/dist/src/swarm/consensus-coordinator.js.map +1 -0
- package/.claude-flow-novice/dist/src/swarm/hive-mind-integration.js +1 -1
- package/.claude-flow-novice/dist/src/swarm/large-scale-coordinator.js +543 -0
- package/.claude-flow-novice/dist/src/swarm/large-scale-coordinator.js.map +1 -0
- package/.claude-flow-novice/dist/src/swarm/optimizations/connection-pool.js +1 -1
- package/.claude-flow-novice/dist/src/swarm/optimizations/optimized-executor.js +1 -1
- package/.claude-flow-novice/dist/src/swarm/types.js.map +1 -1
- package/.claude-flow-novice/dist/src/swarm-fullstack/integrations/communication-bridge.js +709 -0
- package/.claude-flow-novice/dist/src/swarm-fullstack/integrations/communication-bridge.js.map +1 -0
- package/.claude-flow-novice/dist/src/swarm-fullstack/testing/api-contract-validator.js +612 -0
- package/.claude-flow-novice/dist/src/swarm-fullstack/testing/api-contract-validator.js.map +1 -0
- package/.claude-flow-novice/dist/src/swarm-fullstack/testing/backend-test-orchestrator.js +679 -0
- package/.claude-flow-novice/dist/src/swarm-fullstack/testing/backend-test-orchestrator.js.map +1 -0
- package/.claude-flow-novice/dist/src/swarm-fullstack/testing/frontend-test-orchestrator.js +654 -0
- package/.claude-flow-novice/dist/src/swarm-fullstack/testing/frontend-test-orchestrator.js.map +1 -0
- package/.claude-flow-novice/dist/src/swarm-fullstack/testing/visual-regression.js +402 -0
- package/.claude-flow-novice/dist/src/swarm-fullstack/testing/visual-regression.js.map +1 -0
- package/.claude-flow-novice/dist/src/swarm-fullstack/workflows/convergence-detector.js +459 -0
- package/.claude-flow-novice/dist/src/swarm-fullstack/workflows/convergence-detector.js.map +1 -0
- package/.claude-flow-novice/dist/src/swarm-fullstack/workflows/fix-coordinator.js +513 -0
- package/.claude-flow-novice/dist/src/swarm-fullstack/workflows/fix-coordinator.js.map +1 -0
- package/.claude-flow-novice/dist/src/swarm-fullstack/workflows/index.js +19 -0
- package/.claude-flow-novice/dist/src/swarm-fullstack/workflows/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/swarm-fullstack/workflows/iterative-build-test.js +568 -0
- package/.claude-flow-novice/dist/src/swarm-fullstack/workflows/iterative-build-test.js.map +1 -0
- package/.claude-flow-novice/dist/src/swarm-fullstack/workflows/regression-test-manager.js +418 -0
- package/.claude-flow-novice/dist/src/swarm-fullstack/workflows/regression-test-manager.js.map +1 -0
- package/.claude-flow-novice/dist/src/swarm-fullstack/workflows/test-result-analyzer.js +530 -0
- package/.claude-flow-novice/dist/src/swarm-fullstack/workflows/test-result-analyzer.js.map +1 -0
- package/.claude-flow-novice/dist/src/swarm-fullstack/workflows/workflow-metrics.js +250 -0
- package/.claude-flow-novice/dist/src/swarm-fullstack/workflows/workflow-metrics.js.map +1 -0
- package/.claude-flow-novice/dist/src/task/index.js +7 -7
- package/.claude-flow-novice/dist/src/validation/fullstack-integration-validator.js +420 -0
- package/.claude-flow-novice/dist/src/validation/fullstack-integration-validator.js.map +1 -0
- package/.claude-flow-novice/dist/src/validation/production-validator.js +1435 -0
- package/.claude-flow-novice/dist/src/validation/production-validator.js.map +1 -0
- package/.claude-flow-novice/dist/src/verification/cli-integration.js +3 -3
- package/.claude-flow-novice/dist/src/verification/hooks.js +1 -1
- package/CHANGELOG.md +13 -0
- package/CLAUDE.md +1032 -61
- package/README.md +0 -1
- package/config/build/babel.config.cjs +19 -11
- package/config/typescript/tsconfig.json +1 -1
- package/examples/02-workflows/claude-workflow.json +5 -5
- package/examples/claude-api-error-handling.ts +2 -2
- package/examples/frontend-testing-demo.ts +470 -0
- package/examples/litellm/config/config.yaml +1 -1
- package/package.json +13 -7
- package/scripts/build/unified-builder.sh +6 -6
- package/scripts/build/validate-agents.js +238 -0
- package/scripts/post-install-claude-md.js +28 -0
- package/scripts/run-production-validation.ts +590 -0
- package/scripts/test/test-coordination-features.ts +2 -2
- package/scripts/validate-stage3-performance.ts +377 -0
- package/src/cli/simple-commands/hooks.js +1 -0
- package/src/cli/simple-commands/init/agent-copier.js +0 -2
- package/src/cli/simple-commands/init/index.js +18 -110
- package/src/cli/simple-commands/init/templates/CLAUDE.md +162 -1158
- package/src/cli/simple-commands/init/templates/claude-md.js +38 -157
- package/src/swarm-fullstack/integrations/communication-bridge.ts +931 -0
- package/src/swarm-fullstack/testing/api-contract-validator.ts +909 -0
- package/src/swarm-fullstack/testing/backend-test-orchestrator.ts +791 -0
- package/src/swarm-fullstack/testing/frontend-test-orchestrator.ts +853 -0
- package/src/swarm-fullstack/testing/visual-regression.ts +507 -0
- package/src/swarm-fullstack/workflows/convergence-detector.ts +736 -0
- package/src/swarm-fullstack/workflows/fix-coordinator.ts +677 -0
- package/src/swarm-fullstack/workflows/index.ts +75 -0
- package/src/swarm-fullstack/workflows/iterative-build-test.ts +829 -0
- package/src/swarm-fullstack/workflows/regression-test-manager.ts +590 -0
- package/src/swarm-fullstack/workflows/test-result-analyzer.ts +739 -0
- package/src/swarm-fullstack/workflows/workflow-metrics.ts +399 -0
- package/wiki/command-reference/README.md +1 -2
- package/wiki/command-reference/mcp-tools/README.md +1 -1
- package/wiki/getting-started/claude-code-mcp/README.md +1 -2
- package/wiki/getting-started/installation/README.md +2 -10
- package/.claude/agents/backend-dev.json +0 -9
- package/.claude/agents/code-analyzer.json +0 -9
- package/.claude/agents/coder.json +0 -9
- package/.claude/agents/planner.json +0 -9
- package/.claude/agents/researcher.json +0 -9
- package/.claude/agents/reviewer.json +0 -9
- package/.claude/agents/system-architect.json +0 -9
- package/.claude/agents/tester.json +0 -9
- package/.claude/commands/flow-nexus/app-store.md +0 -124
- package/.claude/commands/flow-nexus/challenges.md +0 -120
- package/.claude/commands/flow-nexus/login-registration.md +0 -65
- package/.claude/commands/flow-nexus/neural-network.md +0 -134
- package/.claude/commands/flow-nexus/payments.md +0 -116
- package/.claude/commands/flow-nexus/sandbox.md +0 -83
- package/.claude/commands/flow-nexus/swarm.md +0 -87
- package/.claude/commands/flow-nexus/user-tools.md +0 -152
- package/.claude/commands/flow-nexus/workflow.md +0 -115
- package/.claude-flow-novice/dist/cli/index.js +0 -45
- package/.claude-flow-novice/dist/core/index.js +0 -22
- package/.claude-flow-novice/dist/mcp/mcp-server-novice.js +0 -595
- package/.claude-flow-novice/dist/mcp/mcp-server-sdk.js +0 -649
- package/.claude-flow-novice/dist/mcp/mcp-server-with-slash-commands.js +0 -776
- package/.claude-flow-novice/dist/src/cli/simple-commands/init/templates/claude-md.js +0 -1101
- package/src/cli/simple-commands/init/templates/CLAUDE.md.optimized +0 -265
- /package/{.claude → .claude-flow-novice/.claude}/agents/README.md +0 -0
- /package/{.claude → .claude-flow-novice/.claude}/agents/consensus/README.md +0 -0
- /package/{.claude → .claude-flow-novice/.claude}/agents/core/coder.md +0 -0
- /package/{.claude → .claude-flow-novice/.claude}/agents/core/planner.md +0 -0
- /package/{.claude → .claude-flow-novice/.claude}/agents/core/researcher.md +0 -0
- /package/{.claude → .claude-flow-novice/.claude}/agents/core/reviewer.md +0 -0
- /package/{.claude → .claude-flow-novice/.claude}/agents/core/tester.md +0 -0
- /package/{.claude → .claude-flow-novice/.claude}/agents/optimization/README.md +0 -0
- /package/{.claude → .claude-flow-novice/.claude}/agents/swarm/README.md +0 -0
|
@@ -0,0 +1,812 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Comprehensive Failure Recovery and Dead Letter Queue System
|
|
3
|
+
*
|
|
4
|
+
* Advanced failure handling for ultra-reliable agent communication:
|
|
5
|
+
* - Multi-tier dead letter queues with exponential backoff
|
|
6
|
+
* - Circuit breaker pattern for failing agents
|
|
7
|
+
* - Automatic retry mechanisms with intelligent delays
|
|
8
|
+
* - Failure analysis and root cause detection
|
|
9
|
+
* - Recovery orchestration and health monitoring
|
|
10
|
+
* - Poison message detection and quarantine
|
|
11
|
+
*
|
|
12
|
+
* Performance Targets:
|
|
13
|
+
* - Failure detection: <100 microseconds
|
|
14
|
+
* - Recovery initiation: <1 millisecond
|
|
15
|
+
* - Message redelivery: <5 milliseconds
|
|
16
|
+
* - Availability: >99.99% uptime
|
|
17
|
+
*/ import { EventEmitter } from 'node:events';
|
|
18
|
+
import { performance } from 'perf_hooks';
|
|
19
|
+
import { LockFreeRingBuffer } from '../memory/lock-free-structures.js';
|
|
20
|
+
export var FailureType = /*#__PURE__*/ function(FailureType) {
|
|
21
|
+
FailureType["NETWORK_TIMEOUT"] = "network_timeout";
|
|
22
|
+
FailureType["AGENT_UNAVAILABLE"] = "agent_unavailable";
|
|
23
|
+
FailureType["MESSAGE_CORRUPTION"] = "message_corruption";
|
|
24
|
+
FailureType["DESERIALIZATION_ERROR"] = "deserialization_error";
|
|
25
|
+
FailureType["CIRCUIT_BREAKER_OPEN"] = "circuit_breaker_open";
|
|
26
|
+
FailureType["QUOTA_EXCEEDED"] = "quota_exceeded";
|
|
27
|
+
FailureType["POISON_MESSAGE"] = "poison_message";
|
|
28
|
+
FailureType["UNKNOWN_ERROR"] = "unknown_error";
|
|
29
|
+
return FailureType;
|
|
30
|
+
}({});
|
|
31
|
+
export var CircuitState = /*#__PURE__*/ function(CircuitState) {
|
|
32
|
+
CircuitState["CLOSED"] = "closed";
|
|
33
|
+
CircuitState["OPEN"] = "open";
|
|
34
|
+
CircuitState["HALF_OPEN"] = "half_open";
|
|
35
|
+
return CircuitState;
|
|
36
|
+
}({});
|
|
37
|
+
export var RecoveryActionType = /*#__PURE__*/ function(RecoveryActionType) {
|
|
38
|
+
RecoveryActionType["RESTART_AGENT"] = "restart_agent";
|
|
39
|
+
RecoveryActionType["RESET_CONNECTION"] = "reset_connection";
|
|
40
|
+
RecoveryActionType["INCREASE_TIMEOUT"] = "increase_timeout";
|
|
41
|
+
RecoveryActionType["REDUCE_LOAD"] = "reduce_load";
|
|
42
|
+
RecoveryActionType["SWITCH_ENDPOINT"] = "switch_endpoint";
|
|
43
|
+
RecoveryActionType["QUARANTINE_MESSAGES"] = "quarantine_messages";
|
|
44
|
+
return RecoveryActionType;
|
|
45
|
+
}({});
|
|
46
|
+
export var RecoveryStatus = /*#__PURE__*/ function(RecoveryStatus) {
|
|
47
|
+
RecoveryStatus["PENDING"] = "pending";
|
|
48
|
+
RecoveryStatus["IN_PROGRESS"] = "in_progress";
|
|
49
|
+
RecoveryStatus["COMPLETED"] = "completed";
|
|
50
|
+
RecoveryStatus["FAILED"] = "failed";
|
|
51
|
+
RecoveryStatus["CANCELLED"] = "cancelled";
|
|
52
|
+
return RecoveryStatus;
|
|
53
|
+
}({});
|
|
54
|
+
/**
|
|
55
|
+
* Comprehensive failure recovery system
|
|
56
|
+
*/ export class FailureRecoverySystem extends EventEmitter {
|
|
57
|
+
config;
|
|
58
|
+
memoryStore;
|
|
59
|
+
priorityQueue;
|
|
60
|
+
// Core components
|
|
61
|
+
sharedBuffer;
|
|
62
|
+
deadLetterQueues = new Map();
|
|
63
|
+
circuitBreakers = new Map();
|
|
64
|
+
poisonMessages = new Set();
|
|
65
|
+
recoveryActions = new Map();
|
|
66
|
+
// Processing engines
|
|
67
|
+
retryEngine;
|
|
68
|
+
circuitBreakerManager;
|
|
69
|
+
poisonDetector;
|
|
70
|
+
healthMonitor;
|
|
71
|
+
recoveryOrchestrator;
|
|
72
|
+
// Metrics and monitoring
|
|
73
|
+
metrics;
|
|
74
|
+
alertManager;
|
|
75
|
+
// Processing workers
|
|
76
|
+
processingWorkers = [];
|
|
77
|
+
isRunning = false;
|
|
78
|
+
constructor(config, memoryStore, priorityQueue){
|
|
79
|
+
super();
|
|
80
|
+
this.config = {
|
|
81
|
+
maxDeadLetterSize: 100000,
|
|
82
|
+
dlqRetentionPeriod: 24 * 60 * 60 * 1000,
|
|
83
|
+
maxRetryAttempts: 5,
|
|
84
|
+
initialRetryDelay: 1000,
|
|
85
|
+
maxRetryDelay: 300000,
|
|
86
|
+
backoffMultiplier: 2,
|
|
87
|
+
enableCircuitBreaker: true,
|
|
88
|
+
failureThreshold: 5,
|
|
89
|
+
recoveryTimeout: 60000,
|
|
90
|
+
halfOpenMaxCalls: 3,
|
|
91
|
+
enablePoisonDetection: true,
|
|
92
|
+
poisonThreshold: 3,
|
|
93
|
+
poisonQuarantinePeriod: 60 * 60 * 1000,
|
|
94
|
+
healthCheckInterval: 30000,
|
|
95
|
+
agentTimeoutThreshold: 10000,
|
|
96
|
+
enableAutomaticRecovery: true,
|
|
97
|
+
sharedBufferSize: 64 * 1024 * 1024,
|
|
98
|
+
processingThreads: 4,
|
|
99
|
+
batchSize: 100,
|
|
100
|
+
enableMetrics: true,
|
|
101
|
+
enableAlerting: true,
|
|
102
|
+
alertThresholds: {
|
|
103
|
+
highFailureRate: 0.1,
|
|
104
|
+
highRetryRate: 0.05,
|
|
105
|
+
longRecoveryTime: 60000,
|
|
106
|
+
poisonMessageRate: 0.01 // 1%
|
|
107
|
+
},
|
|
108
|
+
...config
|
|
109
|
+
};
|
|
110
|
+
this.memoryStore = memoryStore;
|
|
111
|
+
this.priorityQueue = priorityQueue;
|
|
112
|
+
this.initializeComponents();
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Initialize failure recovery components
|
|
116
|
+
*/ initializeComponents() {
|
|
117
|
+
// Initialize shared memory
|
|
118
|
+
this.sharedBuffer = new SharedArrayBuffer(this.config.sharedBufferSize);
|
|
119
|
+
// Initialize dead letter queues for each failure type
|
|
120
|
+
let offset = 4096; // Reserve space for headers
|
|
121
|
+
for (const failureType of Object.values(FailureType)){
|
|
122
|
+
const dlq = new LockFreeRingBuffer(this.sharedBuffer, offset, 8 * 1024 * 1024 // 8MB per DLQ
|
|
123
|
+
);
|
|
124
|
+
this.deadLetterQueues.set(failureType, dlq);
|
|
125
|
+
offset += 8 * 1024 * 1024;
|
|
126
|
+
}
|
|
127
|
+
// Initialize processing engines
|
|
128
|
+
this.retryEngine = new RetryEngine(this.config, this.memoryStore);
|
|
129
|
+
this.circuitBreakerManager = new CircuitBreakerManager(this.config);
|
|
130
|
+
this.poisonDetector = new PoisonMessageDetector(this.config);
|
|
131
|
+
this.healthMonitor = new AgentHealthMonitor(this.config);
|
|
132
|
+
this.recoveryOrchestrator = new RecoveryOrchestrator(this.config);
|
|
133
|
+
// Initialize metrics
|
|
134
|
+
this.metrics = {
|
|
135
|
+
totalFailures: BigInt(0),
|
|
136
|
+
failuresByType: new Map(),
|
|
137
|
+
totalRetries: BigInt(0),
|
|
138
|
+
successfulRetries: BigInt(0),
|
|
139
|
+
poisonMessages: BigInt(0),
|
|
140
|
+
circuitBreakerTrips: BigInt(0),
|
|
141
|
+
averageRecoveryTime: 0,
|
|
142
|
+
maxRecoveryTime: 0,
|
|
143
|
+
currentDlqSize: 0,
|
|
144
|
+
agentHealthStatus: new Map()
|
|
145
|
+
};
|
|
146
|
+
// Initialize failure type counters
|
|
147
|
+
for (const failureType of Object.values(FailureType)){
|
|
148
|
+
this.metrics.failuresByType.set(failureType, BigInt(0));
|
|
149
|
+
}
|
|
150
|
+
// Initialize alert manager
|
|
151
|
+
this.alertManager = new AlertManager(this.config);
|
|
152
|
+
// Create processing workers
|
|
153
|
+
for(let i = 0; i < this.config.processingThreads; i++){
|
|
154
|
+
this.processingWorkers.push(new FailureProcessor(i, this.deadLetterQueues, this.retryEngine, this.config));
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Start the failure recovery system
|
|
159
|
+
*/ async start() {
|
|
160
|
+
this.isRunning = true;
|
|
161
|
+
// Start processing workers
|
|
162
|
+
for (const worker of this.processingWorkers){
|
|
163
|
+
worker.start();
|
|
164
|
+
}
|
|
165
|
+
// Start health monitoring
|
|
166
|
+
this.healthMonitor.start();
|
|
167
|
+
// Start recovery orchestrator
|
|
168
|
+
this.recoveryOrchestrator.start();
|
|
169
|
+
// Start periodic cleanup
|
|
170
|
+
this.startPeriodicCleanup();
|
|
171
|
+
// Start metrics collection
|
|
172
|
+
if (this.config.enableMetrics) {
|
|
173
|
+
this.startMetricsCollection();
|
|
174
|
+
}
|
|
175
|
+
this.emit('recovery-system:started');
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Handle message delivery failure
|
|
179
|
+
*/ async handleFailure(message, agentId, error, failureType = "unknown_error") {
|
|
180
|
+
const startTime = performance.now();
|
|
181
|
+
try {
|
|
182
|
+
// Update circuit breaker
|
|
183
|
+
if (this.config.enableCircuitBreaker) {
|
|
184
|
+
this.circuitBreakerManager.recordFailure(agentId);
|
|
185
|
+
// Check if circuit breaker should open
|
|
186
|
+
if (this.circuitBreakerManager.shouldOpenCircuit(agentId)) {
|
|
187
|
+
failureType = "circuit_breaker_open";
|
|
188
|
+
await this.handleCircuitBreakerTrip(agentId);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// Check for poison message
|
|
192
|
+
if (this.config.enablePoisonDetection) {
|
|
193
|
+
const isPoisonMessage = this.poisonDetector.checkMessage(message, error);
|
|
194
|
+
if (isPoisonMessage) {
|
|
195
|
+
failureType = "poison_message";
|
|
196
|
+
await this.quarantinePoisonMessage(message);
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
// Create failed message entry
|
|
201
|
+
const failedMessage = {
|
|
202
|
+
id: this.generateFailureId(),
|
|
203
|
+
originalMessage: message,
|
|
204
|
+
failureType,
|
|
205
|
+
failureReason: error.message,
|
|
206
|
+
failureTimestamp: BigInt(Date.now() * 1000000),
|
|
207
|
+
retryCount: message.retryCount || 0,
|
|
208
|
+
nextRetryTime: this.calculateNextRetryTime(message.retryCount || 0),
|
|
209
|
+
agentId,
|
|
210
|
+
correlationId: message.correlationId,
|
|
211
|
+
stackTrace: error.stack,
|
|
212
|
+
metadata: new Map([
|
|
213
|
+
[
|
|
214
|
+
'errorName',
|
|
215
|
+
error.name
|
|
216
|
+
],
|
|
217
|
+
[
|
|
218
|
+
'processingTime',
|
|
219
|
+
performance.now() - startTime
|
|
220
|
+
]
|
|
221
|
+
])
|
|
222
|
+
};
|
|
223
|
+
// Add to appropriate dead letter queue
|
|
224
|
+
await this.addToDeadLetterQueue(failedMessage);
|
|
225
|
+
// Update metrics
|
|
226
|
+
this.updateFailureMetrics(failureType);
|
|
227
|
+
// Trigger recovery actions if needed
|
|
228
|
+
if (this.shouldTriggerRecovery(failureType, agentId)) {
|
|
229
|
+
await this.triggerRecoveryAction(agentId, failureType);
|
|
230
|
+
}
|
|
231
|
+
// Send alerts if thresholds exceeded
|
|
232
|
+
if (this.config.enableAlerting) {
|
|
233
|
+
this.alertManager.checkThresholds(this.metrics, failedMessage);
|
|
234
|
+
}
|
|
235
|
+
this.emit('failure:handled', {
|
|
236
|
+
failedMessage,
|
|
237
|
+
processingTime: performance.now() - startTime
|
|
238
|
+
});
|
|
239
|
+
} catch (error) {
|
|
240
|
+
console.error('Error handling failure:', error);
|
|
241
|
+
this.metrics.totalFailures++;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Add failed message to appropriate dead letter queue
|
|
246
|
+
*/ async addToDeadLetterQueue(failedMessage) {
|
|
247
|
+
const dlq = this.deadLetterQueues.get(failedMessage.failureType);
|
|
248
|
+
if (!dlq) {
|
|
249
|
+
throw new Error(`No DLQ found for failure type: ${failedMessage.failureType}`);
|
|
250
|
+
}
|
|
251
|
+
// Serialize failed message
|
|
252
|
+
const serializedMessage = this.serializeFailedMessage(failedMessage);
|
|
253
|
+
// Enqueue to DLQ
|
|
254
|
+
const success = dlq.enqueue(serializedMessage);
|
|
255
|
+
if (!success) {
|
|
256
|
+
// DLQ is full - implement overflow strategy
|
|
257
|
+
await this.handleDlqOverflow(failedMessage);
|
|
258
|
+
}
|
|
259
|
+
// Store in memory store for quick access
|
|
260
|
+
await this.memoryStore.set('failed-messages', failedMessage.id, failedMessage);
|
|
261
|
+
this.metrics.currentDlqSize++;
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Handle DLQ overflow
|
|
265
|
+
*/ async handleDlqOverflow(failedMessage) {
|
|
266
|
+
// Strategy 1: Remove oldest messages
|
|
267
|
+
const dlq = this.deadLetterQueues.get(failedMessage.failureType);
|
|
268
|
+
// Try to make space by removing oldest
|
|
269
|
+
const removed = dlq.dequeue();
|
|
270
|
+
if (removed) {
|
|
271
|
+
const oldMessage = this.deserializeFailedMessage(removed.data);
|
|
272
|
+
await this.memoryStore.delete('failed-messages', oldMessage.id);
|
|
273
|
+
this.metrics.currentDlqSize--;
|
|
274
|
+
}
|
|
275
|
+
// Retry adding the message
|
|
276
|
+
const serializedMessage = this.serializeFailedMessage(failedMessage);
|
|
277
|
+
const success = dlq.enqueue(serializedMessage);
|
|
278
|
+
if (!success) {
|
|
279
|
+
// Last resort: log and drop
|
|
280
|
+
console.error('Failed to add message to DLQ after overflow handling', {
|
|
281
|
+
messageId: failedMessage.id,
|
|
282
|
+
failureType: failedMessage.failureType
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Process retry attempts
|
|
288
|
+
*/ async processRetries() {
|
|
289
|
+
const now = BigInt(Date.now() * 1000000);
|
|
290
|
+
// Process each dead letter queue
|
|
291
|
+
for (const [failureType, dlq] of this.deadLetterQueues){
|
|
292
|
+
const batchSize = Math.min(this.config.batchSize, dlq.getStats().count);
|
|
293
|
+
for(let i = 0; i < batchSize; i++){
|
|
294
|
+
const entry = dlq.dequeue();
|
|
295
|
+
if (!entry) break;
|
|
296
|
+
const failedMessage = this.deserializeFailedMessage(entry.data);
|
|
297
|
+
// Check if retry time has arrived
|
|
298
|
+
if (failedMessage.nextRetryTime <= now) {
|
|
299
|
+
await this.attemptRetry(failedMessage);
|
|
300
|
+
} else {
|
|
301
|
+
// Put back in queue for later
|
|
302
|
+
dlq.enqueue(entry.data);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Attempt to retry a failed message
|
|
309
|
+
*/ async attemptRetry(failedMessage) {
|
|
310
|
+
const startTime = performance.now();
|
|
311
|
+
try {
|
|
312
|
+
// Check circuit breaker state
|
|
313
|
+
if (this.config.enableCircuitBreaker) {
|
|
314
|
+
const circuitState = this.circuitBreakerManager.getCircuitState(failedMessage.agentId);
|
|
315
|
+
if (circuitState === "open") {
|
|
316
|
+
// Circuit is open, delay retry
|
|
317
|
+
failedMessage.nextRetryTime = BigInt(Date.now() * 1000000) + BigInt(this.config.recoveryTimeout * 1000000);
|
|
318
|
+
await this.addToDeadLetterQueue(failedMessage);
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
// Check if max retries exceeded
|
|
323
|
+
if (failedMessage.retryCount >= this.config.maxRetryAttempts) {
|
|
324
|
+
await this.handleMaxRetriesExceeded(failedMessage);
|
|
325
|
+
return;
|
|
326
|
+
}
|
|
327
|
+
// Attempt redelivery
|
|
328
|
+
const success = await this.retryMessageDelivery(failedMessage);
|
|
329
|
+
if (success) {
|
|
330
|
+
// Retry successful
|
|
331
|
+
await this.handleSuccessfulRetry(failedMessage, performance.now() - startTime);
|
|
332
|
+
} else {
|
|
333
|
+
// Retry failed
|
|
334
|
+
await this.handleFailedRetry(failedMessage);
|
|
335
|
+
}
|
|
336
|
+
} catch (error) {
|
|
337
|
+
console.error('Error during retry attempt:', error);
|
|
338
|
+
await this.handleFailedRetry(failedMessage);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Retry message delivery
|
|
343
|
+
*/ async retryMessageDelivery(failedMessage) {
|
|
344
|
+
try {
|
|
345
|
+
// Update retry count
|
|
346
|
+
failedMessage.originalMessage.retryCount = failedMessage.retryCount + 1;
|
|
347
|
+
// Attempt to requeue the message
|
|
348
|
+
const messageId = await this.priorityQueue.enqueue(failedMessage.originalMessage.data, failedMessage.originalMessage.priority, {
|
|
349
|
+
deadline: failedMessage.originalMessage.deadline,
|
|
350
|
+
maxRetries: failedMessage.originalMessage.maxRetries
|
|
351
|
+
});
|
|
352
|
+
return !!messageId;
|
|
353
|
+
} catch (error) {
|
|
354
|
+
return false;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* Handle successful retry
|
|
359
|
+
*/ async handleSuccessfulRetry(failedMessage, recoveryTime) {
|
|
360
|
+
// Update circuit breaker
|
|
361
|
+
if (this.config.enableCircuitBreaker) {
|
|
362
|
+
this.circuitBreakerManager.recordSuccess(failedMessage.agentId);
|
|
363
|
+
}
|
|
364
|
+
// Update metrics
|
|
365
|
+
this.metrics.successfulRetries++;
|
|
366
|
+
this.updateRecoveryTimeMetrics(recoveryTime);
|
|
367
|
+
// Remove from memory store
|
|
368
|
+
await this.memoryStore.delete('failed-messages', failedMessage.id);
|
|
369
|
+
this.metrics.currentDlqSize--;
|
|
370
|
+
this.emit('retry:successful', {
|
|
371
|
+
failedMessage,
|
|
372
|
+
recoveryTime
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Handle failed retry
|
|
377
|
+
*/ async handleFailedRetry(failedMessage) {
|
|
378
|
+
// Increment retry count
|
|
379
|
+
failedMessage.retryCount++;
|
|
380
|
+
failedMessage.nextRetryTime = this.calculateNextRetryTime(failedMessage.retryCount);
|
|
381
|
+
// Add back to DLQ
|
|
382
|
+
await this.addToDeadLetterQueue(failedMessage);
|
|
383
|
+
this.emit('retry:failed', {
|
|
384
|
+
failedMessage
|
|
385
|
+
});
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* Handle max retries exceeded
|
|
389
|
+
*/ async handleMaxRetriesExceeded(failedMessage) {
|
|
390
|
+
// Move to permanent failure storage
|
|
391
|
+
await this.memoryStore.set('permanent-failures', failedMessage.id, {
|
|
392
|
+
...failedMessage,
|
|
393
|
+
finalFailureTime: BigInt(Date.now() * 1000000)
|
|
394
|
+
});
|
|
395
|
+
// Remove from active DLQ
|
|
396
|
+
await this.memoryStore.delete('failed-messages', failedMessage.id);
|
|
397
|
+
this.metrics.currentDlqSize--;
|
|
398
|
+
// Trigger alerting for permanent failure
|
|
399
|
+
if (this.config.enableAlerting) {
|
|
400
|
+
this.alertManager.sendPermanentFailureAlert(failedMessage);
|
|
401
|
+
}
|
|
402
|
+
this.emit('failure:permanent', {
|
|
403
|
+
failedMessage
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Handle circuit breaker trip
|
|
408
|
+
*/ async handleCircuitBreakerTrip(agentId) {
|
|
409
|
+
this.metrics.circuitBreakerTrips++;
|
|
410
|
+
// Schedule recovery action
|
|
411
|
+
if (this.config.enableAutomaticRecovery) {
|
|
412
|
+
const recoveryAction = {
|
|
413
|
+
id: this.generateRecoveryId(),
|
|
414
|
+
type: "reset_connection",
|
|
415
|
+
targetAgent: agentId,
|
|
416
|
+
parameters: new Map([
|
|
417
|
+
[
|
|
418
|
+
'reason',
|
|
419
|
+
'circuit_breaker_trip'
|
|
420
|
+
],
|
|
421
|
+
[
|
|
422
|
+
'failureThreshold',
|
|
423
|
+
this.config.failureThreshold
|
|
424
|
+
]
|
|
425
|
+
]),
|
|
426
|
+
scheduledTime: BigInt(Date.now() * 1000000) + BigInt(this.config.recoveryTimeout * 1000000),
|
|
427
|
+
status: "pending",
|
|
428
|
+
createdAt: BigInt(Date.now() * 1000000)
|
|
429
|
+
};
|
|
430
|
+
this.recoveryActions.set(recoveryAction.id, recoveryAction);
|
|
431
|
+
await this.recoveryOrchestrator.scheduleRecovery(recoveryAction);
|
|
432
|
+
}
|
|
433
|
+
this.emit('circuit-breaker:tripped', {
|
|
434
|
+
agentId
|
|
435
|
+
});
|
|
436
|
+
}
|
|
437
|
+
/**
|
|
438
|
+
* Quarantine poison message
|
|
439
|
+
*/ async quarantinePoisonMessage(message) {
|
|
440
|
+
this.poisonMessages.add(message.id);
|
|
441
|
+
this.metrics.poisonMessages++;
|
|
442
|
+
// Store in quarantine
|
|
443
|
+
await this.memoryStore.set('quarantine', message.id, {
|
|
444
|
+
message,
|
|
445
|
+
quarantineTime: BigInt(Date.now() * 1000000),
|
|
446
|
+
releaseTime: BigInt(Date.now() * 1000000) + BigInt(this.config.poisonQuarantinePeriod * 1000000)
|
|
447
|
+
});
|
|
448
|
+
this.emit('message:quarantined', {
|
|
449
|
+
messageId: message.id
|
|
450
|
+
});
|
|
451
|
+
}
|
|
452
|
+
/**
|
|
453
|
+
* Calculate next retry time with exponential backoff
|
|
454
|
+
*/ calculateNextRetryTime(retryCount) {
|
|
455
|
+
const delay = Math.min(this.config.initialRetryDelay * Math.pow(this.config.backoffMultiplier, retryCount), this.config.maxRetryDelay);
|
|
456
|
+
// Add jitter to prevent thundering herd
|
|
457
|
+
const jitter = Math.random() * 0.1; // 10% jitter
|
|
458
|
+
const finalDelay = delay * (1 + jitter);
|
|
459
|
+
return BigInt(Date.now() * 1000000) + BigInt(finalDelay * 1000000);
|
|
460
|
+
}
|
|
461
|
+
/**
|
|
462
|
+
* Determine if recovery action should be triggered
|
|
463
|
+
*/ shouldTriggerRecovery(failureType, agentId) {
|
|
464
|
+
// Check failure rate
|
|
465
|
+
const agentHealth = this.metrics.agentHealthStatus.get(agentId);
|
|
466
|
+
if (agentHealth && agentHealth.errorRate > this.config.alertThresholds.highFailureRate) {
|
|
467
|
+
return true;
|
|
468
|
+
}
|
|
469
|
+
// Check specific failure types
|
|
470
|
+
switch(failureType){
|
|
471
|
+
case "agent_unavailable":
|
|
472
|
+
case "network_timeout":
|
|
473
|
+
return true;
|
|
474
|
+
default:
|
|
475
|
+
return false;
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
/**
|
|
479
|
+
* Trigger recovery action for agent
|
|
480
|
+
*/ async triggerRecoveryAction(agentId, failureType) {
|
|
481
|
+
const actionType = this.selectRecoveryActionType(failureType);
|
|
482
|
+
const recoveryAction = {
|
|
483
|
+
id: this.generateRecoveryId(),
|
|
484
|
+
type: actionType,
|
|
485
|
+
targetAgent: agentId,
|
|
486
|
+
parameters: new Map([
|
|
487
|
+
[
|
|
488
|
+
'failureType',
|
|
489
|
+
failureType
|
|
490
|
+
],
|
|
491
|
+
[
|
|
492
|
+
'triggerTime',
|
|
493
|
+
Date.now()
|
|
494
|
+
]
|
|
495
|
+
]),
|
|
496
|
+
scheduledTime: BigInt(Date.now() * 1000000),
|
|
497
|
+
status: "pending",
|
|
498
|
+
createdAt: BigInt(Date.now() * 1000000)
|
|
499
|
+
};
|
|
500
|
+
this.recoveryActions.set(recoveryAction.id, recoveryAction);
|
|
501
|
+
await this.recoveryOrchestrator.executeRecovery(recoveryAction);
|
|
502
|
+
}
|
|
503
|
+
/**
|
|
504
|
+
* Select appropriate recovery action type
|
|
505
|
+
*/ selectRecoveryActionType(failureType) {
|
|
506
|
+
switch(failureType){
|
|
507
|
+
case "network_timeout":
|
|
508
|
+
return "increase_timeout";
|
|
509
|
+
case "agent_unavailable":
|
|
510
|
+
return "restart_agent";
|
|
511
|
+
case "circuit_breaker_open":
|
|
512
|
+
return "reset_connection";
|
|
513
|
+
case "poison_message":
|
|
514
|
+
return "quarantine_messages";
|
|
515
|
+
default:
|
|
516
|
+
return "reset_connection";
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
/**
|
|
520
|
+
* Start periodic cleanup of old entries
|
|
521
|
+
*/ startPeriodicCleanup() {
|
|
522
|
+
setInterval(()=>{
|
|
523
|
+
this.performCleanup();
|
|
524
|
+
}, 60000); // Run every minute
|
|
525
|
+
}
|
|
526
|
+
/**
|
|
527
|
+
* Perform cleanup of expired entries
|
|
528
|
+
*/ async performCleanup() {
|
|
529
|
+
const now = BigInt(Date.now() * 1000000);
|
|
530
|
+
const retentionThreshold = now - BigInt(this.config.dlqRetentionPeriod * 1000000);
|
|
531
|
+
// Cleanup expired failed messages
|
|
532
|
+
for await (const { key, value } of this.memoryStore.iterateNamespace('failed-messages')){
|
|
533
|
+
const failedMessage = value;
|
|
534
|
+
if (failedMessage.failureTimestamp < retentionThreshold) {
|
|
535
|
+
await this.memoryStore.delete('failed-messages', key);
|
|
536
|
+
this.metrics.currentDlqSize--;
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
// Cleanup quarantined messages
|
|
540
|
+
for await (const { key, value } of this.memoryStore.iterateNamespace('quarantine')){
|
|
541
|
+
const quarantineEntry = value;
|
|
542
|
+
if (quarantineEntry.releaseTime < now) {
|
|
543
|
+
await this.memoryStore.delete('quarantine', key);
|
|
544
|
+
this.poisonMessages.delete(quarantineEntry.message.id);
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
// Cleanup completed recovery actions
|
|
548
|
+
for (const [actionId, action] of this.recoveryActions){
|
|
549
|
+
if (action.status === "completed" && action.completedAt && action.completedAt < retentionThreshold) {
|
|
550
|
+
this.recoveryActions.delete(actionId);
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
/**
|
|
555
|
+
* Start metrics collection
|
|
556
|
+
*/ startMetricsCollection() {
|
|
557
|
+
setInterval(()=>{
|
|
558
|
+
this.updateSystemMetrics();
|
|
559
|
+
}, 30000); // Update every 30 seconds
|
|
560
|
+
}
|
|
561
|
+
/**
|
|
562
|
+
* Update system metrics
|
|
563
|
+
*/ updateSystemMetrics() {
|
|
564
|
+
// Update DLQ sizes
|
|
565
|
+
let totalDlqSize = 0;
|
|
566
|
+
for (const dlq of this.deadLetterQueues.values()){
|
|
567
|
+
totalDlqSize += dlq.getStats().count;
|
|
568
|
+
}
|
|
569
|
+
this.metrics.currentDlqSize = totalDlqSize;
|
|
570
|
+
// Update agent health status
|
|
571
|
+
for (const agentId of this.circuitBreakers.keys()){
|
|
572
|
+
const health = this.healthMonitor.getAgentHealth(agentId);
|
|
573
|
+
this.metrics.agentHealthStatus.set(agentId, health);
|
|
574
|
+
}
|
|
575
|
+
this.emit('metrics:updated', this.getMetrics());
|
|
576
|
+
}
|
|
577
|
+
/**
|
|
578
|
+
* Update failure metrics
|
|
579
|
+
*/ updateFailureMetrics(failureType) {
|
|
580
|
+
this.metrics.totalFailures++;
|
|
581
|
+
const typeCount = this.metrics.failuresByType.get(failureType) || BigInt(0);
|
|
582
|
+
this.metrics.failuresByType.set(failureType, typeCount + BigInt(1));
|
|
583
|
+
}
|
|
584
|
+
/**
|
|
585
|
+
* Update recovery time metrics
|
|
586
|
+
*/ updateRecoveryTimeMetrics(recoveryTime) {
|
|
587
|
+
const count = Number(this.metrics.successfulRetries);
|
|
588
|
+
this.metrics.averageRecoveryTime = (this.metrics.averageRecoveryTime * (count - 1) + recoveryTime) / count;
|
|
589
|
+
this.metrics.maxRecoveryTime = Math.max(this.metrics.maxRecoveryTime, recoveryTime);
|
|
590
|
+
}
|
|
591
|
+
/**
|
|
592
|
+
* Serialize failed message for DLQ storage
|
|
593
|
+
*/ serializeFailedMessage(failedMessage) {
|
|
594
|
+
const data = JSON.stringify({
|
|
595
|
+
id: failedMessage.id,
|
|
596
|
+
originalMessage: {
|
|
597
|
+
id: failedMessage.originalMessage.id,
|
|
598
|
+
priority: failedMessage.originalMessage.priority,
|
|
599
|
+
data: Array.from(failedMessage.originalMessage.data),
|
|
600
|
+
timestamp: failedMessage.originalMessage.timestamp.toString(),
|
|
601
|
+
deadline: failedMessage.originalMessage.deadline?.toString(),
|
|
602
|
+
retryCount: failedMessage.originalMessage.retryCount,
|
|
603
|
+
maxRetries: failedMessage.originalMessage.maxRetries,
|
|
604
|
+
size: failedMessage.originalMessage.size
|
|
605
|
+
},
|
|
606
|
+
failureType: failedMessage.failureType,
|
|
607
|
+
failureReason: failedMessage.failureReason,
|
|
608
|
+
failureTimestamp: failedMessage.failureTimestamp.toString(),
|
|
609
|
+
retryCount: failedMessage.retryCount,
|
|
610
|
+
nextRetryTime: failedMessage.nextRetryTime.toString(),
|
|
611
|
+
agentId: failedMessage.agentId,
|
|
612
|
+
correlationId: failedMessage.correlationId,
|
|
613
|
+
stackTrace: failedMessage.stackTrace,
|
|
614
|
+
metadata: Object.fromEntries(failedMessage.metadata)
|
|
615
|
+
});
|
|
616
|
+
return new TextEncoder().encode(data);
|
|
617
|
+
}
|
|
618
|
+
/**
|
|
619
|
+
* Deserialize failed message from DLQ storage
|
|
620
|
+
*/ deserializeFailedMessage(data) {
|
|
621
|
+
const json = new TextDecoder().decode(data);
|
|
622
|
+
const parsed = JSON.parse(json);
|
|
623
|
+
return {
|
|
624
|
+
id: parsed.id,
|
|
625
|
+
originalMessage: {
|
|
626
|
+
id: parsed.originalMessage.id,
|
|
627
|
+
priority: parsed.originalMessage.priority,
|
|
628
|
+
data: new Uint8Array(parsed.originalMessage.data),
|
|
629
|
+
timestamp: BigInt(parsed.originalMessage.timestamp),
|
|
630
|
+
deadline: parsed.originalMessage.deadline ? BigInt(parsed.originalMessage.deadline) : undefined,
|
|
631
|
+
retryCount: parsed.originalMessage.retryCount,
|
|
632
|
+
maxRetries: parsed.originalMessage.maxRetries,
|
|
633
|
+
size: parsed.originalMessage.size
|
|
634
|
+
},
|
|
635
|
+
failureType: parsed.failureType,
|
|
636
|
+
failureReason: parsed.failureReason,
|
|
637
|
+
failureTimestamp: BigInt(parsed.failureTimestamp),
|
|
638
|
+
retryCount: parsed.retryCount,
|
|
639
|
+
nextRetryTime: BigInt(parsed.nextRetryTime),
|
|
640
|
+
agentId: parsed.agentId,
|
|
641
|
+
correlationId: parsed.correlationId,
|
|
642
|
+
stackTrace: parsed.stackTrace,
|
|
643
|
+
metadata: new Map(Object.entries(parsed.metadata))
|
|
644
|
+
};
|
|
645
|
+
}
|
|
646
|
+
/**
|
|
647
|
+
* Generate unique failure ID
|
|
648
|
+
*/ generateFailureId() {
|
|
649
|
+
return `fail_${Date.now()}_${Math.random().toString(36).substr(2, 8)}`;
|
|
650
|
+
}
|
|
651
|
+
/**
|
|
652
|
+
* Generate unique recovery ID
|
|
653
|
+
*/ generateRecoveryId() {
|
|
654
|
+
return `rec_${Date.now()}_${Math.random().toString(36).substr(2, 8)}`;
|
|
655
|
+
}
|
|
656
|
+
/**
|
|
657
|
+
* Get comprehensive metrics
|
|
658
|
+
*/ getMetrics() {
|
|
659
|
+
return {
|
|
660
|
+
failures: {
|
|
661
|
+
total: Number(this.metrics.totalFailures),
|
|
662
|
+
byType: Object.fromEntries(Array.from(this.metrics.failuresByType.entries()).map(([type, count])=>[
|
|
663
|
+
type,
|
|
664
|
+
Number(count)
|
|
665
|
+
]))
|
|
666
|
+
},
|
|
667
|
+
retries: {
|
|
668
|
+
total: Number(this.metrics.totalRetries),
|
|
669
|
+
successful: Number(this.metrics.successfulRetries),
|
|
670
|
+
successRate: Number(this.metrics.successfulRetries) / Number(this.metrics.totalRetries) || 0
|
|
671
|
+
},
|
|
672
|
+
recovery: {
|
|
673
|
+
averageTime: this.metrics.averageRecoveryTime,
|
|
674
|
+
maxTime: this.metrics.maxRecoveryTime,
|
|
675
|
+
circuitBreakerTrips: Number(this.metrics.circuitBreakerTrips)
|
|
676
|
+
},
|
|
677
|
+
deadLetterQueues: {
|
|
678
|
+
currentSize: this.metrics.currentDlqSize,
|
|
679
|
+
byType: Object.fromEntries(Array.from(this.deadLetterQueues.entries()).map(([type, dlq])=>[
|
|
680
|
+
type,
|
|
681
|
+
dlq.getStats().count
|
|
682
|
+
]))
|
|
683
|
+
},
|
|
684
|
+
poisonMessages: Number(this.metrics.poisonMessages),
|
|
685
|
+
agentHealth: Object.fromEntries(this.metrics.agentHealthStatus),
|
|
686
|
+
recoveryActions: {
|
|
687
|
+
total: this.recoveryActions.size,
|
|
688
|
+
byStatus: this.getRecoveryActionsByStatus()
|
|
689
|
+
}
|
|
690
|
+
};
|
|
691
|
+
}
|
|
692
|
+
/**
|
|
693
|
+
* Get recovery actions grouped by status
|
|
694
|
+
*/ getRecoveryActionsByStatus() {
|
|
695
|
+
const statusCounts = {};
|
|
696
|
+
for (const status of Object.values(RecoveryStatus)){
|
|
697
|
+
statusCounts[status] = 0;
|
|
698
|
+
}
|
|
699
|
+
for (const action of this.recoveryActions.values()){
|
|
700
|
+
statusCounts[action.status]++;
|
|
701
|
+
}
|
|
702
|
+
return statusCounts;
|
|
703
|
+
}
|
|
704
|
+
/**
|
|
705
|
+
* Graceful shutdown
|
|
706
|
+
*/ async shutdown() {
|
|
707
|
+
this.isRunning = false;
|
|
708
|
+
// Stop processing workers
|
|
709
|
+
for (const worker of this.processingWorkers){
|
|
710
|
+
worker.stop();
|
|
711
|
+
}
|
|
712
|
+
// Stop health monitoring
|
|
713
|
+
this.healthMonitor.stop();
|
|
714
|
+
// Stop recovery orchestrator
|
|
715
|
+
this.recoveryOrchestrator.stop();
|
|
716
|
+
// Process any remaining failures
|
|
717
|
+
await this.processRetries();
|
|
718
|
+
this.emit('recovery-system:shutdown');
|
|
719
|
+
}
|
|
720
|
+
}
|
|
721
|
+
// Supporting classes (implementations would be provided)
|
|
722
|
+
let RetryEngine = class RetryEngine {
|
|
723
|
+
config;
|
|
724
|
+
memoryStore;
|
|
725
|
+
constructor(config, memoryStore){
|
|
726
|
+
this.config = config;
|
|
727
|
+
this.memoryStore = memoryStore;
|
|
728
|
+
}
|
|
729
|
+
};
|
|
730
|
+
let CircuitBreakerManager = class CircuitBreakerManager {
|
|
731
|
+
config;
|
|
732
|
+
constructor(config){
|
|
733
|
+
this.config = config;
|
|
734
|
+
}
|
|
735
|
+
recordFailure(agentId) {}
|
|
736
|
+
recordSuccess(agentId) {}
|
|
737
|
+
shouldOpenCircuit(agentId) {
|
|
738
|
+
return false;
|
|
739
|
+
}
|
|
740
|
+
getCircuitState(agentId) {
|
|
741
|
+
return "closed";
|
|
742
|
+
}
|
|
743
|
+
};
|
|
744
|
+
let PoisonMessageDetector = class PoisonMessageDetector {
|
|
745
|
+
config;
|
|
746
|
+
constructor(config){
|
|
747
|
+
this.config = config;
|
|
748
|
+
}
|
|
749
|
+
checkMessage(message, error) {
|
|
750
|
+
return false;
|
|
751
|
+
}
|
|
752
|
+
};
|
|
753
|
+
let AgentHealthMonitor = class AgentHealthMonitor {
|
|
754
|
+
config;
|
|
755
|
+
constructor(config){
|
|
756
|
+
this.config = config;
|
|
757
|
+
}
|
|
758
|
+
start() {}
|
|
759
|
+
stop() {}
|
|
760
|
+
getAgentHealth(agentId) {
|
|
761
|
+
return {
|
|
762
|
+
agentId,
|
|
763
|
+
isHealthy: true,
|
|
764
|
+
lastHealthCheck: BigInt(Date.now() * 1000000),
|
|
765
|
+
consecutiveFailures: 0,
|
|
766
|
+
averageResponseTime: 0,
|
|
767
|
+
circuitState: "closed",
|
|
768
|
+
errorRate: 0
|
|
769
|
+
};
|
|
770
|
+
}
|
|
771
|
+
};
|
|
772
|
+
let RecoveryOrchestrator = class RecoveryOrchestrator {
|
|
773
|
+
config;
|
|
774
|
+
constructor(config){
|
|
775
|
+
this.config = config;
|
|
776
|
+
}
|
|
777
|
+
start() {}
|
|
778
|
+
stop() {}
|
|
779
|
+
async scheduleRecovery(action) {}
|
|
780
|
+
async executeRecovery(action) {}
|
|
781
|
+
};
|
|
782
|
+
let AlertManager = class AlertManager {
|
|
783
|
+
config;
|
|
784
|
+
constructor(config){
|
|
785
|
+
this.config = config;
|
|
786
|
+
}
|
|
787
|
+
checkThresholds(metrics, failedMessage) {}
|
|
788
|
+
sendPermanentFailureAlert(failedMessage) {}
|
|
789
|
+
};
|
|
790
|
+
let FailureProcessor = class FailureProcessor {
|
|
791
|
+
workerId;
|
|
792
|
+
deadLetterQueues;
|
|
793
|
+
retryEngine;
|
|
794
|
+
config;
|
|
795
|
+
isRunning = false;
|
|
796
|
+
constructor(workerId, deadLetterQueues, retryEngine, config){
|
|
797
|
+
this.workerId = workerId;
|
|
798
|
+
this.deadLetterQueues = deadLetterQueues;
|
|
799
|
+
this.retryEngine = retryEngine;
|
|
800
|
+
this.config = config;
|
|
801
|
+
}
|
|
802
|
+
start() {
|
|
803
|
+
this.isRunning = true;
|
|
804
|
+
// Implementation details...
|
|
805
|
+
}
|
|
806
|
+
stop() {
|
|
807
|
+
this.isRunning = false;
|
|
808
|
+
}
|
|
809
|
+
};
|
|
810
|
+
export { RetryEngine, CircuitBreakerManager, PoisonMessageDetector, AgentHealthMonitor, RecoveryOrchestrator, AlertManager, FailureProcessor };
|
|
811
|
+
|
|
812
|
+
//# sourceMappingURL=failure-recovery-system.js.map
|