claude-flow-novice 2.15.2 → 2.15.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (533) hide show
  1. package/.claude/cfn-extras/skills/advanced-features/cfn-agent-swap/recommend-swap.sh +59 -59
  2. package/.claude/cfn-extras/skills/analytics/cfn-improvement-recommender/recommend-improvements.sh +91 -91
  3. package/.claude/cfn-extras/skills/analytics/cfn-pattern-extraction/extract-patterns.sh +79 -79
  4. package/.claude/cfn-extras/skills/analytics/cfn-retrospective-report/generate-report.sh +100 -100
  5. package/.claude/cfn-extras/skills/analytics/cfn-telemetry/start-telemetry.sh +110 -110
  6. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/add-bullet.sh +145 -145
  7. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/log-merge.sh +67 -67
  8. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/monitor-injection-performance.sh +137 -137
  9. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/optimize-injection-pipeline.sh +168 -168
  10. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/query-reflections.sh +35 -35
  11. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/store-reflection.sh +45 -45
  12. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/track-ab-test.sh +41 -41
  13. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/update-reflection.sh +41 -41
  14. package/.claude/cfn-extras/skills/deprecated/cfn-cli-setup/validate-cli-environment.sh +191 -191
  15. package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/create-campaign.sh +231 -231
  16. package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/get-campaign-performance.sh +190 -190
  17. package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/pause-campaign.sh +142 -142
  18. package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/set-budget.sh +181 -181
  19. package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/update-bid-strategy.sh +133 -133
  20. package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/get-conversation-history.sh +121 -121
  21. package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/qualify-lead.sh +156 -156
  22. package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/schedule-demo.sh +181 -181
  23. package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/send-message.sh +137 -137
  24. package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/transfer-to-human.sh +179 -179
  25. package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/create-campaign.sh +183 -183
  26. package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/get-delivery-status.sh +139 -139
  27. package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/opt-out.sh +150 -150
  28. package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/schedule-campaign.sh +187 -187
  29. package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/send-sms.sh +181 -181
  30. package/.claude/cfn-extras/skills/ui-portal/cfn-web-portal/test-web-portal-skill.sh +50 -50
  31. package/.claude/cfn-extras/skills/ui-portal/cfn-web-portal/validate-deployment.sh +84 -84
  32. package/.claude/cfn-extras/skills/utility/cfn-environment-sanitization/sanitize-environment.sh +243 -243
  33. package/.claude/commands/cfn-loop-cli.md +16 -2
  34. package/.claude/commands/switch-api.md +31 -10
  35. package/.claude/hooks/cfn-BACKUP_USAGE.md +243 -243
  36. package/.claude/hooks/cfn-invoke-security-validation.sh +69 -69
  37. package/.claude/hooks/cfn-lint-sql-injection.sh +61 -0
  38. package/.claude/hooks/cfn-post-edit-cfn-retrospective.sh +109 -78
  39. package/.claude/hooks/cfn-post-edit.config.json +44 -44
  40. package/.claude/hooks/cfn-pre-edit-security-warning.sh +40 -0
  41. package/.claude/skills/cfn-agent-spawning/spawn-agent.sh +22 -24
  42. package/.claude/skills/cfn-docker-agent-spawning/SKILL.md +28 -4
  43. package/.claude/skills/cfn-docker-agent-spawning/spawn-agent.sh +3 -1
  44. package/.claude/skills/cfn-docker-loop-orchestration/orchestrate.sh +224 -20
  45. package/.claude/skills/cfn-hybrid-routing/check-dependencies.sh +51 -51
  46. package/.claude/skills/cfn-loop-orchestration/helpers/gate-check.sh +550 -46
  47. package/.claude/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +277 -0
  48. package/.claude/skills/cfn-loop-orchestration/orchestrate.sh +184 -23
  49. package/.claude/skills/cfn-loop-orchestration/security_utils.sh +24 -0
  50. package/.claude/skills/cfn-loop-orchestration/test-iteration-context-injection.sh +366 -0
  51. package/.claude/skills/cfn-loop-validation/orchestrate-cfn-loop.sh +252 -252
  52. package/.claude/skills/cfn-redis-coordination/CENTRALIZED_REDIS_WRAPPER.md +319 -0
  53. package/.claude/skills/cfn-redis-coordination/agent-log.sh +4 -0
  54. package/.claude/skills/cfn-redis-coordination/agent-log.sh.bak +124 -0
  55. package/.claude/skills/cfn-redis-coordination/agent-recovery.sh +74 -74
  56. package/.claude/skills/cfn-redis-coordination/collect-confidence-scores.sh +30 -0
  57. package/.claude/skills/cfn-redis-coordination/get-context.sh +145 -112
  58. package/.claude/skills/cfn-redis-coordination/get-success-criteria.sh +54 -0
  59. package/.claude/skills/cfn-redis-coordination/invoke-waiting-mode.sh +3 -0
  60. package/.claude/skills/cfn-redis-coordination/redis-cli-wrapper.sh +24 -3
  61. package/.claude/skills/cfn-redis-coordination/redis-functions.sh +33 -0
  62. package/.claude/skills/cfn-redis-coordination/report-completion.sh +24 -31
  63. package/.claude/skills/cfn-redis-coordination/store-context.sh +4 -0
  64. package/.claude/skills/cfn-redis-coordination/store-success-criteria.sh +85 -0
  65. package/.claude/skills/cfn-redis-coordination/update-all-scripts.sh +67 -0
  66. package/.claude/skills/cfn-sqlite-memory/ttl-cleanup.sh +17 -25
  67. package/.claude/skills/cfn-transparency-middleware/middleware-config.sh +28 -28
  68. package/.claude/skills/cfn-transparency-middleware/performance-benchmark.sh +78 -78
  69. package/.claude/skills/cfn-transparency-middleware/test-e2e.sh +15 -0
  70. package/.claude/skills/cfn-transparency-middleware/test-integration.sh +161 -161
  71. package/.claude/skills/cfn-transparency-middleware/test-transparency-skill.sh +367 -367
  72. package/.claude/skills/cfn-transparency-middleware/tests/input-validation.sh +107 -92
  73. package/.claude/skills/cfn-transparency-middleware/wrap-agent.sh +131 -131
  74. package/README.md +116 -475
  75. package/claude-assets/agents/cfn-dev-team/README.md +103 -0
  76. package/claude-assets/agents/cfn-dev-team/architecture/goal-planner.md +1 -1
  77. package/claude-assets/agents/cfn-dev-team/coordinators/cfn-frontend-coordinator.md +77 -15
  78. package/claude-assets/agents/cfn-dev-team/coordinators/cfn-v3-coordinator.md +355 -6
  79. package/claude-assets/agents/cfn-dev-team/coordinators/consensus-builder.md +82 -1
  80. package/claude-assets/agents/cfn-dev-team/coordinators/handoff-coordinator.md +82 -1
  81. package/claude-assets/agents/cfn-dev-team/coordinators/multi-sprint-coordinator.md +77 -15
  82. package/claude-assets/agents/cfn-dev-team/dev-ops/docker-specialist.md +99 -12
  83. package/claude-assets/agents/cfn-dev-team/dev-ops/github-commit-agent.md +1 -1
  84. package/claude-assets/agents/cfn-dev-team/dev-ops/kubernetes-specialist.md +97 -0
  85. package/claude-assets/agents/cfn-dev-team/dev-ops/monitoring-specialist.md +20 -1
  86. package/claude-assets/agents/cfn-dev-team/developers/api-gateway-specialist.md +97 -0
  87. package/claude-assets/agents/cfn-dev-team/developers/backend-developer.md +110 -13
  88. package/claude-assets/agents/cfn-dev-team/developers/data/data-engineer.md +106 -15
  89. package/claude-assets/agents/cfn-dev-team/developers/database/database-architect.md +115 -11
  90. package/claude-assets/agents/cfn-dev-team/developers/frontend/mobile-dev.md +94 -7
  91. package/claude-assets/agents/cfn-dev-team/developers/frontend/react-frontend-engineer.md +87 -9
  92. package/claude-assets/agents/cfn-dev-team/developers/frontend/typescript-specialist.md +85 -7
  93. package/claude-assets/agents/cfn-dev-team/developers/frontend/ui-designer.md +160 -28
  94. package/claude-assets/agents/cfn-dev-team/developers/graphql-specialist.md +101 -19
  95. package/claude-assets/agents/cfn-dev-team/developers/rust-developer.md +108 -14
  96. package/claude-assets/agents/cfn-dev-team/reviewers/{reviewer.md → code-reviewer.md} +95 -8
  97. package/claude-assets/agents/cfn-dev-team/reviewers/quality/code-quality-validator.md +107 -7
  98. package/claude-assets/agents/cfn-dev-team/reviewers/quality/perf-analyzer.md +98 -7
  99. package/claude-assets/agents/cfn-dev-team/reviewers/quality/performance-benchmarker.md +95 -7
  100. package/claude-assets/agents/cfn-dev-team/reviewers/quality/security-specialist.md +136 -9
  101. package/claude-assets/agents/cfn-dev-team/testers/api-testing-specialist.md +108 -1
  102. package/claude-assets/agents/cfn-dev-team/testers/chaos-engineering-specialist.md +107 -13
  103. package/claude-assets/agents/cfn-dev-team/testers/contract-tester.md +737 -0
  104. package/claude-assets/agents/cfn-dev-team/testers/e2e/playwright-tester.md +1 -1
  105. package/claude-assets/agents/cfn-dev-team/testers/integration-tester.md +828 -0
  106. package/claude-assets/agents/cfn-dev-team/testers/interaction-tester.md +106 -7
  107. package/claude-assets/agents/cfn-dev-team/testers/load-testing-specialist.md +77 -0
  108. package/claude-assets/agents/cfn-dev-team/testers/mutation-testing-specialist.md +684 -0
  109. package/claude-assets/agents/cfn-dev-team/testers/playwright-tester.md +110 -1
  110. package/claude-assets/agents/cfn-dev-team/testers/tester.md +94 -7
  111. package/claude-assets/agents/cfn-dev-team/utility/code-booster.md +1 -3
  112. package/claude-assets/agents/cfn-dev-team/utility/epic-creator.md +87 -13
  113. package/claude-assets/agents/cfn-dev-team/utility/memory-leak-specialist.md +103 -7
  114. package/claude-assets/agents/cfn-dev-team/utility/researcher.md +1 -3
  115. package/claude-assets/agents/cfn-dev-team/utility/z-ai-specialist.md +94 -7
  116. package/claude-assets/agents/docker-coordinators/cfn-docker-v3-coordinator.md +46 -0
  117. package/claude-assets/agents/project-only-agents/npm-package-specialist.md +1 -1
  118. package/claude-assets/cfn-extras/skills/advanced-features/cfn-agent-swap/recommend-swap.sh +59 -59
  119. package/claude-assets/cfn-extras/skills/analytics/cfn-improvement-recommender/recommend-improvements.sh +91 -91
  120. package/claude-assets/cfn-extras/skills/analytics/cfn-pattern-extraction/extract-patterns.sh +79 -79
  121. package/claude-assets/cfn-extras/skills/analytics/cfn-retrospective-report/generate-report.sh +100 -100
  122. package/claude-assets/cfn-extras/skills/analytics/cfn-telemetry/start-telemetry.sh +110 -110
  123. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/add-bullet.sh +145 -145
  124. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/log-merge.sh +67 -67
  125. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/monitor-injection-performance.sh +137 -137
  126. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/optimize-injection-pipeline.sh +168 -168
  127. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/query-reflections.sh +35 -35
  128. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/store-reflection.sh +45 -45
  129. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/track-ab-test.sh +41 -41
  130. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/update-reflection.sh +41 -41
  131. package/claude-assets/cfn-extras/skills/deprecated/cfn-cli-setup/validate-cli-environment.sh +191 -191
  132. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/create-campaign.sh +231 -231
  133. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/get-campaign-performance.sh +190 -190
  134. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/pause-campaign.sh +142 -142
  135. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/set-budget.sh +181 -181
  136. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/update-bid-strategy.sh +133 -133
  137. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/get-conversation-history.sh +121 -121
  138. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/qualify-lead.sh +156 -156
  139. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/schedule-demo.sh +181 -181
  140. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/send-message.sh +137 -137
  141. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/transfer-to-human.sh +179 -179
  142. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/create-campaign.sh +183 -183
  143. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/get-delivery-status.sh +139 -139
  144. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/opt-out.sh +150 -150
  145. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/schedule-campaign.sh +187 -187
  146. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/send-sms.sh +181 -181
  147. package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/test-web-portal-skill.sh +50 -50
  148. package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/validate-deployment.sh +84 -84
  149. package/claude-assets/cfn-extras/skills/utility/cfn-environment-sanitization/sanitize-environment.sh +243 -243
  150. package/claude-assets/commands/cfn-loop-cli.md +16 -2
  151. package/claude-assets/commands/switch-api.md +31 -10
  152. package/claude-assets/hooks/cfn-BACKUP_USAGE.md +243 -243
  153. package/claude-assets/hooks/cfn-invoke-security-validation.sh +69 -69
  154. package/claude-assets/hooks/cfn-lint-sql-injection.sh +61 -0
  155. package/claude-assets/hooks/cfn-post-edit-cfn-retrospective.sh +109 -78
  156. package/claude-assets/hooks/cfn-post-edit.config.json +44 -44
  157. package/claude-assets/hooks/cfn-post-execution/memory-cleanup.sh +19 -19
  158. package/claude-assets/hooks/cfn-pre-edit-security-warning.sh +40 -0
  159. package/claude-assets/hooks/cfn-pre-execution/memory-check.sh +19 -19
  160. package/claude-assets/hooks/detect-hardcoded-credentials.sh +212 -0
  161. package/claude-assets/skills/SKILL_TEMPLATE.md +774 -0
  162. package/claude-assets/skills/agent-lifecycle/execute-lifecycle-hook.sh +543 -572
  163. package/claude-assets/skills/agent-lifecycle/simple-audit.sh +57 -30
  164. package/claude-assets/skills/agent-template-generator/SKILL.md +440 -0
  165. package/claude-assets/skills/agent-template-generator/generate-agent.sh +405 -0
  166. package/claude-assets/skills/agent-validation-linter/SKILL.md +589 -0
  167. package/claude-assets/skills/agent-validation-linter/lint-agents.sh +271 -0
  168. package/claude-assets/skills/bootstrap/bash-fundamentals.md +786 -0
  169. package/claude-assets/skills/bootstrap/database-connection.md +464 -0
  170. package/claude-assets/skills/bootstrap/error-handling.md +580 -0
  171. package/claude-assets/skills/bootstrap/file-operations.md +699 -0
  172. package/claude-assets/skills/bootstrap/skill-loader.md +616 -0
  173. package/claude-assets/skills/bootstrap/sqlite-params.sh +287 -0
  174. package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh +22 -24
  175. package/claude-assets/skills/cfn-automatic-memory-persistence/persist-agent-output.sh +48 -48
  176. package/claude-assets/skills/cfn-automatic-memory-persistence/query-agent-history.sh +34 -34
  177. package/claude-assets/skills/cfn-automatic-memory-persistence/test-memory-persistence.sh +17 -16
  178. package/claude-assets/skills/cfn-deliverable-validation/confidence-calculator.sh +261 -261
  179. package/claude-assets/skills/cfn-deployment/SKILL.md +293 -0
  180. package/claude-assets/skills/cfn-deployment/execute.sh +21 -0
  181. package/claude-assets/skills/cfn-docker-agent-spawning/SKILL.md +28 -4
  182. package/claude-assets/skills/cfn-docker-agent-spawning/spawn-agent.sh +3 -1
  183. package/claude-assets/skills/cfn-docker-loop-orchestration/orchestrate.sh +224 -20
  184. package/claude-assets/skills/cfn-environment-sanitization/sanitize-environment.sh +38 -0
  185. package/claude-assets/skills/cfn-error-batching-strategy/lib/core-functions.sh +47 -47
  186. package/claude-assets/skills/cfn-expert-update/update-expert.sh +345 -345
  187. package/claude-assets/skills/cfn-file-operations/SKILL.md +290 -0
  188. package/claude-assets/skills/cfn-file-operations/execute.sh +129 -0
  189. package/claude-assets/skills/cfn-file-operations/lib/atomic-write.sh +294 -0
  190. package/claude-assets/skills/cfn-file-operations/lib/lock.sh +361 -0
  191. package/claude-assets/skills/cfn-file-operations/test.sh +369 -0
  192. package/claude-assets/skills/cfn-hybrid-routing/check-dependencies.sh +51 -51
  193. package/claude-assets/skills/cfn-intervention-detector/detect-intervention.sh +110 -110
  194. package/claude-assets/skills/cfn-intervention-orchestrator/execute-intervention.sh +58 -58
  195. package/claude-assets/skills/cfn-log-operations/SKILL.md +308 -0
  196. package/claude-assets/skills/cfn-log-operations/execute.sh +420 -0
  197. package/claude-assets/skills/cfn-log-operations/lib/rotate.sh +406 -0
  198. package/claude-assets/skills/cfn-log-operations/lib/search.sh +448 -0
  199. package/claude-assets/skills/cfn-log-operations/test.sh +394 -0
  200. package/claude-assets/skills/cfn-loop-orchestration/helpers/gate-check.sh +550 -46
  201. package/claude-assets/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +277 -0
  202. package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh +184 -23
  203. package/claude-assets/skills/cfn-loop-orchestration/security_utils.sh +24 -0
  204. package/claude-assets/skills/cfn-loop-orchestration/test-iteration-context-injection.sh +366 -0
  205. package/claude-assets/skills/cfn-loop-validation/orchestrate-cfn-loop.sh +252 -252
  206. package/claude-assets/skills/cfn-loop2-output-processing/process-validator-output.sh +275 -275
  207. package/claude-assets/skills/cfn-memory-management/check-memory.sh +159 -159
  208. package/claude-assets/skills/cfn-memory-management/cleanup-memory.sh +196 -196
  209. package/claude-assets/skills/cfn-node-heap-sizer/task-mode-heap-limiter.sh +325 -325
  210. package/claude-assets/skills/cfn-parameterized-queries/SKILL.md +339 -0
  211. package/claude-assets/skills/cfn-playbook/query-playbook.sh +19 -15
  212. package/claude-assets/skills/cfn-playbook/update-playbook.sh +25 -14
  213. package/claude-assets/skills/cfn-playbook-auto-update/auto-update-playbook.sh +85 -85
  214. package/claude-assets/skills/cfn-process-instrumentation/instrument-process.sh +44 -0
  215. package/claude-assets/skills/cfn-promotion/SKILL.md +305 -0
  216. package/claude-assets/skills/cfn-redis-coordination/CENTRALIZED_REDIS_WRAPPER.md +319 -0
  217. package/claude-assets/skills/cfn-redis-coordination/agent-log.sh +4 -0
  218. package/claude-assets/skills/cfn-redis-coordination/agent-log.sh.bak +124 -0
  219. package/claude-assets/skills/cfn-redis-coordination/agent-recovery.sh +74 -74
  220. package/claude-assets/skills/cfn-redis-coordination/collect-confidence-scores.sh +30 -0
  221. package/claude-assets/skills/cfn-redis-coordination/get-context.sh +145 -112
  222. package/claude-assets/skills/cfn-redis-coordination/get-success-criteria.sh +54 -0
  223. package/claude-assets/skills/cfn-redis-coordination/invoke-waiting-mode.sh +3 -0
  224. package/claude-assets/skills/cfn-redis-coordination/redis-cli-wrapper.sh +24 -3
  225. package/claude-assets/skills/cfn-redis-coordination/redis-functions.sh +33 -0
  226. package/claude-assets/skills/cfn-redis-coordination/report-completion.sh +24 -31
  227. package/claude-assets/skills/cfn-redis-coordination/store-context.sh +4 -0
  228. package/claude-assets/skills/cfn-redis-coordination/store-success-criteria.sh +85 -0
  229. package/claude-assets/skills/cfn-redis-coordination/update-all-scripts.sh +67 -0
  230. package/claude-assets/skills/cfn-scope-simplifier/simplify-scope.sh +67 -67
  231. package/claude-assets/skills/cfn-skill-loader/SKILL.md +466 -0
  232. package/claude-assets/skills/cfn-skill-loader/execute.sh +344 -0
  233. package/claude-assets/skills/cfn-specialist-injection/recommend-specialist.sh +56 -56
  234. package/claude-assets/skills/cfn-sqlite-memory/ttl-cleanup.sh +17 -25
  235. package/claude-assets/skills/cfn-standardized-error-handling/capture-agent-error.sh +86 -86
  236. package/claude-assets/skills/cfn-standardized-error-handling/test-error-handling.sh +165 -165
  237. package/claude-assets/skills/cfn-task-audit/get-audit-data.sh +42 -21
  238. package/claude-assets/skills/cfn-task-audit/store-task-audit.sh +17 -10
  239. package/claude-assets/skills/cfn-task-config-init/initialize-config.sh +264 -264
  240. package/claude-assets/skills/cfn-task-decomposition/task-decomposer.sh +278 -278
  241. package/claude-assets/skills/cfn-test-runner/detect-regressions.sh +17 -14
  242. package/claude-assets/skills/cfn-test-runner/detect-regressions.sh.backup-1763392821 +55 -0
  243. package/claude-assets/skills/cfn-test-runner/store-benchmarks.sh +17 -19
  244. package/claude-assets/skills/cfn-transparency-middleware/middleware-config.sh +28 -28
  245. package/claude-assets/skills/cfn-transparency-middleware/performance-benchmark.sh +78 -78
  246. package/claude-assets/skills/cfn-transparency-middleware/test-e2e.sh +15 -0
  247. package/claude-assets/skills/cfn-transparency-middleware/test-integration.sh +161 -161
  248. package/claude-assets/skills/cfn-transparency-middleware/test-transparency-skill.sh +367 -367
  249. package/claude-assets/skills/cfn-transparency-middleware/tests/input-validation.sh +107 -92
  250. package/claude-assets/skills/cfn-transparency-middleware/wrap-agent.sh +131 -131
  251. package/claude-assets/skills/cfn-utilities/SKILL.md +237 -0
  252. package/claude-assets/skills/cfn-utilities/execute.sh +32 -0
  253. package/claude-assets/skills/cfn-utilities/lib/errors.sh +56 -0
  254. package/claude-assets/skills/cfn-utilities/lib/file-ops.sh +164 -0
  255. package/claude-assets/skills/cfn-utilities/lib/logging.sh +77 -0
  256. package/claude-assets/skills/cfn-utilities/lib/retry.sh +127 -0
  257. package/claude-assets/skills/cfn-utilities/test.sh +317 -0
  258. package/claude-assets/skills/docker-build/SKILL.md +96 -203
  259. package/claude-assets/skills/docker-build/build.sh +73 -73
  260. package/claude-assets/skills/integration/agent-handoff.sh +492 -0
  261. package/claude-assets/skills/integration/file-operations.sh +414 -0
  262. package/claude-assets/skills/json-validation/SKILL.md +431 -0
  263. package/claude-assets/skills/json-validation/test-validate-success-criteria.sh +421 -0
  264. package/claude-assets/skills/json-validation/validate-success-criteria.sh +197 -0
  265. package/claude-assets/skills/redis-coordination/validate-parameters.sh +34 -0
  266. package/claude-assets/skills/workflow-codification/APPROVAL_WORKFLOW.md +806 -0
  267. package/claude-assets/skills/workflow-codification/COST_TRACKING.md +637 -0
  268. package/claude-assets/skills/workflow-codification/DEPLOY_QUICK_REFERENCE.md +106 -0
  269. package/claude-assets/skills/workflow-codification/EDGE_CASE_TRACKING.md +404 -0
  270. package/claude-assets/skills/workflow-codification/PROPAGATE_UPDATE_QUICK_REFERENCE.md +366 -0
  271. package/claude-assets/skills/workflow-codification/README_PHASE4.md +457 -0
  272. package/claude-assets/skills/workflow-codification/SKILL.md +110 -0
  273. package/claude-assets/skills/workflow-codification/analyze-patterns.sh +899 -0
  274. package/claude-assets/skills/workflow-codification/approval-workflow.sh +514 -0
  275. package/claude-assets/skills/workflow-codification/deploy-approved-skill.sh +481 -0
  276. package/claude-assets/skills/workflow-codification/deploy-approved-skill.sh.backup-1763392820 +512 -0
  277. package/claude-assets/skills/workflow-codification/generate-skill-update.sh +525 -0
  278. package/claude-assets/skills/workflow-codification/lib/security-utils.sh +204 -0
  279. package/claude-assets/skills/workflow-codification/propagate-skill-update.sh +648 -0
  280. package/claude-assets/skills/workflow-codification/propagate-skill-update.sh.backup-1763392820 +664 -0
  281. package/claude-assets/skills/workflow-codification/review-skill.sh +643 -0
  282. package/claude-assets/skills/workflow-codification/templates/email-notification.txt +114 -0
  283. package/claude-assets/skills/workflow-codification/templates/slack-notification.md +85 -0
  284. package/claude-assets/skills/workflow-codification/test-integration.sh +296 -0
  285. package/claude-assets/skills/workflow-codification/test-metadata-update.sh +350 -0
  286. package/claude-assets/skills/workflow-codification/track-cost-savings.sh +486 -0
  287. package/claude-assets/skills/workflow-codification/track-cost-savings.sh.backup-1763392821 +445 -0
  288. package/claude-assets/skills/workflow-codification/track-edge-case.sh +290 -0
  289. package/claude-assets/skills/workflow-codification/workflow-codification.db +0 -0
  290. package/dist/ace/ace-curator.js +10 -2
  291. package/dist/ace/ace-curator.js.map +1 -1
  292. package/dist/ace/ace-generator.js +4 -0
  293. package/dist/ace/ace-generator.js.map +1 -1
  294. package/dist/ace/ace-reflector.js +1 -1
  295. package/dist/ace/ace-reflector.js.map +1 -1
  296. package/dist/ace/context-injection.js +24 -2
  297. package/dist/ace/context-injection.js.map +1 -1
  298. package/dist/agents/agent-loader.js +146 -165
  299. package/dist/agents/agent-loader.js.map +1 -1
  300. package/dist/agents/task-agent-integration.js +1 -1
  301. package/dist/agents/task-agent-integration.js.map +1 -1
  302. package/dist/api/health-endpoints.js +390 -0
  303. package/dist/api/health-endpoints.js.map +1 -0
  304. package/dist/cli/agent-executor.js +4 -1
  305. package/dist/cli/agent-executor.js.map +1 -1
  306. package/dist/cli/agent-prompt-builder.js +89 -1
  307. package/dist/cli/agent-prompt-builder.js.map +1 -1
  308. package/dist/cli/agent-spawn.js +130 -37
  309. package/dist/cli/agent-spawn.js.map +1 -1
  310. package/dist/cli/config-manager.js +91 -109
  311. package/dist/cli/config-manager.js.map +1 -1
  312. package/dist/cli/skill-cache-validator.js +412 -0
  313. package/dist/cli/skill-cache-validator.js.map +1 -0
  314. package/dist/cli/skill-cli.js +991 -0
  315. package/dist/cli/skill-cli.js.map +1 -0
  316. package/dist/cli/skill-execution-logger.js +284 -0
  317. package/dist/cli/skill-execution-logger.js.map +1 -0
  318. package/dist/cli/skill-loader.js +457 -0
  319. package/dist/cli/skill-loader.js.map +1 -0
  320. package/dist/coordination/event-bus.js +2 -2
  321. package/dist/coordination/event-bus.js.map +1 -1
  322. package/dist/coordination/fleet-manager.js +1 -1
  323. package/dist/coordination/fleet-manager.js.map +1 -1
  324. package/dist/coordination/index.js +23 -9
  325. package/dist/coordination/index.js.map +1 -1
  326. package/dist/coordination/types/fleet-manager.types.js.map +1 -1
  327. package/dist/db/migration-manager.js +483 -0
  328. package/dist/db/migration-manager.js.map +1 -0
  329. package/dist/db/skills-query.js +535 -0
  330. package/dist/db/skills-query.js.map +1 -0
  331. package/dist/integration/DatabaseHandoff.js +507 -0
  332. package/dist/integration/DatabaseHandoff.js.map +1 -0
  333. package/dist/integration/StandardAdapter.js +291 -0
  334. package/dist/integration/StandardAdapter.js.map +1 -0
  335. package/dist/jobs/edge-case-analyzer.js +367 -0
  336. package/dist/jobs/edge-case-analyzer.js.map +1 -0
  337. package/dist/jobs/promotion-sla-enforcer.js +288 -0
  338. package/dist/jobs/promotion-sla-enforcer.js.map +1 -0
  339. package/dist/lib/agent-output-parser.js +518 -0
  340. package/dist/lib/agent-output-parser.js.map +1 -0
  341. package/dist/lib/agent-output-validator.js +950 -0
  342. package/dist/lib/agent-output-validator.js.map +1 -0
  343. package/dist/lib/agent-workspace.js +281 -0
  344. package/dist/lib/agent-workspace.js.map +1 -0
  345. package/dist/lib/artifact-registry.js +443 -0
  346. package/dist/lib/artifact-registry.js.map +1 -0
  347. package/dist/lib/atomic-file-writer.js +377 -0
  348. package/dist/lib/atomic-file-writer.js.map +1 -0
  349. package/dist/lib/backup-manager.js +779 -0
  350. package/dist/lib/backup-manager.js.map +1 -0
  351. package/dist/lib/checkpoint-manager.js +837 -0
  352. package/dist/lib/checkpoint-manager.js.map +1 -0
  353. package/dist/lib/circuit-breaker.js +340 -0
  354. package/dist/lib/circuit-breaker.js.map +1 -0
  355. package/dist/lib/completion-signal-handler.js +243 -0
  356. package/dist/lib/completion-signal-handler.js.map +1 -0
  357. package/dist/lib/config-manager.js +312 -0
  358. package/dist/lib/config-manager.js.map +1 -0
  359. package/dist/lib/config-migrator.js +386 -0
  360. package/dist/lib/config-migrator.js.map +1 -0
  361. package/dist/lib/config-validator.js +687 -0
  362. package/dist/lib/config-validator.js.map +1 -0
  363. package/dist/lib/correlation-cache.js +311 -0
  364. package/dist/lib/correlation-cache.js.map +1 -0
  365. package/dist/lib/correlation.js +263 -0
  366. package/dist/lib/correlation.js.map +1 -0
  367. package/dist/lib/database-service/connection-pool-manager.js +520 -0
  368. package/dist/lib/database-service/connection-pool-manager.js.map +1 -0
  369. package/dist/lib/database-service/correlation.js +329 -0
  370. package/dist/lib/database-service/correlation.js.map +1 -0
  371. package/dist/lib/database-service/errors.js +120 -0
  372. package/dist/lib/database-service/errors.js.map +1 -0
  373. package/dist/lib/database-service/index.js +168 -0
  374. package/dist/lib/database-service/index.js.map +1 -0
  375. package/dist/lib/database-service/postgres-adapter.js +526 -0
  376. package/dist/lib/database-service/postgres-adapter.js.map +1 -0
  377. package/dist/lib/database-service/redis-adapter.js +360 -0
  378. package/dist/lib/database-service/redis-adapter.js.map +1 -0
  379. package/dist/lib/database-service/sqlite-adapter.js +544 -0
  380. package/dist/lib/database-service/sqlite-adapter.js.map +1 -0
  381. package/dist/lib/database-service/transaction-manager.js +773 -0
  382. package/dist/lib/database-service/transaction-manager.js.map +1 -0
  383. package/dist/lib/database-service/types.js +23 -0
  384. package/dist/lib/database-service/types.js.map +1 -0
  385. package/dist/lib/deadlock-resolver.js +292 -0
  386. package/dist/lib/deadlock-resolver.js.map +1 -0
  387. package/dist/lib/distributed-lock.js +451 -0
  388. package/dist/lib/distributed-lock.js.map +1 -0
  389. package/dist/lib/edge-case-deduplicator.js +227 -0
  390. package/dist/lib/edge-case-deduplicator.js.map +1 -0
  391. package/dist/lib/encryption-manager.js +322 -0
  392. package/dist/lib/encryption-manager.js.map +1 -0
  393. package/dist/lib/error-aggregator.js +234 -0
  394. package/dist/lib/error-aggregator.js.map +1 -0
  395. package/dist/lib/errors.js +287 -0
  396. package/dist/lib/errors.js.map +1 -0
  397. package/dist/lib/file-lock-manager.js +578 -0
  398. package/dist/lib/file-lock-manager.js.map +1 -0
  399. package/dist/lib/file-operations.js +367 -0
  400. package/dist/lib/file-operations.js.map +1 -0
  401. package/dist/lib/idempotent-write.js +237 -0
  402. package/dist/lib/idempotent-write.js.map +1 -0
  403. package/dist/lib/integration-schema-validator.js +522 -0
  404. package/dist/lib/integration-schema-validator.js.map +1 -0
  405. package/dist/lib/lock-health-monitor.js +298 -0
  406. package/dist/lib/lock-health-monitor.js.map +1 -0
  407. package/dist/lib/log-shipper.js +422 -0
  408. package/dist/lib/log-shipper.js.map +1 -0
  409. package/dist/lib/logging.js +146 -0
  410. package/dist/lib/logging.js.map +1 -0
  411. package/dist/lib/message-deduplicator.js +439 -0
  412. package/dist/lib/message-deduplicator.js.map +1 -0
  413. package/dist/lib/multi-system-query.js +604 -0
  414. package/dist/lib/multi-system-query.js.map +1 -0
  415. package/dist/lib/orphan-detector.js +332 -0
  416. package/dist/lib/orphan-detector.js.map +1 -0
  417. package/dist/lib/password-generator.js +166 -0
  418. package/dist/lib/password-generator.js.map +1 -0
  419. package/dist/lib/path-validator.js +429 -0
  420. package/dist/lib/path-validator.js.map +1 -0
  421. package/dist/lib/query-translator.js +905 -0
  422. package/dist/lib/query-translator.js.map +1 -0
  423. package/dist/lib/queue-recovery.js +469 -0
  424. package/dist/lib/queue-recovery.js.map +1 -0
  425. package/dist/lib/redis-queue-manager.js +512 -0
  426. package/dist/lib/redis-queue-manager.js.map +1 -0
  427. package/dist/lib/reflection-archiver.js +272 -0
  428. package/dist/lib/reflection-archiver.js.map +1 -0
  429. package/dist/lib/retry-manager.js +453 -0
  430. package/dist/lib/retry-manager.js.map +1 -0
  431. package/dist/lib/retry.js +262 -0
  432. package/dist/lib/retry.js.map +1 -0
  433. package/dist/lib/schema-transform.js +695 -0
  434. package/dist/lib/schema-transform.js.map +1 -0
  435. package/dist/lib/schema-validator.js +491 -0
  436. package/dist/lib/schema-validator.js.map +1 -0
  437. package/dist/lib/skill-cache.js +297 -0
  438. package/dist/lib/skill-cache.js.map +1 -0
  439. package/dist/lib/skill-content-manager.js +337 -0
  440. package/dist/lib/skill-content-manager.js.map +1 -0
  441. package/dist/lib/skill-frontmatter-parser.js +237 -0
  442. package/dist/lib/skill-frontmatter-parser.js.map +1 -0
  443. package/dist/lib/skill-git-integration.js +275 -0
  444. package/dist/lib/skill-git-integration.js.map +1 -0
  445. package/dist/lib/skill-markdown-validator.js +396 -0
  446. package/dist/lib/skill-markdown-validator.js.map +1 -0
  447. package/dist/lib/skill-output-parser.js +312 -0
  448. package/dist/lib/skill-output-parser.js.map +1 -0
  449. package/dist/lib/unified-query-api.js +467 -0
  450. package/dist/lib/unified-query-api.js.map +1 -0
  451. package/dist/middleware/auth-middleware.js +350 -0
  452. package/dist/middleware/auth-middleware.js.map +1 -0
  453. package/dist/middleware/schema-validation.js +347 -0
  454. package/dist/middleware/schema-validation.js.map +1 -0
  455. package/dist/providers/anthropic-provider.js +1 -1
  456. package/dist/providers/anthropic-provider.js.map +1 -1
  457. package/dist/providers/provider-factory.js +2 -2
  458. package/dist/providers/provider-factory.js.map +1 -1
  459. package/dist/services/edge-case-analyzer.js +321 -0
  460. package/dist/services/edge-case-analyzer.js.map +1 -0
  461. package/dist/services/edge-case-deduplicator.js +266 -0
  462. package/dist/services/edge-case-deduplicator.js.map +1 -0
  463. package/dist/services/edge-case-detector.js +337 -0
  464. package/dist/services/edge-case-detector.js.map +1 -0
  465. package/dist/services/edge-case-tracker.js +547 -0
  466. package/dist/services/edge-case-tracker.js.map +1 -0
  467. package/dist/services/health-check-system.js +586 -0
  468. package/dist/services/health-check-system.js.map +1 -0
  469. package/dist/services/metrics-logger.js +412 -0
  470. package/dist/services/metrics-logger.js.map +1 -0
  471. package/dist/services/patch-generator.js +378 -0
  472. package/dist/services/patch-generator.js.map +1 -0
  473. package/dist/services/patch-validator.js +337 -0
  474. package/dist/services/patch-validator.js.map +1 -0
  475. package/dist/services/performance-monitor.js +811 -0
  476. package/dist/services/performance-monitor.js.map +1 -0
  477. package/dist/services/promotion-pipeline.js +918 -0
  478. package/dist/services/promotion-pipeline.js.map +1 -0
  479. package/dist/services/promotion-validator.js +394 -0
  480. package/dist/services/promotion-validator.js.map +1 -0
  481. package/dist/services/reflection-logger.js +388 -0
  482. package/dist/services/reflection-logger.js.map +1 -0
  483. package/dist/services/skill-deployment.js +472 -0
  484. package/dist/services/skill-deployment.js.map +1 -0
  485. package/dist/services/skill-loader.js +427 -0
  486. package/dist/services/skill-loader.js.map +1 -0
  487. package/dist/services/skill-promotion.js +372 -0
  488. package/dist/services/skill-promotion.js.map +1 -0
  489. package/dist/services/skill-validator.js +454 -0
  490. package/dist/services/skill-validator.js.map +1 -0
  491. package/dist/services/skill-versioning.js +244 -0
  492. package/dist/services/skill-versioning.js.map +1 -0
  493. package/dist/services/workspace-supervisor.js +597 -0
  494. package/dist/services/workspace-supervisor.js.map +1 -0
  495. package/dist/types/agent-output.js +44 -0
  496. package/dist/types/agent-output.js.map +1 -0
  497. package/dist/types/config.js +28 -0
  498. package/dist/types/config.js.map +1 -0
  499. package/dist/types/edge-case.js +45 -0
  500. package/dist/types/edge-case.js.map +1 -0
  501. package/package.json +201 -176
  502. package/readme/README.md +19 -4
  503. package/scripts/artifact-cleanup.sh +392 -0
  504. package/scripts/backup-cleanup.sh +627 -0
  505. package/scripts/cleanup-workspaces.sh +412 -0
  506. package/scripts/cleanup-yaml-configs.sh +141 -0
  507. package/scripts/deploy-approved-skills.sh +263 -0
  508. package/scripts/deploy-production.sh +355 -355
  509. package/scripts/docker-playwright-fix.sh +311 -311
  510. package/scripts/docker-rebuild-all-agents.sh +127 -127
  511. package/scripts/health-check.sh +447 -0
  512. package/scripts/log-aggregator.sh +554 -0
  513. package/scripts/log-monitor.sh +629 -0
  514. package/scripts/manage-agent-workspaces.sh +434 -0
  515. package/scripts/memory-leak-prevention.sh +305 -305
  516. package/scripts/migrate-artifacts.sh +563 -0
  517. package/scripts/migrate-schema.sh +533 -0
  518. package/scripts/migrate-yaml-to-json.sh +465 -0
  519. package/scripts/promote-staged-skills.sh +423 -0
  520. package/scripts/run-marketing-tests.sh +42 -42
  521. package/scripts/update_paths.sh +46 -46
  522. package/scripts/verify-no-secrets.sh +88 -35
  523. package/.claude/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +0 -161
  524. package/.claude/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +0 -728
  525. package/.claude/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +0 -131
  526. package/.claude/skills/cfn-agent-spawning/spawn-agent.sh.backup +0 -273
  527. package/.claude/skills/cfn-loop-orchestration/orchestrate.sh.backup +0 -949
  528. package/README.md.backup_before_replace +0 -781
  529. package/claude-assets/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +0 -161
  530. package/claude-assets/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +0 -728
  531. package/claude-assets/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +0 -131
  532. package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh.backup +0 -273
  533. package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh.backup +0 -949
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/checkpoint-manager.ts"],"sourcesContent":["/**\r\n * Checkpoint Manager\r\n *\r\n * Manages dual persistence model with Redis (runtime/ephemeral) and SQLite (durable/persistent).\r\n * Provides idempotent checkpointing with atomic operations and state validation.\r\n *\r\n * Task: Integration Standardization Plan - Task 4.5\r\n * Version: 1.0.0\r\n *\r\n * Persistence Boundaries:\r\n * - Redis: Agent execution state, coordination signals, temporary queues, active locks\r\n * - SQLite: Completed task results, agent metrics, audit trail, skill metadata\r\n *\r\n * @example\r\n * ```typescript\r\n * const checkpointMgr = new CheckpointManager(dbService);\r\n * await checkpointMgr.initialize();\r\n *\r\n * // Create checkpoint on task completion\r\n * await checkpointMgr.createCheckpoint('task-123', CheckpointTrigger.TASK_COMPLETION);\r\n *\r\n * // Recover from checkpoint\r\n * const state = await checkpointMgr.recoverFromCheckpoint('task-123');\r\n * ```\r\n */\r\n\r\nimport * as crypto from 'crypto';\r\nimport { getGlobalLogger } from './logging.js';\r\nimport { StandardError, ErrorCode } from './errors.js';\r\nimport { DatabaseService } from './database-service/index.js';\r\nimport { IDatabaseAdapter } from './database-service/types.js';\r\n\r\nconst logger = getGlobalLogger();\r\n\r\n// ============================================================================\r\n// Type Definitions\r\n// ============================================================================\r\n\r\n/**\r\n * Checkpoint trigger types\r\n */\r\nexport enum CheckpointTrigger {\r\n /** Triggered when a task completes */\r\n TASK_COMPLETION = 'task_completion',\r\n /** Triggered at iteration boundaries (CFN Loop iterations) */\r\n ITERATION_BOUNDARY = 'iteration_boundary',\r\n /** Triggered periodically (default: 5 minutes) */\r\n PERIODIC = 'periodic',\r\n /** Manually triggered checkpoint */\r\n MANUAL = 'manual',\r\n}\r\n\r\n/**\r\n * Checkpoint status\r\n */\r\nexport enum CheckpointStatus {\r\n /** Checkpoint creation in progress */\r\n IN_PROGRESS = 'in_progress',\r\n /** Checkpoint completed successfully */\r\n COMPLETED = 'completed',\r\n /** Checkpoint failed */\r\n FAILED = 'failed',\r\n /** Checkpoint recovered and applied */\r\n RECOVERED = 'recovered',\r\n}\r\n\r\n/**\r\n * Runtime state stored in Redis (ephemeral)\r\n */\r\nexport interface RuntimeState {\r\n /** Task ID */\r\n taskId: string;\r\n /** Agent execution state */\r\n agents: AgentExecutionState[];\r\n /** Active coordination signals */\r\n coordinationSignals: CoordinationSignal[];\r\n /** Temporary queue data */\r\n queueData: QueueData[];\r\n /** Active locks */\r\n activeLocks: Lock[];\r\n /** Timestamp when state was captured */\r\n capturedAt: Date;\r\n}\r\n\r\n/**\r\n * Agent execution state\r\n */\r\nexport interface AgentExecutionState {\r\n agentId: string;\r\n agentType: string;\r\n status: 'spawned' | 'in_progress' | 'completed' | 'failed';\r\n confidence?: number;\r\n startedAt: Date;\r\n completedAt?: Date;\r\n metadata?: Record<string, any>;\r\n}\r\n\r\n/**\r\n * Coordination signal\r\n */\r\nexport interface CoordinationSignal {\r\n key: string;\r\n value: string;\r\n ttl?: number;\r\n createdAt: Date;\r\n}\r\n\r\n/**\r\n * Queue data\r\n */\r\nexport interface QueueData {\r\n queueName: string;\r\n items: any[];\r\n priority?: number;\r\n}\r\n\r\n/**\r\n * Lock information\r\n */\r\nexport interface Lock {\r\n lockKey: string;\r\n owner: string;\r\n acquiredAt: Date;\r\n expiresAt: Date;\r\n}\r\n\r\n/**\r\n * Durable state stored in SQLite (persistent)\r\n */\r\nexport interface DurableState {\r\n /** Task ID */\r\n taskId: string;\r\n /** Completed task results */\r\n taskResults: TaskResult[];\r\n /** Agent execution metrics */\r\n agentMetrics: AgentMetrics[];\r\n /** Audit trail entries */\r\n auditTrail: AuditEntry[];\r\n /** Skill metadata */\r\n skillMetadata: SkillMetadata[];\r\n /** Timestamp when state was captured */\r\n capturedAt: Date;\r\n}\r\n\r\n/**\r\n * Task result\r\n */\r\nexport interface TaskResult {\r\n taskId: string;\r\n status: 'completed' | 'failed' | 'aborted';\r\n result?: any;\r\n confidence?: number;\r\n iterations: number;\r\n startedAt: Date;\r\n completedAt: Date;\r\n metadata?: Record<string, any>;\r\n}\r\n\r\n/**\r\n * Agent metrics\r\n */\r\nexport interface AgentMetrics {\r\n agentId: string;\r\n agentType: string;\r\n executionTime: number;\r\n confidence: number;\r\n tokensUsed?: number;\r\n cost?: number;\r\n timestamp: Date;\r\n metadata?: Record<string, any>;\r\n}\r\n\r\n/**\r\n * Audit trail entry\r\n */\r\nexport interface AuditEntry {\r\n id: string;\r\n taskId: string;\r\n agentId?: string;\r\n action: string;\r\n details: Record<string, any>;\r\n timestamp: Date;\r\n}\r\n\r\n/**\r\n * Skill metadata\r\n */\r\nexport interface SkillMetadata {\r\n skillName: string;\r\n version: string;\r\n executionCount: number;\r\n successRate: number;\r\n averageExecutionTime: number;\r\n lastExecutedAt?: Date;\r\n}\r\n\r\n/**\r\n * Checkpoint metadata\r\n */\r\nexport interface CheckpointMetadata {\r\n /** Unique checkpoint ID */\r\n checkpointId: string;\r\n /** Task ID this checkpoint belongs to */\r\n taskId: string;\r\n /** Checkpoint trigger type */\r\n trigger: CheckpointTrigger;\r\n /** Checkpoint status */\r\n status: CheckpointStatus;\r\n /** Runtime state hash for idempotency */\r\n runtimeStateHash: string;\r\n /** Durable state hash for idempotency */\r\n durableStateHash: string;\r\n /** Created timestamp */\r\n createdAt: Date;\r\n /** Completed timestamp */\r\n completedAt?: Date;\r\n /** Error message if failed */\r\n error?: string;\r\n /** Metadata */\r\n metadata?: Record<string, any>;\r\n}\r\n\r\n/**\r\n * Checkpoint data\r\n */\r\nexport interface CheckpointData {\r\n metadata: CheckpointMetadata;\r\n runtimeState: RuntimeState;\r\n durableState: DurableState;\r\n}\r\n\r\n/**\r\n * Recovery result\r\n */\r\nexport interface RecoveryResult {\r\n success: boolean;\r\n checkpointId: string;\r\n taskId: string;\r\n runtimeStateRestored: boolean;\r\n durableStateRestored: boolean;\r\n timestamp: Date;\r\n errors?: string[];\r\n}\r\n\r\n/**\r\n * Checkpoint manager configuration\r\n */\r\nexport interface CheckpointManagerConfig {\r\n /** Enable periodic checkpoints (default: true) */\r\n enablePeriodicCheckpoints?: boolean;\r\n /** Periodic checkpoint interval in milliseconds (default: 300000 = 5 minutes) */\r\n periodicInterval?: number;\r\n /** Maximum checkpoint retention period in milliseconds (default: 7 days) */\r\n retentionPeriod?: number;\r\n /** Enable automatic cleanup of old checkpoints (default: true) */\r\n enableAutoCleanup?: boolean;\r\n /** Validation timeout in milliseconds (default: 5000) */\r\n validationTimeout?: number;\r\n}\r\n\r\n// ============================================================================\r\n// Checkpoint Manager\r\n// ============================================================================\r\n\r\n/**\r\n * Checkpoint Manager\r\n *\r\n * Manages dual persistence model with idempotent checkpointing and recovery.\r\n */\r\nexport class CheckpointManager {\r\n private dbService: DatabaseService;\r\n private redisAdapter: IDatabaseAdapter;\r\n private sqliteAdapter: IDatabaseAdapter;\r\n private config: Required<CheckpointManagerConfig>;\r\n private periodicCheckpointTimer?: NodeJS.Timeout;\r\n private initialized: boolean = false;\r\n\r\n constructor(\r\n dbService: DatabaseService,\r\n config: CheckpointManagerConfig = {}\r\n ) {\r\n this.dbService = dbService;\r\n\r\n // Get adapters\r\n this.redisAdapter = dbService.getAdapter('redis');\r\n this.sqliteAdapter = dbService.getAdapter('sqlite');\r\n\r\n // Set config with defaults\r\n this.config = {\r\n enablePeriodicCheckpoints: config.enablePeriodicCheckpoints ?? true,\r\n periodicInterval: config.periodicInterval ?? 300000, // 5 minutes\r\n retentionPeriod: config.retentionPeriod ?? 7 * 24 * 60 * 60 * 1000, // 7 days\r\n enableAutoCleanup: config.enableAutoCleanup ?? true,\r\n validationTimeout: config.validationTimeout ?? 5000,\r\n };\r\n\r\n logger.info('CheckpointManager initialized', {\r\n config: this.config,\r\n });\r\n }\r\n\r\n /**\r\n * Initialize checkpoint manager and setup periodic checkpoints\r\n */\r\n async initialize(): Promise<void> {\r\n if (this.initialized) {\r\n logger.warn('CheckpointManager already initialized');\r\n return;\r\n }\r\n\r\n try {\r\n // Create SQLite tables for checkpoint storage\r\n await this.createCheckpointTables();\r\n\r\n // Start periodic checkpoints if enabled\r\n if (this.config.enablePeriodicCheckpoints) {\r\n this.startPeriodicCheckpoints();\r\n }\r\n\r\n this.initialized = true;\r\n logger.info('CheckpointManager initialization complete');\r\n } catch (error) {\r\n const err = error as Error;\r\n logger.error('Failed to initialize CheckpointManager', err);\r\n throw new StandardError(\r\n ErrorCode.CONFIGURATION_ERROR,\r\n 'Failed to initialize CheckpointManager',\r\n { error: err.message },\r\n err\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Shutdown checkpoint manager and cleanup resources\r\n */\r\n async shutdown(): Promise<void> {\r\n if (this.periodicCheckpointTimer) {\r\n clearInterval(this.periodicCheckpointTimer);\r\n this.periodicCheckpointTimer = undefined;\r\n }\r\n\r\n this.initialized = false;\r\n logger.info('CheckpointManager shutdown complete');\r\n }\r\n\r\n /**\r\n * Create a checkpoint for the given task\r\n *\r\n * Idempotent: Creating checkpoint with same state produces same result\r\n */\r\n async createCheckpoint(\r\n taskId: string,\r\n trigger: CheckpointTrigger,\r\n metadata?: Record<string, any>\r\n ): Promise<CheckpointMetadata> {\r\n this.ensureInitialized();\r\n\r\n const startTime = Date.now();\r\n const checkpointId = this.generateCheckpointId(taskId, trigger);\r\n\r\n logger.info('Creating checkpoint', { taskId, checkpointId, trigger });\r\n\r\n try {\r\n // 1. Capture runtime state from Redis\r\n const runtimeState = await this.captureRuntimeState(taskId);\r\n const runtimeStateHash = this.hashState(runtimeState);\r\n\r\n // 2. Capture durable state from SQLite\r\n const durableState = await this.captureDurableState(taskId);\r\n const durableStateHash = this.hashState(durableState);\r\n\r\n // 3. Check for idempotency (same state hash = skip checkpoint)\r\n const existingCheckpoint = await this.findCheckpointByHash(\r\n taskId,\r\n runtimeStateHash,\r\n durableStateHash\r\n );\r\n\r\n if (existingCheckpoint && existingCheckpoint.status === CheckpointStatus.COMPLETED) {\r\n logger.info('Checkpoint already exists with same state hash (idempotent)', {\r\n checkpointId: existingCheckpoint.checkpointId,\r\n taskId,\r\n });\r\n return existingCheckpoint;\r\n }\r\n\r\n // 4. Create checkpoint metadata\r\n const checkpointMetadata: CheckpointMetadata = {\r\n checkpointId,\r\n taskId,\r\n trigger,\r\n status: CheckpointStatus.IN_PROGRESS,\r\n runtimeStateHash,\r\n durableStateHash,\r\n createdAt: new Date(),\r\n metadata,\r\n };\r\n\r\n // 5. Store checkpoint metadata\r\n await this.storeCheckpointMetadata(checkpointMetadata);\r\n\r\n // 6. Validate state before storing (atomic check)\r\n await this.validateState(runtimeState, durableState);\r\n\r\n // 7. Store checkpoint data atomically\r\n await this.storeCheckpointData(checkpointId, runtimeState, durableState);\r\n\r\n // 8. Update checkpoint status to completed\r\n checkpointMetadata.status = CheckpointStatus.COMPLETED;\r\n checkpointMetadata.completedAt = new Date();\r\n await this.updateCheckpointMetadata(checkpointMetadata);\r\n\r\n const duration = Date.now() - startTime;\r\n logger.info('Checkpoint created successfully', {\r\n checkpointId,\r\n taskId,\r\n trigger,\r\n duration,\r\n runtimeStateHash,\r\n durableStateHash,\r\n });\r\n\r\n return checkpointMetadata;\r\n } catch (error) {\r\n const err = error as Error;\r\n logger.error('Failed to create checkpoint', err, { taskId, checkpointId });\r\n\r\n // Mark checkpoint as failed\r\n const failedMetadata: CheckpointMetadata = {\r\n checkpointId,\r\n taskId,\r\n trigger,\r\n status: CheckpointStatus.FAILED,\r\n runtimeStateHash: '',\r\n durableStateHash: '',\r\n createdAt: new Date(),\r\n error: err.message,\r\n metadata,\r\n };\r\n await this.storeCheckpointMetadata(failedMetadata);\r\n\r\n throw new StandardError(\r\n ErrorCode.OPERATION_TIMEOUT,\r\n 'Failed to create checkpoint',\r\n { taskId, checkpointId, trigger },\r\n err\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Recover from the latest checkpoint for the given task\r\n */\r\n async recoverFromCheckpoint(taskId: string): Promise<RecoveryResult> {\r\n this.ensureInitialized();\r\n\r\n logger.info('Starting checkpoint recovery', { taskId });\r\n\r\n try {\r\n // 1. Find latest completed checkpoint\r\n const checkpoint = await this.findLatestCheckpoint(taskId);\r\n\r\n if (!checkpoint) {\r\n throw new StandardError(\r\n ErrorCode.DB_NOT_FOUND,\r\n 'No checkpoint found for task',\r\n { taskId }\r\n );\r\n }\r\n\r\n // 2. Load checkpoint data\r\n const checkpointData = await this.loadCheckpointData(checkpoint.checkpointId);\r\n\r\n // 3. Validate checkpoint data\r\n await this.validateCheckpointData(checkpointData);\r\n\r\n // 4. Restore runtime state to Redis\r\n const runtimeRestored = await this.restoreRuntimeState(\r\n taskId,\r\n checkpointData.runtimeState\r\n );\r\n\r\n // 5. Restore durable state to SQLite (if needed)\r\n const durableRestored = await this.restoreDurableState(\r\n taskId,\r\n checkpointData.durableState\r\n );\r\n\r\n // 6. Update checkpoint status\r\n checkpoint.status = CheckpointStatus.RECOVERED;\r\n await this.updateCheckpointMetadata(checkpoint);\r\n\r\n const result: RecoveryResult = {\r\n success: true,\r\n checkpointId: checkpoint.checkpointId,\r\n taskId,\r\n runtimeStateRestored: runtimeRestored,\r\n durableStateRestored: durableRestored,\r\n timestamp: new Date(),\r\n };\r\n\r\n logger.info('Checkpoint recovery completed', result);\r\n\r\n return result;\r\n } catch (error) {\r\n const err = error as Error;\r\n logger.error('Failed to recover from checkpoint', err, { taskId });\r\n\r\n return {\r\n success: false,\r\n checkpointId: '',\r\n taskId,\r\n runtimeStateRestored: false,\r\n durableStateRestored: false,\r\n timestamp: new Date(),\r\n errors: [err.message],\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * List checkpoints for a task\r\n */\r\n async listCheckpoints(taskId: string): Promise<CheckpointMetadata[]> {\r\n this.ensureInitialized();\r\n\r\n try {\r\n const rows = await this.sqliteAdapter.list<any>('checkpoints', {\r\n filters: [{ field: 'task_id', operator: 'eq', value: taskId }],\r\n orderBy: 'created_at',\r\n order: 'desc',\r\n });\r\n\r\n return rows.map(row => this.deserializeCheckpointMetadata(row));\r\n } catch (error) {\r\n const err = error as Error;\r\n logger.error('Failed to list checkpoints', err, { taskId });\r\n throw new StandardError(\r\n ErrorCode.DB_QUERY_FAILED,\r\n 'Failed to list checkpoints',\r\n { taskId },\r\n err\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Delete old checkpoints (cleanup)\r\n */\r\n async cleanupOldCheckpoints(): Promise<number> {\r\n this.ensureInitialized();\r\n\r\n if (!this.config.enableAutoCleanup) {\r\n logger.info('Automatic cleanup disabled');\r\n return 0;\r\n }\r\n\r\n try {\r\n const cutoffDate = new Date(Date.now() - this.config.retentionPeriod);\r\n\r\n const result = await this.sqliteAdapter.raw(`\r\n DELETE FROM checkpoints\r\n WHERE created_at < ?\r\n `, [cutoffDate.toISOString()]);\r\n\r\n const deletedCount = result.rowsAffected || 0;\r\n\r\n logger.info('Cleaned up old checkpoints', {\r\n deletedCount,\r\n cutoffDate: cutoffDate.toISOString(),\r\n });\r\n\r\n return deletedCount;\r\n } catch (error) {\r\n const err = error as Error;\r\n logger.error('Failed to cleanup old checkpoints', err);\r\n throw new StandardError(\r\n ErrorCode.DB_QUERY_FAILED,\r\n 'Failed to cleanup old checkpoints',\r\n {},\r\n err\r\n );\r\n }\r\n }\r\n\r\n // ============================================================================\r\n // Private Methods - State Capture\r\n // ============================================================================\r\n\r\n private async captureRuntimeState(taskId: string): Promise<RuntimeState> {\r\n try {\r\n // Capture agent execution state\r\n const agentKeys = await this.redisAdapter.raw<string[]>('KEYS', [`agent:${taskId}:*`]);\r\n const agents: AgentExecutionState[] = [];\r\n\r\n for (const key of agentKeys) {\r\n const data = await this.redisAdapter.get<any>(key);\r\n if (data) {\r\n agents.push({\r\n agentId: data.agentId || '',\r\n agentType: data.agentType || '',\r\n status: data.status || 'in_progress',\r\n confidence: data.confidence,\r\n startedAt: new Date(data.startedAt || Date.now()),\r\n completedAt: data.completedAt ? new Date(data.completedAt) : undefined,\r\n metadata: data.metadata,\r\n });\r\n }\r\n }\r\n\r\n // Capture coordination signals\r\n const signalKeys = await this.redisAdapter.raw<string[]>('KEYS', [`swarm:${taskId}:*`]);\r\n const coordinationSignals: CoordinationSignal[] = [];\r\n\r\n for (const key of signalKeys) {\r\n const value = await this.redisAdapter.get<string>(key);\r\n const ttl = await this.redisAdapter.raw<number>('TTL', [key]);\r\n\r\n if (value) {\r\n coordinationSignals.push({\r\n key,\r\n value,\r\n ttl: ttl > 0 ? ttl : undefined,\r\n createdAt: new Date(),\r\n });\r\n }\r\n }\r\n\r\n // Capture queue data\r\n const queueKeys = await this.redisAdapter.raw<string[]>('KEYS', [`queue:${taskId}:*`]);\r\n const queueData: QueueData[] = [];\r\n\r\n for (const key of queueKeys) {\r\n const items = await this.redisAdapter.raw<any[]>('LRANGE', [key, '0', '-1']);\r\n if (items && items.length > 0) {\r\n queueData.push({\r\n queueName: key,\r\n items,\r\n });\r\n }\r\n }\r\n\r\n // Capture active locks\r\n const lockKeys = await this.redisAdapter.raw<string[]>('KEYS', [`lock:${taskId}:*`]);\r\n const activeLocks: Lock[] = [];\r\n\r\n for (const key of lockKeys) {\r\n const owner = await this.redisAdapter.get<string>(key);\r\n const ttl = await this.redisAdapter.raw<number>('TTL', [key]);\r\n\r\n if (owner && ttl > 0) {\r\n activeLocks.push({\r\n lockKey: key,\r\n owner,\r\n acquiredAt: new Date(),\r\n expiresAt: new Date(Date.now() + ttl * 1000),\r\n });\r\n }\r\n }\r\n\r\n return {\r\n taskId,\r\n agents,\r\n coordinationSignals,\r\n queueData,\r\n activeLocks,\r\n capturedAt: new Date(),\r\n };\r\n } catch (error) {\r\n const err = error as Error;\r\n logger.error('Failed to capture runtime state', err, { taskId });\r\n throw new StandardError(\r\n ErrorCode.DB_QUERY_FAILED,\r\n 'Failed to capture runtime state from Redis',\r\n { taskId },\r\n err\r\n );\r\n }\r\n }\r\n\r\n private async captureDurableState(taskId: string): Promise<DurableState> {\r\n try {\r\n // Capture task results\r\n const taskResults = await this.sqliteAdapter.list<TaskResult>('task_results', {\r\n filters: [{ field: 'taskId' as any, operator: 'eq', value: taskId }],\r\n });\r\n\r\n // Capture agent metrics\r\n const agentMetrics = await this.sqliteAdapter.list<AgentMetrics>('agent_metrics', {\r\n filters: [{ field: 'taskId' as any, operator: 'eq', value: taskId }],\r\n });\r\n\r\n // Capture audit trail\r\n const auditTrail = await this.sqliteAdapter.list<AuditEntry>('audit_trail', {\r\n filters: [{ field: 'taskId' as any, operator: 'eq', value: taskId }],\r\n });\r\n\r\n // Capture skill metadata\r\n const skillMetadata = await this.sqliteAdapter.list<SkillMetadata>('skill_metadata', {});\r\n\r\n return {\r\n taskId,\r\n taskResults,\r\n agentMetrics,\r\n auditTrail,\r\n skillMetadata,\r\n capturedAt: new Date(),\r\n };\r\n } catch (error) {\r\n const err = error as Error;\r\n logger.error('Failed to capture durable state', err, { taskId });\r\n throw new StandardError(\r\n ErrorCode.DB_QUERY_FAILED,\r\n 'Failed to capture durable state from SQLite',\r\n { taskId },\r\n err\r\n );\r\n }\r\n }\r\n\r\n // ============================================================================\r\n // Private Methods - State Storage\r\n // ============================================================================\r\n\r\n private async storeCheckpointData(\r\n checkpointId: string,\r\n runtimeState: RuntimeState,\r\n durableState: DurableState\r\n ): Promise<void> {\r\n try {\r\n // Store runtime state as JSON in a key-value table\r\n await this.sqliteAdapter.insert('checkpoint_data', {\r\n key: `checkpoint_runtime:${checkpointId}`,\r\n value: JSON.stringify(runtimeState),\r\n });\r\n\r\n // Store durable state as JSON in a key-value table\r\n await this.sqliteAdapter.insert('checkpoint_data', {\r\n key: `checkpoint_durable:${checkpointId}`,\r\n value: JSON.stringify(durableState),\r\n });\r\n\r\n logger.debug('Checkpoint data stored', { checkpointId });\r\n } catch (error) {\r\n const err = error as Error;\r\n logger.error('Failed to store checkpoint data', err, { checkpointId });\r\n throw new StandardError(\r\n ErrorCode.DB_QUERY_FAILED,\r\n 'Failed to store checkpoint data',\r\n { checkpointId },\r\n err\r\n );\r\n }\r\n }\r\n\r\n private async loadCheckpointData(checkpointId: string): Promise<CheckpointData> {\r\n try {\r\n // Load metadata from checkpoints table\r\n const metadataRow = await this.sqliteAdapter.get<any>(`checkpoints:${checkpointId}`);\r\n if (!metadataRow) {\r\n throw new StandardError(\r\n ErrorCode.DB_NOT_FOUND,\r\n 'Checkpoint metadata not found',\r\n { checkpointId }\r\n );\r\n }\r\n\r\n // Load runtime state from checkpoint_data table\r\n const runtimeStateRow = await this.sqliteAdapter.get<any>(\r\n `checkpoint_data:checkpoint_runtime:${checkpointId}`\r\n );\r\n if (!runtimeStateRow || !runtimeStateRow.value) {\r\n throw new StandardError(\r\n ErrorCode.DB_NOT_FOUND,\r\n 'Checkpoint runtime state not found',\r\n { checkpointId }\r\n );\r\n }\r\n\r\n // Load durable state from checkpoint_data table\r\n const durableStateRow = await this.sqliteAdapter.get<any>(\r\n `checkpoint_data:checkpoint_durable:${checkpointId}`\r\n );\r\n if (!durableStateRow || !durableStateRow.value) {\r\n throw new StandardError(\r\n ErrorCode.DB_NOT_FOUND,\r\n 'Checkpoint durable state not found',\r\n { checkpointId }\r\n );\r\n }\r\n\r\n return {\r\n metadata: this.deserializeCheckpointMetadata(metadataRow),\r\n runtimeState: JSON.parse(runtimeStateRow.value),\r\n durableState: JSON.parse(durableStateRow.value),\r\n };\r\n } catch (error) {\r\n const err = error as Error;\r\n logger.error('Failed to load checkpoint data', err, { checkpointId });\r\n throw new StandardError(\r\n ErrorCode.DB_QUERY_FAILED,\r\n 'Failed to load checkpoint data',\r\n { checkpointId },\r\n err\r\n );\r\n }\r\n }\r\n\r\n // ============================================================================\r\n // Private Methods - State Restoration\r\n // ============================================================================\r\n\r\n private async restoreRuntimeState(\r\n taskId: string,\r\n runtimeState: RuntimeState\r\n ): Promise<boolean> {\r\n try {\r\n // Restore agent execution state\r\n for (const agent of runtimeState.agents) {\r\n await this.redisAdapter.insert(`agent:${taskId}:${agent.agentId}`, agent);\r\n }\r\n\r\n // Restore coordination signals\r\n for (const signal of runtimeState.coordinationSignals) {\r\n await this.redisAdapter.insert(signal.key, signal.value);\r\n if (signal.ttl) {\r\n await this.redisAdapter.raw('EXPIRE', [signal.key, signal.ttl.toString()]);\r\n }\r\n }\r\n\r\n // Restore queue data\r\n for (const queue of runtimeState.queueData) {\r\n await this.redisAdapter.raw('DEL', [queue.queueName]);\r\n for (const item of queue.items) {\r\n await this.redisAdapter.raw('RPUSH', [queue.queueName, JSON.stringify(item)]);\r\n }\r\n }\r\n\r\n // Restore active locks\r\n for (const lock of runtimeState.activeLocks) {\r\n const ttl = Math.floor((lock.expiresAt.getTime() - Date.now()) / 1000);\r\n if (ttl > 0) {\r\n await this.redisAdapter.insert(lock.lockKey, lock.owner);\r\n await this.redisAdapter.raw('EXPIRE', [lock.lockKey, ttl.toString()]);\r\n }\r\n }\r\n\r\n logger.info('Runtime state restored to Redis', { taskId });\r\n return true;\r\n } catch (error) {\r\n const err = error as Error;\r\n logger.error('Failed to restore runtime state', err, { taskId });\r\n return false;\r\n }\r\n }\r\n\r\n private async restoreDurableState(\r\n taskId: string,\r\n durableState: DurableState\r\n ): Promise<boolean> {\r\n try {\r\n // Durable state in SQLite is already persistent\r\n // This method is for future enhancements (e.g., restoring to different instance)\r\n logger.info('Durable state validation complete', { taskId });\r\n return true;\r\n } catch (error) {\r\n const err = error as Error;\r\n logger.error('Failed to restore durable state', err, { taskId });\r\n return false;\r\n }\r\n }\r\n\r\n // ============================================================================\r\n // Private Methods - Validation\r\n // ============================================================================\r\n\r\n private async validateState(\r\n runtimeState: RuntimeState,\r\n durableState: DurableState\r\n ): Promise<void> {\r\n // Validate runtime state\r\n if (!runtimeState.taskId) {\r\n throw new StandardError(\r\n ErrorCode.VALIDATION_FAILED,\r\n 'Invalid runtime state: missing taskId',\r\n { runtimeState }\r\n );\r\n }\r\n\r\n if (!Array.isArray(runtimeState.agents)) {\r\n throw new StandardError(\r\n ErrorCode.VALIDATION_FAILED,\r\n 'Invalid runtime state: agents must be an array',\r\n { runtimeState }\r\n );\r\n }\r\n\r\n // Validate durable state\r\n if (!durableState.taskId) {\r\n throw new StandardError(\r\n ErrorCode.VALIDATION_FAILED,\r\n 'Invalid durable state: missing taskId',\r\n { durableState }\r\n );\r\n }\r\n\r\n if (runtimeState.taskId !== durableState.taskId) {\r\n throw new StandardError(\r\n ErrorCode.VALIDATION_FAILED,\r\n 'Task ID mismatch between runtime and durable state',\r\n { runtimeTaskId: runtimeState.taskId, durableTaskId: durableState.taskId }\r\n );\r\n }\r\n\r\n logger.debug('State validation passed', { taskId: runtimeState.taskId });\r\n }\r\n\r\n private async validateCheckpointData(checkpointData: CheckpointData): Promise<void> {\r\n await this.validateState(checkpointData.runtimeState, checkpointData.durableState);\r\n\r\n if (checkpointData.metadata.status !== CheckpointStatus.COMPLETED) {\r\n throw new StandardError(\r\n ErrorCode.VALIDATION_FAILED,\r\n 'Cannot recover from incomplete checkpoint',\r\n { status: checkpointData.metadata.status }\r\n );\r\n }\r\n\r\n logger.debug('Checkpoint data validation passed', {\r\n checkpointId: checkpointData.metadata.checkpointId,\r\n });\r\n }\r\n\r\n // ============================================================================\r\n // Private Methods - Utilities\r\n // ============================================================================\r\n\r\n private generateCheckpointId(taskId: string, trigger: CheckpointTrigger): string {\r\n const timestamp = Date.now();\r\n const random = crypto.randomBytes(4).toString('hex');\r\n return `checkpoint_${taskId}_${trigger}_${timestamp}_${random}`;\r\n }\r\n\r\n private hashState(state: RuntimeState | DurableState): string {\r\n const stateJson = JSON.stringify(state, Object.keys(state).sort());\r\n return crypto.createHash('sha256').update(stateJson).digest('hex');\r\n }\r\n\r\n private async findCheckpointByHash(\r\n taskId: string,\r\n runtimeHash: string,\r\n durableHash: string\r\n ): Promise<CheckpointMetadata | null> {\r\n try {\r\n const rows = await this.sqliteAdapter.list<any>('checkpoints', {\r\n filters: [\r\n { field: 'task_id', operator: 'eq', value: taskId },\r\n { field: 'runtime_state_hash', operator: 'eq', value: runtimeHash },\r\n { field: 'durable_state_hash', operator: 'eq', value: durableHash },\r\n ],\r\n limit: 1,\r\n });\r\n\r\n if (rows.length === 0) {\r\n return null;\r\n }\r\n\r\n return this.deserializeCheckpointMetadata(rows[0]);\r\n } catch (error) {\r\n const err = error as Error;\r\n logger.error('Failed to find checkpoint by hash', err, { taskId });\r\n return null;\r\n }\r\n }\r\n\r\n private async findLatestCheckpoint(taskId: string): Promise<CheckpointMetadata | null> {\r\n try {\r\n const rows = await this.sqliteAdapter.list<any>('checkpoints', {\r\n filters: [\r\n { field: 'task_id', operator: 'eq', value: taskId },\r\n { field: 'status', operator: 'eq', value: CheckpointStatus.COMPLETED },\r\n ],\r\n orderBy: 'created_at',\r\n order: 'desc',\r\n limit: 1,\r\n });\r\n\r\n if (rows.length === 0) {\r\n return null;\r\n }\r\n\r\n return this.deserializeCheckpointMetadata(rows[0]);\r\n } catch (error) {\r\n const err = error as Error;\r\n logger.error('Failed to find latest checkpoint', err, { taskId });\r\n return null;\r\n }\r\n }\r\n\r\n private async storeCheckpointMetadata(metadata: CheckpointMetadata): Promise<void> {\r\n try {\r\n await this.sqliteAdapter.insert('checkpoints', {\r\n checkpoint_id: metadata.checkpointId,\r\n task_id: metadata.taskId,\r\n trigger: metadata.trigger,\r\n status: metadata.status,\r\n runtime_state_hash: metadata.runtimeStateHash,\r\n durable_state_hash: metadata.durableStateHash,\r\n created_at: metadata.createdAt.toISOString(),\r\n completed_at: metadata.completedAt?.toISOString(),\r\n error: metadata.error,\r\n metadata: JSON.stringify(metadata.metadata || {}),\r\n });\r\n\r\n logger.debug('Checkpoint metadata stored', { checkpointId: metadata.checkpointId });\r\n } catch (error) {\r\n const err = error as Error;\r\n logger.error('Failed to store checkpoint metadata', err, {\r\n checkpointId: metadata.checkpointId,\r\n });\r\n throw new StandardError(\r\n ErrorCode.DB_QUERY_FAILED,\r\n 'Failed to store checkpoint metadata',\r\n { checkpointId: metadata.checkpointId },\r\n err\r\n );\r\n }\r\n }\r\n\r\n private async updateCheckpointMetadata(metadata: CheckpointMetadata): Promise<void> {\r\n try {\r\n await this.sqliteAdapter.update('checkpoints', metadata.checkpointId, {\r\n status: metadata.status,\r\n completed_at: metadata.completedAt?.toISOString(),\r\n error: metadata.error,\r\n });\r\n } catch (error) {\r\n // If update fails, try insert (first time)\r\n await this.storeCheckpointMetadata(metadata);\r\n }\r\n }\r\n\r\n private deserializeCheckpointMetadata(row: any): CheckpointMetadata {\r\n return {\r\n checkpointId: row.checkpoint_id,\r\n taskId: row.task_id,\r\n trigger: row.trigger as CheckpointTrigger,\r\n status: row.status as CheckpointStatus,\r\n runtimeStateHash: row.runtime_state_hash,\r\n durableStateHash: row.durable_state_hash,\r\n createdAt: new Date(row.created_at),\r\n completedAt: row.completed_at ? new Date(row.completed_at) : undefined,\r\n error: row.error,\r\n metadata: row.metadata ? JSON.parse(row.metadata) : undefined,\r\n };\r\n }\r\n\r\n private async createCheckpointTables(): Promise<void> {\r\n try {\r\n // Create checkpoints table\r\n await this.sqliteAdapter.raw(`\r\n CREATE TABLE IF NOT EXISTS checkpoints (\r\n checkpoint_id TEXT PRIMARY KEY,\r\n task_id TEXT NOT NULL,\r\n trigger TEXT NOT NULL,\r\n status TEXT NOT NULL,\r\n runtime_state_hash TEXT NOT NULL,\r\n durable_state_hash TEXT NOT NULL,\r\n created_at TEXT NOT NULL,\r\n completed_at TEXT,\r\n error TEXT,\r\n metadata TEXT\r\n )\r\n `, []);\r\n\r\n // Create checkpoint_data table for storing state JSON\r\n await this.sqliteAdapter.raw(`\r\n CREATE TABLE IF NOT EXISTS checkpoint_data (\r\n key TEXT PRIMARY KEY,\r\n value TEXT NOT NULL\r\n )\r\n `, []);\r\n\r\n // Create indexes\r\n await this.sqliteAdapter.raw(`\r\n CREATE INDEX IF NOT EXISTS idx_checkpoints_task_id ON checkpoints(task_id)\r\n `, []);\r\n\r\n await this.sqliteAdapter.raw(`\r\n CREATE INDEX IF NOT EXISTS idx_checkpoints_status ON checkpoints(status)\r\n `, []);\r\n\r\n await this.sqliteAdapter.raw(`\r\n CREATE INDEX IF NOT EXISTS idx_checkpoints_created_at ON checkpoints(created_at)\r\n `, []);\r\n\r\n logger.info('Checkpoint tables created successfully');\r\n } catch (error) {\r\n const err = error as Error;\r\n logger.error('Failed to create checkpoint tables', err);\r\n throw new StandardError(\r\n ErrorCode.DB_QUERY_FAILED,\r\n 'Failed to create checkpoint tables',\r\n {},\r\n err\r\n );\r\n }\r\n }\r\n\r\n private startPeriodicCheckpoints(): void {\r\n this.periodicCheckpointTimer = setInterval(async () => {\r\n try {\r\n logger.debug('Running periodic checkpoint cleanup');\r\n await this.cleanupOldCheckpoints();\r\n } catch (error) {\r\n const err = error as Error;\r\n logger.error('Periodic checkpoint cleanup failed', err);\r\n }\r\n }, this.config.periodicInterval);\r\n\r\n logger.info('Periodic checkpoints started', {\r\n interval: this.config.periodicInterval,\r\n });\r\n }\r\n\r\n private ensureInitialized(): void {\r\n if (!this.initialized) {\r\n throw new StandardError(\r\n ErrorCode.CONFIGURATION_ERROR,\r\n 'CheckpointManager not initialized. Call initialize() first.',\r\n {}\r\n );\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Export convenience functions\r\n */\r\n\r\n/**\r\n * Create a checkpoint manager instance\r\n */\r\nexport function createCheckpointManager(\r\n dbService: DatabaseService,\r\n config?: CheckpointManagerConfig\r\n): CheckpointManager {\r\n return new CheckpointManager(dbService, config);\r\n}\r\n"],"names":["crypto","getGlobalLogger","StandardError","ErrorCode","logger","CheckpointTrigger","CheckpointStatus","CheckpointManager","dbService","redisAdapter","sqliteAdapter","config","periodicCheckpointTimer","initialized","getAdapter","enablePeriodicCheckpoints","periodicInterval","retentionPeriod","enableAutoCleanup","validationTimeout","info","initialize","warn","createCheckpointTables","startPeriodicCheckpoints","error","err","CONFIGURATION_ERROR","message","shutdown","clearInterval","undefined","createCheckpoint","taskId","trigger","metadata","ensureInitialized","startTime","Date","now","checkpointId","generateCheckpointId","runtimeState","captureRuntimeState","runtimeStateHash","hashState","durableState","captureDurableState","durableStateHash","existingCheckpoint","findCheckpointByHash","status","checkpointMetadata","createdAt","storeCheckpointMetadata","validateState","storeCheckpointData","completedAt","updateCheckpointMetadata","duration","failedMetadata","OPERATION_TIMEOUT","recoverFromCheckpoint","checkpoint","findLatestCheckpoint","DB_NOT_FOUND","checkpointData","loadCheckpointData","validateCheckpointData","runtimeRestored","restoreRuntimeState","durableRestored","restoreDurableState","result","success","runtimeStateRestored","durableStateRestored","timestamp","errors","listCheckpoints","rows","list","filters","field","operator","value","orderBy","order","map","row","deserializeCheckpointMetadata","DB_QUERY_FAILED","cleanupOldCheckpoints","cutoffDate","raw","toISOString","deletedCount","rowsAffected","agentKeys","agents","key","data","get","push","agentId","agentType","confidence","startedAt","signalKeys","coordinationSignals","ttl","queueKeys","queueData","items","length","queueName","lockKeys","activeLocks","owner","lockKey","acquiredAt","expiresAt","capturedAt","taskResults","agentMetrics","auditTrail","skillMetadata","insert","JSON","stringify","debug","metadataRow","runtimeStateRow","durableStateRow","parse","agent","signal","toString","queue","item","lock","Math","floor","getTime","VALIDATION_FAILED","Array","isArray","runtimeTaskId","durableTaskId","random","randomBytes","state","stateJson","Object","keys","sort","createHash","update","digest","runtimeHash","durableHash","limit","checkpoint_id","task_id","runtime_state_hash","durable_state_hash","created_at","completed_at","setInterval","interval","createCheckpointManager"],"mappings":"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"}
@@ -0,0 +1,340 @@
1
+ /**
2
+ * Circuit Breaker Pattern Implementation
3
+ *
4
+ * Provides a robust circuit breaker pattern for protecting external dependencies
5
+ * and preventing cascading failures across the system.
6
+ *
7
+ * Features:
8
+ * - Three-state machine: CLOSED, OPEN, HALF_OPEN
9
+ * - Configurable thresholds and timeouts
10
+ * - Fallback support for graceful degradation
11
+ * - Comprehensive metrics and monitoring
12
+ * - Centralized registry for system-wide visibility
13
+ * - Integration with StandardError and Prometheus metrics
14
+ *
15
+ * Usage:
16
+ * ```typescript
17
+ * const breaker = new CircuitBreaker('external-api', {
18
+ * failureThreshold: 5,
19
+ * successThreshold: 2,
20
+ * timeout: 30000
21
+ * });
22
+ *
23
+ * const result = await breaker.execute(
24
+ * async () => await externalApiCall(),
25
+ * async () => cachedFallbackData
26
+ * );
27
+ * ```
28
+ *
29
+ * Part of: HIGH-PRIORITY Circuit Breaker Enhancement
30
+ */ import { StandardError } from './errors.js';
31
+ import { Logger } from '../core/logger.js';
32
+ const logger = Logger.getInstance();
33
+ /**
34
+ * Circuit breaker states
35
+ */ export var CircuitBreakerState = /*#__PURE__*/ function(CircuitBreakerState) {
36
+ /** Normal operation - requests flow through */ CircuitBreakerState["CLOSED"] = "closed";
37
+ /** Failing - requests are rejected immediately */ CircuitBreakerState["OPEN"] = "open";
38
+ /** Testing recovery - limited requests allowed */ CircuitBreakerState["HALF_OPEN"] = "half_open";
39
+ return CircuitBreakerState;
40
+ }({});
41
+ /**
42
+ * Circuit breaker open error
43
+ */ export class CircuitOpenError extends StandardError {
44
+ serviceName;
45
+ statusCode;
46
+ isOperational;
47
+ constructor(serviceName){
48
+ super('CIRCUIT_OPEN', `Circuit breaker is OPEN for service: ${serviceName}`, {
49
+ serviceName
50
+ }, undefined, false // Not retryable when circuit is open
51
+ );
52
+ this.serviceName = serviceName;
53
+ this.statusCode = 503;
54
+ this.isOperational = true;
55
+ this.name = 'CircuitOpenError';
56
+ }
57
+ }
58
+ /**
59
+ * Circuit Breaker Implementation
60
+ *
61
+ * Implements the circuit breaker pattern to prevent cascading failures
62
+ * by failing fast when a service is detected as unhealthy.
63
+ */ export class CircuitBreaker {
64
+ serviceName;
65
+ config;
66
+ metrics;
67
+ constructor(serviceName, config){
68
+ this.serviceName = serviceName;
69
+ this.config = {
70
+ failureThreshold: config?.failureThreshold ?? 5,
71
+ successThreshold: config?.successThreshold ?? 2,
72
+ timeout: config?.timeout ?? 30000,
73
+ windowSize: config?.windowSize ?? 60000
74
+ };
75
+ this.metrics = {
76
+ state: "closed",
77
+ failures: 0,
78
+ successes: 0,
79
+ totalCalls: 0,
80
+ totalSuccesses: 0,
81
+ totalFailures: 0,
82
+ totalRejected: 0
83
+ };
84
+ logger.info(`Circuit breaker initialized for service: ${serviceName}`, {
85
+ config: this.config
86
+ });
87
+ }
88
+ /**
89
+ * Execute an operation with circuit breaker protection
90
+ *
91
+ * @param operation - The operation to execute
92
+ * @param fallback - Optional fallback function if circuit is open
93
+ * @returns Result of operation or fallback
94
+ * @throws CircuitOpenError if circuit is open and no fallback provided
95
+ */ async execute(operation, fallback) {
96
+ this.metrics.totalCalls = (this.metrics.totalCalls ?? 0) + 1;
97
+ // Check if circuit should transition from OPEN to HALF_OPEN
98
+ if (this.shouldAttemptReset()) {
99
+ this.transitionToHalfOpen();
100
+ }
101
+ // Reject if circuit is OPEN
102
+ if (this.metrics.state === "open") {
103
+ this.metrics.totalRejected = (this.metrics.totalRejected ?? 0) + 1;
104
+ logger.warn(`Circuit breaker rejected request for service: ${this.serviceName}`, {
105
+ state: this.metrics.state,
106
+ failures: this.metrics.failures
107
+ });
108
+ if (fallback) {
109
+ logger.info(`Executing fallback for service: ${this.serviceName}`);
110
+ return await fallback();
111
+ }
112
+ throw new CircuitOpenError(this.serviceName);
113
+ }
114
+ // Execute operation
115
+ try {
116
+ const result = await operation();
117
+ this.onSuccess();
118
+ return result;
119
+ } catch (error) {
120
+ this.onFailure(error);
121
+ throw error;
122
+ }
123
+ }
124
+ /**
125
+ * Record successful operation
126
+ */ onSuccess() {
127
+ this.metrics.totalSuccesses = (this.metrics.totalSuccesses ?? 0) + 1;
128
+ this.metrics.lastSuccessTime = new Date();
129
+ // In CLOSED state, reset failure count on success
130
+ if (this.metrics.state === "closed") {
131
+ this.metrics.failures = 0;
132
+ logger.debug(`Success recorded for service: ${this.serviceName}`, {
133
+ state: this.metrics.state,
134
+ failuresReset: true
135
+ });
136
+ return;
137
+ }
138
+ // Only track consecutive successes in HALF_OPEN state (for recovery)
139
+ if (this.metrics.state === "half_open") {
140
+ this.metrics.successes++;
141
+ logger.debug(`Success recorded for service: ${this.serviceName}`, {
142
+ state: this.metrics.state,
143
+ successes: this.metrics.successes
144
+ });
145
+ // Transition from HALF_OPEN to CLOSED if threshold met
146
+ if (this.metrics.successes >= this.config.successThreshold) {
147
+ this.transitionToClosed();
148
+ }
149
+ }
150
+ }
151
+ /**
152
+ * Record failed operation
153
+ */ onFailure(error) {
154
+ this.metrics.failures++;
155
+ this.metrics.totalFailures = (this.metrics.totalFailures ?? 0) + 1;
156
+ this.metrics.lastFailureTime = new Date();
157
+ logger.warn(`Failure recorded for service: ${this.serviceName}`, {
158
+ state: this.metrics.state,
159
+ failures: this.metrics.failures,
160
+ error: error instanceof Error ? error.message : String(error)
161
+ });
162
+ // Transition from HALF_OPEN to OPEN on any failure
163
+ if (this.metrics.state === "half_open") {
164
+ this.transitionToOpen();
165
+ return;
166
+ }
167
+ // Transition from CLOSED to OPEN if threshold met
168
+ if (this.metrics.state === "closed" && this.metrics.failures >= this.config.failureThreshold) {
169
+ this.transitionToOpen();
170
+ }
171
+ }
172
+ /**
173
+ * Transition to OPEN state
174
+ */ transitionToOpen() {
175
+ this.metrics.state = "open";
176
+ this.metrics.openedAt = new Date();
177
+ logger.error(`Circuit breaker opened for service: ${this.serviceName}`, {
178
+ failures: this.metrics.failures,
179
+ threshold: this.config.failureThreshold
180
+ });
181
+ // Emit metrics event
182
+ this.emitMetrics('circuit_opened');
183
+ }
184
+ /**
185
+ * Transition to HALF_OPEN state
186
+ */ transitionToHalfOpen() {
187
+ this.metrics.state = "half_open";
188
+ this.metrics.successes = 0;
189
+ logger.info(`Circuit breaker half-open for service: ${this.serviceName}`, {
190
+ message: 'Testing service recovery'
191
+ });
192
+ // Emit metrics event
193
+ this.emitMetrics('circuit_half_opened');
194
+ }
195
+ /**
196
+ * Transition to CLOSED state
197
+ */ transitionToClosed() {
198
+ this.metrics.state = "closed";
199
+ this.metrics.failures = 0;
200
+ this.metrics.successes = 0;
201
+ this.metrics.openedAt = undefined;
202
+ logger.info(`Circuit breaker closed for service: ${this.serviceName}`, {
203
+ message: 'Service recovered'
204
+ });
205
+ // Emit metrics event
206
+ this.emitMetrics('circuit_closed');
207
+ }
208
+ /**
209
+ * Check if circuit should attempt reset (OPEN -> HALF_OPEN)
210
+ */ shouldAttemptReset() {
211
+ if (this.metrics.state !== "open") {
212
+ return false;
213
+ }
214
+ if (!this.metrics.openedAt) {
215
+ return false;
216
+ }
217
+ const timeSinceOpen = Date.now() - this.metrics.openedAt.getTime();
218
+ return timeSinceOpen >= this.config.timeout;
219
+ }
220
+ /**
221
+ * Emit metrics for monitoring
222
+ */ emitMetrics(event) {
223
+ // Placeholder for Prometheus metrics integration
224
+ // In production, this would push metrics to Prometheus/Grafana
225
+ logger.debug(`Circuit breaker event: ${event}`, {
226
+ service: this.serviceName,
227
+ state: this.metrics.state,
228
+ metrics: this.metrics
229
+ });
230
+ }
231
+ /**
232
+ * Get current circuit state
233
+ */ getState() {
234
+ return this.metrics.state;
235
+ }
236
+ /**
237
+ * Get current metrics
238
+ */ getMetrics() {
239
+ return {
240
+ ...this.metrics
241
+ };
242
+ }
243
+ /**
244
+ * Check if circuit is healthy (CLOSED state)
245
+ */ isHealthy() {
246
+ return this.metrics.state === "closed";
247
+ }
248
+ /**
249
+ * Manually open the circuit
250
+ */ open() {
251
+ logger.warn(`Manually opening circuit for service: ${this.serviceName}`);
252
+ this.transitionToOpen();
253
+ }
254
+ /**
255
+ * Manually close the circuit and reset metrics
256
+ */ close() {
257
+ logger.info(`Manually closing circuit for service: ${this.serviceName}`);
258
+ this.transitionToClosed();
259
+ }
260
+ /**
261
+ * Get service name
262
+ */ getServiceName() {
263
+ return this.serviceName;
264
+ }
265
+ }
266
+ /**
267
+ * Circuit Breaker Registry
268
+ *
269
+ * Centralized registry for managing multiple circuit breakers across the system.
270
+ * Provides system-wide visibility and health monitoring.
271
+ */ export class CircuitBreakerRegistry {
272
+ static breakers = new Map();
273
+ /**
274
+ * Get or create a circuit breaker for a service
275
+ */ static getOrCreate(serviceName, config) {
276
+ let breaker = this.breakers.get(serviceName);
277
+ if (!breaker) {
278
+ breaker = new CircuitBreaker(serviceName, config);
279
+ this.breakers.set(serviceName, breaker);
280
+ logger.info(`Circuit breaker registered: ${serviceName}`);
281
+ }
282
+ return breaker;
283
+ }
284
+ /**
285
+ * Get existing circuit breaker
286
+ */ static get(serviceName) {
287
+ return this.breakers.get(serviceName);
288
+ }
289
+ /**
290
+ * Get all registered circuit breakers
291
+ */ static getAll() {
292
+ return new Map(this.breakers);
293
+ }
294
+ /**
295
+ * Get health status for all circuit breakers
296
+ */ static getHealthStatus() {
297
+ const status = {};
298
+ for (const [name, breaker] of this.breakers.entries()){
299
+ status[name] = breaker.isHealthy();
300
+ }
301
+ return status;
302
+ }
303
+ /**
304
+ * Get metrics for all circuit breakers
305
+ */ static getAllMetrics() {
306
+ const metrics = {};
307
+ for (const [name, breaker] of this.breakers.entries()){
308
+ metrics[name] = breaker.getMetrics();
309
+ }
310
+ return metrics;
311
+ }
312
+ /**
313
+ * Clear all circuit breakers (for testing)
314
+ */ static clear() {
315
+ this.breakers.clear();
316
+ logger.info('Circuit breaker registry cleared');
317
+ }
318
+ /**
319
+ * Remove specific circuit breaker
320
+ */ static remove(serviceName) {
321
+ const result = this.breakers.delete(serviceName);
322
+ if (result) {
323
+ logger.info(`Circuit breaker removed: ${serviceName}`);
324
+ }
325
+ return result;
326
+ }
327
+ }
328
+ /**
329
+ * Helper function to create a circuit breaker
330
+ */ export function createCircuitBreaker(serviceName, config) {
331
+ return CircuitBreakerRegistry.getOrCreate(serviceName, config);
332
+ }
333
+ /**
334
+ * Helper function to execute with circuit breaker protection
335
+ */ export async function executeWithCircuitBreaker(serviceName, operation, fallback, config) {
336
+ const breaker = CircuitBreakerRegistry.getOrCreate(serviceName, config);
337
+ return breaker.execute(operation, fallback);
338
+ }
339
+
340
+ //# sourceMappingURL=circuit-breaker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/circuit-breaker.ts"],"sourcesContent":["/**\r\n * Circuit Breaker Pattern Implementation\r\n *\r\n * Provides a robust circuit breaker pattern for protecting external dependencies\r\n * and preventing cascading failures across the system.\r\n *\r\n * Features:\r\n * - Three-state machine: CLOSED, OPEN, HALF_OPEN\r\n * - Configurable thresholds and timeouts\r\n * - Fallback support for graceful degradation\r\n * - Comprehensive metrics and monitoring\r\n * - Centralized registry for system-wide visibility\r\n * - Integration with StandardError and Prometheus metrics\r\n *\r\n * Usage:\r\n * ```typescript\r\n * const breaker = new CircuitBreaker('external-api', {\r\n * failureThreshold: 5,\r\n * successThreshold: 2,\r\n * timeout: 30000\r\n * });\r\n *\r\n * const result = await breaker.execute(\r\n * async () => await externalApiCall(),\r\n * async () => cachedFallbackData\r\n * );\r\n * ```\r\n *\r\n * Part of: HIGH-PRIORITY Circuit Breaker Enhancement\r\n */\r\n\r\nimport { StandardError } from './errors.js';\r\nimport { Logger } from '../core/logger.js';\r\n\r\nconst logger = Logger.getInstance();\r\n\r\n/**\r\n * Circuit breaker states\r\n */\r\nexport enum CircuitBreakerState {\r\n /** Normal operation - requests flow through */\r\n CLOSED = 'closed',\r\n /** Failing - requests are rejected immediately */\r\n OPEN = 'open',\r\n /** Testing recovery - limited requests allowed */\r\n HALF_OPEN = 'half_open',\r\n}\r\n\r\n/**\r\n * Circuit breaker configuration\r\n */\r\nexport interface CircuitBreakerConfig {\r\n /** Number of failures before opening circuit (default: 5) */\r\n failureThreshold: number;\r\n /** Number of successes to close circuit from half-open (default: 2) */\r\n successThreshold: number;\r\n /** Time in ms before attempting half-open (default: 30000) */\r\n timeout: number;\r\n /** Time window in ms for counting failures (default: 60000) */\r\n windowSize?: number;\r\n}\r\n\r\n/**\r\n * Circuit breaker metrics\r\n */\r\nexport interface CircuitBreakerMetrics {\r\n /** Current circuit state */\r\n state: CircuitBreakerState;\r\n /** Number of consecutive failures */\r\n failures: number;\r\n /** Number of consecutive successes (in half-open) */\r\n successes: number;\r\n /** Last failure timestamp */\r\n lastFailureTime?: Date;\r\n /** Last success timestamp */\r\n lastSuccessTime?: Date;\r\n /** Time when circuit was opened */\r\n openedAt?: Date;\r\n /** Total number of calls */\r\n totalCalls?: number;\r\n /** Total number of successful calls */\r\n totalSuccesses?: number;\r\n /** Total number of failed calls */\r\n totalFailures?: number;\r\n /** Total number of rejected calls (circuit open) */\r\n totalRejected?: number;\r\n}\r\n\r\n/**\r\n * Circuit breaker open error\r\n */\r\nexport class CircuitOpenError extends StandardError {\r\n public readonly serviceName: string;\r\n public readonly statusCode: number;\r\n public readonly isOperational: boolean;\r\n\r\n constructor(serviceName: string) {\r\n super(\r\n 'CIRCUIT_OPEN',\r\n `Circuit breaker is OPEN for service: ${serviceName}`,\r\n { serviceName },\r\n undefined,\r\n false // Not retryable when circuit is open\r\n );\r\n this.serviceName = serviceName;\r\n this.statusCode = 503;\r\n this.isOperational = true;\r\n this.name = 'CircuitOpenError';\r\n }\r\n}\r\n\r\n/**\r\n * Circuit Breaker Implementation\r\n *\r\n * Implements the circuit breaker pattern to prevent cascading failures\r\n * by failing fast when a service is detected as unhealthy.\r\n */\r\nexport class CircuitBreaker {\r\n private readonly serviceName: string;\r\n private readonly config: Required<CircuitBreakerConfig>;\r\n private metrics: CircuitBreakerMetrics;\r\n\r\n constructor(serviceName: string, config?: Partial<CircuitBreakerConfig>) {\r\n this.serviceName = serviceName;\r\n this.config = {\r\n failureThreshold: config?.failureThreshold ?? 5,\r\n successThreshold: config?.successThreshold ?? 2,\r\n timeout: config?.timeout ?? 30000,\r\n windowSize: config?.windowSize ?? 60000,\r\n };\r\n\r\n this.metrics = {\r\n state: CircuitBreakerState.CLOSED,\r\n failures: 0,\r\n successes: 0,\r\n totalCalls: 0,\r\n totalSuccesses: 0,\r\n totalFailures: 0,\r\n totalRejected: 0,\r\n };\r\n\r\n logger.info(`Circuit breaker initialized for service: ${serviceName}`, {\r\n config: this.config,\r\n });\r\n }\r\n\r\n /**\r\n * Execute an operation with circuit breaker protection\r\n *\r\n * @param operation - The operation to execute\r\n * @param fallback - Optional fallback function if circuit is open\r\n * @returns Result of operation or fallback\r\n * @throws CircuitOpenError if circuit is open and no fallback provided\r\n */\r\n async execute<T>(\r\n operation: () => Promise<T>,\r\n fallback?: () => Promise<T>\r\n ): Promise<T> {\r\n this.metrics.totalCalls = (this.metrics.totalCalls ?? 0) + 1;\r\n\r\n // Check if circuit should transition from OPEN to HALF_OPEN\r\n if (this.shouldAttemptReset()) {\r\n this.transitionToHalfOpen();\r\n }\r\n\r\n // Reject if circuit is OPEN\r\n if (this.metrics.state === CircuitBreakerState.OPEN) {\r\n this.metrics.totalRejected = (this.metrics.totalRejected ?? 0) + 1;\r\n logger.warn(`Circuit breaker rejected request for service: ${this.serviceName}`, {\r\n state: this.metrics.state,\r\n failures: this.metrics.failures,\r\n });\r\n\r\n if (fallback) {\r\n logger.info(`Executing fallback for service: ${this.serviceName}`);\r\n return await fallback();\r\n }\r\n\r\n throw new CircuitOpenError(this.serviceName);\r\n }\r\n\r\n // Execute operation\r\n try {\r\n const result = await operation();\r\n this.onSuccess();\r\n return result;\r\n } catch (error) {\r\n this.onFailure(error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Record successful operation\r\n */\r\n private onSuccess(): void {\r\n this.metrics.totalSuccesses = (this.metrics.totalSuccesses ?? 0) + 1;\r\n this.metrics.lastSuccessTime = new Date();\r\n\r\n // In CLOSED state, reset failure count on success\r\n if (this.metrics.state === CircuitBreakerState.CLOSED) {\r\n this.metrics.failures = 0;\r\n logger.debug(`Success recorded for service: ${this.serviceName}`, {\r\n state: this.metrics.state,\r\n failuresReset: true,\r\n });\r\n return;\r\n }\r\n\r\n // Only track consecutive successes in HALF_OPEN state (for recovery)\r\n if (this.metrics.state === CircuitBreakerState.HALF_OPEN) {\r\n this.metrics.successes++;\r\n\r\n logger.debug(`Success recorded for service: ${this.serviceName}`, {\r\n state: this.metrics.state,\r\n successes: this.metrics.successes,\r\n });\r\n\r\n // Transition from HALF_OPEN to CLOSED if threshold met\r\n if (this.metrics.successes >= this.config.successThreshold) {\r\n this.transitionToClosed();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Record failed operation\r\n */\r\n private onFailure(error: unknown): void {\r\n this.metrics.failures++;\r\n this.metrics.totalFailures = (this.metrics.totalFailures ?? 0) + 1;\r\n this.metrics.lastFailureTime = new Date();\r\n\r\n logger.warn(`Failure recorded for service: ${this.serviceName}`, {\r\n state: this.metrics.state,\r\n failures: this.metrics.failures,\r\n error: error instanceof Error ? error.message : String(error),\r\n });\r\n\r\n // Transition from HALF_OPEN to OPEN on any failure\r\n if (this.metrics.state === CircuitBreakerState.HALF_OPEN) {\r\n this.transitionToOpen();\r\n return;\r\n }\r\n\r\n // Transition from CLOSED to OPEN if threshold met\r\n if (\r\n this.metrics.state === CircuitBreakerState.CLOSED &&\r\n this.metrics.failures >= this.config.failureThreshold\r\n ) {\r\n this.transitionToOpen();\r\n }\r\n }\r\n\r\n /**\r\n * Transition to OPEN state\r\n */\r\n private transitionToOpen(): void {\r\n this.metrics.state = CircuitBreakerState.OPEN;\r\n this.metrics.openedAt = new Date();\r\n\r\n logger.error(`Circuit breaker opened for service: ${this.serviceName}`, {\r\n failures: this.metrics.failures,\r\n threshold: this.config.failureThreshold,\r\n });\r\n\r\n // Emit metrics event\r\n this.emitMetrics('circuit_opened');\r\n }\r\n\r\n /**\r\n * Transition to HALF_OPEN state\r\n */\r\n private transitionToHalfOpen(): void {\r\n this.metrics.state = CircuitBreakerState.HALF_OPEN;\r\n this.metrics.successes = 0;\r\n\r\n logger.info(`Circuit breaker half-open for service: ${this.serviceName}`, {\r\n message: 'Testing service recovery',\r\n });\r\n\r\n // Emit metrics event\r\n this.emitMetrics('circuit_half_opened');\r\n }\r\n\r\n /**\r\n * Transition to CLOSED state\r\n */\r\n private transitionToClosed(): void {\r\n this.metrics.state = CircuitBreakerState.CLOSED;\r\n this.metrics.failures = 0;\r\n this.metrics.successes = 0;\r\n this.metrics.openedAt = undefined;\r\n\r\n logger.info(`Circuit breaker closed for service: ${this.serviceName}`, {\r\n message: 'Service recovered',\r\n });\r\n\r\n // Emit metrics event\r\n this.emitMetrics('circuit_closed');\r\n }\r\n\r\n /**\r\n * Check if circuit should attempt reset (OPEN -> HALF_OPEN)\r\n */\r\n private shouldAttemptReset(): boolean {\r\n if (this.metrics.state !== CircuitBreakerState.OPEN) {\r\n return false;\r\n }\r\n\r\n if (!this.metrics.openedAt) {\r\n return false;\r\n }\r\n\r\n const timeSinceOpen = Date.now() - this.metrics.openedAt.getTime();\r\n return timeSinceOpen >= this.config.timeout;\r\n }\r\n\r\n /**\r\n * Emit metrics for monitoring\r\n */\r\n private emitMetrics(event: string): void {\r\n // Placeholder for Prometheus metrics integration\r\n // In production, this would push metrics to Prometheus/Grafana\r\n logger.debug(`Circuit breaker event: ${event}`, {\r\n service: this.serviceName,\r\n state: this.metrics.state,\r\n metrics: this.metrics,\r\n });\r\n }\r\n\r\n /**\r\n * Get current circuit state\r\n */\r\n getState(): CircuitBreakerState {\r\n return this.metrics.state;\r\n }\r\n\r\n /**\r\n * Get current metrics\r\n */\r\n getMetrics(): CircuitBreakerMetrics {\r\n return { ...this.metrics };\r\n }\r\n\r\n /**\r\n * Check if circuit is healthy (CLOSED state)\r\n */\r\n isHealthy(): boolean {\r\n return this.metrics.state === CircuitBreakerState.CLOSED;\r\n }\r\n\r\n /**\r\n * Manually open the circuit\r\n */\r\n open(): void {\r\n logger.warn(`Manually opening circuit for service: ${this.serviceName}`);\r\n this.transitionToOpen();\r\n }\r\n\r\n /**\r\n * Manually close the circuit and reset metrics\r\n */\r\n close(): void {\r\n logger.info(`Manually closing circuit for service: ${this.serviceName}`);\r\n this.transitionToClosed();\r\n }\r\n\r\n /**\r\n * Get service name\r\n */\r\n getServiceName(): string {\r\n return this.serviceName;\r\n }\r\n}\r\n\r\n/**\r\n * Circuit Breaker Registry\r\n *\r\n * Centralized registry for managing multiple circuit breakers across the system.\r\n * Provides system-wide visibility and health monitoring.\r\n */\r\nexport class CircuitBreakerRegistry {\r\n private static breakers: Map<string, CircuitBreaker> = new Map();\r\n\r\n /**\r\n * Get or create a circuit breaker for a service\r\n */\r\n static getOrCreate(\r\n serviceName: string,\r\n config?: Partial<CircuitBreakerConfig>\r\n ): CircuitBreaker {\r\n let breaker = this.breakers.get(serviceName);\r\n\r\n if (!breaker) {\r\n breaker = new CircuitBreaker(serviceName, config);\r\n this.breakers.set(serviceName, breaker);\r\n logger.info(`Circuit breaker registered: ${serviceName}`);\r\n }\r\n\r\n return breaker;\r\n }\r\n\r\n /**\r\n * Get existing circuit breaker\r\n */\r\n static get(serviceName: string): CircuitBreaker | undefined {\r\n return this.breakers.get(serviceName);\r\n }\r\n\r\n /**\r\n * Get all registered circuit breakers\r\n */\r\n static getAll(): Map<string, CircuitBreaker> {\r\n return new Map(this.breakers);\r\n }\r\n\r\n /**\r\n * Get health status for all circuit breakers\r\n */\r\n static getHealthStatus(): Record<string, boolean> {\r\n const status: Record<string, boolean> = {};\r\n\r\n for (const [name, breaker] of this.breakers.entries()) {\r\n status[name] = breaker.isHealthy();\r\n }\r\n\r\n return status;\r\n }\r\n\r\n /**\r\n * Get metrics for all circuit breakers\r\n */\r\n static getAllMetrics(): Record<string, CircuitBreakerMetrics> {\r\n const metrics: Record<string, CircuitBreakerMetrics> = {};\r\n\r\n for (const [name, breaker] of this.breakers.entries()) {\r\n metrics[name] = breaker.getMetrics();\r\n }\r\n\r\n return metrics;\r\n }\r\n\r\n /**\r\n * Clear all circuit breakers (for testing)\r\n */\r\n static clear(): void {\r\n this.breakers.clear();\r\n logger.info('Circuit breaker registry cleared');\r\n }\r\n\r\n /**\r\n * Remove specific circuit breaker\r\n */\r\n static remove(serviceName: string): boolean {\r\n const result = this.breakers.delete(serviceName);\r\n if (result) {\r\n logger.info(`Circuit breaker removed: ${serviceName}`);\r\n }\r\n return result;\r\n }\r\n}\r\n\r\n/**\r\n * Helper function to create a circuit breaker\r\n */\r\nexport function createCircuitBreaker(\r\n serviceName: string,\r\n config?: Partial<CircuitBreakerConfig>\r\n): CircuitBreaker {\r\n return CircuitBreakerRegistry.getOrCreate(serviceName, config);\r\n}\r\n\r\n/**\r\n * Helper function to execute with circuit breaker protection\r\n */\r\nexport async function executeWithCircuitBreaker<T>(\r\n serviceName: string,\r\n operation: () => Promise<T>,\r\n fallback?: () => Promise<T>,\r\n config?: Partial<CircuitBreakerConfig>\r\n): Promise<T> {\r\n const breaker = CircuitBreakerRegistry.getOrCreate(serviceName, config);\r\n return breaker.execute(operation, fallback);\r\n}\r\n"],"names":["StandardError","Logger","logger","getInstance","CircuitBreakerState","CircuitOpenError","serviceName","statusCode","isOperational","undefined","name","CircuitBreaker","config","metrics","failureThreshold","successThreshold","timeout","windowSize","state","failures","successes","totalCalls","totalSuccesses","totalFailures","totalRejected","info","execute","operation","fallback","shouldAttemptReset","transitionToHalfOpen","warn","result","onSuccess","error","onFailure","lastSuccessTime","Date","debug","failuresReset","transitionToClosed","lastFailureTime","Error","message","String","transitionToOpen","openedAt","threshold","emitMetrics","timeSinceOpen","now","getTime","event","service","getState","getMetrics","isHealthy","open","close","getServiceName","CircuitBreakerRegistry","breakers","Map","getOrCreate","breaker","get","set","getAll","getHealthStatus","status","entries","getAllMetrics","clear","remove","delete","createCircuitBreaker","executeWithCircuitBreaker"],"mappings":"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"}