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
@@ -0,0 +1,362 @@
1
+ /**
2
+ * Trigger.dev Webhook Handlers for CFN Loop Integration
3
+ *
4
+ * Express router providing secure webhook endpoints for:
5
+ * - Agent completion events
6
+ * - Gate check results
7
+ * - Consensus collection results
8
+ * - Product Owner decisions
9
+ *
10
+ * Configuration:
11
+ * - WEBHOOK_SECRET: Shared secret for HMAC signature verification
12
+ * - WEBHOOK_ALGORITHM: Hash algorithm (default: sha256)
13
+ */ import { Router } from 'express';
14
+ import { createHmac, timingSafeEqual } from 'node:crypto';
15
+ /**
16
+ * Webhook validation error class
17
+ */ export class WebhookValidationError extends Error {
18
+ reason;
19
+ statusCode;
20
+ constructor(message, reason, statusCode = 401){
21
+ super(message), this.reason = reason, this.statusCode = statusCode;
22
+ this.name = 'WebhookValidationError';
23
+ }
24
+ }
25
+ /**
26
+ * TriggerDevWebhooks - Express router for secure webhook handling
27
+ *
28
+ * Provides endpoints:
29
+ * - POST /webhooks/agent-complete
30
+ * - POST /webhooks/gate-result
31
+ * - POST /webhooks/consensus-result
32
+ * - POST /webhooks/po-decision
33
+ */ export class TriggerDevWebhooks {
34
+ router;
35
+ config;
36
+ verificationOptions;
37
+ // Handler maps for dependency injection
38
+ agentCompleteHandler;
39
+ gateResultHandler;
40
+ consensusResultHandler;
41
+ poDecisionHandler;
42
+ constructor(config){
43
+ this.router = Router();
44
+ this.config = {
45
+ secret: config?.secret || process.env.WEBHOOK_SECRET || 'default-secret',
46
+ algorithm: config?.algorithm || process.env.WEBHOOK_ALGORITHM || 'sha256',
47
+ verifySignature: config?.verifySignature !== false
48
+ };
49
+ this.verificationOptions = {
50
+ algorithmType: this.config.algorithm || 'sha256',
51
+ headerName: 'x-trigger-signature'
52
+ };
53
+ this.setupRoutes();
54
+ }
55
+ /**
56
+ * Register handler for agent completion events
57
+ */ onAgentComplete(handler) {
58
+ this.agentCompleteHandler = handler;
59
+ return this;
60
+ }
61
+ /**
62
+ * Register handler for gate result events
63
+ */ onGateResult(handler) {
64
+ this.gateResultHandler = handler;
65
+ return this;
66
+ }
67
+ /**
68
+ * Register handler for consensus result events
69
+ */ onConsensusResult(handler) {
70
+ this.consensusResultHandler = handler;
71
+ return this;
72
+ }
73
+ /**
74
+ * Register handler for Product Owner decision events
75
+ */ onPODecision(handler) {
76
+ this.poDecisionHandler = handler;
77
+ return this;
78
+ }
79
+ /**
80
+ * Get Express router for mounting
81
+ */ getRouter() {
82
+ return this.router;
83
+ }
84
+ /**
85
+ * Setup all webhook routes
86
+ *
87
+ * @private
88
+ */ setupRoutes() {
89
+ // Middleware for signature verification
90
+ this.router.use(this.signatureVerificationMiddleware.bind(this));
91
+ // Agent completion endpoint
92
+ this.router.post('/agent-complete', this.handleAgentComplete.bind(this));
93
+ // Gate result endpoint
94
+ this.router.post('/gate-result', this.handleGateResult.bind(this));
95
+ // Consensus result endpoint
96
+ this.router.post('/consensus-result', this.handleConsensusResult.bind(this));
97
+ // PO decision endpoint
98
+ this.router.post('/po-decision', this.handlePODecision.bind(this));
99
+ // Error handling middleware
100
+ this.router.use(this.errorHandler.bind(this));
101
+ }
102
+ /**
103
+ * Signature verification middleware
104
+ *
105
+ * TODO: RUNTIME_TEST: Verify HMAC signature validation with valid/invalid keys
106
+ *
107
+ * @private
108
+ */ async signatureVerificationMiddleware(req, res, next) {
109
+ try {
110
+ if (!this.config.verifySignature) {
111
+ return next();
112
+ }
113
+ const signature = req.headers[this.verificationOptions.headerName];
114
+ if (!signature) {
115
+ throw new WebhookValidationError('Missing webhook signature', 'MISSING_SIGNATURE');
116
+ }
117
+ const body = JSON.stringify(req.body);
118
+ const isValid = await this.verifySignature(body, signature);
119
+ if (!isValid) {
120
+ throw new WebhookValidationError('Invalid webhook signature', 'INVALID_SIGNATURE');
121
+ }
122
+ next();
123
+ } catch (error) {
124
+ if (error instanceof WebhookValidationError) {
125
+ return res.status(error.statusCode).json({
126
+ success: false,
127
+ message: error.message,
128
+ reason: error.reason
129
+ });
130
+ }
131
+ return res.status(500).json({
132
+ success: false,
133
+ message: 'Signature verification failed',
134
+ reason: 'INTERNAL_ERROR'
135
+ });
136
+ }
137
+ }
138
+ /**
139
+ * Handle agent completion webhook
140
+ *
141
+ * @private
142
+ */ async handleAgentComplete(req, res) {
143
+ try {
144
+ const payload = req.body;
145
+ // Validate required fields
146
+ if (!payload.agentId || !payload.taskId) {
147
+ return res.status(400).json({
148
+ success: false,
149
+ message: 'Missing required fields',
150
+ data: null
151
+ });
152
+ }
153
+ const context = {
154
+ payload,
155
+ isVerified: this.config.verifySignature,
156
+ timestamp: Date.now(),
157
+ signature: req.headers[this.verificationOptions.headerName]
158
+ };
159
+ if (this.agentCompleteHandler) {
160
+ const result = await this.agentCompleteHandler(context);
161
+ return res.status(200).json(result);
162
+ }
163
+ res.status(200).json({
164
+ success: true,
165
+ message: 'Agent completion event received',
166
+ data: {
167
+ agentId: payload.agentId
168
+ }
169
+ });
170
+ } catch (error) {
171
+ return res.status(500).json({
172
+ success: false,
173
+ message: 'Failed to handle agent completion',
174
+ data: null
175
+ });
176
+ }
177
+ }
178
+ /**
179
+ * Handle gate result webhook
180
+ *
181
+ * @private
182
+ */ async handleGateResult(req, res) {
183
+ try {
184
+ const payload = req.body;
185
+ if (!payload.taskId || payload.gateType === undefined) {
186
+ return res.status(400).json({
187
+ success: false,
188
+ message: 'Missing required fields',
189
+ data: null
190
+ });
191
+ }
192
+ const context = {
193
+ payload,
194
+ isVerified: this.config.verifySignature,
195
+ timestamp: Date.now(),
196
+ signature: req.headers[this.verificationOptions.headerName]
197
+ };
198
+ if (this.gateResultHandler) {
199
+ const result = await this.gateResultHandler(context);
200
+ return res.status(200).json(result);
201
+ }
202
+ res.status(200).json({
203
+ success: true,
204
+ message: 'Gate result received',
205
+ data: {
206
+ taskId: payload.taskId,
207
+ passed: payload.passed
208
+ }
209
+ });
210
+ } catch (error) {
211
+ return res.status(500).json({
212
+ success: false,
213
+ message: 'Failed to handle gate result',
214
+ data: null
215
+ });
216
+ }
217
+ }
218
+ /**
219
+ * Handle consensus result webhook
220
+ *
221
+ * @private
222
+ */ async handleConsensusResult(req, res) {
223
+ try {
224
+ const payload = req.body;
225
+ if (!payload.taskId || payload.validatorCount === undefined) {
226
+ return res.status(400).json({
227
+ success: false,
228
+ message: 'Missing required fields',
229
+ data: null
230
+ });
231
+ }
232
+ const context = {
233
+ payload,
234
+ isVerified: this.config.verifySignature,
235
+ timestamp: Date.now(),
236
+ signature: req.headers[this.verificationOptions.headerName]
237
+ };
238
+ if (this.consensusResultHandler) {
239
+ const result = await this.consensusResultHandler(context);
240
+ return res.status(200).json(result);
241
+ }
242
+ res.status(200).json({
243
+ success: true,
244
+ message: 'Consensus result received',
245
+ data: {
246
+ taskId: payload.taskId,
247
+ consensusScore: payload.consensusScore
248
+ }
249
+ });
250
+ } catch (error) {
251
+ return res.status(500).json({
252
+ success: false,
253
+ message: 'Failed to handle consensus result',
254
+ data: null
255
+ });
256
+ }
257
+ }
258
+ /**
259
+ * Handle Product Owner decision webhook
260
+ *
261
+ * @private
262
+ */ async handlePODecision(req, res) {
263
+ try {
264
+ const payload = req.body;
265
+ if (!payload.taskId || !payload.decision) {
266
+ return res.status(400).json({
267
+ success: false,
268
+ message: 'Missing required fields',
269
+ data: null
270
+ });
271
+ }
272
+ // Validate decision enum
273
+ if (![
274
+ 'PROCEED',
275
+ 'ITERATE',
276
+ 'ABORT'
277
+ ].includes(payload.decision)) {
278
+ return res.status(400).json({
279
+ success: false,
280
+ message: 'Invalid decision value',
281
+ data: null
282
+ });
283
+ }
284
+ const context = {
285
+ payload,
286
+ isVerified: this.config.verifySignature,
287
+ timestamp: Date.now(),
288
+ signature: req.headers[this.verificationOptions.headerName]
289
+ };
290
+ if (this.poDecisionHandler) {
291
+ const result = await this.poDecisionHandler(context);
292
+ return res.status(200).json(result);
293
+ }
294
+ res.status(200).json({
295
+ success: true,
296
+ message: 'PO decision received',
297
+ data: {
298
+ taskId: payload.taskId,
299
+ decision: payload.decision
300
+ }
301
+ });
302
+ } catch (error) {
303
+ return res.status(500).json({
304
+ success: false,
305
+ message: 'Failed to handle PO decision',
306
+ data: null
307
+ });
308
+ }
309
+ }
310
+ /**
311
+ * Verify HMAC signature of webhook payload
312
+ *
313
+ * @private
314
+ * @param payload Raw request body as string
315
+ * @param signature Signature header value
316
+ * @returns Promise resolving to true if signature is valid
317
+ */ async verifySignature(payload, signature) {
318
+ try {
319
+ const hmac = createHmac(this.verificationOptions.algorithmType, this.config.secret);
320
+ hmac.update(payload, 'utf8');
321
+ const expectedSignature = hmac.digest('hex');
322
+ // Use timing-safe comparison
323
+ return timingSafeEqual(Buffer.from(signature), Buffer.from(expectedSignature));
324
+ } catch (error) {
325
+ console.error('Signature verification error:', error);
326
+ return false;
327
+ }
328
+ }
329
+ /**
330
+ * Error handling middleware
331
+ *
332
+ * @private
333
+ */ errorHandler(error, req, res, next) {
334
+ console.error('Webhook error:', error);
335
+ res.status(500).json({
336
+ success: false,
337
+ message: 'Internal server error',
338
+ data: null
339
+ });
340
+ }
341
+ }
342
+ /**
343
+ * Create webhook router with optional handlers
344
+ */ export const createWebhookRouter = (config, handlers)=>{
345
+ const webhooks = new TriggerDevWebhooks(config);
346
+ if (handlers?.onAgentComplete) {
347
+ webhooks.onAgentComplete(handlers.onAgentComplete);
348
+ }
349
+ if (handlers?.onGateResult) {
350
+ webhooks.onGateResult(handlers.onGateResult);
351
+ }
352
+ if (handlers?.onConsensusResult) {
353
+ webhooks.onConsensusResult(handlers.onConsensusResult);
354
+ }
355
+ if (handlers?.onPODecision) {
356
+ webhooks.onPODecision(handlers.onPODecision);
357
+ }
358
+ return webhooks.getRouter();
359
+ };
360
+ export default TriggerDevWebhooks;
361
+
362
+ //# sourceMappingURL=trigger-dev-webhooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/integration/trigger-dev-webhooks.ts"],"sourcesContent":["/**\r\n * Trigger.dev Webhook Handlers for CFN Loop Integration\r\n *\r\n * Express router providing secure webhook endpoints for:\r\n * - Agent completion events\r\n * - Gate check results\r\n * - Consensus collection results\r\n * - Product Owner decisions\r\n *\r\n * Configuration:\r\n * - WEBHOOK_SECRET: Shared secret for HMAC signature verification\r\n * - WEBHOOK_ALGORITHM: Hash algorithm (default: sha256)\r\n */\r\n\r\nimport { Router } from 'express';\r\nimport type { Request, Response, NextFunction } from 'express';\r\nimport { createHmac, timingSafeEqual } from 'node:crypto';\r\n\r\nimport type {\r\n AgentCompletePayload,\r\n GateResultPayload,\r\n ConsensusResultPayload,\r\n PODecisionPayload,\r\n WebhookContext,\r\n WebhookHandlerResult,\r\n WebhookVerificationOptions,\r\n} from '../types/trigger-dev-events.d.js';\r\n\r\n/**\r\n * Webhook validation error class\r\n */\r\nexport class WebhookValidationError extends Error {\r\n constructor(\r\n message: string,\r\n public readonly reason: string,\r\n public readonly statusCode: number = 401\r\n ) {\r\n super(message);\r\n this.name = 'WebhookValidationError';\r\n }\r\n}\r\n\r\n/**\r\n * Webhook handler type\r\n */\r\nexport type WebhookHandler<T> = (\r\n context: WebhookContext<T>\r\n) => Promise<WebhookHandlerResult>;\r\n\r\n/**\r\n * Configuration for webhook handlers\r\n */\r\nexport interface WebhookConfig {\r\n secret?: string;\r\n algorithm?: string;\r\n verifySignature?: boolean;\r\n}\r\n\r\n/**\r\n * TriggerDevWebhooks - Express router for secure webhook handling\r\n *\r\n * Provides endpoints:\r\n * - POST /webhooks/agent-complete\r\n * - POST /webhooks/gate-result\r\n * - POST /webhooks/consensus-result\r\n * - POST /webhooks/po-decision\r\n */\r\nexport class TriggerDevWebhooks {\r\n private readonly router: Router;\r\n private readonly config: Required<WebhookConfig>;\r\n private readonly verificationOptions: WebhookVerificationOptions;\r\n\r\n // Handler maps for dependency injection\r\n private agentCompleteHandler?: WebhookHandler<AgentCompletePayload>;\r\n private gateResultHandler?: WebhookHandler<GateResultPayload>;\r\n private consensusResultHandler?: WebhookHandler<ConsensusResultPayload>;\r\n private poDecisionHandler?: WebhookHandler<PODecisionPayload>;\r\n\r\n constructor(config?: WebhookConfig) {\r\n this.router = Router();\r\n this.config = {\r\n secret: config?.secret || process.env.WEBHOOK_SECRET || 'default-secret',\r\n algorithm: config?.algorithm || process.env.WEBHOOK_ALGORITHM || 'sha256',\r\n verifySignature: config?.verifySignature !== false,\r\n };\r\n\r\n this.verificationOptions = {\r\n algorithmType: (this.config.algorithm as 'sha256' | 'sha512') || 'sha256',\r\n headerName: 'x-trigger-signature',\r\n };\r\n\r\n this.setupRoutes();\r\n }\r\n\r\n /**\r\n * Register handler for agent completion events\r\n */\r\n onAgentComplete(handler: WebhookHandler<AgentCompletePayload>): this {\r\n this.agentCompleteHandler = handler;\r\n return this;\r\n }\r\n\r\n /**\r\n * Register handler for gate result events\r\n */\r\n onGateResult(handler: WebhookHandler<GateResultPayload>): this {\r\n this.gateResultHandler = handler;\r\n return this;\r\n }\r\n\r\n /**\r\n * Register handler for consensus result events\r\n */\r\n onConsensusResult(handler: WebhookHandler<ConsensusResultPayload>): this {\r\n this.consensusResultHandler = handler;\r\n return this;\r\n }\r\n\r\n /**\r\n * Register handler for Product Owner decision events\r\n */\r\n onPODecision(handler: WebhookHandler<PODecisionPayload>): this {\r\n this.poDecisionHandler = handler;\r\n return this;\r\n }\r\n\r\n /**\r\n * Get Express router for mounting\r\n */\r\n getRouter(): Router {\r\n return this.router;\r\n }\r\n\r\n /**\r\n * Setup all webhook routes\r\n *\r\n * @private\r\n */\r\n private setupRoutes(): void {\r\n // Middleware for signature verification\r\n this.router.use(this.signatureVerificationMiddleware.bind(this));\r\n\r\n // Agent completion endpoint\r\n this.router.post('/agent-complete', this.handleAgentComplete.bind(this));\r\n\r\n // Gate result endpoint\r\n this.router.post('/gate-result', this.handleGateResult.bind(this));\r\n\r\n // Consensus result endpoint\r\n this.router.post('/consensus-result', this.handleConsensusResult.bind(this));\r\n\r\n // PO decision endpoint\r\n this.router.post('/po-decision', this.handlePODecision.bind(this));\r\n\r\n // Error handling middleware\r\n this.router.use(this.errorHandler.bind(this));\r\n }\r\n\r\n /**\r\n * Signature verification middleware\r\n *\r\n * TODO: RUNTIME_TEST: Verify HMAC signature validation with valid/invalid keys\r\n *\r\n * @private\r\n */\r\n private async signatureVerificationMiddleware(\r\n req: Request,\r\n res: Response,\r\n next: NextFunction\r\n ): Promise<void> {\r\n try {\r\n if (!this.config.verifySignature) {\r\n return next();\r\n }\r\n\r\n const signature = req.headers[this.verificationOptions.headerName];\r\n\r\n if (!signature) {\r\n throw new WebhookValidationError(\r\n 'Missing webhook signature',\r\n 'MISSING_SIGNATURE'\r\n );\r\n }\r\n\r\n const body = JSON.stringify(req.body);\r\n const isValid = await this.verifySignature(body, signature as string);\r\n\r\n if (!isValid) {\r\n throw new WebhookValidationError(\r\n 'Invalid webhook signature',\r\n 'INVALID_SIGNATURE'\r\n );\r\n }\r\n\r\n next();\r\n } catch (error) {\r\n if (error instanceof WebhookValidationError) {\r\n return res.status(error.statusCode).json({\r\n success: false,\r\n message: error.message,\r\n reason: error.reason,\r\n });\r\n }\r\n\r\n return res.status(500).json({\r\n success: false,\r\n message: 'Signature verification failed',\r\n reason: 'INTERNAL_ERROR',\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Handle agent completion webhook\r\n *\r\n * @private\r\n */\r\n private async handleAgentComplete(\r\n req: Request,\r\n res: Response\r\n ): Promise<void> {\r\n try {\r\n const payload = req.body as AgentCompletePayload;\r\n\r\n // Validate required fields\r\n if (!payload.agentId || !payload.taskId) {\r\n return res.status(400).json({\r\n success: false,\r\n message: 'Missing required fields',\r\n data: null,\r\n });\r\n }\r\n\r\n const context: WebhookContext<AgentCompletePayload> = {\r\n payload,\r\n isVerified: this.config.verifySignature,\r\n timestamp: Date.now(),\r\n signature: req.headers[this.verificationOptions.headerName] as string,\r\n };\r\n\r\n if (this.agentCompleteHandler) {\r\n const result = await this.agentCompleteHandler(context);\r\n return res.status(200).json(result);\r\n }\r\n\r\n res.status(200).json({\r\n success: true,\r\n message: 'Agent completion event received',\r\n data: { agentId: payload.agentId },\r\n });\r\n } catch (error) {\r\n return res.status(500).json({\r\n success: false,\r\n message: 'Failed to handle agent completion',\r\n data: null,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Handle gate result webhook\r\n *\r\n * @private\r\n */\r\n private async handleGateResult(req: Request, res: Response): Promise<void> {\r\n try {\r\n const payload = req.body as GateResultPayload;\r\n\r\n if (!payload.taskId || payload.gateType === undefined) {\r\n return res.status(400).json({\r\n success: false,\r\n message: 'Missing required fields',\r\n data: null,\r\n });\r\n }\r\n\r\n const context: WebhookContext<GateResultPayload> = {\r\n payload,\r\n isVerified: this.config.verifySignature,\r\n timestamp: Date.now(),\r\n signature: req.headers[this.verificationOptions.headerName] as string,\r\n };\r\n\r\n if (this.gateResultHandler) {\r\n const result = await this.gateResultHandler(context);\r\n return res.status(200).json(result);\r\n }\r\n\r\n res.status(200).json({\r\n success: true,\r\n message: 'Gate result received',\r\n data: { taskId: payload.taskId, passed: payload.passed },\r\n });\r\n } catch (error) {\r\n return res.status(500).json({\r\n success: false,\r\n message: 'Failed to handle gate result',\r\n data: null,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Handle consensus result webhook\r\n *\r\n * @private\r\n */\r\n private async handleConsensusResult(\r\n req: Request,\r\n res: Response\r\n ): Promise<void> {\r\n try {\r\n const payload = req.body as ConsensusResultPayload;\r\n\r\n if (!payload.taskId || payload.validatorCount === undefined) {\r\n return res.status(400).json({\r\n success: false,\r\n message: 'Missing required fields',\r\n data: null,\r\n });\r\n }\r\n\r\n const context: WebhookContext<ConsensusResultPayload> = {\r\n payload,\r\n isVerified: this.config.verifySignature,\r\n timestamp: Date.now(),\r\n signature: req.headers[this.verificationOptions.headerName] as string,\r\n };\r\n\r\n if (this.consensusResultHandler) {\r\n const result = await this.consensusResultHandler(context);\r\n return res.status(200).json(result);\r\n }\r\n\r\n res.status(200).json({\r\n success: true,\r\n message: 'Consensus result received',\r\n data: {\r\n taskId: payload.taskId,\r\n consensusScore: payload.consensusScore,\r\n },\r\n });\r\n } catch (error) {\r\n return res.status(500).json({\r\n success: false,\r\n message: 'Failed to handle consensus result',\r\n data: null,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Handle Product Owner decision webhook\r\n *\r\n * @private\r\n */\r\n private async handlePODecision(req: Request, res: Response): Promise<void> {\r\n try {\r\n const payload = req.body as PODecisionPayload;\r\n\r\n if (!payload.taskId || !payload.decision) {\r\n return res.status(400).json({\r\n success: false,\r\n message: 'Missing required fields',\r\n data: null,\r\n });\r\n }\r\n\r\n // Validate decision enum\r\n if (!['PROCEED', 'ITERATE', 'ABORT'].includes(payload.decision)) {\r\n return res.status(400).json({\r\n success: false,\r\n message: 'Invalid decision value',\r\n data: null,\r\n });\r\n }\r\n\r\n const context: WebhookContext<PODecisionPayload> = {\r\n payload,\r\n isVerified: this.config.verifySignature,\r\n timestamp: Date.now(),\r\n signature: req.headers[this.verificationOptions.headerName] as string,\r\n };\r\n\r\n if (this.poDecisionHandler) {\r\n const result = await this.poDecisionHandler(context);\r\n return res.status(200).json(result);\r\n }\r\n\r\n res.status(200).json({\r\n success: true,\r\n message: 'PO decision received',\r\n data: { taskId: payload.taskId, decision: payload.decision },\r\n });\r\n } catch (error) {\r\n return res.status(500).json({\r\n success: false,\r\n message: 'Failed to handle PO decision',\r\n data: null,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Verify HMAC signature of webhook payload\r\n *\r\n * @private\r\n * @param payload Raw request body as string\r\n * @param signature Signature header value\r\n * @returns Promise resolving to true if signature is valid\r\n */\r\n private async verifySignature(\r\n payload: string,\r\n signature: string\r\n ): Promise<boolean> {\r\n try {\r\n const hmac = createHmac(\r\n this.verificationOptions.algorithmType,\r\n this.config.secret\r\n );\r\n hmac.update(payload, 'utf8');\r\n const expectedSignature = hmac.digest('hex');\r\n\r\n // Use timing-safe comparison\r\n return timingSafeEqual(\r\n Buffer.from(signature),\r\n Buffer.from(expectedSignature)\r\n );\r\n } catch (error) {\r\n console.error('Signature verification error:', error);\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Error handling middleware\r\n *\r\n * @private\r\n */\r\n private errorHandler(\r\n error: Error,\r\n req: Request,\r\n res: Response,\r\n next: NextFunction\r\n ): void {\r\n console.error('Webhook error:', error);\r\n\r\n res.status(500).json({\r\n success: false,\r\n message: 'Internal server error',\r\n data: null,\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Create webhook router with optional handlers\r\n */\r\nexport const createWebhookRouter = (\r\n config?: WebhookConfig,\r\n handlers?: {\r\n onAgentComplete?: WebhookHandler<AgentCompletePayload>;\r\n onGateResult?: WebhookHandler<GateResultPayload>;\r\n onConsensusResult?: WebhookHandler<ConsensusResultPayload>;\r\n onPODecision?: WebhookHandler<PODecisionPayload>;\r\n }\r\n): Router => {\r\n const webhooks = new TriggerDevWebhooks(config);\r\n\r\n if (handlers?.onAgentComplete) {\r\n webhooks.onAgentComplete(handlers.onAgentComplete);\r\n }\r\n if (handlers?.onGateResult) {\r\n webhooks.onGateResult(handlers.onGateResult);\r\n }\r\n if (handlers?.onConsensusResult) {\r\n webhooks.onConsensusResult(handlers.onConsensusResult);\r\n }\r\n if (handlers?.onPODecision) {\r\n webhooks.onPODecision(handlers.onPODecision);\r\n }\r\n\r\n return webhooks.getRouter();\r\n};\r\n\r\nexport default TriggerDevWebhooks;\r\n"],"names":["Router","createHmac","timingSafeEqual","WebhookValidationError","Error","message","reason","statusCode","name","TriggerDevWebhooks","router","config","verificationOptions","agentCompleteHandler","gateResultHandler","consensusResultHandler","poDecisionHandler","secret","process","env","WEBHOOK_SECRET","algorithm","WEBHOOK_ALGORITHM","verifySignature","algorithmType","headerName","setupRoutes","onAgentComplete","handler","onGateResult","onConsensusResult","onPODecision","getRouter","use","signatureVerificationMiddleware","bind","post","handleAgentComplete","handleGateResult","handleConsensusResult","handlePODecision","errorHandler","req","res","next","signature","headers","body","JSON","stringify","isValid","error","status","json","success","payload","agentId","taskId","data","context","isVerified","timestamp","Date","now","result","gateType","undefined","passed","validatorCount","consensusScore","decision","includes","hmac","update","expectedSignature","digest","Buffer","from","console","createWebhookRouter","handlers","webhooks"],"mappings":"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"}
@@ -6,6 +6,10 @@
6
6
  import { createHash } from 'crypto';
