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,547 @@
1
+ /**
2
+ * Edge Case Tracker Service
3
+ *
4
+ * Comprehensive edge case tracking with feedback loop, deduplication,
5
+ * expert notification, and analytics.
6
+ *
7
+ * Part of Phase 2, Task P2-2.1: Edge Case Feedback Loop
8
+ */ import * as sqlite3 from 'better-sqlite3';
9
+ import { EdgeCaseDeduplicator } from '../lib/edge-case-deduplicator.js';
10
+ import { EdgeCaseType, EdgeCaseCategory, EdgeCasePriority, EdgeCaseStatus } from '../types/edge-case.js';
11
+ /**
12
+ * Edge Case Tracker
13
+ *
14
+ * Manages the complete edge case feedback loop:
15
+ * 1. Detection and recording with deduplication
16
+ * 2. Priority scoring based on frequency, recency, severity, impact
17
+ * 3. Expert notification queue with <1h SLA
18
+ * 4. Workflow management (NEW → INVESTIGATING → RESOLVED → CLOSED)
19
+ * 5. Resolution tracking and verification
20
+ * 6. Analytics and reporting
21
+ */ export class EdgeCaseTracker {
22
+ db = null;
23
+ deduplicator;
24
+ config;
25
+ constructor(config){
26
+ this.config = {
27
+ autoCloseAfterDays: 7,
28
+ notificationThrottleMinutes: 60,
29
+ ...config
30
+ };
31
+ this.deduplicator = new EdgeCaseDeduplicator();
32
+ }
33
+ /**
34
+ * Initialize the tracker (create database tables)
35
+ */ async initialize() {
36
+ this.db = new sqlite3.default(this.config.dbPath);
37
+ // Execute migration to create tables
38
+ const migration = `
39
+ CREATE TABLE IF NOT EXISTS edge_case_tracker (
40
+ id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),
41
+ signature TEXT NOT NULL UNIQUE,
42
+ type TEXT NOT NULL CHECK(type IN (
43
+ 'syntax_error', 'logic_error', 'timeout', 'data_validation', 'system_error'
44
+ )),
45
+ category TEXT NOT NULL CHECK(category IN (
46
+ 'skill_execution', 'database_operation', 'coordination', 'file_operation', 'api_call'
47
+ )),
48
+ priority TEXT NOT NULL CHECK(priority IN ('critical', 'high', 'medium', 'low')),
49
+ context TEXT NOT NULL,
50
+ status TEXT NOT NULL DEFAULT 'new' CHECK(status IN (
51
+ 'new', 'investigating', 'resolved', 'closed', 'wont_fix'
52
+ )),
53
+ first_occurred DATETIME DEFAULT CURRENT_TIMESTAMP,
54
+ last_occurred DATETIME DEFAULT CURRENT_TIMESTAMP,
55
+ occurrence_count INTEGER DEFAULT 1,
56
+ assigned_expert TEXT,
57
+ investigation_started_at DATETIME,
58
+ resolved_at DATETIME,
59
+ resolution TEXT,
60
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
61
+ updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
62
+ );
63
+
64
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_edge_case_tracker_signature
65
+ ON edge_case_tracker(signature);
66
+
67
+ CREATE INDEX IF NOT EXISTS idx_edge_case_tracker_priority_status
68
+ ON edge_case_tracker(priority, status);
69
+
70
+ CREATE TABLE IF NOT EXISTS edge_case_notifications (
71
+ id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),
72
+ edge_case_id TEXT NOT NULL,
73
+ priority TEXT NOT NULL,
74
+ type TEXT NOT NULL,
75
+ category TEXT NOT NULL,
76
+ message TEXT NOT NULL,
77
+ channel TEXT NOT NULL CHECK(channel IN ('slack', 'email')),
78
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
79
+ sent_at DATETIME,
80
+ delivery_status TEXT CHECK(delivery_status IN ('pending', 'sent', 'failed')),
81
+ FOREIGN KEY (edge_case_id) REFERENCES edge_case_tracker(id) ON DELETE CASCADE
82
+ );
83
+
84
+ CREATE INDEX IF NOT EXISTS idx_edge_case_notifications_pending
85
+ ON edge_case_notifications(created_at, sent_at)
86
+ WHERE sent_at IS NULL;
87
+ `;
88
+ this.db.exec(migration);
89
+ }
90
+ /**
91
+ * Record an edge case with automatic deduplication
92
+ *
93
+ * Performance target: <100ms
94
+ */ async recordEdgeCase(input) {
95
+ if (!this.db) {
96
+ throw new Error('EdgeCaseTracker not initialized. Call initialize() first.');
97
+ }
98
+ // Generate signature for deduplication
99
+ const signature = this.deduplicator.generateSignature(input);
100
+ // Check for existing edge case with same signature
101
+ const existing = this.db.prepare(`
102
+ SELECT * FROM edge_case_tracker WHERE signature = ?
103
+ `).get(signature);
104
+ if (existing) {
105
+ // Update existing edge case (increment count, update last_occurred)
106
+ const updatedCount = existing.occurrence_count + 1;
107
+ // Recalculate priority based on new occurrence count
108
+ const updatedPriority = this.calculatePriority({
109
+ ...input,
110
+ occurrenceCount: updatedCount,
111
+ firstOccurred: new Date(existing.first_occurred),
112
+ lastOccurred: new Date()
113
+ });
114
+ this.db.prepare(`
115
+ UPDATE edge_case_tracker
116
+ SET occurrence_count = ?,
117
+ last_occurred = CURRENT_TIMESTAMP,
118
+ priority = ?,
119
+ updated_at = CURRENT_TIMESTAMP
120
+ WHERE id = ?
121
+ `).run(updatedCount, updatedPriority, existing.id);
122
+ // Return updated edge case
123
+ return this.getEdgeCase(existing.id);
124
+ } else {
125
+ // Create new edge case
126
+ const id = this.generateId();
127
+ const priority = this.calculatePriority(input);
128
+ this.db.prepare(`
129
+ INSERT INTO edge_case_tracker (
130
+ id, signature, type, category, priority, context, status,
131
+ first_occurred, last_occurred, occurrence_count
132
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 1)
133
+ `).run(id, signature, input.type, input.category, priority, JSON.stringify(input.context), EdgeCaseStatus.NEW);
134
+ // Queue notification
135
+ await this.queueNotification(id, input.type, input.category, priority);
136
+ // Return created edge case
137
+ return this.getEdgeCase(id);
138
+ }
139
+ }
140
+ /**
141
+ * Calculate priority score based on frequency, recency, severity, impact
142
+ *
143
+ * Scoring algorithm:
144
+ * - Frequency: occurrence_count > 100 (+30), > 10 (+20), > 1 (+10)
145
+ * - Recency: < 1h (+20), < 24h (+10)
146
+ * - Type severity: system_error (+20), logic_error (+10)
147
+ * - Category impact: database_operation (+15), coordination (+10)
148
+ *
149
+ * Priority thresholds:
150
+ * - CRITICAL: >= 60
151
+ * - HIGH: >= 40
152
+ * - MEDIUM: >= 20
153
+ * - LOW: < 20
154
+ */ calculatePriority(input) {
155
+ let score = 0;
156
+ // Frequency scoring
157
+ const count = input.occurrenceCount || 1;
158
+ if (count > 100) score += 30;
159
+ else if (count > 10) score += 20;
160
+ else if (count > 1) score += 10;
161
+ // Recency scoring
162
+ if (input.firstOccurred) {
163
+ const hoursSinceFirst = (Date.now() - input.firstOccurred.getTime()) / 3600000;
164
+ if (hoursSinceFirst < 1) score += 20;
165
+ else if (hoursSinceFirst < 24) score += 10;
166
+ }
167
+ // Type severity scoring
168
+ if (input.type === EdgeCaseType.SYSTEM_ERROR) score += 20;
169
+ else if (input.type === EdgeCaseType.LOGIC_ERROR) score += 10;
170
+ else if (input.type === EdgeCaseType.TIMEOUT) score += 5;
171
+ // Category impact scoring
172
+ if (input.category === EdgeCaseCategory.DATABASE_OPERATION) score += 15;
173
+ else if (input.category === EdgeCaseCategory.COORDINATION) score += 10;
174
+ else if (input.category === EdgeCaseCategory.API_CALL) score += 8;
175
+ // Determine priority
176
+ if (score >= 60) return EdgeCasePriority.CRITICAL;
177
+ if (score >= 40) return EdgeCasePriority.HIGH;
178
+ if (score >= 20) return EdgeCasePriority.MEDIUM;
179
+ return EdgeCasePriority.LOW;
180
+ }
181
+ /**
182
+ * Queue expert notification
183
+ *
184
+ * Notifications are queued but not sent immediately to allow throttling.
185
+ * External service should process the queue periodically.
186
+ */ async queueNotification(edgeCaseId, type, category, priority) {
187
+ if (!this.db) return;
188
+ // Check if notification already exists for this edge case
189
+ const existing = this.db.prepare(`
190
+ SELECT COUNT(*) as count
191
+ FROM edge_case_notifications
192
+ WHERE edge_case_id = ? AND sent_at IS NULL
193
+ `).get(edgeCaseId);
194
+ if (existing.count > 0) {
195
+ // Don't duplicate notifications
196
+ return;
197
+ }
198
+ // Determine notification channels based on priority
199
+ const channels = [];
200
+ if (priority === EdgeCasePriority.CRITICAL || priority === EdgeCasePriority.HIGH) {
201
+ if (this.config.notificationConfig.slack?.enabled) {
202
+ channels.push('slack');
203
+ }
204
+ }
205
+ if (this.config.notificationConfig.email?.enabled) {
206
+ channels.push('email');
207
+ }
208
+ // Create notification messages
209
+ for (const channel of channels){
210
+ const message = this.formatNotificationMessage(type, category, priority);
211
+ this.db.prepare(`
212
+ INSERT INTO edge_case_notifications (
213
+ edge_case_id, priority, type, category, message, channel, delivery_status
214
+ ) VALUES (?, ?, ?, ?, ?, ?, 'pending')
215
+ `).run(edgeCaseId, priority, type, category, message, channel);
216
+ }
217
+ }
218
+ /**
219
+ * Format notification message
220
+ */ formatNotificationMessage(type, category, priority) {
221
+ const emoji = {
222
+ [EdgeCasePriority.CRITICAL]: '🚨',
223
+ [EdgeCasePriority.HIGH]: '⚠️',
224
+ [EdgeCasePriority.MEDIUM]: '⚡',
225
+ [EdgeCasePriority.LOW]: 'ℹ️'
226
+ };
227
+ return `${emoji[priority]} Edge Case Detected\n` + `Priority: ${priority.toUpperCase()}\n` + `Type: ${type}\n` + `Category: ${category}\n` + `Please investigate and assign.`;
228
+ }
229
+ /**
230
+ * Get edge case by ID
231
+ */ getEdgeCase(id) {
232
+ if (!this.db) return null;
233
+ const row = this.db.prepare(`
234
+ SELECT * FROM edge_case_tracker WHERE id = ?
235
+ `).get(id);
236
+ if (!row) return null;
237
+ return this.rowToEdgeCase(row);
238
+ }
239
+ /**
240
+ * Update edge case status
241
+ */ async updateStatus(id, status, assignedExpert) {
242
+ if (!this.db) return;
243
+ const updates = [
244
+ 'status = ?'
245
+ ];
246
+ const params = [
247
+ status
248
+ ];
249
+ if (assignedExpert) {
250
+ updates.push('assigned_expert = ?');
251
+ params.push(assignedExpert);
252
+ }
253
+ if (status === EdgeCaseStatus.INVESTIGATING) {
254
+ updates.push('investigation_started_at = CURRENT_TIMESTAMP');
255
+ }
256
+ if (status === EdgeCaseStatus.RESOLVED) {
257
+ updates.push('resolved_at = CURRENT_TIMESTAMP');
258
+ }
259
+ params.push(id);
260
+ this.db.prepare(`
261
+ UPDATE edge_case_tracker
262
+ SET ${updates.join(', ')}, updated_at = CURRENT_TIMESTAMP
263
+ WHERE id = ?
264
+ `).run(...params);
265
+ }
266
+ /**
267
+ * Resolve edge case with resolution details
268
+ */ async resolveEdgeCase(id, resolution) {
269
+ if (!this.db) return;
270
+ this.db.prepare(`
271
+ UPDATE edge_case_tracker
272
+ SET status = 'resolved',
273
+ resolved_at = CURRENT_TIMESTAMP,
274
+ resolution = ?,
275
+ updated_at = CURRENT_TIMESTAMP
276
+ WHERE id = ?
277
+ `).run(JSON.stringify(resolution), id);
278
+ }
279
+ /**
280
+ * Get pending notifications
281
+ */ async getPendingNotifications() {
282
+ if (!this.db) return [];
283
+ const rows = this.db.prepare(`
284
+ SELECT * FROM edge_case_notifications
285
+ WHERE sent_at IS NULL
286
+ ORDER BY created_at ASC
287
+ `).all();
288
+ return rows.map((row)=>({
289
+ id: row.id,
290
+ edgeCaseId: row.edge_case_id,
291
+ priority: row.priority,
292
+ type: row.type,
293
+ category: row.category,
294
+ message: row.message,
295
+ createdAt: new Date(row.created_at),
296
+ sentAt: row.sent_at ? new Date(row.sent_at) : undefined,
297
+ channel: row.channel
298
+ }));
299
+ }
300
+ /**
301
+ * Mark notification as sent
302
+ */ async markNotificationSent(notificationId) {
303
+ if (!this.db) return;
304
+ this.db.prepare(`
305
+ UPDATE edge_case_notifications
306
+ SET sent_at = CURRENT_TIMESTAMP,
307
+ delivery_status = 'sent'
308
+ WHERE id = ?
309
+ `).run(notificationId);
310
+ }
311
+ /**
312
+ * Check for auto-close eligibility (7 days without recurrence)
313
+ */ async checkAutoClose() {
314
+ if (!this.db) return;
315
+ const daysThreshold = this.config.autoCloseAfterDays || 7;
316
+ this.db.prepare(`
317
+ UPDATE edge_case_tracker
318
+ SET status = 'closed',
319
+ updated_at = CURRENT_TIMESTAMP
320
+ WHERE status = 'resolved'
321
+ AND julianday('now') - julianday(resolved_at) >= ?
322
+ `).run(daysThreshold);
323
+ }
324
+ /**
325
+ * Get top edge cases (for analytics)
326
+ *
327
+ * Performance target: <500ms
328
+ */ async getTopEdgeCases(query = {}) {
329
+ if (!this.db) return [];
330
+ const limit = query.limit || 10;
331
+ const orderBy = query.orderBy || 'frequency';
332
+ let orderClause = 'occurrence_count DESC';
333
+ if (orderBy === 'recent') orderClause = 'last_occurred DESC';
334
+ if (orderBy === 'priority') orderClause = `
335
+ CASE priority
336
+ WHEN 'critical' THEN 1
337
+ WHEN 'high' THEN 2
338
+ WHEN 'medium' THEN 3
339
+ WHEN 'low' THEN 4
340
+ END
341
+ `;
342
+ let whereClause = "status NOT IN ('closed', 'wont_fix')";
343
+ const params = [];
344
+ if (query.category) {
345
+ whereClause += ' AND category = ?';
346
+ params.push(query.category);
347
+ }
348
+ if (query.type) {
349
+ whereClause += ' AND type = ?';
350
+ params.push(query.type);
351
+ }
352
+ if (query.status) {
353
+ whereClause = whereClause.replace("status NOT IN ('closed', 'wont_fix')", 'status = ?');
354
+ params.push(query.status);
355
+ }
356
+ params.push(limit);
357
+ const rows = this.db.prepare(`
358
+ SELECT * FROM edge_case_tracker
359
+ WHERE ${whereClause}
360
+ ORDER BY ${orderClause}
361
+ LIMIT ?
362
+ `).all(...params);
363
+ return rows.map((row)=>this.rowToEdgeCase(row));
364
+ }
365
+ /**
366
+ * Get edge cases by priority
367
+ */ async getEdgeCasesByPriority(priority) {
368
+ if (!this.db) return [];
369
+ const rows = this.db.prepare(`
370
+ SELECT * FROM edge_case_tracker
371
+ WHERE priority = ? AND status NOT IN ('closed', 'wont_fix')
372
+ ORDER BY last_occurred DESC
373
+ `).all(priority);
374
+ return rows.map((row)=>this.rowToEdgeCase(row));
375
+ }
376
+ /**
377
+ * Get edge cases grouped by category
378
+ */ async getEdgeCasesByCategory() {
379
+ if (!this.db) {
380
+ return {
381
+ [EdgeCaseCategory.SKILL_EXECUTION]: 0,
382
+ [EdgeCaseCategory.DATABASE_OPERATION]: 0,
383
+ [EdgeCaseCategory.COORDINATION]: 0,
384
+ [EdgeCaseCategory.FILE_OPERATION]: 0,
385
+ [EdgeCaseCategory.API_CALL]: 0
386
+ };
387
+ }
388
+ const rows = this.db.prepare(`
389
+ SELECT category, COUNT(*) as count
390
+ FROM edge_case_tracker
391
+ WHERE status NOT IN ('closed', 'wont_fix')
392
+ GROUP BY category
393
+ `).all();
394
+ const result = {};
395
+ for (const row of rows){
396
+ result[row.category] = row.count;
397
+ }
398
+ return result;
399
+ }
400
+ /**
401
+ * Get analytics
402
+ *
403
+ * Performance target: <500ms
404
+ */ async getAnalytics() {
405
+ if (!this.db) {
406
+ return {
407
+ totalCases: 0,
408
+ resolvedCases: 0,
409
+ resolutionRate: 0,
410
+ avgResolutionTimeHours: 0,
411
+ casesByPriority: {
412
+ [EdgeCasePriority.CRITICAL]: 0,
413
+ [EdgeCasePriority.HIGH]: 0,
414
+ [EdgeCasePriority.MEDIUM]: 0,
415
+ [EdgeCasePriority.LOW]: 0
416
+ },
417
+ casesByCategory: {
418
+ [EdgeCaseCategory.SKILL_EXECUTION]: 0,
419
+ [EdgeCaseCategory.DATABASE_OPERATION]: 0,
420
+ [EdgeCaseCategory.COORDINATION]: 0,
421
+ [EdgeCaseCategory.FILE_OPERATION]: 0,
422
+ [EdgeCaseCategory.API_CALL]: 0
423
+ },
424
+ casesByType: {
425
+ [EdgeCaseType.SYNTAX_ERROR]: 0,
426
+ [EdgeCaseType.LOGIC_ERROR]: 0,
427
+ [EdgeCaseType.TIMEOUT]: 0,
428
+ [EdgeCaseType.DATA_VALIDATION]: 0,
429
+ [EdgeCaseType.SYSTEM_ERROR]: 0
430
+ },
431
+ topEdgeCases: []
432
+ };
433
+ }
434
+ const stats = this.db.prepare(`
435
+ SELECT
436
+ COUNT(*) as total_cases,
437
+ SUM(CASE WHEN status IN ('resolved', 'closed') THEN 1 ELSE 0 END) as resolved_cases,
438
+ AVG(CASE
439
+ WHEN resolved_at IS NOT NULL
440
+ THEN (julianday(resolved_at) - julianday(first_occurred)) * 24
441
+ ELSE NULL
442
+ END) as avg_resolution_hours
443
+ FROM edge_case_tracker
444
+ `).get();
445
+ const totalCases = stats.total_cases || 0;
446
+ const resolvedCases = stats.resolved_cases || 0;
447
+ const resolutionRate = totalCases > 0 ? resolvedCases / totalCases : 0;
448
+ return {
449
+ totalCases,
450
+ resolvedCases,
451
+ resolutionRate,
452
+ avgResolutionTimeHours: stats.avg_resolution_hours || 0,
453
+ casesByPriority: await this.getCasesByPriority(),
454
+ casesByCategory: await this.getEdgeCasesByCategory(),
455
+ casesByType: await this.getCasesByType(),
456
+ topEdgeCases: (await this.getTopEdgeCases({
457
+ limit: 10
458
+ })).map((ec)=>({
459
+ id: ec.id,
460
+ signature: ec.signature,
461
+ type: ec.type,
462
+ category: ec.category,
463
+ occurrenceCount: ec.occurrenceCount,
464
+ priority: ec.priority
465
+ }))
466
+ };
467
+ }
468
+ /**
469
+ * Get cases by priority (for analytics)
470
+ */ async getCasesByPriority() {
471
+ if (!this.db) {
472
+ return {
473
+ [EdgeCasePriority.CRITICAL]: 0,
474
+ [EdgeCasePriority.HIGH]: 0,
475
+ [EdgeCasePriority.MEDIUM]: 0,
476
+ [EdgeCasePriority.LOW]: 0
477
+ };
478
+ }
479
+ const rows = this.db.prepare(`
480
+ SELECT priority, COUNT(*) as count
481
+ FROM edge_case_tracker
482
+ GROUP BY priority
483
+ `).all();
484
+ const result = {};
485
+ for (const row of rows){
486
+ result[row.priority] = row.count;
487
+ }
488
+ return result;
489
+ }
490
+ /**
491
+ * Get cases by type (for analytics)
492
+ */ async getCasesByType() {
493
+ if (!this.db) {
494
+ return {
495
+ [EdgeCaseType.SYNTAX_ERROR]: 0,
496
+ [EdgeCaseType.LOGIC_ERROR]: 0,
497
+ [EdgeCaseType.TIMEOUT]: 0,
498
+ [EdgeCaseType.DATA_VALIDATION]: 0,
499
+ [EdgeCaseType.SYSTEM_ERROR]: 0
500
+ };
501
+ }
502
+ const rows = this.db.prepare(`
503
+ SELECT type, COUNT(*) as count
504
+ FROM edge_case_tracker
505
+ GROUP BY type
506
+ `).all();
507
+ const result = {};
508
+ for (const row of rows){
509
+ result[row.type] = row.count;
510
+ }
511
+ return result;
512
+ }
513
+ /**
514
+ * Convert database row to EdgeCase object
515
+ */ rowToEdgeCase(row) {
516
+ return {
517
+ id: row.id,
518
+ signature: row.signature,
519
+ type: row.type,
520
+ category: row.category,
521
+ priority: row.priority,
522
+ context: JSON.parse(row.context),
523
+ status: row.status,
524
+ firstOccurred: new Date(row.first_occurred),
525
+ lastOccurred: new Date(row.last_occurred),
526
+ occurrenceCount: row.occurrence_count,
527
+ assignedExpert: row.assigned_expert || undefined,
528
+ resolvedAt: row.resolved_at ? new Date(row.resolved_at) : undefined,
529
+ resolution: row.resolution || undefined
530
+ };
531
+ }
532
+ /**
533
+ * Generate unique ID
534
+ */ generateId() {
535
+ return `edge-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
536
+ }
537
+ /**
538
+ * Close database connection
539
+ */ async close() {
540
+ if (this.db) {
541
+ this.db.close();
542
+ this.db = null;
543
+ }
544
+ }
545
+ }
546
+
547
+ //# sourceMappingURL=edge-case-tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/services/edge-case-tracker.ts"],"sourcesContent":["/**\r\n * Edge Case Tracker Service\r\n *\r\n * Comprehensive edge case tracking with feedback loop, deduplication,\r\n * expert notification, and analytics.\r\n *\r\n * Part of Phase 2, Task P2-2.1: Edge Case Feedback Loop\r\n */\r\n\r\nimport * as sqlite3 from 'better-sqlite3';\r\nimport { EdgeCaseDeduplicator } from '../lib/edge-case-deduplicator.js';\r\nimport {\r\n EdgeCase,\r\n EdgeCaseInput,\r\n EdgeCaseType,\r\n EdgeCaseCategory,\r\n EdgeCasePriority,\r\n EdgeCaseStatus,\r\n EdgeCaseResolution,\r\n EdgeCaseNotification,\r\n EdgeCaseAnalytics,\r\n EdgeCaseTrackerConfig,\r\n TopEdgeCasesQuery\r\n} from '../types/edge-case.js';\r\n\r\n/**\r\n * Edge Case Tracker\r\n *\r\n * Manages the complete edge case feedback loop:\r\n * 1. Detection and recording with deduplication\r\n * 2. Priority scoring based on frequency, recency, severity, impact\r\n * 3. Expert notification queue with <1h SLA\r\n * 4. Workflow management (NEW → INVESTIGATING → RESOLVED → CLOSED)\r\n * 5. Resolution tracking and verification\r\n * 6. Analytics and reporting\r\n */\r\nexport class EdgeCaseTracker {\r\n private db: sqlite3.Database | null = null;\r\n private deduplicator: EdgeCaseDeduplicator;\r\n private config: EdgeCaseTrackerConfig;\r\n\r\n constructor(config: EdgeCaseTrackerConfig) {\r\n this.config = {\r\n autoCloseAfterDays: 7,\r\n notificationThrottleMinutes: 60,\r\n ...config\r\n };\r\n\r\n this.deduplicator = new EdgeCaseDeduplicator();\r\n }\r\n\r\n /**\r\n * Initialize the tracker (create database tables)\r\n */\r\n public async initialize(): Promise<void> {\r\n this.db = new sqlite3.default(this.config.dbPath);\r\n\r\n // Execute migration to create tables\r\n const migration = `\r\n CREATE TABLE IF NOT EXISTS edge_case_tracker (\r\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\r\n signature TEXT NOT NULL UNIQUE,\r\n type TEXT NOT NULL CHECK(type IN (\r\n 'syntax_error', 'logic_error', 'timeout', 'data_validation', 'system_error'\r\n )),\r\n category TEXT NOT NULL CHECK(category IN (\r\n 'skill_execution', 'database_operation', 'coordination', 'file_operation', 'api_call'\r\n )),\r\n priority TEXT NOT NULL CHECK(priority IN ('critical', 'high', 'medium', 'low')),\r\n context TEXT NOT NULL,\r\n status TEXT NOT NULL DEFAULT 'new' CHECK(status IN (\r\n 'new', 'investigating', 'resolved', 'closed', 'wont_fix'\r\n )),\r\n first_occurred DATETIME DEFAULT CURRENT_TIMESTAMP,\r\n last_occurred DATETIME DEFAULT CURRENT_TIMESTAMP,\r\n occurrence_count INTEGER DEFAULT 1,\r\n assigned_expert TEXT,\r\n investigation_started_at DATETIME,\r\n resolved_at DATETIME,\r\n resolution TEXT,\r\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\r\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP\r\n );\r\n\r\n CREATE UNIQUE INDEX IF NOT EXISTS idx_edge_case_tracker_signature\r\n ON edge_case_tracker(signature);\r\n\r\n CREATE INDEX IF NOT EXISTS idx_edge_case_tracker_priority_status\r\n ON edge_case_tracker(priority, status);\r\n\r\n CREATE TABLE IF NOT EXISTS edge_case_notifications (\r\n id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),\r\n edge_case_id TEXT NOT NULL,\r\n priority TEXT NOT NULL,\r\n type TEXT NOT NULL,\r\n category TEXT NOT NULL,\r\n message TEXT NOT NULL,\r\n channel TEXT NOT NULL CHECK(channel IN ('slack', 'email')),\r\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\r\n sent_at DATETIME,\r\n delivery_status TEXT CHECK(delivery_status IN ('pending', 'sent', 'failed')),\r\n FOREIGN KEY (edge_case_id) REFERENCES edge_case_tracker(id) ON DELETE CASCADE\r\n );\r\n\r\n CREATE INDEX IF NOT EXISTS idx_edge_case_notifications_pending\r\n ON edge_case_notifications(created_at, sent_at)\r\n WHERE sent_at IS NULL;\r\n `;\r\n\r\n this.db.exec(migration);\r\n }\r\n\r\n /**\r\n * Record an edge case with automatic deduplication\r\n *\r\n * Performance target: <100ms\r\n */\r\n public async recordEdgeCase(input: EdgeCaseInput): Promise<EdgeCase> {\r\n if (!this.db) {\r\n throw new Error('EdgeCaseTracker not initialized. Call initialize() first.');\r\n }\r\n\r\n // Generate signature for deduplication\r\n const signature = this.deduplicator.generateSignature(input);\r\n\r\n // Check for existing edge case with same signature\r\n const existing = this.db.prepare(`\r\n SELECT * FROM edge_case_tracker WHERE signature = ?\r\n `).get(signature) as any;\r\n\r\n if (existing) {\r\n // Update existing edge case (increment count, update last_occurred)\r\n const updatedCount = existing.occurrence_count + 1;\r\n\r\n // Recalculate priority based on new occurrence count\r\n const updatedPriority = this.calculatePriority({\r\n ...input,\r\n occurrenceCount: updatedCount,\r\n firstOccurred: new Date(existing.first_occurred),\r\n lastOccurred: new Date()\r\n });\r\n\r\n this.db.prepare(`\r\n UPDATE edge_case_tracker\r\n SET occurrence_count = ?,\r\n last_occurred = CURRENT_TIMESTAMP,\r\n priority = ?,\r\n updated_at = CURRENT_TIMESTAMP\r\n WHERE id = ?\r\n `).run(updatedCount, updatedPriority, existing.id);\r\n\r\n // Return updated edge case\r\n return this.getEdgeCase(existing.id)!;\r\n } else {\r\n // Create new edge case\r\n const id = this.generateId();\r\n const priority = this.calculatePriority(input);\r\n\r\n this.db.prepare(`\r\n INSERT INTO edge_case_tracker (\r\n id, signature, type, category, priority, context, status,\r\n first_occurred, last_occurred, occurrence_count\r\n ) VALUES (?, ?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 1)\r\n `).run(\r\n id,\r\n signature,\r\n input.type,\r\n input.category,\r\n priority,\r\n JSON.stringify(input.context),\r\n EdgeCaseStatus.NEW\r\n );\r\n\r\n // Queue notification\r\n await this.queueNotification(id, input.type, input.category, priority);\r\n\r\n // Return created edge case\r\n return this.getEdgeCase(id)!;\r\n }\r\n }\r\n\r\n /**\r\n * Calculate priority score based on frequency, recency, severity, impact\r\n *\r\n * Scoring algorithm:\r\n * - Frequency: occurrence_count > 100 (+30), > 10 (+20), > 1 (+10)\r\n * - Recency: < 1h (+20), < 24h (+10)\r\n * - Type severity: system_error (+20), logic_error (+10)\r\n * - Category impact: database_operation (+15), coordination (+10)\r\n *\r\n * Priority thresholds:\r\n * - CRITICAL: >= 60\r\n * - HIGH: >= 40\r\n * - MEDIUM: >= 20\r\n * - LOW: < 20\r\n */\r\n private calculatePriority(input: EdgeCaseInput & Partial<EdgeCase>): EdgeCasePriority {\r\n let score = 0;\r\n\r\n // Frequency scoring\r\n const count = input.occurrenceCount || 1;\r\n if (count > 100) score += 30;\r\n else if (count > 10) score += 20;\r\n else if (count > 1) score += 10;\r\n\r\n // Recency scoring\r\n if (input.firstOccurred) {\r\n const hoursSinceFirst = (Date.now() - input.firstOccurred.getTime()) / 3600000;\r\n if (hoursSinceFirst < 1) score += 20;\r\n else if (hoursSinceFirst < 24) score += 10;\r\n }\r\n\r\n // Type severity scoring\r\n if (input.type === EdgeCaseType.SYSTEM_ERROR) score += 20;\r\n else if (input.type === EdgeCaseType.LOGIC_ERROR) score += 10;\r\n else if (input.type === EdgeCaseType.TIMEOUT) score += 5;\r\n\r\n // Category impact scoring\r\n if (input.category === EdgeCaseCategory.DATABASE_OPERATION) score += 15;\r\n else if (input.category === EdgeCaseCategory.COORDINATION) score += 10;\r\n else if (input.category === EdgeCaseCategory.API_CALL) score += 8;\r\n\r\n // Determine priority\r\n if (score >= 60) return EdgeCasePriority.CRITICAL;\r\n if (score >= 40) return EdgeCasePriority.HIGH;\r\n if (score >= 20) return EdgeCasePriority.MEDIUM;\r\n return EdgeCasePriority.LOW;\r\n }\r\n\r\n /**\r\n * Queue expert notification\r\n *\r\n * Notifications are queued but not sent immediately to allow throttling.\r\n * External service should process the queue periodically.\r\n */\r\n private async queueNotification(\r\n edgeCaseId: string,\r\n type: EdgeCaseType,\r\n category: EdgeCaseCategory,\r\n priority: EdgeCasePriority\r\n ): Promise<void> {\r\n if (!this.db) return;\r\n\r\n // Check if notification already exists for this edge case\r\n const existing = this.db.prepare(`\r\n SELECT COUNT(*) as count\r\n FROM edge_case_notifications\r\n WHERE edge_case_id = ? AND sent_at IS NULL\r\n `).get(edgeCaseId) as { count: number };\r\n\r\n if (existing.count > 0) {\r\n // Don't duplicate notifications\r\n return;\r\n }\r\n\r\n // Determine notification channels based on priority\r\n const channels: Array<'slack' | 'email'> = [];\r\n\r\n if (priority === EdgeCasePriority.CRITICAL || priority === EdgeCasePriority.HIGH) {\r\n if (this.config.notificationConfig.slack?.enabled) {\r\n channels.push('slack');\r\n }\r\n }\r\n\r\n if (this.config.notificationConfig.email?.enabled) {\r\n channels.push('email');\r\n }\r\n\r\n // Create notification messages\r\n for (const channel of channels) {\r\n const message = this.formatNotificationMessage(type, category, priority);\r\n\r\n this.db.prepare(`\r\n INSERT INTO edge_case_notifications (\r\n edge_case_id, priority, type, category, message, channel, delivery_status\r\n ) VALUES (?, ?, ?, ?, ?, ?, 'pending')\r\n `).run(edgeCaseId, priority, type, category, message, channel);\r\n }\r\n }\r\n\r\n /**\r\n * Format notification message\r\n */\r\n private formatNotificationMessage(\r\n type: EdgeCaseType,\r\n category: EdgeCaseCategory,\r\n priority: EdgeCasePriority\r\n ): string {\r\n const emoji = {\r\n [EdgeCasePriority.CRITICAL]: '🚨',\r\n [EdgeCasePriority.HIGH]: '⚠️',\r\n [EdgeCasePriority.MEDIUM]: '⚡',\r\n [EdgeCasePriority.LOW]: 'ℹ️'\r\n };\r\n\r\n return `${emoji[priority]} Edge Case Detected\\n` +\r\n `Priority: ${priority.toUpperCase()}\\n` +\r\n `Type: ${type}\\n` +\r\n `Category: ${category}\\n` +\r\n `Please investigate and assign.`;\r\n }\r\n\r\n /**\r\n * Get edge case by ID\r\n */\r\n public getEdgeCase(id: string): EdgeCase | null {\r\n if (!this.db) return null;\r\n\r\n const row = this.db.prepare(`\r\n SELECT * FROM edge_case_tracker WHERE id = ?\r\n `).get(id) as any;\r\n\r\n if (!row) return null;\r\n\r\n return this.rowToEdgeCase(row);\r\n }\r\n\r\n /**\r\n * Update edge case status\r\n */\r\n public async updateStatus(\r\n id: string,\r\n status: EdgeCaseStatus,\r\n assignedExpert?: string\r\n ): Promise<void> {\r\n if (!this.db) return;\r\n\r\n const updates: string[] = ['status = ?'];\r\n const params: any[] = [status];\r\n\r\n if (assignedExpert) {\r\n updates.push('assigned_expert = ?');\r\n params.push(assignedExpert);\r\n }\r\n\r\n if (status === EdgeCaseStatus.INVESTIGATING) {\r\n updates.push('investigation_started_at = CURRENT_TIMESTAMP');\r\n }\r\n\r\n if (status === EdgeCaseStatus.RESOLVED) {\r\n updates.push('resolved_at = CURRENT_TIMESTAMP');\r\n }\r\n\r\n params.push(id);\r\n\r\n this.db.prepare(`\r\n UPDATE edge_case_tracker\r\n SET ${updates.join(', ')}, updated_at = CURRENT_TIMESTAMP\r\n WHERE id = ?\r\n `).run(...params);\r\n }\r\n\r\n /**\r\n * Resolve edge case with resolution details\r\n */\r\n public async resolveEdgeCase(\r\n id: string,\r\n resolution: EdgeCaseResolution\r\n ): Promise<void> {\r\n if (!this.db) return;\r\n\r\n this.db.prepare(`\r\n UPDATE edge_case_tracker\r\n SET status = 'resolved',\r\n resolved_at = CURRENT_TIMESTAMP,\r\n resolution = ?,\r\n updated_at = CURRENT_TIMESTAMP\r\n WHERE id = ?\r\n `).run(JSON.stringify(resolution), id);\r\n }\r\n\r\n /**\r\n * Get pending notifications\r\n */\r\n public async getPendingNotifications(): Promise<EdgeCaseNotification[]> {\r\n if (!this.db) return [];\r\n\r\n const rows = this.db.prepare(`\r\n SELECT * FROM edge_case_notifications\r\n WHERE sent_at IS NULL\r\n ORDER BY created_at ASC\r\n `).all() as any[];\r\n\r\n return rows.map(row => ({\r\n id: row.id,\r\n edgeCaseId: row.edge_case_id,\r\n priority: row.priority as EdgeCasePriority,\r\n type: row.type as EdgeCaseType,\r\n category: row.category as EdgeCaseCategory,\r\n message: row.message,\r\n createdAt: new Date(row.created_at),\r\n sentAt: row.sent_at ? new Date(row.sent_at) : undefined,\r\n channel: row.channel as 'slack' | 'email'\r\n }));\r\n }\r\n\r\n /**\r\n * Mark notification as sent\r\n */\r\n public async markNotificationSent(notificationId: string): Promise<void> {\r\n if (!this.db) return;\r\n\r\n this.db.prepare(`\r\n UPDATE edge_case_notifications\r\n SET sent_at = CURRENT_TIMESTAMP,\r\n delivery_status = 'sent'\r\n WHERE id = ?\r\n `).run(notificationId);\r\n }\r\n\r\n /**\r\n * Check for auto-close eligibility (7 days without recurrence)\r\n */\r\n public async checkAutoClose(): Promise<void> {\r\n if (!this.db) return;\r\n\r\n const daysThreshold = this.config.autoCloseAfterDays || 7;\r\n\r\n this.db.prepare(`\r\n UPDATE edge_case_tracker\r\n SET status = 'closed',\r\n updated_at = CURRENT_TIMESTAMP\r\n WHERE status = 'resolved'\r\n AND julianday('now') - julianday(resolved_at) >= ?\r\n `).run(daysThreshold);\r\n }\r\n\r\n /**\r\n * Get top edge cases (for analytics)\r\n *\r\n * Performance target: <500ms\r\n */\r\n public async getTopEdgeCases(query: TopEdgeCasesQuery = {}): Promise<EdgeCase[]> {\r\n if (!this.db) return [];\r\n\r\n const limit = query.limit || 10;\r\n const orderBy = query.orderBy || 'frequency';\r\n\r\n let orderClause = 'occurrence_count DESC';\r\n if (orderBy === 'recent') orderClause = 'last_occurred DESC';\r\n if (orderBy === 'priority') orderClause = `\r\n CASE priority\r\n WHEN 'critical' THEN 1\r\n WHEN 'high' THEN 2\r\n WHEN 'medium' THEN 3\r\n WHEN 'low' THEN 4\r\n END\r\n `;\r\n\r\n let whereClause = \"status NOT IN ('closed', 'wont_fix')\";\r\n const params: any[] = [];\r\n\r\n if (query.category) {\r\n whereClause += ' AND category = ?';\r\n params.push(query.category);\r\n }\r\n\r\n if (query.type) {\r\n whereClause += ' AND type = ?';\r\n params.push(query.type);\r\n }\r\n\r\n if (query.status) {\r\n whereClause = whereClause.replace(\"status NOT IN ('closed', 'wont_fix')\", 'status = ?');\r\n params.push(query.status);\r\n }\r\n\r\n params.push(limit);\r\n\r\n const rows = this.db.prepare(`\r\n SELECT * FROM edge_case_tracker\r\n WHERE ${whereClause}\r\n ORDER BY ${orderClause}\r\n LIMIT ?\r\n `).all(...params) as any[];\r\n\r\n return rows.map(row => this.rowToEdgeCase(row));\r\n }\r\n\r\n /**\r\n * Get edge cases by priority\r\n */\r\n public async getEdgeCasesByPriority(priority: EdgeCasePriority): Promise<EdgeCase[]> {\r\n if (!this.db) return [];\r\n\r\n const rows = this.db.prepare(`\r\n SELECT * FROM edge_case_tracker\r\n WHERE priority = ? AND status NOT IN ('closed', 'wont_fix')\r\n ORDER BY last_occurred DESC\r\n `).all(priority) as any[];\r\n\r\n return rows.map(row => this.rowToEdgeCase(row));\r\n }\r\n\r\n /**\r\n * Get edge cases grouped by category\r\n */\r\n public async getEdgeCasesByCategory(): Promise<Record<EdgeCaseCategory, number>> {\r\n if (!this.db) {\r\n return {\r\n [EdgeCaseCategory.SKILL_EXECUTION]: 0,\r\n [EdgeCaseCategory.DATABASE_OPERATION]: 0,\r\n [EdgeCaseCategory.COORDINATION]: 0,\r\n [EdgeCaseCategory.FILE_OPERATION]: 0,\r\n [EdgeCaseCategory.API_CALL]: 0\r\n };\r\n }\r\n\r\n const rows = this.db.prepare(`\r\n SELECT category, COUNT(*) as count\r\n FROM edge_case_tracker\r\n WHERE status NOT IN ('closed', 'wont_fix')\r\n GROUP BY category\r\n `).all() as any[];\r\n\r\n const result: Record<string, number> = {};\r\n for (const row of rows) {\r\n result[row.category] = row.count;\r\n }\r\n\r\n return result as Record<EdgeCaseCategory, number>;\r\n }\r\n\r\n /**\r\n * Get analytics\r\n *\r\n * Performance target: <500ms\r\n */\r\n public async getAnalytics(): Promise<EdgeCaseAnalytics> {\r\n if (!this.db) {\r\n return {\r\n totalCases: 0,\r\n resolvedCases: 0,\r\n resolutionRate: 0,\r\n avgResolutionTimeHours: 0,\r\n casesByPriority: {\r\n [EdgeCasePriority.CRITICAL]: 0,\r\n [EdgeCasePriority.HIGH]: 0,\r\n [EdgeCasePriority.MEDIUM]: 0,\r\n [EdgeCasePriority.LOW]: 0\r\n },\r\n casesByCategory: {\r\n [EdgeCaseCategory.SKILL_EXECUTION]: 0,\r\n [EdgeCaseCategory.DATABASE_OPERATION]: 0,\r\n [EdgeCaseCategory.COORDINATION]: 0,\r\n [EdgeCaseCategory.FILE_OPERATION]: 0,\r\n [EdgeCaseCategory.API_CALL]: 0\r\n },\r\n casesByType: {\r\n [EdgeCaseType.SYNTAX_ERROR]: 0,\r\n [EdgeCaseType.LOGIC_ERROR]: 0,\r\n [EdgeCaseType.TIMEOUT]: 0,\r\n [EdgeCaseType.DATA_VALIDATION]: 0,\r\n [EdgeCaseType.SYSTEM_ERROR]: 0\r\n },\r\n topEdgeCases: []\r\n };\r\n }\r\n\r\n const stats = this.db.prepare(`\r\n SELECT\r\n COUNT(*) as total_cases,\r\n SUM(CASE WHEN status IN ('resolved', 'closed') THEN 1 ELSE 0 END) as resolved_cases,\r\n AVG(CASE\r\n WHEN resolved_at IS NOT NULL\r\n THEN (julianday(resolved_at) - julianday(first_occurred)) * 24\r\n ELSE NULL\r\n END) as avg_resolution_hours\r\n FROM edge_case_tracker\r\n `).get() as any;\r\n\r\n const totalCases = stats.total_cases || 0;\r\n const resolvedCases = stats.resolved_cases || 0;\r\n const resolutionRate = totalCases > 0 ? resolvedCases / totalCases : 0;\r\n\r\n return {\r\n totalCases,\r\n resolvedCases,\r\n resolutionRate,\r\n avgResolutionTimeHours: stats.avg_resolution_hours || 0,\r\n casesByPriority: await this.getCasesByPriority(),\r\n casesByCategory: await this.getEdgeCasesByCategory(),\r\n casesByType: await this.getCasesByType(),\r\n topEdgeCases: (await this.getTopEdgeCases({ limit: 10 })).map(ec => ({\r\n id: ec.id,\r\n signature: ec.signature,\r\n type: ec.type,\r\n category: ec.category,\r\n occurrenceCount: ec.occurrenceCount,\r\n priority: ec.priority\r\n }))\r\n };\r\n }\r\n\r\n /**\r\n * Get cases by priority (for analytics)\r\n */\r\n private async getCasesByPriority(): Promise<Record<EdgeCasePriority, number>> {\r\n if (!this.db) {\r\n return {\r\n [EdgeCasePriority.CRITICAL]: 0,\r\n [EdgeCasePriority.HIGH]: 0,\r\n [EdgeCasePriority.MEDIUM]: 0,\r\n [EdgeCasePriority.LOW]: 0\r\n };\r\n }\r\n\r\n const rows = this.db.prepare(`\r\n SELECT priority, COUNT(*) as count\r\n FROM edge_case_tracker\r\n GROUP BY priority\r\n `).all() as any[];\r\n\r\n const result: Record<string, number> = {};\r\n for (const row of rows) {\r\n result[row.priority] = row.count;\r\n }\r\n\r\n return result as Record<EdgeCasePriority, number>;\r\n }\r\n\r\n /**\r\n * Get cases by type (for analytics)\r\n */\r\n private async getCasesByType(): Promise<Record<EdgeCaseType, number>> {\r\n if (!this.db) {\r\n return {\r\n [EdgeCaseType.SYNTAX_ERROR]: 0,\r\n [EdgeCaseType.LOGIC_ERROR]: 0,\r\n [EdgeCaseType.TIMEOUT]: 0,\r\n [EdgeCaseType.DATA_VALIDATION]: 0,\r\n [EdgeCaseType.SYSTEM_ERROR]: 0\r\n };\r\n }\r\n\r\n const rows = this.db.prepare(`\r\n SELECT type, COUNT(*) as count\r\n FROM edge_case_tracker\r\n GROUP BY type\r\n `).all() as any[];\r\n\r\n const result: Record<string, number> = {};\r\n for (const row of rows) {\r\n result[row.type] = row.count;\r\n }\r\n\r\n return result as Record<EdgeCaseType, number>;\r\n }\r\n\r\n /**\r\n * Convert database row to EdgeCase object\r\n */\r\n private rowToEdgeCase(row: any): EdgeCase {\r\n return {\r\n id: row.id,\r\n signature: row.signature,\r\n type: row.type as EdgeCaseType,\r\n category: row.category as EdgeCaseCategory,\r\n priority: row.priority as EdgeCasePriority,\r\n context: JSON.parse(row.context),\r\n status: row.status as EdgeCaseStatus,\r\n firstOccurred: new Date(row.first_occurred),\r\n lastOccurred: new Date(row.last_occurred),\r\n occurrenceCount: row.occurrence_count,\r\n assignedExpert: row.assigned_expert || undefined,\r\n resolvedAt: row.resolved_at ? new Date(row.resolved_at) : undefined,\r\n resolution: row.resolution || undefined\r\n };\r\n }\r\n\r\n /**\r\n * Generate unique ID\r\n */\r\n private generateId(): string {\r\n return `edge-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\r\n }\r\n\r\n /**\r\n * Close database connection\r\n */\r\n public async close(): Promise<void> {\r\n if (this.db) {\r\n this.db.close();\r\n this.db = null;\r\n }\r\n }\r\n}\r\n"],"names":["sqlite3","EdgeCaseDeduplicator","EdgeCaseType","EdgeCaseCategory","EdgeCasePriority","EdgeCaseStatus","EdgeCaseTracker","db","deduplicator","config","autoCloseAfterDays","notificationThrottleMinutes","initialize","default","dbPath","migration","exec","recordEdgeCase","input","Error","signature","generateSignature","existing","prepare","get","updatedCount","occurrence_count","updatedPriority","calculatePriority","occurrenceCount","firstOccurred","Date","first_occurred","lastOccurred","run","id","getEdgeCase","generateId","priority","type","category","JSON","stringify","context","NEW","queueNotification","score","count","hoursSinceFirst","now","getTime","SYSTEM_ERROR","LOGIC_ERROR","TIMEOUT","DATABASE_OPERATION","COORDINATION","API_CALL","CRITICAL","HIGH","MEDIUM","LOW","edgeCaseId","channels","notificationConfig","slack","enabled","push","email","channel","message","formatNotificationMessage","emoji","toUpperCase","row","rowToEdgeCase","updateStatus","status","assignedExpert","updates","params","INVESTIGATING","RESOLVED","join","resolveEdgeCase","resolution","getPendingNotifications","rows","all","map","edge_case_id","createdAt","created_at","sentAt","sent_at","undefined","markNotificationSent","notificationId","checkAutoClose","daysThreshold","getTopEdgeCases","query","limit","orderBy","orderClause","whereClause","replace","getEdgeCasesByPriority","getEdgeCasesByCategory","SKILL_EXECUTION","FILE_OPERATION","result","getAnalytics","totalCases","resolvedCases","resolutionRate","avgResolutionTimeHours","casesByPriority","casesByCategory","casesByType","SYNTAX_ERROR","DATA_VALIDATION","topEdgeCases","stats","total_cases","resolved_cases","avg_resolution_hours","getCasesByPriority","getCasesByType","ec","parse","last_occurred","assigned_expert","resolvedAt","resolved_at","Math","random","toString","substr","close"],"mappings":"AAAA;;;;;;;CAOC,GAED,YAAYA,aAAa,iBAAiB;AAC1C,SAASC,oBAAoB,QAAQ,mCAAmC;AACxE,SAGEC,YAAY,EACZC,gBAAgB,EAChBC,gBAAgB,EAChBC,cAAc,QAMT,wBAAwB;AAE/B;;;;;;;;;;CAUC,GACD,OAAO,MAAMC;IACHC,KAA8B,KAAK;IACnCC,aAAmC;IACnCC,OAA8B;IAEtC,YAAYA,MAA6B,CAAE;QACzC,IAAI,CAACA,MAAM,GAAG;YACZC,oBAAoB;YACpBC,6BAA6B;YAC7B,GAAGF,MAAM;QACX;QAEA,IAAI,CAACD,YAAY,GAAG,IAAIP;IAC1B;IAEA;;GAEC,GACD,MAAaW,aAA4B;QACvC,IAAI,CAACL,EAAE,GAAG,IAAIP,QAAQa,OAAO,CAAC,IAAI,CAACJ,MAAM,CAACK,MAAM;QAEhD,qCAAqC;QACrC,MAAMC,YAAY,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAiDnB,CAAC;QAED,IAAI,CAACR,EAAE,CAACS,IAAI,CAACD;IACf;IAEA;;;;GAIC,GACD,MAAaE,eAAeC,KAAoB,EAAqB;QACnE,IAAI,CAAC,IAAI,CAACX,EAAE,EAAE;YACZ,MAAM,IAAIY,MAAM;QAClB;QAEA,uCAAuC;QACvC,MAAMC,YAAY,IAAI,CAACZ,YAAY,CAACa,iBAAiB,CAACH;QAEtD,mDAAmD;QACnD,MAAMI,WAAW,IAAI,CAACf,EAAE,CAACgB,OAAO,CAAC,CAAC;;IAElC,CAAC,EAAEC,GAAG,CAACJ;QAEP,IAAIE,UAAU;YACZ,oEAAoE;YACpE,MAAMG,eAAeH,SAASI,gBAAgB,GAAG;YAEjD,qDAAqD;YACrD,MAAMC,kBAAkB,IAAI,CAACC,iBAAiB,CAAC;gBAC7C,GAAGV,KAAK;gBACRW,iBAAiBJ;gBACjBK,eAAe,IAAIC,KAAKT,SAASU,cAAc;gBAC/CC,cAAc,IAAIF;YACpB;YAEA,IAAI,CAACxB,EAAE,CAACgB,OAAO,CAAC,CAAC;;;;;;;MAOjB,CAAC,EAAEW,GAAG,CAACT,cAAcE,iBAAiBL,SAASa,EAAE;YAEjD,2BAA2B;YAC3B,OAAO,IAAI,CAACC,WAAW,CAACd,SAASa,EAAE;QACrC,OAAO;YACL,uBAAuB;YACvB,MAAMA,KAAK,IAAI,CAACE,UAAU;YAC1B,MAAMC,WAAW,IAAI,CAACV,iBAAiB,CAACV;YAExC,IAAI,CAACX,EAAE,CAACgB,OAAO,CAAC,CAAC;;;;;MAKjB,CAAC,EAAEW,GAAG,CACJC,IACAf,WACAF,MAAMqB,IAAI,EACVrB,MAAMsB,QAAQ,EACdF,UACAG,KAAKC,SAAS,CAACxB,MAAMyB,OAAO,GAC5BtC,eAAeuC,GAAG;YAGpB,qBAAqB;YACrB,MAAM,IAAI,CAACC,iBAAiB,CAACV,IAAIjB,MAAMqB,IAAI,EAAErB,MAAMsB,QAAQ,EAAEF;YAE7D,2BAA2B;YAC3B,OAAO,IAAI,CAACF,WAAW,CAACD;QAC1B;IACF;IAEA;;;;;;;;;;;;;;GAcC,GACD,AAAQP,kBAAkBV,KAAwC,EAAoB;QACpF,IAAI4B,QAAQ;QAEZ,oBAAoB;QACpB,MAAMC,QAAQ7B,MAAMW,eAAe,IAAI;QACvC,IAAIkB,QAAQ,KAAKD,SAAS;aACrB,IAAIC,QAAQ,IAAID,SAAS;aACzB,IAAIC,QAAQ,GAAGD,SAAS;QAE7B,kBAAkB;QAClB,IAAI5B,MAAMY,aAAa,EAAE;YACvB,MAAMkB,kBAAkB,AAACjB,CAAAA,KAAKkB,GAAG,KAAK/B,MAAMY,aAAa,CAACoB,OAAO,EAAC,IAAK;YACvE,IAAIF,kBAAkB,GAAGF,SAAS;iBAC7B,IAAIE,kBAAkB,IAAIF,SAAS;QAC1C;QAEA,wBAAwB;QACxB,IAAI5B,MAAMqB,IAAI,KAAKrC,aAAaiD,YAAY,EAAEL,SAAS;aAClD,IAAI5B,MAAMqB,IAAI,KAAKrC,aAAakD,WAAW,EAAEN,SAAS;aACtD,IAAI5B,MAAMqB,IAAI,KAAKrC,aAAamD,OAAO,EAAEP,SAAS;QAEvD,0BAA0B;QAC1B,IAAI5B,MAAMsB,QAAQ,KAAKrC,iBAAiBmD,kBAAkB,EAAER,SAAS;aAChE,IAAI5B,MAAMsB,QAAQ,KAAKrC,iBAAiBoD,YAAY,EAAET,SAAS;aAC/D,IAAI5B,MAAMsB,QAAQ,KAAKrC,iBAAiBqD,QAAQ,EAAEV,SAAS;QAEhE,qBAAqB;QACrB,IAAIA,SAAS,IAAI,OAAO1C,iBAAiBqD,QAAQ;QACjD,IAAIX,SAAS,IAAI,OAAO1C,iBAAiBsD,IAAI;QAC7C,IAAIZ,SAAS,IAAI,OAAO1C,iBAAiBuD,MAAM;QAC/C,OAAOvD,iBAAiBwD,GAAG;IAC7B;IAEA;;;;;GAKC,GACD,MAAcf,kBACZgB,UAAkB,EAClBtB,IAAkB,EAClBC,QAA0B,EAC1BF,QAA0B,EACX;QACf,IAAI,CAAC,IAAI,CAAC/B,EAAE,EAAE;QAEd,0DAA0D;QAC1D,MAAMe,WAAW,IAAI,CAACf,EAAE,CAACgB,OAAO,CAAC,CAAC;;;;IAIlC,CAAC,EAAEC,GAAG,CAACqC;QAEP,IAAIvC,SAASyB,KAAK,GAAG,GAAG;YACtB,gCAAgC;YAChC;QACF;QAEA,oDAAoD;QACpD,MAAMe,WAAqC,EAAE;QAE7C,IAAIxB,aAAalC,iBAAiBqD,QAAQ,IAAInB,aAAalC,iBAAiBsD,IAAI,EAAE;YAChF,IAAI,IAAI,CAACjD,MAAM,CAACsD,kBAAkB,CAACC,KAAK,EAAEC,SAAS;gBACjDH,SAASI,IAAI,CAAC;YAChB;QACF;QAEA,IAAI,IAAI,CAACzD,MAAM,CAACsD,kBAAkB,CAACI,KAAK,EAAEF,SAAS;YACjDH,SAASI,IAAI,CAAC;QAChB;QAEA,+BAA+B;QAC/B,KAAK,MAAME,WAAWN,SAAU;YAC9B,MAAMO,UAAU,IAAI,CAACC,yBAAyB,CAAC/B,MAAMC,UAAUF;YAE/D,IAAI,CAAC/B,EAAE,CAACgB,OAAO,CAAC,CAAC;;;;MAIjB,CAAC,EAAEW,GAAG,CAAC2B,YAAYvB,UAAUC,MAAMC,UAAU6B,SAASD;QACxD;IACF;IAEA;;GAEC,GACD,AAAQE,0BACN/B,IAAkB,EAClBC,QAA0B,EAC1BF,QAA0B,EAClB;QACR,MAAMiC,QAAQ;YACZ,CAACnE,iBAAiBqD,QAAQ,CAAC,EAAE;YAC7B,CAACrD,iBAAiBsD,IAAI,CAAC,EAAE;YACzB,CAACtD,iBAAiBuD,MAAM,CAAC,EAAE;YAC3B,CAACvD,iBAAiBwD,GAAG,CAAC,EAAE;QAC1B;QAEA,OAAO,GAAGW,KAAK,CAACjC,SAAS,CAAC,qBAAqB,CAAC,GACzC,CAAC,UAAU,EAAEA,SAASkC,WAAW,GAAG,EAAE,CAAC,GACvC,CAAC,MAAM,EAAEjC,KAAK,EAAE,CAAC,GACjB,CAAC,UAAU,EAAEC,SAAS,EAAE,CAAC,GACzB,CAAC,8BAA8B,CAAC;IACzC;IAEA;;GAEC,GACD,AAAOJ,YAAYD,EAAU,EAAmB;QAC9C,IAAI,CAAC,IAAI,CAAC5B,EAAE,EAAE,OAAO;QAErB,MAAMkE,MAAM,IAAI,CAAClE,EAAE,CAACgB,OAAO,CAAC,CAAC;;IAE7B,CAAC,EAAEC,GAAG,CAACW;QAEP,IAAI,CAACsC,KAAK,OAAO;QAEjB,OAAO,IAAI,CAACC,aAAa,CAACD;IAC5B;IAEA;;GAEC,GACD,MAAaE,aACXxC,EAAU,EACVyC,MAAsB,EACtBC,cAAuB,EACR;QACf,IAAI,CAAC,IAAI,CAACtE,EAAE,EAAE;QAEd,MAAMuE,UAAoB;YAAC;SAAa;QACxC,MAAMC,SAAgB;YAACH;SAAO;QAE9B,IAAIC,gBAAgB;YAClBC,QAAQZ,IAAI,CAAC;YACba,OAAOb,IAAI,CAACW;QACd;QAEA,IAAID,WAAWvE,eAAe2E,aAAa,EAAE;YAC3CF,QAAQZ,IAAI,CAAC;QACf;QAEA,IAAIU,WAAWvE,eAAe4E,QAAQ,EAAE;YACtCH,QAAQZ,IAAI,CAAC;QACf;QAEAa,OAAOb,IAAI,CAAC/B;QAEZ,IAAI,CAAC5B,EAAE,CAACgB,OAAO,CAAC,CAAC;;UAEX,EAAEuD,QAAQI,IAAI,CAAC,MAAM;;IAE3B,CAAC,EAAEhD,GAAG,IAAI6C;IACZ;IAEA;;GAEC,GACD,MAAaI,gBACXhD,EAAU,EACViD,UAA8B,EACf;QACf,IAAI,CAAC,IAAI,CAAC7E,EAAE,EAAE;QAEd,IAAI,CAACA,EAAE,CAACgB,OAAO,CAAC,CAAC;;;;;;;IAOjB,CAAC,EAAEW,GAAG,CAACO,KAAKC,SAAS,CAAC0C,aAAajD;IACrC;IAEA;;GAEC,GACD,MAAakD,0BAA2D;QACtE,IAAI,CAAC,IAAI,CAAC9E,EAAE,EAAE,OAAO,EAAE;QAEvB,MAAM+E,OAAO,IAAI,CAAC/E,EAAE,CAACgB,OAAO,CAAC,CAAC;;;;IAI9B,CAAC,EAAEgE,GAAG;QAEN,OAAOD,KAAKE,GAAG,CAACf,CAAAA,MAAQ,CAAA;gBACtBtC,IAAIsC,IAAItC,EAAE;gBACV0B,YAAYY,IAAIgB,YAAY;gBAC5BnD,UAAUmC,IAAInC,QAAQ;gBACtBC,MAAMkC,IAAIlC,IAAI;gBACdC,UAAUiC,IAAIjC,QAAQ;gBACtB6B,SAASI,IAAIJ,OAAO;gBACpBqB,WAAW,IAAI3D,KAAK0C,IAAIkB,UAAU;gBAClCC,QAAQnB,IAAIoB,OAAO,GAAG,IAAI9D,KAAK0C,IAAIoB,OAAO,IAAIC;gBAC9C1B,SAASK,IAAIL,OAAO;YACtB,CAAA;IACF;IAEA;;GAEC,GACD,MAAa2B,qBAAqBC,cAAsB,EAAiB;QACvE,IAAI,CAAC,IAAI,CAACzF,EAAE,EAAE;QAEd,IAAI,CAACA,EAAE,CAACgB,OAAO,CAAC,CAAC;;;;;IAKjB,CAAC,EAAEW,GAAG,CAAC8D;IACT;IAEA;;GAEC,GACD,MAAaC,iBAAgC;QAC3C,IAAI,CAAC,IAAI,CAAC1F,EAAE,EAAE;QAEd,MAAM2F,gBAAgB,IAAI,CAACzF,MAAM,CAACC,kBAAkB,IAAI;QAExD,IAAI,CAACH,EAAE,CAACgB,OAAO,CAAC,CAAC;;;;;;IAMjB,CAAC,EAAEW,GAAG,CAACgE;IACT;IAEA;;;;GAIC,GACD,MAAaC,gBAAgBC,QAA2B,CAAC,CAAC,EAAuB;QAC/E,IAAI,CAAC,IAAI,CAAC7F,EAAE,EAAE,OAAO,EAAE;QAEvB,MAAM8F,QAAQD,MAAMC,KAAK,IAAI;QAC7B,MAAMC,UAAUF,MAAME,OAAO,IAAI;QAEjC,IAAIC,cAAc;QAClB,IAAID,YAAY,UAAUC,cAAc;QACxC,IAAID,YAAY,YAAYC,cAAc,CAAC;;;;;;;IAO3C,CAAC;QAED,IAAIC,cAAc;QAClB,MAAMzB,SAAgB,EAAE;QAExB,IAAIqB,MAAM5D,QAAQ,EAAE;YAClBgE,eAAe;YACfzB,OAAOb,IAAI,CAACkC,MAAM5D,QAAQ;QAC5B;QAEA,IAAI4D,MAAM7D,IAAI,EAAE;YACdiE,eAAe;YACfzB,OAAOb,IAAI,CAACkC,MAAM7D,IAAI;QACxB;QAEA,IAAI6D,MAAMxB,MAAM,EAAE;YAChB4B,cAAcA,YAAYC,OAAO,CAAC,wCAAwC;YAC1E1B,OAAOb,IAAI,CAACkC,MAAMxB,MAAM;QAC1B;QAEAG,OAAOb,IAAI,CAACmC;QAEZ,MAAMf,OAAO,IAAI,CAAC/E,EAAE,CAACgB,OAAO,CAAC,CAAC;;YAEtB,EAAEiF,YAAY;eACX,EAAED,YAAY;;IAEzB,CAAC,EAAEhB,GAAG,IAAIR;QAEV,OAAOO,KAAKE,GAAG,CAACf,CAAAA,MAAO,IAAI,CAACC,aAAa,CAACD;IAC5C;IAEA;;GAEC,GACD,MAAaiC,uBAAuBpE,QAA0B,EAAuB;QACnF,IAAI,CAAC,IAAI,CAAC/B,EAAE,EAAE,OAAO,EAAE;QAEvB,MAAM+E,OAAO,IAAI,CAAC/E,EAAE,CAACgB,OAAO,CAAC,CAAC;;;;IAI9B,CAAC,EAAEgE,GAAG,CAACjD;QAEP,OAAOgD,KAAKE,GAAG,CAACf,CAAAA,MAAO,IAAI,CAACC,aAAa,CAACD;IAC5C;IAEA;;GAEC,GACD,MAAakC,yBAAoE;QAC/E,IAAI,CAAC,IAAI,CAACpG,EAAE,EAAE;YACZ,OAAO;gBACL,CAACJ,iBAAiByG,eAAe,CAAC,EAAE;gBACpC,CAACzG,iBAAiBmD,kBAAkB,CAAC,EAAE;gBACvC,CAACnD,iBAAiBoD,YAAY,CAAC,EAAE;gBACjC,CAACpD,iBAAiB0G,cAAc,CAAC,EAAE;gBACnC,CAAC1G,iBAAiBqD,QAAQ,CAAC,EAAE;YAC/B;QACF;QAEA,MAAM8B,OAAO,IAAI,CAAC/E,EAAE,CAACgB,OAAO,CAAC,CAAC;;;;;IAK9B,CAAC,EAAEgE,GAAG;QAEN,MAAMuB,SAAiC,CAAC;QACxC,KAAK,MAAMrC,OAAOa,KAAM;YACtBwB,MAAM,CAACrC,IAAIjC,QAAQ,CAAC,GAAGiC,IAAI1B,KAAK;QAClC;QAEA,OAAO+D;IACT;IAEA;;;;GAIC,GACD,MAAaC,eAA2C;QACtD,IAAI,CAAC,IAAI,CAACxG,EAAE,EAAE;YACZ,OAAO;gBACLyG,YAAY;gBACZC,eAAe;gBACfC,gBAAgB;gBAChBC,wBAAwB;gBACxBC,iBAAiB;oBACf,CAAChH,iBAAiBqD,QAAQ,CAAC,EAAE;oBAC7B,CAACrD,iBAAiBsD,IAAI,CAAC,EAAE;oBACzB,CAACtD,iBAAiBuD,MAAM,CAAC,EAAE;oBAC3B,CAACvD,iBAAiBwD,GAAG,CAAC,EAAE;gBAC1B;gBACAyD,iBAAiB;oBACf,CAAClH,iBAAiByG,eAAe,CAAC,EAAE;oBACpC,CAACzG,iBAAiBmD,kBAAkB,CAAC,EAAE;oBACvC,CAACnD,iBAAiBoD,YAAY,CAAC,EAAE;oBACjC,CAACpD,iBAAiB0G,cAAc,CAAC,EAAE;oBACnC,CAAC1G,iBAAiBqD,QAAQ,CAAC,EAAE;gBAC/B;gBACA8D,aAAa;oBACX,CAACpH,aAAaqH,YAAY,CAAC,EAAE;oBAC7B,CAACrH,aAAakD,WAAW,CAAC,EAAE;oBAC5B,CAAClD,aAAamD,OAAO,CAAC,EAAE;oBACxB,CAACnD,aAAasH,eAAe,CAAC,EAAE;oBAChC,CAACtH,aAAaiD,YAAY,CAAC,EAAE;gBAC/B;gBACAsE,cAAc,EAAE;YAClB;QACF;QAEA,MAAMC,QAAQ,IAAI,CAACnH,EAAE,CAACgB,OAAO,CAAC,CAAC;;;;;;;;;;IAU/B,CAAC,EAAEC,GAAG;QAEN,MAAMwF,aAAaU,MAAMC,WAAW,IAAI;QACxC,MAAMV,gBAAgBS,MAAME,cAAc,IAAI;QAC9C,MAAMV,iBAAiBF,aAAa,IAAIC,gBAAgBD,aAAa;QAErE,OAAO;YACLA;YACAC;YACAC;YACAC,wBAAwBO,MAAMG,oBAAoB,IAAI;YACtDT,iBAAiB,MAAM,IAAI,CAACU,kBAAkB;YAC9CT,iBAAiB,MAAM,IAAI,CAACV,sBAAsB;YAClDW,aAAa,MAAM,IAAI,CAACS,cAAc;YACtCN,cAAc,AAAC,CAAA,MAAM,IAAI,CAACtB,eAAe,CAAC;gBAAEE,OAAO;YAAG,EAAC,EAAGb,GAAG,CAACwC,CAAAA,KAAO,CAAA;oBACnE7F,IAAI6F,GAAG7F,EAAE;oBACTf,WAAW4G,GAAG5G,SAAS;oBACvBmB,MAAMyF,GAAGzF,IAAI;oBACbC,UAAUwF,GAAGxF,QAAQ;oBACrBX,iBAAiBmG,GAAGnG,eAAe;oBACnCS,UAAU0F,GAAG1F,QAAQ;gBACvB,CAAA;QACF;IACF;IAEA;;GAEC,GACD,MAAcwF,qBAAgE;QAC5E,IAAI,CAAC,IAAI,CAACvH,EAAE,EAAE;YACZ,OAAO;gBACL,CAACH,iBAAiBqD,QAAQ,CAAC,EAAE;gBAC7B,CAACrD,iBAAiBsD,IAAI,CAAC,EAAE;gBACzB,CAACtD,iBAAiBuD,MAAM,CAAC,EAAE;gBAC3B,CAACvD,iBAAiBwD,GAAG,CAAC,EAAE;YAC1B;QACF;QAEA,MAAM0B,OAAO,IAAI,CAAC/E,EAAE,CAACgB,OAAO,CAAC,CAAC;;;;IAI9B,CAAC,EAAEgE,GAAG;QAEN,MAAMuB,SAAiC,CAAC;QACxC,KAAK,MAAMrC,OAAOa,KAAM;YACtBwB,MAAM,CAACrC,IAAInC,QAAQ,CAAC,GAAGmC,IAAI1B,KAAK;QAClC;QAEA,OAAO+D;IACT;IAEA;;GAEC,GACD,MAAciB,iBAAwD;QACpE,IAAI,CAAC,IAAI,CAACxH,EAAE,EAAE;YACZ,OAAO;gBACL,CAACL,aAAaqH,YAAY,CAAC,EAAE;gBAC7B,CAACrH,aAAakD,WAAW,CAAC,EAAE;gBAC5B,CAAClD,aAAamD,OAAO,CAAC,EAAE;gBACxB,CAACnD,aAAasH,eAAe,CAAC,EAAE;gBAChC,CAACtH,aAAaiD,YAAY,CAAC,EAAE;YAC/B;QACF;QAEA,MAAMmC,OAAO,IAAI,CAAC/E,EAAE,CAACgB,OAAO,CAAC,CAAC;;;;IAI9B,CAAC,EAAEgE,GAAG;QAEN,MAAMuB,SAAiC,CAAC;QACxC,KAAK,MAAMrC,OAAOa,KAAM;YACtBwB,MAAM,CAACrC,IAAIlC,IAAI,CAAC,GAAGkC,IAAI1B,KAAK;QAC9B;QAEA,OAAO+D;IACT;IAEA;;GAEC,GACD,AAAQpC,cAAcD,GAAQ,EAAY;QACxC,OAAO;YACLtC,IAAIsC,IAAItC,EAAE;YACVf,WAAWqD,IAAIrD,SAAS;YACxBmB,MAAMkC,IAAIlC,IAAI;YACdC,UAAUiC,IAAIjC,QAAQ;YACtBF,UAAUmC,IAAInC,QAAQ;YACtBK,SAASF,KAAKwF,KAAK,CAACxD,IAAI9B,OAAO;YAC/BiC,QAAQH,IAAIG,MAAM;YAClB9C,eAAe,IAAIC,KAAK0C,IAAIzC,cAAc;YAC1CC,cAAc,IAAIF,KAAK0C,IAAIyD,aAAa;YACxCrG,iBAAiB4C,IAAI/C,gBAAgB;YACrCmD,gBAAgBJ,IAAI0D,eAAe,IAAIrC;YACvCsC,YAAY3D,IAAI4D,WAAW,GAAG,IAAItG,KAAK0C,IAAI4D,WAAW,IAAIvC;YAC1DV,YAAYX,IAAIW,UAAU,IAAIU;QAChC;IACF;IAEA;;GAEC,GACD,AAAQzD,aAAqB;QAC3B,OAAO,CAAC,KAAK,EAAEN,KAAKkB,GAAG,GAAG,CAAC,EAAEqF,KAAKC,MAAM,GAAGC,QAAQ,CAAC,IAAIC,MAAM,CAAC,GAAG,IAAI;IACxE;IAEA;;GAEC,GACD,MAAaC,QAAuB;QAClC,IAAI,IAAI,CAACnI,EAAE,EAAE;YACX,IAAI,CAACA,EAAE,CAACmI,KAAK;YACb,IAAI,CAACnI,EAAE,GAAG;QACZ;IACF;AACF"}