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,507 @@
1
+ /**
2
+ * DatabaseHandoff.ts - Standard database handoff patterns with cross-database correlation
3
+ *
4
+ * Features:
5
+ * - Cross-database correlation via task_id
6
+ * - Transaction management (begin/commit/rollback)
7
+ * - Query builder with standard correlation
8
+ * - Connection pooling (PostgreSQL, SQLite)
9
+ * - Automatic retry on transient failures
10
+ */ import { Pool as PgPool } from 'pg';
11
+ import sqlite3 from 'sqlite3';
12
+ import { StandardAdapter, JSONLogger } from './StandardAdapter.js';
13
+ /**
14
+ * DatabaseHandoff - Reference implementation for cross-database correlation
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * // PostgreSQL example
19
+ * const pgHandoff = new DatabaseHandoff({
20
+ * type: 'postgresql',
21
+ * pg: {
22
+ * host: 'localhost',
23
+ * port: 5432,
24
+ * database: 'cfn_db',
25
+ * user: 'cfn_user',
26
+ * password: 'secret',
27
+ * },
28
+ * }, {
29
+ * task_id: 'task-123',
30
+ * agent_id: 'agent-456',
31
+ * });
32
+ *
33
+ * await pgHandoff.initialize();
34
+ *
35
+ * // Create handoff with automatic correlation
36
+ * const handoff = await pgHandoff.createHandoff({
37
+ * source_agent_id: 'agent-456',
38
+ * target_agent_id: 'agent-789',
39
+ * payload: { data: 'example' },
40
+ * });
41
+ *
42
+ * // Query by task_id (cross-database correlation)
43
+ * const handoffs = await pgHandoff.getHandoffsByTaskId('task-123');
44
+ *
45
+ * // Transaction example
46
+ * await pgHandoff.withTransaction(async (tx) => {
47
+ * await tx.query('INSERT INTO tasks ...');
48
+ * await tx.query('UPDATE agents ...');
49
+ * // Automatic commit on success, rollback on error
50
+ * });
51
+ * ```
52
+ */ export class DatabaseHandoff {
53
+ config;
54
+ adapter;
55
+ logger;
56
+ // Connection pools
57
+ pg_pool;
58
+ sqlite_db;
59
+ // Initialization state
60
+ initialized = false;
61
+ constructor(config, context){
62
+ this.config = config;
63
+ this.logger = context.logger || new JSONLogger();
64
+ this.adapter = new StandardAdapter({
65
+ task_id: context.task_id,
66
+ agent_id: context.agent_id,
67
+ logger: this.logger
68
+ });
69
+ }
70
+ /**
71
+ * Initialize database connection and schema
72
+ */ async initialize() {
73
+ if (this.initialized) {
74
+ return;
75
+ }
76
+ try {
77
+ if (this.config.type === 'postgresql') {
78
+ await this.initializePostgreSQL();
79
+ } else if (this.config.type === 'sqlite') {
80
+ await this.initializeSQLite();
81
+ } else {
82
+ throw new Error(`Unsupported database type: ${this.config.type}`);
83
+ }
84
+ await this.ensureSchema();
85
+ this.initialized = true;
86
+ this.logger.info('Database handoff initialized', {
87
+ task_id: this.adapter.getContext().task_id,
88
+ database_type: this.config.type
89
+ });
90
+ } catch (error) {
91
+ this.logger.error('Failed to initialize database', {
92
+ task_id: this.adapter.getContext().task_id,
93
+ error: error instanceof Error ? error.message : String(error)
94
+ });
95
+ throw error;
96
+ }
97
+ }
98
+ /**
99
+ * Create a new handoff record
100
+ */ async createHandoff(params) {
101
+ this.ensureInitialized();
102
+ const handoff_id = this.generateHandoffId();
103
+ const { task_id } = this.adapter.getContext();
104
+ const handoff = {
105
+ handoff_id,
106
+ task_id,
107
+ source_agent_id: params.source_agent_id,
108
+ target_agent_id: params.target_agent_id,
109
+ status: 'pending',
110
+ payload: params.payload,
111
+ metadata: params.metadata,
112
+ created_at: new Date(),
113
+ updated_at: new Date()
114
+ };
115
+ return await this.adapter.withRetry(async ()=>{
116
+ if (this.config.type === 'postgresql') {
117
+ return await this.createHandoffPostgreSQL(handoff);
118
+ } else {
119
+ return await this.createHandoffSQLite(handoff);
120
+ }
121
+ });
122
+ }
123
+ /**
124
+ * Get handoff by ID
125
+ */ async getHandoff(handoff_id) {
126
+ this.ensureInitialized();
127
+ return await this.adapter.withRetry(async ()=>{
128
+ if (this.config.type === 'postgresql') {
129
+ return await this.getHandoffPostgreSQL(handoff_id);
130
+ } else {
131
+ return await this.getHandoffSQLite(handoff_id);
132
+ }
133
+ });
134
+ }
135
+ /**
136
+ * Get all handoffs for a task (cross-database correlation)
137
+ */ async getHandoffsByTaskId(task_id) {
138
+ this.ensureInitialized();
139
+ return await this.adapter.withRetry(async ()=>{
140
+ if (this.config.type === 'postgresql') {
141
+ return await this.getHandoffsByTaskIdPostgreSQL(task_id);
142
+ } else {
143
+ return await this.getHandoffsByTaskIdSQLite(task_id);
144
+ }
145
+ });
146
+ }
147
+ /**
148
+ * Update handoff status
149
+ */ async updateHandoffStatus(handoff_id, status, metadata) {
150
+ this.ensureInitialized();
151
+ await this.adapter.withRetry(async ()=>{
152
+ if (this.config.type === 'postgresql') {
153
+ await this.updateHandoffStatusPostgreSQL(handoff_id, status, metadata);
154
+ } else {
155
+ await this.updateHandoffStatusSQLite(handoff_id, status, metadata);
156
+ }
157
+ });
158
+ this.logger.info('Handoff status updated', {
159
+ handoff_id,
160
+ status,
161
+ task_id: this.adapter.getContext().task_id
162
+ });
163
+ }
164
+ /**
165
+ * Execute queries within a transaction
166
+ * Automatically commits on success, rolls back on error
167
+ */ async withTransaction(callback) {
168
+ this.ensureInitialized();
169
+ if (this.config.type === 'postgresql') {
170
+ return await this.withTransactionPostgreSQL(callback);
171
+ } else {
172
+ return await this.withTransactionSQLite(callback);
173
+ }
174
+ }
175
+ /**
176
+ * Close all database connections
177
+ */ async close() {
178
+ try {
179
+ if (this.pg_pool) {
180
+ await this.pg_pool.end();
181
+ this.logger.info('PostgreSQL connection pool closed');
182
+ }
183
+ if (this.sqlite_db) {
184
+ await this.sqlite_db.close();
185
+ this.logger.info('SQLite connection closed');
186
+ }
187
+ this.initialized = false;
188
+ } catch (error) {
189
+ this.logger.error('Error closing database connections', {
190
+ error: error instanceof Error ? error.message : String(error)
191
+ });
192
+ throw error;
193
+ }
194
+ }
195
+ // --- PostgreSQL Implementation ---
196
+ async initializePostgreSQL() {
197
+ if (!this.config.pg) {
198
+ throw new Error('PostgreSQL configuration missing');
199
+ }
200
+ this.pg_pool = new PgPool({
201
+ host: this.config.pg.host,
202
+ port: this.config.pg.port,
203
+ database: this.config.pg.database,
204
+ user: this.config.pg.user,
205
+ password: this.config.pg.password,
206
+ max: this.config.pg.max_connections || 10,
207
+ idleTimeoutMillis: 30000,
208
+ connectionTimeoutMillis: 5000
209
+ });
210
+ // Test connection
211
+ const client = await this.pg_pool.connect();
212
+ client.release();
213
+ }
214
+ async createHandoffPostgreSQL(handoff) {
215
+ const query = `
216
+ INSERT INTO handoffs (
217
+ handoff_id, task_id, source_agent_id, target_agent_id,
218
+ status, payload, metadata, created_at, updated_at
219
+ ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)
220
+ RETURNING *
221
+ `;
222
+ const values = [
223
+ handoff.handoff_id,
224
+ handoff.task_id,
225
+ handoff.source_agent_id,
226
+ handoff.target_agent_id || null,
227
+ handoff.status,
228
+ JSON.stringify(handoff.payload),
229
+ handoff.metadata ? JSON.stringify(handoff.metadata) : null,
230
+ handoff.created_at,
231
+ handoff.updated_at
232
+ ];
233
+ const result = await this.pg_pool.query(query, values);
234
+ return this.rowToHandoff(result.rows[0]);
235
+ }
236
+ async getHandoffPostgreSQL(handoff_id) {
237
+ const query = 'SELECT * FROM handoffs WHERE handoff_id = $1';
238
+ const result = await this.pg_pool.query(query, [
239
+ handoff_id
240
+ ]);
241
+ return result.rows.length > 0 ? this.rowToHandoff(result.rows[0]) : null;
242
+ }
243
+ async getHandoffsByTaskIdPostgreSQL(task_id) {
244
+ const query = 'SELECT * FROM handoffs WHERE task_id = $1 ORDER BY created_at DESC';
245
+ const result = await this.pg_pool.query(query, [
246
+ task_id
247
+ ]);
248
+ return result.rows.map((row)=>this.rowToHandoff(row));
249
+ }
250
+ async updateHandoffStatusPostgreSQL(handoff_id, status, metadata) {
251
+ const updates = [
252
+ 'status = $2',
253
+ 'updated_at = $3'
254
+ ];
255
+ const values = [
256
+ handoff_id,
257
+ status,
258
+ new Date()
259
+ ];
260
+ if (status === 'completed') {
261
+ updates.push('completed_at = $4');
262
+ values.push(new Date());
263
+ }
264
+ if (metadata) {
265
+ const idx = values.length + 1;
266
+ updates.push(`metadata = $${idx}`);
267
+ values.push(JSON.stringify(metadata));
268
+ }
269
+ const query = `UPDATE handoffs SET ${updates.join(', ')} WHERE handoff_id = $1`;
270
+ await this.pg_pool.query(query, values);
271
+ }
272
+ async withTransactionPostgreSQL(callback) {
273
+ const client = await this.pg_pool.connect();
274
+ try {
275
+ await client.query('BEGIN');
276
+ this.logger.debug('Transaction started (PostgreSQL)');
277
+ const tx = new TransactionClient(client, this.logger);
278
+ const result = await callback(tx);
279
+ await client.query('COMMIT');
280
+ this.logger.debug('Transaction committed (PostgreSQL)');
281
+ return result;
282
+ } catch (error) {
283
+ await client.query('ROLLBACK');
284
+ this.logger.warn('Transaction rolled back (PostgreSQL)', {
285
+ error: error instanceof Error ? error.message : String(error)
286
+ });
287
+ throw error;
288
+ } finally{
289
+ client.release();
290
+ }
291
+ }
292
+ // --- SQLite Implementation ---
293
+ async initializeSQLite() {
294
+ if (!this.config.sqlite) {
295
+ throw new Error('SQLite configuration missing');
296
+ }
297
+ const sqlite = await import('sqlite');
298
+ this.sqlite_db = await sqlite.open({
299
+ filename: this.config.sqlite.filepath,
300
+ driver: sqlite3.Database
301
+ });
302
+ }
303
+ async createHandoffSQLite(handoff) {
304
+ const query = `
305
+ INSERT INTO handoffs (
306
+ handoff_id, task_id, source_agent_id, target_agent_id,
307
+ status, payload, metadata, created_at, updated_at
308
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
309
+ `;
310
+ await this.sqlite_db.run(query, [
311
+ handoff.handoff_id,
312
+ handoff.task_id,
313
+ handoff.source_agent_id,
314
+ handoff.target_agent_id || null,
315
+ handoff.status,
316
+ JSON.stringify(handoff.payload),
317
+ handoff.metadata ? JSON.stringify(handoff.metadata) : null,
318
+ handoff.created_at.toISOString(),
319
+ handoff.updated_at.toISOString()
320
+ ]);
321
+ return handoff;
322
+ }
323
+ async getHandoffSQLite(handoff_id) {
324
+ const query = 'SELECT * FROM handoffs WHERE handoff_id = ?';
325
+ const row = await this.sqlite_db.get(query, [
326
+ handoff_id
327
+ ]);
328
+ return row ? this.rowToHandoff(row) : null;
329
+ }
330
+ async getHandoffsByTaskIdSQLite(task_id) {
331
+ const query = 'SELECT * FROM handoffs WHERE task_id = ? ORDER BY created_at DESC';
332
+ const rows = await this.sqlite_db.all(query, [
333
+ task_id
334
+ ]);
335
+ return rows.map((row)=>this.rowToHandoff(row));
336
+ }
337
+ async updateHandoffStatusSQLite(handoff_id, status, metadata) {
338
+ let query = 'UPDATE handoffs SET status = ?, updated_at = ?';
339
+ const values = [
340
+ status,
341
+ new Date().toISOString()
342
+ ];
343
+ if (status === 'completed') {
344
+ query += ', completed_at = ?';
345
+ values.push(new Date().toISOString());
346
+ }
347
+ if (metadata) {
348
+ query += ', metadata = ?';
349
+ values.push(JSON.stringify(metadata));
350
+ }
351
+ query += ' WHERE handoff_id = ?';
352
+ values.push(handoff_id);
353
+ await this.sqlite_db.run(query, values);
354
+ }
355
+ async withTransactionSQLite(callback) {
356
+ try {
357
+ await this.sqlite_db.run('BEGIN TRANSACTION');
358
+ this.logger.debug('Transaction started (SQLite)');
359
+ const tx = new TransactionClient(this.sqlite_db, this.logger);
360
+ const result = await callback(tx);
361
+ await this.sqlite_db.run('COMMIT');
362
+ this.logger.debug('Transaction committed (SQLite)');
363
+ return result;
364
+ } catch (error) {
365
+ await this.sqlite_db.run('ROLLBACK');
366
+ this.logger.warn('Transaction rolled back (SQLite)', {
367
+ error: error instanceof Error ? error.message : String(error)
368
+ });
369
+ throw error;
370
+ }
371
+ }
372
+ // --- Schema Management ---
373
+ async ensureSchema() {
374
+ const schema = `
375
+ CREATE TABLE IF NOT EXISTS handoffs (
376
+ handoff_id TEXT PRIMARY KEY,
377
+ task_id TEXT NOT NULL,
378
+ source_agent_id TEXT NOT NULL,
379
+ target_agent_id TEXT,
380
+ status TEXT NOT NULL,
381
+ payload TEXT NOT NULL,
382
+ metadata TEXT,
383
+ created_at TEXT NOT NULL,
384
+ updated_at TEXT NOT NULL,
385
+ completed_at TEXT
386
+ );
387
+ CREATE INDEX IF NOT EXISTS idx_handoffs_task_id ON handoffs(task_id);
388
+ CREATE INDEX IF NOT EXISTS idx_handoffs_status ON handoffs(status);
389
+ CREATE INDEX IF NOT EXISTS idx_handoffs_created_at ON handoffs(created_at);
390
+ `;
391
+ if (this.config.type === 'postgresql') {
392
+ // PostgreSQL schema (adjust types)
393
+ const pgSchema = schema.replace(/TEXT/g, 'VARCHAR(255)').replace(/payload VARCHAR\(255\)/g, 'payload JSONB').replace(/metadata VARCHAR\(255\)/g, 'metadata JSONB').replace(/created_at VARCHAR\(255\)/g, 'created_at TIMESTAMP').replace(/updated_at VARCHAR\(255\)/g, 'updated_at TIMESTAMP').replace(/completed_at VARCHAR\(255\)/g, 'completed_at TIMESTAMP');
394
+ const statements = pgSchema.split(';').filter((s)=>s.trim());
395
+ for (const stmt of statements){
396
+ await this.pg_pool.query(stmt);
397
+ }
398
+ } else {
399
+ // SQLite schema
400
+ const statements = schema.split(';').filter((s)=>s.trim());
401
+ for (const stmt of statements){
402
+ await this.sqlite_db.run(stmt);
403
+ }
404
+ }
405
+ }
406
+ // --- Helper Methods ---
407
+ ensureInitialized() {
408
+ if (!this.initialized) {
409
+ throw new Error('DatabaseHandoff not initialized. Call initialize() first.');
410
+ }
411
+ }
412
+ generateHandoffId() {
413
+ const timestamp = Date.now();
414
+ const random = Math.random().toString(36).substring(2, 10);
415
+ return `handoff-${timestamp}-${random}`;
416
+ }
417
+ rowToHandoff(row) {
418
+ return {
419
+ handoff_id: row.handoff_id,
420
+ task_id: row.task_id,
421
+ source_agent_id: row.source_agent_id,
422
+ target_agent_id: row.target_agent_id,
423
+ status: row.status,
424
+ payload: typeof row.payload === 'string' ? JSON.parse(row.payload) : row.payload,
425
+ metadata: row.metadata ? typeof row.metadata === 'string' ? JSON.parse(row.metadata) : row.metadata : undefined,
426
+ created_at: new Date(row.created_at),
427
+ updated_at: new Date(row.updated_at),
428
+ completed_at: row.completed_at ? new Date(row.completed_at) : undefined
429
+ };
430
+ }
431
+ }
432
+ /**
433
+ * Transaction client for safe query execution within transactions
434
+ */ export class TransactionClient {
435
+ client;
436
+ logger;
437
+ constructor(client, logger){
438
+ this.client = client;
439
+ this.logger = logger;
440
+ }
441
+ async query(sql, params) {
442
+ this.logger.debug('Executing query in transaction', {
443
+ sql
444
+ });
445
+ if ('query' in this.client) {
446
+ // PostgreSQL
447
+ const result = await this.client.query(sql, params);
448
+ return result;
449
+ } else {
450
+ // SQLite
451
+ if (sql.trim().toUpperCase().startsWith('SELECT')) {
452
+ return await this.client.all(sql, params);
453
+ } else {
454
+ return await this.client.run(sql, params);
455
+ }
456
+ }
457
+ }
458
+ } /**
459
+ * USAGE EXAMPLE - Before (Ad-hoc database access):
460
+ *
461
+ * ```typescript
462
+ * // ❌ No correlation, no transaction safety, manual connection management
463
+ * import { Pool } from 'pg';
464
+ *
465
+ * const pool = new Pool({ ... });
466
+ *
467
+ * async function createTask(data: any) {
468
+ * const client = await pool.connect();
469
+ * try {
470
+ * await client.query('BEGIN');
471
+ * await client.query('INSERT INTO tasks ...');
472
+ * await client.query('INSERT INTO task_metadata ...');
473
+ * await client.query('COMMIT');
474
+ * } catch (err) {
475
+ * await client.query('ROLLBACK');
476
+ * throw err;
477
+ * } finally {
478
+ * client.release();
479
+ * }
480
+ * }
481
+ * ```
482
+ *
483
+ * USAGE EXAMPLE - After (Standardized with correlation):
484
+ *
485
+ * ```typescript
486
+ * // ✅ Automatic correlation, transaction safety, retry logic
487
+ * const handoff = new DatabaseHandoff({
488
+ * type: 'postgresql',
489
+ * pg: { host: 'localhost', port: 5432, database: 'cfn', user: 'user', password: 'pass' },
490
+ * }, {
491
+ * task_id: 'task-123',
492
+ * agent_id: 'agent-456',
493
+ * });
494
+ *
495
+ * await handoff.initialize();
496
+ *
497
+ * async function createTask(data: any) {
498
+ * await handoff.withTransaction(async (tx) => {
499
+ * await tx.query('INSERT INTO tasks (task_id, data) VALUES ($1, $2)', ['task-123', data]);
500
+ * await tx.query('INSERT INTO task_metadata (task_id, source) VALUES ($1, $2)', ['task-123', 'agent-456']);
501
+ * // Auto-commit on success, auto-rollback on error
502
+ * });
503
+ * }
504
+ * ```
505
+ */
506
+
507
+ //# sourceMappingURL=DatabaseHandoff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/integration/DatabaseHandoff.ts"],"sourcesContent":["/**\r\n * DatabaseHandoff.ts - Standard database handoff patterns with cross-database correlation\r\n *\r\n * Features:\r\n * - Cross-database correlation via task_id\r\n * - Transaction management (begin/commit/rollback)\r\n * - Query builder with standard correlation\r\n * - Connection pooling (PostgreSQL, SQLite)\r\n * - Automatic retry on transient failures\r\n */\r\n\r\nimport { Pool as PgPool, PoolClient, QueryResult } from 'pg';\r\nimport sqlite3 from 'sqlite3';\r\nimport { Database as SqliteDB } from 'sqlite';\r\nimport { StandardAdapter, Logger, JSONLogger } from './StandardAdapter.js';\r\n\r\n/**\r\n * Standard handoff record structure\r\n */\r\nexport interface HandoffRecord {\r\n /** Unique handoff ID */\r\n handoff_id: string;\r\n /** Task correlation ID */\r\n task_id: string;\r\n /** Source agent ID */\r\n source_agent_id: string;\r\n /** Target agent ID (if known) */\r\n target_agent_id?: string;\r\n /** Handoff status: pending, in_progress, completed, failed */\r\n status: 'pending' | 'in_progress' | 'completed' | 'failed';\r\n /** Handoff payload (JSON) */\r\n payload: Record<string, unknown>;\r\n /** Optional metadata */\r\n metadata?: Record<string, unknown>;\r\n /** Creation timestamp */\r\n created_at: Date;\r\n /** Update timestamp */\r\n updated_at: Date;\r\n /** Completion timestamp */\r\n completed_at?: Date;\r\n}\r\n\r\n/**\r\n * Database connection configuration\r\n */\r\nexport interface DatabaseConfig {\r\n type: 'postgresql' | 'sqlite';\r\n /** PostgreSQL connection config */\r\n pg?: {\r\n host: string;\r\n port: number;\r\n database: string;\r\n user: string;\r\n password: string;\r\n max_connections?: number;\r\n };\r\n /** SQLite connection config */\r\n sqlite?: {\r\n filepath: string;\r\n mode?: number;\r\n };\r\n}\r\n\r\n/**\r\n * Transaction context for safe rollback\r\n */\r\ninterface TransactionContext {\r\n client?: PoolClient;\r\n in_transaction: boolean;\r\n}\r\n\r\n/**\r\n * DatabaseHandoff - Reference implementation for cross-database correlation\r\n *\r\n * @example\r\n * ```typescript\r\n * // PostgreSQL example\r\n * const pgHandoff = new DatabaseHandoff({\r\n * type: 'postgresql',\r\n * pg: {\r\n * host: 'localhost',\r\n * port: 5432,\r\n * database: 'cfn_db',\r\n * user: 'cfn_user',\r\n * password: 'secret',\r\n * },\r\n * }, {\r\n * task_id: 'task-123',\r\n * agent_id: 'agent-456',\r\n * });\r\n *\r\n * await pgHandoff.initialize();\r\n *\r\n * // Create handoff with automatic correlation\r\n * const handoff = await pgHandoff.createHandoff({\r\n * source_agent_id: 'agent-456',\r\n * target_agent_id: 'agent-789',\r\n * payload: { data: 'example' },\r\n * });\r\n *\r\n * // Query by task_id (cross-database correlation)\r\n * const handoffs = await pgHandoff.getHandoffsByTaskId('task-123');\r\n *\r\n * // Transaction example\r\n * await pgHandoff.withTransaction(async (tx) => {\r\n * await tx.query('INSERT INTO tasks ...');\r\n * await tx.query('UPDATE agents ...');\r\n * // Automatic commit on success, rollback on error\r\n * });\r\n * ```\r\n */\r\nexport class DatabaseHandoff {\r\n private config: DatabaseConfig;\r\n private adapter: StandardAdapter;\r\n private logger: Logger;\r\n\r\n // Connection pools\r\n private pg_pool?: PgPool;\r\n private sqlite_db?: SqliteDB;\r\n\r\n // Initialization state\r\n private initialized = false;\r\n\r\n constructor(\r\n config: DatabaseConfig,\r\n context: { task_id: string; agent_id?: string; logger?: Logger }\r\n ) {\r\n this.config = config;\r\n this.logger = context.logger || new JSONLogger();\r\n this.adapter = new StandardAdapter({\r\n task_id: context.task_id,\r\n agent_id: context.agent_id,\r\n logger: this.logger,\r\n });\r\n }\r\n\r\n /**\r\n * Initialize database connection and schema\r\n */\r\n async initialize(): Promise<void> {\r\n if (this.initialized) {\r\n return;\r\n }\r\n\r\n try {\r\n if (this.config.type === 'postgresql') {\r\n await this.initializePostgreSQL();\r\n } else if (this.config.type === 'sqlite') {\r\n await this.initializeSQLite();\r\n } else {\r\n throw new Error(`Unsupported database type: ${this.config.type}`);\r\n }\r\n\r\n await this.ensureSchema();\r\n this.initialized = true;\r\n\r\n this.logger.info('Database handoff initialized', {\r\n task_id: this.adapter.getContext().task_id,\r\n database_type: this.config.type,\r\n });\r\n } catch (error) {\r\n this.logger.error('Failed to initialize database', {\r\n task_id: this.adapter.getContext().task_id,\r\n error: error instanceof Error ? error.message : String(error),\r\n });\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Create a new handoff record\r\n */\r\n async createHandoff(params: {\r\n source_agent_id: string;\r\n target_agent_id?: string;\r\n payload: Record<string, unknown>;\r\n metadata?: Record<string, unknown>;\r\n }): Promise<HandoffRecord> {\r\n this.ensureInitialized();\r\n\r\n const handoff_id = this.generateHandoffId();\r\n const { task_id } = this.adapter.getContext();\r\n\r\n const handoff: HandoffRecord = {\r\n handoff_id,\r\n task_id,\r\n source_agent_id: params.source_agent_id,\r\n target_agent_id: params.target_agent_id,\r\n status: 'pending',\r\n payload: params.payload,\r\n metadata: params.metadata,\r\n created_at: new Date(),\r\n updated_at: new Date(),\r\n };\r\n\r\n return await this.adapter.withRetry(async () => {\r\n if (this.config.type === 'postgresql') {\r\n return await this.createHandoffPostgreSQL(handoff);\r\n } else {\r\n return await this.createHandoffSQLite(handoff);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Get handoff by ID\r\n */\r\n async getHandoff(handoff_id: string): Promise<HandoffRecord | null> {\r\n this.ensureInitialized();\r\n\r\n return await this.adapter.withRetry(async () => {\r\n if (this.config.type === 'postgresql') {\r\n return await this.getHandoffPostgreSQL(handoff_id);\r\n } else {\r\n return await this.getHandoffSQLite(handoff_id);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Get all handoffs for a task (cross-database correlation)\r\n */\r\n async getHandoffsByTaskId(task_id: string): Promise<HandoffRecord[]> {\r\n this.ensureInitialized();\r\n\r\n return await this.adapter.withRetry(async () => {\r\n if (this.config.type === 'postgresql') {\r\n return await this.getHandoffsByTaskIdPostgreSQL(task_id);\r\n } else {\r\n return await this.getHandoffsByTaskIdSQLite(task_id);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Update handoff status\r\n */\r\n async updateHandoffStatus(\r\n handoff_id: string,\r\n status: HandoffRecord['status'],\r\n metadata?: Record<string, unknown>\r\n ): Promise<void> {\r\n this.ensureInitialized();\r\n\r\n await this.adapter.withRetry(async () => {\r\n if (this.config.type === 'postgresql') {\r\n await this.updateHandoffStatusPostgreSQL(handoff_id, status, metadata);\r\n } else {\r\n await this.updateHandoffStatusSQLite(handoff_id, status, metadata);\r\n }\r\n });\r\n\r\n this.logger.info('Handoff status updated', {\r\n handoff_id,\r\n status,\r\n task_id: this.adapter.getContext().task_id,\r\n });\r\n }\r\n\r\n /**\r\n * Execute queries within a transaction\r\n * Automatically commits on success, rolls back on error\r\n */\r\n async withTransaction<T>(\r\n callback: (tx: TransactionClient) => Promise<T>\r\n ): Promise<T> {\r\n this.ensureInitialized();\r\n\r\n if (this.config.type === 'postgresql') {\r\n return await this.withTransactionPostgreSQL(callback);\r\n } else {\r\n return await this.withTransactionSQLite(callback);\r\n }\r\n }\r\n\r\n /**\r\n * Close all database connections\r\n */\r\n async close(): Promise<void> {\r\n try {\r\n if (this.pg_pool) {\r\n await this.pg_pool.end();\r\n this.logger.info('PostgreSQL connection pool closed');\r\n }\r\n\r\n if (this.sqlite_db) {\r\n await this.sqlite_db.close();\r\n this.logger.info('SQLite connection closed');\r\n }\r\n\r\n this.initialized = false;\r\n } catch (error) {\r\n this.logger.error('Error closing database connections', {\r\n error: error instanceof Error ? error.message : String(error),\r\n });\r\n throw error;\r\n }\r\n }\r\n\r\n // --- PostgreSQL Implementation ---\r\n\r\n private async initializePostgreSQL(): Promise<void> {\r\n if (!this.config.pg) {\r\n throw new Error('PostgreSQL configuration missing');\r\n }\r\n\r\n this.pg_pool = new PgPool({\r\n host: this.config.pg.host,\r\n port: this.config.pg.port,\r\n database: this.config.pg.database,\r\n user: this.config.pg.user,\r\n password: this.config.pg.password,\r\n max: this.config.pg.max_connections || 10,\r\n idleTimeoutMillis: 30000,\r\n connectionTimeoutMillis: 5000,\r\n });\r\n\r\n // Test connection\r\n const client = await this.pg_pool.connect();\r\n client.release();\r\n }\r\n\r\n private async createHandoffPostgreSQL(handoff: HandoffRecord): Promise<HandoffRecord> {\r\n const query = `\r\n INSERT INTO handoffs (\r\n handoff_id, task_id, source_agent_id, target_agent_id,\r\n status, payload, metadata, created_at, updated_at\r\n ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)\r\n RETURNING *\r\n `;\r\n\r\n const values = [\r\n handoff.handoff_id,\r\n handoff.task_id,\r\n handoff.source_agent_id,\r\n handoff.target_agent_id || null,\r\n handoff.status,\r\n JSON.stringify(handoff.payload),\r\n handoff.metadata ? JSON.stringify(handoff.metadata) : null,\r\n handoff.created_at,\r\n handoff.updated_at,\r\n ];\r\n\r\n const result = await this.pg_pool!.query(query, values);\r\n return this.rowToHandoff(result.rows[0]);\r\n }\r\n\r\n private async getHandoffPostgreSQL(handoff_id: string): Promise<HandoffRecord | null> {\r\n const query = 'SELECT * FROM handoffs WHERE handoff_id = $1';\r\n const result = await this.pg_pool!.query(query, [handoff_id]);\r\n return result.rows.length > 0 ? this.rowToHandoff(result.rows[0]) : null;\r\n }\r\n\r\n private async getHandoffsByTaskIdPostgreSQL(task_id: string): Promise<HandoffRecord[]> {\r\n const query = 'SELECT * FROM handoffs WHERE task_id = $1 ORDER BY created_at DESC';\r\n const result = await this.pg_pool!.query(query, [task_id]);\r\n return result.rows.map(row => this.rowToHandoff(row));\r\n }\r\n\r\n private async updateHandoffStatusPostgreSQL(\r\n handoff_id: string,\r\n status: HandoffRecord['status'],\r\n metadata?: Record<string, unknown>\r\n ): Promise<void> {\r\n const updates: string[] = ['status = $2', 'updated_at = $3'];\r\n const values: any[] = [handoff_id, status, new Date()];\r\n\r\n if (status === 'completed') {\r\n updates.push('completed_at = $4');\r\n values.push(new Date());\r\n }\r\n\r\n if (metadata) {\r\n const idx = values.length + 1;\r\n updates.push(`metadata = $${idx}`);\r\n values.push(JSON.stringify(metadata));\r\n }\r\n\r\n const query = `UPDATE handoffs SET ${updates.join(', ')} WHERE handoff_id = $1`;\r\n await this.pg_pool!.query(query, values);\r\n }\r\n\r\n private async withTransactionPostgreSQL<T>(\r\n callback: (tx: TransactionClient) => Promise<T>\r\n ): Promise<T> {\r\n const client = await this.pg_pool!.connect();\r\n\r\n try {\r\n await client.query('BEGIN');\r\n this.logger.debug('Transaction started (PostgreSQL)');\r\n\r\n const tx = new TransactionClient(client, this.logger);\r\n const result = await callback(tx);\r\n\r\n await client.query('COMMIT');\r\n this.logger.debug('Transaction committed (PostgreSQL)');\r\n\r\n return result;\r\n } catch (error) {\r\n await client.query('ROLLBACK');\r\n this.logger.warn('Transaction rolled back (PostgreSQL)', {\r\n error: error instanceof Error ? error.message : String(error),\r\n });\r\n throw error;\r\n } finally {\r\n client.release();\r\n }\r\n }\r\n\r\n // --- SQLite Implementation ---\r\n\r\n private async initializeSQLite(): Promise<void> {\r\n if (!this.config.sqlite) {\r\n throw new Error('SQLite configuration missing');\r\n }\r\n\r\n const sqlite = await import('sqlite');\r\n this.sqlite_db = await sqlite.open({\r\n filename: this.config.sqlite.filepath,\r\n driver: sqlite3.Database,\r\n });\r\n }\r\n\r\n private async createHandoffSQLite(handoff: HandoffRecord): Promise<HandoffRecord> {\r\n const query = `\r\n INSERT INTO handoffs (\r\n handoff_id, task_id, source_agent_id, target_agent_id,\r\n status, payload, metadata, created_at, updated_at\r\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\r\n `;\r\n\r\n await this.sqlite_db!.run(query, [\r\n handoff.handoff_id,\r\n handoff.task_id,\r\n handoff.source_agent_id,\r\n handoff.target_agent_id || null,\r\n handoff.status,\r\n JSON.stringify(handoff.payload),\r\n handoff.metadata ? JSON.stringify(handoff.metadata) : null,\r\n handoff.created_at.toISOString(),\r\n handoff.updated_at.toISOString(),\r\n ]);\r\n\r\n return handoff;\r\n }\r\n\r\n private async getHandoffSQLite(handoff_id: string): Promise<HandoffRecord | null> {\r\n const query = 'SELECT * FROM handoffs WHERE handoff_id = ?';\r\n const row = await this.sqlite_db!.get(query, [handoff_id]);\r\n return row ? this.rowToHandoff(row) : null;\r\n }\r\n\r\n private async getHandoffsByTaskIdSQLite(task_id: string): Promise<HandoffRecord[]> {\r\n const query = 'SELECT * FROM handoffs WHERE task_id = ? ORDER BY created_at DESC';\r\n const rows = await this.sqlite_db!.all(query, [task_id]);\r\n return rows.map(row => this.rowToHandoff(row));\r\n }\r\n\r\n private async updateHandoffStatusSQLite(\r\n handoff_id: string,\r\n status: HandoffRecord['status'],\r\n metadata?: Record<string, unknown>\r\n ): Promise<void> {\r\n let query = 'UPDATE handoffs SET status = ?, updated_at = ?';\r\n const values: any[] = [status, new Date().toISOString()];\r\n\r\n if (status === 'completed') {\r\n query += ', completed_at = ?';\r\n values.push(new Date().toISOString());\r\n }\r\n\r\n if (metadata) {\r\n query += ', metadata = ?';\r\n values.push(JSON.stringify(metadata));\r\n }\r\n\r\n query += ' WHERE handoff_id = ?';\r\n values.push(handoff_id);\r\n\r\n await this.sqlite_db!.run(query, values);\r\n }\r\n\r\n private async withTransactionSQLite<T>(\r\n callback: (tx: TransactionClient) => Promise<T>\r\n ): Promise<T> {\r\n try {\r\n await this.sqlite_db!.run('BEGIN TRANSACTION');\r\n this.logger.debug('Transaction started (SQLite)');\r\n\r\n const tx = new TransactionClient(this.sqlite_db!, this.logger);\r\n const result = await callback(tx);\r\n\r\n await this.sqlite_db!.run('COMMIT');\r\n this.logger.debug('Transaction committed (SQLite)');\r\n\r\n return result;\r\n } catch (error) {\r\n await this.sqlite_db!.run('ROLLBACK');\r\n this.logger.warn('Transaction rolled back (SQLite)', {\r\n error: error instanceof Error ? error.message : String(error),\r\n });\r\n throw error;\r\n }\r\n }\r\n\r\n // --- Schema Management ---\r\n\r\n private async ensureSchema(): Promise<void> {\r\n const schema = `\r\n CREATE TABLE IF NOT EXISTS handoffs (\r\n handoff_id TEXT PRIMARY KEY,\r\n task_id TEXT NOT NULL,\r\n source_agent_id TEXT NOT NULL,\r\n target_agent_id TEXT,\r\n status TEXT NOT NULL,\r\n payload TEXT NOT NULL,\r\n metadata TEXT,\r\n created_at TEXT NOT NULL,\r\n updated_at TEXT NOT NULL,\r\n completed_at TEXT\r\n );\r\n CREATE INDEX IF NOT EXISTS idx_handoffs_task_id ON handoffs(task_id);\r\n CREATE INDEX IF NOT EXISTS idx_handoffs_status ON handoffs(status);\r\n CREATE INDEX IF NOT EXISTS idx_handoffs_created_at ON handoffs(created_at);\r\n `;\r\n\r\n if (this.config.type === 'postgresql') {\r\n // PostgreSQL schema (adjust types)\r\n const pgSchema = schema\r\n .replace(/TEXT/g, 'VARCHAR(255)')\r\n .replace(/payload VARCHAR\\(255\\)/g, 'payload JSONB')\r\n .replace(/metadata VARCHAR\\(255\\)/g, 'metadata JSONB')\r\n .replace(/created_at VARCHAR\\(255\\)/g, 'created_at TIMESTAMP')\r\n .replace(/updated_at VARCHAR\\(255\\)/g, 'updated_at TIMESTAMP')\r\n .replace(/completed_at VARCHAR\\(255\\)/g, 'completed_at TIMESTAMP');\r\n\r\n const statements = pgSchema.split(';').filter(s => s.trim());\r\n for (const stmt of statements) {\r\n await this.pg_pool!.query(stmt);\r\n }\r\n } else {\r\n // SQLite schema\r\n const statements = schema.split(';').filter(s => s.trim());\r\n for (const stmt of statements) {\r\n await this.sqlite_db!.run(stmt);\r\n }\r\n }\r\n }\r\n\r\n // --- Helper Methods ---\r\n\r\n private ensureInitialized(): void {\r\n if (!this.initialized) {\r\n throw new Error('DatabaseHandoff not initialized. Call initialize() first.');\r\n }\r\n }\r\n\r\n private generateHandoffId(): string {\r\n const timestamp = Date.now();\r\n const random = Math.random().toString(36).substring(2, 10);\r\n return `handoff-${timestamp}-${random}`;\r\n }\r\n\r\n private rowToHandoff(row: any): HandoffRecord {\r\n return {\r\n handoff_id: row.handoff_id,\r\n task_id: row.task_id,\r\n source_agent_id: row.source_agent_id,\r\n target_agent_id: row.target_agent_id,\r\n status: row.status,\r\n payload: typeof row.payload === 'string' ? JSON.parse(row.payload) : row.payload,\r\n metadata: row.metadata\r\n ? typeof row.metadata === 'string'\r\n ? JSON.parse(row.metadata)\r\n : row.metadata\r\n : undefined,\r\n created_at: new Date(row.created_at),\r\n updated_at: new Date(row.updated_at),\r\n completed_at: row.completed_at ? new Date(row.completed_at) : undefined,\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Transaction client for safe query execution within transactions\r\n */\r\nexport class TransactionClient {\r\n constructor(\r\n private client: PoolClient | SqliteDB,\r\n private logger: Logger\r\n ) {}\r\n\r\n async query(sql: string, params?: any[]): Promise<any> {\r\n this.logger.debug('Executing query in transaction', { sql });\r\n\r\n if ('query' in this.client) {\r\n // PostgreSQL\r\n const result = await this.client.query(sql, params);\r\n return result;\r\n } else {\r\n // SQLite\r\n if (sql.trim().toUpperCase().startsWith('SELECT')) {\r\n return await this.client.all(sql, params);\r\n } else {\r\n return await this.client.run(sql, params);\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * USAGE EXAMPLE - Before (Ad-hoc database access):\r\n *\r\n * ```typescript\r\n * // ❌ No correlation, no transaction safety, manual connection management\r\n * import { Pool } from 'pg';\r\n *\r\n * const pool = new Pool({ ... });\r\n *\r\n * async function createTask(data: any) {\r\n * const client = await pool.connect();\r\n * try {\r\n * await client.query('BEGIN');\r\n * await client.query('INSERT INTO tasks ...');\r\n * await client.query('INSERT INTO task_metadata ...');\r\n * await client.query('COMMIT');\r\n * } catch (err) {\r\n * await client.query('ROLLBACK');\r\n * throw err;\r\n * } finally {\r\n * client.release();\r\n * }\r\n * }\r\n * ```\r\n *\r\n * USAGE EXAMPLE - After (Standardized with correlation):\r\n *\r\n * ```typescript\r\n * // ✅ Automatic correlation, transaction safety, retry logic\r\n * const handoff = new DatabaseHandoff({\r\n * type: 'postgresql',\r\n * pg: { host: 'localhost', port: 5432, database: 'cfn', user: 'user', password: 'pass' },\r\n * }, {\r\n * task_id: 'task-123',\r\n * agent_id: 'agent-456',\r\n * });\r\n *\r\n * await handoff.initialize();\r\n *\r\n * async function createTask(data: any) {\r\n * await handoff.withTransaction(async (tx) => {\r\n * await tx.query('INSERT INTO tasks (task_id, data) VALUES ($1, $2)', ['task-123', data]);\r\n * await tx.query('INSERT INTO task_metadata (task_id, source) VALUES ($1, $2)', ['task-123', 'agent-456']);\r\n * // Auto-commit on success, auto-rollback on error\r\n * });\r\n * }\r\n * ```\r\n */\r\n"],"names":["Pool","PgPool","sqlite3","StandardAdapter","JSONLogger","DatabaseHandoff","config","adapter","logger","pg_pool","sqlite_db","initialized","context","task_id","agent_id","initialize","type","initializePostgreSQL","initializeSQLite","Error","ensureSchema","info","getContext","database_type","error","message","String","createHandoff","params","ensureInitialized","handoff_id","generateHandoffId","handoff","source_agent_id","target_agent_id","status","payload","metadata","created_at","Date","updated_at","withRetry","createHandoffPostgreSQL","createHandoffSQLite","getHandoff","getHandoffPostgreSQL","getHandoffSQLite","getHandoffsByTaskId","getHandoffsByTaskIdPostgreSQL","getHandoffsByTaskIdSQLite","updateHandoffStatus","updateHandoffStatusPostgreSQL","updateHandoffStatusSQLite","withTransaction","callback","withTransactionPostgreSQL","withTransactionSQLite","close","end","pg","host","port","database","user","password","max","max_connections","idleTimeoutMillis","connectionTimeoutMillis","client","connect","release","query","values","JSON","stringify","result","rowToHandoff","rows","length","map","row","updates","push","idx","join","debug","tx","TransactionClient","warn","sqlite","open","filename","filepath","driver","Database","run","toISOString","get","all","schema","pgSchema","replace","statements","split","filter","s","trim","stmt","timestamp","now","random","Math","toString","substring","parse","undefined","completed_at","sql","toUpperCase","startsWith"],"mappings":"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"}