@newrelic/preflight 0.0.1-pre.1 → 1.0.0
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.
- package/LICENSE +183 -0
- package/README.md +498 -0
- package/dist/alerts/alert-log.d.ts +24 -0
- package/dist/alerts/alert-log.d.ts.map +1 -0
- package/dist/alerts/alert-log.js +159 -0
- package/dist/alerts/alert-log.js.map +1 -0
- package/dist/alerts/alert-snapshot-collector.d.ts +168 -0
- package/dist/alerts/alert-snapshot-collector.d.ts.map +1 -0
- package/dist/alerts/alert-snapshot-collector.js +243 -0
- package/dist/alerts/alert-snapshot-collector.js.map +1 -0
- package/dist/alerts/local-alert-engine.d.ts +86 -0
- package/dist/alerts/local-alert-engine.d.ts.map +1 -0
- package/dist/alerts/local-alert-engine.js +466 -0
- package/dist/alerts/local-alert-engine.js.map +1 -0
- package/dist/alerts/local-alert-rule.d.ts +439 -0
- package/dist/alerts/local-alert-rule.d.ts.map +1 -0
- package/dist/alerts/local-alert-rule.js +139 -0
- package/dist/alerts/local-alert-rule.js.map +1 -0
- package/dist/alerts/os-notifier.d.ts +39 -0
- package/dist/alerts/os-notifier.d.ts.map +1 -0
- package/dist/alerts/os-notifier.js +170 -0
- package/dist/alerts/os-notifier.js.map +1 -0
- package/dist/alerts/types.d.ts +35 -0
- package/dist/alerts/types.d.ts.map +1 -0
- package/dist/alerts/types.js +8 -0
- package/dist/alerts/types.js.map +1 -0
- package/dist/config.d.ts +169 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +860 -0
- package/dist/config.js.map +1 -0
- package/dist/dashboard/dashboard-server.d.ts +38 -0
- package/dist/dashboard/dashboard-server.d.ts.map +1 -0
- package/dist/dashboard/dashboard-server.js +207 -0
- package/dist/dashboard/dashboard-server.js.map +1 -0
- package/dist/dashboard/index.d.ts +3 -0
- package/dist/dashboard/index.d.ts.map +1 -0
- package/dist/dashboard/index.js +2 -0
- package/dist/dashboard/index.js.map +1 -0
- package/dist/dashboard/live-event-bus.d.ts +99 -0
- package/dist/dashboard/live-event-bus.d.ts.map +1 -0
- package/dist/dashboard/live-event-bus.js +56 -0
- package/dist/dashboard/live-event-bus.js.map +1 -0
- package/dist/dashboard/routes/api-handler.d.ts +122 -0
- package/dist/dashboard/routes/api-handler.d.ts.map +1 -0
- package/dist/dashboard/routes/api-handler.js +1414 -0
- package/dist/dashboard/routes/api-handler.js.map +1 -0
- package/dist/dashboard/routes/replay-analyzer.d.ts +15 -0
- package/dist/dashboard/routes/replay-analyzer.d.ts.map +1 -0
- package/dist/dashboard/routes/replay-analyzer.js +227 -0
- package/dist/dashboard/routes/replay-analyzer.js.map +1 -0
- package/dist/dashboard/routes/sse-handler.d.ts +4 -0
- package/dist/dashboard/routes/sse-handler.d.ts.map +1 -0
- package/dist/dashboard/routes/sse-handler.js +122 -0
- package/dist/dashboard/routes/sse-handler.js.map +1 -0
- package/dist/dashboard/routes/static-handler.d.ts +3 -0
- package/dist/dashboard/routes/static-handler.d.ts.map +1 -0
- package/dist/dashboard/routes/static-handler.js +103 -0
- package/dist/dashboard/routes/static-handler.js.map +1 -0
- package/dist/data/alerts/conditions/01-daily-cost-spike.json +16 -0
- package/dist/data/alerts/conditions/02-low-efficiency-score.json +16 -0
- package/dist/data/alerts/conditions/03-stuck-loop-rate.json +16 -0
- package/dist/data/alerts/conditions/04-anti-pattern-rate.json +16 -0
- package/dist/data/alerts/conditions/05-session-cost-budget.json +16 -0
- package/dist/data/alerts/conditions-personal/01-personal-daily-cost.json +16 -0
- package/dist/data/alerts/conditions-personal/02-personal-session-cost.json +16 -0
- package/dist/data/alerts/conditions-personal/03-personal-low-efficiency.json +16 -0
- package/dist/data/alerts/conditions-personal/04-personal-anti-pattern-rate.json +16 -0
- package/dist/data/alerts/conditions-personal/05-personal-stuck-loop.json +16 -0
- package/dist/data/alerts/policy.json +4 -0
- package/dist/data/dashboards/ai-coding-assistant-manager-view.json +103 -0
- package/dist/data/dashboards/ai-coding-assistant-overview.json +239 -0
- package/dist/data/dashboards/ai-coding-assistant-personal.json +442 -0
- package/dist/data/dashboards/ai-coding-assistant-platform-comparison.json +320 -0
- package/dist/data/dashboards/ai-coding-assistant-security.json +275 -0
- package/dist/data/dashboards/ai-coding-assistant-session-detail.json +296 -0
- package/dist/data/dashboards/ai-coding-assistant-team-view.json +345 -0
- package/dist/deploy/data-paths.d.ts +22 -0
- package/dist/deploy/data-paths.d.ts.map +1 -0
- package/dist/deploy/data-paths.js +69 -0
- package/dist/deploy/data-paths.js.map +1 -0
- package/dist/deploy/deploy-alerts.d.ts +58 -0
- package/dist/deploy/deploy-alerts.d.ts.map +1 -0
- package/dist/deploy/deploy-alerts.js +371 -0
- package/dist/deploy/deploy-alerts.js.map +1 -0
- package/dist/deploy/deploy-dashboards.d.ts +92 -0
- package/dist/deploy/deploy-dashboards.d.ts.map +1 -0
- package/dist/deploy/deploy-dashboards.js +282 -0
- package/dist/deploy/deploy-dashboards.js.map +1 -0
- package/dist/digest/digest-formatter.d.ts +3 -0
- package/dist/digest/digest-formatter.d.ts.map +1 -0
- package/dist/digest/digest-formatter.js +37 -0
- package/dist/digest/digest-formatter.js.map +1 -0
- package/dist/digest/digest-sender.d.ts +2 -0
- package/dist/digest/digest-sender.d.ts.map +1 -0
- package/dist/digest/digest-sender.js +29 -0
- package/dist/digest/digest-sender.js.map +1 -0
- package/dist/hooks/bash-classifier.d.ts +26 -0
- package/dist/hooks/bash-classifier.d.ts.map +1 -0
- package/dist/hooks/bash-classifier.js +409 -0
- package/dist/hooks/bash-classifier.js.map +1 -0
- package/dist/hooks/collector-script.d.ts +47 -0
- package/dist/hooks/collector-script.d.ts.map +1 -0
- package/dist/hooks/collector-script.js +662 -0
- package/dist/hooks/collector-script.js.map +1 -0
- package/dist/hooks/event-processor.d.ts +65 -0
- package/dist/hooks/event-processor.d.ts.map +1 -0
- package/dist/hooks/event-processor.js +342 -0
- package/dist/hooks/event-processor.js.map +1 -0
- package/dist/hooks/index.d.ts +7 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +5 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/session-resolver.d.ts +66 -0
- package/dist/hooks/session-resolver.d.ts.map +1 -0
- package/dist/hooks/session-resolver.js +196 -0
- package/dist/hooks/session-resolver.js.map +1 -0
- package/dist/hooks/tool-parsers.d.ts +19 -0
- package/dist/hooks/tool-parsers.d.ts.map +1 -0
- package/dist/hooks/tool-parsers.js +260 -0
- package/dist/hooks/tool-parsers.js.map +1 -0
- package/dist/index.d.ts +107 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1505 -0
- package/dist/index.js.map +1 -0
- package/dist/install/cli.d.ts +11 -0
- package/dist/install/cli.d.ts.map +1 -0
- package/dist/install/cli.js +365 -0
- package/dist/install/cli.js.map +1 -0
- package/dist/install/index.d.ts +4 -0
- package/dist/install/index.d.ts.map +1 -0
- package/dist/install/index.js +3 -0
- package/dist/install/index.js.map +1 -0
- package/dist/install/install-helper.d.ts +35 -0
- package/dist/install/install-helper.d.ts.map +1 -0
- package/dist/install/install-helper.js +227 -0
- package/dist/install/install-helper.js.map +1 -0
- package/dist/install/key-validator.d.ts +19 -0
- package/dist/install/key-validator.d.ts.map +1 -0
- package/dist/install/key-validator.js +122 -0
- package/dist/install/key-validator.js.map +1 -0
- package/dist/install/migrate.d.ts +12 -0
- package/dist/install/migrate.d.ts.map +1 -0
- package/dist/install/migrate.js +115 -0
- package/dist/install/migrate.js.map +1 -0
- package/dist/install/schedule.d.ts +11 -0
- package/dist/install/schedule.d.ts.map +1 -0
- package/dist/install/schedule.js +114 -0
- package/dist/install/schedule.js.map +1 -0
- package/dist/install/setup-wizard.d.ts +40 -0
- package/dist/install/setup-wizard.d.ts.map +1 -0
- package/dist/install/setup-wizard.js +489 -0
- package/dist/install/setup-wizard.js.map +1 -0
- package/dist/lib/date.d.ts +54 -0
- package/dist/lib/date.d.ts.map +1 -0
- package/dist/lib/date.js +85 -0
- package/dist/lib/date.js.map +1 -0
- package/dist/metrics/anti-patterns.d.ts +62 -0
- package/dist/metrics/anti-patterns.d.ts.map +1 -0
- package/dist/metrics/anti-patterns.js +301 -0
- package/dist/metrics/anti-patterns.js.map +1 -0
- package/dist/metrics/api-failure-tracker.d.ts +82 -0
- package/dist/metrics/api-failure-tracker.d.ts.map +1 -0
- package/dist/metrics/api-failure-tracker.js +202 -0
- package/dist/metrics/api-failure-tracker.js.map +1 -0
- package/dist/metrics/budget-tracker.d.ts +60 -0
- package/dist/metrics/budget-tracker.d.ts.map +1 -0
- package/dist/metrics/budget-tracker.js +130 -0
- package/dist/metrics/budget-tracker.js.map +1 -0
- package/dist/metrics/claudemd-tracker.d.ts +108 -0
- package/dist/metrics/claudemd-tracker.d.ts.map +1 -0
- package/dist/metrics/claudemd-tracker.js +337 -0
- package/dist/metrics/claudemd-tracker.js.map +1 -0
- package/dist/metrics/collaboration-profile.d.ts +65 -0
- package/dist/metrics/collaboration-profile.d.ts.map +1 -0
- package/dist/metrics/collaboration-profile.js +231 -0
- package/dist/metrics/collaboration-profile.js.map +1 -0
- package/dist/metrics/context-composition-tracker.d.ts +74 -0
- package/dist/metrics/context-composition-tracker.d.ts.map +1 -0
- package/dist/metrics/context-composition-tracker.js +202 -0
- package/dist/metrics/context-composition-tracker.js.map +1 -0
- package/dist/metrics/context-tracker.d.ts +78 -0
- package/dist/metrics/context-tracker.d.ts.map +1 -0
- package/dist/metrics/context-tracker.js +222 -0
- package/dist/metrics/context-tracker.js.map +1 -0
- package/dist/metrics/context-window-tracker.d.ts +18 -0
- package/dist/metrics/context-window-tracker.d.ts.map +1 -0
- package/dist/metrics/context-window-tracker.js +35 -0
- package/dist/metrics/context-window-tracker.js.map +1 -0
- package/dist/metrics/cost-forecast.d.ts +36 -0
- package/dist/metrics/cost-forecast.d.ts.map +1 -0
- package/dist/metrics/cost-forecast.js +91 -0
- package/dist/metrics/cost-forecast.js.map +1 -0
- package/dist/metrics/cost-per-outcome.d.ts +102 -0
- package/dist/metrics/cost-per-outcome.d.ts.map +1 -0
- package/dist/metrics/cost-per-outcome.js +266 -0
- package/dist/metrics/cost-per-outcome.js.map +1 -0
- package/dist/metrics/cost-tracker.d.ts +78 -0
- package/dist/metrics/cost-tracker.d.ts.map +1 -0
- package/dist/metrics/cost-tracker.js +169 -0
- package/dist/metrics/cost-tracker.js.map +1 -0
- package/dist/metrics/decision-tracker.d.ts +49 -0
- package/dist/metrics/decision-tracker.d.ts.map +1 -0
- package/dist/metrics/decision-tracker.js +161 -0
- package/dist/metrics/decision-tracker.js.map +1 -0
- package/dist/metrics/efficiency-score.d.ts +80 -0
- package/dist/metrics/efficiency-score.d.ts.map +1 -0
- package/dist/metrics/efficiency-score.js +219 -0
- package/dist/metrics/efficiency-score.js.map +1 -0
- package/dist/metrics/git-efficiency-tracker.d.ts +165 -0
- package/dist/metrics/git-efficiency-tracker.d.ts.map +1 -0
- package/dist/metrics/git-efficiency-tracker.js +1056 -0
- package/dist/metrics/git-efficiency-tracker.js.map +1 -0
- package/dist/metrics/index.d.ts +26 -0
- package/dist/metrics/index.d.ts.map +1 -0
- package/dist/metrics/index.js +14 -0
- package/dist/metrics/index.js.map +1 -0
- package/dist/metrics/instruction-drift-tracker.d.ts +69 -0
- package/dist/metrics/instruction-drift-tracker.d.ts.map +1 -0
- package/dist/metrics/instruction-drift-tracker.js +213 -0
- package/dist/metrics/instruction-drift-tracker.js.map +1 -0
- package/dist/metrics/latency-decomposition.d.ts +50 -0
- package/dist/metrics/latency-decomposition.d.ts.map +1 -0
- package/dist/metrics/latency-decomposition.js +112 -0
- package/dist/metrics/latency-decomposition.js.map +1 -0
- package/dist/metrics/latency-tracker.d.ts +33 -0
- package/dist/metrics/latency-tracker.d.ts.map +1 -0
- package/dist/metrics/latency-tracker.js +93 -0
- package/dist/metrics/latency-tracker.js.map +1 -0
- package/dist/metrics/live-session-registry.d.ts +29 -0
- package/dist/metrics/live-session-registry.d.ts.map +1 -0
- package/dist/metrics/live-session-registry.js +103 -0
- package/dist/metrics/live-session-registry.js.map +1 -0
- package/dist/metrics/model-usage-tracker.d.ts +21 -0
- package/dist/metrics/model-usage-tracker.d.ts.map +1 -0
- package/dist/metrics/model-usage-tracker.js +53 -0
- package/dist/metrics/model-usage-tracker.js.map +1 -0
- package/dist/metrics/percentile.d.ts +5 -0
- package/dist/metrics/percentile.d.ts.map +1 -0
- package/dist/metrics/percentile.js +10 -0
- package/dist/metrics/percentile.js.map +1 -0
- package/dist/metrics/personal-coach.d.ts +47 -0
- package/dist/metrics/personal-coach.d.ts.map +1 -0
- package/dist/metrics/personal-coach.js +241 -0
- package/dist/metrics/personal-coach.js.map +1 -0
- package/dist/metrics/prompt-feedback.d.ts +75 -0
- package/dist/metrics/prompt-feedback.d.ts.map +1 -0
- package/dist/metrics/prompt-feedback.js +286 -0
- package/dist/metrics/prompt-feedback.js.map +1 -0
- package/dist/metrics/proxy-metrics.d.ts +54 -0
- package/dist/metrics/proxy-metrics.d.ts.map +1 -0
- package/dist/metrics/proxy-metrics.js +228 -0
- package/dist/metrics/proxy-metrics.js.map +1 -0
- package/dist/metrics/quality-proxy-tracker.d.ts +51 -0
- package/dist/metrics/quality-proxy-tracker.d.ts.map +1 -0
- package/dist/metrics/quality-proxy-tracker.js +162 -0
- package/dist/metrics/quality-proxy-tracker.js.map +1 -0
- package/dist/metrics/recommendation-engine.d.ts +72 -0
- package/dist/metrics/recommendation-engine.d.ts.map +1 -0
- package/dist/metrics/recommendation-engine.js +207 -0
- package/dist/metrics/recommendation-engine.js.map +1 -0
- package/dist/metrics/retry-detector.d.ts +43 -0
- package/dist/metrics/retry-detector.d.ts.map +1 -0
- package/dist/metrics/retry-detector.js +179 -0
- package/dist/metrics/retry-detector.js.map +1 -0
- package/dist/metrics/session-tracker.d.ts +75 -0
- package/dist/metrics/session-tracker.d.ts.map +1 -0
- package/dist/metrics/session-tracker.js +249 -0
- package/dist/metrics/session-tracker.js.map +1 -0
- package/dist/metrics/task-completion-tracker.d.ts +15 -0
- package/dist/metrics/task-completion-tracker.d.ts.map +1 -0
- package/dist/metrics/task-completion-tracker.js +27 -0
- package/dist/metrics/task-completion-tracker.js.map +1 -0
- package/dist/metrics/task-detector.d.ts +84 -0
- package/dist/metrics/task-detector.d.ts.map +1 -0
- package/dist/metrics/task-detector.js +302 -0
- package/dist/metrics/task-detector.js.map +1 -0
- package/dist/metrics/tool-selection-scorer.d.ts +39 -0
- package/dist/metrics/tool-selection-scorer.d.ts.map +1 -0
- package/dist/metrics/tool-selection-scorer.js +193 -0
- package/dist/metrics/tool-selection-scorer.js.map +1 -0
- package/dist/metrics/trend-analyzer.d.ts +92 -0
- package/dist/metrics/trend-analyzer.d.ts.map +1 -0
- package/dist/metrics/trend-analyzer.js +293 -0
- package/dist/metrics/trend-analyzer.js.map +1 -0
- package/dist/metrics/turn-cost-attributor.d.ts +41 -0
- package/dist/metrics/turn-cost-attributor.d.ts.map +1 -0
- package/dist/metrics/turn-cost-attributor.js +118 -0
- package/dist/metrics/turn-cost-attributor.js.map +1 -0
- package/dist/metrics/turn-tracker.d.ts +49 -0
- package/dist/metrics/turn-tracker.d.ts.map +1 -0
- package/dist/metrics/turn-tracker.js +192 -0
- package/dist/metrics/turn-tracker.js.map +1 -0
- package/dist/platforms/amazon-q-adapter.d.ts +10 -0
- package/dist/platforms/amazon-q-adapter.d.ts.map +1 -0
- package/dist/platforms/amazon-q-adapter.js +75 -0
- package/dist/platforms/amazon-q-adapter.js.map +1 -0
- package/dist/platforms/claude-code-adapter.d.ts +10 -0
- package/dist/platforms/claude-code-adapter.d.ts.map +1 -0
- package/dist/platforms/claude-code-adapter.js +48 -0
- package/dist/platforms/claude-code-adapter.js.map +1 -0
- package/dist/platforms/continue-adapter.d.ts +10 -0
- package/dist/platforms/continue-adapter.d.ts.map +1 -0
- package/dist/platforms/continue-adapter.js +73 -0
- package/dist/platforms/continue-adapter.js.map +1 -0
- package/dist/platforms/copilot-adapter.d.ts +37 -0
- package/dist/platforms/copilot-adapter.d.ts.map +1 -0
- package/dist/platforms/copilot-adapter.js +66 -0
- package/dist/platforms/copilot-adapter.js.map +1 -0
- package/dist/platforms/cursor-adapter.d.ts +10 -0
- package/dist/platforms/cursor-adapter.d.ts.map +1 -0
- package/dist/platforms/cursor-adapter.js +60 -0
- package/dist/platforms/cursor-adapter.js.map +1 -0
- package/dist/platforms/generic-mcp-adapter.d.ts +113 -0
- package/dist/platforms/generic-mcp-adapter.d.ts.map +1 -0
- package/dist/platforms/generic-mcp-adapter.js +139 -0
- package/dist/platforms/generic-mcp-adapter.js.map +1 -0
- package/dist/platforms/index.d.ts +15 -0
- package/dist/platforms/index.d.ts.map +1 -0
- package/dist/platforms/index.js +12 -0
- package/dist/platforms/index.js.map +1 -0
- package/dist/platforms/platform-registry.d.ts +11 -0
- package/dist/platforms/platform-registry.d.ts.map +1 -0
- package/dist/platforms/platform-registry.js +54 -0
- package/dist/platforms/platform-registry.js.map +1 -0
- package/dist/platforms/types.d.ts +36 -0
- package/dist/platforms/types.d.ts.map +1 -0
- package/dist/platforms/types.js +2 -0
- package/dist/platforms/types.js.map +1 -0
- package/dist/platforms/windsurf-adapter.d.ts +10 -0
- package/dist/platforms/windsurf-adapter.d.ts.map +1 -0
- package/dist/platforms/windsurf-adapter.js +63 -0
- package/dist/platforms/windsurf-adapter.js.map +1 -0
- package/dist/platforms/zed-adapter.d.ts +10 -0
- package/dist/platforms/zed-adapter.d.ts.map +1 -0
- package/dist/platforms/zed-adapter.js +72 -0
- package/dist/platforms/zed-adapter.js.map +1 -0
- package/dist/proxy/index.d.ts +7 -0
- package/dist/proxy/index.d.ts.map +1 -0
- package/dist/proxy/index.js +5 -0
- package/dist/proxy/index.js.map +1 -0
- package/dist/proxy/otlp-receiver.d.ts +28 -0
- package/dist/proxy/otlp-receiver.d.ts.map +1 -0
- package/dist/proxy/otlp-receiver.js +319 -0
- package/dist/proxy/otlp-receiver.js.map +1 -0
- package/dist/proxy/proxy-manager.d.ts +47 -0
- package/dist/proxy/proxy-manager.d.ts.map +1 -0
- package/dist/proxy/proxy-manager.js +338 -0
- package/dist/proxy/proxy-manager.js.map +1 -0
- package/dist/proxy/types.d.ts +72 -0
- package/dist/proxy/types.d.ts.map +1 -0
- package/dist/proxy/types.js +33 -0
- package/dist/proxy/types.js.map +1 -0
- package/dist/proxy/upstream-http.d.ts +26 -0
- package/dist/proxy/upstream-http.d.ts.map +1 -0
- package/dist/proxy/upstream-http.js +209 -0
- package/dist/proxy/upstream-http.js.map +1 -0
- package/dist/proxy/upstream-stdio.d.ts +25 -0
- package/dist/proxy/upstream-stdio.d.ts.map +1 -0
- package/dist/proxy/upstream-stdio.js +256 -0
- package/dist/proxy/upstream-stdio.js.map +1 -0
- package/dist/security/audit-trail.d.ts +74 -0
- package/dist/security/audit-trail.d.ts.map +1 -0
- package/dist/security/audit-trail.js +338 -0
- package/dist/security/audit-trail.js.map +1 -0
- package/dist/security/index.d.ts +5 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +4 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/ssrf.d.ts +2 -0
- package/dist/security/ssrf.d.ts.map +1 -0
- package/dist/security/ssrf.js +126 -0
- package/dist/security/ssrf.js.map +1 -0
- package/dist/server.d.ts +14 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +117 -0
- package/dist/server.js.map +1 -0
- package/dist/shared/__test-utils__/log-output.d.ts +49 -0
- package/dist/shared/__test-utils__/log-output.d.ts.map +1 -0
- package/dist/shared/__test-utils__/log-output.js +38 -0
- package/dist/shared/__test-utils__/log-output.js.map +1 -0
- package/dist/shared/config.d.ts +56 -0
- package/dist/shared/config.d.ts.map +1 -0
- package/dist/shared/config.js +290 -0
- package/dist/shared/config.js.map +1 -0
- package/dist/shared/errors.d.ts +139 -0
- package/dist/shared/errors.d.ts.map +1 -0
- package/dist/shared/errors.js +406 -0
- package/dist/shared/errors.js.map +1 -0
- package/dist/shared/events/factory.d.ts +143 -0
- package/dist/shared/events/factory.d.ts.map +1 -0
- package/dist/shared/events/factory.js +351 -0
- package/dist/shared/events/factory.js.map +1 -0
- package/dist/shared/events/index.d.ts +6 -0
- package/dist/shared/events/index.d.ts.map +1 -0
- package/dist/shared/events/index.js +3 -0
- package/dist/shared/events/index.js.map +1 -0
- package/dist/shared/events/serialize.d.ts +87 -0
- package/dist/shared/events/serialize.d.ts.map +1 -0
- package/dist/shared/events/serialize.js +510 -0
- package/dist/shared/events/serialize.js.map +1 -0
- package/dist/shared/events/types.d.ts +139 -0
- package/dist/shared/events/types.d.ts.map +1 -0
- package/dist/shared/events/types.js +2 -0
- package/dist/shared/events/types.js.map +1 -0
- package/dist/shared/harvest/event-buffer.d.ts +59 -0
- package/dist/shared/harvest/event-buffer.d.ts.map +1 -0
- package/dist/shared/harvest/event-buffer.js +100 -0
- package/dist/shared/harvest/event-buffer.js.map +1 -0
- package/dist/shared/harvest/harvest-scheduler.d.ts +200 -0
- package/dist/shared/harvest/harvest-scheduler.d.ts.map +1 -0
- package/dist/shared/harvest/harvest-scheduler.js +647 -0
- package/dist/shared/harvest/harvest-scheduler.js.map +1 -0
- package/dist/shared/harvest/index.d.ts +7 -0
- package/dist/shared/harvest/index.d.ts.map +1 -0
- package/dist/shared/harvest/index.js +4 -0
- package/dist/shared/harvest/index.js.map +1 -0
- package/dist/shared/harvest/metric-aggregator.d.ts +115 -0
- package/dist/shared/harvest/metric-aggregator.d.ts.map +1 -0
- package/dist/shared/harvest/metric-aggregator.js +247 -0
- package/dist/shared/harvest/metric-aggregator.js.map +1 -0
- package/dist/shared/index.d.ts +22 -0
- package/dist/shared/index.d.ts.map +1 -0
- package/dist/shared/index.js +13 -0
- package/dist/shared/index.js.map +1 -0
- package/dist/shared/logger.d.ts +57 -0
- package/dist/shared/logger.d.ts.map +1 -0
- package/dist/shared/logger.js +166 -0
- package/dist/shared/logger.js.map +1 -0
- package/dist/shared/pricing-data.d.ts +4 -0
- package/dist/shared/pricing-data.d.ts.map +1 -0
- package/dist/shared/pricing-data.js +473 -0
- package/dist/shared/pricing-data.js.map +1 -0
- package/dist/shared/pricing.d.ts +148 -0
- package/dist/shared/pricing.d.ts.map +1 -0
- package/dist/shared/pricing.js +528 -0
- package/dist/shared/pricing.js.map +1 -0
- package/dist/shared/redact.d.ts +33 -0
- package/dist/shared/redact.d.ts.map +1 -0
- package/dist/shared/redact.js +110 -0
- package/dist/shared/redact.js.map +1 -0
- package/dist/shared/timing.d.ts +96 -0
- package/dist/shared/timing.d.ts.map +1 -0
- package/dist/shared/timing.js +173 -0
- package/dist/shared/timing.js.map +1 -0
- package/dist/shared/tokens.d.ts +145 -0
- package/dist/shared/tokens.d.ts.map +1 -0
- package/dist/shared/tokens.js +492 -0
- package/dist/shared/tokens.js.map +1 -0
- package/dist/shared/transport/events-api.d.ts +14 -0
- package/dist/shared/transport/events-api.d.ts.map +1 -0
- package/dist/shared/transport/events-api.js +29 -0
- package/dist/shared/transport/events-api.js.map +1 -0
- package/dist/shared/transport/http-client.d.ts +49 -0
- package/dist/shared/transport/http-client.d.ts.map +1 -0
- package/dist/shared/transport/http-client.js +381 -0
- package/dist/shared/transport/http-client.js.map +1 -0
- package/dist/shared/transport/index.d.ts +10 -0
- package/dist/shared/transport/index.d.ts.map +1 -0
- package/dist/shared/transport/index.js +6 -0
- package/dist/shared/transport/index.js.map +1 -0
- package/dist/shared/transport/logs-api.d.ts +29 -0
- package/dist/shared/transport/logs-api.d.ts.map +1 -0
- package/dist/shared/transport/logs-api.js +40 -0
- package/dist/shared/transport/logs-api.js.map +1 -0
- package/dist/shared/transport/metric-api.d.ts +9 -0
- package/dist/shared/transport/metric-api.d.ts.map +1 -0
- package/dist/shared/transport/metric-api.js +39 -0
- package/dist/shared/transport/metric-api.js.map +1 -0
- package/dist/shared/transport/otlp-event-bridge.d.ts +22 -0
- package/dist/shared/transport/otlp-event-bridge.d.ts.map +1 -0
- package/dist/shared/transport/otlp-event-bridge.js +50 -0
- package/dist/shared/transport/otlp-event-bridge.js.map +1 -0
- package/dist/shared/transport/otlp-shared.d.ts +14 -0
- package/dist/shared/transport/otlp-shared.d.ts.map +1 -0
- package/dist/shared/transport/otlp-shared.js +49 -0
- package/dist/shared/transport/otlp-shared.js.map +1 -0
- package/dist/shared/transport/otlp-transport.d.ts +58 -0
- package/dist/shared/transport/otlp-transport.d.ts.map +1 -0
- package/dist/shared/transport/otlp-transport.js +236 -0
- package/dist/shared/transport/otlp-transport.js.map +1 -0
- package/dist/shared/transport/types.d.ts +129 -0
- package/dist/shared/transport/types.d.ts.map +1 -0
- package/dist/shared/transport/types.js +2 -0
- package/dist/shared/transport/types.js.map +1 -0
- package/dist/shared/version.d.ts +2 -0
- package/dist/shared/version.d.ts.map +1 -0
- package/dist/shared/version.js +2 -0
- package/dist/shared/version.js.map +1 -0
- package/dist/storage/index.d.ts +7 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +4 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/local-store.d.ts +153 -0
- package/dist/storage/local-store.d.ts.map +1 -0
- package/dist/storage/local-store.js +719 -0
- package/dist/storage/local-store.js.map +1 -0
- package/dist/storage/retention.d.ts +2 -0
- package/dist/storage/retention.d.ts.map +1 -0
- package/dist/storage/retention.js +53 -0
- package/dist/storage/retention.js.map +1 -0
- package/dist/storage/session-store.d.ts +97 -0
- package/dist/storage/session-store.d.ts.map +1 -0
- package/dist/storage/session-store.js +391 -0
- package/dist/storage/session-store.js.map +1 -0
- package/dist/storage/types.d.ts +64 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +2 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/storage/weekly-summary.d.ts +61 -0
- package/dist/storage/weekly-summary.d.ts.map +1 -0
- package/dist/storage/weekly-summary.js +243 -0
- package/dist/storage/weekly-summary.js.map +1 -0
- package/dist/tools/analytics-tools.d.ts +101 -0
- package/dist/tools/analytics-tools.d.ts.map +1 -0
- package/dist/tools/analytics-tools.js +71 -0
- package/dist/tools/analytics-tools.js.map +1 -0
- package/dist/tools/cost-tools.d.ts +121 -0
- package/dist/tools/cost-tools.d.ts.map +1 -0
- package/dist/tools/cost-tools.js +174 -0
- package/dist/tools/cost-tools.js.map +1 -0
- package/dist/tools/cross-session-tools.d.ts +376 -0
- package/dist/tools/cross-session-tools.d.ts.map +1 -0
- package/dist/tools/cross-session-tools.js +820 -0
- package/dist/tools/cross-session-tools.js.map +1 -0
- package/dist/tools/extended-analytics-tools.d.ts +164 -0
- package/dist/tools/extended-analytics-tools.d.ts.map +1 -0
- package/dist/tools/extended-analytics-tools.js +121 -0
- package/dist/tools/extended-analytics-tools.js.map +1 -0
- package/dist/tools/index.d.ts +7 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +4 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/session-stats.d.ts +162 -0
- package/dist/tools/session-stats.d.ts.map +1 -0
- package/dist/tools/session-stats.js +1054 -0
- package/dist/tools/session-stats.js.map +1 -0
- package/dist/tools/workflow-tools.d.ts +126 -0
- package/dist/tools/workflow-tools.d.ts.map +1 -0
- package/dist/tools/workflow-tools.js +274 -0
- package/dist/tools/workflow-tools.js.map +1 -0
- package/dist/tracing/mcp-tracer.d.ts +4 -0
- package/dist/tracing/mcp-tracer.d.ts.map +1 -0
- package/dist/tracing/mcp-tracer.js +14 -0
- package/dist/tracing/mcp-tracer.js.map +1 -0
- package/dist/tracing/session-span.d.ts +14 -0
- package/dist/tracing/session-span.d.ts.map +1 -0
- package/dist/tracing/session-span.js +53 -0
- package/dist/tracing/session-span.js.map +1 -0
- package/dist/tracing/task-span-tracker.d.ts +11 -0
- package/dist/tracing/task-span-tracker.d.ts.map +1 -0
- package/dist/tracing/task-span-tracker.js +59 -0
- package/dist/tracing/task-span-tracker.js.map +1 -0
- package/dist/tracing/tool-call-span.d.ts +4 -0
- package/dist/tracing/tool-call-span.d.ts.map +1 -0
- package/dist/tracing/tool-call-span.js +60 -0
- package/dist/tracing/tool-call-span.js.map +1 -0
- package/dist/transport/index.d.ts +3 -0
- package/dist/transport/index.d.ts.map +1 -0
- package/dist/transport/index.js +2 -0
- package/dist/transport/index.js.map +1 -0
- package/dist/transport/log-ingest.d.ts +42 -0
- package/dist/transport/log-ingest.d.ts.map +1 -0
- package/dist/transport/log-ingest.js +151 -0
- package/dist/transport/log-ingest.js.map +1 -0
- package/dist/transport/nr-ingest.d.ts +171 -0
- package/dist/transport/nr-ingest.d.ts.map +1 -0
- package/dist/transport/nr-ingest.js +659 -0
- package/dist/transport/nr-ingest.js.map +1 -0
- package/dist/types.d.ts +45 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/web/assets/index-BrL281N-.css +2 -0
- package/dist/web/assets/index-CcaYZzXm.js +42 -0
- package/dist/web/favicon.svg +15 -0
- package/dist/web/index.html +15 -0
- package/examples/local-alert-rules.json +106 -0
- package/package.json +125 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-failure-tracker.d.ts","sourceRoot":"","sources":["../../src/metrics/api-failure-tracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { createLogger } from '../shared/index.js';
|
|
2
|
+
import { computePercentile } from './percentile.js';
|
|
3
|
+
const logger = createLogger('api-failure-tracker');
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
// Defaults
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
const DEFAULT_THROTTLE_THRESHOLD = 3;
|
|
8
|
+
const DEFAULT_THROTTLE_WINDOW_MINUTES = 10;
|
|
9
|
+
const DEFAULT_MAX_EVENTS = 500;
|
|
10
|
+
const DEFAULT_COST_PER_TOKEN_USD = 0.000003;
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
// ApiFailureTracker
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
export class ApiFailureTracker {
|
|
15
|
+
throttleThreshold;
|
|
16
|
+
throttleWindowMinutes;
|
|
17
|
+
maxEvents;
|
|
18
|
+
costPerTokenUsd;
|
|
19
|
+
onThrottleAlert;
|
|
20
|
+
events = [];
|
|
21
|
+
throttleAlerts = [];
|
|
22
|
+
totalRequests = 0;
|
|
23
|
+
latenciesByModel = new Map();
|
|
24
|
+
constructor(options) {
|
|
25
|
+
this.throttleThreshold = options?.throttleAlertThreshold ?? DEFAULT_THROTTLE_THRESHOLD;
|
|
26
|
+
this.throttleWindowMinutes =
|
|
27
|
+
options?.throttleAlertWindowMinutes ?? DEFAULT_THROTTLE_WINDOW_MINUTES;
|
|
28
|
+
this.maxEvents = options?.maxEvents ?? DEFAULT_MAX_EVENTS;
|
|
29
|
+
this.costPerTokenUsd = options?.costPerTokenUsd ?? DEFAULT_COST_PER_TOKEN_USD;
|
|
30
|
+
this.onThrottleAlert = options?.onThrottleAlert ?? null;
|
|
31
|
+
}
|
|
32
|
+
recordRequest(model, latencyMs) {
|
|
33
|
+
this.totalRequests++;
|
|
34
|
+
if (!this.latenciesByModel.has(model) && this.latenciesByModel.size >= 50) {
|
|
35
|
+
return; // Cap total models to prevent unbounded memory under high model churn
|
|
36
|
+
}
|
|
37
|
+
const arr = this.latenciesByModel.get(model) ?? [];
|
|
38
|
+
arr.push(latencyMs);
|
|
39
|
+
if (arr.length > this.maxEvents) {
|
|
40
|
+
arr.shift();
|
|
41
|
+
}
|
|
42
|
+
this.latenciesByModel.set(model, arr);
|
|
43
|
+
}
|
|
44
|
+
recordFailure(event) {
|
|
45
|
+
const totalTurns = event.totalTurnsInSession ?? 30;
|
|
46
|
+
const phase = this.computePhase(event.turnNumber, totalTurns);
|
|
47
|
+
const failure = {
|
|
48
|
+
errorType: event.errorType,
|
|
49
|
+
model: event.model,
|
|
50
|
+
timestamp: Date.now(),
|
|
51
|
+
turnNumber: event.turnNumber,
|
|
52
|
+
tokensInFlight: event.tokensInFlight,
|
|
53
|
+
recoveryMs: event.recoveryMs ?? null,
|
|
54
|
+
retryCount: event.retryCount ?? 0,
|
|
55
|
+
recoverySucceeded: event.recoverySucceeded ?? null,
|
|
56
|
+
sessionPhase: phase,
|
|
57
|
+
duringToolExecution: event.duringToolExecution ?? false,
|
|
58
|
+
};
|
|
59
|
+
this.events.push(failure);
|
|
60
|
+
if (this.events.length > this.maxEvents) {
|
|
61
|
+
this.events.shift();
|
|
62
|
+
}
|
|
63
|
+
this.checkThrottleRate(event.model);
|
|
64
|
+
return failure;
|
|
65
|
+
}
|
|
66
|
+
getMetrics() {
|
|
67
|
+
const byErrorType = {
|
|
68
|
+
rate_limit: 0,
|
|
69
|
+
timeout: 0,
|
|
70
|
+
connection_error: 0,
|
|
71
|
+
server_error: 0,
|
|
72
|
+
context_length_exceeded: 0,
|
|
73
|
+
authentication: 0,
|
|
74
|
+
unknown: 0,
|
|
75
|
+
};
|
|
76
|
+
const byPhase = { early: 0, middle: 0, late: 0 };
|
|
77
|
+
let totalTokensLost = 0;
|
|
78
|
+
const recoveryTimes = [];
|
|
79
|
+
for (const event of this.events) {
|
|
80
|
+
byErrorType[event.errorType]++;
|
|
81
|
+
byPhase[event.sessionPhase]++;
|
|
82
|
+
totalTokensLost += event.tokensInFlight;
|
|
83
|
+
if (event.recoveryMs !== null) {
|
|
84
|
+
recoveryTimes.push(event.recoveryMs);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
const meanRecovery = recoveryTimes.length > 0
|
|
88
|
+
? Math.round(recoveryTimes.reduce((a, b) => a + b, 0) / recoveryTimes.length)
|
|
89
|
+
: null;
|
|
90
|
+
return {
|
|
91
|
+
totalFailures: this.events.length,
|
|
92
|
+
byErrorType,
|
|
93
|
+
byModel: this.computeModelScorecards(),
|
|
94
|
+
bySessionPhase: byPhase,
|
|
95
|
+
totalTokensLost,
|
|
96
|
+
totalEstimatedCostLostUsd: Math.round(totalTokensLost * this.costPerTokenUsd * 10000) / 10000,
|
|
97
|
+
meanTimeToRecoveryMs: meanRecovery,
|
|
98
|
+
throttleAlerts: this.throttleAlerts,
|
|
99
|
+
recentFailures: this.events.slice(-20),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
emitMetrics(aggregator) {
|
|
103
|
+
const metrics = this.getMetrics();
|
|
104
|
+
aggregator.record('ai.api.failures_total', metrics.totalFailures);
|
|
105
|
+
aggregator.record('ai.api.tokens_lost', metrics.totalTokensLost);
|
|
106
|
+
for (const [type, count] of Object.entries(metrics.byErrorType)) {
|
|
107
|
+
if (count > 0) {
|
|
108
|
+
aggregator.record('ai.api.failure_by_type', count, { error_type: type });
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
for (const [model, scorecard] of Object.entries(metrics.byModel)) {
|
|
112
|
+
if (scorecard.failureRate !== null) {
|
|
113
|
+
aggregator.record('ai.api.model_failure_rate', scorecard.failureRate, { model });
|
|
114
|
+
}
|
|
115
|
+
if (scorecard.meanRecoveryMs !== null) {
|
|
116
|
+
aggregator.record('ai.api.model_mean_recovery_ms', scorecard.meanRecoveryMs, { model });
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
reset(_sessionId) {
|
|
121
|
+
this.events.length = 0;
|
|
122
|
+
this.throttleAlerts.length = 0;
|
|
123
|
+
this.totalRequests = 0;
|
|
124
|
+
this.latenciesByModel.clear();
|
|
125
|
+
}
|
|
126
|
+
computePhase(turnNumber, totalTurns) {
|
|
127
|
+
const ratio = turnNumber / totalTurns;
|
|
128
|
+
if (ratio <= 0.33)
|
|
129
|
+
return 'early';
|
|
130
|
+
if (ratio <= 0.67)
|
|
131
|
+
return 'middle';
|
|
132
|
+
return 'late';
|
|
133
|
+
}
|
|
134
|
+
checkThrottleRate(model) {
|
|
135
|
+
const windowMs = this.throttleWindowMinutes * 60 * 1000;
|
|
136
|
+
const now = Date.now();
|
|
137
|
+
const recentThrottles = this.events.filter((e) => e.model === model && e.errorType === 'rate_limit' && now - e.timestamp <= windowMs);
|
|
138
|
+
if (recentThrottles.length >= this.throttleThreshold) {
|
|
139
|
+
// Dedupe: don't fire if we already alerted for this model in this window
|
|
140
|
+
const alreadyAlerted = this.throttleAlerts.some((a) => a.model === model && now - a.timestamp <= windowMs);
|
|
141
|
+
if (alreadyAlerted)
|
|
142
|
+
return;
|
|
143
|
+
const alert = {
|
|
144
|
+
model,
|
|
145
|
+
count: recentThrottles.length,
|
|
146
|
+
windowMinutes: this.throttleWindowMinutes,
|
|
147
|
+
timestamp: now,
|
|
148
|
+
};
|
|
149
|
+
this.throttleAlerts.push(alert);
|
|
150
|
+
logger.warn('Throttle rate exceeded', {
|
|
151
|
+
model,
|
|
152
|
+
count: alert.count,
|
|
153
|
+
windowMinutes: alert.windowMinutes,
|
|
154
|
+
});
|
|
155
|
+
if (this.onThrottleAlert) {
|
|
156
|
+
this.onThrottleAlert(alert);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
computeModelScorecards() {
|
|
161
|
+
const scorecards = {};
|
|
162
|
+
// Group events by model
|
|
163
|
+
const eventsByModel = new Map();
|
|
164
|
+
for (const event of this.events) {
|
|
165
|
+
const arr = eventsByModel.get(event.model) ?? [];
|
|
166
|
+
arr.push(event);
|
|
167
|
+
eventsByModel.set(event.model, arr);
|
|
168
|
+
}
|
|
169
|
+
for (const [model, modelEvents] of eventsByModel) {
|
|
170
|
+
const latencies = this.latenciesByModel.get(model) ?? [];
|
|
171
|
+
const sortedLatencies = [...latencies].sort((a, b) => a - b);
|
|
172
|
+
// Only use latencies.length as total — modelEvents are failures only, so
|
|
173
|
+
// using them as both numerator and denominator would always give rate=1.0.
|
|
174
|
+
const totalModelRequests = latencies.length;
|
|
175
|
+
const throttles = modelEvents.filter((e) => e.errorType === 'rate_limit');
|
|
176
|
+
const recoveryTimes = modelEvents
|
|
177
|
+
.map((e) => e.recoveryMs)
|
|
178
|
+
.filter((r) => r !== null);
|
|
179
|
+
const tokensLost = modelEvents.reduce((sum, e) => sum + e.tokensInFlight, 0);
|
|
180
|
+
scorecards[model] = {
|
|
181
|
+
model,
|
|
182
|
+
totalRequests: totalModelRequests,
|
|
183
|
+
failureCount: modelEvents.length,
|
|
184
|
+
failureRate: totalModelRequests > 0
|
|
185
|
+
? Math.round((modelEvents.length / totalModelRequests) * 1000) / 1000
|
|
186
|
+
: null,
|
|
187
|
+
throttleCount: throttles.length,
|
|
188
|
+
throttleFrequency: totalModelRequests > 0
|
|
189
|
+
? Math.round((throttles.length / totalModelRequests) * 1000) / 1000
|
|
190
|
+
: null,
|
|
191
|
+
meanRecoveryMs: recoveryTimes.length > 0
|
|
192
|
+
? Math.round(recoveryTimes.reduce((a, b) => a + b, 0) / recoveryTimes.length)
|
|
193
|
+
: null,
|
|
194
|
+
p95LatencyMs: sortedLatencies.length > 0 ? (computePercentile(sortedLatencies, 0.95) ?? null) : null,
|
|
195
|
+
tokensLost,
|
|
196
|
+
estimatedCostLostUsd: Math.round(tokensLost * this.costPerTokenUsd * 10000) / 10000,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
return scorecards;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=api-failure-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-failure-tracker.js","sourceRoot":"","sources":["../../src/metrics/api-failure-tracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
export type BudgetPeriod = 'session' | 'daily' | 'weekly';
|
|
2
|
+
export interface BudgetThresholdEvent {
|
|
3
|
+
readonly period: BudgetPeriod;
|
|
4
|
+
readonly thresholdPct: 50 | 80 | 100;
|
|
5
|
+
readonly spentUsd: number;
|
|
6
|
+
readonly budgetUsd: number;
|
|
7
|
+
readonly timestamp: number;
|
|
8
|
+
}
|
|
9
|
+
export interface BudgetStatus {
|
|
10
|
+
readonly session: {
|
|
11
|
+
readonly budgetUsd: number | null;
|
|
12
|
+
readonly spentUsd: number;
|
|
13
|
+
readonly remainingUsd: number | null;
|
|
14
|
+
readonly pctUsed: number | null;
|
|
15
|
+
readonly exceeded: boolean;
|
|
16
|
+
};
|
|
17
|
+
readonly daily: {
|
|
18
|
+
readonly budgetUsd: number | null;
|
|
19
|
+
readonly spentUsd: number;
|
|
20
|
+
readonly remainingUsd: number | null;
|
|
21
|
+
readonly pctUsed: number | null;
|
|
22
|
+
readonly exceeded: boolean;
|
|
23
|
+
};
|
|
24
|
+
readonly weekly: {
|
|
25
|
+
readonly budgetUsd: number | null;
|
|
26
|
+
readonly spentUsd: number;
|
|
27
|
+
readonly remainingUsd: number | null;
|
|
28
|
+
readonly pctUsed: number | null;
|
|
29
|
+
readonly exceeded: boolean;
|
|
30
|
+
};
|
|
31
|
+
readonly alerts: readonly BudgetThresholdEvent[];
|
|
32
|
+
}
|
|
33
|
+
export interface BudgetOptions {
|
|
34
|
+
readonly sessionBudgetUsd: number | null;
|
|
35
|
+
readonly dailyBudgetUsd: number | null;
|
|
36
|
+
readonly weeklyBudgetUsd: number | null;
|
|
37
|
+
readonly onThreshold?: (event: BudgetThresholdEvent) => void;
|
|
38
|
+
}
|
|
39
|
+
export declare class BudgetTracker {
|
|
40
|
+
private readonly sessionBudgetUsd;
|
|
41
|
+
private readonly dailyBudgetUsd;
|
|
42
|
+
private readonly weeklyBudgetUsd;
|
|
43
|
+
private onThreshold;
|
|
44
|
+
private sessionSpentUsd;
|
|
45
|
+
private dailySpentUsd;
|
|
46
|
+
private weeklySpentUsd;
|
|
47
|
+
private firedThresholds;
|
|
48
|
+
private alerts;
|
|
49
|
+
constructor(options: BudgetOptions);
|
|
50
|
+
setOnThreshold(callback: (event: BudgetThresholdEvent) => void): void;
|
|
51
|
+
updateCost(sessionCostUsd: number, dailyCostUsd: number, weeklyCostUsd: number): void;
|
|
52
|
+
private currentPeriodId;
|
|
53
|
+
private pruneStaleThresholds;
|
|
54
|
+
private checkThresholds;
|
|
55
|
+
private checkPeriod;
|
|
56
|
+
getStatus(): BudgetStatus;
|
|
57
|
+
private buildPeriodStatus;
|
|
58
|
+
resetSession(): void;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=budget-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"budget-tracker.d.ts","sourceRoot":"","sources":["../../src/metrics/budget-tracker.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE1D,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,EAAE;QAChB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;QACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAChC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;KAC5B,CAAC;IACF,QAAQ,CAAC,KAAK,EAAE;QACd,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;QACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAChC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;KAC5B,CAAC;IACF,QAAQ,CAAC,MAAM,EAAE;QACf,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;QACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAChC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;KAC5B,CAAC;IACF,QAAQ,CAAC,MAAM,EAAE,SAAS,oBAAoB,EAAE,CAAC;CAClD;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,IAAI,CAAC;CAC9D;AAMD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAgB;IACjD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;IAC/C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAgB;IAChD,OAAO,CAAC,WAAW,CAAsD;IAEzE,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,cAAc,CAAK;IAG3B,OAAO,CAAC,eAAe,CAA6B;IACpD,OAAO,CAAC,MAAM,CAA8B;gBAEhC,OAAO,EAAE,aAAa;IAOlC,cAAc,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,IAAI,GAAG,IAAI;IAIrE,UAAU,CAAC,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI;IAOrF,OAAO,CAAC,eAAe;IA0BvB,OAAO,CAAC,oBAAoB;IAU5B,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,WAAW;IAwBnB,SAAS,IAAI,YAAY;IASzB,OAAO,CAAC,iBAAiB;IAqBzB,YAAY,IAAI,IAAI;CAOrB"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
const THRESHOLD_LEVELS = [50, 80, 100];
|
|
2
|
+
const MAX_ALERTS = 100;
|
|
3
|
+
export class BudgetTracker {
|
|
4
|
+
sessionBudgetUsd;
|
|
5
|
+
dailyBudgetUsd;
|
|
6
|
+
weeklyBudgetUsd;
|
|
7
|
+
onThreshold;
|
|
8
|
+
sessionSpentUsd = 0;
|
|
9
|
+
dailySpentUsd = 0;
|
|
10
|
+
weeklySpentUsd = 0;
|
|
11
|
+
// Map from threshold key (e.g., "daily_50") to period ID (e.g., "day:2026-05-27")
|
|
12
|
+
firedThresholds = new Map();
|
|
13
|
+
alerts = [];
|
|
14
|
+
constructor(options) {
|
|
15
|
+
this.sessionBudgetUsd = options.sessionBudgetUsd;
|
|
16
|
+
this.dailyBudgetUsd = options.dailyBudgetUsd;
|
|
17
|
+
this.weeklyBudgetUsd = options.weeklyBudgetUsd;
|
|
18
|
+
this.onThreshold = options.onThreshold;
|
|
19
|
+
}
|
|
20
|
+
setOnThreshold(callback) {
|
|
21
|
+
this.onThreshold = callback;
|
|
22
|
+
}
|
|
23
|
+
updateCost(sessionCostUsd, dailyCostUsd, weeklyCostUsd) {
|
|
24
|
+
this.sessionSpentUsd = sessionCostUsd;
|
|
25
|
+
this.dailySpentUsd = dailyCostUsd;
|
|
26
|
+
this.weeklySpentUsd = weeklyCostUsd;
|
|
27
|
+
this.checkThresholds();
|
|
28
|
+
}
|
|
29
|
+
currentPeriodId(period) {
|
|
30
|
+
const now = new Date();
|
|
31
|
+
if (period === 'session') {
|
|
32
|
+
return 'session:infinite';
|
|
33
|
+
}
|
|
34
|
+
if (period === 'daily') {
|
|
35
|
+
const year = now.getFullYear();
|
|
36
|
+
const month = String(now.getMonth() + 1).padStart(2, '0');
|
|
37
|
+
const day = String(now.getDate()).padStart(2, '0');
|
|
38
|
+
return `day:${year}-${month}-${day}`;
|
|
39
|
+
}
|
|
40
|
+
if (period === 'weekly') {
|
|
41
|
+
// ISO 8601 week number — correct across year boundaries.
|
|
42
|
+
// The ISO week year can differ from the calendar year in early Jan / late Dec.
|
|
43
|
+
const d = new Date(Date.UTC(now.getFullYear(), now.getMonth(), now.getDate()));
|
|
44
|
+
const dayOfWeek = d.getUTCDay() || 7; // 1=Mon … 7=Sun
|
|
45
|
+
d.setUTCDate(d.getUTCDate() + 4 - dayOfWeek); // nearest Thursday
|
|
46
|
+
const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));
|
|
47
|
+
const week = Math.ceil(((d.getTime() - yearStart.getTime()) / 86_400_000 + 1) / 7);
|
|
48
|
+
const isoYear = d.getUTCFullYear();
|
|
49
|
+
const weekNum = String(week).padStart(2, '0');
|
|
50
|
+
return `week:${isoYear}-W${weekNum}`;
|
|
51
|
+
}
|
|
52
|
+
return '';
|
|
53
|
+
}
|
|
54
|
+
pruneStaleThresholds() {
|
|
55
|
+
for (const [key, periodId] of this.firedThresholds.entries()) {
|
|
56
|
+
const period = key.split('_')[0];
|
|
57
|
+
const currentPeriod = this.currentPeriodId(period);
|
|
58
|
+
if (periodId !== currentPeriod) {
|
|
59
|
+
this.firedThresholds.delete(key);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
checkThresholds() {
|
|
64
|
+
this.pruneStaleThresholds();
|
|
65
|
+
this.checkPeriod('session', this.sessionSpentUsd, this.sessionBudgetUsd);
|
|
66
|
+
this.checkPeriod('daily', this.dailySpentUsd, this.dailyBudgetUsd);
|
|
67
|
+
this.checkPeriod('weekly', this.weeklySpentUsd, this.weeklyBudgetUsd);
|
|
68
|
+
}
|
|
69
|
+
checkPeriod(period, spent, budget) {
|
|
70
|
+
if (budget === null || budget <= 0)
|
|
71
|
+
return;
|
|
72
|
+
const pctUsed = (spent / budget) * 100;
|
|
73
|
+
const currentPeriod = this.currentPeriodId(period);
|
|
74
|
+
for (const level of THRESHOLD_LEVELS) {
|
|
75
|
+
const key = `${period}_${level}`;
|
|
76
|
+
if (pctUsed >= level && !this.firedThresholds.has(key)) {
|
|
77
|
+
this.firedThresholds.set(key, currentPeriod);
|
|
78
|
+
const event = {
|
|
79
|
+
period,
|
|
80
|
+
thresholdPct: level,
|
|
81
|
+
spentUsd: spent,
|
|
82
|
+
budgetUsd: budget,
|
|
83
|
+
timestamp: Date.now(),
|
|
84
|
+
};
|
|
85
|
+
this.alerts.push(event);
|
|
86
|
+
if (this.alerts.length > MAX_ALERTS) {
|
|
87
|
+
this.alerts.shift();
|
|
88
|
+
}
|
|
89
|
+
this.onThreshold?.(event);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
getStatus() {
|
|
94
|
+
return {
|
|
95
|
+
session: this.buildPeriodStatus(this.sessionSpentUsd, this.sessionBudgetUsd),
|
|
96
|
+
daily: this.buildPeriodStatus(this.dailySpentUsd, this.dailyBudgetUsd),
|
|
97
|
+
weekly: this.buildPeriodStatus(this.weeklySpentUsd, this.weeklyBudgetUsd),
|
|
98
|
+
alerts: [...this.alerts],
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
buildPeriodStatus(spent, budget) {
|
|
102
|
+
if (budget === null) {
|
|
103
|
+
return {
|
|
104
|
+
budgetUsd: null,
|
|
105
|
+
spentUsd: spent,
|
|
106
|
+
remainingUsd: null,
|
|
107
|
+
pctUsed: null,
|
|
108
|
+
exceeded: false,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
const remaining = Math.max(0, budget - spent);
|
|
112
|
+
const pctUsed = Math.round((spent / budget) * 1000) / 10;
|
|
113
|
+
return {
|
|
114
|
+
budgetUsd: budget,
|
|
115
|
+
spentUsd: spent,
|
|
116
|
+
remainingUsd: remaining,
|
|
117
|
+
pctUsed,
|
|
118
|
+
exceeded: spent > budget,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
resetSession() {
|
|
122
|
+
this.sessionSpentUsd = 0;
|
|
123
|
+
for (const key of this.firedThresholds.keys()) {
|
|
124
|
+
if (key.startsWith('session_'))
|
|
125
|
+
this.firedThresholds.delete(key);
|
|
126
|
+
}
|
|
127
|
+
this.alerts = this.alerts.filter((a) => a.period !== 'session');
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=budget-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"budget-tracker.js","sourceRoot":"","sources":["../../src/metrics/budget-tracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLAUDE.md Change Impact Tracking — detects modifications to CLAUDE.md
|
|
3
|
+
* and `.claude/` configuration files, computes before/after metric deltas
|
|
4
|
+
* from stored sessions, estimates token context costs, and emits NR metrics.
|
|
5
|
+
*
|
|
6
|
+
* Change detection:
|
|
7
|
+
* - Within a session: Write/Edit tool calls targeting CLAUDE.md or .claude/
|
|
8
|
+
* - Between sessions: SHA-256 hash comparison of CLAUDE.md content
|
|
9
|
+
*
|
|
10
|
+
* Impact analysis:
|
|
11
|
+
* - Partitions sessions into before/after windows around a change timestamp
|
|
12
|
+
* - Compares efficiency, cost, correction rate, tool calls per task, and
|
|
13
|
+
* task success rate across the two windows
|
|
14
|
+
* - Generates a verdict string: "Positive impact", "Negative impact", or
|
|
15
|
+
* "Mixed impact" with the top changed metrics
|
|
16
|
+
*/
|
|
17
|
+
import type { MetricAggregator } from '../shared/index.js';
|
|
18
|
+
import type { SessionStore } from '../storage/session-store.js';
|
|
19
|
+
import type { ToolCallRecord } from '../storage/types.js';
|
|
20
|
+
export interface ClaudeMdChange {
|
|
21
|
+
readonly timestamp: number;
|
|
22
|
+
readonly sessionId: string;
|
|
23
|
+
readonly filePath: string;
|
|
24
|
+
readonly changeType: 'created' | 'modified' | 'deleted';
|
|
25
|
+
readonly diffSummary: string;
|
|
26
|
+
readonly linesAdded: number;
|
|
27
|
+
readonly linesRemoved: number;
|
|
28
|
+
}
|
|
29
|
+
export interface AggregateMetrics {
|
|
30
|
+
readonly avgEfficiencyScore: number | null;
|
|
31
|
+
readonly avgCostUsd: number;
|
|
32
|
+
readonly avgCorrectionRate: number;
|
|
33
|
+
readonly avgToolCallsPerTask: number;
|
|
34
|
+
readonly avgTaskSuccessRate: number | null;
|
|
35
|
+
readonly sessionCount: number;
|
|
36
|
+
}
|
|
37
|
+
export interface MetricDelta {
|
|
38
|
+
readonly value: number;
|
|
39
|
+
readonly percentChange: number | null;
|
|
40
|
+
readonly improved: boolean;
|
|
41
|
+
}
|
|
42
|
+
export interface ClaudeMdImpactReport {
|
|
43
|
+
readonly changeDescription: string;
|
|
44
|
+
readonly beforeMetrics: AggregateMetrics;
|
|
45
|
+
readonly afterMetrics: AggregateMetrics;
|
|
46
|
+
readonly deltas: {
|
|
47
|
+
readonly efficiencyScore: MetricDelta | null;
|
|
48
|
+
readonly cost: MetricDelta;
|
|
49
|
+
readonly correctionRate: MetricDelta;
|
|
50
|
+
readonly toolCallsPerTask: MetricDelta;
|
|
51
|
+
readonly taskSuccessRate: MetricDelta | null;
|
|
52
|
+
};
|
|
53
|
+
readonly contextTokensForClaudeMd: number | null;
|
|
54
|
+
readonly verdict: string;
|
|
55
|
+
}
|
|
56
|
+
export interface ContextCostEstimate {
|
|
57
|
+
readonly filePath: string;
|
|
58
|
+
readonly charCount: number;
|
|
59
|
+
readonly estimatedTokens: number;
|
|
60
|
+
readonly perSessionCostUsd: number;
|
|
61
|
+
readonly perTurnCostUsd: number;
|
|
62
|
+
}
|
|
63
|
+
export declare class ClaudeMdTracker {
|
|
64
|
+
private readonly sessionStore;
|
|
65
|
+
private readonly changes;
|
|
66
|
+
private lastEmittedIndex;
|
|
67
|
+
private cachedImpact;
|
|
68
|
+
constructor(options: {
|
|
69
|
+
sessionStore: SessionStore;
|
|
70
|
+
});
|
|
71
|
+
/**
|
|
72
|
+
* Examine a tool call record and detect if it modifies a CLAUDE.md or
|
|
73
|
+
* `.claude/` file. Returns the change event if detected, null otherwise.
|
|
74
|
+
*/
|
|
75
|
+
detectChange(toolCall: ToolCallRecord): ClaudeMdChange | null;
|
|
76
|
+
/** Returns all detected changes in this tracker's lifetime. */
|
|
77
|
+
getChanges(): readonly ClaudeMdChange[];
|
|
78
|
+
/**
|
|
79
|
+
* Compute SHA-256 hash of a file's content.
|
|
80
|
+
* Throws if the file does not exist.
|
|
81
|
+
*/
|
|
82
|
+
static computeFileHash(filePath: string): string;
|
|
83
|
+
/**
|
|
84
|
+
* Detect whether CLAUDE.md changed between sessions by comparing hashes.
|
|
85
|
+
* Returns true if hashes differ. Returns false when previousHash is null
|
|
86
|
+
* (first session ever — no prior state to compare against, so no change).
|
|
87
|
+
*/
|
|
88
|
+
static detectBetweenSessionChange(previousHash: string | null, currentHash: string): boolean;
|
|
89
|
+
/**
|
|
90
|
+
* Compare metrics in the N days before vs N days after a change timestamp.
|
|
91
|
+
* Returns a full impact report with deltas, context cost estimate, and verdict.
|
|
92
|
+
*/
|
|
93
|
+
computeImpact(changeTimestamp: number, windowDays?: number): ClaudeMdImpactReport;
|
|
94
|
+
private appendChange;
|
|
95
|
+
private getCachedImpact;
|
|
96
|
+
/**
|
|
97
|
+
* Estimate the per-session and per-turn cost of loading a CLAUDE.md file
|
|
98
|
+
* into context. Reads the file and computes token estimate.
|
|
99
|
+
*/
|
|
100
|
+
static estimateContextCost(claudeMdPath: string): ContextCostEstimate;
|
|
101
|
+
/**
|
|
102
|
+
* Emit custom events and delta metrics for newly detected changes only.
|
|
103
|
+
* Impact report is cached and only recomputed when a new change arrives.
|
|
104
|
+
*/
|
|
105
|
+
emitMetrics(aggregator: MetricAggregator): void;
|
|
106
|
+
reset(): void;
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=claudemd-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claudemd-tracker.d.ts","sourceRoot":"","sources":["../../src/metrics/claudemd-tracker.ts"],"names":[],"mappings":"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"}
|