7
7
  import { readFileSync, existsSync, mkdirSync, statSync } from 'fs';
8
8
  import { join, dirname } from 'path';
9
+ import { fileURLToPath } from 'url';
10
+ // ESM-compatible __dirname
11
+ const __filename = fileURLToPath(import.meta.url);
12
+ const __dirname = dirname(__filename);
9
13
  // ============================================================================
10
14
  // Error Classes
11
15
  // ============================================================================
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/artifact-registry.ts"],"sourcesContent":["/**\r\n * Artifact Registry TypeScript API\r\n * Provides centralized artifact management with TTL-based cleanup\r\n * Version: 1.0.0\r\n */\r\n\r\nimport Database from 'better-sqlite3';\r\nimport { createHash } from 'crypto';\r\nimport { readFileSync, existsSync, mkdirSync, statSync } from 'fs';\r\nimport { join, dirname } from 'path';\r\n\r\n// ============================================================================\r\n// Types and Interfaces\r\n// ============================================================================\r\n\r\nexport type ArtifactType = 'code' | 'documentation' | 'test' | 'config' | 'binary' | 'data' | 'model' | 'report' | 'other';\r\nexport type ArtifactStatus = 'active' | 'archived' | 'deleted';\r\nexport type RetentionPolicy = 'ephemeral' | 'standard' | 'permanent' | 'custom';\r\n\r\nexport interface ArtifactMetadata {\r\n name: string;\r\n type: ArtifactType;\r\n format?: string;\r\n content?: string;\r\n storage_location: string;\r\n swarm_id?: string;\r\n agent_id?: string;\r\n task_id?: string;\r\n version?: number;\r\n parent_artifact_id?: string;\r\n artifact_chain?: string[];\r\n tags?: string[];\r\n metadata?: Record<string, any>;\r\n acl_level?: number;\r\n is_compressed?: boolean;\r\n compression_type?: string;\r\n retention_days?: number;\r\n retention_policy?: RetentionPolicy;\r\n}\r\n\r\nexport interface Artifact {\r\n id: string;\r\n name: string;\r\n type: ArtifactType;\r\n format?: string;\r\n content?: string;\r\n content_hash?: string;\r\n size_bytes?: number;\r\n storage_location: string;\r\n checksum?: string;\r\n is_compressed: boolean;\r\n compression_type?: string;\r\n swarm_id?: string;\r\n agent_id?: string;\r\n task_id?: string;\r\n version: number;\r\n parent_artifact_id?: string;\r\n artifact_chain?: string;\r\n tags?: string;\r\n metadata?: string;\r\n acl_level: number;\r\n retention_days: number;\r\n retention_policy: RetentionPolicy;\r\n expires_at?: string;\r\n status: ArtifactStatus;\r\n cleanup_eligible: boolean;\r\n created_at: string;\r\n updated_at: string;\r\n archived_at?: string;\r\n deleted_at?: string;\r\n}\r\n\r\nexport interface ArtifactFilters {\r\n type?: ArtifactType;\r\n status?: ArtifactStatus;\r\n retention_policy?: RetentionPolicy;\r\n swarm_id?: string;\r\n agent_id?: string;\r\n task_id?: string;\r\n tags?: string[];\r\n cleanup_eligible?: boolean;\r\n created_after?: Date;\r\n created_before?: Date;\r\n expires_before?: Date;\r\n limit?: number;\r\n offset?: number;\r\n}\r\n\r\nexport interface ArtifactStats {\r\n total: number;\r\n active: number;\r\n archived: number;\r\n deleted: number;\r\n cleanup_eligible: number;\r\n total_size_bytes: number;\r\n}\r\n\r\n// ============================================================================\r\n// Error Classes\r\n// ============================================================================\r\n\r\nexport class ArtifactRegistryError extends Error {\r\n constructor(message: string, public code: string, public details?: any) {\r\n super(message);\r\n this.name = 'ArtifactRegistryError';\r\n }\r\n}\r\n\r\nexport class ArtifactNotFoundError extends ArtifactRegistryError {\r\n constructor(id: string) {\r\n super(`Artifact not found: ${id}`, 'ARTIFACT_NOT_FOUND', { id });\r\n this.name = 'ArtifactNotFoundError';\r\n }\r\n}\r\n\r\nexport class ArtifactValidationError extends ArtifactRegistryError {\r\n constructor(message: string, details?: any) {\r\n super(message, 'VALIDATION_ERROR', details);\r\n this.name = 'ArtifactValidationError';\r\n }\r\n}\r\n\r\nexport class ArtifactDatabaseError extends ArtifactRegistryError {\r\n constructor(message: string, details?: any) {\r\n super(message, 'DATABASE_ERROR', details);\r\n this.name = 'ArtifactDatabaseError';\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Artifact Registry Class\r\n// ============================================================================\r\n\r\nexport class ArtifactRegistry {\r\n private db: Database.Database;\r\n private static instance: ArtifactRegistry | null = null;\r\n\r\n constructor(dbPath: string) {\r\n try {\r\n // Ensure database directory exists\r\n const dbDir = dirname(dbPath);\r\n if (!existsSync(dbDir)) {\r\n mkdirSync(dbDir, { recursive: true });\r\n }\r\n\r\n this.db = new Database(dbPath);\r\n this.db.pragma('journal_mode = WAL'); // Write-Ahead Logging for concurrency\r\n this.db.pragma('foreign_keys = ON');\r\n this.db.pragma('synchronous = NORMAL');\r\n\r\n this.initializeSchema();\r\n } catch (error) {\r\n throw new ArtifactDatabaseError(\r\n `Failed to initialize database: ${error instanceof Error ? error.message : String(error)}`,\r\n { dbPath, error }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Get singleton instance (optional pattern)\r\n */\r\n static getInstance(dbPath?: string): ArtifactRegistry {\r\n if (!ArtifactRegistry.instance) {\r\n if (!dbPath) {\r\n throw new ArtifactDatabaseError('Database path required for first initialization', {});\r\n }\r\n ArtifactRegistry.instance = new ArtifactRegistry(dbPath);\r\n }\r\n return ArtifactRegistry.instance;\r\n }\r\n\r\n /**\r\n * Initialize database schema\r\n */\r\n private initializeSchema(): void {\r\n try {\r\n const schemaPath = join(__dirname, '../database/artifact-registry-schema.sql');\r\n if (!existsSync(schemaPath)) {\r\n throw new Error(`Schema file not found: ${schemaPath}`);\r\n }\r\n\r\n const schema = readFileSync(schemaPath, 'utf-8');\r\n\r\n // Step 1: Remove multi-line comments FIRST (they can contain semicolons)\r\n const withoutMultiLineComments = schema.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '');\r\n\r\n // Step 2: Remove single-line comments\r\n const cleanedSchema = withoutMultiLineComments\r\n .split('\\n')\r\n .filter(line => {\r\n const trimmed = line.trim();\r\n return trimmed.length > 0 && !trimmed.startsWith('--');\r\n })\r\n .join('\\n');\r\n\r\n // Step 3: Execute entire schema as one block\r\n // SQLite's exec() can handle multiple statements including triggers with internal semicolons\r\n this.db.exec(cleanedSchema);\r\n } catch (error) {\r\n throw new ArtifactDatabaseError(\r\n `Failed to initialize schema: ${error instanceof Error ? error.message : String(error)}`,\r\n { error }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Generate unique artifact ID\r\n */\r\n private generateId(): string {\r\n const timestamp = Date.now();\r\n const random = Math.random().toString(36).substring(2, 15);\r\n return `artifact-${timestamp}-${random}`;\r\n }\r\n\r\n /**\r\n * Calculate checksum for file\r\n */\r\n private calculateChecksum(filePath: string): string {\r\n try {\r\n const content = readFileSync(filePath);\r\n return createHash('sha256').update(content).digest('hex');\r\n } catch (error) {\r\n throw new ArtifactValidationError(\r\n `Failed to calculate checksum: ${error instanceof Error ? error.message : String(error)}`,\r\n { filePath, error }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Validate artifact metadata\r\n */\r\n private validateMetadata(metadata: ArtifactMetadata): void {\r\n if (!metadata.name || metadata.name.trim().length === 0) {\r\n throw new ArtifactValidationError('Artifact name is required');\r\n }\r\n\r\n if (!metadata.type) {\r\n throw new ArtifactValidationError('Artifact type is required');\r\n }\r\n\r\n const validTypes: ArtifactType[] = ['code', 'documentation', 'test', 'config', 'binary', 'data', 'model', 'report', 'other'];\r\n if (!validTypes.includes(metadata.type)) {\r\n throw new ArtifactValidationError(`Invalid artifact type: ${metadata.type}`, { validTypes });\r\n }\r\n\r\n if (!metadata.storage_location || metadata.storage_location.trim().length === 0) {\r\n throw new ArtifactValidationError('Storage location is required');\r\n }\r\n\r\n if (metadata.acl_level !== undefined && (metadata.acl_level < 1 || metadata.acl_level > 5)) {\r\n throw new ArtifactValidationError('ACL level must be between 1 and 5', { acl_level: metadata.acl_level });\r\n }\r\n\r\n if (metadata.retention_policy) {\r\n const validPolicies: RetentionPolicy[] = ['ephemeral', 'standard', 'permanent', 'custom'];\r\n if (!validPolicies.includes(metadata.retention_policy)) {\r\n throw new ArtifactValidationError(`Invalid retention policy: ${metadata.retention_policy}`, { validPolicies });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Create new artifact\r\n */\r\n createArtifact(metadata: ArtifactMetadata): Artifact {\r\n try {\r\n // Validate metadata\r\n this.validateMetadata(metadata);\r\n\r\n // Generate ID\r\n const id = this.generateId();\r\n\r\n // Calculate file-based metadata if storage location exists\r\n let size_bytes: number | undefined;\r\n let checksum: string | undefined;\r\n let content_hash: string | undefined;\r\n\r\n if (existsSync(metadata.storage_location)) {\r\n const stats = statSync(metadata.storage_location);\r\n size_bytes = stats.size;\r\n checksum = this.calculateChecksum(metadata.storage_location);\r\n\r\n if (metadata.content) {\r\n content_hash = createHash('sha256').update(metadata.content).digest('hex');\r\n }\r\n }\r\n\r\n // Set defaults\r\n const retention_days = metadata.retention_days ?? (\r\n metadata.retention_policy === 'ephemeral' ? 7 :\r\n metadata.retention_policy === 'permanent' ? 0 :\r\n 30 // standard\r\n );\r\n\r\n const retention_policy = metadata.retention_policy ?? 'standard';\r\n\r\n // Prepare insert statement\r\n const stmt = this.db.prepare(`\r\n INSERT INTO artifacts (\r\n id, name, type, format, content, content_hash, size_bytes,\r\n storage_location, checksum, is_compressed, compression_type,\r\n swarm_id, agent_id, task_id, version, parent_artifact_id,\r\n artifact_chain, tags, metadata, acl_level,\r\n retention_days, retention_policy, status\r\n ) VALUES (\r\n ?, ?, ?, ?, ?, ?, ?,\r\n ?, ?, ?, ?,\r\n ?, ?, ?, ?, ?,\r\n ?, ?, ?, ?,\r\n ?, ?, ?\r\n )\r\n `);\r\n\r\n // Execute insert\r\n stmt.run(\r\n id,\r\n metadata.name,\r\n metadata.type,\r\n metadata.format ?? null,\r\n metadata.content ?? null,\r\n content_hash ?? null,\r\n size_bytes ?? null,\r\n metadata.storage_location,\r\n checksum ?? null,\r\n metadata.is_compressed ? 1 : 0,\r\n metadata.compression_type ?? null,\r\n metadata.swarm_id ?? null,\r\n metadata.agent_id ?? null,\r\n metadata.task_id ?? null,\r\n metadata.version ?? 1,\r\n metadata.parent_artifact_id ?? null,\r\n metadata.artifact_chain ? JSON.stringify(metadata.artifact_chain) : null,\r\n metadata.tags ? JSON.stringify(metadata.tags) : null,\r\n metadata.metadata ? JSON.stringify(metadata.metadata) : null,\r\n metadata.acl_level ?? 2,\r\n retention_days,\r\n retention_policy,\r\n 'active'\r\n );\r\n\r\n // Retrieve and return created artifact\r\n const artifact = this.getArtifact(id);\r\n if (!artifact) {\r\n throw new ArtifactDatabaseError('Failed to retrieve created artifact', { id });\r\n }\r\n\r\n return artifact;\r\n } catch (error) {\r\n if (error instanceof ArtifactRegistryError) {\r\n throw error;\r\n }\r\n throw new ArtifactDatabaseError(\r\n `Failed to create artifact: ${error instanceof Error ? error.message : String(error)}`,\r\n { metadata, error }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Get artifact by ID\r\n */\r\n getArtifact(id: string): Artifact | null {\r\n try {\r\n const stmt = this.db.prepare('SELECT * FROM artifacts WHERE id = ?');\r\n const row = stmt.get(id) as Artifact | undefined;\r\n return row ?? null;\r\n } catch (error) {\r\n throw new ArtifactDatabaseError(\r\n `Failed to get artifact: ${error instanceof Error ? error.message : String(error)}`,\r\n { id, error }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * List artifacts with optional filters\r\n */\r\n listArtifacts(filters?: ArtifactFilters): Artifact[] {\r\n try {\r\n let query = 'SELECT * FROM artifacts WHERE 1=1';\r\n const params: any[] = [];\r\n\r\n if (filters) {\r\n if (filters.type) {\r\n query += ' AND type = ?';\r\n params.push(filters.type);\r\n }\r\n\r\n if (filters.status) {\r\n query += ' AND status = ?';\r\n params.push(filters.status);\r\n }\r\n\r\n if (filters.retention_policy) {\r\n query += ' AND retention_policy = ?';\r\n params.push(filters.retention_policy);\r\n }\r\n\r\n if (filters.swarm_id) {\r\n query += ' AND swarm_id = ?';\r\n params.push(filters.swarm_id);\r\n }\r\n\r\n if (filters.agent_id) {\r\n query += ' AND agent_id = ?';\r\n params.push(filters.agent_id);\r\n }\r\n\r\n if (filters.task_id) {\r\n query += ' AND task_id = ?';\r\n params.push(filters.task_id);\r\n }\r\n\r\n if (filters.cleanup_eligible !== undefined) {\r\n query += ' AND cleanup_eligible = ?';\r\n params.push(filters.cleanup_eligible ? 1 : 0);\r\n }\r\n\r\n if (filters.created_after) {\r\n query += ' AND created_at >= ?';\r\n params.push(filters.created_after.toISOString());\r\n }\r\n\r\n if (filters.created_before) {\r\n query += ' AND created_at <= ?';\r\n params.push(filters.created_before.toISOString());\r\n }\r\n\r\n if (filters.expires_before) {\r\n query += ' AND expires_at IS NOT NULL AND expires_at <= ?';\r\n params.push(filters.expires_before.toISOString());\r\n }\r\n\r\n if (filters.tags && filters.tags.length > 0) {\r\n // JSON search for tags (SQLite JSON support)\r\n for (const tag of filters.tags) {\r\n query += ` AND tags LIKE ?`;\r\n params.push(`%\"${tag}\"%`);\r\n }\r\n }\r\n }\r\n\r\n query += ' ORDER BY created_at DESC';\r\n\r\n if (filters?.limit) {\r\n query += ' LIMIT ?';\r\n params.push(filters.limit);\r\n }\r\n\r\n if (filters?.offset) {\r\n query += ' OFFSET ?';\r\n params.push(filters.offset);\r\n }\r\n\r\n const stmt = this.db.prepare(query);\r\n return stmt.all(...params) as Artifact[];\r\n } catch (error) {\r\n throw new ArtifactDatabaseError(\r\n `Failed to list artifacts: ${error instanceof Error ? error.message : String(error)}`,\r\n { filters, error }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Archive artifact (mark as archived)\r\n */\r\n archiveArtifact(id: string): Artifact {\r\n try {\r\n const artifact = this.getArtifact(id);\r\n if (!artifact) {\r\n throw new ArtifactNotFoundError(id);\r\n }\r\n\r\n if (artifact.status === 'deleted') {\r\n throw new ArtifactValidationError('Cannot archive deleted artifact', { id, status: artifact.status });\r\n }\r\n\r\n const stmt = this.db.prepare(`\r\n UPDATE artifacts\r\n SET status = 'archived',\r\n archived_at = CURRENT_TIMESTAMP,\r\n updated_at = CURRENT_TIMESTAMP\r\n WHERE id = ?\r\n `);\r\n\r\n stmt.run(id);\r\n\r\n const updated = this.getArtifact(id);\r\n if (!updated) {\r\n throw new ArtifactDatabaseError('Failed to retrieve archived artifact', { id });\r\n }\r\n\r\n return updated;\r\n } catch (error) {\r\n if (error instanceof ArtifactRegistryError) {\r\n throw error;\r\n }\r\n throw new ArtifactDatabaseError(\r\n `Failed to archive artifact: ${error instanceof Error ? error.message : String(error)}`,\r\n { id, error }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Delete artifact (soft delete - mark as deleted)\r\n */\r\n deleteArtifact(id: string): Artifact {\r\n try {\r\n const artifact = this.getArtifact(id);\r\n if (!artifact) {\r\n throw new ArtifactNotFoundError(id);\r\n }\r\n\r\n const stmt = this.db.prepare(`\r\n UPDATE artifacts\r\n SET status = 'deleted',\r\n deleted_at = CURRENT_TIMESTAMP,\r\n updated_at = CURRENT_TIMESTAMP\r\n WHERE id = ?\r\n `);\r\n\r\n stmt.run(id);\r\n\r\n const updated = this.getArtifact(id);\r\n if (!updated) {\r\n throw new ArtifactDatabaseError('Failed to retrieve deleted artifact', { id });\r\n }\r\n\r\n return updated;\r\n } catch (error) {\r\n if (error instanceof ArtifactRegistryError) {\r\n throw error;\r\n }\r\n throw new ArtifactDatabaseError(\r\n `Failed to delete artifact: ${error instanceof Error ? error.message : String(error)}`,\r\n { id, error }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Get artifact statistics by retention policy\r\n */\r\n getStatsByRetentionPolicy(): Record<RetentionPolicy, ArtifactStats> {\r\n try {\r\n const stmt = this.db.prepare(`\r\n SELECT\r\n retention_policy,\r\n COUNT(*) as total,\r\n SUM(CASE WHEN status = 'active' THEN 1 ELSE 0 END) as active,\r\n SUM(CASE WHEN status = 'archived' THEN 1 ELSE 0 END) as archived,\r\n SUM(CASE WHEN status = 'deleted' THEN 1 ELSE 0 END) as deleted,\r\n SUM(CASE WHEN cleanup_eligible = 1 THEN 1 ELSE 0 END) as cleanup_eligible,\r\n COALESCE(SUM(size_bytes), 0) as total_size_bytes\r\n FROM artifacts\r\n GROUP BY retention_policy\r\n `);\r\n\r\n const rows = stmt.all() as Array<{ retention_policy: RetentionPolicy } & ArtifactStats>;\r\n const stats: Record<string, ArtifactStats> = {};\r\n\r\n for (const row of rows) {\r\n const { retention_policy, ...statsData } = row;\r\n stats[retention_policy] = statsData;\r\n }\r\n\r\n return stats as Record<RetentionPolicy, ArtifactStats>;\r\n } catch (error) {\r\n throw new ArtifactDatabaseError(\r\n `Failed to get statistics: ${error instanceof Error ? error.message : String(error)}`,\r\n { error }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Find expired artifacts eligible for cleanup\r\n */\r\n findExpiredArtifacts(): Artifact[] {\r\n try {\r\n const stmt = this.db.prepare(`\r\n SELECT * FROM artifacts\r\n WHERE status = 'active'\r\n AND expires_at IS NOT NULL\r\n AND datetime('now') >= expires_at\r\n ORDER BY created_at ASC\r\n `);\r\n\r\n return stmt.all() as Artifact[];\r\n } catch (error) {\r\n throw new ArtifactDatabaseError(\r\n `Failed to find expired artifacts: ${error instanceof Error ? error.message : String(error)}`,\r\n { error }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Close database connection\r\n */\r\n close(): void {\r\n this.db.close();\r\n }\r\n}\r\n"],"names":["Database","createHash","readFileSync","existsSync","mkdirSync","statSync","join","dirname","ArtifactRegistryError","Error","message","code","details","name","ArtifactNotFoundError","id","ArtifactValidationError","ArtifactDatabaseError","ArtifactRegistry","db","instance","dbPath","dbDir","recursive","pragma","initializeSchema","error","String","getInstance","schemaPath","__dirname","schema","withoutMultiLineComments","replace","cleanedSchema","split","filter","line","trimmed","trim","length","startsWith","exec","generateId","timestamp","Date","now","random","Math","toString","substring","calculateChecksum","filePath","content","update","digest","validateMetadata","metadata","type","validTypes","includes","storage_location","acl_level","undefined","retention_policy","validPolicies","createArtifact","size_bytes","checksum","content_hash","stats","size","retention_days","stmt","prepare","run","format","is_compressed","compression_type","swarm_id","agent_id","task_id","version","parent_artifact_id","artifact_chain","JSON","stringify","tags","artifact","getArtifact","row","get","listArtifacts","filters","query","params","push","status","cleanup_eligible","created_after","toISOString","created_before","expires_before","tag","limit","offset","all","archiveArtifact","updated","deleteArtifact","getStatsByRetentionPolicy","rows","statsData","findExpiredArtifacts","close"],"mappings":"AAAA;;;;CAIC,GAED,OAAOA,cAAc,iBAAiB;AACtC,SAASC,UAAU,QAAQ,SAAS;AACpC,SAASC,YAAY,EAAEC,UAAU,EAAEC,SAAS,EAAEC,QAAQ,QAAQ,KAAK;AACnE,SAASC,IAAI,EAAEC,OAAO,QAAQ,OAAO;AAwFrC,+EAA+E;AAC/E,gBAAgB;AAChB,+EAA+E;AAE/E,OAAO,MAAMC,8BAA8BC;;;IACvC,YAAYC,OAAe,EAAE,AAAOC,IAAY,EAAE,AAAOC,OAAa,CAAE;QACpE,KAAK,CAACF,eAD0BC,OAAAA,WAAqBC,UAAAA;QAErD,IAAI,CAACC,IAAI,GAAG;IAChB;AACJ;AAEA,OAAO,MAAMC,8BAA8BN;IACvC,YAAYO,EAAU,CAAE;QACpB,KAAK,CAAC,CAAC,oBAAoB,EAAEA,IAAI,EAAE,sBAAsB;YAAEA;QAAG;QAC9D,IAAI,CAACF,IAAI,GAAG;IAChB;AACJ;AAEA,OAAO,MAAMG,gCAAgCR;IACzC,YAAYE,OAAe,EAAEE,OAAa,CAAE;QACxC,KAAK,CAACF,SAAS,oBAAoBE;QACnC,IAAI,CAACC,IAAI,GAAG;IAChB;AACJ;AAEA,OAAO,MAAMI,8BAA8BT;IACvC,YAAYE,OAAe,EAAEE,OAAa,CAAE;QACxC,KAAK,CAACF,SAAS,kBAAkBE;QACjC,IAAI,CAACC,IAAI,GAAG;IAChB;AACJ;AAEA,+EAA+E;AAC/E,0BAA0B;AAC1B,+EAA+E;AAE/E,OAAO,MAAMK;IACDC,GAAsB;IAC9B,OAAeC,WAAoC,KAAK;IAExD,YAAYC,MAAc,CAAE;QACxB,IAAI;YACA,mCAAmC;YACnC,MAAMC,QAAQf,QAAQc;YACtB,IAAI,CAAClB,WAAWmB,QAAQ;gBACpBlB,UAAUkB,OAAO;oBAAEC,WAAW;gBAAK;YACvC;YAEA,IAAI,CAACJ,EAAE,GAAG,IAAInB,SAASqB;YACvB,IAAI,CAACF,EAAE,CAACK,MAAM,CAAC,uBAAuB,sCAAsC;YAC5E,IAAI,CAACL,EAAE,CAACK,MAAM,CAAC;YACf,IAAI,CAACL,EAAE,CAACK,MAAM,CAAC;YAEf,IAAI,CAACC,gBAAgB;QACzB,EAAE,OAAOC,OAAO;YACZ,MAAM,IAAIT,sBACN,CAAC,+BAA+B,EAAES,iBAAiBjB,QAAQiB,MAAMhB,OAAO,GAAGiB,OAAOD,QAAQ,EAC1F;gBAAEL;gBAAQK;YAAM;QAExB;IACJ;IAEA;;KAEC,GACD,OAAOE,YAAYP,MAAe,EAAoB;QAClD,IAAI,CAACH,iBAAiBE,QAAQ,EAAE;YAC5B,IAAI,CAACC,QAAQ;gBACT,MAAM,IAAIJ,sBAAsB,mDAAmD,CAAC;YACxF;YACAC,iBAAiBE,QAAQ,GAAG,IAAIF,iBAAiBG;QACrD;QACA,OAAOH,iBAAiBE,QAAQ;IACpC;IAEA;;KAEC,GACD,AAAQK,mBAAyB;QAC7B,IAAI;YACA,MAAMI,aAAavB,KAAKwB,WAAW;YACnC,IAAI,CAAC3B,WAAW0B,aAAa;gBACzB,MAAM,IAAIpB,MAAM,CAAC,uBAAuB,EAAEoB,YAAY;YAC1D;YAEA,MAAME,SAAS7B,aAAa2B,YAAY;YAExC,yEAAyE;YACzE,MAAMG,2BAA2BD,OAAOE,OAAO,CAAC,qBAAqB;YAErE,sCAAsC;YACtC,MAAMC,gBAAgBF,yBACjBG,KAAK,CAAC,MACNC,MAAM,CAACC,CAAAA;gBACJ,MAAMC,UAAUD,KAAKE,IAAI;gBACzB,OAAOD,QAAQE,MAAM,GAAG,KAAK,CAACF,QAAQG,UAAU,CAAC;YACrD,GACCnC,IAAI,CAAC;YAEV,6CAA6C;YAC7C,6FAA6F;YAC7F,IAAI,CAACa,EAAE,CAACuB,IAAI,CAACR;QACjB,EAAE,OAAOR,OAAO;YACZ,MAAM,IAAIT,sBACN,CAAC,6BAA6B,EAAES,iBAAiBjB,QAAQiB,MAAMhB,OAAO,GAAGiB,OAAOD,QAAQ,EACxF;gBAAEA;YAAM;QAEhB;IACJ;IAEA;;KAEC,GACD,AAAQiB,aAAqB;QACzB,MAAMC,YAAYC,KAAKC,GAAG;QAC1B,MAAMC,SAASC,KAAKD,MAAM,GAAGE,QAAQ,CAAC,IAAIC,SAAS,CAAC,GAAG;QACvD,OAAO,CAAC,SAAS,EAAEN,UAAU,CAAC,EAAEG,QAAQ;IAC5C;IAEA;;KAEC,GACD,AAAQI,kBAAkBC,QAAgB,EAAU;QAChD,IAAI;YACA,MAAMC,UAAUnD,aAAakD;YAC7B,OAAOnD,WAAW,UAAUqD,MAAM,CAACD,SAASE,MAAM,CAAC;QACvD,EAAE,OAAO7B,OAAO;YACZ,MAAM,IAAIV,wBACN,CAAC,8BAA8B,EAAEU,iBAAiBjB,QAAQiB,MAAMhB,OAAO,GAAGiB,OAAOD,QAAQ,EACzF;gBAAE0B;gBAAU1B;YAAM;QAE1B;IACJ;IAEA;;KAEC,GACD,AAAQ8B,iBAAiBC,QAA0B,EAAQ;QACvD,IAAI,CAACA,SAAS5C,IAAI,IAAI4C,SAAS5C,IAAI,CAAC0B,IAAI,GAAGC,MAAM,KAAK,GAAG;YACrD,MAAM,IAAIxB,wBAAwB;QACtC;QAEA,IAAI,CAACyC,SAASC,IAAI,EAAE;YAChB,MAAM,IAAI1C,wBAAwB;QACtC;QAEA,MAAM2C,aAA6B;YAAC;YAAQ;YAAiB;YAAQ;YAAU;YAAU;YAAQ;YAAS;YAAU;SAAQ;QAC5H,IAAI,CAACA,WAAWC,QAAQ,CAACH,SAASC,IAAI,GAAG;YACrC,MAAM,IAAI1C,wBAAwB,CAAC,uBAAuB,EAAEyC,SAASC,IAAI,EAAE,EAAE;gBAAEC;YAAW;QAC9F;QAEA,IAAI,CAACF,SAASI,gBAAgB,IAAIJ,SAASI,gBAAgB,CAACtB,IAAI,GAAGC,MAAM,KAAK,GAAG;YAC7E,MAAM,IAAIxB,wBAAwB;QACtC;QAEA,IAAIyC,SAASK,SAAS,KAAKC,aAAcN,CAAAA,SAASK,SAAS,GAAG,KAAKL,SAASK,SAAS,GAAG,CAAA,GAAI;YACxF,MAAM,IAAI9C,wBAAwB,qCAAqC;gBAAE8C,WAAWL,SAASK,SAAS;YAAC;QAC3G;QAEA,IAAIL,SAASO,gBAAgB,EAAE;YAC3B,MAAMC,gBAAmC;gBAAC;gBAAa;gBAAY;gBAAa;aAAS;YACzF,IAAI,CAACA,cAAcL,QAAQ,CAACH,SAASO,gBAAgB,GAAG;gBACpD,MAAM,IAAIhD,wBAAwB,CAAC,0BAA0B,EAAEyC,SAASO,gBAAgB,EAAE,EAAE;oBAAEC;gBAAc;YAChH;QACJ;IACJ;IAEA;;KAEC,GACDC,eAAeT,QAA0B,EAAY;QACjD,IAAI;YACA,oBAAoB;YACpB,IAAI,CAACD,gBAAgB,CAACC;YAEtB,cAAc;YACd,MAAM1C,KAAK,IAAI,CAAC4B,UAAU;YAE1B,2DAA2D;YAC3D,IAAIwB;YACJ,IAAIC;YACJ,IAAIC;YAEJ,IAAIlE,WAAWsD,SAASI,gBAAgB,GAAG;gBACvC,MAAMS,QAAQjE,SAASoD,SAASI,gBAAgB;gBAChDM,aAAaG,MAAMC,IAAI;gBACvBH,WAAW,IAAI,CAACjB,iBAAiB,CAACM,SAASI,gBAAgB;gBAE3D,IAAIJ,SAASJ,OAAO,EAAE;oBAClBgB,eAAepE,WAAW,UAAUqD,MAAM,CAACG,SAASJ,OAAO,EAAEE,MAAM,CAAC;gBACxE;YACJ;YAEA,eAAe;YACf,MAAMiB,iBAAiBf,SAASe,cAAc,IAC1Cf,CAAAA,SAASO,gBAAgB,KAAK,cAAc,IAC5CP,SAASO,gBAAgB,KAAK,cAAc,IAC5C,GAAG,WAAW;YAAb;YAGL,MAAMA,mBAAmBP,SAASO,gBAAgB,IAAI;YAEtD,2BAA2B;YAC3B,MAAMS,OAAO,IAAI,CAACtD,EAAE,CAACuD,OAAO,CAAC,CAAC;;;;;;;;;;;;;;YAc9B,CAAC;YAED,iBAAiB;YACjBD,KAAKE,GAAG,CACJ5D,IACA0C,SAAS5C,IAAI,EACb4C,SAASC,IAAI,EACbD,SAASmB,MAAM,IAAI,MACnBnB,SAASJ,OAAO,IAAI,MACpBgB,gBAAgB,MAChBF,cAAc,MACdV,SAASI,gBAAgB,EACzBO,YAAY,MACZX,SAASoB,aAAa,GAAG,IAAI,GAC7BpB,SAASqB,gBAAgB,IAAI,MAC7BrB,SAASsB,QAAQ,IAAI,MACrBtB,SAASuB,QAAQ,IAAI,MACrBvB,SAASwB,OAAO,IAAI,MACpBxB,SAASyB,OAAO,IAAI,GACpBzB,SAAS0B,kBAAkB,IAAI,MAC/B1B,SAAS2B,cAAc,GAAGC,KAAKC,SAAS,CAAC7B,SAAS2B,cAAc,IAAI,MACpE3B,SAAS8B,IAAI,GAAGF,KAAKC,SAAS,CAAC7B,SAAS8B,IAAI,IAAI,MAChD9B,SAASA,QAAQ,GAAG4B,KAAKC,SAAS,CAAC7B,SAASA,QAAQ,IAAI,MACxDA,SAASK,SAAS,IAAI,GACtBU,gBACAR,kBACA;YAGJ,uCAAuC;YACvC,MAAMwB,WAAW,IAAI,CAACC,WAAW,CAAC1E;YAClC,IAAI,CAACyE,UAAU;gBACX,MAAM,IAAIvE,sBAAsB,uCAAuC;oBAAEF;gBAAG;YAChF;YAEA,OAAOyE;QACX,EAAE,OAAO9D,OAAO;YACZ,IAAIA,iBAAiBlB,uBAAuB;gBACxC,MAAMkB;YACV;YACA,MAAM,IAAIT,sBACN,CAAC,2BAA2B,EAAES,iBAAiBjB,QAAQiB,MAAMhB,OAAO,GAAGiB,OAAOD,QAAQ,EACtF;gBAAE+B;gBAAU/B;YAAM;QAE1B;IACJ;IAEA;;KAEC,GACD+D,YAAY1E,EAAU,EAAmB;QACrC,IAAI;YACA,MAAM0D,OAAO,IAAI,CAACtD,EAAE,CAACuD,OAAO,CAAC;YAC7B,MAAMgB,MAAMjB,KAAKkB,GAAG,CAAC5E;YACrB,OAAO2E,OAAO;QAClB,EAAE,OAAOhE,OAAO;YACZ,MAAM,IAAIT,sBACN,CAAC,wBAAwB,EAAES,iBAAiBjB,QAAQiB,MAAMhB,OAAO,GAAGiB,OAAOD,QAAQ,EACnF;gBAAEX;gBAAIW;YAAM;QAEpB;IACJ;IAEA;;KAEC,GACDkE,cAAcC,OAAyB,EAAc;QACjD,IAAI;YACA,IAAIC,QAAQ;YACZ,MAAMC,SAAgB,EAAE;YAExB,IAAIF,SAAS;gBACT,IAAIA,QAAQnC,IAAI,EAAE;oBACdoC,SAAS;oBACTC,OAAOC,IAAI,CAACH,QAAQnC,IAAI;gBAC5B;gBAEA,IAAImC,QAAQI,MAAM,EAAE;oBAChBH,SAAS;oBACTC,OAAOC,IAAI,CAACH,QAAQI,MAAM;gBAC9B;gBAEA,IAAIJ,QAAQ7B,gBAAgB,EAAE;oBAC1B8B,SAAS;oBACTC,OAAOC,IAAI,CAACH,QAAQ7B,gBAAgB;gBACxC;gBAEA,IAAI6B,QAAQd,QAAQ,EAAE;oBAClBe,SAAS;oBACTC,OAAOC,IAAI,CAACH,QAAQd,QAAQ;gBAChC;gBAEA,IAAIc,QAAQb,QAAQ,EAAE;oBAClBc,SAAS;oBACTC,OAAOC,IAAI,CAACH,QAAQb,QAAQ;gBAChC;gBAEA,IAAIa,QAAQZ,OAAO,EAAE;oBACjBa,SAAS;oBACTC,OAAOC,IAAI,CAACH,QAAQZ,OAAO;gBAC/B;gBAEA,IAAIY,QAAQK,gBAAgB,KAAKnC,WAAW;oBACxC+B,SAAS;oBACTC,OAAOC,IAAI,CAACH,QAAQK,gBAAgB,GAAG,IAAI;gBAC/C;gBAEA,IAAIL,QAAQM,aAAa,EAAE;oBACvBL,SAAS;oBACTC,OAAOC,IAAI,CAACH,QAAQM,aAAa,CAACC,WAAW;gBACjD;gBAEA,IAAIP,QAAQQ,cAAc,EAAE;oBACxBP,SAAS;oBACTC,OAAOC,IAAI,CAACH,QAAQQ,cAAc,CAACD,WAAW;gBAClD;gBAEA,IAAIP,QAAQS,cAAc,EAAE;oBACxBR,SAAS;oBACTC,OAAOC,IAAI,CAACH,QAAQS,cAAc,CAACF,WAAW;gBAClD;gBAEA,IAAIP,QAAQN,IAAI,IAAIM,QAAQN,IAAI,CAAC/C,MAAM,GAAG,GAAG;oBACzC,6CAA6C;oBAC7C,KAAK,MAAM+D,OAAOV,QAAQN,IAAI,CAAE;wBAC5BO,SAAS,CAAC,gBAAgB,CAAC;wBAC3BC,OAAOC,IAAI,CAAC,CAAC,EAAE,EAAEO,IAAI,EAAE,CAAC;oBAC5B;gBACJ;YACJ;YAEAT,SAAS;YAET,IAAID,SAASW,OAAO;gBAChBV,SAAS;gBACTC,OAAOC,IAAI,CAACH,QAAQW,KAAK;YAC7B;YAEA,IAAIX,SAASY,QAAQ;gBACjBX,SAAS;gBACTC,OAAOC,IAAI,CAACH,QAAQY,MAAM;YAC9B;YAEA,MAAMhC,OAAO,IAAI,CAACtD,EAAE,CAACuD,OAAO,CAACoB;YAC7B,OAAOrB,KAAKiC,GAAG,IAAIX;QACvB,EAAE,OAAOrE,OAAO;YACZ,MAAM,IAAIT,sBACN,CAAC,0BAA0B,EAAES,iBAAiBjB,QAAQiB,MAAMhB,OAAO,GAAGiB,OAAOD,QAAQ,EACrF;gBAAEmE;gBAASnE;YAAM;QAEzB;IACJ;IAEA;;KAEC,GACDiF,gBAAgB5F,EAAU,EAAY;QAClC,IAAI;YACA,MAAMyE,WAAW,IAAI,CAACC,WAAW,CAAC1E;YAClC,IAAI,CAACyE,UAAU;gBACX,MAAM,IAAI1E,sBAAsBC;YACpC;YAEA,IAAIyE,SAASS,MAAM,KAAK,WAAW;gBAC/B,MAAM,IAAIjF,wBAAwB,mCAAmC;oBAAED;oBAAIkF,QAAQT,SAASS,MAAM;gBAAC;YACvG;YAEA,MAAMxB,OAAO,IAAI,CAACtD,EAAE,CAACuD,OAAO,CAAC,CAAC;;;;;;YAM9B,CAAC;YAEDD,KAAKE,GAAG,CAAC5D;YAET,MAAM6F,UAAU,IAAI,CAACnB,WAAW,CAAC1E;YACjC,IAAI,CAAC6F,SAAS;gBACV,MAAM,IAAI3F,sBAAsB,wCAAwC;oBAAEF;gBAAG;YACjF;YAEA,OAAO6F;QACX,EAAE,OAAOlF,OAAO;YACZ,IAAIA,iBAAiBlB,uBAAuB;gBACxC,MAAMkB;YACV;YACA,MAAM,IAAIT,sBACN,CAAC,4BAA4B,EAAES,iBAAiBjB,QAAQiB,MAAMhB,OAAO,GAAGiB,OAAOD,QAAQ,EACvF;gBAAEX;gBAAIW;YAAM;QAEpB;IACJ;IAEA;;KAEC,GACDmF,eAAe9F,EAAU,EAAY;QACjC,IAAI;YACA,MAAMyE,WAAW,IAAI,CAACC,WAAW,CAAC1E;YAClC,IAAI,CAACyE,UAAU;gBACX,MAAM,IAAI1E,sBAAsBC;YACpC;YAEA,MAAM0D,OAAO,IAAI,CAACtD,EAAE,CAACuD,OAAO,CAAC,CAAC;;;;;;YAM9B,CAAC;YAEDD,KAAKE,GAAG,CAAC5D;YAET,MAAM6F,UAAU,IAAI,CAACnB,WAAW,CAAC1E;YACjC,IAAI,CAAC6F,SAAS;gBACV,MAAM,IAAI3F,sBAAsB,uCAAuC;oBAAEF;gBAAG;YAChF;YAEA,OAAO6F;QACX,EAAE,OAAOlF,OAAO;YACZ,IAAIA,iBAAiBlB,uBAAuB;gBACxC,MAAMkB;YACV;YACA,MAAM,IAAIT,sBACN,CAAC,2BAA2B,EAAES,iBAAiBjB,QAAQiB,MAAMhB,OAAO,GAAGiB,OAAOD,QAAQ,EACtF;gBAAEX;gBAAIW;YAAM;QAEpB;IACJ;IAEA;;KAEC,GACDoF,4BAAoE;QAChE,IAAI;YACA,MAAMrC,OAAO,IAAI,CAACtD,EAAE,CAACuD,OAAO,CAAC,CAAC;;;;;;;;;;;YAW9B,CAAC;YAED,MAAMqC,OAAOtC,KAAKiC,GAAG;YACrB,MAAMpC,QAAuC,CAAC;YAE9C,KAAK,MAAMoB,OAAOqB,KAAM;gBACpB,MAAM,EAAE/C,gBAAgB,EAAE,GAAGgD,WAAW,GAAGtB;gBAC3CpB,KAAK,CAACN,iBAAiB,GAAGgD;YAC9B;YAEA,OAAO1C;QACX,EAAE,OAAO5C,OAAO;YACZ,MAAM,IAAIT,sBACN,CAAC,0BAA0B,EAAES,iBAAiBjB,QAAQiB,MAAMhB,OAAO,GAAGiB,OAAOD,QAAQ,EACrF;gBAAEA;YAAM;QAEhB;IACJ;IAEA;;KAEC,GACDuF,uBAAmC;QAC/B,IAAI;YACA,MAAMxC,OAAO,IAAI,CAACtD,EAAE,CAACuD,OAAO,CAAC,CAAC;;;;;;YAM9B,CAAC;YAED,OAAOD,KAAKiC,GAAG;QACnB,EAAE,OAAOhF,OAAO;YACZ,MAAM,IAAIT,sBACN,CAAC,kCAAkC,EAAES,iBAAiBjB,QAAQiB,MAAMhB,OAAO,GAAGiB,OAAOD,QAAQ,EAC7F;gBAAEA;YAAM;QAEhB;IACJ;IAEA;;KAEC,GACDwF,QAAc;QACV,IAAI,CAAC/F,EAAE,CAAC+F,KAAK;IACjB;AACJ"}
1
+ {"version":3,"sources":["../../src/lib/artifact-registry.ts"],"sourcesContent":["/**\r\n * Artifact Registry TypeScript API\r\n * Provides centralized artifact management with TTL-based cleanup\r\n * Version: 1.0.0\r\n */\r\n\r\nimport Database from 'better-sqlite3';\r\nimport { createHash } from 'crypto';\r\nimport { readFileSync, existsSync, mkdirSync, statSync } from 'fs';\r\nimport { join, dirname } from 'path';\r\nimport { fileURLToPath } from 'url';\r\n\r\n// ESM-compatible __dirname\r\nconst __filename = fileURLToPath(import.meta.url);\r\nconst __dirname = dirname(__filename);\r\n\r\n// ============================================================================\r\n// Types and Interfaces\r\n// ============================================================================\r\n\r\nexport type ArtifactType = 'code' | 'documentation' | 'test' | 'config' | 'binary' | 'data' | 'model' | 'report' | 'other';\r\nexport type ArtifactStatus = 'active' | 'archived' | 'deleted';\r\nexport type RetentionPolicy = 'ephemeral' | 'standard' | 'permanent' | 'custom';\r\n\r\nexport interface ArtifactMetadata {\r\n name: string;\r\n type: ArtifactType;\r\n format?: string;\r\n content?: string;\r\n storage_location: string;\r\n swarm_id?: string;\r\n agent_id?: string;\r\n task_id?: string;\r\n version?: number;\r\n parent_artifact_id?: string;\r\n artifact_chain?: string[];\r\n tags?: string[];\r\n metadata?: Record<string, any>;\r\n acl_level?: number;\r\n is_compressed?: boolean;\r\n compression_type?: string;\r\n retention_days?: number;\r\n retention_policy?: RetentionPolicy;\r\n}\r\n\r\nexport interface Artifact {\r\n id: string;\r\n name: string;\r\n type: ArtifactType;\r\n format?: string;\r\n content?: string;\r\n content_hash?: string;\r\n size_bytes?: number;\r\n storage_location: string;\r\n checksum?: string;\r\n is_compressed: boolean;\r\n compression_type?: string;\r\n swarm_id?: string;\r\n agent_id?: string;\r\n task_id?: string;\r\n version: number;\r\n parent_artifact_id?: string;\r\n artifact_chain?: string;\r\n tags?: string;\r\n metadata?: string;\r\n acl_level: number;\r\n retention_days: number;\r\n retention_policy: RetentionPolicy;\r\n expires_at?: string;\r\n status: ArtifactStatus;\r\n cleanup_eligible: boolean;\r\n created_at: string;\r\n updated_at: string;\r\n archived_at?: string;\r\n deleted_at?: string;\r\n}\r\n\r\nexport interface ArtifactFilters {\r\n type?: ArtifactType;\r\n status?: ArtifactStatus;\r\n retention_policy?: RetentionPolicy;\r\n swarm_id?: string;\r\n agent_id?: string;\r\n task_id?: string;\r\n tags?: string[];\r\n cleanup_eligible?: boolean;\r\n created_after?: Date;\r\n created_before?: Date;\r\n expires_before?: Date;\r\n limit?: number;\r\n offset?: number;\r\n}\r\n\r\nexport interface ArtifactStats {\r\n total: number;\r\n active: number;\r\n archived: number;\r\n deleted: number;\r\n cleanup_eligible: number;\r\n total_size_bytes: number;\r\n}\r\n\r\n// ============================================================================\r\n// Error Classes\r\n// ============================================================================\r\n\r\nexport class ArtifactRegistryError extends Error {\r\n constructor(message: string, public code: string, public details?: any) {\r\n super(message);\r\n this.name = 'ArtifactRegistryError';\r\n }\r\n}\r\n\r\nexport class ArtifactNotFoundError extends ArtifactRegistryError {\r\n constructor(id: string) {\r\n super(`Artifact not found: ${id}`, 'ARTIFACT_NOT_FOUND', { id });\r\n this.name = 'ArtifactNotFoundError';\r\n }\r\n}\r\n\r\nexport class ArtifactValidationError extends ArtifactRegistryError {\r\n constructor(message: string, details?: any) {\r\n super(message, 'VALIDATION_ERROR', details);\r\n this.name = 'ArtifactValidationError';\r\n }\r\n}\r\n\r\nexport class ArtifactDatabaseError extends ArtifactRegistryError {\r\n constructor(message: string, details?: any) {\r\n super(message, 'DATABASE_ERROR', details);\r\n this.name = 'ArtifactDatabaseError';\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Artifact Registry Class\r\n// ============================================================================\r\n\r\nexport class ArtifactRegistry {\r\n private db: Database.Database;\r\n private static instance: ArtifactRegistry | null = null;\r\n\r\n constructor(dbPath: string) {\r\n try {\r\n // Ensure database directory exists\r\n const dbDir = dirname(dbPath);\r\n if (!existsSync(dbDir)) {\r\n mkdirSync(dbDir, { recursive: true });\r\n }\r\n\r\n this.db = new Database(dbPath);\r\n this.db.pragma('journal_mode = WAL'); // Write-Ahead Logging for concurrency\r\n this.db.pragma('foreign_keys = ON');\r\n this.db.pragma('synchronous = NORMAL');\r\n\r\n this.initializeSchema();\r\n } catch (error) {\r\n throw new ArtifactDatabaseError(\r\n `Failed to initialize database: ${error instanceof Error ? error.message : String(error)}`,\r\n { dbPath, error }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Get singleton instance (optional pattern)\r\n */\r\n static getInstance(dbPath?: string): ArtifactRegistry {\r\n if (!ArtifactRegistry.instance) {\r\n if (!dbPath) {\r\n throw new ArtifactDatabaseError('Database path required for first initialization', {});\r\n }\r\n ArtifactRegistry.instance = new ArtifactRegistry(dbPath);\r\n }\r\n return ArtifactRegistry.instance;\r\n }\r\n\r\n /**\r\n * Initialize database schema\r\n */\r\n private initializeSchema(): void {\r\n try {\r\n const schemaPath = join(__dirname, '../database/artifact-registry-schema.sql');\r\n if (!existsSync(schemaPath)) {\r\n throw new Error(`Schema file not found: ${schemaPath}`);\r\n }\r\n\r\n const schema = readFileSync(schemaPath, 'utf-8');\r\n\r\n // Step 1: Remove multi-line comments FIRST (they can contain semicolons)\r\n const withoutMultiLineComments = schema.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '');\r\n\r\n // Step 2: Remove single-line comments\r\n const cleanedSchema = withoutMultiLineComments\r\n .split('\\n')\r\n .filter(line => {\r\n const trimmed = line.trim();\r\n return trimmed.length > 0 && !trimmed.startsWith('--');\r\n })\r\n .join('\\n');\r\n\r\n // Step 3: Execute entire schema as one block\r\n // SQLite's exec() can handle multiple statements including triggers with internal semicolons\r\n this.db.exec(cleanedSchema);\r\n } catch (error) {\r\n throw new ArtifactDatabaseError(\r\n `Failed to initialize schema: ${error instanceof Error ? error.message : String(error)}`,\r\n { error }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Generate unique artifact ID\r\n */\r\n private generateId(): string {\r\n const timestamp = Date.now();\r\n const random = Math.random().toString(36).substring(2, 15);\r\n return `artifact-${timestamp}-${random}`;\r\n }\r\n\r\n /**\r\n * Calculate checksum for file\r\n */\r\n private calculateChecksum(filePath: string): string {\r\n try {\r\n const content = readFileSync(filePath);\r\n return createHash('sha256').update(content).digest('hex');\r\n } catch (error) {\r\n throw new ArtifactValidationError(\r\n `Failed to calculate checksum: ${error instanceof Error ? error.message : String(error)}`,\r\n { filePath, error }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Validate artifact metadata\r\n */\r\n private validateMetadata(metadata: ArtifactMetadata): void {\r\n if (!metadata.name || metadata.name.trim().length === 0) {\r\n throw new ArtifactValidationError('Artifact name is required');\r\n }\r\n\r\n if (!metadata.type) {\r\n throw new ArtifactValidationError('Artifact type is required');\r\n }\r\n\r\n const validTypes: ArtifactType[] = ['code', 'documentation', 'test', 'config', 'binary', 'data', 'model', 'report', 'other'];\r\n if (!validTypes.includes(metadata.type)) {\r\n throw new ArtifactValidationError(`Invalid artifact type: ${metadata.type}`, { validTypes });\r\n }\r\n\r\n if (!metadata.storage_location || metadata.storage_location.trim().length === 0) {\r\n throw new ArtifactValidationError('Storage location is required');\r\n }\r\n\r\n if (metadata.acl_level !== undefined && (metadata.acl_level < 1 || metadata.acl_level > 5)) {\r\n throw new ArtifactValidationError('ACL level must be between 1 and 5', { acl_level: metadata.acl_level });\r\n }\r\n\r\n if (metadata.retention_policy) {\r\n const validPolicies: RetentionPolicy[] = ['ephemeral', 'standard', 'permanent', 'custom'];\r\n if (!validPolicies.includes(metadata.retention_policy)) {\r\n throw new ArtifactValidationError(`Invalid retention policy: ${metadata.retention_policy}`, { validPolicies });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Create new artifact\r\n */\r\n createArtifact(metadata: ArtifactMetadata): Artifact {\r\n try {\r\n // Validate metadata\r\n this.validateMetadata(metadata);\r\n\r\n // Generate ID\r\n const id = this.generateId();\r\n\r\n // Calculate file-based metadata if storage location exists\r\n let size_bytes: number | undefined;\r\n let checksum: string | undefined;\r\n let content_hash: string | undefined;\r\n\r\n if (existsSync(metadata.storage_location)) {\r\n const stats = statSync(metadata.storage_location);\r\n size_bytes = stats.size;\r\n checksum = this.calculateChecksum(metadata.storage_location);\r\n\r\n if (metadata.content) {\r\n content_hash = createHash('sha256').update(metadata.content).digest('hex');\r\n }\r\n }\r\n\r\n // Set defaults\r\n const retention_days = metadata.retention_days ?? (\r\n metadata.retention_policy === 'ephemeral' ? 7 :\r\n metadata.retention_policy === 'permanent' ? 0 :\r\n 30 // standard\r\n );\r\n\r\n const retention_policy = metadata.retention_policy ?? 'standard';\r\n\r\n // Prepare insert statement\r\n const stmt = this.db.prepare(`\r\n INSERT INTO artifacts (\r\n id, name, type, format, content, content_hash, size_bytes,\r\n storage_location, checksum, is_compressed, compression_type,\r\n swarm_id, agent_id, task_id, version, parent_artifact_id,\r\n artifact_chain, tags, metadata, acl_level,\r\n retention_days, retention_policy, status\r\n ) VALUES (\r\n ?, ?, ?, ?, ?, ?, ?,\r\n ?, ?, ?, ?,\r\n ?, ?, ?, ?, ?,\r\n ?, ?, ?, ?,\r\n ?, ?, ?\r\n )\r\n `);\r\n\r\n // Execute insert\r\n stmt.run(\r\n id,\r\n metadata.name,\r\n metadata.type,\r\n metadata.format ?? null,\r\n metadata.content ?? null,\r\n content_hash ?? null,\r\n size_bytes ?? null,\r\n metadata.storage_location,\r\n checksum ?? null,\r\n metadata.is_compressed ? 1 : 0,\r\n metadata.compression_type ?? null,\r\n metadata.swarm_id ?? null,\r\n metadata.agent_id ?? null,\r\n metadata.task_id ?? null,\r\n metadata.version ?? 1,\r\n metadata.parent_artifact_id ?? null,\r\n metadata.artifact_chain ? JSON.stringify(metadata.artifact_chain) : null,\r\n metadata.tags ? JSON.stringify(metadata.tags) : null,\r\n metadata.metadata ? JSON.stringify(metadata.metadata) : null,\r\n metadata.acl_level ?? 2,\r\n retention_days,\r\n retention_policy,\r\n 'active'\r\n );\r\n\r\n // Retrieve and return created artifact\r\n const artifact = this.getArtifact(id);\r\n if (!artifact) {\r\n throw new ArtifactDatabaseError('Failed to retrieve created artifact', { id });\r\n }\r\n\r\n return artifact;\r\n } catch (error) {\r\n if (error instanceof ArtifactRegistryError) {\r\n throw error;\r\n }\r\n throw new ArtifactDatabaseError(\r\n `Failed to create artifact: ${error instanceof Error ? error.message : String(error)}`,\r\n { metadata, error }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Get artifact by ID\r\n */\r\n getArtifact(id: string): Artifact | null {\r\n try {\r\n const stmt = this.db.prepare('SELECT * FROM artifacts WHERE id = ?');\r\n const row = stmt.get(id) as Artifact | undefined;\r\n return row ?? null;\r\n } catch (error) {\r\n throw new ArtifactDatabaseError(\r\n `Failed to get artifact: ${error instanceof Error ? error.message : String(error)}`,\r\n { id, error }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * List artifacts with optional filters\r\n */\r\n listArtifacts(filters?: ArtifactFilters): Artifact[] {\r\n try {\r\n let query = 'SELECT * FROM artifacts WHERE 1=1';\r\n const params: any[] = [];\r\n\r\n if (filters) {\r\n if (filters.type) {\r\n query += ' AND type = ?';\r\n params.push(filters.type);\r\n }\r\n\r\n if (filters.status) {\r\n query += ' AND status = ?';\r\n params.push(filters.status);\r\n }\r\n\r\n if (filters.retention_policy) {\r\n query += ' AND retention_policy = ?';\r\n params.push(filters.retention_policy);\r\n }\r\n\r\n if (filters.swarm_id) {\r\n query += ' AND swarm_id = ?';\r\n params.push(filters.swarm_id);\r\n }\r\n\r\n if (filters.agent_id) {\r\n query += ' AND agent_id = ?';\r\n params.push(filters.agent_id);\r\n }\r\n\r\n if (filters.task_id) {\r\n query += ' AND task_id = ?';\r\n params.push(filters.task_id);\r\n }\r\n\r\n if (filters.cleanup_eligible !== undefined) {\r\n query += ' AND cleanup_eligible = ?';\r\n params.push(filters.cleanup_eligible ? 1 : 0);\r\n }\r\n\r\n if (filters.created_after) {\r\n query += ' AND created_at >= ?';\r\n params.push(filters.created_after.toISOString());\r\n }\r\n\r\n if (filters.created_before) {\r\n query += ' AND created_at <= ?';\r\n params.push(filters.created_before.toISOString());\r\n }\r\n\r\n if (filters.expires_before) {\r\n query += ' AND expires_at IS NOT NULL AND expires_at <= ?';\r\n params.push(filters.expires_before.toISOString());\r\n }\r\n\r\n if (filters.tags && filters.tags.length > 0) {\r\n // JSON search for tags (SQLite JSON support)\r\n for (const tag of filters.tags) {\r\n query += ` AND tags LIKE ?`;\r\n params.push(`%\"${tag}\"%`);\r\n }\r\n }\r\n }\r\n\r\n query += ' ORDER BY created_at DESC';\r\n\r\n if (filters?.limit) {\r\n query += ' LIMIT ?';\r\n params.push(filters.limit);\r\n }\r\n\r\n if (filters?.offset) {\r\n query += ' OFFSET ?';\r\n params.push(filters.offset);\r\n }\r\n\r\n const stmt = this.db.prepare(query);\r\n return stmt.all(...params) as Artifact[];\r\n } catch (error) {\r\n throw new ArtifactDatabaseError(\r\n `Failed to list artifacts: ${error instanceof Error ? error.message : String(error)}`,\r\n { filters, error }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Archive artifact (mark as archived)\r\n */\r\n archiveArtifact(id: string): Artifact {\r\n try {\r\n const artifact = this.getArtifact(id);\r\n if (!artifact) {\r\n throw new ArtifactNotFoundError(id);\r\n }\r\n\r\n if (artifact.status === 'deleted') {\r\n throw new ArtifactValidationError('Cannot archive deleted artifact', { id, status: artifact.status });\r\n }\r\n\r\n const stmt = this.db.prepare(`\r\n UPDATE artifacts\r\n SET status = 'archived',\r\n archived_at = CURRENT_TIMESTAMP,\r\n updated_at = CURRENT_TIMESTAMP\r\n WHERE id = ?\r\n `);\r\n\r\n stmt.run(id);\r\n\r\n const updated = this.getArtifact(id);\r\n if (!updated) {\r\n throw new ArtifactDatabaseError('Failed to retrieve archived artifact', { id });\r\n }\r\n\r\n return updated;\r\n } catch (error) {\r\n if (error instanceof ArtifactRegistryError) {\r\n throw error;\r\n }\r\n throw new ArtifactDatabaseError(\r\n `Failed to archive artifact: ${error instanceof Error ? error.message : String(error)}`,\r\n { id, error }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Delete artifact (soft delete - mark as deleted)\r\n */\r\n deleteArtifact(id: string): Artifact {\r\n try {\r\n const artifact = this.getArtifact(id);\r\n if (!artifact) {\r\n throw new ArtifactNotFoundError(id);\r\n }\r\n\r\n const stmt = this.db.prepare(`\r\n UPDATE artifacts\r\n SET status = 'deleted',\r\n deleted_at = CURRENT_TIMESTAMP,\r\n updated_at = CURRENT_TIMESTAMP\r\n WHERE id = ?\r\n `);\r\n\r\n stmt.run(id);\r\n\r\n const updated = this.getArtifact(id);\r\n if (!updated) {\r\n throw new ArtifactDatabaseError('Failed to retrieve deleted artifact', { id });\r\n }\r\n\r\n return updated;\r\n } catch (error) {\r\n if (error instanceof ArtifactRegistryError) {\r\n throw error;\r\n }\r\n throw new ArtifactDatabaseError(\r\n `Failed to delete artifact: ${error instanceof Error ? error.message : String(error)}`,\r\n { id, error }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Get artifact statistics by retention policy\r\n */\r\n getStatsByRetentionPolicy(): Record<RetentionPolicy, ArtifactStats> {\r\n try {\r\n const stmt = this.db.prepare(`\r\n SELECT\r\n retention_policy,\r\n COUNT(*) as total,\r\n SUM(CASE WHEN status = 'active' THEN 1 ELSE 0 END) as active,\r\n SUM(CASE WHEN status = 'archived' THEN 1 ELSE 0 END) as archived,\r\n SUM(CASE WHEN status = 'deleted' THEN 1 ELSE 0 END) as deleted,\r\n SUM(CASE WHEN cleanup_eligible = 1 THEN 1 ELSE 0 END) as cleanup_eligible,\r\n COALESCE(SUM(size_bytes), 0) as total_size_bytes\r\n FROM artifacts\r\n GROUP BY retention_policy\r\n `);\r\n\r\n const rows = stmt.all() as Array<{ retention_policy: RetentionPolicy } & ArtifactStats>;\r\n const stats: Record<string, ArtifactStats> = {};\r\n\r\n for (const row of rows) {\r\n const { retention_policy, ...statsData } = row;\r\n stats[retention_policy] = statsData;\r\n }\r\n\r\n return stats as Record<RetentionPolicy, ArtifactStats>;\r\n } catch (error) {\r\n throw new ArtifactDatabaseError(\r\n `Failed to get statistics: ${error instanceof Error ? error.message : String(error)}`,\r\n { error }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Find expired artifacts eligible for cleanup\r\n */\r\n findExpiredArtifacts(): Artifact[] {\r\n try {\r\n const stmt = this.db.prepare(`\r\n SELECT * FROM artifacts\r\n WHERE status = 'active'\r\n AND expires_at IS NOT NULL\r\n AND datetime('now') >= expires_at\r\n ORDER BY created_at ASC\r\n `);\r\n\r\n return stmt.all() as Artifact[];\r\n } catch (error) {\r\n throw new ArtifactDatabaseError(\r\n `Failed to find expired artifacts: ${error instanceof Error ? error.message : String(error)}`,\r\n { error }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Close database connection\r\n */\r\n close(): void {\r\n this.db.close();\r\n }\r\n}\r\n"],"names":["Database","createHash","readFileSync","existsSync","mkdirSync","statSync","join","dirname","fileURLToPath","__filename","url","__dirname","ArtifactRegistryError","Error","message","code","details","name","ArtifactNotFoundError","id","ArtifactValidationError","ArtifactDatabaseError","ArtifactRegistry","db","instance","dbPath","dbDir","recursive","pragma","initializeSchema","error","String","getInstance","schemaPath","schema","withoutMultiLineComments","replace","cleanedSchema","split","filter","line","trimmed","trim","length","startsWith","exec","generateId","timestamp","Date","now","random","Math","toString","substring","calculateChecksum","filePath","content","update","digest","validateMetadata","metadata","type","validTypes","includes","storage_location","acl_level","undefined","retention_policy","validPolicies","createArtifact","size_bytes","checksum","content_hash","stats","size","retention_days","stmt","prepare","run","format","is_compressed","compression_type","swarm_id","agent_id","task_id","version","parent_artifact_id","artifact_chain","JSON","stringify","tags","artifact","getArtifact","row","get","listArtifacts","filters","query","params","push","status","cleanup_eligible","created_after","toISOString","created_before","expires_before","tag","limit","offset","all","archiveArtifact","updated","deleteArtifact","getStatsByRetentionPolicy","rows","statsData","findExpiredArtifacts","close"],"mappings":"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"}