claude-flow-novice 2.15.3 → 2.15.5

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 (473) 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 +29 -6
  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 +238 -29
  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 +6 -2
  55. package/.claude/skills/cfn-redis-coordination/redis-cli-wrapper.sh +24 -3
  56. package/.claude/skills/cfn-redis-coordination/redis-functions.sh +34 -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 +29 -6
  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 +238 -29
  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 +6 -2
  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 +34 -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/task-agent-integration.js +1 -1
  246. package/dist/agents/task-agent-integration.js.map +1 -1
  247. package/dist/api/health-endpoints.js +390 -0
  248. package/dist/api/health-endpoints.js.map +1 -0
  249. package/dist/cli/agent-executor.js +4 -1
  250. package/dist/cli/agent-executor.js.map +1 -1
  251. package/dist/cli/agent-prompt-builder.js +89 -1
  252. package/dist/cli/agent-prompt-builder.js.map +1 -1
  253. package/dist/cli/agent-spawn.js +130 -37
  254. package/dist/cli/agent-spawn.js.map +1 -1
  255. package/dist/cli/config-manager.js +109 -91
  256. package/dist/cli/config-manager.js.map +1 -1
  257. package/dist/cli/conversation-fork-cleanup.js +201 -0
  258. package/dist/cli/conversation-fork-cleanup.js.map +1 -0
  259. package/dist/cli/conversation-fork.js +16 -3
  260. package/dist/cli/conversation-fork.js.map +1 -1
  261. package/dist/cli/skill-cache-validator.js +412 -0
  262. package/dist/cli/skill-cache-validator.js.map +1 -0
  263. package/dist/cli/skill-cli.js +991 -0
  264. package/dist/cli/skill-cli.js.map +1 -0
  265. package/dist/cli/skill-execution-logger.js +284 -0
  266. package/dist/cli/skill-execution-logger.js.map +1 -0
  267. package/dist/cli/skill-loader.js +457 -0
  268. package/dist/cli/skill-loader.js.map +1 -0
  269. package/dist/coordination/event-bus.js +2 -2
  270. package/dist/coordination/event-bus.js.map +1 -1
  271. package/dist/coordination/fleet-manager.js +1 -1
  272. package/dist/coordination/fleet-manager.js.map +1 -1
  273. package/dist/coordination/index.js +23 -9
  274. package/dist/coordination/index.js.map +1 -1
  275. package/dist/coordination/types/fleet-manager.types.js.map +1 -1
  276. package/dist/db/migration-manager.js +483 -0
  277. package/dist/db/migration-manager.js.map +1 -0
  278. package/dist/db/skills-query.js +535 -0
  279. package/dist/db/skills-query.js.map +1 -0
  280. package/dist/integration/DatabaseHandoff.js +1 -1
  281. package/dist/integration/DatabaseHandoff.js.map +1 -1
  282. package/dist/jobs/edge-case-analyzer.js +367 -0
  283. package/dist/jobs/edge-case-analyzer.js.map +1 -0
  284. package/dist/jobs/promotion-sla-enforcer.js +288 -0
  285. package/dist/jobs/promotion-sla-enforcer.js.map +1 -0
  286. package/dist/lib/agent-output-parser.js.map +1 -1
  287. package/dist/lib/agent-output-validator.js.map +1 -1
  288. package/dist/lib/agent-workspace.js +281 -0
  289. package/dist/lib/agent-workspace.js.map +1 -0
  290. package/dist/lib/atomic-file-writer.js +377 -0
  291. package/dist/lib/atomic-file-writer.js.map +1 -0
  292. package/dist/lib/backup-manager.js +779 -0
  293. package/dist/lib/backup-manager.js.map +1 -0
  294. package/dist/lib/checkpoint-manager.js +837 -0
  295. package/dist/lib/checkpoint-manager.js.map +1 -0
  296. package/dist/lib/circuit-breaker.js +340 -0
  297. package/dist/lib/circuit-breaker.js.map +1 -0
  298. package/dist/lib/completion-signal-handler.js +243 -0
  299. package/dist/lib/completion-signal-handler.js.map +1 -0
  300. package/dist/lib/config-manager.js +312 -0
  301. package/dist/lib/config-manager.js.map +1 -0
  302. package/dist/lib/config-migrator.js +386 -0
  303. package/dist/lib/config-migrator.js.map +1 -0
  304. package/dist/lib/config-validator.js.map +1 -1
  305. package/dist/lib/correlation-cache.js +311 -0
  306. package/dist/lib/correlation-cache.js.map +1 -0
  307. package/dist/lib/correlation.js +263 -0
  308. package/dist/lib/correlation.js.map +1 -0
  309. package/dist/lib/database-service/connection-pool-manager.js +520 -0
  310. package/dist/lib/database-service/connection-pool-manager.js.map +1 -0
  311. package/dist/lib/database-service/correlation.js +329 -0
  312. package/dist/lib/database-service/correlation.js.map +1 -0
  313. package/dist/lib/database-service/errors.js +120 -0
  314. package/dist/lib/database-service/errors.js.map +1 -0
  315. package/dist/lib/database-service/index.js +168 -0
  316. package/dist/lib/database-service/index.js.map +1 -0
  317. package/dist/lib/database-service/postgres-adapter.js +526 -0
  318. package/dist/lib/database-service/postgres-adapter.js.map +1 -0
  319. package/dist/lib/database-service/redis-adapter.js +360 -0
  320. package/dist/lib/database-service/redis-adapter.js.map +1 -0
  321. package/dist/lib/database-service/sqlite-adapter.js +544 -0
  322. package/dist/lib/database-service/sqlite-adapter.js.map +1 -0
  323. package/dist/lib/database-service/transaction-manager.js +773 -0
  324. package/dist/lib/database-service/transaction-manager.js.map +1 -0
  325. package/dist/lib/database-service/types.js +23 -0
  326. package/dist/lib/database-service/types.js.map +1 -0
  327. package/dist/lib/deadlock-resolver.js +292 -0
  328. package/dist/lib/deadlock-resolver.js.map +1 -0
  329. package/dist/lib/distributed-lock.js +451 -0
  330. package/dist/lib/distributed-lock.js.map +1 -0
  331. package/dist/lib/edge-case-deduplicator.js +227 -0
  332. package/dist/lib/edge-case-deduplicator.js.map +1 -0
  333. package/dist/lib/encryption-manager.js +322 -0
  334. package/dist/lib/encryption-manager.js.map +1 -0
  335. package/dist/lib/error-aggregator.js +234 -0
  336. package/dist/lib/error-aggregator.js.map +1 -0
  337. package/dist/lib/errors.js +287 -0
  338. package/dist/lib/errors.js.map +1 -0
  339. package/dist/lib/file-lock-manager.js +578 -0
  340. package/dist/lib/file-lock-manager.js.map +1 -0
  341. package/dist/lib/file-operations.js +367 -0
  342. package/dist/lib/file-operations.js.map +1 -0
  343. package/dist/lib/idempotent-write.js +237 -0
  344. package/dist/lib/idempotent-write.js.map +1 -0
  345. package/dist/lib/integration-schema-validator.js +522 -0
  346. package/dist/lib/integration-schema-validator.js.map +1 -0
  347. package/dist/lib/lock-health-monitor.js +298 -0
  348. package/dist/lib/lock-health-monitor.js.map +1 -0
  349. package/dist/lib/log-shipper.js +422 -0
  350. package/dist/lib/log-shipper.js.map +1 -0
  351. package/dist/lib/logging.js +146 -0
  352. package/dist/lib/logging.js.map +1 -0
  353. package/dist/lib/message-deduplicator.js +439 -0
  354. package/dist/lib/message-deduplicator.js.map +1 -0
  355. package/dist/lib/multi-system-query.js +604 -0
  356. package/dist/lib/multi-system-query.js.map +1 -0
  357. package/dist/lib/orphan-detector.js +332 -0
  358. package/dist/lib/orphan-detector.js.map +1 -0
  359. package/dist/lib/password-generator.js +166 -0
  360. package/dist/lib/password-generator.js.map +1 -0
  361. package/dist/lib/path-validator.js +429 -0
  362. package/dist/lib/path-validator.js.map +1 -0
  363. package/dist/lib/query-translator.js +905 -0
  364. package/dist/lib/query-translator.js.map +1 -0
  365. package/dist/lib/queue-recovery.js +469 -0
  366. package/dist/lib/queue-recovery.js.map +1 -0
  367. package/dist/lib/redis-queue-manager.js +512 -0
  368. package/dist/lib/redis-queue-manager.js.map +1 -0
  369. package/dist/lib/reflection-archiver.js +272 -0
  370. package/dist/lib/reflection-archiver.js.map +1 -0
  371. package/dist/lib/retry-manager.js +453 -0
  372. package/dist/lib/retry-manager.js.map +1 -0
  373. package/dist/lib/retry.js +262 -0
  374. package/dist/lib/retry.js.map +1 -0
  375. package/dist/lib/schema-transform.js +695 -0
  376. package/dist/lib/schema-transform.js.map +1 -0
  377. package/dist/lib/schema-validator.js +491 -0
  378. package/dist/lib/schema-validator.js.map +1 -0
  379. package/dist/lib/skill-cache.js +297 -0
  380. package/dist/lib/skill-cache.js.map +1 -0
  381. package/dist/lib/skill-content-manager.js +337 -0
  382. package/dist/lib/skill-content-manager.js.map +1 -0
  383. package/dist/lib/skill-frontmatter-parser.js +237 -0
  384. package/dist/lib/skill-frontmatter-parser.js.map +1 -0
  385. package/dist/lib/skill-git-integration.js +275 -0
  386. package/dist/lib/skill-git-integration.js.map +1 -0
  387. package/dist/lib/skill-markdown-validator.js +396 -0
  388. package/dist/lib/skill-markdown-validator.js.map +1 -0
  389. package/dist/lib/skill-output-parser.js +312 -0
  390. package/dist/lib/skill-output-parser.js.map +1 -0
  391. package/dist/lib/unified-query-api.js +467 -0
  392. package/dist/lib/unified-query-api.js.map +1 -0
  393. package/dist/middleware/auth-middleware.js +350 -0
  394. package/dist/middleware/auth-middleware.js.map +1 -0
  395. package/dist/middleware/schema-validation.js +347 -0
  396. package/dist/middleware/schema-validation.js.map +1 -0
  397. package/dist/providers/anthropic-provider.js +1 -1
  398. package/dist/providers/anthropic-provider.js.map +1 -1
  399. package/dist/providers/provider-factory.js +2 -2
  400. package/dist/providers/provider-factory.js.map +1 -1
  401. package/dist/services/edge-case-analyzer.js +321 -0
  402. package/dist/services/edge-case-analyzer.js.map +1 -0
  403. package/dist/services/edge-case-deduplicator.js +266 -0
  404. package/dist/services/edge-case-deduplicator.js.map +1 -0
  405. package/dist/services/edge-case-detector.js +337 -0
  406. package/dist/services/edge-case-detector.js.map +1 -0
  407. package/dist/services/edge-case-tracker.js +547 -0
  408. package/dist/services/edge-case-tracker.js.map +1 -0
  409. package/dist/services/health-check-system.js +586 -0
  410. package/dist/services/health-check-system.js.map +1 -0
  411. package/dist/services/metrics-logger.js +412 -0
  412. package/dist/services/metrics-logger.js.map +1 -0
  413. package/dist/services/patch-generator.js +378 -0
  414. package/dist/services/patch-generator.js.map +1 -0
  415. package/dist/services/patch-validator.js +337 -0
  416. package/dist/services/patch-validator.js.map +1 -0
  417. package/dist/services/performance-monitor.js +811 -0
  418. package/dist/services/performance-monitor.js.map +1 -0
  419. package/dist/services/promotion-pipeline.js +918 -0
  420. package/dist/services/promotion-pipeline.js.map +1 -0
  421. package/dist/services/promotion-validator.js +394 -0
  422. package/dist/services/promotion-validator.js.map +1 -0
  423. package/dist/services/reflection-logger.js +388 -0
  424. package/dist/services/reflection-logger.js.map +1 -0
  425. package/dist/services/skill-deployment.js +472 -0
  426. package/dist/services/skill-deployment.js.map +1 -0
  427. package/dist/services/skill-loader.js +427 -0
  428. package/dist/services/skill-loader.js.map +1 -0
  429. package/dist/services/skill-promotion.js +372 -0
  430. package/dist/services/skill-promotion.js.map +1 -0
  431. package/dist/services/skill-validator.js +454 -0
  432. package/dist/services/skill-validator.js.map +1 -0
  433. package/dist/services/skill-versioning.js +244 -0
  434. package/dist/services/skill-versioning.js.map +1 -0
  435. package/dist/services/workspace-supervisor.js +597 -0
  436. package/dist/services/workspace-supervisor.js.map +1 -0
  437. package/dist/types/edge-case.js +45 -0
  438. package/dist/types/edge-case.js.map +1 -0
  439. package/docs/BUG_19_MEMORY_LEAK_TASK_MODE.md +405 -0
  440. package/docs/MEMORY_CLEANUP_GUIDE.md +358 -0
  441. package/docs/MEMORY_LEAK_FIX_SUMMARY.md +322 -0
  442. package/docs/REDIS_CLEANUP_EXECUTIVE_SUMMARY.md +319 -0
  443. package/docs/REDIS_CLEANUP_VERIFICATION_REPORT.md +574 -0
  444. package/package.json +35 -4
  445. package/readme/README.md +53 -5
  446. package/scripts/backup-cleanup.sh +627 -0
  447. package/scripts/cleanup-workspaces.sh +412 -0
  448. package/scripts/cleanup-yaml-configs.sh +141 -0
  449. package/scripts/deploy-approved-skills.sh +263 -0
  450. package/scripts/health-check.sh +447 -0
  451. package/scripts/log-aggregator.sh +554 -0
  452. package/scripts/log-monitor.sh +629 -0
  453. package/scripts/manage-agent-workspaces.sh +434 -0
  454. package/scripts/migrate-schema.sh +533 -0
  455. package/scripts/promote-staged-skills.sh +423 -0
  456. package/scripts/verify-no-secrets.sh +88 -35
  457. package/scripts/verify-redis-cleanup.sh +173 -0
  458. package/tests/README.md +84 -0
  459. package/tests/test-memory-leak-task-mode.sh +435 -0
  460. package/.claude/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +0 -161
  461. package/.claude/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +0 -728
  462. package/.claude/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +0 -131
  463. package/.claude/skills/agent-lifecycle/SKILL.md +0 -60
  464. package/.claude/skills/agent-lifecycle/execute-lifecycle-hook.sh +0 -573
  465. package/.claude/skills/agent-lifecycle/simple-audit.sh +0 -31
  466. package/.claude/skills/cfn-agent-spawning/spawn-agent.sh.backup +0 -273
  467. package/.claude/skills/cfn-loop-orchestration/orchestrate.sh.backup +0 -949
  468. package/README.md.backup_before_replace +0 -781
  469. package/claude-assets/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +0 -161
  470. package/claude-assets/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +0 -728
  471. package/claude-assets/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +0 -131
  472. package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh.backup +0 -273
  473. package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh.backup +0 -949
