@newrelic/preflight 0.0.1-pre.1 → 1.0.1
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 +868 -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 +123 -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 +129 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test-only helper for asserting on captured stderr output
|
|
3
|
+
* (CODE_REVIEW §9.20).
|
|
4
|
+
*
|
|
5
|
+
* Across the test suite, the structured logger writes to stderr (which
|
|
6
|
+
* tests stub via `jest.spyOn(console, 'error').mockImplementation(...)`)
|
|
7
|
+
* and assertions then need to materialize the captured frames into a
|
|
8
|
+
* single concatenated string for `.toContain(...)` checks. The pattern
|
|
9
|
+
* `stderrSpy.mock.calls.map(c => c[0]).join('')` was repeated in
|
|
10
|
+
* `pricing.test.ts`, `config.test.ts`, `tokens.test.ts`, and
|
|
11
|
+
* `harvest-scheduler.test.ts` — 25 sites total. This helper exists so
|
|
12
|
+
* each site collapses to `getLogOutput(stderrSpy)`.
|
|
13
|
+
*
|
|
14
|
+
* Lives under `src/__test-utils__/` (Jest's conventional double-underscore
|
|
15
|
+
* directory for test-only support code) so the build-time tsconfig
|
|
16
|
+
* exclude can keep it out of `dist/` — see `tsconfig.json`'s `exclude`
|
|
17
|
+
* list. The file is not a test file (no `.test.ts` suffix) so Jest's
|
|
18
|
+
* `testMatch` will not try to run it.
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* Minimal shape needed off a `jest.spyOn(console, 'error')` result.
|
|
22
|
+
* Spelled out as a structural interface rather than `jest.SpyInstance`
|
|
23
|
+
* so the helper doesn't depend on the (frequently-renamed) Jest type
|
|
24
|
+
* surface and stays narrow — `mock.calls[i][0]` is the only field we
|
|
25
|
+
* read.
|
|
26
|
+
*/
|
|
27
|
+
interface StderrSpyShape {
|
|
28
|
+
readonly mock: {
|
|
29
|
+
readonly calls: ReadonlyArray<ReadonlyArray<unknown>>;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Concatenate every stderr frame captured by `stderrSpy` into a single
|
|
34
|
+
* string suitable for `.toContain(...)` / `.toMatch(...)` assertions.
|
|
35
|
+
*
|
|
36
|
+
* Tests across this package only ever inspect the first argument of
|
|
37
|
+
* each `console.error` call (the log line itself), which matches the
|
|
38
|
+
* runtime behavior of the structured logger — it always emits the JSON
|
|
39
|
+
* payload as the sole call argument.
|
|
40
|
+
*
|
|
41
|
+
* The default separator is `''` (concatenated). Pass `'\n'` (or any
|
|
42
|
+
* other delimiter) when the assertion needs frame boundaries preserved
|
|
43
|
+
* — e.g. `getLogOutput(spy, '\n').split('\n')` to inspect frames
|
|
44
|
+
* individually. Both styles existed in the suite pre-helper and both
|
|
45
|
+
* are kept supported.
|
|
46
|
+
*/
|
|
47
|
+
export declare function getLogOutput(stderrSpy: StderrSpyShape, separator?: string): string;
|
|
48
|
+
export {};
|
|
49
|
+
//# sourceMappingURL=log-output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-output.d.ts","sourceRoot":"","sources":["../../../src/shared/__test-utils__/log-output.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH;;;;;;GAMG;AACH,UAAU,cAAc;IACtB,QAAQ,CAAC,IAAI,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAA;KAAE,CAAC;CAC1E;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,cAAc,EAAE,SAAS,GAAE,MAAW,GAAG,MAAM,CAEtF"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test-only helper for asserting on captured stderr output
|
|
3
|
+
* (CODE_REVIEW §9.20).
|
|
4
|
+
*
|
|
5
|
+
* Across the test suite, the structured logger writes to stderr (which
|
|
6
|
+
* tests stub via `jest.spyOn(console, 'error').mockImplementation(...)`)
|
|
7
|
+
* and assertions then need to materialize the captured frames into a
|
|
8
|
+
* single concatenated string for `.toContain(...)` checks. The pattern
|
|
9
|
+
* `stderrSpy.mock.calls.map(c => c[0]).join('')` was repeated in
|
|
10
|
+
* `pricing.test.ts`, `config.test.ts`, `tokens.test.ts`, and
|
|
11
|
+
* `harvest-scheduler.test.ts` — 25 sites total. This helper exists so
|
|
12
|
+
* each site collapses to `getLogOutput(stderrSpy)`.
|
|
13
|
+
*
|
|
14
|
+
* Lives under `src/__test-utils__/` (Jest's conventional double-underscore
|
|
15
|
+
* directory for test-only support code) so the build-time tsconfig
|
|
16
|
+
* exclude can keep it out of `dist/` — see `tsconfig.json`'s `exclude`
|
|
17
|
+
* list. The file is not a test file (no `.test.ts` suffix) so Jest's
|
|
18
|
+
* `testMatch` will not try to run it.
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* Concatenate every stderr frame captured by `stderrSpy` into a single
|
|
22
|
+
* string suitable for `.toContain(...)` / `.toMatch(...)` assertions.
|
|
23
|
+
*
|
|
24
|
+
* Tests across this package only ever inspect the first argument of
|
|
25
|
+
* each `console.error` call (the log line itself), which matches the
|
|
26
|
+
* runtime behavior of the structured logger — it always emits the JSON
|
|
27
|
+
* payload as the sole call argument.
|
|
28
|
+
*
|
|
29
|
+
* The default separator is `''` (concatenated). Pass `'\n'` (or any
|
|
30
|
+
* other delimiter) when the assertion needs frame boundaries preserved
|
|
31
|
+
* — e.g. `getLogOutput(spy, '\n').split('\n')` to inspect frames
|
|
32
|
+
* individually. Both styles existed in the suite pre-helper and both
|
|
33
|
+
* are kept supported.
|
|
34
|
+
*/
|
|
35
|
+
export function getLogOutput(stderrSpy, separator = '') {
|
|
36
|
+
return stderrSpy.mock.calls.map((c) => String(c[0])).join(separator);
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=log-output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-output.js","sourceRoot":"","sources":["../../../src/shared/__test-utils__/log-output.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAaH;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,YAAY,CAAC,SAAyB,EAAE,YAAoB,EAAE;IAC5E,OAAO,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACvE,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { LogLevel } from './logger.js';
|
|
2
|
+
import type { TransportMode } from './transport/types.js';
|
|
3
|
+
export interface AgentConfig {
|
|
4
|
+
readonly licenseKey: string;
|
|
5
|
+
readonly appName: string;
|
|
6
|
+
readonly enabled: boolean;
|
|
7
|
+
readonly recordContent: boolean;
|
|
8
|
+
readonly costTrackingEnabled: boolean;
|
|
9
|
+
readonly qualityTrackingEnabled: boolean;
|
|
10
|
+
readonly conversationTrackingEnabled: boolean;
|
|
11
|
+
readonly thinkingTrackingEnabled: boolean;
|
|
12
|
+
readonly customPricingFile: string | null;
|
|
13
|
+
readonly contentMaxLength: number;
|
|
14
|
+
readonly highSecurity: boolean;
|
|
15
|
+
readonly logLevel: LogLevel;
|
|
16
|
+
readonly collectorHost: string | null;
|
|
17
|
+
readonly accountId: string | null;
|
|
18
|
+
readonly attributionDefaults: Record<string, string> | null;
|
|
19
|
+
readonly otlpEndpoint: string | null;
|
|
20
|
+
readonly otlpHeaders: Readonly<Record<string, string>>;
|
|
21
|
+
readonly transport: TransportMode;
|
|
22
|
+
/**
|
|
23
|
+
* Identifies the consuming client in telemetry identifiers: HTTP
|
|
24
|
+
* `User-Agent` headers and OTel instrumentation scope / logger names.
|
|
25
|
+
* Defaults to `'ai-telemetry'` when not set.
|
|
26
|
+
*
|
|
27
|
+
* Pass `'preflight'` from the Preflight MCP server or `'my-agent'`
|
|
28
|
+
* from the TypeScript agent so telemetry from each consumer is
|
|
29
|
+
* distinguishable in the NR UI.
|
|
30
|
+
*/
|
|
31
|
+
readonly clientName: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Load and validate agent config from `process.env`, with optional `overrides`
|
|
35
|
+
* winning over the env values. Returns a deep-frozen `AgentConfig` so the
|
|
36
|
+
* result cannot be mutated by accident or by a buggy consumer that holds a
|
|
37
|
+
* shared reference.
|
|
38
|
+
*
|
|
39
|
+
* Precedence: `overrides` (when present per key) > env vars > defaults. The
|
|
40
|
+
* function is stateless from the library's perspective — call it again to
|
|
41
|
+
* pick up env-var changes (12 documents the SIGHUP pattern).
|
|
42
|
+
*
|
|
43
|
+
* License-key validation enforces a printable-ASCII regex (20–128 chars,
|
|
44
|
+
* no whitespace) — strict enough to catch trailing newlines from `cat` pipes
|
|
45
|
+
* and empty strings, lenient enough to accept older keys without an `NRAL`
|
|
46
|
+
* suffix. Never logs the key value.
|
|
47
|
+
*
|
|
48
|
+
* @param overrides Optional partial config that wins over env vars.
|
|
49
|
+
* @returns Deep-frozen `AgentConfig`.
|
|
50
|
+
* @throws If `licenseKey` is missing or malformed.
|
|
51
|
+
*/
|
|
52
|
+
export type AgentConfigInput = Omit<Partial<AgentConfig>, 'attributionDefaults'> & {
|
|
53
|
+
attributionDefaults?: Record<string, string | undefined> | null;
|
|
54
|
+
};
|
|
55
|
+
export declare function loadConfig(overrides?: AgentConfigInput): Readonly<AgentConfig>;
|
|
56
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/shared/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAmB1D,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;IACtC,QAAQ,CAAC,sBAAsB,EAAE,OAAO,CAAC;IACzC,QAAQ,CAAC,2BAA2B,EAAE,OAAO,CAAC;IAC9C,QAAQ,CAAC,uBAAuB,EAAE,OAAO,CAAC;IAC1C,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAC5D,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACvD,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC;IAClC;;;;;;;;OAQG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAmMD;;;;;;;;;;;;;;;;;;GAkBG;AAMH,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,qBAAqB,CAAC,GAAG;IACjF,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC;CACjE,CAAC;AAEF,wBAAgB,UAAU,CAAC,SAAS,CAAC,EAAE,gBAAgB,GAAG,QAAQ,CAAC,WAAW,CAAC,CA+G9E"}
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
import { createLogger } from './logger.js';
|
|
2
|
+
import { DEFAULT_CLIENT_NAME } from './transport/otlp-shared.js';
|
|
3
|
+
/**
|
|
4
|
+
* Strings that count as `true`. The lowercased env
|
|
5
|
+
* value is checked against these literal sets — any other value falls
|
|
6
|
+
* through to the default.
|
|
7
|
+
*/
|
|
8
|
+
const ENV_TRUTHY = new Set(['true', '1', 'yes', 'on']);
|
|
9
|
+
const ENV_FALSY = new Set(['false', '0', 'no', 'off']);
|
|
10
|
+
/**
|
|
11
|
+
* Module-level config logger. Per 5 the underlying
|
|
12
|
+
* `createLogger` now resolves the minimum log level per-call via the cached
|
|
13
|
+
* `getMinLevel()`, so a runtime env mutation followed by `__resetLogLevelCache()`
|
|
14
|
+
* propagates here without re-constructing this logger.
|
|
15
|
+
*/
|
|
16
|
+
const configLogger = createLogger('config');
|
|
17
|
+
/**
|
|
18
|
+
* Parse a boolean environment variable. Accepts `true|1|yes|on` as truthy
|
|
19
|
+
* and `false|0|no|off` as falsy (case-insensitive, 8). Any
|
|
20
|
+
* other value (or missing env var) returns the default. Unknown values emit
|
|
21
|
+
* a debug log so misconfigurations are diagnosable.
|
|
22
|
+
*/
|
|
23
|
+
function envBool(key, defaultValue) {
|
|
24
|
+
const raw = process.env[key];
|
|
25
|
+
if (raw === undefined)
|
|
26
|
+
return defaultValue;
|
|
27
|
+
const val = raw.toLowerCase().trim();
|
|
28
|
+
if (ENV_TRUTHY.has(val))
|
|
29
|
+
return true;
|
|
30
|
+
if (ENV_FALSY.has(val))
|
|
31
|
+
return false;
|
|
32
|
+
configLogger.debug(`${key}: unrecognized boolean value, falling back to default. Accepted: true|1|yes|on or false|0|no|off`, { value: raw, defaultValue });
|
|
33
|
+
return defaultValue;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Parse an integer environment variable. Out-of-bound values are clamped to
|
|
37
|
+
* the bound and emit a debug log so the override is observable
|
|
38
|
+
*.
|
|
39
|
+
*/
|
|
40
|
+
function envInt(key, defaultValue, bounds) {
|
|
41
|
+
const val = process.env[key];
|
|
42
|
+
if (val === undefined)
|
|
43
|
+
return defaultValue;
|
|
44
|
+
// Reject values with trailing garbage (e.g. '4kb', '1e3') that parseInt
|
|
45
|
+
// would accept silently; fall back to the default with a diagnostic log (§C2).
|
|
46
|
+
if (!/^-?\d+$/.test(val.trim())) {
|
|
47
|
+
configLogger.debug(`${key}: not a valid integer, using default`, { value: val, defaultValue });
|
|
48
|
+
return defaultValue;
|
|
49
|
+
}
|
|
50
|
+
const parsed = parseInt(val, 10);
|
|
51
|
+
if (Number.isNaN(parsed))
|
|
52
|
+
return defaultValue;
|
|
53
|
+
if (bounds?.min !== undefined && parsed < bounds.min) {
|
|
54
|
+
configLogger.debug(`${key}: value clamped to min`, { requested: parsed, min: bounds.min });
|
|
55
|
+
return bounds.min;
|
|
56
|
+
}
|
|
57
|
+
if (bounds?.max !== undefined && parsed > bounds.max) {
|
|
58
|
+
configLogger.debug(`${key}: value clamped to max`, { requested: parsed, max: bounds.max });
|
|
59
|
+
return bounds.max;
|
|
60
|
+
}
|
|
61
|
+
return parsed;
|
|
62
|
+
}
|
|
63
|
+
function envLogLevel(key, defaultValue) {
|
|
64
|
+
const val = process.env[key]?.toLowerCase().trim();
|
|
65
|
+
if (val === 'debug' || val === 'info' || val === 'warn' || val === 'error')
|
|
66
|
+
return val;
|
|
67
|
+
if (val !== undefined) {
|
|
68
|
+
// Use warn (not debug) so the diagnostic is visible even at the fallback
|
|
69
|
+
// 'info' log level — an invalid log level is always worth surfacing.
|
|
70
|
+
configLogger.warn(`${key}: unrecognized log level, using default`, {
|
|
71
|
+
value: val,
|
|
72
|
+
defaultValue,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
return defaultValue;
|
|
76
|
+
}
|
|
77
|
+
// Returns the env var value, or null if the var is absent or empty string.
|
|
78
|
+
// `export VAR=` in a shell produces '' — treat that the same as unset (§C3).
|
|
79
|
+
function envOrNull(key) {
|
|
80
|
+
const v = process.env[key];
|
|
81
|
+
return v === undefined || v === '' ? null : v;
|
|
82
|
+
}
|
|
83
|
+
// Normalize a string override value: undefined passes through (fall back to
|
|
84
|
+
// env); empty string coerces to null; any other value (including null) wins
|
|
85
|
+
// over the env var. Mirrors envOrNull for the override path (§CFG3).
|
|
86
|
+
function overrideString(v, envFn) {
|
|
87
|
+
if (v === undefined)
|
|
88
|
+
return envFn();
|
|
89
|
+
return v === '' ? null : v;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Parse the transport-mode env var. Accepts the same
|
|
93
|
+
* values as the `transport` field on `AgentConfig`. Unrecognized values
|
|
94
|
+
* fall back to the default and emit a debug log so misconfigurations are
|
|
95
|
+
* diagnosable.
|
|
96
|
+
*/
|
|
97
|
+
function envTransport(key, defaultValue) {
|
|
98
|
+
const raw = process.env[key];
|
|
99
|
+
if (raw === undefined)
|
|
100
|
+
return defaultValue;
|
|
101
|
+
const val = raw.toLowerCase().trim();
|
|
102
|
+
if (val === 'nr-events-api' || val === 'otlp' || val === 'both')
|
|
103
|
+
return val;
|
|
104
|
+
configLogger.debug(`${key}: unrecognized transport, falling back to default. Accepted: nr-events-api | otlp | both`, { value: raw, defaultValue });
|
|
105
|
+
return defaultValue;
|
|
106
|
+
}
|
|
107
|
+
function buildAttributionDefaults(overrideDefaults) {
|
|
108
|
+
const result = {};
|
|
109
|
+
// Env-var defaults for the four standard attribution fields.
|
|
110
|
+
//
|
|
111
|
+
// 11: empty-string env values are intentionally treated as
|
|
112
|
+
// "not set" via the truthiness check below. NR's events API rejects empty
|
|
113
|
+
// string attribute values, so a deliberately-empty env var (e.g. to "clear"
|
|
114
|
+
// a higher-precedence default) would only produce a 400 at ingest time —
|
|
115
|
+
// not the desired clear semantics. Consumers wanting to clear a default
|
|
116
|
+
// should pass `attributionDefaults: { feature: undefined }` (or omit the
|
|
117
|
+
// key entirely from overrides), not set the env var to "".
|
|
118
|
+
const envFeature = process.env.NEW_RELIC_AI_ATTRIBUTION_FEATURE;
|
|
119
|
+
const envTeam = process.env.NEW_RELIC_AI_ATTRIBUTION_TEAM;
|
|
120
|
+
const envUser = process.env.NEW_RELIC_AI_ATTRIBUTION_USER;
|
|
121
|
+
const envEnvironment = process.env.NEW_RELIC_AI_ATTRIBUTION_ENVIRONMENT;
|
|
122
|
+
// Truthiness check: exclude undefined (not set) and '' (empty — NR Events
|
|
123
|
+
// API rejects empty-string attributes, §3.3.11). Do NOT exclude '0' or
|
|
124
|
+
// 'false' — those are valid attribution tag values (§CFG4).
|
|
125
|
+
if (envFeature !== undefined && envFeature !== '')
|
|
126
|
+
result.feature = envFeature;
|
|
127
|
+
if (envTeam !== undefined && envTeam !== '')
|
|
128
|
+
result.team = envTeam;
|
|
129
|
+
if (envUser !== undefined && envUser !== '')
|
|
130
|
+
result.user = envUser;
|
|
131
|
+
if (envEnvironment !== undefined && envEnvironment !== '')
|
|
132
|
+
result.environment = envEnvironment;
|
|
133
|
+
// Merge override defaults (they win over env vars).
|
|
134
|
+
// Passing `undefined` as a value explicitly removes the key so that
|
|
135
|
+
// `attributionDefaults: { feature: undefined }` clears a prior env-set
|
|
136
|
+
// default, matching the documented "clear" pattern (§C1).
|
|
137
|
+
if (overrideDefaults) {
|
|
138
|
+
for (const [k, v] of Object.entries(overrideDefaults)) {
|
|
139
|
+
if (v === undefined) {
|
|
140
|
+
delete result[k];
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
result[k] = v;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return Object.keys(result).length > 0 ? result : null;
|
|
148
|
+
}
|
|
149
|
+
// Per OTel spec for OTEL_EXPORTER_OTLP_HEADERS:
|
|
150
|
+
// - Comma-separated list of `key=value` pairs.
|
|
151
|
+
// - `=` and `,` inside a key OR value must be percent-encoded as `%3D` and `%2C`.
|
|
152
|
+
// - Whitespace around the `=` is stripped.
|
|
153
|
+
// - Only the FIRST `=` separates key from value (so a value can legitimately
|
|
154
|
+
// contain `=` if it appears later in the substring after percent-decoding).
|
|
155
|
+
// - Keys and values are percent-decoded after splitting.
|
|
156
|
+
function parseOtlpHeaders(headerString) {
|
|
157
|
+
if (!headerString)
|
|
158
|
+
return {};
|
|
159
|
+
const result = {};
|
|
160
|
+
for (const pair of headerString.split(',')) {
|
|
161
|
+
const eqIdx = pair.indexOf('=');
|
|
162
|
+
if (eqIdx <= 0)
|
|
163
|
+
continue; // missing '=' or empty key — skip
|
|
164
|
+
// OTel spec: trim key whitespace; do NOT trim value (§CF1).
|
|
165
|
+
const rawKey = pair.slice(0, eqIdx).trim();
|
|
166
|
+
const rawValue = pair.slice(eqIdx + 1);
|
|
167
|
+
if (!rawKey)
|
|
168
|
+
continue;
|
|
169
|
+
let key;
|
|
170
|
+
let value;
|
|
171
|
+
try {
|
|
172
|
+
key = decodeURIComponent(rawKey);
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
// §11.4: warn so operators can diagnose a misconfigured auth header that
|
|
176
|
+
// will be forwarded malformed and likely rejected by the OTLP collector.
|
|
177
|
+
configLogger.warn('OTEL_EXPORTER_OTLP_HEADERS: malformed percent-encoding in key — using raw string', { rawKey });
|
|
178
|
+
key = rawKey;
|
|
179
|
+
}
|
|
180
|
+
try {
|
|
181
|
+
value = decodeURIComponent(rawValue);
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
// §11.4: same as key path — warn so a broken Authorization value is visible.
|
|
185
|
+
configLogger.warn('OTEL_EXPORTER_OTLP_HEADERS: malformed percent-encoding in value — using raw string', { rawKey });
|
|
186
|
+
value = rawValue;
|
|
187
|
+
}
|
|
188
|
+
result[key] = value;
|
|
189
|
+
}
|
|
190
|
+
return result;
|
|
191
|
+
}
|
|
192
|
+
// License keys must be printable ASCII (no whitespace, no control chars)
|
|
193
|
+
// and a plausible length. We're deliberately lenient on the exact format
|
|
194
|
+
// (no NRAL-suffix enforcement) to avoid false-rejecting older keys, but
|
|
195
|
+
// strict enough to catch common mistakes: trailing newlines from `cat`
|
|
196
|
+
// pipes, embedded CR/LF (would inject HTTP headers), or empty strings.
|
|
197
|
+
const LICENSE_KEY_RE = /^[\x21-\x7E]{20,128}$/;
|
|
198
|
+
export function loadConfig(overrides) {
|
|
199
|
+
const rawLicenseKey = overrides?.licenseKey ?? process.env.NEW_RELIC_LICENSE_KEY;
|
|
200
|
+
if (!rawLicenseKey) {
|
|
201
|
+
throw new Error('Missing required configuration: NEW_RELIC_LICENSE_KEY. ' +
|
|
202
|
+
'Set the NEW_RELIC_LICENSE_KEY environment variable or pass licenseKey in options.');
|
|
203
|
+
}
|
|
204
|
+
// Strip leading/trailing whitespace before validating — guards against
|
|
205
|
+
// accidental newlines from `cat key.txt`-style sourcing.
|
|
206
|
+
const licenseKey = rawLicenseKey.trim();
|
|
207
|
+
if (!LICENSE_KEY_RE.test(licenseKey)) {
|
|
208
|
+
throw new Error('Invalid configuration: NEW_RELIC_LICENSE_KEY must be 20-128 printable ASCII ' +
|
|
209
|
+
'characters with no whitespace. (Note: never log the key value.)');
|
|
210
|
+
}
|
|
211
|
+
const appName = overrides?.appName ?? process.env.NEW_RELIC_APP_NAME;
|
|
212
|
+
if (!appName) {
|
|
213
|
+
throw new Error('Missing required configuration: NEW_RELIC_APP_NAME. ' +
|
|
214
|
+
'Set the NEW_RELIC_APP_NAME environment variable or pass appName in options.');
|
|
215
|
+
}
|
|
216
|
+
// Reject control characters (CR/LF etc.) to prevent header injection if
|
|
217
|
+
// appName is ever used in an HTTP context, and cap length at 255 chars (§CF2).
|
|
218
|
+
if (/[\r\n\x00-\x1f]/.test(appName) || appName.length > 255) {
|
|
219
|
+
throw new Error('Invalid configuration: NEW_RELIC_APP_NAME must be 1-255 characters with no control characters.');
|
|
220
|
+
}
|
|
221
|
+
// Use explicit undefined-check so `accountId: null` in overrides wins over the
|
|
222
|
+
// env var — `??` would treat null as "not provided" and fall through to the
|
|
223
|
+
// env var, silently ignoring an explicit null override (§CFG1).
|
|
224
|
+
const accountId = overrides?.accountId !== undefined
|
|
225
|
+
? overrides.accountId
|
|
226
|
+
: (process.env.NEW_RELIC_ACCOUNT_ID ?? null);
|
|
227
|
+
if (accountId !== null && !/^[1-9]\d*$/.test(accountId)) {
|
|
228
|
+
// 6: positive-integer-only, no leading zeros, any length.
|
|
229
|
+
// - Removes the prior 12-digit cap so consumers don't have to release a
|
|
230
|
+
// new version when NR issues 13+ digit account IDs server-side.
|
|
231
|
+
// - Rejects '0' / leading-zero strings (e.g. '07' would have passed the
|
|
232
|
+
// old `/^\d{1,12}$/` regex even though no NR account uses leading zeros).
|
|
233
|
+
// The upper bound is enforced server-side by the ingest API.
|
|
234
|
+
throw new Error('Invalid configuration: NEW_RELIC_ACCOUNT_ID must be a positive decimal integer (no leading zeros). ' +
|
|
235
|
+
`Received: "${accountId}"`);
|
|
236
|
+
}
|
|
237
|
+
// F3: hoist `transport` resolution so we can fail fast when
|
|
238
|
+
// accountId is missing for transports that need it. Without this check, the
|
|
239
|
+
// NR Events API URL becomes ".../accounts/null/events", which NR returns 404
|
|
240
|
+
// on; the harvest scheduler then silently retry-loops every batch until the
|
|
241
|
+
// retry buffer overflows. Surface the misconfiguration at startup instead.
|
|
242
|
+
const transport = overrides?.transport ?? envTransport('NEW_RELIC_AI_TRANSPORT', 'nr-events-api');
|
|
243
|
+
if ((transport === 'nr-events-api' || transport === 'both') && accountId === null) {
|
|
244
|
+
throw new Error(`Missing required configuration: NEW_RELIC_ACCOUNT_ID. ` +
|
|
245
|
+
`Required when transport is "${transport}" (NR Events API URLs include the account ID in the path). ` +
|
|
246
|
+
`Set the NEW_RELIC_ACCOUNT_ID environment variable or pass accountId in options. ` +
|
|
247
|
+
`Only the "otlp" transport mode can omit accountId.`);
|
|
248
|
+
}
|
|
249
|
+
const highSecurity = overrides?.highSecurity ?? envBool('NEW_RELIC_AI_HIGH_SECURITY', false);
|
|
250
|
+
const recordContent = highSecurity
|
|
251
|
+
? false
|
|
252
|
+
: (overrides?.recordContent ?? envBool('NEW_RELIC_AI_RECORD_CONTENT', false));
|
|
253
|
+
// Build global attribution defaults from env vars and/or overrides
|
|
254
|
+
const attributionDefaults = buildAttributionDefaults(overrides?.attributionDefaults);
|
|
255
|
+
const config = {
|
|
256
|
+
licenseKey,
|
|
257
|
+
appName,
|
|
258
|
+
enabled: overrides?.enabled ?? envBool('NEW_RELIC_AI_ENABLED', true),
|
|
259
|
+
recordContent,
|
|
260
|
+
costTrackingEnabled: overrides?.costTrackingEnabled ?? envBool('NEW_RELIC_AI_COST_TRACKING', true),
|
|
261
|
+
qualityTrackingEnabled: overrides?.qualityTrackingEnabled ?? envBool('NEW_RELIC_AI_QUALITY_TRACKING', true),
|
|
262
|
+
conversationTrackingEnabled: overrides?.conversationTrackingEnabled ?? envBool('NEW_RELIC_AI_CONVERSATION_TRACKING', true),
|
|
263
|
+
thinkingTrackingEnabled: overrides?.thinkingTrackingEnabled ?? envBool('NEW_RELIC_AI_THINKING_TRACKING', true),
|
|
264
|
+
customPricingFile: overrideString(overrides?.customPricingFile, () => envOrNull('NEW_RELIC_AI_CUSTOM_PRICING_FILE')),
|
|
265
|
+
contentMaxLength: overrides?.contentMaxLength ??
|
|
266
|
+
envInt('NEW_RELIC_AI_CONTENT_MAX_LENGTH', 4096, { min: 1, max: 1_048_576 }),
|
|
267
|
+
highSecurity,
|
|
268
|
+
logLevel: overrides?.logLevel ?? envLogLevel('NEW_RELIC_AI_LOG_LEVEL', 'info'),
|
|
269
|
+
collectorHost: overrideString(overrides?.collectorHost, () => envOrNull('NEW_RELIC_HOST')),
|
|
270
|
+
accountId,
|
|
271
|
+
attributionDefaults,
|
|
272
|
+
otlpEndpoint: overrideString(overrides?.otlpEndpoint, () => envOrNull('OTEL_EXPORTER_OTLP_ENDPOINT')),
|
|
273
|
+
otlpHeaders: overrides?.otlpHeaders ?? parseOtlpHeaders(process.env.OTEL_EXPORTER_OTLP_HEADERS),
|
|
274
|
+
transport,
|
|
275
|
+
clientName: overrides?.clientName || process.env.NEW_RELIC_AI_CLIENT_NAME || DEFAULT_CLIENT_NAME,
|
|
276
|
+
};
|
|
277
|
+
return deepFreeze(config);
|
|
278
|
+
}
|
|
279
|
+
function deepFreeze(obj) {
|
|
280
|
+
if (obj && typeof obj === 'object' && !Object.isFrozen(obj)) {
|
|
281
|
+
for (const value of Object.values(obj)) {
|
|
282
|
+
if (value && typeof value === 'object') {
|
|
283
|
+
deepFreeze(value);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
Object.freeze(obj);
|
|
287
|
+
}
|
|
288
|
+
return obj;
|
|
289
|
+
}
|
|
290
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/shared/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import type { AiProvider } from './events/types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Canonical error classifications produced by {@link classifyError} and
|
|
4
|
+
* {@link classifyErrorDetailed}.
|
|
5
|
+
*
|
|
6
|
+
* Implemented as a `const` object plus derived string-literal union
|
|
7
|
+
* rather than a TypeScript `enum`, so that:
|
|
8
|
+
* - runtime usage (`AiErrorClassification.RATE_LIMIT`) keeps working
|
|
9
|
+
* identically for existing call sites;
|
|
10
|
+
* - the type is a string-literal union, matching every other
|
|
11
|
+
* enum-like type in this package (`AiProvider`, `AiRequestMethod`,
|
|
12
|
+
* `LogLevel`, `TransportMode`, etc.) — one consistent style;
|
|
13
|
+
* - bundlers can tree-shake unused members (TS enums emit a runtime
|
|
14
|
+
* object even when none of its members are referenced);
|
|
15
|
+
* - the wire-format strings (`'RATE_LIMIT'`, `'OVERLOADED'`, …) are
|
|
16
|
+
* usable directly as values without going through an enum lookup,
|
|
17
|
+
* which simplifies serialization paths.
|
|
18
|
+
*/
|
|
19
|
+
export declare const AiErrorClassification: {
|
|
20
|
+
readonly RATE_LIMIT: "RATE_LIMIT";
|
|
21
|
+
readonly OVERLOADED: "OVERLOADED";
|
|
22
|
+
readonly CONTENT_POLICY: "CONTENT_POLICY";
|
|
23
|
+
readonly CONTEXT_LENGTH_EXCEEDED: "CONTEXT_LENGTH_EXCEEDED";
|
|
24
|
+
readonly AUTHENTICATION: "AUTHENTICATION";
|
|
25
|
+
readonly NOT_FOUND: "NOT_FOUND";
|
|
26
|
+
readonly TIMEOUT: "TIMEOUT";
|
|
27
|
+
readonly SERVER_ERROR: "SERVER_ERROR";
|
|
28
|
+
readonly NETWORK_ERROR: "NETWORK_ERROR";
|
|
29
|
+
readonly UNKNOWN: "UNKNOWN";
|
|
30
|
+
};
|
|
31
|
+
export type AiErrorClassification = (typeof AiErrorClassification)[keyof typeof AiErrorClassification];
|
|
32
|
+
/**
|
|
33
|
+
* Classifications that `isRetryable()` reports as retryable. Exported as a
|
|
34
|
+
* `ReadonlySet` so consumers can build their own retry policy on top of the
|
|
35
|
+
* canonical list (e.g. layered backoff per category, custom routing) without
|
|
36
|
+
* having to re-derive it. Mutation is rejected at the type level.
|
|
37
|
+
*/
|
|
38
|
+
export declare const RETRYABLE: ReadonlySet<AiErrorClassification>;
|
|
39
|
+
/**
|
|
40
|
+
* Classify an arbitrary `unknown` error from a provider SDK or `fetch` into
|
|
41
|
+
* one of the canonical {@link AiErrorClassification} categories. The
|
|
42
|
+
* decision routes through HTTP status (when present), Node `code` for
|
|
43
|
+
* network/timeout cases, and provider-specific 400 disambiguation
|
|
44
|
+
* — content policy vs. context length vs. generic.
|
|
45
|
+
*
|
|
46
|
+
* Designed for retry-loop consumption — see {@link isRetryable} and
|
|
47
|
+
* {@link RETRYABLE} for the policy applied downstream. For UI / logging
|
|
48
|
+
* surfaces that need the original message + status alongside the
|
|
49
|
+
* classification, use {@link classifyErrorDetailed} instead.
|
|
50
|
+
*
|
|
51
|
+
* @param error The thrown value (Error, plain object, or anything else).
|
|
52
|
+
* @param provider The provider that produced the error — affects 400
|
|
53
|
+
* disambiguation and Anthropic-specific 529 (OVERLOADED) handling.
|
|
54
|
+
*/
|
|
55
|
+
export declare function classifyError(error: unknown, provider: AiProvider): AiErrorClassification;
|
|
56
|
+
/**
|
|
57
|
+
* Whether `classification` is one of the categories the library's retry
|
|
58
|
+
* loop will re-attempt: `RATE_LIMIT`, `OVERLOADED`, `TIMEOUT`,
|
|
59
|
+
* `SERVER_ERROR`, `NETWORK_ERROR`. Backed by the {@link RETRYABLE} set.
|
|
60
|
+
* Use this when implementing a custom retry policy on top of
|
|
61
|
+
* {@link classifyError}.
|
|
62
|
+
*/
|
|
63
|
+
export declare function isRetryable(classification: AiErrorClassification): boolean;
|
|
64
|
+
export interface RateLimitInfo {
|
|
65
|
+
readonly tokensRemaining: number | null;
|
|
66
|
+
readonly requestsRemaining: number | null;
|
|
67
|
+
readonly tokensReset: string | null;
|
|
68
|
+
readonly requestsReset: string | null;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Extract rate-limit metadata from a provider error's `headers` field.
|
|
72
|
+
*
|
|
73
|
+
* Returns `null` when the error carries no `headers` at all,
|
|
74
|
+
* letting callers distinguish "no headers in the response" from "headers
|
|
75
|
+
* present but no rate-limit headers parsed". When `headers` is present but
|
|
76
|
+
* none of the recognized rate-limit headers parse, returns a `RateLimitInfo`
|
|
77
|
+
* with all four fields null.
|
|
78
|
+
*
|
|
79
|
+
* Provider coverage: Anthropic, OpenAI, Gemini, Mistral. Bedrock and Cohere
|
|
80
|
+
* intentionally return all-null — Bedrock exposes throttling in the
|
|
81
|
+
* ThrottlingException body rather than response headers; Cohere has no
|
|
82
|
+
* documented rate-limit headers for their Chat v2 API.
|
|
83
|
+
*/
|
|
84
|
+
export declare function extractRateLimitHeaders(error: unknown): RateLimitInfo | null;
|
|
85
|
+
/**
|
|
86
|
+
* Truncate `message` to `maxLength` chars (default 1024), suffixing `...`
|
|
87
|
+
* when truncation occurs. Useful for keeping provider error messages within
|
|
88
|
+
* NR's per-attribute 4096-byte limit before they're logged or attached to
|
|
89
|
+
* events.
|
|
90
|
+
*
|
|
91
|
+
* The minimum effective `maxLength` is 4 — a shorter cap is silently
|
|
92
|
+
* clamped to 4 so the result is always at least `'X...'` for some single
|
|
93
|
+
* character of the original message.
|
|
94
|
+
*
|
|
95
|
+
* Examples:
|
|
96
|
+
* ```
|
|
97
|
+
* truncateErrorMessage('hello world', 8) // => 'hello...'
|
|
98
|
+
* truncateErrorMessage('hi', 8) // => 'hi' (already short)
|
|
99
|
+
* truncateErrorMessage('hello', 3) // => 'h...' (clamp to 4)
|
|
100
|
+
* truncateErrorMessage('hello', 0) // => 'h...' (clamp to 4)
|
|
101
|
+
* ```
|
|
102
|
+
*
|
|
103
|
+
* @param message The message to truncate.
|
|
104
|
+
* @param maxLength Maximum length of the returned string. Values < 4 are
|
|
105
|
+
* clamped to 4. Default is 1024.
|
|
106
|
+
*/
|
|
107
|
+
export declare function truncateErrorMessage(message: string, maxLength?: number): string;
|
|
108
|
+
/**
|
|
109
|
+
* Rich classification result that pairs the {@link AiErrorClassification}
|
|
110
|
+
* enum value with the original error context — message, HTTP status, and
|
|
111
|
+
* Node system code (15, §E6).
|
|
112
|
+
*
|
|
113
|
+
* `code` is the Node system-level error code (e.g. `'ECONNREFUSED'`,
|
|
114
|
+
* `'ETIMEDOUT'`), extracted by walking the cause chain. It is NOT the
|
|
115
|
+
* provider body-level typed code (e.g. `'content_filter'`,
|
|
116
|
+
* `'context_length_exceeded'`) — those only appear inside the 400-body
|
|
117
|
+
* handling of `classifyError` and are not currently surfaced here.
|
|
118
|
+
*/
|
|
119
|
+
export interface ClassifiedError {
|
|
120
|
+
readonly classification: AiErrorClassification;
|
|
121
|
+
readonly originalMessage: string | null;
|
|
122
|
+
readonly status: number | null;
|
|
123
|
+
/** Node system code (e.g. `'ECONNREFUSED'`), or null. Not the provider body error code. */
|
|
124
|
+
readonly code: string | null;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Same classification logic as {@link classifyError}, but returns a
|
|
128
|
+
* {@link ClassifiedError} carrying the original message, HTTP status, and
|
|
129
|
+
* provider error code alongside the enum value. Useful when the caller
|
|
130
|
+
* wants to log a richer line ("Rate limit hit: ...message...") or
|
|
131
|
+
* propagate the original message to a UI surface.
|
|
132
|
+
*
|
|
133
|
+
* The retry path in `http-client.ts` does not currently consume this —
|
|
134
|
+
* its decision is purely "is this retryable?". This is exposed as a
|
|
135
|
+
* separate function so existing callers of `classifyError` continue to
|
|
136
|
+
* work unchanged.
|
|
137
|
+
*/
|
|
138
|
+
export declare function classifyErrorDetailed(error: unknown, provider: AiProvider): ClassifiedError;
|
|
139
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/shared/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,qBAAqB;;;;;;;;;;;CAWxB,CAAC;AACX,MAAM,MAAM,qBAAqB,GAC/B,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,OAAO,qBAAqB,CAAC,CAAC;AAkBrE;;;;;GAKG;AACH,eAAO,MAAM,SAAS,EAAE,WAAW,CAAC,qBAAqB,CAMvD,CAAC;AAsBH;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,GAAG,qBAAqB,CAsFzF;AA4DD;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,cAAc,EAAE,qBAAqB,GAAG,OAAO,CAE1E;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CACvC;AA8ED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,aAAa,GAAG,IAAI,CA8B5E;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,SAAO,GAAG,MAAM,CAS9E;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,cAAc,EAAE,qBAAqB,CAAC;IAC/C,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,2FAA2F;IAC3F,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,GAAG,eAAe,CAc3F"}
|