claude-flow-novice 2.15.3 → 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 (461) 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-lint-sql-injection.sh +61 -0
  36. package/.claude/hooks/cfn-post-edit-cfn-retrospective.sh +33 -2
  37. package/.claude/hooks/cfn-pre-edit-security-warning.sh +40 -0
  38. package/.claude/skills/cfn-agent-spawning/spawn-agent.sh +22 -24
  39. package/.claude/skills/cfn-docker-agent-spawning/SKILL.md +28 -4
  40. package/.claude/skills/cfn-docker-agent-spawning/spawn-agent.sh +3 -1
  41. package/.claude/skills/cfn-docker-loop-orchestration/orchestrate.sh +224 -20
  42. package/.claude/skills/cfn-loop-orchestration/helpers/gate-check.sh +550 -46
  43. package/.claude/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +277 -0
  44. package/.claude/skills/cfn-loop-orchestration/orchestrate.sh +184 -23
  45. package/.claude/skills/cfn-loop-orchestration/security_utils.sh +24 -0
  46. package/.claude/skills/cfn-loop-orchestration/test-iteration-context-injection.sh +366 -0
  47. package/.claude/skills/cfn-redis-coordination/CENTRALIZED_REDIS_WRAPPER.md +319 -0
  48. package/.claude/skills/cfn-redis-coordination/agent-log.sh +4 -0
  49. package/.claude/skills/cfn-redis-coordination/agent-log.sh.bak +124 -0
  50. package/.claude/skills/cfn-redis-coordination/agent-recovery.sh +2 -2
  51. package/.claude/skills/cfn-redis-coordination/collect-confidence-scores.sh +30 -0
  52. package/.claude/skills/cfn-redis-coordination/get-context.sh +33 -0
  53. package/.claude/skills/cfn-redis-coordination/get-success-criteria.sh +54 -0
  54. package/.claude/skills/cfn-redis-coordination/invoke-waiting-mode.sh +3 -0
  55. package/.claude/skills/cfn-redis-coordination/redis-cli-wrapper.sh +24 -3
  56. package/.claude/skills/cfn-redis-coordination/redis-functions.sh +33 -0
  57. package/.claude/skills/cfn-redis-coordination/report-completion.sh +24 -31
  58. package/.claude/skills/cfn-redis-coordination/store-context.sh +4 -0
  59. package/.claude/skills/cfn-redis-coordination/store-success-criteria.sh +85 -0
  60. package/.claude/skills/cfn-redis-coordination/update-all-scripts.sh +67 -0
  61. package/.claude/skills/cfn-sqlite-memory/ttl-cleanup.sh +17 -25
  62. package/.claude/skills/cfn-transparency-middleware/test-e2e.sh +15 -0
  63. package/.claude/skills/cfn-transparency-middleware/tests/input-validation.sh +15 -0
  64. package/README.md +116 -475
  65. package/claude-assets/agents/cfn-dev-team/README.md +103 -0
  66. package/claude-assets/agents/cfn-dev-team/architecture/goal-planner.md +1 -1
  67. package/claude-assets/agents/cfn-dev-team/coordinators/cfn-frontend-coordinator.md +77 -15
  68. package/claude-assets/agents/cfn-dev-team/coordinators/cfn-v3-coordinator.md +355 -6
  69. package/claude-assets/agents/cfn-dev-team/coordinators/consensus-builder.md +82 -1
  70. package/claude-assets/agents/cfn-dev-team/coordinators/handoff-coordinator.md +82 -1
  71. package/claude-assets/agents/cfn-dev-team/coordinators/multi-sprint-coordinator.md +77 -15
  72. package/claude-assets/agents/cfn-dev-team/dev-ops/docker-specialist.md +99 -12
  73. package/claude-assets/agents/cfn-dev-team/dev-ops/github-commit-agent.md +1 -1
  74. package/claude-assets/agents/cfn-dev-team/dev-ops/kubernetes-specialist.md +97 -0
  75. package/claude-assets/agents/cfn-dev-team/dev-ops/monitoring-specialist.md +20 -1
  76. package/claude-assets/agents/cfn-dev-team/developers/api-gateway-specialist.md +97 -0
  77. package/claude-assets/agents/cfn-dev-team/developers/backend-developer.md +110 -13
  78. package/claude-assets/agents/cfn-dev-team/developers/data/data-engineer.md +106 -15
  79. package/claude-assets/agents/cfn-dev-team/developers/database/database-architect.md +115 -11
  80. package/claude-assets/agents/cfn-dev-team/developers/frontend/mobile-dev.md +94 -7
  81. package/claude-assets/agents/cfn-dev-team/developers/frontend/react-frontend-engineer.md +87 -9
  82. package/claude-assets/agents/cfn-dev-team/developers/frontend/typescript-specialist.md +85 -7
  83. package/claude-assets/agents/cfn-dev-team/developers/frontend/ui-designer.md +160 -28
  84. package/claude-assets/agents/cfn-dev-team/developers/graphql-specialist.md +101 -19
  85. package/claude-assets/agents/cfn-dev-team/developers/rust-developer.md +108 -14
  86. package/claude-assets/agents/cfn-dev-team/reviewers/{reviewer.md → code-reviewer.md} +95 -8
  87. package/claude-assets/agents/cfn-dev-team/reviewers/quality/code-quality-validator.md +107 -7
  88. package/claude-assets/agents/cfn-dev-team/reviewers/quality/perf-analyzer.md +98 -7
  89. package/claude-assets/agents/cfn-dev-team/reviewers/quality/performance-benchmarker.md +95 -7
  90. package/claude-assets/agents/cfn-dev-team/reviewers/quality/security-specialist.md +136 -9
  91. package/claude-assets/agents/cfn-dev-team/testers/api-testing-specialist.md +108 -1
  92. package/claude-assets/agents/cfn-dev-team/testers/chaos-engineering-specialist.md +107 -13
  93. package/claude-assets/agents/cfn-dev-team/testers/contract-tester.md +737 -0
  94. package/claude-assets/agents/cfn-dev-team/testers/e2e/playwright-tester.md +1 -1
  95. package/claude-assets/agents/cfn-dev-team/testers/integration-tester.md +828 -0
  96. package/claude-assets/agents/cfn-dev-team/testers/interaction-tester.md +106 -7
  97. package/claude-assets/agents/cfn-dev-team/testers/load-testing-specialist.md +77 -0
  98. package/claude-assets/agents/cfn-dev-team/testers/mutation-testing-specialist.md +684 -0
  99. package/claude-assets/agents/cfn-dev-team/testers/playwright-tester.md +110 -1
  100. package/claude-assets/agents/cfn-dev-team/testers/tester.md +94 -7
  101. package/claude-assets/agents/cfn-dev-team/utility/code-booster.md +1 -3
  102. package/claude-assets/agents/cfn-dev-team/utility/epic-creator.md +87 -13
  103. package/claude-assets/agents/cfn-dev-team/utility/memory-leak-specialist.md +103 -7
  104. package/claude-assets/agents/cfn-dev-team/utility/researcher.md +1 -3
  105. package/claude-assets/agents/cfn-dev-team/utility/z-ai-specialist.md +94 -7
  106. package/claude-assets/agents/docker-coordinators/cfn-docker-v3-coordinator.md +46 -0
  107. package/claude-assets/agents/project-only-agents/npm-package-specialist.md +1 -1
  108. package/claude-assets/cfn-extras/skills/advanced-features/cfn-agent-swap/recommend-swap.sh +59 -59
  109. package/claude-assets/cfn-extras/skills/analytics/cfn-improvement-recommender/recommend-improvements.sh +91 -91
  110. package/claude-assets/cfn-extras/skills/analytics/cfn-pattern-extraction/extract-patterns.sh +79 -79
  111. package/claude-assets/cfn-extras/skills/analytics/cfn-retrospective-report/generate-report.sh +100 -100
  112. package/claude-assets/cfn-extras/skills/analytics/cfn-telemetry/start-telemetry.sh +110 -110
  113. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/add-bullet.sh +145 -145
  114. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/log-merge.sh +67 -67
  115. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/monitor-injection-performance.sh +137 -137
  116. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/optimize-injection-pipeline.sh +168 -168
  117. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/query-reflections.sh +35 -35
  118. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/store-reflection.sh +45 -45
  119. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/track-ab-test.sh +41 -41
  120. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/update-reflection.sh +41 -41
  121. package/claude-assets/cfn-extras/skills/deprecated/cfn-cli-setup/validate-cli-environment.sh +191 -191
  122. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/create-campaign.sh +231 -231
  123. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/get-campaign-performance.sh +190 -190
  124. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/pause-campaign.sh +142 -142
  125. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/set-budget.sh +181 -181
  126. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/update-bid-strategy.sh +133 -133
  127. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/get-conversation-history.sh +121 -121
  128. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/qualify-lead.sh +156 -156
  129. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/schedule-demo.sh +181 -181
  130. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/send-message.sh +137 -137
  131. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/transfer-to-human.sh +179 -179
  132. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/create-campaign.sh +183 -183
  133. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/get-delivery-status.sh +139 -139
  134. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/opt-out.sh +150 -150
  135. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/schedule-campaign.sh +187 -187
  136. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/send-sms.sh +181 -181
  137. package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/test-web-portal-skill.sh +50 -50
  138. package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/validate-deployment.sh +84 -84
  139. package/claude-assets/cfn-extras/skills/utility/cfn-environment-sanitization/sanitize-environment.sh +243 -243
  140. package/claude-assets/commands/cfn-loop-cli.md +16 -2
  141. package/claude-assets/commands/switch-api.md +31 -10
  142. package/claude-assets/hooks/cfn-lint-sql-injection.sh +61 -0
  143. package/claude-assets/hooks/cfn-post-edit-cfn-retrospective.sh +33 -2
  144. package/claude-assets/hooks/cfn-pre-edit-security-warning.sh +40 -0
  145. package/claude-assets/hooks/detect-hardcoded-credentials.sh +212 -0
  146. package/claude-assets/skills/SKILL_TEMPLATE.md +774 -0
  147. package/claude-assets/skills/agent-lifecycle/execute-lifecycle-hook.sh +84 -113
  148. package/claude-assets/skills/agent-lifecycle/simple-audit.sh +33 -6
  149. package/claude-assets/skills/agent-template-generator/SKILL.md +440 -0
  150. package/claude-assets/skills/agent-template-generator/generate-agent.sh +405 -0
  151. package/claude-assets/skills/agent-validation-linter/SKILL.md +589 -0
  152. package/claude-assets/skills/agent-validation-linter/lint-agents.sh +271 -0
  153. package/claude-assets/skills/bootstrap/bash-fundamentals.md +786 -0
  154. package/claude-assets/skills/bootstrap/database-connection.md +464 -0
  155. package/claude-assets/skills/bootstrap/error-handling.md +580 -0
  156. package/claude-assets/skills/bootstrap/file-operations.md +699 -0
  157. package/claude-assets/skills/bootstrap/skill-loader.md +616 -0
  158. package/claude-assets/skills/bootstrap/sqlite-params.sh +287 -0
  159. package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh +22 -24
  160. package/claude-assets/skills/cfn-automatic-memory-persistence/test-memory-persistence.sh +17 -16
  161. package/claude-assets/skills/cfn-deployment/SKILL.md +293 -0
  162. package/claude-assets/skills/cfn-deployment/execute.sh +21 -0
  163. package/claude-assets/skills/cfn-docker-agent-spawning/SKILL.md +28 -4
  164. package/claude-assets/skills/cfn-docker-agent-spawning/spawn-agent.sh +3 -1
  165. package/claude-assets/skills/cfn-docker-loop-orchestration/orchestrate.sh +224 -20
  166. package/claude-assets/skills/cfn-environment-sanitization/sanitize-environment.sh +38 -0
  167. package/claude-assets/skills/cfn-error-batching-strategy/lib/core-functions.sh +47 -47
  168. package/claude-assets/skills/cfn-file-operations/SKILL.md +290 -0
  169. package/claude-assets/skills/cfn-file-operations/execute.sh +129 -0
  170. package/claude-assets/skills/cfn-file-operations/lib/atomic-write.sh +294 -0
  171. package/claude-assets/skills/cfn-file-operations/lib/lock.sh +361 -0
  172. package/claude-assets/skills/cfn-file-operations/test.sh +369 -0
  173. package/claude-assets/skills/cfn-log-operations/SKILL.md +308 -0
  174. package/claude-assets/skills/cfn-log-operations/execute.sh +420 -0
  175. package/claude-assets/skills/cfn-log-operations/lib/rotate.sh +406 -0
  176. package/claude-assets/skills/cfn-log-operations/lib/search.sh +448 -0
  177. package/claude-assets/skills/cfn-log-operations/test.sh +394 -0
  178. package/claude-assets/skills/cfn-loop-orchestration/helpers/gate-check.sh +550 -46
  179. package/claude-assets/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +277 -0
  180. package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh +184 -23
  181. package/claude-assets/skills/cfn-loop-orchestration/security_utils.sh +24 -0
  182. package/claude-assets/skills/cfn-loop-orchestration/test-iteration-context-injection.sh +366 -0
  183. package/claude-assets/skills/cfn-parameterized-queries/SKILL.md +339 -0
  184. package/claude-assets/skills/cfn-playbook/query-playbook.sh +19 -15
  185. package/claude-assets/skills/cfn-playbook/update-playbook.sh +25 -14
  186. package/claude-assets/skills/cfn-process-instrumentation/instrument-process.sh +44 -0
  187. package/claude-assets/skills/cfn-promotion/SKILL.md +305 -0
  188. package/claude-assets/skills/cfn-redis-coordination/CENTRALIZED_REDIS_WRAPPER.md +319 -0
  189. package/claude-assets/skills/cfn-redis-coordination/agent-log.sh +4 -0
  190. package/claude-assets/skills/cfn-redis-coordination/agent-log.sh.bak +124 -0
  191. package/claude-assets/skills/cfn-redis-coordination/agent-recovery.sh +2 -2
  192. package/claude-assets/skills/cfn-redis-coordination/collect-confidence-scores.sh +30 -0
  193. package/claude-assets/skills/cfn-redis-coordination/get-context.sh +33 -0
  194. package/claude-assets/skills/cfn-redis-coordination/get-success-criteria.sh +54 -0
  195. package/claude-assets/skills/cfn-redis-coordination/invoke-waiting-mode.sh +3 -0
  196. package/claude-assets/skills/cfn-redis-coordination/redis-cli-wrapper.sh +24 -3
  197. package/claude-assets/skills/cfn-redis-coordination/redis-functions.sh +33 -0
  198. package/claude-assets/skills/cfn-redis-coordination/report-completion.sh +24 -31
  199. package/claude-assets/skills/cfn-redis-coordination/store-context.sh +4 -0
  200. package/claude-assets/skills/cfn-redis-coordination/store-success-criteria.sh +85 -0
  201. package/claude-assets/skills/cfn-redis-coordination/update-all-scripts.sh +67 -0
  202. package/claude-assets/skills/cfn-skill-loader/SKILL.md +466 -0
  203. package/claude-assets/skills/cfn-skill-loader/execute.sh +344 -0
  204. package/claude-assets/skills/cfn-sqlite-memory/ttl-cleanup.sh +17 -25
  205. package/claude-assets/skills/cfn-task-audit/get-audit-data.sh +42 -21
  206. package/claude-assets/skills/cfn-task-audit/store-task-audit.sh +17 -10
  207. package/claude-assets/skills/cfn-test-runner/detect-regressions.sh +17 -14
  208. package/claude-assets/skills/cfn-test-runner/detect-regressions.sh.backup-1763392821 +55 -0
  209. package/claude-assets/skills/cfn-test-runner/store-benchmarks.sh +17 -19
  210. package/claude-assets/skills/cfn-transparency-middleware/test-e2e.sh +15 -0
  211. package/claude-assets/skills/cfn-transparency-middleware/tests/input-validation.sh +15 -0
  212. package/claude-assets/skills/cfn-utilities/SKILL.md +237 -0
  213. package/claude-assets/skills/cfn-utilities/execute.sh +32 -0
  214. package/claude-assets/skills/cfn-utilities/lib/errors.sh +56 -0
  215. package/claude-assets/skills/cfn-utilities/lib/file-ops.sh +164 -0
  216. package/claude-assets/skills/cfn-utilities/lib/logging.sh +77 -0
  217. package/claude-assets/skills/cfn-utilities/lib/retry.sh +127 -0
  218. package/claude-assets/skills/cfn-utilities/test.sh +317 -0
  219. package/claude-assets/skills/integration/agent-handoff.sh +62 -64
  220. package/claude-assets/skills/json-validation/SKILL.md +431 -0
  221. package/claude-assets/skills/json-validation/test-validate-success-criteria.sh +421 -0
  222. package/claude-assets/skills/json-validation/validate-success-criteria.sh +197 -0
  223. package/claude-assets/skills/redis-coordination/validate-parameters.sh +34 -0
  224. package/claude-assets/skills/workflow-codification/DEPLOY_QUICK_REFERENCE.md +106 -0
  225. package/claude-assets/skills/workflow-codification/PROPAGATE_UPDATE_QUICK_REFERENCE.md +366 -0
  226. package/claude-assets/skills/workflow-codification/deploy-approved-skill.sh +481 -0
  227. package/claude-assets/skills/workflow-codification/deploy-approved-skill.sh.backup-1763392820 +512 -0
  228. package/claude-assets/skills/workflow-codification/lib/security-utils.sh +204 -0
  229. package/claude-assets/skills/workflow-codification/propagate-skill-update.sh +648 -0
  230. package/claude-assets/skills/workflow-codification/propagate-skill-update.sh.backup-1763392820 +664 -0
  231. package/claude-assets/skills/workflow-codification/test-integration.sh +15 -0
  232. package/claude-assets/skills/workflow-codification/test-metadata-update.sh +350 -0
  233. package/claude-assets/skills/workflow-codification/track-cost-savings.sh +55 -14
  234. package/claude-assets/skills/workflow-codification/track-cost-savings.sh.backup-1763392821 +445 -0
  235. package/claude-assets/skills/workflow-codification/track-edge-case.sh +27 -60
  236. package/claude-assets/skills/workflow-codification/workflow-codification.db +0 -0
  237. package/dist/ace/ace-curator.js +10 -2
  238. package/dist/ace/ace-curator.js.map +1 -1
  239. package/dist/ace/ace-generator.js +4 -0
  240. package/dist/ace/ace-generator.js.map +1 -1
  241. package/dist/ace/ace-reflector.js +1 -1
  242. package/dist/ace/ace-reflector.js.map +1 -1
  243. package/dist/ace/context-injection.js +24 -2
  244. package/dist/ace/context-injection.js.map +1 -1
  245. package/dist/agents/agent-loader.js +146 -165
  246. package/dist/agents/agent-loader.js.map +1 -1
  247. package/dist/agents/task-agent-integration.js +1 -1
  248. package/dist/agents/task-agent-integration.js.map +1 -1
  249. package/dist/api/health-endpoints.js +390 -0
  250. package/dist/api/health-endpoints.js.map +1 -0
  251. package/dist/cli/agent-executor.js +4 -1
  252. package/dist/cli/agent-executor.js.map +1 -1
  253. package/dist/cli/agent-prompt-builder.js +89 -1
  254. package/dist/cli/agent-prompt-builder.js.map +1 -1
  255. package/dist/cli/agent-spawn.js +130 -37
  256. package/dist/cli/agent-spawn.js.map +1 -1
  257. package/dist/cli/skill-cache-validator.js +412 -0
  258. package/dist/cli/skill-cache-validator.js.map +1 -0
  259. package/dist/cli/skill-cli.js +991 -0
  260. package/dist/cli/skill-cli.js.map +1 -0
  261. package/dist/cli/skill-execution-logger.js +284 -0
  262. package/dist/cli/skill-execution-logger.js.map +1 -0
  263. package/dist/cli/skill-loader.js +457 -0
  264. package/dist/cli/skill-loader.js.map +1 -0
  265. package/dist/coordination/event-bus.js +2 -2
  266. package/dist/coordination/event-bus.js.map +1 -1
  267. package/dist/coordination/fleet-manager.js +1 -1
  268. package/dist/coordination/fleet-manager.js.map +1 -1
  269. package/dist/coordination/index.js +23 -9
  270. package/dist/coordination/index.js.map +1 -1
  271. package/dist/coordination/types/fleet-manager.types.js.map +1 -1
  272. package/dist/db/migration-manager.js +483 -0
  273. package/dist/db/migration-manager.js.map +1 -0
  274. package/dist/db/skills-query.js +535 -0
  275. package/dist/db/skills-query.js.map +1 -0
  276. package/dist/integration/DatabaseHandoff.js +1 -1
  277. package/dist/integration/DatabaseHandoff.js.map +1 -1
  278. package/dist/jobs/edge-case-analyzer.js +367 -0
  279. package/dist/jobs/edge-case-analyzer.js.map +1 -0
  280. package/dist/jobs/promotion-sla-enforcer.js +288 -0
  281. package/dist/jobs/promotion-sla-enforcer.js.map +1 -0
  282. package/dist/lib/agent-output-parser.js.map +1 -1
  283. package/dist/lib/agent-output-validator.js.map +1 -1
  284. package/dist/lib/agent-workspace.js +281 -0
  285. package/dist/lib/agent-workspace.js.map +1 -0
  286. package/dist/lib/atomic-file-writer.js +377 -0
  287. package/dist/lib/atomic-file-writer.js.map +1 -0
  288. package/dist/lib/backup-manager.js +779 -0
  289. package/dist/lib/backup-manager.js.map +1 -0
  290. package/dist/lib/checkpoint-manager.js +837 -0
  291. package/dist/lib/checkpoint-manager.js.map +1 -0
  292. package/dist/lib/circuit-breaker.js +340 -0
  293. package/dist/lib/circuit-breaker.js.map +1 -0
  294. package/dist/lib/completion-signal-handler.js +243 -0
  295. package/dist/lib/completion-signal-handler.js.map +1 -0
  296. package/dist/lib/config-manager.js +312 -0
  297. package/dist/lib/config-manager.js.map +1 -0
  298. package/dist/lib/config-migrator.js +386 -0
  299. package/dist/lib/config-migrator.js.map +1 -0
  300. package/dist/lib/config-validator.js.map +1 -1
  301. package/dist/lib/correlation-cache.js +311 -0
  302. package/dist/lib/correlation-cache.js.map +1 -0
  303. package/dist/lib/correlation.js +263 -0
  304. package/dist/lib/correlation.js.map +1 -0
  305. package/dist/lib/database-service/connection-pool-manager.js +520 -0
  306. package/dist/lib/database-service/connection-pool-manager.js.map +1 -0
  307. package/dist/lib/database-service/correlation.js +329 -0
  308. package/dist/lib/database-service/correlation.js.map +1 -0
  309. package/dist/lib/database-service/errors.js +120 -0
  310. package/dist/lib/database-service/errors.js.map +1 -0
  311. package/dist/lib/database-service/index.js +168 -0
  312. package/dist/lib/database-service/index.js.map +1 -0
  313. package/dist/lib/database-service/postgres-adapter.js +526 -0
  314. package/dist/lib/database-service/postgres-adapter.js.map +1 -0
  315. package/dist/lib/database-service/redis-adapter.js +360 -0
  316. package/dist/lib/database-service/redis-adapter.js.map +1 -0
  317. package/dist/lib/database-service/sqlite-adapter.js +544 -0
  318. package/dist/lib/database-service/sqlite-adapter.js.map +1 -0
  319. package/dist/lib/database-service/transaction-manager.js +773 -0
  320. package/dist/lib/database-service/transaction-manager.js.map +1 -0
  321. package/dist/lib/database-service/types.js +23 -0
  322. package/dist/lib/database-service/types.js.map +1 -0
  323. package/dist/lib/deadlock-resolver.js +292 -0
  324. package/dist/lib/deadlock-resolver.js.map +1 -0
  325. package/dist/lib/distributed-lock.js +451 -0
  326. package/dist/lib/distributed-lock.js.map +1 -0
  327. package/dist/lib/edge-case-deduplicator.js +227 -0
  328. package/dist/lib/edge-case-deduplicator.js.map +1 -0
  329. package/dist/lib/encryption-manager.js +322 -0
  330. package/dist/lib/encryption-manager.js.map +1 -0
  331. package/dist/lib/error-aggregator.js +234 -0
  332. package/dist/lib/error-aggregator.js.map +1 -0
  333. package/dist/lib/errors.js +287 -0
  334. package/dist/lib/errors.js.map +1 -0
  335. package/dist/lib/file-lock-manager.js +578 -0
  336. package/dist/lib/file-lock-manager.js.map +1 -0
  337. package/dist/lib/file-operations.js +367 -0
  338. package/dist/lib/file-operations.js.map +1 -0
  339. package/dist/lib/idempotent-write.js +237 -0
  340. package/dist/lib/idempotent-write.js.map +1 -0
  341. package/dist/lib/integration-schema-validator.js +522 -0
  342. package/dist/lib/integration-schema-validator.js.map +1 -0
  343. package/dist/lib/lock-health-monitor.js +298 -0
  344. package/dist/lib/lock-health-monitor.js.map +1 -0
  345. package/dist/lib/log-shipper.js +422 -0
  346. package/dist/lib/log-shipper.js.map +1 -0
  347. package/dist/lib/logging.js +146 -0
  348. package/dist/lib/logging.js.map +1 -0
  349. package/dist/lib/message-deduplicator.js +439 -0
  350. package/dist/lib/message-deduplicator.js.map +1 -0
  351. package/dist/lib/multi-system-query.js +604 -0
  352. package/dist/lib/multi-system-query.js.map +1 -0
  353. package/dist/lib/orphan-detector.js +332 -0
  354. package/dist/lib/orphan-detector.js.map +1 -0
  355. package/dist/lib/password-generator.js +166 -0
  356. package/dist/lib/password-generator.js.map +1 -0
  357. package/dist/lib/path-validator.js +429 -0
  358. package/dist/lib/path-validator.js.map +1 -0
  359. package/dist/lib/query-translator.js +905 -0
  360. package/dist/lib/query-translator.js.map +1 -0
  361. package/dist/lib/queue-recovery.js +469 -0
  362. package/dist/lib/queue-recovery.js.map +1 -0
  363. package/dist/lib/redis-queue-manager.js +512 -0
  364. package/dist/lib/redis-queue-manager.js.map +1 -0
  365. package/dist/lib/reflection-archiver.js +272 -0
  366. package/dist/lib/reflection-archiver.js.map +1 -0
  367. package/dist/lib/retry-manager.js +453 -0
  368. package/dist/lib/retry-manager.js.map +1 -0
  369. package/dist/lib/retry.js +262 -0
  370. package/dist/lib/retry.js.map +1 -0
  371. package/dist/lib/schema-transform.js +695 -0
  372. package/dist/lib/schema-transform.js.map +1 -0
  373. package/dist/lib/schema-validator.js +491 -0
  374. package/dist/lib/schema-validator.js.map +1 -0
  375. package/dist/lib/skill-cache.js +297 -0
  376. package/dist/lib/skill-cache.js.map +1 -0
  377. package/dist/lib/skill-content-manager.js +337 -0
  378. package/dist/lib/skill-content-manager.js.map +1 -0
  379. package/dist/lib/skill-frontmatter-parser.js +237 -0
  380. package/dist/lib/skill-frontmatter-parser.js.map +1 -0
  381. package/dist/lib/skill-git-integration.js +275 -0
  382. package/dist/lib/skill-git-integration.js.map +1 -0
  383. package/dist/lib/skill-markdown-validator.js +396 -0
  384. package/dist/lib/skill-markdown-validator.js.map +1 -0
  385. package/dist/lib/skill-output-parser.js +312 -0
  386. package/dist/lib/skill-output-parser.js.map +1 -0
  387. package/dist/lib/unified-query-api.js +467 -0
  388. package/dist/lib/unified-query-api.js.map +1 -0
  389. package/dist/middleware/auth-middleware.js +350 -0
  390. package/dist/middleware/auth-middleware.js.map +1 -0
  391. package/dist/middleware/schema-validation.js +347 -0
  392. package/dist/middleware/schema-validation.js.map +1 -0
  393. package/dist/providers/anthropic-provider.js +1 -1
  394. package/dist/providers/anthropic-provider.js.map +1 -1
  395. package/dist/providers/provider-factory.js +2 -2
  396. package/dist/providers/provider-factory.js.map +1 -1
  397. package/dist/services/edge-case-analyzer.js +321 -0
  398. package/dist/services/edge-case-analyzer.js.map +1 -0
  399. package/dist/services/edge-case-deduplicator.js +266 -0
  400. package/dist/services/edge-case-deduplicator.js.map +1 -0
  401. package/dist/services/edge-case-detector.js +337 -0
  402. package/dist/services/edge-case-detector.js.map +1 -0
  403. package/dist/services/edge-case-tracker.js +547 -0
  404. package/dist/services/edge-case-tracker.js.map +1 -0
  405. package/dist/services/health-check-system.js +586 -0
  406. package/dist/services/health-check-system.js.map +1 -0
  407. package/dist/services/metrics-logger.js +412 -0
  408. package/dist/services/metrics-logger.js.map +1 -0
  409. package/dist/services/patch-generator.js +378 -0
  410. package/dist/services/patch-generator.js.map +1 -0
  411. package/dist/services/patch-validator.js +337 -0
  412. package/dist/services/patch-validator.js.map +1 -0
  413. package/dist/services/performance-monitor.js +811 -0
  414. package/dist/services/performance-monitor.js.map +1 -0
  415. package/dist/services/promotion-pipeline.js +918 -0
  416. package/dist/services/promotion-pipeline.js.map +1 -0
  417. package/dist/services/promotion-validator.js +394 -0
  418. package/dist/services/promotion-validator.js.map +1 -0
  419. package/dist/services/reflection-logger.js +388 -0
  420. package/dist/services/reflection-logger.js.map +1 -0
  421. package/dist/services/skill-deployment.js +472 -0
  422. package/dist/services/skill-deployment.js.map +1 -0
  423. package/dist/services/skill-loader.js +427 -0
  424. package/dist/services/skill-loader.js.map +1 -0
  425. package/dist/services/skill-promotion.js +372 -0
  426. package/dist/services/skill-promotion.js.map +1 -0
  427. package/dist/services/skill-validator.js +454 -0
  428. package/dist/services/skill-validator.js.map +1 -0
  429. package/dist/services/skill-versioning.js +244 -0
  430. package/dist/services/skill-versioning.js.map +1 -0
  431. package/dist/services/workspace-supervisor.js +597 -0
  432. package/dist/services/workspace-supervisor.js.map +1 -0
  433. package/dist/types/edge-case.js +45 -0
  434. package/dist/types/edge-case.js.map +1 -0
  435. package/package.json +201 -177
  436. package/readme/README.md +19 -4
  437. package/scripts/backup-cleanup.sh +627 -0
  438. package/scripts/cleanup-workspaces.sh +412 -0
  439. package/scripts/cleanup-yaml-configs.sh +141 -0
  440. package/scripts/deploy-approved-skills.sh +263 -0
  441. package/scripts/health-check.sh +447 -0
  442. package/scripts/log-aggregator.sh +554 -0
  443. package/scripts/log-monitor.sh +629 -0
  444. package/scripts/manage-agent-workspaces.sh +434 -0
  445. package/scripts/migrate-schema.sh +533 -0
  446. package/scripts/promote-staged-skills.sh +423 -0
  447. package/scripts/verify-no-secrets.sh +88 -35
  448. package/.claude/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +0 -161
  449. package/.claude/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +0 -728
  450. package/.claude/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +0 -131
  451. package/.claude/skills/agent-lifecycle/SKILL.md +0 -60
  452. package/.claude/skills/agent-lifecycle/execute-lifecycle-hook.sh +0 -573
  453. package/.claude/skills/agent-lifecycle/simple-audit.sh +0 -31
  454. package/.claude/skills/cfn-agent-spawning/spawn-agent.sh.backup +0 -273
  455. package/.claude/skills/cfn-loop-orchestration/orchestrate.sh.backup +0 -949
  456. package/README.md.backup_before_replace +0 -781
  457. package/claude-assets/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +0 -161
  458. package/claude-assets/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +0 -728
  459. package/claude-assets/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +0 -131
  460. package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh.backup +0 -273
  461. 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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"}