claude-flow-novice 2.15.11 → 2.16.1

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.
Files changed (741) hide show
  1. package/.claude/cfn-extras/agents/cfn-v3-coordinator.md +517 -0
  2. package/.claude/cfn-extras/skills/GOOGLE_SHEETS_SKILLS_README.md +1 -1
  3. package/.claude/cfn-extras/skills/google-sheets-api-coordinator/SKILL.md +1 -1
  4. package/.claude/cfn-extras/skills/google-sheets-formula-builder/SKILL.md +1 -1
  5. package/.claude/cfn-extras/skills/google-sheets-progress/SKILL.md +1 -1
  6. package/.claude/commands/CFN_LOOP_FRONTEND.md +1 -1
  7. package/.claude/commands/cfn-loop-cli.md +214 -442
  8. package/.claude/commands/cfn-loop-frontend.md +1 -1
  9. package/.claude/commands/cfn-loop-task.md +2 -2
  10. package/.claude/commands/cfn-loop-trigger.md +114 -0
  11. package/.claude/commands/deprecated/cfn-loop.md +2 -2
  12. package/.claude/hooks/cfn-invoke-post-edit-ts.sh +100 -0
  13. package/.claude/hooks/cfn-invoke-post-edit-ts.sh.backup +78 -0
  14. package/.claude/hooks/cfn-invoke-post-edit.sh +53 -5
  15. package/.claude/hooks/cfn-invoke-post-edit.sh.backup +87 -0
  16. package/.claude/hooks/cfn-invoke-pre-edit-ts.sh +116 -0
  17. package/.claude/hooks/cfn-invoke-pre-edit-ts.sh.backup +94 -0
  18. package/.claude/hooks/cfn-invoke-pre-edit.sh +22 -0
  19. package/.claude/hooks/cfn-invoke-pre-edit.sh.backup +88 -0
  20. package/.claude/hooks/cfn-post-edit.config.json +9 -2
  21. package/.claude/root-claude-distribute/CFN-CLAUDE.md +1 -1
  22. package/.claude/skills/cfn-agent-spawning/SKILL.md +48 -1
  23. package/.claude/skills/cfn-agent-spawning/SKILL.md.backup +135 -0
  24. package/.claude/skills/cfn-agent-spawning/TYPESCRIPT_MIGRATION.md +567 -0
  25. package/.claude/skills/cfn-agent-spawning/check-dependencies.sh +22 -0
  26. package/.claude/skills/{cfn-redis-coordination/check-dependencies.sh → cfn-agent-spawning/check-dependencies.sh.backup} +3 -5
  27. package/.claude/skills/cfn-agent-spawning/get-agent-provider-env.sh +22 -0
  28. package/.claude/skills/cfn-agent-spawning/get-agent-provider-env.sh.backup +127 -0
  29. package/.claude/skills/cfn-agent-spawning/parse-agent-provider.sh +22 -0
  30. package/.claude/skills/cfn-agent-spawning/parse-agent-provider.sh.backup +59 -0
  31. package/.claude/skills/cfn-agent-spawning/spawn-agent-wrapper.sh +63 -0
  32. package/.claude/skills/cfn-agent-spawning/spawn-agent-wrapper.sh.backup +41 -0
  33. package/.claude/skills/cfn-agent-spawning/spawn-agent.sh +26 -1
  34. package/.claude/skills/cfn-agent-spawning/spawn-templates.sh +22 -0
  35. package/.claude/skills/cfn-agent-spawning/spawn-templates.sh.backup +613 -0
  36. package/.claude/skills/cfn-agent-spawning/spawn-worker.sh +22 -0
  37. package/.claude/skills/cfn-agent-spawning/spawn-worker.sh.backup +176 -0
  38. package/.claude/skills/cfn-backlog-management/SKILL.md +1 -1
  39. package/.claude/skills/cfn-loop-orchestration/.backups/unknown/1763619700_33aff4a69b99159e4e849107ebc4d09f/metadata.json +8 -0
  40. package/.claude/skills/cfn-loop-orchestration/.backups/unknown/1763619700_33aff4a69b99159e4e849107ebc4d09f/original +271 -0
  41. package/.claude/skills/cfn-loop-orchestration/.backups/unknown/1763619700_33aff4a69b99159e4e849107ebc4d09f/revert.sh +7 -0
  42. package/.claude/skills/cfn-loop-orchestration/.backups/unknown/1763671642_06496e8c399a79db08167cc00ed4b31e/metadata.json +8 -0
  43. package/.claude/skills/cfn-loop-orchestration/.backups/unknown/1763671642_06496e8c399a79db08167cc00ed4b31e/original +325 -0
  44. package/.claude/skills/cfn-loop-orchestration/.backups/unknown/1763671642_06496e8c399a79db08167cc00ed4b31e/revert.sh +7 -0
  45. package/.claude/skills/cfn-loop-orchestration/CLI_IMPLEMENTATION_SUMMARY.md +330 -0
  46. package/.claude/skills/cfn-loop-orchestration/CONFIGURATION_IMPROVEMENTS.md +318 -0
  47. package/.claude/skills/cfn-loop-orchestration/CONTEXT_LOOKUP_MIGRATION.md +308 -0
  48. package/.claude/skills/cfn-loop-orchestration/CONTEXT_LOOKUP_QUICK_START.md +378 -0
  49. package/.claude/skills/cfn-loop-orchestration/E2E_VALIDATION_REPORT.md +262 -0
  50. package/.claude/skills/cfn-loop-orchestration/IMPLEMENTATION_SUMMARY.md +319 -519
  51. package/.claude/skills/cfn-loop-orchestration/NORTH_STAR_E2E_REPORT.md +299 -0
  52. package/.claude/skills/cfn-loop-orchestration/NORTH_STAR_EXECUTION_SUMMARY.md +403 -0
  53. package/.claude/skills/cfn-loop-orchestration/NORTH_STAR_INDEX.md +323 -0
  54. package/.claude/skills/cfn-loop-orchestration/SKILL.md +159 -48
  55. package/.claude/skills/cfn-loop-orchestration/SPAWN_AGENTS_IMPLEMENTATION.md +188 -0
  56. package/.claude/skills/cfn-loop-orchestration/TEST_COVERAGE_REPORT.md +335 -0
  57. package/.claude/skills/cfn-loop-orchestration/TEST_COVERAGE_SUMMARY.md +456 -0
  58. package/.claude/skills/cfn-loop-orchestration/TYPESCRIPT_INTEGRATION_REPORT.md +709 -0
  59. package/.claude/skills/cfn-loop-orchestration/TYPESCRIPT_INTEGRATION_SUMMARY.md +257 -0
  60. package/.claude/skills/cfn-loop-orchestration/VALIDATION_REPORT.md +572 -0
  61. package/.claude/skills/cfn-loop-orchestration/VALIDATION_SUMMARY.txt +196 -0
  62. package/.claude/skills/cfn-loop-orchestration/VALIDATOR_MODULE_GUIDE.md +526 -0
  63. package/.claude/skills/cfn-loop-orchestration/archive/legacy-bash/README.md +167 -0
  64. package/.claude/skills/cfn-loop-orchestration/archive/legacy-bash/orchestrate-enhanced.sh +548 -0
  65. package/.claude/skills/cfn-loop-orchestration/{orchestrate-wrapper.sh → archive/legacy-bash/orchestrate-wrapper.sh} +11 -1
  66. package/.claude/skills/cfn-loop-orchestration/archive/legacy-bash/orchestrate.sh +182 -0
  67. package/.claude/skills/cfn-loop-orchestration/e2e-validation-fixed.js +240 -0
  68. package/.claude/skills/cfn-loop-orchestration/e2e-validation.js +213 -0
  69. package/.claude/skills/cfn-loop-orchestration/package-lock.json +3 -0
  70. package/.claude/skills/cfn-loop-orchestration/package.json +4 -0
  71. package/.claude/skills/cfn-loop-orchestration/run-north-star-e2e.ts +210 -0
  72. package/.claude/skills/cfn-loop-orchestration/src/cli/orchestrator-cli.ts +396 -0
  73. package/.claude/skills/cfn-loop-orchestration/src/helpers/CONFIDENCE_AGGREGATOR.md +564 -0
  74. package/.claude/skills/cfn-loop-orchestration/src/helpers/CONFIDENCE_AGGREGATOR_QUICK_REF.md +241 -0
  75. package/.claude/skills/cfn-loop-orchestration/src/helpers/CONTEXT_INJECTOR_IMPLEMENTATION.md +375 -0
  76. package/.claude/skills/cfn-loop-orchestration/src/helpers/CONTEXT_INJECTOR_QUICK_REFERENCE.md +362 -0
  77. package/.claude/skills/cfn-loop-orchestration/src/helpers/CONTEXT_INJECTOR_README.md +307 -0
  78. package/.claude/skills/cfn-loop-orchestration/src/helpers/CONTEXT_INJECTOR_USAGE_GUIDE.md +508 -0
  79. package/.claude/skills/cfn-loop-orchestration/src/helpers/confidence-aggregator.ts +473 -0
  80. package/.claude/skills/cfn-loop-orchestration/src/helpers/consensus.ts +1 -1
  81. package/.claude/skills/cfn-loop-orchestration/src/helpers/context-injector.ts +349 -0
  82. package/.claude/skills/cfn-loop-orchestration/src/helpers/context-lookup.ts +486 -0
  83. package/.claude/skills/cfn-loop-orchestration/src/helpers/deliverable-verifier.ts +6 -2
  84. package/.claude/skills/cfn-loop-orchestration/src/helpers/gate-check.ts +1 -1
  85. package/.claude/skills/cfn-loop-orchestration/src/helpers/product-owner-decision.ts +316 -0
  86. package/.claude/skills/cfn-loop-orchestration/src/helpers/spawn-agents.ts +357 -0
  87. package/.claude/skills/cfn-loop-orchestration/src/helpers/validator.ts +276 -0
  88. package/.claude/skills/cfn-loop-orchestration/src/index.ts +2 -0
  89. package/.claude/skills/cfn-loop-orchestration/src/orchestrate.ts +743 -2
  90. package/.claude/skills/cfn-loop-orchestration/src/types.ts +56 -0
  91. package/.claude/skills/cfn-loop-orchestration/test-cli.sh +92 -0
  92. package/.claude/skills/cfn-loop-orchestration/test-typescript-integration.sh +442 -0
  93. package/.claude/skills/cfn-loop-orchestration/tests/agent-spawner.test.ts +124 -0
  94. package/.claude/skills/cfn-loop-orchestration/tests/confidence-aggregator.test.ts +604 -0
  95. package/.claude/skills/cfn-loop-orchestration/tests/context-injector.test.ts +561 -0
  96. package/.claude/skills/cfn-loop-orchestration/tests/context-lookup.test.ts +661 -0
  97. package/.claude/skills/cfn-loop-orchestration/tests/deliverable-verifier.test.ts +2 -2
  98. package/.claude/skills/cfn-loop-orchestration/tests/gate-check-edge-cases.test.ts +422 -0
  99. package/.claude/skills/cfn-loop-orchestration/tests/gate-checker.test.ts +276 -0
  100. package/.claude/skills/cfn-loop-orchestration/tests/logger.test.ts +291 -0
  101. package/.claude/skills/cfn-loop-orchestration/tests/north-star-e2e.test.ts +334 -0
  102. package/.claude/skills/cfn-loop-orchestration/tests/redis-coordinator.test.ts +321 -0
  103. package/.claude/skills/cfn-loop-orchestration/tests/spawn-agents.test.ts +284 -0
  104. package/.claude/skills/cfn-loop-orchestration/tests/validator.test.ts +643 -0
  105. package/.claude/skills/cfn-loop-validation/IMPLEMENTATION_SUMMARY.md +672 -0
  106. package/.claude/skills/cfn-loop-validation/INDEX.md +531 -0
  107. package/.claude/skills/cfn-loop-validation/README_TYPESCRIPT.md +454 -0
  108. package/.claude/skills/cfn-loop-validation/SKILL.md +48 -1
  109. package/.claude/skills/cfn-loop-validation/SKILL.md.backup +353 -0
  110. package/.claude/skills/cfn-loop-validation/SKILL_TYPESCRIPT.md +782 -0
  111. package/.claude/skills/cfn-loop-validation/VAPOR_DETECTION_EXAMPLES.md +598 -0
  112. package/.claude/skills/cfn-loop-validation/check-dependencies.sh +22 -0
  113. package/{claude-assets/skills/cfn-redis-coordination/check-dependencies.sh → .claude/skills/cfn-loop-validation/check-dependencies.sh.backup} +4 -5
  114. package/.claude/skills/cfn-loop-validation/detect-vapor.sh +59 -0
  115. package/.claude/skills/cfn-loop-validation/detect-vapor.sh.backup +37 -0
  116. package/.claude/skills/cfn-loop-validation/dist/.tsbuildinfo +1 -0
  117. package/.claude/skills/cfn-loop-validation/dist/cli/detect-vapor.d.ts +14 -0
  118. package/.claude/skills/cfn-loop-validation/dist/cli/detect-vapor.d.ts.map +1 -0
  119. package/.claude/skills/cfn-loop-validation/dist/cli/detect-vapor.js +185 -0
  120. package/.claude/skills/cfn-loop-validation/dist/cli/detect-vapor.js.map +1 -0
  121. package/.claude/skills/cfn-loop-validation/dist/cli/validate-deliverables.d.ts +14 -0
  122. package/.claude/skills/cfn-loop-validation/dist/cli/validate-deliverables.d.ts.map +1 -0
  123. package/.claude/skills/cfn-loop-validation/dist/cli/validate-deliverables.js +176 -0
  124. package/.claude/skills/cfn-loop-validation/dist/cli/validate-deliverables.js.map +1 -0
  125. package/.claude/skills/cfn-loop-validation/dist/cli/validate-gate.d.ts +19 -0
  126. package/.claude/skills/cfn-loop-validation/dist/cli/validate-gate.d.ts.map +1 -0
  127. package/.claude/skills/cfn-loop-validation/dist/cli/validate-gate.js +123 -0
  128. package/.claude/skills/cfn-loop-validation/dist/cli/validate-gate.js.map +1 -0
  129. package/.claude/skills/cfn-loop-validation/dist/types.d.ts +156 -0
  130. package/.claude/skills/cfn-loop-validation/dist/types.d.ts.map +1 -0
  131. package/.claude/skills/cfn-loop-validation/dist/types.js +66 -0
  132. package/.claude/skills/cfn-loop-validation/dist/types.js.map +1 -0
  133. package/.claude/skills/cfn-loop-validation/dist/validator.d.ts +85 -0
  134. package/.claude/skills/cfn-loop-validation/dist/validator.d.ts.map +1 -0
  135. package/.claude/skills/cfn-loop-validation/dist/validator.js +411 -0
  136. package/.claude/skills/cfn-loop-validation/dist/validator.js.map +1 -0
  137. package/.claude/skills/cfn-loop-validation/orchestrate-cfn-loop.sh +22 -0
  138. package/.claude/skills/cfn-loop-validation/orchestrate-cfn-loop.sh.backup +252 -0
  139. package/.claude/skills/cfn-loop-validation/package.json +93 -0
  140. package/.claude/skills/cfn-loop-validation/src/cli/detect-vapor.ts +177 -0
  141. package/.claude/skills/cfn-loop-validation/src/cli/validate-deliverables.ts +161 -0
  142. package/.claude/skills/cfn-loop-validation/src/cli/validate-gate.ts +139 -0
  143. package/.claude/skills/cfn-loop-validation/src/types.ts +215 -0
  144. package/.claude/skills/cfn-loop-validation/src/validator.ts +503 -0
  145. package/.claude/skills/cfn-loop-validation/tests/validator.test.ts +537 -0
  146. package/.claude/skills/{cfn-redis-coordination → cfn-loop-validation}/tsconfig.json +34 -31
  147. package/.claude/skills/cfn-loop-validation/validate-deliverables.sh +59 -0
  148. package/.claude/skills/cfn-loop-validation/validate-deliverables.sh.backup +37 -0
  149. package/.claude/skills/cfn-loop-validation/validate-gate.sh +63 -0
  150. package/.claude/skills/cfn-loop-validation/validate-gate.sh.backup +41 -0
  151. package/.claude/skills/cfn-loop-validation/validate-iteration.sh +22 -0
  152. package/.claude/skills/cfn-loop-validation/validate-iteration.sh.backup +134 -0
  153. package/.claude/skills/cfn-product-owner-decision/SKILL.md +479 -147
  154. package/.claude/skills/cfn-product-owner-decision/TYPESCRIPT_IMPLEMENTATION.md +653 -0
  155. package/.claude/skills/cfn-product-owner-decision/{execute-decision.sh → archive/legacy-bash/execute-decision.sh} +24 -2
  156. package/.claude/skills/pre-edit-backup/SKILL.md +324 -0
  157. package/.claude/skills/pre-edit-backup/SKILL.md.backup +277 -0
  158. package/.claude/skills/pre-edit-backup/backup.sh +22 -0
  159. package/.claude/skills/pre-edit-backup/backup.sh.backup +107 -0
  160. package/claude-assets/agents/cfn-dev-team/analysts/root-cause-analyst.md +2 -2
  161. package/claude-assets/agents/cfn-dev-team/architecture/base-template-generator.md +1 -1
  162. package/claude-assets/agents/cfn-dev-team/coordinators/cfn-frontend-coordinator.md +3 -2
  163. package/claude-assets/agents/cfn-dev-team/coordinators/consensus-builder.md +1 -0
  164. package/claude-assets/agents/cfn-dev-team/coordinators/handoff-coordinator.md +2 -1
  165. package/claude-assets/agents/cfn-dev-team/coordinators/multi-sprint-coordinator.md +1 -0
  166. package/claude-assets/agents/cfn-dev-team/dev-ops/devops-engineer.md +11 -1
  167. package/claude-assets/agents/cfn-dev-team/dev-ops/docker-specialist.md +58 -35
  168. package/claude-assets/agents/cfn-dev-team/dev-ops/github-commit-agent.md +2 -2
  169. package/claude-assets/agents/cfn-dev-team/dev-ops/kubernetes-specialist.md +47 -37
  170. package/claude-assets/agents/cfn-dev-team/developers/api-gateway-specialist.md +18 -18
  171. package/claude-assets/agents/cfn-dev-team/developers/backend-developer.md +40 -58
  172. package/claude-assets/agents/cfn-dev-team/developers/data/data-engineer.md +19 -21
  173. package/claude-assets/agents/cfn-dev-team/developers/database/database-architect.md +20 -29
  174. package/claude-assets/agents/cfn-dev-team/developers/frontend/mobile-dev.md +15 -19
  175. package/claude-assets/agents/cfn-dev-team/developers/frontend/react-frontend-engineer.md +15 -10
  176. package/claude-assets/agents/cfn-dev-team/developers/frontend/typescript-specialist.md +16 -11
  177. package/claude-assets/agents/cfn-dev-team/developers/frontend/ui-designer.md +16 -26
  178. package/claude-assets/agents/cfn-dev-team/developers/graphql-specialist.md +18 -22
  179. package/claude-assets/agents/cfn-dev-team/developers/rust-developer.md +17 -21
  180. package/claude-assets/agents/cfn-dev-team/documentation/pseudocode.md +1 -1
  181. package/claude-assets/agents/cfn-dev-team/product-owners/accessibility-advocate-persona.md +1 -1
  182. package/claude-assets/agents/cfn-dev-team/product-owners/cto-agent.md +1 -1
  183. package/claude-assets/agents/cfn-dev-team/product-owners/power-user-persona.md +1 -1
  184. package/claude-assets/agents/cfn-dev-team/product-owners/product-owner.md +1 -5
  185. package/claude-assets/agents/cfn-dev-team/reviewers/code-reviewer.md +20 -51
  186. package/claude-assets/agents/cfn-dev-team/reviewers/quality/code-quality-validator.md +22 -71
  187. package/claude-assets/agents/cfn-dev-team/reviewers/quality/perf-analyzer.md +21 -64
  188. package/claude-assets/agents/cfn-dev-team/reviewers/quality/performance-benchmarker.md +22 -67
  189. package/claude-assets/agents/cfn-dev-team/reviewers/quality/security-specialist.md +24 -68
  190. package/claude-assets/agents/cfn-dev-team/testers/api-testing-specialist.md +8 -36
  191. package/claude-assets/agents/cfn-dev-team/testers/chaos-engineering-specialist.md +9 -38
  192. package/claude-assets/agents/cfn-dev-team/testers/contract-tester.md +17 -55
  193. package/claude-assets/agents/cfn-dev-team/testers/e2e/playwright-tester.md +1 -1
  194. package/claude-assets/agents/cfn-dev-team/testers/integration-tester.md +18 -56
  195. package/claude-assets/agents/cfn-dev-team/testers/interaction-tester.md +9 -37
  196. package/claude-assets/agents/cfn-dev-team/testers/load-testing-specialist.md +18 -56
  197. package/claude-assets/agents/cfn-dev-team/testers/mutation-testing-specialist.md +18 -49
  198. package/claude-assets/agents/cfn-dev-team/testers/playwright-tester.md +8 -37
  199. package/claude-assets/agents/cfn-dev-team/testers/tester.md +7 -27
  200. package/claude-assets/agents/cfn-dev-team/testers/unit/tdd-london-unit-swarm.md +1 -1
  201. package/claude-assets/agents/cfn-dev-team/utility/agent-builder.md +11 -0
  202. package/claude-assets/agents/cfn-dev-team/utility/analyst.md +13 -29
  203. package/claude-assets/agents/cfn-dev-team/utility/claude-code-expert.md +1 -1
  204. package/claude-assets/agents/cfn-dev-team/utility/code-booster.md +13 -13
  205. package/claude-assets/agents/cfn-dev-team/utility/context-curator.md +7 -2
  206. package/claude-assets/agents/cfn-dev-team/utility/epic-creator.md +6 -11
  207. package/claude-assets/agents/cfn-dev-team/utility/memory-leak-specialist.md +121 -715
  208. package/claude-assets/agents/cfn-dev-team/utility/researcher.md +13 -22
  209. package/claude-assets/agents/cfn-dev-team/utility/z-ai-specialist.md +147 -573
  210. package/claude-assets/agents/custom/cfn-docker-expert.md +103 -0
  211. package/claude-assets/agents/custom/cfn-loops-cli-expert.md +438 -0
  212. package/claude-assets/agents/custom/cfn-redis-operations.md +529 -529
  213. package/claude-assets/agents/custom/cfn-system-expert.md +1 -1
  214. package/claude-assets/agents/custom/trigger-dev-expert.md +369 -0
  215. package/claude-assets/agents/docker-team/micro-sprint-planner.md +747 -747
  216. package/claude-assets/agents/project-only-agents/npm-package-specialist.md +1 -1
  217. package/claude-assets/cfn-extras/agents/cfn-v3-coordinator.md +517 -0
  218. package/claude-assets/cfn-extras/skills/GOOGLE_SHEETS_SKILLS_README.md +1 -1
  219. package/claude-assets/cfn-extras/skills/google-sheets-api-coordinator/SKILL.md +1 -1
  220. package/claude-assets/cfn-extras/skills/google-sheets-formula-builder/SKILL.md +1 -1
  221. package/claude-assets/cfn-extras/skills/google-sheets-progress/SKILL.md +1 -1
  222. package/claude-assets/commands/CFN_LOOP_FRONTEND.md +1 -1
  223. package/claude-assets/commands/cfn-loop-cli.md +214 -442
  224. package/claude-assets/commands/cfn-loop-frontend.md +1 -1
  225. package/claude-assets/commands/cfn-loop-task.md +2 -2
  226. package/claude-assets/commands/cfn-loop-trigger.md +114 -0
  227. package/claude-assets/commands/deprecated/cfn-loop.md +2 -2
  228. package/claude-assets/hooks/GIT-HOOKS-USAGE-EXAMPLES.md +116 -0
  229. package/claude-assets/hooks/README-GIT-HOOKS.md +443 -0
  230. package/claude-assets/hooks/SKILL.md +518 -0
  231. package/claude-assets/hooks/SKILL.md.backup +471 -0
  232. package/claude-assets/hooks/cfn-invoke-post-edit-ts.sh +100 -0
  233. package/claude-assets/hooks/cfn-invoke-post-edit-ts.sh.backup +78 -0
  234. package/claude-assets/hooks/cfn-invoke-post-edit.sh +53 -5
  235. package/claude-assets/hooks/cfn-invoke-post-edit.sh.backup +87 -0
  236. package/claude-assets/hooks/cfn-invoke-pre-edit-ts.sh +116 -0
  237. package/claude-assets/hooks/cfn-invoke-pre-edit-ts.sh.backup +94 -0
  238. package/claude-assets/hooks/cfn-invoke-pre-edit.sh +22 -0
  239. package/claude-assets/hooks/cfn-invoke-pre-edit.sh.backup +88 -0
  240. package/claude-assets/hooks/cfn-post-edit.config.json +9 -2
  241. package/claude-assets/hooks/install-git-hooks.sh +243 -0
  242. package/claude-assets/hooks/subagent-start.sh +98 -0
  243. package/claude-assets/hooks/subagent-stop.sh +93 -0
  244. package/claude-assets/hooks/validators/credential-scanner.sh +172 -0
  245. package/claude-assets/root-claude-distribute/CFN-CLAUDE.md +1 -1
  246. package/claude-assets/skills/cfn-agent-selection-with-fallback/DELIVERABLES.md +409 -0
  247. package/claude-assets/skills/cfn-agent-selection-with-fallback/IMPLEMENTATION_SUMMARY.md +396 -0
  248. package/claude-assets/skills/cfn-agent-selection-with-fallback/INTEGRATION_GUIDE.md +308 -0
  249. package/claude-assets/skills/cfn-agent-selection-with-fallback/QUICK_REFERENCE.md +239 -0
  250. package/claude-assets/skills/cfn-agent-selection-with-fallback/SKILL.md +107 -1
  251. package/claude-assets/skills/cfn-agent-selection-with-fallback/SKILL.md.backup +302 -0
  252. package/claude-assets/skills/cfn-agent-selection-with-fallback/TYPESCRIPT_MIGRATION.md +295 -0
  253. package/claude-assets/skills/cfn-agent-selection-with-fallback/dist/agent-selector.cjs +297 -0
  254. package/claude-assets/skills/cfn-agent-selection-with-fallback/dist/agent-selector.js +297 -0
  255. package/claude-assets/skills/cfn-agent-selection-with-fallback/dist/cli.cjs +96 -0
  256. package/claude-assets/skills/cfn-agent-selection-with-fallback/dist/cli.js +96 -0
  257. package/claude-assets/skills/cfn-agent-selection-with-fallback/select-agents-ts.sh +45 -0
  258. package/claude-assets/skills/cfn-agent-selection-with-fallback/select-agents-ts.sh.backup +23 -0
  259. package/claude-assets/skills/cfn-agent-selection-with-fallback/select-agents.sh +22 -0
  260. package/claude-assets/skills/cfn-agent-selection-with-fallback/select-agents.sh.backup +173 -0
  261. package/claude-assets/skills/cfn-agent-selection-with-fallback/src/agent-selector.test.ts +357 -0
  262. package/claude-assets/skills/cfn-agent-selection-with-fallback/src/agent-selector.ts +350 -0
  263. package/claude-assets/skills/cfn-agent-selection-with-fallback/src/cli.ts +74 -0
  264. package/claude-assets/skills/cfn-agent-selection-with-fallback/task-classifier.sh +22 -0
  265. package/claude-assets/skills/cfn-agent-selection-with-fallback/task-classifier.sh.backup +71 -0
  266. package/claude-assets/skills/cfn-agent-selection-with-fallback/tsconfig.json +18 -0
  267. package/claude-assets/skills/cfn-agent-spawning/SKILL.md +48 -1
  268. package/claude-assets/skills/cfn-agent-spawning/SKILL.md.backup +135 -0
  269. package/claude-assets/skills/cfn-agent-spawning/TYPESCRIPT_MIGRATION.md +567 -0
  270. package/claude-assets/skills/cfn-agent-spawning/check-dependencies.sh +22 -0
  271. package/claude-assets/skills/cfn-agent-spawning/check-dependencies.sh.backup +30 -0
  272. package/claude-assets/skills/cfn-agent-spawning/get-agent-provider-env.sh +22 -0
  273. package/claude-assets/skills/cfn-agent-spawning/get-agent-provider-env.sh.backup +127 -0
  274. package/claude-assets/skills/cfn-agent-spawning/parse-agent-provider.sh +22 -0
  275. package/claude-assets/skills/cfn-agent-spawning/parse-agent-provider.sh.backup +59 -0
  276. package/claude-assets/skills/cfn-agent-spawning/spawn-agent-wrapper.sh +63 -0
  277. package/claude-assets/skills/cfn-agent-spawning/spawn-agent-wrapper.sh.backup +41 -0
  278. package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh +26 -1
  279. package/claude-assets/skills/cfn-agent-spawning/spawn-templates.sh +22 -0
  280. package/claude-assets/skills/cfn-agent-spawning/spawn-templates.sh.backup +613 -0
  281. package/claude-assets/skills/cfn-agent-spawning/spawn-worker.sh +22 -0
  282. package/claude-assets/skills/cfn-agent-spawning/spawn-worker.sh.backup +176 -0
  283. package/claude-assets/skills/cfn-backlog-management/SKILL.md +1 -1
  284. package/claude-assets/skills/cfn-coordination/agent-completion.sh.backup +36 -0
  285. package/claude-assets/skills/cfn-coordination/coordination-signal.sh.backup +36 -0
  286. package/claude-assets/skills/cfn-coordination/coordination-wait.sh.backup +36 -0
  287. package/claude-assets/skills/cfn-dependency-ingestion/README.md +101 -0
  288. package/claude-assets/skills/cfn-dependency-ingestion/SKILL.md +397 -0
  289. package/claude-assets/skills/cfn-dependency-ingestion/build.sh +23 -0
  290. package/claude-assets/skills/cfn-dependency-ingestion/dist/ingest-dependencies.js +478 -0
  291. package/claude-assets/skills/cfn-dependency-ingestion/ingest-dependencies.sh +295 -0
  292. package/claude-assets/skills/cfn-dependency-ingestion/ingest.sh +237 -0
  293. package/claude-assets/skills/cfn-dependency-ingestion/manifests/cli-mode-dependencies.txt +73 -0
  294. package/claude-assets/skills/cfn-dependency-ingestion/manifests/shared-dependencies.txt +57 -0
  295. package/claude-assets/skills/cfn-dependency-ingestion/manifests/trigger-dev-dependencies.txt +82 -0
  296. package/claude-assets/skills/cfn-dependency-ingestion/manifests/trigger-mode-dependencies.txt +80 -0
  297. package/claude-assets/skills/cfn-dependency-ingestion/src/ingest-dependencies.ts +563 -0
  298. package/claude-assets/skills/cfn-environment-sanitization/sanitize-environment.sh +14 -4
  299. package/claude-assets/skills/cfn-loop-orchestration/.backups/unknown/1763619700_33aff4a69b99159e4e849107ebc4d09f/metadata.json +8 -0
  300. package/claude-assets/skills/cfn-loop-orchestration/.backups/unknown/1763619700_33aff4a69b99159e4e849107ebc4d09f/original +271 -0
  301. package/claude-assets/skills/cfn-loop-orchestration/.backups/unknown/1763619700_33aff4a69b99159e4e849107ebc4d09f/revert.sh +7 -0
  302. package/claude-assets/skills/cfn-loop-orchestration/.backups/unknown/1763671642_06496e8c399a79db08167cc00ed4b31e/metadata.json +8 -0
  303. package/claude-assets/skills/cfn-loop-orchestration/.backups/unknown/1763671642_06496e8c399a79db08167cc00ed4b31e/original +325 -0
  304. package/claude-assets/skills/cfn-loop-orchestration/.backups/unknown/1763671642_06496e8c399a79db08167cc00ed4b31e/revert.sh +7 -0
  305. package/claude-assets/skills/cfn-loop-orchestration/CLI_IMPLEMENTATION_SUMMARY.md +330 -0
  306. package/claude-assets/skills/cfn-loop-orchestration/CONFIGURATION_IMPROVEMENTS.md +318 -0
  307. package/claude-assets/skills/cfn-loop-orchestration/CONTEXT_LOOKUP_MIGRATION.md +308 -0
  308. package/claude-assets/skills/cfn-loop-orchestration/CONTEXT_LOOKUP_QUICK_START.md +378 -0
  309. package/claude-assets/skills/cfn-loop-orchestration/E2E_VALIDATION_REPORT.md +262 -0
  310. package/claude-assets/skills/cfn-loop-orchestration/IMPLEMENTATION_SUMMARY.md +319 -519
  311. package/claude-assets/skills/cfn-loop-orchestration/NORTH_STAR_E2E_REPORT.md +299 -0
  312. package/claude-assets/skills/cfn-loop-orchestration/NORTH_STAR_EXECUTION_SUMMARY.md +403 -0
  313. package/claude-assets/skills/cfn-loop-orchestration/NORTH_STAR_INDEX.md +323 -0
  314. package/claude-assets/skills/cfn-loop-orchestration/SKILL.md +159 -48
  315. package/claude-assets/skills/cfn-loop-orchestration/SPAWN_AGENTS_IMPLEMENTATION.md +188 -0
  316. package/claude-assets/skills/cfn-loop-orchestration/TEST_COVERAGE_REPORT.md +335 -0
  317. package/claude-assets/skills/cfn-loop-orchestration/TEST_COVERAGE_SUMMARY.md +456 -0
  318. package/claude-assets/skills/cfn-loop-orchestration/TYPESCRIPT_INTEGRATION_REPORT.md +709 -0
  319. package/claude-assets/skills/cfn-loop-orchestration/TYPESCRIPT_INTEGRATION_SUMMARY.md +257 -0
  320. package/claude-assets/skills/cfn-loop-orchestration/VALIDATION_REPORT.md +572 -0
  321. package/claude-assets/skills/cfn-loop-orchestration/VALIDATION_SUMMARY.txt +196 -0
  322. package/claude-assets/skills/cfn-loop-orchestration/VALIDATOR_MODULE_GUIDE.md +526 -0
  323. package/claude-assets/skills/cfn-loop-orchestration/archive/legacy-bash/README.md +167 -0
  324. package/claude-assets/skills/cfn-loop-orchestration/archive/legacy-bash/orchestrate-enhanced.sh +548 -0
  325. package/claude-assets/skills/cfn-loop-orchestration/{orchestrate-wrapper.sh → archive/legacy-bash/orchestrate-wrapper.sh} +11 -1
  326. package/claude-assets/skills/cfn-loop-orchestration/archive/legacy-bash/orchestrate.sh +182 -0
  327. package/claude-assets/skills/cfn-loop-orchestration/e2e-validation-fixed.js +240 -0
  328. package/claude-assets/skills/cfn-loop-orchestration/e2e-validation.js +213 -0
  329. package/claude-assets/skills/cfn-loop-orchestration/package-lock.json +3 -0
  330. package/claude-assets/skills/cfn-loop-orchestration/package.json +4 -0
  331. package/claude-assets/skills/cfn-loop-orchestration/run-north-star-e2e.ts +210 -0
  332. package/claude-assets/skills/cfn-loop-orchestration/src/cli/orchestrator-cli.ts +396 -0
  333. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/CONFIDENCE_AGGREGATOR.md +564 -0
  334. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/CONFIDENCE_AGGREGATOR_QUICK_REF.md +241 -0
  335. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/CONTEXT_INJECTOR_IMPLEMENTATION.md +375 -0
  336. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/CONTEXT_INJECTOR_QUICK_REFERENCE.md +362 -0
  337. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/CONTEXT_INJECTOR_README.md +307 -0
  338. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/CONTEXT_INJECTOR_USAGE_GUIDE.md +508 -0
  339. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/confidence-aggregator.ts +473 -0
  340. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/consensus.ts +1 -1
  341. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/context-injector.ts +349 -0
  342. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/context-lookup.ts +486 -0
  343. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/deliverable-verifier.ts +6 -2
  344. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/gate-check.ts +1 -1
  345. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/product-owner-decision.ts +316 -0
  346. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/spawn-agents.ts +357 -0
  347. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/validator.ts +276 -0
  348. package/claude-assets/skills/cfn-loop-orchestration/src/index.ts +2 -0
  349. package/claude-assets/skills/cfn-loop-orchestration/src/orchestrate.ts +743 -2
  350. package/claude-assets/skills/cfn-loop-orchestration/src/types.ts +56 -0
  351. package/claude-assets/skills/cfn-loop-orchestration/test-cli.sh +92 -0
  352. package/claude-assets/skills/cfn-loop-orchestration/test-typescript-integration.sh +442 -0
  353. package/claude-assets/skills/cfn-loop-orchestration/tests/agent-spawner.test.ts +124 -0
  354. package/claude-assets/skills/cfn-loop-orchestration/tests/confidence-aggregator.test.ts +604 -0
  355. package/claude-assets/skills/cfn-loop-orchestration/tests/context-injector.test.ts +561 -0
  356. package/claude-assets/skills/cfn-loop-orchestration/tests/context-lookup.test.ts +661 -0
  357. package/claude-assets/skills/cfn-loop-orchestration/tests/deliverable-verifier.test.ts +2 -2
  358. package/claude-assets/skills/cfn-loop-orchestration/tests/gate-check-edge-cases.test.ts +422 -0
  359. package/claude-assets/skills/cfn-loop-orchestration/tests/gate-checker.test.ts +276 -0
  360. package/claude-assets/skills/cfn-loop-orchestration/tests/logger.test.ts +291 -0
  361. package/claude-assets/skills/cfn-loop-orchestration/tests/north-star-e2e.test.ts +334 -0
  362. package/claude-assets/skills/cfn-loop-orchestration/tests/redis-coordinator.test.ts +321 -0
  363. package/claude-assets/skills/cfn-loop-orchestration/tests/spawn-agents.test.ts +284 -0
  364. package/claude-assets/skills/cfn-loop-orchestration/tests/validator.test.ts +643 -0
  365. package/claude-assets/skills/cfn-loop-output-processing/.eslintrc.json +33 -0
  366. package/claude-assets/skills/cfn-loop-output-processing/DELIVERY_SUMMARY.txt +462 -0
  367. package/claude-assets/skills/cfn-loop-output-processing/DEPRECATION_NOTICE.md +183 -0
  368. package/claude-assets/skills/cfn-loop-output-processing/EXAMPLES.md +609 -0
  369. package/claude-assets/skills/cfn-loop-output-processing/IMPLEMENTATION_SUMMARY.md +418 -0
  370. package/claude-assets/skills/cfn-loop-output-processing/INDEX.md +531 -0
  371. package/claude-assets/skills/cfn-loop-output-processing/MIGRATION.md +362 -0
  372. package/claude-assets/skills/cfn-loop-output-processing/README.md +114 -0
  373. package/claude-assets/skills/cfn-loop-output-processing/SKILL.md +633 -0
  374. package/{.claude/skills/cfn-docker-redis-coordination → claude-assets/skills/cfn-loop-output-processing}/jest.config.js +7 -15
  375. package/claude-assets/skills/cfn-loop-output-processing/package.json +50 -0
  376. package/claude-assets/skills/cfn-loop-output-processing/src/cli/process-loop2.ts +195 -0
  377. package/claude-assets/skills/cfn-loop-output-processing/src/cli/process-loop3.ts +157 -0
  378. package/claude-assets/skills/cfn-loop-output-processing/src/output-processor.ts +632 -0
  379. package/claude-assets/skills/cfn-loop-output-processing/tests/output-processor.test.ts +617 -0
  380. package/claude-assets/skills/{cfn-docker-redis-coordination → cfn-loop-output-processing}/tsconfig.json +16 -7
  381. package/claude-assets/skills/cfn-loop-validation/IMPLEMENTATION_SUMMARY.md +672 -0
  382. package/claude-assets/skills/cfn-loop-validation/INDEX.md +531 -0
  383. package/claude-assets/skills/cfn-loop-validation/README_TYPESCRIPT.md +454 -0
  384. package/claude-assets/skills/cfn-loop-validation/SKILL.md +48 -1
  385. package/claude-assets/skills/cfn-loop-validation/SKILL.md.backup +353 -0
  386. package/claude-assets/skills/cfn-loop-validation/SKILL_TYPESCRIPT.md +782 -0
  387. package/claude-assets/skills/cfn-loop-validation/VAPOR_DETECTION_EXAMPLES.md +598 -0
  388. package/claude-assets/skills/cfn-loop-validation/check-dependencies.sh +22 -0
  389. package/claude-assets/skills/cfn-loop-validation/check-dependencies.sh.backup +31 -0
  390. package/claude-assets/skills/cfn-loop-validation/detect-vapor.sh +59 -0
  391. package/claude-assets/skills/cfn-loop-validation/detect-vapor.sh.backup +37 -0
  392. package/claude-assets/skills/cfn-loop-validation/dist/.tsbuildinfo +1 -0
  393. package/claude-assets/skills/cfn-loop-validation/dist/cli/detect-vapor.d.ts +14 -0
  394. package/claude-assets/skills/cfn-loop-validation/dist/cli/detect-vapor.d.ts.map +1 -0
  395. package/claude-assets/skills/cfn-loop-validation/dist/cli/detect-vapor.js +185 -0
  396. package/claude-assets/skills/cfn-loop-validation/dist/cli/detect-vapor.js.map +1 -0
  397. package/claude-assets/skills/cfn-loop-validation/dist/cli/validate-deliverables.d.ts +14 -0
  398. package/claude-assets/skills/cfn-loop-validation/dist/cli/validate-deliverables.d.ts.map +1 -0
  399. package/claude-assets/skills/cfn-loop-validation/dist/cli/validate-deliverables.js +176 -0
  400. package/claude-assets/skills/cfn-loop-validation/dist/cli/validate-deliverables.js.map +1 -0
  401. package/claude-assets/skills/cfn-loop-validation/dist/cli/validate-gate.d.ts +19 -0
  402. package/claude-assets/skills/cfn-loop-validation/dist/cli/validate-gate.d.ts.map +1 -0
  403. package/claude-assets/skills/cfn-loop-validation/dist/cli/validate-gate.js +123 -0
  404. package/claude-assets/skills/cfn-loop-validation/dist/cli/validate-gate.js.map +1 -0
  405. package/claude-assets/skills/cfn-loop-validation/dist/types.d.ts +156 -0
  406. package/claude-assets/skills/cfn-loop-validation/dist/types.d.ts.map +1 -0
  407. package/claude-assets/skills/cfn-loop-validation/dist/types.js +66 -0
  408. package/claude-assets/skills/cfn-loop-validation/dist/types.js.map +1 -0
  409. package/claude-assets/skills/cfn-loop-validation/dist/validator.d.ts +85 -0
  410. package/claude-assets/skills/cfn-loop-validation/dist/validator.d.ts.map +1 -0
  411. package/claude-assets/skills/cfn-loop-validation/dist/validator.js +411 -0
  412. package/claude-assets/skills/cfn-loop-validation/dist/validator.js.map +1 -0
  413. package/claude-assets/skills/cfn-loop-validation/orchestrate-cfn-loop.sh +22 -0
  414. package/claude-assets/skills/cfn-loop-validation/orchestrate-cfn-loop.sh.backup +252 -0
  415. package/claude-assets/skills/cfn-loop-validation/package.json +93 -0
  416. package/claude-assets/skills/cfn-loop-validation/src/cli/detect-vapor.ts +177 -0
  417. package/claude-assets/skills/cfn-loop-validation/src/cli/validate-deliverables.ts +161 -0
  418. package/claude-assets/skills/cfn-loop-validation/src/cli/validate-gate.ts +139 -0
  419. package/claude-assets/skills/cfn-loop-validation/src/types.ts +215 -0
  420. package/claude-assets/skills/cfn-loop-validation/src/validator.ts +503 -0
  421. package/claude-assets/skills/cfn-loop-validation/tests/validator.test.ts +537 -0
  422. package/claude-assets/skills/{cfn-redis-coordination → cfn-loop-validation}/tsconfig.json +34 -31
  423. package/claude-assets/skills/cfn-loop-validation/validate-deliverables.sh +59 -0
  424. package/claude-assets/skills/cfn-loop-validation/validate-deliverables.sh.backup +37 -0
  425. package/claude-assets/skills/cfn-loop-validation/validate-gate.sh +63 -0
  426. package/claude-assets/skills/cfn-loop-validation/validate-gate.sh.backup +41 -0
  427. package/claude-assets/skills/cfn-loop-validation/validate-iteration.sh +22 -0
  428. package/claude-assets/skills/cfn-loop-validation/validate-iteration.sh.backup +134 -0
  429. package/claude-assets/skills/cfn-product-owner-decision/SKILL.md +479 -147
  430. package/claude-assets/skills/cfn-product-owner-decision/TYPESCRIPT_IMPLEMENTATION.md +653 -0
  431. package/claude-assets/skills/cfn-product-owner-decision/{execute-decision.sh → archive/legacy-bash/execute-decision.sh} +24 -2
  432. package/claude-assets/skills/cfn-provider-routing/README.md +129 -0
  433. package/claude-assets/skills/cfn-provider-routing/SKILL.md +215 -0
  434. package/claude-assets/skills/cfn-provider-routing/resolve-provider-model.ts +223 -0
  435. package/claude-assets/skills/docker-build/build.sh +1 -1
  436. package/claude-assets/skills/pre-edit-backup/SKILL.md +324 -0
  437. package/claude-assets/skills/pre-edit-backup/SKILL.md.backup +277 -0
  438. package/claude-assets/skills/pre-edit-backup/backup.sh +22 -0
  439. package/claude-assets/skills/pre-edit-backup/backup.sh.backup +107 -0
  440. package/dist/agent/skill-mcp-selector.js +2 -1
  441. package/dist/agent/skill-mcp-selector.js.map +1 -1
  442. package/dist/api/auth-endpoints.js +415 -0
  443. package/dist/api/auth-endpoints.js.map +1 -0
  444. package/dist/api/task-endpoints.js +562 -0
  445. package/dist/api/task-endpoints.js.map +1 -0
  446. package/dist/backend/server.js +418 -0
  447. package/dist/backend/server.js.map +1 -0
  448. package/dist/cfn-loop/product-owner/decision-parser.js +356 -0
  449. package/dist/cfn-loop/product-owner/decision-parser.js.map +1 -0
  450. package/dist/cfn-loop/product-owner/index.js +1 -0
  451. package/dist/cfn-loop/product-owner/index.js.map +1 -1
  452. package/dist/cli/agent-command.js +1 -1
  453. package/dist/cli/agent-command.js.map +1 -1
  454. package/dist/cli/agent-completion.js +273 -0
  455. package/dist/cli/agent-completion.js.map +1 -0
  456. package/dist/cli/agent-executor.js +470 -26
  457. package/dist/cli/agent-executor.js.map +1 -1
  458. package/dist/cli/agent-prompt-builder.js +83 -48
  459. package/dist/cli/agent-prompt-builder.js.map +1 -1
  460. package/dist/cli/agent-spawn.js +7 -4
  461. package/dist/cli/agent-spawn.js.map +1 -1
  462. package/dist/cli/agent-spawner.js +546 -0
  463. package/dist/cli/agent-spawner.js.map +1 -0
  464. package/dist/cli/agent-token-manager.js +2 -1
  465. package/dist/cli/agent-token-manager.js.map +1 -1
  466. package/dist/cli/anthropic-client.js +127 -14
  467. package/dist/cli/anthropic-client.js.map +1 -1
  468. package/dist/cli/cfn-context.js +2 -1
  469. package/dist/cli/cfn-context.js.map +1 -1
  470. package/dist/cli/cfn-metrics.js +2 -1
  471. package/dist/cli/cfn-metrics.js.map +1 -1
  472. package/dist/cli/cfn-redis.js +2 -1
  473. package/dist/cli/cfn-redis.js.map +1 -1
  474. package/dist/cli/cli-agent-context.js +2 -0
  475. package/dist/cli/cli-agent-context.js.map +1 -1
  476. package/dist/cli/config-manager.js +90 -356
  477. package/dist/cli/config-manager.js.map +1 -1
  478. package/dist/cli/conversation-fork-cleanup.js +2 -1
  479. package/dist/cli/conversation-fork-cleanup.js.map +1 -1
  480. package/dist/cli/conversation-fork.js +2 -1
  481. package/dist/cli/conversation-fork.js.map +1 -1
  482. package/dist/cli/coordination/agent-messaging.js +415 -0
  483. package/dist/cli/coordination/agent-messaging.js.map +1 -0
  484. package/dist/cli/coordination/wait-for-threshold.js +232 -0
  485. package/dist/cli/coordination/wait-for-threshold.js.map +1 -0
  486. package/dist/cli/index.js +11 -0
  487. package/dist/cli/index.js.map +1 -1
  488. package/dist/cli/iteration-history.js +2 -1
  489. package/dist/cli/iteration-history.js.map +1 -1
  490. package/dist/cli/parse-decision-cli.js +268 -0
  491. package/dist/cli/parse-decision-cli.js.map +1 -0
  492. package/dist/cli/post-edit-hook.js +83 -0
  493. package/dist/cli/post-edit-hook.js.map +1 -0
  494. package/dist/cli/pre-edit-hook.js +77 -0
  495. package/dist/cli/pre-edit-hook.js.map +1 -0
  496. package/dist/cli/process-lifecycle.js +5 -1
  497. package/dist/cli/process-lifecycle.js.map +1 -1
  498. package/dist/cli/spawn-agent-cli.js +244 -0
  499. package/dist/cli/spawn-agent-cli.js.map +1 -0
  500. package/dist/coordination/coordination-wrapper.js +383 -0
  501. package/dist/coordination/coordination-wrapper.js.map +1 -0
  502. package/dist/coordination/redis-waiting-mode.js +4 -0
  503. package/dist/coordination/redis-waiting-mode.js.map +1 -1
  504. package/dist/coordination/store-success-criteria.js +68 -0
  505. package/dist/coordination/store-success-criteria.js.map +1 -0
  506. package/dist/coordination/store-task-context.js +65 -0
  507. package/dist/coordination/store-task-context.js.map +1 -0
  508. package/dist/hooks/backup-manager.js +273 -0
  509. package/dist/hooks/backup-manager.js.map +1 -0
  510. package/dist/hooks/post-edit-validator.js +388 -0
  511. package/dist/hooks/post-edit-validator.js.map +1 -0
  512. package/dist/integration/index.js +19 -0
  513. package/dist/integration/index.js.map +1 -0
  514. package/dist/integration/task-mode-adapter.js +297 -0
  515. package/dist/integration/task-mode-adapter.js.map +1 -0
  516. package/dist/integration/trigger-dev-client.js +253 -0
  517. package/dist/integration/trigger-dev-client.js.map +1 -0
  518. package/dist/integration/trigger-dev-webhooks.js +362 -0
  519. package/dist/integration/trigger-dev-webhooks.js.map +1 -0
  520. package/dist/lib/artifact-registry.js +4 -0
  521. package/dist/lib/artifact-registry.js.map +1 -1
  522. package/dist/lib/connection-pool.js +390 -0
  523. package/dist/lib/connection-pool.js.map +1 -0
  524. package/dist/lib/environment-contract.js +258 -0
  525. package/dist/lib/environment-contract.js.map +1 -0
  526. package/dist/lib/path-validator.js +14 -5
  527. package/dist/lib/path-validator.js.map +1 -1
  528. package/dist/lib/query-optimizer.js +388 -0
  529. package/dist/lib/query-optimizer.js.map +1 -0
  530. package/dist/lib/redis-queue-manager.js +5 -1
  531. package/dist/lib/redis-queue-manager.js.map +1 -1
  532. package/dist/lib/result-cache.js +285 -0
  533. package/dist/lib/result-cache.js.map +1 -0
  534. package/dist/mcp/auth-middleware.js +2 -1
  535. package/dist/mcp/auth-middleware.js.map +1 -1
  536. package/dist/mcp/playwright-mcp-server-auth.js +2 -1
  537. package/dist/mcp/playwright-mcp-server-auth.js.map +1 -1
  538. package/dist/middleware/authentication.js +317 -0
  539. package/dist/middleware/authentication.js.map +1 -0
  540. package/dist/services/authentication.js +669 -0
  541. package/dist/services/authentication.js.map +1 -0
  542. package/dist/services/session-management.js +436 -0
  543. package/dist/services/session-management.js.map +1 -0
  544. package/dist/services/skill-deployment.js +8 -6
  545. package/dist/services/skill-deployment.js.map +1 -1
  546. package/dist/services/user-service.js +710 -0
  547. package/dist/services/user-service.js.map +1 -0
  548. package/dist/types/trigger-dev-events.d.js +10 -0
  549. package/dist/types/trigger-dev-events.d.js.map +1 -0
  550. package/docs/README.md +240 -0
  551. package/package.json +15 -4
  552. package/scripts/build-agent-image.sh +1 -1
  553. package/scripts/compare-workflow-performance.sh +556 -0
  554. package/scripts/cost-allocation-tracker.sh +632 -0
  555. package/scripts/docker-rebuild-all-agents.sh +2 -2
  556. package/scripts/migrate-to-optimized-workflows.sh +438 -0
  557. package/scripts/organize-docs.sh +338 -0
  558. package/scripts/reorganize-tests.sh +280 -0
  559. package/scripts/trigger-dev-setup.sh +279 -0
  560. package/tests/README.md +45 -0
  561. package/.claude/commands/cost-savings-status.md +0 -34
  562. package/.claude/commands/metrics-summary.md +0 -58
  563. package/.claude/skills/cfn-docker-redis-coordination/MIGRATION_SUMMARY.md +0 -348
  564. package/.claude/skills/cfn-docker-redis-coordination/README.md +0 -294
  565. package/.claude/skills/cfn-docker-redis-coordination/SKILL.md +0 -435
  566. package/.claude/skills/cfn-docker-redis-coordination/coordinate.sh +0 -650
  567. package/.claude/skills/cfn-docker-redis-coordination/coordinate.sh.backup-1763145142 +0 -641
  568. package/.claude/skills/cfn-docker-redis-coordination/package-lock.json +0 -5259
  569. package/.claude/skills/cfn-docker-redis-coordination/package.json +0 -40
  570. package/.claude/skills/cfn-docker-redis-coordination/src/coordinator.ts +0 -801
  571. package/.claude/skills/cfn-docker-redis-coordination/src/index.ts +0 -42
  572. package/.claude/skills/cfn-docker-redis-coordination/src/types.ts +0 -351
  573. package/.claude/skills/cfn-docker-redis-coordination/tests/coordinator.test.ts +0 -1464
  574. package/.claude/skills/cfn-docker-redis-coordination/tsconfig.json +0 -30
  575. package/.claude/skills/cfn-loop-orchestration/helpers/auto-tune-timeouts.sh +0 -228
  576. package/.claude/skills/cfn-loop-orchestration/helpers/consensus-ts.sh +0 -104
  577. package/.claude/skills/cfn-loop-orchestration/helpers/consensus.sh +0 -94
  578. package/.claude/skills/cfn-loop-orchestration/helpers/context-injection.sh +0 -142
  579. package/.claude/skills/cfn-loop-orchestration/helpers/context-lookup.sh +0 -359
  580. package/.claude/skills/cfn-loop-orchestration/helpers/deliverable-verifier-ts.sh +0 -123
  581. package/.claude/skills/cfn-loop-orchestration/helpers/deliverable-verifier.sh +0 -71
  582. package/.claude/skills/cfn-loop-orchestration/helpers/gate-check.sh +0 -56
  583. package/.claude/skills/cfn-loop-orchestration/helpers/iteration-manager-ts.sh +0 -89
  584. package/.claude/skills/cfn-loop-orchestration/helpers/iteration-manager.sh +0 -87
  585. package/.claude/skills/cfn-loop-orchestration/helpers/orchestrate-ts.sh +0 -104
  586. package/.claude/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +0 -56
  587. package/.claude/skills/cfn-loop-orchestration/helpers/spawn-agents.sh +0 -290
  588. package/.claude/skills/cfn-loop-orchestration/helpers/timeout-calculator-ts.sh +0 -47
  589. package/.claude/skills/cfn-loop-orchestration/helpers/timeout-calculator.sh +0 -51
  590. package/.claude/skills/cfn-loop-orchestration/orchestrate.sh +0 -1345
  591. package/.claude/skills/cfn-redis-coordination/AGENT_LOGGING.md +0 -280
  592. package/.claude/skills/cfn-redis-coordination/BZPOPMIN_FIX_SUMMARY.md +0 -209
  593. package/.claude/skills/cfn-redis-coordination/CENTRALIZED_REDIS_WRAPPER.md +0 -319
  594. package/.claude/skills/cfn-redis-coordination/agent-log.sh.bak +0 -124
  595. package/.claude/skills/cfn-redis-coordination/config.json +0 -61
  596. package/.claude/skills/cfn-redis-coordination/demos/phase4-wake-queue-test-report.md +0 -82
  597. package/.claude/skills/cfn-redis-coordination/demos/test-bzpopmin-fix.sh +0 -274
  598. package/.claude/skills/cfn-redis-coordination/demos/test-cancel-swarm.sh +0 -0
  599. package/.claude/skills/cfn-redis-coordination/docs/migration/PHASE_3_REDIS_COORDINATION_COMPLETION_REPORT.md +0 -553
  600. package/.claude/skills/cfn-redis-coordination/jest.config.js +0 -23
  601. package/.claude/skills/cfn-redis-coordination/package-lock.json +0 -5272
  602. package/.claude/skills/cfn-redis-coordination/package.json +0 -45
  603. package/.claude/skills/cfn-redis-coordination/src/agent-logger.ts +0 -446
  604. package/.claude/skills/cfn-redis-coordination/src/agent-recovery.ts +0 -454
  605. package/.claude/skills/cfn-redis-coordination/src/completion-reporter.ts +0 -396
  606. package/.claude/skills/cfn-redis-coordination/src/context-manager.ts +0 -327
  607. package/.claude/skills/cfn-redis-coordination/src/index.ts +0 -82
  608. package/.claude/skills/cfn-redis-coordination/src/mode-detector.ts +0 -155
  609. package/.claude/skills/cfn-redis-coordination/src/redis/redis-client.ts +0 -305
  610. package/.claude/skills/cfn-redis-coordination/src/redis/redis-functions.ts +0 -283
  611. package/.claude/skills/cfn-redis-coordination/src/redis-client.ts +0 -654
  612. package/.claude/skills/cfn-redis-coordination/src/result-collector.ts +0 -437
  613. package/.claude/skills/cfn-redis-coordination/src/swarm-manager.ts +0 -494
  614. package/.claude/skills/cfn-redis-coordination/src/task-analyzer.ts +0 -404
  615. package/.claude/skills/cfn-redis-coordination/src/task-executor.ts +0 -423
  616. package/.claude/skills/cfn-redis-coordination/src/types.ts +0 -235
  617. package/.claude/skills/cfn-redis-coordination/src/waiting-coordinator.ts +0 -587
  618. package/.claude/skills/cfn-redis-coordination/store-success-criteria.sh +0 -85
  619. package/.claude/skills/cfn-redis-coordination/test-connection-attempts.js +0 -70
  620. package/.claude/skills/cfn-redis-coordination/test-mode-simple.js +0 -121
  621. package/.claude/skills/cfn-redis-coordination/test-redis-check.js +0 -84
  622. package/.claude/skills/cfn-redis-coordination/test-task-mode-redis.cjs +0 -391
  623. package/.claude/skills/cfn-redis-coordination/tests/coordination.test.ts +0 -788
  624. package/.claude/skills/cfn-redis-coordination/update-all-scripts.sh +0 -67
  625. package/claude-assets/agents/cfn-dev-team/coordinators/cfn-v3-coordinator.md +0 -980
  626. package/claude-assets/agents/cfn-dev-team/dev-ops/monitoring-specialist.md +0 -759
  627. package/claude-assets/agents/custom/test-mcp-access.md +0 -24
  628. package/claude-assets/agents/typescript-specialist.md +0 -280
  629. package/claude-assets/commands/cost-savings-status.md +0 -34
  630. package/claude-assets/commands/metrics-summary.md +0 -58
  631. package/claude-assets/skills/cfn-docker-redis-coordination/MIGRATION_SUMMARY.md +0 -348
  632. package/claude-assets/skills/cfn-docker-redis-coordination/README.md +0 -294
  633. package/claude-assets/skills/cfn-docker-redis-coordination/SKILL.md +0 -435
  634. package/claude-assets/skills/cfn-docker-redis-coordination/coordinate.sh +0 -650
  635. package/claude-assets/skills/cfn-docker-redis-coordination/coordinate.sh.backup-1763145142 +0 -641
  636. package/claude-assets/skills/cfn-docker-redis-coordination/jest.config.js +0 -37
  637. package/claude-assets/skills/cfn-docker-redis-coordination/package-lock.json +0 -5259
  638. package/claude-assets/skills/cfn-docker-redis-coordination/package.json +0 -40
  639. package/claude-assets/skills/cfn-docker-redis-coordination/src/coordinator.ts +0 -801
  640. package/claude-assets/skills/cfn-docker-redis-coordination/src/index.ts +0 -42
  641. package/claude-assets/skills/cfn-docker-redis-coordination/src/types.ts +0 -351
  642. package/claude-assets/skills/cfn-docker-redis-coordination/tests/coordinator.test.ts +0 -1464
  643. package/claude-assets/skills/cfn-loop-orchestration/helpers/auto-tune-timeouts.sh +0 -228
  644. package/claude-assets/skills/cfn-loop-orchestration/helpers/consensus-ts.sh +0 -104
  645. package/claude-assets/skills/cfn-loop-orchestration/helpers/consensus.sh +0 -94
  646. package/claude-assets/skills/cfn-loop-orchestration/helpers/context-injection.sh +0 -142
  647. package/claude-assets/skills/cfn-loop-orchestration/helpers/context-lookup.sh +0 -359
  648. package/claude-assets/skills/cfn-loop-orchestration/helpers/deliverable-verifier-ts.sh +0 -123
  649. package/claude-assets/skills/cfn-loop-orchestration/helpers/deliverable-verifier.sh +0 -71
  650. package/claude-assets/skills/cfn-loop-orchestration/helpers/gate-check.sh +0 -56
  651. package/claude-assets/skills/cfn-loop-orchestration/helpers/iteration-manager-ts.sh +0 -89
  652. package/claude-assets/skills/cfn-loop-orchestration/helpers/iteration-manager.sh +0 -87
  653. package/claude-assets/skills/cfn-loop-orchestration/helpers/orchestrate-ts.sh +0 -104
  654. package/claude-assets/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +0 -56
  655. package/claude-assets/skills/cfn-loop-orchestration/helpers/spawn-agents.sh +0 -290
  656. package/claude-assets/skills/cfn-loop-orchestration/helpers/timeout-calculator-ts.sh +0 -47
  657. package/claude-assets/skills/cfn-loop-orchestration/helpers/timeout-calculator.sh +0 -51
  658. package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh +0 -1345
  659. package/claude-assets/skills/cfn-redis-cleanup/cleanup-redis.sh +0 -130
  660. package/claude-assets/skills/cfn-redis-coordination/AGENT_LOGGING.md +0 -280
  661. package/claude-assets/skills/cfn-redis-coordination/BZPOPMIN_FIX_SUMMARY.md +0 -209
  662. package/claude-assets/skills/cfn-redis-coordination/CENTRALIZED_REDIS_WRAPPER.md +0 -319
  663. package/claude-assets/skills/cfn-redis-coordination/agent-log.sh.bak +0 -124
  664. package/claude-assets/skills/cfn-redis-coordination/config.json +0 -61
  665. package/claude-assets/skills/cfn-redis-coordination/demos/phase4-wake-queue-test-report.md +0 -82
  666. package/claude-assets/skills/cfn-redis-coordination/demos/test-bzpopmin-fix.sh +0 -274
  667. package/claude-assets/skills/cfn-redis-coordination/demos/test-cancel-swarm.sh +0 -0
  668. package/claude-assets/skills/cfn-redis-coordination/docs/migration/PHASE_3_REDIS_COORDINATION_COMPLETION_REPORT.md +0 -553
  669. package/claude-assets/skills/cfn-redis-coordination/jest.config.js +0 -23
  670. package/claude-assets/skills/cfn-redis-coordination/package-lock.json +0 -5272
  671. package/claude-assets/skills/cfn-redis-coordination/package.json +0 -45
  672. package/claude-assets/skills/cfn-redis-coordination/src/agent-logger.ts +0 -446
  673. package/claude-assets/skills/cfn-redis-coordination/src/agent-recovery.ts +0 -454
  674. package/claude-assets/skills/cfn-redis-coordination/src/completion-reporter.ts +0 -396
  675. package/claude-assets/skills/cfn-redis-coordination/src/context-manager.ts +0 -327
  676. package/claude-assets/skills/cfn-redis-coordination/src/index.ts +0 -82
  677. package/claude-assets/skills/cfn-redis-coordination/src/mode-detector.ts +0 -155
  678. package/claude-assets/skills/cfn-redis-coordination/src/redis/redis-client.ts +0 -305
  679. package/claude-assets/skills/cfn-redis-coordination/src/redis/redis-functions.ts +0 -283
  680. package/claude-assets/skills/cfn-redis-coordination/src/redis-client.ts +0 -654
  681. package/claude-assets/skills/cfn-redis-coordination/src/result-collector.ts +0 -437
  682. package/claude-assets/skills/cfn-redis-coordination/src/swarm-manager.ts +0 -494
  683. package/claude-assets/skills/cfn-redis-coordination/src/task-analyzer.ts +0 -404
  684. package/claude-assets/skills/cfn-redis-coordination/src/task-executor.ts +0 -423
  685. package/claude-assets/skills/cfn-redis-coordination/src/types.ts +0 -235
  686. package/claude-assets/skills/cfn-redis-coordination/src/waiting-coordinator.ts +0 -587
  687. package/claude-assets/skills/cfn-redis-coordination/store-success-criteria.sh +0 -85
  688. package/claude-assets/skills/cfn-redis-coordination/test-connection-attempts.js +0 -70
  689. package/claude-assets/skills/cfn-redis-coordination/test-mode-simple.js +0 -121
  690. package/claude-assets/skills/cfn-redis-coordination/test-redis-check.js +0 -84
  691. package/claude-assets/skills/cfn-redis-coordination/test-task-mode-redis.cjs +0 -391
  692. package/claude-assets/skills/cfn-redis-coordination/tests/coordination.test.ts +0 -788
  693. package/claude-assets/skills/cfn-redis-coordination/update-all-scripts.sh +0 -67
  694. package/claude-assets/skills/cfn-redis-data-extraction/SKILL.md +0 -442
  695. package/claude-assets/skills/cfn-redis-data-extraction/extract.sh +0 -306
  696. package/dist/coordination/index.js +0 -25
  697. package/dist/coordination/index.js.map +0 -1
  698. package/docs/BUG_19_MEMORY_LEAK_TASK_MODE.md +0 -405
  699. package/docs/MEMORY_CLEANUP_GUIDE.md +0 -358
  700. package/docs/MEMORY_LEAK_FIX_SUMMARY.md +0 -322
  701. package/docs/REDIS_CLEANUP_EXECUTIVE_SUMMARY.md +0 -319
  702. package/docs/REDIS_CLEANUP_VERIFICATION_REPORT.md +0 -574
  703. package/tests/test-memory-leak-task-mode.sh +0 -435
  704. /package/.claude/skills/cfn-loop-orchestration/{inject-loop-context.sh → archive/legacy-bash/inject-loop-context.sh} +0 -0
  705. /package/.claude/skills/cfn-loop-orchestration/{monitor-execution.sh → archive/legacy-bash/monitor-execution.sh} +0 -0
  706. /package/.claude/skills/cfn-redis-coordination/{agent-log.sh → agent-log.sh.backup} +0 -0
  707. /package/.claude/skills/cfn-redis-coordination/{agent-recovery.sh → agent-recovery.sh.backup} +0 -0
  708. /package/.claude/skills/cfn-redis-coordination/{analyze-task-complexity.sh → analyze-task-complexity.sh.backup} +0 -0
  709. /package/.claude/skills/cfn-redis-coordination/bash-wrappers/{store-context.sh → store-context.sh.backup} +0 -0
  710. /package/.claude/skills/cfn-redis-coordination/{cancel-swarm.sh → cancel-swarm.sh.backup} +0 -0
  711. /package/.claude/skills/cfn-redis-coordination/{cfn-loop-exec.sh → cfn-loop-exec.sh.backup} +0 -0
  712. /package/.claude/skills/cfn-redis-coordination/{cfn-loop-relaunch.sh → cfn-loop-relaunch.sh.backup} +0 -0
  713. /package/.claude/skills/cfn-redis-coordination/{collect-confidence-scores.sh → collect-confidence-scores.sh.backup} +0 -0
  714. /package/.claude/skills/cfn-redis-coordination/{collect-results.sh → collect-results.sh.backup} +0 -0
  715. /package/.claude/skills/cfn-redis-coordination/{complete-swarm.sh → complete-swarm.sh.backup} +0 -0
  716. /package/.claude/skills/cfn-redis-coordination/{get-context.sh → get-context.sh.backup} +0 -0
  717. /package/.claude/skills/cfn-redis-coordination/{get-success-criteria.sh → get-success-criteria.sh.backup} +0 -0
  718. /package/.claude/skills/cfn-redis-coordination/{invoke-waiting-mode.sh → invoke-waiting-mode.sh.backup} +0 -0
  719. /package/.claude/skills/cfn-redis-coordination/{redis-cli-wrapper.sh → redis-cli-wrapper.sh.backup} +0 -0
  720. /package/.claude/skills/cfn-redis-coordination/{redis-functions.sh → redis-functions.sh.backup} +0 -0
  721. /package/.claude/skills/cfn-redis-coordination/{report-completion.sh → report-completion.sh.backup} +0 -0
  722. /package/.claude/skills/cfn-redis-coordination/{store-context.sh → store-context.sh.backup} +0 -0
  723. /package/claude-assets/skills/cfn-loop-orchestration/{inject-loop-context.sh → archive/legacy-bash/inject-loop-context.sh} +0 -0
  724. /package/claude-assets/skills/cfn-loop-orchestration/{monitor-execution.sh → archive/legacy-bash/monitor-execution.sh} +0 -0
  725. /package/claude-assets/skills/cfn-redis-coordination/{agent-log.sh → agent-log.sh.backup} +0 -0
  726. /package/claude-assets/skills/cfn-redis-coordination/{agent-recovery.sh → agent-recovery.sh.backup} +0 -0
  727. /package/claude-assets/skills/cfn-redis-coordination/{analyze-task-complexity.sh → analyze-task-complexity.sh.backup} +0 -0
  728. /package/claude-assets/skills/cfn-redis-coordination/bash-wrappers/{store-context.sh → store-context.sh.backup} +0 -0
  729. /package/claude-assets/skills/cfn-redis-coordination/{cancel-swarm.sh → cancel-swarm.sh.backup} +0 -0
  730. /package/claude-assets/skills/cfn-redis-coordination/{cfn-loop-exec.sh → cfn-loop-exec.sh.backup} +0 -0
  731. /package/claude-assets/skills/cfn-redis-coordination/{cfn-loop-relaunch.sh → cfn-loop-relaunch.sh.backup} +0 -0
  732. /package/claude-assets/skills/cfn-redis-coordination/{collect-confidence-scores.sh → collect-confidence-scores.sh.backup} +0 -0
  733. /package/claude-assets/skills/cfn-redis-coordination/{collect-results.sh → collect-results.sh.backup} +0 -0
  734. /package/claude-assets/skills/cfn-redis-coordination/{complete-swarm.sh → complete-swarm.sh.backup} +0 -0
  735. /package/claude-assets/skills/cfn-redis-coordination/{get-context.sh → get-context.sh.backup} +0 -0
  736. /package/claude-assets/skills/cfn-redis-coordination/{get-success-criteria.sh → get-success-criteria.sh.backup} +0 -0
  737. /package/claude-assets/skills/cfn-redis-coordination/{invoke-waiting-mode.sh → invoke-waiting-mode.sh.backup} +0 -0
  738. /package/claude-assets/skills/cfn-redis-coordination/{redis-cli-wrapper.sh → redis-cli-wrapper.sh.backup} +0 -0
  739. /package/claude-assets/skills/cfn-redis-coordination/{redis-functions.sh → redis-functions.sh.backup} +0 -0
  740. /package/claude-assets/skills/cfn-redis-coordination/{report-completion.sh → report-completion.sh.backup} +0 -0
  741. /package/claude-assets/skills/cfn-redis-coordination/{store-context.sh → store-context.sh.backup} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/conversation-fork.ts"],"sourcesContent":["/**\r\n * Conversation Fork Management\r\n *\r\n * Implements application-level conversation forking for CFN Loop iterations.\r\n * Stores conversation history in Redis and allows branching at specific points.\r\n *\r\n * Sprint 4: Conversation Forking (v2.7.0)\r\n */\r\n\r\nimport { execSync } from 'child_process';\r\nimport { randomBytes } from 'crypto';\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 Message {\r\n role: 'user' | 'assistant';\r\n content: string;\r\n iteration: number;\r\n timestamp: string;\r\n}\r\n\r\nexport interface ForkMetadata {\r\n forkId: string;\r\n taskId: string;\r\n agentId: string;\r\n createdAt: string;\r\n parentIteration: number;\r\n messageCount: number;\r\n}\r\n\r\n/**\r\n * Store a message in conversation history\r\n * MEMORY LEAK FIX: Now sets TTL on message list to prevent indefinite accumulation\r\n */\r\nexport async function storeMessage(\r\n taskId: string,\r\n agentId: string,\r\n message: Message\r\n): Promise<void> {\r\n const key = `swarm:${taskId}:${agentId}:messages`;\r\n const messageJson = JSON.stringify(message);\r\n\r\n try {\r\n execSync(`redis-cli -h ${redisHost} -p ${redisPort} rpush \"${key}\" '${messageJson.replace(/'/g, \"'\\\\''\")}'`, {\r\n encoding: 'utf8'\r\n });\r\n\r\n // MEMORY LEAK FIX: Set TTL on message list (24h default)\r\n // This prevents messages from accumulating indefinitely across multiple tasks\r\n const messageTTL = parseInt(process.env.CFN_MESSAGE_TTL || '86400', 10); // 24 hours\r\n execSync(`redis-cli -h ${redisHost} -p ${redisPort} expire \"${key}\" ${messageTTL}`, {\r\n encoding: 'utf8'\r\n });\r\n } catch (error) {\r\n console.error(`[conversation-fork] Failed to store message:`, error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Load all messages from conversation history\r\n */\r\nexport async function loadMessages(\r\n taskId: string,\r\n agentId: string,\r\n forkId?: string\r\n): Promise<Message[]> {\r\n const key = forkId\r\n ? `swarm:${taskId}:${agentId}:fork:${forkId}:messages`\r\n : `swarm:${taskId}:${agentId}:messages`;\r\n\r\n try {\r\n const output = execSync(`redis-cli -h ${redisHost} -p ${redisPort} lrange \"${key}\" 0 -1`, {\r\n encoding: 'utf8'\r\n }).trim();\r\n\r\n if (!output || output === '(empty array)') {\r\n return [];\r\n }\r\n\r\n // Redis returns each message on a new line\r\n const lines = output.split('\\n');\r\n return lines.map(line => JSON.parse(line));\r\n } catch (error) {\r\n console.error(`[conversation-fork] Failed to load messages:`, error);\r\n return [];\r\n }\r\n}\r\n\r\n/**\r\n * Create a fork from current conversation state\r\n * Copies all messages up to current iteration\r\n * MEMORY LEAK FIX: Now sets TTL on fork message list matching metadata TTL\r\n */\r\nexport async function createFork(\r\n taskId: string,\r\n agentId: string,\r\n currentIteration: number\r\n): Promise<string> {\r\n // Generate unique fork ID\r\n const forkId = `fork-${currentIteration}-${randomBytes(4).toString('hex')}`;\r\n\r\n // Load messages up to current iteration\r\n const messages = await loadMessages(taskId, agentId);\r\n const forkMessages = messages.filter(m => m.iteration <= currentIteration);\r\n\r\n if (forkMessages.length === 0) {\r\n throw new Error(`No messages found for iteration ${currentIteration}`);\r\n }\r\n\r\n // Store fork snapshot\r\n const forkKey = `swarm:${taskId}:${agentId}:fork:${forkId}:messages`;\r\n const forkTTL = parseInt(process.env.CFN_FORK_TTL || '86400', 10); // 24 hours\r\n\r\n for (const message of forkMessages) {\r\n const messageJson = JSON.stringify(message);\r\n execSync(`redis-cli -h ${redisHost} -p ${redisPort} rpush \"${forkKey}\" '${messageJson.replace(/'/g, \"'\\\\''\")}'`, {\r\n encoding: 'utf8'\r\n });\r\n }\r\n\r\n // MEMORY LEAK FIX: Set TTL on fork messages (was missing before)\r\n execSync(`redis-cli -h ${redisHost} -p ${redisPort} expire \"${forkKey}\" ${forkTTL}`, {\r\n encoding: 'utf8'\r\n });\r\n\r\n // Store fork metadata\r\n const metadata: ForkMetadata = {\r\n forkId,\r\n taskId,\r\n agentId,\r\n createdAt: new Date().toISOString(),\r\n parentIteration: currentIteration,\r\n messageCount: forkMessages.length\r\n };\r\n\r\n const metaKey = `swarm:${taskId}:${agentId}:fork:${forkId}:meta`;\r\n execSync(`redis-cli -h ${redisHost} -p ${redisPort} setex \"${metaKey}\" ${forkTTL} '${JSON.stringify(metadata)}'`, {\r\n encoding: 'utf8'\r\n });\r\n\r\n // Set as current fork\r\n const currentForkKey = `swarm:${taskId}:${agentId}:current-fork`;\r\n execSync(`redis-cli -h ${redisHost} -p ${redisPort} setex \"${currentForkKey}\" ${forkTTL} \"${forkId}\"`, {\r\n encoding: 'utf8'\r\n });\r\n\r\n console.log(`[conversation-fork] Created fork ${forkId} with ${forkMessages.length} messages (TTL: ${forkTTL}s)`);\r\n\r\n return forkId;\r\n}\r\n\r\n/**\r\n * Get current active fork ID\r\n */\r\nexport async function getCurrentFork(\r\n taskId: string,\r\n agentId: string\r\n): Promise<string | null> {\r\n const key = `swarm:${taskId}:${agentId}:current-fork`;\r\n\r\n try {\r\n const forkId = execSync(`redis-cli -h ${redisHost} -p ${redisPort} get \"${key}\"`, {\r\n encoding: 'utf8'\r\n }).trim();\r\n\r\n if (forkId === '(nil)' || !forkId) {\r\n return null;\r\n }\r\n\r\n return forkId;\r\n } catch (error) {\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Get fork metadata\r\n */\r\nexport async function getForkMetadata(\r\n taskId: string,\r\n agentId: string,\r\n forkId: string\r\n): Promise<ForkMetadata | null> {\r\n const key = `swarm:${taskId}:${agentId}:fork:${forkId}:meta`;\r\n\r\n try {\r\n const metaJson = execSync(`redis-cli -h ${redisHost} -p ${redisPort} get \"${key}\"`, {\r\n encoding: 'utf8'\r\n }).trim();\r\n\r\n if (metaJson === '(nil)' || !metaJson) {\r\n return null;\r\n }\r\n\r\n return JSON.parse(metaJson);\r\n } catch (error) {\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * List all forks for an agent\r\n */\r\nexport async function listForks(\r\n taskId: string,\r\n agentId: string\r\n): Promise<ForkMetadata[]> {\r\n const pattern = `swarm:${taskId}:${agentId}:fork:*:meta`;\r\n\r\n try {\r\n const keys = execSync(`redis-cli -h ${redisHost} -p ${redisPort} keys \"${pattern}\"`, {\r\n encoding: 'utf8'\r\n }).trim().split('\\n').filter(k => k);\r\n\r\n const forks: ForkMetadata[] = [];\r\n\r\n for (const key of keys) {\r\n const metaJson = execSync(`redis-cli -h ${redisHost} -p ${redisPort} get \"${key}\"`, {\r\n encoding: 'utf8'\r\n }).trim();\r\n\r\n if (metaJson && metaJson !== '(nil)') {\r\n forks.push(JSON.parse(metaJson));\r\n }\r\n }\r\n\r\n return forks.sort((a, b) =>\r\n new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()\r\n );\r\n } catch (error) {\r\n console.error(`[conversation-fork] Failed to list forks:`, error);\r\n return [];\r\n }\r\n}\r\n\r\n/**\r\n * Delete a fork and its messages\r\n */\r\nexport async function deleteFork(\r\n taskId: string,\r\n agentId: string,\r\n forkId: string\r\n): Promise<void> {\r\n const messagesKey = `swarm:${taskId}:${agentId}:fork:${forkId}:messages`;\r\n const metaKey = `swarm:${taskId}:${agentId}:fork:${forkId}:meta`;\r\n\r\n try {\r\n execSync(`redis-cli -h ${redisHost} -p ${redisPort} del \"${messagesKey}\" \"${metaKey}\"`, {\r\n encoding: 'utf8'\r\n });\r\n\r\n console.log(`[conversation-fork] Deleted fork ${forkId}`);\r\n } catch (error) {\r\n console.error(`[conversation-fork] Failed to delete fork:`, error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Clear current fork (start fresh conversation)\r\n */\r\nexport async function clearCurrentFork(\r\n taskId: string,\r\n agentId: string\r\n): Promise<void> {\r\n const key = `swarm:${taskId}:${agentId}:current-fork`;\r\n\r\n try {\r\n execSync(`redis-cli -h ${redisHost} -p ${redisPort} del \"${key}\"`, {\r\n encoding: 'utf8'\r\n });\r\n } catch (error) {\r\n console.error(`[conversation-fork] Failed to clear current fork:`, error);\r\n }\r\n}\r\n\r\n/**\r\n * Format messages for Anthropic API\r\n */\r\nexport function formatMessagesForAPI(messages: Message[]): Array<{role: string, content: string}> {\r\n return messages.map(m => ({\r\n role: m.role,\r\n content: m.content\r\n }));\r\n}\r\n\r\n/**\r\n * Get conversation statistics\r\n */\r\nexport async function getConversationStats(\r\n taskId: string,\r\n agentId: string,\r\n forkId?: string\r\n): Promise<{\r\n messageCount: number;\r\n userMessages: number;\r\n assistantMessages: number;\r\n iterations: number;\r\n firstMessage: string | null;\r\n lastMessage: string | null;\r\n}> {\r\n const messages = await loadMessages(taskId, agentId, forkId);\r\n\r\n if (messages.length === 0) {\r\n return {\r\n messageCount: 0,\r\n userMessages: 0,\r\n assistantMessages: 0,\r\n iterations: 0,\r\n firstMessage: null,\r\n lastMessage: null\r\n };\r\n }\r\n\r\n const userMessages = messages.filter(m => m.role === 'user').length;\r\n const assistantMessages = messages.filter(m => m.role === 'assistant').length;\r\n const iterations = Math.max(...messages.map(m => m.iteration));\r\n\r\n return {\r\n messageCount: messages.length,\r\n userMessages,\r\n assistantMessages,\r\n iterations,\r\n firstMessage: messages[0].timestamp,\r\n lastMessage: messages[messages.length - 1].timestamp\r\n };\r\n}\r\n"],"names":["execSync","randomBytes","redisHost","process","env","CFN_REDIS_HOST","redisPort","CFN_REDIS_PORT","storeMessage","taskId","agentId","message","key","messageJson","JSON","stringify","replace","encoding","messageTTL","parseInt","CFN_MESSAGE_TTL","error","console","loadMessages","forkId","output","trim","lines","split","map","line","parse","createFork","currentIteration","toString","messages","forkMessages","filter","m","iteration","length","Error","forkKey","forkTTL","CFN_FORK_TTL","metadata","createdAt","Date","toISOString","parentIteration","messageCount","metaKey","currentForkKey","log","getCurrentFork","getForkMetadata","metaJson","listForks","pattern","keys","k","forks","push","sort","a","b","getTime","deleteFork","messagesKey","clearCurrentFork","formatMessagesForAPI","role","content","getConversationStats","userMessages","assistantMessages","iterations","firstMessage","lastMessage","Math","max","timestamp"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/cli/conversation-fork.ts"],"sourcesContent":["/**\r\n * Conversation Fork Management\r\n *\r\n * Implements application-level conversation forking for CFN Loop iterations.\r\n * Stores conversation history in Redis and allows branching at specific points.\r\n *\r\n * Sprint 4: Conversation Forking (v2.7.0)\r\n */\r\n\r\nimport { execSync } from 'child_process';\r\nimport { randomBytes } from 'crypto';\r\n\r\n// Bug #6 Fix: Read Redis connection parameters from process.env\r\n// FIX: Default to 'localhost' for CLI mode (host execution), not 'cfn-redis' (Docker)\r\nconst redisHost = process.env.CFN_REDIS_HOST || 'localhost';\r\nconst redisPort = process.env.CFN_REDIS_PORT || '6379';\r\n\r\nexport interface Message {\r\n role: 'user' | 'assistant';\r\n content: string;\r\n iteration: number;\r\n timestamp: string;\r\n}\r\n\r\nexport interface ForkMetadata {\r\n forkId: string;\r\n taskId: string;\r\n agentId: string;\r\n createdAt: string;\r\n parentIteration: number;\r\n messageCount: number;\r\n}\r\n\r\n/**\r\n * Store a message in conversation history\r\n * MEMORY LEAK FIX: Now sets TTL on message list to prevent indefinite accumulation\r\n */\r\nexport async function storeMessage(\r\n taskId: string,\r\n agentId: string,\r\n message: Message\r\n): Promise<void> {\r\n const key = `swarm:${taskId}:${agentId}:messages`;\r\n const messageJson = JSON.stringify(message);\r\n\r\n try {\r\n execSync(`redis-cli -h ${redisHost} -p ${redisPort} rpush \"${key}\" '${messageJson.replace(/'/g, \"'\\\\''\")}'`, {\r\n encoding: 'utf8'\r\n });\r\n\r\n // MEMORY LEAK FIX: Set TTL on message list (24h default)\r\n // This prevents messages from accumulating indefinitely across multiple tasks\r\n const messageTTL = parseInt(process.env.CFN_MESSAGE_TTL || '86400', 10); // 24 hours\r\n execSync(`redis-cli -h ${redisHost} -p ${redisPort} expire \"${key}\" ${messageTTL}`, {\r\n encoding: 'utf8'\r\n });\r\n } catch (error) {\r\n console.error(`[conversation-fork] Failed to store message:`, error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Load all messages from conversation history\r\n */\r\nexport async function loadMessages(\r\n taskId: string,\r\n agentId: string,\r\n forkId?: string\r\n): Promise<Message[]> {\r\n const key = forkId\r\n ? `swarm:${taskId}:${agentId}:fork:${forkId}:messages`\r\n : `swarm:${taskId}:${agentId}:messages`;\r\n\r\n try {\r\n const output = execSync(`redis-cli -h ${redisHost} -p ${redisPort} lrange \"${key}\" 0 -1`, {\r\n encoding: 'utf8'\r\n }).trim();\r\n\r\n if (!output || output === '(empty array)') {\r\n return [];\r\n }\r\n\r\n // Redis returns each message on a new line\r\n const lines = output.split('\\n');\r\n return lines.map(line => JSON.parse(line));\r\n } catch (error) {\r\n console.error(`[conversation-fork] Failed to load messages:`, error);\r\n return [];\r\n }\r\n}\r\n\r\n/**\r\n * Create a fork from current conversation state\r\n * Copies all messages up to current iteration\r\n * MEMORY LEAK FIX: Now sets TTL on fork message list matching metadata TTL\r\n */\r\nexport async function createFork(\r\n taskId: string,\r\n agentId: string,\r\n currentIteration: number\r\n): Promise<string> {\r\n // Generate unique fork ID\r\n const forkId = `fork-${currentIteration}-${randomBytes(4).toString('hex')}`;\r\n\r\n // Load messages up to current iteration\r\n const messages = await loadMessages(taskId, agentId);\r\n const forkMessages = messages.filter(m => m.iteration <= currentIteration);\r\n\r\n if (forkMessages.length === 0) {\r\n throw new Error(`No messages found for iteration ${currentIteration}`);\r\n }\r\n\r\n // Store fork snapshot\r\n const forkKey = `swarm:${taskId}:${agentId}:fork:${forkId}:messages`;\r\n const forkTTL = parseInt(process.env.CFN_FORK_TTL || '86400', 10); // 24 hours\r\n\r\n for (const message of forkMessages) {\r\n const messageJson = JSON.stringify(message);\r\n execSync(`redis-cli -h ${redisHost} -p ${redisPort} rpush \"${forkKey}\" '${messageJson.replace(/'/g, \"'\\\\''\")}'`, {\r\n encoding: 'utf8'\r\n });\r\n }\r\n\r\n // MEMORY LEAK FIX: Set TTL on fork messages (was missing before)\r\n execSync(`redis-cli -h ${redisHost} -p ${redisPort} expire \"${forkKey}\" ${forkTTL}`, {\r\n encoding: 'utf8'\r\n });\r\n\r\n // Store fork metadata\r\n const metadata: ForkMetadata = {\r\n forkId,\r\n taskId,\r\n agentId,\r\n createdAt: new Date().toISOString(),\r\n parentIteration: currentIteration,\r\n messageCount: forkMessages.length\r\n };\r\n\r\n const metaKey = `swarm:${taskId}:${agentId}:fork:${forkId}:meta`;\r\n execSync(`redis-cli -h ${redisHost} -p ${redisPort} setex \"${metaKey}\" ${forkTTL} '${JSON.stringify(metadata)}'`, {\r\n encoding: 'utf8'\r\n });\r\n\r\n // Set as current fork\r\n const currentForkKey = `swarm:${taskId}:${agentId}:current-fork`;\r\n execSync(`redis-cli -h ${redisHost} -p ${redisPort} setex \"${currentForkKey}\" ${forkTTL} \"${forkId}\"`, {\r\n encoding: 'utf8'\r\n });\r\n\r\n console.log(`[conversation-fork] Created fork ${forkId} with ${forkMessages.length} messages (TTL: ${forkTTL}s)`);\r\n\r\n return forkId;\r\n}\r\n\r\n/**\r\n * Get current active fork ID\r\n */\r\nexport async function getCurrentFork(\r\n taskId: string,\r\n agentId: string\r\n): Promise<string | null> {\r\n const key = `swarm:${taskId}:${agentId}:current-fork`;\r\n\r\n try {\r\n const forkId = execSync(`redis-cli -h ${redisHost} -p ${redisPort} get \"${key}\"`, {\r\n encoding: 'utf8'\r\n }).trim();\r\n\r\n if (forkId === '(nil)' || !forkId) {\r\n return null;\r\n }\r\n\r\n return forkId;\r\n } catch (error) {\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Get fork metadata\r\n */\r\nexport async function getForkMetadata(\r\n taskId: string,\r\n agentId: string,\r\n forkId: string\r\n): Promise<ForkMetadata | null> {\r\n const key = `swarm:${taskId}:${agentId}:fork:${forkId}:meta`;\r\n\r\n try {\r\n const metaJson = execSync(`redis-cli -h ${redisHost} -p ${redisPort} get \"${key}\"`, {\r\n encoding: 'utf8'\r\n }).trim();\r\n\r\n if (metaJson === '(nil)' || !metaJson) {\r\n return null;\r\n }\r\n\r\n return JSON.parse(metaJson);\r\n } catch (error) {\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * List all forks for an agent\r\n */\r\nexport async function listForks(\r\n taskId: string,\r\n agentId: string\r\n): Promise<ForkMetadata[]> {\r\n const pattern = `swarm:${taskId}:${agentId}:fork:*:meta`;\r\n\r\n try {\r\n const keys = execSync(`redis-cli -h ${redisHost} -p ${redisPort} keys \"${pattern}\"`, {\r\n encoding: 'utf8'\r\n }).trim().split('\\n').filter(k => k);\r\n\r\n const forks: ForkMetadata[] = [];\r\n\r\n for (const key of keys) {\r\n const metaJson = execSync(`redis-cli -h ${redisHost} -p ${redisPort} get \"${key}\"`, {\r\n encoding: 'utf8'\r\n }).trim();\r\n\r\n if (metaJson && metaJson !== '(nil)') {\r\n forks.push(JSON.parse(metaJson));\r\n }\r\n }\r\n\r\n return forks.sort((a, b) =>\r\n new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()\r\n );\r\n } catch (error) {\r\n console.error(`[conversation-fork] Failed to list forks:`, error);\r\n return [];\r\n }\r\n}\r\n\r\n/**\r\n * Delete a fork and its messages\r\n */\r\nexport async function deleteFork(\r\n taskId: string,\r\n agentId: string,\r\n forkId: string\r\n): Promise<void> {\r\n const messagesKey = `swarm:${taskId}:${agentId}:fork:${forkId}:messages`;\r\n const metaKey = `swarm:${taskId}:${agentId}:fork:${forkId}:meta`;\r\n\r\n try {\r\n execSync(`redis-cli -h ${redisHost} -p ${redisPort} del \"${messagesKey}\" \"${metaKey}\"`, {\r\n encoding: 'utf8'\r\n });\r\n\r\n console.log(`[conversation-fork] Deleted fork ${forkId}`);\r\n } catch (error) {\r\n console.error(`[conversation-fork] Failed to delete fork:`, error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Clear current fork (start fresh conversation)\r\n */\r\nexport async function clearCurrentFork(\r\n taskId: string,\r\n agentId: string\r\n): Promise<void> {\r\n const key = `swarm:${taskId}:${agentId}:current-fork`;\r\n\r\n try {\r\n execSync(`redis-cli -h ${redisHost} -p ${redisPort} del \"${key}\"`, {\r\n encoding: 'utf8'\r\n });\r\n } catch (error) {\r\n console.error(`[conversation-fork] Failed to clear current fork:`, error);\r\n }\r\n}\r\n\r\n/**\r\n * Format messages for Anthropic API\r\n */\r\nexport function formatMessagesForAPI(messages: Message[]): Array<{role: string, content: string}> {\r\n return messages.map(m => ({\r\n role: m.role,\r\n content: m.content\r\n }));\r\n}\r\n\r\n/**\r\n * Get conversation statistics\r\n */\r\nexport async function getConversationStats(\r\n taskId: string,\r\n agentId: string,\r\n forkId?: string\r\n): Promise<{\r\n messageCount: number;\r\n userMessages: number;\r\n assistantMessages: number;\r\n iterations: number;\r\n firstMessage: string | null;\r\n lastMessage: string | null;\r\n}> {\r\n const messages = await loadMessages(taskId, agentId, forkId);\r\n\r\n if (messages.length === 0) {\r\n return {\r\n messageCount: 0,\r\n userMessages: 0,\r\n assistantMessages: 0,\r\n iterations: 0,\r\n firstMessage: null,\r\n lastMessage: null\r\n };\r\n }\r\n\r\n const userMessages = messages.filter(m => m.role === 'user').length;\r\n const assistantMessages = messages.filter(m => m.role === 'assistant').length;\r\n const iterations = Math.max(...messages.map(m => m.iteration));\r\n\r\n return {\r\n messageCount: messages.length,\r\n userMessages,\r\n assistantMessages,\r\n iterations,\r\n firstMessage: messages[0].timestamp,\r\n lastMessage: messages[messages.length - 1].timestamp\r\n };\r\n}\r\n"],"names":["execSync","randomBytes","redisHost","process","env","CFN_REDIS_HOST","redisPort","CFN_REDIS_PORT","storeMessage","taskId","agentId","message","key","messageJson","JSON","stringify","replace","encoding","messageTTL","parseInt","CFN_MESSAGE_TTL","error","console","loadMessages","forkId","output","trim","lines","split","map","line","parse","createFork","currentIteration","toString","messages","forkMessages","filter","m","iteration","length","Error","forkKey","forkTTL","CFN_FORK_TTL","metadata","createdAt","Date","toISOString","parentIteration","messageCount","metaKey","currentForkKey","log","getCurrentFork","getForkMetadata","metaJson","listForks","pattern","keys","k","forks","push","sort","a","b","getTime","deleteFork","messagesKey","clearCurrentFork","formatMessagesForAPI","role","content","getConversationStats","userMessages","assistantMessages","iterations","firstMessage","lastMessage","Math","max","timestamp"],"mappings":"AAAA;;;;;;;CAOC,GAED,SAASA,QAAQ,QAAQ,gBAAgB;AACzC,SAASC,WAAW,QAAQ,SAAS;AAErC,gEAAgE;AAChE,sFAAsF;AACtF,MAAMC,YAAYC,QAAQC,GAAG,CAACC,cAAc,IAAI;AAChD,MAAMC,YAAYH,QAAQC,GAAG,CAACG,cAAc,IAAI;AAkBhD;;;CAGC,GACD,OAAO,eAAeC,aACpBC,MAAc,EACdC,OAAe,EACfC,OAAgB;IAEhB,MAAMC,MAAM,CAAC,MAAM,EAAEH,OAAO,CAAC,EAAEC,QAAQ,SAAS,CAAC;IACjD,MAAMG,cAAcC,KAAKC,SAAS,CAACJ;IAEnC,IAAI;QACFX,SAAS,CAAC,aAAa,EAAEE,UAAU,IAAI,EAAEI,UAAU,QAAQ,EAAEM,IAAI,GAAG,EAAEC,YAAYG,OAAO,CAAC,MAAM,SAAS,CAAC,CAAC,EAAE;YAC3GC,UAAU;QACZ;QAEA,yDAAyD;QACzD,8EAA8E;QAC9E,MAAMC,aAAaC,SAAShB,QAAQC,GAAG,CAACgB,eAAe,IAAI,SAAS,KAAK,WAAW;QACpFpB,SAAS,CAAC,aAAa,EAAEE,UAAU,IAAI,EAAEI,UAAU,SAAS,EAAEM,IAAI,EAAE,EAAEM,YAAY,EAAE;YAClFD,UAAU;QACZ;IACF,EAAE,OAAOI,OAAO;QACdC,QAAQD,KAAK,CAAC,CAAC,4CAA4C,CAAC,EAAEA;QAC9D,MAAMA;IACR;AACF;AAEA;;CAEC,GACD,OAAO,eAAeE,aACpBd,MAAc,EACdC,OAAe,EACfc,MAAe;IAEf,MAAMZ,MAAMY,SACR,CAAC,MAAM,EAAEf,OAAO,CAAC,EAAEC,QAAQ,MAAM,EAAEc,OAAO,SAAS,CAAC,GACpD,CAAC,MAAM,EAAEf,OAAO,CAAC,EAAEC,QAAQ,SAAS,CAAC;IAEzC,IAAI;QACF,MAAMe,SAASzB,SAAS,CAAC,aAAa,EAAEE,UAAU,IAAI,EAAEI,UAAU,SAAS,EAAEM,IAAI,MAAM,CAAC,EAAE;YACxFK,UAAU;QACZ,GAAGS,IAAI;QAEP,IAAI,CAACD,UAAUA,WAAW,iBAAiB;YACzC,OAAO,EAAE;QACX;QAEA,2CAA2C;QAC3C,MAAME,QAAQF,OAAOG,KAAK,CAAC;QAC3B,OAAOD,MAAME,GAAG,CAACC,CAAAA,OAAQhB,KAAKiB,KAAK,CAACD;IACtC,EAAE,OAAOT,OAAO;QACdC,QAAQD,KAAK,CAAC,CAAC,4CAA4C,CAAC,EAAEA;QAC9D,OAAO,EAAE;IACX;AACF;AAEA;;;;CAIC,GACD,OAAO,eAAeW,WACpBvB,MAAc,EACdC,OAAe,EACfuB,gBAAwB;IAExB,0BAA0B;IAC1B,MAAMT,SAAS,CAAC,KAAK,EAAES,iBAAiB,CAAC,EAAEhC,YAAY,GAAGiC,QAAQ,CAAC,QAAQ;IAE3E,wCAAwC;IACxC,MAAMC,WAAW,MAAMZ,aAAad,QAAQC;IAC5C,MAAM0B,eAAeD,SAASE,MAAM,CAACC,CAAAA,IAAKA,EAAEC,SAAS,IAAIN;IAEzD,IAAIG,aAAaI,MAAM,KAAK,GAAG;QAC7B,MAAM,IAAIC,MAAM,CAAC,gCAAgC,EAAER,kBAAkB;IACvE;IAEA,sBAAsB;IACtB,MAAMS,UAAU,CAAC,MAAM,EAAEjC,OAAO,CAAC,EAAEC,QAAQ,MAAM,EAAEc,OAAO,SAAS,CAAC;IACpE,MAAMmB,UAAUxB,SAAShB,QAAQC,GAAG,CAACwC,YAAY,IAAI,SAAS,KAAK,WAAW;IAE9E,KAAK,MAAMjC,WAAWyB,aAAc;QAClC,MAAMvB,cAAcC,KAAKC,SAAS,CAACJ;QACnCX,SAAS,CAAC,aAAa,EAAEE,UAAU,IAAI,EAAEI,UAAU,QAAQ,EAAEoC,QAAQ,GAAG,EAAE7B,YAAYG,OAAO,CAAC,MAAM,SAAS,CAAC,CAAC,EAAE;YAC/GC,UAAU;QACZ;IACF;IAEA,iEAAiE;IACjEjB,SAAS,CAAC,aAAa,EAAEE,UAAU,IAAI,EAAEI,UAAU,SAAS,EAAEoC,QAAQ,EAAE,EAAEC,SAAS,EAAE;QACnF1B,UAAU;IACZ;IAEA,sBAAsB;IACtB,MAAM4B,WAAyB;QAC7BrB;QACAf;QACAC;QACAoC,WAAW,IAAIC,OAAOC,WAAW;QACjCC,iBAAiBhB;QACjBiB,cAAcd,aAAaI,MAAM;IACnC;IAEA,MAAMW,UAAU,CAAC,MAAM,EAAE1C,OAAO,CAAC,EAAEC,QAAQ,MAAM,EAAEc,OAAO,KAAK,CAAC;IAChExB,SAAS,CAAC,aAAa,EAAEE,UAAU,IAAI,EAAEI,UAAU,QAAQ,EAAE6C,QAAQ,EAAE,EAAER,QAAQ,EAAE,EAAE7B,KAAKC,SAAS,CAAC8B,UAAU,CAAC,CAAC,EAAE;QAChH5B,UAAU;IACZ;IAEA,sBAAsB;IACtB,MAAMmC,iBAAiB,CAAC,MAAM,EAAE3C,OAAO,CAAC,EAAEC,QAAQ,aAAa,CAAC;IAChEV,SAAS,CAAC,aAAa,EAAEE,UAAU,IAAI,EAAEI,UAAU,QAAQ,EAAE8C,eAAe,EAAE,EAAET,QAAQ,EAAE,EAAEnB,OAAO,CAAC,CAAC,EAAE;QACrGP,UAAU;IACZ;IAEAK,QAAQ+B,GAAG,CAAC,CAAC,iCAAiC,EAAE7B,OAAO,MAAM,EAAEY,aAAaI,MAAM,CAAC,gBAAgB,EAAEG,QAAQ,EAAE,CAAC;IAEhH,OAAOnB;AACT;AAEA;;CAEC,GACD,OAAO,eAAe8B,eACpB7C,MAAc,EACdC,OAAe;IAEf,MAAME,MAAM,CAAC,MAAM,EAAEH,OAAO,CAAC,EAAEC,QAAQ,aAAa,CAAC;IAErD,IAAI;QACF,MAAMc,SAASxB,SAAS,CAAC,aAAa,EAAEE,UAAU,IAAI,EAAEI,UAAU,MAAM,EAAEM,IAAI,CAAC,CAAC,EAAE;YAChFK,UAAU;QACZ,GAAGS,IAAI;QAEP,IAAIF,WAAW,WAAW,CAACA,QAAQ;YACjC,OAAO;QACT;QAEA,OAAOA;IACT,EAAE,OAAOH,OAAO;QACd,OAAO;IACT;AACF;AAEA;;CAEC,GACD,OAAO,eAAekC,gBACpB9C,MAAc,EACdC,OAAe,EACfc,MAAc;IAEd,MAAMZ,MAAM,CAAC,MAAM,EAAEH,OAAO,CAAC,EAAEC,QAAQ,MAAM,EAAEc,OAAO,KAAK,CAAC;IAE5D,IAAI;QACF,MAAMgC,WAAWxD,SAAS,CAAC,aAAa,EAAEE,UAAU,IAAI,EAAEI,UAAU,MAAM,EAAEM,IAAI,CAAC,CAAC,EAAE;YAClFK,UAAU;QACZ,GAAGS,IAAI;QAEP,IAAI8B,aAAa,WAAW,CAACA,UAAU;YACrC,OAAO;QACT;QAEA,OAAO1C,KAAKiB,KAAK,CAACyB;IACpB,EAAE,OAAOnC,OAAO;QACd,OAAO;IACT;AACF;AAEA;;CAEC,GACD,OAAO,eAAeoC,UACpBhD,MAAc,EACdC,OAAe;IAEf,MAAMgD,UAAU,CAAC,MAAM,EAAEjD,OAAO,CAAC,EAAEC,QAAQ,YAAY,CAAC;IAExD,IAAI;QACF,MAAMiD,OAAO3D,SAAS,CAAC,aAAa,EAAEE,UAAU,IAAI,EAAEI,UAAU,OAAO,EAAEoD,QAAQ,CAAC,CAAC,EAAE;YACnFzC,UAAU;QACZ,GAAGS,IAAI,GAAGE,KAAK,CAAC,MAAMS,MAAM,CAACuB,CAAAA,IAAKA;QAElC,MAAMC,QAAwB,EAAE;QAEhC,KAAK,MAAMjD,OAAO+C,KAAM;YACtB,MAAMH,WAAWxD,SAAS,CAAC,aAAa,EAAEE,UAAU,IAAI,EAAEI,UAAU,MAAM,EAAEM,IAAI,CAAC,CAAC,EAAE;gBAClFK,UAAU;YACZ,GAAGS,IAAI;YAEP,IAAI8B,YAAYA,aAAa,SAAS;gBACpCK,MAAMC,IAAI,CAAChD,KAAKiB,KAAK,CAACyB;YACxB;QACF;QAEA,OAAOK,MAAME,IAAI,CAAC,CAACC,GAAGC,IACpB,IAAIlB,KAAKkB,EAAEnB,SAAS,EAAEoB,OAAO,KAAK,IAAInB,KAAKiB,EAAElB,SAAS,EAAEoB,OAAO;IAEnE,EAAE,OAAO7C,OAAO;QACdC,QAAQD,KAAK,CAAC,CAAC,yCAAyC,CAAC,EAAEA;QAC3D,OAAO,EAAE;IACX;AACF;AAEA;;CAEC,GACD,OAAO,eAAe8C,WACpB1D,MAAc,EACdC,OAAe,EACfc,MAAc;IAEd,MAAM4C,cAAc,CAAC,MAAM,EAAE3D,OAAO,CAAC,EAAEC,QAAQ,MAAM,EAAEc,OAAO,SAAS,CAAC;IACxE,MAAM2B,UAAU,CAAC,MAAM,EAAE1C,OAAO,CAAC,EAAEC,QAAQ,MAAM,EAAEc,OAAO,KAAK,CAAC;IAEhE,IAAI;QACFxB,SAAS,CAAC,aAAa,EAAEE,UAAU,IAAI,EAAEI,UAAU,MAAM,EAAE8D,YAAY,GAAG,EAAEjB,QAAQ,CAAC,CAAC,EAAE;YACtFlC,UAAU;QACZ;QAEAK,QAAQ+B,GAAG,CAAC,CAAC,iCAAiC,EAAE7B,QAAQ;IAC1D,EAAE,OAAOH,OAAO;QACdC,QAAQD,KAAK,CAAC,CAAC,0CAA0C,CAAC,EAAEA;QAC5D,MAAMA;IACR;AACF;AAEA;;CAEC,GACD,OAAO,eAAegD,iBACpB5D,MAAc,EACdC,OAAe;IAEf,MAAME,MAAM,CAAC,MAAM,EAAEH,OAAO,CAAC,EAAEC,QAAQ,aAAa,CAAC;IAErD,IAAI;QACFV,SAAS,CAAC,aAAa,EAAEE,UAAU,IAAI,EAAEI,UAAU,MAAM,EAAEM,IAAI,CAAC,CAAC,EAAE;YACjEK,UAAU;QACZ;IACF,EAAE,OAAOI,OAAO;QACdC,QAAQD,KAAK,CAAC,CAAC,iDAAiD,CAAC,EAAEA;IACrE;AACF;AAEA;;CAEC,GACD,OAAO,SAASiD,qBAAqBnC,QAAmB;IACtD,OAAOA,SAASN,GAAG,CAACS,CAAAA,IAAM,CAAA;YACxBiC,MAAMjC,EAAEiC,IAAI;YACZC,SAASlC,EAAEkC,OAAO;QACpB,CAAA;AACF;AAEA;;CAEC,GACD,OAAO,eAAeC,qBACpBhE,MAAc,EACdC,OAAe,EACfc,MAAe;IASf,MAAMW,WAAW,MAAMZ,aAAad,QAAQC,SAASc;IAErD,IAAIW,SAASK,MAAM,KAAK,GAAG;QACzB,OAAO;YACLU,cAAc;YACdwB,cAAc;YACdC,mBAAmB;YACnBC,YAAY;YACZC,cAAc;YACdC,aAAa;QACf;IACF;IAEA,MAAMJ,eAAevC,SAASE,MAAM,CAACC,CAAAA,IAAKA,EAAEiC,IAAI,KAAK,QAAQ/B,MAAM;IACnE,MAAMmC,oBAAoBxC,SAASE,MAAM,CAACC,CAAAA,IAAKA,EAAEiC,IAAI,KAAK,aAAa/B,MAAM;IAC7E,MAAMoC,aAAaG,KAAKC,GAAG,IAAI7C,SAASN,GAAG,CAACS,CAAAA,IAAKA,EAAEC,SAAS;IAE5D,OAAO;QACLW,cAAcf,SAASK,MAAM;QAC7BkC;QACAC;QACAC;QACAC,cAAc1C,QAAQ,CAAC,EAAE,CAAC8C,SAAS;QACnCH,aAAa3C,QAAQ,CAACA,SAASK,MAAM,GAAG,EAAE,CAACyC,SAAS;IACtD;AACF"}
@@ -0,0 +1,415 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Agent Messaging - Bidirectional Redis Communication
4
+ *
5
+ * Enables Main Chat to send commands to running CLI agents, and agents to process them.
6
+ *
7
+ * Main Chat → Agent: LPUSH cfn:agent:{taskId}:{agentId}:commands
8
+ * Agent → Main Chat: SET cfn:agent:{taskId}:{agentId}:status (response)
9
+ *
10
+ * Supported Commands:
11
+ * - status: Request agent status update
12
+ * - redirect: Redirect agent to new task/context
13
+ * - abort: Request clean agent abort
14
+ * - pause: Request agent pause for N seconds
15
+ *
16
+ * Usage (Main Chat - send command):
17
+ * npx tsx src/cli/coordination/agent-messaging.ts send \
18
+ * --task-id <id> --agent-id <aid> --command status
19
+ *
20
+ * Usage (Agent - process commands):
21
+ * npx tsx src/cli/coordination/agent-messaging.ts listen \
22
+ * --task-id <id> --agent-id <aid> --poll-interval 5
23
+ */ import { createClient } from 'redis';
24
+ // ============================================================================
25
+ // Redis Key Helpers
26
+ // ============================================================================
27
+ function getCommandsKey(taskId, agentId) {
28
+ return `cfn:agent:${taskId}:${agentId}:commands`;
29
+ }
30
+ function getStatusKey(taskId, agentId) {
31
+ return `cfn:agent:${taskId}:${agentId}:status`;
32
+ }
33
+ function getResponseKey(taskId, agentId, commandId) {
34
+ return `cfn:agent:${taskId}:${agentId}:response:${commandId}`;
35
+ }
36
+ // ============================================================================
37
+ // Main Chat Side - Send Commands
38
+ // ============================================================================
39
+ /**
40
+ * Send a command to an agent via Redis
41
+ */ export async function sendCommand(config, command) {
42
+ const { taskId, agentId, redisHost = process.env.CFN_REDIS_HOST || 'localhost', redisPort = parseInt(process.env.CFN_REDIS_PORT || '6379', 10), redisPassword = process.env.CFN_REDIS_PASSWORD || undefined } = config;
43
+ const client = createClient({
44
+ socket: {
45
+ host: redisHost,
46
+ port: redisPort
47
+ },
48
+ password: redisPassword || undefined
49
+ });
50
+ const commandId = `cmd-${Date.now()}-${Math.random().toString(36).substring(2, 8)}`;
51
+ const fullCommand = {
52
+ ...command,
53
+ id: commandId,
54
+ timestamp: new Date().toISOString(),
55
+ replyTo: getResponseKey(taskId, agentId, commandId)
56
+ };
57
+ try {
58
+ await client.connect();
59
+ const commandsKey = getCommandsKey(taskId, agentId);
60
+ await client.lPush(commandsKey, JSON.stringify(fullCommand));
61
+ console.log(`[agent-msg] Sent command ${command.type} to ${agentId}`);
62
+ console.log(`[agent-msg] Commands key: ${commandsKey}`);
63
+ console.log(`[agent-msg] Command ID: ${commandId}`);
64
+ return {
65
+ sent: true,
66
+ commandId
67
+ };
68
+ } finally{
69
+ await client.disconnect();
70
+ }
71
+ }
72
+ /**
73
+ * Wait for agent response to a command
74
+ */ export async function waitForResponse(config, commandId, timeoutSeconds = 30) {
75
+ const { taskId, agentId, redisHost = process.env.CFN_REDIS_HOST || 'localhost', redisPort = parseInt(process.env.CFN_REDIS_PORT || '6379', 10), redisPassword = process.env.CFN_REDIS_PASSWORD || undefined } = config;
76
+ const client = createClient({
77
+ socket: {
78
+ host: redisHost,
79
+ port: redisPort
80
+ },
81
+ password: redisPassword || undefined
82
+ });
83
+ try {
84
+ await client.connect();
85
+ const responseKey = getResponseKey(taskId, agentId, commandId);
86
+ const result = await client.blPop(responseKey, timeoutSeconds);
87
+ if (result) {
88
+ return JSON.parse(result.element);
89
+ }
90
+ return null;
91
+ } finally{
92
+ await client.disconnect();
93
+ }
94
+ }
95
+ /**
96
+ * Get current agent status (non-blocking)
97
+ */ export async function getAgentStatus(config) {
98
+ const { taskId, agentId, redisHost = process.env.CFN_REDIS_HOST || 'localhost', redisPort = parseInt(process.env.CFN_REDIS_PORT || '6379', 10), redisPassword = process.env.CFN_REDIS_PASSWORD || undefined } = config;
99
+ const client = createClient({
100
+ socket: {
101
+ host: redisHost,
102
+ port: redisPort
103
+ },
104
+ password: redisPassword || undefined
105
+ });
106
+ try {
107
+ await client.connect();
108
+ const statusKey = getStatusKey(taskId, agentId);
109
+ const status = await client.get(statusKey);
110
+ if (status) {
111
+ return JSON.parse(status);
112
+ }
113
+ return null;
114
+ } finally{
115
+ await client.disconnect();
116
+ }
117
+ }
118
+ /**
119
+ * Agent command processor - polls for and processes commands
120
+ */ export class AgentCommandProcessor {
121
+ config;
122
+ client = null;
123
+ running = false;
124
+ handlers = new Map();
125
+ constructor(config){
126
+ this.config = config;
127
+ // Default handlers
128
+ this.handlers.set('status', this.handleStatus.bind(this));
129
+ this.handlers.set('abort', this.handleAbort.bind(this));
130
+ this.handlers.set('pause', this.handlePause.bind(this));
131
+ }
132
+ /**
133
+ * Register a custom command handler
134
+ */ onCommand(type, handler) {
135
+ this.handlers.set(type, handler);
136
+ }
137
+ /**
138
+ * Start processing commands (non-blocking poll loop)
139
+ */ async start(pollIntervalSeconds = 5) {
140
+ const { taskId, agentId, redisHost = process.env.CFN_REDIS_HOST || 'localhost', redisPort = parseInt(process.env.CFN_REDIS_PORT || '6379', 10), redisPassword = process.env.CFN_REDIS_PASSWORD || undefined } = this.config;
141
+ this.client = createClient({
142
+ socket: {
143
+ host: redisHost,
144
+ port: redisPort
145
+ },
146
+ password: redisPassword || undefined
147
+ });
148
+ await this.client.connect();
149
+ this.running = true;
150
+ const commandsKey = getCommandsKey(taskId, agentId);
151
+ console.log(`[agent-processor] Started listening on ${commandsKey}`);
152
+ // Non-blocking poll loop
153
+ while(this.running){
154
+ try {
155
+ // Short BLPOP to check for commands without blocking too long
156
+ const result = await this.client.blPop(commandsKey, pollIntervalSeconds);
157
+ if (result) {
158
+ const command = JSON.parse(result.element);
159
+ console.log(`[agent-processor] Received command: ${command.type} (${command.id})`);
160
+ // Process command
161
+ const handler = this.handlers.get(command.type);
162
+ if (handler) {
163
+ const response = await handler(command);
164
+ // Send response if handler returned status
165
+ if (response && command.replyTo) {
166
+ await this.client.lPush(command.replyTo, JSON.stringify(response));
167
+ console.log(`[agent-processor] Sent response to ${command.replyTo}`);
168
+ }
169
+ } else {
170
+ console.warn(`[agent-processor] No handler for command type: ${command.type}`);
171
+ }
172
+ }
173
+ } catch (err) {
174
+ if (this.running) {
175
+ console.error(`[agent-processor] Error processing command:`, err);
176
+ }
177
+ }
178
+ }
179
+ }
180
+ /**
181
+ * Stop processing commands
182
+ */ async stop() {
183
+ this.running = false;
184
+ if (this.client) {
185
+ await this.client.disconnect();
186
+ this.client = null;
187
+ }
188
+ console.log(`[agent-processor] Stopped`);
189
+ }
190
+ /**
191
+ * Update agent status in Redis
192
+ */ async updateStatus(status) {
193
+ if (!this.client) return;
194
+ const { taskId, agentId } = this.config;
195
+ const fullStatus = {
196
+ agentId,
197
+ taskId,
198
+ status: 'running',
199
+ timestamp: new Date().toISOString(),
200
+ ...status
201
+ };
202
+ const statusKey = getStatusKey(taskId, agentId);
203
+ await this.client.set(statusKey, JSON.stringify(fullStatus));
204
+ // Expire after 1 hour
205
+ await this.client.expire(statusKey, 3600);
206
+ }
207
+ // Default handlers
208
+ async handleStatus(command) {
209
+ const { taskId, agentId } = this.config;
210
+ return {
211
+ agentId,
212
+ taskId,
213
+ status: 'running',
214
+ timestamp: new Date().toISOString(),
215
+ metadata: {
216
+ respondingTo: command.id
217
+ }
218
+ };
219
+ }
220
+ async handleAbort(_command) {
221
+ const { taskId, agentId } = this.config;
222
+ console.log(`[agent-processor] Abort requested, shutting down...`);
223
+ // Schedule stop after response
224
+ setTimeout(()=>this.stop(), 100);
225
+ return {
226
+ agentId,
227
+ taskId,
228
+ status: 'aborting',
229
+ timestamp: new Date().toISOString()
230
+ };
231
+ }
232
+ async handlePause(command) {
233
+ const { taskId, agentId } = this.config;
234
+ const pauseSeconds = command.payload?.seconds || 10;
235
+ console.log(`[agent-processor] Pausing for ${pauseSeconds}s...`);
236
+ await new Promise((resolve)=>setTimeout(resolve, pauseSeconds * 1000));
237
+ console.log(`[agent-processor] Resumed after pause`);
238
+ return {
239
+ agentId,
240
+ taskId,
241
+ status: 'running',
242
+ timestamp: new Date().toISOString(),
243
+ metadata: {
244
+ pausedFor: pauseSeconds
245
+ }
246
+ };
247
+ }
248
+ }
249
+ // ============================================================================
250
+ // CLI Entry Point
251
+ // ============================================================================
252
+ function printHelp() {
253
+ console.log(`
254
+ Agent Messaging - Bidirectional Redis Communication
255
+
256
+ USAGE:
257
+ # Send command to agent (Main Chat side)
258
+ npx tsx src/cli/coordination/agent-messaging.ts send \\
259
+ --task-id <id> --agent-id <aid> --command <type> [--payload <json>]
260
+
261
+ # Listen for commands (Agent side)
262
+ npx tsx src/cli/coordination/agent-messaging.ts listen \\
263
+ --task-id <id> --agent-id <aid> [--poll-interval <seconds>]
264
+
265
+ # Get agent status (Main Chat side)
266
+ npx tsx src/cli/coordination/agent-messaging.ts status \\
267
+ --task-id <id> --agent-id <aid>
268
+
269
+ COMMANDS:
270
+ status Request agent status update
271
+ redirect Redirect agent to new task (include --payload)
272
+ abort Request clean agent abort
273
+ pause Pause agent (include --payload '{"seconds": 10}')
274
+ custom Custom command (include --payload)
275
+
276
+ EXAMPLES:
277
+ # Request status from agent
278
+ npx tsx src/cli/coordination/agent-messaging.ts send \\
279
+ --task-id cfn-cli-123 --agent-id backend-dev-456 --command status
280
+
281
+ # Abort agent
282
+ npx tsx src/cli/coordination/agent-messaging.ts send \\
283
+ --task-id cfn-cli-123 --agent-id backend-dev-456 --command abort
284
+
285
+ # Pause agent for 30 seconds
286
+ npx tsx src/cli/coordination/agent-messaging.ts send \\
287
+ --task-id cfn-cli-123 --agent-id backend-dev-456 \\
288
+ --command pause --payload '{"seconds": 30}'
289
+
290
+ # Redirect agent to new context
291
+ npx tsx src/cli/coordination/agent-messaging.ts send \\
292
+ --task-id cfn-cli-123 --agent-id backend-dev-456 \\
293
+ --command redirect --payload '{"newTask": "Focus on security tests"}'
294
+
295
+ # Start listening for commands (agent side)
296
+ npx tsx src/cli/coordination/agent-messaging.ts listen \\
297
+ --task-id cfn-cli-123 --agent-id backend-dev-456 --poll-interval 5
298
+ `);
299
+ }
300
+ async function main() {
301
+ const args = process.argv.slice(2);
302
+ const action = args[0];
303
+ if (!action || action === '--help' || action === '-h') {
304
+ printHelp();
305
+ process.exit(0);
306
+ }
307
+ // Parse common args
308
+ let taskId;
309
+ let agentId;
310
+ let command;
311
+ let payload;
312
+ let pollInterval = 5;
313
+ for(let i = 1; i < args.length; i++){
314
+ const arg = args[i];
315
+ const value = args[i + 1];
316
+ switch(arg){
317
+ case '--task-id':
318
+ case '-t':
319
+ taskId = value;
320
+ i++;
321
+ break;
322
+ case '--agent-id':
323
+ case '-a':
324
+ agentId = value;
325
+ i++;
326
+ break;
327
+ case '--command':
328
+ case '-c':
329
+ command = value;
330
+ i++;
331
+ break;
332
+ case '--payload':
333
+ case '-p':
334
+ try {
335
+ payload = JSON.parse(value);
336
+ } catch {
337
+ console.error('Invalid JSON payload');
338
+ process.exit(1);
339
+ }
340
+ i++;
341
+ break;
342
+ case '--poll-interval':
343
+ pollInterval = parseInt(value, 10);
344
+ i++;
345
+ break;
346
+ }
347
+ }
348
+ if (!taskId || !agentId) {
349
+ console.error('Error: --task-id and --agent-id are required');
350
+ process.exit(1);
351
+ }
352
+ const config = {
353
+ taskId,
354
+ agentId
355
+ };
356
+ switch(action){
357
+ case 'send':
358
+ {
359
+ if (!command) {
360
+ console.error('Error: --command is required for send action');
361
+ process.exit(1);
362
+ }
363
+ const result = await sendCommand(config, {
364
+ type: command,
365
+ payload
366
+ });
367
+ console.log(JSON.stringify(result, null, 2));
368
+ // Wait for response
369
+ console.log('\n[agent-msg] Waiting for response (30s timeout)...');
370
+ const response = await waitForResponse(config, result.commandId, 30);
371
+ if (response) {
372
+ console.log('[agent-msg] Response received:');
373
+ console.log(JSON.stringify(response, null, 2));
374
+ } else {
375
+ console.log('[agent-msg] No response received (timeout)');
376
+ }
377
+ break;
378
+ }
379
+ case 'listen':
380
+ {
381
+ const processor = new AgentCommandProcessor(config);
382
+ // Handle shutdown signals
383
+ process.on('SIGINT', async ()=>{
384
+ console.log('\n[agent-msg] Received SIGINT, stopping...');
385
+ await processor.stop();
386
+ process.exit(0);
387
+ });
388
+ await processor.start(pollInterval);
389
+ break;
390
+ }
391
+ case 'status':
392
+ {
393
+ const status = await getAgentStatus(config);
394
+ if (status) {
395
+ console.log(JSON.stringify(status, null, 2));
396
+ } else {
397
+ console.log('No status available for agent');
398
+ }
399
+ break;
400
+ }
401
+ default:
402
+ console.error(`Unknown action: ${action}`);
403
+ printHelp();
404
+ process.exit(1);
405
+ }
406
+ }
407
+ // Run if called directly
408
+ if (import.meta.url.endsWith(process.argv[1]?.replace(/\\/g, '/') || '')) {
409
+ main().catch((err)=>{
410
+ console.error('[agent-msg] Fatal error:', err);
411
+ process.exit(2);
412
+ });
413
+ }
414
+
415
+ //# sourceMappingURL=agent-messaging.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/cli/coordination/agent-messaging.ts"],"sourcesContent":["#!/usr/bin/env node\r\n/**\r\n * Agent Messaging - Bidirectional Redis Communication\r\n *\r\n * Enables Main Chat to send commands to running CLI agents, and agents to process them.\r\n *\r\n * Main Chat → Agent: LPUSH cfn:agent:{taskId}:{agentId}:commands\r\n * Agent → Main Chat: SET cfn:agent:{taskId}:{agentId}:status (response)\r\n *\r\n * Supported Commands:\r\n * - status: Request agent status update\r\n * - redirect: Redirect agent to new task/context\r\n * - abort: Request clean agent abort\r\n * - pause: Request agent pause for N seconds\r\n *\r\n * Usage (Main Chat - send command):\r\n * npx tsx src/cli/coordination/agent-messaging.ts send \\\r\n * --task-id <id> --agent-id <aid> --command status\r\n *\r\n * Usage (Agent - process commands):\r\n * npx tsx src/cli/coordination/agent-messaging.ts listen \\\r\n * --task-id <id> --agent-id <aid> --poll-interval 5\r\n */\r\n\r\nimport { createClient, RedisClientType } from 'redis';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\nexport type CommandType = 'status' | 'redirect' | 'abort' | 'pause' | 'custom';\r\n\r\nexport interface AgentCommand {\r\n id: string;\r\n type: CommandType;\r\n timestamp: string;\r\n payload?: Record<string, unknown>;\r\n replyTo?: string; // Optional key for response\r\n}\r\n\r\nexport interface AgentStatus {\r\n agentId: string;\r\n taskId: string;\r\n status: 'running' | 'paused' | 'aborting' | 'completed';\r\n timestamp: string;\r\n progress?: number;\r\n currentStep?: string;\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\nexport interface MessagingConfig {\r\n taskId: string;\r\n agentId: string;\r\n redisHost?: string;\r\n redisPort?: number;\r\n redisPassword?: string;\r\n}\r\n\r\n// ============================================================================\r\n// Redis Key Helpers\r\n// ============================================================================\r\n\r\nfunction getCommandsKey(taskId: string, agentId: string): string {\r\n return `cfn:agent:${taskId}:${agentId}:commands`;\r\n}\r\n\r\nfunction getStatusKey(taskId: string, agentId: string): string {\r\n return `cfn:agent:${taskId}:${agentId}:status`;\r\n}\r\n\r\nfunction getResponseKey(taskId: string, agentId: string, commandId: string): string {\r\n return `cfn:agent:${taskId}:${agentId}:response:${commandId}`;\r\n}\r\n\r\n// ============================================================================\r\n// Main Chat Side - Send Commands\r\n// ============================================================================\r\n\r\n/**\r\n * Send a command to an agent via Redis\r\n */\r\nexport async function sendCommand(\r\n config: MessagingConfig,\r\n command: Omit<AgentCommand, 'id' | 'timestamp'>\r\n): Promise<{ sent: boolean; commandId: string }> {\r\n const {\r\n taskId,\r\n agentId,\r\n redisHost = process.env.CFN_REDIS_HOST || 'localhost',\r\n redisPort = parseInt(process.env.CFN_REDIS_PORT || '6379', 10),\r\n redisPassword = process.env.CFN_REDIS_PASSWORD || undefined\r\n } = config;\r\n\r\n const client: RedisClientType = createClient({\r\n socket: { host: redisHost, port: redisPort },\r\n password: redisPassword || undefined\r\n });\r\n\r\n const commandId = `cmd-${Date.now()}-${Math.random().toString(36).substring(2, 8)}`;\r\n const fullCommand: AgentCommand = {\r\n ...command,\r\n id: commandId,\r\n timestamp: new Date().toISOString(),\r\n replyTo: getResponseKey(taskId, agentId, commandId)\r\n };\r\n\r\n try {\r\n await client.connect();\r\n\r\n const commandsKey = getCommandsKey(taskId, agentId);\r\n await client.lPush(commandsKey, JSON.stringify(fullCommand));\r\n\r\n console.log(`[agent-msg] Sent command ${command.type} to ${agentId}`);\r\n console.log(`[agent-msg] Commands key: ${commandsKey}`);\r\n console.log(`[agent-msg] Command ID: ${commandId}`);\r\n\r\n return { sent: true, commandId };\r\n } finally {\r\n await client.disconnect();\r\n }\r\n}\r\n\r\n/**\r\n * Wait for agent response to a command\r\n */\r\nexport async function waitForResponse(\r\n config: MessagingConfig,\r\n commandId: string,\r\n timeoutSeconds: number = 30\r\n): Promise<AgentStatus | null> {\r\n const {\r\n taskId,\r\n agentId,\r\n redisHost = process.env.CFN_REDIS_HOST || 'localhost',\r\n redisPort = parseInt(process.env.CFN_REDIS_PORT || '6379', 10),\r\n redisPassword = process.env.CFN_REDIS_PASSWORD || undefined\r\n } = config;\r\n\r\n const client: RedisClientType = createClient({\r\n socket: { host: redisHost, port: redisPort },\r\n password: redisPassword || undefined\r\n });\r\n\r\n try {\r\n await client.connect();\r\n\r\n const responseKey = getResponseKey(taskId, agentId, commandId);\r\n const result = await client.blPop(responseKey, timeoutSeconds);\r\n\r\n if (result) {\r\n return JSON.parse(result.element) as AgentStatus;\r\n }\r\n return null;\r\n } finally {\r\n await client.disconnect();\r\n }\r\n}\r\n\r\n/**\r\n * Get current agent status (non-blocking)\r\n */\r\nexport async function getAgentStatus(config: MessagingConfig): Promise<AgentStatus | null> {\r\n const {\r\n taskId,\r\n agentId,\r\n redisHost = process.env.CFN_REDIS_HOST || 'localhost',\r\n redisPort = parseInt(process.env.CFN_REDIS_PORT || '6379', 10),\r\n redisPassword = process.env.CFN_REDIS_PASSWORD || undefined\r\n } = config;\r\n\r\n const client: RedisClientType = createClient({\r\n socket: { host: redisHost, port: redisPort },\r\n password: redisPassword || undefined\r\n });\r\n\r\n try {\r\n await client.connect();\r\n\r\n const statusKey = getStatusKey(taskId, agentId);\r\n const status = await client.get(statusKey);\r\n\r\n if (status) {\r\n return JSON.parse(status) as AgentStatus;\r\n }\r\n return null;\r\n } finally {\r\n await client.disconnect();\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Agent Side - Process Commands\r\n// ============================================================================\r\n\r\nexport type CommandHandler = (command: AgentCommand) => Promise<AgentStatus | void>;\r\n\r\n/**\r\n * Agent command processor - polls for and processes commands\r\n */\r\nexport class AgentCommandProcessor {\r\n private client: RedisClientType | null = null;\r\n private running = false;\r\n private handlers: Map<CommandType, CommandHandler> = new Map();\r\n\r\n constructor(private config: MessagingConfig) {\r\n // Default handlers\r\n this.handlers.set('status', this.handleStatus.bind(this));\r\n this.handlers.set('abort', this.handleAbort.bind(this));\r\n this.handlers.set('pause', this.handlePause.bind(this));\r\n }\r\n\r\n /**\r\n * Register a custom command handler\r\n */\r\n onCommand(type: CommandType, handler: CommandHandler): void {\r\n this.handlers.set(type, handler);\r\n }\r\n\r\n /**\r\n * Start processing commands (non-blocking poll loop)\r\n */\r\n async start(pollIntervalSeconds: number = 5): Promise<void> {\r\n const {\r\n taskId,\r\n agentId,\r\n redisHost = process.env.CFN_REDIS_HOST || 'localhost',\r\n redisPort = parseInt(process.env.CFN_REDIS_PORT || '6379', 10),\r\n redisPassword = process.env.CFN_REDIS_PASSWORD || undefined\r\n } = this.config;\r\n\r\n this.client = createClient({\r\n socket: { host: redisHost, port: redisPort },\r\n password: redisPassword || undefined\r\n });\r\n\r\n await this.client.connect();\r\n this.running = true;\r\n\r\n const commandsKey = getCommandsKey(taskId, agentId);\r\n console.log(`[agent-processor] Started listening on ${commandsKey}`);\r\n\r\n // Non-blocking poll loop\r\n while (this.running) {\r\n try {\r\n // Short BLPOP to check for commands without blocking too long\r\n const result = await this.client.blPop(commandsKey, pollIntervalSeconds);\r\n\r\n if (result) {\r\n const command: AgentCommand = JSON.parse(result.element);\r\n console.log(`[agent-processor] Received command: ${command.type} (${command.id})`);\r\n\r\n // Process command\r\n const handler = this.handlers.get(command.type);\r\n if (handler) {\r\n const response = await handler(command);\r\n\r\n // Send response if handler returned status\r\n if (response && command.replyTo) {\r\n await this.client.lPush(command.replyTo, JSON.stringify(response));\r\n console.log(`[agent-processor] Sent response to ${command.replyTo}`);\r\n }\r\n } else {\r\n console.warn(`[agent-processor] No handler for command type: ${command.type}`);\r\n }\r\n }\r\n } catch (err) {\r\n if (this.running) {\r\n console.error(`[agent-processor] Error processing command:`, err);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Stop processing commands\r\n */\r\n async stop(): Promise<void> {\r\n this.running = false;\r\n if (this.client) {\r\n await this.client.disconnect();\r\n this.client = null;\r\n }\r\n console.log(`[agent-processor] Stopped`);\r\n }\r\n\r\n /**\r\n * Update agent status in Redis\r\n */\r\n async updateStatus(status: Partial<AgentStatus>): Promise<void> {\r\n if (!this.client) return;\r\n\r\n const { taskId, agentId } = this.config;\r\n const fullStatus: AgentStatus = {\r\n agentId,\r\n taskId,\r\n status: 'running',\r\n timestamp: new Date().toISOString(),\r\n ...status\r\n };\r\n\r\n const statusKey = getStatusKey(taskId, agentId);\r\n await this.client.set(statusKey, JSON.stringify(fullStatus) as string);\r\n // Expire after 1 hour\r\n await this.client.expire(statusKey, 3600);\r\n }\r\n\r\n // Default handlers\r\n\r\n private async handleStatus(command: AgentCommand): Promise<AgentStatus> {\r\n const { taskId, agentId } = this.config;\r\n return {\r\n agentId,\r\n taskId,\r\n status: 'running',\r\n timestamp: new Date().toISOString(),\r\n metadata: { respondingTo: command.id }\r\n };\r\n }\r\n\r\n private async handleAbort(_command: AgentCommand): Promise<AgentStatus> {\r\n const { taskId, agentId } = this.config;\r\n console.log(`[agent-processor] Abort requested, shutting down...`);\r\n\r\n // Schedule stop after response\r\n setTimeout(() => this.stop(), 100);\r\n\r\n return {\r\n agentId,\r\n taskId,\r\n status: 'aborting',\r\n timestamp: new Date().toISOString()\r\n };\r\n }\r\n\r\n private async handlePause(command: AgentCommand): Promise<AgentStatus> {\r\n const { taskId, agentId } = this.config;\r\n const pauseSeconds = (command.payload?.seconds as number) || 10;\r\n\r\n console.log(`[agent-processor] Pausing for ${pauseSeconds}s...`);\r\n await new Promise(resolve => setTimeout(resolve, pauseSeconds * 1000));\r\n console.log(`[agent-processor] Resumed after pause`);\r\n\r\n return {\r\n agentId,\r\n taskId,\r\n status: 'running',\r\n timestamp: new Date().toISOString(),\r\n metadata: { pausedFor: pauseSeconds }\r\n };\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// CLI Entry Point\r\n// ============================================================================\r\n\r\nfunction printHelp(): void {\r\n console.log(`\r\nAgent Messaging - Bidirectional Redis Communication\r\n\r\nUSAGE:\r\n # Send command to agent (Main Chat side)\r\n npx tsx src/cli/coordination/agent-messaging.ts send \\\\\r\n --task-id <id> --agent-id <aid> --command <type> [--payload <json>]\r\n\r\n # Listen for commands (Agent side)\r\n npx tsx src/cli/coordination/agent-messaging.ts listen \\\\\r\n --task-id <id> --agent-id <aid> [--poll-interval <seconds>]\r\n\r\n # Get agent status (Main Chat side)\r\n npx tsx src/cli/coordination/agent-messaging.ts status \\\\\r\n --task-id <id> --agent-id <aid>\r\n\r\nCOMMANDS:\r\n status Request agent status update\r\n redirect Redirect agent to new task (include --payload)\r\n abort Request clean agent abort\r\n pause Pause agent (include --payload '{\"seconds\": 10}')\r\n custom Custom command (include --payload)\r\n\r\nEXAMPLES:\r\n # Request status from agent\r\n npx tsx src/cli/coordination/agent-messaging.ts send \\\\\r\n --task-id cfn-cli-123 --agent-id backend-dev-456 --command status\r\n\r\n # Abort agent\r\n npx tsx src/cli/coordination/agent-messaging.ts send \\\\\r\n --task-id cfn-cli-123 --agent-id backend-dev-456 --command abort\r\n\r\n # Pause agent for 30 seconds\r\n npx tsx src/cli/coordination/agent-messaging.ts send \\\\\r\n --task-id cfn-cli-123 --agent-id backend-dev-456 \\\\\r\n --command pause --payload '{\"seconds\": 30}'\r\n\r\n # Redirect agent to new context\r\n npx tsx src/cli/coordination/agent-messaging.ts send \\\\\r\n --task-id cfn-cli-123 --agent-id backend-dev-456 \\\\\r\n --command redirect --payload '{\"newTask\": \"Focus on security tests\"}'\r\n\r\n # Start listening for commands (agent side)\r\n npx tsx src/cli/coordination/agent-messaging.ts listen \\\\\r\n --task-id cfn-cli-123 --agent-id backend-dev-456 --poll-interval 5\r\n`);\r\n}\r\n\r\nasync function main(): Promise<void> {\r\n const args = process.argv.slice(2);\r\n const action = args[0];\r\n\r\n if (!action || action === '--help' || action === '-h') {\r\n printHelp();\r\n process.exit(0);\r\n }\r\n\r\n // Parse common args\r\n let taskId: string | undefined;\r\n let agentId: string | undefined;\r\n let command: CommandType | undefined;\r\n let payload: Record<string, unknown> | undefined;\r\n let pollInterval = 5;\r\n\r\n for (let i = 1; i < args.length; i++) {\r\n const arg = args[i];\r\n const value = args[i + 1];\r\n\r\n switch (arg) {\r\n case '--task-id':\r\n case '-t':\r\n taskId = value;\r\n i++;\r\n break;\r\n case '--agent-id':\r\n case '-a':\r\n agentId = value;\r\n i++;\r\n break;\r\n case '--command':\r\n case '-c':\r\n command = value as CommandType;\r\n i++;\r\n break;\r\n case '--payload':\r\n case '-p':\r\n try {\r\n payload = JSON.parse(value);\r\n } catch {\r\n console.error('Invalid JSON payload');\r\n process.exit(1);\r\n }\r\n i++;\r\n break;\r\n case '--poll-interval':\r\n pollInterval = parseInt(value, 10);\r\n i++;\r\n break;\r\n }\r\n }\r\n\r\n if (!taskId || !agentId) {\r\n console.error('Error: --task-id and --agent-id are required');\r\n process.exit(1);\r\n }\r\n\r\n const config: MessagingConfig = { taskId, agentId };\r\n\r\n switch (action) {\r\n case 'send': {\r\n if (!command) {\r\n console.error('Error: --command is required for send action');\r\n process.exit(1);\r\n }\r\n const result = await sendCommand(config, { type: command, payload });\r\n console.log(JSON.stringify(result, null, 2));\r\n\r\n // Wait for response\r\n console.log('\\n[agent-msg] Waiting for response (30s timeout)...');\r\n const response = await waitForResponse(config, result.commandId, 30);\r\n if (response) {\r\n console.log('[agent-msg] Response received:');\r\n console.log(JSON.stringify(response, null, 2));\r\n } else {\r\n console.log('[agent-msg] No response received (timeout)');\r\n }\r\n break;\r\n }\r\n\r\n case 'listen': {\r\n const processor = new AgentCommandProcessor(config);\r\n\r\n // Handle shutdown signals\r\n process.on('SIGINT', async () => {\r\n console.log('\\n[agent-msg] Received SIGINT, stopping...');\r\n await processor.stop();\r\n process.exit(0);\r\n });\r\n\r\n await processor.start(pollInterval);\r\n break;\r\n }\r\n\r\n case 'status': {\r\n const status = await getAgentStatus(config);\r\n if (status) {\r\n console.log(JSON.stringify(status, null, 2));\r\n } else {\r\n console.log('No status available for agent');\r\n }\r\n break;\r\n }\r\n\r\n default:\r\n console.error(`Unknown action: ${action}`);\r\n printHelp();\r\n process.exit(1);\r\n }\r\n}\r\n\r\n// Run if called directly\r\nif (import.meta.url.endsWith(process.argv[1]?.replace(/\\\\/g, '/') || '')) {\r\n main().catch(err => {\r\n console.error('[agent-msg] Fatal error:', err);\r\n process.exit(2);\r\n });\r\n}\r\n"],"names":["createClient","getCommandsKey","taskId","agentId","getStatusKey","getResponseKey","commandId","sendCommand","config","command","redisHost","process","env","CFN_REDIS_HOST","redisPort","parseInt","CFN_REDIS_PORT","redisPassword","CFN_REDIS_PASSWORD","undefined","client","socket","host","port","password","Date","now","Math","random","toString","substring","fullCommand","id","timestamp","toISOString","replyTo","connect","commandsKey","lPush","JSON","stringify","console","log","type","sent","disconnect","waitForResponse","timeoutSeconds","responseKey","result","blPop","parse","element","getAgentStatus","statusKey","status","get","AgentCommandProcessor","running","handlers","Map","set","handleStatus","bind","handleAbort","handlePause","onCommand","handler","start","pollIntervalSeconds","response","warn","err","error","stop","updateStatus","fullStatus","expire","metadata","respondingTo","_command","setTimeout","pauseSeconds","payload","seconds","Promise","resolve","pausedFor","printHelp","main","args","argv","slice","action","exit","pollInterval","i","length","arg","value","processor","on","url","endsWith","replace","catch"],"mappings":"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"}