claude-flow-novice 2.15.5 → 2.15.6
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/.gs-api-quota.json +16 -0
- package/.claude/cfn-extras/.gs-progress-state.json +22 -0
- package/.claude/cfn-extras/GOOGLE_SHEETS_IMPLEMENTATION_SUMMARY.md +414 -0
- package/.claude/cfn-extras/agents/google-sheets/README.md +114 -0
- package/.claude/cfn-extras/agents/google-sheets/google-sheets-advanced-analytics-specialist.md +288 -0
- package/.claude/cfn-extras/agents/google-sheets/google-sheets-api-integrator.md +127 -0
- package/.claude/cfn-extras/agents/google-sheets/google-sheets-automation-scripting-specialist.md +195 -0
- package/.claude/cfn-extras/agents/google-sheets/google-sheets-business-validator.md +179 -0
- package/.claude/cfn-extras/agents/google-sheets/google-sheets-collaboration-security-specialist.md +240 -0
- package/.claude/cfn-extras/agents/google-sheets/google-sheets-coordinator.md +214 -0
- package/.claude/cfn-extras/agents/google-sheets/google-sheets-data-transformer.md +127 -0
- package/.claude/cfn-extras/agents/google-sheets/google-sheets-data-validation-quality-specialist.md +177 -0
- package/.claude/cfn-extras/agents/google-sheets/google-sheets-data-validator.md +119 -0
- package/.claude/cfn-extras/agents/google-sheets/google-sheets-data-visualization-specialist.md +135 -0
- package/.claude/cfn-extras/agents/google-sheets/google-sheets-design-layout-specialist.md +109 -0
- package/.claude/cfn-extras/agents/google-sheets/google-sheets-formula-engineer.md +127 -0
- package/.claude/cfn-extras/agents/google-sheets/google-sheets-formula-engineering-specialist.md +138 -0
- package/.claude/cfn-extras/agents/google-sheets/google-sheets-formula-validator.md +128 -0
- package/.claude/cfn-extras/agents/google-sheets/google-sheets-generalist.md +645 -0
- package/.claude/cfn-extras/agents/google-sheets/google-sheets-integration-api-specialist.md +258 -0
- package/.claude/cfn-extras/agents/google-sheets/google-sheets-performance-analyst.md +125 -0
- package/.claude/cfn-extras/agents/google-sheets/google-sheets-performance-optimization-specialist.md +211 -0
- package/.claude/cfn-extras/agents/google-sheets/google-sheets-schema-designer.md +130 -0
- package/.claude/cfn-extras/agents/google-sheets/google-sheets-template-architecture-specialist.md +259 -0
- package/.claude/cfn-extras/docs/GOOGLE_SHEETS_CFN_LOOP.md +617 -0
- package/.claude/cfn-extras/skills/GOOGLE_SHEETS_SKILLS_README.md +453 -0
- package/.claude/cfn-extras/skills/google-sheets-api-coordinator/SKILL.md +272 -0
- package/.claude/cfn-extras/skills/google-sheets-api-coordinator/api-call.sh +254 -0
- package/.claude/cfn-extras/skills/google-sheets-api-coordinator/test.sh +174 -0
- package/.claude/cfn-extras/skills/google-sheets-api-coordinator/validate.sh +98 -0
- package/.claude/cfn-extras/skills/google-sheets-decomposition/SKILL.md +269 -0
- package/.claude/cfn-extras/skills/google-sheets-decomposition/decompose.sh +313 -0
- package/.claude/cfn-extras/skills/google-sheets-formula-builder/SKILL.md +237 -0
- package/.claude/cfn-extras/skills/google-sheets-formula-builder/build-formula.sh +220 -0
- package/.claude/cfn-extras/skills/google-sheets-formula-builder/test.sh +172 -0
- package/.claude/cfn-extras/skills/google-sheets-formula-builder/validate.sh +98 -0
- package/.claude/cfn-extras/skills/google-sheets-progress/SKILL.md +287 -0
- package/.claude/cfn-extras/skills/google-sheets-progress/test.sh +385 -0
- package/.claude/cfn-extras/skills/google-sheets-progress/track-progress.sh +516 -0
- package/.claude/cfn-extras/skills/google-sheets-progress/validate.sh +119 -0
- package/.claude/cfn-extras/skills/google-sheets-sprint-order/SKILL.md +277 -0
- package/.claude/cfn-extras/skills/google-sheets-sprint-order/order-sprints.sh +233 -0
- package/.claude/cfn-extras/skills/google-sheets-validation/SKILL.md +352 -0
- package/.claude/cfn-extras/skills/google-sheets-validation/test.sh +355 -0
- package/.claude/cfn-extras/skills/google-sheets-validation/validate-state.sh +374 -0
- package/.claude/cfn-extras/skills/google-sheets-validation/validate.sh +128 -0
- package/.claude/commands/cfn-context.md +10 -0
- package/.claude/commands/cfn-loop-cli.md +36 -15
- package/.claude/commands/google-sheets/google-sheets-loop.md +289 -0
- package/.claude/skills/cfn-agent-selector/SKILL.md +143 -0
- package/.claude/skills/cfn-agent-selector/select-agents.sh +94 -0
- package/.claude/skills/cfn-agent-spawning/get-agent-provider-env.sh +22 -2
- package/.claude/skills/cfn-docker-agent-spawning/spawn-agent.sh +21 -2
- package/.claude/skills/cfn-docker-loop-orchestration/orchestrate.sh +11 -5
- package/.claude/skills/cfn-docker-redis-coordination/MIGRATION_SUMMARY.md +348 -0
- package/.claude/skills/cfn-docker-redis-coordination/README.md +294 -0
- package/.claude/skills/cfn-docker-redis-coordination/jest.config.js +37 -0
- package/.claude/skills/cfn-docker-redis-coordination/package-lock.json +5259 -0
- package/.claude/skills/cfn-docker-redis-coordination/package.json +40 -0
- package/.claude/skills/cfn-docker-redis-coordination/src/coordinator.ts +801 -0
- package/.claude/skills/cfn-docker-redis-coordination/src/index.ts +42 -0
- package/.claude/skills/cfn-docker-redis-coordination/src/types.ts +351 -0
- package/.claude/skills/cfn-docker-redis-coordination/tests/coordinator.test.ts +1464 -0
- package/.claude/skills/cfn-docker-redis-coordination/tsconfig.json +30 -0
- package/.claude/skills/cfn-loop-orchestration/.eslintrc.js +56 -0
- package/.claude/skills/cfn-loop-orchestration/.prettierrc.json +18 -0
- package/.claude/skills/cfn-loop-orchestration/README.md +149 -41
- package/.claude/skills/cfn-loop-orchestration/jest.config.js +67 -0
- package/.claude/skills/cfn-loop-orchestration/orchestrate-wrapper.sh +268 -0
- package/.claude/skills/cfn-loop-orchestration/orchestrate.sh +91 -8
- package/.claude/skills/cfn-loop-orchestration/package-lock.json +5470 -0
- package/.claude/skills/cfn-loop-orchestration/package.json +49 -0
- package/.claude/skills/cfn-loop-orchestration/src/agent-spawner/agent-spawner.ts +34 -0
- package/.claude/skills/cfn-loop-orchestration/src/gate-checker/gate-checker.ts +36 -0
- package/.claude/skills/cfn-loop-orchestration/src/index.ts +14 -0
- package/.claude/skills/cfn-loop-orchestration/src/orchestrator/orchestrator.ts +31 -0
- package/.claude/skills/cfn-loop-orchestration/src/redis/redis-coordinator.ts +72 -0
- package/.claude/skills/cfn-loop-orchestration/src/types.ts +188 -0
- package/.claude/skills/cfn-loop-orchestration/src/utils/logger.ts +32 -0
- package/.claude/skills/cfn-loop-orchestration/tests/setup.ts +22 -0
- package/.claude/skills/cfn-loop-orchestration/tests/types.test.ts +132 -0
- package/.claude/skills/cfn-loop-orchestration/tsconfig.json +54 -0
- package/.claude/skills/cfn-redis-coordination/bash-wrappers/store-context.sh +23 -0
- package/.claude/skills/cfn-redis-coordination/dist/agent-logger.d.ts +92 -0
- package/.claude/skills/cfn-redis-coordination/dist/agent-logger.d.ts.map +1 -0
- package/.claude/skills/cfn-redis-coordination/dist/agent-logger.js +329 -0
- package/.claude/skills/cfn-redis-coordination/dist/agent-logger.js.map +1 -0
- package/.claude/skills/cfn-redis-coordination/dist/agent-recovery.d.ts +75 -0
- package/.claude/skills/cfn-redis-coordination/dist/agent-recovery.d.ts.map +1 -0
- package/.claude/skills/cfn-redis-coordination/dist/agent-recovery.js +302 -0
- package/.claude/skills/cfn-redis-coordination/dist/agent-recovery.js.map +1 -0
- package/.claude/skills/cfn-redis-coordination/dist/completion-reporter.d.ts +58 -0
- package/.claude/skills/cfn-redis-coordination/dist/completion-reporter.d.ts.map +1 -0
- package/.claude/skills/cfn-redis-coordination/dist/completion-reporter.js +237 -0
- package/.claude/skills/cfn-redis-coordination/dist/completion-reporter.js.map +1 -0
- package/.claude/skills/cfn-redis-coordination/dist/context-manager.d.ts +63 -0
- package/.claude/skills/cfn-redis-coordination/dist/context-manager.d.ts.map +1 -0
- package/.claude/skills/cfn-redis-coordination/dist/context-manager.js +230 -0
- package/.claude/skills/cfn-redis-coordination/dist/context-manager.js.map +1 -0
- package/.claude/skills/cfn-redis-coordination/dist/index.d.ts +45 -0
- package/.claude/skills/cfn-redis-coordination/dist/index.d.ts.map +1 -0
- package/.claude/skills/cfn-redis-coordination/dist/index.js +114 -0
- package/.claude/skills/cfn-redis-coordination/dist/index.js.map +1 -0
- package/.claude/skills/cfn-redis-coordination/dist/mode-detector.d.ts +31 -0
- package/.claude/skills/cfn-redis-coordination/dist/mode-detector.d.ts.map +1 -0
- package/.claude/skills/cfn-redis-coordination/dist/mode-detector.js +185 -0
- package/.claude/skills/cfn-redis-coordination/dist/mode-detector.js.map +1 -0
- package/.claude/skills/cfn-redis-coordination/dist/redis-client.d.ts +191 -0
- package/.claude/skills/cfn-redis-coordination/dist/redis-client.d.ts.map +1 -0
- package/.claude/skills/cfn-redis-coordination/dist/redis-client.js +509 -0
- package/.claude/skills/cfn-redis-coordination/dist/redis-client.js.map +1 -0
- package/.claude/skills/cfn-redis-coordination/dist/result-collector.d.ts +75 -0
- package/.claude/skills/cfn-redis-coordination/dist/result-collector.d.ts.map +1 -0
- package/.claude/skills/cfn-redis-coordination/dist/result-collector.js +281 -0
- package/.claude/skills/cfn-redis-coordination/dist/result-collector.js.map +1 -0
- package/.claude/skills/cfn-redis-coordination/dist/swarm-manager.d.ts +75 -0
- package/.claude/skills/cfn-redis-coordination/dist/swarm-manager.d.ts.map +1 -0
- package/.claude/skills/cfn-redis-coordination/dist/swarm-manager.js +354 -0
- package/.claude/skills/cfn-redis-coordination/dist/swarm-manager.js.map +1 -0
- package/.claude/skills/cfn-redis-coordination/dist/task-analyzer.d.ts +62 -0
- package/.claude/skills/cfn-redis-coordination/dist/task-analyzer.d.ts.map +1 -0
- package/.claude/skills/cfn-redis-coordination/dist/task-analyzer.js +305 -0
- package/.claude/skills/cfn-redis-coordination/dist/task-analyzer.js.map +1 -0
- package/.claude/skills/cfn-redis-coordination/dist/task-executor.d.ts +97 -0
- package/.claude/skills/cfn-redis-coordination/dist/task-executor.d.ts.map +1 -0
- package/.claude/skills/cfn-redis-coordination/dist/task-executor.js +283 -0
- package/.claude/skills/cfn-redis-coordination/dist/task-executor.js.map +1 -0
- package/.claude/skills/cfn-redis-coordination/dist/types.d.ts +176 -0
- package/.claude/skills/cfn-redis-coordination/dist/types.d.ts.map +1 -0
- package/.claude/skills/cfn-redis-coordination/dist/types.js +81 -0
- package/.claude/skills/cfn-redis-coordination/dist/types.js.map +1 -0
- package/.claude/skills/cfn-redis-coordination/dist/waiting-coordinator.d.ts +86 -0
- package/.claude/skills/cfn-redis-coordination/dist/waiting-coordinator.d.ts.map +1 -0
- package/.claude/skills/cfn-redis-coordination/dist/waiting-coordinator.js +419 -0
- package/.claude/skills/cfn-redis-coordination/dist/waiting-coordinator.js.map +1 -0
- package/.claude/skills/cfn-redis-coordination/docs/migration/PHASE_3_REDIS_COORDINATION_COMPLETION_REPORT.md +553 -0
- package/.claude/skills/cfn-redis-coordination/jest.config.js +23 -0
- package/.claude/skills/cfn-redis-coordination/package-lock.json +5272 -0
- package/.claude/skills/cfn-redis-coordination/package.json +45 -0
- package/.claude/skills/cfn-redis-coordination/redis-cli-wrapper.sh +21 -8
- package/.claude/skills/cfn-redis-coordination/src/agent-logger.ts +446 -0
- package/.claude/skills/cfn-redis-coordination/src/agent-recovery.ts +454 -0
- package/.claude/skills/cfn-redis-coordination/src/completion-reporter.ts +396 -0
- package/.claude/skills/cfn-redis-coordination/src/context-manager.ts +327 -0
- package/.claude/skills/cfn-redis-coordination/src/index.ts +82 -0
- package/.claude/skills/cfn-redis-coordination/src/mode-detector.ts +155 -0
- package/.claude/skills/cfn-redis-coordination/src/redis/redis-client.ts +305 -0
- package/.claude/skills/cfn-redis-coordination/src/redis/redis-functions.ts +283 -0
- package/.claude/skills/cfn-redis-coordination/src/redis-client.ts +654 -0
- package/.claude/skills/cfn-redis-coordination/src/result-collector.ts +437 -0
- package/.claude/skills/cfn-redis-coordination/src/swarm-manager.ts +494 -0
- package/.claude/skills/cfn-redis-coordination/src/task-analyzer.ts +404 -0
- package/.claude/skills/cfn-redis-coordination/src/task-executor.ts +423 -0
- package/.claude/skills/cfn-redis-coordination/src/types.ts +235 -0
- package/.claude/skills/cfn-redis-coordination/src/waiting-coordinator.ts +587 -0
- package/.claude/skills/cfn-redis-coordination/test-connection-attempts.js +70 -0
- package/.claude/skills/cfn-redis-coordination/test-mode-simple.js +121 -0
- package/.claude/skills/cfn-redis-coordination/test-redis-check.js +84 -0
- package/.claude/skills/cfn-redis-coordination/test-task-mode-redis.cjs +391 -0
- package/.claude/skills/cfn-redis-coordination/tests/coordination.test.ts +779 -0
- package/.claude/skills/cfn-redis-coordination/tsconfig.json +31 -0
- package/claude-assets/agents/cfn-dev-team/coordinators/cfn-v3-coordinator.md +172 -2
- package/claude-assets/agents/cfn-dev-team/testers/api-testing-specialist.md +1 -1
- package/claude-assets/agents/custom/cfn-redis-operations.md +530 -0
- package/claude-assets/agents/custom/cfn-system-expert.md +77 -0
- package/claude-assets/cfn-extras/.gs-api-quota.json +16 -0
- package/claude-assets/cfn-extras/.gs-progress-state.json +22 -0
- package/claude-assets/cfn-extras/GOOGLE_SHEETS_IMPLEMENTATION_SUMMARY.md +414 -0
- package/claude-assets/cfn-extras/agents/google-sheets/README.md +114 -0
- package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-advanced-analytics-specialist.md +288 -0
- package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-api-integrator.md +127 -0
- package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-automation-scripting-specialist.md +195 -0
- package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-business-validator.md +179 -0
- package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-collaboration-security-specialist.md +240 -0
- package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-coordinator.md +214 -0
- package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-data-transformer.md +127 -0
- package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-data-validation-quality-specialist.md +177 -0
- package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-data-validator.md +119 -0
- package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-data-visualization-specialist.md +135 -0
- package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-design-layout-specialist.md +109 -0
- package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-formula-engineer.md +127 -0
- package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-formula-engineering-specialist.md +138 -0
- package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-formula-validator.md +128 -0
- package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-generalist.md +645 -0
- package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-integration-api-specialist.md +258 -0
- package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-performance-analyst.md +125 -0
- package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-performance-optimization-specialist.md +211 -0
- package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-schema-designer.md +130 -0
- package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-template-architecture-specialist.md +259 -0
- package/claude-assets/cfn-extras/docs/GOOGLE_SHEETS_CFN_LOOP.md +617 -0
- package/claude-assets/cfn-extras/skills/GOOGLE_SHEETS_SKILLS_README.md +453 -0
- package/claude-assets/cfn-extras/skills/google-sheets-api-coordinator/SKILL.md +272 -0
- package/claude-assets/cfn-extras/skills/google-sheets-api-coordinator/api-call.sh +254 -0
- package/claude-assets/cfn-extras/skills/google-sheets-api-coordinator/test.sh +174 -0
- package/claude-assets/cfn-extras/skills/google-sheets-api-coordinator/validate.sh +98 -0
- package/claude-assets/cfn-extras/skills/google-sheets-decomposition/SKILL.md +269 -0
- package/claude-assets/cfn-extras/skills/google-sheets-decomposition/decompose.sh +313 -0
- package/claude-assets/cfn-extras/skills/google-sheets-formula-builder/SKILL.md +237 -0
- package/claude-assets/cfn-extras/skills/google-sheets-formula-builder/build-formula.sh +220 -0
- package/claude-assets/cfn-extras/skills/google-sheets-formula-builder/test.sh +172 -0
- package/claude-assets/cfn-extras/skills/google-sheets-formula-builder/validate.sh +98 -0
- package/claude-assets/cfn-extras/skills/google-sheets-progress/SKILL.md +287 -0
- package/claude-assets/cfn-extras/skills/google-sheets-progress/test.sh +385 -0
- package/claude-assets/cfn-extras/skills/google-sheets-progress/track-progress.sh +516 -0
- package/claude-assets/cfn-extras/skills/google-sheets-progress/validate.sh +119 -0
- package/claude-assets/cfn-extras/skills/google-sheets-sprint-order/SKILL.md +277 -0
- package/claude-assets/cfn-extras/skills/google-sheets-sprint-order/order-sprints.sh +233 -0
- package/claude-assets/cfn-extras/skills/google-sheets-validation/SKILL.md +352 -0
- package/claude-assets/cfn-extras/skills/google-sheets-validation/test.sh +355 -0
- package/claude-assets/cfn-extras/skills/google-sheets-validation/validate-state.sh +374 -0
- package/claude-assets/cfn-extras/skills/google-sheets-validation/validate.sh +128 -0
- package/claude-assets/commands/cfn-context.md +10 -0
- package/claude-assets/commands/cfn-loop-cli.md +36 -15
- package/claude-assets/commands/google-sheets/google-sheets-loop.md +289 -0
- package/claude-assets/hooks/cfn-pre-execution/SESSION_START_README.md +87 -0
- package/claude-assets/hooks/cfn-pre-execution/TEST_SESSION_START.md +128 -0
- package/claude-assets/hooks/cfn-pre-execution/session-start-context.sh +111 -0
- package/claude-assets/skills/cfn-agent-selection-with-fallback/INTEGRATION_EXAMPLE.md +209 -0
- package/claude-assets/skills/cfn-agent-selection-with-fallback/README.md +130 -0
- package/claude-assets/skills/cfn-agent-selection-with-fallback/SKILL.md +243 -0
- package/claude-assets/skills/cfn-agent-selection-with-fallback/agent-mappings.json +142 -0
- package/claude-assets/skills/cfn-agent-selection-with-fallback/select-agents.sh +173 -0
- package/claude-assets/skills/cfn-agent-selection-with-fallback/task-classifier.sh +71 -0
- package/claude-assets/skills/cfn-agent-selection-with-fallback/test-agent-selection.sh +282 -0
- package/claude-assets/skills/cfn-agent-selector/SKILL.md +143 -0
- package/claude-assets/skills/cfn-agent-selector/select-agents.sh +94 -0
- package/claude-assets/skills/cfn-agent-spawning/get-agent-provider-env.sh +22 -2
- package/claude-assets/skills/cfn-docker-agent-spawning/spawn-agent.sh +21 -2
- package/claude-assets/skills/cfn-docker-coordination/.eslintrc.json +33 -0
- package/claude-assets/skills/cfn-docker-coordination/README.md +349 -0
- package/claude-assets/skills/cfn-docker-coordination/docker-helpers.sh +433 -0
- package/claude-assets/skills/cfn-docker-coordination/jest.config.js +25 -0
- package/claude-assets/skills/cfn-docker-coordination/package-lock.json +6827 -0
- package/claude-assets/skills/cfn-docker-coordination/package.json +38 -0
- package/claude-assets/skills/cfn-docker-coordination/src/agent-container.ts +471 -0
- package/claude-assets/skills/cfn-docker-coordination/src/docker-client.ts +483 -0
- package/claude-assets/skills/cfn-docker-coordination/src/health-checker.ts +418 -0
- package/claude-assets/skills/cfn-docker-coordination/src/index.ts +45 -0
- package/claude-assets/skills/cfn-docker-coordination/src/network-manager.ts +377 -0
- package/claude-assets/skills/cfn-docker-coordination/src/types.ts +412 -0
- package/claude-assets/skills/cfn-docker-coordination/src/volume-manager.ts +389 -0
- package/claude-assets/skills/cfn-docker-coordination/tests/agent-container.test.ts +379 -0
- package/claude-assets/skills/cfn-docker-coordination/tests/docker-client.test.ts +345 -0
- package/claude-assets/skills/cfn-docker-coordination/tests/health-checker.test.ts +535 -0
- package/claude-assets/skills/cfn-docker-coordination/tests/integration.test.ts +193 -0
- package/claude-assets/skills/cfn-docker-coordination/tests/network-manager.test.ts +352 -0
- package/claude-assets/skills/cfn-docker-coordination/tests/setup.ts +36 -0
- package/claude-assets/skills/cfn-docker-coordination/tsconfig.json +29 -0
- package/claude-assets/skills/cfn-docker-logging/INTEGRATION.md +268 -0
- package/claude-assets/skills/cfn-docker-logging/SAMPLE_OUTPUTS.md +237 -0
- package/claude-assets/skills/cfn-docker-logging/SKILL.md +442 -0
- package/claude-assets/skills/cfn-docker-logging/capture-container-logs.sh +120 -0
- package/claude-assets/skills/cfn-docker-logging/enable-logging.sh +430 -0
- package/claude-assets/skills/cfn-docker-logging/init-hybrid-logging.sh +210 -0
- package/claude-assets/skills/cfn-docker-logging/queries/analytics-summary.sh +87 -0
- package/claude-assets/skills/cfn-docker-logging/queries/query-agent-timeline.sh +51 -0
- package/claude-assets/skills/cfn-docker-logging/queries/query-consensus-history.sh +56 -0
- package/claude-assets/skills/cfn-docker-logging/queries/query-coordination-timeline.sh +39 -0
- package/claude-assets/skills/cfn-docker-logging/queries/query-failed-containers.sh +40 -0
- package/claude-assets/skills/cfn-docker-logging/queries/query-gate-checks.sh +39 -0
- package/claude-assets/skills/cfn-docker-logging/schema.sql +111 -0
- package/claude-assets/skills/cfn-docker-logging/sqlite-helpers.sh +240 -0
- package/claude-assets/skills/cfn-docker-logging/test-hybrid-logging.sh +331 -0
- package/claude-assets/skills/cfn-docker-loop-orchestration/orchestrate.sh +11 -5
- package/claude-assets/skills/cfn-docker-redis-coordination/MIGRATION_SUMMARY.md +348 -0
- package/claude-assets/skills/cfn-docker-redis-coordination/README.md +294 -0
- package/claude-assets/skills/cfn-docker-redis-coordination/jest.config.js +37 -0
- package/claude-assets/skills/cfn-docker-redis-coordination/package-lock.json +5259 -0
- package/claude-assets/skills/cfn-docker-redis-coordination/package.json +40 -0
- package/claude-assets/skills/cfn-docker-redis-coordination/src/coordinator.ts +801 -0
- package/claude-assets/skills/cfn-docker-redis-coordination/src/index.ts +42 -0
- package/claude-assets/skills/cfn-docker-redis-coordination/src/types.ts +351 -0
- package/claude-assets/skills/cfn-docker-redis-coordination/tests/coordinator.test.ts +1464 -0
- package/claude-assets/skills/cfn-docker-redis-coordination/tsconfig.json +30 -0
- package/claude-assets/skills/cfn-error-logging/.eslintrc.json +57 -0
- package/claude-assets/skills/cfn-error-logging/.prettierrc.json +10 -0
- package/claude-assets/skills/cfn-error-logging/MIGRATION_SUMMARY.md +485 -0
- package/claude-assets/skills/cfn-error-logging/package.json +47 -0
- package/claude-assets/skills/cfn-error-logging/src/error-logger.ts +1042 -0
- package/claude-assets/skills/cfn-error-logging/src/index.ts +12 -0
- package/claude-assets/skills/cfn-error-logging/src/types.ts +456 -0
- package/claude-assets/skills/cfn-error-logging/tests/error-logger.test.ts +1302 -0
- package/claude-assets/skills/cfn-error-logging/tsconfig.json +38 -0
- package/claude-assets/skills/cfn-loop-orchestration/.eslintrc.js +56 -0
- package/claude-assets/skills/cfn-loop-orchestration/.prettierrc.json +18 -0
- package/claude-assets/skills/cfn-loop-orchestration/README.md +149 -41
- package/claude-assets/skills/cfn-loop-orchestration/jest.config.js +67 -0
- package/claude-assets/skills/cfn-loop-orchestration/orchestrate-wrapper.sh +268 -0
- package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh +91 -8
- package/claude-assets/skills/cfn-loop-orchestration/package-lock.json +5470 -0
- package/claude-assets/skills/cfn-loop-orchestration/package.json +49 -0
- package/claude-assets/skills/cfn-loop-orchestration/src/agent-spawner/agent-spawner.ts +34 -0
- package/claude-assets/skills/cfn-loop-orchestration/src/gate-checker/gate-checker.ts +36 -0
- package/claude-assets/skills/cfn-loop-orchestration/src/index.ts +14 -0
- package/claude-assets/skills/cfn-loop-orchestration/src/orchestrator/orchestrator.ts +31 -0
- package/claude-assets/skills/cfn-loop-orchestration/src/redis/redis-coordinator.ts +72 -0
- package/claude-assets/skills/cfn-loop-orchestration/src/types.ts +188 -0
- package/claude-assets/skills/cfn-loop-orchestration/src/utils/logger.ts +32 -0
- package/claude-assets/skills/cfn-loop-orchestration/tests/setup.ts +22 -0
- package/claude-assets/skills/cfn-loop-orchestration/tests/types.test.ts +132 -0
- package/claude-assets/skills/cfn-loop-orchestration/tsconfig.json +54 -0
- package/claude-assets/skills/cfn-redis-coordination/bash-wrappers/store-context.sh +23 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/agent-logger.d.ts +92 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/agent-logger.d.ts.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/agent-logger.js +329 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/agent-logger.js.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/agent-recovery.d.ts +75 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/agent-recovery.d.ts.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/agent-recovery.js +302 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/agent-recovery.js.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/completion-reporter.d.ts +58 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/completion-reporter.d.ts.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/completion-reporter.js +237 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/completion-reporter.js.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/context-manager.d.ts +63 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/context-manager.d.ts.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/context-manager.js +230 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/context-manager.js.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/index.d.ts +45 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/index.d.ts.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/index.js +114 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/index.js.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/mode-detector.d.ts +31 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/mode-detector.d.ts.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/mode-detector.js +185 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/mode-detector.js.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/redis-client.d.ts +191 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/redis-client.d.ts.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/redis-client.js +509 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/redis-client.js.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/result-collector.d.ts +75 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/result-collector.d.ts.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/result-collector.js +281 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/result-collector.js.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/swarm-manager.d.ts +75 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/swarm-manager.d.ts.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/swarm-manager.js +354 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/swarm-manager.js.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/task-analyzer.d.ts +62 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/task-analyzer.d.ts.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/task-analyzer.js +305 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/task-analyzer.js.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/task-executor.d.ts +97 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/task-executor.d.ts.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/task-executor.js +283 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/task-executor.js.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/types.d.ts +176 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/types.d.ts.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/types.js +81 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/types.js.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/waiting-coordinator.d.ts +86 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/waiting-coordinator.d.ts.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/waiting-coordinator.js +419 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/waiting-coordinator.js.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/docs/migration/PHASE_3_REDIS_COORDINATION_COMPLETION_REPORT.md +553 -0
- package/claude-assets/skills/cfn-redis-coordination/jest.config.js +23 -0
- package/claude-assets/skills/cfn-redis-coordination/package-lock.json +5272 -0
- package/claude-assets/skills/cfn-redis-coordination/package.json +45 -0
- package/claude-assets/skills/cfn-redis-coordination/redis-cli-wrapper.sh +21 -8
- package/claude-assets/skills/cfn-redis-coordination/src/agent-logger.ts +446 -0
- package/claude-assets/skills/cfn-redis-coordination/src/agent-recovery.ts +454 -0
- package/claude-assets/skills/cfn-redis-coordination/src/completion-reporter.ts +396 -0
- package/claude-assets/skills/cfn-redis-coordination/src/context-manager.ts +327 -0
- package/claude-assets/skills/cfn-redis-coordination/src/index.ts +82 -0
- package/claude-assets/skills/cfn-redis-coordination/src/mode-detector.ts +155 -0
- package/claude-assets/skills/cfn-redis-coordination/src/redis/redis-client.ts +305 -0
- package/claude-assets/skills/cfn-redis-coordination/src/redis/redis-functions.ts +283 -0
- package/claude-assets/skills/cfn-redis-coordination/src/redis-client.ts +654 -0
- package/claude-assets/skills/cfn-redis-coordination/src/result-collector.ts +437 -0
- package/claude-assets/skills/cfn-redis-coordination/src/swarm-manager.ts +494 -0
- package/claude-assets/skills/cfn-redis-coordination/src/task-analyzer.ts +404 -0
- package/claude-assets/skills/cfn-redis-coordination/src/task-executor.ts +423 -0
- package/claude-assets/skills/cfn-redis-coordination/src/types.ts +235 -0
- package/claude-assets/skills/cfn-redis-coordination/src/waiting-coordinator.ts +587 -0
- package/claude-assets/skills/cfn-redis-coordination/test-connection-attempts.js +70 -0
- package/claude-assets/skills/cfn-redis-coordination/test-mode-simple.js +121 -0
- package/claude-assets/skills/cfn-redis-coordination/test-redis-check.js +84 -0
- package/claude-assets/skills/cfn-redis-coordination/test-task-mode-redis.cjs +391 -0
- package/claude-assets/skills/cfn-redis-coordination/tests/coordination.test.ts +779 -0
- package/claude-assets/skills/cfn-redis-coordination/tsconfig.json +31 -0
- package/claude-assets/skills/cfn-skill-propagation/README.md +233 -0
- package/claude-assets/skills/cfn-skill-propagation/package-lock.json +5174 -0
- package/claude-assets/skills/cfn-skill-propagation/package.json +52 -0
- package/claude-assets/skills/cfn-skill-propagation/propagate-skill-update.sh +32 -0
- package/claude-assets/skills/cfn-skill-propagation/src/cli.ts +75 -0
- package/claude-assets/skills/cfn-skill-propagation/src/database-adapter.ts +239 -0
- package/claude-assets/skills/cfn-skill-propagation/src/file-system-adapter.ts +113 -0
- package/claude-assets/skills/cfn-skill-propagation/src/index.ts +72 -0
- package/claude-assets/skills/cfn-skill-propagation/src/logger.ts +43 -0
- package/claude-assets/skills/cfn-skill-propagation/src/metadata-parser.ts +154 -0
- package/claude-assets/skills/cfn-skill-propagation/src/skill-propagator.ts +274 -0
- package/claude-assets/skills/cfn-skill-propagation/src/skill-validator.ts +179 -0
- package/claude-assets/skills/cfn-skill-propagation/src/types.ts +143 -0
- package/claude-assets/skills/cfn-skill-propagation/src/version-manager.ts +118 -0
- package/claude-assets/skills/cfn-skill-propagation/tests/file-system-adapter.test.ts +91 -0
- package/claude-assets/skills/cfn-skill-propagation/tests/metadata-parser.test.ts +176 -0
- package/claude-assets/skills/cfn-skill-propagation/tests/skill-propagator.test.ts +209 -0
- package/claude-assets/skills/cfn-skill-propagation/tests/skill-validator.test.ts +203 -0
- package/claude-assets/skills/cfn-skill-propagation/tests/version-manager.test.ts +115 -0
- package/claude-assets/skills/cfn-skill-propagation/tsconfig.json +34 -0
- package/claude-assets/skills/task-classifier/SKILL.md +81 -0
- package/claude-assets/skills/task-classifier/classify-task.sh +62 -0
- package/claude-assets/skills/workflow-codification/package-lock.json +5170 -0
- package/claude-assets/skills/workflow-codification/package.json +30 -0
- package/claude-assets/skills/workflow-codification/src/index.ts +24 -0
- package/claude-assets/skills/workflow-codification/src/pattern-analyzer.ts +537 -0
- package/claude-assets/skills/workflow-codification/src/types.ts +180 -0
- package/claude-assets/skills/workflow-codification/tests/pattern-analyzer.test.ts +960 -0
- package/claude-assets/skills/workflow-codification/tsconfig.json +34 -0
- package/claude-assets/skills/workflow-codification/workflow-codification.db +0 -0
- package/dist/agent-spawner/agent-spawner.js +448 -0
- package/dist/agent-spawner/agent-spawner.js.map +1 -0
- package/dist/agent-spawner/index.js +10 -0
- package/dist/agent-spawner/index.js.map +1 -0
- package/dist/agent-spawner/types.js +14 -0
- package/dist/agent-spawner/types.js.map +1 -0
- package/dist/agents/agent-loader.js +146 -165
- package/dist/agents/agent-loader.js.map +1 -1
- package/dist/cli/agent-executor.js +47 -1
- package/dist/cli/agent-executor.js.map +1 -1
- package/dist/cli/agent-spawn.js +4 -1
- package/dist/cli/agent-spawn.js.map +1 -1
- package/dist/cli/tool-executor.js +3 -1
- package/dist/cli/tool-executor.js.map +1 -1
- package/dist/gate-checker/gate-checker.js +292 -0
- package/dist/gate-checker/gate-checker.js.map +1 -0
- package/dist/gate-checker/types.js +94 -0
- package/dist/gate-checker/types.js.map +1 -0
- package/dist/lib/database-service/connection-pool-manager.js +2 -1
- package/dist/lib/database-service/connection-pool-manager.js.map +1 -1
- package/dist/orchestrator/index.js +10 -0
- package/dist/orchestrator/index.js.map +1 -0
- package/dist/orchestrator/orchestrate.js +496 -0
- package/dist/orchestrator/orchestrate.js.map +1 -0
- package/dist/orchestrator/types.js +58 -0
- package/dist/orchestrator/types.js.map +1 -0
- package/package.json +1 -1
- package/scripts/switch-api.sh +142 -4
- package/scripts/verify-no-secrets.sh +6 -13
- package/tests/README.md +175 -58
|
@@ -0,0 +1,587 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Waiting Coordinator
|
|
3
|
+
*
|
|
4
|
+
* Handles blocking coordination using Redis BLPOP for agents to wait
|
|
5
|
+
* for specific conditions (gate passed, consensus reached, etc).
|
|
6
|
+
*
|
|
7
|
+
* Migrated from:
|
|
8
|
+
* - invoke-waiting-mode.sh (223 lines)
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type {
|
|
12
|
+
TaskId,
|
|
13
|
+
AgentId,
|
|
14
|
+
Logger
|
|
15
|
+
} from './types';
|
|
16
|
+
import {
|
|
17
|
+
CoordinationError,
|
|
18
|
+
CoordinationErrorType,
|
|
19
|
+
isValidTaskId,
|
|
20
|
+
isValidAgentId
|
|
21
|
+
} from './types';
|
|
22
|
+
import { RedisCoordinator } from './redis-client';
|
|
23
|
+
|
|
24
|
+
export interface WaitResult {
|
|
25
|
+
condition: string;
|
|
26
|
+
met: boolean;
|
|
27
|
+
timedOut: boolean;
|
|
28
|
+
waitedMs: number;
|
|
29
|
+
metadata?: Record<string, unknown>;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface SignalResult {
|
|
33
|
+
agentId: AgentId;
|
|
34
|
+
signalType: string;
|
|
35
|
+
status: string;
|
|
36
|
+
timestamp: string;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export class WaitingCoordinator {
|
|
40
|
+
constructor(
|
|
41
|
+
private redis: RedisCoordinator,
|
|
42
|
+
private logger: Logger
|
|
43
|
+
) {}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Wait for a specific condition with BLPOP (blocking)
|
|
47
|
+
*
|
|
48
|
+
* Blocks until condition is signaled or timeout occurs.
|
|
49
|
+
* In Task Mode: Returns immediately with false
|
|
50
|
+
* In CLI Mode: Blocks on Redis list
|
|
51
|
+
*/
|
|
52
|
+
async waitForCompletion(
|
|
53
|
+
taskId: TaskId,
|
|
54
|
+
agentId: AgentId,
|
|
55
|
+
timeoutSeconds: number = 300,
|
|
56
|
+
namespace: string = 'swarm'
|
|
57
|
+
): Promise<WaitResult> {
|
|
58
|
+
// Validate inputs
|
|
59
|
+
if (!isValidTaskId(taskId)) {
|
|
60
|
+
throw new CoordinationError(
|
|
61
|
+
CoordinationErrorType.VALIDATION_ERROR,
|
|
62
|
+
`Invalid task ID: ${taskId}`
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
if (!isValidAgentId(agentId)) {
|
|
67
|
+
throw new CoordinationError(
|
|
68
|
+
CoordinationErrorType.VALIDATION_ERROR,
|
|
69
|
+
`Invalid agent ID: ${agentId}`
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const startTime = Date.now();
|
|
74
|
+
|
|
75
|
+
// Graceful no-op in Task Mode
|
|
76
|
+
if (!this.redis.canUseRedis) {
|
|
77
|
+
this.logger.info(`Task Mode: Wait for completion skipped (no Redis) - Agent: ${agentId}`);
|
|
78
|
+
return {
|
|
79
|
+
condition: 'agent-completion',
|
|
80
|
+
met: true,
|
|
81
|
+
timedOut: false,
|
|
82
|
+
waitedMs: 0
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// CLI Mode: Block on Redis list
|
|
87
|
+
const doneKey = `${namespace}:${taskId}:${agentId}:done`;
|
|
88
|
+
|
|
89
|
+
try {
|
|
90
|
+
this.logger.info(`⏳ Waiting for completion: ${agentId} (timeout: ${timeoutSeconds}s)`);
|
|
91
|
+
|
|
92
|
+
// BLPOP with timeout (Redis timeout in seconds)
|
|
93
|
+
const result = await this.redis.blpop(doneKey, timeoutSeconds);
|
|
94
|
+
|
|
95
|
+
const waitedMs = Date.now() - startTime;
|
|
96
|
+
|
|
97
|
+
if (result) {
|
|
98
|
+
this.logger.info(`✅ Agent completed: ${agentId} (waited ${waitedMs}ms)`);
|
|
99
|
+
return {
|
|
100
|
+
condition: 'agent-completion',
|
|
101
|
+
met: true,
|
|
102
|
+
timedOut: false,
|
|
103
|
+
waitedMs,
|
|
104
|
+
metadata: { signal: result[1] }
|
|
105
|
+
};
|
|
106
|
+
} else {
|
|
107
|
+
this.logger.warn(`⏱️ Timeout waiting for agent: ${agentId} (${timeoutSeconds}s)`);
|
|
108
|
+
return {
|
|
109
|
+
condition: 'agent-completion',
|
|
110
|
+
met: false,
|
|
111
|
+
timedOut: true,
|
|
112
|
+
waitedMs
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
} catch (error) {
|
|
116
|
+
this.logger.error('Failed to wait for completion', error as Error);
|
|
117
|
+
throw new CoordinationError(
|
|
118
|
+
CoordinationErrorType.REDIS_UNAVAILABLE,
|
|
119
|
+
`Failed to wait for completion: ${(error as Error).message}`
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Wait for gate to pass (test pass rate threshold)
|
|
126
|
+
*
|
|
127
|
+
* Blocks until gate-passed signal is received.
|
|
128
|
+
* In Task Mode: Returns immediately with true
|
|
129
|
+
* In CLI Mode: Blocks on Redis list
|
|
130
|
+
*/
|
|
131
|
+
async waitForGate(
|
|
132
|
+
taskId: TaskId,
|
|
133
|
+
timeoutSeconds: number = 600,
|
|
134
|
+
namespace: string = 'swarm'
|
|
135
|
+
): Promise<WaitResult> {
|
|
136
|
+
// Validate input
|
|
137
|
+
if (!isValidTaskId(taskId)) {
|
|
138
|
+
throw new CoordinationError(
|
|
139
|
+
CoordinationErrorType.VALIDATION_ERROR,
|
|
140
|
+
`Invalid task ID: ${taskId}`
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
const startTime = Date.now();
|
|
145
|
+
|
|
146
|
+
// Graceful no-op in Task Mode
|
|
147
|
+
if (!this.redis.canUseRedis) {
|
|
148
|
+
this.logger.info('Task Mode: Wait for gate skipped (no Redis)');
|
|
149
|
+
return {
|
|
150
|
+
condition: 'gate-passed',
|
|
151
|
+
met: true,
|
|
152
|
+
timedOut: false,
|
|
153
|
+
waitedMs: 0
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// CLI Mode: Block on Redis list
|
|
158
|
+
const gateKey = `${namespace}:${taskId}:gate-passed`;
|
|
159
|
+
|
|
160
|
+
try {
|
|
161
|
+
this.logger.info(`⏳ Waiting for gate to pass (timeout: ${timeoutSeconds}s)`);
|
|
162
|
+
|
|
163
|
+
// BLPOP with timeout
|
|
164
|
+
const result = await this.redis.blpop(gateKey, timeoutSeconds);
|
|
165
|
+
|
|
166
|
+
const waitedMs = Date.now() - startTime;
|
|
167
|
+
|
|
168
|
+
if (result) {
|
|
169
|
+
this.logger.info(`✅ Gate passed (waited ${waitedMs}ms)`);
|
|
170
|
+
return {
|
|
171
|
+
condition: 'gate-passed',
|
|
172
|
+
met: true,
|
|
173
|
+
timedOut: false,
|
|
174
|
+
waitedMs,
|
|
175
|
+
metadata: { signal: result[1] }
|
|
176
|
+
};
|
|
177
|
+
} else {
|
|
178
|
+
this.logger.warn(`⏱️ Timeout waiting for gate (${timeoutSeconds}s)`);
|
|
179
|
+
return {
|
|
180
|
+
condition: 'gate-passed',
|
|
181
|
+
met: false,
|
|
182
|
+
timedOut: true,
|
|
183
|
+
waitedMs
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
} catch (error) {
|
|
187
|
+
this.logger.error('Failed to wait for gate', error as Error);
|
|
188
|
+
throw new CoordinationError(
|
|
189
|
+
CoordinationErrorType.REDIS_UNAVAILABLE,
|
|
190
|
+
`Failed to wait for gate: ${(error as Error).message}`
|
|
191
|
+
);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Wait for consensus to be reached from validators
|
|
197
|
+
*
|
|
198
|
+
* Blocks until consensus signal is received.
|
|
199
|
+
* In Task Mode: Returns immediately with true
|
|
200
|
+
* In CLI Mode: Blocks on Redis list
|
|
201
|
+
*/
|
|
202
|
+
async waitForConsensus(
|
|
203
|
+
taskId: TaskId,
|
|
204
|
+
timeoutSeconds: number = 600,
|
|
205
|
+
namespace: string = 'swarm'
|
|
206
|
+
): Promise<WaitResult> {
|
|
207
|
+
// Validate input
|
|
208
|
+
if (!isValidTaskId(taskId)) {
|
|
209
|
+
throw new CoordinationError(
|
|
210
|
+
CoordinationErrorType.VALIDATION_ERROR,
|
|
211
|
+
`Invalid task ID: ${taskId}`
|
|
212
|
+
);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
const startTime = Date.now();
|
|
216
|
+
|
|
217
|
+
// Graceful no-op in Task Mode
|
|
218
|
+
if (!this.redis.canUseRedis) {
|
|
219
|
+
this.logger.info('Task Mode: Wait for consensus skipped (no Redis)');
|
|
220
|
+
return {
|
|
221
|
+
condition: 'consensus-reached',
|
|
222
|
+
met: true,
|
|
223
|
+
timedOut: false,
|
|
224
|
+
waitedMs: 0
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
// CLI Mode: Block on Redis list
|
|
229
|
+
const consensusKey = `${namespace}:${taskId}:consensus-reached`;
|
|
230
|
+
|
|
231
|
+
try {
|
|
232
|
+
this.logger.info(`⏳ Waiting for consensus (timeout: ${timeoutSeconds}s)`);
|
|
233
|
+
|
|
234
|
+
// BLPOP with timeout
|
|
235
|
+
const result = await this.redis.blpop(consensusKey, timeoutSeconds);
|
|
236
|
+
|
|
237
|
+
const waitedMs = Date.now() - startTime;
|
|
238
|
+
|
|
239
|
+
if (result) {
|
|
240
|
+
this.logger.info(`✅ Consensus reached (waited ${waitedMs}ms)`);
|
|
241
|
+
return {
|
|
242
|
+
condition: 'consensus-reached',
|
|
243
|
+
met: true,
|
|
244
|
+
timedOut: false,
|
|
245
|
+
waitedMs,
|
|
246
|
+
metadata: { signal: result[1] }
|
|
247
|
+
};
|
|
248
|
+
} else {
|
|
249
|
+
this.logger.warn(`⏱️ Timeout waiting for consensus (${timeoutSeconds}s)`);
|
|
250
|
+
return {
|
|
251
|
+
condition: 'consensus-reached',
|
|
252
|
+
met: false,
|
|
253
|
+
timedOut: true,
|
|
254
|
+
waitedMs
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
} catch (error) {
|
|
258
|
+
this.logger.error('Failed to wait for consensus', error as Error);
|
|
259
|
+
throw new CoordinationError(
|
|
260
|
+
CoordinationErrorType.REDIS_UNAVAILABLE,
|
|
261
|
+
`Failed to wait for consensus: ${(error as Error).message}`
|
|
262
|
+
);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* Wait for custom condition by key name
|
|
268
|
+
*
|
|
269
|
+
* Generic wait mechanism for any condition.
|
|
270
|
+
* In Task Mode: Returns immediately with true
|
|
271
|
+
* In CLI Mode: Blocks on Redis list
|
|
272
|
+
*/
|
|
273
|
+
async waitForCondition(
|
|
274
|
+
taskId: TaskId,
|
|
275
|
+
conditionName: string,
|
|
276
|
+
timeoutSeconds: number = 300,
|
|
277
|
+
namespace: string = 'swarm'
|
|
278
|
+
): Promise<WaitResult> {
|
|
279
|
+
// Validate input
|
|
280
|
+
if (!isValidTaskId(taskId)) {
|
|
281
|
+
throw new CoordinationError(
|
|
282
|
+
CoordinationErrorType.VALIDATION_ERROR,
|
|
283
|
+
`Invalid task ID: ${taskId}`
|
|
284
|
+
);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
if (!conditionName || conditionName.length === 0) {
|
|
288
|
+
throw new CoordinationError(
|
|
289
|
+
CoordinationErrorType.VALIDATION_ERROR,
|
|
290
|
+
'Condition name cannot be empty'
|
|
291
|
+
);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
const startTime = Date.now();
|
|
295
|
+
|
|
296
|
+
// Graceful no-op in Task Mode
|
|
297
|
+
if (!this.redis.canUseRedis) {
|
|
298
|
+
this.logger.info(`Task Mode: Wait for condition skipped (no Redis) - ${conditionName}`);
|
|
299
|
+
return {
|
|
300
|
+
condition: conditionName,
|
|
301
|
+
met: true,
|
|
302
|
+
timedOut: false,
|
|
303
|
+
waitedMs: 0
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
// CLI Mode: Block on Redis list
|
|
308
|
+
const conditionKey = `${namespace}:${taskId}:${conditionName}`;
|
|
309
|
+
|
|
310
|
+
try {
|
|
311
|
+
this.logger.info(`⏳ Waiting for condition: ${conditionName} (timeout: ${timeoutSeconds}s)`);
|
|
312
|
+
|
|
313
|
+
// BLPOP with timeout
|
|
314
|
+
const result = await this.redis.blpop(conditionKey, timeoutSeconds);
|
|
315
|
+
|
|
316
|
+
const waitedMs = Date.now() - startTime;
|
|
317
|
+
|
|
318
|
+
if (result) {
|
|
319
|
+
this.logger.info(`✅ Condition met: ${conditionName} (waited ${waitedMs}ms)`);
|
|
320
|
+
return {
|
|
321
|
+
condition: conditionName,
|
|
322
|
+
met: true,
|
|
323
|
+
timedOut: false,
|
|
324
|
+
waitedMs,
|
|
325
|
+
metadata: { signal: result[1] }
|
|
326
|
+
};
|
|
327
|
+
} else {
|
|
328
|
+
this.logger.warn(`⏱️ Timeout waiting for condition: ${conditionName} (${timeoutSeconds}s)`);
|
|
329
|
+
return {
|
|
330
|
+
condition: conditionName,
|
|
331
|
+
met: false,
|
|
332
|
+
timedOut: true,
|
|
333
|
+
waitedMs
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
} catch (error) {
|
|
337
|
+
this.logger.error('Failed to wait for condition', error as Error);
|
|
338
|
+
throw new CoordinationError(
|
|
339
|
+
CoordinationErrorType.REDIS_UNAVAILABLE,
|
|
340
|
+
`Failed to wait for condition ${conditionName}: ${(error as Error).message}`
|
|
341
|
+
);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
/**
|
|
346
|
+
* Signal a condition to wake waiting agents
|
|
347
|
+
*
|
|
348
|
+
* In Task Mode: Logs and returns gracefully
|
|
349
|
+
* In CLI Mode: Pushes signal to Redis list
|
|
350
|
+
*/
|
|
351
|
+
async signalCondition(
|
|
352
|
+
taskId: TaskId,
|
|
353
|
+
conditionName: string,
|
|
354
|
+
metadata?: Record<string, unknown>,
|
|
355
|
+
namespace: string = 'swarm'
|
|
356
|
+
): Promise<SignalResult> {
|
|
357
|
+
// Validate input
|
|
358
|
+
if (!isValidTaskId(taskId)) {
|
|
359
|
+
throw new CoordinationError(
|
|
360
|
+
CoordinationErrorType.VALIDATION_ERROR,
|
|
361
|
+
`Invalid task ID: ${taskId}`
|
|
362
|
+
);
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
if (!conditionName || conditionName.length === 0) {
|
|
366
|
+
throw new CoordinationError(
|
|
367
|
+
CoordinationErrorType.VALIDATION_ERROR,
|
|
368
|
+
'Condition name cannot be empty'
|
|
369
|
+
);
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
const timestamp = new Date().toISOString();
|
|
373
|
+
|
|
374
|
+
// Graceful no-op in Task Mode
|
|
375
|
+
if (!this.redis.canUseRedis) {
|
|
376
|
+
this.logger.info(`Task Mode: Condition signal skipped (no Redis) - ${conditionName}`);
|
|
377
|
+
return {
|
|
378
|
+
agentId: 'orchestrator' as AgentId,
|
|
379
|
+
signalType: conditionName,
|
|
380
|
+
status: 'signaled',
|
|
381
|
+
timestamp
|
|
382
|
+
};
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
// CLI Mode: Push signal to Redis
|
|
386
|
+
const conditionKey = `${namespace}:${taskId}:${conditionName}`;
|
|
387
|
+
|
|
388
|
+
try {
|
|
389
|
+
const payload = JSON.stringify({
|
|
390
|
+
conditionName,
|
|
391
|
+
timestamp,
|
|
392
|
+
metadata: metadata || {}
|
|
393
|
+
});
|
|
394
|
+
|
|
395
|
+
await this.redis.lpush(conditionKey, payload);
|
|
396
|
+
|
|
397
|
+
// Set TTL (1 hour - long enough for agents to see it)
|
|
398
|
+
await this.redis.expire(conditionKey, 3600);
|
|
399
|
+
|
|
400
|
+
this.logger.info(`✅ Signal sent: ${conditionName}`);
|
|
401
|
+
|
|
402
|
+
return {
|
|
403
|
+
agentId: 'orchestrator' as AgentId,
|
|
404
|
+
signalType: conditionName,
|
|
405
|
+
status: 'signaled',
|
|
406
|
+
timestamp
|
|
407
|
+
};
|
|
408
|
+
} catch (error) {
|
|
409
|
+
this.logger.error('Failed to signal condition', error as Error);
|
|
410
|
+
throw new CoordinationError(
|
|
411
|
+
CoordinationErrorType.REDIS_UNAVAILABLE,
|
|
412
|
+
`Failed to signal condition ${conditionName}: ${(error as Error).message}`
|
|
413
|
+
);
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
/**
|
|
418
|
+
* Wait for multiple agents to complete with parallel blocking
|
|
419
|
+
*
|
|
420
|
+
* In Task Mode: Returns immediately
|
|
421
|
+
* In CLI Mode: Blocks on multiple agent done keys
|
|
422
|
+
*/
|
|
423
|
+
async waitForMultipleAgents(
|
|
424
|
+
taskId: TaskId,
|
|
425
|
+
agentIds: AgentId[],
|
|
426
|
+
timeoutSeconds: number = 600,
|
|
427
|
+
namespace: string = 'swarm'
|
|
428
|
+
): Promise<{
|
|
429
|
+
completed: AgentId[];
|
|
430
|
+
timedOut: boolean;
|
|
431
|
+
waitedMs: number;
|
|
432
|
+
}> {
|
|
433
|
+
// Validate input
|
|
434
|
+
if (!isValidTaskId(taskId)) {
|
|
435
|
+
throw new CoordinationError(
|
|
436
|
+
CoordinationErrorType.VALIDATION_ERROR,
|
|
437
|
+
`Invalid task ID: ${taskId}`
|
|
438
|
+
);
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
if (!agentIds || agentIds.length === 0) {
|
|
442
|
+
throw new CoordinationError(
|
|
443
|
+
CoordinationErrorType.VALIDATION_ERROR,
|
|
444
|
+
'Agent IDs list cannot be empty'
|
|
445
|
+
);
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
// Graceful no-op in Task Mode
|
|
449
|
+
if (!this.redis.canUseRedis) {
|
|
450
|
+
this.logger.info('Task Mode: Wait for multiple agents skipped (no Redis)');
|
|
451
|
+
return {
|
|
452
|
+
completed: agentIds,
|
|
453
|
+
timedOut: false,
|
|
454
|
+
waitedMs: 0
|
|
455
|
+
};
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
const startTime = Date.now();
|
|
459
|
+
const completed: AgentId[] = [];
|
|
460
|
+
const keys = agentIds.map(id => `${namespace}:${taskId}:${id}:done`);
|
|
461
|
+
|
|
462
|
+
try {
|
|
463
|
+
this.logger.info(`⏳ Waiting for ${agentIds.length} agents to complete (timeout: ${timeoutSeconds}s)`);
|
|
464
|
+
|
|
465
|
+
while (completed.length < agentIds.length) {
|
|
466
|
+
const waitedMs = Date.now() - startTime;
|
|
467
|
+
|
|
468
|
+
// Check timeout
|
|
469
|
+
if (waitedMs / 1000 >= timeoutSeconds) {
|
|
470
|
+
this.logger.warn(`⏱️ Timeout waiting for agents to complete`);
|
|
471
|
+
return {
|
|
472
|
+
completed,
|
|
473
|
+
timedOut: true,
|
|
474
|
+
waitedMs
|
|
475
|
+
};
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
// Calculate remaining timeout for BLPOP
|
|
479
|
+
const remainingSeconds = timeoutSeconds - (waitedMs / 1000);
|
|
480
|
+
|
|
481
|
+
// BLPOP on all remaining keys
|
|
482
|
+
const pendingKeys = agentIds
|
|
483
|
+
.filter(id => !completed.includes(id))
|
|
484
|
+
.map(id => `${namespace}:${taskId}:${id}:done`);
|
|
485
|
+
|
|
486
|
+
if (pendingKeys.length === 0) break;
|
|
487
|
+
|
|
488
|
+
// BLPOP returns [key, value] or null
|
|
489
|
+
const blpopArgs: Array<string | number> = [...pendingKeys, Math.ceil(remainingSeconds)];
|
|
490
|
+
const result = await this.redis.blpop(...blpopArgs);
|
|
491
|
+
|
|
492
|
+
if (result) {
|
|
493
|
+
const key = result[0];
|
|
494
|
+
// Extract agent ID from key: "namespace:taskId:agentId:done"
|
|
495
|
+
const agentId = key.split(':')[2] as AgentId;
|
|
496
|
+
if (!completed.includes(agentId)) {
|
|
497
|
+
completed.push(agentId);
|
|
498
|
+
this.logger.info(`✅ Agent completed: ${agentId}`);
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
const waitedMs = Date.now() - startTime;
|
|
504
|
+
this.logger.info(`✅ All agents completed (waited ${waitedMs}ms)`);
|
|
505
|
+
|
|
506
|
+
return {
|
|
507
|
+
completed,
|
|
508
|
+
timedOut: false,
|
|
509
|
+
waitedMs
|
|
510
|
+
};
|
|
511
|
+
} catch (error) {
|
|
512
|
+
this.logger.error('Failed to wait for multiple agents', error as Error);
|
|
513
|
+
throw new CoordinationError(
|
|
514
|
+
CoordinationErrorType.REDIS_UNAVAILABLE,
|
|
515
|
+
`Failed to wait for multiple agents: ${(error as Error).message}`
|
|
516
|
+
);
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
/**
|
|
521
|
+
* Poll for condition (non-blocking alternative to BLPOP)
|
|
522
|
+
*
|
|
523
|
+
* Useful when you can't use BLPOP (Task Mode stubbing issues).
|
|
524
|
+
*/
|
|
525
|
+
async pollForCondition(
|
|
526
|
+
taskId: TaskId,
|
|
527
|
+
conditionName: string,
|
|
528
|
+
timeoutSeconds: number = 300,
|
|
529
|
+
pollIntervalMs: number = 1000,
|
|
530
|
+
namespace: string = 'swarm'
|
|
531
|
+
): Promise<WaitResult> {
|
|
532
|
+
// Validate input
|
|
533
|
+
if (!isValidTaskId(taskId)) {
|
|
534
|
+
throw new CoordinationError(
|
|
535
|
+
CoordinationErrorType.VALIDATION_ERROR,
|
|
536
|
+
`Invalid task ID: ${taskId}`
|
|
537
|
+
);
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
const startTime = Date.now();
|
|
541
|
+
const conditionKey = `${namespace}:${taskId}:${conditionName}`;
|
|
542
|
+
|
|
543
|
+
try {
|
|
544
|
+
this.logger.info(
|
|
545
|
+
`⏳ Polling for condition: ${conditionName} (timeout: ${timeoutSeconds}s, poll interval: ${pollIntervalMs}ms)`
|
|
546
|
+
);
|
|
547
|
+
|
|
548
|
+
while (true) {
|
|
549
|
+
const waitedMs = Date.now() - startTime;
|
|
550
|
+
|
|
551
|
+
// Check timeout
|
|
552
|
+
if (waitedMs / 1000 >= timeoutSeconds) {
|
|
553
|
+
this.logger.warn(`⏱️ Timeout polling for condition: ${conditionName}`);
|
|
554
|
+
return {
|
|
555
|
+
condition: conditionName,
|
|
556
|
+
met: false,
|
|
557
|
+
timedOut: true,
|
|
558
|
+
waitedMs
|
|
559
|
+
};
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
// Check condition
|
|
563
|
+
if (this.redis.canUseRedis) {
|
|
564
|
+
const result = await this.redis.get(conditionKey);
|
|
565
|
+
if (result && result === 'true') {
|
|
566
|
+
this.logger.info(`✅ Condition met via polling: ${conditionName}`);
|
|
567
|
+
return {
|
|
568
|
+
condition: conditionName,
|
|
569
|
+
met: true,
|
|
570
|
+
timedOut: false,
|
|
571
|
+
waitedMs
|
|
572
|
+
};
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
// Wait before next poll
|
|
577
|
+
await new Promise(resolve => setTimeout(resolve, pollIntervalMs));
|
|
578
|
+
}
|
|
579
|
+
} catch (error) {
|
|
580
|
+
this.logger.error('Failed to poll for condition', error as Error);
|
|
581
|
+
throw new CoordinationError(
|
|
582
|
+
CoordinationErrorType.REDIS_UNAVAILABLE,
|
|
583
|
+
`Failed to poll for condition ${conditionName}: ${(error as Error).message}`
|
|
584
|
+
);
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Test to detect connection attempts during mode detection
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
// Track network activity
|
|
8
|
+
let redisImportAttempts = 0;
|
|
9
|
+
let connectionAttempts = 0;
|
|
10
|
+
|
|
11
|
+
// Intercept require to track Redis module usage
|
|
12
|
+
const Module = require('module');
|
|
13
|
+
const originalRequire = Module.prototype.require;
|
|
14
|
+
|
|
15
|
+
Module.prototype.require = function(id) {
|
|
16
|
+
if (id === 'ioredis') {
|
|
17
|
+
redisImportAttempts++;
|
|
18
|
+
console.log(`🔍 Redis module import attempt #${redisImportAttempts}`);
|
|
19
|
+
}
|
|
20
|
+
return originalRequire.apply(this, arguments);
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
async function testConnectionAttempts() {
|
|
24
|
+
console.log('🔍 Testing Connection Attempts in Task Mode');
|
|
25
|
+
console.log('='.repeat(50));
|
|
26
|
+
|
|
27
|
+
// Test 1: Mode detection (this may trigger Redis availability check)
|
|
28
|
+
console.log('\n📍 1. Testing mode detection (may trigger Redis check):');
|
|
29
|
+
|
|
30
|
+
process.env.CFN_MODE = 'task';
|
|
31
|
+
|
|
32
|
+
const { detectMode } = require('./dist/mode-detector.js');
|
|
33
|
+
const detection = await detectMode();
|
|
34
|
+
|
|
35
|
+
console.log('Mode detection result:', detection);
|
|
36
|
+
console.log('Redis module imports during detection:', redisImportAttempts);
|
|
37
|
+
|
|
38
|
+
// Test 2: Redis coordinator initialization
|
|
39
|
+
console.log('\n📍 2. Testing Redis coordinator initialization:');
|
|
40
|
+
|
|
41
|
+
const { RedisCoordinator } = require('./dist/redis-client.js');
|
|
42
|
+
const coordinator = new RedisCoordinator();
|
|
43
|
+
|
|
44
|
+
const preInitImports = redisImportAttempts;
|
|
45
|
+
await coordinator.initialize();
|
|
46
|
+
|
|
47
|
+
console.log('Redis module imports during init:', redisImportAttempts - preInitImports);
|
|
48
|
+
console.log('Coordinator has client:', !!coordinator.client);
|
|
49
|
+
console.log('Can use Redis:', coordinator.canUseRedis);
|
|
50
|
+
|
|
51
|
+
// Test 3: Attempt some operations
|
|
52
|
+
console.log('\n📍 3. Testing Redis operations:');
|
|
53
|
+
|
|
54
|
+
const preOpImports = redisImportAttempts;
|
|
55
|
+
await coordinator.ping();
|
|
56
|
+
await coordinator.set('test', 'value');
|
|
57
|
+
await coordinator.get('test');
|
|
58
|
+
|
|
59
|
+
console.log('Redis module imports during operations:', redisImportAttempts - preOpImports);
|
|
60
|
+
|
|
61
|
+
console.log('\n📊 SUMMARY:');
|
|
62
|
+
console.log('Total Redis module imports:', redisImportAttempts);
|
|
63
|
+
console.log('Connection attempts made:', connectionAttempts);
|
|
64
|
+
console.log('Any network activity detected:', redisImportAttempts > 0);
|
|
65
|
+
|
|
66
|
+
// Clean up
|
|
67
|
+
await coordinator.disconnect();
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
testConnectionAttempts().catch(console.error);
|