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/database-service/transaction-manager.ts"],"sourcesContent":["/**\r\n * Cross-Database Transaction Manager\r\n *\r\n * Manages atomic transactions across Redis, SQLite, and PostgreSQL with:\r\n * - Savepoint support for nested transactions\r\n * - Distributed locking integration\r\n * - Transaction timeout handling\r\n * - Isolation level support\r\n *\r\n * Part of Task 3.1: Cross-Database Transaction Framework\r\n */\r\n\r\nimport { randomUUID } from 'crypto';\r\nimport { IDatabaseAdapter, TransactionContext } from './types.js';\r\nimport { DatabaseErrorCode, createDatabaseError } from './errors.js';\r\nimport { createLogger } from '../logging.js';\r\nimport { generateCorrelationId } from '../correlation.js';\r\n\r\nconst logger = createLogger('transaction-manager');\r\n\r\n/**\r\n * Transaction isolation levels\r\n */\r\nexport enum IsolationLevel {\r\n READ_UNCOMMITTED = 'READ UNCOMMITTED',\r\n READ_COMMITTED = 'READ COMMITTED',\r\n REPEATABLE_READ = 'REPEATABLE READ',\r\n SERIALIZABLE = 'SERIALIZABLE',\r\n}\r\n\r\n/**\r\n * Transaction state for two-phase commit\r\n */\r\nexport enum TransactionState {\r\n ACTIVE = 'ACTIVE',\r\n PREPARING = 'PREPARING',\r\n PREPARED = 'PREPARED',\r\n COMMITTING = 'COMMITTING',\r\n COMMITTED = 'COMMITTED',\r\n ABORTING = 'ABORTING',\r\n ABORTED = 'ABORTED',\r\n ROLLED_BACK = 'ROLLED_BACK',\r\n}\r\n\r\n/**\r\n * Transaction options\r\n */\r\nexport interface TransactionOptions {\r\n /** Transaction timeout in milliseconds (default: 30000) */\r\n timeout?: number;\r\n /** Transaction isolation level (default: READ_COMMITTED) */\r\n isolationLevel?: IsolationLevel;\r\n /** Automatically acquire distributed lock (default: false) */\r\n acquireLock?: boolean;\r\n /** Lock timeout in milliseconds (default: 10000) */\r\n lockTimeout?: number;\r\n /** Correlation ID for tracking (auto-generated if not provided) */\r\n correlationId?: string;\r\n /** Prepare phase timeout in milliseconds for 2PC (default: 5000) */\r\n prepareTimeout?: number;\r\n /** Enable two-phase commit protocol (default: true for multi-database transactions) */\r\n useTwoPhaseCommit?: boolean;\r\n}\r\n\r\n/**\r\n * Savepoint information\r\n */\r\ninterface SavepointInfo {\r\n name: string;\r\n createdAt: Date;\r\n database: string;\r\n}\r\n\r\n/**\r\n * Two-phase commit log entry\r\n */\r\ninterface TwoPhaseCommitLog {\r\n transactionId: string;\r\n state: TransactionState;\r\n timestamp: Date;\r\n databases: string[];\r\n preparedDatabases: string[];\r\n failedDatabases: string[];\r\n error?: string;\r\n}\r\n\r\n/**\r\n * Transaction class providing fluent API for cross-database transactions\r\n */\r\nexport class Transaction {\r\n readonly id: string;\r\n readonly startedAt: Date;\r\n readonly databases: string[];\r\n readonly correlationId: string;\r\n readonly options: Required<Omit<TransactionOptions, 'correlationId'>>;\r\n\r\n private contexts: Map<string, TransactionContext> = new Map();\r\n private adapters: Map<string, IDatabaseAdapter> = new Map();\r\n private savepoints: Map<string, SavepointInfo> = new Map();\r\n private state: TransactionState = TransactionState.ACTIVE;\r\n private isCommitted = false;\r\n private isRolledBack = false;\r\n private timeoutHandle?: NodeJS.Timeout;\r\n private prepareTimeoutHandle?: NodeJS.Timeout;\r\n private lockReleaser?: () => Promise<void>;\r\n private preparedDatabases: Set<string> = new Set();\r\n private twoPhaseCommitLog: TwoPhaseCommitLog[] = [];\r\n\r\n constructor(\r\n id: string,\r\n databases: string[],\r\n adapters: Map<string, IDatabaseAdapter>,\r\n options: TransactionOptions = {}\r\n ) {\r\n this.id = id;\r\n this.startedAt = new Date();\r\n this.databases = databases;\r\n this.adapters = adapters;\r\n this.correlationId = options.correlationId || generateCorrelationId();\r\n this.options = {\r\n timeout: options.timeout ?? 30000,\r\n isolationLevel: options.isolationLevel ?? IsolationLevel.READ_COMMITTED,\r\n acquireLock: options.acquireLock ?? false,\r\n lockTimeout: options.lockTimeout ?? 10000,\r\n prepareTimeout: options.prepareTimeout ?? 5000,\r\n useTwoPhaseCommit: options.useTwoPhaseCommit ?? (databases.length > 1),\r\n };\r\n\r\n logger.info('Transaction created', {\r\n transactionId: this.id,\r\n databases: this.databases,\r\n correlationId: this.correlationId,\r\n options: this.options,\r\n useTwoPhaseCommit: this.options.useTwoPhaseCommit,\r\n });\r\n }\r\n\r\n /**\r\n * Start the transaction on all databases\r\n */\r\n async begin(): Promise<void> {\r\n if (this.isCommitted || this.isRolledBack) {\r\n throw createDatabaseError(\r\n DatabaseErrorCode.TRANSACTION_FAILED,\r\n 'Cannot begin transaction that has already completed',\r\n undefined,\r\n { transactionId: this.id, status: this.isCommitted ? 'committed' : 'rolled_back' }\r\n );\r\n }\r\n\r\n try {\r\n // Set transaction timeout\r\n this.timeoutHandle = setTimeout(() => {\r\n this.handleTimeout();\r\n }, this.options.timeout);\r\n\r\n // Begin transaction on each database\r\n for (const dbType of this.databases) {\r\n const adapter = this.adapters.get(dbType);\r\n if (!adapter) {\r\n throw createDatabaseError(\r\n DatabaseErrorCode.VALIDATION_FAILED,\r\n `Database adapter not found: ${dbType}`,\r\n undefined,\r\n { database: dbType }\r\n );\r\n }\r\n\r\n const context = await adapter.beginTransaction();\r\n this.contexts.set(dbType, context);\r\n\r\n logger.debug('Transaction started on database', {\r\n transactionId: this.id,\r\n database: dbType,\r\n contextId: context.id,\r\n });\r\n }\r\n\r\n logger.info('Transaction began successfully', {\r\n transactionId: this.id,\r\n databases: this.databases,\r\n });\r\n } catch (err) {\r\n // Rollback any successful transaction starts\r\n await this.rollback();\r\n throw err;\r\n }\r\n }\r\n\r\n /**\r\n * Execute an operation on a specific database within this transaction\r\n */\r\n async execute<T>(\r\n database: string,\r\n operation: (adapter: IDatabaseAdapter) => Promise<T>\r\n ): Promise<T> {\r\n if (this.isCommitted) {\r\n throw createDatabaseError(\r\n DatabaseErrorCode.TRANSACTION_FAILED,\r\n 'Cannot execute operation on committed transaction',\r\n undefined,\r\n { transactionId: this.id }\r\n );\r\n }\r\n\r\n if (this.isRolledBack) {\r\n throw createDatabaseError(\r\n DatabaseErrorCode.TRANSACTION_FAILED,\r\n 'Cannot execute operation on rolled back transaction',\r\n undefined,\r\n { transactionId: this.id }\r\n );\r\n }\r\n\r\n const adapter = this.adapters.get(database);\r\n if (!adapter) {\r\n throw createDatabaseError(\r\n DatabaseErrorCode.VALIDATION_FAILED,\r\n `Database not part of this transaction: ${database}`,\r\n undefined,\r\n { database, transactionDatabases: this.databases }\r\n );\r\n }\r\n\r\n try {\r\n logger.debug('Executing operation', {\r\n transactionId: this.id,\r\n database,\r\n });\r\n\r\n const result = await operation(adapter);\r\n\r\n logger.debug('Operation completed', {\r\n transactionId: this.id,\r\n database,\r\n });\r\n\r\n return result;\r\n } catch (err) {\r\n logger.error('Operation failed', err as Error, {\r\n transactionId: this.id,\r\n database,\r\n });\r\n\r\n // Auto-rollback on error\r\n await this.rollback();\r\n throw err;\r\n }\r\n }\r\n\r\n /**\r\n * Create a savepoint for nested transaction control\r\n */\r\n async savepoint(name: string): Promise<void> {\r\n if (!name || !/^[a-zA-Z0-9_]+$/.test(name)) {\r\n throw createDatabaseError(\r\n DatabaseErrorCode.VALIDATION_FAILED,\r\n 'Savepoint name must be alphanumeric with underscores',\r\n undefined,\r\n { name }\r\n );\r\n }\r\n\r\n if (this.savepoints.has(name)) {\r\n throw createDatabaseError(\r\n DatabaseErrorCode.VALIDATION_FAILED,\r\n `Savepoint already exists: ${name}`,\r\n undefined,\r\n { name }\r\n );\r\n }\r\n\r\n // Create savepoint on all databases\r\n for (const dbType of this.databases) {\r\n const adapter = this.adapters.get(dbType);\r\n if (!adapter) continue;\r\n\r\n try {\r\n // Execute savepoint SQL (PostgreSQL and SQLite support this)\r\n if (dbType === 'postgres' || dbType === 'sqlite') {\r\n await adapter.raw(`SAVEPOINT ${name}`);\r\n }\r\n // Redis doesn't support savepoints, skip\r\n } catch (err) {\r\n throw createDatabaseError(\r\n DatabaseErrorCode.TRANSACTION_FAILED,\r\n `Failed to create savepoint: ${name}`,\r\n err as Error,\r\n { database: dbType, savepoint: name }\r\n );\r\n }\r\n }\r\n\r\n this.savepoints.set(name, {\r\n name,\r\n createdAt: new Date(),\r\n database: this.databases.join(','),\r\n });\r\n\r\n logger.info('Savepoint created', {\r\n transactionId: this.id,\r\n savepoint: name,\r\n });\r\n }\r\n\r\n /**\r\n * Rollback to a specific savepoint\r\n */\r\n async rollbackToSavepoint(name: string): Promise<void> {\r\n if (!this.savepoints.has(name)) {\r\n throw createDatabaseError(\r\n DatabaseErrorCode.VALIDATION_FAILED,\r\n `Savepoint not found: ${name}`,\r\n undefined,\r\n { name, availableSavepoints: Array.from(this.savepoints.keys()) }\r\n );\r\n }\r\n\r\n // Rollback to savepoint on all databases\r\n for (const dbType of this.databases) {\r\n const adapter = this.adapters.get(dbType);\r\n if (!adapter) continue;\r\n\r\n try {\r\n if (dbType === 'postgres' || dbType === 'sqlite') {\r\n await adapter.raw(`ROLLBACK TO SAVEPOINT ${name}`);\r\n }\r\n } catch (err) {\r\n throw createDatabaseError(\r\n DatabaseErrorCode.TRANSACTION_FAILED,\r\n `Failed to rollback to savepoint: ${name}`,\r\n err as Error,\r\n { database: dbType, savepoint: name }\r\n );\r\n }\r\n }\r\n\r\n // Remove this savepoint and all later ones\r\n const savepoints = Array.from(this.savepoints.entries());\r\n const targetIndex = savepoints.findIndex(([n]) => n === name);\r\n for (let i = targetIndex; i < savepoints.length; i++) {\r\n this.savepoints.delete(savepoints[i][0]);\r\n }\r\n\r\n logger.info('Rolled back to savepoint', {\r\n transactionId: this.id,\r\n savepoint: name,\r\n });\r\n }\r\n\r\n /**\r\n * Release a savepoint (no longer needed)\r\n */\r\n async releaseSavepoint(name: string): Promise<void> {\r\n if (!this.savepoints.has(name)) {\r\n throw createDatabaseError(\r\n DatabaseErrorCode.VALIDATION_FAILED,\r\n `Savepoint not found: ${name}`,\r\n undefined,\r\n { name }\r\n );\r\n }\r\n\r\n // Release savepoint on all databases\r\n for (const dbType of this.databases) {\r\n const adapter = this.adapters.get(dbType);\r\n if (!adapter) continue;\r\n\r\n try {\r\n if (dbType === 'postgres' || dbType === 'sqlite') {\r\n await adapter.raw(`RELEASE SAVEPOINT ${name}`);\r\n }\r\n } catch (err) {\r\n logger.warn('Failed to release savepoint (non-fatal)', {\r\n transactionId: this.id,\r\n database: dbType,\r\n savepoint: name,\r\n error: (err as Error).message,\r\n });\r\n }\r\n }\r\n\r\n this.savepoints.delete(name);\r\n\r\n logger.debug('Savepoint released', {\r\n transactionId: this.id,\r\n savepoint: name,\r\n });\r\n }\r\n\r\n /**\r\n * Log 2PC state transition\r\n * @private\r\n */\r\n private log2PCState(\r\n state: TransactionState,\r\n preparedDatabases: string[] = [],\r\n failedDatabases: string[] = [],\r\n error?: string\r\n ): void {\r\n const logEntry: TwoPhaseCommitLog = {\r\n transactionId: this.id,\r\n state,\r\n timestamp: new Date(),\r\n databases: this.databases,\r\n preparedDatabases,\r\n failedDatabases,\r\n error,\r\n };\r\n\r\n this.twoPhaseCommitLog.push(logEntry);\r\n\r\n logger.info('2PC state transition', {\r\n transactionId: this.id,\r\n from: this.state,\r\n to: state,\r\n preparedDatabases,\r\n failedDatabases,\r\n error,\r\n });\r\n\r\n this.state = state;\r\n }\r\n\r\n /**\r\n * Get 2PC transaction log\r\n */\r\n get2PCLog(): TwoPhaseCommitLog[] {\r\n return [...this.twoPhaseCommitLog];\r\n }\r\n\r\n /**\r\n * Get current transaction state\r\n */\r\n getTransactionState(): TransactionState {\r\n return this.state;\r\n }\r\n\r\n /**\r\n * Phase 1: PREPARE - Validate all databases can commit\r\n * @private\r\n */\r\n private async preparePhase(): Promise<boolean> {\r\n this.log2PCState(TransactionState.PREPARING);\r\n\r\n const preparedDbs: string[] = [];\r\n const failedDbs: string[] = [];\r\n let prepareError: string | undefined;\r\n\r\n // Set prepare timeout\r\n const preparePromise = new Promise<boolean>(async (resolve, reject) => {\r\n this.prepareTimeoutHandle = setTimeout(() => {\r\n reject(\r\n createDatabaseError(\r\n DatabaseErrorCode.TIMEOUT,\r\n `Prepare phase timeout after ${this.options.prepareTimeout}ms`,\r\n undefined,\r\n { transactionId: this.id, timeout: this.options.prepareTimeout }\r\n )\r\n );\r\n }, this.options.prepareTimeout);\r\n\r\n try {\r\n // Attempt to prepare all databases\r\n for (const [dbType, context] of Array.from(this.contexts.entries())) {\r\n const adapter = this.adapters.get(dbType);\r\n if (!adapter) {\r\n failedDbs.push(dbType);\r\n continue;\r\n }\r\n\r\n try {\r\n const prepared = await adapter.prepareTransaction(context);\r\n if (prepared) {\r\n preparedDbs.push(dbType);\r\n this.preparedDatabases.add(dbType);\r\n logger.debug('Database prepared successfully', {\r\n transactionId: this.id,\r\n database: dbType,\r\n });\r\n } else {\r\n failedDbs.push(dbType);\r\n logger.warn('Database failed to prepare', {\r\n transactionId: this.id,\r\n database: dbType,\r\n });\r\n }\r\n } catch (err) {\r\n failedDbs.push(dbType);\r\n prepareError = (err as Error).message;\r\n logger.error('Database prepare error', err as Error, {\r\n transactionId: this.id,\r\n database: dbType,\r\n });\r\n }\r\n }\r\n\r\n // Clear prepare timeout\r\n if (this.prepareTimeoutHandle) {\r\n clearTimeout(this.prepareTimeoutHandle);\r\n }\r\n\r\n const allPrepared = failedDbs.length === 0;\r\n if (allPrepared) {\r\n this.log2PCState(TransactionState.PREPARED, preparedDbs);\r\n resolve(true);\r\n } else {\r\n this.log2PCState(\r\n TransactionState.ABORTING,\r\n preparedDbs,\r\n failedDbs,\r\n prepareError || 'One or more databases failed to prepare'\r\n );\r\n resolve(false);\r\n }\r\n } catch (err) {\r\n reject(err);\r\n }\r\n });\r\n\r\n try {\r\n return await preparePromise;\r\n } catch (err) {\r\n // Timeout or other error\r\n this.log2PCState(\r\n TransactionState.ABORTING,\r\n preparedDbs,\r\n failedDbs,\r\n (err as Error).message\r\n );\r\n throw err;\r\n }\r\n }\r\n\r\n /**\r\n * Phase 2: COMMIT - Commit all prepared databases\r\n * @private\r\n */\r\n private async commitPhase(): Promise<void> {\r\n this.log2PCState(TransactionState.COMMITTING, Array.from(this.preparedDatabases));\r\n\r\n const errors: Error[] = [];\r\n const failedDbs: string[] = [];\r\n\r\n // Commit all prepared databases\r\n for (const [dbType, context] of Array.from(this.contexts.entries())) {\r\n const adapter = this.adapters.get(dbType);\r\n if (!adapter) continue;\r\n\r\n try {\r\n await adapter.commitTransaction(context);\r\n logger.debug('Transaction committed on database', {\r\n transactionId: this.id,\r\n database: dbType,\r\n });\r\n } catch (err) {\r\n errors.push(err as Error);\r\n failedDbs.push(dbType);\r\n logger.error('Failed to commit on database', err as Error, {\r\n transactionId: this.id,\r\n database: dbType,\r\n });\r\n }\r\n }\r\n\r\n // If any commits failed after PREPARE succeeded, this is critical\r\n if (errors.length > 0) {\r\n this.log2PCState(\r\n TransactionState.COMMITTED,\r\n Array.from(this.preparedDatabases).filter(db => !failedDbs.includes(db)),\r\n failedDbs,\r\n `Partial commit: ${errors.length} databases failed`\r\n );\r\n\r\n logger.error('CRITICAL: Partial commit occurred after PREPARE', new Error('Partial commit'), {\r\n transactionId: this.id,\r\n failedDatabases: failedDbs,\r\n totalDatabases: this.contexts.size,\r\n preparedDatabases: Array.from(this.preparedDatabases),\r\n });\r\n\r\n throw createDatabaseError(\r\n DatabaseErrorCode.TRANSACTION_FAILED,\r\n 'Transaction partially committed - data may be inconsistent',\r\n undefined,\r\n {\r\n transactionId: this.id,\r\n preparedDatabases: Array.from(this.preparedDatabases),\r\n failedDatabases: failedDbs,\r\n errors: errors.map(e => e.message),\r\n }\r\n );\r\n }\r\n\r\n this.log2PCState(TransactionState.COMMITTED, Array.from(this.preparedDatabases));\r\n }\r\n\r\n /**\r\n * Abort transaction (rollback all prepared databases)\r\n * @private\r\n */\r\n private async abortPhase(): Promise<void> {\r\n this.log2PCState(TransactionState.ABORTING, Array.from(this.preparedDatabases));\r\n\r\n // Rollback all databases (both prepared and not prepared)\r\n for (const [dbType, context] of Array.from(this.contexts.entries())) {\r\n const adapter = this.adapters.get(dbType);\r\n if (!adapter) continue;\r\n\r\n try {\r\n await adapter.rollbackTransaction(context);\r\n logger.debug('Transaction rolled back on database', {\r\n transactionId: this.id,\r\n database: dbType,\r\n });\r\n } catch (err) {\r\n logger.error('Failed to rollback on database (non-fatal)', err as Error, {\r\n transactionId: this.id,\r\n database: dbType,\r\n });\r\n }\r\n }\r\n\r\n this.log2PCState(TransactionState.ABORTED, [], Array.from(this.preparedDatabases));\r\n }\r\n\r\n /**\r\n * Commit the transaction using two-phase commit protocol\r\n */\r\n async commit(): Promise<void> {\r\n if (this.isCommitted) {\r\n logger.warn('Transaction already committed', { transactionId: this.id });\r\n return;\r\n }\r\n\r\n if (this.isRolledBack) {\r\n throw createDatabaseError(\r\n DatabaseErrorCode.TRANSACTION_FAILED,\r\n 'Cannot commit rolled back transaction',\r\n undefined,\r\n { transactionId: this.id }\r\n );\r\n }\r\n\r\n // Clear timeout\r\n if (this.timeoutHandle) {\r\n clearTimeout(this.timeoutHandle);\r\n }\r\n\r\n try {\r\n // Use two-phase commit for multi-database transactions\r\n if (this.options.useTwoPhaseCommit && this.databases.length > 1) {\r\n logger.info('Starting two-phase commit', {\r\n transactionId: this.id,\r\n databases: this.databases,\r\n });\r\n\r\n // Phase 1: PREPARE\r\n const prepared = await this.preparePhase();\r\n\r\n if (!prepared) {\r\n // At least one database failed to prepare, abort all\r\n logger.warn('Prepare phase failed, aborting transaction', {\r\n transactionId: this.id,\r\n preparedDatabases: Array.from(this.preparedDatabases),\r\n });\r\n\r\n await this.abortPhase();\r\n\r\n throw createDatabaseError(\r\n DatabaseErrorCode.TRANSACTION_FAILED,\r\n 'Transaction prepare phase failed - all databases rolled back',\r\n undefined,\r\n {\r\n transactionId: this.id,\r\n preparedDatabases: Array.from(this.preparedDatabases),\r\n log: this.get2PCLog(),\r\n }\r\n );\r\n }\r\n\r\n // Phase 2: COMMIT\r\n await this.commitPhase();\r\n\r\n this.isCommitted = true;\r\n\r\n logger.info('Two-phase commit completed successfully', {\r\n transactionId: this.id,\r\n duration: Date.now() - this.startedAt.getTime(),\r\n databases: this.databases,\r\n log: this.get2PCLog(),\r\n });\r\n } else {\r\n // Single database or 2PC disabled - use legacy commit\r\n logger.info('Using legacy commit (single database or 2PC disabled)', {\r\n transactionId: this.id,\r\n databases: this.databases,\r\n use2PC: this.options.useTwoPhaseCommit,\r\n });\r\n\r\n const errors: Error[] = [];\r\n\r\n // Commit all database transactions\r\n for (const [dbType, context] of Array.from(this.contexts.entries())) {\r\n const adapter = this.adapters.get(dbType);\r\n if (!adapter) continue;\r\n\r\n try {\r\n await adapter.commitTransaction(context);\r\n logger.debug('Transaction committed on database', {\r\n transactionId: this.id,\r\n database: dbType,\r\n });\r\n } catch (err) {\r\n errors.push(err as Error);\r\n logger.error('Failed to commit on database', err as Error, {\r\n transactionId: this.id,\r\n database: dbType,\r\n });\r\n }\r\n }\r\n\r\n // If any commits failed, this is a partial commit - log critical error\r\n if (errors.length > 0) {\r\n logger.error('CRITICAL: Partial commit occurred', new Error('Partial commit'), {\r\n transactionId: this.id,\r\n failedDatabases: errors.length,\r\n totalDatabases: this.contexts.size,\r\n });\r\n\r\n throw createDatabaseError(\r\n DatabaseErrorCode.TRANSACTION_FAILED,\r\n 'Transaction partially committed - data may be inconsistent',\r\n undefined,\r\n {\r\n transactionId: this.id,\r\n errors: errors.map(e => e.message),\r\n }\r\n );\r\n }\r\n\r\n this.isCommitted = true;\r\n\r\n logger.info('Transaction committed successfully', {\r\n transactionId: this.id,\r\n duration: Date.now() - this.startedAt.getTime(),\r\n });\r\n }\r\n\r\n // Release distributed lock if acquired\r\n await this.releaseLock();\r\n } catch (err) {\r\n // On any error, attempt to rollback\r\n try {\r\n if (this.state === TransactionState.PREPARED || this.state === TransactionState.PREPARING) {\r\n await this.abortPhase();\r\n }\r\n } catch (rollbackErr) {\r\n logger.error('Failed to rollback after commit error', rollbackErr as Error, {\r\n transactionId: this.id,\r\n });\r\n }\r\n\r\n throw err;\r\n }\r\n }\r\n\r\n /**\r\n * Rollback the transaction\r\n */\r\n async rollback(): Promise<void> {\r\n if (this.isRolledBack) {\r\n logger.debug('Transaction already rolled back', { transactionId: this.id });\r\n return;\r\n }\r\n\r\n if (this.isCommitted) {\r\n throw createDatabaseError(\r\n DatabaseErrorCode.TRANSACTION_FAILED,\r\n 'Cannot rollback committed transaction',\r\n undefined,\r\n { transactionId: this.id }\r\n );\r\n }\r\n\r\n // Clear timeouts\r\n if (this.timeoutHandle) {\r\n clearTimeout(this.timeoutHandle);\r\n }\r\n if (this.prepareTimeoutHandle) {\r\n clearTimeout(this.prepareTimeoutHandle);\r\n }\r\n\r\n // Update state\r\n this.state = TransactionState.ROLLED_BACK;\r\n\r\n // Rollback all database transactions\r\n for (const [dbType, context] of Array.from(this.contexts.entries())) {\r\n const adapter = this.adapters.get(dbType);\r\n if (!adapter) continue;\r\n\r\n try {\r\n await adapter.rollbackTransaction(context);\r\n logger.debug('Transaction rolled back on database', {\r\n transactionId: this.id,\r\n database: dbType,\r\n });\r\n } catch (err) {\r\n logger.error('Failed to rollback on database (non-fatal)', err as Error, {\r\n transactionId: this.id,\r\n database: dbType,\r\n });\r\n }\r\n }\r\n\r\n this.isRolledBack = true;\r\n\r\n logger.info('Transaction rolled back', {\r\n transactionId: this.id,\r\n duration: Date.now() - this.startedAt.getTime(),\r\n state: this.state,\r\n });\r\n\r\n // Release distributed lock if acquired\r\n await this.releaseLock();\r\n }\r\n\r\n /**\r\n * Set lock releaser callback\r\n * @internal Used by TransactionManager to integrate with distributed lock\r\n */\r\n setLockReleaser(releaser: () => Promise<void>): void {\r\n this.lockReleaser = releaser;\r\n }\r\n\r\n /**\r\n * Release distributed lock\r\n */\r\n private async releaseLock(): Promise<void> {\r\n if (this.lockReleaser) {\r\n try {\r\n await this.lockReleaser();\r\n logger.debug('Distributed lock released', { transactionId: this.id });\r\n } catch (err) {\r\n logger.error('Failed to release distributed lock', err as Error, {\r\n transactionId: this.id,\r\n });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Handle transaction timeout\r\n */\r\n private async handleTimeout(): Promise<void> {\r\n logger.warn('Transaction timeout exceeded', {\r\n transactionId: this.id,\r\n timeout: this.options.timeout,\r\n duration: Date.now() - this.startedAt.getTime(),\r\n });\r\n\r\n // Auto-rollback on timeout\r\n await this.rollback();\r\n }\r\n\r\n /**\r\n * Get transaction status\r\n */\r\n getStatus(): 'active' | 'committed' | 'rolled_back' {\r\n if (this.isCommitted) return 'committed';\r\n if (this.isRolledBack) return 'rolled_back';\r\n return 'active';\r\n }\r\n\r\n /**\r\n * Get transaction duration in milliseconds\r\n */\r\n getDuration(): number {\r\n return Date.now() - this.startedAt.getTime();\r\n }\r\n}\r\n\r\n/**\r\n * Transaction Manager - manages transaction lifecycle and coordination\r\n */\r\nexport class TransactionManager {\r\n private activeTransactions: Map<string, Transaction> = new Map();\r\n private adapters: Map<string, IDatabaseAdapter> = new Map();\r\n\r\n constructor(adapters?: Map<string, IDatabaseAdapter>) {\r\n if (adapters) {\r\n this.adapters = adapters;\r\n }\r\n }\r\n\r\n /**\r\n * Register a database adapter\r\n */\r\n registerAdapter(type: string, adapter: IDatabaseAdapter): void {\r\n this.adapters.set(type, adapter);\r\n logger.debug('Database adapter registered', { type });\r\n }\r\n\r\n /**\r\n * Begin a new cross-database transaction\r\n */\r\n async begin(databases: string[], options?: TransactionOptions): Promise<Transaction> {\r\n if (!databases || databases.length === 0) {\r\n throw createDatabaseError(\r\n DatabaseErrorCode.VALIDATION_FAILED,\r\n 'At least one database must be specified',\r\n undefined,\r\n { databases }\r\n );\r\n }\r\n\r\n // Validate all databases have adapters\r\n for (const dbType of databases) {\r\n if (!this.adapters.has(dbType)) {\r\n throw createDatabaseError(\r\n DatabaseErrorCode.VALIDATION_FAILED,\r\n `No adapter registered for database: ${dbType}`,\r\n undefined,\r\n { database: dbType, registered: Array.from(this.adapters.keys()) }\r\n );\r\n }\r\n }\r\n\r\n const txId = randomUUID();\r\n const transaction = new Transaction(txId, databases, this.adapters, options);\r\n\r\n // Begin the transaction\r\n await transaction.begin();\r\n\r\n this.activeTransactions.set(txId, transaction);\r\n\r\n return transaction;\r\n }\r\n\r\n /**\r\n * Get active transaction by ID\r\n */\r\n getTransaction(id: string): Transaction | undefined {\r\n return this.activeTransactions.get(id);\r\n }\r\n\r\n /**\r\n * Get all active transactions\r\n */\r\n getActiveTransactions(): Transaction[] {\r\n return Array.from(this.activeTransactions.values()).filter(\r\n tx => tx.getStatus() === 'active'\r\n );\r\n }\r\n\r\n /**\r\n * Get active transaction count\r\n */\r\n getActiveCount(): number {\r\n return this.getActiveTransactions().length;\r\n }\r\n\r\n /**\r\n * Cleanup completed transactions from memory\r\n */\r\n cleanupCompleted(): number {\r\n let cleaned = 0;\r\n for (const [id, tx] of Array.from(this.activeTransactions.entries())) {\r\n if (tx.getStatus() !== 'active') {\r\n this.activeTransactions.delete(id);\r\n cleaned++;\r\n }\r\n }\r\n\r\n if (cleaned > 0) {\r\n logger.debug('Cleaned up completed transactions', { count: cleaned });\r\n }\r\n\r\n return cleaned;\r\n }\r\n\r\n /**\r\n * Force rollback of stale transactions (timeout cleanup)\r\n */\r\n async cleanupStaleTransactions(maxAge: number = 60000): Promise<number> {\r\n const now = Date.now();\r\n const stale: Transaction[] = [];\r\n\r\n for (const tx of Array.from(this.activeTransactions.values())) {\r\n if (tx.getStatus() === 'active' && tx.getDuration() > maxAge) {\r\n stale.push(tx);\r\n }\r\n }\r\n\r\n for (const tx of stale) {\r\n try {\r\n await tx.rollback();\r\n logger.warn('Rolled back stale transaction', {\r\n transactionId: tx.id,\r\n age: tx.getDuration(),\r\n });\r\n } catch (err) {\r\n logger.error('Failed to rollback stale transaction', err as Error, {\r\n transactionId: tx.id,\r\n });\r\n }\r\n }\r\n\r\n return stale.length;\r\n }\r\n\r\n /**\r\n * Legacy: Execute operations across multiple databases atomically\r\n * @deprecated Use begin() for new code\r\n */\r\n async executeTransaction<T = any>(\r\n adapters: IDatabaseAdapter[],\r\n operations: Array<(adapter: IDatabaseAdapter) => Promise<T>>\r\n ): Promise<T[]> {\r\n if (adapters.length !== operations.length) {\r\n throw createDatabaseError(\r\n DatabaseErrorCode.VALIDATION_FAILED,\r\n `Adapters and operations arrays must be the same length`,\r\n undefined,\r\n { adaptersLength: adapters.length, operationsLength: operations.length }\r\n );\r\n }\r\n\r\n const databases = adapters.map(a => a.getType());\r\n const tx = await this.begin(databases);\r\n\r\n try {\r\n const results: T[] = [];\r\n\r\n for (let i = 0; i < operations.length; i++) {\r\n const result = await tx.execute(databases[i], operations[i]);\r\n results.push(result);\r\n }\r\n\r\n await tx.commit();\r\n return results;\r\n } catch (err) {\r\n await tx.rollback();\r\n throw err;\r\n }\r\n }\r\n}\r\n"],"names":["randomUUID","DatabaseErrorCode","createDatabaseError","createLogger","generateCorrelationId","logger","IsolationLevel","TransactionState","Transaction","id","startedAt","databases","correlationId","options","contexts","Map","adapters","savepoints","state","isCommitted","isRolledBack","timeoutHandle","prepareTimeoutHandle","lockReleaser","preparedDatabases","Set","twoPhaseCommitLog","Date","timeout","isolationLevel","acquireLock","lockTimeout","prepareTimeout","useTwoPhaseCommit","length","info","transactionId","begin","TRANSACTION_FAILED","undefined","status","setTimeout","handleTimeout","dbType","adapter","get","VALIDATION_FAILED","database","context","beginTransaction","set","debug","contextId","err","rollback","execute","operation","transactionDatabases","result","error","savepoint","name","test","has","raw","createdAt","join","rollbackToSavepoint","availableSavepoints","Array","from","keys","entries","targetIndex","findIndex","n","i","delete","releaseSavepoint","warn","message","log2PCState","failedDatabases","logEntry","timestamp","push","to","get2PCLog","getTransactionState","preparePhase","preparedDbs","failedDbs","prepareError","preparePromise","Promise","resolve","reject","TIMEOUT","prepared","prepareTransaction","add","clearTimeout","allPrepared","commitPhase","errors","commitTransaction","filter","db","includes","Error","totalDatabases","size","map","e","abortPhase","rollbackTransaction","commit","log","duration","now","getTime","use2PC","releaseLock","rollbackErr","setLockReleaser","releaser","getStatus","getDuration","TransactionManager","activeTransactions","registerAdapter","type","registered","txId","transaction","getTransaction","getActiveTransactions","values","tx","getActiveCount","cleanupCompleted","cleaned","count","cleanupStaleTransactions","maxAge","stale","age","executeTransaction","operations","adaptersLength","operationsLength","a","getType","results"],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Database Service Type Definitions
3
+ *
4
+ * Provides type-safe interfaces for database operations across Redis, SQLite, and PostgreSQL.
5
+ * Part of Task 0.4: Database Query Abstraction Layer (MVP)
6
+ */ /**
7
+ * Database connection configuration
8
+ */ /**
9
+ * Database error codes
10
+ */ export var DatabaseErrorCode = /*#__PURE__*/ function(DatabaseErrorCode) {
11
+ DatabaseErrorCode["CONNECTION_FAILED"] = "DB_CONNECTION_FAILED";
12
+ DatabaseErrorCode["QUERY_FAILED"] = "DB_QUERY_FAILED";
13
+ DatabaseErrorCode["TRANSACTION_FAILED"] = "DB_TRANSACTION_FAILED";
14
+ DatabaseErrorCode["VALIDATION_FAILED"] = "DB_VALIDATION_FAILED";
15
+ DatabaseErrorCode["NOT_FOUND"] = "DB_NOT_FOUND";
16
+ DatabaseErrorCode["DUPLICATE_KEY"] = "DB_DUPLICATE_KEY";
17
+ DatabaseErrorCode["TIMEOUT"] = "DB_TIMEOUT";
18
+ DatabaseErrorCode["CONSTRAINT_VIOLATION"] = "DB_CONSTRAINT_VIOLATION";
19
+ DatabaseErrorCode["UNKNOWN_ERROR"] = "DB_UNKNOWN_ERROR";
20
+ return DatabaseErrorCode;
21
+ }({});
22
+
23
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/database-service/types.ts"],"sourcesContent":["/**\r\n * Database Service Type Definitions\r\n *\r\n * Provides type-safe interfaces for database operations across Redis, SQLite, and PostgreSQL.\r\n * Part of Task 0.4: Database Query Abstraction Layer (MVP)\r\n */\r\n\r\n/**\r\n * Database connection configuration\r\n */\r\nexport interface DatabaseConfig {\r\n type: 'redis' | 'sqlite' | 'postgres';\r\n host?: string;\r\n port?: number;\r\n database?: string;\r\n username?: string;\r\n password?: string;\r\n connectionString?: string;\r\n poolSize?: number;\r\n timeout?: number;\r\n}\r\n\r\n/**\r\n * Query filter for read operations\r\n */\r\nexport interface QueryFilter<T = any> {\r\n field: keyof T;\r\n operator: 'eq' | 'ne' | 'gt' | 'gte' | 'lt' | 'lte' | 'in' | 'like' | 'between';\r\n value: any;\r\n}\r\n\r\n/**\r\n * Query options for list operations\r\n */\r\nexport interface QueryOptions<T = any> {\r\n filters?: QueryFilter<T>[];\r\n limit?: number;\r\n offset?: number;\r\n orderBy?: keyof T;\r\n order?: 'asc' | 'desc';\r\n}\r\n\r\n/**\r\n * Transaction context\r\n */\r\nexport interface TransactionContext {\r\n id: string;\r\n databases: Array<'redis' | 'sqlite' | 'postgres'>;\r\n startTime: Date;\r\n status: 'pending' | 'preparing' | 'prepared' | 'committing' | 'committed' | 'aborting' | 'aborted' | 'rolled_back';\r\n connection?: any; // Optional connection reference for pool management\r\n preparedAt?: Date; // Timestamp when transaction was prepared (2PC)\r\n}\r\n\r\n/**\r\n * Database operation result\r\n */\r\nexport interface OperationResult<T = any> {\r\n success: boolean;\r\n data?: T;\r\n error?: DatabaseError;\r\n rowsAffected?: number;\r\n insertId?: string | number;\r\n}\r\n\r\n/**\r\n * Database error with context\r\n */\r\nexport interface DatabaseError {\r\n code: DatabaseErrorCode | string; // DatabaseErrorCode for known errors, string for custom errors\r\n message: string;\r\n originalError?: Error;\r\n query?: string;\r\n context?: Record<string, any>;\r\n}\r\n\r\n/**\r\n * Database error codes\r\n */\r\nexport enum DatabaseErrorCode {\r\n CONNECTION_FAILED = 'DB_CONNECTION_FAILED',\r\n QUERY_FAILED = 'DB_QUERY_FAILED',\r\n TRANSACTION_FAILED = 'DB_TRANSACTION_FAILED',\r\n VALIDATION_FAILED = 'DB_VALIDATION_FAILED',\r\n NOT_FOUND = 'DB_NOT_FOUND',\r\n DUPLICATE_KEY = 'DB_DUPLICATE_KEY',\r\n TIMEOUT = 'DB_TIMEOUT',\r\n CONSTRAINT_VIOLATION = 'DB_CONSTRAINT_VIOLATION',\r\n UNKNOWN_ERROR = 'DB_UNKNOWN_ERROR',\r\n}\r\n\r\n/**\r\n * Correlation key for cross-database lookups\r\n */\r\nexport interface CorrelationKey {\r\n type: 'task' | 'agent' | 'skill' | 'execution';\r\n id: string;\r\n entity?: string;\r\n subtype?: string;\r\n}\r\n\r\n/**\r\n * Cross-database query result\r\n */\r\nexport interface CrossDatabaseResult<T = any> {\r\n correlationKey: string;\r\n redis?: T;\r\n sqlite?: T;\r\n postgres?: T;\r\n timestamp: Date;\r\n}\r\n\r\n/**\r\n * Database adapter interface\r\n *\r\n * All database implementations must implement this interface\r\n */\r\nexport interface IDatabaseAdapter {\r\n /**\r\n * Get database type\r\n */\r\n getType(): 'redis' | 'sqlite' | 'postgres';\r\n\r\n /**\r\n * Connect to database\r\n */\r\n connect(): Promise<void>;\r\n\r\n /**\r\n * Disconnect from database\r\n */\r\n disconnect(): Promise<void>;\r\n\r\n /**\r\n * Check if connected\r\n */\r\n isConnected(): boolean;\r\n\r\n /**\r\n * Get single record by key/id\r\n */\r\n get<T = any>(key: string): Promise<T | null>;\r\n\r\n /**\r\n * List records with optional filtering\r\n */\r\n list<T = any>(table: string, options?: QueryOptions<T>): Promise<T[]>;\r\n\r\n /**\r\n * Query records with custom filter\r\n */\r\n query<T = any>(table: string, filters: QueryFilter<T>[]): Promise<T[]>;\r\n\r\n /**\r\n * Insert single record\r\n */\r\n insert<T = any>(table: string, data: T): Promise<OperationResult<T>>;\r\n\r\n /**\r\n * Insert multiple records atomically\r\n */\r\n insertMany<T = any>(table: string, data: T[]): Promise<OperationResult<T[]>>;\r\n\r\n /**\r\n * Update record by key/id\r\n */\r\n update<T = any>(table: string, key: string, data: Partial<T>): Promise<OperationResult<T>>;\r\n\r\n /**\r\n * Delete record by key/id\r\n */\r\n delete(table: string, key: string): Promise<OperationResult<void>>;\r\n\r\n /**\r\n * Execute raw query (use with caution)\r\n */\r\n raw<T = any>(query: string, params?: any[]): Promise<T>;\r\n\r\n /**\r\n * Begin transaction\r\n */\r\n beginTransaction(): Promise<TransactionContext>;\r\n\r\n /**\r\n * Prepare transaction for two-phase commit (Phase 1)\r\n * Validates that the transaction can commit and locks resources\r\n * @returns true if prepared successfully, false otherwise\r\n */\r\n prepareTransaction(context: TransactionContext): Promise<boolean>;\r\n\r\n /**\r\n * Commit transaction\r\n */\r\n commitTransaction(context: TransactionContext): Promise<void>;\r\n\r\n /**\r\n * Rollback transaction\r\n */\r\n rollbackTransaction(context: TransactionContext): Promise<void>;\r\n}\r\n\r\n/**\r\n * Database service interface\r\n *\r\n * Provides unified access to all database adapters\r\n */\r\nexport interface IDatabaseService {\r\n /**\r\n * Get adapter for specific database\r\n */\r\n getAdapter(type: 'redis' | 'sqlite' | 'postgres'): IDatabaseAdapter;\r\n\r\n /**\r\n * Get record by correlation key across all databases\r\n */\r\n getByCorrelationKey<T = any>(key: CorrelationKey): Promise<CrossDatabaseResult<T>>;\r\n\r\n /**\r\n * Execute cross-database transaction\r\n */\r\n executeTransaction<T = any>(\r\n operations: Array<{\r\n database: 'redis' | 'sqlite' | 'postgres';\r\n operation: (adapter: IDatabaseAdapter) => Promise<T>;\r\n }>\r\n ): Promise<T[]>;\r\n\r\n /**\r\n * Build correlation key\r\n */\r\n buildCorrelationKey(key: CorrelationKey): string;\r\n\r\n /**\r\n * Parse correlation key\r\n */\r\n parseCorrelationKey(key: string): CorrelationKey | null;\r\n}\r\n\r\n/**\r\n * Connection pool interface\r\n */\r\nexport interface IConnectionPool {\r\n /**\r\n * Acquire connection from pool\r\n */\r\n acquire(): Promise<any>;\r\n\r\n /**\r\n * Release connection back to pool\r\n */\r\n release(connection: any): void;\r\n\r\n /**\r\n * Get pool statistics\r\n */\r\n getStats(): {\r\n total: number;\r\n available: number;\r\n waiting: number;\r\n };\r\n\r\n /**\r\n * Close all connections\r\n */\r\n close(): Promise<void>;\r\n}\r\n"],"names":["DatabaseErrorCode"],"mappings":"AAAA;;;;;CAKC,GAED;;CAEC,GAmED;;CAEC,GACD,OAAO,IAAA,AAAKA,2CAAAA;;;;;;;;;;WAAAA;MAUX"}
@@ -0,0 +1,292 @@
1
+ /**
2
+ * Deadlock Resolver
3
+ *
4
+ * Detects and resolves deadlocks in cross-database transactions using:
5
+ * - Timeout-based deadlock detection
6
+ * - Automatic resolution (abort younger transaction)
7
+ * - Exponential backoff retry logic
8
+ * - Deadlock logging and metrics
9
+ *
10
+ * Part of Task 3.1: Cross-Database Transaction Framework
11
+ */ import { LockAcquisitionError } from './distributed-lock.js';
12
+ import { withRetry } from './retry.js';
13
+ import { createLogger } from './logging.js';
14
+ import { generateCorrelationId } from './correlation.js';
15
+ const logger = createLogger('deadlock-resolver');
16
+ /**
17
+ * Deadlock Resolver - handles detection and automatic resolution
18
+ */ export class DeadlockResolver {
19
+ txManager;
20
+ lockManager;
21
+ stats = {
22
+ totalDetected: 0,
23
+ totalResolved: 0,
24
+ totalAborted: 0,
25
+ avgResolutionTimeMs: 0
26
+ };
27
+ constructor(txManager, lockManager){
28
+ this.txManager = txManager;
29
+ this.lockManager = lockManager;
30
+ logger.info('Deadlock resolver initialized');
31
+ }
32
+ /**
33
+ * Detect potential deadlock for a transaction
34
+ *
35
+ * Uses timeout-based detection: if transaction is waiting for lock beyond threshold,
36
+ * consider it a deadlock candidate.
37
+ */ async detectDeadlock(transaction, waitTimeMs = 5000) {
38
+ const duration = transaction.getDuration();
39
+ if (duration < waitTimeMs) {
40
+ return false; // Not waiting long enough
41
+ }
42
+ logger.debug('Potential deadlock detected (timeout)', {
43
+ transactionId: transaction.id,
44
+ duration,
45
+ threshold: waitTimeMs
46
+ });
47
+ this.stats.totalDetected++;
48
+ this.stats.lastDeadlock = new Date();
49
+ return true;
50
+ }
51
+ /**
52
+ * Resolve deadlock by aborting younger transaction
53
+ *
54
+ * Strategy: In a deadlock involving multiple transactions, abort the youngest one
55
+ * (most recently started) to minimize wasted work.
56
+ */ async resolve(transactions) {
57
+ if (transactions.length === 0) {
58
+ throw new Error('Cannot resolve deadlock with no transactions');
59
+ }
60
+ if (transactions.length === 1) {
61
+ // Single transaction deadlock (waiting on itself) - just abort it
62
+ await this.abortTransaction(transactions[0]);
63
+ return {
64
+ resolved: true,
65
+ abortedTransaction: transactions[0],
66
+ survivingTransactions: [],
67
+ method: 'youngest-abort',
68
+ resolvedAt: new Date()
69
+ };
70
+ }
71
+ logger.info('Resolving deadlock', {
72
+ transactionCount: transactions.length,
73
+ transactionIds: transactions.map((t)=>t.id)
74
+ });
75
+ const startTime = Date.now();
76
+ // Sort by start time (oldest first)
77
+ const sorted = transactions.sort((a, b)=>a.startedAt.getTime() - b.startedAt.getTime());
78
+ // Abort youngest transaction (last in sorted array)
79
+ const youngest = sorted[sorted.length - 1];
80
+ const survivors = sorted.slice(0, -1);
81
+ await this.abortTransaction(youngest);
82
+ const resolutionTime = Date.now() - startTime;
83
+ // Update statistics
84
+ this.stats.totalResolved++;
85
+ this.stats.totalAborted++;
86
+ this.stats.avgResolutionTimeMs = (this.stats.avgResolutionTimeMs * (this.stats.totalResolved - 1) + resolutionTime) / this.stats.totalResolved;
87
+ logger.info('Deadlock resolved', {
88
+ abortedTransactionId: youngest.id,
89
+ survivingTransactions: survivors.map((t)=>t.id),
90
+ resolutionTimeMs: resolutionTime
91
+ });
92
+ return {
93
+ resolved: true,
94
+ abortedTransaction: youngest,
95
+ survivingTransactions: survivors,
96
+ method: 'youngest-abort',
97
+ resolvedAt: new Date()
98
+ };
99
+ }
100
+ /**
101
+ * Execute operation with automatic deadlock retry
102
+ *
103
+ * If operation fails due to deadlock, automatically retry with exponential backoff.
104
+ */ async executeWithRetry(operation, options = {}) {
105
+ const opts = {
106
+ maxAttempts: options.maxAttempts ?? 3,
107
+ baseDelayMs: options.baseDelayMs ?? 100,
108
+ maxDelayMs: options.maxDelayMs ?? 5000,
109
+ backoffFactor: options.backoffFactor ?? 2,
110
+ exponential: options.exponential ?? true,
111
+ jitter: options.jitter ?? true
112
+ };
113
+ const correlationId = generateCorrelationId();
114
+ logger.debug('Executing operation with deadlock retry', {
115
+ maxAttempts: opts.maxAttempts,
116
+ baseDelayMs: opts.baseDelayMs,
117
+ correlationId
118
+ });
119
+ return await withRetry(operation, {
120
+ maxAttempts: opts.maxAttempts,
121
+ baseDelayMs: opts.baseDelayMs,
122
+ maxDelayMs: opts.maxDelayMs,
123
+ exponential: opts.exponential,
124
+ jitter: opts.jitter,
125
+ shouldRetry: (error)=>{
126
+ // Retry on deadlock or lock acquisition errors
127
+ return error instanceof DeadlockError || error instanceof LockAcquisitionError || error.message.includes('deadlock') || error.message.includes('lock');
128
+ },
129
+ onRetry: (attempt, error, delayMs)=>{
130
+ logger.warn('Retrying after deadlock', {
131
+ attempt,
132
+ maxAttempts: opts.maxAttempts,
133
+ error: error.message,
134
+ delayMs,
135
+ correlationId
136
+ });
137
+ }
138
+ });
139
+ }
140
+ /**
141
+ * Execute transaction with automatic deadlock handling
142
+ *
143
+ * Wraps transaction execution with deadlock detection and automatic retry.
144
+ */ async executeTransaction(databases, operations, options = {}) {
145
+ return await this.executeWithRetry(async ()=>{
146
+ const tx = await this.txManager.begin(databases);
147
+ try {
148
+ const results = [];
149
+ for (const operation of operations){
150
+ const result = await operation(tx);
151
+ results.push(result);
152
+ }
153
+ await tx.commit();
154
+ return results;
155
+ } catch (err) {
156
+ await tx.rollback();
157
+ // Check if this is a deadlock
158
+ if (err instanceof LockAcquisitionError) {
159
+ throw new DeadlockError(`Deadlock detected: ${err.message}`, [
160
+ tx
161
+ ], []);
162
+ }
163
+ throw err;
164
+ }
165
+ }, options);
166
+ }
167
+ /**
168
+ * Get deadlock statistics
169
+ */ getStats() {
170
+ return {
171
+ ...this.stats
172
+ };
173
+ }
174
+ /**
175
+ * Reset statistics
176
+ */ resetStats() {
177
+ this.stats = {
178
+ totalDetected: 0,
179
+ totalResolved: 0,
180
+ totalAborted: 0,
181
+ avgResolutionTimeMs: 0
182
+ };
183
+ logger.info('Deadlock statistics reset');
184
+ }
185
+ /**
186
+ * Abort a transaction (rollback and cleanup)
187
+ */ async abortTransaction(transaction) {
188
+ logger.info('Aborting transaction', {
189
+ transactionId: transaction.id,
190
+ age: transaction.getDuration()
191
+ });
192
+ try {
193
+ await transaction.rollback();
194
+ logger.debug('Transaction aborted successfully', {
195
+ transactionId: transaction.id
196
+ });
197
+ } catch (err) {
198
+ logger.error('Error aborting transaction', err, {
199
+ transactionId: transaction.id
200
+ });
201
+ throw err;
202
+ }
203
+ }
204
+ /**
205
+ * Monitor active transactions for potential deadlocks
206
+ *
207
+ * Should be called periodically (e.g., every second) to detect long-running
208
+ * transactions that may be in deadlock.
209
+ */ async monitorDeadlocks(thresholdMs = 10000) {
210
+ const activeTransactions = this.txManager.getActiveTransactions();
211
+ const deadlocks = [];
212
+ for (const tx of activeTransactions){
213
+ const isDeadlocked = await this.detectDeadlock(tx, thresholdMs);
214
+ if (isDeadlocked) {
215
+ deadlocks.push({
216
+ detected: true,
217
+ transactions: [
218
+ tx
219
+ ],
220
+ resources: [],
221
+ method: 'timeout',
222
+ detectedAt: new Date()
223
+ });
224
+ }
225
+ }
226
+ if (deadlocks.length > 0) {
227
+ logger.warn('Deadlocks detected during monitoring', {
228
+ count: deadlocks.length,
229
+ transactionIds: deadlocks.flatMap((d)=>d.transactions.map((t)=>t.id))
230
+ });
231
+ }
232
+ return deadlocks;
233
+ }
234
+ /**
235
+ * Auto-resolve detected deadlocks
236
+ *
237
+ * Automatically resolve deadlocks found during monitoring.
238
+ */ async autoResolveDeadlocks(thresholdMs = 10000) {
239
+ const deadlocks = await this.monitorDeadlocks(thresholdMs);
240
+ const resolutions = [];
241
+ for (const deadlock of deadlocks){
242
+ try {
243
+ const resolution = await this.resolve(deadlock.transactions);
244
+ resolutions.push(resolution);
245
+ } catch (err) {
246
+ logger.error('Failed to auto-resolve deadlock', err, {
247
+ transactionIds: deadlock.transactions.map((t)=>t.id)
248
+ });
249
+ }
250
+ }
251
+ return resolutions;
252
+ }
253
+ }
254
+ /**
255
+ * Deadlock error
256
+ */ export class DeadlockError extends Error {
257
+ transactions;
258
+ resources;
259
+ constructor(message, transactions, resources){
260
+ super(message), this.transactions = transactions, this.resources = resources;
261
+ this.name = 'DeadlockError';
262
+ }
263
+ }
264
+ /**
265
+ * Utility: Create deadlock resolver with default configuration
266
+ */ export function createDeadlockResolver(txManager, lockManager) {
267
+ return new DeadlockResolver(txManager, lockManager);
268
+ }
269
+ /**
270
+ * Utility: Start automatic deadlock monitoring
271
+ *
272
+ * Returns cleanup function to stop monitoring.
273
+ */ export function startDeadlockMonitoring(resolver, intervalMs = 1000, thresholdMs = 10000) {
274
+ logger.info('Starting automatic deadlock monitoring', {
275
+ intervalMs,
276
+ thresholdMs
277
+ });
278
+ const intervalHandle = setInterval(async ()=>{
279
+ try {
280
+ await resolver.autoResolveDeadlocks(thresholdMs);
281
+ } catch (err) {
282
+ logger.error('Error during automatic deadlock resolution', err);
283
+ }
284
+ }, intervalMs);
285
+ // Return cleanup function
286
+ return ()=>{
287
+ clearInterval(intervalHandle);
288
+ logger.info('Stopped automatic deadlock monitoring');
289
+ };
290
+ }
291
+
292
+ //# sourceMappingURL=deadlock-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/deadlock-resolver.ts"],"sourcesContent":["/**\r\n * Deadlock Resolver\r\n *\r\n * Detects and resolves deadlocks in cross-database transactions using:\r\n * - Timeout-based deadlock detection\r\n * - Automatic resolution (abort younger transaction)\r\n * - Exponential backoff retry logic\r\n * - Deadlock logging and metrics\r\n *\r\n * Part of Task 3.1: Cross-Database Transaction Framework\r\n */\r\n\r\nimport { Transaction, TransactionManager } from './database-service/transaction-manager.js';\r\nimport { DistributedLock, LockResource, Lock, LockAcquisitionError } from './distributed-lock.js';\r\nimport { withRetry, RetryOptions } from './retry.js';\r\nimport { createLogger } from './logging.js';\r\nimport { generateCorrelationId } from './correlation.js';\r\n\r\nconst logger = createLogger('deadlock-resolver');\r\n\r\n/**\r\n * Deadlock retry options\r\n */\r\nexport interface DeadlockRetryOptions extends RetryOptions {\r\n /** Maximum retry attempts (default: 3) */\r\n maxAttempts?: number;\r\n /** Base delay in milliseconds (default: 100) */\r\n baseDelayMs?: number;\r\n /** Maximum delay in milliseconds (default: 5000) */\r\n maxDelayMs?: number;\r\n /** Backoff factor for exponential backoff (default: 2) */\r\n backoffFactor?: number;\r\n}\r\n\r\n/**\r\n * Deadlock detection result\r\n */\r\nexport interface DeadlockDetectionResult {\r\n /** Is deadlock detected */\r\n detected: boolean;\r\n /** Transactions involved in deadlock */\r\n transactions: Transaction[];\r\n /** Lock resources involved */\r\n resources: LockResource[];\r\n /** Detection method */\r\n method: 'timeout' | 'cycle-detection' | 'manual';\r\n /** Detection timestamp */\r\n detectedAt: Date;\r\n}\r\n\r\n/**\r\n * Deadlock resolution result\r\n */\r\nexport interface DeadlockResolutionResult {\r\n /** Was resolution successful */\r\n resolved: boolean;\r\n /** Transaction that was aborted */\r\n abortedTransaction?: Transaction;\r\n /** Surviving transactions */\r\n survivingTransactions: Transaction[];\r\n /** Resolution method */\r\n method: 'youngest-abort' | 'random-abort' | 'manual';\r\n /** Resolution timestamp */\r\n resolvedAt: Date;\r\n}\r\n\r\n/**\r\n * Deadlock statistics\r\n */\r\nexport interface DeadlockStats {\r\n /** Total deadlocks detected */\r\n totalDetected: number;\r\n /** Total deadlocks resolved */\r\n totalResolved: number;\r\n /** Total transactions aborted due to deadlock */\r\n totalAborted: number;\r\n /** Average resolution time in milliseconds */\r\n avgResolutionTimeMs: number;\r\n /** Last deadlock timestamp */\r\n lastDeadlock?: Date;\r\n}\r\n\r\n/**\r\n * Deadlock Resolver - handles detection and automatic resolution\r\n */\r\nexport class DeadlockResolver {\r\n private txManager: TransactionManager;\r\n private lockManager: DistributedLock;\r\n private stats: DeadlockStats = {\r\n totalDetected: 0,\r\n totalResolved: 0,\r\n totalAborted: 0,\r\n avgResolutionTimeMs: 0,\r\n };\r\n\r\n constructor(txManager: TransactionManager, lockManager: DistributedLock) {\r\n this.txManager = txManager;\r\n this.lockManager = lockManager;\r\n\r\n logger.info('Deadlock resolver initialized');\r\n }\r\n\r\n /**\r\n * Detect potential deadlock for a transaction\r\n *\r\n * Uses timeout-based detection: if transaction is waiting for lock beyond threshold,\r\n * consider it a deadlock candidate.\r\n */\r\n async detectDeadlock(transaction: Transaction, waitTimeMs: number = 5000): Promise<boolean> {\r\n const duration = transaction.getDuration();\r\n\r\n if (duration < waitTimeMs) {\r\n return false; // Not waiting long enough\r\n }\r\n\r\n logger.debug('Potential deadlock detected (timeout)', {\r\n transactionId: transaction.id,\r\n duration,\r\n threshold: waitTimeMs,\r\n });\r\n\r\n this.stats.totalDetected++;\r\n this.stats.lastDeadlock = new Date();\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Resolve deadlock by aborting younger transaction\r\n *\r\n * Strategy: In a deadlock involving multiple transactions, abort the youngest one\r\n * (most recently started) to minimize wasted work.\r\n */\r\n async resolve(transactions: Transaction[]): Promise<DeadlockResolutionResult> {\r\n if (transactions.length === 0) {\r\n throw new Error('Cannot resolve deadlock with no transactions');\r\n }\r\n\r\n if (transactions.length === 1) {\r\n // Single transaction deadlock (waiting on itself) - just abort it\r\n await this.abortTransaction(transactions[0]);\r\n\r\n return {\r\n resolved: true,\r\n abortedTransaction: transactions[0],\r\n survivingTransactions: [],\r\n method: 'youngest-abort',\r\n resolvedAt: new Date(),\r\n };\r\n }\r\n\r\n logger.info('Resolving deadlock', {\r\n transactionCount: transactions.length,\r\n transactionIds: transactions.map(t => t.id),\r\n });\r\n\r\n const startTime = Date.now();\r\n\r\n // Sort by start time (oldest first)\r\n const sorted = transactions.sort((a, b) =>\r\n a.startedAt.getTime() - b.startedAt.getTime()\r\n );\r\n\r\n // Abort youngest transaction (last in sorted array)\r\n const youngest = sorted[sorted.length - 1];\r\n const survivors = sorted.slice(0, -1);\r\n\r\n await this.abortTransaction(youngest);\r\n\r\n const resolutionTime = Date.now() - startTime;\r\n\r\n // Update statistics\r\n this.stats.totalResolved++;\r\n this.stats.totalAborted++;\r\n this.stats.avgResolutionTimeMs =\r\n (this.stats.avgResolutionTimeMs * (this.stats.totalResolved - 1) + resolutionTime)\r\n / this.stats.totalResolved;\r\n\r\n logger.info('Deadlock resolved', {\r\n abortedTransactionId: youngest.id,\r\n survivingTransactions: survivors.map(t => t.id),\r\n resolutionTimeMs: resolutionTime,\r\n });\r\n\r\n return {\r\n resolved: true,\r\n abortedTransaction: youngest,\r\n survivingTransactions: survivors,\r\n method: 'youngest-abort',\r\n resolvedAt: new Date(),\r\n };\r\n }\r\n\r\n /**\r\n * Execute operation with automatic deadlock retry\r\n *\r\n * If operation fails due to deadlock, automatically retry with exponential backoff.\r\n */\r\n async executeWithRetry<T>(\r\n operation: () => Promise<T>,\r\n options: DeadlockRetryOptions = {}\r\n ): Promise<T> {\r\n const opts = {\r\n maxAttempts: options.maxAttempts ?? 3,\r\n baseDelayMs: options.baseDelayMs ?? 100,\r\n maxDelayMs: options.maxDelayMs ?? 5000,\r\n backoffFactor: options.backoffFactor ?? 2,\r\n exponential: options.exponential ?? true,\r\n jitter: options.jitter ?? true,\r\n };\r\n\r\n const correlationId = generateCorrelationId();\r\n\r\n logger.debug('Executing operation with deadlock retry', {\r\n maxAttempts: opts.maxAttempts,\r\n baseDelayMs: opts.baseDelayMs,\r\n correlationId,\r\n });\r\n\r\n return await withRetry(\r\n operation,\r\n {\r\n maxAttempts: opts.maxAttempts,\r\n baseDelayMs: opts.baseDelayMs,\r\n maxDelayMs: opts.maxDelayMs,\r\n exponential: opts.exponential,\r\n jitter: opts.jitter,\r\n shouldRetry: (error: Error) => {\r\n // Retry on deadlock or lock acquisition errors\r\n return (\r\n error instanceof DeadlockError ||\r\n error instanceof LockAcquisitionError ||\r\n error.message.includes('deadlock') ||\r\n error.message.includes('lock')\r\n );\r\n },\r\n onRetry: (attempt: number, error: Error, delayMs: number) => {\r\n logger.warn('Retrying after deadlock', {\r\n attempt,\r\n maxAttempts: opts.maxAttempts,\r\n error: error.message,\r\n delayMs,\r\n correlationId,\r\n });\r\n },\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Execute transaction with automatic deadlock handling\r\n *\r\n * Wraps transaction execution with deadlock detection and automatic retry.\r\n */\r\n async executeTransaction<T>(\r\n databases: string[],\r\n operations: Array<(tx: Transaction) => Promise<T>>,\r\n options: DeadlockRetryOptions = {}\r\n ): Promise<T[]> {\r\n return await this.executeWithRetry(async () => {\r\n const tx = await this.txManager.begin(databases);\r\n\r\n try {\r\n const results: T[] = [];\r\n\r\n for (const operation of operations) {\r\n const result = await operation(tx);\r\n results.push(result);\r\n }\r\n\r\n await tx.commit();\r\n return results;\r\n } catch (err) {\r\n await tx.rollback();\r\n\r\n // Check if this is a deadlock\r\n if (err instanceof LockAcquisitionError) {\r\n throw new DeadlockError(\r\n `Deadlock detected: ${err.message}`,\r\n [tx],\r\n []\r\n );\r\n }\r\n\r\n throw err;\r\n }\r\n }, options);\r\n }\r\n\r\n /**\r\n * Get deadlock statistics\r\n */\r\n getStats(): DeadlockStats {\r\n return { ...this.stats };\r\n }\r\n\r\n /**\r\n * Reset statistics\r\n */\r\n resetStats(): void {\r\n this.stats = {\r\n totalDetected: 0,\r\n totalResolved: 0,\r\n totalAborted: 0,\r\n avgResolutionTimeMs: 0,\r\n };\r\n\r\n logger.info('Deadlock statistics reset');\r\n }\r\n\r\n /**\r\n * Abort a transaction (rollback and cleanup)\r\n */\r\n private async abortTransaction(transaction: Transaction): Promise<void> {\r\n logger.info('Aborting transaction', {\r\n transactionId: transaction.id,\r\n age: transaction.getDuration(),\r\n });\r\n\r\n try {\r\n await transaction.rollback();\r\n\r\n logger.debug('Transaction aborted successfully', {\r\n transactionId: transaction.id,\r\n });\r\n } catch (err) {\r\n logger.error('Error aborting transaction', err as Error, {\r\n transactionId: transaction.id,\r\n });\r\n throw err;\r\n }\r\n }\r\n\r\n /**\r\n * Monitor active transactions for potential deadlocks\r\n *\r\n * Should be called periodically (e.g., every second) to detect long-running\r\n * transactions that may be in deadlock.\r\n */\r\n async monitorDeadlocks(thresholdMs: number = 10000): Promise<DeadlockDetectionResult[]> {\r\n const activeTransactions = this.txManager.getActiveTransactions();\r\n const deadlocks: DeadlockDetectionResult[] = [];\r\n\r\n for (const tx of activeTransactions) {\r\n const isDeadlocked = await this.detectDeadlock(tx, thresholdMs);\r\n\r\n if (isDeadlocked) {\r\n deadlocks.push({\r\n detected: true,\r\n transactions: [tx],\r\n resources: [], // TODO: Track lock resources\r\n method: 'timeout',\r\n detectedAt: new Date(),\r\n });\r\n }\r\n }\r\n\r\n if (deadlocks.length > 0) {\r\n logger.warn('Deadlocks detected during monitoring', {\r\n count: deadlocks.length,\r\n transactionIds: deadlocks.flatMap(d => d.transactions.map(t => t.id)),\r\n });\r\n }\r\n\r\n return deadlocks;\r\n }\r\n\r\n /**\r\n * Auto-resolve detected deadlocks\r\n *\r\n * Automatically resolve deadlocks found during monitoring.\r\n */\r\n async autoResolveDeadlocks(thresholdMs: number = 10000): Promise<DeadlockResolutionResult[]> {\r\n const deadlocks = await this.monitorDeadlocks(thresholdMs);\r\n const resolutions: DeadlockResolutionResult[] = [];\r\n\r\n for (const deadlock of deadlocks) {\r\n try {\r\n const resolution = await this.resolve(deadlock.transactions);\r\n resolutions.push(resolution);\r\n } catch (err) {\r\n logger.error('Failed to auto-resolve deadlock', err as Error, {\r\n transactionIds: deadlock.transactions.map(t => t.id),\r\n });\r\n }\r\n }\r\n\r\n return resolutions;\r\n }\r\n}\r\n\r\n/**\r\n * Deadlock error\r\n */\r\nexport class DeadlockError extends Error {\r\n constructor(\r\n message: string,\r\n public transactions: Transaction[],\r\n public resources: LockResource[]\r\n ) {\r\n super(message);\r\n this.name = 'DeadlockError';\r\n }\r\n}\r\n\r\n/**\r\n * Utility: Create deadlock resolver with default configuration\r\n */\r\nexport function createDeadlockResolver(\r\n txManager: TransactionManager,\r\n lockManager: DistributedLock\r\n): DeadlockResolver {\r\n return new DeadlockResolver(txManager, lockManager);\r\n}\r\n\r\n/**\r\n * Utility: Start automatic deadlock monitoring\r\n *\r\n * Returns cleanup function to stop monitoring.\r\n */\r\nexport function startDeadlockMonitoring(\r\n resolver: DeadlockResolver,\r\n intervalMs: number = 1000,\r\n thresholdMs: number = 10000\r\n): () => void {\r\n logger.info('Starting automatic deadlock monitoring', {\r\n intervalMs,\r\n thresholdMs,\r\n });\r\n\r\n const intervalHandle = setInterval(async () => {\r\n try {\r\n await resolver.autoResolveDeadlocks(thresholdMs);\r\n } catch (err) {\r\n logger.error('Error during automatic deadlock resolution', err as Error);\r\n }\r\n }, intervalMs);\r\n\r\n // Return cleanup function\r\n return () => {\r\n clearInterval(intervalHandle);\r\n logger.info('Stopped automatic deadlock monitoring');\r\n };\r\n}\r\n"],"names":["LockAcquisitionError","withRetry","createLogger","generateCorrelationId","logger","DeadlockResolver","txManager","lockManager","stats","totalDetected","totalResolved","totalAborted","avgResolutionTimeMs","info","detectDeadlock","transaction","waitTimeMs","duration","getDuration","debug","transactionId","id","threshold","lastDeadlock","Date","resolve","transactions","length","Error","abortTransaction","resolved","abortedTransaction","survivingTransactions","method","resolvedAt","transactionCount","transactionIds","map","t","startTime","now","sorted","sort","a","b","startedAt","getTime","youngest","survivors","slice","resolutionTime","abortedTransactionId","resolutionTimeMs","executeWithRetry","operation","options","opts","maxAttempts","baseDelayMs","maxDelayMs","backoffFactor","exponential","jitter","correlationId","shouldRetry","error","DeadlockError","message","includes","onRetry","attempt","delayMs","warn","executeTransaction","databases","operations","tx","begin","results","result","push","commit","err","rollback","getStats","resetStats","age","monitorDeadlocks","thresholdMs","activeTransactions","getActiveTransactions","deadlocks","isDeadlocked","detected","resources","detectedAt","count","flatMap","d","autoResolveDeadlocks","resolutions","deadlock","resolution","name","createDeadlockResolver","startDeadlockMonitoring","resolver","intervalMs","intervalHandle","setInterval","clearInterval"],"mappings":"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"}