claude-flow-novice 2.15.3 → 2.15.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (461) hide show
  1. package/.claude/cfn-extras/skills/advanced-features/cfn-agent-swap/recommend-swap.sh +59 -59
  2. package/.claude/cfn-extras/skills/analytics/cfn-improvement-recommender/recommend-improvements.sh +91 -91
  3. package/.claude/cfn-extras/skills/analytics/cfn-pattern-extraction/extract-patterns.sh +79 -79
  4. package/.claude/cfn-extras/skills/analytics/cfn-retrospective-report/generate-report.sh +100 -100
  5. package/.claude/cfn-extras/skills/analytics/cfn-telemetry/start-telemetry.sh +110 -110
  6. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/add-bullet.sh +145 -145
  7. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/log-merge.sh +67 -67
  8. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/monitor-injection-performance.sh +137 -137
  9. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/optimize-injection-pipeline.sh +168 -168
  10. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/query-reflections.sh +35 -35
  11. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/store-reflection.sh +45 -45
  12. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/track-ab-test.sh +41 -41
  13. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/update-reflection.sh +41 -41
  14. package/.claude/cfn-extras/skills/deprecated/cfn-cli-setup/validate-cli-environment.sh +191 -191
  15. package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/create-campaign.sh +231 -231
  16. package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/get-campaign-performance.sh +190 -190
  17. package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/pause-campaign.sh +142 -142
  18. package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/set-budget.sh +181 -181
  19. package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/update-bid-strategy.sh +133 -133
  20. package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/get-conversation-history.sh +121 -121
  21. package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/qualify-lead.sh +156 -156
  22. package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/schedule-demo.sh +181 -181
  23. package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/send-message.sh +137 -137
  24. package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/transfer-to-human.sh +179 -179
  25. package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/create-campaign.sh +183 -183
  26. package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/get-delivery-status.sh +139 -139
  27. package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/opt-out.sh +150 -150
  28. package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/schedule-campaign.sh +187 -187
  29. package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/send-sms.sh +181 -181
  30. package/.claude/cfn-extras/skills/ui-portal/cfn-web-portal/test-web-portal-skill.sh +50 -50
  31. package/.claude/cfn-extras/skills/ui-portal/cfn-web-portal/validate-deployment.sh +84 -84
  32. package/.claude/cfn-extras/skills/utility/cfn-environment-sanitization/sanitize-environment.sh +243 -243
  33. package/.claude/commands/cfn-loop-cli.md +16 -2
  34. package/.claude/commands/switch-api.md +31 -10
  35. package/.claude/hooks/cfn-lint-sql-injection.sh +61 -0
  36. package/.claude/hooks/cfn-post-edit-cfn-retrospective.sh +33 -2
  37. package/.claude/hooks/cfn-pre-edit-security-warning.sh +40 -0
  38. package/.claude/skills/cfn-agent-spawning/spawn-agent.sh +22 -24
  39. package/.claude/skills/cfn-docker-agent-spawning/SKILL.md +28 -4
  40. package/.claude/skills/cfn-docker-agent-spawning/spawn-agent.sh +3 -1
  41. package/.claude/skills/cfn-docker-loop-orchestration/orchestrate.sh +224 -20
  42. package/.claude/skills/cfn-loop-orchestration/helpers/gate-check.sh +550 -46
  43. package/.claude/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +277 -0
  44. package/.claude/skills/cfn-loop-orchestration/orchestrate.sh +184 -23
  45. package/.claude/skills/cfn-loop-orchestration/security_utils.sh +24 -0
  46. package/.claude/skills/cfn-loop-orchestration/test-iteration-context-injection.sh +366 -0
  47. package/.claude/skills/cfn-redis-coordination/CENTRALIZED_REDIS_WRAPPER.md +319 -0
  48. package/.claude/skills/cfn-redis-coordination/agent-log.sh +4 -0
  49. package/.claude/skills/cfn-redis-coordination/agent-log.sh.bak +124 -0
  50. package/.claude/skills/cfn-redis-coordination/agent-recovery.sh +2 -2
  51. package/.claude/skills/cfn-redis-coordination/collect-confidence-scores.sh +30 -0
  52. package/.claude/skills/cfn-redis-coordination/get-context.sh +33 -0
  53. package/.claude/skills/cfn-redis-coordination/get-success-criteria.sh +54 -0
  54. package/.claude/skills/cfn-redis-coordination/invoke-waiting-mode.sh +3 -0
  55. package/.claude/skills/cfn-redis-coordination/redis-cli-wrapper.sh +24 -3
  56. package/.claude/skills/cfn-redis-coordination/redis-functions.sh +33 -0
  57. package/.claude/skills/cfn-redis-coordination/report-completion.sh +24 -31
  58. package/.claude/skills/cfn-redis-coordination/store-context.sh +4 -0
  59. package/.claude/skills/cfn-redis-coordination/store-success-criteria.sh +85 -0
  60. package/.claude/skills/cfn-redis-coordination/update-all-scripts.sh +67 -0
  61. package/.claude/skills/cfn-sqlite-memory/ttl-cleanup.sh +17 -25
  62. package/.claude/skills/cfn-transparency-middleware/test-e2e.sh +15 -0
  63. package/.claude/skills/cfn-transparency-middleware/tests/input-validation.sh +15 -0
  64. package/README.md +116 -475
  65. package/claude-assets/agents/cfn-dev-team/README.md +103 -0
  66. package/claude-assets/agents/cfn-dev-team/architecture/goal-planner.md +1 -1
  67. package/claude-assets/agents/cfn-dev-team/coordinators/cfn-frontend-coordinator.md +77 -15
  68. package/claude-assets/agents/cfn-dev-team/coordinators/cfn-v3-coordinator.md +355 -6
  69. package/claude-assets/agents/cfn-dev-team/coordinators/consensus-builder.md +82 -1
  70. package/claude-assets/agents/cfn-dev-team/coordinators/handoff-coordinator.md +82 -1
  71. package/claude-assets/agents/cfn-dev-team/coordinators/multi-sprint-coordinator.md +77 -15
  72. package/claude-assets/agents/cfn-dev-team/dev-ops/docker-specialist.md +99 -12
  73. package/claude-assets/agents/cfn-dev-team/dev-ops/github-commit-agent.md +1 -1
  74. package/claude-assets/agents/cfn-dev-team/dev-ops/kubernetes-specialist.md +97 -0
  75. package/claude-assets/agents/cfn-dev-team/dev-ops/monitoring-specialist.md +20 -1
  76. package/claude-assets/agents/cfn-dev-team/developers/api-gateway-specialist.md +97 -0
  77. package/claude-assets/agents/cfn-dev-team/developers/backend-developer.md +110 -13
  78. package/claude-assets/agents/cfn-dev-team/developers/data/data-engineer.md +106 -15
  79. package/claude-assets/agents/cfn-dev-team/developers/database/database-architect.md +115 -11
  80. package/claude-assets/agents/cfn-dev-team/developers/frontend/mobile-dev.md +94 -7
  81. package/claude-assets/agents/cfn-dev-team/developers/frontend/react-frontend-engineer.md +87 -9
  82. package/claude-assets/agents/cfn-dev-team/developers/frontend/typescript-specialist.md +85 -7
  83. package/claude-assets/agents/cfn-dev-team/developers/frontend/ui-designer.md +160 -28
  84. package/claude-assets/agents/cfn-dev-team/developers/graphql-specialist.md +101 -19
  85. package/claude-assets/agents/cfn-dev-team/developers/rust-developer.md +108 -14
  86. package/claude-assets/agents/cfn-dev-team/reviewers/{reviewer.md → code-reviewer.md} +95 -8
  87. package/claude-assets/agents/cfn-dev-team/reviewers/quality/code-quality-validator.md +107 -7
  88. package/claude-assets/agents/cfn-dev-team/reviewers/quality/perf-analyzer.md +98 -7
  89. package/claude-assets/agents/cfn-dev-team/reviewers/quality/performance-benchmarker.md +95 -7
  90. package/claude-assets/agents/cfn-dev-team/reviewers/quality/security-specialist.md +136 -9
  91. package/claude-assets/agents/cfn-dev-team/testers/api-testing-specialist.md +108 -1
  92. package/claude-assets/agents/cfn-dev-team/testers/chaos-engineering-specialist.md +107 -13
  93. package/claude-assets/agents/cfn-dev-team/testers/contract-tester.md +737 -0
  94. package/claude-assets/agents/cfn-dev-team/testers/e2e/playwright-tester.md +1 -1
  95. package/claude-assets/agents/cfn-dev-team/testers/integration-tester.md +828 -0
  96. package/claude-assets/agents/cfn-dev-team/testers/interaction-tester.md +106 -7
  97. package/claude-assets/agents/cfn-dev-team/testers/load-testing-specialist.md +77 -0
  98. package/claude-assets/agents/cfn-dev-team/testers/mutation-testing-specialist.md +684 -0
  99. package/claude-assets/agents/cfn-dev-team/testers/playwright-tester.md +110 -1
  100. package/claude-assets/agents/cfn-dev-team/testers/tester.md +94 -7
  101. package/claude-assets/agents/cfn-dev-team/utility/code-booster.md +1 -3
  102. package/claude-assets/agents/cfn-dev-team/utility/epic-creator.md +87 -13
  103. package/claude-assets/agents/cfn-dev-team/utility/memory-leak-specialist.md +103 -7
  104. package/claude-assets/agents/cfn-dev-team/utility/researcher.md +1 -3
  105. package/claude-assets/agents/cfn-dev-team/utility/z-ai-specialist.md +94 -7
  106. package/claude-assets/agents/docker-coordinators/cfn-docker-v3-coordinator.md +46 -0
  107. package/claude-assets/agents/project-only-agents/npm-package-specialist.md +1 -1
  108. package/claude-assets/cfn-extras/skills/advanced-features/cfn-agent-swap/recommend-swap.sh +59 -59
  109. package/claude-assets/cfn-extras/skills/analytics/cfn-improvement-recommender/recommend-improvements.sh +91 -91
  110. package/claude-assets/cfn-extras/skills/analytics/cfn-pattern-extraction/extract-patterns.sh +79 -79
  111. package/claude-assets/cfn-extras/skills/analytics/cfn-retrospective-report/generate-report.sh +100 -100
  112. package/claude-assets/cfn-extras/skills/analytics/cfn-telemetry/start-telemetry.sh +110 -110
  113. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/add-bullet.sh +145 -145
  114. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/log-merge.sh +67 -67
  115. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/monitor-injection-performance.sh +137 -137
  116. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/optimize-injection-pipeline.sh +168 -168
  117. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/query-reflections.sh +35 -35
  118. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/store-reflection.sh +45 -45
  119. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/track-ab-test.sh +41 -41
  120. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/update-reflection.sh +41 -41
  121. package/claude-assets/cfn-extras/skills/deprecated/cfn-cli-setup/validate-cli-environment.sh +191 -191
  122. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/create-campaign.sh +231 -231
  123. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/get-campaign-performance.sh +190 -190
  124. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/pause-campaign.sh +142 -142
  125. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/set-budget.sh +181 -181
  126. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/update-bid-strategy.sh +133 -133
  127. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/get-conversation-history.sh +121 -121
  128. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/qualify-lead.sh +156 -156
  129. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/schedule-demo.sh +181 -181
  130. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/send-message.sh +137 -137
  131. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/transfer-to-human.sh +179 -179
  132. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/create-campaign.sh +183 -183
  133. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/get-delivery-status.sh +139 -139
  134. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/opt-out.sh +150 -150
  135. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/schedule-campaign.sh +187 -187
  136. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/send-sms.sh +181 -181
  137. package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/test-web-portal-skill.sh +50 -50
  138. package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/validate-deployment.sh +84 -84
  139. package/claude-assets/cfn-extras/skills/utility/cfn-environment-sanitization/sanitize-environment.sh +243 -243
  140. package/claude-assets/commands/cfn-loop-cli.md +16 -2
  141. package/claude-assets/commands/switch-api.md +31 -10
  142. package/claude-assets/hooks/cfn-lint-sql-injection.sh +61 -0
  143. package/claude-assets/hooks/cfn-post-edit-cfn-retrospective.sh +33 -2
  144. package/claude-assets/hooks/cfn-pre-edit-security-warning.sh +40 -0
  145. package/claude-assets/hooks/detect-hardcoded-credentials.sh +212 -0
  146. package/claude-assets/skills/SKILL_TEMPLATE.md +774 -0
  147. package/claude-assets/skills/agent-lifecycle/execute-lifecycle-hook.sh +84 -113
  148. package/claude-assets/skills/agent-lifecycle/simple-audit.sh +33 -6
  149. package/claude-assets/skills/agent-template-generator/SKILL.md +440 -0
  150. package/claude-assets/skills/agent-template-generator/generate-agent.sh +405 -0
  151. package/claude-assets/skills/agent-validation-linter/SKILL.md +589 -0
  152. package/claude-assets/skills/agent-validation-linter/lint-agents.sh +271 -0
  153. package/claude-assets/skills/bootstrap/bash-fundamentals.md +786 -0
  154. package/claude-assets/skills/bootstrap/database-connection.md +464 -0
  155. package/claude-assets/skills/bootstrap/error-handling.md +580 -0
  156. package/claude-assets/skills/bootstrap/file-operations.md +699 -0
  157. package/claude-assets/skills/bootstrap/skill-loader.md +616 -0
  158. package/claude-assets/skills/bootstrap/sqlite-params.sh +287 -0
  159. package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh +22 -24
  160. package/claude-assets/skills/cfn-automatic-memory-persistence/test-memory-persistence.sh +17 -16
  161. package/claude-assets/skills/cfn-deployment/SKILL.md +293 -0
  162. package/claude-assets/skills/cfn-deployment/execute.sh +21 -0
  163. package/claude-assets/skills/cfn-docker-agent-spawning/SKILL.md +28 -4
  164. package/claude-assets/skills/cfn-docker-agent-spawning/spawn-agent.sh +3 -1
  165. package/claude-assets/skills/cfn-docker-loop-orchestration/orchestrate.sh +224 -20
  166. package/claude-assets/skills/cfn-environment-sanitization/sanitize-environment.sh +38 -0
  167. package/claude-assets/skills/cfn-error-batching-strategy/lib/core-functions.sh +47 -47
  168. package/claude-assets/skills/cfn-file-operations/SKILL.md +290 -0
  169. package/claude-assets/skills/cfn-file-operations/execute.sh +129 -0
  170. package/claude-assets/skills/cfn-file-operations/lib/atomic-write.sh +294 -0
  171. package/claude-assets/skills/cfn-file-operations/lib/lock.sh +361 -0
  172. package/claude-assets/skills/cfn-file-operations/test.sh +369 -0
  173. package/claude-assets/skills/cfn-log-operations/SKILL.md +308 -0
  174. package/claude-assets/skills/cfn-log-operations/execute.sh +420 -0
  175. package/claude-assets/skills/cfn-log-operations/lib/rotate.sh +406 -0
  176. package/claude-assets/skills/cfn-log-operations/lib/search.sh +448 -0
  177. package/claude-assets/skills/cfn-log-operations/test.sh +394 -0
  178. package/claude-assets/skills/cfn-loop-orchestration/helpers/gate-check.sh +550 -46
  179. package/claude-assets/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +277 -0
  180. package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh +184 -23
  181. package/claude-assets/skills/cfn-loop-orchestration/security_utils.sh +24 -0
  182. package/claude-assets/skills/cfn-loop-orchestration/test-iteration-context-injection.sh +366 -0
  183. package/claude-assets/skills/cfn-parameterized-queries/SKILL.md +339 -0
  184. package/claude-assets/skills/cfn-playbook/query-playbook.sh +19 -15
  185. package/claude-assets/skills/cfn-playbook/update-playbook.sh +25 -14
  186. package/claude-assets/skills/cfn-process-instrumentation/instrument-process.sh +44 -0
  187. package/claude-assets/skills/cfn-promotion/SKILL.md +305 -0
  188. package/claude-assets/skills/cfn-redis-coordination/CENTRALIZED_REDIS_WRAPPER.md +319 -0
  189. package/claude-assets/skills/cfn-redis-coordination/agent-log.sh +4 -0
  190. package/claude-assets/skills/cfn-redis-coordination/agent-log.sh.bak +124 -0
  191. package/claude-assets/skills/cfn-redis-coordination/agent-recovery.sh +2 -2
  192. package/claude-assets/skills/cfn-redis-coordination/collect-confidence-scores.sh +30 -0
  193. package/claude-assets/skills/cfn-redis-coordination/get-context.sh +33 -0
  194. package/claude-assets/skills/cfn-redis-coordination/get-success-criteria.sh +54 -0
  195. package/claude-assets/skills/cfn-redis-coordination/invoke-waiting-mode.sh +3 -0
  196. package/claude-assets/skills/cfn-redis-coordination/redis-cli-wrapper.sh +24 -3
  197. package/claude-assets/skills/cfn-redis-coordination/redis-functions.sh +33 -0
  198. package/claude-assets/skills/cfn-redis-coordination/report-completion.sh +24 -31
  199. package/claude-assets/skills/cfn-redis-coordination/store-context.sh +4 -0
  200. package/claude-assets/skills/cfn-redis-coordination/store-success-criteria.sh +85 -0
  201. package/claude-assets/skills/cfn-redis-coordination/update-all-scripts.sh +67 -0
  202. package/claude-assets/skills/cfn-skill-loader/SKILL.md +466 -0
  203. package/claude-assets/skills/cfn-skill-loader/execute.sh +344 -0
  204. package/claude-assets/skills/cfn-sqlite-memory/ttl-cleanup.sh +17 -25
  205. package/claude-assets/skills/cfn-task-audit/get-audit-data.sh +42 -21
  206. package/claude-assets/skills/cfn-task-audit/store-task-audit.sh +17 -10
  207. package/claude-assets/skills/cfn-test-runner/detect-regressions.sh +17 -14
  208. package/claude-assets/skills/cfn-test-runner/detect-regressions.sh.backup-1763392821 +55 -0
  209. package/claude-assets/skills/cfn-test-runner/store-benchmarks.sh +17 -19
  210. package/claude-assets/skills/cfn-transparency-middleware/test-e2e.sh +15 -0
  211. package/claude-assets/skills/cfn-transparency-middleware/tests/input-validation.sh +15 -0
  212. package/claude-assets/skills/cfn-utilities/SKILL.md +237 -0
  213. package/claude-assets/skills/cfn-utilities/execute.sh +32 -0
  214. package/claude-assets/skills/cfn-utilities/lib/errors.sh +56 -0
  215. package/claude-assets/skills/cfn-utilities/lib/file-ops.sh +164 -0
  216. package/claude-assets/skills/cfn-utilities/lib/logging.sh +77 -0
  217. package/claude-assets/skills/cfn-utilities/lib/retry.sh +127 -0
  218. package/claude-assets/skills/cfn-utilities/test.sh +317 -0
  219. package/claude-assets/skills/integration/agent-handoff.sh +62 -64
  220. package/claude-assets/skills/json-validation/SKILL.md +431 -0
  221. package/claude-assets/skills/json-validation/test-validate-success-criteria.sh +421 -0
  222. package/claude-assets/skills/json-validation/validate-success-criteria.sh +197 -0
  223. package/claude-assets/skills/redis-coordination/validate-parameters.sh +34 -0
  224. package/claude-assets/skills/workflow-codification/DEPLOY_QUICK_REFERENCE.md +106 -0
  225. package/claude-assets/skills/workflow-codification/PROPAGATE_UPDATE_QUICK_REFERENCE.md +366 -0
  226. package/claude-assets/skills/workflow-codification/deploy-approved-skill.sh +481 -0
  227. package/claude-assets/skills/workflow-codification/deploy-approved-skill.sh.backup-1763392820 +512 -0
  228. package/claude-assets/skills/workflow-codification/lib/security-utils.sh +204 -0
  229. package/claude-assets/skills/workflow-codification/propagate-skill-update.sh +648 -0
  230. package/claude-assets/skills/workflow-codification/propagate-skill-update.sh.backup-1763392820 +664 -0
  231. package/claude-assets/skills/workflow-codification/test-integration.sh +15 -0
  232. package/claude-assets/skills/workflow-codification/test-metadata-update.sh +350 -0
  233. package/claude-assets/skills/workflow-codification/track-cost-savings.sh +55 -14
  234. package/claude-assets/skills/workflow-codification/track-cost-savings.sh.backup-1763392821 +445 -0
  235. package/claude-assets/skills/workflow-codification/track-edge-case.sh +27 -60
  236. package/claude-assets/skills/workflow-codification/workflow-codification.db +0 -0
  237. package/dist/ace/ace-curator.js +10 -2
  238. package/dist/ace/ace-curator.js.map +1 -1
  239. package/dist/ace/ace-generator.js +4 -0
  240. package/dist/ace/ace-generator.js.map +1 -1
  241. package/dist/ace/ace-reflector.js +1 -1
  242. package/dist/ace/ace-reflector.js.map +1 -1
  243. package/dist/ace/context-injection.js +24 -2
  244. package/dist/ace/context-injection.js.map +1 -1
  245. package/dist/agents/agent-loader.js +146 -165
  246. package/dist/agents/agent-loader.js.map +1 -1
  247. package/dist/agents/task-agent-integration.js +1 -1
  248. package/dist/agents/task-agent-integration.js.map +1 -1
  249. package/dist/api/health-endpoints.js +390 -0
  250. package/dist/api/health-endpoints.js.map +1 -0
  251. package/dist/cli/agent-executor.js +4 -1
  252. package/dist/cli/agent-executor.js.map +1 -1
  253. package/dist/cli/agent-prompt-builder.js +89 -1
  254. package/dist/cli/agent-prompt-builder.js.map +1 -1
  255. package/dist/cli/agent-spawn.js +130 -37
  256. package/dist/cli/agent-spawn.js.map +1 -1
  257. package/dist/cli/skill-cache-validator.js +412 -0
  258. package/dist/cli/skill-cache-validator.js.map +1 -0
  259. package/dist/cli/skill-cli.js +991 -0
  260. package/dist/cli/skill-cli.js.map +1 -0
  261. package/dist/cli/skill-execution-logger.js +284 -0
  262. package/dist/cli/skill-execution-logger.js.map +1 -0
  263. package/dist/cli/skill-loader.js +457 -0
  264. package/dist/cli/skill-loader.js.map +1 -0
  265. package/dist/coordination/event-bus.js +2 -2
  266. package/dist/coordination/event-bus.js.map +1 -1
  267. package/dist/coordination/fleet-manager.js +1 -1
  268. package/dist/coordination/fleet-manager.js.map +1 -1
  269. package/dist/coordination/index.js +23 -9
  270. package/dist/coordination/index.js.map +1 -1
  271. package/dist/coordination/types/fleet-manager.types.js.map +1 -1
  272. package/dist/db/migration-manager.js +483 -0
  273. package/dist/db/migration-manager.js.map +1 -0
  274. package/dist/db/skills-query.js +535 -0
  275. package/dist/db/skills-query.js.map +1 -0
  276. package/dist/integration/DatabaseHandoff.js +1 -1
  277. package/dist/integration/DatabaseHandoff.js.map +1 -1
  278. package/dist/jobs/edge-case-analyzer.js +367 -0
  279. package/dist/jobs/edge-case-analyzer.js.map +1 -0
  280. package/dist/jobs/promotion-sla-enforcer.js +288 -0
  281. package/dist/jobs/promotion-sla-enforcer.js.map +1 -0
  282. package/dist/lib/agent-output-parser.js.map +1 -1
  283. package/dist/lib/agent-output-validator.js.map +1 -1
  284. package/dist/lib/agent-workspace.js +281 -0
  285. package/dist/lib/agent-workspace.js.map +1 -0
  286. package/dist/lib/atomic-file-writer.js +377 -0
  287. package/dist/lib/atomic-file-writer.js.map +1 -0
  288. package/dist/lib/backup-manager.js +779 -0
  289. package/dist/lib/backup-manager.js.map +1 -0
  290. package/dist/lib/checkpoint-manager.js +837 -0
  291. package/dist/lib/checkpoint-manager.js.map +1 -0
  292. package/dist/lib/circuit-breaker.js +340 -0
  293. package/dist/lib/circuit-breaker.js.map +1 -0
  294. package/dist/lib/completion-signal-handler.js +243 -0
  295. package/dist/lib/completion-signal-handler.js.map +1 -0
  296. package/dist/lib/config-manager.js +312 -0
  297. package/dist/lib/config-manager.js.map +1 -0
  298. package/dist/lib/config-migrator.js +386 -0
  299. package/dist/lib/config-migrator.js.map +1 -0
  300. package/dist/lib/config-validator.js.map +1 -1
  301. package/dist/lib/correlation-cache.js +311 -0
  302. package/dist/lib/correlation-cache.js.map +1 -0
  303. package/dist/lib/correlation.js +263 -0
  304. package/dist/lib/correlation.js.map +1 -0
  305. package/dist/lib/database-service/connection-pool-manager.js +520 -0
  306. package/dist/lib/database-service/connection-pool-manager.js.map +1 -0
  307. package/dist/lib/database-service/correlation.js +329 -0
  308. package/dist/lib/database-service/correlation.js.map +1 -0
  309. package/dist/lib/database-service/errors.js +120 -0
  310. package/dist/lib/database-service/errors.js.map +1 -0
  311. package/dist/lib/database-service/index.js +168 -0
  312. package/dist/lib/database-service/index.js.map +1 -0
  313. package/dist/lib/database-service/postgres-adapter.js +526 -0
  314. package/dist/lib/database-service/postgres-adapter.js.map +1 -0
  315. package/dist/lib/database-service/redis-adapter.js +360 -0
  316. package/dist/lib/database-service/redis-adapter.js.map +1 -0
  317. package/dist/lib/database-service/sqlite-adapter.js +544 -0
  318. package/dist/lib/database-service/sqlite-adapter.js.map +1 -0
  319. package/dist/lib/database-service/transaction-manager.js +773 -0
  320. package/dist/lib/database-service/transaction-manager.js.map +1 -0
  321. package/dist/lib/database-service/types.js +23 -0
  322. package/dist/lib/database-service/types.js.map +1 -0
  323. package/dist/lib/deadlock-resolver.js +292 -0
  324. package/dist/lib/deadlock-resolver.js.map +1 -0
  325. package/dist/lib/distributed-lock.js +451 -0
  326. package/dist/lib/distributed-lock.js.map +1 -0
  327. package/dist/lib/edge-case-deduplicator.js +227 -0
  328. package/dist/lib/edge-case-deduplicator.js.map +1 -0
  329. package/dist/lib/encryption-manager.js +322 -0
  330. package/dist/lib/encryption-manager.js.map +1 -0
  331. package/dist/lib/error-aggregator.js +234 -0
  332. package/dist/lib/error-aggregator.js.map +1 -0
  333. package/dist/lib/errors.js +287 -0
  334. package/dist/lib/errors.js.map +1 -0
  335. package/dist/lib/file-lock-manager.js +578 -0
  336. package/dist/lib/file-lock-manager.js.map +1 -0
  337. package/dist/lib/file-operations.js +367 -0
  338. package/dist/lib/file-operations.js.map +1 -0
  339. package/dist/lib/idempotent-write.js +237 -0
  340. package/dist/lib/idempotent-write.js.map +1 -0
  341. package/dist/lib/integration-schema-validator.js +522 -0
  342. package/dist/lib/integration-schema-validator.js.map +1 -0
  343. package/dist/lib/lock-health-monitor.js +298 -0
  344. package/dist/lib/lock-health-monitor.js.map +1 -0
  345. package/dist/lib/log-shipper.js +422 -0
  346. package/dist/lib/log-shipper.js.map +1 -0
  347. package/dist/lib/logging.js +146 -0
  348. package/dist/lib/logging.js.map +1 -0
  349. package/dist/lib/message-deduplicator.js +439 -0
  350. package/dist/lib/message-deduplicator.js.map +1 -0
  351. package/dist/lib/multi-system-query.js +604 -0
  352. package/dist/lib/multi-system-query.js.map +1 -0
  353. package/dist/lib/orphan-detector.js +332 -0
  354. package/dist/lib/orphan-detector.js.map +1 -0
  355. package/dist/lib/password-generator.js +166 -0
  356. package/dist/lib/password-generator.js.map +1 -0
  357. package/dist/lib/path-validator.js +429 -0
  358. package/dist/lib/path-validator.js.map +1 -0
  359. package/dist/lib/query-translator.js +905 -0
  360. package/dist/lib/query-translator.js.map +1 -0
  361. package/dist/lib/queue-recovery.js +469 -0
  362. package/dist/lib/queue-recovery.js.map +1 -0
  363. package/dist/lib/redis-queue-manager.js +512 -0
  364. package/dist/lib/redis-queue-manager.js.map +1 -0
  365. package/dist/lib/reflection-archiver.js +272 -0
  366. package/dist/lib/reflection-archiver.js.map +1 -0
  367. package/dist/lib/retry-manager.js +453 -0
  368. package/dist/lib/retry-manager.js.map +1 -0
  369. package/dist/lib/retry.js +262 -0
  370. package/dist/lib/retry.js.map +1 -0
  371. package/dist/lib/schema-transform.js +695 -0
  372. package/dist/lib/schema-transform.js.map +1 -0
  373. package/dist/lib/schema-validator.js +491 -0
  374. package/dist/lib/schema-validator.js.map +1 -0
  375. package/dist/lib/skill-cache.js +297 -0
  376. package/dist/lib/skill-cache.js.map +1 -0
  377. package/dist/lib/skill-content-manager.js +337 -0
  378. package/dist/lib/skill-content-manager.js.map +1 -0
  379. package/dist/lib/skill-frontmatter-parser.js +237 -0
  380. package/dist/lib/skill-frontmatter-parser.js.map +1 -0
  381. package/dist/lib/skill-git-integration.js +275 -0
  382. package/dist/lib/skill-git-integration.js.map +1 -0
  383. package/dist/lib/skill-markdown-validator.js +396 -0
  384. package/dist/lib/skill-markdown-validator.js.map +1 -0
  385. package/dist/lib/skill-output-parser.js +312 -0
  386. package/dist/lib/skill-output-parser.js.map +1 -0
  387. package/dist/lib/unified-query-api.js +467 -0
  388. package/dist/lib/unified-query-api.js.map +1 -0
  389. package/dist/middleware/auth-middleware.js +350 -0
  390. package/dist/middleware/auth-middleware.js.map +1 -0
  391. package/dist/middleware/schema-validation.js +347 -0
  392. package/dist/middleware/schema-validation.js.map +1 -0
  393. package/dist/providers/anthropic-provider.js +1 -1
  394. package/dist/providers/anthropic-provider.js.map +1 -1
  395. package/dist/providers/provider-factory.js +2 -2
  396. package/dist/providers/provider-factory.js.map +1 -1
  397. package/dist/services/edge-case-analyzer.js +321 -0
  398. package/dist/services/edge-case-analyzer.js.map +1 -0
  399. package/dist/services/edge-case-deduplicator.js +266 -0
  400. package/dist/services/edge-case-deduplicator.js.map +1 -0
  401. package/dist/services/edge-case-detector.js +337 -0
  402. package/dist/services/edge-case-detector.js.map +1 -0
  403. package/dist/services/edge-case-tracker.js +547 -0
  404. package/dist/services/edge-case-tracker.js.map +1 -0
  405. package/dist/services/health-check-system.js +586 -0
  406. package/dist/services/health-check-system.js.map +1 -0
  407. package/dist/services/metrics-logger.js +412 -0
  408. package/dist/services/metrics-logger.js.map +1 -0
  409. package/dist/services/patch-generator.js +378 -0
  410. package/dist/services/patch-generator.js.map +1 -0
  411. package/dist/services/patch-validator.js +337 -0
  412. package/dist/services/patch-validator.js.map +1 -0
  413. package/dist/services/performance-monitor.js +811 -0
  414. package/dist/services/performance-monitor.js.map +1 -0
  415. package/dist/services/promotion-pipeline.js +918 -0
  416. package/dist/services/promotion-pipeline.js.map +1 -0
  417. package/dist/services/promotion-validator.js +394 -0
  418. package/dist/services/promotion-validator.js.map +1 -0
  419. package/dist/services/reflection-logger.js +388 -0
  420. package/dist/services/reflection-logger.js.map +1 -0
  421. package/dist/services/skill-deployment.js +472 -0
  422. package/dist/services/skill-deployment.js.map +1 -0
  423. package/dist/services/skill-loader.js +427 -0
  424. package/dist/services/skill-loader.js.map +1 -0
  425. package/dist/services/skill-promotion.js +372 -0
  426. package/dist/services/skill-promotion.js.map +1 -0
  427. package/dist/services/skill-validator.js +454 -0
  428. package/dist/services/skill-validator.js.map +1 -0
  429. package/dist/services/skill-versioning.js +244 -0
  430. package/dist/services/skill-versioning.js.map +1 -0
  431. package/dist/services/workspace-supervisor.js +597 -0
  432. package/dist/services/workspace-supervisor.js.map +1 -0
  433. package/dist/types/edge-case.js +45 -0
  434. package/dist/types/edge-case.js.map +1 -0
  435. package/package.json +201 -177
  436. package/readme/README.md +19 -4
  437. package/scripts/backup-cleanup.sh +627 -0
  438. package/scripts/cleanup-workspaces.sh +412 -0
  439. package/scripts/cleanup-yaml-configs.sh +141 -0
  440. package/scripts/deploy-approved-skills.sh +263 -0
  441. package/scripts/health-check.sh +447 -0
  442. package/scripts/log-aggregator.sh +554 -0
  443. package/scripts/log-monitor.sh +629 -0
  444. package/scripts/manage-agent-workspaces.sh +434 -0
  445. package/scripts/migrate-schema.sh +533 -0
  446. package/scripts/promote-staged-skills.sh +423 -0
  447. package/scripts/verify-no-secrets.sh +88 -35
  448. package/.claude/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +0 -161
  449. package/.claude/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +0 -728
  450. package/.claude/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +0 -131
  451. package/.claude/skills/agent-lifecycle/SKILL.md +0 -60
  452. package/.claude/skills/agent-lifecycle/execute-lifecycle-hook.sh +0 -573
  453. package/.claude/skills/agent-lifecycle/simple-audit.sh +0 -31
  454. package/.claude/skills/cfn-agent-spawning/spawn-agent.sh.backup +0 -273
  455. package/.claude/skills/cfn-loop-orchestration/orchestrate.sh.backup +0 -949
  456. package/README.md.backup_before_replace +0 -781
  457. package/claude-assets/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +0 -161
  458. package/claude-assets/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +0 -728
  459. package/claude-assets/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +0 -131
  460. package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh.backup +0 -273
  461. package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh.backup +0 -949
