claude-flow-novice 2.15.2 → 2.15.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (533) hide show
  1. package/.claude/cfn-extras/skills/advanced-features/cfn-agent-swap/recommend-swap.sh +59 -59
  2. package/.claude/cfn-extras/skills/analytics/cfn-improvement-recommender/recommend-improvements.sh +91 -91
  3. package/.claude/cfn-extras/skills/analytics/cfn-pattern-extraction/extract-patterns.sh +79 -79
  4. package/.claude/cfn-extras/skills/analytics/cfn-retrospective-report/generate-report.sh +100 -100
  5. package/.claude/cfn-extras/skills/analytics/cfn-telemetry/start-telemetry.sh +110 -110
  6. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/add-bullet.sh +145 -145
  7. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/log-merge.sh +67 -67
  8. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/monitor-injection-performance.sh +137 -137
  9. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/optimize-injection-pipeline.sh +168 -168
  10. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/query-reflections.sh +35 -35
  11. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/store-reflection.sh +45 -45
  12. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/track-ab-test.sh +41 -41
  13. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/update-reflection.sh +41 -41
  14. package/.claude/cfn-extras/skills/deprecated/cfn-cli-setup/validate-cli-environment.sh +191 -191
  15. package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/create-campaign.sh +231 -231
  16. package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/get-campaign-performance.sh +190 -190
  17. package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/pause-campaign.sh +142 -142
  18. package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/set-budget.sh +181 -181
  19. package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/update-bid-strategy.sh +133 -133
  20. package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/get-conversation-history.sh +121 -121
  21. package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/qualify-lead.sh +156 -156
  22. package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/schedule-demo.sh +181 -181
  23. package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/send-message.sh +137 -137
  24. package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/transfer-to-human.sh +179 -179
  25. package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/create-campaign.sh +183 -183
  26. package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/get-delivery-status.sh +139 -139
  27. package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/opt-out.sh +150 -150
  28. package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/schedule-campaign.sh +187 -187
  29. package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/send-sms.sh +181 -181
  30. package/.claude/cfn-extras/skills/ui-portal/cfn-web-portal/test-web-portal-skill.sh +50 -50
  31. package/.claude/cfn-extras/skills/ui-portal/cfn-web-portal/validate-deployment.sh +84 -84
  32. package/.claude/cfn-extras/skills/utility/cfn-environment-sanitization/sanitize-environment.sh +243 -243
  33. package/.claude/commands/cfn-loop-cli.md +16 -2
  34. package/.claude/commands/switch-api.md +31 -10
  35. package/.claude/hooks/cfn-BACKUP_USAGE.md +243 -243
  36. package/.claude/hooks/cfn-invoke-security-validation.sh +69 -69
  37. package/.claude/hooks/cfn-lint-sql-injection.sh +61 -0
  38. package/.claude/hooks/cfn-post-edit-cfn-retrospective.sh +109 -78
  39. package/.claude/hooks/cfn-post-edit.config.json +44 -44
  40. package/.claude/hooks/cfn-pre-edit-security-warning.sh +40 -0
  41. package/.claude/skills/cfn-agent-spawning/spawn-agent.sh +22 -24
  42. package/.claude/skills/cfn-docker-agent-spawning/SKILL.md +28 -4
  43. package/.claude/skills/cfn-docker-agent-spawning/spawn-agent.sh +3 -1
  44. package/.claude/skills/cfn-docker-loop-orchestration/orchestrate.sh +224 -20
  45. package/.claude/skills/cfn-hybrid-routing/check-dependencies.sh +51 -51
  46. package/.claude/skills/cfn-loop-orchestration/helpers/gate-check.sh +550 -46
  47. package/.claude/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +277 -0
  48. package/.claude/skills/cfn-loop-orchestration/orchestrate.sh +184 -23
  49. package/.claude/skills/cfn-loop-orchestration/security_utils.sh +24 -0
  50. package/.claude/skills/cfn-loop-orchestration/test-iteration-context-injection.sh +366 -0
  51. package/.claude/skills/cfn-loop-validation/orchestrate-cfn-loop.sh +252 -252
  52. package/.claude/skills/cfn-redis-coordination/CENTRALIZED_REDIS_WRAPPER.md +319 -0
  53. package/.claude/skills/cfn-redis-coordination/agent-log.sh +4 -0
  54. package/.claude/skills/cfn-redis-coordination/agent-log.sh.bak +124 -0
  55. package/.claude/skills/cfn-redis-coordination/agent-recovery.sh +74 -74
  56. package/.claude/skills/cfn-redis-coordination/collect-confidence-scores.sh +30 -0
  57. package/.claude/skills/cfn-redis-coordination/get-context.sh +145 -112
  58. package/.claude/skills/cfn-redis-coordination/get-success-criteria.sh +54 -0
  59. package/.claude/skills/cfn-redis-coordination/invoke-waiting-mode.sh +3 -0
  60. package/.claude/skills/cfn-redis-coordination/redis-cli-wrapper.sh +24 -3
  61. package/.claude/skills/cfn-redis-coordination/redis-functions.sh +33 -0
  62. package/.claude/skills/cfn-redis-coordination/report-completion.sh +24 -31
  63. package/.claude/skills/cfn-redis-coordination/store-context.sh +4 -0
  64. package/.claude/skills/cfn-redis-coordination/store-success-criteria.sh +85 -0
  65. package/.claude/skills/cfn-redis-coordination/update-all-scripts.sh +67 -0
  66. package/.claude/skills/cfn-sqlite-memory/ttl-cleanup.sh +17 -25
  67. package/.claude/skills/cfn-transparency-middleware/middleware-config.sh +28 -28
  68. package/.claude/skills/cfn-transparency-middleware/performance-benchmark.sh +78 -78
  69. package/.claude/skills/cfn-transparency-middleware/test-e2e.sh +15 -0
  70. package/.claude/skills/cfn-transparency-middleware/test-integration.sh +161 -161
  71. package/.claude/skills/cfn-transparency-middleware/test-transparency-skill.sh +367 -367
  72. package/.claude/skills/cfn-transparency-middleware/tests/input-validation.sh +107 -92
  73. package/.claude/skills/cfn-transparency-middleware/wrap-agent.sh +131 -131
  74. package/README.md +116 -475
  75. package/claude-assets/agents/cfn-dev-team/README.md +103 -0
  76. package/claude-assets/agents/cfn-dev-team/architecture/goal-planner.md +1 -1
  77. package/claude-assets/agents/cfn-dev-team/coordinators/cfn-frontend-coordinator.md +77 -15
  78. package/claude-assets/agents/cfn-dev-team/coordinators/cfn-v3-coordinator.md +355 -6
  79. package/claude-assets/agents/cfn-dev-team/coordinators/consensus-builder.md +82 -1
  80. package/claude-assets/agents/cfn-dev-team/coordinators/handoff-coordinator.md +82 -1
  81. package/claude-assets/agents/cfn-dev-team/coordinators/multi-sprint-coordinator.md +77 -15
  82. package/claude-assets/agents/cfn-dev-team/dev-ops/docker-specialist.md +99 -12
  83. package/claude-assets/agents/cfn-dev-team/dev-ops/github-commit-agent.md +1 -1
  84. package/claude-assets/agents/cfn-dev-team/dev-ops/kubernetes-specialist.md +97 -0
  85. package/claude-assets/agents/cfn-dev-team/dev-ops/monitoring-specialist.md +20 -1
  86. package/claude-assets/agents/cfn-dev-team/developers/api-gateway-specialist.md +97 -0
  87. package/claude-assets/agents/cfn-dev-team/developers/backend-developer.md +110 -13
  88. package/claude-assets/agents/cfn-dev-team/developers/data/data-engineer.md +106 -15
  89. package/claude-assets/agents/cfn-dev-team/developers/database/database-architect.md +115 -11
  90. package/claude-assets/agents/cfn-dev-team/developers/frontend/mobile-dev.md +94 -7
  91. package/claude-assets/agents/cfn-dev-team/developers/frontend/react-frontend-engineer.md +87 -9
  92. package/claude-assets/agents/cfn-dev-team/developers/frontend/typescript-specialist.md +85 -7
  93. package/claude-assets/agents/cfn-dev-team/developers/frontend/ui-designer.md +160 -28
  94. package/claude-assets/agents/cfn-dev-team/developers/graphql-specialist.md +101 -19
  95. package/claude-assets/agents/cfn-dev-team/developers/rust-developer.md +108 -14
  96. package/claude-assets/agents/cfn-dev-team/reviewers/{reviewer.md → code-reviewer.md} +95 -8
  97. package/claude-assets/agents/cfn-dev-team/reviewers/quality/code-quality-validator.md +107 -7
  98. package/claude-assets/agents/cfn-dev-team/reviewers/quality/perf-analyzer.md +98 -7
  99. package/claude-assets/agents/cfn-dev-team/reviewers/quality/performance-benchmarker.md +95 -7
  100. package/claude-assets/agents/cfn-dev-team/reviewers/quality/security-specialist.md +136 -9
  101. package/claude-assets/agents/cfn-dev-team/testers/api-testing-specialist.md +108 -1
  102. package/claude-assets/agents/cfn-dev-team/testers/chaos-engineering-specialist.md +107 -13
  103. package/claude-assets/agents/cfn-dev-team/testers/contract-tester.md +737 -0
  104. package/claude-assets/agents/cfn-dev-team/testers/e2e/playwright-tester.md +1 -1
  105. package/claude-assets/agents/cfn-dev-team/testers/integration-tester.md +828 -0
  106. package/claude-assets/agents/cfn-dev-team/testers/interaction-tester.md +106 -7
  107. package/claude-assets/agents/cfn-dev-team/testers/load-testing-specialist.md +77 -0
  108. package/claude-assets/agents/cfn-dev-team/testers/mutation-testing-specialist.md +684 -0
  109. package/claude-assets/agents/cfn-dev-team/testers/playwright-tester.md +110 -1
  110. package/claude-assets/agents/cfn-dev-team/testers/tester.md +94 -7
  111. package/claude-assets/agents/cfn-dev-team/utility/code-booster.md +1 -3
  112. package/claude-assets/agents/cfn-dev-team/utility/epic-creator.md +87 -13
  113. package/claude-assets/agents/cfn-dev-team/utility/memory-leak-specialist.md +103 -7
  114. package/claude-assets/agents/cfn-dev-team/utility/researcher.md +1 -3
  115. package/claude-assets/agents/cfn-dev-team/utility/z-ai-specialist.md +94 -7
  116. package/claude-assets/agents/docker-coordinators/cfn-docker-v3-coordinator.md +46 -0
  117. package/claude-assets/agents/project-only-agents/npm-package-specialist.md +1 -1
  118. package/claude-assets/cfn-extras/skills/advanced-features/cfn-agent-swap/recommend-swap.sh +59 -59
  119. package/claude-assets/cfn-extras/skills/analytics/cfn-improvement-recommender/recommend-improvements.sh +91 -91
  120. package/claude-assets/cfn-extras/skills/analytics/cfn-pattern-extraction/extract-patterns.sh +79 -79
  121. package/claude-assets/cfn-extras/skills/analytics/cfn-retrospective-report/generate-report.sh +100 -100
  122. package/claude-assets/cfn-extras/skills/analytics/cfn-telemetry/start-telemetry.sh +110 -110
  123. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/add-bullet.sh +145 -145
  124. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/log-merge.sh +67 -67
  125. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/monitor-injection-performance.sh +137 -137
  126. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/optimize-injection-pipeline.sh +168 -168
  127. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/query-reflections.sh +35 -35
  128. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/store-reflection.sh +45 -45
  129. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/track-ab-test.sh +41 -41
  130. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/update-reflection.sh +41 -41
  131. package/claude-assets/cfn-extras/skills/deprecated/cfn-cli-setup/validate-cli-environment.sh +191 -191
  132. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/create-campaign.sh +231 -231
  133. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/get-campaign-performance.sh +190 -190
  134. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/pause-campaign.sh +142 -142
  135. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/set-budget.sh +181 -181
  136. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/update-bid-strategy.sh +133 -133
  137. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/get-conversation-history.sh +121 -121
  138. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/qualify-lead.sh +156 -156
  139. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/schedule-demo.sh +181 -181
  140. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/send-message.sh +137 -137
  141. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/transfer-to-human.sh +179 -179
  142. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/create-campaign.sh +183 -183
  143. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/get-delivery-status.sh +139 -139
  144. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/opt-out.sh +150 -150
  145. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/schedule-campaign.sh +187 -187
  146. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/send-sms.sh +181 -181
  147. package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/test-web-portal-skill.sh +50 -50
  148. package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/validate-deployment.sh +84 -84
  149. package/claude-assets/cfn-extras/skills/utility/cfn-environment-sanitization/sanitize-environment.sh +243 -243
  150. package/claude-assets/commands/cfn-loop-cli.md +16 -2
  151. package/claude-assets/commands/switch-api.md +31 -10
  152. package/claude-assets/hooks/cfn-BACKUP_USAGE.md +243 -243
  153. package/claude-assets/hooks/cfn-invoke-security-validation.sh +69 -69
  154. package/claude-assets/hooks/cfn-lint-sql-injection.sh +61 -0
  155. package/claude-assets/hooks/cfn-post-edit-cfn-retrospective.sh +109 -78
  156. package/claude-assets/hooks/cfn-post-edit.config.json +44 -44
  157. package/claude-assets/hooks/cfn-post-execution/memory-cleanup.sh +19 -19
  158. package/claude-assets/hooks/cfn-pre-edit-security-warning.sh +40 -0
  159. package/claude-assets/hooks/cfn-pre-execution/memory-check.sh +19 -19
  160. package/claude-assets/hooks/detect-hardcoded-credentials.sh +212 -0
  161. package/claude-assets/skills/SKILL_TEMPLATE.md +774 -0
  162. package/claude-assets/skills/agent-lifecycle/execute-lifecycle-hook.sh +543 -572
  163. package/claude-assets/skills/agent-lifecycle/simple-audit.sh +57 -30
  164. package/claude-assets/skills/agent-template-generator/SKILL.md +440 -0
  165. package/claude-assets/skills/agent-template-generator/generate-agent.sh +405 -0
  166. package/claude-assets/skills/agent-validation-linter/SKILL.md +589 -0
  167. package/claude-assets/skills/agent-validation-linter/lint-agents.sh +271 -0
  168. package/claude-assets/skills/bootstrap/bash-fundamentals.md +786 -0
  169. package/claude-assets/skills/bootstrap/database-connection.md +464 -0
  170. package/claude-assets/skills/bootstrap/error-handling.md +580 -0
  171. package/claude-assets/skills/bootstrap/file-operations.md +699 -0
  172. package/claude-assets/skills/bootstrap/skill-loader.md +616 -0
  173. package/claude-assets/skills/bootstrap/sqlite-params.sh +287 -0
  174. package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh +22 -24
  175. package/claude-assets/skills/cfn-automatic-memory-persistence/persist-agent-output.sh +48 -48
  176. package/claude-assets/skills/cfn-automatic-memory-persistence/query-agent-history.sh +34 -34
  177. package/claude-assets/skills/cfn-automatic-memory-persistence/test-memory-persistence.sh +17 -16
  178. package/claude-assets/skills/cfn-deliverable-validation/confidence-calculator.sh +261 -261
  179. package/claude-assets/skills/cfn-deployment/SKILL.md +293 -0
  180. package/claude-assets/skills/cfn-deployment/execute.sh +21 -0
  181. package/claude-assets/skills/cfn-docker-agent-spawning/SKILL.md +28 -4
  182. package/claude-assets/skills/cfn-docker-agent-spawning/spawn-agent.sh +3 -1
  183. package/claude-assets/skills/cfn-docker-loop-orchestration/orchestrate.sh +224 -20
  184. package/claude-assets/skills/cfn-environment-sanitization/sanitize-environment.sh +38 -0
  185. package/claude-assets/skills/cfn-error-batching-strategy/lib/core-functions.sh +47 -47
  186. package/claude-assets/skills/cfn-expert-update/update-expert.sh +345 -345
  187. package/claude-assets/skills/cfn-file-operations/SKILL.md +290 -0
  188. package/claude-assets/skills/cfn-file-operations/execute.sh +129 -0
  189. package/claude-assets/skills/cfn-file-operations/lib/atomic-write.sh +294 -0
  190. package/claude-assets/skills/cfn-file-operations/lib/lock.sh +361 -0
  191. package/claude-assets/skills/cfn-file-operations/test.sh +369 -0
  192. package/claude-assets/skills/cfn-hybrid-routing/check-dependencies.sh +51 -51
  193. package/claude-assets/skills/cfn-intervention-detector/detect-intervention.sh +110 -110
  194. package/claude-assets/skills/cfn-intervention-orchestrator/execute-intervention.sh +58 -58
  195. package/claude-assets/skills/cfn-log-operations/SKILL.md +308 -0
  196. package/claude-assets/skills/cfn-log-operations/execute.sh +420 -0
  197. package/claude-assets/skills/cfn-log-operations/lib/rotate.sh +406 -0
  198. package/claude-assets/skills/cfn-log-operations/lib/search.sh +448 -0
  199. package/claude-assets/skills/cfn-log-operations/test.sh +394 -0
  200. package/claude-assets/skills/cfn-loop-orchestration/helpers/gate-check.sh +550 -46
  201. package/claude-assets/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +277 -0
  202. package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh +184 -23
  203. package/claude-assets/skills/cfn-loop-orchestration/security_utils.sh +24 -0
  204. package/claude-assets/skills/cfn-loop-orchestration/test-iteration-context-injection.sh +366 -0
  205. package/claude-assets/skills/cfn-loop-validation/orchestrate-cfn-loop.sh +252 -252
  206. package/claude-assets/skills/cfn-loop2-output-processing/process-validator-output.sh +275 -275
  207. package/claude-assets/skills/cfn-memory-management/check-memory.sh +159 -159
  208. package/claude-assets/skills/cfn-memory-management/cleanup-memory.sh +196 -196
  209. package/claude-assets/skills/cfn-node-heap-sizer/task-mode-heap-limiter.sh +325 -325
  210. package/claude-assets/skills/cfn-parameterized-queries/SKILL.md +339 -0
  211. package/claude-assets/skills/cfn-playbook/query-playbook.sh +19 -15
  212. package/claude-assets/skills/cfn-playbook/update-playbook.sh +25 -14
  213. package/claude-assets/skills/cfn-playbook-auto-update/auto-update-playbook.sh +85 -85
  214. package/claude-assets/skills/cfn-process-instrumentation/instrument-process.sh +44 -0
  215. package/claude-assets/skills/cfn-promotion/SKILL.md +305 -0
  216. package/claude-assets/skills/cfn-redis-coordination/CENTRALIZED_REDIS_WRAPPER.md +319 -0
  217. package/claude-assets/skills/cfn-redis-coordination/agent-log.sh +4 -0
  218. package/claude-assets/skills/cfn-redis-coordination/agent-log.sh.bak +124 -0
  219. package/claude-assets/skills/cfn-redis-coordination/agent-recovery.sh +74 -74
  220. package/claude-assets/skills/cfn-redis-coordination/collect-confidence-scores.sh +30 -0
  221. package/claude-assets/skills/cfn-redis-coordination/get-context.sh +145 -112
  222. package/claude-assets/skills/cfn-redis-coordination/get-success-criteria.sh +54 -0
  223. package/claude-assets/skills/cfn-redis-coordination/invoke-waiting-mode.sh +3 -0
  224. package/claude-assets/skills/cfn-redis-coordination/redis-cli-wrapper.sh +24 -3
  225. package/claude-assets/skills/cfn-redis-coordination/redis-functions.sh +33 -0
  226. package/claude-assets/skills/cfn-redis-coordination/report-completion.sh +24 -31
  227. package/claude-assets/skills/cfn-redis-coordination/store-context.sh +4 -0
  228. package/claude-assets/skills/cfn-redis-coordination/store-success-criteria.sh +85 -0
  229. package/claude-assets/skills/cfn-redis-coordination/update-all-scripts.sh +67 -0
  230. package/claude-assets/skills/cfn-scope-simplifier/simplify-scope.sh +67 -67
  231. package/claude-assets/skills/cfn-skill-loader/SKILL.md +466 -0
  232. package/claude-assets/skills/cfn-skill-loader/execute.sh +344 -0
  233. package/claude-assets/skills/cfn-specialist-injection/recommend-specialist.sh +56 -56
  234. package/claude-assets/skills/cfn-sqlite-memory/ttl-cleanup.sh +17 -25
  235. package/claude-assets/skills/cfn-standardized-error-handling/capture-agent-error.sh +86 -86
  236. package/claude-assets/skills/cfn-standardized-error-handling/test-error-handling.sh +165 -165
  237. package/claude-assets/skills/cfn-task-audit/get-audit-data.sh +42 -21
  238. package/claude-assets/skills/cfn-task-audit/store-task-audit.sh +17 -10
  239. package/claude-assets/skills/cfn-task-config-init/initialize-config.sh +264 -264
  240. package/claude-assets/skills/cfn-task-decomposition/task-decomposer.sh +278 -278
  241. package/claude-assets/skills/cfn-test-runner/detect-regressions.sh +17 -14
  242. package/claude-assets/skills/cfn-test-runner/detect-regressions.sh.backup-1763392821 +55 -0
  243. package/claude-assets/skills/cfn-test-runner/store-benchmarks.sh +17 -19
  244. package/claude-assets/skills/cfn-transparency-middleware/middleware-config.sh +28 -28
  245. package/claude-assets/skills/cfn-transparency-middleware/performance-benchmark.sh +78 -78
  246. package/claude-assets/skills/cfn-transparency-middleware/test-e2e.sh +15 -0
  247. package/claude-assets/skills/cfn-transparency-middleware/test-integration.sh +161 -161
  248. package/claude-assets/skills/cfn-transparency-middleware/test-transparency-skill.sh +367 -367
  249. package/claude-assets/skills/cfn-transparency-middleware/tests/input-validation.sh +107 -92
  250. package/claude-assets/skills/cfn-transparency-middleware/wrap-agent.sh +131 -131
  251. package/claude-assets/skills/cfn-utilities/SKILL.md +237 -0
  252. package/claude-assets/skills/cfn-utilities/execute.sh +32 -0
  253. package/claude-assets/skills/cfn-utilities/lib/errors.sh +56 -0
  254. package/claude-assets/skills/cfn-utilities/lib/file-ops.sh +164 -0
  255. package/claude-assets/skills/cfn-utilities/lib/logging.sh +77 -0
  256. package/claude-assets/skills/cfn-utilities/lib/retry.sh +127 -0
  257. package/claude-assets/skills/cfn-utilities/test.sh +317 -0
  258. package/claude-assets/skills/docker-build/SKILL.md +96 -203
  259. package/claude-assets/skills/docker-build/build.sh +73 -73
  260. package/claude-assets/skills/integration/agent-handoff.sh +492 -0
  261. package/claude-assets/skills/integration/file-operations.sh +414 -0
  262. package/claude-assets/skills/json-validation/SKILL.md +431 -0
  263. package/claude-assets/skills/json-validation/test-validate-success-criteria.sh +421 -0
  264. package/claude-assets/skills/json-validation/validate-success-criteria.sh +197 -0
  265. package/claude-assets/skills/redis-coordination/validate-parameters.sh +34 -0
  266. package/claude-assets/skills/workflow-codification/APPROVAL_WORKFLOW.md +806 -0
  267. package/claude-assets/skills/workflow-codification/COST_TRACKING.md +637 -0
  268. package/claude-assets/skills/workflow-codification/DEPLOY_QUICK_REFERENCE.md +106 -0
  269. package/claude-assets/skills/workflow-codification/EDGE_CASE_TRACKING.md +404 -0
  270. package/claude-assets/skills/workflow-codification/PROPAGATE_UPDATE_QUICK_REFERENCE.md +366 -0
  271. package/claude-assets/skills/workflow-codification/README_PHASE4.md +457 -0
  272. package/claude-assets/skills/workflow-codification/SKILL.md +110 -0
  273. package/claude-assets/skills/workflow-codification/analyze-patterns.sh +899 -0
  274. package/claude-assets/skills/workflow-codification/approval-workflow.sh +514 -0
  275. package/claude-assets/skills/workflow-codification/deploy-approved-skill.sh +481 -0
  276. package/claude-assets/skills/workflow-codification/deploy-approved-skill.sh.backup-1763392820 +512 -0
  277. package/claude-assets/skills/workflow-codification/generate-skill-update.sh +525 -0
  278. package/claude-assets/skills/workflow-codification/lib/security-utils.sh +204 -0
  279. package/claude-assets/skills/workflow-codification/propagate-skill-update.sh +648 -0
  280. package/claude-assets/skills/workflow-codification/propagate-skill-update.sh.backup-1763392820 +664 -0
  281. package/claude-assets/skills/workflow-codification/review-skill.sh +643 -0
  282. package/claude-assets/skills/workflow-codification/templates/email-notification.txt +114 -0
  283. package/claude-assets/skills/workflow-codification/templates/slack-notification.md +85 -0
  284. package/claude-assets/skills/workflow-codification/test-integration.sh +296 -0
  285. package/claude-assets/skills/workflow-codification/test-metadata-update.sh +350 -0
  286. package/claude-assets/skills/workflow-codification/track-cost-savings.sh +486 -0
  287. package/claude-assets/skills/workflow-codification/track-cost-savings.sh.backup-1763392821 +445 -0
  288. package/claude-assets/skills/workflow-codification/track-edge-case.sh +290 -0
  289. package/claude-assets/skills/workflow-codification/workflow-codification.db +0 -0
  290. package/dist/ace/ace-curator.js +10 -2
  291. package/dist/ace/ace-curator.js.map +1 -1
  292. package/dist/ace/ace-generator.js +4 -0
  293. package/dist/ace/ace-generator.js.map +1 -1
  294. package/dist/ace/ace-reflector.js +1 -1
  295. package/dist/ace/ace-reflector.js.map +1 -1
  296. package/dist/ace/context-injection.js +24 -2
  297. package/dist/ace/context-injection.js.map +1 -1
  298. package/dist/agents/agent-loader.js +146 -165
  299. package/dist/agents/agent-loader.js.map +1 -1
  300. package/dist/agents/task-agent-integration.js +1 -1
  301. package/dist/agents/task-agent-integration.js.map +1 -1
  302. package/dist/api/health-endpoints.js +390 -0
  303. package/dist/api/health-endpoints.js.map +1 -0
  304. package/dist/cli/agent-executor.js +4 -1
  305. package/dist/cli/agent-executor.js.map +1 -1
  306. package/dist/cli/agent-prompt-builder.js +89 -1
  307. package/dist/cli/agent-prompt-builder.js.map +1 -1
  308. package/dist/cli/agent-spawn.js +130 -37
  309. package/dist/cli/agent-spawn.js.map +1 -1
  310. package/dist/cli/config-manager.js +91 -109
  311. package/dist/cli/config-manager.js.map +1 -1
  312. package/dist/cli/skill-cache-validator.js +412 -0
  313. package/dist/cli/skill-cache-validator.js.map +1 -0
  314. package/dist/cli/skill-cli.js +991 -0
  315. package/dist/cli/skill-cli.js.map +1 -0
  316. package/dist/cli/skill-execution-logger.js +284 -0
  317. package/dist/cli/skill-execution-logger.js.map +1 -0
  318. package/dist/cli/skill-loader.js +457 -0
  319. package/dist/cli/skill-loader.js.map +1 -0
  320. package/dist/coordination/event-bus.js +2 -2
  321. package/dist/coordination/event-bus.js.map +1 -1
  322. package/dist/coordination/fleet-manager.js +1 -1
  323. package/dist/coordination/fleet-manager.js.map +1 -1
  324. package/dist/coordination/index.js +23 -9
  325. package/dist/coordination/index.js.map +1 -1
  326. package/dist/coordination/types/fleet-manager.types.js.map +1 -1
  327. package/dist/db/migration-manager.js +483 -0
  328. package/dist/db/migration-manager.js.map +1 -0
  329. package/dist/db/skills-query.js +535 -0
  330. package/dist/db/skills-query.js.map +1 -0
  331. package/dist/integration/DatabaseHandoff.js +507 -0
  332. package/dist/integration/DatabaseHandoff.js.map +1 -0
  333. package/dist/integration/StandardAdapter.js +291 -0
  334. package/dist/integration/StandardAdapter.js.map +1 -0
  335. package/dist/jobs/edge-case-analyzer.js +367 -0
  336. package/dist/jobs/edge-case-analyzer.js.map +1 -0
  337. package/dist/jobs/promotion-sla-enforcer.js +288 -0
  338. package/dist/jobs/promotion-sla-enforcer.js.map +1 -0
  339. package/dist/lib/agent-output-parser.js +518 -0
  340. package/dist/lib/agent-output-parser.js.map +1 -0
  341. package/dist/lib/agent-output-validator.js +950 -0
  342. package/dist/lib/agent-output-validator.js.map +1 -0
  343. package/dist/lib/agent-workspace.js +281 -0
  344. package/dist/lib/agent-workspace.js.map +1 -0
  345. package/dist/lib/artifact-registry.js +443 -0
  346. package/dist/lib/artifact-registry.js.map +1 -0
  347. package/dist/lib/atomic-file-writer.js +377 -0
  348. package/dist/lib/atomic-file-writer.js.map +1 -0
  349. package/dist/lib/backup-manager.js +779 -0
  350. package/dist/lib/backup-manager.js.map +1 -0
  351. package/dist/lib/checkpoint-manager.js +837 -0
  352. package/dist/lib/checkpoint-manager.js.map +1 -0
  353. package/dist/lib/circuit-breaker.js +340 -0
  354. package/dist/lib/circuit-breaker.js.map +1 -0
  355. package/dist/lib/completion-signal-handler.js +243 -0
  356. package/dist/lib/completion-signal-handler.js.map +1 -0
  357. package/dist/lib/config-manager.js +312 -0
  358. package/dist/lib/config-manager.js.map +1 -0
  359. package/dist/lib/config-migrator.js +386 -0
  360. package/dist/lib/config-migrator.js.map +1 -0
  361. package/dist/lib/config-validator.js +687 -0
  362. package/dist/lib/config-validator.js.map +1 -0
  363. package/dist/lib/correlation-cache.js +311 -0
  364. package/dist/lib/correlation-cache.js.map +1 -0
  365. package/dist/lib/correlation.js +263 -0
  366. package/dist/lib/correlation.js.map +1 -0
  367. package/dist/lib/database-service/connection-pool-manager.js +520 -0
  368. package/dist/lib/database-service/connection-pool-manager.js.map +1 -0
  369. package/dist/lib/database-service/correlation.js +329 -0
  370. package/dist/lib/database-service/correlation.js.map +1 -0
  371. package/dist/lib/database-service/errors.js +120 -0
  372. package/dist/lib/database-service/errors.js.map +1 -0
  373. package/dist/lib/database-service/index.js +168 -0
  374. package/dist/lib/database-service/index.js.map +1 -0
  375. package/dist/lib/database-service/postgres-adapter.js +526 -0
  376. package/dist/lib/database-service/postgres-adapter.js.map +1 -0
  377. package/dist/lib/database-service/redis-adapter.js +360 -0
  378. package/dist/lib/database-service/redis-adapter.js.map +1 -0
  379. package/dist/lib/database-service/sqlite-adapter.js +544 -0
  380. package/dist/lib/database-service/sqlite-adapter.js.map +1 -0
  381. package/dist/lib/database-service/transaction-manager.js +773 -0
  382. package/dist/lib/database-service/transaction-manager.js.map +1 -0
  383. package/dist/lib/database-service/types.js +23 -0
  384. package/dist/lib/database-service/types.js.map +1 -0
  385. package/dist/lib/deadlock-resolver.js +292 -0
  386. package/dist/lib/deadlock-resolver.js.map +1 -0
  387. package/dist/lib/distributed-lock.js +451 -0
  388. package/dist/lib/distributed-lock.js.map +1 -0
  389. package/dist/lib/edge-case-deduplicator.js +227 -0
  390. package/dist/lib/edge-case-deduplicator.js.map +1 -0
  391. package/dist/lib/encryption-manager.js +322 -0
  392. package/dist/lib/encryption-manager.js.map +1 -0
  393. package/dist/lib/error-aggregator.js +234 -0
  394. package/dist/lib/error-aggregator.js.map +1 -0
  395. package/dist/lib/errors.js +287 -0
  396. package/dist/lib/errors.js.map +1 -0
  397. package/dist/lib/file-lock-manager.js +578 -0
  398. package/dist/lib/file-lock-manager.js.map +1 -0
  399. package/dist/lib/file-operations.js +367 -0
  400. package/dist/lib/file-operations.js.map +1 -0
  401. package/dist/lib/idempotent-write.js +237 -0
  402. package/dist/lib/idempotent-write.js.map +1 -0
  403. package/dist/lib/integration-schema-validator.js +522 -0
  404. package/dist/lib/integration-schema-validator.js.map +1 -0
  405. package/dist/lib/lock-health-monitor.js +298 -0
  406. package/dist/lib/lock-health-monitor.js.map +1 -0
  407. package/dist/lib/log-shipper.js +422 -0
  408. package/dist/lib/log-shipper.js.map +1 -0
  409. package/dist/lib/logging.js +146 -0
  410. package/dist/lib/logging.js.map +1 -0
  411. package/dist/lib/message-deduplicator.js +439 -0
  412. package/dist/lib/message-deduplicator.js.map +1 -0
  413. package/dist/lib/multi-system-query.js +604 -0
  414. package/dist/lib/multi-system-query.js.map +1 -0
  415. package/dist/lib/orphan-detector.js +332 -0
  416. package/dist/lib/orphan-detector.js.map +1 -0
  417. package/dist/lib/password-generator.js +166 -0
  418. package/dist/lib/password-generator.js.map +1 -0
  419. package/dist/lib/path-validator.js +429 -0
  420. package/dist/lib/path-validator.js.map +1 -0
  421. package/dist/lib/query-translator.js +905 -0
  422. package/dist/lib/query-translator.js.map +1 -0
  423. package/dist/lib/queue-recovery.js +469 -0
  424. package/dist/lib/queue-recovery.js.map +1 -0
  425. package/dist/lib/redis-queue-manager.js +512 -0
  426. package/dist/lib/redis-queue-manager.js.map +1 -0
  427. package/dist/lib/reflection-archiver.js +272 -0
  428. package/dist/lib/reflection-archiver.js.map +1 -0
  429. package/dist/lib/retry-manager.js +453 -0
  430. package/dist/lib/retry-manager.js.map +1 -0
  431. package/dist/lib/retry.js +262 -0
  432. package/dist/lib/retry.js.map +1 -0
  433. package/dist/lib/schema-transform.js +695 -0
  434. package/dist/lib/schema-transform.js.map +1 -0
  435. package/dist/lib/schema-validator.js +491 -0
  436. package/dist/lib/schema-validator.js.map +1 -0
  437. package/dist/lib/skill-cache.js +297 -0
  438. package/dist/lib/skill-cache.js.map +1 -0
  439. package/dist/lib/skill-content-manager.js +337 -0
  440. package/dist/lib/skill-content-manager.js.map +1 -0
  441. package/dist/lib/skill-frontmatter-parser.js +237 -0
  442. package/dist/lib/skill-frontmatter-parser.js.map +1 -0
  443. package/dist/lib/skill-git-integration.js +275 -0
  444. package/dist/lib/skill-git-integration.js.map +1 -0
  445. package/dist/lib/skill-markdown-validator.js +396 -0
  446. package/dist/lib/skill-markdown-validator.js.map +1 -0
  447. package/dist/lib/skill-output-parser.js +312 -0
  448. package/dist/lib/skill-output-parser.js.map +1 -0
  449. package/dist/lib/unified-query-api.js +467 -0
  450. package/dist/lib/unified-query-api.js.map +1 -0
  451. package/dist/middleware/auth-middleware.js +350 -0
  452. package/dist/middleware/auth-middleware.js.map +1 -0
  453. package/dist/middleware/schema-validation.js +347 -0
  454. package/dist/middleware/schema-validation.js.map +1 -0
  455. package/dist/providers/anthropic-provider.js +1 -1
  456. package/dist/providers/anthropic-provider.js.map +1 -1
  457. package/dist/providers/provider-factory.js +2 -2
  458. package/dist/providers/provider-factory.js.map +1 -1
  459. package/dist/services/edge-case-analyzer.js +321 -0
  460. package/dist/services/edge-case-analyzer.js.map +1 -0
  461. package/dist/services/edge-case-deduplicator.js +266 -0
  462. package/dist/services/edge-case-deduplicator.js.map +1 -0
  463. package/dist/services/edge-case-detector.js +337 -0
  464. package/dist/services/edge-case-detector.js.map +1 -0
  465. package/dist/services/edge-case-tracker.js +547 -0
  466. package/dist/services/edge-case-tracker.js.map +1 -0
  467. package/dist/services/health-check-system.js +586 -0
  468. package/dist/services/health-check-system.js.map +1 -0
  469. package/dist/services/metrics-logger.js +412 -0
  470. package/dist/services/metrics-logger.js.map +1 -0
  471. package/dist/services/patch-generator.js +378 -0
  472. package/dist/services/patch-generator.js.map +1 -0
  473. package/dist/services/patch-validator.js +337 -0
  474. package/dist/services/patch-validator.js.map +1 -0
  475. package/dist/services/performance-monitor.js +811 -0
  476. package/dist/services/performance-monitor.js.map +1 -0
  477. package/dist/services/promotion-pipeline.js +918 -0
  478. package/dist/services/promotion-pipeline.js.map +1 -0
  479. package/dist/services/promotion-validator.js +394 -0
  480. package/dist/services/promotion-validator.js.map +1 -0
  481. package/dist/services/reflection-logger.js +388 -0
  482. package/dist/services/reflection-logger.js.map +1 -0
  483. package/dist/services/skill-deployment.js +472 -0
  484. package/dist/services/skill-deployment.js.map +1 -0
  485. package/dist/services/skill-loader.js +427 -0
  486. package/dist/services/skill-loader.js.map +1 -0
  487. package/dist/services/skill-promotion.js +372 -0
  488. package/dist/services/skill-promotion.js.map +1 -0
  489. package/dist/services/skill-validator.js +454 -0
  490. package/dist/services/skill-validator.js.map +1 -0
  491. package/dist/services/skill-versioning.js +244 -0
  492. package/dist/services/skill-versioning.js.map +1 -0
  493. package/dist/services/workspace-supervisor.js +597 -0
  494. package/dist/services/workspace-supervisor.js.map +1 -0
  495. package/dist/types/agent-output.js +44 -0
  496. package/dist/types/agent-output.js.map +1 -0
  497. package/dist/types/config.js +28 -0
  498. package/dist/types/config.js.map +1 -0
  499. package/dist/types/edge-case.js +45 -0
  500. package/dist/types/edge-case.js.map +1 -0
  501. package/package.json +201 -176
  502. package/readme/README.md +19 -4
  503. package/scripts/artifact-cleanup.sh +392 -0
  504. package/scripts/backup-cleanup.sh +627 -0
  505. package/scripts/cleanup-workspaces.sh +412 -0
  506. package/scripts/cleanup-yaml-configs.sh +141 -0
  507. package/scripts/deploy-approved-skills.sh +263 -0
  508. package/scripts/deploy-production.sh +355 -355
  509. package/scripts/docker-playwright-fix.sh +311 -311
  510. package/scripts/docker-rebuild-all-agents.sh +127 -127
  511. package/scripts/health-check.sh +447 -0
  512. package/scripts/log-aggregator.sh +554 -0
  513. package/scripts/log-monitor.sh +629 -0
  514. package/scripts/manage-agent-workspaces.sh +434 -0
  515. package/scripts/memory-leak-prevention.sh +305 -305
  516. package/scripts/migrate-artifacts.sh +563 -0
  517. package/scripts/migrate-schema.sh +533 -0
  518. package/scripts/migrate-yaml-to-json.sh +465 -0
  519. package/scripts/promote-staged-skills.sh +423 -0
  520. package/scripts/run-marketing-tests.sh +42 -42
  521. package/scripts/update_paths.sh +46 -46
  522. package/scripts/verify-no-secrets.sh +88 -35
  523. package/.claude/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +0 -161
  524. package/.claude/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +0 -728
  525. package/.claude/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +0 -131
  526. package/.claude/skills/cfn-agent-spawning/spawn-agent.sh.backup +0 -273
  527. package/.claude/skills/cfn-loop-orchestration/orchestrate.sh.backup +0 -949
  528. package/README.md.backup_before_replace +0 -781
  529. package/claude-assets/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +0 -161
  530. package/claude-assets/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +0 -728
  531. package/claude-assets/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +0 -131
  532. package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh.backup +0 -273
  533. package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh.backup +0 -949
