claude-flow-novice 2.15.3 → 2.15.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/cfn-extras/skills/advanced-features/cfn-agent-swap/recommend-swap.sh +59 -59
- package/.claude/cfn-extras/skills/analytics/cfn-improvement-recommender/recommend-improvements.sh +91 -91
- package/.claude/cfn-extras/skills/analytics/cfn-pattern-extraction/extract-patterns.sh +79 -79
- package/.claude/cfn-extras/skills/analytics/cfn-retrospective-report/generate-report.sh +100 -100
- package/.claude/cfn-extras/skills/analytics/cfn-telemetry/start-telemetry.sh +110 -110
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/add-bullet.sh +145 -145
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/log-merge.sh +67 -67
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/monitor-injection-performance.sh +137 -137
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/optimize-injection-pipeline.sh +168 -168
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/query-reflections.sh +35 -35
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/store-reflection.sh +45 -45
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/track-ab-test.sh +41 -41
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/update-reflection.sh +41 -41
- package/.claude/cfn-extras/skills/deprecated/cfn-cli-setup/validate-cli-environment.sh +191 -191
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/create-campaign.sh +231 -231
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/get-campaign-performance.sh +190 -190
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/pause-campaign.sh +142 -142
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/set-budget.sh +181 -181
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/update-bid-strategy.sh +133 -133
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/get-conversation-history.sh +121 -121
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/qualify-lead.sh +156 -156
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/schedule-demo.sh +181 -181
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/send-message.sh +137 -137
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/transfer-to-human.sh +179 -179
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/create-campaign.sh +183 -183
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/get-delivery-status.sh +139 -139
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/opt-out.sh +150 -150
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/schedule-campaign.sh +187 -187
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/send-sms.sh +181 -181
- package/.claude/cfn-extras/skills/ui-portal/cfn-web-portal/test-web-portal-skill.sh +50 -50
- package/.claude/cfn-extras/skills/ui-portal/cfn-web-portal/validate-deployment.sh +84 -84
- package/.claude/cfn-extras/skills/utility/cfn-environment-sanitization/sanitize-environment.sh +243 -243
- package/.claude/commands/cfn-loop-cli.md +16 -2
- package/.claude/commands/switch-api.md +31 -10
- package/.claude/hooks/cfn-lint-sql-injection.sh +61 -0
- package/.claude/hooks/cfn-post-edit-cfn-retrospective.sh +33 -2
- package/.claude/hooks/cfn-pre-edit-security-warning.sh +40 -0
- package/.claude/skills/cfn-agent-spawning/spawn-agent.sh +22 -24
- package/.claude/skills/cfn-docker-agent-spawning/SKILL.md +28 -4
- package/.claude/skills/cfn-docker-agent-spawning/spawn-agent.sh +3 -1
- package/.claude/skills/cfn-docker-loop-orchestration/orchestrate.sh +224 -20
- package/.claude/skills/cfn-loop-orchestration/helpers/gate-check.sh +550 -46
- package/.claude/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +277 -0
- package/.claude/skills/cfn-loop-orchestration/orchestrate.sh +184 -23
- package/.claude/skills/cfn-loop-orchestration/security_utils.sh +24 -0
- package/.claude/skills/cfn-loop-orchestration/test-iteration-context-injection.sh +366 -0
- package/.claude/skills/cfn-redis-coordination/CENTRALIZED_REDIS_WRAPPER.md +319 -0
- package/.claude/skills/cfn-redis-coordination/agent-log.sh +4 -0
- package/.claude/skills/cfn-redis-coordination/agent-log.sh.bak +124 -0
- package/.claude/skills/cfn-redis-coordination/agent-recovery.sh +2 -2
- package/.claude/skills/cfn-redis-coordination/collect-confidence-scores.sh +30 -0
- package/.claude/skills/cfn-redis-coordination/get-context.sh +33 -0
- package/.claude/skills/cfn-redis-coordination/get-success-criteria.sh +54 -0
- package/.claude/skills/cfn-redis-coordination/invoke-waiting-mode.sh +3 -0
- package/.claude/skills/cfn-redis-coordination/redis-cli-wrapper.sh +24 -3
- package/.claude/skills/cfn-redis-coordination/redis-functions.sh +33 -0
- package/.claude/skills/cfn-redis-coordination/report-completion.sh +24 -31
- package/.claude/skills/cfn-redis-coordination/store-context.sh +4 -0
- package/.claude/skills/cfn-redis-coordination/store-success-criteria.sh +85 -0
- package/.claude/skills/cfn-redis-coordination/update-all-scripts.sh +67 -0
- package/.claude/skills/cfn-sqlite-memory/ttl-cleanup.sh +17 -25
- package/.claude/skills/cfn-transparency-middleware/test-e2e.sh +15 -0
- package/.claude/skills/cfn-transparency-middleware/tests/input-validation.sh +15 -0
- package/README.md +116 -475
- package/claude-assets/agents/cfn-dev-team/README.md +103 -0
- package/claude-assets/agents/cfn-dev-team/architecture/goal-planner.md +1 -1
- package/claude-assets/agents/cfn-dev-team/coordinators/cfn-frontend-coordinator.md +77 -15
- package/claude-assets/agents/cfn-dev-team/coordinators/cfn-v3-coordinator.md +355 -6
- package/claude-assets/agents/cfn-dev-team/coordinators/consensus-builder.md +82 -1
- package/claude-assets/agents/cfn-dev-team/coordinators/handoff-coordinator.md +82 -1
- package/claude-assets/agents/cfn-dev-team/coordinators/multi-sprint-coordinator.md +77 -15
- package/claude-assets/agents/cfn-dev-team/dev-ops/docker-specialist.md +99 -12
- package/claude-assets/agents/cfn-dev-team/dev-ops/github-commit-agent.md +1 -1
- package/claude-assets/agents/cfn-dev-team/dev-ops/kubernetes-specialist.md +97 -0
- package/claude-assets/agents/cfn-dev-team/dev-ops/monitoring-specialist.md +20 -1
- package/claude-assets/agents/cfn-dev-team/developers/api-gateway-specialist.md +97 -0
- package/claude-assets/agents/cfn-dev-team/developers/backend-developer.md +110 -13
- package/claude-assets/agents/cfn-dev-team/developers/data/data-engineer.md +106 -15
- package/claude-assets/agents/cfn-dev-team/developers/database/database-architect.md +115 -11
- package/claude-assets/agents/cfn-dev-team/developers/frontend/mobile-dev.md +94 -7
- package/claude-assets/agents/cfn-dev-team/developers/frontend/react-frontend-engineer.md +87 -9
- package/claude-assets/agents/cfn-dev-team/developers/frontend/typescript-specialist.md +85 -7
- package/claude-assets/agents/cfn-dev-team/developers/frontend/ui-designer.md +160 -28
- package/claude-assets/agents/cfn-dev-team/developers/graphql-specialist.md +101 -19
- package/claude-assets/agents/cfn-dev-team/developers/rust-developer.md +108 -14
- package/claude-assets/agents/cfn-dev-team/reviewers/{reviewer.md → code-reviewer.md} +95 -8
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/code-quality-validator.md +107 -7
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/perf-analyzer.md +98 -7
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/performance-benchmarker.md +95 -7
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/security-specialist.md +136 -9
- package/claude-assets/agents/cfn-dev-team/testers/api-testing-specialist.md +108 -1
- package/claude-assets/agents/cfn-dev-team/testers/chaos-engineering-specialist.md +107 -13
- package/claude-assets/agents/cfn-dev-team/testers/contract-tester.md +737 -0
- package/claude-assets/agents/cfn-dev-team/testers/e2e/playwright-tester.md +1 -1
- package/claude-assets/agents/cfn-dev-team/testers/integration-tester.md +828 -0
- package/claude-assets/agents/cfn-dev-team/testers/interaction-tester.md +106 -7
- package/claude-assets/agents/cfn-dev-team/testers/load-testing-specialist.md +77 -0
- package/claude-assets/agents/cfn-dev-team/testers/mutation-testing-specialist.md +684 -0
- package/claude-assets/agents/cfn-dev-team/testers/playwright-tester.md +110 -1
- package/claude-assets/agents/cfn-dev-team/testers/tester.md +94 -7
- package/claude-assets/agents/cfn-dev-team/utility/code-booster.md +1 -3
- package/claude-assets/agents/cfn-dev-team/utility/epic-creator.md +87 -13
- package/claude-assets/agents/cfn-dev-team/utility/memory-leak-specialist.md +103 -7
- package/claude-assets/agents/cfn-dev-team/utility/researcher.md +1 -3
- package/claude-assets/agents/cfn-dev-team/utility/z-ai-specialist.md +94 -7
- package/claude-assets/agents/docker-coordinators/cfn-docker-v3-coordinator.md +46 -0
- package/claude-assets/agents/project-only-agents/npm-package-specialist.md +1 -1
- package/claude-assets/cfn-extras/skills/advanced-features/cfn-agent-swap/recommend-swap.sh +59 -59
- package/claude-assets/cfn-extras/skills/analytics/cfn-improvement-recommender/recommend-improvements.sh +91 -91
- package/claude-assets/cfn-extras/skills/analytics/cfn-pattern-extraction/extract-patterns.sh +79 -79
- package/claude-assets/cfn-extras/skills/analytics/cfn-retrospective-report/generate-report.sh +100 -100
- package/claude-assets/cfn-extras/skills/analytics/cfn-telemetry/start-telemetry.sh +110 -110
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/add-bullet.sh +145 -145
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/log-merge.sh +67 -67
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/monitor-injection-performance.sh +137 -137
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/optimize-injection-pipeline.sh +168 -168
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/query-reflections.sh +35 -35
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/store-reflection.sh +45 -45
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/track-ab-test.sh +41 -41
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/update-reflection.sh +41 -41
- package/claude-assets/cfn-extras/skills/deprecated/cfn-cli-setup/validate-cli-environment.sh +191 -191
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/create-campaign.sh +231 -231
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/get-campaign-performance.sh +190 -190
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/pause-campaign.sh +142 -142
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/set-budget.sh +181 -181
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/update-bid-strategy.sh +133 -133
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/get-conversation-history.sh +121 -121
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/qualify-lead.sh +156 -156
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/schedule-demo.sh +181 -181
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/send-message.sh +137 -137
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/transfer-to-human.sh +179 -179
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/create-campaign.sh +183 -183
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/get-delivery-status.sh +139 -139
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/opt-out.sh +150 -150
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/schedule-campaign.sh +187 -187
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/send-sms.sh +181 -181
- package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/test-web-portal-skill.sh +50 -50
- package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/validate-deployment.sh +84 -84
- package/claude-assets/cfn-extras/skills/utility/cfn-environment-sanitization/sanitize-environment.sh +243 -243
- package/claude-assets/commands/cfn-loop-cli.md +16 -2
- package/claude-assets/commands/switch-api.md +31 -10
- package/claude-assets/hooks/cfn-lint-sql-injection.sh +61 -0
- package/claude-assets/hooks/cfn-post-edit-cfn-retrospective.sh +33 -2
- package/claude-assets/hooks/cfn-pre-edit-security-warning.sh +40 -0
- package/claude-assets/hooks/detect-hardcoded-credentials.sh +212 -0
- package/claude-assets/skills/SKILL_TEMPLATE.md +774 -0
- package/claude-assets/skills/agent-lifecycle/execute-lifecycle-hook.sh +84 -113
- package/claude-assets/skills/agent-lifecycle/simple-audit.sh +33 -6
- package/claude-assets/skills/agent-template-generator/SKILL.md +440 -0
- package/claude-assets/skills/agent-template-generator/generate-agent.sh +405 -0
- package/claude-assets/skills/agent-validation-linter/SKILL.md +589 -0
- package/claude-assets/skills/agent-validation-linter/lint-agents.sh +271 -0
- package/claude-assets/skills/bootstrap/bash-fundamentals.md +786 -0
- package/claude-assets/skills/bootstrap/database-connection.md +464 -0
- package/claude-assets/skills/bootstrap/error-handling.md +580 -0
- package/claude-assets/skills/bootstrap/file-operations.md +699 -0
- package/claude-assets/skills/bootstrap/skill-loader.md +616 -0
- package/claude-assets/skills/bootstrap/sqlite-params.sh +287 -0
- package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh +22 -24
- package/claude-assets/skills/cfn-automatic-memory-persistence/test-memory-persistence.sh +17 -16
- package/claude-assets/skills/cfn-deployment/SKILL.md +293 -0
- package/claude-assets/skills/cfn-deployment/execute.sh +21 -0
- package/claude-assets/skills/cfn-docker-agent-spawning/SKILL.md +28 -4
- package/claude-assets/skills/cfn-docker-agent-spawning/spawn-agent.sh +3 -1
- package/claude-assets/skills/cfn-docker-loop-orchestration/orchestrate.sh +224 -20
- package/claude-assets/skills/cfn-environment-sanitization/sanitize-environment.sh +38 -0
- package/claude-assets/skills/cfn-error-batching-strategy/lib/core-functions.sh +47 -47
- package/claude-assets/skills/cfn-file-operations/SKILL.md +290 -0
- package/claude-assets/skills/cfn-file-operations/execute.sh +129 -0
- package/claude-assets/skills/cfn-file-operations/lib/atomic-write.sh +294 -0
- package/claude-assets/skills/cfn-file-operations/lib/lock.sh +361 -0
- package/claude-assets/skills/cfn-file-operations/test.sh +369 -0
- package/claude-assets/skills/cfn-log-operations/SKILL.md +308 -0
- package/claude-assets/skills/cfn-log-operations/execute.sh +420 -0
- package/claude-assets/skills/cfn-log-operations/lib/rotate.sh +406 -0
- package/claude-assets/skills/cfn-log-operations/lib/search.sh +448 -0
- package/claude-assets/skills/cfn-log-operations/test.sh +394 -0
- package/claude-assets/skills/cfn-loop-orchestration/helpers/gate-check.sh +550 -46
- package/claude-assets/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +277 -0
- package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh +184 -23
- package/claude-assets/skills/cfn-loop-orchestration/security_utils.sh +24 -0
- package/claude-assets/skills/cfn-loop-orchestration/test-iteration-context-injection.sh +366 -0
- package/claude-assets/skills/cfn-parameterized-queries/SKILL.md +339 -0
- package/claude-assets/skills/cfn-playbook/query-playbook.sh +19 -15
- package/claude-assets/skills/cfn-playbook/update-playbook.sh +25 -14
- package/claude-assets/skills/cfn-process-instrumentation/instrument-process.sh +44 -0
- package/claude-assets/skills/cfn-promotion/SKILL.md +305 -0
- package/claude-assets/skills/cfn-redis-coordination/CENTRALIZED_REDIS_WRAPPER.md +319 -0
- package/claude-assets/skills/cfn-redis-coordination/agent-log.sh +4 -0
- package/claude-assets/skills/cfn-redis-coordination/agent-log.sh.bak +124 -0
- package/claude-assets/skills/cfn-redis-coordination/agent-recovery.sh +2 -2
- package/claude-assets/skills/cfn-redis-coordination/collect-confidence-scores.sh +30 -0
- package/claude-assets/skills/cfn-redis-coordination/get-context.sh +33 -0
- package/claude-assets/skills/cfn-redis-coordination/get-success-criteria.sh +54 -0
- package/claude-assets/skills/cfn-redis-coordination/invoke-waiting-mode.sh +3 -0
- package/claude-assets/skills/cfn-redis-coordination/redis-cli-wrapper.sh +24 -3
- package/claude-assets/skills/cfn-redis-coordination/redis-functions.sh +33 -0
- package/claude-assets/skills/cfn-redis-coordination/report-completion.sh +24 -31
- package/claude-assets/skills/cfn-redis-coordination/store-context.sh +4 -0
- package/claude-assets/skills/cfn-redis-coordination/store-success-criteria.sh +85 -0
- package/claude-assets/skills/cfn-redis-coordination/update-all-scripts.sh +67 -0
- package/claude-assets/skills/cfn-skill-loader/SKILL.md +466 -0
- package/claude-assets/skills/cfn-skill-loader/execute.sh +344 -0
- package/claude-assets/skills/cfn-sqlite-memory/ttl-cleanup.sh +17 -25
- package/claude-assets/skills/cfn-task-audit/get-audit-data.sh +42 -21
- package/claude-assets/skills/cfn-task-audit/store-task-audit.sh +17 -10
- package/claude-assets/skills/cfn-test-runner/detect-regressions.sh +17 -14
- package/claude-assets/skills/cfn-test-runner/detect-regressions.sh.backup-1763392821 +55 -0
- package/claude-assets/skills/cfn-test-runner/store-benchmarks.sh +17 -19
- package/claude-assets/skills/cfn-transparency-middleware/test-e2e.sh +15 -0
- package/claude-assets/skills/cfn-transparency-middleware/tests/input-validation.sh +15 -0
- package/claude-assets/skills/cfn-utilities/SKILL.md +237 -0
- package/claude-assets/skills/cfn-utilities/execute.sh +32 -0
- package/claude-assets/skills/cfn-utilities/lib/errors.sh +56 -0
- package/claude-assets/skills/cfn-utilities/lib/file-ops.sh +164 -0
- package/claude-assets/skills/cfn-utilities/lib/logging.sh +77 -0
- package/claude-assets/skills/cfn-utilities/lib/retry.sh +127 -0
- package/claude-assets/skills/cfn-utilities/test.sh +317 -0
- package/claude-assets/skills/integration/agent-handoff.sh +62 -64
- package/claude-assets/skills/json-validation/SKILL.md +431 -0
- package/claude-assets/skills/json-validation/test-validate-success-criteria.sh +421 -0
- package/claude-assets/skills/json-validation/validate-success-criteria.sh +197 -0
- package/claude-assets/skills/redis-coordination/validate-parameters.sh +34 -0
- package/claude-assets/skills/workflow-codification/DEPLOY_QUICK_REFERENCE.md +106 -0
- package/claude-assets/skills/workflow-codification/PROPAGATE_UPDATE_QUICK_REFERENCE.md +366 -0
- package/claude-assets/skills/workflow-codification/deploy-approved-skill.sh +481 -0
- package/claude-assets/skills/workflow-codification/deploy-approved-skill.sh.backup-1763392820 +512 -0
- package/claude-assets/skills/workflow-codification/lib/security-utils.sh +204 -0
- package/claude-assets/skills/workflow-codification/propagate-skill-update.sh +648 -0
- package/claude-assets/skills/workflow-codification/propagate-skill-update.sh.backup-1763392820 +664 -0
- package/claude-assets/skills/workflow-codification/test-integration.sh +15 -0
- package/claude-assets/skills/workflow-codification/test-metadata-update.sh +350 -0
- package/claude-assets/skills/workflow-codification/track-cost-savings.sh +55 -14
- package/claude-assets/skills/workflow-codification/track-cost-savings.sh.backup-1763392821 +445 -0
- package/claude-assets/skills/workflow-codification/track-edge-case.sh +27 -60
- package/claude-assets/skills/workflow-codification/workflow-codification.db +0 -0
- package/dist/ace/ace-curator.js +10 -2
- package/dist/ace/ace-curator.js.map +1 -1
- package/dist/ace/ace-generator.js +4 -0
- package/dist/ace/ace-generator.js.map +1 -1
- package/dist/ace/ace-reflector.js +1 -1
- package/dist/ace/ace-reflector.js.map +1 -1
- package/dist/ace/context-injection.js +24 -2
- package/dist/ace/context-injection.js.map +1 -1
- package/dist/agents/agent-loader.js +146 -165
- package/dist/agents/agent-loader.js.map +1 -1
- package/dist/agents/task-agent-integration.js +1 -1
- package/dist/agents/task-agent-integration.js.map +1 -1
- package/dist/api/health-endpoints.js +390 -0
- package/dist/api/health-endpoints.js.map +1 -0
- package/dist/cli/agent-executor.js +4 -1
- package/dist/cli/agent-executor.js.map +1 -1
- package/dist/cli/agent-prompt-builder.js +89 -1
- package/dist/cli/agent-prompt-builder.js.map +1 -1
- package/dist/cli/agent-spawn.js +130 -37
- package/dist/cli/agent-spawn.js.map +1 -1
- package/dist/cli/skill-cache-validator.js +412 -0
- package/dist/cli/skill-cache-validator.js.map +1 -0
- package/dist/cli/skill-cli.js +991 -0
- package/dist/cli/skill-cli.js.map +1 -0
- package/dist/cli/skill-execution-logger.js +284 -0
- package/dist/cli/skill-execution-logger.js.map +1 -0
- package/dist/cli/skill-loader.js +457 -0
- package/dist/cli/skill-loader.js.map +1 -0
- package/dist/coordination/event-bus.js +2 -2
- package/dist/coordination/event-bus.js.map +1 -1
- package/dist/coordination/fleet-manager.js +1 -1
- package/dist/coordination/fleet-manager.js.map +1 -1
- package/dist/coordination/index.js +23 -9
- package/dist/coordination/index.js.map +1 -1
- package/dist/coordination/types/fleet-manager.types.js.map +1 -1
- package/dist/db/migration-manager.js +483 -0
- package/dist/db/migration-manager.js.map +1 -0
- package/dist/db/skills-query.js +535 -0
- package/dist/db/skills-query.js.map +1 -0
- package/dist/integration/DatabaseHandoff.js +1 -1
- package/dist/integration/DatabaseHandoff.js.map +1 -1
- package/dist/jobs/edge-case-analyzer.js +367 -0
- package/dist/jobs/edge-case-analyzer.js.map +1 -0
- package/dist/jobs/promotion-sla-enforcer.js +288 -0
- package/dist/jobs/promotion-sla-enforcer.js.map +1 -0
- package/dist/lib/agent-output-parser.js.map +1 -1
- package/dist/lib/agent-output-validator.js.map +1 -1
- package/dist/lib/agent-workspace.js +281 -0
- package/dist/lib/agent-workspace.js.map +1 -0
- package/dist/lib/atomic-file-writer.js +377 -0
- package/dist/lib/atomic-file-writer.js.map +1 -0
- package/dist/lib/backup-manager.js +779 -0
- package/dist/lib/backup-manager.js.map +1 -0
- package/dist/lib/checkpoint-manager.js +837 -0
- package/dist/lib/checkpoint-manager.js.map +1 -0
- package/dist/lib/circuit-breaker.js +340 -0
- package/dist/lib/circuit-breaker.js.map +1 -0
- package/dist/lib/completion-signal-handler.js +243 -0
- package/dist/lib/completion-signal-handler.js.map +1 -0
- package/dist/lib/config-manager.js +312 -0
- package/dist/lib/config-manager.js.map +1 -0
- package/dist/lib/config-migrator.js +386 -0
- package/dist/lib/config-migrator.js.map +1 -0
- package/dist/lib/config-validator.js.map +1 -1
- package/dist/lib/correlation-cache.js +311 -0
- package/dist/lib/correlation-cache.js.map +1 -0
- package/dist/lib/correlation.js +263 -0
- package/dist/lib/correlation.js.map +1 -0
- package/dist/lib/database-service/connection-pool-manager.js +520 -0
- package/dist/lib/database-service/connection-pool-manager.js.map +1 -0
- package/dist/lib/database-service/correlation.js +329 -0
- package/dist/lib/database-service/correlation.js.map +1 -0
- package/dist/lib/database-service/errors.js +120 -0
- package/dist/lib/database-service/errors.js.map +1 -0
- package/dist/lib/database-service/index.js +168 -0
- package/dist/lib/database-service/index.js.map +1 -0
- package/dist/lib/database-service/postgres-adapter.js +526 -0
- package/dist/lib/database-service/postgres-adapter.js.map +1 -0
- package/dist/lib/database-service/redis-adapter.js +360 -0
- package/dist/lib/database-service/redis-adapter.js.map +1 -0
- package/dist/lib/database-service/sqlite-adapter.js +544 -0
- package/dist/lib/database-service/sqlite-adapter.js.map +1 -0
- package/dist/lib/database-service/transaction-manager.js +773 -0
- package/dist/lib/database-service/transaction-manager.js.map +1 -0
- package/dist/lib/database-service/types.js +23 -0
- package/dist/lib/database-service/types.js.map +1 -0
- package/dist/lib/deadlock-resolver.js +292 -0
- package/dist/lib/deadlock-resolver.js.map +1 -0
- package/dist/lib/distributed-lock.js +451 -0
- package/dist/lib/distributed-lock.js.map +1 -0
- package/dist/lib/edge-case-deduplicator.js +227 -0
- package/dist/lib/edge-case-deduplicator.js.map +1 -0
- package/dist/lib/encryption-manager.js +322 -0
- package/dist/lib/encryption-manager.js.map +1 -0
- package/dist/lib/error-aggregator.js +234 -0
- package/dist/lib/error-aggregator.js.map +1 -0
- package/dist/lib/errors.js +287 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/file-lock-manager.js +578 -0
- package/dist/lib/file-lock-manager.js.map +1 -0
- package/dist/lib/file-operations.js +367 -0
- package/dist/lib/file-operations.js.map +1 -0
- package/dist/lib/idempotent-write.js +237 -0
- package/dist/lib/idempotent-write.js.map +1 -0
- package/dist/lib/integration-schema-validator.js +522 -0
- package/dist/lib/integration-schema-validator.js.map +1 -0
- package/dist/lib/lock-health-monitor.js +298 -0
- package/dist/lib/lock-health-monitor.js.map +1 -0
- package/dist/lib/log-shipper.js +422 -0
- package/dist/lib/log-shipper.js.map +1 -0
- package/dist/lib/logging.js +146 -0
- package/dist/lib/logging.js.map +1 -0
- package/dist/lib/message-deduplicator.js +439 -0
- package/dist/lib/message-deduplicator.js.map +1 -0
- package/dist/lib/multi-system-query.js +604 -0
- package/dist/lib/multi-system-query.js.map +1 -0
- package/dist/lib/orphan-detector.js +332 -0
- package/dist/lib/orphan-detector.js.map +1 -0
- package/dist/lib/password-generator.js +166 -0
- package/dist/lib/password-generator.js.map +1 -0
- package/dist/lib/path-validator.js +429 -0
- package/dist/lib/path-validator.js.map +1 -0
- package/dist/lib/query-translator.js +905 -0
- package/dist/lib/query-translator.js.map +1 -0
- package/dist/lib/queue-recovery.js +469 -0
- package/dist/lib/queue-recovery.js.map +1 -0
- package/dist/lib/redis-queue-manager.js +512 -0
- package/dist/lib/redis-queue-manager.js.map +1 -0
- package/dist/lib/reflection-archiver.js +272 -0
- package/dist/lib/reflection-archiver.js.map +1 -0
- package/dist/lib/retry-manager.js +453 -0
- package/dist/lib/retry-manager.js.map +1 -0
- package/dist/lib/retry.js +262 -0
- package/dist/lib/retry.js.map +1 -0
- package/dist/lib/schema-transform.js +695 -0
- package/dist/lib/schema-transform.js.map +1 -0
- package/dist/lib/schema-validator.js +491 -0
- package/dist/lib/schema-validator.js.map +1 -0
- package/dist/lib/skill-cache.js +297 -0
- package/dist/lib/skill-cache.js.map +1 -0
- package/dist/lib/skill-content-manager.js +337 -0
- package/dist/lib/skill-content-manager.js.map +1 -0
- package/dist/lib/skill-frontmatter-parser.js +237 -0
- package/dist/lib/skill-frontmatter-parser.js.map +1 -0
- package/dist/lib/skill-git-integration.js +275 -0
- package/dist/lib/skill-git-integration.js.map +1 -0
- package/dist/lib/skill-markdown-validator.js +396 -0
- package/dist/lib/skill-markdown-validator.js.map +1 -0
- package/dist/lib/skill-output-parser.js +312 -0
- package/dist/lib/skill-output-parser.js.map +1 -0
- package/dist/lib/unified-query-api.js +467 -0
- package/dist/lib/unified-query-api.js.map +1 -0
- package/dist/middleware/auth-middleware.js +350 -0
- package/dist/middleware/auth-middleware.js.map +1 -0
- package/dist/middleware/schema-validation.js +347 -0
- package/dist/middleware/schema-validation.js.map +1 -0
- package/dist/providers/anthropic-provider.js +1 -1
- package/dist/providers/anthropic-provider.js.map +1 -1
- package/dist/providers/provider-factory.js +2 -2
- package/dist/providers/provider-factory.js.map +1 -1
- package/dist/services/edge-case-analyzer.js +321 -0
- package/dist/services/edge-case-analyzer.js.map +1 -0
- package/dist/services/edge-case-deduplicator.js +266 -0
- package/dist/services/edge-case-deduplicator.js.map +1 -0
- package/dist/services/edge-case-detector.js +337 -0
- package/dist/services/edge-case-detector.js.map +1 -0
- package/dist/services/edge-case-tracker.js +547 -0
- package/dist/services/edge-case-tracker.js.map +1 -0
- package/dist/services/health-check-system.js +586 -0
- package/dist/services/health-check-system.js.map +1 -0
- package/dist/services/metrics-logger.js +412 -0
- package/dist/services/metrics-logger.js.map +1 -0
- package/dist/services/patch-generator.js +378 -0
- package/dist/services/patch-generator.js.map +1 -0
- package/dist/services/patch-validator.js +337 -0
- package/dist/services/patch-validator.js.map +1 -0
- package/dist/services/performance-monitor.js +811 -0
- package/dist/services/performance-monitor.js.map +1 -0
- package/dist/services/promotion-pipeline.js +918 -0
- package/dist/services/promotion-pipeline.js.map +1 -0
- package/dist/services/promotion-validator.js +394 -0
- package/dist/services/promotion-validator.js.map +1 -0
- package/dist/services/reflection-logger.js +388 -0
- package/dist/services/reflection-logger.js.map +1 -0
- package/dist/services/skill-deployment.js +472 -0
- package/dist/services/skill-deployment.js.map +1 -0
- package/dist/services/skill-loader.js +427 -0
- package/dist/services/skill-loader.js.map +1 -0
- package/dist/services/skill-promotion.js +372 -0
- package/dist/services/skill-promotion.js.map +1 -0
- package/dist/services/skill-validator.js +454 -0
- package/dist/services/skill-validator.js.map +1 -0
- package/dist/services/skill-versioning.js +244 -0
- package/dist/services/skill-versioning.js.map +1 -0
- package/dist/services/workspace-supervisor.js +597 -0
- package/dist/services/workspace-supervisor.js.map +1 -0
- package/dist/types/edge-case.js +45 -0
- package/dist/types/edge-case.js.map +1 -0
- package/package.json +201 -177
- package/readme/README.md +19 -4
- package/scripts/backup-cleanup.sh +627 -0
- package/scripts/cleanup-workspaces.sh +412 -0
- package/scripts/cleanup-yaml-configs.sh +141 -0
- package/scripts/deploy-approved-skills.sh +263 -0
- package/scripts/health-check.sh +447 -0
- package/scripts/log-aggregator.sh +554 -0
- package/scripts/log-monitor.sh +629 -0
- package/scripts/manage-agent-workspaces.sh +434 -0
- package/scripts/migrate-schema.sh +533 -0
- package/scripts/promote-staged-skills.sh +423 -0
- package/scripts/verify-no-secrets.sh +88 -35
- package/.claude/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +0 -161
- package/.claude/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +0 -728
- package/.claude/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +0 -131
- package/.claude/skills/agent-lifecycle/SKILL.md +0 -60
- package/.claude/skills/agent-lifecycle/execute-lifecycle-hook.sh +0 -573
- package/.claude/skills/agent-lifecycle/simple-audit.sh +0 -31
- package/.claude/skills/cfn-agent-spawning/spawn-agent.sh.backup +0 -273
- package/.claude/skills/cfn-loop-orchestration/orchestrate.sh.backup +0 -949
- package/README.md.backup_before_replace +0 -781
- package/claude-assets/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +0 -161
- package/claude-assets/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +0 -728
- package/claude-assets/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +0 -131
- package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh.backup +0 -273
- package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh.backup +0 -949
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/api/health-endpoints.ts"],"sourcesContent":["/**\r\n * Health Check HTTP Endpoints\r\n *\r\n * Provides REST API endpoints for health monitoring:\r\n * - GET /health - Overall system health status\r\n * - GET /health/ready - Kubernetes readiness probe\r\n * - GET /health/live - Kubernetes liveness probe\r\n * - GET /health/detailed - Detailed component-level health report\r\n *\r\n * Integrates with monitoring dashboards and Kubernetes orchestration.\r\n *\r\n * Part of Task P2-4.1: Comprehensive Health Checks\r\n */\r\n\r\nimport express, { Router, Request, Response } from 'express';\r\nimport { HealthCheckSystem, HealthCheck, DetailedHealthReport } from '../services/health-check-system.js';\r\n\r\n/**\r\n * Health endpoint response format\r\n */\r\nexport interface HealthResponse {\r\n status: 'healthy' | 'degraded' | 'unhealthy';\r\n timestamp: string;\r\n latency: number;\r\n checks?: Record<string, any>;\r\n}\r\n\r\n/**\r\n * Readiness/liveness probe response\r\n */\r\nexport interface ProbeResponse {\r\n status: 'ready' | 'not-ready' | 'alive' | 'not-alive';\r\n timestamp: string;\r\n}\r\n\r\n/**\r\n * Health check endpoints router\r\n */\r\nexport class HealthEndpoints {\r\n private router: Router;\r\n private healthCheckSystem: HealthCheckSystem;\r\n\r\n constructor(config?: { systemConfig?: Record<string, any> }) {\r\n this.router = express.Router();\r\n this.healthCheckSystem = new HealthCheckSystem(config?.systemConfig);\r\n this.setupRoutes();\r\n }\r\n\r\n /**\r\n * Setup all health check routes\r\n */\r\n private setupRoutes(): void {\r\n /**\r\n * GET /health - Overall system health\r\n *\r\n * Returns the current health status of the system including:\r\n * - Overall status (healthy/degraded/unhealthy)\r\n * - Response latency\r\n * - Component health summary\r\n *\r\n * Response time: <1s\r\n * Status codes:\r\n * 200: System healthy\r\n * 503: System degraded or unhealthy\r\n */\r\n this.router.get('/health', async (req: Request, res: Response) => {\r\n const startTime = Date.now();\r\n\r\n const overall = await this.healthCheckSystem.getOverallHealth();\r\n const responseTime = Date.now() - startTime;\r\n\r\n const response: HealthResponse = {\r\n status: overall.status as 'healthy' | 'degraded' | 'unhealthy',\r\n timestamp: new Date().toISOString(),\r\n latency: responseTime,\r\n checks: {\r\n database: overall.dependencies?.[0].status,\r\n redis: overall.dependencies?.[1].status,\r\n filesystem: overall.dependencies?.[2].status,\r\n agents: overall.dependencies?.[3].status,\r\n },\r\n };\r\n\r\n const statusCode = overall.status === 'healthy' ? 200 : 503;\r\n res.status(statusCode).json(response);\r\n });\r\n\r\n /**\r\n * GET /health/ready - Kubernetes readiness probe\r\n *\r\n * Checks if the system is ready to accept traffic.\r\n * All critical services must be healthy.\r\n *\r\n * Response time: <500ms\r\n * Status codes:\r\n * 200: Ready to accept traffic\r\n * 503: Not ready\r\n */\r\n this.router.get('/health/ready', async (req: Request, res: Response) => {\r\n const startTime = Date.now();\r\n\r\n const overall = await this.healthCheckSystem.getOverallHealth();\r\n const isReady = overall.status === 'healthy';\r\n const responseTime = Date.now() - startTime;\r\n\r\n const response: ProbeResponse = {\r\n status: isReady ? 'ready' : 'not-ready',\r\n timestamp: new Date().toISOString(),\r\n };\r\n\r\n const statusCode = isReady ? 200 : 503;\r\n res.status(statusCode).json(response);\r\n });\r\n\r\n /**\r\n * GET /health/live - Kubernetes liveness probe\r\n *\r\n * Checks if the system is alive and responding.\r\n * Allows degraded services.\r\n *\r\n * Response time: <500ms\r\n * Status codes:\r\n * 200: System alive\r\n * 503: System down/unhealthy\r\n */\r\n this.router.get('/health/live', async (req: Request, res: Response) => {\r\n const startTime = Date.now();\r\n\r\n const overall = await this.healthCheckSystem.getOverallHealth();\r\n const isAlive = overall.status !== 'unhealthy';\r\n const responseTime = Date.now() - startTime;\r\n\r\n const response: ProbeResponse = {\r\n status: isAlive ? 'alive' : 'not-alive',\r\n timestamp: new Date().toISOString(),\r\n };\r\n\r\n const statusCode = isAlive ? 200 : 503;\r\n res.status(statusCode).json(response);\r\n });\r\n\r\n /**\r\n * GET /health/detailed - Detailed health report\r\n *\r\n * Returns comprehensive health information including:\r\n * - Overall system status\r\n * - Individual service metrics\r\n * - Response latencies\r\n * - Disk usage\r\n * - Queue depth\r\n * - Active agents\r\n * - Alerts and warnings\r\n *\r\n * Response time: <1s\r\n * Status codes:\r\n * 200: Report generated (regardless of health status)\r\n */\r\n this.router.get('/health/detailed', async (req: Request, res: Response) => {\r\n const startTime = Date.now();\r\n\r\n const report = await this.healthCheckSystem.getDetailedHealthReport();\r\n const responseTime = Date.now() - startTime;\r\n\r\n const response = {\r\n timestamp: report.timestamp.toISOString(),\r\n overallStatus: report.overallStatus,\r\n latency: responseTime,\r\n totalLatency: report.latency,\r\n services: {\r\n database: {\r\n status: report.services.database.status,\r\n latency: report.services.database.latency,\r\n message: report.services.database.message,\r\n metadata: report.services.database.metadata,\r\n },\r\n redis: {\r\n status: report.services.redis.status,\r\n latency: report.services.redis.latency,\r\n message: report.services.redis.message,\r\n metadata: report.services.redis.metadata,\r\n },\r\n filesystem: {\r\n status: report.services.filesystem.status,\r\n latency: report.services.filesystem.latency,\r\n message: report.services.filesystem.message,\r\n metadata: report.services.filesystem.metadata,\r\n },\r\n agents: {\r\n status: report.services.agents.status,\r\n latency: report.services.agents.latency,\r\n message: report.services.agents.message,\r\n metadata: report.services.agents.metadata,\r\n },\r\n },\r\n alerts: report.alerts || [],\r\n };\r\n\r\n res.status(200).json(response);\r\n });\r\n\r\n /**\r\n * GET /health/database - Database health only\r\n *\r\n * Focused check for database connectivity.\r\n * Useful for targeted monitoring.\r\n */\r\n this.router.get('/health/database', async (req: Request, res: Response) => {\r\n const startTime = Date.now();\r\n\r\n const check = await this.healthCheckSystem.checkDatabase();\r\n const responseTime = Date.now() - startTime;\r\n\r\n const response = {\r\n service: 'database',\r\n status: check.status,\r\n latency: responseTime,\r\n message: check.message,\r\n metadata: check.metadata,\r\n timestamp: new Date().toISOString(),\r\n };\r\n\r\n const statusCode = check.status === 'healthy' ? 200 : 503;\r\n res.status(statusCode).json(response);\r\n });\r\n\r\n /**\r\n * GET /health/redis - Redis health only\r\n *\r\n * Focused check for Redis connectivity.\r\n */\r\n this.router.get('/health/redis', async (req: Request, res: Response) => {\r\n const startTime = Date.now();\r\n\r\n const check = await this.healthCheckSystem.checkRedis();\r\n const responseTime = Date.now() - startTime;\r\n\r\n const response = {\r\n service: 'redis',\r\n status: check.status,\r\n latency: responseTime,\r\n message: check.message,\r\n metadata: check.metadata,\r\n timestamp: new Date().toISOString(),\r\n };\r\n\r\n const statusCode = check.status === 'healthy' ? 200 : 503;\r\n res.status(statusCode).json(response);\r\n });\r\n\r\n /**\r\n * GET /health/filesystem - File system health only\r\n *\r\n * Focused check for disk space and permissions.\r\n */\r\n this.router.get('/health/filesystem', async (req: Request, res: Response) => {\r\n const startTime = Date.now();\r\n\r\n const check = await this.healthCheckSystem.checkFileSystem();\r\n const responseTime = Date.now() - startTime;\r\n\r\n const response = {\r\n service: 'filesystem',\r\n status: check.status,\r\n latency: responseTime,\r\n message: check.message,\r\n metadata: check.metadata,\r\n timestamp: new Date().toISOString(),\r\n };\r\n\r\n const statusCode = check.status === 'healthy' ? 200 : 503;\r\n res.status(statusCode).json(response);\r\n });\r\n\r\n /**\r\n * GET /health/agents - Agent health only\r\n *\r\n * Focused check for active agents and queue depth.\r\n */\r\n this.router.get('/health/agents', async (req: Request, res: Response) => {\r\n const startTime = Date.now();\r\n\r\n const check = await this.healthCheckSystem.checkAgents();\r\n const responseTime = Date.now() - startTime;\r\n\r\n const response = {\r\n service: 'agents',\r\n status: check.status,\r\n latency: responseTime,\r\n message: check.message,\r\n metadata: check.metadata,\r\n timestamp: new Date().toISOString(),\r\n };\r\n\r\n const statusCode = check.status === 'healthy' ? 200 : 503;\r\n res.status(statusCode).json(response);\r\n });\r\n\r\n /**\r\n * GET /health/ping - Fast connectivity check\r\n *\r\n * Ultra-fast ping endpoint for basic connectivity checks.\r\n * Returns in <100ms for Kubernetes probes and dashboards.\r\n *\r\n * Query parameters:\r\n * - timeout: Optional timeout in milliseconds (default: 100)\r\n *\r\n * Response time: <100ms\r\n * Status codes:\r\n * 200: System responsive\r\n * 503: System unresponsive or timeout\r\n */\r\n this.router.get('/health/ping', async (req: Request, res: Response) => {\r\n const startTime = Date.now();\r\n\r\n try {\r\n // Parse optional timeout parameter\r\n const timeout = req.query.timeout\r\n ? parseInt(req.query.timeout as string, 10)\r\n : 100;\r\n\r\n // Validate timeout\r\n if (isNaN(timeout) || timeout < 1 || timeout > 1000) {\r\n res.status(400).json({\r\n error: 'Invalid timeout parameter',\r\n message: 'Timeout must be between 1 and 1000 milliseconds',\r\n timestamp: new Date().toISOString(),\r\n });\r\n return;\r\n }\r\n\r\n const check = await this.healthCheckSystem.ping(timeout);\r\n const responseTime = Date.now() - startTime;\r\n\r\n const response = {\r\n status: check.status,\r\n latency: responseTime,\r\n message: check.message,\r\n metadata: check.metadata,\r\n timestamp: new Date().toISOString(),\r\n };\r\n\r\n res.status(200).json(response);\r\n } catch (error: any) {\r\n const responseTime = Date.now() - startTime;\r\n\r\n const response = {\r\n status: 'unhealthy',\r\n latency: responseTime,\r\n message: error.message || 'Ping failed',\r\n error: error.code || 'UNKNOWN_ERROR',\r\n timestamp: new Date().toISOString(),\r\n };\r\n\r\n res.status(503).json(response);\r\n }\r\n });\r\n\r\n /**\r\n * GET /health/aggregate - Aggregated health statistics\r\n *\r\n * Returns comprehensive aggregated health metrics from all services.\r\n * Includes service counts, average latency, warnings, and errors.\r\n *\r\n * Query parameters:\r\n * - timeout: Optional timeout in milliseconds (default: 5000)\r\n *\r\n * Response time: <5s (default)\r\n * Status codes:\r\n * 200: Stats collected successfully\r\n * 503: Timeout or aggregation failure\r\n */\r\n this.router.get('/health/aggregate', async (req: Request, res: Response) => {\r\n const startTime = Date.now();\r\n\r\n try {\r\n // Parse optional timeout parameter\r\n const timeout = req.query.timeout\r\n ? parseInt(req.query.timeout as string, 10)\r\n : 5000;\r\n\r\n // Validate timeout\r\n if (isNaN(timeout) || timeout < 100 || timeout > 30000) {\r\n res.status(400).json({\r\n error: 'Invalid timeout parameter',\r\n message: 'Timeout must be between 100 and 30000 milliseconds',\r\n timestamp: new Date().toISOString(),\r\n });\r\n return;\r\n }\r\n\r\n const stats = await this.healthCheckSystem.getAggregateStats(timeout);\r\n const responseTime = Date.now() - startTime;\r\n\r\n const response = {\r\n timestamp: stats.timestamp.toISOString(),\r\n overallStatus: stats.overallStatus,\r\n latency: responseTime,\r\n totalLatency: stats.latency,\r\n averageServiceLatency: stats.averageServiceLatency,\r\n serviceCount: stats.serviceCount,\r\n services: {\r\n database: {\r\n status: stats.services.database.status,\r\n latency: stats.services.database.latency,\r\n message: stats.services.database.message,\r\n },\r\n redis: {\r\n status: stats.services.redis.status,\r\n latency: stats.services.redis.latency,\r\n message: stats.services.redis.message,\r\n },\r\n filesystem: {\r\n status: stats.services.filesystem.status,\r\n latency: stats.services.filesystem.latency,\r\n message: stats.services.filesystem.message,\r\n },\r\n agents: {\r\n status: stats.services.agents.status,\r\n latency: stats.services.agents.latency,\r\n message: stats.services.agents.message,\r\n },\r\n },\r\n metadata: stats.metadata,\r\n warnings: stats.warnings,\r\n errors: stats.errors,\r\n };\r\n\r\n const statusCode = stats.overallStatus === 'healthy' ? 200 : 503;\r\n res.status(statusCode).json(response);\r\n } catch (error: any) {\r\n const responseTime = Date.now() - startTime;\r\n\r\n const response = {\r\n status: 'error',\r\n latency: responseTime,\r\n message: error.message || 'Failed to aggregate health stats',\r\n error: error.code || 'UNKNOWN_ERROR',\r\n timestamp: new Date().toISOString(),\r\n };\r\n\r\n res.status(503).json(response);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Get the configured router\r\n */\r\n getRouter(): Router {\r\n return this.router;\r\n }\r\n\r\n /**\r\n * Get the health check system instance\r\n */\r\n getHealthCheckSystem(): HealthCheckSystem {\r\n return this.healthCheckSystem;\r\n }\r\n}\r\n\r\n/**\r\n * Create and configure health check endpoints\r\n * Usage:\r\n * const app = express();\r\n * const healthEndpoints = new HealthEndpoints();\r\n * app.use('/health', healthEndpoints.getRouter());\r\n */\r\nexport function createHealthEndpoints(config?: { systemConfig?: Record<string, any> }): HealthEndpoints {\r\n return new HealthEndpoints(config);\r\n}\r\n\r\n/**\r\n * Middleware for adding health check endpoints to an Express app\r\n * Usage:\r\n * const app = express();\r\n * app.use(mountHealthEndpoints());\r\n */\r\nexport function mountHealthEndpoints(config?: { systemConfig?: Record<string, any> }): Router {\r\n const endpoints = new HealthEndpoints(config);\r\n return endpoints.getRouter();\r\n}\r\n\r\nexport { HealthCheckSystem };\r\n"],"names":["express","HealthCheckSystem","HealthEndpoints","router","healthCheckSystem","config","Router","systemConfig","setupRoutes","get","req","res","startTime","Date","now","overall","getOverallHealth","responseTime","response","status","timestamp","toISOString","latency","checks","database","dependencies","redis","filesystem","agents","statusCode","json","isReady","isAlive","report","getDetailedHealthReport","overallStatus","totalLatency","services","message","metadata","alerts","check","checkDatabase","service","checkRedis","checkFileSystem","checkAgents","timeout","query","parseInt","isNaN","error","ping","code","stats","getAggregateStats","averageServiceLatency","serviceCount","warnings","errors","getRouter","getHealthCheckSystem","createHealthEndpoints","mountHealthEndpoints","endpoints"],"mappings":"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"}
|
|
@@ -17,8 +17,10 @@ import path from 'path';
|
|
|
17
17
|
import os from 'os';
|
|
18
18
|
const execAsync = promisify(exec);
|
|
19
19
|
// Bug #6 Fix: Read Redis connection parameters from process.env
|
|
20
|
+
// ENV-001: Standardized environment variable naming (REDIS_PASSWORD for all deployments)
|
|
20
21
|
const redisHost = process.env.CFN_REDIS_HOST || 'cfn-redis';
|
|
21
22
|
const redisPort = process.env.CFN_REDIS_PORT || '6379';
|
|
23
|
+
const redisPassword = process.env.CFN_REDIS_PASSWORD || process.env.REDIS_PASSWORD || '';
|
|
22
24
|
/**
|
|
23
25
|
* Extract confidence score from agent output
|
|
24
26
|
* Looks for patterns like:
|
|
@@ -60,7 +62,8 @@ const redisPort = process.env.CFN_REDIS_PORT || '6379';
|
|
|
60
62
|
try {
|
|
61
63
|
// Step 1: Signal completion
|
|
62
64
|
console.log('[CFN Protocol] Step 1: Signaling completion...');
|
|
63
|
-
|
|
65
|
+
const authFlag = redisPassword ? `-a "${redisPassword}"` : '';
|
|
66
|
+
await execAsync(`redis-cli -h "${redisHost}" -p "${redisPort}" ${authFlag} lpush "swarm:${taskId}:${agentId}:done" "complete"`);
|
|
64
67
|
console.log('[CFN Protocol] ✓ Completion signaled');
|
|
65
68
|
// Step 2: Extract and report confidence
|
|
66
69
|
const confidence = extractConfidence(output);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/agent-executor.ts"],"sourcesContent":["/**\r\n * Agent Executor\r\n *\r\n * Executes CLI-spawned agents by:\r\n * 1. Checking custom routing configuration (z.ai vs Anthropic)\r\n * 2. Invoking the appropriate API\r\n * 3. Managing agent lifecycle and output\r\n */\r\n\r\nimport { spawn } from 'child_process';\r\nimport { exec } from 'child_process';\r\nimport { promisify } from 'util';\r\nimport { AgentDefinition } from './agent-definition-parser.js';\r\nimport { TaskContext, getAgentId } from './agent-prompt-builder.js';\r\nimport { buildCLIAgentSystemPrompt, loadContextFromEnv } from './cli-agent-context.js';\r\nimport {\r\n loadMessages,\r\n storeMessage,\r\n getCurrentFork,\r\n formatMessagesForAPI,\r\n type Message\r\n} from './conversation-fork.js';\r\nimport { convertToolNames } from './tool-definitions.js';\r\nimport fs from 'fs/promises';\r\nimport path from 'path';\r\nimport os from 'os';\r\n\r\nconst execAsync = promisify(exec);\r\n\r\n// Bug #6 Fix: Read Redis connection parameters from process.env\r\nconst redisHost = process.env.CFN_REDIS_HOST || 'cfn-redis';\r\nconst redisPort = process.env.CFN_REDIS_PORT || '6379';\r\n\r\nexport interface AgentExecutionResult {\r\n success: boolean;\r\n agentId: string;\r\n output?: string;\r\n error?: string;\r\n exitCode: number;\r\n}\r\n\r\n/**\r\n * Extract confidence score from agent output\r\n * Looks for patterns like:\r\n * - \"confidence: 0.85\"\r\n * - \"Confidence: 0.90\"\r\n * - \"confidence score: 0.95\"\r\n * - \"self-confidence: 0.88\"\r\n */\r\nfunction extractConfidence(output: string | undefined): number {\r\n if (!output) return 0.85;\r\n\r\n // Try multiple patterns\r\n const patterns = [\r\n /confidence:\\s*([0-9.]+)/i,\r\n /confidence\\s+score:\\s*([0-9.]+)/i,\r\n /self-confidence:\\s*([0-9.]+)/i,\r\n /my\\s+confidence:\\s*([0-9.]+)/i,\r\n ];\r\n\r\n for (const pattern of patterns) {\r\n const match = output.match(pattern);\r\n if (match && match[1]) {\r\n const score = parseFloat(match[1]);\r\n if (score >= 0 && score <= 1) {\r\n return score;\r\n }\r\n }\r\n }\r\n\r\n // Default to 0.85 if not found\r\n return 0.85;\r\n}\r\n\r\n/**\r\n * Execute CFN Loop protocol after agent completes work\r\n *\r\n * Steps:\r\n * 1. Signal completion to orchestrator\r\n * 2. Report confidence score\r\n * 3. Enter waiting mode (if iterations enabled)\r\n */\r\nasync function executeCFNProtocol(\r\n taskId: string,\r\n agentId: string,\r\n output: string | undefined,\r\n iteration: number,\r\n enableIterations: boolean = false,\r\n maxIterations: number = 10\r\n): Promise<void> {\r\n console.log(`\\n[CFN Protocol] Starting for agent ${agentId}`);\r\n console.log(`[CFN Protocol] Task ID: ${taskId}, Iteration: ${iteration}`);\r\n\r\n try {\r\n // Step 1: Signal completion\r\n console.log('[CFN Protocol] Step 1: Signaling completion...');\r\n await execAsync(`redis-cli -h \"${redisHost}\" -p \"${redisPort}\" lpush \"swarm:${taskId}:${agentId}:done\" \"complete\"`);\r\n console.log('[CFN Protocol] ✓ Completion signaled');\r\n\r\n // Step 2: Extract and report confidence\r\n const confidence = extractConfidence(output);\r\n console.log(`[CFN Protocol] Step 2: Reporting confidence (${confidence})...`);\r\n\r\n const reportCmd = `./.claude/skills/cfn-redis-coordination/report-completion.sh \\\r\n --task-id \"${taskId}\" \\\r\n --agent-id \"${agentId}\" \\\r\n --confidence ${confidence} \\\r\n --iteration ${iteration}`;\r\n\r\n await execAsync(reportCmd);\r\n console.log('[CFN Protocol] ✓ Confidence reported');\r\n\r\n // Step 3: Exit cleanly (BUG #18 FIX - removed waiting mode)\r\n // Orchestrator will spawn appropriate specialist agent for next iteration\r\n // This enables adaptive agent specialization based on feedback type\r\n console.log('[CFN Protocol] Step 3: Exiting cleanly (iteration complete)');\r\n console.log('[CFN Protocol] Protocol complete\\n');\r\n } catch (error) {\r\n console.error('[CFN Protocol] Error:', error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Check if custom routing (z.ai) is enabled\r\n */\r\nasync function isCustomRoutingEnabled(): Promise<boolean> {\r\n // Check environment variable\r\n if (process.env.CLAUDE_API_PROVIDER === 'zai') {\r\n return true;\r\n }\r\n\r\n // Check config file (.claude/config/api-provider.json)\r\n try {\r\n const configPath = path.join('.claude', 'config', 'api-provider.json');\r\n const config = JSON.parse(await fs.readFile(configPath, 'utf-8'));\r\n return config.provider === 'zai' || config.provider === 'z.ai';\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Get API provider configuration\r\n */\r\nasync function getAPIProvider(): Promise<'anthropic' | 'zai'> {\r\n const customEnabled = await isCustomRoutingEnabled();\r\n return customEnabled ? 'zai' : 'anthropic';\r\n}\r\n\r\n/**\r\n * Execute agent using direct API calls\r\n */\r\nasync function executeViaAPI(\r\n definition: AgentDefinition,\r\n prompt: string,\r\n context: TaskContext\r\n): Promise<AgentExecutionResult> {\r\n const agentId = getAgentId(definition, context);\r\n\r\n console.log(`[agent-executor] Executing agent via API: ${definition.name}`);\r\n console.log(`[agent-executor] Agent ID: ${agentId}`);\r\n console.log(`[agent-executor] Model: ${definition.model}`);\r\n console.log('');\r\n\r\n try {\r\n // Check for conversation fork (Sprint 4 enhancement)\r\n const forkId = process.env.FORK_ID || await getCurrentFork(context.taskId || '', agentId);\r\n const iteration = context.iteration || 1;\r\n\r\n let systemPrompt: string;\r\n let messages: Array<{role: string, content: string}> = [];\r\n\r\n if (forkId && iteration > 1) {\r\n // Continue from fork (iterations 2+)\r\n console.log(`[agent-executor] Continuing from fork: ${forkId}`);\r\n\r\n // Load fork messages\r\n const forkMessages = await loadMessages(context.taskId || '', agentId, forkId);\r\n console.log(`[agent-executor] Loaded ${forkMessages.length} messages from fork`);\r\n\r\n // Extract system prompt from first message (it's always the system message)\r\n // The fork messages are assistant/user pairs, we need to add system separately\r\n systemPrompt = forkMessages[0]?.content || '';\r\n\r\n // Format remaining messages for API\r\n messages = formatMessagesForAPI(forkMessages.slice(1));\r\n\r\n // Add new user message with feedback\r\n messages.push({\r\n role: 'user',\r\n content: prompt\r\n });\r\n\r\n console.log(`[agent-executor] Fork continuation: ${messages.length} messages`);\r\n } else {\r\n // New conversation (iteration 1)\r\n console.log('[agent-executor] Starting new conversation');\r\n console.log('[agent-executor] Building system prompt with context...');\r\n\r\n const contextOptions = loadContextFromEnv();\r\n contextOptions.agentType = definition.name;\r\n if (context.taskId) contextOptions.taskId = context.taskId;\r\n if (context.iteration) contextOptions.iteration = context.iteration;\r\n\r\n systemPrompt = await buildCLIAgentSystemPrompt(contextOptions);\r\n console.log('[agent-executor] System prompt built successfully');\r\n\r\n // Initial user message\r\n messages = [{\r\n role: 'user',\r\n content: prompt\r\n }];\r\n }\r\n\r\n console.log('');\r\n\r\n // Dynamic import to avoid bundling issues\r\n const { executeAgentAPI } = await import('./anthropic-client.js');\r\n\r\n // Convert agent tool names to Anthropic API format\r\n const tools = definition.tools && definition.tools.length > 0\r\n ? convertToolNames(definition.tools)\r\n : undefined;\r\n\r\n const result = await executeAgentAPI(\r\n definition.name,\r\n agentId,\r\n definition.model,\r\n prompt,\r\n systemPrompt,\r\n messages.length > 1 ? messages : undefined,\r\n undefined, // maxTokens (use default)\r\n tools // Pass converted tools\r\n );\r\n\r\n // Store messages in conversation history (for future forking)\r\n if (context.taskId) {\r\n // Store user message\r\n const userMessage: Message = {\r\n role: 'user',\r\n content: prompt,\r\n iteration,\r\n timestamp: new Date().toISOString()\r\n };\r\n await storeMessage(context.taskId, agentId, userMessage);\r\n\r\n // Store assistant response\r\n if (result.output) {\r\n const assistantMessage: Message = {\r\n role: 'assistant',\r\n content: result.output,\r\n iteration,\r\n timestamp: new Date().toISOString()\r\n };\r\n await storeMessage(context.taskId, agentId, assistantMessage);\r\n }\r\n\r\n console.log(`[agent-executor] Stored messages for iteration ${iteration}`);\r\n\r\n // Execute CFN Loop protocol (signal completion, report confidence, enter waiting mode)\r\n // Iterations are enabled for CFN Loop tasks (indicated by presence of taskId)\r\n try {\r\n const maxIterations = 10; // Default max iterations\r\n const enableIterations = true; // Enable iterations for all CFN Loop tasks\r\n\r\n await executeCFNProtocol(\r\n context.taskId,\r\n agentId,\r\n result.output,\r\n iteration,\r\n enableIterations,\r\n maxIterations\r\n );\r\n } catch (error) {\r\n console.error('[agent-executor] CFN Protocol execution failed:', error);\r\n // Don't fail the entire agent execution if CFN protocol fails\r\n // This allows agents to complete even if Redis coordination has issues\r\n }\r\n }\r\n\r\n return {\r\n success: result.success,\r\n agentId,\r\n output: result.output,\r\n error: result.error,\r\n exitCode: result.success ? 0 : 1,\r\n };\r\n } catch (error) {\r\n console.error('[agent-executor] API execution failed:', error);\r\n return {\r\n success: false,\r\n agentId,\r\n error: error instanceof Error ? error.message : String(error),\r\n exitCode: 1,\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Execute agent using shell script (fallback/simulation)\r\n */\r\nasync function executeViaScript(\r\n definition: AgentDefinition,\r\n prompt: string,\r\n context: TaskContext\r\n): Promise<AgentExecutionResult> {\r\n const agentId = getAgentId(definition, context);\r\n\r\n // Write prompt to temporary file\r\n const tmpDir = os.tmpdir();\r\n const promptFile = path.join(tmpDir, `agent-${agentId}-${Date.now()}.md`);\r\n await fs.writeFile(promptFile, prompt, 'utf-8');\r\n\r\n console.log(`[agent-executor] Executing agent via script: ${definition.name}`);\r\n console.log(`[agent-executor] Agent ID: ${agentId}`);\r\n console.log(`[agent-executor] Model: ${definition.model}`);\r\n console.log(`[agent-executor] Prompt file: ${promptFile}`);\r\n\r\n return new Promise((resolve) => {\r\n const scriptPath = path.join('.claude', 'skills', 'agent-execution', 'execute-agent.sh');\r\n\r\n // Build environment variables - WHITELIST ONLY APPROACH\r\n // SECURITY FIX: Do not use ...process.env spread which exposes ALL variables including secrets\r\n // Instead, explicitly whitelist safe variables to pass to spawned process\r\n const safeEnvVars = [\r\n 'CFN_REDIS_HOST',\r\n 'CFN_REDIS_PORT',\r\n 'CFN_REDIS_URL',\r\n 'CFN_MEMORY_BUDGET',\r\n 'CFN_API_HOST',\r\n 'CFN_API_PORT',\r\n 'CFN_LOG_LEVEL',\r\n 'CFN_LOG_FORMAT',\r\n 'CFN_CONTAINER_MODE',\r\n 'CFN_DOCKER_SOCKET',\r\n 'CFN_NETWORK_NAME',\r\n 'CFN_CUSTOM_ROUTING',\r\n 'CFN_DEFAULT_PROVIDER',\r\n 'NODE_ENV',\r\n 'PATH',\r\n 'HOME'\r\n ];\r\n\r\n const env: Record<string, string> = {};\r\n\r\n // Add whitelisted variables\r\n for (const key of safeEnvVars) {\r\n const value = process.env[key];\r\n if (value !== undefined) {\r\n env[key] = value;\r\n }\r\n }\r\n\r\n // Add API key only when explicitly needed (with strict validation)\r\n if (process.env.ANTHROPIC_API_KEY) {\r\n if (process.env.ANTHROPIC_API_KEY.match(/^sk-[a-zA-Z0-9-]+$/)) {\r\n env.ANTHROPIC_API_KEY = process.env.ANTHROPIC_API_KEY;\r\n }\r\n }\r\n\r\n // Add agent execution context (safe values)\r\n env.AGENT_TYPE = definition.name;\r\n env.AGENT_ID = agentId;\r\n env.AGENT_MODEL = definition.model;\r\n env.AGENT_TOOLS = definition.tools.join(',');\r\n env.TASK_ID = context.taskId || '';\r\n env.ITERATION = String(context.iteration || 1);\r\n env.MODE = context.mode || 'cli';\r\n env.PROMPT_FILE = promptFile;\r\n\r\n // Check if execute script exists\r\n fs.access(scriptPath)\r\n .then(() => {\r\n // Use execution script\r\n const proc = spawn('bash', [scriptPath], { env, stdio: 'inherit' });\r\n\r\n proc.on('exit', (code) => {\r\n resolve({\r\n success: code === 0,\r\n agentId,\r\n exitCode: code || 0,\r\n });\r\n });\r\n\r\n proc.on('error', (err) => {\r\n resolve({\r\n success: false,\r\n agentId,\r\n error: err.message,\r\n exitCode: 1,\r\n });\r\n });\r\n })\r\n .catch(() => {\r\n // Fallback: Print prompt\r\n console.log('\\n=== Agent Prompt ===');\r\n console.log(prompt.substring(0, 500) + '...');\r\n console.log('\\n[agent-executor] Execution script not found');\r\n console.log('[agent-executor] Using simulation mode\\n');\r\n\r\n resolve({\r\n success: true,\r\n agentId,\r\n output: prompt,\r\n exitCode: 0,\r\n });\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * Main agent execution function\r\n */\r\nexport async function executeAgent(\r\n definition: AgentDefinition,\r\n prompt: string,\r\n context: TaskContext,\r\n options: {\r\n method?: 'auto' | 'api' | 'script';\r\n } = {}\r\n): Promise<AgentExecutionResult> {\r\n const method = options.method || 'auto';\r\n\r\n // Auto-select execution method\r\n if (method === 'auto') {\r\n // Try API execution first, fallback to script if API key not available\r\n try {\r\n return await executeViaAPI(definition, prompt, context);\r\n } catch (error) {\r\n if (error instanceof Error && error.message.includes('API key not found')) {\r\n console.log('[agent-executor] API key not found, using script fallback');\r\n return executeViaScript(definition, prompt, context);\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n if (method === 'api') {\r\n return executeViaAPI(definition, prompt, context);\r\n }\r\n\r\n return executeViaScript(definition, prompt, context);\r\n}\r\n\r\n/**\r\n * Write agent output to file for debugging\r\n */\r\nexport async function saveAgentOutput(\r\n agentId: string,\r\n output: string,\r\n outputDir: string = '.claude/tmp/agent-output'\r\n): Promise<string> {\r\n await fs.mkdir(outputDir, { recursive: true });\r\n\r\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\r\n const filename = `${agentId}-${timestamp}.txt`;\r\n const filepath = path.join(outputDir, filename);\r\n\r\n await fs.writeFile(filepath, output, 'utf-8');\r\n\r\n return filepath;\r\n}\r\n"],"names":["spawn","exec","promisify","getAgentId","buildCLIAgentSystemPrompt","loadContextFromEnv","loadMessages","storeMessage","getCurrentFork","formatMessagesForAPI","convertToolNames","fs","path","os","execAsync","redisHost","process","env","CFN_REDIS_HOST","redisPort","CFN_REDIS_PORT","extractConfidence","output","patterns","pattern","match","score","parseFloat","executeCFNProtocol","taskId","agentId","iteration","enableIterations","maxIterations","console","log","confidence","reportCmd","error","isCustomRoutingEnabled","CLAUDE_API_PROVIDER","configPath","join","config","JSON","parse","readFile","provider","getAPIProvider","customEnabled","executeViaAPI","definition","prompt","context","name","model","forkId","FORK_ID","systemPrompt","messages","forkMessages","length","content","slice","push","role","contextOptions","agentType","executeAgentAPI","tools","undefined","result","userMessage","timestamp","Date","toISOString","assistantMessage","success","exitCode","Error","message","String","executeViaScript","tmpDir","tmpdir","promptFile","now","writeFile","Promise","resolve","scriptPath","safeEnvVars","key","value","ANTHROPIC_API_KEY","AGENT_TYPE","AGENT_ID","AGENT_MODEL","AGENT_TOOLS","TASK_ID","ITERATION","MODE","mode","PROMPT_FILE","access","then","proc","stdio","on","code","err","catch","substring","executeAgent","options","method","includes","saveAgentOutput","outputDir","mkdir","recursive","replace","filename","filepath"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/cli/agent-executor.ts"],"sourcesContent":["/**\r\n * Agent Executor\r\n *\r\n * Executes CLI-spawned agents by:\r\n * 1. Checking custom routing configuration (z.ai vs Anthropic)\r\n * 2. Invoking the appropriate API\r\n * 3. Managing agent lifecycle and output\r\n */\r\n\r\nimport { spawn } from 'child_process';\r\nimport { exec } from 'child_process';\r\nimport { promisify } from 'util';\r\nimport { AgentDefinition } from './agent-definition-parser.js';\r\nimport { TaskContext, getAgentId } from './agent-prompt-builder.js';\r\nimport { buildCLIAgentSystemPrompt, loadContextFromEnv } from './cli-agent-context.js';\r\nimport {\r\n loadMessages,\r\n storeMessage,\r\n getCurrentFork,\r\n formatMessagesForAPI,\r\n type Message\r\n} from './conversation-fork.js';\r\nimport { convertToolNames } from './tool-definitions.js';\r\nimport fs from 'fs/promises';\r\nimport path from 'path';\r\nimport os from 'os';\r\n\r\nconst execAsync = promisify(exec);\r\n\r\n// Bug #6 Fix: Read Redis connection parameters from process.env\r\n// ENV-001: Standardized environment variable naming (REDIS_PASSWORD for all deployments)\r\nconst redisHost = process.env.CFN_REDIS_HOST || 'cfn-redis';\r\nconst redisPort = process.env.CFN_REDIS_PORT || '6379';\r\nconst redisPassword = process.env.CFN_REDIS_PASSWORD || process.env.REDIS_PASSWORD || '';\r\n\r\nexport interface AgentExecutionResult {\r\n success: boolean;\r\n agentId: string;\r\n output?: string;\r\n error?: string;\r\n exitCode: number;\r\n}\r\n\r\n/**\r\n * Extract confidence score from agent output\r\n * Looks for patterns like:\r\n * - \"confidence: 0.85\"\r\n * - \"Confidence: 0.90\"\r\n * - \"confidence score: 0.95\"\r\n * - \"self-confidence: 0.88\"\r\n */\r\nfunction extractConfidence(output: string | undefined): number {\r\n if (!output) return 0.85;\r\n\r\n // Try multiple patterns\r\n const patterns = [\r\n /confidence:\\s*([0-9.]+)/i,\r\n /confidence\\s+score:\\s*([0-9.]+)/i,\r\n /self-confidence:\\s*([0-9.]+)/i,\r\n /my\\s+confidence:\\s*([0-9.]+)/i,\r\n ];\r\n\r\n for (const pattern of patterns) {\r\n const match = output.match(pattern);\r\n if (match && match[1]) {\r\n const score = parseFloat(match[1]);\r\n if (score >= 0 && score <= 1) {\r\n return score;\r\n }\r\n }\r\n }\r\n\r\n // Default to 0.85 if not found\r\n return 0.85;\r\n}\r\n\r\n/**\r\n * Execute CFN Loop protocol after agent completes work\r\n *\r\n * Steps:\r\n * 1. Signal completion to orchestrator\r\n * 2. Report confidence score\r\n * 3. Enter waiting mode (if iterations enabled)\r\n */\r\nasync function executeCFNProtocol(\r\n taskId: string,\r\n agentId: string,\r\n output: string | undefined,\r\n iteration: number,\r\n enableIterations: boolean = false,\r\n maxIterations: number = 10\r\n): Promise<void> {\r\n console.log(`\\n[CFN Protocol] Starting for agent ${agentId}`);\r\n console.log(`[CFN Protocol] Task ID: ${taskId}, Iteration: ${iteration}`);\r\n\r\n try {\r\n // Step 1: Signal completion\r\n console.log('[CFN Protocol] Step 1: Signaling completion...');\r\n const authFlag = redisPassword ? `-a \"${redisPassword}\"` : '';\r\n await execAsync(`redis-cli -h \"${redisHost}\" -p \"${redisPort}\" ${authFlag} lpush \"swarm:${taskId}:${agentId}:done\" \"complete\"`);\r\n console.log('[CFN Protocol] ✓ Completion signaled');\r\n\r\n // Step 2: Extract and report confidence\r\n const confidence = extractConfidence(output);\r\n console.log(`[CFN Protocol] Step 2: Reporting confidence (${confidence})...`);\r\n\r\n const reportCmd = `./.claude/skills/cfn-redis-coordination/report-completion.sh \\\r\n --task-id \"${taskId}\" \\\r\n --agent-id \"${agentId}\" \\\r\n --confidence ${confidence} \\\r\n --iteration ${iteration}`;\r\n\r\n await execAsync(reportCmd);\r\n console.log('[CFN Protocol] ✓ Confidence reported');\r\n\r\n // Step 3: Exit cleanly (BUG #18 FIX - removed waiting mode)\r\n // Orchestrator will spawn appropriate specialist agent for next iteration\r\n // This enables adaptive agent specialization based on feedback type\r\n console.log('[CFN Protocol] Step 3: Exiting cleanly (iteration complete)');\r\n console.log('[CFN Protocol] Protocol complete\\n');\r\n } catch (error) {\r\n console.error('[CFN Protocol] Error:', error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Check if custom routing (z.ai) is enabled\r\n */\r\nasync function isCustomRoutingEnabled(): Promise<boolean> {\r\n // Check environment variable\r\n if (process.env.CLAUDE_API_PROVIDER === 'zai') {\r\n return true;\r\n }\r\n\r\n // Check config file (.claude/config/api-provider.json)\r\n try {\r\n const configPath = path.join('.claude', 'config', 'api-provider.json');\r\n const config = JSON.parse(await fs.readFile(configPath, 'utf-8'));\r\n return config.provider === 'zai' || config.provider === 'z.ai';\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Get API provider configuration\r\n */\r\nasync function getAPIProvider(): Promise<'anthropic' | 'zai'> {\r\n const customEnabled = await isCustomRoutingEnabled();\r\n return customEnabled ? 'zai' : 'anthropic';\r\n}\r\n\r\n/**\r\n * Execute agent using direct API calls\r\n */\r\nasync function executeViaAPI(\r\n definition: AgentDefinition,\r\n prompt: string,\r\n context: TaskContext\r\n): Promise<AgentExecutionResult> {\r\n const agentId = getAgentId(definition, context);\r\n\r\n console.log(`[agent-executor] Executing agent via API: ${definition.name}`);\r\n console.log(`[agent-executor] Agent ID: ${agentId}`);\r\n console.log(`[agent-executor] Model: ${definition.model}`);\r\n console.log('');\r\n\r\n try {\r\n // Check for conversation fork (Sprint 4 enhancement)\r\n const forkId = process.env.FORK_ID || await getCurrentFork(context.taskId || '', agentId);\r\n const iteration = context.iteration || 1;\r\n\r\n let systemPrompt: string;\r\n let messages: Array<{role: string, content: string}> = [];\r\n\r\n if (forkId && iteration > 1) {\r\n // Continue from fork (iterations 2+)\r\n console.log(`[agent-executor] Continuing from fork: ${forkId}`);\r\n\r\n // Load fork messages\r\n const forkMessages = await loadMessages(context.taskId || '', agentId, forkId);\r\n console.log(`[agent-executor] Loaded ${forkMessages.length} messages from fork`);\r\n\r\n // Extract system prompt from first message (it's always the system message)\r\n // The fork messages are assistant/user pairs, we need to add system separately\r\n systemPrompt = forkMessages[0]?.content || '';\r\n\r\n // Format remaining messages for API\r\n messages = formatMessagesForAPI(forkMessages.slice(1));\r\n\r\n // Add new user message with feedback\r\n messages.push({\r\n role: 'user',\r\n content: prompt\r\n });\r\n\r\n console.log(`[agent-executor] Fork continuation: ${messages.length} messages`);\r\n } else {\r\n // New conversation (iteration 1)\r\n console.log('[agent-executor] Starting new conversation');\r\n console.log('[agent-executor] Building system prompt with context...');\r\n\r\n const contextOptions = loadContextFromEnv();\r\n contextOptions.agentType = definition.name;\r\n if (context.taskId) contextOptions.taskId = context.taskId;\r\n if (context.iteration) contextOptions.iteration = context.iteration;\r\n\r\n systemPrompt = await buildCLIAgentSystemPrompt(contextOptions);\r\n console.log('[agent-executor] System prompt built successfully');\r\n\r\n // Initial user message\r\n messages = [{\r\n role: 'user',\r\n content: prompt\r\n }];\r\n }\r\n\r\n console.log('');\r\n\r\n // Dynamic import to avoid bundling issues\r\n const { executeAgentAPI } = await import('./anthropic-client.js');\r\n\r\n // Convert agent tool names to Anthropic API format\r\n const tools = definition.tools && definition.tools.length > 0\r\n ? convertToolNames(definition.tools)\r\n : undefined;\r\n\r\n const result = await executeAgentAPI(\r\n definition.name,\r\n agentId,\r\n definition.model,\r\n prompt,\r\n systemPrompt,\r\n messages.length > 1 ? messages : undefined,\r\n undefined, // maxTokens (use default)\r\n tools // Pass converted tools\r\n );\r\n\r\n // Store messages in conversation history (for future forking)\r\n if (context.taskId) {\r\n // Store user message\r\n const userMessage: Message = {\r\n role: 'user',\r\n content: prompt,\r\n iteration,\r\n timestamp: new Date().toISOString()\r\n };\r\n await storeMessage(context.taskId, agentId, userMessage);\r\n\r\n // Store assistant response\r\n if (result.output) {\r\n const assistantMessage: Message = {\r\n role: 'assistant',\r\n content: result.output,\r\n iteration,\r\n timestamp: new Date().toISOString()\r\n };\r\n await storeMessage(context.taskId, agentId, assistantMessage);\r\n }\r\n\r\n console.log(`[agent-executor] Stored messages for iteration ${iteration}`);\r\n\r\n // Execute CFN Loop protocol (signal completion, report confidence, enter waiting mode)\r\n // Iterations are enabled for CFN Loop tasks (indicated by presence of taskId)\r\n try {\r\n const maxIterations = 10; // Default max iterations\r\n const enableIterations = true; // Enable iterations for all CFN Loop tasks\r\n\r\n await executeCFNProtocol(\r\n context.taskId,\r\n agentId,\r\n result.output,\r\n iteration,\r\n enableIterations,\r\n maxIterations\r\n );\r\n } catch (error) {\r\n console.error('[agent-executor] CFN Protocol execution failed:', error);\r\n // Don't fail the entire agent execution if CFN protocol fails\r\n // This allows agents to complete even if Redis coordination has issues\r\n }\r\n }\r\n\r\n return {\r\n success: result.success,\r\n agentId,\r\n output: result.output,\r\n error: result.error,\r\n exitCode: result.success ? 0 : 1,\r\n };\r\n } catch (error) {\r\n console.error('[agent-executor] API execution failed:', error);\r\n return {\r\n success: false,\r\n agentId,\r\n error: error instanceof Error ? error.message : String(error),\r\n exitCode: 1,\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Execute agent using shell script (fallback/simulation)\r\n */\r\nasync function executeViaScript(\r\n definition: AgentDefinition,\r\n prompt: string,\r\n context: TaskContext\r\n): Promise<AgentExecutionResult> {\r\n const agentId = getAgentId(definition, context);\r\n\r\n // Write prompt to temporary file\r\n const tmpDir = os.tmpdir();\r\n const promptFile = path.join(tmpDir, `agent-${agentId}-${Date.now()}.md`);\r\n await fs.writeFile(promptFile, prompt, 'utf-8');\r\n\r\n console.log(`[agent-executor] Executing agent via script: ${definition.name}`);\r\n console.log(`[agent-executor] Agent ID: ${agentId}`);\r\n console.log(`[agent-executor] Model: ${definition.model}`);\r\n console.log(`[agent-executor] Prompt file: ${promptFile}`);\r\n\r\n return new Promise((resolve) => {\r\n const scriptPath = path.join('.claude', 'skills', 'agent-execution', 'execute-agent.sh');\r\n\r\n // Build environment variables - WHITELIST ONLY APPROACH\r\n // SECURITY FIX: Do not use ...process.env spread which exposes ALL variables including secrets\r\n // Instead, explicitly whitelist safe variables to pass to spawned process\r\n const safeEnvVars = [\r\n 'CFN_REDIS_HOST',\r\n 'CFN_REDIS_PORT',\r\n 'CFN_REDIS_URL',\r\n 'CFN_MEMORY_BUDGET',\r\n 'CFN_API_HOST',\r\n 'CFN_API_PORT',\r\n 'CFN_LOG_LEVEL',\r\n 'CFN_LOG_FORMAT',\r\n 'CFN_CONTAINER_MODE',\r\n 'CFN_DOCKER_SOCKET',\r\n 'CFN_NETWORK_NAME',\r\n 'CFN_CUSTOM_ROUTING',\r\n 'CFN_DEFAULT_PROVIDER',\r\n 'NODE_ENV',\r\n 'PATH',\r\n 'HOME'\r\n ];\r\n\r\n const env: Record<string, string> = {};\r\n\r\n // Add whitelisted variables\r\n for (const key of safeEnvVars) {\r\n const value = process.env[key];\r\n if (value !== undefined) {\r\n env[key] = value;\r\n }\r\n }\r\n\r\n // Add API key only when explicitly needed (with strict validation)\r\n if (process.env.ANTHROPIC_API_KEY) {\r\n if (process.env.ANTHROPIC_API_KEY.match(/^sk-[a-zA-Z0-9-]+$/)) {\r\n env.ANTHROPIC_API_KEY = process.env.ANTHROPIC_API_KEY;\r\n }\r\n }\r\n\r\n // Add agent execution context (safe values)\r\n env.AGENT_TYPE = definition.name;\r\n env.AGENT_ID = agentId;\r\n env.AGENT_MODEL = definition.model;\r\n env.AGENT_TOOLS = definition.tools.join(',');\r\n env.TASK_ID = context.taskId || '';\r\n env.ITERATION = String(context.iteration || 1);\r\n env.MODE = context.mode || 'cli';\r\n env.PROMPT_FILE = promptFile;\r\n\r\n // Check if execute script exists\r\n fs.access(scriptPath)\r\n .then(() => {\r\n // Use execution script\r\n const proc = spawn('bash', [scriptPath], { env, stdio: 'inherit' });\r\n\r\n proc.on('exit', (code) => {\r\n resolve({\r\n success: code === 0,\r\n agentId,\r\n exitCode: code || 0,\r\n });\r\n });\r\n\r\n proc.on('error', (err) => {\r\n resolve({\r\n success: false,\r\n agentId,\r\n error: err.message,\r\n exitCode: 1,\r\n });\r\n });\r\n })\r\n .catch(() => {\r\n // Fallback: Print prompt\r\n console.log('\\n=== Agent Prompt ===');\r\n console.log(prompt.substring(0, 500) + '...');\r\n console.log('\\n[agent-executor] Execution script not found');\r\n console.log('[agent-executor] Using simulation mode\\n');\r\n\r\n resolve({\r\n success: true,\r\n agentId,\r\n output: prompt,\r\n exitCode: 0,\r\n });\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * Main agent execution function\r\n */\r\nexport async function executeAgent(\r\n definition: AgentDefinition,\r\n prompt: string,\r\n context: TaskContext,\r\n options: {\r\n method?: 'auto' | 'api' | 'script';\r\n } = {}\r\n): Promise<AgentExecutionResult> {\r\n const method = options.method || 'auto';\r\n\r\n // Auto-select execution method\r\n if (method === 'auto') {\r\n // Try API execution first, fallback to script if API key not available\r\n try {\r\n return await executeViaAPI(definition, prompt, context);\r\n } catch (error) {\r\n if (error instanceof Error && error.message.includes('API key not found')) {\r\n console.log('[agent-executor] API key not found, using script fallback');\r\n return executeViaScript(definition, prompt, context);\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n if (method === 'api') {\r\n return executeViaAPI(definition, prompt, context);\r\n }\r\n\r\n return executeViaScript(definition, prompt, context);\r\n}\r\n\r\n/**\r\n * Write agent output to file for debugging\r\n */\r\nexport async function saveAgentOutput(\r\n agentId: string,\r\n output: string,\r\n outputDir: string = '.claude/tmp/agent-output'\r\n): Promise<string> {\r\n await fs.mkdir(outputDir, { recursive: true });\r\n\r\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\r\n const filename = `${agentId}-${timestamp}.txt`;\r\n const filepath = path.join(outputDir, filename);\r\n\r\n await fs.writeFile(filepath, output, 'utf-8');\r\n\r\n return filepath;\r\n}\r\n"],"names":["spawn","exec","promisify","getAgentId","buildCLIAgentSystemPrompt","loadContextFromEnv","loadMessages","storeMessage","getCurrentFork","formatMessagesForAPI","convertToolNames","fs","path","os","execAsync","redisHost","process","env","CFN_REDIS_HOST","redisPort","CFN_REDIS_PORT","redisPassword","CFN_REDIS_PASSWORD","REDIS_PASSWORD","extractConfidence","output","patterns","pattern","match","score","parseFloat","executeCFNProtocol","taskId","agentId","iteration","enableIterations","maxIterations","console","log","authFlag","confidence","reportCmd","error","isCustomRoutingEnabled","CLAUDE_API_PROVIDER","configPath","join","config","JSON","parse","readFile","provider","getAPIProvider","customEnabled","executeViaAPI","definition","prompt","context","name","model","forkId","FORK_ID","systemPrompt","messages","forkMessages","length","content","slice","push","role","contextOptions","agentType","executeAgentAPI","tools","undefined","result","userMessage","timestamp","Date","toISOString","assistantMessage","success","exitCode","Error","message","String","executeViaScript","tmpDir","tmpdir","promptFile","now","writeFile","Promise","resolve","scriptPath","safeEnvVars","key","value","ANTHROPIC_API_KEY","AGENT_TYPE","AGENT_ID","AGENT_MODEL","AGENT_TOOLS","TASK_ID","ITERATION","MODE","mode","PROMPT_FILE","access","then","proc","stdio","on","code","err","catch","substring","executeAgent","options","method","includes","saveAgentOutput","outputDir","mkdir","recursive","replace","filename","filepath"],"mappings":"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"}
|
|
@@ -7,7 +7,9 @@
|
|
|
7
7
|
* - CFN Loop protocol (if applicable)
|
|
8
8
|
* - Iteration history (Sprint 3 - Phase 2)
|
|
9
9
|
* - Environment variables
|
|
10
|
+
* - Skills (Phase 5 - Skills Database integration)
|
|
10
11
|
*/ import { loadIterationHistory, formatIterationHistory } from './iteration-history.js';
|
|
12
|
+
import { SkillLoader } from './skill-loader.js';
|
|
11
13
|
/**
|
|
12
14
|
* Build CFN Loop protocol instructions
|
|
13
15
|
*/ function buildCFNLoopProtocol(taskId, agentId) {
|
|
@@ -212,10 +214,65 @@ ${env.join('\n')}
|
|
|
212
214
|
return contextText;
|
|
213
215
|
}
|
|
214
216
|
/**
|
|
215
|
-
*
|
|
217
|
+
* Load skills for agent (Phase 5: Skills Database Integration)
|
|
218
|
+
*/ async function loadSkillsForAgent(agentType, context) {
|
|
219
|
+
// Feature flag check
|
|
220
|
+
if (process.env.CFN_SKILLS_DATABASE !== 'true') {
|
|
221
|
+
return [];
|
|
222
|
+
}
|
|
223
|
+
try {
|
|
224
|
+
const dbPath = process.env.CFN_SKILLS_DB_PATH || './.claude/skills-database/skills.db';
|
|
225
|
+
const skillLoader = new SkillLoader(dbPath, {
|
|
226
|
+
enableCache: true,
|
|
227
|
+
cacheMaxSize: 100,
|
|
228
|
+
cacheTTL: 60000 // 1 minute
|
|
229
|
+
});
|
|
230
|
+
// Extract keywords from context for filtering
|
|
231
|
+
const keywords = context.keywords || context.context?.toLowerCase() || '';
|
|
232
|
+
const skills = await skillLoader.loadSkillsForAgent(agentType, {
|
|
233
|
+
taskId: context.taskId,
|
|
234
|
+
keywords,
|
|
235
|
+
phase: context.phase,
|
|
236
|
+
mode: context.mode,
|
|
237
|
+
iteration: context.iteration
|
|
238
|
+
});
|
|
239
|
+
skillLoader.close();
|
|
240
|
+
return skills;
|
|
241
|
+
} catch (error) {
|
|
242
|
+
console.warn(`[agent-prompt-builder] Failed to load skills: ${error}`);
|
|
243
|
+
return [];
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Format skills for prompt injection
|
|
248
|
+
*/ function formatSkillsForPrompt(skills) {
|
|
249
|
+
if (skills.length === 0) {
|
|
250
|
+
return '';
|
|
251
|
+
}
|
|
252
|
+
const sections = [];
|
|
253
|
+
sections.push('## Applicable Skills');
|
|
254
|
+
sections.push('');
|
|
255
|
+
sections.push('The following skills have been loaded based on your agent type and task context:');
|
|
256
|
+
sections.push('');
|
|
257
|
+
for (const skill of skills){
|
|
258
|
+
const approvalBadge = skill.approvalLevel === 'auto' ? '✓' : skill.approvalLevel === 'escalate' ? '⚠' : '✋';
|
|
259
|
+
sections.push(`### ${skill.name} (v${skill.version}) [${approvalBadge} ${skill.approvalLevel}]`);
|
|
260
|
+
sections.push('');
|
|
261
|
+
if (skill.content) {
|
|
262
|
+
sections.push(skill.content);
|
|
263
|
+
} else {
|
|
264
|
+
sections.push(`*Skill content not available*`);
|
|
265
|
+
}
|
|
266
|
+
sections.push('');
|
|
267
|
+
}
|
|
268
|
+
return sections.join('\n');
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Build complete prompt for agent execution (async for iteration history + skills)
|
|
216
272
|
*/ export async function buildAgentPrompt(definition, context) {
|
|
217
273
|
// Use explicit agent ID if provided, otherwise generate from name + iteration
|
|
218
274
|
const agentId = context.agentId || `${definition.name}-${context.iteration || 1}`;
|
|
275
|
+
const startTime = Date.now();
|
|
219
276
|
const sections = [];
|
|
220
277
|
// 1. Agent definition header
|
|
221
278
|
sections.push(`# Agent: ${definition.name}`);
|
|
@@ -245,6 +302,37 @@ ${env.join('\n')}
|
|
|
245
302
|
sections.push('');
|
|
246
303
|
sections.push(definition.content);
|
|
247
304
|
sections.push('');
|
|
305
|
+
// 4a. Load and inject skills (Phase 5: Skills Database Integration)
|
|
306
|
+
try {
|
|
307
|
+
const skills = await loadSkillsForAgent(definition.type || definition.name, context);
|
|
308
|
+
if (skills.length > 0) {
|
|
309
|
+
const skillsText = formatSkillsForPrompt(skills);
|
|
310
|
+
sections.push(skillsText);
|
|
311
|
+
sections.push('');
|
|
312
|
+
// Log skill usage for analytics (Phase 5)
|
|
313
|
+
if (process.env.CFN_SKILLS_DATABASE === 'true' && context.taskId) {
|
|
314
|
+
try {
|
|
315
|
+
const dbPath = process.env.CFN_SKILLS_DB_PATH || './.claude/skills-database/skills.db';
|
|
316
|
+
const skillLoader = new SkillLoader(dbPath);
|
|
317
|
+
await skillLoader.logSkillUsage({
|
|
318
|
+
agentId: agentId,
|
|
319
|
+
agentType: definition.type || definition.name,
|
|
320
|
+
skillIds: skills.map((s)=>s.id).filter((id)=>id > 0),
|
|
321
|
+
taskId: context.taskId,
|
|
322
|
+
phase: context.phase,
|
|
323
|
+
loadedAt: new Date(),
|
|
324
|
+
executionTimeMs: Date.now() - startTime
|
|
325
|
+
});
|
|
326
|
+
skillLoader.close();
|
|
327
|
+
} catch (logError) {
|
|
328
|
+
console.warn(`[agent-prompt-builder] Failed to log skill usage: ${logError}`);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
} catch (skillError) {
|
|
333
|
+
console.warn(`[agent-prompt-builder] Skill loading failed: ${skillError}`);
|
|
334
|
+
// Continue without skills
|
|
335
|
+
}
|
|
248
336
|
// 5. CFN Loop protocol (ALWAYS inject when taskId present - enables Redis coordination)
|
|
249
337
|
if (context.taskId && agentId) {
|
|
250
338
|
sections.push(buildCFNLoopProtocol(context.taskId, agentId));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/agent-prompt-builder.ts"],"sourcesContent":["/**\r\n * Agent Prompt Builder\r\n *\r\n * Builds comprehensive prompts for CLI-spawned agents by combining:\r\n * - Agent definition (YAML + markdown)\r\n * - Task context (taskId, iteration, mode)\r\n * - CFN Loop protocol (if applicable)\r\n * - Iteration history (Sprint 3 - Phase 2)\r\n * - Environment variables\r\n */\r\n\r\nimport { AgentDefinition, hasCFNLoopProtocol } from './agent-definition-parser.js';\r\nimport { loadIterationHistory, formatIterationHistory } from './iteration-history.js';\r\n\r\nexport interface TaskContext {\r\n taskId?: string;\r\n iteration?: number;\r\n context?: string;\r\n mode?: string;\r\n priority?: number;\r\n parentTaskId?: string;\r\n agentId?: string;\r\n}\r\n\r\n/**\r\n * Build CFN Loop protocol instructions\r\n */\r\nfunction buildCFNLoopProtocol(taskId: string, agentId: string): string {\r\n return `\r\n## CFN Loop Redis Completion Protocol\r\n\r\nYou are participating in a CFN Loop workflow. Follow this protocol EXACTLY:\r\n\r\n### Step 1: Complete Your Work\r\nExecute your assigned task (implementation, review, testing, etc.)\r\n\r\n### Step 2: Calculate Confidence Score\r\nAssess your work quality and assign a confidence score (0.0-1.0):\r\n- 0.90-1.0: Excellent, production-ready\r\n- 0.75-0.89: Good, minor issues possible\r\n- 0.50-0.74: Acceptable, needs review\r\n- 0.0-0.49: Poor, significant issues\r\n\r\n### Step 3: Report Completion to Redis\r\n\\`\\`\\`bash\r\n./.claude/skills/cfn-redis-coordination/report-completion.sh \\\\\r\n --task-id \"${taskId}\" \\\\\r\n --agent-id \"${agentId}\" \\\\\r\n --confidence [YOUR_CONFIDENCE_SCORE] \\\\\r\n --iteration \\${ITERATION:-1}\r\n\\`\\`\\`\r\n\r\nThis script automatically:\r\n- Signals completion via \\`swarm:${taskId}:${agentId}:done\\`\r\n- Stores confidence in \\`swarm:${taskId}:${agentId}:confidence\\`\r\n- Creates result hash in \\`swarm:${taskId}:${agentId}:result\\`\r\n- Updates SQLite persistence layer\r\n\r\n### Step 4: Exit Cleanly\r\nAfter reporting, exit immediately. DO NOT enter waiting mode.\r\n\r\nThe orchestrator will:\r\n- Collect confidence scores from all agents\r\n- Run gate check (≥0.75 threshold)\r\n- Spawn validators if gate passes\r\n- Spawn fresh agents for iteration N+1 if needed\r\n\r\n**Environment Variables Available:**\r\n- TASK_ID: ${taskId}\r\n- AGENT_ID: ${agentId}\r\n- ITERATION: Current iteration number (default: 1)\r\n- CONFIDENCE_SCORE: Your final confidence assessment\r\n\r\n**Why This Matters:**\r\n- Enables zero-token coordination (orchestrator uses Redis BLPOP)\r\n- Supports adaptive agent specialization (spawn different specialist for iteration N+1)\r\n- Prevents memory leaks (agents exit after reporting)\r\n- Confidence scores drive gate checks and consensus validation\r\n\r\n**CRITICAL:** Report completion before exiting. Orchestrator is waiting for your signal.\r\n`;\r\n}\r\n\r\n/**\r\n * Parse and enrich JSON context into natural language instructions\r\n */\r\nfunction enrichJSONContext(jsonObj: any): string {\r\n const sections: string[] = [];\r\n\r\n // Extract task description\r\n if (jsonObj.task) {\r\n sections.push(`**Task:** ${jsonObj.task}`);\r\n }\r\n\r\n // Parse files - convert comma-separated string to bullet list\r\n if (jsonObj.files) {\r\n const fileList = typeof jsonObj.files === 'string'\r\n ? jsonObj.files.split(',').map(f => f.trim()).filter(f => f)\r\n : Array.isArray(jsonObj.files) ? jsonObj.files : [];\r\n\r\n if (fileList.length > 0) {\r\n sections.push('\\n**Files to process:**');\r\n fileList.forEach(file => sections.push(`- ${file}`));\r\n }\r\n }\r\n\r\n // Add requirements/deliverables\r\n if (jsonObj.requirements) {\r\n const reqs = Array.isArray(jsonObj.requirements) ? jsonObj.requirements : [jsonObj.requirements];\r\n sections.push('\\n**Requirements:**');\r\n reqs.forEach((req, i) => sections.push(`${i + 1}. ${req}`));\r\n }\r\n\r\n if (jsonObj.deliverables) {\r\n const delivs = Array.isArray(jsonObj.deliverables) ? jsonObj.deliverables : [jsonObj.deliverables];\r\n sections.push('\\n**Deliverables:**');\r\n delivs.forEach(deliv => sections.push(`- ${deliv}`));\r\n }\r\n\r\n // Add batch information\r\n if (jsonObj.batch) {\r\n sections.push(`\\n**Batch:** ${jsonObj.batch}`);\r\n }\r\n\r\n // Add directory context\r\n if (jsonObj.directory) {\r\n sections.push(`\\n**Working Directory:** ${jsonObj.directory}`);\r\n }\r\n\r\n // Add acceptance criteria\r\n if (jsonObj.acceptanceCriteria) {\r\n const criteria = Array.isArray(jsonObj.acceptanceCriteria)\r\n ? jsonObj.acceptanceCriteria\r\n : [jsonObj.acceptanceCriteria];\r\n sections.push('\\n**Acceptance Criteria:**');\r\n criteria.forEach(criterion => sections.push(`- ${criterion}`));\r\n }\r\n\r\n // Add explicit instructions if present\r\n if (jsonObj.instructions) {\r\n sections.push('\\n**Instructions:**');\r\n const instrs = Array.isArray(jsonObj.instructions) ? jsonObj.instructions : [jsonObj.instructions];\r\n instrs.forEach((instr, i) => sections.push(`${i + 1}. ${instr}`));\r\n }\r\n\r\n return sections.join('\\n');\r\n}\r\n\r\n/**\r\n * Build task description from context\r\n */\r\nfunction buildTaskDescription(agentType: string, context: TaskContext): string {\r\n let desc = '';\r\n\r\n if (context.context) {\r\n // Try to parse as JSON first\r\n let contextStr = context.context.trim();\r\n\r\n // Check if context looks like JSON\r\n if ((contextStr.startsWith('{') && contextStr.endsWith('}')) ||\r\n (contextStr.startsWith('[') && contextStr.endsWith(']'))) {\r\n try {\r\n const jsonObj = JSON.parse(contextStr);\r\n desc = enrichJSONContext(jsonObj);\r\n\r\n // Add instruction footer for structured tasks\r\n if (jsonObj.files || jsonObj.deliverables) {\r\n desc += '\\n\\n**Process each item systematically and report confidence when complete.**';\r\n }\r\n } catch (e) {\r\n // Not valid JSON, treat as plain text\r\n desc = context.context;\r\n }\r\n } else {\r\n // Plain text context\r\n desc = context.context;\r\n }\r\n } else {\r\n desc = `Execute task as ${agentType} agent`;\r\n }\r\n\r\n // Add metadata fields\r\n if (context.taskId) {\r\n desc += `\\n\\n**Task ID:** ${context.taskId}`;\r\n }\r\n\r\n if (context.iteration) {\r\n desc += `\\n**Iteration:** ${context.iteration}`;\r\n }\r\n\r\n if (context.mode) {\r\n desc += `\\n**Mode:** ${context.mode}`;\r\n }\r\n\r\n if (context.priority) {\r\n desc += `\\n**Priority:** ${context.priority}`;\r\n }\r\n\r\n if (context.parentTaskId) {\r\n desc += `\\n**Parent Task:** ${context.parentTaskId}`;\r\n }\r\n\r\n return desc;\r\n}\r\n\r\n/**\r\n * Build environment context section\r\n */\r\nfunction buildEnvironmentContext(context: TaskContext): string {\r\n const env: string[] = [];\r\n\r\n if (context.taskId) env.push(`TASK_ID=${context.taskId}`);\r\n if (context.iteration) env.push(`ITERATION=${context.iteration}`);\r\n if (context.mode) env.push(`MODE=${context.mode}`);\r\n if (context.priority) env.push(`PRIORITY=${context.priority}`);\r\n if (context.parentTaskId) env.push(`PARENT_TASK_ID=${context.parentTaskId}`);\r\n\r\n // Docker workspace detection\r\n const isDockerEnv = process.env.DOCKER_AGENT === 'true' || process.env.WORKSPACE_ROOT;\r\n const workspaceRoot = process.env.WORKSPACE_ROOT || '/workspace';\r\n\r\n if (isDockerEnv) {\r\n env.push(`WORKSPACE_ROOT=${workspaceRoot}`);\r\n }\r\n\r\n // Always include Docker context if detected, even if env array is empty\r\n if (isDockerEnv && env.length === 0) {\r\n env.push(`WORKSPACE_ROOT=${workspaceRoot}`);\r\n }\r\n\r\n if (env.length === 0 && !isDockerEnv) return '';\r\n\r\n let contextText = `\r\n## Environment Variables\r\n\r\n\\`\\`\\`bash\r\n${env.join('\\n')}\r\n\\`\\`\\`\r\n`;\r\n\r\n // Add Docker workspace notice if detected\r\n if (isDockerEnv) {\r\n contextText += `\r\n\r\n## Docker Container Environment\r\n\r\n**CRITICAL:** You are running inside a Docker container.\r\n\r\n- **Working Directory:** \\`${workspaceRoot}\\`\r\n- **File Paths:** All file operations use \\`${workspaceRoot}/\\` prefix\r\n- **Example:** To read \\`src/file.ts\\`, use \\`${workspaceRoot}/src/file.ts\\`\r\n\r\n**DO NOT** use paths from your training data or Main Chat context. Use \\`${workspaceRoot}/\\` for all file operations.\r\n`;\r\n }\r\n\r\n return contextText;\r\n}\r\n\r\n/**\r\n * Build complete prompt for agent execution (async for iteration history)\r\n */\r\nexport async function buildAgentPrompt(\r\n definition: AgentDefinition,\r\n context: TaskContext\r\n): Promise<string> {\r\n // Use explicit agent ID if provided, otherwise generate from name + iteration\r\n const agentId = context.agentId || `${definition.name}-${context.iteration || 1}`;\r\n\r\n const sections: string[] = [];\r\n\r\n // 1. Agent definition header\r\n sections.push(`# Agent: ${definition.name}`);\r\n sections.push('');\r\n sections.push(definition.description);\r\n sections.push('');\r\n\r\n // 2. Task description\r\n sections.push('## Task');\r\n sections.push('');\r\n sections.push(buildTaskDescription(definition.name, context));\r\n sections.push('');\r\n\r\n // 3. Iteration history (Sprint 3 - Phase 2)\r\n // Load and format previous iterations if iteration > 1\r\n if (context.taskId && context.iteration && context.iteration > 1) {\r\n try {\r\n const history = await loadIterationHistory(context.taskId, agentId, context.iteration);\r\n const historyText = formatIterationHistory(history, context.iteration);\r\n sections.push(historyText);\r\n sections.push('');\r\n } catch (err) {\r\n console.warn(`[agent-prompt-builder] Failed to load iteration history:`, err);\r\n // Continue without history\r\n }\r\n }\r\n\r\n // 4. Agent definition content (from markdown file)\r\n sections.push('## Agent Definition');\r\n sections.push('');\r\n sections.push(definition.content);\r\n sections.push('');\r\n\r\n // 5. CFN Loop protocol (ALWAYS inject when taskId present - enables Redis coordination)\r\n if (context.taskId && agentId) {\r\n sections.push(buildCFNLoopProtocol(context.taskId, agentId));\r\n sections.push('');\r\n }\r\n\r\n // 6. Environment context\r\n const envContext = buildEnvironmentContext(context);\r\n if (envContext) {\r\n sections.push(envContext);\r\n sections.push('');\r\n }\r\n\r\n // 7. Execution instructions\r\n sections.push('## Execution Instructions');\r\n sections.push('');\r\n sections.push('1. Read and understand the task requirements');\r\n if (context.iteration && context.iteration > 1) {\r\n sections.push('2. Review iteration history and feedback from validators');\r\n sections.push('3. Address specific feedback points from previous iteration');\r\n sections.push('4. Execute your core responsibilities as defined above');\r\n } else {\r\n sections.push('2. Execute your core responsibilities as defined above');\r\n sections.push('3. Follow any protocol steps (CFN Loop, validation hooks, etc.)');\r\n }\r\n sections.push('4. Provide clear, concise output');\r\n sections.push('5. Report confidence score if applicable');\r\n sections.push('');\r\n\r\n // 7a. Pre-edit backup requirement (MANDATORY)\r\n sections.push('## Pre-Edit Backup Protocol (MANDATORY)');\r\n sections.push('');\r\n sections.push('**BEFORE ANY Edit/Write/MultiEdit operation, you MUST create a backup:**');\r\n sections.push('');\r\n sections.push('```bash');\r\n sections.push(`BACKUP_PATH=$(./.claude/hooks/cfn-invoke-pre-edit.sh \"$FILE_TO_EDIT\" --agent-id \"${agentId}\")`);\r\n sections.push('```');\r\n sections.push('');\r\n sections.push('**Why:** Enables safe file revert without git operations during parallel sessions.');\r\n sections.push('**Location:** `.backups/[agent-id]/[timestamp]_[hash]/`');\r\n sections.push('**Retention:** 24h TTL (configurable)');\r\n sections.push('');\r\n sections.push('**Complete Edit Workflow:**');\r\n sections.push('```bash');\r\n sections.push('# 1. Pre-Edit: Create backup');\r\n sections.push(`BACKUP_PATH=$(./.claude/hooks/cfn-invoke-pre-edit.sh \"src/file.ts\" --agent-id \"${agentId}\")`);\r\n sections.push('');\r\n sections.push('# 2. Edit: Perform file modification');\r\n sections.push('Edit: file_path=\"src/file.ts\" old_string=\"...\" new_string=\"...\"');\r\n sections.push('');\r\n sections.push('# 3. Post-Edit: Validate changes');\r\n sections.push(`./.claude/hooks/cfn-invoke-post-edit.sh \"src/file.ts\" --agent-id \"${agentId}\"`);\r\n sections.push('```');\r\n sections.push('');\r\n\r\n // 8. Tool reminder\r\n if (definition.tools && definition.tools.length > 0) {\r\n sections.push('## Available Tools');\r\n sections.push('');\r\n sections.push(`You have access to: ${definition.tools.join(', ')}`);\r\n sections.push('');\r\n }\r\n\r\n return sections.join('\\n');\r\n}\r\n\r\n/**\r\n * Extract agent ID from context\r\n * If agentId is explicitly provided in context, use it; otherwise generate from name + iteration\r\n */\r\nexport function getAgentId(definition: AgentDefinition, context: TaskContext): string {\r\n if (context.agentId) {\r\n return context.agentId;\r\n }\r\n return `${definition.name}-${context.iteration || 1}`;\r\n}\r\n\r\n/**\r\n * Build system prompt for agent (optional, for structured agent behavior)\r\n */\r\nexport function buildSystemPrompt(definition: AgentDefinition): string {\r\n return `You are ${definition.name}, a specialized AI agent.\r\n\r\nType: ${definition.type || 'specialist'}\r\nModel: ${definition.model}\r\nTools: ${definition.tools.join(', ')}\r\n\r\nFollow your agent definition exactly and complete assigned tasks with high quality.`;\r\n}\r\n"],"names":["loadIterationHistory","formatIterationHistory","buildCFNLoopProtocol","taskId","agentId","enrichJSONContext","jsonObj","sections","task","push","files","fileList","split","map","f","trim","filter","Array","isArray","length","forEach","file","requirements","reqs","req","i","deliverables","delivs","deliv","batch","directory","acceptanceCriteria","criteria","criterion","instructions","instrs","instr","join","buildTaskDescription","agentType","context","desc","contextStr","startsWith","endsWith","JSON","parse","e","iteration","mode","priority","parentTaskId","buildEnvironmentContext","env","isDockerEnv","process","DOCKER_AGENT","WORKSPACE_ROOT","workspaceRoot","contextText","buildAgentPrompt","definition","name","description","history","historyText","err","console","warn","content","envContext","tools","getAgentId","buildSystemPrompt","type","model"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/cli/agent-prompt-builder.ts"],"sourcesContent":["/**\r\n * Agent Prompt Builder\r\n *\r\n * Builds comprehensive prompts for CLI-spawned agents by combining:\r\n * - Agent definition (YAML + markdown)\r\n * - Task context (taskId, iteration, mode)\r\n * - CFN Loop protocol (if applicable)\r\n * - Iteration history (Sprint 3 - Phase 2)\r\n * - Environment variables\r\n * - Skills (Phase 5 - Skills Database integration)\r\n */\r\n\r\nimport { AgentDefinition, hasCFNLoopProtocol } from './agent-definition-parser.js';\r\nimport { loadIterationHistory, formatIterationHistory } from './iteration-history.js';\r\nimport { SkillLoader, Skill } from './skill-loader.js';\r\n\r\nexport interface TaskContext {\r\n taskId?: string;\r\n iteration?: number;\r\n context?: string;\r\n mode?: string;\r\n priority?: number;\r\n parentTaskId?: string;\r\n agentId?: string;\r\n keywords?: string; // Phase 5: For skill filtering\r\n phase?: string; // Phase 5: CFN Loop phase (loop1, loop2, loop3)\r\n}\r\n\r\n/**\r\n * Build CFN Loop protocol instructions\r\n */\r\nfunction buildCFNLoopProtocol(taskId: string, agentId: string): string {\r\n return `\r\n## CFN Loop Redis Completion Protocol\r\n\r\nYou are participating in a CFN Loop workflow. Follow this protocol EXACTLY:\r\n\r\n### Step 1: Complete Your Work\r\nExecute your assigned task (implementation, review, testing, etc.)\r\n\r\n### Step 2: Calculate Confidence Score\r\nAssess your work quality and assign a confidence score (0.0-1.0):\r\n- 0.90-1.0: Excellent, production-ready\r\n- 0.75-0.89: Good, minor issues possible\r\n- 0.50-0.74: Acceptable, needs review\r\n- 0.0-0.49: Poor, significant issues\r\n\r\n### Step 3: Report Completion to Redis\r\n\\`\\`\\`bash\r\n./.claude/skills/cfn-redis-coordination/report-completion.sh \\\\\r\n --task-id \"${taskId}\" \\\\\r\n --agent-id \"${agentId}\" \\\\\r\n --confidence [YOUR_CONFIDENCE_SCORE] \\\\\r\n --iteration \\${ITERATION:-1}\r\n\\`\\`\\`\r\n\r\nThis script automatically:\r\n- Signals completion via \\`swarm:${taskId}:${agentId}:done\\`\r\n- Stores confidence in \\`swarm:${taskId}:${agentId}:confidence\\`\r\n- Creates result hash in \\`swarm:${taskId}:${agentId}:result\\`\r\n- Updates SQLite persistence layer\r\n\r\n### Step 4: Exit Cleanly\r\nAfter reporting, exit immediately. DO NOT enter waiting mode.\r\n\r\nThe orchestrator will:\r\n- Collect confidence scores from all agents\r\n- Run gate check (≥0.75 threshold)\r\n- Spawn validators if gate passes\r\n- Spawn fresh agents for iteration N+1 if needed\r\n\r\n**Environment Variables Available:**\r\n- TASK_ID: ${taskId}\r\n- AGENT_ID: ${agentId}\r\n- ITERATION: Current iteration number (default: 1)\r\n- CONFIDENCE_SCORE: Your final confidence assessment\r\n\r\n**Why This Matters:**\r\n- Enables zero-token coordination (orchestrator uses Redis BLPOP)\r\n- Supports adaptive agent specialization (spawn different specialist for iteration N+1)\r\n- Prevents memory leaks (agents exit after reporting)\r\n- Confidence scores drive gate checks and consensus validation\r\n\r\n**CRITICAL:** Report completion before exiting. Orchestrator is waiting for your signal.\r\n`;\r\n}\r\n\r\n/**\r\n * Parse and enrich JSON context into natural language instructions\r\n */\r\nfunction enrichJSONContext(jsonObj: any): string {\r\n const sections: string[] = [];\r\n\r\n // Extract task description\r\n if (jsonObj.task) {\r\n sections.push(`**Task:** ${jsonObj.task}`);\r\n }\r\n\r\n // Parse files - convert comma-separated string to bullet list\r\n if (jsonObj.files) {\r\n const fileList = typeof jsonObj.files === 'string'\r\n ? jsonObj.files.split(',').map(f => f.trim()).filter(f => f)\r\n : Array.isArray(jsonObj.files) ? jsonObj.files : [];\r\n\r\n if (fileList.length > 0) {\r\n sections.push('\\n**Files to process:**');\r\n fileList.forEach(file => sections.push(`- ${file}`));\r\n }\r\n }\r\n\r\n // Add requirements/deliverables\r\n if (jsonObj.requirements) {\r\n const reqs = Array.isArray(jsonObj.requirements) ? jsonObj.requirements : [jsonObj.requirements];\r\n sections.push('\\n**Requirements:**');\r\n reqs.forEach((req, i) => sections.push(`${i + 1}. ${req}`));\r\n }\r\n\r\n if (jsonObj.deliverables) {\r\n const delivs = Array.isArray(jsonObj.deliverables) ? jsonObj.deliverables : [jsonObj.deliverables];\r\n sections.push('\\n**Deliverables:**');\r\n delivs.forEach(deliv => sections.push(`- ${deliv}`));\r\n }\r\n\r\n // Add batch information\r\n if (jsonObj.batch) {\r\n sections.push(`\\n**Batch:** ${jsonObj.batch}`);\r\n }\r\n\r\n // Add directory context\r\n if (jsonObj.directory) {\r\n sections.push(`\\n**Working Directory:** ${jsonObj.directory}`);\r\n }\r\n\r\n // Add acceptance criteria\r\n if (jsonObj.acceptanceCriteria) {\r\n const criteria = Array.isArray(jsonObj.acceptanceCriteria)\r\n ? jsonObj.acceptanceCriteria\r\n : [jsonObj.acceptanceCriteria];\r\n sections.push('\\n**Acceptance Criteria:**');\r\n criteria.forEach(criterion => sections.push(`- ${criterion}`));\r\n }\r\n\r\n // Add explicit instructions if present\r\n if (jsonObj.instructions) {\r\n sections.push('\\n**Instructions:**');\r\n const instrs = Array.isArray(jsonObj.instructions) ? jsonObj.instructions : [jsonObj.instructions];\r\n instrs.forEach((instr, i) => sections.push(`${i + 1}. ${instr}`));\r\n }\r\n\r\n return sections.join('\\n');\r\n}\r\n\r\n/**\r\n * Build task description from context\r\n */\r\nfunction buildTaskDescription(agentType: string, context: TaskContext): string {\r\n let desc = '';\r\n\r\n if (context.context) {\r\n // Try to parse as JSON first\r\n let contextStr = context.context.trim();\r\n\r\n // Check if context looks like JSON\r\n if ((contextStr.startsWith('{') && contextStr.endsWith('}')) ||\r\n (contextStr.startsWith('[') && contextStr.endsWith(']'))) {\r\n try {\r\n const jsonObj = JSON.parse(contextStr);\r\n desc = enrichJSONContext(jsonObj);\r\n\r\n // Add instruction footer for structured tasks\r\n if (jsonObj.files || jsonObj.deliverables) {\r\n desc += '\\n\\n**Process each item systematically and report confidence when complete.**';\r\n }\r\n } catch (e) {\r\n // Not valid JSON, treat as plain text\r\n desc = context.context;\r\n }\r\n } else {\r\n // Plain text context\r\n desc = context.context;\r\n }\r\n } else {\r\n desc = `Execute task as ${agentType} agent`;\r\n }\r\n\r\n // Add metadata fields\r\n if (context.taskId) {\r\n desc += `\\n\\n**Task ID:** ${context.taskId}`;\r\n }\r\n\r\n if (context.iteration) {\r\n desc += `\\n**Iteration:** ${context.iteration}`;\r\n }\r\n\r\n if (context.mode) {\r\n desc += `\\n**Mode:** ${context.mode}`;\r\n }\r\n\r\n if (context.priority) {\r\n desc += `\\n**Priority:** ${context.priority}`;\r\n }\r\n\r\n if (context.parentTaskId) {\r\n desc += `\\n**Parent Task:** ${context.parentTaskId}`;\r\n }\r\n\r\n return desc;\r\n}\r\n\r\n/**\r\n * Build environment context section\r\n */\r\nfunction buildEnvironmentContext(context: TaskContext): string {\r\n const env: string[] = [];\r\n\r\n if (context.taskId) env.push(`TASK_ID=${context.taskId}`);\r\n if (context.iteration) env.push(`ITERATION=${context.iteration}`);\r\n if (context.mode) env.push(`MODE=${context.mode}`);\r\n if (context.priority) env.push(`PRIORITY=${context.priority}`);\r\n if (context.parentTaskId) env.push(`PARENT_TASK_ID=${context.parentTaskId}`);\r\n\r\n // Docker workspace detection\r\n const isDockerEnv = process.env.DOCKER_AGENT === 'true' || process.env.WORKSPACE_ROOT;\r\n const workspaceRoot = process.env.WORKSPACE_ROOT || '/workspace';\r\n\r\n if (isDockerEnv) {\r\n env.push(`WORKSPACE_ROOT=${workspaceRoot}`);\r\n }\r\n\r\n // Always include Docker context if detected, even if env array is empty\r\n if (isDockerEnv && env.length === 0) {\r\n env.push(`WORKSPACE_ROOT=${workspaceRoot}`);\r\n }\r\n\r\n if (env.length === 0 && !isDockerEnv) return '';\r\n\r\n let contextText = `\r\n## Environment Variables\r\n\r\n\\`\\`\\`bash\r\n${env.join('\\n')}\r\n\\`\\`\\`\r\n`;\r\n\r\n // Add Docker workspace notice if detected\r\n if (isDockerEnv) {\r\n contextText += `\r\n\r\n## Docker Container Environment\r\n\r\n**CRITICAL:** You are running inside a Docker container.\r\n\r\n- **Working Directory:** \\`${workspaceRoot}\\`\r\n- **File Paths:** All file operations use \\`${workspaceRoot}/\\` prefix\r\n- **Example:** To read \\`src/file.ts\\`, use \\`${workspaceRoot}/src/file.ts\\`\r\n\r\n**DO NOT** use paths from your training data or Main Chat context. Use \\`${workspaceRoot}/\\` for all file operations.\r\n`;\r\n }\r\n\r\n return contextText;\r\n}\r\n\r\n/**\r\n * Load skills for agent (Phase 5: Skills Database Integration)\r\n */\r\nasync function loadSkillsForAgent(\r\n agentType: string,\r\n context: TaskContext\r\n): Promise<Skill[]> {\r\n // Feature flag check\r\n if (process.env.CFN_SKILLS_DATABASE !== 'true') {\r\n return [];\r\n }\r\n\r\n try {\r\n const dbPath = process.env.CFN_SKILLS_DB_PATH || './.claude/skills-database/skills.db';\r\n const skillLoader = new SkillLoader(dbPath, {\r\n enableCache: true,\r\n cacheMaxSize: 100,\r\n cacheTTL: 60000 // 1 minute\r\n });\r\n\r\n // Extract keywords from context for filtering\r\n const keywords = context.keywords || context.context?.toLowerCase() || '';\r\n\r\n const skills = await skillLoader.loadSkillsForAgent(agentType, {\r\n taskId: context.taskId,\r\n keywords,\r\n phase: context.phase,\r\n mode: context.mode,\r\n iteration: context.iteration\r\n });\r\n\r\n skillLoader.close();\r\n return skills;\r\n } catch (error) {\r\n console.warn(`[agent-prompt-builder] Failed to load skills: ${error}`);\r\n return [];\r\n }\r\n}\r\n\r\n/**\r\n * Format skills for prompt injection\r\n */\r\nfunction formatSkillsForPrompt(skills: Skill[]): string {\r\n if (skills.length === 0) {\r\n return '';\r\n }\r\n\r\n const sections: string[] = [];\r\n\r\n sections.push('## Applicable Skills');\r\n sections.push('');\r\n sections.push('The following skills have been loaded based on your agent type and task context:');\r\n sections.push('');\r\n\r\n for (const skill of skills) {\r\n const approvalBadge = skill.approvalLevel === 'auto' ? '✓' :\r\n skill.approvalLevel === 'escalate' ? '⚠' : '✋';\r\n sections.push(`### ${skill.name} (v${skill.version}) [${approvalBadge} ${skill.approvalLevel}]`);\r\n sections.push('');\r\n if (skill.content) {\r\n sections.push(skill.content);\r\n } else {\r\n sections.push(`*Skill content not available*`);\r\n }\r\n sections.push('');\r\n }\r\n\r\n return sections.join('\\n');\r\n}\r\n\r\n/**\r\n * Build complete prompt for agent execution (async for iteration history + skills)\r\n */\r\nexport async function buildAgentPrompt(\r\n definition: AgentDefinition,\r\n context: TaskContext\r\n): Promise<string> {\r\n // Use explicit agent ID if provided, otherwise generate from name + iteration\r\n const agentId = context.agentId || `${definition.name}-${context.iteration || 1}`;\r\n const startTime = Date.now();\r\n\r\n const sections: string[] = [];\r\n\r\n // 1. Agent definition header\r\n sections.push(`# Agent: ${definition.name}`);\r\n sections.push('');\r\n sections.push(definition.description);\r\n sections.push('');\r\n\r\n // 2. Task description\r\n sections.push('## Task');\r\n sections.push('');\r\n sections.push(buildTaskDescription(definition.name, context));\r\n sections.push('');\r\n\r\n // 3. Iteration history (Sprint 3 - Phase 2)\r\n // Load and format previous iterations if iteration > 1\r\n if (context.taskId && context.iteration && context.iteration > 1) {\r\n try {\r\n const history = await loadIterationHistory(context.taskId, agentId, context.iteration);\r\n const historyText = formatIterationHistory(history, context.iteration);\r\n sections.push(historyText);\r\n sections.push('');\r\n } catch (err) {\r\n console.warn(`[agent-prompt-builder] Failed to load iteration history:`, err);\r\n // Continue without history\r\n }\r\n }\r\n\r\n // 4. Agent definition content (from markdown file)\r\n sections.push('## Agent Definition');\r\n sections.push('');\r\n sections.push(definition.content);\r\n sections.push('');\r\n\r\n // 4a. Load and inject skills (Phase 5: Skills Database Integration)\r\n try {\r\n const skills = await loadSkillsForAgent(definition.type || definition.name, context);\r\n\r\n if (skills.length > 0) {\r\n const skillsText = formatSkillsForPrompt(skills);\r\n sections.push(skillsText);\r\n sections.push('');\r\n\r\n // Log skill usage for analytics (Phase 5)\r\n if (process.env.CFN_SKILLS_DATABASE === 'true' && context.taskId) {\r\n try {\r\n const dbPath = process.env.CFN_SKILLS_DB_PATH || './.claude/skills-database/skills.db';\r\n const skillLoader = new SkillLoader(dbPath);\r\n\r\n await skillLoader.logSkillUsage({\r\n agentId: agentId,\r\n agentType: definition.type || definition.name,\r\n skillIds: skills.map(s => s.id).filter(id => id > 0), // Exclude bootstrap skills (negative IDs)\r\n taskId: context.taskId,\r\n phase: context.phase,\r\n loadedAt: new Date(),\r\n executionTimeMs: Date.now() - startTime\r\n });\r\n\r\n skillLoader.close();\r\n } catch (logError) {\r\n console.warn(`[agent-prompt-builder] Failed to log skill usage: ${logError}`);\r\n }\r\n }\r\n }\r\n } catch (skillError) {\r\n console.warn(`[agent-prompt-builder] Skill loading failed: ${skillError}`);\r\n // Continue without skills\r\n }\r\n\r\n // 5. CFN Loop protocol (ALWAYS inject when taskId present - enables Redis coordination)\r\n if (context.taskId && agentId) {\r\n sections.push(buildCFNLoopProtocol(context.taskId, agentId));\r\n sections.push('');\r\n }\r\n\r\n // 6. Environment context\r\n const envContext = buildEnvironmentContext(context);\r\n if (envContext) {\r\n sections.push(envContext);\r\n sections.push('');\r\n }\r\n\r\n // 7. Execution instructions\r\n sections.push('## Execution Instructions');\r\n sections.push('');\r\n sections.push('1. Read and understand the task requirements');\r\n if (context.iteration && context.iteration > 1) {\r\n sections.push('2. Review iteration history and feedback from validators');\r\n sections.push('3. Address specific feedback points from previous iteration');\r\n sections.push('4. Execute your core responsibilities as defined above');\r\n } else {\r\n sections.push('2. Execute your core responsibilities as defined above');\r\n sections.push('3. Follow any protocol steps (CFN Loop, validation hooks, etc.)');\r\n }\r\n sections.push('4. Provide clear, concise output');\r\n sections.push('5. Report confidence score if applicable');\r\n sections.push('');\r\n\r\n // 7a. Pre-edit backup requirement (MANDATORY)\r\n sections.push('## Pre-Edit Backup Protocol (MANDATORY)');\r\n sections.push('');\r\n sections.push('**BEFORE ANY Edit/Write/MultiEdit operation, you MUST create a backup:**');\r\n sections.push('');\r\n sections.push('```bash');\r\n sections.push(`BACKUP_PATH=$(./.claude/hooks/cfn-invoke-pre-edit.sh \"$FILE_TO_EDIT\" --agent-id \"${agentId}\")`);\r\n sections.push('```');\r\n sections.push('');\r\n sections.push('**Why:** Enables safe file revert without git operations during parallel sessions.');\r\n sections.push('**Location:** `.backups/[agent-id]/[timestamp]_[hash]/`');\r\n sections.push('**Retention:** 24h TTL (configurable)');\r\n sections.push('');\r\n sections.push('**Complete Edit Workflow:**');\r\n sections.push('```bash');\r\n sections.push('# 1. Pre-Edit: Create backup');\r\n sections.push(`BACKUP_PATH=$(./.claude/hooks/cfn-invoke-pre-edit.sh \"src/file.ts\" --agent-id \"${agentId}\")`);\r\n sections.push('');\r\n sections.push('# 2. Edit: Perform file modification');\r\n sections.push('Edit: file_path=\"src/file.ts\" old_string=\"...\" new_string=\"...\"');\r\n sections.push('');\r\n sections.push('# 3. Post-Edit: Validate changes');\r\n sections.push(`./.claude/hooks/cfn-invoke-post-edit.sh \"src/file.ts\" --agent-id \"${agentId}\"`);\r\n sections.push('```');\r\n sections.push('');\r\n\r\n // 8. Tool reminder\r\n if (definition.tools && definition.tools.length > 0) {\r\n sections.push('## Available Tools');\r\n sections.push('');\r\n sections.push(`You have access to: ${definition.tools.join(', ')}`);\r\n sections.push('');\r\n }\r\n\r\n return sections.join('\\n');\r\n}\r\n\r\n/**\r\n * Extract agent ID from context\r\n * If agentId is explicitly provided in context, use it; otherwise generate from name + iteration\r\n */\r\nexport function getAgentId(definition: AgentDefinition, context: TaskContext): string {\r\n if (context.agentId) {\r\n return context.agentId;\r\n }\r\n return `${definition.name}-${context.iteration || 1}`;\r\n}\r\n\r\n/**\r\n * Build system prompt for agent (optional, for structured agent behavior)\r\n */\r\nexport function buildSystemPrompt(definition: AgentDefinition): string {\r\n return `You are ${definition.name}, a specialized AI agent.\r\n\r\nType: ${definition.type || 'specialist'}\r\nModel: ${definition.model}\r\nTools: ${definition.tools.join(', ')}\r\n\r\nFollow your agent definition exactly and complete assigned tasks with high quality.`;\r\n}\r\n"],"names":["loadIterationHistory","formatIterationHistory","SkillLoader","buildCFNLoopProtocol","taskId","agentId","enrichJSONContext","jsonObj","sections","task","push","files","fileList","split","map","f","trim","filter","Array","isArray","length","forEach","file","requirements","reqs","req","i","deliverables","delivs","deliv","batch","directory","acceptanceCriteria","criteria","criterion","instructions","instrs","instr","join","buildTaskDescription","agentType","context","desc","contextStr","startsWith","endsWith","JSON","parse","e","iteration","mode","priority","parentTaskId","buildEnvironmentContext","env","isDockerEnv","process","DOCKER_AGENT","WORKSPACE_ROOT","workspaceRoot","contextText","loadSkillsForAgent","CFN_SKILLS_DATABASE","dbPath","CFN_SKILLS_DB_PATH","skillLoader","enableCache","cacheMaxSize","cacheTTL","keywords","toLowerCase","skills","phase","close","error","console","warn","formatSkillsForPrompt","skill","approvalBadge","approvalLevel","name","version","content","buildAgentPrompt","definition","startTime","Date","now","description","history","historyText","err","type","skillsText","logSkillUsage","skillIds","s","id","loadedAt","executionTimeMs","logError","skillError","envContext","tools","getAgentId","buildSystemPrompt","model"],"mappings":"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"}
|