@@ -0,0 +1,234 @@
1
+ /**
2
+ * Error Aggregation System
3
+ *
4
+ * Provides error aggregation, correlation tracking, and circuit breaker patterns
5
+ * for multi-database operations.
6
+ *
7
+ * Features:
8
+ * - Aggregates errors from multiple database systems
9
+ * - Tracks error correlation across operations
10
+ * - Implements circuit breaker for repeated failures
11
+ * - Provides error analysis and reporting
12
+ *
13
+ * Part of: Critical Error Handling Fixes (Architecture Review)
14
+ */ import { DatabaseErrorCode } from './database-service/types.js';
15
+ import { createLogger } from './logging.js';
16
+ import { v4 as uuidv4 } from 'uuid';
17
+ import { CircuitBreakerState, CircuitBreakerConfig, CircuitBreakerRegistry } from './circuit-breaker.js';
18
+ // Re-export circuit breaker types for backward compatibility
19
+ export { CircuitBreakerState, CircuitBreakerConfig };
20
+ /**
21
+ * Error severity levels
22
+ */ export var ErrorSeverity = /*#__PURE__*/ function(ErrorSeverity) {
23
+ ErrorSeverity["LOW"] = "low";
24
+ ErrorSeverity["MEDIUM"] = "medium";
25
+ ErrorSeverity["HIGH"] = "high";
26
+ ErrorSeverity["CRITICAL"] = "critical";
27
+ return ErrorSeverity;
28
+ }({});
29
+ // Circuit breaker types now imported from ./circuit-breaker module
30
+ /**
31
+ * Error aggregator class
32
+ */ export class ErrorAggregator {
33
+ logger;
34
+ errors = [];
35
+ correlationId;
36
+ circuitBreakerConfig;
37
+ constructor(correlationId, circuitBreakerConfig){
38
+ this.correlationId = correlationId || uuidv4();
39
+ this.logger = createLogger('error-aggregator');
40
+ // Store circuit breaker configuration for registry
41
+ this.circuitBreakerConfig = {
42
+ failureThreshold: circuitBreakerConfig?.failureThreshold ?? 5,
43
+ successThreshold: circuitBreakerConfig?.successThreshold ?? 2,
44
+ timeout: circuitBreakerConfig?.timeout ?? 60000,
45
+ windowSize: circuitBreakerConfig?.windowSize ?? 120000
46
+ };
47
+ }
48
+ /**
49
+ * Add error to aggregation
50
+ */ addError(system, error, operationContext) {
51
+ const aggregatedError = {
52
+ correlationId: uuidv4(),
53
+ timestamp: new Date(),
54
+ system,
55
+ error,
56
+ severity: this.determineSeverity(error),
57
+ operationContext,
58
+ stackTrace: error.originalError?.stack
59
+ };
60
+ this.errors.push(aggregatedError);
61
+ // Update circuit breaker
62
+ this.recordFailure(system);
63
+ // Log error with correlation ID
64
+ this.logger.error('Database operation failed', error.originalError, {
65
+ correlationId: this.correlationId,
66
+ errorCorrelationId: aggregatedError.correlationId,
67
+ system,
68
+ errorCode: error.code,
69
+ message: error.message,
70
+ severity: aggregatedError.severity
71
+ });
72
+ return aggregatedError;
73
+ }
74
+ /**
75
+ * Record successful operation (for circuit breaker)
76
+ */ recordSuccess(system) {
77
+ // Use circuit breaker registry - success is tracked automatically via execute()
78
+ // This method is kept for backward compatibility but delegates to registry
79
+ const breaker = CircuitBreakerRegistry.getOrCreate(system, this.circuitBreakerConfig);
80
+ // Success tracking is handled internally by CircuitBreaker.execute()
81
+ // This is just a manual success recording for compatibility
82
+ this.logger.debug('Manual success recorded', {
83
+ system,
84
+ correlationId: this.correlationId
85
+ });
86
+ }
87
+ /**
88
+ * Record failed operation (for circuit breaker)
89
+ */ recordFailure(system) {
90
+ // Failure tracking is handled by the circuit breaker registry
91
+ // This is called when addError is invoked
92
+ const breaker = CircuitBreakerRegistry.getOrCreate(system, this.circuitBreakerConfig);
93
+ this.logger.debug('Failure recorded via error aggregation', {
94
+ system,
95
+ state: breaker.getState(),
96
+ correlationId: this.correlationId
97
+ });
98
+ }
99
+ /**
100
+ * Check if circuit breaker allows operation
101
+ */ isCircuitOpen(system) {
102
+ const breaker = CircuitBreakerRegistry.get(system);
103
+ return breaker ? !breaker.isHealthy() : false;
104
+ }
105
+ /**
106
+ * Get aggregation result
107
+ */ getResult(expectedSystems) {
108
+ const errorsBySystem = {};
109
+ const errorsBySeverity = {
110
+ ["low"]: [],
111
+ ["medium"]: [],
112
+ ["high"]: [],
113
+ ["critical"]: []
114
+ };
115
+ // Group errors
116
+ for (const error of this.errors){
117
+ // By system
118
+ if (!errorsBySystem[error.system]) {
119
+ errorsBySystem[error.system] = [];
120
+ }
121
+ errorsBySystem[error.system].push(error);
122
+ // By severity
123
+ errorsBySeverity[error.severity].push(error);
124
+ }
125
+ // Check if all systems failed
126
+ const failedSystems = Object.keys(errorsBySystem);
127
+ const allSystemsFailed = expectedSystems.every((system)=>failedSystems.includes(system));
128
+ // Check for critical errors
129
+ const hasCriticalErrors = errorsBySeverity["critical"].length > 0;
130
+ return {
131
+ totalErrors: this.errors.length,
132
+ errorsBySystem,
133
+ errorsBySeverity,
134
+ allErrors: [
135
+ ...this.errors
136
+ ],
137
+ correlationId: this.correlationId,
138
+ allSystemsFailed,
139
+ hasCriticalErrors
140
+ };
141
+ }
142
+ /**
143
+ * Determine error severity
144
+ */ determineSeverity(error) {
145
+ switch(error.code){
146
+ case DatabaseErrorCode.CONNECTION_FAILED:
147
+ case DatabaseErrorCode.TRANSACTION_FAILED:
148
+ return "critical";
149
+ case DatabaseErrorCode.QUERY_FAILED:
150
+ case DatabaseErrorCode.TIMEOUT:
151
+ return "high";
152
+ case DatabaseErrorCode.VALIDATION_FAILED:
153
+ case DatabaseErrorCode.CONSTRAINT_VIOLATION:
154
+ return "medium";
155
+ case DatabaseErrorCode.NOT_FOUND:
156
+ case DatabaseErrorCode.DUPLICATE_KEY:
157
+ return "low";
158
+ default:
159
+ return "medium";
160
+ }
161
+ }
162
+ /**
163
+ * Check if errors should cause operation failure
164
+ */ shouldFailOperation(expectedSystems) {
165
+ const result = this.getResult(expectedSystems);
166
+ // Fail if all systems failed
167
+ if (result.allSystemsFailed) {
168
+ return true;
169
+ }
170
+ // Fail if any critical errors
171
+ if (result.hasCriticalErrors) {
172
+ return true;
173
+ }
174
+ return false;
175
+ }
176
+ /**
177
+ * Create error report
178
+ */ createReport() {
179
+ const result = this.getResult([]);
180
+ const lines = [
181
+ '=== Error Aggregation Report ===',
182
+ `Correlation ID: ${this.correlationId}`,
183
+ `Total Errors: ${result.totalErrors}`,
184
+ `All Systems Failed: ${result.allSystemsFailed}`,
185
+ `Critical Errors: ${result.hasCriticalErrors}`,
186
+ '',
187
+ '--- Errors by System ---'
188
+ ];
189
+ for (const [system, errors] of Object.entries(result.errorsBySystem)){
190
+ lines.push(`${system}: ${errors.length} error(s)`);
191
+ for (const error of errors){
192
+ lines.push(` - [${error.severity}] ${error.error.message}`);
193
+ }
194
+ }
195
+ lines.push('');
196
+ lines.push('--- Errors by Severity ---');
197
+ for (const [severity, errors] of Object.entries(result.errorsBySeverity)){
198
+ if (errors.length > 0) {
199
+ lines.push(`${severity}: ${errors.length} error(s)`);
200
+ }
201
+ }
202
+ lines.push('');
203
+ lines.push('--- Circuit Breaker Status ---');
204
+ const allMetrics = CircuitBreakerRegistry.getAllMetrics();
205
+ for (const [system, metrics] of Object.entries(allMetrics)){
206
+ lines.push(`${system}: ${metrics.state} (failures: ${metrics.failures}, successes: ${metrics.successes})`);
207
+ }
208
+ return lines.join('\n');
209
+ }
210
+ /**
211
+ * Get correlation ID
212
+ */ getCorrelationId() {
213
+ return this.correlationId;
214
+ }
215
+ /**
216
+ * Reset aggregator (for reuse)
217
+ */ reset() {
218
+ this.errors = [];
219
+ this.correlationId = uuidv4();
220
+ }
221
+ /**
222
+ * Get circuit breaker state for system
223
+ */ getCircuitBreakerState(system) {
224
+ const breaker = CircuitBreakerRegistry.get(system);
225
+ return breaker?.getState() || CircuitBreakerState.CLOSED;
226
+ }
227
+ }
228
+ /**
229
+ * Create error aggregator
230
+ */ export function createErrorAggregator(correlationId, circuitBreakerConfig) {
231
+ return new ErrorAggregator(correlationId, circuitBreakerConfig);
232
+ }
233
+
234
+ //# sourceMappingURL=error-aggregator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/error-aggregator.ts"],"sourcesContent":["/**\r\n * Error Aggregation System\r\n *\r\n * Provides error aggregation, correlation tracking, and circuit breaker patterns\r\n * for multi-database operations.\r\n *\r\n * Features:\r\n * - Aggregates errors from multiple database systems\r\n * - Tracks error correlation across operations\r\n * - Implements circuit breaker for repeated failures\r\n * - Provides error analysis and reporting\r\n *\r\n * Part of: Critical Error Handling Fixes (Architecture Review)\r\n */\r\n\r\nimport { DatabaseError, DatabaseErrorCode } from './database-service/types.js';\r\nimport { createLogger, Logger } from './logging.js';\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport {\r\n CircuitBreakerState,\r\n CircuitBreakerConfig,\r\n CircuitBreakerRegistry,\r\n} from './circuit-breaker.js';\r\n\r\n// Re-export circuit breaker types for backward compatibility\r\nexport { CircuitBreakerState, CircuitBreakerConfig };\r\n\r\n/**\r\n * Error severity levels\r\n */\r\nexport enum ErrorSeverity {\r\n LOW = 'low',\r\n MEDIUM = 'medium',\r\n HIGH = 'high',\r\n CRITICAL = 'critical',\r\n}\r\n\r\n/**\r\n * Aggregated error with context\r\n */\r\nexport interface AggregatedError {\r\n /** Unique correlation ID for tracking */\r\n correlationId: string;\r\n /** Timestamp when error occurred */\r\n timestamp: Date;\r\n /** Database system that failed */\r\n system: string;\r\n /** Original database error */\r\n error: DatabaseError;\r\n /** Error severity */\r\n severity: ErrorSeverity;\r\n /** Operation context */\r\n operationContext?: Record<string, any>;\r\n /** Stack trace */\r\n stackTrace?: string;\r\n}\r\n\r\n/**\r\n * Error aggregation result\r\n */\r\nexport interface ErrorAggregationResult {\r\n /** Total number of errors */\r\n totalErrors: number;\r\n /** Errors by system */\r\n errorsBySystem: Record<string, AggregatedError[]>;\r\n /** Errors by severity */\r\n errorsBySeverity: Record<ErrorSeverity, AggregatedError[]>;\r\n /** All aggregated errors */\r\n allErrors: AggregatedError[];\r\n /** Correlation ID for this aggregation */\r\n correlationId: string;\r\n /** Whether all systems failed */\r\n allSystemsFailed: boolean;\r\n /** Whether any critical errors occurred */\r\n hasCriticalErrors: boolean;\r\n}\r\n\r\n// Circuit breaker types now imported from ./circuit-breaker module\r\n\r\n/**\r\n * Error aggregator class\r\n */\r\nexport class ErrorAggregator {\r\n private logger: Logger;\r\n private errors: AggregatedError[] = [];\r\n private correlationId: string;\r\n private circuitBreakerConfig: Partial<CircuitBreakerConfig>;\r\n\r\n constructor(\r\n correlationId?: string,\r\n circuitBreakerConfig?: Partial<CircuitBreakerConfig>\r\n ) {\r\n this.correlationId = correlationId || uuidv4();\r\n this.logger = createLogger('error-aggregator');\r\n\r\n // Store circuit breaker configuration for registry\r\n this.circuitBreakerConfig = {\r\n failureThreshold: circuitBreakerConfig?.failureThreshold ?? 5,\r\n successThreshold: circuitBreakerConfig?.successThreshold ?? 2,\r\n timeout: circuitBreakerConfig?.timeout ?? 60000,\r\n windowSize: circuitBreakerConfig?.windowSize ?? 120000,\r\n };\r\n }\r\n\r\n /**\r\n * Add error to aggregation\r\n */\r\n addError(\r\n system: string,\r\n error: DatabaseError,\r\n operationContext?: Record<string, any>\r\n ): AggregatedError {\r\n const aggregatedError: AggregatedError = {\r\n correlationId: uuidv4(),\r\n timestamp: new Date(),\r\n system,\r\n error,\r\n severity: this.determineSeverity(error),\r\n operationContext,\r\n stackTrace: error.originalError?.stack,\r\n };\r\n\r\n this.errors.push(aggregatedError);\r\n\r\n // Update circuit breaker\r\n this.recordFailure(system);\r\n\r\n // Log error with correlation ID\r\n this.logger.error(\r\n 'Database operation failed',\r\n error.originalError,\r\n {\r\n correlationId: this.correlationId,\r\n errorCorrelationId: aggregatedError.correlationId,\r\n system,\r\n errorCode: error.code,\r\n message: error.message,\r\n severity: aggregatedError.severity,\r\n }\r\n );\r\n\r\n return aggregatedError;\r\n }\r\n\r\n /**\r\n * Record successful operation (for circuit breaker)\r\n */\r\n recordSuccess(system: string): void {\r\n // Use circuit breaker registry - success is tracked automatically via execute()\r\n // This method is kept for backward compatibility but delegates to registry\r\n const breaker = CircuitBreakerRegistry.getOrCreate(system, this.circuitBreakerConfig);\r\n // Success tracking is handled internally by CircuitBreaker.execute()\r\n // This is just a manual success recording for compatibility\r\n this.logger.debug('Manual success recorded', { system, correlationId: this.correlationId });\r\n }\r\n\r\n /**\r\n * Record failed operation (for circuit breaker)\r\n */\r\n private recordFailure(system: string): void {\r\n // Failure tracking is handled by the circuit breaker registry\r\n // This is called when addError is invoked\r\n const breaker = CircuitBreakerRegistry.getOrCreate(system, this.circuitBreakerConfig);\r\n this.logger.debug('Failure recorded via error aggregation', {\r\n system,\r\n state: breaker.getState(),\r\n correlationId: this.correlationId,\r\n });\r\n }\r\n\r\n /**\r\n * Check if circuit breaker allows operation\r\n */\r\n isCircuitOpen(system: string): boolean {\r\n const breaker = CircuitBreakerRegistry.get(system);\r\n return breaker ? !breaker.isHealthy() : false;\r\n }\r\n\r\n /**\r\n * Get aggregation result\r\n */\r\n getResult(expectedSystems: string[]): ErrorAggregationResult {\r\n const errorsBySystem: Record<string, AggregatedError[]> = {};\r\n const errorsBySeverity: Record<ErrorSeverity, AggregatedError[]> = {\r\n [ErrorSeverity.LOW]: [],\r\n [ErrorSeverity.MEDIUM]: [],\r\n [ErrorSeverity.HIGH]: [],\r\n [ErrorSeverity.CRITICAL]: [],\r\n };\r\n\r\n // Group errors\r\n for (const error of this.errors) {\r\n // By system\r\n if (!errorsBySystem[error.system]) {\r\n errorsBySystem[error.system] = [];\r\n }\r\n errorsBySystem[error.system].push(error);\r\n\r\n // By severity\r\n errorsBySeverity[error.severity].push(error);\r\n }\r\n\r\n // Check if all systems failed\r\n const failedSystems = Object.keys(errorsBySystem);\r\n const allSystemsFailed = expectedSystems.every(system =>\r\n failedSystems.includes(system)\r\n );\r\n\r\n // Check for critical errors\r\n const hasCriticalErrors = errorsBySeverity[ErrorSeverity.CRITICAL].length > 0;\r\n\r\n return {\r\n totalErrors: this.errors.length,\r\n errorsBySystem,\r\n errorsBySeverity,\r\n allErrors: [...this.errors],\r\n correlationId: this.correlationId,\r\n allSystemsFailed,\r\n hasCriticalErrors,\r\n };\r\n }\r\n\r\n /**\r\n * Determine error severity\r\n */\r\n private determineSeverity(error: DatabaseError): ErrorSeverity {\r\n switch (error.code) {\r\n case DatabaseErrorCode.CONNECTION_FAILED:\r\n case DatabaseErrorCode.TRANSACTION_FAILED:\r\n return ErrorSeverity.CRITICAL;\r\n\r\n case DatabaseErrorCode.QUERY_FAILED:\r\n case DatabaseErrorCode.TIMEOUT:\r\n return ErrorSeverity.HIGH;\r\n\r\n case DatabaseErrorCode.VALIDATION_FAILED:\r\n case DatabaseErrorCode.CONSTRAINT_VIOLATION:\r\n return ErrorSeverity.MEDIUM;\r\n\r\n case DatabaseErrorCode.NOT_FOUND:\r\n case DatabaseErrorCode.DUPLICATE_KEY:\r\n return ErrorSeverity.LOW;\r\n\r\n default:\r\n return ErrorSeverity.MEDIUM;\r\n }\r\n }\r\n\r\n /**\r\n * Check if errors should cause operation failure\r\n */\r\n shouldFailOperation(expectedSystems: string[]): boolean {\r\n const result = this.getResult(expectedSystems);\r\n\r\n // Fail if all systems failed\r\n if (result.allSystemsFailed) {\r\n return true;\r\n }\r\n\r\n // Fail if any critical errors\r\n if (result.hasCriticalErrors) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Create error report\r\n */\r\n createReport(): string {\r\n const result = this.getResult([]);\r\n const lines: string[] = [\r\n '=== Error Aggregation Report ===',\r\n `Correlation ID: ${this.correlationId}`,\r\n `Total Errors: ${result.totalErrors}`,\r\n `All Systems Failed: ${result.allSystemsFailed}`,\r\n `Critical Errors: ${result.hasCriticalErrors}`,\r\n '',\r\n '--- Errors by System ---',\r\n ];\r\n\r\n for (const [system, errors] of Object.entries(result.errorsBySystem)) {\r\n lines.push(`${system}: ${errors.length} error(s)`);\r\n for (const error of errors) {\r\n lines.push(` - [${error.severity}] ${error.error.message}`);\r\n }\r\n }\r\n\r\n lines.push('');\r\n lines.push('--- Errors by Severity ---');\r\n for (const [severity, errors] of Object.entries(result.errorsBySeverity)) {\r\n if (errors.length > 0) {\r\n lines.push(`${severity}: ${errors.length} error(s)`);\r\n }\r\n }\r\n\r\n lines.push('');\r\n lines.push('--- Circuit Breaker Status ---');\r\n const allMetrics = CircuitBreakerRegistry.getAllMetrics();\r\n for (const [system, metrics] of Object.entries(allMetrics)) {\r\n lines.push(\r\n `${system}: ${metrics.state} (failures: ${metrics.failures}, successes: ${metrics.successes})`\r\n );\r\n }\r\n\r\n return lines.join('\\n');\r\n }\r\n\r\n /**\r\n * Get correlation ID\r\n */\r\n getCorrelationId(): string {\r\n return this.correlationId;\r\n }\r\n\r\n /**\r\n * Reset aggregator (for reuse)\r\n */\r\n reset(): void {\r\n this.errors = [];\r\n this.correlationId = uuidv4();\r\n }\r\n\r\n /**\r\n * Get circuit breaker state for system\r\n */\r\n getCircuitBreakerState(system: string): CircuitBreakerState {\r\n const breaker = CircuitBreakerRegistry.get(system);\r\n return breaker?.getState() || CircuitBreakerState.CLOSED;\r\n }\r\n}\r\n\r\n/**\r\n * Create error aggregator\r\n */\r\nexport function createErrorAggregator(\r\n correlationId?: string,\r\n circuitBreakerConfig?: Partial<CircuitBreakerConfig>\r\n): ErrorAggregator {\r\n return new ErrorAggregator(correlationId, circuitBreakerConfig);\r\n}\r\n"],"names":["DatabaseErrorCode","createLogger","v4","uuidv4","CircuitBreakerState","CircuitBreakerConfig","CircuitBreakerRegistry","ErrorSeverity","ErrorAggregator","logger","errors","correlationId","circuitBreakerConfig","failureThreshold","successThreshold","timeout","windowSize","addError","system","error","operationContext","aggregatedError","timestamp","Date","severity","determineSeverity","stackTrace","originalError","stack","push","recordFailure","errorCorrelationId","errorCode","code","message","recordSuccess","breaker","getOrCreate","debug","state","getState","isCircuitOpen","get","isHealthy","getResult","expectedSystems","errorsBySystem","errorsBySeverity","failedSystems","Object","keys","allSystemsFailed","every","includes","hasCriticalErrors","length","totalErrors","allErrors","CONNECTION_FAILED","TRANSACTION_FAILED","QUERY_FAILED","TIMEOUT","VALIDATION_FAILED","CONSTRAINT_VIOLATION","NOT_FOUND","DUPLICATE_KEY","shouldFailOperation","result","createReport","lines","entries","allMetrics","getAllMetrics","metrics","failures","successes","join","getCorrelationId","reset","getCircuitBreakerState","CLOSED","createErrorAggregator"],"mappings":"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"}
@@ -0,0 +1,287 @@
1
+ /**
2
+ * Standard Error Utilities
3
+ *
4
+ * Provides standardized error handling with typed error codes and context.
5
+ * Part of Task 0.5: Implementation Tooling & Utilities (Foundation)
6
+ *
7
+ * Usage:
8
+ * throw createError(ErrorCode.VALIDATION_FAILED, 'Invalid input', { field: 'email' });
9
+ * if (isErrorCode(error, ErrorCode.RETRY_EXHAUSTED)) { ... }
10
+ */ /**
11
+ * Generic error codes (extends DatabaseErrorCode)
12
+ */ export var ErrorCode = /*#__PURE__*/ function(ErrorCode) {
13
+ // Database error codes (re-exported for convenience)
14
+ ErrorCode["DB_CONNECTION_FAILED"] = "DB_CONNECTION_FAILED";
15
+ ErrorCode["DB_QUERY_FAILED"] = "DB_QUERY_FAILED";
16
+ ErrorCode["DB_TRANSACTION_FAILED"] = "DB_TRANSACTION_FAILED";
17
+ ErrorCode["DB_VALIDATION_FAILED"] = "DB_VALIDATION_FAILED";
18
+ ErrorCode["DB_NOT_FOUND"] = "DB_NOT_FOUND";
19
+ ErrorCode["DB_DUPLICATE_KEY"] = "DB_DUPLICATE_KEY";
20
+ ErrorCode["DB_TIMEOUT"] = "DB_TIMEOUT";
21
+ ErrorCode["DB_CONSTRAINT_VIOLATION"] = "DB_CONSTRAINT_VIOLATION";
22
+ ErrorCode["DB_UNKNOWN_ERROR"] = "DB_UNKNOWN_ERROR";
23
+ // Generic error codes (new in Task 0.5)
24
+ ErrorCode["RETRY_EXHAUSTED"] = "RETRY_EXHAUSTED";
25
+ ErrorCode["LOCK_TIMEOUT"] = "LOCK_TIMEOUT";
26
+ ErrorCode["VALIDATION_FAILED"] = "VALIDATION_FAILED";
27
+ ErrorCode["INVALID_INPUT"] = "INVALID_INPUT";
28
+ ErrorCode["FILE_NOT_FOUND"] = "FILE_NOT_FOUND";
29
+ ErrorCode["FILE_WRITE_FAILED"] = "FILE_WRITE_FAILED";
30
+ ErrorCode["OPERATION_TIMEOUT"] = "OPERATION_TIMEOUT";
31
+ ErrorCode["NETWORK_ERROR"] = "NETWORK_ERROR";
32
+ ErrorCode["PARSE_ERROR"] = "PARSE_ERROR";
33
+ ErrorCode["CONFIGURATION_ERROR"] = "CONFIGURATION_ERROR";
34
+ ErrorCode["UNKNOWN_ERROR"] = "UNKNOWN_ERROR";
35
+ return ErrorCode;
36
+ }({});
37
+ /**
38
+ * Standard error class with typed error codes and context
39
+ */ export class StandardError extends Error {
40
+ /**
41
+ * Error code for programmatic error handling
42
+ */ code;
43
+ /**
44
+ * Additional context about the error
45
+ */ context;
46
+ /**
47
+ * Timestamp when error was created
48
+ */ timestamp;
49
+ /**
50
+ * Original error that caused this error (if any)
51
+ */ cause;
52
+ /**
53
+ * Whether this error is retryable (for retry logic)
54
+ */ isRetryable;
55
+ /**
56
+ * Create a new StandardError
57
+ *
58
+ * @param code - Error code
59
+ * @param message - Human-readable error message
60
+ * @param context - Additional context about the error
61
+ * @param cause - Original error that caused this error
62
+ * @param isRetryable - Whether this error is retryable (auto-detected if not provided)
63
+ */ constructor(code, message, context, cause, isRetryable){
64
+ super(message);
65
+ this.name = 'StandardError';
66
+ this.code = code;
67
+ this.context = context;
68
+ this.timestamp = new Date();
69
+ this.cause = cause;
70
+ // Auto-detect retryable status if not explicitly provided
71
+ if (isRetryable !== undefined) {
72
+ this.isRetryable = isRetryable;
73
+ } else {
74
+ this.isRetryable = this.detectRetryable(code);
75
+ }
76
+ // Maintain proper stack trace for where our error was thrown (V8 only)
77
+ if (Error.captureStackTrace) {
78
+ Error.captureStackTrace(this, StandardError);
79
+ }
80
+ // Append original error stack if available
81
+ if (cause && cause.stack) {
82
+ this.stack = `${this.stack}\nCaused by: ${cause.stack}`;
83
+ }
84
+ }
85
+ /**
86
+ * Auto-detect if error code indicates retryable condition
87
+ */ detectRetryable(code) {
88
+ const retryableCodes = [
89
+ "DB_TIMEOUT",
90
+ "DB_CONNECTION_FAILED",
91
+ "OPERATION_TIMEOUT",
92
+ "NETWORK_ERROR",
93
+ "LOCK_TIMEOUT"
94
+ ];
95
+ return retryableCodes.includes(code);
96
+ }
97
+ /**
98
+ * Convert error to JSON representation
99
+ */ toJSON() {
100
+ return {
101
+ name: this.name,
102
+ code: this.code,
103
+ message: this.message,
104
+ context: this.context,
105
+ timestamp: this.timestamp.toISOString(),
106
+ isRetryable: this.isRetryable,
107
+ stack: this.stack,
108
+ cause: this.cause ? {
109
+ name: this.cause.name,
110
+ message: this.cause.message,
111
+ stack: this.cause.stack
112
+ } : undefined
113
+ };
114
+ }
115
+ /**
116
+ * Convert error to string representation
117
+ */ toString() {
118
+ let str = `${this.name} [${this.code}]: ${this.message}`;
119
+ if (this.context && Object.keys(this.context).length > 0) {
120
+ str += `\nContext: ${JSON.stringify(this.context, null, 2)}`;
121
+ }
122
+ if (this.cause) {
123
+ str += `\nCaused by: ${this.cause.message}`;
124
+ }
125
+ return str;
126
+ }
127
+ }
128
+ /**
129
+ * Create a StandardError instance
130
+ *
131
+ * @param code - Error code
132
+ * @param message - Human-readable error message
133
+ * @param context - Additional context about the error
134
+ * @param cause - Original error that caused this error
135
+ * @returns StandardError instance
136
+ */ export function createError(code, message, context, cause) {
137
+ return new StandardError(code, message, context, cause);
138
+ }
139
+ /**
140
+ * Check if an error has a specific error code
141
+ *
142
+ * @param error - Error to check
143
+ * @param code - Error code to match
144
+ * @returns True if error has the specified code
145
+ */ export function isErrorCode(error, code) {
146
+ if (!error) {
147
+ return false;
148
+ }
149
+ // Check StandardError
150
+ if (error instanceof StandardError) {
151
+ return error.code === code;
152
+ }
153
+ // Check DatabaseError pattern (object with code property)
154
+ if (typeof error === 'object' && 'code' in error) {
155
+ return error.code === code;
156
+ }
157
+ return false;
158
+ }
159
+ /**
160
+ * Check if error is a StandardError instance
161
+ *
162
+ * @param error - Error to check
163
+ * @returns True if error is a StandardError
164
+ */ export function isStandardError(error) {
165
+ return error instanceof StandardError;
166
+ }
167
+ /**
168
+ * Wrap an unknown error into a StandardError
169
+ *
170
+ * @param error - Unknown error to wrap
171
+ * @param code - Error code to use (default: UNKNOWN_ERROR)
172
+ * @param context - Additional context
173
+ * @returns StandardError instance
174
+ */ export function wrapError(error, code = "UNKNOWN_ERROR", context) {
175
+ if (error instanceof StandardError) {
176
+ // Already a StandardError, return as-is or with additional context
177
+ if (context) {
178
+ return new StandardError(error.code, error.message, {
179
+ ...error.context,
180
+ ...context
181
+ }, error.cause);
182
+ }
183
+ return error;
184
+ }
185
+ if (error instanceof Error) {
186
+ return new StandardError(code, error.message, context, error);
187
+ }
188
+ // Handle non-Error objects
189
+ const message = typeof error === 'string' ? error : String(error);
190
+ return new StandardError(code, message, context);
191
+ }
192
+ /**
193
+ * Extract error message from unknown error
194
+ *
195
+ * @param error - Unknown error
196
+ * @returns Error message string
197
+ */ export function getErrorMessage(error) {
198
+ if (error instanceof Error) {
199
+ return error.message;
200
+ }
201
+ if (typeof error === 'string') {
202
+ return error;
203
+ }
204
+ if (error && typeof error === 'object' && 'message' in error) {
205
+ return String(error.message);
206
+ }
207
+ return String(error);
208
+ }
209
+ /**
210
+ * Extract error code from unknown error
211
+ *
212
+ * @param error - Unknown error
213
+ * @returns Error code or undefined
214
+ */ export function getErrorCode(error) {
215
+ if (error instanceof StandardError) {
216
+ return error.code;
217
+ }
218
+ if (error && typeof error === 'object' && 'code' in error) {
219
+ return String(error.code);
220
+ }
221
+ return undefined;
222
+ }
223
+ /**
224
+ * Check if error indicates a retryable condition
225
+ *
226
+ * @param error - Error to check
227
+ * @returns True if error is retryable
228
+ */ export function isRetryableError(error) {
229
+ // Check StandardError with isRetryable flag
230
+ if (error instanceof StandardError) {
231
+ return error.isRetryable;
232
+ }
233
+ // Fallback: check error code for retryable codes
234
+ const retryableCodes = [
235
+ "DB_TIMEOUT",
236
+ "DB_CONNECTION_FAILED",
237
+ "OPERATION_TIMEOUT",
238
+ "NETWORK_ERROR",
239
+ "LOCK_TIMEOUT"
240
+ ];
241
+ if (typeof error === 'object' && 'code' in error) {
242
+ return retryableCodes.includes(error.code);
243
+ }
244
+ return false;
245
+ }
246
+ /**
247
+ * Create a validation error
248
+ *
249
+ * @param message - Validation error message
250
+ * @param field - Field that failed validation
251
+ * @param value - Invalid value (optional)
252
+ * @returns StandardError instance
253
+ */ export function createValidationError(message, field, value) {
254
+ const context = {};
255
+ if (field) {
256
+ context.field = field;
257
+ }
258
+ if (value !== undefined) {
259
+ context.value = value;
260
+ }
261
+ return new StandardError("VALIDATION_FAILED", message, context);
262
+ }
263
+ /**
264
+ * Create a retry exhausted error
265
+ *
266
+ * @param attempts - Number of retry attempts made
267
+ * @param lastError - Last error encountered
268
+ * @returns StandardError instance
269
+ */ export function createRetryExhaustedError(attempts, lastError) {
270
+ return new StandardError("RETRY_EXHAUSTED", `Operation failed after ${attempts} retry attempts`, {
271
+ attempts
272
+ }, lastError);
273
+ }
274
+ /**
275
+ * Create a timeout error
276
+ *
277
+ * @param operation - Operation that timed out
278
+ * @param timeoutMs - Timeout duration in milliseconds
279
+ * @returns StandardError instance
280
+ */ export function createTimeoutError(operation, timeoutMs) {
281
+ return new StandardError("OPERATION_TIMEOUT", `Operation '${operation}' timed out after ${timeoutMs}ms`, {
282
+ operation,
283
+ timeoutMs
284
+ });
285
+ }
286
+
287
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/errors.ts"],"sourcesContent":["/**\r\n * Standard Error Utilities\r\n *\r\n * Provides standardized error handling with typed error codes and context.\r\n * Part of Task 0.5: Implementation Tooling & Utilities (Foundation)\r\n *\r\n * Usage:\r\n * throw createError(ErrorCode.VALIDATION_FAILED, 'Invalid input', { field: 'email' });\r\n * if (isErrorCode(error, ErrorCode.RETRY_EXHAUSTED)) { ... }\r\n */\r\n\r\nimport { DatabaseErrorCode } from './database-service/errors.js';\r\n\r\n/**\r\n * Generic error codes (extends DatabaseErrorCode)\r\n */\r\nexport enum ErrorCode {\r\n // Database error codes (re-exported for convenience)\r\n DB_CONNECTION_FAILED = 'DB_CONNECTION_FAILED',\r\n DB_QUERY_FAILED = 'DB_QUERY_FAILED',\r\n DB_TRANSACTION_FAILED = 'DB_TRANSACTION_FAILED',\r\n DB_VALIDATION_FAILED = 'DB_VALIDATION_FAILED',\r\n DB_NOT_FOUND = 'DB_NOT_FOUND',\r\n DB_DUPLICATE_KEY = 'DB_DUPLICATE_KEY',\r\n DB_TIMEOUT = 'DB_TIMEOUT',\r\n DB_CONSTRAINT_VIOLATION = 'DB_CONSTRAINT_VIOLATION',\r\n DB_UNKNOWN_ERROR = 'DB_UNKNOWN_ERROR',\r\n\r\n // Generic error codes (new in Task 0.5)\r\n RETRY_EXHAUSTED = 'RETRY_EXHAUSTED',\r\n LOCK_TIMEOUT = 'LOCK_TIMEOUT',\r\n VALIDATION_FAILED = 'VALIDATION_FAILED',\r\n INVALID_INPUT = 'INVALID_INPUT',\r\n FILE_NOT_FOUND = 'FILE_NOT_FOUND',\r\n FILE_WRITE_FAILED = 'FILE_WRITE_FAILED',\r\n OPERATION_TIMEOUT = 'OPERATION_TIMEOUT',\r\n NETWORK_ERROR = 'NETWORK_ERROR',\r\n PARSE_ERROR = 'PARSE_ERROR',\r\n CONFIGURATION_ERROR = 'CONFIGURATION_ERROR',\r\n UNKNOWN_ERROR = 'UNKNOWN_ERROR',\r\n}\r\n\r\n/**\r\n * Standard error class with typed error codes and context\r\n */\r\nexport class StandardError extends Error {\r\n /**\r\n * Error code for programmatic error handling\r\n */\r\n public readonly code: ErrorCode | string;\r\n\r\n /**\r\n * Additional context about the error\r\n */\r\n public readonly context?: Record<string, any>;\r\n\r\n /**\r\n * Timestamp when error was created\r\n */\r\n public readonly timestamp: Date;\r\n\r\n /**\r\n * Original error that caused this error (if any)\r\n */\r\n public readonly cause?: Error;\r\n\r\n /**\r\n * Whether this error is retryable (for retry logic)\r\n */\r\n public readonly isRetryable: boolean;\r\n\r\n /**\r\n * Create a new StandardError\r\n *\r\n * @param code - Error code\r\n * @param message - Human-readable error message\r\n * @param context - Additional context about the error\r\n * @param cause - Original error that caused this error\r\n * @param isRetryable - Whether this error is retryable (auto-detected if not provided)\r\n */\r\n constructor(\r\n code: ErrorCode | string,\r\n message: string,\r\n context?: Record<string, any>,\r\n cause?: Error,\r\n isRetryable?: boolean\r\n ) {\r\n super(message);\r\n this.name = 'StandardError';\r\n this.code = code;\r\n this.context = context;\r\n this.timestamp = new Date();\r\n this.cause = cause;\r\n\r\n // Auto-detect retryable status if not explicitly provided\r\n if (isRetryable !== undefined) {\r\n this.isRetryable = isRetryable;\r\n } else {\r\n this.isRetryable = this.detectRetryable(code);\r\n }\r\n\r\n // Maintain proper stack trace for where our error was thrown (V8 only)\r\n if (Error.captureStackTrace) {\r\n Error.captureStackTrace(this, StandardError);\r\n }\r\n\r\n // Append original error stack if available\r\n if (cause && cause.stack) {\r\n this.stack = `${this.stack}\\nCaused by: ${cause.stack}`;\r\n }\r\n }\r\n\r\n /**\r\n * Auto-detect if error code indicates retryable condition\r\n */\r\n private detectRetryable(code: ErrorCode | string): boolean {\r\n const retryableCodes = [\r\n ErrorCode.DB_TIMEOUT,\r\n ErrorCode.DB_CONNECTION_FAILED,\r\n ErrorCode.OPERATION_TIMEOUT,\r\n ErrorCode.NETWORK_ERROR,\r\n ErrorCode.LOCK_TIMEOUT,\r\n ];\r\n return retryableCodes.includes(code as ErrorCode);\r\n }\r\n\r\n /**\r\n * Convert error to JSON representation\r\n */\r\n toJSON(): Record<string, any> {\r\n return {\r\n name: this.name,\r\n code: this.code,\r\n message: this.message,\r\n context: this.context,\r\n timestamp: this.timestamp.toISOString(),\r\n isRetryable: this.isRetryable,\r\n stack: this.stack,\r\n cause: this.cause\r\n ? {\r\n name: this.cause.name,\r\n message: this.cause.message,\r\n stack: this.cause.stack,\r\n }\r\n : undefined,\r\n };\r\n }\r\n\r\n /**\r\n * Convert error to string representation\r\n */\r\n toString(): string {\r\n let str = `${this.name} [${this.code}]: ${this.message}`;\r\n\r\n if (this.context && Object.keys(this.context).length > 0) {\r\n str += `\\nContext: ${JSON.stringify(this.context, null, 2)}`;\r\n }\r\n\r\n if (this.cause) {\r\n str += `\\nCaused by: ${this.cause.message}`;\r\n }\r\n\r\n return str;\r\n }\r\n}\r\n\r\n/**\r\n * Create a StandardError instance\r\n *\r\n * @param code - Error code\r\n * @param message - Human-readable error message\r\n * @param context - Additional context about the error\r\n * @param cause - Original error that caused this error\r\n * @returns StandardError instance\r\n */\r\nexport function createError(\r\n code: ErrorCode | string,\r\n message: string,\r\n context?: Record<string, any>,\r\n cause?: Error\r\n): StandardError {\r\n return new StandardError(code, message, context, cause);\r\n}\r\n\r\n/**\r\n * Check if an error has a specific error code\r\n *\r\n * @param error - Error to check\r\n * @param code - Error code to match\r\n * @returns True if error has the specified code\r\n */\r\nexport function isErrorCode(error: any, code: ErrorCode | string): boolean {\r\n if (!error) {\r\n return false;\r\n }\r\n\r\n // Check StandardError\r\n if (error instanceof StandardError) {\r\n return error.code === code;\r\n }\r\n\r\n // Check DatabaseError pattern (object with code property)\r\n if (typeof error === 'object' && 'code' in error) {\r\n return error.code === code;\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * Check if error is a StandardError instance\r\n *\r\n * @param error - Error to check\r\n * @returns True if error is a StandardError\r\n */\r\nexport function isStandardError(error: any): error is StandardError {\r\n return error instanceof StandardError;\r\n}\r\n\r\n/**\r\n * Wrap an unknown error into a StandardError\r\n *\r\n * @param error - Unknown error to wrap\r\n * @param code - Error code to use (default: UNKNOWN_ERROR)\r\n * @param context - Additional context\r\n * @returns StandardError instance\r\n */\r\nexport function wrapError(\r\n error: unknown,\r\n code: ErrorCode | string = ErrorCode.UNKNOWN_ERROR,\r\n context?: Record<string, any>\r\n): StandardError {\r\n if (error instanceof StandardError) {\r\n // Already a StandardError, return as-is or with additional context\r\n if (context) {\r\n return new StandardError(\r\n error.code,\r\n error.message,\r\n { ...error.context, ...context },\r\n error.cause\r\n );\r\n }\r\n return error;\r\n }\r\n\r\n if (error instanceof Error) {\r\n return new StandardError(code, error.message, context, error);\r\n }\r\n\r\n // Handle non-Error objects\r\n const message = typeof error === 'string' ? error : String(error);\r\n return new StandardError(code, message, context);\r\n}\r\n\r\n/**\r\n * Extract error message from unknown error\r\n *\r\n * @param error - Unknown error\r\n * @returns Error message string\r\n */\r\nexport function getErrorMessage(error: unknown): string {\r\n if (error instanceof Error) {\r\n return error.message;\r\n }\r\n\r\n if (typeof error === 'string') {\r\n return error;\r\n }\r\n\r\n if (error && typeof error === 'object' && 'message' in error) {\r\n return String(error.message);\r\n }\r\n\r\n return String(error);\r\n}\r\n\r\n/**\r\n * Extract error code from unknown error\r\n *\r\n * @param error - Unknown error\r\n * @returns Error code or undefined\r\n */\r\nexport function getErrorCode(error: unknown): string | undefined {\r\n if (error instanceof StandardError) {\r\n return error.code;\r\n }\r\n\r\n if (error && typeof error === 'object' && 'code' in error) {\r\n return String(error.code);\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Check if error indicates a retryable condition\r\n *\r\n * @param error - Error to check\r\n * @returns True if error is retryable\r\n */\r\nexport function isRetryableError(error: any): boolean {\r\n // Check StandardError with isRetryable flag\r\n if (error instanceof StandardError) {\r\n return error.isRetryable;\r\n }\r\n\r\n // Fallback: check error code for retryable codes\r\n const retryableCodes = [\r\n ErrorCode.DB_TIMEOUT,\r\n ErrorCode.DB_CONNECTION_FAILED,\r\n ErrorCode.OPERATION_TIMEOUT,\r\n ErrorCode.NETWORK_ERROR,\r\n ErrorCode.LOCK_TIMEOUT,\r\n ];\r\n\r\n if (typeof error === 'object' && 'code' in error) {\r\n return retryableCodes.includes(error.code);\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * Create a validation error\r\n *\r\n * @param message - Validation error message\r\n * @param field - Field that failed validation\r\n * @param value - Invalid value (optional)\r\n * @returns StandardError instance\r\n */\r\nexport function createValidationError(\r\n message: string,\r\n field?: string,\r\n value?: any\r\n): StandardError {\r\n const context: Record<string, any> = {};\r\n\r\n if (field) {\r\n context.field = field;\r\n }\r\n\r\n if (value !== undefined) {\r\n context.value = value;\r\n }\r\n\r\n return new StandardError(ErrorCode.VALIDATION_FAILED, message, context);\r\n}\r\n\r\n/**\r\n * Create a retry exhausted error\r\n *\r\n * @param attempts - Number of retry attempts made\r\n * @param lastError - Last error encountered\r\n * @returns StandardError instance\r\n */\r\nexport function createRetryExhaustedError(\r\n attempts: number,\r\n lastError?: Error\r\n): StandardError {\r\n return new StandardError(\r\n ErrorCode.RETRY_EXHAUSTED,\r\n `Operation failed after ${attempts} retry attempts`,\r\n { attempts },\r\n lastError\r\n );\r\n}\r\n\r\n/**\r\n * Create a timeout error\r\n *\r\n * @param operation - Operation that timed out\r\n * @param timeoutMs - Timeout duration in milliseconds\r\n * @returns StandardError instance\r\n */\r\nexport function createTimeoutError(operation: string, timeoutMs: number): StandardError {\r\n return new StandardError(\r\n ErrorCode.OPERATION_TIMEOUT,\r\n `Operation '${operation}' timed out after ${timeoutMs}ms`,\r\n { operation, timeoutMs }\r\n );\r\n}\r\n"],"names":["ErrorCode","StandardError","Error","code","context","timestamp","cause","isRetryable","message","name","Date","undefined","detectRetryable","captureStackTrace","stack","retryableCodes","includes","toJSON","toISOString","toString","str","Object","keys","length","JSON","stringify","createError","isErrorCode","error","isStandardError","wrapError","String","getErrorMessage","getErrorCode","isRetryableError","createValidationError","field","value","createRetryExhaustedError","attempts","lastError","createTimeoutError","operation","timeoutMs"],"mappings":"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"}