claude-flow-novice 2.15.3 → 2.15.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/cfn-extras/skills/advanced-features/cfn-agent-swap/recommend-swap.sh +59 -59
- package/.claude/cfn-extras/skills/analytics/cfn-improvement-recommender/recommend-improvements.sh +91 -91
- package/.claude/cfn-extras/skills/analytics/cfn-pattern-extraction/extract-patterns.sh +79 -79
- package/.claude/cfn-extras/skills/analytics/cfn-retrospective-report/generate-report.sh +100 -100
- package/.claude/cfn-extras/skills/analytics/cfn-telemetry/start-telemetry.sh +110 -110
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/add-bullet.sh +145 -145
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/log-merge.sh +67 -67
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/monitor-injection-performance.sh +137 -137
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/optimize-injection-pipeline.sh +168 -168
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/query-reflections.sh +35 -35
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/store-reflection.sh +45 -45
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/track-ab-test.sh +41 -41
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/update-reflection.sh +41 -41
- package/.claude/cfn-extras/skills/deprecated/cfn-cli-setup/validate-cli-environment.sh +191 -191
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/create-campaign.sh +231 -231
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/get-campaign-performance.sh +190 -190
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/pause-campaign.sh +142 -142
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/set-budget.sh +181 -181
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/update-bid-strategy.sh +133 -133
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/get-conversation-history.sh +121 -121
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/qualify-lead.sh +156 -156
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/schedule-demo.sh +181 -181
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/send-message.sh +137 -137
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/transfer-to-human.sh +179 -179
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/create-campaign.sh +183 -183
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/get-delivery-status.sh +139 -139
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/opt-out.sh +150 -150
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/schedule-campaign.sh +187 -187
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/send-sms.sh +181 -181
- package/.claude/cfn-extras/skills/ui-portal/cfn-web-portal/test-web-portal-skill.sh +50 -50
- package/.claude/cfn-extras/skills/ui-portal/cfn-web-portal/validate-deployment.sh +84 -84
- package/.claude/cfn-extras/skills/utility/cfn-environment-sanitization/sanitize-environment.sh +243 -243
- package/.claude/commands/cfn-loop-cli.md +16 -2
- package/.claude/commands/switch-api.md +31 -10
- package/.claude/hooks/cfn-lint-sql-injection.sh +61 -0
- package/.claude/hooks/cfn-post-edit-cfn-retrospective.sh +33 -2
- package/.claude/hooks/cfn-pre-edit-security-warning.sh +40 -0
- package/.claude/skills/cfn-agent-spawning/spawn-agent.sh +22 -24
- package/.claude/skills/cfn-docker-agent-spawning/SKILL.md +28 -4
- package/.claude/skills/cfn-docker-agent-spawning/spawn-agent.sh +3 -1
- package/.claude/skills/cfn-docker-loop-orchestration/orchestrate.sh +224 -20
- package/.claude/skills/cfn-loop-orchestration/helpers/gate-check.sh +550 -46
- package/.claude/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +277 -0
- package/.claude/skills/cfn-loop-orchestration/orchestrate.sh +184 -23
- package/.claude/skills/cfn-loop-orchestration/security_utils.sh +24 -0
- package/.claude/skills/cfn-loop-orchestration/test-iteration-context-injection.sh +366 -0
- package/.claude/skills/cfn-redis-coordination/CENTRALIZED_REDIS_WRAPPER.md +319 -0
- package/.claude/skills/cfn-redis-coordination/agent-log.sh +4 -0
- package/.claude/skills/cfn-redis-coordination/agent-log.sh.bak +124 -0
- package/.claude/skills/cfn-redis-coordination/agent-recovery.sh +2 -2
- package/.claude/skills/cfn-redis-coordination/collect-confidence-scores.sh +30 -0
- package/.claude/skills/cfn-redis-coordination/get-context.sh +33 -0
- package/.claude/skills/cfn-redis-coordination/get-success-criteria.sh +54 -0
- package/.claude/skills/cfn-redis-coordination/invoke-waiting-mode.sh +3 -0
- package/.claude/skills/cfn-redis-coordination/redis-cli-wrapper.sh +24 -3
- package/.claude/skills/cfn-redis-coordination/redis-functions.sh +33 -0
- package/.claude/skills/cfn-redis-coordination/report-completion.sh +24 -31
- package/.claude/skills/cfn-redis-coordination/store-context.sh +4 -0
- package/.claude/skills/cfn-redis-coordination/store-success-criteria.sh +85 -0
- package/.claude/skills/cfn-redis-coordination/update-all-scripts.sh +67 -0
- package/.claude/skills/cfn-sqlite-memory/ttl-cleanup.sh +17 -25
- package/.claude/skills/cfn-transparency-middleware/test-e2e.sh +15 -0
- package/.claude/skills/cfn-transparency-middleware/tests/input-validation.sh +15 -0
- package/README.md +116 -475
- package/claude-assets/agents/cfn-dev-team/README.md +103 -0
- package/claude-assets/agents/cfn-dev-team/architecture/goal-planner.md +1 -1
- package/claude-assets/agents/cfn-dev-team/coordinators/cfn-frontend-coordinator.md +77 -15
- package/claude-assets/agents/cfn-dev-team/coordinators/cfn-v3-coordinator.md +355 -6
- package/claude-assets/agents/cfn-dev-team/coordinators/consensus-builder.md +82 -1
- package/claude-assets/agents/cfn-dev-team/coordinators/handoff-coordinator.md +82 -1
- package/claude-assets/agents/cfn-dev-team/coordinators/multi-sprint-coordinator.md +77 -15
- package/claude-assets/agents/cfn-dev-team/dev-ops/docker-specialist.md +99 -12
- package/claude-assets/agents/cfn-dev-team/dev-ops/github-commit-agent.md +1 -1
- package/claude-assets/agents/cfn-dev-team/dev-ops/kubernetes-specialist.md +97 -0
- package/claude-assets/agents/cfn-dev-team/dev-ops/monitoring-specialist.md +20 -1
- package/claude-assets/agents/cfn-dev-team/developers/api-gateway-specialist.md +97 -0
- package/claude-assets/agents/cfn-dev-team/developers/backend-developer.md +110 -13
- package/claude-assets/agents/cfn-dev-team/developers/data/data-engineer.md +106 -15
- package/claude-assets/agents/cfn-dev-team/developers/database/database-architect.md +115 -11
- package/claude-assets/agents/cfn-dev-team/developers/frontend/mobile-dev.md +94 -7
- package/claude-assets/agents/cfn-dev-team/developers/frontend/react-frontend-engineer.md +87 -9
- package/claude-assets/agents/cfn-dev-team/developers/frontend/typescript-specialist.md +85 -7
- package/claude-assets/agents/cfn-dev-team/developers/frontend/ui-designer.md +160 -28
- package/claude-assets/agents/cfn-dev-team/developers/graphql-specialist.md +101 -19
- package/claude-assets/agents/cfn-dev-team/developers/rust-developer.md +108 -14
- package/claude-assets/agents/cfn-dev-team/reviewers/{reviewer.md → code-reviewer.md} +95 -8
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/code-quality-validator.md +107 -7
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/perf-analyzer.md +98 -7
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/performance-benchmarker.md +95 -7
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/security-specialist.md +136 -9
- package/claude-assets/agents/cfn-dev-team/testers/api-testing-specialist.md +108 -1
- package/claude-assets/agents/cfn-dev-team/testers/chaos-engineering-specialist.md +107 -13
- package/claude-assets/agents/cfn-dev-team/testers/contract-tester.md +737 -0
- package/claude-assets/agents/cfn-dev-team/testers/e2e/playwright-tester.md +1 -1
- package/claude-assets/agents/cfn-dev-team/testers/integration-tester.md +828 -0
- package/claude-assets/agents/cfn-dev-team/testers/interaction-tester.md +106 -7
- package/claude-assets/agents/cfn-dev-team/testers/load-testing-specialist.md +77 -0
- package/claude-assets/agents/cfn-dev-team/testers/mutation-testing-specialist.md +684 -0
- package/claude-assets/agents/cfn-dev-team/testers/playwright-tester.md +110 -1
- package/claude-assets/agents/cfn-dev-team/testers/tester.md +94 -7
- package/claude-assets/agents/cfn-dev-team/utility/code-booster.md +1 -3
- package/claude-assets/agents/cfn-dev-team/utility/epic-creator.md +87 -13
- package/claude-assets/agents/cfn-dev-team/utility/memory-leak-specialist.md +103 -7
- package/claude-assets/agents/cfn-dev-team/utility/researcher.md +1 -3
- package/claude-assets/agents/cfn-dev-team/utility/z-ai-specialist.md +94 -7
- package/claude-assets/agents/docker-coordinators/cfn-docker-v3-coordinator.md +46 -0
- package/claude-assets/agents/project-only-agents/npm-package-specialist.md +1 -1
- package/claude-assets/cfn-extras/skills/advanced-features/cfn-agent-swap/recommend-swap.sh +59 -59
- package/claude-assets/cfn-extras/skills/analytics/cfn-improvement-recommender/recommend-improvements.sh +91 -91
- package/claude-assets/cfn-extras/skills/analytics/cfn-pattern-extraction/extract-patterns.sh +79 -79
- package/claude-assets/cfn-extras/skills/analytics/cfn-retrospective-report/generate-report.sh +100 -100
- package/claude-assets/cfn-extras/skills/analytics/cfn-telemetry/start-telemetry.sh +110 -110
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/add-bullet.sh +145 -145
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/log-merge.sh +67 -67
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/monitor-injection-performance.sh +137 -137
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/optimize-injection-pipeline.sh +168 -168
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/query-reflections.sh +35 -35
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/store-reflection.sh +45 -45
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/track-ab-test.sh +41 -41
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/update-reflection.sh +41 -41
- package/claude-assets/cfn-extras/skills/deprecated/cfn-cli-setup/validate-cli-environment.sh +191 -191
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/create-campaign.sh +231 -231
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/get-campaign-performance.sh +190 -190
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/pause-campaign.sh +142 -142
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/set-budget.sh +181 -181
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/update-bid-strategy.sh +133 -133
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/get-conversation-history.sh +121 -121
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/qualify-lead.sh +156 -156
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/schedule-demo.sh +181 -181
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/send-message.sh +137 -137
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/transfer-to-human.sh +179 -179
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/create-campaign.sh +183 -183
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/get-delivery-status.sh +139 -139
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/opt-out.sh +150 -150
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/schedule-campaign.sh +187 -187
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/send-sms.sh +181 -181
- package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/test-web-portal-skill.sh +50 -50
- package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/validate-deployment.sh +84 -84
- package/claude-assets/cfn-extras/skills/utility/cfn-environment-sanitization/sanitize-environment.sh +243 -243
- package/claude-assets/commands/cfn-loop-cli.md +16 -2
- package/claude-assets/commands/switch-api.md +31 -10
- package/claude-assets/hooks/cfn-lint-sql-injection.sh +61 -0
- package/claude-assets/hooks/cfn-post-edit-cfn-retrospective.sh +33 -2
- package/claude-assets/hooks/cfn-pre-edit-security-warning.sh +40 -0
- package/claude-assets/hooks/detect-hardcoded-credentials.sh +212 -0
- package/claude-assets/skills/SKILL_TEMPLATE.md +774 -0
- package/claude-assets/skills/agent-lifecycle/execute-lifecycle-hook.sh +84 -113
- package/claude-assets/skills/agent-lifecycle/simple-audit.sh +33 -6
- package/claude-assets/skills/agent-template-generator/SKILL.md +440 -0
- package/claude-assets/skills/agent-template-generator/generate-agent.sh +405 -0
- package/claude-assets/skills/agent-validation-linter/SKILL.md +589 -0
- package/claude-assets/skills/agent-validation-linter/lint-agents.sh +271 -0
- package/claude-assets/skills/bootstrap/bash-fundamentals.md +786 -0
- package/claude-assets/skills/bootstrap/database-connection.md +464 -0
- package/claude-assets/skills/bootstrap/error-handling.md +580 -0
- package/claude-assets/skills/bootstrap/file-operations.md +699 -0
- package/claude-assets/skills/bootstrap/skill-loader.md +616 -0
- package/claude-assets/skills/bootstrap/sqlite-params.sh +287 -0
- package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh +22 -24
- package/claude-assets/skills/cfn-automatic-memory-persistence/test-memory-persistence.sh +17 -16
- package/claude-assets/skills/cfn-deployment/SKILL.md +293 -0
- package/claude-assets/skills/cfn-deployment/execute.sh +21 -0
- package/claude-assets/skills/cfn-docker-agent-spawning/SKILL.md +28 -4
- package/claude-assets/skills/cfn-docker-agent-spawning/spawn-agent.sh +3 -1
- package/claude-assets/skills/cfn-docker-loop-orchestration/orchestrate.sh +224 -20
- package/claude-assets/skills/cfn-environment-sanitization/sanitize-environment.sh +38 -0
- package/claude-assets/skills/cfn-error-batching-strategy/lib/core-functions.sh +47 -47
- package/claude-assets/skills/cfn-file-operations/SKILL.md +290 -0
- package/claude-assets/skills/cfn-file-operations/execute.sh +129 -0
- package/claude-assets/skills/cfn-file-operations/lib/atomic-write.sh +294 -0
- package/claude-assets/skills/cfn-file-operations/lib/lock.sh +361 -0
- package/claude-assets/skills/cfn-file-operations/test.sh +369 -0
- package/claude-assets/skills/cfn-log-operations/SKILL.md +308 -0
- package/claude-assets/skills/cfn-log-operations/execute.sh +420 -0
- package/claude-assets/skills/cfn-log-operations/lib/rotate.sh +406 -0
- package/claude-assets/skills/cfn-log-operations/lib/search.sh +448 -0
- package/claude-assets/skills/cfn-log-operations/test.sh +394 -0
- package/claude-assets/skills/cfn-loop-orchestration/helpers/gate-check.sh +550 -46
- package/claude-assets/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +277 -0
- package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh +184 -23
- package/claude-assets/skills/cfn-loop-orchestration/security_utils.sh +24 -0
- package/claude-assets/skills/cfn-loop-orchestration/test-iteration-context-injection.sh +366 -0
- package/claude-assets/skills/cfn-parameterized-queries/SKILL.md +339 -0
- package/claude-assets/skills/cfn-playbook/query-playbook.sh +19 -15
- package/claude-assets/skills/cfn-playbook/update-playbook.sh +25 -14
- package/claude-assets/skills/cfn-process-instrumentation/instrument-process.sh +44 -0
- package/claude-assets/skills/cfn-promotion/SKILL.md +305 -0
- package/claude-assets/skills/cfn-redis-coordination/CENTRALIZED_REDIS_WRAPPER.md +319 -0
- package/claude-assets/skills/cfn-redis-coordination/agent-log.sh +4 -0
- package/claude-assets/skills/cfn-redis-coordination/agent-log.sh.bak +124 -0
- package/claude-assets/skills/cfn-redis-coordination/agent-recovery.sh +2 -2
- package/claude-assets/skills/cfn-redis-coordination/collect-confidence-scores.sh +30 -0
- package/claude-assets/skills/cfn-redis-coordination/get-context.sh +33 -0
- package/claude-assets/skills/cfn-redis-coordination/get-success-criteria.sh +54 -0
- package/claude-assets/skills/cfn-redis-coordination/invoke-waiting-mode.sh +3 -0
- package/claude-assets/skills/cfn-redis-coordination/redis-cli-wrapper.sh +24 -3
- package/claude-assets/skills/cfn-redis-coordination/redis-functions.sh +33 -0
- package/claude-assets/skills/cfn-redis-coordination/report-completion.sh +24 -31
- package/claude-assets/skills/cfn-redis-coordination/store-context.sh +4 -0
- package/claude-assets/skills/cfn-redis-coordination/store-success-criteria.sh +85 -0
- package/claude-assets/skills/cfn-redis-coordination/update-all-scripts.sh +67 -0
- package/claude-assets/skills/cfn-skill-loader/SKILL.md +466 -0
- package/claude-assets/skills/cfn-skill-loader/execute.sh +344 -0
- package/claude-assets/skills/cfn-sqlite-memory/ttl-cleanup.sh +17 -25
- package/claude-assets/skills/cfn-task-audit/get-audit-data.sh +42 -21
- package/claude-assets/skills/cfn-task-audit/store-task-audit.sh +17 -10
- package/claude-assets/skills/cfn-test-runner/detect-regressions.sh +17 -14
- package/claude-assets/skills/cfn-test-runner/detect-regressions.sh.backup-1763392821 +55 -0
- package/claude-assets/skills/cfn-test-runner/store-benchmarks.sh +17 -19
- package/claude-assets/skills/cfn-transparency-middleware/test-e2e.sh +15 -0
- package/claude-assets/skills/cfn-transparency-middleware/tests/input-validation.sh +15 -0
- package/claude-assets/skills/cfn-utilities/SKILL.md +237 -0
- package/claude-assets/skills/cfn-utilities/execute.sh +32 -0
- package/claude-assets/skills/cfn-utilities/lib/errors.sh +56 -0
- package/claude-assets/skills/cfn-utilities/lib/file-ops.sh +164 -0
- package/claude-assets/skills/cfn-utilities/lib/logging.sh +77 -0
- package/claude-assets/skills/cfn-utilities/lib/retry.sh +127 -0
- package/claude-assets/skills/cfn-utilities/test.sh +317 -0
- package/claude-assets/skills/integration/agent-handoff.sh +62 -64
- package/claude-assets/skills/json-validation/SKILL.md +431 -0
- package/claude-assets/skills/json-validation/test-validate-success-criteria.sh +421 -0
- package/claude-assets/skills/json-validation/validate-success-criteria.sh +197 -0
- package/claude-assets/skills/redis-coordination/validate-parameters.sh +34 -0
- package/claude-assets/skills/workflow-codification/DEPLOY_QUICK_REFERENCE.md +106 -0
- package/claude-assets/skills/workflow-codification/PROPAGATE_UPDATE_QUICK_REFERENCE.md +366 -0
- package/claude-assets/skills/workflow-codification/deploy-approved-skill.sh +481 -0
- package/claude-assets/skills/workflow-codification/deploy-approved-skill.sh.backup-1763392820 +512 -0
- package/claude-assets/skills/workflow-codification/lib/security-utils.sh +204 -0
- package/claude-assets/skills/workflow-codification/propagate-skill-update.sh +648 -0
- package/claude-assets/skills/workflow-codification/propagate-skill-update.sh.backup-1763392820 +664 -0
- package/claude-assets/skills/workflow-codification/test-integration.sh +15 -0
- package/claude-assets/skills/workflow-codification/test-metadata-update.sh +350 -0
- package/claude-assets/skills/workflow-codification/track-cost-savings.sh +55 -14
- package/claude-assets/skills/workflow-codification/track-cost-savings.sh.backup-1763392821 +445 -0
- package/claude-assets/skills/workflow-codification/track-edge-case.sh +27 -60
- package/claude-assets/skills/workflow-codification/workflow-codification.db +0 -0
- package/dist/ace/ace-curator.js +10 -2
- package/dist/ace/ace-curator.js.map +1 -1
- package/dist/ace/ace-generator.js +4 -0
- package/dist/ace/ace-generator.js.map +1 -1
- package/dist/ace/ace-reflector.js +1 -1
- package/dist/ace/ace-reflector.js.map +1 -1
- package/dist/ace/context-injection.js +24 -2
- package/dist/ace/context-injection.js.map +1 -1
- package/dist/agents/agent-loader.js +146 -165
- package/dist/agents/agent-loader.js.map +1 -1
- package/dist/agents/task-agent-integration.js +1 -1
- package/dist/agents/task-agent-integration.js.map +1 -1
- package/dist/api/health-endpoints.js +390 -0
- package/dist/api/health-endpoints.js.map +1 -0
- package/dist/cli/agent-executor.js +4 -1
- package/dist/cli/agent-executor.js.map +1 -1
- package/dist/cli/agent-prompt-builder.js +89 -1
- package/dist/cli/agent-prompt-builder.js.map +1 -1
- package/dist/cli/agent-spawn.js +130 -37
- package/dist/cli/agent-spawn.js.map +1 -1
- package/dist/cli/skill-cache-validator.js +412 -0
- package/dist/cli/skill-cache-validator.js.map +1 -0
- package/dist/cli/skill-cli.js +991 -0
- package/dist/cli/skill-cli.js.map +1 -0
- package/dist/cli/skill-execution-logger.js +284 -0
- package/dist/cli/skill-execution-logger.js.map +1 -0
- package/dist/cli/skill-loader.js +457 -0
- package/dist/cli/skill-loader.js.map +1 -0
- package/dist/coordination/event-bus.js +2 -2
- package/dist/coordination/event-bus.js.map +1 -1
- package/dist/coordination/fleet-manager.js +1 -1
- package/dist/coordination/fleet-manager.js.map +1 -1
- package/dist/coordination/index.js +23 -9
- package/dist/coordination/index.js.map +1 -1
- package/dist/coordination/types/fleet-manager.types.js.map +1 -1
- package/dist/db/migration-manager.js +483 -0
- package/dist/db/migration-manager.js.map +1 -0
- package/dist/db/skills-query.js +535 -0
- package/dist/db/skills-query.js.map +1 -0
- package/dist/integration/DatabaseHandoff.js +1 -1
- package/dist/integration/DatabaseHandoff.js.map +1 -1
- package/dist/jobs/edge-case-analyzer.js +367 -0
- package/dist/jobs/edge-case-analyzer.js.map +1 -0
- package/dist/jobs/promotion-sla-enforcer.js +288 -0
- package/dist/jobs/promotion-sla-enforcer.js.map +1 -0
- package/dist/lib/agent-output-parser.js.map +1 -1
- package/dist/lib/agent-output-validator.js.map +1 -1
- package/dist/lib/agent-workspace.js +281 -0
- package/dist/lib/agent-workspace.js.map +1 -0
- package/dist/lib/atomic-file-writer.js +377 -0
- package/dist/lib/atomic-file-writer.js.map +1 -0
- package/dist/lib/backup-manager.js +779 -0
- package/dist/lib/backup-manager.js.map +1 -0
- package/dist/lib/checkpoint-manager.js +837 -0
- package/dist/lib/checkpoint-manager.js.map +1 -0
- package/dist/lib/circuit-breaker.js +340 -0
- package/dist/lib/circuit-breaker.js.map +1 -0
- package/dist/lib/completion-signal-handler.js +243 -0
- package/dist/lib/completion-signal-handler.js.map +1 -0
- package/dist/lib/config-manager.js +312 -0
- package/dist/lib/config-manager.js.map +1 -0
- package/dist/lib/config-migrator.js +386 -0
- package/dist/lib/config-migrator.js.map +1 -0
- package/dist/lib/config-validator.js.map +1 -1
- package/dist/lib/correlation-cache.js +311 -0
- package/dist/lib/correlation-cache.js.map +1 -0
- package/dist/lib/correlation.js +263 -0
- package/dist/lib/correlation.js.map +1 -0
- package/dist/lib/database-service/connection-pool-manager.js +520 -0
- package/dist/lib/database-service/connection-pool-manager.js.map +1 -0
- package/dist/lib/database-service/correlation.js +329 -0
- package/dist/lib/database-service/correlation.js.map +1 -0
- package/dist/lib/database-service/errors.js +120 -0
- package/dist/lib/database-service/errors.js.map +1 -0
- package/dist/lib/database-service/index.js +168 -0
- package/dist/lib/database-service/index.js.map +1 -0
- package/dist/lib/database-service/postgres-adapter.js +526 -0
- package/dist/lib/database-service/postgres-adapter.js.map +1 -0
- package/dist/lib/database-service/redis-adapter.js +360 -0
- package/dist/lib/database-service/redis-adapter.js.map +1 -0
- package/dist/lib/database-service/sqlite-adapter.js +544 -0
- package/dist/lib/database-service/sqlite-adapter.js.map +1 -0
- package/dist/lib/database-service/transaction-manager.js +773 -0
- package/dist/lib/database-service/transaction-manager.js.map +1 -0
- package/dist/lib/database-service/types.js +23 -0
- package/dist/lib/database-service/types.js.map +1 -0
- package/dist/lib/deadlock-resolver.js +292 -0
- package/dist/lib/deadlock-resolver.js.map +1 -0
- package/dist/lib/distributed-lock.js +451 -0
- package/dist/lib/distributed-lock.js.map +1 -0
- package/dist/lib/edge-case-deduplicator.js +227 -0
- package/dist/lib/edge-case-deduplicator.js.map +1 -0
- package/dist/lib/encryption-manager.js +322 -0
- package/dist/lib/encryption-manager.js.map +1 -0
- package/dist/lib/error-aggregator.js +234 -0
- package/dist/lib/error-aggregator.js.map +1 -0
- package/dist/lib/errors.js +287 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/file-lock-manager.js +578 -0
- package/dist/lib/file-lock-manager.js.map +1 -0
- package/dist/lib/file-operations.js +367 -0
- package/dist/lib/file-operations.js.map +1 -0
- package/dist/lib/idempotent-write.js +237 -0
- package/dist/lib/idempotent-write.js.map +1 -0
- package/dist/lib/integration-schema-validator.js +522 -0
- package/dist/lib/integration-schema-validator.js.map +1 -0
- package/dist/lib/lock-health-monitor.js +298 -0
- package/dist/lib/lock-health-monitor.js.map +1 -0
- package/dist/lib/log-shipper.js +422 -0
- package/dist/lib/log-shipper.js.map +1 -0
- package/dist/lib/logging.js +146 -0
- package/dist/lib/logging.js.map +1 -0
- package/dist/lib/message-deduplicator.js +439 -0
- package/dist/lib/message-deduplicator.js.map +1 -0
- package/dist/lib/multi-system-query.js +604 -0
- package/dist/lib/multi-system-query.js.map +1 -0
- package/dist/lib/orphan-detector.js +332 -0
- package/dist/lib/orphan-detector.js.map +1 -0
- package/dist/lib/password-generator.js +166 -0
- package/dist/lib/password-generator.js.map +1 -0
- package/dist/lib/path-validator.js +429 -0
- package/dist/lib/path-validator.js.map +1 -0
- package/dist/lib/query-translator.js +905 -0
- package/dist/lib/query-translator.js.map +1 -0
- package/dist/lib/queue-recovery.js +469 -0
- package/dist/lib/queue-recovery.js.map +1 -0
- package/dist/lib/redis-queue-manager.js +512 -0
- package/dist/lib/redis-queue-manager.js.map +1 -0
- package/dist/lib/reflection-archiver.js +272 -0
- package/dist/lib/reflection-archiver.js.map +1 -0
- package/dist/lib/retry-manager.js +453 -0
- package/dist/lib/retry-manager.js.map +1 -0
- package/dist/lib/retry.js +262 -0
- package/dist/lib/retry.js.map +1 -0
- package/dist/lib/schema-transform.js +695 -0
- package/dist/lib/schema-transform.js.map +1 -0
- package/dist/lib/schema-validator.js +491 -0
- package/dist/lib/schema-validator.js.map +1 -0
- package/dist/lib/skill-cache.js +297 -0
- package/dist/lib/skill-cache.js.map +1 -0
- package/dist/lib/skill-content-manager.js +337 -0
- package/dist/lib/skill-content-manager.js.map +1 -0
- package/dist/lib/skill-frontmatter-parser.js +237 -0
- package/dist/lib/skill-frontmatter-parser.js.map +1 -0
- package/dist/lib/skill-git-integration.js +275 -0
- package/dist/lib/skill-git-integration.js.map +1 -0
- package/dist/lib/skill-markdown-validator.js +396 -0
- package/dist/lib/skill-markdown-validator.js.map +1 -0
- package/dist/lib/skill-output-parser.js +312 -0
- package/dist/lib/skill-output-parser.js.map +1 -0
- package/dist/lib/unified-query-api.js +467 -0
- package/dist/lib/unified-query-api.js.map +1 -0
- package/dist/middleware/auth-middleware.js +350 -0
- package/dist/middleware/auth-middleware.js.map +1 -0
- package/dist/middleware/schema-validation.js +347 -0
- package/dist/middleware/schema-validation.js.map +1 -0
- package/dist/providers/anthropic-provider.js +1 -1
- package/dist/providers/anthropic-provider.js.map +1 -1
- package/dist/providers/provider-factory.js +2 -2
- package/dist/providers/provider-factory.js.map +1 -1
- package/dist/services/edge-case-analyzer.js +321 -0
- package/dist/services/edge-case-analyzer.js.map +1 -0
- package/dist/services/edge-case-deduplicator.js +266 -0
- package/dist/services/edge-case-deduplicator.js.map +1 -0
- package/dist/services/edge-case-detector.js +337 -0
- package/dist/services/edge-case-detector.js.map +1 -0
- package/dist/services/edge-case-tracker.js +547 -0
- package/dist/services/edge-case-tracker.js.map +1 -0
- package/dist/services/health-check-system.js +586 -0
- package/dist/services/health-check-system.js.map +1 -0
- package/dist/services/metrics-logger.js +412 -0
- package/dist/services/metrics-logger.js.map +1 -0
- package/dist/services/patch-generator.js +378 -0
- package/dist/services/patch-generator.js.map +1 -0
- package/dist/services/patch-validator.js +337 -0
- package/dist/services/patch-validator.js.map +1 -0
- package/dist/services/performance-monitor.js +811 -0
- package/dist/services/performance-monitor.js.map +1 -0
- package/dist/services/promotion-pipeline.js +918 -0
- package/dist/services/promotion-pipeline.js.map +1 -0
- package/dist/services/promotion-validator.js +394 -0
- package/dist/services/promotion-validator.js.map +1 -0
- package/dist/services/reflection-logger.js +388 -0
- package/dist/services/reflection-logger.js.map +1 -0
- package/dist/services/skill-deployment.js +472 -0
- package/dist/services/skill-deployment.js.map +1 -0
- package/dist/services/skill-loader.js +427 -0
- package/dist/services/skill-loader.js.map +1 -0
- package/dist/services/skill-promotion.js +372 -0
- package/dist/services/skill-promotion.js.map +1 -0
- package/dist/services/skill-validator.js +454 -0
- package/dist/services/skill-validator.js.map +1 -0
- package/dist/services/skill-versioning.js +244 -0
- package/dist/services/skill-versioning.js.map +1 -0
- package/dist/services/workspace-supervisor.js +597 -0
- package/dist/services/workspace-supervisor.js.map +1 -0
- package/dist/types/edge-case.js +45 -0
- package/dist/types/edge-case.js.map +1 -0
- package/package.json +201 -177
- package/readme/README.md +19 -4
- package/scripts/backup-cleanup.sh +627 -0
- package/scripts/cleanup-workspaces.sh +412 -0
- package/scripts/cleanup-yaml-configs.sh +141 -0
- package/scripts/deploy-approved-skills.sh +263 -0
- package/scripts/health-check.sh +447 -0
- package/scripts/log-aggregator.sh +554 -0
- package/scripts/log-monitor.sh +629 -0
- package/scripts/manage-agent-workspaces.sh +434 -0
- package/scripts/migrate-schema.sh +533 -0
- package/scripts/promote-staged-skills.sh +423 -0
- package/scripts/verify-no-secrets.sh +88 -35
- package/.claude/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +0 -161
- package/.claude/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +0 -728
- package/.claude/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +0 -131
- package/.claude/skills/agent-lifecycle/SKILL.md +0 -60
- package/.claude/skills/agent-lifecycle/execute-lifecycle-hook.sh +0 -573
- package/.claude/skills/agent-lifecycle/simple-audit.sh +0 -31
- package/.claude/skills/cfn-agent-spawning/spawn-agent.sh.backup +0 -273
- package/.claude/skills/cfn-loop-orchestration/orchestrate.sh.backup +0 -949
- package/README.md.backup_before_replace +0 -781
- package/claude-assets/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +0 -161
- package/claude-assets/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +0 -728
- package/claude-assets/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +0 -131
- package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh.backup +0 -273
- package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh.backup +0 -949
|
@@ -0,0 +1,586 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Health Check System
|
|
3
|
+
*
|
|
4
|
+
* Comprehensive health monitoring for all critical services:
|
|
5
|
+
* - Database connectivity and latency
|
|
6
|
+
* - Redis connectivity and performance
|
|
7
|
+
* - File system availability and disk space
|
|
8
|
+
* - Active agent count and queue depth
|
|
9
|
+
*
|
|
10
|
+
* Provides sub-second health detection (<1s overall response time)
|
|
11
|
+
* and detailed health reports for monitoring integration.
|
|
12
|
+
*
|
|
13
|
+
* Part of Task P2-4.1: Comprehensive Health Checks
|
|
14
|
+
*/ import { getDatabaseService } from '../lib/database-service.js';
|
|
15
|
+
import { RedisQueueManager } from '../lib/redis-queue-manager.js';
|
|
16
|
+
import { StandardError, ErrorCode } from '../lib/errors.js';
|
|
17
|
+
import fs from 'fs';
|
|
18
|
+
import os from 'os';
|
|
19
|
+
/**
|
|
20
|
+
* Health status enumeration
|
|
21
|
+
*/ export var HealthStatus = /*#__PURE__*/ function(HealthStatus) {
|
|
22
|
+
HealthStatus["HEALTHY"] = "healthy";
|
|
23
|
+
HealthStatus["DEGRADED"] = "degraded";
|
|
24
|
+
HealthStatus["UNHEALTHY"] = "unhealthy";
|
|
25
|
+
return HealthStatus;
|
|
26
|
+
}({});
|
|
27
|
+
/**
|
|
28
|
+
* Comprehensive health check system
|
|
29
|
+
*/ export class HealthCheckSystem {
|
|
30
|
+
config;
|
|
31
|
+
redisManager = null;
|
|
32
|
+
constructor(config){
|
|
33
|
+
this.config = {
|
|
34
|
+
databaseTimeout: config?.databaseTimeout ?? 500,
|
|
35
|
+
redisTimeout: config?.redisTimeout ?? 500,
|
|
36
|
+
filesystemTimeout: config?.filesystemTimeout ?? 500,
|
|
37
|
+
agentsTimeout: config?.agentsTimeout ?? 500,
|
|
38
|
+
diskUsageWarnThreshold: config?.diskUsageWarnThreshold ?? 80,
|
|
39
|
+
diskUsageCriticalThreshold: config?.diskUsageCriticalThreshold ?? 95,
|
|
40
|
+
queueDepthWarnThreshold: config?.queueDepthWarnThreshold ?? 100,
|
|
41
|
+
queueDepthCriticalThreshold: config?.queueDepthCriticalThreshold ?? 500
|
|
42
|
+
};
|
|
43
|
+
try {
|
|
44
|
+
this.redisManager = new RedisQueueManager();
|
|
45
|
+
} catch (error) {
|
|
46
|
+
// Redis initialization may fail in test environments
|
|
47
|
+
// Will be handled gracefully in checkRedis()
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Check database health
|
|
52
|
+
* Verifies connectivity and measures response latency
|
|
53
|
+
*/ async checkDatabase() {
|
|
54
|
+
const startTime = Date.now();
|
|
55
|
+
try {
|
|
56
|
+
const db = getDatabaseService();
|
|
57
|
+
// Create a timeout promise
|
|
58
|
+
const timeoutPromise = new Promise((_, reject)=>setTimeout(()=>reject(new Error('Database check timeout')), this.config.databaseTimeout));
|
|
59
|
+
// Race between actual check and timeout
|
|
60
|
+
await Promise.race([
|
|
61
|
+
(async ()=>{
|
|
62
|
+
// Simple connectivity check using a lightweight query
|
|
63
|
+
await db.query('SELECT 1');
|
|
64
|
+
})(),
|
|
65
|
+
timeoutPromise
|
|
66
|
+
]);
|
|
67
|
+
const latency = Date.now() - startTime;
|
|
68
|
+
return {
|
|
69
|
+
name: 'database',
|
|
70
|
+
status: "healthy",
|
|
71
|
+
latency,
|
|
72
|
+
message: 'Database connected and responding',
|
|
73
|
+
timestamp: new Date(),
|
|
74
|
+
metadata: {
|
|
75
|
+
responseTime: latency,
|
|
76
|
+
type: 'postgresql'
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
} catch (error) {
|
|
80
|
+
const latency = Date.now() - startTime;
|
|
81
|
+
const message = error instanceof Error ? error.message : 'Unknown database error';
|
|
82
|
+
return {
|
|
83
|
+
name: 'database',
|
|
84
|
+
status: latency > this.config.databaseTimeout ? "unhealthy" : "unhealthy",
|
|
85
|
+
latency,
|
|
86
|
+
message: `Database check failed: ${message}`,
|
|
87
|
+
timestamp: new Date(),
|
|
88
|
+
metadata: {
|
|
89
|
+
error: message,
|
|
90
|
+
timeout: latency > this.config.databaseTimeout
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Check Redis health
|
|
97
|
+
* Verifies connectivity and measures ping response time
|
|
98
|
+
*/ async checkRedis() {
|
|
99
|
+
const startTime = Date.now();
|
|
100
|
+
try {
|
|
101
|
+
if (!this.redisManager) {
|
|
102
|
+
throw new Error('Redis manager not initialized');
|
|
103
|
+
}
|
|
104
|
+
// Create a timeout promise
|
|
105
|
+
const timeoutPromise = new Promise((_, reject)=>setTimeout(()=>reject(new Error('Redis check timeout')), this.config.redisTimeout));
|
|
106
|
+
// Race between actual check and timeout
|
|
107
|
+
await Promise.race([
|
|
108
|
+
this.redisManager.ping(),
|
|
109
|
+
timeoutPromise
|
|
110
|
+
]);
|
|
111
|
+
const latency = Date.now() - startTime;
|
|
112
|
+
// Get additional metrics
|
|
113
|
+
let metadata = {
|
|
114
|
+
responseTime: latency
|
|
115
|
+
};
|
|
116
|
+
try {
|
|
117
|
+
const stats = await this.redisManager.getStats();
|
|
118
|
+
metadata = {
|
|
119
|
+
...metadata,
|
|
120
|
+
...stats
|
|
121
|
+
};
|
|
122
|
+
} catch {
|
|
123
|
+
// If stats fail, just continue with basic response time
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
name: 'redis',
|
|
127
|
+
status: "healthy",
|
|
128
|
+
latency,
|
|
129
|
+
message: 'Redis responding to PING',
|
|
130
|
+
timestamp: new Date(),
|
|
131
|
+
metadata
|
|
132
|
+
};
|
|
133
|
+
} catch (error) {
|
|
134
|
+
const latency = Date.now() - startTime;
|
|
135
|
+
const message = error instanceof Error ? error.message : 'Unknown Redis error';
|
|
136
|
+
const status = message.includes('timeout') || latency > this.config.redisTimeout ? "unhealthy" : "unhealthy";
|
|
137
|
+
return {
|
|
138
|
+
name: 'redis',
|
|
139
|
+
status,
|
|
140
|
+
latency,
|
|
141
|
+
message: `Redis check failed: ${message}`,
|
|
142
|
+
timestamp: new Date(),
|
|
143
|
+
metadata: {
|
|
144
|
+
error: message,
|
|
145
|
+
timeout: latency > this.config.redisTimeout
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Check file system health
|
|
152
|
+
* Verifies disk space and write permissions
|
|
153
|
+
*/ async checkFileSystem() {
|
|
154
|
+
const startTime = Date.now();
|
|
155
|
+
try {
|
|
156
|
+
// Create a timeout promise
|
|
157
|
+
const timeoutPromise = new Promise((_, reject)=>setTimeout(()=>reject(new Error('Filesystem check timeout')), this.config.filesystemTimeout));
|
|
158
|
+
// Race between actual check and timeout
|
|
159
|
+
const result = await Promise.race([
|
|
160
|
+
this.getFileSystemMetrics(),
|
|
161
|
+
timeoutPromise
|
|
162
|
+
]);
|
|
163
|
+
const latency = Date.now() - startTime;
|
|
164
|
+
// Determine health status based on disk usage
|
|
165
|
+
let status = "healthy";
|
|
166
|
+
let message = 'File system healthy';
|
|
167
|
+
if (result.diskUsagePercent > this.config.diskUsageCriticalThreshold) {
|
|
168
|
+
status = "unhealthy";
|
|
169
|
+
message = `Critical disk usage: ${result.diskUsagePercent.toFixed(1)}%`;
|
|
170
|
+
} else if (result.diskUsagePercent > this.config.diskUsageWarnThreshold) {
|
|
171
|
+
status = "degraded";
|
|
172
|
+
message = `Degraded disk usage: ${result.diskUsagePercent.toFixed(1)}%`;
|
|
173
|
+
}
|
|
174
|
+
if (!result.writePermission) {
|
|
175
|
+
status = "unhealthy";
|
|
176
|
+
message = 'Write permission denied on temp directory';
|
|
177
|
+
}
|
|
178
|
+
return {
|
|
179
|
+
name: 'filesystem',
|
|
180
|
+
status,
|
|
181
|
+
latency,
|
|
182
|
+
message,
|
|
183
|
+
timestamp: new Date(),
|
|
184
|
+
metadata: {
|
|
185
|
+
diskUsagePercent: result.diskUsagePercent,
|
|
186
|
+
writePermission: result.writePermission,
|
|
187
|
+
freeSpaceMB: result.freeSpaceMB,
|
|
188
|
+
totalSpaceMB: result.totalSpaceMB
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
} catch (error) {
|
|
192
|
+
const latency = Date.now() - startTime;
|
|
193
|
+
const message = error instanceof Error ? error.message : 'Unknown filesystem error';
|
|
194
|
+
return {
|
|
195
|
+
name: 'filesystem',
|
|
196
|
+
status: "unhealthy",
|
|
197
|
+
latency,
|
|
198
|
+
message: `File system check failed: ${message}`,
|
|
199
|
+
timestamp: new Date(),
|
|
200
|
+
metadata: {
|
|
201
|
+
error: message
|
|
202
|
+
}
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Check agent health
|
|
208
|
+
* Verifies active agent count and queue depth
|
|
209
|
+
*/ async checkAgents() {
|
|
210
|
+
const startTime = Date.now();
|
|
211
|
+
try {
|
|
212
|
+
// Create a timeout promise
|
|
213
|
+
const timeoutPromise = new Promise((_, reject)=>setTimeout(()=>reject(new Error('Agents check timeout')), this.config.agentsTimeout));
|
|
214
|
+
// Race between actual check and timeout
|
|
215
|
+
const metrics = await Promise.race([
|
|
216
|
+
this.getAgentMetrics(),
|
|
217
|
+
timeoutPromise
|
|
218
|
+
]);
|
|
219
|
+
const latency = Date.now() - startTime;
|
|
220
|
+
// Determine health status based on queue depth
|
|
221
|
+
let status = "healthy";
|
|
222
|
+
let message = `${metrics.activeAgentCount} agents active`;
|
|
223
|
+
if (metrics.queueDepth > this.config.queueDepthCriticalThreshold) {
|
|
224
|
+
status = "unhealthy";
|
|
225
|
+
message = `Critical queue depth: ${metrics.queueDepth} tasks`;
|
|
226
|
+
} else if (metrics.queueDepth > this.config.queueDepthWarnThreshold) {
|
|
227
|
+
status = "degraded";
|
|
228
|
+
message = `High queue depth: ${metrics.queueDepth} tasks`;
|
|
229
|
+
}
|
|
230
|
+
return {
|
|
231
|
+
name: 'agents',
|
|
232
|
+
status,
|
|
233
|
+
latency,
|
|
234
|
+
message,
|
|
235
|
+
timestamp: new Date(),
|
|
236
|
+
metadata: {
|
|
237
|
+
activeAgentCount: metrics.activeAgentCount,
|
|
238
|
+
queueDepth: metrics.queueDepth
|
|
239
|
+
}
|
|
240
|
+
};
|
|
241
|
+
} catch (error) {
|
|
242
|
+
const latency = Date.now() - startTime;
|
|
243
|
+
const message = error instanceof Error ? error.message : 'Unknown agent error';
|
|
244
|
+
return {
|
|
245
|
+
name: 'agents',
|
|
246
|
+
status: "unhealthy",
|
|
247
|
+
latency,
|
|
248
|
+
message: `Agent check failed: ${message}`,
|
|
249
|
+
timestamp: new Date(),
|
|
250
|
+
metadata: {
|
|
251
|
+
error: message
|
|
252
|
+
}
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Get overall system health
|
|
258
|
+
* Aggregates all service health checks
|
|
259
|
+
*/ async getOverallHealth() {
|
|
260
|
+
const overallStartTime = Date.now();
|
|
261
|
+
const [database, redis, filesystem, agents] = await Promise.all([
|
|
262
|
+
this.checkDatabase(),
|
|
263
|
+
this.checkRedis(),
|
|
264
|
+
this.checkFileSystem(),
|
|
265
|
+
this.checkAgents()
|
|
266
|
+
]);
|
|
267
|
+
const dependencies = [
|
|
268
|
+
database,
|
|
269
|
+
redis,
|
|
270
|
+
filesystem,
|
|
271
|
+
agents
|
|
272
|
+
];
|
|
273
|
+
// Determine overall status
|
|
274
|
+
// UNHEALTHY if any service is unhealthy
|
|
275
|
+
// DEGRADED if any service is degraded
|
|
276
|
+
// HEALTHY if all services are healthy
|
|
277
|
+
let overallStatus = "healthy";
|
|
278
|
+
const unhealthyServices = dependencies.filter((d)=>d.status === "unhealthy");
|
|
279
|
+
const degradedServices = dependencies.filter((d)=>d.status === "degraded");
|
|
280
|
+
if (unhealthyServices.length > 0) {
|
|
281
|
+
overallStatus = "unhealthy";
|
|
282
|
+
} else if (degradedServices.length > 0) {
|
|
283
|
+
overallStatus = "degraded";
|
|
284
|
+
}
|
|
285
|
+
const latency = Date.now() - overallStartTime;
|
|
286
|
+
const statusMessage = unhealthyServices.length > 0 ? `${unhealthyServices.length} service(s) unhealthy` : degradedServices.length > 0 ? `${degradedServices.length} service(s) degraded` : 'All services healthy';
|
|
287
|
+
return {
|
|
288
|
+
name: 'overall',
|
|
289
|
+
status: overallStatus,
|
|
290
|
+
latency,
|
|
291
|
+
message: statusMessage,
|
|
292
|
+
timestamp: new Date(),
|
|
293
|
+
dependencies
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Get detailed health report
|
|
298
|
+
* Includes all services and aggregated metrics
|
|
299
|
+
*/ async getDetailedHealthReport() {
|
|
300
|
+
const reportStartTime = Date.now();
|
|
301
|
+
const overall = await this.getOverallHealth();
|
|
302
|
+
const report = {
|
|
303
|
+
timestamp: new Date(),
|
|
304
|
+
overallStatus: overall.status,
|
|
305
|
+
latency: Date.now() - reportStartTime,
|
|
306
|
+
services: {
|
|
307
|
+
database: overall.dependencies[0],
|
|
308
|
+
redis: overall.dependencies[1],
|
|
309
|
+
filesystem: overall.dependencies[2],
|
|
310
|
+
agents: overall.dependencies[3]
|
|
311
|
+
},
|
|
312
|
+
alerts: []
|
|
313
|
+
};
|
|
314
|
+
// Build alerts
|
|
315
|
+
if (report.overallStatus === "unhealthy") {
|
|
316
|
+
const unhealthy = overall.dependencies.filter((d)=>d.status === "unhealthy");
|
|
317
|
+
report.alerts = unhealthy.map((s)=>`${s.name}: ${s.message}`);
|
|
318
|
+
}
|
|
319
|
+
if (report.overallStatus === "degraded") {
|
|
320
|
+
const degraded = overall.dependencies.filter((d)=>d.status === "degraded");
|
|
321
|
+
report.alerts = degraded.map((s)=>`${s.name}: ${s.message}`);
|
|
322
|
+
}
|
|
323
|
+
return report;
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Fast ping check for basic connectivity
|
|
327
|
+
* Returns in <100ms for Kubernetes probes and dashboards
|
|
328
|
+
*
|
|
329
|
+
* This is a lightweight check that verifies the system is responsive
|
|
330
|
+
* without performing expensive operations like database queries.
|
|
331
|
+
*
|
|
332
|
+
* @param timeout - Optional timeout in milliseconds (default: 100ms)
|
|
333
|
+
* @returns HealthCheck with basic connectivity status
|
|
334
|
+
* @throws StandardError if ping fails or timeout exceeded
|
|
335
|
+
*/ async ping(timeout = 100) {
|
|
336
|
+
const startTime = Date.now();
|
|
337
|
+
try {
|
|
338
|
+
// Create a timeout promise
|
|
339
|
+
const timeoutPromise = new Promise((_, reject)=>setTimeout(()=>reject(new StandardError(ErrorCode.OPERATION_TIMEOUT, `Ping timeout after ${timeout}ms`, {
|
|
340
|
+
timeout
|
|
341
|
+
})), timeout));
|
|
342
|
+
// Race between basic checks and timeout
|
|
343
|
+
await Promise.race([
|
|
344
|
+
// Minimal checks - just verify system is responsive
|
|
345
|
+
(async ()=>{
|
|
346
|
+
// Check if we can access Date (basic runtime check)
|
|
347
|
+
const now = Date.now();
|
|
348
|
+
// Verify process is alive
|
|
349
|
+
if (typeof process === 'undefined') {
|
|
350
|
+
throw new StandardError(ErrorCode.UNKNOWN_ERROR, 'Process runtime not available', {
|
|
351
|
+
check: 'ping'
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
// Verify we have memory available
|
|
355
|
+
const memUsage = process.memoryUsage();
|
|
356
|
+
if (memUsage.heapUsed > memUsage.heapTotal * 0.95) {
|
|
357
|
+
throw new StandardError(ErrorCode.UNKNOWN_ERROR, 'Memory critically low', {
|
|
358
|
+
heapUsed: memUsage.heapUsed,
|
|
359
|
+
heapTotal: memUsage.heapTotal,
|
|
360
|
+
percentUsed: memUsage.heapUsed / memUsage.heapTotal * 100
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
})(),
|
|
364
|
+
timeoutPromise
|
|
365
|
+
]);
|
|
366
|
+
const latency = Date.now() - startTime;
|
|
367
|
+
// Ensure we're under the target response time
|
|
368
|
+
if (latency >= timeout) {
|
|
369
|
+
throw new StandardError(ErrorCode.OPERATION_TIMEOUT, `Ping exceeded target response time: ${latency}ms >= ${timeout}ms`, {
|
|
370
|
+
latency,
|
|
371
|
+
timeout
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
return {
|
|
375
|
+
name: 'ping',
|
|
376
|
+
status: "healthy",
|
|
377
|
+
latency,
|
|
378
|
+
message: 'System responsive',
|
|
379
|
+
timestamp: new Date(),
|
|
380
|
+
metadata: {
|
|
381
|
+
responseTime: latency,
|
|
382
|
+
memoryUsage: process.memoryUsage(),
|
|
383
|
+
uptime: process.uptime()
|
|
384
|
+
}
|
|
385
|
+
};
|
|
386
|
+
} catch (error) {
|
|
387
|
+
const latency = Date.now() - startTime;
|
|
388
|
+
if (error instanceof StandardError) {
|
|
389
|
+
throw error;
|
|
390
|
+
}
|
|
391
|
+
const message = error instanceof Error ? error.message : 'Unknown ping error';
|
|
392
|
+
throw new StandardError(ErrorCode.UNKNOWN_ERROR, `Ping failed: ${message}`, {
|
|
393
|
+
latency,
|
|
394
|
+
timeout
|
|
395
|
+
}, error instanceof Error ? error : undefined);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* Get aggregated health statistics from all endpoints
|
|
400
|
+
* Provides a comprehensive view of system health metrics
|
|
401
|
+
*
|
|
402
|
+
* @param timeout - Optional timeout in milliseconds (default: 5000ms)
|
|
403
|
+
* @returns AggregatedHealthStats with metrics from all services
|
|
404
|
+
*/ async getAggregateStats(timeout = 5000) {
|
|
405
|
+
const startTime = Date.now();
|
|
406
|
+
try {
|
|
407
|
+
// Create a timeout promise
|
|
408
|
+
const timeoutPromise = new Promise((_, reject)=>setTimeout(()=>reject(new StandardError(ErrorCode.OPERATION_TIMEOUT, `Aggregate stats timeout after ${timeout}ms`, {
|
|
409
|
+
timeout
|
|
410
|
+
})), timeout));
|
|
411
|
+
// Race between collecting all stats and timeout
|
|
412
|
+
const result = await Promise.race([
|
|
413
|
+
(async ()=>{
|
|
414
|
+
// Collect all health checks in parallel
|
|
415
|
+
const [database, redis, filesystem, agents] = await Promise.all([
|
|
416
|
+
this.checkDatabase(),
|
|
417
|
+
this.checkRedis(),
|
|
418
|
+
this.checkFileSystem(),
|
|
419
|
+
this.checkAgents()
|
|
420
|
+
]);
|
|
421
|
+
return {
|
|
422
|
+
database,
|
|
423
|
+
redis,
|
|
424
|
+
filesystem,
|
|
425
|
+
agents
|
|
426
|
+
};
|
|
427
|
+
})(),
|
|
428
|
+
timeoutPromise
|
|
429
|
+
]);
|
|
430
|
+
const latency = Date.now() - startTime;
|
|
431
|
+
// Calculate aggregate metrics
|
|
432
|
+
const services = [
|
|
433
|
+
result.database,
|
|
434
|
+
result.redis,
|
|
435
|
+
result.filesystem,
|
|
436
|
+
result.agents
|
|
437
|
+
];
|
|
438
|
+
const healthyCount = services.filter((s)=>s.status === "healthy").length;
|
|
439
|
+
const degradedCount = services.filter((s)=>s.status === "degraded").length;
|
|
440
|
+
const unhealthyCount = services.filter((s)=>s.status === "unhealthy").length;
|
|
441
|
+
// Determine overall status
|
|
442
|
+
let overallStatus = "healthy";
|
|
443
|
+
if (unhealthyCount > 0) {
|
|
444
|
+
overallStatus = "unhealthy";
|
|
445
|
+
} else if (degradedCount > 0) {
|
|
446
|
+
overallStatus = "degraded";
|
|
447
|
+
}
|
|
448
|
+
// Calculate average latency
|
|
449
|
+
const totalLatency = services.reduce((sum, s)=>sum + s.latency, 0);
|
|
450
|
+
const averageLatency = totalLatency / services.length;
|
|
451
|
+
// Collect metadata from all services
|
|
452
|
+
const metadata = {
|
|
453
|
+
database: result.database.metadata,
|
|
454
|
+
redis: result.redis.metadata,
|
|
455
|
+
filesystem: result.filesystem.metadata,
|
|
456
|
+
agents: result.agents.metadata
|
|
457
|
+
};
|
|
458
|
+
// Build warnings list
|
|
459
|
+
const warnings = [];
|
|
460
|
+
if (degradedCount > 0) {
|
|
461
|
+
const degradedServices = services.filter((s)=>s.status === "degraded");
|
|
462
|
+
warnings.push(...degradedServices.map((s)=>`${s.name}: ${s.message}`));
|
|
463
|
+
}
|
|
464
|
+
// Build errors list
|
|
465
|
+
const errors = [];
|
|
466
|
+
if (unhealthyCount > 0) {
|
|
467
|
+
const unhealthyServices = services.filter((s)=>s.status === "unhealthy");
|
|
468
|
+
errors.push(...unhealthyServices.map((s)=>`${s.name}: ${s.message}`));
|
|
469
|
+
}
|
|
470
|
+
return {
|
|
471
|
+
timestamp: new Date(),
|
|
472
|
+
overallStatus,
|
|
473
|
+
latency,
|
|
474
|
+
averageServiceLatency: averageLatency,
|
|
475
|
+
serviceCount: {
|
|
476
|
+
total: services.length,
|
|
477
|
+
healthy: healthyCount,
|
|
478
|
+
degraded: degradedCount,
|
|
479
|
+
unhealthy: unhealthyCount
|
|
480
|
+
},
|
|
481
|
+
services: {
|
|
482
|
+
database: {
|
|
483
|
+
status: result.database.status,
|
|
484
|
+
latency: result.database.latency,
|
|
485
|
+
message: result.database.message
|
|
486
|
+
},
|
|
487
|
+
redis: {
|
|
488
|
+
status: result.redis.status,
|
|
489
|
+
latency: result.redis.latency,
|
|
490
|
+
message: result.redis.message
|
|
491
|
+
},
|
|
492
|
+
filesystem: {
|
|
493
|
+
status: result.filesystem.status,
|
|
494
|
+
latency: result.filesystem.latency,
|
|
495
|
+
message: result.filesystem.message
|
|
496
|
+
},
|
|
497
|
+
agents: {
|
|
498
|
+
status: result.agents.status,
|
|
499
|
+
latency: result.agents.latency,
|
|
500
|
+
message: result.agents.message
|
|
501
|
+
}
|
|
502
|
+
},
|
|
503
|
+
metadata,
|
|
504
|
+
warnings,
|
|
505
|
+
errors
|
|
506
|
+
};
|
|
507
|
+
} catch (error) {
|
|
508
|
+
const latency = Date.now() - startTime;
|
|
509
|
+
if (error instanceof StandardError) {
|
|
510
|
+
throw error;
|
|
511
|
+
}
|
|
512
|
+
const message = error instanceof Error ? error.message : 'Unknown aggregation error';
|
|
513
|
+
throw new StandardError(ErrorCode.UNKNOWN_ERROR, `Failed to aggregate health stats: ${message}`, {
|
|
514
|
+
latency,
|
|
515
|
+
timeout
|
|
516
|
+
}, error instanceof Error ? error : undefined);
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
/**
|
|
520
|
+
* Get file system metrics
|
|
521
|
+
* Private helper for filesystem check
|
|
522
|
+
*/ async getFileSystemMetrics() {
|
|
523
|
+
return new Promise((resolve, reject)=>{
|
|
524
|
+
// Get disk usage statistics
|
|
525
|
+
const tempDir = os.tmpdir();
|
|
526
|
+
const stat = fs.statSync(tempDir);
|
|
527
|
+
// Use statvfs to get disk space information
|
|
528
|
+
fs.statfs(tempDir, (err, stats)=>{
|
|
529
|
+
if (err) {
|
|
530
|
+
reject(err);
|
|
531
|
+
return;
|
|
532
|
+
}
|
|
533
|
+
const totalBlocks = stats.blocks;
|
|
534
|
+
const availableBlocks = stats.bavail;
|
|
535
|
+
const blockSize = stats.bsize;
|
|
536
|
+
const totalSpaceMB = totalBlocks * blockSize / (1024 * 1024);
|
|
537
|
+
const availableSpaceMB = availableBlocks * blockSize / (1024 * 1024);
|
|
538
|
+
const usedSpaceMB = totalSpaceMB - availableSpaceMB;
|
|
539
|
+
const diskUsagePercent = usedSpaceMB / totalSpaceMB * 100;
|
|
540
|
+
// Check write permission by attempting to create a temp file
|
|
541
|
+
const testFile = `${tempDir}/.health-check-test-${Date.now()}`;
|
|
542
|
+
let writePermission = false;
|
|
543
|
+
try {
|
|
544
|
+
fs.writeFileSync(testFile, 'health-check-test');
|
|
545
|
+
fs.unlinkSync(testFile);
|
|
546
|
+
writePermission = true;
|
|
547
|
+
} catch {
|
|
548
|
+
writePermission = false;
|
|
549
|
+
}
|
|
550
|
+
resolve({
|
|
551
|
+
totalSpaceMB,
|
|
552
|
+
availableSpaceMB,
|
|
553
|
+
usedSpaceMB,
|
|
554
|
+
diskUsagePercent,
|
|
555
|
+
writePermission,
|
|
556
|
+
freeSpaceMB: availableSpaceMB
|
|
557
|
+
});
|
|
558
|
+
});
|
|
559
|
+
});
|
|
560
|
+
}
|
|
561
|
+
/**
|
|
562
|
+
* Get agent metrics
|
|
563
|
+
* Private helper for agent check
|
|
564
|
+
*/ async getAgentMetrics() {
|
|
565
|
+
// Get active agent count from Redis queue
|
|
566
|
+
let activeAgentCount = 0;
|
|
567
|
+
let queueDepth = 0;
|
|
568
|
+
try {
|
|
569
|
+
if (this.redisManager) {
|
|
570
|
+
const stats = await this.redisManager.getStats();
|
|
571
|
+
activeAgentCount = stats.activeCount || 0;
|
|
572
|
+
queueDepth = stats.pendingCount || 0;
|
|
573
|
+
}
|
|
574
|
+
} catch {
|
|
575
|
+
// If Redis is unavailable, return default metrics
|
|
576
|
+
activeAgentCount = 0;
|
|
577
|
+
queueDepth = 0;
|
|
578
|
+
}
|
|
579
|
+
return {
|
|
580
|
+
activeAgentCount,
|
|
581
|
+
queueDepth
|
|
582
|
+
};
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
//# sourceMappingURL=health-check-system.js.map
|