@@ -0,0 +1,811 @@
1
+ /**
2
+ * Performance Monitor Service
3
+ *
4
+ * Real-time performance baseline monitoring with SLA tracking and alerting.
5
+ * Part of Phase 2, Task P2-4.2: Performance Baseline Monitoring
6
+ *
7
+ * Features:
8
+ * - Record performance metrics for all critical operations
9
+ * - Calculate performance baselines from historical data (P50, P95, P99)
10
+ * - Track SLA compliance and violations
11
+ * - Detect performance degradation automatically
12
+ * - Generate alerts on violations and degradation
13
+ * - Provide metrics for dashboards (Grafana integration)
14
+ * - Forecast future performance trends
15
+ *
16
+ * Performance Targets:
17
+ * - Metric recording: <10ms overhead
18
+ * - Baseline calculation: <5s
19
+ * - SLA check: <50ms
20
+ */ import * as fs from 'fs';
21
+ import * as path from 'path';
22
+ import * as yaml from 'js-yaml';
23
+ import { StandardError, ErrorCode } from '../lib/errors.js';
24
+ import { createLogger } from '../lib/logging.js';
25
+ import { v4 as uuidv4 } from 'uuid';
26
+ const logger = createLogger('performance-monitor');
27
+ /**
28
+ * Performance Monitor Service
29
+ */ export class PerformanceMonitor {
30
+ dbService;
31
+ slaConfigPath;
32
+ slaDefinitions = new Map();
33
+ baselineCache = new Map();
34
+ lastBaselineTime = new Map();
35
+ metricsRetentionDays;
36
+ baselineCalculationDays;
37
+ degradationTracker = new Map();
38
+ initialized = false;
39
+ constructor(config){
40
+ this.dbService = config.dbService;
41
+ this.slaConfigPath = config.slaConfigPath || path.join(process.cwd(), 'config/sla-definitions.yml');
42
+ this.metricsRetentionDays = config.metricsRetentionDays || 90;
43
+ this.baselineCalculationDays = config.baselineCalculationDays || 30;
44
+ }
45
+ /**
46
+ * Initialize performance monitor
47
+ */ async init() {
48
+ try {
49
+ await this.createTables();
50
+ await this.loadSLADefinitions();
51
+ this.initialized = true;
52
+ logger.info('Performance monitor initialized');
53
+ } catch (error) {
54
+ throw new StandardError(ErrorCode.CONFIGURATION_ERROR, 'Failed to initialize performance monitor', {
55
+ cause: error
56
+ });
57
+ }
58
+ }
59
+ /**
60
+ * Create necessary database tables
61
+ */ async createTables() {
62
+ try {
63
+ const sqliteAdapter = this.dbService.getAdapter('sqlite');
64
+ // Performance metrics table
65
+ await sqliteAdapter.raw(`
66
+ CREATE TABLE IF NOT EXISTS performance_metrics (
67
+ id TEXT PRIMARY KEY,
68
+ operation TEXT NOT NULL,
69
+ duration_ms REAL NOT NULL,
70
+ timestamp DATETIME NOT NULL,
71
+ metadata TEXT,
72
+ is_sla_violation INTEGER DEFAULT 0,
73
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP
74
+ )
75
+ `);
76
+ // Create index for query performance
77
+ await sqliteAdapter.raw(`
78
+ CREATE INDEX IF NOT EXISTS idx_performance_metrics_operation_timestamp
79
+ ON performance_metrics(operation, timestamp)
80
+ `);
81
+ // SLA violation tracking
82
+ await sqliteAdapter.raw(`
83
+ CREATE TABLE IF NOT EXISTS sla_violations (
84
+ id TEXT PRIMARY KEY,
85
+ operation TEXT NOT NULL,
86
+ metric_id TEXT NOT NULL,
87
+ duration_ms REAL NOT NULL,
88
+ sla_target_ms REAL NOT NULL,
89
+ violation_percent REAL NOT NULL,
90
+ timestamp DATETIME NOT NULL,
91
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
92
+ FOREIGN KEY (metric_id) REFERENCES performance_metrics(id)
93
+ )
94
+ `);
95
+ // Create index for violations
96
+ await sqliteAdapter.raw(`
97
+ CREATE INDEX IF NOT EXISTS idx_sla_violations_operation_timestamp
98
+ ON sla_violations(operation, timestamp)
99
+ `);
100
+ // Alert events table
101
+ await sqliteAdapter.raw(`
102
+ CREATE TABLE IF NOT EXISTS performance_alerts (
103
+ id TEXT PRIMARY KEY,
104
+ operation TEXT NOT NULL,
105
+ level TEXT NOT NULL,
106
+ message TEXT NOT NULL,
107
+ timestamp DATETIME NOT NULL,
108
+ resolved_at DATETIME,
109
+ resolved_reason TEXT,
110
+ metadata TEXT,
111
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP
112
+ )
113
+ `);
114
+ // Create index for alerts
115
+ await sqliteAdapter.raw(`
116
+ CREATE INDEX IF NOT EXISTS idx_performance_alerts_operation_timestamp
117
+ ON performance_alerts(operation, timestamp)
118
+ `);
119
+ // Baseline metrics cache
120
+ await sqliteAdapter.raw(`
121
+ CREATE TABLE IF NOT EXISTS baseline_metrics (
122
+ id TEXT PRIMARY KEY,
123
+ operation TEXT NOT NULL UNIQUE,
124
+ min REAL NOT NULL,
125
+ p50 REAL NOT NULL,
126
+ p95 REAL NOT NULL,
127
+ p99 REAL NOT NULL,
128
+ max REAL NOT NULL,
129
+ avg REAL NOT NULL,
130
+ count INTEGER NOT NULL,
131
+ period_days INTEGER NOT NULL,
132
+ calculated_at DATETIME NOT NULL,
133
+ updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
134
+ )
135
+ `);
136
+ logger.debug('Database tables created');
137
+ } catch (error) {
138
+ // Table creation errors are non-fatal if tables already exist
139
+ logger.debug('Table creation error (may already exist):', error);
140
+ }
141
+ }
142
+ /**
143
+ * Load SLA definitions from configuration file
144
+ */ async loadSLADefinitions() {
145
+ try {
146
+ if (!fs.existsSync(this.slaConfigPath)) {
147
+ logger.warn(`SLA config not found at ${this.slaConfigPath}, using defaults`);
148
+ this.loadDefaultSLAs();
149
+ return;
150
+ }
151
+ const configContent = fs.readFileSync(this.slaConfigPath, 'utf-8');
152
+ const config = yaml.load(configContent);
153
+ if (config.slas) {
154
+ for (const [operation, sla] of Object.entries(config.slas)){
155
+ this.slaDefinitions.set(operation, sla);
156
+ }
157
+ }
158
+ logger.debug(`Loaded ${this.slaDefinitions.size} SLA definitions`);
159
+ } catch (error) {
160
+ throw new StandardError(ErrorCode.CONFIGURATION_ERROR, 'Failed to load SLA definitions', {
161
+ path: this.slaConfigPath,
162
+ cause: error
163
+ });
164
+ }
165
+ }
166
+ /**
167
+ * Load default SLA definitions
168
+ */ loadDefaultSLAs() {
169
+ this.slaDefinitions.set('agent_startup', {
170
+ target: 2000,
171
+ p95: 2000,
172
+ p99: 5000,
173
+ enabled: true,
174
+ alert_threshold: 1.2
175
+ });
176
+ this.slaDefinitions.set('query_execution', {
177
+ target: 5000,
178
+ p95: 5000,
179
+ p99: 10000,
180
+ enabled: true,
181
+ alert_threshold: 1.2
182
+ });
183
+ this.slaDefinitions.set('skill_execution', {
184
+ target: 30000,
185
+ p95: 30000,
186
+ p99: 60000,
187
+ enabled: true,
188
+ alert_threshold: 1.2
189
+ });
190
+ this.slaDefinitions.set('transaction_commit', {
191
+ target: 5000,
192
+ p95: 5000,
193
+ p99: 10000,
194
+ enabled: true,
195
+ alert_threshold: 1.2
196
+ });
197
+ }
198
+ /**
199
+ * Record a performance metric
200
+ */ async recordMetric(metric) {
201
+ if (!this.initialized) {
202
+ throw new StandardError(ErrorCode.CONFIGURATION_ERROR, 'Performance monitor not initialized');
203
+ }
204
+ // Validate metric
205
+ this.validateMetric(metric);
206
+ const metricId = uuidv4();
207
+ const sqliteAdapter = this.dbService.getAdapter('sqlite');
208
+ const alerts = [];
209
+ try {
210
+ // Check if metric violates SLA
211
+ const isViolation = !await this.isWithinSLA(metric);
212
+ // Record metric
213
+ await sqliteAdapter.raw(`INSERT INTO performance_metrics (id, operation, duration_ms, timestamp, metadata, is_sla_violation)
214
+ VALUES (?, ?, ?, ?, ?, ?)`, [
215
+ metricId,
216
+ metric.operation,
217
+ metric.duration_ms,
218
+ metric.timestamp.toISOString(),
219
+ JSON.stringify(metric.metadata || {}),
220
+ isViolation ? 1 : 0
221
+ ]);
222
+ // Record violation if applicable
223
+ if (isViolation) {
224
+ const sla = this.slaDefinitions.get(metric.operation);
225
+ if (sla) {
226
+ const violationPercent = (metric.duration_ms - sla.target) / sla.target * 100;
227
+ const violationId = uuidv4();
228
+ await sqliteAdapter.raw(`INSERT INTO sla_violations (id, operation, metric_id, duration_ms, sla_target_ms, violation_percent, timestamp)
229
+ VALUES (?, ?, ?, ?, ?, ?, ?)`, [
230
+ violationId,
231
+ metric.operation,
232
+ metricId,
233
+ metric.duration_ms,
234
+ sla.target,
235
+ violationPercent,
236
+ metric.timestamp.toISOString()
237
+ ]);
238
+ // Create alert
239
+ const alert = {
240
+ id: `alert-${metricId}`,
241
+ operation: metric.operation,
242
+ level: violationPercent > 200 ? 'critical' : 'warning',
243
+ message: `SLA violation: ${metric.duration_ms}ms exceeds target of ${sla.target}ms`,
244
+ timestamp: new Date(),
245
+ metadata: {
246
+ duration_ms: metric.duration_ms,
247
+ sla_target_ms: sla.target,
248
+ violation_percent: violationPercent
249
+ }
250
+ };
251
+ await this.recordAlert(alert);
252
+ alerts.push(alert);
253
+ }
254
+ }
255
+ return alerts;
256
+ } catch (error) {
257
+ logger.error('Error recording metric:', error);
258
+ throw new StandardError(ErrorCode.DB_QUERY_FAILED, 'Failed to record performance metric', {
259
+ operation: metric.operation,
260
+ cause: error instanceof Error ? error.message : String(error)
261
+ });
262
+ }
263
+ }
264
+ /**
265
+ * Record multiple metrics in batch
266
+ */ async recordMetrics(metrics) {
267
+ for (const metric of metrics){
268
+ await this.recordMetric(metric);
269
+ }
270
+ }
271
+ /**
272
+ * Check if metric is within SLA
273
+ */ async isWithinSLA(metric) {
274
+ const sla = this.slaDefinitions.get(metric.operation);
275
+ if (!sla || !sla.enabled) {
276
+ return true; // No SLA defined, assume compliance
277
+ }
278
+ return metric.duration_ms <= sla.target;
279
+ }
280
+ /**
281
+ * Get SLA violations for an operation
282
+ */ async getSLAViolations(operation, options) {
283
+ const sqliteAdapter = this.dbService.getAdapter('sqlite');
284
+ const periodDays = this.getPeriodDays(options?.period || '1h');
285
+ const cutoffDate = new Date(Date.now() - periodDays * 24 * 60 * 60 * 1000);
286
+ const limit = options?.limit || 1000;
287
+ try {
288
+ const result = await sqliteAdapter.raw(`SELECT pm.id, pm.operation, pm.duration_ms, pm.timestamp, pm.metadata
289
+ FROM performance_metrics pm
290
+ WHERE pm.operation = ? AND pm.is_sla_violation = 1 AND pm.timestamp >= ?
291
+ ORDER BY pm.timestamp DESC
292
+ LIMIT ?`, [
293
+ operation,
294
+ cutoffDate.toISOString(),
295
+ limit
296
+ ]);
297
+ const rows = Array.isArray(result) ? result : [];
298
+ return rows.map((row)=>({
299
+ operation: row.operation,
300
+ duration_ms: row.duration_ms,
301
+ timestamp: new Date(row.timestamp),
302
+ metadata: JSON.parse(row.metadata || '{}')
303
+ }));
304
+ } catch (error) {
305
+ throw new StandardError(ErrorCode.DB_QUERY_FAILED, 'Failed to get SLA violations', {
306
+ operation,
307
+ cause: error
308
+ });
309
+ }
310
+ }
311
+ /**
312
+ * Calculate baseline metrics from historical data
313
+ */ async calculateBaseline(operation, days = 30) {
314
+ // Check cache first (5 minute TTL)
315
+ const cached = this.baselineCache.get(operation);
316
+ const lastTime = this.lastBaselineTime.get(operation) || 0;
317
+ if (cached && Date.now() - lastTime < 5 * 60 * 1000) {
318
+ return cached;
319
+ }
320
+ const sqliteAdapter = this.dbService.getAdapter('sqlite');
321
+ const startTime = Date.now();
322
+ try {
323
+ const startDate = new Date(Date.now() - days * 24 * 60 * 60 * 1000);
324
+ const result = await sqliteAdapter.raw(`SELECT
325
+ MIN(duration_ms) as min_duration,
326
+ MAX(duration_ms) as max_duration,
327
+ AVG(duration_ms) as avg_duration,
328
+ COUNT(*) as count
329
+ FROM performance_metrics
330
+ WHERE operation = ? AND timestamp >= ?`, [
331
+ operation,
332
+ startDate.toISOString()
333
+ ]);
334
+ const rows = Array.isArray(result) ? result : [];
335
+ if (rows.length === 0 || rows[0].count === 0) {
336
+ throw new StandardError(ErrorCode.DB_NOT_FOUND, `No metrics found for operation: ${operation}`, {
337
+ days
338
+ });
339
+ }
340
+ // Get percentile values
341
+ const percentiles = await this.calculatePercentiles(operation, startDate);
342
+ const baseline = {
343
+ operation,
344
+ min: rows[0].min_duration,
345
+ p50: percentiles.p50,
346
+ p95: percentiles.p95,
347
+ p99: percentiles.p99,
348
+ max: rows[0].max_duration,
349
+ avg: rows[0].avg_duration,
350
+ count: rows[0].count,
351
+ calculated_at: new Date(),
352
+ period_days: days
353
+ };
354
+ // Cache baseline
355
+ this.baselineCache.set(operation, baseline);
356
+ this.lastBaselineTime.set(operation, Date.now());
357
+ const duration = Date.now() - startTime;
358
+ if (duration > 5000) {
359
+ logger.warn(`Baseline calculation took ${duration}ms (target: <5s)`);
360
+ }
361
+ return baseline;
362
+ } catch (error) {
363
+ throw new StandardError(ErrorCode.DB_QUERY_FAILED, 'Failed to calculate baseline', {
364
+ operation,
365
+ days,
366
+ cause: error
367
+ });
368
+ }
369
+ }
370
+ /**
371
+ * Calculate percentile values
372
+ */ async calculatePercentiles(operation, startDate) {
373
+ const sqliteAdapter = this.dbService.getAdapter('sqlite');
374
+ try {
375
+ // Get all durations and sort them in application
376
+ const result = await sqliteAdapter.raw(`SELECT duration_ms
377
+ FROM performance_metrics
378
+ WHERE operation = ? AND timestamp >= ?
379
+ ORDER BY duration_ms ASC`, [
380
+ operation,
381
+ startDate.toISOString()
382
+ ]);
383
+ const rows = Array.isArray(result) ? result : [];
384
+ if (rows.length === 0) {
385
+ return {
386
+ p50: 0,
387
+ p95: 0,
388
+ p99: 0
389
+ };
390
+ }
391
+ const durations = rows.map((row)=>row.duration_ms);
392
+ durations.sort((a, b)=>a - b);
393
+ const len = durations.length;
394
+ const p50Index = Math.floor(len * 0.50);
395
+ const p95Index = Math.floor(len * 0.95);
396
+ const p99Index = Math.floor(len * 0.99);
397
+ return {
398
+ p50: durations[p50Index] || 0,
399
+ p95: durations[p95Index] || 0,
400
+ p99: durations[p99Index] || 0
401
+ };
402
+ } catch (error) {
403
+ logger.error('Error calculating percentiles:', error);
404
+ return {
405
+ p50: 0,
406
+ p95: 0,
407
+ p99: 0
408
+ };
409
+ }
410
+ }
411
+ /**
412
+ * Get SLA compliance percentage for an operation
413
+ */ async getSLACompliance(operation, period) {
414
+ const sqliteAdapter = this.dbService.getAdapter('sqlite');
415
+ const periodDays = this.getPeriodDays(period);
416
+ const cutoffDate = new Date(Date.now() - periodDays * 24 * 60 * 60 * 1000);
417
+ try {
418
+ const result = await sqliteAdapter.raw(`SELECT
419
+ COUNT(*) as total,
420
+ SUM(CASE WHEN is_sla_violation = 0 THEN 1 ELSE 0 END) as compliant
421
+ FROM performance_metrics
422
+ WHERE operation = ? AND timestamp >= ?`, [
423
+ operation,
424
+ cutoffDate.toISOString()
425
+ ]);
426
+ const rows = Array.isArray(result) ? result : [];
427
+ if (rows.length === 0) {
428
+ return 1.0; // No metrics, assume 100% compliant
429
+ }
430
+ const row = rows[0];
431
+ if (row.total === 0) {
432
+ return 1.0; // No metrics, assume 100% compliant
433
+ }
434
+ return row.compliant / row.total;
435
+ } catch (error) {
436
+ throw new StandardError(ErrorCode.DB_QUERY_FAILED, 'Failed to calculate SLA compliance', {
437
+ operation,
438
+ period,
439
+ cause: error
440
+ });
441
+ }
442
+ }
443
+ /**
444
+ * Detect performance degradation
445
+ */ async detectDegradation(operation, options) {
446
+ const threshold = options?.threshold_percent || 20;
447
+ const windowMinutes = options?.window_minutes || 5;
448
+ try {
449
+ const baseline = await this.calculateBaseline(operation, 30);
450
+ const sqliteAdapter = this.dbService.getAdapter('sqlite');
451
+ const windowStart = new Date(Date.now() - windowMinutes * 60 * 1000);
452
+ const result = await sqliteAdapter.raw(`SELECT AVG(duration_ms) as avg_duration, COUNT(*) as count
453
+ FROM performance_metrics
454
+ WHERE operation = ? AND timestamp >= ?`, [
455
+ operation,
456
+ windowStart.toISOString()
457
+ ]);
458
+ const rows = Array.isArray(result) ? result : [];
459
+ if (rows.length === 0) {
460
+ return false; // No metrics, assume no degradation
461
+ }
462
+ const row = rows[0];
463
+ if (row.count < 5) {
464
+ return false; // Need at least 5 samples
465
+ }
466
+ const degradationPercent = (row.avg_duration - baseline.p50) / baseline.p50 * 100;
467
+ return degradationPercent > threshold;
468
+ } catch (error) {
469
+ logger.error(`Failed to detect degradation for ${operation}:`, error);
470
+ return false;
471
+ }
472
+ }
473
+ /**
474
+ * Get metrics with optional filtering
475
+ */ async getMetrics(operation, options) {
476
+ const sqliteAdapter = this.dbService.getAdapter('sqlite');
477
+ const limit = options?.limit || 1000;
478
+ const offset = options?.offset || 0;
479
+ let whereClause = 'operation = ?';
480
+ const params = [
481
+ operation
482
+ ];
483
+ if (options?.period) {
484
+ const periodDays = this.getPeriodDays(options.period);
485
+ const cutoffDate = new Date(Date.now() - periodDays * 24 * 60 * 60 * 1000);
486
+ whereClause += ' AND timestamp >= ?';
487
+ params.push(cutoffDate.toISOString());
488
+ }
489
+ try {
490
+ const result = await sqliteAdapter.raw(`SELECT id, operation, duration_ms, timestamp, metadata
491
+ FROM performance_metrics
492
+ WHERE ${whereClause}
493
+ ORDER BY timestamp DESC
494
+ LIMIT ? OFFSET ?`, [
495
+ ...params,
496
+ limit,
497
+ offset
498
+ ]);
499
+ const rows = Array.isArray(result) ? result : [];
500
+ return rows.map((row)=>({
501
+ operation: row.operation,
502
+ duration_ms: row.duration_ms,
503
+ timestamp: new Date(row.timestamp),
504
+ metadata: options?.includeMetadata ? JSON.parse(row.metadata || '{}') : undefined
505
+ }));
506
+ } catch (error) {
507
+ throw new StandardError(ErrorCode.DB_QUERY_FAILED, 'Failed to get metrics', {
508
+ operation,
509
+ cause: error
510
+ });
511
+ }
512
+ }
513
+ /**
514
+ * Get compliance report for an operation
515
+ */ async getComplianceReport(operation, options) {
516
+ const period = options?.period || '1d';
517
+ const compliance = await this.getSLACompliance(operation, period);
518
+ const violations = await this.getSLAViolations(operation, {
519
+ period
520
+ });
521
+ const metrics = await this.getMetrics(operation, {
522
+ period,
523
+ limit: 10000
524
+ });
525
+ const sla = this.slaDefinitions.get(operation);
526
+ const avgDuration = metrics.length > 0 ? metrics.reduce((sum, m)=>sum + m.duration_ms, 0) / metrics.length : 0;
527
+ // Calculate percentiles
528
+ const sortedDurations = metrics.map((m)=>m.duration_ms).sort((a, b)=>a - b);
529
+ const p95Index = Math.floor(sortedDurations.length * 0.95);
530
+ const p99Index = Math.floor(sortedDurations.length * 0.99);
531
+ return {
532
+ operation,
533
+ period,
534
+ total_metrics: metrics.length,
535
+ violations_count: violations.length,
536
+ compliance_percentage: compliance * 100,
537
+ sla_target_ms: sla?.target || 0,
538
+ avg_duration_ms: avgDuration,
539
+ p95_duration_ms: sortedDurations[p95Index] || 0,
540
+ p99_duration_ms: sortedDurations[p99Index] || 0
541
+ };
542
+ }
543
+ /**
544
+ * Record an alert
545
+ */ async recordAlert(alert) {
546
+ const sqliteAdapter = this.dbService.getAdapter('sqlite');
547
+ try {
548
+ await sqliteAdapter.raw(`INSERT INTO performance_alerts (id, operation, level, message, timestamp, metadata)
549
+ VALUES (?, ?, ?, ?, ?, ?)`, [
550
+ alert.id,
551
+ alert.operation,
552
+ alert.level,
553
+ alert.message,
554
+ alert.timestamp.toISOString(),
555
+ JSON.stringify(alert.metadata || {})
556
+ ]);
557
+ } catch (error) {
558
+ throw new StandardError(ErrorCode.DB_QUERY_FAILED, 'Failed to record alert', {
559
+ operation: alert.operation,
560
+ cause: error
561
+ });
562
+ }
563
+ }
564
+ /**
565
+ * Get alerts for an operation
566
+ */ async getAlerts(operation, options) {
567
+ const sqliteAdapter = this.dbService.getAdapter('sqlite');
568
+ let whereClauses = [
569
+ 'operation = ?'
570
+ ];
571
+ const params = [
572
+ operation
573
+ ];
574
+ if (options?.activeOnly) {
575
+ whereClauses.push('resolved_at IS NULL');
576
+ }
577
+ if (options?.minSeverity) {
578
+ const severities = [
579
+ 'info',
580
+ 'warning',
581
+ 'critical'
582
+ ];
583
+ const minIndex = severities.indexOf(options.minSeverity);
584
+ const validSeverities = severities.slice(minIndex).map(()=>'?').join(',');
585
+ whereClauses.push(`level IN (${validSeverities})`);
586
+ params.push(...severities.slice(minIndex));
587
+ }
588
+ const whereClause = whereClauses.join(' AND ');
589
+ const limit = options?.limit || 1000;
590
+ try {
591
+ const result = await sqliteAdapter.raw(`SELECT id, operation, level, message, timestamp, resolved_at, resolved_reason, metadata
592
+ FROM performance_alerts
593
+ WHERE ${whereClause}
594
+ ORDER BY timestamp DESC
595
+ LIMIT ?`, [
596
+ ...params,
597
+ limit
598
+ ]);
599
+ const rows = Array.isArray(result) ? result : [];
600
+ return rows.map((row)=>({
601
+ id: row.id,
602
+ operation: row.operation,
603
+ level: row.level,
604
+ message: row.message,
605
+ timestamp: new Date(row.timestamp),
606
+ resolved_at: row.resolved_at ? new Date(row.resolved_at) : undefined,
607
+ resolved_reason: row.resolved_reason,
608
+ metadata: JSON.parse(row.metadata || '{}')
609
+ }));
610
+ } catch (error) {
611
+ throw new StandardError(ErrorCode.DB_QUERY_FAILED, 'Failed to get alerts', {
612
+ operation,
613
+ cause: error
614
+ });
615
+ }
616
+ }
617
+ /**
618
+ * Resolve an alert
619
+ */ async resolveAlert(alertId, reason) {
620
+ const sqliteAdapter = this.dbService.getAdapter('sqlite');
621
+ try {
622
+ await sqliteAdapter.raw(`UPDATE performance_alerts
623
+ SET resolved_at = ?, resolved_reason = ?
624
+ WHERE id = ?`, [
625
+ new Date().toISOString(),
626
+ reason,
627
+ alertId
628
+ ]);
629
+ } catch (error) {
630
+ throw new StandardError(ErrorCode.DB_QUERY_FAILED, 'Failed to resolve alert', {
631
+ alertId,
632
+ cause: error
633
+ });
634
+ }
635
+ }
636
+ /**
637
+ * Get dashboard metrics
638
+ */ async getDashboardMetrics(options) {
639
+ const period = options?.time_range || '24h';
640
+ const periodDays = this.getPeriodDays(period);
641
+ const cutoffDate = new Date(Date.now() - periodDays * 24 * 60 * 60 * 1000);
642
+ const sqliteAdapter = this.dbService.getAdapter('sqlite');
643
+ try {
644
+ const result = await sqliteAdapter.raw(`SELECT operation, duration_ms, timestamp, is_sla_violation
645
+ FROM performance_metrics
646
+ WHERE timestamp >= ?
647
+ ORDER BY timestamp`, [
648
+ cutoffDate.toISOString()
649
+ ]);
650
+ const rows = Array.isArray(result) ? result : [];
651
+ const metrics = rows.map((row)=>({
652
+ operation: row.operation,
653
+ timestamp: new Date(row.timestamp),
654
+ duration_ms: row.duration_ms,
655
+ is_violation: row.is_sla_violation === 1
656
+ }));
657
+ const timestamps = [
658
+ ...new Set(metrics.map((m)=>m.timestamp.toISOString()))
659
+ ].sort().map((t)=>new Date(t));
660
+ // Calculate compliance rates per operation
661
+ const complianceRates = {};
662
+ const operations = [
663
+ ...new Set(metrics.map((m)=>m.operation))
664
+ ];
665
+ for (const op of operations){
666
+ complianceRates[op] = await this.getSLACompliance(op, period);
667
+ }
668
+ // Get active alerts
669
+ const allAlerts = await Promise.all(operations.map((op)=>this.getAlerts(op, {
670
+ activeOnly: true
671
+ })));
672
+ const activeAlerts = allAlerts.flat();
673
+ return {
674
+ metrics,
675
+ timestamps,
676
+ compliance_rates: complianceRates,
677
+ active_alerts: activeAlerts
678
+ };
679
+ } catch (error) {
680
+ throw new StandardError(ErrorCode.DB_QUERY_FAILED, 'Failed to get dashboard metrics', {
681
+ cause: error
682
+ });
683
+ }
684
+ }
685
+ /**
686
+ * Get SLA trends over time
687
+ */ async getSLATrends(operation, options) {
688
+ const period = options?.period || '7d';
689
+ const periodDays = this.getPeriodDays(period);
690
+ const cutoffDate = new Date(Date.now() - periodDays * 24 * 60 * 60 * 1000);
691
+ const sqliteAdapter = this.dbService.getAdapter('sqlite');
692
+ try {
693
+ const result = await sqliteAdapter.raw(`SELECT
694
+ DATE(timestamp) as date,
695
+ COUNT(*) as total,
696
+ SUM(CASE WHEN is_sla_violation = 0 THEN 1 ELSE 0 END) as compliant,
697
+ AVG(duration_ms) as avg_duration,
698
+ SUM(CASE WHEN is_sla_violation = 1 THEN 1 ELSE 0 END) as violations
699
+ FROM performance_metrics
700
+ WHERE operation = ? AND timestamp >= ?
701
+ GROUP BY DATE(timestamp)
702
+ ORDER BY date ASC`, [
703
+ operation,
704
+ cutoffDate.toISOString()
705
+ ]);
706
+ const rows = Array.isArray(result) ? result : [];
707
+ return rows.map((row)=>({
708
+ date: new Date(row.date),
709
+ compliance: row.compliant && row.total ? row.compliant / row.total : 1.0,
710
+ avg_duration_ms: row.avg_duration || 0,
711
+ violations_count: row.violations || 0
712
+ }));
713
+ } catch (error) {
714
+ throw new StandardError(ErrorCode.DB_QUERY_FAILED, 'Failed to get SLA trends', {
715
+ operation,
716
+ cause: error
717
+ });
718
+ }
719
+ }
720
+ /**
721
+ * Forecast future performance
722
+ */ async forecastPerformance(operation, options) {
723
+ const daysAhead = options?.days_ahead || 7;
724
+ try {
725
+ const baseline = await this.calculateBaseline(operation, 30);
726
+ const trends = await this.getSLATrends(operation, {
727
+ period: '7d',
728
+ interval: '1d'
729
+ });
730
+ // Simple trend analysis
731
+ let trend = 'stable';
732
+ if (trends.length >= 2) {
733
+ const recentAvg = trends.slice(-3).reduce((sum, t)=>sum + t.avg_duration_ms, 0) / 3;
734
+ const olderAvg = trends.slice(0, 3).reduce((sum, t)=>sum + t.avg_duration_ms, 0) / 3;
735
+ if (recentAvg < olderAvg * 0.95) {
736
+ trend = 'improving';
737
+ } else if (recentAvg > olderAvg * 1.05) {
738
+ trend = 'degrading';
739
+ }
740
+ }
741
+ // Calculate confidence interval
742
+ const stdDev = this.calculateStdDev(trends.map((t)=>t.avg_duration_ms));
743
+ const margin = 1.96 * (stdDev / Math.sqrt(trends.length)); // 95% CI
744
+ return {
745
+ operation,
746
+ forecasted_duration_ms: baseline.p50,
747
+ confidence_interval_lower: Math.max(baseline.p50 - margin, 0),
748
+ confidence_interval_upper: baseline.p50 + margin,
749
+ trend,
750
+ forecast_date: new Date(Date.now() + daysAhead * 24 * 60 * 60 * 1000)
751
+ };
752
+ } catch (error) {
753
+ throw new StandardError(ErrorCode.DB_QUERY_FAILED, 'Failed to forecast performance', {
754
+ operation,
755
+ cause: error
756
+ });
757
+ }
758
+ }
759
+ /**
760
+ * Get SLA definitions
761
+ */ async getSLADefinitions() {
762
+ const result = {};
763
+ for (const [op, sla] of this.slaDefinitions.entries()){
764
+ result[op] = sla;
765
+ }
766
+ return result;
767
+ }
768
+ /**
769
+ * Get SLA definition for an operation
770
+ */ async getSLADefinition(operation) {
771
+ return this.slaDefinitions.get(operation);
772
+ }
773
+ /**
774
+ * Validate performance metric
775
+ */ validateMetric(metric) {
776
+ if (!metric.operation) {
777
+ throw new StandardError(ErrorCode.VALIDATION_FAILED, 'Metric operation is required');
778
+ }
779
+ if (typeof metric.duration_ms !== 'number' || metric.duration_ms < 0) {
780
+ throw new StandardError(ErrorCode.VALIDATION_FAILED, 'Metric duration_ms must be a non-negative number');
781
+ }
782
+ if (!metric.timestamp) {
783
+ throw new StandardError(ErrorCode.VALIDATION_FAILED, 'Metric timestamp is required');
784
+ }
785
+ }
786
+ /**
787
+ * Get period duration in days
788
+ */ getPeriodDays(period) {
789
+ const match = period.match(/^(\d+)([hmd])$/);
790
+ if (!match) {
791
+ return 1;
792
+ }
793
+ const [, value, unit] = match;
794
+ const unitMap = {
795
+ h: 1 / 24,
796
+ m: 1 / (24 * 60),
797
+ d: 1
798
+ };
799
+ return parseInt(value) * unitMap[unit];
800
+ }
801
+ /**
802
+ * Calculate standard deviation
803
+ */ calculateStdDev(values) {
804
+ if (values.length === 0) return 0;
805
+ const mean = values.reduce((a, b)=>a + b) / values.length;
806
+ const variance = values.reduce((sum, val)=>sum + Math.pow(val - mean, 2), 0) / values.length;
807
+ return Math.sqrt(variance);
808
+ }
809
+ }
810
+
811
+ //# sourceMappingURL=performance-monitor.js.map