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,329 @@
1
+ /**
2
+ * Correlation Key Utilities
3
+ *
4
+ * Provides correlation key generation and parsing for cross-database lookups.
5
+ * Part of Task 0.4: Database Query Abstraction Layer (MVP)
6
+ *
7
+ * Format: {type}:{id}:{entity}:{subtype}
8
+ * Examples:
9
+ * - task:abc123:agent:backend-developer
10
+ * - task:abc123:skill:auth-validation
11
+ * - agent:agent-456:execution:iteration-1
12
+ */ /**
13
+ * Build correlation key string
14
+ */ export function buildCorrelationKey(key) {
15
+ const parts = [
16
+ key.type,
17
+ key.id
18
+ ];
19
+ if (key.entity) {
20
+ parts.push(key.entity);
21
+ }
22
+ if (key.subtype) {
23
+ parts.push(key.subtype);
24
+ }
25
+ return parts.join(':');
26
+ }
27
+ /**
28
+ * Parse correlation key string
29
+ */ export function parseCorrelationKey(keyString) {
30
+ const parts = keyString.split(':');
31
+ if (parts.length < 2) {
32
+ return null;
33
+ }
34
+ const [type, id, entity, subtype] = parts;
35
+ if (!isValidKeyType(type)) {
36
+ return null;
37
+ }
38
+ return {
39
+ type: type,
40
+ id,
41
+ entity,
42
+ subtype
43
+ };
44
+ }
45
+ /**
46
+ * Check if correlation key type is valid
47
+ */ function isValidKeyType(type) {
48
+ return [
49
+ 'task',
50
+ 'agent',
51
+ 'skill',
52
+ 'execution'
53
+ ].includes(type);
54
+ }
55
+ /**
56
+ * Build task correlation key
57
+ */ export function buildTaskKey(taskId, entity) {
58
+ return buildCorrelationKey({
59
+ type: 'task',
60
+ id: taskId,
61
+ entity
62
+ });
63
+ }
64
+ /**
65
+ * Build agent correlation key
66
+ */ export function buildAgentKey(agentId, entity) {
67
+ return buildCorrelationKey({
68
+ type: 'agent',
69
+ id: agentId,
70
+ entity
71
+ });
72
+ }
73
+ /**
74
+ * Build skill correlation key
75
+ */ export function buildSkillKey(skillId, entity) {
76
+ return buildCorrelationKey({
77
+ type: 'skill',
78
+ id: skillId,
79
+ entity
80
+ });
81
+ }
82
+ /**
83
+ * Build execution correlation key
84
+ */ export function buildExecutionKey(executionId, entity) {
85
+ return buildCorrelationKey({
86
+ type: 'execution',
87
+ id: executionId,
88
+ entity
89
+ });
90
+ }
91
+ /**
92
+ * Extract task ID from correlation key
93
+ */ export function extractTaskId(keyString) {
94
+ const key = parseCorrelationKey(keyString);
95
+ return key && key.type === 'task' ? key.id : null;
96
+ }
97
+ /**
98
+ * Extract agent ID from correlation key
99
+ */ export function extractAgentId(keyString) {
100
+ const key = parseCorrelationKey(keyString);
101
+ return key && key.type === 'agent' ? key.id : null;
102
+ }
103
+ /**
104
+ * Check if correlation key matches pattern
105
+ */ export function matchesPattern(keyString, pattern) {
106
+ const key = parseCorrelationKey(keyString);
107
+ if (!key) {
108
+ return false;
109
+ }
110
+ if (pattern.type && key.type !== pattern.type) {
111
+ return false;
112
+ }
113
+ if (pattern.id && key.id !== pattern.id) {
114
+ return false;
115
+ }
116
+ if (pattern.entity && key.entity !== pattern.entity) {
117
+ return false;
118
+ }
119
+ if (pattern.subtype && key.subtype !== pattern.subtype) {
120
+ return false;
121
+ }
122
+ return true;
123
+ }
124
+ /**
125
+ * Entity type mapping for cross-database queries
126
+ */ export const ENTITY_TYPE_MAP = {
127
+ agent: [
128
+ 'execution',
129
+ 'result',
130
+ 'metadata'
131
+ ],
132
+ skill: [
133
+ 'invocation',
134
+ 'result',
135
+ 'metadata'
136
+ ],
137
+ task: [
138
+ 'agent',
139
+ 'skill',
140
+ 'artifact',
141
+ 'event'
142
+ ],
143
+ execution: [
144
+ 'step',
145
+ 'log',
146
+ 'metric'
147
+ ]
148
+ };
149
+ /**
150
+ * Generate wildcard pattern string for Redis SCAN operations
151
+ *
152
+ * @example
153
+ * ```typescript
154
+ * buildWildcardPattern({ type: 'task', id: '*', entity: 'agent' })
155
+ * // Returns: "task:*:agent"
156
+ *
157
+ * buildWildcardPattern({ type: '*', id: 'abc123' })
158
+ * // Returns: "*:abc123"
159
+ * ```
160
+ */ export function buildWildcardPattern(pattern) {
161
+ const parts = [];
162
+ parts.push(pattern.type || '*');
163
+ parts.push(pattern.id || '*');
164
+ if (pattern.entity !== undefined) {
165
+ parts.push(pattern.entity);
166
+ }
167
+ if (pattern.subtype !== undefined) {
168
+ parts.push(pattern.subtype);
169
+ }
170
+ return parts.join(':');
171
+ }
172
+ /**
173
+ * Validate correlation key with detailed error messages
174
+ *
175
+ * @param keyString - Correlation key string to validate
176
+ * @returns Validation errors (empty array if valid)
177
+ */ export function validateCorrelationKey(keyString) {
178
+ const errors = [];
179
+ // Check for null/undefined
180
+ if (!keyString || typeof keyString !== 'string') {
181
+ errors.push({
182
+ code: 'MISSING_REQUIRED',
183
+ message: 'Correlation key must be a non-empty string',
184
+ value: String(keyString)
185
+ });
186
+ return errors;
187
+ }
188
+ // Check format (minimum 2 parts: type:id)
189
+ const parts = keyString.split(':');
190
+ if (parts.length < 2) {
191
+ errors.push({
192
+ code: 'INVALID_FORMAT',
193
+ message: 'Correlation key must have at least 2 parts (type:id)',
194
+ value: keyString
195
+ });
196
+ return errors;
197
+ }
198
+ const [type, id, entity, subtype] = parts;
199
+ // Validate type
200
+ if (![
201
+ 'task',
202
+ 'agent',
203
+ 'skill',
204
+ 'execution'
205
+ ].includes(type)) {
206
+ errors.push({
207
+ code: 'INVALID_TYPE',
208
+ message: `Invalid correlation type. Must be one of: task, agent, skill, execution`,
209
+ field: 'type',
210
+ value: type
211
+ });
212
+ }
213
+ // Validate ID (non-empty)
214
+ if (!id || id.trim() === '') {
215
+ errors.push({
216
+ code: 'MISSING_REQUIRED',
217
+ message: 'Correlation ID cannot be empty',
218
+ field: 'id',
219
+ value: id
220
+ });
221
+ }
222
+ // Validate entity (if present, check against type map)
223
+ if (entity && type && isValidKeyType(type)) {
224
+ const validEntities = ENTITY_TYPE_MAP[type];
225
+ if (validEntities && !validEntities.includes(entity)) {
226
+ errors.push({
227
+ code: 'INVALID_PATTERN',
228
+ message: `Invalid entity '${entity}' for type '${type}'. Valid entities: ${validEntities.join(', ')}`,
229
+ field: 'entity',
230
+ value: entity
231
+ });
232
+ }
233
+ }
234
+ return errors;
235
+ }
236
+ /**
237
+ * Check if correlation key is valid
238
+ *
239
+ * @param keyString - Correlation key to check
240
+ * @returns True if valid, false otherwise
241
+ */ export function isValidCorrelationKey(keyString) {
242
+ return validateCorrelationKey(keyString).length === 0;
243
+ }
244
+ /**
245
+ * Get entity types for a correlation key type
246
+ *
247
+ * @param type - Correlation key type
248
+ * @returns Array of valid entity types
249
+ */ export function getEntityTypes(type) {
250
+ return ENTITY_TYPE_MAP[type] || [];
251
+ }
252
+ /**
253
+ * Build multiple correlation keys in batch
254
+ *
255
+ * @param keys - Array of correlation key parts
256
+ * @returns Array of correlation key strings
257
+ *
258
+ * @example
259
+ * ```typescript
260
+ * buildBatch([
261
+ * { type: 'task', id: 'task-1', entity: 'agent' },
262
+ * { type: 'task', id: 'task-1', entity: 'skill' },
263
+ * ])
264
+ * // Returns: ['task:task-1:agent', 'task:task-1:skill']
265
+ * ```
266
+ */ export function buildBatch(keys) {
267
+ return keys.map(buildCorrelationKey);
268
+ }
269
+ /**
270
+ * Parse multiple correlation keys in batch
271
+ *
272
+ * @param keyStrings - Array of correlation key strings
273
+ * @returns Array of parsed correlation keys (nulls filtered out)
274
+ */ export function parseBatch(keyStrings) {
275
+ return keyStrings.map(parseCorrelationKey).filter((key)=>key !== null);
276
+ }
277
+ /**
278
+ * Match correlation key against wildcard pattern
279
+ *
280
+ * @param keyString - Correlation key to match
281
+ * @param pattern - Wildcard pattern
282
+ * @returns True if key matches pattern
283
+ *
284
+ * @example
285
+ * ```typescript
286
+ * matchesWildcard('task:abc123:agent:backend', {
287
+ * type: 'task',
288
+ * id: '*',
289
+ * entity: 'agent'
290
+ * }) // Returns: true
291
+ *
292
+ * matchesWildcard('agent:xyz:execution', {
293
+ * type: 'task'
294
+ * }) // Returns: false
295
+ * ```
296
+ */ export function matchesWildcard(keyString, pattern) {
297
+ const key = parseCorrelationKey(keyString);
298
+ if (!key) {
299
+ return false;
300
+ }
301
+ // Check type
302
+ if (pattern.type && pattern.type !== '*' && key.type !== pattern.type) {
303
+ return false;
304
+ }
305
+ // Check ID
306
+ if (pattern.id && pattern.id !== '*' && key.id !== pattern.id) {
307
+ return false;
308
+ }
309
+ // Check entity
310
+ if (pattern.entity !== undefined && pattern.entity !== '*' && key.entity !== pattern.entity) {
311
+ return false;
312
+ }
313
+ // Check subtype
314
+ if (pattern.subtype !== undefined && pattern.subtype !== '*' && key.subtype !== pattern.subtype) {
315
+ return false;
316
+ }
317
+ return true;
318
+ }
319
+ /**
320
+ * Filter correlation keys by wildcard pattern
321
+ *
322
+ * @param keyStrings - Array of correlation keys
323
+ * @param pattern - Wildcard pattern to filter by
324
+ * @returns Filtered array of keys matching pattern
325
+ */ export function filterByPattern(keyStrings, pattern) {
326
+ return keyStrings.filter((key)=>matchesWildcard(key, pattern));
327
+ }
328
+
329
+ //# sourceMappingURL=correlation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/database-service/correlation.ts"],"sourcesContent":["/**\r\n * Correlation Key Utilities\r\n *\r\n * Provides correlation key generation and parsing for cross-database lookups.\r\n * Part of Task 0.4: Database Query Abstraction Layer (MVP)\r\n *\r\n * Format: {type}:{id}:{entity}:{subtype}\r\n * Examples:\r\n * - task:abc123:agent:backend-developer\r\n * - task:abc123:skill:auth-validation\r\n * - agent:agent-456:execution:iteration-1\r\n */\r\n\r\nimport { CorrelationKey } from './types.js';\r\n\r\n/**\r\n * Build correlation key string\r\n */\r\nexport function buildCorrelationKey(key: CorrelationKey): string {\r\n const parts = [key.type, key.id];\r\n\r\n if (key.entity) {\r\n parts.push(key.entity);\r\n }\r\n\r\n if (key.subtype) {\r\n parts.push(key.subtype);\r\n }\r\n\r\n return parts.join(':');\r\n}\r\n\r\n/**\r\n * Parse correlation key string\r\n */\r\nexport function parseCorrelationKey(keyString: string): CorrelationKey | null {\r\n const parts = keyString.split(':');\r\n\r\n if (parts.length < 2) {\r\n return null;\r\n }\r\n\r\n const [type, id, entity, subtype] = parts;\r\n\r\n if (!isValidKeyType(type)) {\r\n return null;\r\n }\r\n\r\n return {\r\n type: type as CorrelationKey['type'],\r\n id,\r\n entity,\r\n subtype,\r\n };\r\n}\r\n\r\n/**\r\n * Check if correlation key type is valid\r\n */\r\nfunction isValidKeyType(type: string): type is CorrelationKey['type'] {\r\n return ['task', 'agent', 'skill', 'execution'].includes(type);\r\n}\r\n\r\n/**\r\n * Build task correlation key\r\n */\r\nexport function buildTaskKey(taskId: string, entity?: string): string {\r\n return buildCorrelationKey({\r\n type: 'task',\r\n id: taskId,\r\n entity,\r\n });\r\n}\r\n\r\n/**\r\n * Build agent correlation key\r\n */\r\nexport function buildAgentKey(agentId: string, entity?: string): string {\r\n return buildCorrelationKey({\r\n type: 'agent',\r\n id: agentId,\r\n entity,\r\n });\r\n}\r\n\r\n/**\r\n * Build skill correlation key\r\n */\r\nexport function buildSkillKey(skillId: string, entity?: string): string {\r\n return buildCorrelationKey({\r\n type: 'skill',\r\n id: skillId,\r\n entity,\r\n });\r\n}\r\n\r\n/**\r\n * Build execution correlation key\r\n */\r\nexport function buildExecutionKey(executionId: string, entity?: string): string {\r\n return buildCorrelationKey({\r\n type: 'execution',\r\n id: executionId,\r\n entity,\r\n });\r\n}\r\n\r\n/**\r\n * Extract task ID from correlation key\r\n */\r\nexport function extractTaskId(keyString: string): string | null {\r\n const key = parseCorrelationKey(keyString);\r\n return key && key.type === 'task' ? key.id : null;\r\n}\r\n\r\n/**\r\n * Extract agent ID from correlation key\r\n */\r\nexport function extractAgentId(keyString: string): string | null {\r\n const key = parseCorrelationKey(keyString);\r\n return key && key.type === 'agent' ? key.id : null;\r\n}\r\n\r\n/**\r\n * Check if correlation key matches pattern\r\n */\r\nexport function matchesPattern(keyString: string, pattern: Partial<CorrelationKey>): boolean {\r\n const key = parseCorrelationKey(keyString);\r\n\r\n if (!key) {\r\n return false;\r\n }\r\n\r\n if (pattern.type && key.type !== pattern.type) {\r\n return false;\r\n }\r\n\r\n if (pattern.id && key.id !== pattern.id) {\r\n return false;\r\n }\r\n\r\n if (pattern.entity && key.entity !== pattern.entity) {\r\n return false;\r\n }\r\n\r\n if (pattern.subtype && key.subtype !== pattern.subtype) {\r\n return false;\r\n }\r\n\r\n return true;\r\n}\r\n\r\n/**\r\n * Wildcard pattern for correlation key queries\r\n * Part of Task 3.3: Query Correlation Key Layer\r\n */\r\nexport interface WildcardPattern {\r\n type?: 'task' | 'agent' | 'skill' | 'execution' | '*';\r\n id?: string | '*';\r\n entity?: string | '*';\r\n subtype?: string | '*';\r\n}\r\n\r\n/**\r\n * Validation error details\r\n */\r\nexport interface ValidationError {\r\n code: 'INVALID_FORMAT' | 'INVALID_TYPE' | 'MISSING_REQUIRED' | 'INVALID_PATTERN';\r\n message: string;\r\n field?: string;\r\n value?: string;\r\n}\r\n\r\n/**\r\n * Entity type mapping for cross-database queries\r\n */\r\nexport const ENTITY_TYPE_MAP = {\r\n agent: ['execution', 'result', 'metadata'],\r\n skill: ['invocation', 'result', 'metadata'],\r\n task: ['agent', 'skill', 'artifact', 'event'],\r\n execution: ['step', 'log', 'metric'],\r\n} as const;\r\n\r\n/**\r\n * Generate wildcard pattern string for Redis SCAN operations\r\n *\r\n * @example\r\n * ```typescript\r\n * buildWildcardPattern({ type: 'task', id: '*', entity: 'agent' })\r\n * // Returns: \"task:*:agent\"\r\n *\r\n * buildWildcardPattern({ type: '*', id: 'abc123' })\r\n * // Returns: \"*:abc123\"\r\n * ```\r\n */\r\nexport function buildWildcardPattern(pattern: WildcardPattern): string {\r\n const parts: string[] = [];\r\n\r\n parts.push(pattern.type || '*');\r\n parts.push(pattern.id || '*');\r\n\r\n if (pattern.entity !== undefined) {\r\n parts.push(pattern.entity);\r\n }\r\n\r\n if (pattern.subtype !== undefined) {\r\n parts.push(pattern.subtype);\r\n }\r\n\r\n return parts.join(':');\r\n}\r\n\r\n/**\r\n * Validate correlation key with detailed error messages\r\n *\r\n * @param keyString - Correlation key string to validate\r\n * @returns Validation errors (empty array if valid)\r\n */\r\nexport function validateCorrelationKey(keyString: string): ValidationError[] {\r\n const errors: ValidationError[] = [];\r\n\r\n // Check for null/undefined\r\n if (!keyString || typeof keyString !== 'string') {\r\n errors.push({\r\n code: 'MISSING_REQUIRED',\r\n message: 'Correlation key must be a non-empty string',\r\n value: String(keyString),\r\n });\r\n return errors;\r\n }\r\n\r\n // Check format (minimum 2 parts: type:id)\r\n const parts = keyString.split(':');\r\n if (parts.length < 2) {\r\n errors.push({\r\n code: 'INVALID_FORMAT',\r\n message: 'Correlation key must have at least 2 parts (type:id)',\r\n value: keyString,\r\n });\r\n return errors;\r\n }\r\n\r\n const [type, id, entity, subtype] = parts;\r\n\r\n // Validate type\r\n if (!['task', 'agent', 'skill', 'execution'].includes(type)) {\r\n errors.push({\r\n code: 'INVALID_TYPE',\r\n message: `Invalid correlation type. Must be one of: task, agent, skill, execution`,\r\n field: 'type',\r\n value: type,\r\n });\r\n }\r\n\r\n // Validate ID (non-empty)\r\n if (!id || id.trim() === '') {\r\n errors.push({\r\n code: 'MISSING_REQUIRED',\r\n message: 'Correlation ID cannot be empty',\r\n field: 'id',\r\n value: id,\r\n });\r\n }\r\n\r\n // Validate entity (if present, check against type map)\r\n if (entity && type && isValidKeyType(type)) {\r\n const validEntities = ENTITY_TYPE_MAP[type];\r\n if (validEntities && !validEntities.includes(entity as any)) {\r\n errors.push({\r\n code: 'INVALID_PATTERN',\r\n message: `Invalid entity '${entity}' for type '${type}'. Valid entities: ${validEntities.join(', ')}`,\r\n field: 'entity',\r\n value: entity,\r\n });\r\n }\r\n }\r\n\r\n return errors;\r\n}\r\n\r\n/**\r\n * Check if correlation key is valid\r\n *\r\n * @param keyString - Correlation key to check\r\n * @returns True if valid, false otherwise\r\n */\r\nexport function isValidCorrelationKey(keyString: string): boolean {\r\n return validateCorrelationKey(keyString).length === 0;\r\n}\r\n\r\n/**\r\n * Get entity types for a correlation key type\r\n *\r\n * @param type - Correlation key type\r\n * @returns Array of valid entity types\r\n */\r\nexport function getEntityTypes(type: CorrelationKey['type']): readonly string[] {\r\n return ENTITY_TYPE_MAP[type] || [];\r\n}\r\n\r\n/**\r\n * Build multiple correlation keys in batch\r\n *\r\n * @param keys - Array of correlation key parts\r\n * @returns Array of correlation key strings\r\n *\r\n * @example\r\n * ```typescript\r\n * buildBatch([\r\n * { type: 'task', id: 'task-1', entity: 'agent' },\r\n * { type: 'task', id: 'task-1', entity: 'skill' },\r\n * ])\r\n * // Returns: ['task:task-1:agent', 'task:task-1:skill']\r\n * ```\r\n */\r\nexport function buildBatch(keys: CorrelationKey[]): string[] {\r\n return keys.map(buildCorrelationKey);\r\n}\r\n\r\n/**\r\n * Parse multiple correlation keys in batch\r\n *\r\n * @param keyStrings - Array of correlation key strings\r\n * @returns Array of parsed correlation keys (nulls filtered out)\r\n */\r\nexport function parseBatch(keyStrings: string[]): CorrelationKey[] {\r\n return keyStrings\r\n .map(parseCorrelationKey)\r\n .filter((key): key is CorrelationKey => key !== null);\r\n}\r\n\r\n/**\r\n * Match correlation key against wildcard pattern\r\n *\r\n * @param keyString - Correlation key to match\r\n * @param pattern - Wildcard pattern\r\n * @returns True if key matches pattern\r\n *\r\n * @example\r\n * ```typescript\r\n * matchesWildcard('task:abc123:agent:backend', {\r\n * type: 'task',\r\n * id: '*',\r\n * entity: 'agent'\r\n * }) // Returns: true\r\n *\r\n * matchesWildcard('agent:xyz:execution', {\r\n * type: 'task'\r\n * }) // Returns: false\r\n * ```\r\n */\r\nexport function matchesWildcard(keyString: string, pattern: WildcardPattern): boolean {\r\n const key = parseCorrelationKey(keyString);\r\n\r\n if (!key) {\r\n return false;\r\n }\r\n\r\n // Check type\r\n if (pattern.type && pattern.type !== '*' && key.type !== pattern.type) {\r\n return false;\r\n }\r\n\r\n // Check ID\r\n if (pattern.id && pattern.id !== '*' && key.id !== pattern.id) {\r\n return false;\r\n }\r\n\r\n // Check entity\r\n if (pattern.entity !== undefined && pattern.entity !== '*' && key.entity !== pattern.entity) {\r\n return false;\r\n }\r\n\r\n // Check subtype\r\n if (pattern.subtype !== undefined && pattern.subtype !== '*' && key.subtype !== pattern.subtype) {\r\n return false;\r\n }\r\n\r\n return true;\r\n}\r\n\r\n/**\r\n * Filter correlation keys by wildcard pattern\r\n *\r\n * @param keyStrings - Array of correlation keys\r\n * @param pattern - Wildcard pattern to filter by\r\n * @returns Filtered array of keys matching pattern\r\n */\r\nexport function filterByPattern(keyStrings: string[], pattern: WildcardPattern): string[] {\r\n return keyStrings.filter(key => matchesWildcard(key, pattern));\r\n}\r\n"],"names":["buildCorrelationKey","key","parts","type","id","entity","push","subtype","join","parseCorrelationKey","keyString","split","length","isValidKeyType","includes","buildTaskKey","taskId","buildAgentKey","agentId","buildSkillKey","skillId","buildExecutionKey","executionId","extractTaskId","extractAgentId","matchesPattern","pattern","ENTITY_TYPE_MAP","agent","skill","task","execution","buildWildcardPattern","undefined","validateCorrelationKey","errors","code","message","value","String","field","trim","validEntities","isValidCorrelationKey","getEntityTypes","buildBatch","keys","map","parseBatch","keyStrings","filter","matchesWildcard","filterByPattern"],"mappings":"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"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Database Error Handling Utilities
3
+ *
4
+ * Provides standardized error handling for database operations.
5
+ * Part of Task 0.4: Database Query Abstraction Layer (MVP)
6
+ */ /**
7
+ * Database error codes
8
+ */ export var DatabaseErrorCode = /*#__PURE__*/ function(DatabaseErrorCode) {
9
+ DatabaseErrorCode["CONNECTION_FAILED"] = "DB_CONNECTION_FAILED";
10
+ DatabaseErrorCode["QUERY_FAILED"] = "DB_QUERY_FAILED";
11
+ DatabaseErrorCode["TRANSACTION_FAILED"] = "DB_TRANSACTION_FAILED";
12
+ DatabaseErrorCode["VALIDATION_FAILED"] = "DB_VALIDATION_FAILED";
13
+ DatabaseErrorCode["NOT_FOUND"] = "DB_NOT_FOUND";
14
+ DatabaseErrorCode["DUPLICATE_KEY"] = "DB_DUPLICATE_KEY";
15
+ DatabaseErrorCode["TIMEOUT"] = "DB_TIMEOUT";
16
+ DatabaseErrorCode["CONSTRAINT_VIOLATION"] = "DB_CONSTRAINT_VIOLATION";
17
+ DatabaseErrorCode["UNKNOWN_ERROR"] = "DB_UNKNOWN_ERROR";
18
+ return DatabaseErrorCode;
19
+ }({});
20
+ /**
21
+ * Create standardized database error
22
+ */ export function createDatabaseError(code, message, originalError, context) {
23
+ return {
24
+ code,
25
+ message,
26
+ originalError,
27
+ context
28
+ };
29
+ }
30
+ /**
31
+ * Create failed operation result
32
+ */ export function createFailedResult(error) {
33
+ return {
34
+ success: false,
35
+ error
36
+ };
37
+ }
38
+ /**
39
+ * Create successful operation result
40
+ */ export function createSuccessResult(data, rowsAffected, insertId) {
41
+ return {
42
+ success: true,
43
+ data,
44
+ rowsAffected,
45
+ insertId
46
+ };
47
+ }
48
+ /**
49
+ * Wrap database operation with error handling
50
+ */ export async function wrapDatabaseOperation(operation, errorCode, errorMessage, context) {
51
+ try {
52
+ const data = await operation();
53
+ return createSuccessResult(data);
54
+ } catch (err) {
55
+ const error = createDatabaseError(errorCode, errorMessage, err instanceof Error ? err : new Error(String(err)), context);
56
+ return createFailedResult(error);
57
+ }
58
+ }
59
+ /**
60
+ * Check if error is a specific database error code
61
+ */ export function isDatabaseError(error, code) {
62
+ return error && typeof error === 'object' && error.code === code;
63
+ }
64
+ /**
65
+ * Map SQLite error to database error code
66
+ */ export function mapSQLiteError(error) {
67
+ const message = error.message.toLowerCase();
68
+ if (message.includes('unique constraint')) {
69
+ return "DB_DUPLICATE_KEY";
70
+ }
71
+ if (message.includes('foreign key constraint')) {
72
+ return "DB_CONSTRAINT_VIOLATION";
73
+ }
74
+ if (message.includes('not found')) {
75
+ return "DB_NOT_FOUND";
76
+ }
77
+ if (message.includes('timeout')) {
78
+ return "DB_TIMEOUT";
79
+ }
80
+ return "DB_QUERY_FAILED";
81
+ }
82
+ /**
83
+ * Map PostgreSQL error to database error code
84
+ */ export function mapPostgresError(error) {
85
+ const code = error.code;
86
+ // PostgreSQL error codes
87
+ if (code === '23505') {
88
+ return "DB_DUPLICATE_KEY";
89
+ }
90
+ if (code === '23503') {
91
+ return "DB_CONSTRAINT_VIOLATION";
92
+ }
93
+ if (code === '42P01') {
94
+ return "DB_NOT_FOUND";
95
+ }
96
+ if (code === '57014') {
97
+ return "DB_TIMEOUT";
98
+ }
99
+ if (code?.startsWith('08')) {
100
+ return "DB_CONNECTION_FAILED";
101
+ }
102
+ return "DB_QUERY_FAILED";
103
+ }
104
+ /**
105
+ * Map Redis error to database error code
106
+ */ export function mapRedisError(error) {
107
+ const message = error.message.toLowerCase();
108
+ if (message.includes('connection')) {
109
+ return "DB_CONNECTION_FAILED";
110
+ }
111
+ if (message.includes('timeout')) {
112
+ return "DB_TIMEOUT";
113
+ }
114
+ if (message.includes('not found') || message.includes('nil')) {
115
+ return "DB_NOT_FOUND";
116
+ }
117
+ return "DB_QUERY_FAILED";
118
+ }
119
+
120
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/database-service/errors.ts"],"sourcesContent":["/**\r\n * Database Error Handling Utilities\r\n *\r\n * Provides standardized error handling for database operations.\r\n * Part of Task 0.4: Database Query Abstraction Layer (MVP)\r\n */\r\n\r\nimport { DatabaseError, OperationResult } from './types.js';\r\n\r\n/**\r\n * Database error codes\r\n */\r\nexport enum DatabaseErrorCode {\r\n CONNECTION_FAILED = 'DB_CONNECTION_FAILED',\r\n QUERY_FAILED = 'DB_QUERY_FAILED',\r\n TRANSACTION_FAILED = 'DB_TRANSACTION_FAILED',\r\n VALIDATION_FAILED = 'DB_VALIDATION_FAILED',\r\n NOT_FOUND = 'DB_NOT_FOUND',\r\n DUPLICATE_KEY = 'DB_DUPLICATE_KEY',\r\n TIMEOUT = 'DB_TIMEOUT',\r\n CONSTRAINT_VIOLATION = 'DB_CONSTRAINT_VIOLATION',\r\n UNKNOWN_ERROR = 'DB_UNKNOWN_ERROR',\r\n}\r\n\r\n/**\r\n * Create standardized database error\r\n */\r\nexport function createDatabaseError(\r\n code: DatabaseErrorCode,\r\n message: string,\r\n originalError?: Error,\r\n context?: Record<string, any>\r\n): DatabaseError {\r\n return {\r\n code,\r\n message,\r\n originalError,\r\n context,\r\n };\r\n}\r\n\r\n/**\r\n * Create failed operation result\r\n */\r\nexport function createFailedResult<T = any>(error: DatabaseError): OperationResult<T> {\r\n return {\r\n success: false,\r\n error,\r\n };\r\n}\r\n\r\n/**\r\n * Create successful operation result\r\n */\r\nexport function createSuccessResult<T = any>(\r\n data?: T,\r\n rowsAffected?: number,\r\n insertId?: string | number\r\n): OperationResult<T> {\r\n return {\r\n success: true,\r\n data,\r\n rowsAffected,\r\n insertId,\r\n };\r\n}\r\n\r\n/**\r\n * Wrap database operation with error handling\r\n */\r\nexport async function wrapDatabaseOperation<T>(\r\n operation: () => Promise<T>,\r\n errorCode: DatabaseErrorCode,\r\n errorMessage: string,\r\n context?: Record<string, any>\r\n): Promise<OperationResult<T>> {\r\n try {\r\n const data = await operation();\r\n return createSuccessResult(data);\r\n } catch (err) {\r\n const error = createDatabaseError(\r\n errorCode,\r\n errorMessage,\r\n err instanceof Error ? err : new Error(String(err)),\r\n context\r\n );\r\n return createFailedResult(error);\r\n }\r\n}\r\n\r\n/**\r\n * Check if error is a specific database error code\r\n */\r\nexport function isDatabaseError(error: any, code: DatabaseErrorCode): boolean {\r\n return error && typeof error === 'object' && error.code === code;\r\n}\r\n\r\n/**\r\n * Map SQLite error to database error code\r\n */\r\nexport function mapSQLiteError(error: Error): DatabaseErrorCode {\r\n const message = error.message.toLowerCase();\r\n\r\n if (message.includes('unique constraint')) {\r\n return DatabaseErrorCode.DUPLICATE_KEY;\r\n }\r\n if (message.includes('foreign key constraint')) {\r\n return DatabaseErrorCode.CONSTRAINT_VIOLATION;\r\n }\r\n if (message.includes('not found')) {\r\n return DatabaseErrorCode.NOT_FOUND;\r\n }\r\n if (message.includes('timeout')) {\r\n return DatabaseErrorCode.TIMEOUT;\r\n }\r\n\r\n return DatabaseErrorCode.QUERY_FAILED;\r\n}\r\n\r\n/**\r\n * Map PostgreSQL error to database error code\r\n */\r\nexport function mapPostgresError(error: any): DatabaseErrorCode {\r\n const code = error.code;\r\n\r\n // PostgreSQL error codes\r\n if (code === '23505') {\r\n return DatabaseErrorCode.DUPLICATE_KEY;\r\n }\r\n if (code === '23503') {\r\n return DatabaseErrorCode.CONSTRAINT_VIOLATION;\r\n }\r\n if (code === '42P01') {\r\n return DatabaseErrorCode.NOT_FOUND;\r\n }\r\n if (code === '57014') {\r\n return DatabaseErrorCode.TIMEOUT;\r\n }\r\n if (code?.startsWith('08')) {\r\n return DatabaseErrorCode.CONNECTION_FAILED;\r\n }\r\n\r\n return DatabaseErrorCode.QUERY_FAILED;\r\n}\r\n\r\n/**\r\n * Map Redis error to database error code\r\n */\r\nexport function mapRedisError(error: Error): DatabaseErrorCode {\r\n const message = error.message.toLowerCase();\r\n\r\n if (message.includes('connection')) {\r\n return DatabaseErrorCode.CONNECTION_FAILED;\r\n }\r\n if (message.includes('timeout')) {\r\n return DatabaseErrorCode.TIMEOUT;\r\n }\r\n if (message.includes('not found') || message.includes('nil')) {\r\n return DatabaseErrorCode.NOT_FOUND;\r\n }\r\n\r\n return DatabaseErrorCode.QUERY_FAILED;\r\n}\r\n"],"names":["DatabaseErrorCode","createDatabaseError","code","message","originalError","context","createFailedResult","error","success","createSuccessResult","data","rowsAffected","insertId","wrapDatabaseOperation","operation","errorCode","errorMessage","err","Error","String","isDatabaseError","mapSQLiteError","toLowerCase","includes","mapPostgresError","startsWith","mapRedisError"],"mappings":"AAAA;;;;;CAKC,GAID;;CAEC,GACD,OAAO,IAAA,AAAKA,2CAAAA;;;;;;;;;;WAAAA;MAUX;AAED;;CAEC,GACD,OAAO,SAASC,oBACdC,IAAuB,EACvBC,OAAe,EACfC,aAAqB,EACrBC,OAA6B;IAE7B,OAAO;QACLH;QACAC;QACAC;QACAC;IACF;AACF;AAEA;;CAEC,GACD,OAAO,SAASC,mBAA4BC,KAAoB;IAC9D,OAAO;QACLC,SAAS;QACTD;IACF;AACF;AAEA;;CAEC,GACD,OAAO,SAASE,oBACdC,IAAQ,EACRC,YAAqB,EACrBC,QAA0B;IAE1B,OAAO;QACLJ,SAAS;QACTE;QACAC;QACAC;IACF;AACF;AAEA;;CAEC,GACD,OAAO,eAAeC,sBACpBC,SAA2B,EAC3BC,SAA4B,EAC5BC,YAAoB,EACpBX,OAA6B;IAE7B,IAAI;QACF,MAAMK,OAAO,MAAMI;QACnB,OAAOL,oBAAoBC;IAC7B,EAAE,OAAOO,KAAK;QACZ,MAAMV,QAAQN,oBACZc,WACAC,cACAC,eAAeC,QAAQD,MAAM,IAAIC,MAAMC,OAAOF,OAC9CZ;QAEF,OAAOC,mBAAmBC;IAC5B;AACF;AAEA;;CAEC,GACD,OAAO,SAASa,gBAAgBb,KAAU,EAAEL,IAAuB;IACjE,OAAOK,SAAS,OAAOA,UAAU,YAAYA,MAAML,IAAI,KAAKA;AAC9D;AAEA;;CAEC,GACD,OAAO,SAASmB,eAAed,KAAY;IACzC,MAAMJ,UAAUI,MAAMJ,OAAO,CAACmB,WAAW;IAEzC,IAAInB,QAAQoB,QAAQ,CAAC,sBAAsB;QACzC;IACF;IACA,IAAIpB,QAAQoB,QAAQ,CAAC,2BAA2B;QAC9C;IACF;IACA,IAAIpB,QAAQoB,QAAQ,CAAC,cAAc;QACjC;IACF;IACA,IAAIpB,QAAQoB,QAAQ,CAAC,YAAY;QAC/B;IACF;IAEA;AACF;AAEA;;CAEC,GACD,OAAO,SAASC,iBAAiBjB,KAAU;IACzC,MAAML,OAAOK,MAAML,IAAI;IAEvB,yBAAyB;IACzB,IAAIA,SAAS,SAAS;QACpB;IACF;IACA,IAAIA,SAAS,SAAS;QACpB;IACF;IACA,IAAIA,SAAS,SAAS;QACpB;IACF;IACA,IAAIA,SAAS,SAAS;QACpB;IACF;IACA,IAAIA,MAAMuB,WAAW,OAAO;QAC1B;IACF;IAEA;AACF;AAEA;;CAEC,GACD,OAAO,SAASC,cAAcnB,KAAY;IACxC,MAAMJ,UAAUI,MAAMJ,OAAO,CAACmB,WAAW;IAEzC,IAAInB,QAAQoB,QAAQ,CAAC,eAAe;QAClC;IACF;IACA,IAAIpB,QAAQoB,QAAQ,CAAC,YAAY;QAC/B;IACF;IACA,IAAIpB,QAAQoB,QAAQ,CAAC,gBAAgBpB,QAAQoB,QAAQ,CAAC,QAAQ;QAC5D;IACF;IAEA;AACF"}
@@ -0,0 +1,168 @@
1
+ /**
2
+ * Database Service - Main Entry Point
3
+ *
4
+ * Unified database abstraction layer for Redis, SQLite, and PostgreSQL.
5
+ * Part of Task 0.4: Database Query Abstraction Layer (MVP)
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * const dbService = new DatabaseService({
10
+ * redis: { type: 'redis', host: 'localhost', port: 6379 },
11
+ * sqlite: { type: 'sqlite', database: './data.db' },
12
+ * postgres: { type: 'postgres', connectionString: 'postgresql://...' }
13
+ * });
14
+ *
15
+ * await dbService.connect();
16
+ *
17
+ * // Get data by correlation key across all databases
18
+ * const data = await dbService.getByCorrelationKey({
19
+ * type: 'task',
20
+ * id: 'abc123',
21
+ * entity: 'agent'
22
+ * });
23
+ * ```
24
+ */ import { RedisAdapter } from './redis-adapter.js';
25
+ import { SQLiteAdapter } from './sqlite-adapter.js';
26
+ import { PostgresAdapter } from './postgres-adapter.js';
27
+ import { TransactionManager } from './transaction-manager.js';
28
+ import { buildCorrelationKey, parseCorrelationKey, buildTaskKey, buildAgentKey, buildSkillKey, buildExecutionKey } from './correlation.js';
29
+ import { DatabaseErrorCode, createDatabaseError } from './errors.js';
30
+ export class DatabaseService {
31
+ adapters = new Map();
32
+ transactionManager;
33
+ config;
34
+ constructor(config){
35
+ this.config = config;
36
+ this.transactionManager = new TransactionManager();
37
+ // Initialize adapters
38
+ if (config.redis) {
39
+ this.adapters.set('redis', new RedisAdapter(config.redis));
40
+ }
41
+ if (config.sqlite) {
42
+ this.adapters.set('sqlite', new SQLiteAdapter(config.sqlite));
43
+ }
44
+ if (config.postgres) {
45
+ this.adapters.set('postgres', new PostgresAdapter(config.postgres));
46
+ }
47
+ }
48
+ /**
49
+ * Connect to all configured databases
50
+ */ async connect() {
51
+ const promises = Array.from(this.adapters.values()).map((adapter)=>adapter.connect());
52
+ await Promise.all(promises);
53
+ }
54
+ /**
55
+ * Disconnect from all databases
56
+ */ async disconnect() {
57
+ const promises = Array.from(this.adapters.values()).map((adapter)=>adapter.disconnect());
58
+ await Promise.all(promises);
59
+ }
60
+ /**
61
+ * Get adapter for specific database
62
+ */ getAdapter(type) {
63
+ const adapter = this.adapters.get(type);
64
+ if (!adapter) {
65
+ throw createDatabaseError(DatabaseErrorCode.CONNECTION_FAILED, `Database adapter not configured: ${type}`, undefined, {
66
+ type
67
+ });
68
+ }
69
+ return adapter;
70
+ }
71
+ /**
72
+ * Get record by correlation key across all databases
73
+ */ async getByCorrelationKey(key) {
74
+ const correlationKeyString = buildCorrelationKey(key);
75
+ const result = {
76
+ correlationKey: correlationKeyString,
77
+ timestamp: new Date()
78
+ };
79
+ // Query each database in parallel
80
+ const promises = [];
81
+ if (this.adapters.has('redis')) {
82
+ promises.push(this.adapters.get('redis').get(correlationKeyString).then((data)=>{
83
+ if (data !== null && data !== undefined) result.redis = data;
84
+ }).catch((err)=>console.warn('Redis lookup failed:', err)));
85
+ }
86
+ if (this.adapters.has('sqlite')) {
87
+ promises.push(this.adapters.get('sqlite').get(correlationKeyString).then((data)=>{
88
+ if (data !== null && data !== undefined) result.sqlite = data;
89
+ }).catch((err)=>console.warn('SQLite lookup failed:', err)));
90
+ }
91
+ if (this.adapters.has('postgres')) {
92
+ promises.push(this.adapters.get('postgres').get(correlationKeyString).then((data)=>{
93
+ if (data !== null && data !== undefined) result.postgres = data;
94
+ }).catch((err)=>console.warn('PostgreSQL lookup failed:', err)));
95
+ }
96
+ await Promise.all(promises);
97
+ return result;
98
+ }
99
+ /**
100
+ * Execute cross-database transaction
101
+ */ async executeTransaction(operations) {
102
+ const adapters = operations.map((op)=>this.getAdapter(op.database));
103
+ const ops = operations.map((op)=>op.operation);
104
+ return this.transactionManager.executeTransaction(adapters, ops);
105
+ }
106
+ /**
107
+ * Build correlation key
108
+ */ buildCorrelationKey(key) {
109
+ return buildCorrelationKey(key);
110
+ }
111
+ /**
112
+ * Parse correlation key
113
+ */ parseCorrelationKey(key) {
114
+ return parseCorrelationKey(key);
115
+ }
116
+ /**
117
+ * Get transaction manager
118
+ */ getTransactionManager() {
119
+ return this.transactionManager;
120
+ }
121
+ /**
122
+ * Check if all configured databases are connected
123
+ */ isConnected() {
124
+ return Array.from(this.adapters.values()).every((adapter)=>adapter.isConnected());
125
+ }
126
+ /**
127
+ * Get database statistics including connection pool metrics
128
+ */ getStats() {
129
+ const poolStats = {};
130
+ // Get pool stats from each adapter
131
+ if (this.adapters.has('redis')) {
132
+ const adapter = this.adapters.get('redis');
133
+ poolStats.redis = adapter.getPoolStats?.();
134
+ }
135
+ if (this.adapters.has('sqlite')) {
136
+ const adapter = this.adapters.get('sqlite');
137
+ poolStats.sqlite = adapter.getPoolStats?.();
138
+ }
139
+ if (this.adapters.has('postgres')) {
140
+ const adapter = this.adapters.get('postgres');
141
+ poolStats.postgres = adapter.getPoolStats?.();
142
+ }
143
+ return {
144
+ adapters: {
145
+ redis: this.adapters.has('redis') && this.adapters.get('redis').isConnected(),
146
+ sqlite: this.adapters.has('sqlite') && this.adapters.get('sqlite').isConnected(),
147
+ postgres: this.adapters.has('postgres') && this.adapters.get('postgres').isConnected()
148
+ },
149
+ transactions: {
150
+ active: this.transactionManager.getActiveCount()
151
+ },
152
+ connectionPools: poolStats
153
+ };
154
+ }
155
+ }
156
+ // Re-export types and utilities
157
+ export * from './types.js';
158
+ export * from './errors.js';
159
+ export * from './correlation.js';
160
+ export { RedisAdapter } from './redis-adapter.js';
161
+ export { SQLiteAdapter } from './sqlite-adapter.js';
162
+ export { PostgresAdapter } from './postgres-adapter.js';
163
+ export { TransactionManager } from './transaction-manager.js';
164
+ export { ConnectionPoolManager } from './connection-pool-manager.js';
165
+ // Re-export correlation utilities
166
+ export { buildTaskKey, buildAgentKey, buildSkillKey, buildExecutionKey };
167
+
168
+ //# sourceMappingURL=index.js.map