claude-flow-novice 2.15.3 → 2.15.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/cfn-extras/skills/advanced-features/cfn-agent-swap/recommend-swap.sh +59 -59
- package/.claude/cfn-extras/skills/analytics/cfn-improvement-recommender/recommend-improvements.sh +91 -91
- package/.claude/cfn-extras/skills/analytics/cfn-pattern-extraction/extract-patterns.sh +79 -79
- package/.claude/cfn-extras/skills/analytics/cfn-retrospective-report/generate-report.sh +100 -100
- package/.claude/cfn-extras/skills/analytics/cfn-telemetry/start-telemetry.sh +110 -110
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/add-bullet.sh +145 -145
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/log-merge.sh +67 -67
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/monitor-injection-performance.sh +137 -137
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/optimize-injection-pipeline.sh +168 -168
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/query-reflections.sh +35 -35
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/store-reflection.sh +45 -45
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/track-ab-test.sh +41 -41
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/update-reflection.sh +41 -41
- package/.claude/cfn-extras/skills/deprecated/cfn-cli-setup/validate-cli-environment.sh +191 -191
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/create-campaign.sh +231 -231
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/get-campaign-performance.sh +190 -190
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/pause-campaign.sh +142 -142
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/set-budget.sh +181 -181
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/update-bid-strategy.sh +133 -133
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/get-conversation-history.sh +121 -121
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/qualify-lead.sh +156 -156
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/schedule-demo.sh +181 -181
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/send-message.sh +137 -137
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/transfer-to-human.sh +179 -179
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/create-campaign.sh +183 -183
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/get-delivery-status.sh +139 -139
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/opt-out.sh +150 -150
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/schedule-campaign.sh +187 -187
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/send-sms.sh +181 -181
- package/.claude/cfn-extras/skills/ui-portal/cfn-web-portal/test-web-portal-skill.sh +50 -50
- package/.claude/cfn-extras/skills/ui-portal/cfn-web-portal/validate-deployment.sh +84 -84
- package/.claude/cfn-extras/skills/utility/cfn-environment-sanitization/sanitize-environment.sh +243 -243
- package/.claude/commands/cfn-loop-cli.md +29 -6
- package/.claude/commands/switch-api.md +31 -10
- package/.claude/hooks/cfn-lint-sql-injection.sh +61 -0
- package/.claude/hooks/cfn-post-edit-cfn-retrospective.sh +33 -2
- package/.claude/hooks/cfn-pre-edit-security-warning.sh +40 -0
- package/.claude/skills/cfn-agent-spawning/spawn-agent.sh +22 -24
- package/.claude/skills/cfn-docker-agent-spawning/SKILL.md +28 -4
- package/.claude/skills/cfn-docker-agent-spawning/spawn-agent.sh +3 -1
- package/.claude/skills/cfn-docker-loop-orchestration/orchestrate.sh +224 -20
- package/.claude/skills/cfn-loop-orchestration/helpers/gate-check.sh +550 -46
- package/.claude/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +277 -0
- package/.claude/skills/cfn-loop-orchestration/orchestrate.sh +238 -29
- package/.claude/skills/cfn-loop-orchestration/security_utils.sh +24 -0
- package/.claude/skills/cfn-loop-orchestration/test-iteration-context-injection.sh +366 -0
- package/.claude/skills/cfn-redis-coordination/CENTRALIZED_REDIS_WRAPPER.md +319 -0
- package/.claude/skills/cfn-redis-coordination/agent-log.sh +4 -0
- package/.claude/skills/cfn-redis-coordination/agent-log.sh.bak +124 -0
- package/.claude/skills/cfn-redis-coordination/agent-recovery.sh +2 -2
- package/.claude/skills/cfn-redis-coordination/collect-confidence-scores.sh +30 -0
- package/.claude/skills/cfn-redis-coordination/get-context.sh +33 -0
- package/.claude/skills/cfn-redis-coordination/get-success-criteria.sh +54 -0
- package/.claude/skills/cfn-redis-coordination/invoke-waiting-mode.sh +6 -2
- package/.claude/skills/cfn-redis-coordination/redis-cli-wrapper.sh +24 -3
- package/.claude/skills/cfn-redis-coordination/redis-functions.sh +34 -0
- package/.claude/skills/cfn-redis-coordination/report-completion.sh +24 -31
- package/.claude/skills/cfn-redis-coordination/store-context.sh +4 -0
- package/.claude/skills/cfn-redis-coordination/store-success-criteria.sh +85 -0
- package/.claude/skills/cfn-redis-coordination/update-all-scripts.sh +67 -0
- package/.claude/skills/cfn-sqlite-memory/ttl-cleanup.sh +17 -25
- package/.claude/skills/cfn-transparency-middleware/test-e2e.sh +15 -0
- package/.claude/skills/cfn-transparency-middleware/tests/input-validation.sh +15 -0
- package/README.md +116 -475
- package/claude-assets/agents/cfn-dev-team/README.md +103 -0
- package/claude-assets/agents/cfn-dev-team/architecture/goal-planner.md +1 -1
- package/claude-assets/agents/cfn-dev-team/coordinators/cfn-frontend-coordinator.md +77 -15
- package/claude-assets/agents/cfn-dev-team/coordinators/cfn-v3-coordinator.md +355 -6
- package/claude-assets/agents/cfn-dev-team/coordinators/consensus-builder.md +82 -1
- package/claude-assets/agents/cfn-dev-team/coordinators/handoff-coordinator.md +82 -1
- package/claude-assets/agents/cfn-dev-team/coordinators/multi-sprint-coordinator.md +77 -15
- package/claude-assets/agents/cfn-dev-team/dev-ops/docker-specialist.md +99 -12
- package/claude-assets/agents/cfn-dev-team/dev-ops/github-commit-agent.md +1 -1
- package/claude-assets/agents/cfn-dev-team/dev-ops/kubernetes-specialist.md +97 -0
- package/claude-assets/agents/cfn-dev-team/dev-ops/monitoring-specialist.md +20 -1
- package/claude-assets/agents/cfn-dev-team/developers/api-gateway-specialist.md +97 -0
- package/claude-assets/agents/cfn-dev-team/developers/backend-developer.md +110 -13
- package/claude-assets/agents/cfn-dev-team/developers/data/data-engineer.md +106 -15
- package/claude-assets/agents/cfn-dev-team/developers/database/database-architect.md +115 -11
- package/claude-assets/agents/cfn-dev-team/developers/frontend/mobile-dev.md +94 -7
- package/claude-assets/agents/cfn-dev-team/developers/frontend/react-frontend-engineer.md +87 -9
- package/claude-assets/agents/cfn-dev-team/developers/frontend/typescript-specialist.md +85 -7
- package/claude-assets/agents/cfn-dev-team/developers/frontend/ui-designer.md +160 -28
- package/claude-assets/agents/cfn-dev-team/developers/graphql-specialist.md +101 -19
- package/claude-assets/agents/cfn-dev-team/developers/rust-developer.md +108 -14
- package/claude-assets/agents/cfn-dev-team/reviewers/{reviewer.md → code-reviewer.md} +95 -8
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/code-quality-validator.md +107 -7
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/perf-analyzer.md +98 -7
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/performance-benchmarker.md +95 -7
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/security-specialist.md +136 -9
- package/claude-assets/agents/cfn-dev-team/testers/api-testing-specialist.md +108 -1
- package/claude-assets/agents/cfn-dev-team/testers/chaos-engineering-specialist.md +107 -13
- package/claude-assets/agents/cfn-dev-team/testers/contract-tester.md +737 -0
- package/claude-assets/agents/cfn-dev-team/testers/e2e/playwright-tester.md +1 -1
- package/claude-assets/agents/cfn-dev-team/testers/integration-tester.md +828 -0
- package/claude-assets/agents/cfn-dev-team/testers/interaction-tester.md +106 -7
- package/claude-assets/agents/cfn-dev-team/testers/load-testing-specialist.md +77 -0
- package/claude-assets/agents/cfn-dev-team/testers/mutation-testing-specialist.md +684 -0
- package/claude-assets/agents/cfn-dev-team/testers/playwright-tester.md +110 -1
- package/claude-assets/agents/cfn-dev-team/testers/tester.md +94 -7
- package/claude-assets/agents/cfn-dev-team/utility/code-booster.md +1 -3
- package/claude-assets/agents/cfn-dev-team/utility/epic-creator.md +87 -13
- package/claude-assets/agents/cfn-dev-team/utility/memory-leak-specialist.md +103 -7
- package/claude-assets/agents/cfn-dev-team/utility/researcher.md +1 -3
- package/claude-assets/agents/cfn-dev-team/utility/z-ai-specialist.md +94 -7
- package/claude-assets/agents/docker-coordinators/cfn-docker-v3-coordinator.md +46 -0
- package/claude-assets/agents/project-only-agents/npm-package-specialist.md +1 -1
- package/claude-assets/cfn-extras/skills/advanced-features/cfn-agent-swap/recommend-swap.sh +59 -59
- package/claude-assets/cfn-extras/skills/analytics/cfn-improvement-recommender/recommend-improvements.sh +91 -91
- package/claude-assets/cfn-extras/skills/analytics/cfn-pattern-extraction/extract-patterns.sh +79 -79
- package/claude-assets/cfn-extras/skills/analytics/cfn-retrospective-report/generate-report.sh +100 -100
- package/claude-assets/cfn-extras/skills/analytics/cfn-telemetry/start-telemetry.sh +110 -110
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/add-bullet.sh +145 -145
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/log-merge.sh +67 -67
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/monitor-injection-performance.sh +137 -137
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/optimize-injection-pipeline.sh +168 -168
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/query-reflections.sh +35 -35
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/store-reflection.sh +45 -45
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/track-ab-test.sh +41 -41
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/update-reflection.sh +41 -41
- package/claude-assets/cfn-extras/skills/deprecated/cfn-cli-setup/validate-cli-environment.sh +191 -191
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/create-campaign.sh +231 -231
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/get-campaign-performance.sh +190 -190
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/pause-campaign.sh +142 -142
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/set-budget.sh +181 -181
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/update-bid-strategy.sh +133 -133
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/get-conversation-history.sh +121 -121
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/qualify-lead.sh +156 -156
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/schedule-demo.sh +181 -181
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/send-message.sh +137 -137
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/transfer-to-human.sh +179 -179
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/create-campaign.sh +183 -183
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/get-delivery-status.sh +139 -139
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/opt-out.sh +150 -150
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/schedule-campaign.sh +187 -187
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/send-sms.sh +181 -181
- package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/test-web-portal-skill.sh +50 -50
- package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/validate-deployment.sh +84 -84
- package/claude-assets/cfn-extras/skills/utility/cfn-environment-sanitization/sanitize-environment.sh +243 -243
- package/claude-assets/commands/cfn-loop-cli.md +29 -6
- package/claude-assets/commands/switch-api.md +31 -10
- package/claude-assets/hooks/cfn-lint-sql-injection.sh +61 -0
- package/claude-assets/hooks/cfn-post-edit-cfn-retrospective.sh +33 -2
- package/claude-assets/hooks/cfn-pre-edit-security-warning.sh +40 -0
- package/claude-assets/hooks/detect-hardcoded-credentials.sh +212 -0
- package/claude-assets/skills/SKILL_TEMPLATE.md +774 -0
- package/claude-assets/skills/agent-lifecycle/execute-lifecycle-hook.sh +84 -113
- package/claude-assets/skills/agent-lifecycle/simple-audit.sh +33 -6
- package/claude-assets/skills/agent-template-generator/SKILL.md +440 -0
- package/claude-assets/skills/agent-template-generator/generate-agent.sh +405 -0
- package/claude-assets/skills/agent-validation-linter/SKILL.md +589 -0
- package/claude-assets/skills/agent-validation-linter/lint-agents.sh +271 -0
- package/claude-assets/skills/bootstrap/bash-fundamentals.md +786 -0
- package/claude-assets/skills/bootstrap/database-connection.md +464 -0
- package/claude-assets/skills/bootstrap/error-handling.md +580 -0
- package/claude-assets/skills/bootstrap/file-operations.md +699 -0
- package/claude-assets/skills/bootstrap/skill-loader.md +616 -0
- package/claude-assets/skills/bootstrap/sqlite-params.sh +287 -0
- package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh +22 -24
- package/claude-assets/skills/cfn-automatic-memory-persistence/test-memory-persistence.sh +17 -16
- package/claude-assets/skills/cfn-deployment/SKILL.md +293 -0
- package/claude-assets/skills/cfn-deployment/execute.sh +21 -0
- package/claude-assets/skills/cfn-docker-agent-spawning/SKILL.md +28 -4
- package/claude-assets/skills/cfn-docker-agent-spawning/spawn-agent.sh +3 -1
- package/claude-assets/skills/cfn-docker-loop-orchestration/orchestrate.sh +224 -20
- package/claude-assets/skills/cfn-environment-sanitization/sanitize-environment.sh +38 -0
- package/claude-assets/skills/cfn-error-batching-strategy/lib/core-functions.sh +47 -47
- package/claude-assets/skills/cfn-file-operations/SKILL.md +290 -0
- package/claude-assets/skills/cfn-file-operations/execute.sh +129 -0
- package/claude-assets/skills/cfn-file-operations/lib/atomic-write.sh +294 -0
- package/claude-assets/skills/cfn-file-operations/lib/lock.sh +361 -0
- package/claude-assets/skills/cfn-file-operations/test.sh +369 -0
- package/claude-assets/skills/cfn-log-operations/SKILL.md +308 -0
- package/claude-assets/skills/cfn-log-operations/execute.sh +420 -0
- package/claude-assets/skills/cfn-log-operations/lib/rotate.sh +406 -0
- package/claude-assets/skills/cfn-log-operations/lib/search.sh +448 -0
- package/claude-assets/skills/cfn-log-operations/test.sh +394 -0
- package/claude-assets/skills/cfn-loop-orchestration/helpers/gate-check.sh +550 -46
- package/claude-assets/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +277 -0
- package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh +238 -29
- package/claude-assets/skills/cfn-loop-orchestration/security_utils.sh +24 -0
- package/claude-assets/skills/cfn-loop-orchestration/test-iteration-context-injection.sh +366 -0
- package/claude-assets/skills/cfn-parameterized-queries/SKILL.md +339 -0
- package/claude-assets/skills/cfn-playbook/query-playbook.sh +19 -15
- package/claude-assets/skills/cfn-playbook/update-playbook.sh +25 -14
- package/claude-assets/skills/cfn-process-instrumentation/instrument-process.sh +44 -0
- package/claude-assets/skills/cfn-promotion/SKILL.md +305 -0
- package/claude-assets/skills/cfn-redis-coordination/CENTRALIZED_REDIS_WRAPPER.md +319 -0
- package/claude-assets/skills/cfn-redis-coordination/agent-log.sh +4 -0
- package/claude-assets/skills/cfn-redis-coordination/agent-log.sh.bak +124 -0
- package/claude-assets/skills/cfn-redis-coordination/agent-recovery.sh +2 -2
- package/claude-assets/skills/cfn-redis-coordination/collect-confidence-scores.sh +30 -0
- package/claude-assets/skills/cfn-redis-coordination/get-context.sh +33 -0
- package/claude-assets/skills/cfn-redis-coordination/get-success-criteria.sh +54 -0
- package/claude-assets/skills/cfn-redis-coordination/invoke-waiting-mode.sh +6 -2
- package/claude-assets/skills/cfn-redis-coordination/redis-cli-wrapper.sh +24 -3
- package/claude-assets/skills/cfn-redis-coordination/redis-functions.sh +34 -0
- package/claude-assets/skills/cfn-redis-coordination/report-completion.sh +24 -31
- package/claude-assets/skills/cfn-redis-coordination/store-context.sh +4 -0
- package/claude-assets/skills/cfn-redis-coordination/store-success-criteria.sh +85 -0
- package/claude-assets/skills/cfn-redis-coordination/update-all-scripts.sh +67 -0
- package/claude-assets/skills/cfn-skill-loader/SKILL.md +466 -0
- package/claude-assets/skills/cfn-skill-loader/execute.sh +344 -0
- package/claude-assets/skills/cfn-sqlite-memory/ttl-cleanup.sh +17 -25
- package/claude-assets/skills/cfn-task-audit/get-audit-data.sh +42 -21
- package/claude-assets/skills/cfn-task-audit/store-task-audit.sh +17 -10
- package/claude-assets/skills/cfn-test-runner/detect-regressions.sh +17 -14
- package/claude-assets/skills/cfn-test-runner/detect-regressions.sh.backup-1763392821 +55 -0
- package/claude-assets/skills/cfn-test-runner/store-benchmarks.sh +17 -19
- package/claude-assets/skills/cfn-transparency-middleware/test-e2e.sh +15 -0
- package/claude-assets/skills/cfn-transparency-middleware/tests/input-validation.sh +15 -0
- package/claude-assets/skills/cfn-utilities/SKILL.md +237 -0
- package/claude-assets/skills/cfn-utilities/execute.sh +32 -0
- package/claude-assets/skills/cfn-utilities/lib/errors.sh +56 -0
- package/claude-assets/skills/cfn-utilities/lib/file-ops.sh +164 -0
- package/claude-assets/skills/cfn-utilities/lib/logging.sh +77 -0
- package/claude-assets/skills/cfn-utilities/lib/retry.sh +127 -0
- package/claude-assets/skills/cfn-utilities/test.sh +317 -0
- package/claude-assets/skills/integration/agent-handoff.sh +62 -64
- package/claude-assets/skills/json-validation/SKILL.md +431 -0
- package/claude-assets/skills/json-validation/test-validate-success-criteria.sh +421 -0
- package/claude-assets/skills/json-validation/validate-success-criteria.sh +197 -0
- package/claude-assets/skills/redis-coordination/validate-parameters.sh +34 -0
- package/claude-assets/skills/workflow-codification/DEPLOY_QUICK_REFERENCE.md +106 -0
- package/claude-assets/skills/workflow-codification/PROPAGATE_UPDATE_QUICK_REFERENCE.md +366 -0
- package/claude-assets/skills/workflow-codification/deploy-approved-skill.sh +481 -0
- package/claude-assets/skills/workflow-codification/deploy-approved-skill.sh.backup-1763392820 +512 -0
- package/claude-assets/skills/workflow-codification/lib/security-utils.sh +204 -0
- package/claude-assets/skills/workflow-codification/propagate-skill-update.sh +648 -0
- package/claude-assets/skills/workflow-codification/propagate-skill-update.sh.backup-1763392820 +664 -0
- package/claude-assets/skills/workflow-codification/test-integration.sh +15 -0
- package/claude-assets/skills/workflow-codification/test-metadata-update.sh +350 -0
- package/claude-assets/skills/workflow-codification/track-cost-savings.sh +55 -14
- package/claude-assets/skills/workflow-codification/track-cost-savings.sh.backup-1763392821 +445 -0
- package/claude-assets/skills/workflow-codification/track-edge-case.sh +27 -60
- package/claude-assets/skills/workflow-codification/workflow-codification.db +0 -0
- package/dist/ace/ace-curator.js +10 -2
- package/dist/ace/ace-curator.js.map +1 -1
- package/dist/ace/ace-generator.js +4 -0
- package/dist/ace/ace-generator.js.map +1 -1
- package/dist/ace/ace-reflector.js +1 -1
- package/dist/ace/ace-reflector.js.map +1 -1
- package/dist/ace/context-injection.js +24 -2
- package/dist/ace/context-injection.js.map +1 -1
- package/dist/agents/task-agent-integration.js +1 -1
- package/dist/agents/task-agent-integration.js.map +1 -1
- package/dist/api/health-endpoints.js +390 -0
- package/dist/api/health-endpoints.js.map +1 -0
- package/dist/cli/agent-executor.js +4 -1
- package/dist/cli/agent-executor.js.map +1 -1
- package/dist/cli/agent-prompt-builder.js +89 -1
- package/dist/cli/agent-prompt-builder.js.map +1 -1
- package/dist/cli/agent-spawn.js +130 -37
- package/dist/cli/agent-spawn.js.map +1 -1
- package/dist/cli/config-manager.js +109 -91
- package/dist/cli/config-manager.js.map +1 -1
- package/dist/cli/conversation-fork-cleanup.js +201 -0
- package/dist/cli/conversation-fork-cleanup.js.map +1 -0
- package/dist/cli/conversation-fork.js +16 -3
- package/dist/cli/conversation-fork.js.map +1 -1
- package/dist/cli/skill-cache-validator.js +412 -0
- package/dist/cli/skill-cache-validator.js.map +1 -0
- package/dist/cli/skill-cli.js +991 -0
- package/dist/cli/skill-cli.js.map +1 -0
- package/dist/cli/skill-execution-logger.js +284 -0
- package/dist/cli/skill-execution-logger.js.map +1 -0
- package/dist/cli/skill-loader.js +457 -0
- package/dist/cli/skill-loader.js.map +1 -0
- package/dist/coordination/event-bus.js +2 -2
- package/dist/coordination/event-bus.js.map +1 -1
- package/dist/coordination/fleet-manager.js +1 -1
- package/dist/coordination/fleet-manager.js.map +1 -1
- package/dist/coordination/index.js +23 -9
- package/dist/coordination/index.js.map +1 -1
- package/dist/coordination/types/fleet-manager.types.js.map +1 -1
- package/dist/db/migration-manager.js +483 -0
- package/dist/db/migration-manager.js.map +1 -0
- package/dist/db/skills-query.js +535 -0
- package/dist/db/skills-query.js.map +1 -0
- package/dist/integration/DatabaseHandoff.js +1 -1
- package/dist/integration/DatabaseHandoff.js.map +1 -1
- package/dist/jobs/edge-case-analyzer.js +367 -0
- package/dist/jobs/edge-case-analyzer.js.map +1 -0
- package/dist/jobs/promotion-sla-enforcer.js +288 -0
- package/dist/jobs/promotion-sla-enforcer.js.map +1 -0
- package/dist/lib/agent-output-parser.js.map +1 -1
- package/dist/lib/agent-output-validator.js.map +1 -1
- package/dist/lib/agent-workspace.js +281 -0
- package/dist/lib/agent-workspace.js.map +1 -0
- package/dist/lib/atomic-file-writer.js +377 -0
- package/dist/lib/atomic-file-writer.js.map +1 -0
- package/dist/lib/backup-manager.js +779 -0
- package/dist/lib/backup-manager.js.map +1 -0
- package/dist/lib/checkpoint-manager.js +837 -0
- package/dist/lib/checkpoint-manager.js.map +1 -0
- package/dist/lib/circuit-breaker.js +340 -0
- package/dist/lib/circuit-breaker.js.map +1 -0
- package/dist/lib/completion-signal-handler.js +243 -0
- package/dist/lib/completion-signal-handler.js.map +1 -0
- package/dist/lib/config-manager.js +312 -0
- package/dist/lib/config-manager.js.map +1 -0
- package/dist/lib/config-migrator.js +386 -0
- package/dist/lib/config-migrator.js.map +1 -0
- package/dist/lib/config-validator.js.map +1 -1
- package/dist/lib/correlation-cache.js +311 -0
- package/dist/lib/correlation-cache.js.map +1 -0
- package/dist/lib/correlation.js +263 -0
- package/dist/lib/correlation.js.map +1 -0
- package/dist/lib/database-service/connection-pool-manager.js +520 -0
- package/dist/lib/database-service/connection-pool-manager.js.map +1 -0
- package/dist/lib/database-service/correlation.js +329 -0
- package/dist/lib/database-service/correlation.js.map +1 -0
- package/dist/lib/database-service/errors.js +120 -0
- package/dist/lib/database-service/errors.js.map +1 -0
- package/dist/lib/database-service/index.js +168 -0
- package/dist/lib/database-service/index.js.map +1 -0
- package/dist/lib/database-service/postgres-adapter.js +526 -0
- package/dist/lib/database-service/postgres-adapter.js.map +1 -0
- package/dist/lib/database-service/redis-adapter.js +360 -0
- package/dist/lib/database-service/redis-adapter.js.map +1 -0
- package/dist/lib/database-service/sqlite-adapter.js +544 -0
- package/dist/lib/database-service/sqlite-adapter.js.map +1 -0
- package/dist/lib/database-service/transaction-manager.js +773 -0
- package/dist/lib/database-service/transaction-manager.js.map +1 -0
- package/dist/lib/database-service/types.js +23 -0
- package/dist/lib/database-service/types.js.map +1 -0
- package/dist/lib/deadlock-resolver.js +292 -0
- package/dist/lib/deadlock-resolver.js.map +1 -0
- package/dist/lib/distributed-lock.js +451 -0
- package/dist/lib/distributed-lock.js.map +1 -0
- package/dist/lib/edge-case-deduplicator.js +227 -0
- package/dist/lib/edge-case-deduplicator.js.map +1 -0
- package/dist/lib/encryption-manager.js +322 -0
- package/dist/lib/encryption-manager.js.map +1 -0
- package/dist/lib/error-aggregator.js +234 -0
- package/dist/lib/error-aggregator.js.map +1 -0
- package/dist/lib/errors.js +287 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/file-lock-manager.js +578 -0
- package/dist/lib/file-lock-manager.js.map +1 -0
- package/dist/lib/file-operations.js +367 -0
- package/dist/lib/file-operations.js.map +1 -0
- package/dist/lib/idempotent-write.js +237 -0
- package/dist/lib/idempotent-write.js.map +1 -0
- package/dist/lib/integration-schema-validator.js +522 -0
- package/dist/lib/integration-schema-validator.js.map +1 -0
- package/dist/lib/lock-health-monitor.js +298 -0
- package/dist/lib/lock-health-monitor.js.map +1 -0
- package/dist/lib/log-shipper.js +422 -0
- package/dist/lib/log-shipper.js.map +1 -0
- package/dist/lib/logging.js +146 -0
- package/dist/lib/logging.js.map +1 -0
- package/dist/lib/message-deduplicator.js +439 -0
- package/dist/lib/message-deduplicator.js.map +1 -0
- package/dist/lib/multi-system-query.js +604 -0
- package/dist/lib/multi-system-query.js.map +1 -0
- package/dist/lib/orphan-detector.js +332 -0
- package/dist/lib/orphan-detector.js.map +1 -0
- package/dist/lib/password-generator.js +166 -0
- package/dist/lib/password-generator.js.map +1 -0
- package/dist/lib/path-validator.js +429 -0
- package/dist/lib/path-validator.js.map +1 -0
- package/dist/lib/query-translator.js +905 -0
- package/dist/lib/query-translator.js.map +1 -0
- package/dist/lib/queue-recovery.js +469 -0
- package/dist/lib/queue-recovery.js.map +1 -0
- package/dist/lib/redis-queue-manager.js +512 -0
- package/dist/lib/redis-queue-manager.js.map +1 -0
- package/dist/lib/reflection-archiver.js +272 -0
- package/dist/lib/reflection-archiver.js.map +1 -0
- package/dist/lib/retry-manager.js +453 -0
- package/dist/lib/retry-manager.js.map +1 -0
- package/dist/lib/retry.js +262 -0
- package/dist/lib/retry.js.map +1 -0
- package/dist/lib/schema-transform.js +695 -0
- package/dist/lib/schema-transform.js.map +1 -0
- package/dist/lib/schema-validator.js +491 -0
- package/dist/lib/schema-validator.js.map +1 -0
- package/dist/lib/skill-cache.js +297 -0
- package/dist/lib/skill-cache.js.map +1 -0
- package/dist/lib/skill-content-manager.js +337 -0
- package/dist/lib/skill-content-manager.js.map +1 -0
- package/dist/lib/skill-frontmatter-parser.js +237 -0
- package/dist/lib/skill-frontmatter-parser.js.map +1 -0
- package/dist/lib/skill-git-integration.js +275 -0
- package/dist/lib/skill-git-integration.js.map +1 -0
- package/dist/lib/skill-markdown-validator.js +396 -0
- package/dist/lib/skill-markdown-validator.js.map +1 -0
- package/dist/lib/skill-output-parser.js +312 -0
- package/dist/lib/skill-output-parser.js.map +1 -0
- package/dist/lib/unified-query-api.js +467 -0
- package/dist/lib/unified-query-api.js.map +1 -0
- package/dist/middleware/auth-middleware.js +350 -0
- package/dist/middleware/auth-middleware.js.map +1 -0
- package/dist/middleware/schema-validation.js +347 -0
- package/dist/middleware/schema-validation.js.map +1 -0
- package/dist/providers/anthropic-provider.js +1 -1
- package/dist/providers/anthropic-provider.js.map +1 -1
- package/dist/providers/provider-factory.js +2 -2
- package/dist/providers/provider-factory.js.map +1 -1
- package/dist/services/edge-case-analyzer.js +321 -0
- package/dist/services/edge-case-analyzer.js.map +1 -0
- package/dist/services/edge-case-deduplicator.js +266 -0
- package/dist/services/edge-case-deduplicator.js.map +1 -0
- package/dist/services/edge-case-detector.js +337 -0
- package/dist/services/edge-case-detector.js.map +1 -0
- package/dist/services/edge-case-tracker.js +547 -0
- package/dist/services/edge-case-tracker.js.map +1 -0
- package/dist/services/health-check-system.js +586 -0
- package/dist/services/health-check-system.js.map +1 -0
- package/dist/services/metrics-logger.js +412 -0
- package/dist/services/metrics-logger.js.map +1 -0
- package/dist/services/patch-generator.js +378 -0
- package/dist/services/patch-generator.js.map +1 -0
- package/dist/services/patch-validator.js +337 -0
- package/dist/services/patch-validator.js.map +1 -0
- package/dist/services/performance-monitor.js +811 -0
- package/dist/services/performance-monitor.js.map +1 -0
- package/dist/services/promotion-pipeline.js +918 -0
- package/dist/services/promotion-pipeline.js.map +1 -0
- package/dist/services/promotion-validator.js +394 -0
- package/dist/services/promotion-validator.js.map +1 -0
- package/dist/services/reflection-logger.js +388 -0
- package/dist/services/reflection-logger.js.map +1 -0
- package/dist/services/skill-deployment.js +472 -0
- package/dist/services/skill-deployment.js.map +1 -0
- package/dist/services/skill-loader.js +427 -0
- package/dist/services/skill-loader.js.map +1 -0
- package/dist/services/skill-promotion.js +372 -0
- package/dist/services/skill-promotion.js.map +1 -0
- package/dist/services/skill-validator.js +454 -0
- package/dist/services/skill-validator.js.map +1 -0
- package/dist/services/skill-versioning.js +244 -0
- package/dist/services/skill-versioning.js.map +1 -0
- package/dist/services/workspace-supervisor.js +597 -0
- package/dist/services/workspace-supervisor.js.map +1 -0
- package/dist/types/edge-case.js +45 -0
- package/dist/types/edge-case.js.map +1 -0
- package/docs/BUG_19_MEMORY_LEAK_TASK_MODE.md +405 -0
- package/docs/MEMORY_CLEANUP_GUIDE.md +358 -0
- package/docs/MEMORY_LEAK_FIX_SUMMARY.md +322 -0
- package/docs/REDIS_CLEANUP_EXECUTIVE_SUMMARY.md +319 -0
- package/docs/REDIS_CLEANUP_VERIFICATION_REPORT.md +574 -0
- package/package.json +35 -4
- package/readme/README.md +53 -5
- package/scripts/backup-cleanup.sh +627 -0
- package/scripts/cleanup-workspaces.sh +412 -0
- package/scripts/cleanup-yaml-configs.sh +141 -0
- package/scripts/deploy-approved-skills.sh +263 -0
- package/scripts/health-check.sh +447 -0
- package/scripts/log-aggregator.sh +554 -0
- package/scripts/log-monitor.sh +629 -0
- package/scripts/manage-agent-workspaces.sh +434 -0
- package/scripts/migrate-schema.sh +533 -0
- package/scripts/promote-staged-skills.sh +423 -0
- package/scripts/verify-no-secrets.sh +88 -35
- package/scripts/verify-redis-cleanup.sh +173 -0
- package/tests/README.md +84 -0
- package/tests/test-memory-leak-task-mode.sh +435 -0
- package/.claude/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +0 -161
- package/.claude/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +0 -728
- package/.claude/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +0 -131
- package/.claude/skills/agent-lifecycle/SKILL.md +0 -60
- package/.claude/skills/agent-lifecycle/execute-lifecycle-hook.sh +0 -573
- package/.claude/skills/agent-lifecycle/simple-audit.sh +0 -31
- package/.claude/skills/cfn-agent-spawning/spawn-agent.sh.backup +0 -273
- package/.claude/skills/cfn-loop-orchestration/orchestrate.sh.backup +0 -949
- package/README.md.backup_before_replace +0 -781
- package/claude-assets/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +0 -161
- package/claude-assets/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +0 -728
- package/claude-assets/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +0 -131
- package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh.backup +0 -273
- package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh.backup +0 -949
|
@@ -95,7 +95,7 @@ export class ACEReflector {
|
|
|
95
95
|
}
|
|
96
96
|
async reflect(context, options = {}) {
|
|
97
97
|
const reflection = {
|
|
98
|
-
id: `ref-${Date.now()}`,
|
|
98
|
+
id: `ref-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
|
|
99
99
|
timestamp: Date.now(),
|
|
100
100
|
complexity: options.complexity ?? this.calculateComplexity(context),
|
|
101
101
|
context,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/ace/ace-reflector.ts"],"sourcesContent":["import { SQLiteMemorySystem } from '../memory/sqlite-memory-system.js';\r\nimport { MemoryAdapter, AccessLevel } from '../memory/memory-adapter.js';\r\n\r\nexport interface CognitiveReflection {\r\n id: string;\r\n timestamp: number;\r\n complexity: number;\r\n context: Record<string, any>;\r\n insights: string[];\r\n}\r\n\r\nexport class ACEReflector {\r\n private memorySystem: SQLiteMemorySystem;\r\n private memoryAdapter: MemoryAdapter;\r\n\r\n constructor(\r\n memoryPath: string = './ace-reflections.sqlite'\r\n ) {\r\n this.memorySystem = new SQLiteMemorySystem(memoryPath);\r\n this.memoryAdapter = new MemoryAdapter(AccessLevel.SYSTEM);\r\n }\r\n\r\n async initialize(): Promise<void> {\r\n await this.memorySystem.initialize();\r\n\r\n // Note: Production schema is managed by .claude/skills/cfn-ace-system/schema/001-create-context-reflections.sql\r\n // This initialization ensures compatibility with the production schema\r\n\r\n // Apply performance indexes from init-indexes.sql\r\n await this.applyPerformanceIndexes();\r\n }\r\n\r\n /**\r\n * Apply performance indexes for context reflection queries\r\n * Based on .claude/skills/cfn-ace-system/init-indexes.sql\r\n * Target: < 100ms query time with 1000+ reflections\r\n */\r\n private async applyPerformanceIndexes(): Promise<void> {\r\n const db = this.memorySystem['db'];\r\n if (!db) {\r\n console.warn('⚠️ Database not initialized, skipping index creation');\r\n return;\r\n }\r\n\r\n // Check if context_reflections table exists\r\n const tableExists = await db.get<{ count: number }>(\r\n \"SELECT COUNT(*) as count FROM sqlite_master WHERE type='table' AND name='context_reflections'\"\r\n );\r\n\r\n if (!tableExists || tableExists.count === 0) {\r\n console.warn('⚠️ context_reflections table not found. Run schema migration first.');\r\n console.warn(' Use: .claude/skills/cfn-ace-system/schema/run-migration.sh');\r\n return;\r\n }\r\n\r\n const indexes = [\r\n // JSON Tag Extraction Index (most common query pattern)\r\n {\r\n name: 'idx_reflections_tags',\r\n sql: `CREATE INDEX IF NOT EXISTS idx_reflections_tags\r\n ON context_reflections(json_extract(metadata, '$.tags'))`\r\n },\r\n // Domain Classification Index\r\n {\r\n name: 'idx_reflections_domain',\r\n sql: `CREATE INDEX IF NOT EXISTS idx_reflections_domain\r\n ON context_reflections(json_extract(metadata, '$.domain'))`\r\n },\r\n // Confidence Score Index (DESC for high-to-low sorting)\r\n {\r\n name: 'idx_reflections_confidence',\r\n sql: `CREATE INDEX IF NOT EXISTS idx_reflections_confidence\r\n ON context_reflections(confidence DESC)`\r\n },\r\n // Recency Index (DESC for chronological sorting)\r\n {\r\n name: 'idx_reflections_created_at',\r\n sql: `CREATE INDEX IF NOT EXISTS idx_reflections_created_at\r\n ON context_reflections(created_at DESC)`\r\n },\r\n // Composite Index: Domain + Confidence + Recency\r\n {\r\n name: 'idx_reflections_domain_conf_date',\r\n sql: `CREATE INDEX IF NOT EXISTS idx_reflections_domain_conf_date\r\n ON context_reflections(\r\n json_extract(metadata, '$.domain'),\r\n confidence,\r\n created_at DESC\r\n )`\r\n },\r\n // Composite Index: Confidence + Recency (covering index)\r\n {\r\n name: 'idx_reflections_conf_date',\r\n sql: `CREATE INDEX IF NOT EXISTS idx_reflections_conf_date\r\n ON context_reflections(\r\n confidence DESC,\r\n created_at DESC\r\n )`\r\n }\r\n ];\r\n\r\n let successCount = 0;\r\n const failedIndexes: string[] = [];\r\n\r\n for (const index of indexes) {\r\n try {\r\n await db.run(index.sql);\r\n successCount++;\r\n } catch (error) {\r\n failedIndexes.push(index.name);\r\n console.error(`❌ Failed to create index ${index.name}:`, error);\r\n }\r\n }\r\n\r\n if (successCount === indexes.length) {\r\n console.log(`✅ Applied ${successCount} performance indexes (target: <100ms query time)`);\r\n } else {\r\n console.warn(`⚠️ Applied ${successCount}/${indexes.length} indexes. Failed: ${failedIndexes.join(', ')}`);\r\n }\r\n }\r\n\r\n async reflect(\r\n context: Record<string, any>,\r\n options: {\r\n complexity?: number\r\n } = {}\r\n ): Promise<CognitiveReflection> {\r\n const reflection: CognitiveReflection = {\r\n id: `ref-${Date.now()}`,\r\n timestamp: Date.now(),\r\n complexity: options.complexity ?? this.calculateComplexity(context),\r\n context,\r\n insights: this.generateInsights(context)\r\n };\r\n\r\n await this.memorySystem.store(\r\n `reflection:${reflection.id}`,\r\n reflection,\r\n AccessLevel.SYSTEM\r\n );\r\n\r\n // Insert reflection data into SQL table (production schema)\r\n await this.memorySystem['db']?.run(\r\n `INSERT INTO context_reflections (\r\n id, reflection_type, task_id, swarm_id, execution_trace,\r\n feedback_signals, extracted_lessons, metadata, confidence\r\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\r\n [\r\n reflection.id,\r\n 'strategy', // Default reflection type\r\n reflection.context.task_id || 'unknown',\r\n reflection.context.swarm_id || 'default',\r\n JSON.stringify({ timestamp: reflection.timestamp, complexity: reflection.complexity }),\r\n JSON.stringify({ insights: reflection.insights }),\r\n JSON.stringify({ strategies: reflection.insights, antiPatterns: [], edgeCases: [] }),\r\n JSON.stringify({ complexity: reflection.complexity }),\r\n reflection.complexity // Use complexity as confidence proxy\r\n ]\r\n );\r\n\r\n return reflection;\r\n }\r\n\r\n private calculateComplexity(\r\n context: Record<string, any>\r\n ): number {\r\n // Advanced complexity calculation\r\n const keyCount = Object.keys(context).length;\r\n const contentLength = JSON.stringify(context).length;\r\n\r\n return Math.log(keyCount * contentLength) / Math.log(10);\r\n }\r\n\r\n private generateInsights(\r\n context: Record<string, any>\r\n ): string[] {\r\n // Meta-cognitive analysis\r\n const insights: string[] = [];\r\n\r\n if (context.task && context.constraints) {\r\n insights.push(`Task complexity requires careful constraint management`);\r\n }\r\n\r\n if (context.previousResults) {\r\n insights.push(`Learning from past iterations`);\r\n }\r\n\r\n return insights;\r\n }\r\n\r\n async retrieveReflection(\r\n reflectionId: string\r\n ): Promise<CognitiveReflection | null> {\r\n return await this.memorySystem.retrieve(\r\n `reflection:${reflectionId}`,\r\n AccessLevel.SYSTEM\r\n );\r\n }\r\n}\r\n\r\nexport default ACEReflector;"],"names":["SQLiteMemorySystem","MemoryAdapter","AccessLevel","ACEReflector","memorySystem","memoryAdapter","memoryPath","SYSTEM","initialize","applyPerformanceIndexes","db","console","warn","tableExists","get","count","indexes","name","sql","successCount","failedIndexes","index","run","error","push","length","log","join","reflect","context","options","reflection","id","Date","now","timestamp","complexity","calculateComplexity","insights","generateInsights","store","task_id","swarm_id","JSON","stringify","strategies","antiPatterns","edgeCases","keyCount","Object","keys","contentLength","Math","task","constraints","previousResults","retrieveReflection","reflectionId","retrieve"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/ace/ace-reflector.ts"],"sourcesContent":["import { SQLiteMemorySystem } from '../memory/sqlite-memory-system.js';\r\nimport { MemoryAdapter, AccessLevel } from '../memory/memory-adapter.js';\r\n\r\nexport interface CognitiveReflection {\r\n id: string;\r\n timestamp: number;\r\n complexity: number;\r\n context: Record<string, any>;\r\n insights: string[];\r\n}\r\n\r\nexport class ACEReflector {\r\n private memorySystem: SQLiteMemorySystem;\r\n private memoryAdapter: MemoryAdapter;\r\n\r\n constructor(\r\n memoryPath: string = './ace-reflections.sqlite'\r\n ) {\r\n this.memorySystem = new SQLiteMemorySystem(memoryPath);\r\n this.memoryAdapter = new MemoryAdapter(AccessLevel.SYSTEM);\r\n }\r\n\r\n async initialize(): Promise<void> {\r\n await this.memorySystem.initialize();\r\n\r\n // Note: Production schema is managed by .claude/skills/cfn-ace-system/schema/001-create-context-reflections.sql\r\n // This initialization ensures compatibility with the production schema\r\n\r\n // Apply performance indexes from init-indexes.sql\r\n await this.applyPerformanceIndexes();\r\n }\r\n\r\n /**\r\n * Apply performance indexes for context reflection queries\r\n * Based on .claude/skills/cfn-ace-system/init-indexes.sql\r\n * Target: < 100ms query time with 1000+ reflections\r\n */\r\n private async applyPerformanceIndexes(): Promise<void> {\r\n const db = this.memorySystem['db'];\r\n if (!db) {\r\n console.warn('⚠️ Database not initialized, skipping index creation');\r\n return;\r\n }\r\n\r\n // Check if context_reflections table exists\r\n const tableExists = await db.get<{ count: number }>(\r\n \"SELECT COUNT(*) as count FROM sqlite_master WHERE type='table' AND name='context_reflections'\"\r\n );\r\n\r\n if (!tableExists || tableExists.count === 0) {\r\n console.warn('⚠️ context_reflections table not found. Run schema migration first.');\r\n console.warn(' Use: .claude/skills/cfn-ace-system/schema/run-migration.sh');\r\n return;\r\n }\r\n\r\n const indexes = [\r\n // JSON Tag Extraction Index (most common query pattern)\r\n {\r\n name: 'idx_reflections_tags',\r\n sql: `CREATE INDEX IF NOT EXISTS idx_reflections_tags\r\n ON context_reflections(json_extract(metadata, '$.tags'))`\r\n },\r\n // Domain Classification Index\r\n {\r\n name: 'idx_reflections_domain',\r\n sql: `CREATE INDEX IF NOT EXISTS idx_reflections_domain\r\n ON context_reflections(json_extract(metadata, '$.domain'))`\r\n },\r\n // Confidence Score Index (DESC for high-to-low sorting)\r\n {\r\n name: 'idx_reflections_confidence',\r\n sql: `CREATE INDEX IF NOT EXISTS idx_reflections_confidence\r\n ON context_reflections(confidence DESC)`\r\n },\r\n // Recency Index (DESC for chronological sorting)\r\n {\r\n name: 'idx_reflections_created_at',\r\n sql: `CREATE INDEX IF NOT EXISTS idx_reflections_created_at\r\n ON context_reflections(created_at DESC)`\r\n },\r\n // Composite Index: Domain + Confidence + Recency\r\n {\r\n name: 'idx_reflections_domain_conf_date',\r\n sql: `CREATE INDEX IF NOT EXISTS idx_reflections_domain_conf_date\r\n ON context_reflections(\r\n json_extract(metadata, '$.domain'),\r\n confidence,\r\n created_at DESC\r\n )`\r\n },\r\n // Composite Index: Confidence + Recency (covering index)\r\n {\r\n name: 'idx_reflections_conf_date',\r\n sql: `CREATE INDEX IF NOT EXISTS idx_reflections_conf_date\r\n ON context_reflections(\r\n confidence DESC,\r\n created_at DESC\r\n )`\r\n }\r\n ];\r\n\r\n let successCount = 0;\r\n const failedIndexes: string[] = [];\r\n\r\n for (const index of indexes) {\r\n try {\r\n await db.run(index.sql);\r\n successCount++;\r\n } catch (error) {\r\n failedIndexes.push(index.name);\r\n console.error(`❌ Failed to create index ${index.name}:`, error);\r\n }\r\n }\r\n\r\n if (successCount === indexes.length) {\r\n console.log(`✅ Applied ${successCount} performance indexes (target: <100ms query time)`);\r\n } else {\r\n console.warn(`⚠️ Applied ${successCount}/${indexes.length} indexes. Failed: ${failedIndexes.join(', ')}`);\r\n }\r\n }\r\n\r\n async reflect(\r\n context: Record<string, any>,\r\n options: {\r\n complexity?: number\r\n } = {}\r\n ): Promise<CognitiveReflection> {\r\n const reflection: CognitiveReflection = {\r\n id: `ref-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\r\n timestamp: Date.now(),\r\n complexity: options.complexity ?? this.calculateComplexity(context),\r\n context,\r\n insights: this.generateInsights(context)\r\n };\r\n\r\n await this.memorySystem.store(\r\n `reflection:${reflection.id}`,\r\n reflection,\r\n AccessLevel.SYSTEM\r\n );\r\n\r\n // Insert reflection data into SQL table (production schema)\r\n await this.memorySystem['db']?.run(\r\n `INSERT INTO context_reflections (\r\n id, reflection_type, task_id, swarm_id, execution_trace,\r\n feedback_signals, extracted_lessons, metadata, confidence\r\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\r\n [\r\n reflection.id,\r\n 'strategy', // Default reflection type\r\n reflection.context.task_id || 'unknown',\r\n reflection.context.swarm_id || 'default',\r\n JSON.stringify({ timestamp: reflection.timestamp, complexity: reflection.complexity }),\r\n JSON.stringify({ insights: reflection.insights }),\r\n JSON.stringify({ strategies: reflection.insights, antiPatterns: [], edgeCases: [] }),\r\n JSON.stringify({ complexity: reflection.complexity }),\r\n reflection.complexity // Use complexity as confidence proxy\r\n ]\r\n );\r\n\r\n return reflection;\r\n }\r\n\r\n private calculateComplexity(\r\n context: Record<string, any>\r\n ): number {\r\n // Advanced complexity calculation\r\n const keyCount = Object.keys(context).length;\r\n const contentLength = JSON.stringify(context).length;\r\n\r\n return Math.log(keyCount * contentLength) / Math.log(10);\r\n }\r\n\r\n private generateInsights(\r\n context: Record<string, any>\r\n ): string[] {\r\n // Meta-cognitive analysis\r\n const insights: string[] = [];\r\n\r\n if (context.task && context.constraints) {\r\n insights.push(`Task complexity requires careful constraint management`);\r\n }\r\n\r\n if (context.previousResults) {\r\n insights.push(`Learning from past iterations`);\r\n }\r\n\r\n return insights;\r\n }\r\n\r\n async retrieveReflection(\r\n reflectionId: string\r\n ): Promise<CognitiveReflection | null> {\r\n return await this.memorySystem.retrieve(\r\n `reflection:${reflectionId}`,\r\n AccessLevel.SYSTEM\r\n );\r\n }\r\n}\r\n\r\nexport default ACEReflector;"],"names":["SQLiteMemorySystem","MemoryAdapter","AccessLevel","ACEReflector","memorySystem","memoryAdapter","memoryPath","SYSTEM","initialize","applyPerformanceIndexes","db","console","warn","tableExists","get","count","indexes","name","sql","successCount","failedIndexes","index","run","error","push","length","log","join","reflect","context","options","reflection","id","Date","now","Math","random","toString","substr","timestamp","complexity","calculateComplexity","insights","generateInsights","store","task_id","swarm_id","JSON","stringify","strategies","antiPatterns","edgeCases","keyCount","Object","keys","contentLength","task","constraints","previousResults","retrieveReflection","reflectionId","retrieve"],"mappings":"AAAA,SAASA,kBAAkB,QAAQ,oCAAoC;AACvE,SAASC,aAAa,EAAEC,WAAW,QAAQ,8BAA8B;AAUzE,OAAO,MAAMC;IACHC,aAAiC;IACjCC,cAA6B;IAErC,YACEC,aAAqB,0BAA0B,CAC/C;QACA,IAAI,CAACF,YAAY,GAAG,IAAIJ,mBAAmBM;QAC3C,IAAI,CAACD,aAAa,GAAG,IAAIJ,cAAcC,YAAYK,MAAM;IAC3D;IAEA,MAAMC,aAA4B;QAChC,MAAM,IAAI,CAACJ,YAAY,CAACI,UAAU;QAElC,gHAAgH;QAChH,uEAAuE;QAEvE,kDAAkD;QAClD,MAAM,IAAI,CAACC,uBAAuB;IACpC;IAEA;;;;GAIC,GACD,MAAcA,0BAAyC;QACrD,MAAMC,KAAK,IAAI,CAACN,YAAY,CAAC,KAAK;QAClC,IAAI,CAACM,IAAI;YACPC,QAAQC,IAAI,CAAC;YACb;QACF;QAEA,4CAA4C;QAC5C,MAAMC,cAAc,MAAMH,GAAGI,GAAG,CAC9B;QAGF,IAAI,CAACD,eAAeA,YAAYE,KAAK,KAAK,GAAG;YAC3CJ,QAAQC,IAAI,CAAC;YACbD,QAAQC,IAAI,CAAC;YACb;QACF;QAEA,MAAMI,UAAU;YACd,wDAAwD;YACxD;gBACEC,MAAM;gBACNC,KAAK,CAAC;sEACwD,CAAC;YACjE;YACA,8BAA8B;YAC9B;gBACED,MAAM;gBACNC,KAAK,CAAC;wEAC0D,CAAC;YACnE;YACA,wDAAwD;YACxD;gBACED,MAAM;gBACNC,KAAK,CAAC;qDACuC,CAAC;YAChD;YACA,iDAAiD;YACjD;gBACED,MAAM;gBACNC,KAAK,CAAC;qDACuC,CAAC;YAChD;YACA,iDAAiD;YACjD;gBACED,MAAM;gBACNC,KAAK,CAAC;;;;;eAKC,CAAC;YACV;YACA,yDAAyD;YACzD;gBACED,MAAM;gBACNC,KAAK,CAAC;;;;eAIC,CAAC;YACV;SACD;QAED,IAAIC,eAAe;QACnB,MAAMC,gBAA0B,EAAE;QAElC,KAAK,MAAMC,SAASL,QAAS;YAC3B,IAAI;gBACF,MAAMN,GAAGY,GAAG,CAACD,MAAMH,GAAG;gBACtBC;YACF,EAAE,OAAOI,OAAO;gBACdH,cAAcI,IAAI,CAACH,MAAMJ,IAAI;gBAC7BN,QAAQY,KAAK,CAAC,CAAC,yBAAyB,EAAEF,MAAMJ,IAAI,CAAC,CAAC,CAAC,EAAEM;YAC3D;QACF;QAEA,IAAIJ,iBAAiBH,QAAQS,MAAM,EAAE;YACnCd,QAAQe,GAAG,CAAC,CAAC,UAAU,EAAEP,aAAa,gDAAgD,CAAC;QACzF,OAAO;YACLR,QAAQC,IAAI,CAAC,CAAC,WAAW,EAAEO,aAAa,CAAC,EAAEH,QAAQS,MAAM,CAAC,kBAAkB,EAAEL,cAAcO,IAAI,CAAC,OAAO;QAC1G;IACF;IAEA,MAAMC,QACJC,OAA4B,EAC5BC,UAEI,CAAC,CAAC,EACwB;QAC9B,MAAMC,aAAkC;YACtCC,IAAI,CAAC,IAAI,EAAEC,KAAKC,GAAG,GAAG,CAAC,EAAEC,KAAKC,MAAM,GAAGC,QAAQ,CAAC,IAAIC,MAAM,CAAC,GAAG,IAAI;YAClEC,WAAWN,KAAKC,GAAG;YACnBM,YAAYV,QAAQU,UAAU,IAAI,IAAI,CAACC,mBAAmB,CAACZ;YAC3DA;YACAa,UAAU,IAAI,CAACC,gBAAgB,CAACd;QAClC;QAEA,MAAM,IAAI,CAACzB,YAAY,CAACwC,KAAK,CAC3B,CAAC,WAAW,EAAEb,WAAWC,EAAE,EAAE,EAC7BD,YACA7B,YAAYK,MAAM;QAGpB,4DAA4D;QAC5D,MAAM,IAAI,CAACH,YAAY,CAAC,KAAK,EAAEkB,IAC7B,CAAC;;;0CAGmC,CAAC,EACrC;YACES,WAAWC,EAAE;YACb;YACAD,WAAWF,OAAO,CAACgB,OAAO,IAAI;YAC9Bd,WAAWF,OAAO,CAACiB,QAAQ,IAAI;YAC/BC,KAAKC,SAAS,CAAC;gBAAET,WAAWR,WAAWQ,SAAS;gBAAEC,YAAYT,WAAWS,UAAU;YAAC;YACpFO,KAAKC,SAAS,CAAC;gBAAEN,UAAUX,WAAWW,QAAQ;YAAC;YAC/CK,KAAKC,SAAS,CAAC;gBAAEC,YAAYlB,WAAWW,QAAQ;gBAAEQ,cAAc,EAAE;gBAAEC,WAAW,EAAE;YAAC;YAClFJ,KAAKC,SAAS,CAAC;gBAAER,YAAYT,WAAWS,UAAU;YAAC;YACnDT,WAAWS,UAAU,CAAE,qCAAqC;SAC7D;QAGH,OAAOT;IACT;IAEQU,oBACNZ,OAA4B,EACpB;QACR,kCAAkC;QAClC,MAAMuB,WAAWC,OAAOC,IAAI,CAACzB,SAASJ,MAAM;QAC5C,MAAM8B,gBAAgBR,KAAKC,SAAS,CAACnB,SAASJ,MAAM;QAEpD,OAAOU,KAAKT,GAAG,CAAC0B,WAAWG,iBAAiBpB,KAAKT,GAAG,CAAC;IACvD;IAEQiB,iBACNd,OAA4B,EAClB;QACV,0BAA0B;QAC1B,MAAMa,WAAqB,EAAE;QAE7B,IAAIb,QAAQ2B,IAAI,IAAI3B,QAAQ4B,WAAW,EAAE;YACvCf,SAASlB,IAAI,CAAC,CAAC,sDAAsD,CAAC;QACxE;QAEA,IAAIK,QAAQ6B,eAAe,EAAE;YAC3BhB,SAASlB,IAAI,CAAC,CAAC,6BAA6B,CAAC;QAC/C;QAEA,OAAOkB;IACT;IAEA,MAAMiB,mBACJC,YAAoB,EACiB;QACrC,OAAO,MAAM,IAAI,CAACxD,YAAY,CAACyD,QAAQ,CACrC,CAAC,WAAW,EAAED,cAAc,EAC5B1D,YAAYK,MAAM;IAEtB;AACF;AAEA,eAAeJ,aAAa"}
|
|
@@ -11,6 +11,10 @@ export class ContextInjector {
|
|
|
11
11
|
this.generator = new ACEGenerator();
|
|
12
12
|
}
|
|
13
13
|
async injectContext(target, contextOverrides = {}) {
|
|
14
|
+
// Validate target is not null or undefined
|
|
15
|
+
if (target === null || target === undefined) {
|
|
16
|
+
throw new Error('Target cannot be null or undefined');
|
|
17
|
+
}
|
|
14
18
|
// Reflection on current target
|
|
15
19
|
const initialReflection = await this.reflector.reflect({
|
|
16
20
|
target,
|
|
@@ -21,13 +25,31 @@ export class ContextInjector {
|
|
|
21
25
|
...initialReflection.context,
|
|
22
26
|
...contextOverrides
|
|
23
27
|
});
|
|
24
|
-
//
|
|
25
|
-
|
|
28
|
+
// Context overrides take highest priority, then adapted context
|
|
29
|
+
const finalContext = {
|
|
30
|
+
...adaptedContext,
|
|
31
|
+
...contextOverrides
|
|
32
|
+
};
|
|
33
|
+
// Check if target is frozen - if so, return a new merged object
|
|
34
|
+
if (Object.isFrozen(target)) {
|
|
35
|
+
return {
|
|
36
|
+
...target,
|
|
37
|
+
...finalContext
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
// Dynamic context injection via Proxy
|
|
41
|
+
return this.dynamicInject(target, finalContext);
|
|
26
42
|
}
|
|
27
43
|
dynamicInject(target, context) {
|
|
28
44
|
// Advanced context injection using Proxy
|
|
29
45
|
return new Proxy(target, {
|
|
30
46
|
get: (obj, prop)=>{
|
|
47
|
+
// Check property descriptor to respect frozen/sealed properties
|
|
48
|
+
const descriptor = Object.getOwnPropertyDescriptor(obj, prop);
|
|
49
|
+
// If property is non-configurable and non-writable, must return actual value
|
|
50
|
+
if (descriptor && !descriptor.configurable && !descriptor.writable) {
|
|
51
|
+
return Reflect.get(obj, prop);
|
|
52
|
+
}
|
|
31
53
|
// Check if context has override for property
|
|
32
54
|
if (context.hasOwnProperty(prop)) {
|
|
33
55
|
return context[prop];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/ace/context-injection.ts"],"sourcesContent":["import { ACEReflector } from './ace-reflector.js';\r\nimport { ACECurator } from './ace-curator.js';\r\nimport { ACEGenerator } from './ace-generator.js';\r\n\r\nexport class ContextInjector {\r\n private reflector: ACEReflector;\r\n private curator: ACECurator;\r\n private generator: ACEGenerator;\r\n\r\n constructor() {\r\n this.reflector = new ACEReflector();\r\n this.curator = new ACECurator();\r\n this.generator = new ACEGenerator();\r\n }\r\n\r\n async injectContext<T>(\r\n target: T,\r\n contextOverrides: Record<string, any> = {}\r\n ): Promise<T> {\r\n // Reflection on current target\r\n const initialReflection = await this.reflector.reflect(\r\n { target, contextOverrides }\r\n );\r\n\r\n // Generate adaptive context\r\n const adaptedContext = await this.generator.generateContext(\r\n {\r\n ...initialReflection.context,\r\n ...contextOverrides\r\n }\r\n );\r\n\r\n // Dynamic context injection\r\n return this.dynamicInject(target,
|
|
1
|
+
{"version":3,"sources":["../../src/ace/context-injection.ts"],"sourcesContent":["import { ACEReflector } from './ace-reflector.js';\r\nimport { ACECurator } from './ace-curator.js';\r\nimport { ACEGenerator } from './ace-generator.js';\r\n\r\nexport class ContextInjector {\r\n private reflector: ACEReflector;\r\n private curator: ACECurator;\r\n private generator: ACEGenerator;\r\n\r\n constructor() {\r\n this.reflector = new ACEReflector();\r\n this.curator = new ACECurator();\r\n this.generator = new ACEGenerator();\r\n }\r\n\r\n async injectContext<T>(\r\n target: T,\r\n contextOverrides: Record<string, any> = {}\r\n ): Promise<T> {\r\n // Validate target is not null or undefined\r\n if (target === null || target === undefined) {\r\n throw new Error('Target cannot be null or undefined');\r\n }\r\n\r\n // Reflection on current target\r\n const initialReflection = await this.reflector.reflect(\r\n { target, contextOverrides }\r\n );\r\n\r\n // Generate adaptive context\r\n const adaptedContext = await this.generator.generateContext(\r\n {\r\n ...initialReflection.context,\r\n ...contextOverrides\r\n }\r\n );\r\n\r\n // Context overrides take highest priority, then adapted context\r\n const finalContext = { ...adaptedContext, ...contextOverrides };\r\n\r\n // Check if target is frozen - if so, return a new merged object\r\n if (Object.isFrozen(target)) {\r\n return { ...target as any, ...finalContext } as T;\r\n }\r\n\r\n // Dynamic context injection via Proxy\r\n return this.dynamicInject(target, finalContext);\r\n }\r\n\r\n private dynamicInject<T>(\r\n target: T,\r\n context: Record<string, any>\r\n ): T {\r\n // Advanced context injection using Proxy\r\n return new Proxy(target as any, {\r\n get: (obj, prop) => {\r\n // Check property descriptor to respect frozen/sealed properties\r\n const descriptor = Object.getOwnPropertyDescriptor(obj, prop);\r\n\r\n // If property is non-configurable and non-writable, must return actual value\r\n if (descriptor && !descriptor.configurable && !descriptor.writable) {\r\n return Reflect.get(obj, prop);\r\n }\r\n\r\n // Check if context has override for property\r\n if (context.hasOwnProperty(prop)) {\r\n return context[prop];\r\n }\r\n return Reflect.get(obj, prop);\r\n },\r\n set: (obj, prop, value) => {\r\n // Optional: Trigger reflection on state changes\r\n this.reflector.reflect({\r\n target: obj,\r\n property: prop,\r\n value\r\n });\r\n return Reflect.set(obj, prop, value);\r\n }\r\n }) as T;\r\n }\r\n\r\n // Advanced method for context-aware method execution\r\n async executeWithContext<T, R>(\r\n method: (target: T) => Promise<R>,\r\n target: T,\r\n contextOverrides: Record<string, any> = {}\r\n ): Promise<R> {\r\n const contextualizedTarget = await this.injectContext(\r\n target,\r\n contextOverrides\r\n );\r\n\r\n return method(contextualizedTarget);\r\n }\r\n}\r\n\r\nexport default ContextInjector;"],"names":["ACEReflector","ACECurator","ACEGenerator","ContextInjector","reflector","curator","generator","injectContext","target","contextOverrides","undefined","Error","initialReflection","reflect","adaptedContext","generateContext","context","finalContext","Object","isFrozen","dynamicInject","Proxy","get","obj","prop","descriptor","getOwnPropertyDescriptor","configurable","writable","Reflect","hasOwnProperty","set","value","property","executeWithContext","method","contextualizedTarget"],"mappings":"AAAA,SAASA,YAAY,QAAQ,qBAAqB;AAClD,SAASC,UAAU,QAAQ,mBAAmB;AAC9C,SAASC,YAAY,QAAQ,qBAAqB;AAElD,OAAO,MAAMC;IACHC,UAAwB;IACxBC,QAAoB;IACpBC,UAAwB;IAEhC,aAAc;QACZ,IAAI,CAACF,SAAS,GAAG,IAAIJ;QACrB,IAAI,CAACK,OAAO,GAAG,IAAIJ;QACnB,IAAI,CAACK,SAAS,GAAG,IAAIJ;IACvB;IAEA,MAAMK,cACJC,MAAS,EACTC,mBAAwC,CAAC,CAAC,EAC9B;QACZ,2CAA2C;QAC3C,IAAID,WAAW,QAAQA,WAAWE,WAAW;YAC3C,MAAM,IAAIC,MAAM;QAClB;QAEA,+BAA+B;QAC/B,MAAMC,oBAAoB,MAAM,IAAI,CAACR,SAAS,CAACS,OAAO,CACpD;YAAEL;YAAQC;QAAiB;QAG7B,4BAA4B;QAC5B,MAAMK,iBAAiB,MAAM,IAAI,CAACR,SAAS,CAACS,eAAe,CACzD;YACE,GAAGH,kBAAkBI,OAAO;YAC5B,GAAGP,gBAAgB;QACrB;QAGF,gEAAgE;QAChE,MAAMQ,eAAe;YAAE,GAAGH,cAAc;YAAE,GAAGL,gBAAgB;QAAC;QAE9D,gEAAgE;QAChE,IAAIS,OAAOC,QAAQ,CAACX,SAAS;YAC3B,OAAO;gBAAE,GAAGA,MAAM;gBAAS,GAAGS,YAAY;YAAC;QAC7C;QAEA,sCAAsC;QACtC,OAAO,IAAI,CAACG,aAAa,CAACZ,QAAQS;IACpC;IAEQG,cACNZ,MAAS,EACTQ,OAA4B,EACzB;QACH,yCAAyC;QACzC,OAAO,IAAIK,MAAMb,QAAe;YAC9Bc,KAAK,CAACC,KAAKC;gBACT,gEAAgE;gBAChE,MAAMC,aAAaP,OAAOQ,wBAAwB,CAACH,KAAKC;gBAExD,6EAA6E;gBAC7E,IAAIC,cAAc,CAACA,WAAWE,YAAY,IAAI,CAACF,WAAWG,QAAQ,EAAE;oBAClE,OAAOC,QAAQP,GAAG,CAACC,KAAKC;gBAC1B;gBAEA,6CAA6C;gBAC7C,IAAIR,QAAQc,cAAc,CAACN,OAAO;oBAChC,OAAOR,OAAO,CAACQ,KAAK;gBACtB;gBACA,OAAOK,QAAQP,GAAG,CAACC,KAAKC;YAC1B;YACAO,KAAK,CAACR,KAAKC,MAAMQ;gBACf,gDAAgD;gBAChD,IAAI,CAAC5B,SAAS,CAACS,OAAO,CAAC;oBACrBL,QAAQe;oBACRU,UAAUT;oBACVQ;gBACF;gBACA,OAAOH,QAAQE,GAAG,CAACR,KAAKC,MAAMQ;YAChC;QACF;IACF;IAEA,qDAAqD;IACrD,MAAME,mBACJC,MAAiC,EACjC3B,MAAS,EACTC,mBAAwC,CAAC,CAAC,EAC9B;QACZ,MAAM2B,uBAAuB,MAAM,IAAI,CAAC7B,aAAa,CACnDC,QACAC;QAGF,OAAO0B,OAAOC;IAChB;AACF;AAEA,eAAejC,gBAAgB"}
|
|
@@ -42,7 +42,7 @@ export class TaskAgentIntegration {
|
|
|
42
42
|
if (validation.fallbackUsed) {
|
|
43
43
|
enhancedPrompt = `[Agent Type: Originally requested '${validation.originalType}', using '${validation.resolvedType}' as validated type]\n\n${enhancedPrompt}`;
|
|
44
44
|
}
|
|
45
|
-
enhancedPrompt += `\n\n[Coordination Context:
|
|
45
|
+
enhancedPrompt += `\n\n[Coordination Context: Task coordination via TodoWrite tool]`;
|
|
46
46
|
return enhancedPrompt;
|
|
47
47
|
}
|
|
48
48
|
async prepareBatchAgentSpawn(requests) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/agents/task-agent-integration.ts"],"sourcesContent":["/**\r\n * Task Agent Integration Layer\r\n * Provides validation and fallback for Claude Code's Task tool\r\n */\r\n\r\nimport { validateAgentType, AgentValidationResult } from './agent-validator.js';\r\nimport { getAvailableAgentTypes } from './agent-loader.js';\r\n\r\nexport interface TaskAgentSpawnRequest {\r\n type: string;\r\n description: string;\r\n prompt: string;\r\n capabilities?: string[];\r\n priority?: 'low' | 'medium' | 'high' | 'critical';\r\n}\r\n\r\nexport interface TaskAgentSpawnResult {\r\n originalRequest: TaskAgentSpawnRequest;\r\n validationResult: AgentValidationResult;\r\n finalType: string;\r\n spawnCommand: string;\r\n warnings: string[];\r\n success: boolean;\r\n}\r\n\r\nexport class TaskAgentIntegration {\r\n private static instance: TaskAgentIntegration;\r\n\r\n static getInstance(): TaskAgentIntegration {\r\n if (!this.instance) {\r\n this.instance = new TaskAgentIntegration();\r\n }\r\n return this.instance;\r\n }\r\n\r\n async prepareAgentSpawn(request: TaskAgentSpawnRequest): Promise<TaskAgentSpawnResult> {\r\n const validation = await validateAgentType(request.type);\r\n const warnings: string[] = [...validation.warnings];\r\n\r\n const spawnCommand = this.generateTaskCommand(request, validation);\r\n\r\n if (validation.fallbackUsed) {\r\n console.warn(`⚠️ Agent type validation for '${request.type}':`);\r\n for (const warning of warnings) {\r\n console.warn(` ${warning}`);\r\n }\r\n console.info(`✅ Using validated type: '${validation.resolvedType}'`);\r\n }\r\n\r\n return {\r\n originalRequest: request,\r\n validationResult: validation,\r\n finalType: validation.resolvedType,\r\n spawnCommand,\r\n warnings,\r\n success: true,\r\n };\r\n }\r\n\r\n private generateTaskCommand(\r\n request: TaskAgentSpawnRequest,\r\n validation: AgentValidationResult,\r\n ): string {\r\n const enhancedPrompt = this.enhancePrompt(request, validation);\r\n\r\n return `Task(\"${request.description}\", \"${enhancedPrompt}\", \"${validation.resolvedType}\")`;\r\n }\r\n\r\n private enhancePrompt(request: TaskAgentSpawnRequest, validation: AgentValidationResult): string {\r\n let enhancedPrompt = request.prompt;\r\n\r\n if (validation.fallbackUsed) {\r\n enhancedPrompt = `[Agent Type: Originally requested '${validation.originalType}', using '${validation.resolvedType}' as validated type]\\n\\n${enhancedPrompt}`;\r\n }\r\n\r\n enhancedPrompt += `\\n\\n[Coordination Context: Use hooks for coordination - npx claude-flow@alpha hooks pre-task --description \"${request.description}\"]`;\r\n\r\n return enhancedPrompt;\r\n }\r\n\r\n async prepareBatchAgentSpawn(requests: TaskAgentSpawnRequest[]): Promise<TaskAgentSpawnResult[]> {\r\n const results: TaskAgentSpawnResult[] = [];\r\n\r\n for (const request of requests) {\r\n try {\r\n const result = await this.prepareAgentSpawn(request);\r\n results.push(result);\r\n } catch (error) {\r\n console.error(`Failed to prepare agent spawn for ${request.type}:`, error);\r\n results.push({\r\n originalRequest: request,\r\n validationResult: {\r\n isValid: false,\r\n resolvedType: 'researcher',\r\n originalType: request.type,\r\n fallbackUsed: true,\r\n warnings: [`Error validating agent type: ${error}`],\r\n },\r\n finalType: 'researcher',\r\n spawnCommand: `Task(\"${request.description}\", \"${request.prompt}\", \"researcher\")`,\r\n warnings: [`Failed to validate ${request.type}, using researcher as fallback`],\r\n success: false,\r\n });\r\n }\r\n }\r\n\r\n return results;\r\n }\r\n\r\n async suggestAgentTypes(taskDescription: string): Promise<string[]> {\r\n const availableTypes = await getAvailableAgentTypes();\r\n const suggestions: string[] = [];\r\n const keywords = taskDescription.toLowerCase().split(/\\s+/);\r\n\r\n for (const agentType of availableTypes) {\r\n const agentKeywords = agentType.toLowerCase().split(/[-_]/);\r\n\r\n const overlap = keywords.some((keyword) =>\r\n agentKeywords.some(\r\n (agentKeyword) => agentKeyword.includes(keyword) || keyword.includes(agentKeyword),\r\n ),\r\n );\r\n\r\n if (overlap) {\r\n suggestions.push(agentType);\r\n }\r\n }\r\n\r\n return suggestions.length === 0\r\n ? ['researcher', 'coder', 'reviewer', 'tester']\r\n : suggestions.slice(0, 5);\r\n }\r\n\r\n validateAgentTypeSync(type: string): { isValid: boolean; resolvedType: string } {\r\n const legacyMapping: Record<string, string> = {\r\n analyst: 'code-analyzer',\r\n 'consensus-builder': 'consensus-builder',\r\n monitor: 'performance-benchmarker',\r\n coordinator: 'hierarchical-coordinator',\r\n optimizer: 'perf-analyzer',\r\n documenter: 'api-docs',\r\n specialist: 'system-architect',\r\n architect: 'system-architect',\r\n };\r\n\r\n const resolvedType = legacyMapping[type.toLowerCase()] || type;\r\n\r\n return {\r\n isValid: true,\r\n resolvedType,\r\n };\r\n }\r\n\r\n async getAgentInfo(): Promise<{\r\n available: string[];\r\n categories: { [category: string]: string[] };\r\n legacy: { [old: string]: string };\r\n suggestions: { [task: string]: string[] };\r\n }> {\r\n const availableTypes = await getAvailableAgentTypes();\r\n\r\n const categories: Record<string, string[]> = {\r\n core: [],\r\n development: [],\r\n analysis: [],\r\n coordination: [],\r\n testing: [],\r\n specialized: [],\r\n };\r\n\r\n for (const type of availableTypes) {\r\n if (type.includes('coder') || type.includes('dev')) {\r\n categories.development.push(type);\r\n } else if (type.includes('test')) {\r\n categories.testing.push(type);\r\n } else if (type.includes('analyz') || type.includes('review')) {\r\n categories.analysis.push(type);\r\n } else if (type.includes('coordinator') || type.includes('orchestrat')) {\r\n categories.coordination.push(type);\r\n } else if (['researcher', 'reviewer', 'planner'].includes(type)) {\r\n categories.core.push(type);\r\n } else {\r\n categories.specialized.push(type);\r\n }\r\n }\r\n\r\n return {\r\n available: availableTypes,\r\n categories,\r\n legacy: {\r\n analyst: 'code-analyzer',\r\n 'consensus-builder': 'consensus-builder',\r\n monitor: 'performance-benchmarker',\r\n coordinator: 'hierarchical-coordinator',\r\n optimizer: 'perf-analyzer',\r\n documenter: 'api-docs',\r\n specialist: 'system-architect',\r\n architect: 'system-architect',\r\n },\r\n suggestions: {\r\n code: ['coder', 'reviewer', 'code-analyzer'],\r\n test: ['tester', 'production-validator'],\r\n design: ['system-architect', 'base-template-generator'],\r\n analysis: ['code-analyzer', 'perf-analyzer'],\r\n documentation: ['api-docs'],\r\n coordination: ['task-orchestrator', 'hierarchical-coordinator'],\r\n },\r\n };\r\n }\r\n}\r\n\r\nexport const taskAgentIntegration = TaskAgentIntegration.getInstance();\r\n\r\nexport const prepareAgentSpawn = (request: TaskAgentSpawnRequest) =>\r\n taskAgentIntegration.prepareAgentSpawn(request);\r\n\r\nexport const prepareBatchAgentSpawn = (requests: TaskAgentSpawnRequest[]) =>\r\n taskAgentIntegration.prepareBatchAgentSpawn(requests);\r\n\r\nexport const suggestAgentTypes = (taskDescription: string) =>\r\n taskAgentIntegration.suggestAgentTypes(taskDescription);\r\n\r\nexport const validateAgentTypeSync = (type: string) =>\r\n taskAgentIntegration.validateAgentTypeSync(type);\r\n\r\nexport const getAgentInfo = () => taskAgentIntegration.getAgentInfo();\r\n\r\nexport async function claudeCodeTaskHook(\r\n subagentType: string,\r\n description: string,\r\n prompt: string,\r\n): Promise<{\r\n validatedType: string;\r\n enhancedPrompt: string;\r\n warnings: string[];\r\n}> {\r\n const request: TaskAgentSpawnRequest = {\r\n type: subagentType,\r\n description,\r\n prompt,\r\n };\r\n\r\n const result = await prepareAgentSpawn(request);\r\n\r\n return {\r\n validatedType: result.finalType,\r\n enhancedPrompt: result.originalRequest.prompt,\r\n warnings: result.warnings,\r\n };\r\n}"],"names":["validateAgentType","getAvailableAgentTypes","TaskAgentIntegration","instance","getInstance","prepareAgentSpawn","request","validation","type","warnings","spawnCommand","generateTaskCommand","fallbackUsed","console","warn","warning","info","resolvedType","originalRequest","validationResult","finalType","success","enhancedPrompt","enhancePrompt","description","prompt","originalType","prepareBatchAgentSpawn","requests","results","result","push","error","isValid","suggestAgentTypes","taskDescription","availableTypes","suggestions","keywords","toLowerCase","split","agentType","agentKeywords","overlap","some","keyword","agentKeyword","includes","length","slice","validateAgentTypeSync","legacyMapping","analyst","monitor","coordinator","optimizer","documenter","specialist","architect","getAgentInfo","categories","core","development","analysis","coordination","testing","specialized","available","legacy","code","test","design","documentation","taskAgentIntegration","claudeCodeTaskHook","subagentType","validatedType"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/agents/task-agent-integration.ts"],"sourcesContent":["/**\r\n * Task Agent Integration Layer\r\n * Provides validation and fallback for Claude Code's Task tool\r\n */\r\n\r\nimport { validateAgentType, AgentValidationResult } from './agent-validator.js';\r\nimport { getAvailableAgentTypes } from './agent-loader.js';\r\n\r\nexport interface TaskAgentSpawnRequest {\r\n type: string;\r\n description: string;\r\n prompt: string;\r\n capabilities?: string[];\r\n priority?: 'low' | 'medium' | 'high' | 'critical';\r\n}\r\n\r\nexport interface TaskAgentSpawnResult {\r\n originalRequest: TaskAgentSpawnRequest;\r\n validationResult: AgentValidationResult;\r\n finalType: string;\r\n spawnCommand: string;\r\n warnings: string[];\r\n success: boolean;\r\n}\r\n\r\nexport class TaskAgentIntegration {\r\n private static instance: TaskAgentIntegration;\r\n\r\n static getInstance(): TaskAgentIntegration {\r\n if (!this.instance) {\r\n this.instance = new TaskAgentIntegration();\r\n }\r\n return this.instance;\r\n }\r\n\r\n async prepareAgentSpawn(request: TaskAgentSpawnRequest): Promise<TaskAgentSpawnResult> {\r\n const validation = await validateAgentType(request.type);\r\n const warnings: string[] = [...validation.warnings];\r\n\r\n const spawnCommand = this.generateTaskCommand(request, validation);\r\n\r\n if (validation.fallbackUsed) {\r\n console.warn(`⚠️ Agent type validation for '${request.type}':`);\r\n for (const warning of warnings) {\r\n console.warn(` ${warning}`);\r\n }\r\n console.info(`✅ Using validated type: '${validation.resolvedType}'`);\r\n }\r\n\r\n return {\r\n originalRequest: request,\r\n validationResult: validation,\r\n finalType: validation.resolvedType,\r\n spawnCommand,\r\n warnings,\r\n success: true,\r\n };\r\n }\r\n\r\n private generateTaskCommand(\r\n request: TaskAgentSpawnRequest,\r\n validation: AgentValidationResult,\r\n ): string {\r\n const enhancedPrompt = this.enhancePrompt(request, validation);\r\n\r\n return `Task(\"${request.description}\", \"${enhancedPrompt}\", \"${validation.resolvedType}\")`;\r\n }\r\n\r\n private enhancePrompt(request: TaskAgentSpawnRequest, validation: AgentValidationResult): string {\r\n let enhancedPrompt = request.prompt;\r\n\r\n if (validation.fallbackUsed) {\r\n enhancedPrompt = `[Agent Type: Originally requested '${validation.originalType}', using '${validation.resolvedType}' as validated type]\\n\\n${enhancedPrompt}`;\r\n }\r\n\r\n enhancedPrompt += `\\n\\n[Coordination Context: Task coordination via TodoWrite tool]`;\r\n\r\n return enhancedPrompt;\r\n }\r\n\r\n async prepareBatchAgentSpawn(requests: TaskAgentSpawnRequest[]): Promise<TaskAgentSpawnResult[]> {\r\n const results: TaskAgentSpawnResult[] = [];\r\n\r\n for (const request of requests) {\r\n try {\r\n const result = await this.prepareAgentSpawn(request);\r\n results.push(result);\r\n } catch (error) {\r\n console.error(`Failed to prepare agent spawn for ${request.type}:`, error);\r\n results.push({\r\n originalRequest: request,\r\n validationResult: {\r\n isValid: false,\r\n resolvedType: 'researcher',\r\n originalType: request.type,\r\n fallbackUsed: true,\r\n warnings: [`Error validating agent type: ${error}`],\r\n },\r\n finalType: 'researcher',\r\n spawnCommand: `Task(\"${request.description}\", \"${request.prompt}\", \"researcher\")`,\r\n warnings: [`Failed to validate ${request.type}, using researcher as fallback`],\r\n success: false,\r\n });\r\n }\r\n }\r\n\r\n return results;\r\n }\r\n\r\n async suggestAgentTypes(taskDescription: string): Promise<string[]> {\r\n const availableTypes = await getAvailableAgentTypes();\r\n const suggestions: string[] = [];\r\n const keywords = taskDescription.toLowerCase().split(/\\s+/);\r\n\r\n for (const agentType of availableTypes) {\r\n const agentKeywords = agentType.toLowerCase().split(/[-_]/);\r\n\r\n const overlap = keywords.some((keyword) =>\r\n agentKeywords.some(\r\n (agentKeyword) => agentKeyword.includes(keyword) || keyword.includes(agentKeyword),\r\n ),\r\n );\r\n\r\n if (overlap) {\r\n suggestions.push(agentType);\r\n }\r\n }\r\n\r\n return suggestions.length === 0\r\n ? ['researcher', 'coder', 'reviewer', 'tester']\r\n : suggestions.slice(0, 5);\r\n }\r\n\r\n validateAgentTypeSync(type: string): { isValid: boolean; resolvedType: string } {\r\n const legacyMapping: Record<string, string> = {\r\n analyst: 'code-analyzer',\r\n 'consensus-builder': 'consensus-builder',\r\n monitor: 'performance-benchmarker',\r\n coordinator: 'hierarchical-coordinator',\r\n optimizer: 'perf-analyzer',\r\n documenter: 'api-docs',\r\n specialist: 'system-architect',\r\n architect: 'system-architect',\r\n };\r\n\r\n const resolvedType = legacyMapping[type.toLowerCase()] || type;\r\n\r\n return {\r\n isValid: true,\r\n resolvedType,\r\n };\r\n }\r\n\r\n async getAgentInfo(): Promise<{\r\n available: string[];\r\n categories: { [category: string]: string[] };\r\n legacy: { [old: string]: string };\r\n suggestions: { [task: string]: string[] };\r\n }> {\r\n const availableTypes = await getAvailableAgentTypes();\r\n\r\n const categories: Record<string, string[]> = {\r\n core: [],\r\n development: [],\r\n analysis: [],\r\n coordination: [],\r\n testing: [],\r\n specialized: [],\r\n };\r\n\r\n for (const type of availableTypes) {\r\n if (type.includes('coder') || type.includes('dev')) {\r\n categories.development.push(type);\r\n } else if (type.includes('test')) {\r\n categories.testing.push(type);\r\n } else if (type.includes('analyz') || type.includes('review')) {\r\n categories.analysis.push(type);\r\n } else if (type.includes('coordinator') || type.includes('orchestrat')) {\r\n categories.coordination.push(type);\r\n } else if (['researcher', 'reviewer', 'planner'].includes(type)) {\r\n categories.core.push(type);\r\n } else {\r\n categories.specialized.push(type);\r\n }\r\n }\r\n\r\n return {\r\n available: availableTypes,\r\n categories,\r\n legacy: {\r\n analyst: 'code-analyzer',\r\n 'consensus-builder': 'consensus-builder',\r\n monitor: 'performance-benchmarker',\r\n coordinator: 'hierarchical-coordinator',\r\n optimizer: 'perf-analyzer',\r\n documenter: 'api-docs',\r\n specialist: 'system-architect',\r\n architect: 'system-architect',\r\n },\r\n suggestions: {\r\n code: ['coder', 'reviewer', 'code-analyzer'],\r\n test: ['tester', 'production-validator'],\r\n design: ['system-architect', 'base-template-generator'],\r\n analysis: ['code-analyzer', 'perf-analyzer'],\r\n documentation: ['api-docs'],\r\n coordination: ['task-orchestrator', 'hierarchical-coordinator'],\r\n },\r\n };\r\n }\r\n}\r\n\r\nexport const taskAgentIntegration = TaskAgentIntegration.getInstance();\r\n\r\nexport const prepareAgentSpawn = (request: TaskAgentSpawnRequest) =>\r\n taskAgentIntegration.prepareAgentSpawn(request);\r\n\r\nexport const prepareBatchAgentSpawn = (requests: TaskAgentSpawnRequest[]) =>\r\n taskAgentIntegration.prepareBatchAgentSpawn(requests);\r\n\r\nexport const suggestAgentTypes = (taskDescription: string) =>\r\n taskAgentIntegration.suggestAgentTypes(taskDescription);\r\n\r\nexport const validateAgentTypeSync = (type: string) =>\r\n taskAgentIntegration.validateAgentTypeSync(type);\r\n\r\nexport const getAgentInfo = () => taskAgentIntegration.getAgentInfo();\r\n\r\nexport async function claudeCodeTaskHook(\r\n subagentType: string,\r\n description: string,\r\n prompt: string,\r\n): Promise<{\r\n validatedType: string;\r\n enhancedPrompt: string;\r\n warnings: string[];\r\n}> {\r\n const request: TaskAgentSpawnRequest = {\r\n type: subagentType,\r\n description,\r\n prompt,\r\n };\r\n\r\n const result = await prepareAgentSpawn(request);\r\n\r\n return {\r\n validatedType: result.finalType,\r\n enhancedPrompt: result.originalRequest.prompt,\r\n warnings: result.warnings,\r\n };\r\n}"],"names":["validateAgentType","getAvailableAgentTypes","TaskAgentIntegration","instance","getInstance","prepareAgentSpawn","request","validation","type","warnings","spawnCommand","generateTaskCommand","fallbackUsed","console","warn","warning","info","resolvedType","originalRequest","validationResult","finalType","success","enhancedPrompt","enhancePrompt","description","prompt","originalType","prepareBatchAgentSpawn","requests","results","result","push","error","isValid","suggestAgentTypes","taskDescription","availableTypes","suggestions","keywords","toLowerCase","split","agentType","agentKeywords","overlap","some","keyword","agentKeyword","includes","length","slice","validateAgentTypeSync","legacyMapping","analyst","monitor","coordinator","optimizer","documenter","specialist","architect","getAgentInfo","categories","core","development","analysis","coordination","testing","specialized","available","legacy","code","test","design","documentation","taskAgentIntegration","claudeCodeTaskHook","subagentType","validatedType"],"mappings":"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"}
|
|
@@ -0,0 +1,390 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Health Check HTTP Endpoints
|
|
3
|
+
*
|
|
4
|
+
* Provides REST API endpoints for health monitoring:
|
|
5
|
+
* - GET /health - Overall system health status
|
|
6
|
+
* - GET /health/ready - Kubernetes readiness probe
|
|
7
|
+
* - GET /health/live - Kubernetes liveness probe
|
|
8
|
+
* - GET /health/detailed - Detailed component-level health report
|
|
9
|
+
*
|
|
10
|
+
* Integrates with monitoring dashboards and Kubernetes orchestration.
|
|
11
|
+
*
|
|
12
|
+
* Part of Task P2-4.1: Comprehensive Health Checks
|
|
13
|
+
*/ import express from 'express';
|
|
14
|
+
import { HealthCheckSystem } from '../services/health-check-system.js';
|
|
15
|
+
/**
|
|
16
|
+
* Health check endpoints router
|
|
17
|
+
*/ export class HealthEndpoints {
|
|
18
|
+
router;
|
|
19
|
+
healthCheckSystem;
|
|
20
|
+
constructor(config){
|
|
21
|
+
this.router = express.Router();
|
|
22
|
+
this.healthCheckSystem = new HealthCheckSystem(config?.systemConfig);
|
|
23
|
+
this.setupRoutes();
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Setup all health check routes
|
|
27
|
+
*/ setupRoutes() {
|
|
28
|
+
/**
|
|
29
|
+
* GET /health - Overall system health
|
|
30
|
+
*
|
|
31
|
+
* Returns the current health status of the system including:
|
|
32
|
+
* - Overall status (healthy/degraded/unhealthy)
|
|
33
|
+
* - Response latency
|
|
34
|
+
* - Component health summary
|
|
35
|
+
*
|
|
36
|
+
* Response time: <1s
|
|
37
|
+
* Status codes:
|
|
38
|
+
* 200: System healthy
|
|
39
|
+
* 503: System degraded or unhealthy
|
|
40
|
+
*/ this.router.get('/health', async (req, res)=>{
|
|
41
|
+
const startTime = Date.now();
|
|
42
|
+
const overall = await this.healthCheckSystem.getOverallHealth();
|
|
43
|
+
const responseTime = Date.now() - startTime;
|
|
44
|
+
const response = {
|
|
45
|
+
status: overall.status,
|
|
46
|
+
timestamp: new Date().toISOString(),
|
|
47
|
+
latency: responseTime,
|
|
48
|
+
checks: {
|
|
49
|
+
database: overall.dependencies?.[0].status,
|
|
50
|
+
redis: overall.dependencies?.[1].status,
|
|
51
|
+
filesystem: overall.dependencies?.[2].status,
|
|
52
|
+
agents: overall.dependencies?.[3].status
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
const statusCode = overall.status === 'healthy' ? 200 : 503;
|
|
56
|
+
res.status(statusCode).json(response);
|
|
57
|
+
});
|
|
58
|
+
/**
|
|
59
|
+
* GET /health/ready - Kubernetes readiness probe
|
|
60
|
+
*
|
|
61
|
+
* Checks if the system is ready to accept traffic.
|
|
62
|
+
* All critical services must be healthy.
|
|
63
|
+
*
|
|
64
|
+
* Response time: <500ms
|
|
65
|
+
* Status codes:
|
|
66
|
+
* 200: Ready to accept traffic
|
|
67
|
+
* 503: Not ready
|
|
68
|
+
*/ this.router.get('/health/ready', async (req, res)=>{
|
|
69
|
+
const startTime = Date.now();
|
|
70
|
+
const overall = await this.healthCheckSystem.getOverallHealth();
|
|
71
|
+
const isReady = overall.status === 'healthy';
|
|
72
|
+
const responseTime = Date.now() - startTime;
|
|
73
|
+
const response = {
|
|
74
|
+
status: isReady ? 'ready' : 'not-ready',
|
|
75
|
+
timestamp: new Date().toISOString()
|
|
76
|
+
};
|
|
77
|
+
const statusCode = isReady ? 200 : 503;
|
|
78
|
+
res.status(statusCode).json(response);
|
|
79
|
+
});
|
|
80
|
+
/**
|
|
81
|
+
* GET /health/live - Kubernetes liveness probe
|
|
82
|
+
*
|
|
83
|
+
* Checks if the system is alive and responding.
|
|
84
|
+
* Allows degraded services.
|
|
85
|
+
*
|
|
86
|
+
* Response time: <500ms
|
|
87
|
+
* Status codes:
|
|
88
|
+
* 200: System alive
|
|
89
|
+
* 503: System down/unhealthy
|
|
90
|
+
*/ this.router.get('/health/live', async (req, res)=>{
|
|
91
|
+
const startTime = Date.now();
|
|
92
|
+
const overall = await this.healthCheckSystem.getOverallHealth();
|
|
93
|
+
const isAlive = overall.status !== 'unhealthy';
|
|
94
|
+
const responseTime = Date.now() - startTime;
|
|
95
|
+
const response = {
|
|
96
|
+
status: isAlive ? 'alive' : 'not-alive',
|
|
97
|
+
timestamp: new Date().toISOString()
|
|
98
|
+
};
|
|
99
|
+
const statusCode = isAlive ? 200 : 503;
|
|
100
|
+
res.status(statusCode).json(response);
|
|
101
|
+
});
|
|
102
|
+
/**
|
|
103
|
+
* GET /health/detailed - Detailed health report
|
|
104
|
+
*
|
|
105
|
+
* Returns comprehensive health information including:
|
|
106
|
+
* - Overall system status
|
|
107
|
+
* - Individual service metrics
|
|
108
|
+
* - Response latencies
|
|
109
|
+
* - Disk usage
|
|
110
|
+
* - Queue depth
|
|
111
|
+
* - Active agents
|
|
112
|
+
* - Alerts and warnings
|
|
113
|
+
*
|
|
114
|
+
* Response time: <1s
|
|
115
|
+
* Status codes:
|
|
116
|
+
* 200: Report generated (regardless of health status)
|
|
117
|
+
*/ this.router.get('/health/detailed', async (req, res)=>{
|
|
118
|
+
const startTime = Date.now();
|
|
119
|
+
const report = await this.healthCheckSystem.getDetailedHealthReport();
|
|
120
|
+
const responseTime = Date.now() - startTime;
|
|
121
|
+
const response = {
|
|
122
|
+
timestamp: report.timestamp.toISOString(),
|
|
123
|
+
overallStatus: report.overallStatus,
|
|
124
|
+
latency: responseTime,
|
|
125
|
+
totalLatency: report.latency,
|
|
126
|
+
services: {
|
|
127
|
+
database: {
|
|
128
|
+
status: report.services.database.status,
|
|
129
|
+
latency: report.services.database.latency,
|
|
130
|
+
message: report.services.database.message,
|
|
131
|
+
metadata: report.services.database.metadata
|
|
132
|
+
},
|
|
133
|
+
redis: {
|
|
134
|
+
status: report.services.redis.status,
|
|
135
|
+
latency: report.services.redis.latency,
|
|
136
|
+
message: report.services.redis.message,
|
|
137
|
+
metadata: report.services.redis.metadata
|
|
138
|
+
},
|
|
139
|
+
filesystem: {
|
|
140
|
+
status: report.services.filesystem.status,
|
|
141
|
+
latency: report.services.filesystem.latency,
|
|
142
|
+
message: report.services.filesystem.message,
|
|
143
|
+
metadata: report.services.filesystem.metadata
|
|
144
|
+
},
|
|
145
|
+
agents: {
|
|
146
|
+
status: report.services.agents.status,
|
|
147
|
+
latency: report.services.agents.latency,
|
|
148
|
+
message: report.services.agents.message,
|
|
149
|
+
metadata: report.services.agents.metadata
|
|
150
|
+
}
|
|
151
|
+
},
|
|
152
|
+
alerts: report.alerts || []
|
|
153
|
+
};
|
|
154
|
+
res.status(200).json(response);
|
|
155
|
+
});
|
|
156
|
+
/**
|
|
157
|
+
* GET /health/database - Database health only
|
|
158
|
+
*
|
|
159
|
+
* Focused check for database connectivity.
|
|
160
|
+
* Useful for targeted monitoring.
|
|
161
|
+
*/ this.router.get('/health/database', async (req, res)=>{
|
|
162
|
+
const startTime = Date.now();
|
|
163
|
+
const check = await this.healthCheckSystem.checkDatabase();
|
|
164
|
+
const responseTime = Date.now() - startTime;
|
|
165
|
+
const response = {
|
|
166
|
+
service: 'database',
|
|
167
|
+
status: check.status,
|
|
168
|
+
latency: responseTime,
|
|
169
|
+
message: check.message,
|
|
170
|
+
metadata: check.metadata,
|
|
171
|
+
timestamp: new Date().toISOString()
|
|
172
|
+
};
|
|
173
|
+
const statusCode = check.status === 'healthy' ? 200 : 503;
|
|
174
|
+
res.status(statusCode).json(response);
|
|
175
|
+
});
|
|
176
|
+
/**
|
|
177
|
+
* GET /health/redis - Redis health only
|
|
178
|
+
*
|
|
179
|
+
* Focused check for Redis connectivity.
|
|
180
|
+
*/ this.router.get('/health/redis', async (req, res)=>{
|
|
181
|
+
const startTime = Date.now();
|
|
182
|
+
const check = await this.healthCheckSystem.checkRedis();
|
|
183
|
+
const responseTime = Date.now() - startTime;
|
|
184
|
+
const response = {
|
|
185
|
+
service: 'redis',
|
|
186
|
+
status: check.status,
|
|
187
|
+
latency: responseTime,
|
|
188
|
+
message: check.message,
|
|
189
|
+
metadata: check.metadata,
|
|
190
|
+
timestamp: new Date().toISOString()
|
|
191
|
+
};
|
|
192
|
+
const statusCode = check.status === 'healthy' ? 200 : 503;
|
|
193
|
+
res.status(statusCode).json(response);
|
|
194
|
+
});
|
|
195
|
+
/**
|
|
196
|
+
* GET /health/filesystem - File system health only
|
|
197
|
+
*
|
|
198
|
+
* Focused check for disk space and permissions.
|
|
199
|
+
*/ this.router.get('/health/filesystem', async (req, res)=>{
|
|
200
|
+
const startTime = Date.now();
|
|
201
|
+
const check = await this.healthCheckSystem.checkFileSystem();
|
|
202
|
+
const responseTime = Date.now() - startTime;
|
|
203
|
+
const response = {
|
|
204
|
+
service: 'filesystem',
|
|
205
|
+
status: check.status,
|
|
206
|
+
latency: responseTime,
|
|
207
|
+
message: check.message,
|
|
208
|
+
metadata: check.metadata,
|
|
209
|
+
timestamp: new Date().toISOString()
|
|
210
|
+
};
|
|
211
|
+
const statusCode = check.status === 'healthy' ? 200 : 503;
|
|
212
|
+
res.status(statusCode).json(response);
|
|
213
|
+
});
|
|
214
|
+
/**
|
|
215
|
+
* GET /health/agents - Agent health only
|
|
216
|
+
*
|
|
217
|
+
* Focused check for active agents and queue depth.
|
|
218
|
+
*/ this.router.get('/health/agents', async (req, res)=>{
|
|
219
|
+
const startTime = Date.now();
|
|
220
|
+
const check = await this.healthCheckSystem.checkAgents();
|
|
221
|
+
const responseTime = Date.now() - startTime;
|
|
222
|
+
const response = {
|
|
223
|
+
service: 'agents',
|
|
224
|
+
status: check.status,
|
|
225
|
+
latency: responseTime,
|
|
226
|
+
message: check.message,
|
|
227
|
+
metadata: check.metadata,
|
|
228
|
+
timestamp: new Date().toISOString()
|
|
229
|
+
};
|
|
230
|
+
const statusCode = check.status === 'healthy' ? 200 : 503;
|
|
231
|
+
res.status(statusCode).json(response);
|
|
232
|
+
});
|
|
233
|
+
/**
|
|
234
|
+
* GET /health/ping - Fast connectivity check
|
|
235
|
+
*
|
|
236
|
+
* Ultra-fast ping endpoint for basic connectivity checks.
|
|
237
|
+
* Returns in <100ms for Kubernetes probes and dashboards.
|
|
238
|
+
*
|
|
239
|
+
* Query parameters:
|
|
240
|
+
* - timeout: Optional timeout in milliseconds (default: 100)
|
|
241
|
+
*
|
|
242
|
+
* Response time: <100ms
|
|
243
|
+
* Status codes:
|
|
244
|
+
* 200: System responsive
|
|
245
|
+
* 503: System unresponsive or timeout
|
|
246
|
+
*/ this.router.get('/health/ping', async (req, res)=>{
|
|
247
|
+
const startTime = Date.now();
|
|
248
|
+
try {
|
|
249
|
+
// Parse optional timeout parameter
|
|
250
|
+
const timeout = req.query.timeout ? parseInt(req.query.timeout, 10) : 100;
|
|
251
|
+
// Validate timeout
|
|
252
|
+
if (isNaN(timeout) || timeout < 1 || timeout > 1000) {
|
|
253
|
+
res.status(400).json({
|
|
254
|
+
error: 'Invalid timeout parameter',
|
|
255
|
+
message: 'Timeout must be between 1 and 1000 milliseconds',
|
|
256
|
+
timestamp: new Date().toISOString()
|
|
257
|
+
});
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
const check = await this.healthCheckSystem.ping(timeout);
|
|
261
|
+
const responseTime = Date.now() - startTime;
|
|
262
|
+
const response = {
|
|
263
|
+
status: check.status,
|
|
264
|
+
latency: responseTime,
|
|
265
|
+
message: check.message,
|
|
266
|
+
metadata: check.metadata,
|
|
267
|
+
timestamp: new Date().toISOString()
|
|
268
|
+
};
|
|
269
|
+
res.status(200).json(response);
|
|
270
|
+
} catch (error) {
|
|
271
|
+
const responseTime = Date.now() - startTime;
|
|
272
|
+
const response = {
|
|
273
|
+
status: 'unhealthy',
|
|
274
|
+
latency: responseTime,
|
|
275
|
+
message: error.message || 'Ping failed',
|
|
276
|
+
error: error.code || 'UNKNOWN_ERROR',
|
|
277
|
+
timestamp: new Date().toISOString()
|
|
278
|
+
};
|
|
279
|
+
res.status(503).json(response);
|
|
280
|
+
}
|
|
281
|
+
});
|
|
282
|
+
/**
|
|
283
|
+
* GET /health/aggregate - Aggregated health statistics
|
|
284
|
+
*
|
|
285
|
+
* Returns comprehensive aggregated health metrics from all services.
|
|
286
|
+
* Includes service counts, average latency, warnings, and errors.
|
|
287
|
+
*
|
|
288
|
+
* Query parameters:
|
|
289
|
+
* - timeout: Optional timeout in milliseconds (default: 5000)
|
|
290
|
+
*
|
|
291
|
+
* Response time: <5s (default)
|
|
292
|
+
* Status codes:
|
|
293
|
+
* 200: Stats collected successfully
|
|
294
|
+
* 503: Timeout or aggregation failure
|
|
295
|
+
*/ this.router.get('/health/aggregate', async (req, res)=>{
|
|
296
|
+
const startTime = Date.now();
|
|
297
|
+
try {
|
|
298
|
+
// Parse optional timeout parameter
|
|
299
|
+
const timeout = req.query.timeout ? parseInt(req.query.timeout, 10) : 5000;
|
|
300
|
+
// Validate timeout
|
|
301
|
+
if (isNaN(timeout) || timeout < 100 || timeout > 30000) {
|
|
302
|
+
res.status(400).json({
|
|
303
|
+
error: 'Invalid timeout parameter',
|
|
304
|
+
message: 'Timeout must be between 100 and 30000 milliseconds',
|
|
305
|
+
timestamp: new Date().toISOString()
|
|
306
|
+
});
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
const stats = await this.healthCheckSystem.getAggregateStats(timeout);
|
|
310
|
+
const responseTime = Date.now() - startTime;
|
|
311
|
+
const response = {
|
|
312
|
+
timestamp: stats.timestamp.toISOString(),
|
|
313
|
+
overallStatus: stats.overallStatus,
|
|
314
|
+
latency: responseTime,
|
|
315
|
+
totalLatency: stats.latency,
|
|
316
|
+
averageServiceLatency: stats.averageServiceLatency,
|
|
317
|
+
serviceCount: stats.serviceCount,
|
|
318
|
+
services: {
|
|
319
|
+
database: {
|
|
320
|
+
status: stats.services.database.status,
|
|
321
|
+
latency: stats.services.database.latency,
|
|
322
|
+
message: stats.services.database.message
|
|
323
|
+
},
|
|
324
|
+
redis: {
|
|
325
|
+
status: stats.services.redis.status,
|
|
326
|
+
latency: stats.services.redis.latency,
|
|
327
|
+
message: stats.services.redis.message
|
|
328
|
+
},
|
|
329
|
+
filesystem: {
|
|
330
|
+
status: stats.services.filesystem.status,
|
|
331
|
+
latency: stats.services.filesystem.latency,
|
|
332
|
+
message: stats.services.filesystem.message
|
|
333
|
+
},
|
|
334
|
+
agents: {
|
|
335
|
+
status: stats.services.agents.status,
|
|
336
|
+
latency: stats.services.agents.latency,
|
|
337
|
+
message: stats.services.agents.message
|
|
338
|
+
}
|
|
339
|
+
},
|
|
340
|
+
metadata: stats.metadata,
|
|
341
|
+
warnings: stats.warnings,
|
|
342
|
+
errors: stats.errors
|
|
343
|
+
};
|
|
344
|
+
const statusCode = stats.overallStatus === 'healthy' ? 200 : 503;
|
|
345
|
+
res.status(statusCode).json(response);
|
|
346
|
+
} catch (error) {
|
|
347
|
+
const responseTime = Date.now() - startTime;
|
|
348
|
+
const response = {
|
|
349
|
+
status: 'error',
|
|
350
|
+
latency: responseTime,
|
|
351
|
+
message: error.message || 'Failed to aggregate health stats',
|
|
352
|
+
error: error.code || 'UNKNOWN_ERROR',
|
|
353
|
+
timestamp: new Date().toISOString()
|
|
354
|
+
};
|
|
355
|
+
res.status(503).json(response);
|
|
356
|
+
}
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Get the configured router
|
|
361
|
+
*/ getRouter() {
|
|
362
|
+
return this.router;
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Get the health check system instance
|
|
366
|
+
*/ getHealthCheckSystem() {
|
|
367
|
+
return this.healthCheckSystem;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* Create and configure health check endpoints
|
|
372
|
+
* Usage:
|
|
373
|
+
* const app = express();
|
|
374
|
+
* const healthEndpoints = new HealthEndpoints();
|
|
375
|
+
* app.use('/health', healthEndpoints.getRouter());
|
|
376
|
+
*/ export function createHealthEndpoints(config) {
|
|
377
|
+
return new HealthEndpoints(config);
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* Middleware for adding health check endpoints to an Express app
|
|
381
|
+
* Usage:
|
|
382
|
+
* const app = express();
|
|
383
|
+
* app.use(mountHealthEndpoints());
|
|
384
|
+
*/ export function mountHealthEndpoints(config) {
|
|
385
|
+
const endpoints = new HealthEndpoints(config);
|
|
386
|
+
return endpoints.getRouter();
|
|
387
|
+
}
|
|
388
|
+
export { HealthCheckSystem };
|
|
389
|
+
|
|
390
|
+
//# sourceMappingURL=health-endpoints.js.map
|