@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,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default client name stamped on User-Agent headers and OTel scope/logger
|
|
3
|
+
* names when the consumer does not provide one. Single source of truth —
|
|
4
|
+
* import this constant rather than repeating the literal.
|
|
5
|
+
*/
|
|
6
|
+
export declare const DEFAULT_CLIENT_NAME = "ai-telemetry";
|
|
7
|
+
/**
|
|
8
|
+
* Returns true when `headers` contains at least one recognised auth header
|
|
9
|
+
* (`api-key`, `authorization`, or `x-license-key`). Shared by OtlpTransport
|
|
10
|
+
* and OtlpEventBridge so both warn when no auth header is present (§TR4).
|
|
11
|
+
*/
|
|
12
|
+
export declare function hasOtlpAuthHeader(headers: Record<string, string>): boolean;
|
|
13
|
+
export declare function validateOtlpEndpoint(endpoint: string, source: string): void;
|
|
14
|
+
//# sourceMappingURL=otlp-shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"otlp-shared.d.ts","sourceRoot":"","sources":["../../../src/shared/transport/otlp-shared.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,iBAAiB,CAAC;AAElD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAM1E;AAOD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAsB3E"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { createLogger } from '../logger.js';
|
|
2
|
+
const logger = createLogger('otlp-shared');
|
|
3
|
+
/**
|
|
4
|
+
* Default client name stamped on User-Agent headers and OTel scope/logger
|
|
5
|
+
* names when the consumer does not provide one. Single source of truth —
|
|
6
|
+
* import this constant rather than repeating the literal.
|
|
7
|
+
*/
|
|
8
|
+
export const DEFAULT_CLIENT_NAME = 'ai-telemetry';
|
|
9
|
+
/**
|
|
10
|
+
* Returns true when `headers` contains at least one recognised auth header
|
|
11
|
+
* (`api-key`, `authorization`, or `x-license-key`). Shared by OtlpTransport
|
|
12
|
+
* and OtlpEventBridge so both warn when no auth header is present (§TR4).
|
|
13
|
+
*/
|
|
14
|
+
export function hasOtlpAuthHeader(headers) {
|
|
15
|
+
for (const key of Object.keys(headers)) {
|
|
16
|
+
const lk = key.toLowerCase();
|
|
17
|
+
if (lk === 'api-key' || lk === 'authorization' || lk === 'x-license-key')
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
// validate OTLP endpoint scheme. https:// is required for
|
|
23
|
+
// any non-localhost destination because the payload may contain user prompt
|
|
24
|
+
// fragments (PII). Plain http:// is allowed only against loopback to support
|
|
25
|
+
// local development and testing. Shared by OtlpTransport and OtlpEventBridge
|
|
26
|
+
// (§OT2 — deduplicates previously identical implementations).
|
|
27
|
+
export function validateOtlpEndpoint(endpoint, source) {
|
|
28
|
+
let parsed;
|
|
29
|
+
try {
|
|
30
|
+
parsed = new URL(endpoint);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
throw new Error(`${source}: invalid OTLP endpoint URL: ${endpoint}`);
|
|
34
|
+
}
|
|
35
|
+
if (parsed.protocol === 'https:')
|
|
36
|
+
return;
|
|
37
|
+
if (parsed.protocol !== 'http:') {
|
|
38
|
+
throw new Error(`${source}: OTLP endpoint must use http(s); got ${parsed.protocol}`);
|
|
39
|
+
}
|
|
40
|
+
// http://: only acceptable on loopback
|
|
41
|
+
const host = parsed.hostname;
|
|
42
|
+
// 0.0.0.0 is a wildcard that binds to ALL interfaces, not loopback only —
|
|
43
|
+
// cleartext traffic to it is reachable from any network (§TR5).
|
|
44
|
+
const isLoopback = host === 'localhost' || host === '127.0.0.1' || host === '::1';
|
|
45
|
+
if (!isLoopback) {
|
|
46
|
+
logger.warn(`${source}: OTLP endpoint uses plain http:// to a non-loopback host — payload may contain PII and should not be transmitted in cleartext`, { endpoint });
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=otlp-shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"otlp-shared.js","sourceRoot":"","sources":["../../../src/shared/transport/otlp-shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,MAAM,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC;AAE3C;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,cAAc,CAAC;AAElD;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAA+B;IAC/D,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,MAAM,EAAE,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;QAC7B,IAAI,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,eAAe,IAAI,EAAE,KAAK,eAAe;YAAE,OAAO,IAAI,CAAC;IACxF,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,0DAA0D;AAC1D,4EAA4E;AAC5E,6EAA6E;AAC7E,6EAA6E;AAC7E,8DAA8D;AAC9D,MAAM,UAAU,oBAAoB,CAAC,QAAgB,EAAE,MAAc;IACnE,IAAI,MAAW,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,gCAAgC,QAAQ,EAAE,CAAC,CAAC;IACvE,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO;IACzC,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,yCAAyC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IACvF,CAAC;IACD,uCAAuC;IACvC,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC7B,0EAA0E;IAC1E,gEAAgE;IAChE,MAAM,UAAU,GAAG,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,KAAK,CAAC;IAClF,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,CAAC,IAAI,CACT,GAAG,MAAM,gIAAgI,EACzI,EAAE,QAAQ,EAAE,CACb,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { NrMetric } from './types.js';
|
|
2
|
+
export interface OtlpTransportOptions {
|
|
3
|
+
endpoint: string;
|
|
4
|
+
headers?: Record<string, string>;
|
|
5
|
+
appName: string;
|
|
6
|
+
/** Override the default 30-second request timeout for exportMetrics (§TR7). */
|
|
7
|
+
requestTimeoutMs?: number;
|
|
8
|
+
/**
|
|
9
|
+
* Identifies the consuming client in the `User-Agent` header and as the
|
|
10
|
+
* OTel instrumentation scope name. Defaults to
|
|
11
|
+
* `'ai-telemetry'` when not provided. Pass `'preflight'`, `'my-agent'`,
|
|
12
|
+
* etc. so telemetry from different consumers is distinguishable.
|
|
13
|
+
*/
|
|
14
|
+
clientName?: string;
|
|
15
|
+
}
|
|
16
|
+
export declare class OtlpTransport {
|
|
17
|
+
private readonly traceExporter;
|
|
18
|
+
private readonly metricExporter;
|
|
19
|
+
private readonly tracerProvider;
|
|
20
|
+
private readonly meterProvider;
|
|
21
|
+
private readonly endpoint;
|
|
22
|
+
private readonly headers;
|
|
23
|
+
private readonly requestTimeoutMs;
|
|
24
|
+
private readonly clientName;
|
|
25
|
+
private hasWarnedNoAuth;
|
|
26
|
+
/**
|
|
27
|
+
* Resource attributes shared by both the SDK-driven path (tracer/meter
|
|
28
|
+
* providers) and the manual `exportMetrics` payload.
|
|
29
|
+
* Keeping a single resolved attribute map prevents `service.name` from
|
|
30
|
+
* drifting between the two paths — previously `this.appName` was stored
|
|
31
|
+
* separately and re-encoded into the OTLP envelope, which would silently
|
|
32
|
+
* diverge if anyone added a second resource attribute.
|
|
33
|
+
*/
|
|
34
|
+
private readonly resourceAttributes;
|
|
35
|
+
constructor(options: OtlpTransportOptions);
|
|
36
|
+
flush(): Promise<void>;
|
|
37
|
+
shutdown(): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Return an OTel `Tracer` for the given instrumentation name. The returned
|
|
40
|
+
* value is the `Tracer` interface from `@opentelemetry/api`
|
|
41
|
+
*; consumers that bind to the type explicitly should
|
|
42
|
+
* `import type { Tracer } from '@opentelemetry/api'`. `@opentelemetry/api`
|
|
43
|
+
* is already a regular dependency of this package, so no extra install is
|
|
44
|
+
* required. The type is intentionally NOT re-exported from this package's
|
|
45
|
+
* public surface — keeping the public API minimal so consumers that never
|
|
46
|
+
* use OTel tracing don't see an OTel-shaped type graph leaking through
|
|
47
|
+
* unrelated imports.
|
|
48
|
+
*/
|
|
49
|
+
getTracer(name: string): import("@opentelemetry/api").Tracer;
|
|
50
|
+
/**
|
|
51
|
+
* Return an OTel `Meter` for the given instrumentation name. See
|
|
52
|
+
* {@link getTracer} for the dependency story; same rules apply
|
|
53
|
+
* (`import type { Meter } from '@opentelemetry/api'`).
|
|
54
|
+
*/
|
|
55
|
+
getMeter(name: string): import("@opentelemetry/api").Meter;
|
|
56
|
+
exportMetrics(metrics: NrMetric[]): Promise<void>;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=otlp-transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"otlp-transport.d.ts","sourceRoot":"","sources":["../../../src/shared/transport/otlp-transport.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAiD,MAAM,YAAY,CAAC;AAQ1F,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,+EAA+E;IAC/E,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoB;IAClD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqB;IACpD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAsB;IACrD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IACjD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,eAAe,CAAS;IAChC;;;;;;;OAOG;IACH,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAmC;gBAE1D,OAAO,EAAE,oBAAoB;IAqCnC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAK/B;;;;;;;;;;OAUG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM;IAItB;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM;IAIf,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAwJxD"}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { gzip } from 'node:zlib';
|
|
2
|
+
import { promisify } from 'node:util';
|
|
3
|
+
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
|
|
4
|
+
import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http';
|
|
5
|
+
import { BasicTracerProvider, BatchSpanProcessor } from '@opentelemetry/sdk-trace-node';
|
|
6
|
+
import { MeterProvider, PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics';
|
|
7
|
+
import { resourceFromAttributes } from '@opentelemetry/resources';
|
|
8
|
+
import { createLogger } from '../logger.js';
|
|
9
|
+
import { validateOtlpEndpoint, hasOtlpAuthHeader, DEFAULT_CLIENT_NAME } from './otlp-shared.js';
|
|
10
|
+
import { VERSION } from '../version.js';
|
|
11
|
+
const gzipAsync = promisify(gzip);
|
|
12
|
+
const logger = createLogger('otlp-transport');
|
|
13
|
+
export class OtlpTransport {
|
|
14
|
+
traceExporter;
|
|
15
|
+
metricExporter;
|
|
16
|
+
tracerProvider;
|
|
17
|
+
meterProvider;
|
|
18
|
+
endpoint;
|
|
19
|
+
headers;
|
|
20
|
+
requestTimeoutMs;
|
|
21
|
+
clientName;
|
|
22
|
+
hasWarnedNoAuth = false;
|
|
23
|
+
/**
|
|
24
|
+
* Resource attributes shared by both the SDK-driven path (tracer/meter
|
|
25
|
+
* providers) and the manual `exportMetrics` payload.
|
|
26
|
+
* Keeping a single resolved attribute map prevents `service.name` from
|
|
27
|
+
* drifting between the two paths — previously `this.appName` was stored
|
|
28
|
+
* separately and re-encoded into the OTLP envelope, which would silently
|
|
29
|
+
* diverge if anyone added a second resource attribute.
|
|
30
|
+
*/
|
|
31
|
+
resourceAttributes;
|
|
32
|
+
constructor(options) {
|
|
33
|
+
validateOtlpEndpoint(options.endpoint, 'OtlpTransport');
|
|
34
|
+
this.clientName = options.clientName || DEFAULT_CLIENT_NAME;
|
|
35
|
+
this.resourceAttributes = Object.freeze({ 'service.name': options.appName });
|
|
36
|
+
const resource = resourceFromAttributes({ ...this.resourceAttributes });
|
|
37
|
+
this.endpoint = options.endpoint;
|
|
38
|
+
this.headers = options.headers ?? {};
|
|
39
|
+
this.requestTimeoutMs = options.requestTimeoutMs ?? 30_000;
|
|
40
|
+
this.traceExporter = new OTLPTraceExporter({
|
|
41
|
+
url: `${options.endpoint}/v1/traces`,
|
|
42
|
+
headers: options.headers ?? {},
|
|
43
|
+
});
|
|
44
|
+
this.metricExporter = new OTLPMetricExporter({
|
|
45
|
+
url: `${options.endpoint}/v1/metrics`,
|
|
46
|
+
headers: options.headers ?? {},
|
|
47
|
+
});
|
|
48
|
+
this.tracerProvider = new BasicTracerProvider({
|
|
49
|
+
resource,
|
|
50
|
+
spanProcessors: [new BatchSpanProcessor(this.traceExporter)],
|
|
51
|
+
});
|
|
52
|
+
this.meterProvider = new MeterProvider({
|
|
53
|
+
resource,
|
|
54
|
+
readers: [
|
|
55
|
+
new PeriodicExportingMetricReader({
|
|
56
|
+
exporter: this.metricExporter,
|
|
57
|
+
exportIntervalMillis: 60_000,
|
|
58
|
+
}),
|
|
59
|
+
],
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
async flush() {
|
|
63
|
+
await this.tracerProvider.forceFlush();
|
|
64
|
+
await this.meterProvider.forceFlush();
|
|
65
|
+
}
|
|
66
|
+
async shutdown() {
|
|
67
|
+
await this.tracerProvider.shutdown();
|
|
68
|
+
await this.meterProvider.shutdown();
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Return an OTel `Tracer` for the given instrumentation name. The returned
|
|
72
|
+
* value is the `Tracer` interface from `@opentelemetry/api`
|
|
73
|
+
*; consumers that bind to the type explicitly should
|
|
74
|
+
* `import type { Tracer } from '@opentelemetry/api'`. `@opentelemetry/api`
|
|
75
|
+
* is already a regular dependency of this package, so no extra install is
|
|
76
|
+
* required. The type is intentionally NOT re-exported from this package's
|
|
77
|
+
* public surface — keeping the public API minimal so consumers that never
|
|
78
|
+
* use OTel tracing don't see an OTel-shaped type graph leaking through
|
|
79
|
+
* unrelated imports.
|
|
80
|
+
*/
|
|
81
|
+
getTracer(name) {
|
|
82
|
+
return this.tracerProvider.getTracer(name);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Return an OTel `Meter` for the given instrumentation name. See
|
|
86
|
+
* {@link getTracer} for the dependency story; same rules apply
|
|
87
|
+
* (`import type { Meter } from '@opentelemetry/api'`).
|
|
88
|
+
*/
|
|
89
|
+
getMeter(name) {
|
|
90
|
+
return this.meterProvider.getMeter(name);
|
|
91
|
+
}
|
|
92
|
+
async exportMetrics(metrics) {
|
|
93
|
+
if (metrics.length === 0)
|
|
94
|
+
return;
|
|
95
|
+
// Warn ONCE when no auth header is present — emitting on every call would
|
|
96
|
+
// flood stderr with identical lines in long-running agents (§TR1).
|
|
97
|
+
if (!hasOtlpAuthHeader(this.headers) && !this.hasWarnedNoAuth) {
|
|
98
|
+
this.hasWarnedNoAuth = true;
|
|
99
|
+
logger.warn('OTLP metric export attempted with no auth header — collector may reject', {
|
|
100
|
+
endpoint: this.endpoint,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
const otlpAttributes = (attrs) => Object.entries(attrs ?? {}).map(([key, value]) => ({
|
|
104
|
+
key,
|
|
105
|
+
value: typeof value === 'number'
|
|
106
|
+
? { doubleValue: value }
|
|
107
|
+
: typeof value === 'boolean'
|
|
108
|
+
? { boolValue: value }
|
|
109
|
+
: { stringValue: String(value) },
|
|
110
|
+
}));
|
|
111
|
+
const numericDataPoint = (m) => ({
|
|
112
|
+
// For count (delta Sum) metrics, include startTimeUnixNano per the OTLP
|
|
113
|
+
// spec (§TR2). Gauge data points do not require it but it is harmless.
|
|
114
|
+
// Clamp to 0: if timestamp < intervalMs (misconfigured metric), a negative
|
|
115
|
+
// startTimeUnixNano would be rejected by strict OTLP collectors (§TR7).
|
|
116
|
+
startTimeUnixNano: m.type === 'count' ? Math.max(0, m.timestamp - m.intervalMs) * 1_000_000 : undefined,
|
|
117
|
+
timeUnixNano: m.timestamp * 1_000_000,
|
|
118
|
+
asDouble: m.value,
|
|
119
|
+
attributes: otlpAttributes(m.attributes),
|
|
120
|
+
});
|
|
121
|
+
// summary is now a first-class type with a structured
|
|
122
|
+
// value `{ count, sum, min, max }`. OTLP doesn't have a single
|
|
123
|
+
// "Summary"-shaped metric kind; the closest faithful mapping is OTLP
|
|
124
|
+
// Histogram with explicit `count` and `sum` fields plus per-data-point
|
|
125
|
+
// `min` / `max`. Bucket boundaries are intentionally omitted: NR doesn't
|
|
126
|
+
// need them for summary aggregation, and emitting empty `bucketCounts`
|
|
127
|
+
// alongside `min`/`max` is the documented OTLP shape for unbucketed
|
|
128
|
+
// summaries (`explicitBounds: []`, `bucketCounts: [<count>]`).
|
|
129
|
+
const summaryDataPoint = (m) => ({
|
|
130
|
+
// OTLP Histogram with DELTA temporality requires startTimeUnixNano (§TR2).
|
|
131
|
+
startTimeUnixNano: Math.max(0, m.timestamp - m.intervalMs) * 1_000_000,
|
|
132
|
+
timeUnixNano: m.timestamp * 1_000_000,
|
|
133
|
+
attributes: otlpAttributes(m.attributes),
|
|
134
|
+
count: m.value.count,
|
|
135
|
+
sum: m.value.sum,
|
|
136
|
+
min: m.value.min,
|
|
137
|
+
max: m.value.max,
|
|
138
|
+
bucketCounts: [m.value.count],
|
|
139
|
+
explicitBounds: [],
|
|
140
|
+
});
|
|
141
|
+
// Map NrMetric.type → OTLP metric kind:
|
|
142
|
+
// - `gauge` → OTLP Gauge (point-in-time numeric value)
|
|
143
|
+
// - `count` → OTLP Sum (monotonic, DELTA aggregation temporality = 1).
|
|
144
|
+
// NrCountMetric carries intervalMs — it represents a bounded-interval
|
|
145
|
+
// delta, not a cumulative running total. Using CUMULATIVE (2) would
|
|
146
|
+
// cause downstream collectors to treat each harvest as a monotonically-
|
|
147
|
+
// increasing total, producing incorrect rate calculations (§TR1).
|
|
148
|
+
// - `summary` → OTLP Histogram (with explicit min/max/sum/count fields,
|
|
149
|
+
// no buckets) — see §4.9 note above on why histogram is the closest
|
|
150
|
+
// faithful mapping.
|
|
151
|
+
const otlpMetric = (m) => {
|
|
152
|
+
if (m.type === 'count') {
|
|
153
|
+
return {
|
|
154
|
+
name: m.name,
|
|
155
|
+
sum: {
|
|
156
|
+
dataPoints: [numericDataPoint(m)],
|
|
157
|
+
// 1 = DELTA — the value represents the count within intervalMs,
|
|
158
|
+
// not a cumulative total from a fixed epoch.
|
|
159
|
+
aggregationTemporality: 1,
|
|
160
|
+
isMonotonic: true,
|
|
161
|
+
},
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
if (m.type === 'summary') {
|
|
165
|
+
return {
|
|
166
|
+
name: m.name,
|
|
167
|
+
histogram: {
|
|
168
|
+
dataPoints: [summaryDataPoint(m)],
|
|
169
|
+
// Aggregation temporality 1 = DELTA (the count/sum/min/max
|
|
170
|
+
// describe the harvest interval, not a cumulative total).
|
|
171
|
+
aggregationTemporality: 1,
|
|
172
|
+
},
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
return { name: m.name, gauge: { dataPoints: [numericDataPoint(m)] } };
|
|
176
|
+
};
|
|
177
|
+
const payload = {
|
|
178
|
+
resourceMetrics: [
|
|
179
|
+
{
|
|
180
|
+
resource: {
|
|
181
|
+
attributes: Object.entries(this.resourceAttributes).map(([key, value]) => ({
|
|
182
|
+
key,
|
|
183
|
+
value: { stringValue: value },
|
|
184
|
+
})),
|
|
185
|
+
},
|
|
186
|
+
scopeMetrics: [
|
|
187
|
+
{
|
|
188
|
+
scope: { name: this.clientName },
|
|
189
|
+
metrics: metrics.map(otlpMetric),
|
|
190
|
+
},
|
|
191
|
+
],
|
|
192
|
+
},
|
|
193
|
+
],
|
|
194
|
+
};
|
|
195
|
+
// exportMetrics MUST surface failures so
|
|
196
|
+
// HarvestScheduler.sendMetricsToOtlp can catch and requeue into
|
|
197
|
+
// retryOtlpMetricBatch. Previously this method swallowed errors with
|
|
198
|
+
// a logger.warn and resolved successfully, which silently dropped
|
|
199
|
+
// every OTLP metric failure and made the scheduler's per-OTLP retry
|
|
200
|
+
// buffer dead code. Note this is asymmetric with OTLP *events*: the
|
|
201
|
+
// event path goes through OtlpEventBridge → BatchLogRecordProcessor,
|
|
202
|
+
// which retries internally inside the OTel SDK, so the scheduler-
|
|
203
|
+
// level retry queue is rarely engaged for events. For metrics, we
|
|
204
|
+
// intentionally rely on the scheduler's retry queue instead — there
|
|
205
|
+
// is no PeriodicExportingMetricReader in this code path.
|
|
206
|
+
// Gzip-compress the payload to match sendWithRetry (§TR3). The NR OTLP
|
|
207
|
+
// endpoint accepts gzip; for large metric batches this is a 5-10× size win.
|
|
208
|
+
const compressed = await gzipAsync(JSON.stringify(payload));
|
|
209
|
+
const response = await fetch(`${this.endpoint}/v1/metrics`, {
|
|
210
|
+
method: 'POST',
|
|
211
|
+
headers: {
|
|
212
|
+
'Content-Type': 'application/json',
|
|
213
|
+
'Content-Encoding': 'gzip',
|
|
214
|
+
'User-Agent': `${this.clientName}/${VERSION}`,
|
|
215
|
+
...this.headers,
|
|
216
|
+
},
|
|
217
|
+
body: compressed,
|
|
218
|
+
signal: AbortSignal.timeout(this.requestTimeoutMs),
|
|
219
|
+
// §5.20 — see http-client.ts for rationale.
|
|
220
|
+
keepalive: true,
|
|
221
|
+
});
|
|
222
|
+
if (!response.ok) {
|
|
223
|
+
const body = await response.text().catch(() => '');
|
|
224
|
+
const msg = `OTLP metric export failed: HTTP ${response.status}${body ? ` — ${body.slice(0, 256)}` : ''}`;
|
|
225
|
+
// 400 means the payload itself is malformed — retrying the same payload
|
|
226
|
+
// will always fail, so surface this as a distinct non-retryable error (§TR9).
|
|
227
|
+
if (response.status === 400) {
|
|
228
|
+
throw Object.assign(new Error(msg), { code: 'OTLP_BAD_REQUEST' });
|
|
229
|
+
}
|
|
230
|
+
throw new Error(msg);
|
|
231
|
+
}
|
|
232
|
+
// Drain on success so undici returns the socket to the keep-alive pool (§HC1).
|
|
233
|
+
await response.body?.cancel().catch(() => { });
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=otlp-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"otlp-transport.js","sourceRoot":"","sources":["../../../src/shared/transport/otlp-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Selects which downstream transport(s) the harvest scheduler ships to
|
|
3
|
+
*. Single source of truth for the literal union — both
|
|
4
|
+
* `AgentConfig.transport` and `HarvestSchedulerOptions.transport` consume
|
|
5
|
+
* this type so a future addition (e.g. a Datadog transport) only needs to
|
|
6
|
+
* widen the union here.
|
|
7
|
+
*
|
|
8
|
+
* **This is a TypeScript-only type alias, not a runtime value.** Consumers
|
|
9
|
+
* import it with `import type { TransportMode } from '@newrelic/ai-telemetry'`
|
|
10
|
+
* and pass the bare string literals at runtime — `transport: 'otlp'` rather
|
|
11
|
+
* than `transport: TransportMode.OTLP`. There is no enum-like object to
|
|
12
|
+
* dot-access; a runtime membership check should compare against the
|
|
13
|
+
* literal strings directly (see `envTransport()` in `src/config.ts` for
|
|
14
|
+
* the canonical narrowing pattern).
|
|
15
|
+
*
|
|
16
|
+
* - `'nr-events-api'` — stream NR events through the dedicated Events API
|
|
17
|
+
* and metrics through the Metric API. Default. Lowest-latency path for
|
|
18
|
+
* `AiRequest` / `AiResponse` style events.
|
|
19
|
+
* - `'otlp'` — stream the same data over OTLP/HTTP, both spans
|
|
20
|
+
* (events bridged via `OtlpEventBridge`) and metrics. Pick this when the
|
|
21
|
+
* collector is an OTel-native one or when the consumer wants spans
|
|
22
|
+
* instead of NR custom events.
|
|
23
|
+
* - `'both'` — fan out to NR Events API AND OTLP. Each transport
|
|
24
|
+
* keeps its own retry buffer; a NR-side failure does not double-send to
|
|
25
|
+
* OTLP.
|
|
26
|
+
*/
|
|
27
|
+
export type TransportMode = 'nr-events-api' | 'otlp' | 'both';
|
|
28
|
+
/**
|
|
29
|
+
* Wire-format value for an `NrMetric` of type `'summary'`.
|
|
30
|
+
* Mirrors the NR Metric API summary shape exactly.
|
|
31
|
+
*/
|
|
32
|
+
export interface NrMetricSummaryValue {
|
|
33
|
+
readonly count: number;
|
|
34
|
+
readonly sum: number;
|
|
35
|
+
readonly min: number;
|
|
36
|
+
readonly max: number;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Common fields on every NR metric type.
|
|
40
|
+
*
|
|
41
|
+
* NB: when serialized to the wire, `intervalMs` becomes the JSON key
|
|
42
|
+
* `'interval.ms'` per NR's Metric API contract — see `sendMetrics` in
|
|
43
|
+
* `metric-api.ts` for the per-metric rename. The TypeScript identifier
|
|
44
|
+
* is camelCased to keep call sites idiomatic.
|
|
45
|
+
*/
|
|
46
|
+
export interface NrMetricBase {
|
|
47
|
+
readonly name: string;
|
|
48
|
+
readonly timestamp: number;
|
|
49
|
+
readonly attributes?: Record<string, string | number | boolean>;
|
|
50
|
+
/**
|
|
51
|
+
* Interval (ms) over which the count or summary was sampled. Required for
|
|
52
|
+
* `count` and `summary` metric types per NR's Metric API; ignored for
|
|
53
|
+
* `gauge` (point-in-time) metrics. Renamed to `interval.ms` on the wire.
|
|
54
|
+
*/
|
|
55
|
+
readonly intervalMs?: number;
|
|
56
|
+
}
|
|
57
|
+
/** Point-in-time gauge metric. */
|
|
58
|
+
export interface NrGaugeMetric extends NrMetricBase {
|
|
59
|
+
readonly type: 'gauge';
|
|
60
|
+
readonly value: number;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Delta-count metric over the interval window. NR treats `count` as the
|
|
64
|
+
* number of events observed during `intervalMs`.
|
|
65
|
+
*/
|
|
66
|
+
export interface NrCountMetric extends NrMetricBase {
|
|
67
|
+
readonly type: 'count';
|
|
68
|
+
readonly value: number;
|
|
69
|
+
readonly intervalMs: number;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Pre-aggregated summary metric — `count`, `sum`, `min`, `max` over the
|
|
73
|
+
* interval window. One summary metric replaces what would otherwise be four
|
|
74
|
+
* separate `.count` / `.sum` / `.min` / `.max` data points,
|
|
75
|
+
* halving payload cardinality and matching NR's NRQL ergonomics.
|
|
76
|
+
*/
|
|
77
|
+
export interface NrSummaryMetric extends NrMetricBase {
|
|
78
|
+
readonly type: 'summary';
|
|
79
|
+
readonly value: NrMetricSummaryValue;
|
|
80
|
+
readonly intervalMs: number;
|
|
81
|
+
}
|
|
82
|
+
export type NrMetric = NrGaugeMetric | NrCountMetric | NrSummaryMetric;
|
|
83
|
+
export interface TransportOptions {
|
|
84
|
+
/** NR account ID — required for Events API URL path. */
|
|
85
|
+
readonly accountId: string;
|
|
86
|
+
/** Override collector host; used for EU region routing or custom endpoints. */
|
|
87
|
+
readonly collectorHost?: string | null;
|
|
88
|
+
/** Max retry attempts for retryable errors. Default: 3. */
|
|
89
|
+
readonly maxRetries?: number;
|
|
90
|
+
/** Base delay in ms for exponential backoff. Default: 1000. */
|
|
91
|
+
readonly baseDelayMs?: number;
|
|
92
|
+
/** Maximum delay in ms for backoff cap. Default: 30000. */
|
|
93
|
+
readonly maxDelayMs?: number;
|
|
94
|
+
/**
|
|
95
|
+
* Per-request timeout in ms — aborts the in-flight fetch and lets the
|
|
96
|
+
* retry/backoff machinery handle it. Default: 30000.
|
|
97
|
+
*
|
|
98
|
+
* Without this, a hung TCP connection stalls the entire harvest loop
|
|
99
|
+
* indefinitely with no recovery.
|
|
100
|
+
*/
|
|
101
|
+
readonly requestTimeoutMs?: number;
|
|
102
|
+
/**
|
|
103
|
+
* Identifies the consuming client in the `User-Agent` header sent to NR
|
|
104
|
+
* ingest endpoints (e.g. `'preflight'`, `'my-agent'`). Defaults to
|
|
105
|
+
* `'ai-telemetry'` when not provided.
|
|
106
|
+
*/
|
|
107
|
+
readonly clientName?: string;
|
|
108
|
+
}
|
|
109
|
+
export interface TransportResult {
|
|
110
|
+
readonly success: boolean;
|
|
111
|
+
readonly statusCode: number | null;
|
|
112
|
+
readonly retryCount: number;
|
|
113
|
+
readonly error?: string;
|
|
114
|
+
}
|
|
115
|
+
export interface HttpSendOptions {
|
|
116
|
+
readonly url: string;
|
|
117
|
+
readonly body: unknown;
|
|
118
|
+
readonly licenseKey: string;
|
|
119
|
+
readonly maxRetries: number;
|
|
120
|
+
readonly baseDelayMs: number;
|
|
121
|
+
readonly maxDelayMs: number;
|
|
122
|
+
readonly requestTimeoutMs: number;
|
|
123
|
+
/**
|
|
124
|
+
* Identifies the consuming client in the `User-Agent` header. Defaults to
|
|
125
|
+
* `'ai-telemetry'` when not provided.
|
|
126
|
+
*/
|
|
127
|
+
readonly clientName?: string;
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/shared/transport/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,MAAM,aAAa,GAAG,eAAe,GAAG,MAAM,GAAG,MAAM,CAAC;AAE9D;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;IAChE;;;;OAIG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,kCAAkC;AAClC,MAAM,WAAW,aAAc,SAAQ,YAAY;IACjD,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED;;;GAGG;AACH,MAAM,WAAW,aAAc,SAAQ,YAAY;IACjD,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;GAKG;AACH,MAAM,WAAW,eAAgB,SAAQ,YAAY;IACnD,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,oBAAoB,CAAC;IACrC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,MAAM,QAAQ,GAAG,aAAa,GAAG,aAAa,GAAG,eAAe,CAAC;AAEvE,MAAM,WAAW,gBAAgB;IAC/B,wDAAwD;IACxD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,+EAA+E;IAC/E,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,2DAA2D;IAC3D,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,+DAA+D;IAC/D,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,2DAA2D;IAC3D,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B;;;;;;OAMG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC;;;;OAIG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC;;;OAGG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/shared/transport/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/shared/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,UAAU,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/shared/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { LocalStore } from './local-store.js';
|
|
2
|
+
export type { HookEvent, SessionSummary, AuditEntry, ReplayTimelineEntry } from './types.js';
|
|
3
|
+
export { SessionStore, buildSessionSummary } from './session-store.js';
|
|
4
|
+
export type { FullSessionSummary, SessionFileInfo } from './session-store.js';
|
|
5
|
+
export { WeeklySummaryGenerator, getIsoWeekId } from './weekly-summary.js';
|
|
6
|
+
export type { WeeklySummary, DeveloperWeeklyStats } from './weekly-summary.js';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAC7F,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACvE,YAAY,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,sBAAsB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC3E,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEvE,OAAO,EAAE,sBAAsB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC"}
|