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,544 @@
1
+ /**
2
+ * SQLite Database Adapter
3
+ *
4
+ * Implements IDatabaseAdapter for SQLite with prepared statements and connection pooling.
5
+ * Part of Task 0.4: Database Query Abstraction Layer (MVP)
6
+ *
7
+ * UPDATED: Now uses ConnectionPoolManager for proper connection pool initialization,
8
+ * health checks, automatic reconnection, and connection metrics.
9
+ */ import { randomUUID } from 'crypto';
10
+ import { DatabaseErrorCode, createDatabaseError, createSuccessResult, createFailedResult, mapSQLiteError } from './errors.js';
11
+ import { ConnectionPoolManager } from './connection-pool-manager.js';
12
+ import { withDatabaseRetry } from '../retry-manager.js';
13
+ import { v4 as uuidv4 } from 'uuid';
14
+ export class SQLiteAdapter {
15
+ poolManager = null;
16
+ config;
17
+ connected = false;
18
+ transactions = new Map();
19
+ errorAggregator;
20
+ correlationId;
21
+ constructor(config, errorAggregator){
22
+ this.config = config;
23
+ this.errorAggregator = errorAggregator;
24
+ this.correlationId = uuidv4();
25
+ }
26
+ getType() {
27
+ return 'sqlite';
28
+ }
29
+ /**
30
+ * Track error with error aggregator
31
+ * @private
32
+ */ trackError(error, operation, context) {
33
+ if (this.errorAggregator) {
34
+ const dbError = error.code ? error : createDatabaseError(DatabaseErrorCode.QUERY_FAILED, `SQLite ${operation} failed`, error instanceof Error ? error : new Error(String(error)), context);
35
+ this.errorAggregator.addError('sqlite', dbError, {
36
+ ...context,
37
+ operation,
38
+ correlationId: this.correlationId
39
+ });
40
+ }
41
+ }
42
+ /**
43
+ * Record successful operation with error aggregator
44
+ * @private
45
+ */ recordSuccess() {
46
+ if (this.errorAggregator) {
47
+ this.errorAggregator.recordSuccess('sqlite');
48
+ }
49
+ }
50
+ async connect() {
51
+ // Wrap connection with retry logic for transient failures
52
+ await withDatabaseRetry(async ()=>{
53
+ try {
54
+ // Initialize connection pool manager
55
+ this.poolManager = new ConnectionPoolManager(this.config);
56
+ await this.poolManager.initialize();
57
+ // Start health checks (ping every 30s)
58
+ this.poolManager.startHealthChecks();
59
+ this.connected = true;
60
+ this.recordSuccess();
61
+ } catch (err) {
62
+ const error = createDatabaseError(DatabaseErrorCode.CONNECTION_FAILED, 'Failed to connect to SQLite', err instanceof Error ? err : new Error(String(err)), {
63
+ config: this.config,
64
+ correlationId: this.correlationId
65
+ });
66
+ this.trackError(error, 'connect');
67
+ throw error;
68
+ }
69
+ });
70
+ }
71
+ async disconnect() {
72
+ if (this.poolManager) {
73
+ await this.poolManager.shutdown();
74
+ this.poolManager = null;
75
+ this.connected = false;
76
+ }
77
+ }
78
+ isConnected() {
79
+ return this.connected && this.poolManager !== null;
80
+ }
81
+ /**
82
+ * Get connection pool statistics
83
+ */ getPoolStats() {
84
+ return this.poolManager?.getStats();
85
+ }
86
+ async get(key) {
87
+ this.ensureConnected();
88
+ // Wrap with retry logic for transient database failures
89
+ return withDatabaseRetry(async ()=>{
90
+ const connection = await this.poolManager.acquire();
91
+ try {
92
+ // Parse correlation key format: table:id or table:id:entity:subtype
93
+ // For SQL adapters, we use only table:id for lookup
94
+ const parts = key.split(':');
95
+ const table = parts[0];
96
+ const id = parts.slice(1).join(':'); // Rejoin remaining parts as ID
97
+ if (!table || !id) {
98
+ throw new Error('Invalid key format. Expected "table:id" or "table:id:entity:subtype"');
99
+ }
100
+ const query = `SELECT * FROM ${this.sanitizeIdentifier(table)} WHERE id = ?`;
101
+ const result = await connection.get(query, [
102
+ id
103
+ ]);
104
+ this.recordSuccess();
105
+ return result || null;
106
+ } catch (err) {
107
+ const errorCode = mapSQLiteError(err instanceof Error ? err : new Error(String(err)));
108
+ const error = createDatabaseError(errorCode, `Failed to get record: ${key}`, err instanceof Error ? err : new Error(String(err)), {
109
+ key,
110
+ correlationId: this.correlationId
111
+ });
112
+ this.trackError(error, 'get', {
113
+ key
114
+ });
115
+ throw error;
116
+ } finally{
117
+ await this.poolManager.release(connection);
118
+ }
119
+ });
120
+ }
121
+ async list(table, options) {
122
+ this.ensureConnected();
123
+ // Wrap with retry logic for transient database failures
124
+ return withDatabaseRetry(async ()=>{
125
+ const connection = await this.poolManager.acquire();
126
+ try {
127
+ let query = `SELECT * FROM ${this.sanitizeIdentifier(table)}`;
128
+ const params = [];
129
+ // Apply filters
130
+ if (options?.filters && options.filters.length > 0) {
131
+ const whereClauses = options.filters.map((filter)=>{
132
+ return this.buildWhereClause(filter, params);
133
+ });
134
+ query += ` WHERE ${whereClauses.join(' AND ')}`;
135
+ }
136
+ // Apply ordering
137
+ if (options?.orderBy) {
138
+ const order = options.order || 'asc';
139
+ query += ` ORDER BY ${this.sanitizeIdentifier(String(options.orderBy))} ${order.toUpperCase()}`;
140
+ }
141
+ // Apply limit and offset
142
+ if (options?.limit) {
143
+ query += ` LIMIT ?`;
144
+ params.push(options.limit);
145
+ }
146
+ if (options?.offset) {
147
+ query += ` OFFSET ?`;
148
+ params.push(options.offset);
149
+ }
150
+ const results = await connection.all(query, params);
151
+ this.recordSuccess();
152
+ return results;
153
+ } catch (err) {
154
+ const errorCode = mapSQLiteError(err instanceof Error ? err : new Error(String(err)));
155
+ const error = createDatabaseError(errorCode, `Failed to list records from table: ${table}`, err instanceof Error ? err : new Error(String(err)), {
156
+ table,
157
+ options,
158
+ correlationId: this.correlationId
159
+ });
160
+ this.trackError(error, 'list', {
161
+ table
162
+ });
163
+ throw error;
164
+ } finally{
165
+ await this.poolManager.release(connection);
166
+ }
167
+ });
168
+ }
169
+ async query(table, filters) {
170
+ return this.list(table, {
171
+ filters
172
+ });
173
+ }
174
+ async insert(table, data) {
175
+ this.ensureConnected();
176
+ // Wrap with retry logic for transient database failures
177
+ return withDatabaseRetry(async ()=>{
178
+ const connection = await this.poolManager.acquire();
179
+ try {
180
+ const keys = Object.keys(data);
181
+ const values = Object.values(data);
182
+ const placeholders = keys.map(()=>'?').join(', ');
183
+ const columns = keys.map((k)=>this.sanitizeIdentifier(k)).join(', ');
184
+ const query = `INSERT INTO ${this.sanitizeIdentifier(table)} (${columns}) VALUES (${placeholders})`;
185
+ const result = await connection.run(query, values);
186
+ this.recordSuccess();
187
+ return createSuccessResult(data, result.changes, result.lastID);
188
+ } catch (err) {
189
+ const errorCode = mapSQLiteError(err instanceof Error ? err : new Error(String(err)));
190
+ const error = createDatabaseError(errorCode, `Failed to insert record into table: ${table}`, err instanceof Error ? err : new Error(String(err)), {
191
+ table,
192
+ data,
193
+ correlationId: this.correlationId
194
+ });
195
+ this.trackError(error, 'insert', {
196
+ table
197
+ });
198
+ return createFailedResult(error);
199
+ } finally{
200
+ await this.poolManager.release(connection);
201
+ }
202
+ });
203
+ }
204
+ async insertMany(table, data) {
205
+ this.ensureConnected();
206
+ const connection = await this.poolManager.acquire();
207
+ // Check if we're already in an active transaction (SQLite doesn't support nested transactions)
208
+ const hasActiveTransaction = this.transactions.size > 0;
209
+ try {
210
+ // Only begin transaction if not already in one
211
+ if (!hasActiveTransaction) {
212
+ await connection.run('BEGIN TRANSACTION');
213
+ }
214
+ let totalChanges = 0;
215
+ for (const item of data){
216
+ const keys = Object.keys(item);
217
+ const values = Object.values(item);
218
+ const placeholders = keys.map(()=>'?').join(', ');
219
+ const columns = keys.map((k)=>this.sanitizeIdentifier(k)).join(', ');
220
+ const query = `INSERT INTO ${this.sanitizeIdentifier(table)} (${columns}) VALUES (${placeholders})`;
221
+ const result = await connection.run(query, values);
222
+ totalChanges += result.changes || 0;
223
+ }
224
+ // Only commit if we started the transaction
225
+ if (!hasActiveTransaction) {
226
+ await connection.run('COMMIT');
227
+ }
228
+ this.recordSuccess();
229
+ return createSuccessResult(data, totalChanges);
230
+ } catch (err) {
231
+ // Only rollback if we started the transaction
232
+ if (!hasActiveTransaction) {
233
+ await connection.run('ROLLBACK');
234
+ }
235
+ const errorCode = mapSQLiteError(err instanceof Error ? err : new Error(String(err)));
236
+ const error = createDatabaseError(errorCode, `Failed to insert multiple records into table: ${table}`, err instanceof Error ? err : new Error(String(err)), {
237
+ table,
238
+ count: data.length,
239
+ correlationId: this.correlationId
240
+ });
241
+ this.trackError(error, 'insertMany', {
242
+ table,
243
+ count: data.length
244
+ });
245
+ return createFailedResult(error);
246
+ } finally{
247
+ await this.poolManager.release(connection);
248
+ }
249
+ }
250
+ async update(table, key, data) {
251
+ this.ensureConnected();
252
+ const connection = await this.poolManager.acquire();
253
+ try {
254
+ const keys = Object.keys(data);
255
+ const values = Object.values(data);
256
+ const setClauses = keys.map((k)=>`${this.sanitizeIdentifier(k)} = ?`).join(', ');
257
+ const query = `UPDATE ${this.sanitizeIdentifier(table)} SET ${setClauses} WHERE id = ?`;
258
+ const result = await connection.run(query, [
259
+ ...values,
260
+ key
261
+ ]);
262
+ if (result.changes === 0) {
263
+ const error = createDatabaseError(DatabaseErrorCode.NOT_FOUND, `Record not found in table: ${table}`, undefined, {
264
+ table,
265
+ key,
266
+ correlationId: this.correlationId
267
+ });
268
+ this.trackError(error, 'update', {
269
+ table,
270
+ key
271
+ });
272
+ return createFailedResult(error);
273
+ }
274
+ // Get updated record
275
+ const updated = await this.get(`${table}:${key}`);
276
+ this.recordSuccess();
277
+ return createSuccessResult(updated, result.changes);
278
+ } catch (err) {
279
+ const errorCode = mapSQLiteError(err instanceof Error ? err : new Error(String(err)));
280
+ const error = createDatabaseError(errorCode, `Failed to update record in table: ${table}`, err instanceof Error ? err : new Error(String(err)), {
281
+ table,
282
+ key,
283
+ data,
284
+ correlationId: this.correlationId
285
+ });
286
+ this.trackError(error, 'update', {
287
+ table,
288
+ key
289
+ });
290
+ return createFailedResult(error);
291
+ } finally{
292
+ await this.poolManager.release(connection);
293
+ }
294
+ }
295
+ async delete(table, key) {
296
+ this.ensureConnected();
297
+ const connection = await this.poolManager.acquire();
298
+ try {
299
+ const query = `DELETE FROM ${this.sanitizeIdentifier(table)} WHERE id = ?`;
300
+ const result = await connection.run(query, [
301
+ key
302
+ ]);
303
+ if (result.changes === 0) {
304
+ const error = createDatabaseError(DatabaseErrorCode.NOT_FOUND, `Record not found in table: ${table}`, undefined, {
305
+ table,
306
+ key,
307
+ correlationId: this.correlationId
308
+ });
309
+ this.trackError(error, 'delete', {
310
+ table,
311
+ key
312
+ });
313
+ return createFailedResult(error);
314
+ }
315
+ this.recordSuccess();
316
+ return createSuccessResult(undefined, result.changes);
317
+ } catch (err) {
318
+ const errorCode = mapSQLiteError(err instanceof Error ? err : new Error(String(err)));
319
+ const error = createDatabaseError(errorCode, `Failed to delete record from table: ${table}`, err instanceof Error ? err : new Error(String(err)), {
320
+ table,
321
+ key,
322
+ correlationId: this.correlationId
323
+ });
324
+ this.trackError(error, 'delete', {
325
+ table,
326
+ key
327
+ });
328
+ return createFailedResult(error);
329
+ } finally{
330
+ await this.poolManager.release(connection);
331
+ }
332
+ }
333
+ /**
334
+ * Detect query type with comprehensive pattern matching
335
+ * Handles: SELECT, WITH/CTE, EXPLAIN, PRAGMA, comments
336
+ */ detectQueryType(query) {
337
+ // Remove multi-line comments first (/* */)
338
+ let normalized = query.replace(/\/\*[\s\S]*?\*\//g, '');
339
+ // Remove single-line comments (--) line by line
340
+ normalized = normalized.split('\n').map((line)=>line.replace(/--.*$/, '')).join('\n').trim();
341
+ // Read operations: SELECT, WITH (CTEs), EXPLAIN, PRAGMA, SHOW
342
+ const readPatterns = /^(SELECT|WITH|EXPLAIN|PRAGMA|SHOW)/i;
343
+ return readPatterns.test(normalized) ? 'read' : 'write';
344
+ }
345
+ async raw(query, params) {
346
+ this.ensureConnected();
347
+ const connection = await this.poolManager.acquire();
348
+ try {
349
+ // Determine if query is SELECT or modification using comprehensive detection
350
+ const isSelect = this.detectQueryType(query) === 'read';
351
+ if (isSelect) {
352
+ const results = await connection.all(query, params);
353
+ this.recordSuccess();
354
+ return results;
355
+ } else {
356
+ const result = await connection.run(query, params);
357
+ this.recordSuccess();
358
+ return result;
359
+ }
360
+ } catch (err) {
361
+ const errorCode = mapSQLiteError(err instanceof Error ? err : new Error(String(err)));
362
+ const error = createDatabaseError(errorCode, `Failed to execute raw query`, err instanceof Error ? err : new Error(String(err)), {
363
+ query,
364
+ params,
365
+ correlationId: this.correlationId
366
+ });
367
+ this.trackError(error, 'raw', {
368
+ query
369
+ });
370
+ throw error;
371
+ } finally{
372
+ await this.poolManager.release(connection);
373
+ }
374
+ }
375
+ async beginTransaction() {
376
+ this.ensureConnected();
377
+ const connection = await this.poolManager.acquire();
378
+ const context = {
379
+ id: `sqlite-tx-${randomUUID()}`,
380
+ databases: [
381
+ 'sqlite'
382
+ ],
383
+ startTime: new Date(),
384
+ status: 'pending'
385
+ };
386
+ await connection.run('BEGIN TRANSACTION');
387
+ this.transactions.set(context.id, {
388
+ ...context,
389
+ connection
390
+ });
391
+ return context;
392
+ }
393
+ async prepareTransaction(context) {
394
+ this.ensureConnected();
395
+ if (!this.transactions.has(context.id)) {
396
+ throw createDatabaseError(DatabaseErrorCode.TRANSACTION_FAILED, 'Transaction not found', undefined, {
397
+ transactionId: context.id
398
+ });
399
+ }
400
+ try {
401
+ // SQLite doesn't support native two-phase commit
402
+ // We simulate PREPARE by validating the transaction can commit
403
+ // This involves checking for constraint violations and lock conflicts
404
+ const txData = this.transactions.get(context.id);
405
+ const connection = txData.connection;
406
+ // Check if database is locked (would prevent commit)
407
+ await connection.get('PRAGMA lock_status');
408
+ // Validate foreign key constraints
409
+ const violations = await connection.all('PRAGMA foreign_key_check');
410
+ if (violations && violations.length > 0) {
411
+ throw new Error(`Foreign key constraint violations: ${JSON.stringify(violations)}`);
412
+ }
413
+ // If we get here, transaction can be committed
414
+ context.status = 'prepared';
415
+ context.preparedAt = new Date();
416
+ // Update transaction in map
417
+ this.transactions.set(context.id, {
418
+ ...context,
419
+ connection
420
+ });
421
+ return true;
422
+ } catch (err) {
423
+ // Prepare failed - transaction can still be rolled back
424
+ throw createDatabaseError(DatabaseErrorCode.TRANSACTION_FAILED, 'Failed to prepare transaction', err instanceof Error ? err : new Error(String(err)), {
425
+ transactionId: context.id
426
+ });
427
+ }
428
+ }
429
+ async commitTransaction(context) {
430
+ this.ensureConnected();
431
+ if (!this.transactions.has(context.id)) {
432
+ throw createDatabaseError(DatabaseErrorCode.TRANSACTION_FAILED, 'Transaction not found', undefined, {
433
+ transactionId: context.id
434
+ });
435
+ }
436
+ const txData = this.transactions.get(context.id);
437
+ const connection = txData.connection;
438
+ try {
439
+ await connection.run('COMMIT');
440
+ context.status = 'committed';
441
+ } finally{
442
+ // Always cleanup transaction from map and release connection
443
+ this.transactions.delete(context.id);
444
+ await this.poolManager.release(connection);
445
+ }
446
+ }
447
+ async rollbackTransaction(context) {
448
+ this.ensureConnected();
449
+ if (!this.transactions.has(context.id)) {
450
+ throw createDatabaseError(DatabaseErrorCode.TRANSACTION_FAILED, 'Transaction not found', undefined, {
451
+ transactionId: context.id
452
+ });
453
+ }
454
+ const txData = this.transactions.get(context.id);
455
+ const connection = txData.connection;
456
+ try {
457
+ await connection.run('ROLLBACK');
458
+ context.status = 'rolled_back';
459
+ } finally{
460
+ // Always cleanup transaction from map and release connection
461
+ this.transactions.delete(context.id);
462
+ await this.poolManager.release(connection);
463
+ }
464
+ }
465
+ ensureConnected() {
466
+ if (!this.isConnected()) {
467
+ throw createDatabaseError(DatabaseErrorCode.CONNECTION_FAILED, 'Not connected to SQLite', undefined, {
468
+ config: this.config
469
+ });
470
+ }
471
+ }
472
+ sanitizeIdentifier(identifier) {
473
+ // Remove any characters that aren't alphanumeric or underscore
474
+ return identifier.replace(/[^a-zA-Z0-9_]/g, '');
475
+ }
476
+ buildWhereClause(filter, params) {
477
+ const field = this.sanitizeIdentifier(String(filter.field));
478
+ switch(filter.operator){
479
+ case 'eq':
480
+ {
481
+ params.push(filter.value);
482
+ return `${field} = ?`;
483
+ }
484
+ case 'ne':
485
+ {
486
+ params.push(filter.value);
487
+ return `${field} != ?`;
488
+ }
489
+ case 'gt':
490
+ {
491
+ params.push(filter.value);
492
+ return `${field} > ?`;
493
+ }
494
+ case 'gte':
495
+ {
496
+ params.push(filter.value);
497
+ return `${field} >= ?`;
498
+ }
499
+ case 'lt':
500
+ {
501
+ params.push(filter.value);
502
+ return `${field} < ?`;
503
+ }
504
+ case 'lte':
505
+ {
506
+ params.push(filter.value);
507
+ return `${field} <= ?`;
508
+ }
509
+ case 'in':
510
+ {
511
+ if (!Array.isArray(filter.value)) {
512
+ throw new TypeError(`Field '${String(filter.field)}' with operator 'in' requires an array value`);
513
+ }
514
+ if (filter.value.length === 0) {
515
+ // Empty IN list - return false condition without invalid SQL
516
+ return '1=0';
517
+ }
518
+ const placeholders = filter.value.map(()=>'?').join(', ');
519
+ params.push(...filter.value);
520
+ return `${field} IN (${placeholders})`;
521
+ }
522
+ case 'like':
523
+ {
524
+ params.push(`%${filter.value}%`);
525
+ return `${field} LIKE ?`;
526
+ }
527
+ case 'between':
528
+ {
529
+ if (!Array.isArray(filter.value)) {
530
+ throw new TypeError(`Field '${String(filter.field)}' with operator 'between' requires an array value`);
531
+ }
532
+ if (filter.value.length !== 2) {
533
+ throw new TypeError(`Field '${String(filter.field)}' with operator 'between' requires exactly 2 elements, got ${filter.value.length}`);
534
+ }
535
+ params.push(filter.value[0], filter.value[1]);
536
+ return `${field} BETWEEN ? AND ?`;
537
+ }
538
+ default:
539
+ return '1=1';
540
+ }
541
+ }
542
+ }
543
+
544
+ //# sourceMappingURL=sqlite-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/database-service/sqlite-adapter.ts"],"sourcesContent":["/**\r\n * SQLite Database Adapter\r\n *\r\n * Implements IDatabaseAdapter for SQLite with prepared statements and connection pooling.\r\n * Part of Task 0.4: Database Query Abstraction Layer (MVP)\r\n *\r\n * UPDATED: Now uses ConnectionPoolManager for proper connection pool initialization,\r\n * health checks, automatic reconnection, and connection metrics.\r\n */\r\n\r\nimport sqlite3 from 'sqlite3';\r\nimport { open, Database } from 'sqlite';\r\nimport { randomUUID } from 'crypto';\r\nimport {\r\n IDatabaseAdapter,\r\n DatabaseConfig,\r\n QueryOptions,\r\n QueryFilter,\r\n OperationResult,\r\n TransactionContext,\r\n} from './types.js';\r\nimport {\r\n DatabaseErrorCode,\r\n createDatabaseError,\r\n createSuccessResult,\r\n createFailedResult,\r\n mapSQLiteError,\r\n} from './errors.js';\r\nimport { ConnectionPoolManager } from './connection-pool-manager.js';\r\nimport { withDatabaseRetry } from '../retry-manager.js';\r\nimport { ErrorAggregator } from '../error-aggregator.js';\r\nimport { v4 as uuidv4 } from 'uuid';\r\n\r\nexport class SQLiteAdapter implements IDatabaseAdapter {\r\n private poolManager: ConnectionPoolManager | null = null;\r\n private config: DatabaseConfig;\r\n private connected: boolean = false;\r\n private transactions: Map<string, TransactionContext> = new Map();\r\n private errorAggregator?: ErrorAggregator;\r\n private correlationId: string;\r\n\r\n constructor(config: DatabaseConfig, errorAggregator?: ErrorAggregator) {\r\n this.config = config;\r\n this.errorAggregator = errorAggregator;\r\n this.correlationId = uuidv4();\r\n }\r\n\r\n getType(): 'sqlite' {\r\n return 'sqlite';\r\n }\r\n\r\n /**\r\n * Track error with error aggregator\r\n * @private\r\n */\r\n private trackError(error: any, operation: string, context?: Record<string, any>): void {\r\n if (this.errorAggregator) {\r\n const dbError = error.code ? error : createDatabaseError(\r\n DatabaseErrorCode.QUERY_FAILED,\r\n `SQLite ${operation} failed`,\r\n error instanceof Error ? error : new Error(String(error)),\r\n context\r\n );\r\n\r\n this.errorAggregator.addError('sqlite', dbError, {\r\n ...context,\r\n operation,\r\n correlationId: this.correlationId,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Record successful operation with error aggregator\r\n * @private\r\n */\r\n private recordSuccess(): void {\r\n if (this.errorAggregator) {\r\n this.errorAggregator.recordSuccess('sqlite');\r\n }\r\n }\r\n\r\n async connect(): Promise<void> {\r\n // Wrap connection with retry logic for transient failures\r\n await withDatabaseRetry(async () => {\r\n try {\r\n // Initialize connection pool manager\r\n this.poolManager = new ConnectionPoolManager(this.config);\r\n await this.poolManager.initialize();\r\n\r\n // Start health checks (ping every 30s)\r\n this.poolManager.startHealthChecks();\r\n\r\n this.connected = true;\r\n this.recordSuccess();\r\n } catch (err) {\r\n const error = createDatabaseError(\r\n DatabaseErrorCode.CONNECTION_FAILED,\r\n 'Failed to connect to SQLite',\r\n err instanceof Error ? err : new Error(String(err)),\r\n { config: this.config, correlationId: this.correlationId }\r\n );\r\n this.trackError(error, 'connect');\r\n throw error;\r\n }\r\n });\r\n }\r\n\r\n async disconnect(): Promise<void> {\r\n if (this.poolManager) {\r\n await this.poolManager.shutdown();\r\n this.poolManager = null;\r\n this.connected = false;\r\n }\r\n }\r\n\r\n isConnected(): boolean {\r\n return this.connected && this.poolManager !== null;\r\n }\r\n\r\n /**\r\n * Get connection pool statistics\r\n */\r\n getPoolStats() {\r\n return this.poolManager?.getStats();\r\n }\r\n\r\n async get<T = any>(key: string): Promise<T | null> {\r\n this.ensureConnected();\r\n\r\n // Wrap with retry logic for transient database failures\r\n return withDatabaseRetry(async () => {\r\n const connection = await this.poolManager!.acquire();\r\n\r\n try {\r\n // Parse correlation key format: table:id or table:id:entity:subtype\r\n // For SQL adapters, we use only table:id for lookup\r\n const parts = key.split(':');\r\n const table = parts[0];\r\n const id = parts.slice(1).join(':'); // Rejoin remaining parts as ID\r\n\r\n if (!table || !id) {\r\n throw new Error('Invalid key format. Expected \"table:id\" or \"table:id:entity:subtype\"');\r\n }\r\n\r\n const query = `SELECT * FROM ${this.sanitizeIdentifier(table)} WHERE id = ?`;\r\n const result = await connection.get<T>(query, [id]);\r\n\r\n this.recordSuccess();\r\n return result || null;\r\n } catch (err) {\r\n const errorCode = mapSQLiteError(err instanceof Error ? err : new Error(String(err)));\r\n const error = createDatabaseError(\r\n errorCode,\r\n `Failed to get record: ${key}`,\r\n err instanceof Error ? err : new Error(String(err)),\r\n { key, correlationId: this.correlationId }\r\n );\r\n this.trackError(error, 'get', { key });\r\n throw error;\r\n } finally {\r\n await this.poolManager!.release(connection);\r\n }\r\n });\r\n }\r\n\r\n async list<T = any>(table: string, options?: QueryOptions<T>): Promise<T[]> {\r\n this.ensureConnected();\r\n\r\n // Wrap with retry logic for transient database failures\r\n return withDatabaseRetry(async () => {\r\n const connection = await this.poolManager!.acquire();\r\n\r\n try {\r\n let query = `SELECT * FROM ${this.sanitizeIdentifier(table)}`;\r\n const params: any[] = [];\r\n\r\n // Apply filters\r\n if (options?.filters && options.filters.length > 0) {\r\n const whereClauses = options.filters.map(filter => {\r\n return this.buildWhereClause(filter, params);\r\n });\r\n query += ` WHERE ${whereClauses.join(' AND ')}`;\r\n }\r\n\r\n // Apply ordering\r\n if (options?.orderBy) {\r\n const order = options.order || 'asc';\r\n query += ` ORDER BY ${this.sanitizeIdentifier(String(options.orderBy))} ${order.toUpperCase()}`;\r\n }\r\n\r\n // Apply limit and offset\r\n if (options?.limit) {\r\n query += ` LIMIT ?`;\r\n params.push(options.limit);\r\n }\r\n\r\n if (options?.offset) {\r\n query += ` OFFSET ?`;\r\n params.push(options.offset);\r\n }\r\n\r\n const results = await connection.all<T[]>(query, params);\r\n this.recordSuccess();\r\n return results;\r\n } catch (err) {\r\n const errorCode = mapSQLiteError(err instanceof Error ? err : new Error(String(err)));\r\n const error = createDatabaseError(\r\n errorCode,\r\n `Failed to list records from table: ${table}`,\r\n err instanceof Error ? err : new Error(String(err)),\r\n { table, options, correlationId: this.correlationId }\r\n );\r\n this.trackError(error, 'list', { table });\r\n throw error;\r\n } finally {\r\n await this.poolManager!.release(connection);\r\n }\r\n });\r\n }\r\n\r\n async query<T = any>(table: string, filters: QueryFilter<T>[]): Promise<T[]> {\r\n return this.list(table, { filters });\r\n }\r\n\r\n async insert<T = any>(table: string, data: T): Promise<OperationResult<T>> {\r\n this.ensureConnected();\r\n\r\n // Wrap with retry logic for transient database failures\r\n return withDatabaseRetry(async () => {\r\n const connection = await this.poolManager!.acquire();\r\n\r\n try {\r\n const keys = Object.keys(data as any);\r\n const values = Object.values(data as any);\r\n\r\n const placeholders = keys.map(() => '?').join(', ');\r\n const columns = keys.map(k => this.sanitizeIdentifier(k)).join(', ');\r\n\r\n const query = `INSERT INTO ${this.sanitizeIdentifier(table)} (${columns}) VALUES (${placeholders})`;\r\n\r\n const result = await connection.run(query, values);\r\n\r\n this.recordSuccess();\r\n return createSuccessResult(data, result.changes, result.lastID);\r\n } catch (err) {\r\n const errorCode = mapSQLiteError(err instanceof Error ? err : new Error(String(err)));\r\n const error = createDatabaseError(\r\n errorCode,\r\n `Failed to insert record into table: ${table}`,\r\n err instanceof Error ? err : new Error(String(err)),\r\n { table, data, correlationId: this.correlationId }\r\n );\r\n this.trackError(error, 'insert', { table });\r\n return createFailedResult(error);\r\n } finally {\r\n await this.poolManager!.release(connection);\r\n }\r\n });\r\n }\r\n\r\n async insertMany<T = any>(table: string, data: T[]): Promise<OperationResult<T[]>> {\r\n this.ensureConnected();\r\n\r\n const connection = await this.poolManager!.acquire();\r\n\r\n // Check if we're already in an active transaction (SQLite doesn't support nested transactions)\r\n const hasActiveTransaction = this.transactions.size > 0;\r\n\r\n try {\r\n // Only begin transaction if not already in one\r\n if (!hasActiveTransaction) {\r\n await connection.run('BEGIN TRANSACTION');\r\n }\r\n\r\n let totalChanges = 0;\r\n\r\n for (const item of data) {\r\n const keys = Object.keys(item as any);\r\n const values = Object.values(item as any);\r\n\r\n const placeholders = keys.map(() => '?').join(', ');\r\n const columns = keys.map(k => this.sanitizeIdentifier(k)).join(', ');\r\n\r\n const query = `INSERT INTO ${this.sanitizeIdentifier(table)} (${columns}) VALUES (${placeholders})`;\r\n\r\n const result = await connection.run(query, values);\r\n totalChanges += result.changes || 0;\r\n }\r\n\r\n // Only commit if we started the transaction\r\n if (!hasActiveTransaction) {\r\n await connection.run('COMMIT');\r\n }\r\n\r\n this.recordSuccess();\r\n return createSuccessResult(data, totalChanges);\r\n } catch (err) {\r\n // Only rollback if we started the transaction\r\n if (!hasActiveTransaction) {\r\n await connection.run('ROLLBACK');\r\n }\r\n\r\n const errorCode = mapSQLiteError(err instanceof Error ? err : new Error(String(err)));\r\n const error = createDatabaseError(\r\n errorCode,\r\n `Failed to insert multiple records into table: ${table}`,\r\n err instanceof Error ? err : new Error(String(err)),\r\n { table, count: data.length, correlationId: this.correlationId }\r\n );\r\n this.trackError(error, 'insertMany', { table, count: data.length });\r\n return createFailedResult(error);\r\n } finally {\r\n await this.poolManager!.release(connection);\r\n }\r\n }\r\n\r\n async update<T = any>(table: string, key: string, data: Partial<T>): Promise<OperationResult<T>> {\r\n this.ensureConnected();\r\n\r\n const connection = await this.poolManager!.acquire();\r\n\r\n try {\r\n const keys = Object.keys(data as any);\r\n const values = Object.values(data as any);\r\n\r\n const setClauses = keys.map(k => `${this.sanitizeIdentifier(k)} = ?`).join(', ');\r\n\r\n const query = `UPDATE ${this.sanitizeIdentifier(table)} SET ${setClauses} WHERE id = ?`;\r\n\r\n const result = await connection.run(query, [...values, key]);\r\n\r\n if (result.changes === 0) {\r\n const error = createDatabaseError(\r\n DatabaseErrorCode.NOT_FOUND,\r\n `Record not found in table: ${table}`,\r\n undefined,\r\n { table, key, correlationId: this.correlationId }\r\n );\r\n this.trackError(error, 'update', { table, key });\r\n return createFailedResult(error);\r\n }\r\n\r\n // Get updated record\r\n const updated = await this.get<T>(`${table}:${key}`);\r\n\r\n this.recordSuccess();\r\n return createSuccessResult(updated!, result.changes);\r\n } catch (err) {\r\n const errorCode = mapSQLiteError(err instanceof Error ? err : new Error(String(err)));\r\n const error = createDatabaseError(\r\n errorCode,\r\n `Failed to update record in table: ${table}`,\r\n err instanceof Error ? err : new Error(String(err)),\r\n { table, key, data, correlationId: this.correlationId }\r\n );\r\n this.trackError(error, 'update', { table, key });\r\n return createFailedResult(error);\r\n } finally {\r\n await this.poolManager!.release(connection);\r\n }\r\n }\r\n\r\n async delete(table: string, key: string): Promise<OperationResult<void>> {\r\n this.ensureConnected();\r\n\r\n const connection = await this.poolManager!.acquire();\r\n\r\n try {\r\n const query = `DELETE FROM ${this.sanitizeIdentifier(table)} WHERE id = ?`;\r\n\r\n const result = await connection.run(query, [key]);\r\n\r\n if (result.changes === 0) {\r\n const error = createDatabaseError(\r\n DatabaseErrorCode.NOT_FOUND,\r\n `Record not found in table: ${table}`,\r\n undefined,\r\n { table, key, correlationId: this.correlationId }\r\n );\r\n this.trackError(error, 'delete', { table, key });\r\n return createFailedResult(error);\r\n }\r\n\r\n this.recordSuccess();\r\n return createSuccessResult(undefined, result.changes);\r\n } catch (err) {\r\n const errorCode = mapSQLiteError(err instanceof Error ? err : new Error(String(err)));\r\n const error = createDatabaseError(\r\n errorCode,\r\n `Failed to delete record from table: ${table}`,\r\n err instanceof Error ? err : new Error(String(err)),\r\n { table, key, correlationId: this.correlationId }\r\n );\r\n this.trackError(error, 'delete', { table, key });\r\n return createFailedResult(error);\r\n } finally {\r\n await this.poolManager!.release(connection);\r\n }\r\n }\r\n\r\n /**\r\n * Detect query type with comprehensive pattern matching\r\n * Handles: SELECT, WITH/CTE, EXPLAIN, PRAGMA, comments\r\n */\r\n private detectQueryType(query: string): 'read' | 'write' {\r\n // Remove multi-line comments first (/* */)\r\n let normalized = query.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '');\r\n\r\n // Remove single-line comments (--) line by line\r\n normalized = normalized\r\n .split('\\n')\r\n .map(line => line.replace(/--.*$/, ''))\r\n .join('\\n')\r\n .trim();\r\n\r\n // Read operations: SELECT, WITH (CTEs), EXPLAIN, PRAGMA, SHOW\r\n const readPatterns = /^(SELECT|WITH|EXPLAIN|PRAGMA|SHOW)/i;\r\n return readPatterns.test(normalized) ? 'read' : 'write';\r\n }\r\n\r\n async raw<T = any>(query: string, params?: any[]): Promise<T> {\r\n this.ensureConnected();\r\n\r\n const connection = await this.poolManager!.acquire();\r\n\r\n try {\r\n // Determine if query is SELECT or modification using comprehensive detection\r\n const isSelect = this.detectQueryType(query) === 'read';\r\n\r\n if (isSelect) {\r\n const results = await connection.all<T[]>(query, params);\r\n this.recordSuccess();\r\n return results as T;\r\n } else {\r\n const result = await connection.run(query, params);\r\n this.recordSuccess();\r\n return result as T;\r\n }\r\n } catch (err) {\r\n const errorCode = mapSQLiteError(err instanceof Error ? err : new Error(String(err)));\r\n const error = createDatabaseError(\r\n errorCode,\r\n `Failed to execute raw query`,\r\n err instanceof Error ? err : new Error(String(err)),\r\n { query, params, correlationId: this.correlationId }\r\n );\r\n this.trackError(error, 'raw', { query });\r\n throw error;\r\n } finally {\r\n await this.poolManager!.release(connection);\r\n }\r\n }\r\n\r\n async beginTransaction(): Promise<TransactionContext> {\r\n this.ensureConnected();\r\n\r\n const connection = await this.poolManager!.acquire();\r\n\r\n const context: TransactionContext = {\r\n id: `sqlite-tx-${randomUUID()}`,\r\n databases: ['sqlite'],\r\n startTime: new Date(),\r\n status: 'pending',\r\n };\r\n\r\n await connection.run('BEGIN TRANSACTION');\r\n this.transactions.set(context.id, { ...context, connection });\r\n\r\n return context;\r\n }\r\n\r\n async prepareTransaction(context: TransactionContext): Promise<boolean> {\r\n this.ensureConnected();\r\n\r\n if (!this.transactions.has(context.id)) {\r\n throw createDatabaseError(\r\n DatabaseErrorCode.TRANSACTION_FAILED,\r\n 'Transaction not found',\r\n undefined,\r\n { transactionId: context.id }\r\n );\r\n }\r\n\r\n try {\r\n // SQLite doesn't support native two-phase commit\r\n // We simulate PREPARE by validating the transaction can commit\r\n // This involves checking for constraint violations and lock conflicts\r\n\r\n const txData = this.transactions.get(context.id) as any;\r\n const connection = txData.connection;\r\n\r\n // Check if database is locked (would prevent commit)\r\n await connection.get('PRAGMA lock_status');\r\n\r\n // Validate foreign key constraints\r\n const violations = await connection.all('PRAGMA foreign_key_check');\r\n if (violations && violations.length > 0) {\r\n throw new Error(`Foreign key constraint violations: ${JSON.stringify(violations)}`);\r\n }\r\n\r\n // If we get here, transaction can be committed\r\n context.status = 'prepared';\r\n context.preparedAt = new Date();\r\n\r\n // Update transaction in map\r\n this.transactions.set(context.id, { ...context, connection });\r\n\r\n return true;\r\n } catch (err) {\r\n // Prepare failed - transaction can still be rolled back\r\n throw createDatabaseError(\r\n DatabaseErrorCode.TRANSACTION_FAILED,\r\n 'Failed to prepare transaction',\r\n err instanceof Error ? err : new Error(String(err)),\r\n { transactionId: context.id }\r\n );\r\n }\r\n }\r\n\r\n async commitTransaction(context: TransactionContext): Promise<void> {\r\n this.ensureConnected();\r\n\r\n if (!this.transactions.has(context.id)) {\r\n throw createDatabaseError(\r\n DatabaseErrorCode.TRANSACTION_FAILED,\r\n 'Transaction not found',\r\n undefined,\r\n { transactionId: context.id }\r\n );\r\n }\r\n\r\n const txData = this.transactions.get(context.id) as any;\r\n const connection = txData.connection;\r\n\r\n try {\r\n await connection.run('COMMIT');\r\n context.status = 'committed';\r\n } finally {\r\n // Always cleanup transaction from map and release connection\r\n this.transactions.delete(context.id);\r\n await this.poolManager!.release(connection);\r\n }\r\n }\r\n\r\n async rollbackTransaction(context: TransactionContext): Promise<void> {\r\n this.ensureConnected();\r\n\r\n if (!this.transactions.has(context.id)) {\r\n throw createDatabaseError(\r\n DatabaseErrorCode.TRANSACTION_FAILED,\r\n 'Transaction not found',\r\n undefined,\r\n { transactionId: context.id }\r\n );\r\n }\r\n\r\n const txData = this.transactions.get(context.id) as any;\r\n const connection = txData.connection;\r\n\r\n try {\r\n await connection.run('ROLLBACK');\r\n context.status = 'rolled_back';\r\n } finally {\r\n // Always cleanup transaction from map and release connection\r\n this.transactions.delete(context.id);\r\n await this.poolManager!.release(connection);\r\n }\r\n }\r\n\r\n private ensureConnected(): void {\r\n if (!this.isConnected()) {\r\n throw createDatabaseError(\r\n DatabaseErrorCode.CONNECTION_FAILED,\r\n 'Not connected to SQLite',\r\n undefined,\r\n { config: this.config }\r\n );\r\n }\r\n }\r\n\r\n private sanitizeIdentifier(identifier: string): string {\r\n // Remove any characters that aren't alphanumeric or underscore\r\n return identifier.replace(/[^a-zA-Z0-9_]/g, '');\r\n }\r\n\r\n private buildWhereClause<T>(filter: QueryFilter<T>, params: any[]): string {\r\n const field = this.sanitizeIdentifier(String(filter.field));\r\n\r\n switch (filter.operator) {\r\n case 'eq': {\r\n params.push(filter.value);\r\n return `${field} = ?`;\r\n }\r\n case 'ne': {\r\n params.push(filter.value);\r\n return `${field} != ?`;\r\n }\r\n case 'gt': {\r\n params.push(filter.value);\r\n return `${field} > ?`;\r\n }\r\n case 'gte': {\r\n params.push(filter.value);\r\n return `${field} >= ?`;\r\n }\r\n case 'lt': {\r\n params.push(filter.value);\r\n return `${field} < ?`;\r\n }\r\n case 'lte': {\r\n params.push(filter.value);\r\n return `${field} <= ?`;\r\n }\r\n case 'in': {\r\n if (!Array.isArray(filter.value)) {\r\n throw new TypeError(`Field '${String(filter.field)}' with operator 'in' requires an array value`);\r\n }\r\n if (filter.value.length === 0) {\r\n // Empty IN list - return false condition without invalid SQL\r\n return '1=0';\r\n }\r\n const placeholders = filter.value.map(() => '?').join(', ');\r\n params.push(...filter.value);\r\n return `${field} IN (${placeholders})`;\r\n }\r\n case 'like': {\r\n params.push(`%${filter.value}%`);\r\n return `${field} LIKE ?`;\r\n }\r\n case 'between': {\r\n if (!Array.isArray(filter.value)) {\r\n throw new TypeError(`Field '${String(filter.field)}' with operator 'between' requires an array value`);\r\n }\r\n if (filter.value.length !== 2) {\r\n throw new TypeError(`Field '${String(filter.field)}' with operator 'between' requires exactly 2 elements, got ${filter.value.length}`);\r\n }\r\n params.push(filter.value[0], filter.value[1]);\r\n return `${field} BETWEEN ? AND ?`;\r\n }\r\n default:\r\n return '1=1';\r\n }\r\n }\r\n}\r\n"],"names":["randomUUID","DatabaseErrorCode","createDatabaseError","createSuccessResult","createFailedResult","mapSQLiteError","ConnectionPoolManager","withDatabaseRetry","v4","uuidv4","SQLiteAdapter","poolManager","config","connected","transactions","Map","errorAggregator","correlationId","getType","trackError","error","operation","context","dbError","code","QUERY_FAILED","Error","String","addError","recordSuccess","connect","initialize","startHealthChecks","err","CONNECTION_FAILED","disconnect","shutdown","isConnected","getPoolStats","getStats","get","key","ensureConnected","connection","acquire","parts","split","table","id","slice","join","query","sanitizeIdentifier","result","errorCode","release","list","options","params","filters","length","whereClauses","map","filter","buildWhereClause","orderBy","order","toUpperCase","limit","push","offset","results","all","insert","data","keys","Object","values","placeholders","columns","k","run","changes","lastID","insertMany","hasActiveTransaction","size","totalChanges","item","count","update","setClauses","NOT_FOUND","undefined","updated","delete","detectQueryType","normalized","replace","line","trim","readPatterns","test","raw","isSelect","beginTransaction","databases","startTime","Date","status","set","prepareTransaction","has","TRANSACTION_FAILED","transactionId","txData","violations","JSON","stringify","preparedAt","commitTransaction","rollbackTransaction","identifier","field","operator","value","Array","isArray","TypeError"],"mappings":"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"}