claude-flow-novice 2.15.2 → 2.15.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (533) hide show
  1. package/.claude/cfn-extras/skills/advanced-features/cfn-agent-swap/recommend-swap.sh +59 -59
  2. package/.claude/cfn-extras/skills/analytics/cfn-improvement-recommender/recommend-improvements.sh +91 -91
  3. package/.claude/cfn-extras/skills/analytics/cfn-pattern-extraction/extract-patterns.sh +79 -79
  4. package/.claude/cfn-extras/skills/analytics/cfn-retrospective-report/generate-report.sh +100 -100
  5. package/.claude/cfn-extras/skills/analytics/cfn-telemetry/start-telemetry.sh +110 -110
  6. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/add-bullet.sh +145 -145
  7. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/log-merge.sh +67 -67
  8. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/monitor-injection-performance.sh +137 -137
  9. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/optimize-injection-pipeline.sh +168 -168
  10. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/query-reflections.sh +35 -35
  11. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/store-reflection.sh +45 -45
  12. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/track-ab-test.sh +41 -41
  13. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/update-reflection.sh +41 -41
  14. package/.claude/cfn-extras/skills/deprecated/cfn-cli-setup/validate-cli-environment.sh +191 -191
  15. package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/create-campaign.sh +231 -231
  16. package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/get-campaign-performance.sh +190 -190
  17. package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/pause-campaign.sh +142 -142
  18. package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/set-budget.sh +181 -181
  19. package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/update-bid-strategy.sh +133 -133
  20. package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/get-conversation-history.sh +121 -121
  21. package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/qualify-lead.sh +156 -156
  22. package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/schedule-demo.sh +181 -181
  23. package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/send-message.sh +137 -137
  24. package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/transfer-to-human.sh +179 -179
  25. package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/create-campaign.sh +183 -183
  26. package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/get-delivery-status.sh +139 -139
  27. package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/opt-out.sh +150 -150
  28. package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/schedule-campaign.sh +187 -187
  29. package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/send-sms.sh +181 -181
  30. package/.claude/cfn-extras/skills/ui-portal/cfn-web-portal/test-web-portal-skill.sh +50 -50
  31. package/.claude/cfn-extras/skills/ui-portal/cfn-web-portal/validate-deployment.sh +84 -84
  32. package/.claude/cfn-extras/skills/utility/cfn-environment-sanitization/sanitize-environment.sh +243 -243
  33. package/.claude/commands/cfn-loop-cli.md +16 -2
  34. package/.claude/commands/switch-api.md +31 -10
  35. package/.claude/hooks/cfn-BACKUP_USAGE.md +243 -243
  36. package/.claude/hooks/cfn-invoke-security-validation.sh +69 -69
  37. package/.claude/hooks/cfn-lint-sql-injection.sh +61 -0
  38. package/.claude/hooks/cfn-post-edit-cfn-retrospective.sh +109 -78
  39. package/.claude/hooks/cfn-post-edit.config.json +44 -44
  40. package/.claude/hooks/cfn-pre-edit-security-warning.sh +40 -0
  41. package/.claude/skills/cfn-agent-spawning/spawn-agent.sh +22 -24
  42. package/.claude/skills/cfn-docker-agent-spawning/SKILL.md +28 -4
  43. package/.claude/skills/cfn-docker-agent-spawning/spawn-agent.sh +3 -1
  44. package/.claude/skills/cfn-docker-loop-orchestration/orchestrate.sh +224 -20
  45. package/.claude/skills/cfn-hybrid-routing/check-dependencies.sh +51 -51
  46. package/.claude/skills/cfn-loop-orchestration/helpers/gate-check.sh +550 -46
  47. package/.claude/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +277 -0
  48. package/.claude/skills/cfn-loop-orchestration/orchestrate.sh +184 -23
  49. package/.claude/skills/cfn-loop-orchestration/security_utils.sh +24 -0
  50. package/.claude/skills/cfn-loop-orchestration/test-iteration-context-injection.sh +366 -0
  51. package/.claude/skills/cfn-loop-validation/orchestrate-cfn-loop.sh +252 -252
  52. package/.claude/skills/cfn-redis-coordination/CENTRALIZED_REDIS_WRAPPER.md +319 -0
  53. package/.claude/skills/cfn-redis-coordination/agent-log.sh +4 -0
  54. package/.claude/skills/cfn-redis-coordination/agent-log.sh.bak +124 -0
  55. package/.claude/skills/cfn-redis-coordination/agent-recovery.sh +74 -74
  56. package/.claude/skills/cfn-redis-coordination/collect-confidence-scores.sh +30 -0
  57. package/.claude/skills/cfn-redis-coordination/get-context.sh +145 -112
  58. package/.claude/skills/cfn-redis-coordination/get-success-criteria.sh +54 -0
  59. package/.claude/skills/cfn-redis-coordination/invoke-waiting-mode.sh +3 -0
  60. package/.claude/skills/cfn-redis-coordination/redis-cli-wrapper.sh +24 -3
  61. package/.claude/skills/cfn-redis-coordination/redis-functions.sh +33 -0
  62. package/.claude/skills/cfn-redis-coordination/report-completion.sh +24 -31
  63. package/.claude/skills/cfn-redis-coordination/store-context.sh +4 -0
  64. package/.claude/skills/cfn-redis-coordination/store-success-criteria.sh +85 -0
  65. package/.claude/skills/cfn-redis-coordination/update-all-scripts.sh +67 -0
  66. package/.claude/skills/cfn-sqlite-memory/ttl-cleanup.sh +17 -25
  67. package/.claude/skills/cfn-transparency-middleware/middleware-config.sh +28 -28
  68. package/.claude/skills/cfn-transparency-middleware/performance-benchmark.sh +78 -78
  69. package/.claude/skills/cfn-transparency-middleware/test-e2e.sh +15 -0
  70. package/.claude/skills/cfn-transparency-middleware/test-integration.sh +161 -161
  71. package/.claude/skills/cfn-transparency-middleware/test-transparency-skill.sh +367 -367
  72. package/.claude/skills/cfn-transparency-middleware/tests/input-validation.sh +107 -92
  73. package/.claude/skills/cfn-transparency-middleware/wrap-agent.sh +131 -131
  74. package/README.md +116 -475
  75. package/claude-assets/agents/cfn-dev-team/README.md +103 -0
  76. package/claude-assets/agents/cfn-dev-team/architecture/goal-planner.md +1 -1
  77. package/claude-assets/agents/cfn-dev-team/coordinators/cfn-frontend-coordinator.md +77 -15
  78. package/claude-assets/agents/cfn-dev-team/coordinators/cfn-v3-coordinator.md +355 -6
  79. package/claude-assets/agents/cfn-dev-team/coordinators/consensus-builder.md +82 -1
  80. package/claude-assets/agents/cfn-dev-team/coordinators/handoff-coordinator.md +82 -1
  81. package/claude-assets/agents/cfn-dev-team/coordinators/multi-sprint-coordinator.md +77 -15
  82. package/claude-assets/agents/cfn-dev-team/dev-ops/docker-specialist.md +99 -12
  83. package/claude-assets/agents/cfn-dev-team/dev-ops/github-commit-agent.md +1 -1
  84. package/claude-assets/agents/cfn-dev-team/dev-ops/kubernetes-specialist.md +97 -0
  85. package/claude-assets/agents/cfn-dev-team/dev-ops/monitoring-specialist.md +20 -1
  86. package/claude-assets/agents/cfn-dev-team/developers/api-gateway-specialist.md +97 -0
  87. package/claude-assets/agents/cfn-dev-team/developers/backend-developer.md +110 -13
  88. package/claude-assets/agents/cfn-dev-team/developers/data/data-engineer.md +106 -15
  89. package/claude-assets/agents/cfn-dev-team/developers/database/database-architect.md +115 -11
  90. package/claude-assets/agents/cfn-dev-team/developers/frontend/mobile-dev.md +94 -7
  91. package/claude-assets/agents/cfn-dev-team/developers/frontend/react-frontend-engineer.md +87 -9
  92. package/claude-assets/agents/cfn-dev-team/developers/frontend/typescript-specialist.md +85 -7
  93. package/claude-assets/agents/cfn-dev-team/developers/frontend/ui-designer.md +160 -28
  94. package/claude-assets/agents/cfn-dev-team/developers/graphql-specialist.md +101 -19
  95. package/claude-assets/agents/cfn-dev-team/developers/rust-developer.md +108 -14
  96. package/claude-assets/agents/cfn-dev-team/reviewers/{reviewer.md → code-reviewer.md} +95 -8
  97. package/claude-assets/agents/cfn-dev-team/reviewers/quality/code-quality-validator.md +107 -7
  98. package/claude-assets/agents/cfn-dev-team/reviewers/quality/perf-analyzer.md +98 -7
  99. package/claude-assets/agents/cfn-dev-team/reviewers/quality/performance-benchmarker.md +95 -7
  100. package/claude-assets/agents/cfn-dev-team/reviewers/quality/security-specialist.md +136 -9
  101. package/claude-assets/agents/cfn-dev-team/testers/api-testing-specialist.md +108 -1
  102. package/claude-assets/agents/cfn-dev-team/testers/chaos-engineering-specialist.md +107 -13
  103. package/claude-assets/agents/cfn-dev-team/testers/contract-tester.md +737 -0
  104. package/claude-assets/agents/cfn-dev-team/testers/e2e/playwright-tester.md +1 -1
  105. package/claude-assets/agents/cfn-dev-team/testers/integration-tester.md +828 -0
  106. package/claude-assets/agents/cfn-dev-team/testers/interaction-tester.md +106 -7
  107. package/claude-assets/agents/cfn-dev-team/testers/load-testing-specialist.md +77 -0
  108. package/claude-assets/agents/cfn-dev-team/testers/mutation-testing-specialist.md +684 -0
  109. package/claude-assets/agents/cfn-dev-team/testers/playwright-tester.md +110 -1
  110. package/claude-assets/agents/cfn-dev-team/testers/tester.md +94 -7
  111. package/claude-assets/agents/cfn-dev-team/utility/code-booster.md +1 -3
  112. package/claude-assets/agents/cfn-dev-team/utility/epic-creator.md +87 -13
  113. package/claude-assets/agents/cfn-dev-team/utility/memory-leak-specialist.md +103 -7
  114. package/claude-assets/agents/cfn-dev-team/utility/researcher.md +1 -3
  115. package/claude-assets/agents/cfn-dev-team/utility/z-ai-specialist.md +94 -7
  116. package/claude-assets/agents/docker-coordinators/cfn-docker-v3-coordinator.md +46 -0
  117. package/claude-assets/agents/project-only-agents/npm-package-specialist.md +1 -1
  118. package/claude-assets/cfn-extras/skills/advanced-features/cfn-agent-swap/recommend-swap.sh +59 -59
  119. package/claude-assets/cfn-extras/skills/analytics/cfn-improvement-recommender/recommend-improvements.sh +91 -91
  120. package/claude-assets/cfn-extras/skills/analytics/cfn-pattern-extraction/extract-patterns.sh +79 -79
  121. package/claude-assets/cfn-extras/skills/analytics/cfn-retrospective-report/generate-report.sh +100 -100
  122. package/claude-assets/cfn-extras/skills/analytics/cfn-telemetry/start-telemetry.sh +110 -110
  123. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/add-bullet.sh +145 -145
  124. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/log-merge.sh +67 -67
  125. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/monitor-injection-performance.sh +137 -137
  126. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/optimize-injection-pipeline.sh +168 -168
  127. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/query-reflections.sh +35 -35
  128. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/store-reflection.sh +45 -45
  129. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/track-ab-test.sh +41 -41
  130. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/update-reflection.sh +41 -41
  131. package/claude-assets/cfn-extras/skills/deprecated/cfn-cli-setup/validate-cli-environment.sh +191 -191
  132. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/create-campaign.sh +231 -231
  133. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/get-campaign-performance.sh +190 -190
  134. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/pause-campaign.sh +142 -142
  135. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/set-budget.sh +181 -181
  136. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/update-bid-strategy.sh +133 -133
  137. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/get-conversation-history.sh +121 -121
  138. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/qualify-lead.sh +156 -156
  139. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/schedule-demo.sh +181 -181
  140. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/send-message.sh +137 -137
  141. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/transfer-to-human.sh +179 -179
  142. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/create-campaign.sh +183 -183
  143. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/get-delivery-status.sh +139 -139
  144. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/opt-out.sh +150 -150
  145. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/schedule-campaign.sh +187 -187
  146. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/send-sms.sh +181 -181
  147. package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/test-web-portal-skill.sh +50 -50
  148. package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/validate-deployment.sh +84 -84
  149. package/claude-assets/cfn-extras/skills/utility/cfn-environment-sanitization/sanitize-environment.sh +243 -243
  150. package/claude-assets/commands/cfn-loop-cli.md +16 -2
  151. package/claude-assets/commands/switch-api.md +31 -10
  152. package/claude-assets/hooks/cfn-BACKUP_USAGE.md +243 -243
  153. package/claude-assets/hooks/cfn-invoke-security-validation.sh +69 -69
  154. package/claude-assets/hooks/cfn-lint-sql-injection.sh +61 -0
  155. package/claude-assets/hooks/cfn-post-edit-cfn-retrospective.sh +109 -78
  156. package/claude-assets/hooks/cfn-post-edit.config.json +44 -44
  157. package/claude-assets/hooks/cfn-post-execution/memory-cleanup.sh +19 -19
  158. package/claude-assets/hooks/cfn-pre-edit-security-warning.sh +40 -0
  159. package/claude-assets/hooks/cfn-pre-execution/memory-check.sh +19 -19
  160. package/claude-assets/hooks/detect-hardcoded-credentials.sh +212 -0
  161. package/claude-assets/skills/SKILL_TEMPLATE.md +774 -0
  162. package/claude-assets/skills/agent-lifecycle/execute-lifecycle-hook.sh +543 -572
  163. package/claude-assets/skills/agent-lifecycle/simple-audit.sh +57 -30
  164. package/claude-assets/skills/agent-template-generator/SKILL.md +440 -0
  165. package/claude-assets/skills/agent-template-generator/generate-agent.sh +405 -0
  166. package/claude-assets/skills/agent-validation-linter/SKILL.md +589 -0
  167. package/claude-assets/skills/agent-validation-linter/lint-agents.sh +271 -0
  168. package/claude-assets/skills/bootstrap/bash-fundamentals.md +786 -0
  169. package/claude-assets/skills/bootstrap/database-connection.md +464 -0
  170. package/claude-assets/skills/bootstrap/error-handling.md +580 -0
  171. package/claude-assets/skills/bootstrap/file-operations.md +699 -0
  172. package/claude-assets/skills/bootstrap/skill-loader.md +616 -0
  173. package/claude-assets/skills/bootstrap/sqlite-params.sh +287 -0
  174. package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh +22 -24
  175. package/claude-assets/skills/cfn-automatic-memory-persistence/persist-agent-output.sh +48 -48
  176. package/claude-assets/skills/cfn-automatic-memory-persistence/query-agent-history.sh +34 -34
  177. package/claude-assets/skills/cfn-automatic-memory-persistence/test-memory-persistence.sh +17 -16
  178. package/claude-assets/skills/cfn-deliverable-validation/confidence-calculator.sh +261 -261
  179. package/claude-assets/skills/cfn-deployment/SKILL.md +293 -0
  180. package/claude-assets/skills/cfn-deployment/execute.sh +21 -0
  181. package/claude-assets/skills/cfn-docker-agent-spawning/SKILL.md +28 -4
  182. package/claude-assets/skills/cfn-docker-agent-spawning/spawn-agent.sh +3 -1
  183. package/claude-assets/skills/cfn-docker-loop-orchestration/orchestrate.sh +224 -20
  184. package/claude-assets/skills/cfn-environment-sanitization/sanitize-environment.sh +38 -0
  185. package/claude-assets/skills/cfn-error-batching-strategy/lib/core-functions.sh +47 -47
  186. package/claude-assets/skills/cfn-expert-update/update-expert.sh +345 -345
  187. package/claude-assets/skills/cfn-file-operations/SKILL.md +290 -0
  188. package/claude-assets/skills/cfn-file-operations/execute.sh +129 -0
  189. package/claude-assets/skills/cfn-file-operations/lib/atomic-write.sh +294 -0
  190. package/claude-assets/skills/cfn-file-operations/lib/lock.sh +361 -0
  191. package/claude-assets/skills/cfn-file-operations/test.sh +369 -0
  192. package/claude-assets/skills/cfn-hybrid-routing/check-dependencies.sh +51 -51
  193. package/claude-assets/skills/cfn-intervention-detector/detect-intervention.sh +110 -110
  194. package/claude-assets/skills/cfn-intervention-orchestrator/execute-intervention.sh +58 -58
  195. package/claude-assets/skills/cfn-log-operations/SKILL.md +308 -0
  196. package/claude-assets/skills/cfn-log-operations/execute.sh +420 -0
  197. package/claude-assets/skills/cfn-log-operations/lib/rotate.sh +406 -0
  198. package/claude-assets/skills/cfn-log-operations/lib/search.sh +448 -0
  199. package/claude-assets/skills/cfn-log-operations/test.sh +394 -0
  200. package/claude-assets/skills/cfn-loop-orchestration/helpers/gate-check.sh +550 -46
  201. package/claude-assets/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +277 -0
  202. package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh +184 -23
  203. package/claude-assets/skills/cfn-loop-orchestration/security_utils.sh +24 -0
  204. package/claude-assets/skills/cfn-loop-orchestration/test-iteration-context-injection.sh +366 -0
  205. package/claude-assets/skills/cfn-loop-validation/orchestrate-cfn-loop.sh +252 -252
  206. package/claude-assets/skills/cfn-loop2-output-processing/process-validator-output.sh +275 -275
  207. package/claude-assets/skills/cfn-memory-management/check-memory.sh +159 -159
  208. package/claude-assets/skills/cfn-memory-management/cleanup-memory.sh +196 -196
  209. package/claude-assets/skills/cfn-node-heap-sizer/task-mode-heap-limiter.sh +325 -325
  210. package/claude-assets/skills/cfn-parameterized-queries/SKILL.md +339 -0
  211. package/claude-assets/skills/cfn-playbook/query-playbook.sh +19 -15
  212. package/claude-assets/skills/cfn-playbook/update-playbook.sh +25 -14
  213. package/claude-assets/skills/cfn-playbook-auto-update/auto-update-playbook.sh +85 -85
  214. package/claude-assets/skills/cfn-process-instrumentation/instrument-process.sh +44 -0
  215. package/claude-assets/skills/cfn-promotion/SKILL.md +305 -0
  216. package/claude-assets/skills/cfn-redis-coordination/CENTRALIZED_REDIS_WRAPPER.md +319 -0
  217. package/claude-assets/skills/cfn-redis-coordination/agent-log.sh +4 -0
  218. package/claude-assets/skills/cfn-redis-coordination/agent-log.sh.bak +124 -0
  219. package/claude-assets/skills/cfn-redis-coordination/agent-recovery.sh +74 -74
  220. package/claude-assets/skills/cfn-redis-coordination/collect-confidence-scores.sh +30 -0
  221. package/claude-assets/skills/cfn-redis-coordination/get-context.sh +145 -112
  222. package/claude-assets/skills/cfn-redis-coordination/get-success-criteria.sh +54 -0
  223. package/claude-assets/skills/cfn-redis-coordination/invoke-waiting-mode.sh +3 -0
  224. package/claude-assets/skills/cfn-redis-coordination/redis-cli-wrapper.sh +24 -3
  225. package/claude-assets/skills/cfn-redis-coordination/redis-functions.sh +33 -0
  226. package/claude-assets/skills/cfn-redis-coordination/report-completion.sh +24 -31
  227. package/claude-assets/skills/cfn-redis-coordination/store-context.sh +4 -0
  228. package/claude-assets/skills/cfn-redis-coordination/store-success-criteria.sh +85 -0
  229. package/claude-assets/skills/cfn-redis-coordination/update-all-scripts.sh +67 -0
  230. package/claude-assets/skills/cfn-scope-simplifier/simplify-scope.sh +67 -67
  231. package/claude-assets/skills/cfn-skill-loader/SKILL.md +466 -0
  232. package/claude-assets/skills/cfn-skill-loader/execute.sh +344 -0
  233. package/claude-assets/skills/cfn-specialist-injection/recommend-specialist.sh +56 -56
  234. package/claude-assets/skills/cfn-sqlite-memory/ttl-cleanup.sh +17 -25
  235. package/claude-assets/skills/cfn-standardized-error-handling/capture-agent-error.sh +86 -86
  236. package/claude-assets/skills/cfn-standardized-error-handling/test-error-handling.sh +165 -165
  237. package/claude-assets/skills/cfn-task-audit/get-audit-data.sh +42 -21
  238. package/claude-assets/skills/cfn-task-audit/store-task-audit.sh +17 -10
  239. package/claude-assets/skills/cfn-task-config-init/initialize-config.sh +264 -264
  240. package/claude-assets/skills/cfn-task-decomposition/task-decomposer.sh +278 -278
  241. package/claude-assets/skills/cfn-test-runner/detect-regressions.sh +17 -14
  242. package/claude-assets/skills/cfn-test-runner/detect-regressions.sh.backup-1763392821 +55 -0
  243. package/claude-assets/skills/cfn-test-runner/store-benchmarks.sh +17 -19
  244. package/claude-assets/skills/cfn-transparency-middleware/middleware-config.sh +28 -28
  245. package/claude-assets/skills/cfn-transparency-middleware/performance-benchmark.sh +78 -78
  246. package/claude-assets/skills/cfn-transparency-middleware/test-e2e.sh +15 -0
  247. package/claude-assets/skills/cfn-transparency-middleware/test-integration.sh +161 -161
  248. package/claude-assets/skills/cfn-transparency-middleware/test-transparency-skill.sh +367 -367
  249. package/claude-assets/skills/cfn-transparency-middleware/tests/input-validation.sh +107 -92
  250. package/claude-assets/skills/cfn-transparency-middleware/wrap-agent.sh +131 -131
  251. package/claude-assets/skills/cfn-utilities/SKILL.md +237 -0
  252. package/claude-assets/skills/cfn-utilities/execute.sh +32 -0
  253. package/claude-assets/skills/cfn-utilities/lib/errors.sh +56 -0
  254. package/claude-assets/skills/cfn-utilities/lib/file-ops.sh +164 -0
  255. package/claude-assets/skills/cfn-utilities/lib/logging.sh +77 -0
  256. package/claude-assets/skills/cfn-utilities/lib/retry.sh +127 -0
  257. package/claude-assets/skills/cfn-utilities/test.sh +317 -0
  258. package/claude-assets/skills/docker-build/SKILL.md +96 -203
  259. package/claude-assets/skills/docker-build/build.sh +73 -73
  260. package/claude-assets/skills/integration/agent-handoff.sh +492 -0
  261. package/claude-assets/skills/integration/file-operations.sh +414 -0
  262. package/claude-assets/skills/json-validation/SKILL.md +431 -0
  263. package/claude-assets/skills/json-validation/test-validate-success-criteria.sh +421 -0
  264. package/claude-assets/skills/json-validation/validate-success-criteria.sh +197 -0
  265. package/claude-assets/skills/redis-coordination/validate-parameters.sh +34 -0
  266. package/claude-assets/skills/workflow-codification/APPROVAL_WORKFLOW.md +806 -0
  267. package/claude-assets/skills/workflow-codification/COST_TRACKING.md +637 -0
  268. package/claude-assets/skills/workflow-codification/DEPLOY_QUICK_REFERENCE.md +106 -0
  269. package/claude-assets/skills/workflow-codification/EDGE_CASE_TRACKING.md +404 -0
  270. package/claude-assets/skills/workflow-codification/PROPAGATE_UPDATE_QUICK_REFERENCE.md +366 -0
  271. package/claude-assets/skills/workflow-codification/README_PHASE4.md +457 -0
  272. package/claude-assets/skills/workflow-codification/SKILL.md +110 -0
  273. package/claude-assets/skills/workflow-codification/analyze-patterns.sh +899 -0
  274. package/claude-assets/skills/workflow-codification/approval-workflow.sh +514 -0
  275. package/claude-assets/skills/workflow-codification/deploy-approved-skill.sh +481 -0
  276. package/claude-assets/skills/workflow-codification/deploy-approved-skill.sh.backup-1763392820 +512 -0
  277. package/claude-assets/skills/workflow-codification/generate-skill-update.sh +525 -0
  278. package/claude-assets/skills/workflow-codification/lib/security-utils.sh +204 -0
  279. package/claude-assets/skills/workflow-codification/propagate-skill-update.sh +648 -0
  280. package/claude-assets/skills/workflow-codification/propagate-skill-update.sh.backup-1763392820 +664 -0
  281. package/claude-assets/skills/workflow-codification/review-skill.sh +643 -0
  282. package/claude-assets/skills/workflow-codification/templates/email-notification.txt +114 -0
  283. package/claude-assets/skills/workflow-codification/templates/slack-notification.md +85 -0
  284. package/claude-assets/skills/workflow-codification/test-integration.sh +296 -0
  285. package/claude-assets/skills/workflow-codification/test-metadata-update.sh +350 -0
  286. package/claude-assets/skills/workflow-codification/track-cost-savings.sh +486 -0
  287. package/claude-assets/skills/workflow-codification/track-cost-savings.sh.backup-1763392821 +445 -0
  288. package/claude-assets/skills/workflow-codification/track-edge-case.sh +290 -0
  289. package/claude-assets/skills/workflow-codification/workflow-codification.db +0 -0
  290. package/dist/ace/ace-curator.js +10 -2
  291. package/dist/ace/ace-curator.js.map +1 -1
  292. package/dist/ace/ace-generator.js +4 -0
  293. package/dist/ace/ace-generator.js.map +1 -1
  294. package/dist/ace/ace-reflector.js +1 -1
  295. package/dist/ace/ace-reflector.js.map +1 -1
  296. package/dist/ace/context-injection.js +24 -2
  297. package/dist/ace/context-injection.js.map +1 -1
  298. package/dist/agents/agent-loader.js +146 -165
  299. package/dist/agents/agent-loader.js.map +1 -1
  300. package/dist/agents/task-agent-integration.js +1 -1
  301. package/dist/agents/task-agent-integration.js.map +1 -1
  302. package/dist/api/health-endpoints.js +390 -0
  303. package/dist/api/health-endpoints.js.map +1 -0
  304. package/dist/cli/agent-executor.js +4 -1
  305. package/dist/cli/agent-executor.js.map +1 -1
  306. package/dist/cli/agent-prompt-builder.js +89 -1
  307. package/dist/cli/agent-prompt-builder.js.map +1 -1
  308. package/dist/cli/agent-spawn.js +130 -37
  309. package/dist/cli/agent-spawn.js.map +1 -1
  310. package/dist/cli/config-manager.js +91 -109
  311. package/dist/cli/config-manager.js.map +1 -1
  312. package/dist/cli/skill-cache-validator.js +412 -0
  313. package/dist/cli/skill-cache-validator.js.map +1 -0
  314. package/dist/cli/skill-cli.js +991 -0
  315. package/dist/cli/skill-cli.js.map +1 -0
  316. package/dist/cli/skill-execution-logger.js +284 -0
  317. package/dist/cli/skill-execution-logger.js.map +1 -0
  318. package/dist/cli/skill-loader.js +457 -0
  319. package/dist/cli/skill-loader.js.map +1 -0
  320. package/dist/coordination/event-bus.js +2 -2
  321. package/dist/coordination/event-bus.js.map +1 -1
  322. package/dist/coordination/fleet-manager.js +1 -1
  323. package/dist/coordination/fleet-manager.js.map +1 -1
  324. package/dist/coordination/index.js +23 -9
  325. package/dist/coordination/index.js.map +1 -1
  326. package/dist/coordination/types/fleet-manager.types.js.map +1 -1
  327. package/dist/db/migration-manager.js +483 -0
  328. package/dist/db/migration-manager.js.map +1 -0
  329. package/dist/db/skills-query.js +535 -0
  330. package/dist/db/skills-query.js.map +1 -0
  331. package/dist/integration/DatabaseHandoff.js +507 -0
  332. package/dist/integration/DatabaseHandoff.js.map +1 -0
  333. package/dist/integration/StandardAdapter.js +291 -0
  334. package/dist/integration/StandardAdapter.js.map +1 -0
  335. package/dist/jobs/edge-case-analyzer.js +367 -0
  336. package/dist/jobs/edge-case-analyzer.js.map +1 -0
  337. package/dist/jobs/promotion-sla-enforcer.js +288 -0
  338. package/dist/jobs/promotion-sla-enforcer.js.map +1 -0
  339. package/dist/lib/agent-output-parser.js +518 -0
  340. package/dist/lib/agent-output-parser.js.map +1 -0
  341. package/dist/lib/agent-output-validator.js +950 -0
  342. package/dist/lib/agent-output-validator.js.map +1 -0
  343. package/dist/lib/agent-workspace.js +281 -0
  344. package/dist/lib/agent-workspace.js.map +1 -0
  345. package/dist/lib/artifact-registry.js +443 -0
  346. package/dist/lib/artifact-registry.js.map +1 -0
  347. package/dist/lib/atomic-file-writer.js +377 -0
  348. package/dist/lib/atomic-file-writer.js.map +1 -0
  349. package/dist/lib/backup-manager.js +779 -0
  350. package/dist/lib/backup-manager.js.map +1 -0
  351. package/dist/lib/checkpoint-manager.js +837 -0
  352. package/dist/lib/checkpoint-manager.js.map +1 -0
  353. package/dist/lib/circuit-breaker.js +340 -0
  354. package/dist/lib/circuit-breaker.js.map +1 -0
  355. package/dist/lib/completion-signal-handler.js +243 -0
  356. package/dist/lib/completion-signal-handler.js.map +1 -0
  357. package/dist/lib/config-manager.js +312 -0
  358. package/dist/lib/config-manager.js.map +1 -0
  359. package/dist/lib/config-migrator.js +386 -0
  360. package/dist/lib/config-migrator.js.map +1 -0
  361. package/dist/lib/config-validator.js +687 -0
  362. package/dist/lib/config-validator.js.map +1 -0
  363. package/dist/lib/correlation-cache.js +311 -0
  364. package/dist/lib/correlation-cache.js.map +1 -0
  365. package/dist/lib/correlation.js +263 -0
  366. package/dist/lib/correlation.js.map +1 -0
  367. package/dist/lib/database-service/connection-pool-manager.js +520 -0
  368. package/dist/lib/database-service/connection-pool-manager.js.map +1 -0
  369. package/dist/lib/database-service/correlation.js +329 -0
  370. package/dist/lib/database-service/correlation.js.map +1 -0
  371. package/dist/lib/database-service/errors.js +120 -0
  372. package/dist/lib/database-service/errors.js.map +1 -0
  373. package/dist/lib/database-service/index.js +168 -0
  374. package/dist/lib/database-service/index.js.map +1 -0
  375. package/dist/lib/database-service/postgres-adapter.js +526 -0
  376. package/dist/lib/database-service/postgres-adapter.js.map +1 -0
  377. package/dist/lib/database-service/redis-adapter.js +360 -0
  378. package/dist/lib/database-service/redis-adapter.js.map +1 -0
  379. package/dist/lib/database-service/sqlite-adapter.js +544 -0
  380. package/dist/lib/database-service/sqlite-adapter.js.map +1 -0
  381. package/dist/lib/database-service/transaction-manager.js +773 -0
  382. package/dist/lib/database-service/transaction-manager.js.map +1 -0
  383. package/dist/lib/database-service/types.js +23 -0
  384. package/dist/lib/database-service/types.js.map +1 -0
  385. package/dist/lib/deadlock-resolver.js +292 -0
  386. package/dist/lib/deadlock-resolver.js.map +1 -0
  387. package/dist/lib/distributed-lock.js +451 -0
  388. package/dist/lib/distributed-lock.js.map +1 -0
  389. package/dist/lib/edge-case-deduplicator.js +227 -0
  390. package/dist/lib/edge-case-deduplicator.js.map +1 -0
  391. package/dist/lib/encryption-manager.js +322 -0
  392. package/dist/lib/encryption-manager.js.map +1 -0
  393. package/dist/lib/error-aggregator.js +234 -0
  394. package/dist/lib/error-aggregator.js.map +1 -0
  395. package/dist/lib/errors.js +287 -0
  396. package/dist/lib/errors.js.map +1 -0
  397. package/dist/lib/file-lock-manager.js +578 -0
  398. package/dist/lib/file-lock-manager.js.map +1 -0
  399. package/dist/lib/file-operations.js +367 -0
  400. package/dist/lib/file-operations.js.map +1 -0
  401. package/dist/lib/idempotent-write.js +237 -0
  402. package/dist/lib/idempotent-write.js.map +1 -0
  403. package/dist/lib/integration-schema-validator.js +522 -0
  404. package/dist/lib/integration-schema-validator.js.map +1 -0
  405. package/dist/lib/lock-health-monitor.js +298 -0
  406. package/dist/lib/lock-health-monitor.js.map +1 -0
  407. package/dist/lib/log-shipper.js +422 -0
  408. package/dist/lib/log-shipper.js.map +1 -0
  409. package/dist/lib/logging.js +146 -0
  410. package/dist/lib/logging.js.map +1 -0
  411. package/dist/lib/message-deduplicator.js +439 -0
  412. package/dist/lib/message-deduplicator.js.map +1 -0
  413. package/dist/lib/multi-system-query.js +604 -0
  414. package/dist/lib/multi-system-query.js.map +1 -0
  415. package/dist/lib/orphan-detector.js +332 -0
  416. package/dist/lib/orphan-detector.js.map +1 -0
  417. package/dist/lib/password-generator.js +166 -0
  418. package/dist/lib/password-generator.js.map +1 -0
  419. package/dist/lib/path-validator.js +429 -0
  420. package/dist/lib/path-validator.js.map +1 -0
  421. package/dist/lib/query-translator.js +905 -0
  422. package/dist/lib/query-translator.js.map +1 -0
  423. package/dist/lib/queue-recovery.js +469 -0
  424. package/dist/lib/queue-recovery.js.map +1 -0
  425. package/dist/lib/redis-queue-manager.js +512 -0
  426. package/dist/lib/redis-queue-manager.js.map +1 -0
  427. package/dist/lib/reflection-archiver.js +272 -0
  428. package/dist/lib/reflection-archiver.js.map +1 -0
  429. package/dist/lib/retry-manager.js +453 -0
  430. package/dist/lib/retry-manager.js.map +1 -0
  431. package/dist/lib/retry.js +262 -0
  432. package/dist/lib/retry.js.map +1 -0
  433. package/dist/lib/schema-transform.js +695 -0
  434. package/dist/lib/schema-transform.js.map +1 -0
  435. package/dist/lib/schema-validator.js +491 -0
  436. package/dist/lib/schema-validator.js.map +1 -0
  437. package/dist/lib/skill-cache.js +297 -0
  438. package/dist/lib/skill-cache.js.map +1 -0
  439. package/dist/lib/skill-content-manager.js +337 -0
  440. package/dist/lib/skill-content-manager.js.map +1 -0
  441. package/dist/lib/skill-frontmatter-parser.js +237 -0
  442. package/dist/lib/skill-frontmatter-parser.js.map +1 -0
  443. package/dist/lib/skill-git-integration.js +275 -0
  444. package/dist/lib/skill-git-integration.js.map +1 -0
  445. package/dist/lib/skill-markdown-validator.js +396 -0
  446. package/dist/lib/skill-markdown-validator.js.map +1 -0
  447. package/dist/lib/skill-output-parser.js +312 -0
  448. package/dist/lib/skill-output-parser.js.map +1 -0
  449. package/dist/lib/unified-query-api.js +467 -0
  450. package/dist/lib/unified-query-api.js.map +1 -0
  451. package/dist/middleware/auth-middleware.js +350 -0
  452. package/dist/middleware/auth-middleware.js.map +1 -0
  453. package/dist/middleware/schema-validation.js +347 -0
  454. package/dist/middleware/schema-validation.js.map +1 -0
  455. package/dist/providers/anthropic-provider.js +1 -1
  456. package/dist/providers/anthropic-provider.js.map +1 -1
  457. package/dist/providers/provider-factory.js +2 -2
  458. package/dist/providers/provider-factory.js.map +1 -1
  459. package/dist/services/edge-case-analyzer.js +321 -0
  460. package/dist/services/edge-case-analyzer.js.map +1 -0
  461. package/dist/services/edge-case-deduplicator.js +266 -0
  462. package/dist/services/edge-case-deduplicator.js.map +1 -0
  463. package/dist/services/edge-case-detector.js +337 -0
  464. package/dist/services/edge-case-detector.js.map +1 -0
  465. package/dist/services/edge-case-tracker.js +547 -0
  466. package/dist/services/edge-case-tracker.js.map +1 -0
  467. package/dist/services/health-check-system.js +586 -0
  468. package/dist/services/health-check-system.js.map +1 -0
  469. package/dist/services/metrics-logger.js +412 -0
  470. package/dist/services/metrics-logger.js.map +1 -0
  471. package/dist/services/patch-generator.js +378 -0
  472. package/dist/services/patch-generator.js.map +1 -0
  473. package/dist/services/patch-validator.js +337 -0
  474. package/dist/services/patch-validator.js.map +1 -0
  475. package/dist/services/performance-monitor.js +811 -0
  476. package/dist/services/performance-monitor.js.map +1 -0
  477. package/dist/services/promotion-pipeline.js +918 -0
  478. package/dist/services/promotion-pipeline.js.map +1 -0
  479. package/dist/services/promotion-validator.js +394 -0
  480. package/dist/services/promotion-validator.js.map +1 -0
  481. package/dist/services/reflection-logger.js +388 -0
  482. package/dist/services/reflection-logger.js.map +1 -0
  483. package/dist/services/skill-deployment.js +472 -0
  484. package/dist/services/skill-deployment.js.map +1 -0
  485. package/dist/services/skill-loader.js +427 -0
  486. package/dist/services/skill-loader.js.map +1 -0
  487. package/dist/services/skill-promotion.js +372 -0
  488. package/dist/services/skill-promotion.js.map +1 -0
  489. package/dist/services/skill-validator.js +454 -0
  490. package/dist/services/skill-validator.js.map +1 -0
  491. package/dist/services/skill-versioning.js +244 -0
  492. package/dist/services/skill-versioning.js.map +1 -0
  493. package/dist/services/workspace-supervisor.js +597 -0
  494. package/dist/services/workspace-supervisor.js.map +1 -0
  495. package/dist/types/agent-output.js +44 -0
  496. package/dist/types/agent-output.js.map +1 -0
  497. package/dist/types/config.js +28 -0
  498. package/dist/types/config.js.map +1 -0
  499. package/dist/types/edge-case.js +45 -0
  500. package/dist/types/edge-case.js.map +1 -0
  501. package/package.json +201 -176
  502. package/readme/README.md +19 -4
  503. package/scripts/artifact-cleanup.sh +392 -0
  504. package/scripts/backup-cleanup.sh +627 -0
  505. package/scripts/cleanup-workspaces.sh +412 -0
  506. package/scripts/cleanup-yaml-configs.sh +141 -0
  507. package/scripts/deploy-approved-skills.sh +263 -0
  508. package/scripts/deploy-production.sh +355 -355
  509. package/scripts/docker-playwright-fix.sh +311 -311
  510. package/scripts/docker-rebuild-all-agents.sh +127 -127
  511. package/scripts/health-check.sh +447 -0
  512. package/scripts/log-aggregator.sh +554 -0
  513. package/scripts/log-monitor.sh +629 -0
  514. package/scripts/manage-agent-workspaces.sh +434 -0
  515. package/scripts/memory-leak-prevention.sh +305 -305
  516. package/scripts/migrate-artifacts.sh +563 -0
  517. package/scripts/migrate-schema.sh +533 -0
  518. package/scripts/migrate-yaml-to-json.sh +465 -0
  519. package/scripts/promote-staged-skills.sh +423 -0
  520. package/scripts/run-marketing-tests.sh +42 -42
  521. package/scripts/update_paths.sh +46 -46
  522. package/scripts/verify-no-secrets.sh +88 -35
  523. package/.claude/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +0 -161
  524. package/.claude/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +0 -728
  525. package/.claude/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +0 -131
  526. package/.claude/skills/cfn-agent-spawning/spawn-agent.sh.backup +0 -273
  527. package/.claude/skills/cfn-loop-orchestration/orchestrate.sh.backup +0 -949
  528. package/README.md.backup_before_replace +0 -781
  529. package/claude-assets/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +0 -161
  530. package/claude-assets/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +0 -728
  531. package/claude-assets/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +0 -131
  532. package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh.backup +0 -273
  533. package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh.backup +0 -949
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/services/edge-case-deduplicator.ts"],"sourcesContent":["/**\r\n * Edge Case Deduplicator Service\r\n *\r\n * Deduplicates edge cases to prevent redundant tracking.\r\n * Part of Task 1.5: MVP Edge Case Feedback Loop\r\n *\r\n * Features:\r\n * - Similarity detection using Levenshtein distance\r\n * - Pattern matching for error messages and stack traces\r\n * - Configurable similarity threshold (default: 90%)\r\n * - Occurrence count tracking\r\n * - Smart deduplication based on skill + error type + message similarity\r\n *\r\n * Usage:\r\n * const deduplicator = new EdgeCaseDeduplicator(dbService, logger);\r\n * const isDuplicate = await deduplicator.deduplicateEdgeCase(edgeCase);\r\n */\r\n\r\nimport { DatabaseService, OperationResult } from '../lib/database-service.js';\r\nimport { createLogger, Logger } from '../lib/logging.js';\r\nimport { createError, ErrorCode } from '../lib/errors.js';\r\nimport type { EdgeCase, ErrorCategory } from './edge-case-detector.js';\r\n\r\n/**\r\n * Deduplicator configuration\r\n */\r\nexport interface DeduplicatorConfig {\r\n /** Similarity threshold (0.0 - 1.0, default: 0.90) */\r\n similarityThreshold?: number;\r\n /** Maximum age of edge cases to consider for deduplication (days, default: 30) */\r\n maxAgedays?: number;\r\n /** Maximum number of candidates to check (default: 50) */\r\n maxCandidates?: number;\r\n}\r\n\r\n/**\r\n * Similarity score breakdown\r\n */\r\nexport interface SimilarityScore {\r\n total: number;\r\n skillAndType: number;\r\n messageMatch: number;\r\n stackMatch: number;\r\n}\r\n\r\n/**\r\n * Edge case deduplicator service\r\n */\r\nexport class EdgeCaseDeduplicator {\r\n private logger: Logger;\r\n private config: Required<DeduplicatorConfig>;\r\n\r\n constructor(\r\n private dbService: DatabaseService,\r\n logger?: Logger,\r\n config?: DeduplicatorConfig\r\n ) {\r\n this.logger = logger || createLogger('edge-case-deduplicator');\r\n\r\n // Set default config\r\n this.config = {\r\n similarityThreshold: config?.similarityThreshold ?? 0.90,\r\n maxAgedays: config?.maxAgedays ?? 30,\r\n maxCandidates: config?.maxCandidates ?? 50,\r\n };\r\n }\r\n\r\n /**\r\n * Deduplicate edge case against existing records\r\n *\r\n * @param edgeCase - Edge case to deduplicate\r\n * @returns True if duplicate found and handled, false otherwise\r\n */\r\n async deduplicateEdgeCase(edgeCase: EdgeCase): Promise<boolean> {\r\n try {\r\n // 1. Find similar failures\r\n const similar = await this.findSimilarFailures(edgeCase);\r\n\r\n if (similar.length === 0) {\r\n this.logger.debug('No similar edge cases found', {\r\n skill_id: edgeCase.skill_id,\r\n error_type: edgeCase.error_type,\r\n });\r\n return false;\r\n }\r\n\r\n this.logger.debug(`Found ${similar.length} similar edge cases`, {\r\n skill_id: edgeCase.skill_id,\r\n error_type: edgeCase.error_type,\r\n });\r\n\r\n // 2. Calculate similarity scores\r\n for (const candidate of similar) {\r\n const score = this.calculateSimilarity(edgeCase, candidate);\r\n\r\n this.logger.debug('Similarity score calculated', {\r\n candidate_id: candidate.id,\r\n total_score: score.total,\r\n threshold: this.config.similarityThreshold,\r\n });\r\n\r\n // 3. If >threshold% similar, it's a duplicate\r\n if (score.total >= this.config.similarityThreshold) {\r\n this.logger.info('Duplicate edge case found', {\r\n edge_case_id: edgeCase.id,\r\n duplicate_of: candidate.id,\r\n similarity_score: score.total,\r\n });\r\n\r\n // Update existing edge case\r\n await this.incrementOccurrenceCount(candidate.id);\r\n return true;\r\n }\r\n }\r\n\r\n // No duplicates found\r\n return false;\r\n } catch (error) {\r\n this.logger.error('Failed to deduplicate edge case', error as Error, {\r\n edge_case_id: edgeCase.id,\r\n });\r\n // Don't throw - allow edge case to be stored even if deduplication fails\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Find similar failures based on skill and error type\r\n *\r\n * @param edgeCase - Edge case to find similar failures for\r\n * @returns Array of similar edge cases\r\n */\r\n async findSimilarFailures(edgeCase: EdgeCase): Promise<EdgeCase[]> {\r\n const sqlite = this.dbService.getAdapter('sqlite');\r\n\r\n // Calculate cutoff date\r\n const cutoffDate = new Date();\r\n cutoffDate.setDate(cutoffDate.getDate() - this.config.maxAgedays);\r\n\r\n // Query for similar edge cases\r\n const query = `\r\n SELECT *\r\n FROM edge_cases\r\n WHERE skill_id = ?\r\n AND error_type = ?\r\n AND status = 'new'\r\n AND last_seen >= ?\r\n ORDER BY occurrence_count DESC, last_seen DESC\r\n LIMIT ?\r\n `;\r\n\r\n const rows = await sqlite.raw<any[]>(query, [\r\n edgeCase.skill_id,\r\n edgeCase.error_type,\r\n cutoffDate.toISOString(),\r\n this.config.maxCandidates,\r\n ]);\r\n\r\n if (!Array.isArray(rows)) {\r\n return [];\r\n }\r\n\r\n return rows.map(row => this.mapRowToEdgeCase(row));\r\n }\r\n\r\n /**\r\n * Calculate similarity between two edge cases\r\n *\r\n * Similarity breakdown:\r\n * - Same skill + error type: 40%\r\n * - Error message similarity: 30%\r\n * - Stack trace similarity: 30%\r\n *\r\n * @param a - First edge case\r\n * @param b - Second edge case\r\n * @returns Similarity score (0.0 - 1.0)\r\n */\r\n calculateSimilarity(a: EdgeCase, b: EdgeCase): SimilarityScore {\r\n let score = 0;\r\n const breakdown: SimilarityScore = {\r\n total: 0,\r\n skillAndType: 0,\r\n messageMatch: 0,\r\n stackMatch: 0,\r\n };\r\n\r\n // Same skill + error type = 40%\r\n if (a.skill_id === b.skill_id && a.error_type === b.error_type) {\r\n score += 0.40;\r\n breakdown.skillAndType = 0.40;\r\n }\r\n\r\n // Similar error message = 30%\r\n const messageSimilarity = this.computeLevenshteinSimilarity(\r\n a.error_message,\r\n b.error_message\r\n );\r\n const messageScore = messageSimilarity * 0.30;\r\n score += messageScore;\r\n breakdown.messageMatch = messageScore;\r\n\r\n // Similar stack trace = 30%\r\n const stackA = a.stack_trace || '';\r\n const stackB = b.stack_trace || '';\r\n const stackSimilarity = this.computeLevenshteinSimilarity(stackA, stackB);\r\n const stackScore = stackSimilarity * 0.30;\r\n score += stackScore;\r\n breakdown.stackMatch = stackScore;\r\n\r\n breakdown.total = score;\r\n return breakdown;\r\n }\r\n\r\n /**\r\n * Compute Levenshtein similarity (normalized)\r\n *\r\n * @param a - First string\r\n * @param b - Second string\r\n * @returns Similarity score (0.0 - 1.0)\r\n */\r\n private computeLevenshteinSimilarity(a: string, b: string): number {\r\n if (a === b) return 1.0;\r\n if (!a || !b) return 0.0;\r\n\r\n const distance = this.levenshteinDistance(a, b);\r\n const maxLength = Math.max(a.length, b.length);\r\n\r\n if (maxLength === 0) return 1.0;\r\n\r\n return 1.0 - distance / maxLength;\r\n }\r\n\r\n /**\r\n * Calculate Levenshtein distance between two strings\r\n *\r\n * @param a - First string\r\n * @param b - Second string\r\n * @returns Edit distance\r\n */\r\n private levenshteinDistance(a: string, b: string): number {\r\n const matrix: number[][] = [];\r\n\r\n // Initialize matrix\r\n for (let i = 0; i <= b.length; i++) {\r\n matrix[i] = [i];\r\n }\r\n\r\n for (let j = 0; j <= a.length; j++) {\r\n matrix[0][j] = j;\r\n }\r\n\r\n // Fill matrix\r\n for (let i = 1; i <= b.length; i++) {\r\n for (let j = 1; j <= a.length; j++) {\r\n if (b.charAt(i - 1) === a.charAt(j - 1)) {\r\n matrix[i][j] = matrix[i - 1][j - 1];\r\n } else {\r\n matrix[i][j] = Math.min(\r\n matrix[i - 1][j - 1] + 1, // substitution\r\n matrix[i][j - 1] + 1, // insertion\r\n matrix[i - 1][j] + 1 // deletion\r\n );\r\n }\r\n }\r\n }\r\n\r\n return matrix[b.length][a.length];\r\n }\r\n\r\n /**\r\n * Increment occurrence count for existing edge case\r\n *\r\n * @param edgeCaseId - Edge case ID\r\n */\r\n private async incrementOccurrenceCount(edgeCaseId: string): Promise<void> {\r\n const sqlite = this.dbService.getAdapter('sqlite');\r\n\r\n const query = `\r\n UPDATE edge_cases\r\n SET occurrence_count = occurrence_count + 1,\r\n last_seen = CURRENT_TIMESTAMP\r\n WHERE id = ?\r\n `;\r\n\r\n const result = await sqlite.raw(query, [edgeCaseId]);\r\n\r\n this.logger.info('Incremented occurrence count', {\r\n edge_case_id: edgeCaseId,\r\n });\r\n }\r\n\r\n /**\r\n * Get deduplication statistics\r\n */\r\n async getStats(): Promise<{\r\n totalEdgeCases: number;\r\n uniqueSkills: number;\r\n avgOccurrenceCount: number;\r\n mostFrequentFailure: {\r\n id: string;\r\n skill_id: string;\r\n error_type: string;\r\n occurrence_count: number;\r\n } | null;\r\n }> {\r\n const sqlite = this.dbService.getAdapter('sqlite');\r\n\r\n // Total edge cases\r\n const totalResult = await sqlite.raw<any>(\r\n 'SELECT COUNT(*) as count FROM edge_cases WHERE status = \"new\"'\r\n );\r\n const totalEdgeCases = Array.isArray(totalResult) && totalResult[0]\r\n ? totalResult[0].count\r\n : 0;\r\n\r\n // Unique skills\r\n const uniqueResult = await sqlite.raw<any>(\r\n 'SELECT COUNT(DISTINCT skill_id) as count FROM edge_cases WHERE status = \"new\"'\r\n );\r\n const uniqueSkills = Array.isArray(uniqueResult) && uniqueResult[0]\r\n ? uniqueResult[0].count\r\n : 0;\r\n\r\n // Average occurrence count\r\n const avgResult = await sqlite.raw<any>(\r\n 'SELECT AVG(occurrence_count) as avg FROM edge_cases WHERE status = \"new\"'\r\n );\r\n const avgOccurrenceCount = Array.isArray(avgResult) && avgResult[0]\r\n ? avgResult[0].avg || 0\r\n : 0;\r\n\r\n // Most frequent failure\r\n const frequentResult = await sqlite.raw<any>(\r\n `SELECT id, skill_id, error_type, occurrence_count\r\n FROM edge_cases\r\n WHERE status = 'new'\r\n ORDER BY occurrence_count DESC\r\n LIMIT 1`\r\n );\r\n const mostFrequentFailure = Array.isArray(frequentResult) && frequentResult[0]\r\n ? frequentResult[0]\r\n : null;\r\n\r\n return {\r\n totalEdgeCases,\r\n uniqueSkills,\r\n avgOccurrenceCount,\r\n mostFrequentFailure,\r\n };\r\n }\r\n\r\n /**\r\n * Map database row to EdgeCase object\r\n */\r\n private mapRowToEdgeCase(row: any): EdgeCase {\r\n return {\r\n id: row.id,\r\n skill_id: row.skill_id,\r\n error_type: row.error_type as ErrorCategory,\r\n severity: row.severity as any,\r\n error_message: row.error_message,\r\n stack_trace: row.stack_trace,\r\n input_context: row.input_context,\r\n output_context: row.output_context,\r\n first_seen: new Date(row.first_seen),\r\n last_seen: new Date(row.last_seen),\r\n occurrence_count: row.occurrence_count,\r\n status: row.status as any,\r\n metadata: row.metadata ? JSON.parse(row.metadata) : {},\r\n };\r\n }\r\n}\r\n"],"names":["createLogger","EdgeCaseDeduplicator","logger","config","dbService","similarityThreshold","maxAgedays","maxCandidates","deduplicateEdgeCase","edgeCase","similar","findSimilarFailures","length","debug","skill_id","error_type","candidate","score","calculateSimilarity","candidate_id","id","total_score","total","threshold","info","edge_case_id","duplicate_of","similarity_score","incrementOccurrenceCount","error","sqlite","getAdapter","cutoffDate","Date","setDate","getDate","query","rows","raw","toISOString","Array","isArray","map","row","mapRowToEdgeCase","a","b","breakdown","skillAndType","messageMatch","stackMatch","messageSimilarity","computeLevenshteinSimilarity","error_message","messageScore","stackA","stack_trace","stackB","stackSimilarity","stackScore","distance","levenshteinDistance","maxLength","Math","max","matrix","i","j","charAt","min","edgeCaseId","result","getStats","totalResult","totalEdgeCases","count","uniqueResult","uniqueSkills","avgResult","avgOccurrenceCount","avg","frequentResult","mostFrequentFailure","severity","input_context","output_context","first_seen","last_seen","occurrence_count","status","metadata","JSON","parse"],"mappings":"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"}
@@ -0,0 +1,337 @@
1
+ /**
2
+ * Edge Case Detector Service
3
+ *
4
+ * Detects and categorizes skill execution failures for continuous improvement.
5
+ * Part of Task 1.5: MVP Edge Case Feedback Loop
6
+ *
7
+ * Features:
8
+ * - Automatic failure detection from skill executions
9
+ * - Error categorization (syntax, runtime, validation, timeout, dependency)
10
+ * - Severity calculation based on frequency and impact
11
+ * - Context capture (input, output, stack trace)
12
+ * - Integration with edge case deduplicator
13
+ *
14
+ * Usage:
15
+ * const detector = new EdgeCaseDetector(dbService, logger);
16
+ * const edgeCase = await detector.detectFailure(execution);
17
+ */ import { createLogger } from '../lib/logging.js';
18
+ import { createError, ErrorCode, wrapError } from '../lib/errors.js';
19
+ import { generateShortCorrelationId } from '../lib/correlation.js';
20
+ import { EdgeCaseDeduplicator } from './edge-case-deduplicator.js';
21
+ /**
22
+ * Error categories for skill execution failures
23
+ */ export var ErrorCategory = /*#__PURE__*/ function(ErrorCategory) {
24
+ ErrorCategory["SYNTAX"] = "syntax";
25
+ ErrorCategory["RUNTIME"] = "runtime";
26
+ ErrorCategory["VALIDATION"] = "validation";
27
+ ErrorCategory["TIMEOUT"] = "timeout";
28
+ ErrorCategory["DEPENDENCY"] = "dependency";
29
+ ErrorCategory["UNKNOWN"] = "unknown";
30
+ return ErrorCategory;
31
+ }({});
32
+ /**
33
+ * Severity levels for edge cases
34
+ */ export var Severity = /*#__PURE__*/ function(Severity) {
35
+ Severity["LOW"] = "low";
36
+ Severity["MEDIUM"] = "medium";
37
+ Severity["HIGH"] = "high";
38
+ Severity["CRITICAL"] = "critical";
39
+ return Severity;
40
+ }({});
41
+ /**
42
+ * Edge case detector service
43
+ */ export class EdgeCaseDetector {
44
+ dbService;
45
+ logger;
46
+ deduplicator;
47
+ config;
48
+ constructor(dbService, logger, config){
49
+ this.dbService = dbService;
50
+ this.logger = logger || createLogger('edge-case-detector');
51
+ this.deduplicator = new EdgeCaseDeduplicator(dbService, this.logger);
52
+ // Set default config
53
+ this.config = {
54
+ enableDeduplication: config?.enableDeduplication ?? true,
55
+ minSeverity: config?.minSeverity ?? "low",
56
+ customRules: config?.customRules ?? []
57
+ };
58
+ }
59
+ /**
60
+ * Detect failure from skill execution
61
+ *
62
+ * @param execution - Skill execution context
63
+ * @returns Edge case if failure detected, null otherwise
64
+ */ async detectFailure(execution) {
65
+ try {
66
+ // 1. Check if execution failed
67
+ if (execution.success) {
68
+ this.logger.debug('Execution succeeded, no edge case detected', {
69
+ skill_id: execution.skill_id
70
+ });
71
+ return null;
72
+ }
73
+ if (!execution.error) {
74
+ this.logger.warn('Execution marked as failed but no error provided', {
75
+ skill_id: execution.skill_id
76
+ });
77
+ return null;
78
+ }
79
+ // 2. Extract error information
80
+ const error = execution.error;
81
+ const category = this.categorizeError(error);
82
+ const severity = this.calculateSeverity(category, execution);
83
+ // 3. Check minimum severity threshold
84
+ if (this.shouldIgnoreSeverity(severity)) {
85
+ this.logger.debug('Edge case below minimum severity threshold', {
86
+ skill_id: execution.skill_id,
87
+ severity,
88
+ minSeverity: this.config.minSeverity
89
+ });
90
+ return null;
91
+ }
92
+ // 4. Extract error details
93
+ const errorMessage = error instanceof Error ? error.message : String(error);
94
+ const stackTrace = error instanceof Error ? error.stack : undefined;
95
+ // 5. Capture context
96
+ const edgeCase = {
97
+ id: `edge-${generateShortCorrelationId()}`,
98
+ skill_id: execution.skill_id,
99
+ error_type: category,
100
+ severity,
101
+ error_message: errorMessage,
102
+ stack_trace: stackTrace,
103
+ input_context: JSON.stringify(execution.input),
104
+ output_context: execution.output,
105
+ first_seen: execution.timestamp,
106
+ last_seen: execution.timestamp,
107
+ occurrence_count: 1,
108
+ status: 'new',
109
+ metadata: {
110
+ agent_id: execution.agent_id,
111
+ task_id: execution.task_id,
112
+ duration_ms: execution.duration_ms,
113
+ timestamp: execution.timestamp.toISOString()
114
+ }
115
+ };
116
+ this.logger.info('Edge case detected', {
117
+ edge_case_id: edgeCase.id,
118
+ skill_id: edgeCase.skill_id,
119
+ error_type: category,
120
+ severity
121
+ });
122
+ // 6. Deduplicate if enabled
123
+ if (this.config.enableDeduplication) {
124
+ const isDuplicate = await this.deduplicator.deduplicateEdgeCase(edgeCase);
125
+ if (isDuplicate) {
126
+ this.logger.debug('Edge case is duplicate, incrementing occurrence count', {
127
+ edge_case_id: edgeCase.id
128
+ });
129
+ return null; // Already tracked
130
+ }
131
+ }
132
+ // 7. Store new edge case
133
+ await this.storeEdgeCase(edgeCase);
134
+ return edgeCase;
135
+ } catch (error) {
136
+ this.logger.error('Failed to detect edge case', error, {
137
+ skill_id: execution.skill_id
138
+ });
139
+ throw wrapError(error, 'EDGE_CASE_DETECTION_FAILED');
140
+ }
141
+ }
142
+ /**
143
+ * Categorize error into predefined categories
144
+ *
145
+ * @param error - Error to categorize
146
+ * @returns Error category
147
+ */ categorizeError(error) {
148
+ const errorMessage = error.message.toLowerCase();
149
+ const errorName = error.name.toLowerCase();
150
+ // Check custom rules first
151
+ for (const rule of this.config.customRules){
152
+ if (rule.pattern.test(error.message)) {
153
+ this.logger.debug('Error matched custom rule', {
154
+ pattern: rule.pattern.toString(),
155
+ category: rule.category
156
+ });
157
+ return rule.category;
158
+ }
159
+ }
160
+ // Syntax errors
161
+ if (errorName.includes('syntax') || errorMessage.includes('syntax error') || errorMessage.includes('parse error') || errorMessage.includes('unexpected token')) {
162
+ return "syntax";
163
+ }
164
+ // Validation errors
165
+ if (errorName.includes('validation') || errorMessage.includes('invalid input') || errorMessage.includes('validation failed') || errorMessage.includes('required field') || errorMessage.includes('expected')) {
166
+ return "validation";
167
+ }
168
+ // Timeout errors
169
+ if (errorName.includes('timeout') || errorMessage.includes('timeout') || errorMessage.includes('timed out') || errorMessage.includes('deadline exceeded')) {
170
+ return "timeout";
171
+ }
172
+ // Dependency errors
173
+ if (errorMessage.includes('cannot find module') || errorMessage.includes('module not found') || errorMessage.includes('enoent') || errorMessage.includes('not found') || errorMessage.includes('missing dependency')) {
174
+ return "dependency";
175
+ }
176
+ // Runtime errors (default for most execution failures)
177
+ if (errorName.includes('error') || errorMessage.includes('runtime') || errorMessage.includes('execution failed')) {
178
+ return "runtime";
179
+ }
180
+ // Unknown
181
+ return "unknown";
182
+ }
183
+ /**
184
+ * Calculate severity based on error category and execution context
185
+ *
186
+ * @param category - Error category
187
+ * @param execution - Skill execution context
188
+ * @returns Severity level
189
+ */ calculateSeverity(category, execution) {
190
+ // Base severity by category
191
+ let severity;
192
+ switch(category){
193
+ case "syntax":
194
+ severity = "high"; // Syntax errors block execution
195
+ break;
196
+ case "validation":
197
+ severity = "medium"; // Validation errors are fixable
198
+ break;
199
+ case "timeout":
200
+ severity = "medium"; // Timeouts may be transient
201
+ break;
202
+ case "dependency":
203
+ severity = "high"; // Missing dependencies block execution
204
+ break;
205
+ case "runtime":
206
+ severity = "medium"; // Runtime errors vary in impact
207
+ break;
208
+ case "unknown":
209
+ severity = "low"; // Unknown errors need investigation
210
+ break;
211
+ }
212
+ // Upgrade severity if error message indicates critical issue
213
+ if (execution.error) {
214
+ const message = execution.error.message.toLowerCase();
215
+ if (message.includes('critical') || message.includes('fatal') || message.includes('segmentation fault') || message.includes('out of memory')) {
216
+ severity = "critical";
217
+ }
218
+ }
219
+ return severity;
220
+ }
221
+ /**
222
+ * Check if severity should be ignored based on threshold
223
+ */ shouldIgnoreSeverity(severity) {
224
+ const severityOrder = [
225
+ "low",
226
+ "medium",
227
+ "high",
228
+ "critical"
229
+ ];
230
+ const currentIndex = severityOrder.indexOf(severity);
231
+ const minIndex = severityOrder.indexOf(this.config.minSeverity);
232
+ return currentIndex < minIndex;
233
+ }
234
+ /**
235
+ * Store edge case in database
236
+ */ async storeEdgeCase(edgeCase) {
237
+ const sqlite = this.dbService.getAdapter('sqlite');
238
+ const result = await sqlite.insert('edge_cases', {
239
+ id: edgeCase.id,
240
+ skill_id: edgeCase.skill_id,
241
+ error_type: edgeCase.error_type,
242
+ severity: edgeCase.severity,
243
+ error_message: edgeCase.error_message,
244
+ stack_trace: edgeCase.stack_trace,
245
+ input_context: edgeCase.input_context,
246
+ output_context: edgeCase.output_context,
247
+ first_seen: edgeCase.first_seen.toISOString(),
248
+ last_seen: edgeCase.last_seen.toISOString(),
249
+ occurrence_count: edgeCase.occurrence_count,
250
+ status: edgeCase.status,
251
+ metadata: JSON.stringify(edgeCase.metadata)
252
+ });
253
+ if (!result.success) {
254
+ throw createError(ErrorCode.DB_QUERY_FAILED, 'Failed to store edge case', {
255
+ edge_case_id: edgeCase.id
256
+ }, result.error);
257
+ }
258
+ this.logger.info('Edge case stored successfully', {
259
+ edge_case_id: edgeCase.id
260
+ });
261
+ }
262
+ /**
263
+ * Get edge case by ID
264
+ */ async getEdgeCase(id) {
265
+ const sqlite = this.dbService.getAdapter('sqlite');
266
+ const query = 'SELECT * FROM edge_cases WHERE id = ? LIMIT 1';
267
+ const rows = await sqlite.raw(query, [
268
+ id
269
+ ]);
270
+ if (!Array.isArray(rows) || rows.length === 0) {
271
+ return null;
272
+ }
273
+ return this.mapRowToEdgeCase(rows[0]);
274
+ }
275
+ /**
276
+ * List all edge cases with optional filtering
277
+ */ async listEdgeCases(filters) {
278
+ const sqlite = this.dbService.getAdapter('sqlite');
279
+ const queryFilters = [];
280
+ if (filters?.skill_id) {
281
+ queryFilters.push({
282
+ field: 'skill_id',
283
+ operator: 'eq',
284
+ value: filters.skill_id
285
+ });
286
+ }
287
+ if (filters?.error_type) {
288
+ queryFilters.push({
289
+ field: 'error_type',
290
+ operator: 'eq',
291
+ value: filters.error_type
292
+ });
293
+ }
294
+ if (filters?.severity) {
295
+ queryFilters.push({
296
+ field: 'severity',
297
+ operator: 'eq',
298
+ value: filters.severity
299
+ });
300
+ }
301
+ if (filters?.status) {
302
+ queryFilters.push({
303
+ field: 'status',
304
+ operator: 'eq',
305
+ value: filters.status
306
+ });
307
+ }
308
+ const rows = await sqlite.list('edge_cases', {
309
+ filters: queryFilters,
310
+ limit: filters?.limit || 100,
311
+ orderBy: 'last_seen',
312
+ order: 'desc'
313
+ });
314
+ return rows.map((row)=>this.mapRowToEdgeCase(row));
315
+ }
316
+ /**
317
+ * Map database row to EdgeCase object
318
+ */ mapRowToEdgeCase(row) {
319
+ return {
320
+ id: row.id,
321
+ skill_id: row.skill_id,
322
+ error_type: row.error_type,
323
+ severity: row.severity,
324
+ error_message: row.error_message,
325
+ stack_trace: row.stack_trace,
326
+ input_context: row.input_context,
327
+ output_context: row.output_context,
328
+ first_seen: new Date(row.first_seen),
329
+ last_seen: new Date(row.last_seen),
330
+ occurrence_count: row.occurrence_count,
331
+ status: row.status,
332
+ metadata: row.metadata ? JSON.parse(row.metadata) : {}
333
+ };
334
+ }
335
+ }
336
+
337
+ //# sourceMappingURL=edge-case-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/services/edge-case-detector.ts"],"sourcesContent":["/**\r\n * Edge Case Detector Service\r\n *\r\n * Detects and categorizes skill execution failures for continuous improvement.\r\n * Part of Task 1.5: MVP Edge Case Feedback Loop\r\n *\r\n * Features:\r\n * - Automatic failure detection from skill executions\r\n * - Error categorization (syntax, runtime, validation, timeout, dependency)\r\n * - Severity calculation based on frequency and impact\r\n * - Context capture (input, output, stack trace)\r\n * - Integration with edge case deduplicator\r\n *\r\n * Usage:\r\n * const detector = new EdgeCaseDetector(dbService, logger);\r\n * const edgeCase = await detector.detectFailure(execution);\r\n */\r\n\r\nimport { DatabaseService, OperationResult } from '../lib/database-service.js';\r\nimport { createLogger, Logger } from '../lib/logging.js';\r\nimport { createError, ErrorCode, StandardError, wrapError } from '../lib/errors.js';\r\nimport { generateCorrelationId, generateShortCorrelationId } from '../lib/correlation.js';\r\nimport { EdgeCaseDeduplicator } from './edge-case-deduplicator.js';\r\n\r\n/**\r\n * Error categories for skill execution failures\r\n */\r\nexport enum ErrorCategory {\r\n SYNTAX = 'syntax', // Parse errors, invalid code\r\n RUNTIME = 'runtime', // Execution failures\r\n VALIDATION = 'validation', // Input validation errors\r\n TIMEOUT = 'timeout', // Execution timeout\r\n DEPENDENCY = 'dependency', // Missing dependencies\r\n UNKNOWN = 'unknown', // Uncategorized\r\n}\r\n\r\n/**\r\n * Severity levels for edge cases\r\n */\r\nexport enum Severity {\r\n LOW = 'low', // Rare, non-blocking\r\n MEDIUM = 'medium', // Occasional, impacts quality\r\n HIGH = 'high', // Frequent, blocks execution\r\n CRITICAL = 'critical', // Systemic, requires immediate fix\r\n}\r\n\r\n/**\r\n * Skill execution context\r\n */\r\nexport interface SkillExecution {\r\n skill_id: string;\r\n agent_id?: string;\r\n task_id?: string;\r\n input: Record<string, any>;\r\n output?: string;\r\n success: boolean;\r\n error?: Error | StandardError;\r\n timestamp: Date;\r\n duration_ms?: number;\r\n}\r\n\r\n/**\r\n * Edge case record\r\n */\r\nexport interface EdgeCase {\r\n id: string;\r\n skill_id: string;\r\n error_type: ErrorCategory;\r\n severity: Severity;\r\n error_message: string;\r\n stack_trace?: string;\r\n input_context: string; // JSON string\r\n output_context?: string;\r\n first_seen: Date;\r\n last_seen: Date;\r\n occurrence_count: number;\r\n status: 'new' | 'acknowledged' | 'fixed' | 'ignored';\r\n metadata: Record<string, any>;\r\n}\r\n\r\n/**\r\n * Edge case detector configuration\r\n */\r\nexport interface EdgeCaseDetectorConfig {\r\n /** Enable automatic deduplication (default: true) */\r\n enableDeduplication?: boolean;\r\n /** Minimum severity to track (default: LOW) */\r\n minSeverity?: Severity;\r\n /** Custom error categorization rules */\r\n customRules?: ErrorCategorizationRule[];\r\n}\r\n\r\n/**\r\n * Custom error categorization rule\r\n */\r\nexport interface ErrorCategorizationRule {\r\n /** Pattern to match in error message */\r\n pattern: RegExp;\r\n /** Category to assign if pattern matches */\r\n category: ErrorCategory;\r\n /** Severity to assign if pattern matches */\r\n severity?: Severity;\r\n}\r\n\r\n/**\r\n * Edge case detector service\r\n */\r\nexport class EdgeCaseDetector {\r\n private logger: Logger;\r\n private deduplicator: EdgeCaseDeduplicator;\r\n private config: Required<EdgeCaseDetectorConfig>;\r\n\r\n constructor(\r\n private dbService: DatabaseService,\r\n logger?: Logger,\r\n config?: EdgeCaseDetectorConfig\r\n ) {\r\n this.logger = logger || createLogger('edge-case-detector');\r\n this.deduplicator = new EdgeCaseDeduplicator(dbService, this.logger);\r\n\r\n // Set default config\r\n this.config = {\r\n enableDeduplication: config?.enableDeduplication ?? true,\r\n minSeverity: config?.minSeverity ?? Severity.LOW,\r\n customRules: config?.customRules ?? [],\r\n };\r\n }\r\n\r\n /**\r\n * Detect failure from skill execution\r\n *\r\n * @param execution - Skill execution context\r\n * @returns Edge case if failure detected, null otherwise\r\n */\r\n async detectFailure(execution: SkillExecution): Promise<EdgeCase | null> {\r\n try {\r\n // 1. Check if execution failed\r\n if (execution.success) {\r\n this.logger.debug('Execution succeeded, no edge case detected', {\r\n skill_id: execution.skill_id,\r\n });\r\n return null;\r\n }\r\n\r\n if (!execution.error) {\r\n this.logger.warn('Execution marked as failed but no error provided', {\r\n skill_id: execution.skill_id,\r\n });\r\n return null;\r\n }\r\n\r\n // 2. Extract error information\r\n const error = execution.error;\r\n const category = this.categorizeError(error);\r\n const severity = this.calculateSeverity(category, execution);\r\n\r\n // 3. Check minimum severity threshold\r\n if (this.shouldIgnoreSeverity(severity)) {\r\n this.logger.debug('Edge case below minimum severity threshold', {\r\n skill_id: execution.skill_id,\r\n severity,\r\n minSeverity: this.config.minSeverity,\r\n });\r\n return null;\r\n }\r\n\r\n // 4. Extract error details\r\n const errorMessage = error instanceof Error ? error.message : String(error);\r\n const stackTrace = error instanceof Error ? error.stack : undefined;\r\n\r\n // 5. Capture context\r\n const edgeCase: EdgeCase = {\r\n id: `edge-${generateShortCorrelationId()}`,\r\n skill_id: execution.skill_id,\r\n error_type: category,\r\n severity,\r\n error_message: errorMessage,\r\n stack_trace: stackTrace,\r\n input_context: JSON.stringify(execution.input),\r\n output_context: execution.output,\r\n first_seen: execution.timestamp,\r\n last_seen: execution.timestamp,\r\n occurrence_count: 1,\r\n status: 'new',\r\n metadata: {\r\n agent_id: execution.agent_id,\r\n task_id: execution.task_id,\r\n duration_ms: execution.duration_ms,\r\n timestamp: execution.timestamp.toISOString(),\r\n },\r\n };\r\n\r\n this.logger.info('Edge case detected', {\r\n edge_case_id: edgeCase.id,\r\n skill_id: edgeCase.skill_id,\r\n error_type: category,\r\n severity,\r\n });\r\n\r\n // 6. Deduplicate if enabled\r\n if (this.config.enableDeduplication) {\r\n const isDuplicate = await this.deduplicator.deduplicateEdgeCase(edgeCase);\r\n\r\n if (isDuplicate) {\r\n this.logger.debug('Edge case is duplicate, incrementing occurrence count', {\r\n edge_case_id: edgeCase.id,\r\n });\r\n return null; // Already tracked\r\n }\r\n }\r\n\r\n // 7. Store new edge case\r\n await this.storeEdgeCase(edgeCase);\r\n\r\n return edgeCase;\r\n } catch (error) {\r\n this.logger.error('Failed to detect edge case', error as Error, {\r\n skill_id: execution.skill_id,\r\n });\r\n throw wrapError(error, 'EDGE_CASE_DETECTION_FAILED');\r\n }\r\n }\r\n\r\n /**\r\n * Categorize error into predefined categories\r\n *\r\n * @param error - Error to categorize\r\n * @returns Error category\r\n */\r\n categorizeError(error: Error | StandardError): ErrorCategory {\r\n const errorMessage = error.message.toLowerCase();\r\n const errorName = error.name.toLowerCase();\r\n\r\n // Check custom rules first\r\n for (const rule of this.config.customRules) {\r\n if (rule.pattern.test(error.message)) {\r\n this.logger.debug('Error matched custom rule', {\r\n pattern: rule.pattern.toString(),\r\n category: rule.category,\r\n });\r\n return rule.category;\r\n }\r\n }\r\n\r\n // Syntax errors\r\n if (\r\n errorName.includes('syntax') ||\r\n errorMessage.includes('syntax error') ||\r\n errorMessage.includes('parse error') ||\r\n errorMessage.includes('unexpected token')\r\n ) {\r\n return ErrorCategory.SYNTAX;\r\n }\r\n\r\n // Validation errors\r\n if (\r\n errorName.includes('validation') ||\r\n errorMessage.includes('invalid input') ||\r\n errorMessage.includes('validation failed') ||\r\n errorMessage.includes('required field') ||\r\n errorMessage.includes('expected')\r\n ) {\r\n return ErrorCategory.VALIDATION;\r\n }\r\n\r\n // Timeout errors\r\n if (\r\n errorName.includes('timeout') ||\r\n errorMessage.includes('timeout') ||\r\n errorMessage.includes('timed out') ||\r\n errorMessage.includes('deadline exceeded')\r\n ) {\r\n return ErrorCategory.TIMEOUT;\r\n }\r\n\r\n // Dependency errors\r\n if (\r\n errorMessage.includes('cannot find module') ||\r\n errorMessage.includes('module not found') ||\r\n errorMessage.includes('enoent') ||\r\n errorMessage.includes('not found') ||\r\n errorMessage.includes('missing dependency')\r\n ) {\r\n return ErrorCategory.DEPENDENCY;\r\n }\r\n\r\n // Runtime errors (default for most execution failures)\r\n if (\r\n errorName.includes('error') ||\r\n errorMessage.includes('runtime') ||\r\n errorMessage.includes('execution failed')\r\n ) {\r\n return ErrorCategory.RUNTIME;\r\n }\r\n\r\n // Unknown\r\n return ErrorCategory.UNKNOWN;\r\n }\r\n\r\n /**\r\n * Calculate severity based on error category and execution context\r\n *\r\n * @param category - Error category\r\n * @param execution - Skill execution context\r\n * @returns Severity level\r\n */\r\n private calculateSeverity(\r\n category: ErrorCategory,\r\n execution: SkillExecution\r\n ): Severity {\r\n // Base severity by category\r\n let severity: Severity;\r\n\r\n switch (category) {\r\n case ErrorCategory.SYNTAX:\r\n severity = Severity.HIGH; // Syntax errors block execution\r\n break;\r\n case ErrorCategory.VALIDATION:\r\n severity = Severity.MEDIUM; // Validation errors are fixable\r\n break;\r\n case ErrorCategory.TIMEOUT:\r\n severity = Severity.MEDIUM; // Timeouts may be transient\r\n break;\r\n case ErrorCategory.DEPENDENCY:\r\n severity = Severity.HIGH; // Missing dependencies block execution\r\n break;\r\n case ErrorCategory.RUNTIME:\r\n severity = Severity.MEDIUM; // Runtime errors vary in impact\r\n break;\r\n case ErrorCategory.UNKNOWN:\r\n severity = Severity.LOW; // Unknown errors need investigation\r\n break;\r\n }\r\n\r\n // Upgrade severity if error message indicates critical issue\r\n if (execution.error) {\r\n const message = execution.error.message.toLowerCase();\r\n if (\r\n message.includes('critical') ||\r\n message.includes('fatal') ||\r\n message.includes('segmentation fault') ||\r\n message.includes('out of memory')\r\n ) {\r\n severity = Severity.CRITICAL;\r\n }\r\n }\r\n\r\n return severity;\r\n }\r\n\r\n /**\r\n * Check if severity should be ignored based on threshold\r\n */\r\n private shouldIgnoreSeverity(severity: Severity): boolean {\r\n const severityOrder = [Severity.LOW, Severity.MEDIUM, Severity.HIGH, Severity.CRITICAL];\r\n const currentIndex = severityOrder.indexOf(severity);\r\n const minIndex = severityOrder.indexOf(this.config.minSeverity);\r\n\r\n return currentIndex < minIndex;\r\n }\r\n\r\n /**\r\n * Store edge case in database\r\n */\r\n private async storeEdgeCase(edgeCase: EdgeCase): Promise<void> {\r\n const sqlite = this.dbService.getAdapter('sqlite');\r\n\r\n const result: OperationResult = await sqlite.insert('edge_cases', {\r\n id: edgeCase.id,\r\n skill_id: edgeCase.skill_id,\r\n error_type: edgeCase.error_type,\r\n severity: edgeCase.severity,\r\n error_message: edgeCase.error_message,\r\n stack_trace: edgeCase.stack_trace,\r\n input_context: edgeCase.input_context,\r\n output_context: edgeCase.output_context,\r\n first_seen: edgeCase.first_seen.toISOString(),\r\n last_seen: edgeCase.last_seen.toISOString(),\r\n occurrence_count: edgeCase.occurrence_count,\r\n status: edgeCase.status,\r\n metadata: JSON.stringify(edgeCase.metadata),\r\n });\r\n\r\n if (!result.success) {\r\n throw createError(\r\n ErrorCode.DB_QUERY_FAILED,\r\n 'Failed to store edge case',\r\n { edge_case_id: edgeCase.id },\r\n result.error as Error\r\n );\r\n }\r\n\r\n this.logger.info('Edge case stored successfully', {\r\n edge_case_id: edgeCase.id,\r\n });\r\n }\r\n\r\n /**\r\n * Get edge case by ID\r\n */\r\n async getEdgeCase(id: string): Promise<EdgeCase | null> {\r\n const sqlite = this.dbService.getAdapter('sqlite');\r\n const query = 'SELECT * FROM edge_cases WHERE id = ? LIMIT 1';\r\n const rows = await sqlite.raw<any[]>(query, [id]);\r\n\r\n if (!Array.isArray(rows) || rows.length === 0) {\r\n return null;\r\n }\r\n\r\n return this.mapRowToEdgeCase(rows[0]);\r\n }\r\n\r\n /**\r\n * List all edge cases with optional filtering\r\n */\r\n async listEdgeCases(filters?: {\r\n skill_id?: string;\r\n error_type?: ErrorCategory;\r\n severity?: Severity;\r\n status?: 'new' | 'acknowledged' | 'fixed' | 'ignored';\r\n limit?: number;\r\n }): Promise<EdgeCase[]> {\r\n const sqlite = this.dbService.getAdapter('sqlite');\r\n\r\n const queryFilters: any[] = [];\r\n\r\n if (filters?.skill_id) {\r\n queryFilters.push({ field: 'skill_id', operator: 'eq', value: filters.skill_id });\r\n }\r\n if (filters?.error_type) {\r\n queryFilters.push({ field: 'error_type', operator: 'eq', value: filters.error_type });\r\n }\r\n if (filters?.severity) {\r\n queryFilters.push({ field: 'severity', operator: 'eq', value: filters.severity });\r\n }\r\n if (filters?.status) {\r\n queryFilters.push({ field: 'status', operator: 'eq', value: filters.status });\r\n }\r\n\r\n const rows = await sqlite.list<any>('edge_cases', {\r\n filters: queryFilters,\r\n limit: filters?.limit || 100,\r\n orderBy: 'last_seen' as any,\r\n order: 'desc',\r\n });\r\n\r\n return rows.map(row => this.mapRowToEdgeCase(row));\r\n }\r\n\r\n /**\r\n * Map database row to EdgeCase object\r\n */\r\n private mapRowToEdgeCase(row: any): EdgeCase {\r\n return {\r\n id: row.id,\r\n skill_id: row.skill_id,\r\n error_type: row.error_type as ErrorCategory,\r\n severity: row.severity as Severity,\r\n error_message: row.error_message,\r\n stack_trace: row.stack_trace,\r\n input_context: row.input_context,\r\n output_context: row.output_context,\r\n first_seen: new Date(row.first_seen),\r\n last_seen: new Date(row.last_seen),\r\n occurrence_count: row.occurrence_count,\r\n status: row.status as any,\r\n metadata: row.metadata ? JSON.parse(row.metadata) : {},\r\n };\r\n }\r\n}\r\n"],"names":["createLogger","createError","ErrorCode","wrapError","generateShortCorrelationId","EdgeCaseDeduplicator","ErrorCategory","Severity","EdgeCaseDetector","logger","deduplicator","config","dbService","enableDeduplication","minSeverity","customRules","detectFailure","execution","success","debug","skill_id","error","warn","category","categorizeError","severity","calculateSeverity","shouldIgnoreSeverity","errorMessage","Error","message","String","stackTrace","stack","undefined","edgeCase","id","error_type","error_message","stack_trace","input_context","JSON","stringify","input","output_context","output","first_seen","timestamp","last_seen","occurrence_count","status","metadata","agent_id","task_id","duration_ms","toISOString","info","edge_case_id","isDuplicate","deduplicateEdgeCase","storeEdgeCase","toLowerCase","errorName","name","rule","pattern","test","toString","includes","severityOrder","currentIndex","indexOf","minIndex","sqlite","getAdapter","result","insert","DB_QUERY_FAILED","getEdgeCase","query","rows","raw","Array","isArray","length","mapRowToEdgeCase","listEdgeCases","filters","queryFilters","push","field","operator","value","list","limit","orderBy","order","map","row","Date","parse"],"mappings":"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"}