@@ -0,0 +1,347 @@
1
+ /**
2
+ * Schema Validation Middleware
3
+ *
4
+ * Task: P2-3.2 - JSON Schema Validation Enforcement
5
+ * Provides Express middleware for automatic schema validation
6
+ *
7
+ * Usage:
8
+ * ```typescript
9
+ * app.post('/api/pattern-deployment',
10
+ * validateRequest('database-handoffs/pattern-deployment', '1.0.0'),
11
+ * handlePatternDeployment
12
+ * );
13
+ * ```
14
+ *
15
+ * @module schema-validation
16
+ */ import { IntegrationSchemaValidator } from '../lib/integration-schema-validator.js';
17
+ import { StandardError, ErrorCode } from '../lib/errors.js';
18
+ import { getGlobalLogger } from '../lib/logging.js';
19
+ import path from 'path';
20
+ const logger = getGlobalLogger();
21
+ // ============================================================================
22
+ // Global Validator Instance
23
+ // ============================================================================
24
+ let globalValidator = null;
25
+ /**
26
+ * Initialize global validator instance
27
+ */ export async function initializeSchemaValidation(schemaPath) {
28
+ const resolvedPath = schemaPath || path.join(process.cwd(), 'schemas/integration-points');
29
+ globalValidator = new IntegrationSchemaValidator({
30
+ schemaPath: resolvedPath,
31
+ enableCache: true,
32
+ strictMode: true
33
+ });
34
+ await globalValidator.initialize();
35
+ logger.info('Schema validation middleware initialized', {
36
+ schemaPath: resolvedPath
37
+ });
38
+ }
39
+ /**
40
+ * Get global validator instance
41
+ */ function getValidator() {
42
+ if (!globalValidator) {
43
+ throw new StandardError(ErrorCode.CONFIGURATION_ERROR, 'Schema validator not initialized. Call initializeSchemaValidation() first.', {
44
+ initialized: false
45
+ });
46
+ }
47
+ return globalValidator;
48
+ }
49
+ // ============================================================================
50
+ // Middleware Functions
51
+ // ============================================================================
52
+ /**
53
+ * Validate request body against schema
54
+ *
55
+ * @param schemaId - Schema identifier (e.g., "database-handoffs/pattern-deployment")
56
+ * @param version - Schema version (optional, defaults to latest)
57
+ * @param options - Validation options
58
+ */ export function validateRequest(schemaId, version, options = {}) {
59
+ return async (req, res, next)=>{
60
+ const startTime = Date.now();
61
+ try {
62
+ const validator = getValidator();
63
+ // Validate request body
64
+ await validator.validate(req.body, schemaId, version);
65
+ const duration = Date.now() - startTime;
66
+ logger.debug('Request validation succeeded', {
67
+ schemaId,
68
+ version,
69
+ path: req.path,
70
+ method: req.method,
71
+ duration
72
+ });
73
+ // Store validated data in request for downstream use
74
+ if (options.attachValidatedData) {
75
+ req.validatedData = req.body;
76
+ }
77
+ next();
78
+ } catch (error) {
79
+ const duration = Date.now() - startTime;
80
+ logger.warn('Request validation failed', {
81
+ schemaId,
82
+ version,
83
+ path: req.path,
84
+ method: req.method,
85
+ duration,
86
+ error: error instanceof Error ? error.message : String(error)
87
+ });
88
+ if (error instanceof StandardError) {
89
+ res.status(400).json({
90
+ error: 'Validation Failed',
91
+ message: error.message,
92
+ code: error.code,
93
+ details: error.context?.errors || [],
94
+ suggestions: error.context?.suggestions || []
95
+ });
96
+ } else {
97
+ res.status(500).json({
98
+ error: 'Internal Server Error',
99
+ message: 'Schema validation error'
100
+ });
101
+ }
102
+ }
103
+ };
104
+ }
105
+ /**
106
+ * Validate response body against schema
107
+ *
108
+ * @param schemaId - Schema identifier
109
+ * @param version - Schema version (optional)
110
+ */ export function validateResponse(schemaId, version) {
111
+ return async (req, res, next)=>{
112
+ const originalSend = res.send;
113
+ const originalJson = res.json;
114
+ // Intercept res.send()
115
+ res.send = function(data) {
116
+ validateResponseData(data, schemaId, version, req, res);
117
+ return originalSend.call(this, data);
118
+ };
119
+ // Intercept res.json()
120
+ res.json = function(data) {
121
+ validateResponseData(data, schemaId, version, req, res);
122
+ return originalJson.call(this, data);
123
+ };
124
+ next();
125
+ };
126
+ }
127
+ /**
128
+ * Validate response data helper
129
+ */ async function validateResponseData(data, schemaId, version, req, res) {
130
+ const startTime = Date.now();
131
+ try {
132
+ const validator = getValidator();
133
+ // Only validate if response is successful (2xx)
134
+ if (res.statusCode >= 200 && res.statusCode < 300) {
135
+ await validator.validate(data, schemaId, version);
136
+ const duration = Date.now() - startTime;
137
+ logger.debug('Response validation succeeded', {
138
+ schemaId,
139
+ version,
140
+ path: req.path,
141
+ statusCode: res.statusCode,
142
+ duration
143
+ });
144
+ }
145
+ } catch (error) {
146
+ const duration = Date.now() - startTime;
147
+ logger.error('Response validation failed', error, {
148
+ schemaId,
149
+ version,
150
+ path: req.path,
151
+ statusCode: res.statusCode,
152
+ duration
153
+ });
154
+ // Log error but don't modify response
155
+ // Response validation failures are logged for monitoring
156
+ }
157
+ }
158
+ /**
159
+ * Validate both request and response
160
+ */ export function validateRequestResponse(requestSchemaId, responseSchemaId, requestVersion, responseVersion) {
161
+ return [
162
+ validateRequest(requestSchemaId, requestVersion),
163
+ validateResponse(responseSchemaId, responseVersion)
164
+ ];
165
+ }
166
+ /**
167
+ * Create validation middleware with custom error handler
168
+ */ export function createValidationMiddleware(options) {
169
+ return async (req, res, next)=>{
170
+ const startTime = Date.now();
171
+ try {
172
+ const validator = getValidator();
173
+ // Determine schema based on request path or custom function
174
+ let schemaId;
175
+ let version;
176
+ if (options.schemaResolver) {
177
+ const resolved = options.schemaResolver(req);
178
+ schemaId = resolved.schemaId;
179
+ version = resolved.version;
180
+ } else if (options.schemaId) {
181
+ schemaId = options.schemaId;
182
+ version = options.version;
183
+ } else {
184
+ throw new StandardError(ErrorCode.CONFIGURATION_ERROR, 'No schema resolver or schemaId provided', {
185
+ options
186
+ });
187
+ }
188
+ // Validate request body
189
+ await validator.validate(req.body, schemaId, version);
190
+ const duration = Date.now() - startTime;
191
+ logger.debug('Validation middleware succeeded', {
192
+ schemaId,
193
+ version,
194
+ path: req.path,
195
+ duration
196
+ });
197
+ next();
198
+ } catch (error) {
199
+ const duration = Date.now() - startTime;
200
+ logger.warn('Validation middleware failed', {
201
+ path: req.path,
202
+ duration,
203
+ error: error instanceof Error ? error.message : String(error)
204
+ });
205
+ if (options.errorHandler) {
206
+ options.errorHandler(error, req, res, next);
207
+ } else {
208
+ // Default error handler
209
+ if (error instanceof StandardError) {
210
+ res.status(400).json({
211
+ error: 'Validation Failed',
212
+ message: error.message,
213
+ code: error.code,
214
+ details: error.context?.errors || []
215
+ });
216
+ } else {
217
+ res.status(500).json({
218
+ error: 'Internal Server Error',
219
+ message: 'Validation error'
220
+ });
221
+ }
222
+ }
223
+ }
224
+ };
225
+ }
226
+ /**
227
+ * Validate query parameters against schema
228
+ */ export function validateQueryParams(schemaId, version) {
229
+ return async (req, res, next)=>{
230
+ try {
231
+ const validator = getValidator();
232
+ // Validate query parameters
233
+ await validator.validate(req.query, schemaId, version);
234
+ logger.debug('Query parameter validation succeeded', {
235
+ schemaId,
236
+ version,
237
+ path: req.path
238
+ });
239
+ next();
240
+ } catch (error) {
241
+ logger.warn('Query parameter validation failed', {
242
+ schemaId,
243
+ version,
244
+ path: req.path,
245
+ error: error instanceof Error ? error.message : String(error)
246
+ });
247
+ if (error instanceof StandardError) {
248
+ res.status(400).json({
249
+ error: 'Invalid Query Parameters',
250
+ message: error.message,
251
+ details: error.context?.errors || []
252
+ });
253
+ } else {
254
+ res.status(500).json({
255
+ error: 'Internal Server Error'
256
+ });
257
+ }
258
+ }
259
+ };
260
+ }
261
+ /**
262
+ * Batch validation middleware
263
+ * Validates an array of items in request body
264
+ */ export function validateBatch(schemaId, version, options = {}) {
265
+ return async (req, res, next)=>{
266
+ try {
267
+ const validator = getValidator();
268
+ // Ensure request body is an array
269
+ if (!Array.isArray(req.body)) {
270
+ throw new StandardError(ErrorCode.VALIDATION_FAILED, 'Request body must be an array for batch validation', {
271
+ bodyType: typeof req.body
272
+ });
273
+ }
274
+ // Validate batch
275
+ const result = await validator.validateBatch(req.body, schemaId, version, {
276
+ failFast: options.failFast
277
+ });
278
+ if (!result.valid) {
279
+ res.status(400).json({
280
+ error: 'Batch Validation Failed',
281
+ message: `${result.invalidRecords} of ${result.totalRecords} records failed validation`,
282
+ totalRecords: result.totalRecords,
283
+ validRecords: result.validRecords,
284
+ invalidRecords: result.invalidRecords,
285
+ errors: result.errors
286
+ });
287
+ return;
288
+ }
289
+ logger.debug('Batch validation succeeded', {
290
+ schemaId,
291
+ version,
292
+ totalRecords: result.totalRecords
293
+ });
294
+ next();
295
+ } catch (error) {
296
+ if (error instanceof StandardError) {
297
+ res.status(400).json({
298
+ error: 'Batch Validation Error',
299
+ message: error.message,
300
+ code: error.code
301
+ });
302
+ } else {
303
+ res.status(500).json({
304
+ error: 'Internal Server Error'
305
+ });
306
+ }
307
+ }
308
+ };
309
+ }
310
+ // ============================================================================
311
+ // Utility Functions
312
+ // ============================================================================
313
+ /**
314
+ * Create schema resolver based on route patterns
315
+ *
316
+ * Example:
317
+ * ```typescript
318
+ * const resolver = createRouteSchemaResolver({
319
+ * '/api/patterns': 'database-handoffs/pattern-deployment',
320
+ * '/api/metrics': 'database-handoffs/execution-metrics',
321
+ * });
322
+ * ```
323
+ */ export function createRouteSchemaResolver(routeMap) {
324
+ return (req)=>{
325
+ const schemaId = routeMap[req.path];
326
+ if (!schemaId) {
327
+ throw new StandardError(ErrorCode.CONFIGURATION_ERROR, `No schema mapping found for route: ${req.path}`, {
328
+ path: req.path,
329
+ availableRoutes: Object.keys(routeMap)
330
+ });
331
+ }
332
+ return {
333
+ schemaId
334
+ };
335
+ };
336
+ }
337
+ /**
338
+ * Shutdown schema validation middleware
339
+ */ export async function shutdownSchemaValidation() {
340
+ if (globalValidator) {
341
+ await globalValidator.shutdown();
342
+ globalValidator = null;
343
+ logger.info('Schema validation middleware shutdown complete');
344
+ }
345
+ }
346
+
347
+ //# sourceMappingURL=schema-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/middleware/schema-validation.ts"],"sourcesContent":["/**\r\n * Schema Validation Middleware\r\n *\r\n * Task: P2-3.2 - JSON Schema Validation Enforcement\r\n * Provides Express middleware for automatic schema validation\r\n *\r\n * Usage:\r\n * ```typescript\r\n * app.post('/api/pattern-deployment',\r\n * validateRequest('database-handoffs/pattern-deployment', '1.0.0'),\r\n * handlePatternDeployment\r\n * );\r\n * ```\r\n *\r\n * @module schema-validation\r\n */\r\n\r\nimport { Request, Response, NextFunction, RequestHandler } from 'express';\r\nimport { IntegrationSchemaValidator } from '../lib/integration-schema-validator.js';\r\nimport { StandardError, ErrorCode } from '../lib/errors.js';\r\nimport { getGlobalLogger } from '../lib/logging.js';\r\nimport path from 'path';\r\n\r\nconst logger = getGlobalLogger();\r\n\r\n// ============================================================================\r\n// Global Validator Instance\r\n// ============================================================================\r\n\r\nlet globalValidator: IntegrationSchemaValidator | null = null;\r\n\r\n/**\r\n * Initialize global validator instance\r\n */\r\nexport async function initializeSchemaValidation(schemaPath?: string): Promise<void> {\r\n const resolvedPath = schemaPath || path.join(process.cwd(), 'schemas/integration-points');\r\n\r\n globalValidator = new IntegrationSchemaValidator({\r\n schemaPath: resolvedPath,\r\n enableCache: true,\r\n strictMode: true,\r\n });\r\n\r\n await globalValidator.initialize();\r\n\r\n logger.info('Schema validation middleware initialized', {\r\n schemaPath: resolvedPath,\r\n });\r\n}\r\n\r\n/**\r\n * Get global validator instance\r\n */\r\nfunction getValidator(): IntegrationSchemaValidator {\r\n if (!globalValidator) {\r\n throw new StandardError(\r\n ErrorCode.CONFIGURATION_ERROR,\r\n 'Schema validator not initialized. Call initializeSchemaValidation() first.',\r\n { initialized: false }\r\n );\r\n }\r\n\r\n return globalValidator;\r\n}\r\n\r\n// ============================================================================\r\n// Middleware Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Validate request body against schema\r\n *\r\n * @param schemaId - Schema identifier (e.g., \"database-handoffs/pattern-deployment\")\r\n * @param version - Schema version (optional, defaults to latest)\r\n * @param options - Validation options\r\n */\r\nexport function validateRequest(\r\n schemaId: string,\r\n version?: string,\r\n options: ValidationOptions = {}\r\n): RequestHandler {\r\n return async (req: Request, res: Response, next: NextFunction): Promise<void> => {\r\n const startTime = Date.now();\r\n\r\n try {\r\n const validator = getValidator();\r\n\r\n // Validate request body\r\n await validator.validate(req.body, schemaId, version);\r\n\r\n const duration = Date.now() - startTime;\r\n\r\n logger.debug('Request validation succeeded', {\r\n schemaId,\r\n version,\r\n path: req.path,\r\n method: req.method,\r\n duration,\r\n });\r\n\r\n // Store validated data in request for downstream use\r\n if (options.attachValidatedData) {\r\n (req as any).validatedData = req.body;\r\n }\r\n\r\n next();\r\n } catch (error) {\r\n const duration = Date.now() - startTime;\r\n\r\n logger.warn('Request validation failed', {\r\n schemaId,\r\n version,\r\n path: req.path,\r\n method: req.method,\r\n duration,\r\n error: error instanceof Error ? error.message : String(error),\r\n });\r\n\r\n if (error instanceof StandardError) {\r\n res.status(400).json({\r\n error: 'Validation Failed',\r\n message: error.message,\r\n code: error.code,\r\n details: error.context?.errors || [],\r\n suggestions: error.context?.suggestions || [],\r\n });\r\n } else {\r\n res.status(500).json({\r\n error: 'Internal Server Error',\r\n message: 'Schema validation error',\r\n });\r\n }\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Validate response body against schema\r\n *\r\n * @param schemaId - Schema identifier\r\n * @param version - Schema version (optional)\r\n */\r\nexport function validateResponse(\r\n schemaId: string,\r\n version?: string\r\n): RequestHandler {\r\n return async (req: Request, res: Response, next: NextFunction): Promise<void> => {\r\n const originalSend = res.send;\r\n const originalJson = res.json;\r\n\r\n // Intercept res.send()\r\n res.send = function (data: any): Response {\r\n validateResponseData(data, schemaId, version, req, res);\r\n return originalSend.call(this, data);\r\n };\r\n\r\n // Intercept res.json()\r\n res.json = function (data: any): Response {\r\n validateResponseData(data, schemaId, version, req, res);\r\n return originalJson.call(this, data);\r\n };\r\n\r\n next();\r\n };\r\n}\r\n\r\n/**\r\n * Validate response data helper\r\n */\r\nasync function validateResponseData(\r\n data: any,\r\n schemaId: string,\r\n version: string | undefined,\r\n req: Request,\r\n res: Response\r\n): Promise<void> {\r\n const startTime = Date.now();\r\n\r\n try {\r\n const validator = getValidator();\r\n\r\n // Only validate if response is successful (2xx)\r\n if (res.statusCode >= 200 && res.statusCode < 300) {\r\n await validator.validate(data, schemaId, version);\r\n\r\n const duration = Date.now() - startTime;\r\n\r\n logger.debug('Response validation succeeded', {\r\n schemaId,\r\n version,\r\n path: req.path,\r\n statusCode: res.statusCode,\r\n duration,\r\n });\r\n }\r\n } catch (error) {\r\n const duration = Date.now() - startTime;\r\n\r\n logger.error('Response validation failed', error as Error, {\r\n schemaId,\r\n version,\r\n path: req.path,\r\n statusCode: res.statusCode,\r\n duration,\r\n });\r\n\r\n // Log error but don't modify response\r\n // Response validation failures are logged for monitoring\r\n }\r\n}\r\n\r\n/**\r\n * Validate both request and response\r\n */\r\nexport function validateRequestResponse(\r\n requestSchemaId: string,\r\n responseSchemaId: string,\r\n requestVersion?: string,\r\n responseVersion?: string\r\n): RequestHandler[] {\r\n return [\r\n validateRequest(requestSchemaId, requestVersion),\r\n validateResponse(responseSchemaId, responseVersion),\r\n ];\r\n}\r\n\r\n/**\r\n * Create validation middleware with custom error handler\r\n */\r\nexport function createValidationMiddleware(options: MiddlewareOptions): RequestHandler {\r\n return async (req: Request, res: Response, next: NextFunction): Promise<void> => {\r\n const startTime = Date.now();\r\n\r\n try {\r\n const validator = getValidator();\r\n\r\n // Determine schema based on request path or custom function\r\n let schemaId: string;\r\n let version: string | undefined;\r\n\r\n if (options.schemaResolver) {\r\n const resolved = options.schemaResolver(req);\r\n schemaId = resolved.schemaId;\r\n version = resolved.version;\r\n } else if (options.schemaId) {\r\n schemaId = options.schemaId;\r\n version = options.version;\r\n } else {\r\n throw new StandardError(\r\n ErrorCode.CONFIGURATION_ERROR,\r\n 'No schema resolver or schemaId provided',\r\n { options }\r\n );\r\n }\r\n\r\n // Validate request body\r\n await validator.validate(req.body, schemaId, version);\r\n\r\n const duration = Date.now() - startTime;\r\n\r\n logger.debug('Validation middleware succeeded', {\r\n schemaId,\r\n version,\r\n path: req.path,\r\n duration,\r\n });\r\n\r\n next();\r\n } catch (error) {\r\n const duration = Date.now() - startTime;\r\n\r\n logger.warn('Validation middleware failed', {\r\n path: req.path,\r\n duration,\r\n error: error instanceof Error ? error.message : String(error),\r\n });\r\n\r\n if (options.errorHandler) {\r\n options.errorHandler(error as Error, req, res, next);\r\n } else {\r\n // Default error handler\r\n if (error instanceof StandardError) {\r\n res.status(400).json({\r\n error: 'Validation Failed',\r\n message: error.message,\r\n code: error.code,\r\n details: error.context?.errors || [],\r\n });\r\n } else {\r\n res.status(500).json({\r\n error: 'Internal Server Error',\r\n message: 'Validation error',\r\n });\r\n }\r\n }\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Validate query parameters against schema\r\n */\r\nexport function validateQueryParams(\r\n schemaId: string,\r\n version?: string\r\n): RequestHandler {\r\n return async (req: Request, res: Response, next: NextFunction): Promise<void> => {\r\n try {\r\n const validator = getValidator();\r\n\r\n // Validate query parameters\r\n await validator.validate(req.query, schemaId, version);\r\n\r\n logger.debug('Query parameter validation succeeded', {\r\n schemaId,\r\n version,\r\n path: req.path,\r\n });\r\n\r\n next();\r\n } catch (error) {\r\n logger.warn('Query parameter validation failed', {\r\n schemaId,\r\n version,\r\n path: req.path,\r\n error: error instanceof Error ? error.message : String(error),\r\n });\r\n\r\n if (error instanceof StandardError) {\r\n res.status(400).json({\r\n error: 'Invalid Query Parameters',\r\n message: error.message,\r\n details: error.context?.errors || [],\r\n });\r\n } else {\r\n res.status(500).json({\r\n error: 'Internal Server Error',\r\n });\r\n }\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Batch validation middleware\r\n * Validates an array of items in request body\r\n */\r\nexport function validateBatch(\r\n schemaId: string,\r\n version?: string,\r\n options: BatchValidationMiddlewareOptions = {}\r\n): RequestHandler {\r\n return async (req: Request, res: Response, next: NextFunction): Promise<void> => {\r\n try {\r\n const validator = getValidator();\r\n\r\n // Ensure request body is an array\r\n if (!Array.isArray(req.body)) {\r\n throw new StandardError(\r\n ErrorCode.VALIDATION_FAILED,\r\n 'Request body must be an array for batch validation',\r\n { bodyType: typeof req.body }\r\n );\r\n }\r\n\r\n // Validate batch\r\n const result = await validator.validateBatch(req.body, schemaId, version, {\r\n failFast: options.failFast,\r\n });\r\n\r\n if (!result.valid) {\r\n res.status(400).json({\r\n error: 'Batch Validation Failed',\r\n message: `${result.invalidRecords} of ${result.totalRecords} records failed validation`,\r\n totalRecords: result.totalRecords,\r\n validRecords: result.validRecords,\r\n invalidRecords: result.invalidRecords,\r\n errors: result.errors,\r\n });\r\n return;\r\n }\r\n\r\n logger.debug('Batch validation succeeded', {\r\n schemaId,\r\n version,\r\n totalRecords: result.totalRecords,\r\n });\r\n\r\n next();\r\n } catch (error) {\r\n if (error instanceof StandardError) {\r\n res.status(400).json({\r\n error: 'Batch Validation Error',\r\n message: error.message,\r\n code: error.code,\r\n });\r\n } else {\r\n res.status(500).json({\r\n error: 'Internal Server Error',\r\n });\r\n }\r\n }\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Type Definitions\r\n// ============================================================================\r\n\r\nexport interface ValidationOptions {\r\n /**\r\n * Attach validated data to request object\r\n * @default false\r\n */\r\n attachValidatedData?: boolean;\r\n}\r\n\r\nexport interface SchemaResolverResult {\r\n schemaId: string;\r\n version?: string;\r\n}\r\n\r\nexport interface MiddlewareOptions {\r\n /**\r\n * Schema ID (if static)\r\n */\r\n schemaId?: string;\r\n\r\n /**\r\n * Schema version (if static)\r\n */\r\n version?: string;\r\n\r\n /**\r\n * Function to resolve schema dynamically based on request\r\n */\r\n schemaResolver?: (req: Request) => SchemaResolverResult;\r\n\r\n /**\r\n * Custom error handler\r\n */\r\n errorHandler?: (error: Error, req: Request, res: Response, next: NextFunction) => void;\r\n}\r\n\r\nexport interface BatchValidationMiddlewareOptions {\r\n /**\r\n * Stop on first validation error\r\n * @default false\r\n */\r\n failFast?: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// Utility Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Create schema resolver based on route patterns\r\n *\r\n * Example:\r\n * ```typescript\r\n * const resolver = createRouteSchemaResolver({\r\n * '/api/patterns': 'database-handoffs/pattern-deployment',\r\n * '/api/metrics': 'database-handoffs/execution-metrics',\r\n * });\r\n * ```\r\n */\r\nexport function createRouteSchemaResolver(\r\n routeMap: Record<string, string>\r\n): (req: Request) => SchemaResolverResult {\r\n return (req: Request): SchemaResolverResult => {\r\n const schemaId = routeMap[req.path];\r\n\r\n if (!schemaId) {\r\n throw new StandardError(\r\n ErrorCode.CONFIGURATION_ERROR,\r\n `No schema mapping found for route: ${req.path}`,\r\n { path: req.path, availableRoutes: Object.keys(routeMap) }\r\n );\r\n }\r\n\r\n return { schemaId };\r\n };\r\n}\r\n\r\n/**\r\n * Shutdown schema validation middleware\r\n */\r\nexport async function shutdownSchemaValidation(): Promise<void> {\r\n if (globalValidator) {\r\n await globalValidator.shutdown();\r\n globalValidator = null;\r\n\r\n logger.info('Schema validation middleware shutdown complete');\r\n }\r\n}\r\n"],"names":["IntegrationSchemaValidator","StandardError","ErrorCode","getGlobalLogger","path","logger","globalValidator","initializeSchemaValidation","schemaPath","resolvedPath","join","process","cwd","enableCache","strictMode","initialize","info","getValidator","CONFIGURATION_ERROR","initialized","validateRequest","schemaId","version","options","req","res","next","startTime","Date","now","validator","validate","body","duration","debug","method","attachValidatedData","validatedData","error","warn","Error","message","String","status","json","code","details","context","errors","suggestions","validateResponse","originalSend","send","originalJson","data","validateResponseData","call","statusCode","validateRequestResponse","requestSchemaId","responseSchemaId","requestVersion","responseVersion","createValidationMiddleware","schemaResolver","resolved","errorHandler","validateQueryParams","query","validateBatch","Array","isArray","VALIDATION_FAILED","bodyType","result","failFast","valid","invalidRecords","totalRecords","validRecords","createRouteSchemaResolver","routeMap","availableRoutes","Object","keys","shutdownSchemaValidation","shutdown"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import Anthropic from '@anthropic-ai/sdk';
2
- import { ProviderError } from './provider-interface';
2
+ import { ProviderError } from './provider-interface.js';
3
3
  export class AnthropicProvider {
4
4
  client;
5
5
  defaultModel;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/providers/anthropic-provider.ts"],"sourcesContent":["import Anthropic from '@anthropic-ai/sdk';\r\nimport { LLMProviderInterface, LLMMessageOptions, LLMModel, ProviderError } from './provider-interface';\r\n\r\nexport class AnthropicProvider implements LLMProviderInterface {\r\n private client: Anthropic;\r\n private defaultModel: string;\r\n\r\n constructor(apiKey?: string, defaultModel: string = 'claude-3-5-haiku-20240620') {\r\n this.client = new Anthropic({\r\n apiKey: apiKey || process.env.ANTHROPIC_API_KEY\r\n });\r\n this.defaultModel = defaultModel;\r\n }\r\n\r\n async sendMessage(prompt: string, options: LLMMessageOptions = {}): Promise<string> {\r\n try {\r\n const response = await this.client.messages.create({\r\n model: options.model || this.defaultModel,\r\n max_tokens: options.maxTokens || 4096,\r\n temperature: options.temperature || 0.7,\r\n system: options.system,\r\n messages: [{ role: 'user', content: prompt }]\r\n });\r\n\r\n return response.content[0].text;\r\n } catch (error) {\r\n throw new ProviderError(\r\n 'Failed to send message to Anthropic',\r\n 'ANTHROPIC_SEND_ERROR',\r\n { originalError: error }\r\n );\r\n }\r\n }\r\n\r\n async *streamMessage(prompt: string, options: LLMMessageOptions = {}): AsyncGenerator<string, void, unknown> {\r\n try {\r\n const stream = await this.client.messages.create({\r\n model: options.model || this.defaultModel,\r\n max_tokens: options.maxTokens || 4096,\r\n temperature: options.temperature || 0.7,\r\n system: options.system,\r\n stream: true,\r\n messages: [{ role: 'user', content: prompt }]\r\n });\r\n\r\n for await (const messageStreamEvent of stream) {\r\n if (messageStreamEvent.type === 'content_block_delta') {\r\n yield messageStreamEvent.delta.text;\r\n }\r\n }\r\n } catch (error) {\r\n throw new ProviderError(\r\n 'Failed to stream message from Anthropic',\r\n 'ANTHROPIC_STREAM_ERROR',\r\n { originalError: error }\r\n );\r\n }\r\n }\r\n\r\n async getModels(): Promise<LLMModel[]> {\r\n return [\r\n {\r\n id: 'claude-3-5-haiku-20240620',\r\n name: 'Claude 3.5 Haiku',\r\n context_window: 200000,\r\n pricing: { input: 0.00003, output: 0.00015 }\r\n },\r\n {\r\n id: 'claude-3-opus-20240229',\r\n name: 'Claude 3 Opus',\r\n context_window: 200000,\r\n pricing: { input: 0.00015, output: 0.00075 }\r\n },\r\n {\r\n id: 'claude-3-sonnet-20240229',\r\n name: 'Claude 3 Sonnet',\r\n context_window: 200000,\r\n pricing: { input: 0.00003, output: 0.00015 }\r\n }\r\n ];\r\n }\r\n\r\n async checkHealth(): Promise<{\r\n status: 'healthy' | 'degraded' | 'unavailable';\r\n latency?: number;\r\n models_available?: number;\r\n }> {\r\n try {\r\n const startTime = Date.now();\r\n await this.sendMessage('Health check', { maxTokens: 10 });\r\n const latency = Date.now() - startTime;\r\n\r\n const models = await this.getModels();\r\n\r\n return {\r\n status: latency < 500 ? 'healthy' : 'degraded',\r\n latency,\r\n models_available: models.length\r\n };\r\n } catch (error) {\r\n return {\r\n status: 'unavailable',\r\n latency: undefined,\r\n models_available: 0\r\n };\r\n }\r\n }\r\n}"],"names":["Anthropic","ProviderError","AnthropicProvider","client","defaultModel","apiKey","process","env","ANTHROPIC_API_KEY","sendMessage","prompt","options","response","messages","create","model","max_tokens","maxTokens","temperature","system","role","content","text","error","originalError","streamMessage","stream","messageStreamEvent","type","delta","getModels","id","name","context_window","pricing","input","output","checkHealth","startTime","Date","now","latency","models","status","models_available","length","undefined"],"mappings":"AAAA,OAAOA,eAAe,oBAAoB;AAC1C,SAA4DC,aAAa,QAAQ,uBAAuB;AAExG,OAAO,MAAMC;IACHC,OAAkB;IAClBC,aAAqB;IAE7B,YAAYC,MAAe,EAAED,eAAuB,2BAA2B,CAAE;QAC/E,IAAI,CAACD,MAAM,GAAG,IAAIH,UAAU;YAC1BK,QAAQA,UAAUC,QAAQC,GAAG,CAACC,iBAAiB;QACjD;QACA,IAAI,CAACJ,YAAY,GAAGA;IACtB;IAEA,MAAMK,YAAYC,MAAc,EAAEC,UAA6B,CAAC,CAAC,EAAmB;QAClF,IAAI;YACF,MAAMC,WAAW,MAAM,IAAI,CAACT,MAAM,CAACU,QAAQ,CAACC,MAAM,CAAC;gBACjDC,OAAOJ,QAAQI,KAAK,IAAI,IAAI,CAACX,YAAY;gBACzCY,YAAYL,QAAQM,SAAS,IAAI;gBACjCC,aAAaP,QAAQO,WAAW,IAAI;gBACpCC,QAAQR,QAAQQ,MAAM;gBACtBN,UAAU;oBAAC;wBAAEO,MAAM;wBAAQC,SAASX;oBAAO;iBAAE;YAC/C;YAEA,OAAOE,SAASS,OAAO,CAAC,EAAE,CAACC,IAAI;QACjC,EAAE,OAAOC,OAAO;YACd,MAAM,IAAItB,cACR,uCACA,wBACA;gBAAEuB,eAAeD;YAAM;QAE3B;IACF;IAEA,OAAOE,cAAcf,MAAc,EAAEC,UAA6B,CAAC,CAAC,EAAyC;QAC3G,IAAI;YACF,MAAMe,SAAS,MAAM,IAAI,CAACvB,MAAM,CAACU,QAAQ,CAACC,MAAM,CAAC;gBAC/CC,OAAOJ,QAAQI,KAAK,IAAI,IAAI,CAACX,YAAY;gBACzCY,YAAYL,QAAQM,SAAS,IAAI;gBACjCC,aAAaP,QAAQO,WAAW,IAAI;gBACpCC,QAAQR,QAAQQ,MAAM;gBACtBO,QAAQ;gBACRb,UAAU;oBAAC;wBAAEO,MAAM;wBAAQC,SAASX;oBAAO;iBAAE;YAC/C;YAEA,WAAW,MAAMiB,sBAAsBD,OAAQ;gBAC7C,IAAIC,mBAAmBC,IAAI,KAAK,uBAAuB;oBACrD,MAAMD,mBAAmBE,KAAK,CAACP,IAAI;gBACrC;YACF;QACF,EAAE,OAAOC,OAAO;YACd,MAAM,IAAItB,cACR,2CACA,0BACA;gBAAEuB,eAAeD;YAAM;QAE3B;IACF;IAEA,MAAMO,YAAiC;QACrC,OAAO;YACL;gBACEC,IAAI;gBACJC,MAAM;gBACNC,gBAAgB;gBAChBC,SAAS;oBAAEC,OAAO;oBAASC,QAAQ;gBAAQ;YAC7C;YACA;gBACEL,IAAI;gBACJC,MAAM;gBACNC,gBAAgB;gBAChBC,SAAS;oBAAEC,OAAO;oBAASC,QAAQ;gBAAQ;YAC7C;YACA;gBACEL,IAAI;gBACJC,MAAM;gBACNC,gBAAgB;gBAChBC,SAAS;oBAAEC,OAAO;oBAASC,QAAQ;gBAAQ;YAC7C;SACD;IACH;IAEA,MAAMC,cAIH;QACD,IAAI;YACF,MAAMC,YAAYC,KAAKC,GAAG;YAC1B,MAAM,IAAI,CAAC/B,WAAW,CAAC,gBAAgB;gBAAEQ,WAAW;YAAG;YACvD,MAAMwB,UAAUF,KAAKC,GAAG,KAAKF;YAE7B,MAAMI,SAAS,MAAM,IAAI,CAACZ,SAAS;YAEnC,OAAO;gBACLa,QAAQF,UAAU,MAAM,YAAY;gBACpCA;gBACAG,kBAAkBF,OAAOG,MAAM;YACjC;QACF,EAAE,OAAOtB,OAAO;YACd,OAAO;gBACLoB,QAAQ;gBACRF,SAASK;gBACTF,kBAAkB;YACpB;QACF;IACF;AACF"}
1
+ {"version":3,"sources":["../../src/providers/anthropic-provider.ts"],"sourcesContent":["import Anthropic from '@anthropic-ai/sdk';\r\nimport { LLMProviderInterface, LLMMessageOptions, LLMModel, ProviderError } from './provider-interface.js';\r\n\r\nexport class AnthropicProvider implements LLMProviderInterface {\r\n private client: Anthropic;\r\n private defaultModel: string;\r\n\r\n constructor(apiKey?: string, defaultModel: string = 'claude-3-5-haiku-20240620') {\r\n this.client = new Anthropic({\r\n apiKey: apiKey || process.env.ANTHROPIC_API_KEY\r\n });\r\n this.defaultModel = defaultModel;\r\n }\r\n\r\n async sendMessage(prompt: string, options: LLMMessageOptions = {}): Promise<string> {\r\n try {\r\n const response = await this.client.messages.create({\r\n model: options.model || this.defaultModel,\r\n max_tokens: options.maxTokens || 4096,\r\n temperature: options.temperature || 0.7,\r\n system: options.system,\r\n messages: [{ role: 'user', content: prompt }]\r\n });\r\n\r\n return response.content[0].text;\r\n } catch (error) {\r\n throw new ProviderError(\r\n 'Failed to send message to Anthropic',\r\n 'ANTHROPIC_SEND_ERROR',\r\n { originalError: error }\r\n );\r\n }\r\n }\r\n\r\n async *streamMessage(prompt: string, options: LLMMessageOptions = {}): AsyncGenerator<string, void, unknown> {\r\n try {\r\n const stream = await this.client.messages.create({\r\n model: options.model || this.defaultModel,\r\n max_tokens: options.maxTokens || 4096,\r\n temperature: options.temperature || 0.7,\r\n system: options.system,\r\n stream: true,\r\n messages: [{ role: 'user', content: prompt }]\r\n });\r\n\r\n for await (const messageStreamEvent of stream) {\r\n if (messageStreamEvent.type === 'content_block_delta') {\r\n yield messageStreamEvent.delta.text;\r\n }\r\n }\r\n } catch (error) {\r\n throw new ProviderError(\r\n 'Failed to stream message from Anthropic',\r\n 'ANTHROPIC_STREAM_ERROR',\r\n { originalError: error }\r\n );\r\n }\r\n }\r\n\r\n async getModels(): Promise<LLMModel[]> {\r\n return [\r\n {\r\n id: 'claude-3-5-haiku-20240620',\r\n name: 'Claude 3.5 Haiku',\r\n context_window: 200000,\r\n pricing: { input: 0.00003, output: 0.00015 }\r\n },\r\n {\r\n id: 'claude-3-opus-20240229',\r\n name: 'Claude 3 Opus',\r\n context_window: 200000,\r\n pricing: { input: 0.00015, output: 0.00075 }\r\n },\r\n {\r\n id: 'claude-3-sonnet-20240229',\r\n name: 'Claude 3 Sonnet',\r\n context_window: 200000,\r\n pricing: { input: 0.00003, output: 0.00015 }\r\n }\r\n ];\r\n }\r\n\r\n async checkHealth(): Promise<{\r\n status: 'healthy' | 'degraded' | 'unavailable';\r\n latency?: number;\r\n models_available?: number;\r\n }> {\r\n try {\r\n const startTime = Date.now();\r\n await this.sendMessage('Health check', { maxTokens: 10 });\r\n const latency = Date.now() - startTime;\r\n\r\n const models = await this.getModels();\r\n\r\n return {\r\n status: latency < 500 ? 'healthy' : 'degraded',\r\n latency,\r\n models_available: models.length\r\n };\r\n } catch (error) {\r\n return {\r\n status: 'unavailable',\r\n latency: undefined,\r\n models_available: 0\r\n };\r\n }\r\n }\r\n}"],"names":["Anthropic","ProviderError","AnthropicProvider","client","defaultModel","apiKey","process","env","ANTHROPIC_API_KEY","sendMessage","prompt","options","response","messages","create","model","max_tokens","maxTokens","temperature","system","role","content","text","error","originalError","streamMessage","stream","messageStreamEvent","type","delta","getModels","id","name","context_window","pricing","input","output","checkHealth","startTime","Date","now","latency","models","status","models_available","length","undefined"],"mappings":"AAAA,OAAOA,eAAe,oBAAoB;AAC1C,SAA4DC,aAAa,QAAQ,0BAA0B;AAE3G,OAAO,MAAMC;IACHC,OAAkB;IAClBC,aAAqB;IAE7B,YAAYC,MAAe,EAAED,eAAuB,2BAA2B,CAAE;QAC/E,IAAI,CAACD,MAAM,GAAG,IAAIH,UAAU;YAC1BK,QAAQA,UAAUC,QAAQC,GAAG,CAACC,iBAAiB;QACjD;QACA,IAAI,CAACJ,YAAY,GAAGA;IACtB;IAEA,MAAMK,YAAYC,MAAc,EAAEC,UAA6B,CAAC,CAAC,EAAmB;QAClF,IAAI;YACF,MAAMC,WAAW,MAAM,IAAI,CAACT,MAAM,CAACU,QAAQ,CAACC,MAAM,CAAC;gBACjDC,OAAOJ,QAAQI,KAAK,IAAI,IAAI,CAACX,YAAY;gBACzCY,YAAYL,QAAQM,SAAS,IAAI;gBACjCC,aAAaP,QAAQO,WAAW,IAAI;gBACpCC,QAAQR,QAAQQ,MAAM;gBACtBN,UAAU;oBAAC;wBAAEO,MAAM;wBAAQC,SAASX;oBAAO;iBAAE;YAC/C;YAEA,OAAOE,SAASS,OAAO,CAAC,EAAE,CAACC,IAAI;QACjC,EAAE,OAAOC,OAAO;YACd,MAAM,IAAItB,cACR,uCACA,wBACA;gBAAEuB,eAAeD;YAAM;QAE3B;IACF;IAEA,OAAOE,cAAcf,MAAc,EAAEC,UAA6B,CAAC,CAAC,EAAyC;QAC3G,IAAI;YACF,MAAMe,SAAS,MAAM,IAAI,CAACvB,MAAM,CAACU,QAAQ,CAACC,MAAM,CAAC;gBAC/CC,OAAOJ,QAAQI,KAAK,IAAI,IAAI,CAACX,YAAY;gBACzCY,YAAYL,QAAQM,SAAS,IAAI;gBACjCC,aAAaP,QAAQO,WAAW,IAAI;gBACpCC,QAAQR,QAAQQ,MAAM;gBACtBO,QAAQ;gBACRb,UAAU;oBAAC;wBAAEO,MAAM;wBAAQC,SAASX;oBAAO;iBAAE;YAC/C;YAEA,WAAW,MAAMiB,sBAAsBD,OAAQ;gBAC7C,IAAIC,mBAAmBC,IAAI,KAAK,uBAAuB;oBACrD,MAAMD,mBAAmBE,KAAK,CAACP,IAAI;gBACrC;YACF;QACF,EAAE,OAAOC,OAAO;YACd,MAAM,IAAItB,cACR,2CACA,0BACA;gBAAEuB,eAAeD;YAAM;QAE3B;IACF;IAEA,MAAMO,YAAiC;QACrC,OAAO;YACL;gBACEC,IAAI;gBACJC,MAAM;gBACNC,gBAAgB;gBAChBC,SAAS;oBAAEC,OAAO;oBAASC,QAAQ;gBAAQ;YAC7C;YACA;gBACEL,IAAI;gBACJC,MAAM;gBACNC,gBAAgB;gBAChBC,SAAS;oBAAEC,OAAO;oBAASC,QAAQ;gBAAQ;YAC7C;YACA;gBACEL,IAAI;gBACJC,MAAM;gBACNC,gBAAgB;gBAChBC,SAAS;oBAAEC,OAAO;oBAASC,QAAQ;gBAAQ;YAC7C;SACD;IACH;IAEA,MAAMC,cAIH;QACD,IAAI;YACF,MAAMC,YAAYC,KAAKC,GAAG;YAC1B,MAAM,IAAI,CAAC/B,WAAW,CAAC,gBAAgB;gBAAEQ,WAAW;YAAG;YACvD,MAAMwB,UAAUF,KAAKC,GAAG,KAAKF;YAE7B,MAAMI,SAAS,MAAM,IAAI,CAACZ,SAAS;YAEnC,OAAO;gBACLa,QAAQF,UAAU,MAAM,YAAY;gBACpCA;gBACAG,kBAAkBF,OAAOG,MAAM;YACjC;QACF,EAAE,OAAOtB,OAAO;YACd,OAAO;gBACLoB,QAAQ;gBACRF,SAASK;gBACTF,kBAAkB;YACpB;QACF;IACF;AACF"}
@@ -1,5 +1,5 @@
1
- import { ProviderError } from './provider-interface';
2
- import { AnthropicProvider } from './anthropic-provider';
1
+ import { ProviderError } from './provider-interface.js';
2
+ import { AnthropicProvider } from './anthropic-provider.js';
3
3
  export class ProviderFactory {
4
4
  static providers = new Map([
5
5
  [
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/providers/provider-factory.ts"],"sourcesContent":["import { LLMProviderInterface, ProviderError } from './provider-interface';\r\nimport { AnthropicProvider } from './anthropic-provider';\r\n\r\nexport type ProviderType = 'anthropic' | 'openai' | 'azure' | 'google';\r\n\r\nexport class ProviderFactory {\r\n private static providers: Map<ProviderType, new (apiKey?: string) => LLMProviderInterface> = new Map([\r\n ['anthropic', AnthropicProvider]\r\n // Placeholder for future providers\r\n // ['openai', OpenAIProvider],\r\n // ['azure', AzureProvider],\r\n // ['google', GoogleProvider]\r\n ]);\r\n\r\n /**\r\n * Create a provider instance\r\n * @param type Provider type\r\n * @param apiKey Optional API key (defaults to env variable)\r\n * @returns LLM Provider instance\r\n */\r\n static createProvider(type: ProviderType, apiKey?: string): LLMProviderInterface {\r\n const ProviderClass = this.providers.get(type);\r\n\r\n if (!ProviderClass) {\r\n throw new ProviderError(\r\n `Provider ${type} is not supported`,\r\n 'PROVIDER_NOT_FOUND',\r\n { availableProviders: Array.from(this.providers.keys()) }\r\n );\r\n }\r\n\r\n return new ProviderClass(apiKey);\r\n }\r\n\r\n /**\r\n * Register a new provider\r\n * @param type Provider type\r\n * @param providerClass Provider implementation class\r\n */\r\n static registerProvider(\r\n type: ProviderType,\r\n providerClass: new (apiKey?: string) => LLMProviderInterface\r\n ): void {\r\n this.providers.set(type, providerClass);\r\n }\r\n\r\n /**\r\n * Get available provider types\r\n * @returns List of registered provider types\r\n */\r\n static getAvailableProviders(): ProviderType[] {\r\n return Array.from(this.providers.keys());\r\n }\r\n}"],"names":["ProviderError","AnthropicProvider","ProviderFactory","providers","Map","createProvider","type","apiKey","ProviderClass","get","availableProviders","Array","from","keys","registerProvider","providerClass","set","getAvailableProviders"],"mappings":"AAAA,SAA+BA,aAAa,QAAQ,uBAAuB;AAC3E,SAASC,iBAAiB,QAAQ,uBAAuB;AAIzD,OAAO,MAAMC;IACX,OAAeC,YAA8E,IAAIC,IAAI;QACnG;YAAC;YAAaH;SAAkB;KAKjC,EAAE;IAEH;;;;;GAKC,GACD,OAAOI,eAAeC,IAAkB,EAAEC,MAAe,EAAwB;QAC/E,MAAMC,gBAAgB,IAAI,CAACL,SAAS,CAACM,GAAG,CAACH;QAEzC,IAAI,CAACE,eAAe;YAClB,MAAM,IAAIR,cACR,CAAC,SAAS,EAAEM,KAAK,iBAAiB,CAAC,EACnC,sBACA;gBAAEI,oBAAoBC,MAAMC,IAAI,CAAC,IAAI,CAACT,SAAS,CAACU,IAAI;YAAI;QAE5D;QAEA,OAAO,IAAIL,cAAcD;IAC3B;IAEA;;;;GAIC,GACD,OAAOO,iBACLR,IAAkB,EAClBS,aAA4D,EACtD;QACN,IAAI,CAACZ,SAAS,CAACa,GAAG,CAACV,MAAMS;IAC3B;IAEA;;;GAGC,GACD,OAAOE,wBAAwC;QAC7C,OAAON,MAAMC,IAAI,CAAC,IAAI,CAACT,SAAS,CAACU,IAAI;IACvC;AACF"}
1
+ {"version":3,"sources":["../../src/providers/provider-factory.ts"],"sourcesContent":["import { LLMProviderInterface, ProviderError } from './provider-interface.js';\r\nimport { AnthropicProvider } from './anthropic-provider.js';\r\n\r\nexport type ProviderType = 'anthropic' | 'openai' | 'azure' | 'google';\r\n\r\nexport class ProviderFactory {\r\n private static providers: Map<ProviderType, new (apiKey?: string) => LLMProviderInterface> = new Map([\r\n ['anthropic', AnthropicProvider]\r\n // Placeholder for future providers\r\n // ['openai', OpenAIProvider],\r\n // ['azure', AzureProvider],\r\n // ['google', GoogleProvider]\r\n ]);\r\n\r\n /**\r\n * Create a provider instance\r\n * @param type Provider type\r\n * @param apiKey Optional API key (defaults to env variable)\r\n * @returns LLM Provider instance\r\n */\r\n static createProvider(type: ProviderType, apiKey?: string): LLMProviderInterface {\r\n const ProviderClass = this.providers.get(type);\r\n\r\n if (!ProviderClass) {\r\n throw new ProviderError(\r\n `Provider ${type} is not supported`,\r\n 'PROVIDER_NOT_FOUND',\r\n { availableProviders: Array.from(this.providers.keys()) }\r\n );\r\n }\r\n\r\n return new ProviderClass(apiKey);\r\n }\r\n\r\n /**\r\n * Register a new provider\r\n * @param type Provider type\r\n * @param providerClass Provider implementation class\r\n */\r\n static registerProvider(\r\n type: ProviderType,\r\n providerClass: new (apiKey?: string) => LLMProviderInterface\r\n ): void {\r\n this.providers.set(type, providerClass);\r\n }\r\n\r\n /**\r\n * Get available provider types\r\n * @returns List of registered provider types\r\n */\r\n static getAvailableProviders(): ProviderType[] {\r\n return Array.from(this.providers.keys());\r\n }\r\n}"],"names":["ProviderError","AnthropicProvider","ProviderFactory","providers","Map","createProvider","type","apiKey","ProviderClass","get","availableProviders","Array","from","keys","registerProvider","providerClass","set","getAvailableProviders"],"mappings":"AAAA,SAA+BA,aAAa,QAAQ,0BAA0B;AAC9E,SAASC,iBAAiB,QAAQ,0BAA0B;AAI5D,OAAO,MAAMC;IACX,OAAeC,YAA8E,IAAIC,IAAI;QACnG;YAAC;YAAaH;SAAkB;KAKjC,EAAE;IAEH;;;;;GAKC,GACD,OAAOI,eAAeC,IAAkB,EAAEC,MAAe,EAAwB;QAC/E,MAAMC,gBAAgB,IAAI,CAACL,SAAS,CAACM,GAAG,CAACH;QAEzC,IAAI,CAACE,eAAe;YAClB,MAAM,IAAIR,cACR,CAAC,SAAS,EAAEM,KAAK,iBAAiB,CAAC,EACnC,sBACA;gBAAEI,oBAAoBC,MAAMC,IAAI,CAAC,IAAI,CAACT,SAAS,CAACU,IAAI;YAAI;QAE5D;QAEA,OAAO,IAAIL,cAAcD;IAC3B;IAEA;;;;GAIC,GACD,OAAOO,iBACLR,IAAkB,EAClBS,aAA4D,EACtD;QACN,IAAI,CAACZ,SAAS,CAACa,GAAG,CAACV,MAAMS;IAC3B;IAEA;;;GAGC,GACD,OAAOE,wBAAwC;QAC7C,OAAON,MAAMC,IAAI,CAAC,IAAI,CAACT,SAAS,CAACU,IAAI;IACvC;AACF"}