@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,351 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { safeInt } from '../tokens.js';
|
|
3
|
+
import { createLogger } from '../logger.js';
|
|
4
|
+
const factoryLogger = createLogger('events-factory');
|
|
5
|
+
// Mirror safeInt but for float cost fields: NaN / Infinity -> null (§F1).
|
|
6
|
+
function safeFiniteOrNull(v) {
|
|
7
|
+
if (v == null)
|
|
8
|
+
return null;
|
|
9
|
+
return Number.isFinite(v) ? v : null;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Warn-once for missing entityGuid.
|
|
13
|
+
*
|
|
14
|
+
* NR's entity model usually requires both `appName` and `entityGuid` to attach
|
|
15
|
+
* events to a specific entity surface (APM service, browser app, etc.).
|
|
16
|
+
* Without an entityGuid, events still ingest but land in a "standalone events"
|
|
17
|
+
* view rather than attaching to a service.
|
|
18
|
+
*
|
|
19
|
+
* §11.8: warn once PER EVENT TYPE rather than once globally. The old boolean
|
|
20
|
+
* flag would silence all subsequent factory calls after the very first
|
|
21
|
+
* missing-entityGuid event, regardless of type — an operator who added
|
|
22
|
+
* entityGuid to AiRequest but not AiAgentTaskSummary would never see the
|
|
23
|
+
* warning for the summary events. A Set keyed by eventType gives one warning
|
|
24
|
+
* per type, covering partial-coverage scenarios without flooding stderr.
|
|
25
|
+
*/
|
|
26
|
+
const entityGuidWarnedTypes = new Set();
|
|
27
|
+
function warnIfMissingEntityGuid(eventType, entityGuid) {
|
|
28
|
+
if (entityGuidWarnedTypes.has(eventType))
|
|
29
|
+
return;
|
|
30
|
+
if (entityGuid === null || entityGuid === undefined || entityGuid === '') {
|
|
31
|
+
entityGuidWarnedTypes.add(eventType);
|
|
32
|
+
factoryLogger.warn(`${eventType} created without entityGuid — events will not attach to an NR entity. ` +
|
|
33
|
+
'Pass entityGuid alongside appName for entity-scoped routing.');
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Reset the warn-once set. Test-only — production code never resets.
|
|
38
|
+
* Exported behind a `__` prefix so it's clearly internal.
|
|
39
|
+
*/
|
|
40
|
+
export function __resetEntityGuidWarning() {
|
|
41
|
+
entityGuidWarnedTypes.clear();
|
|
42
|
+
}
|
|
43
|
+
export function createAiRequest(params) {
|
|
44
|
+
if (!params.model) {
|
|
45
|
+
throw new Error('AiRequest requires a model');
|
|
46
|
+
}
|
|
47
|
+
if (!params.provider) {
|
|
48
|
+
throw new Error('AiRequest requires a provider');
|
|
49
|
+
}
|
|
50
|
+
if (!params.requestMethod) {
|
|
51
|
+
throw new Error('AiRequest requires a requestMethod');
|
|
52
|
+
}
|
|
53
|
+
if (!params.appName) {
|
|
54
|
+
throw new Error('AiRequest requires an appName');
|
|
55
|
+
}
|
|
56
|
+
warnIfMissingEntityGuid('AiRequest', params.entityGuid);
|
|
57
|
+
return {
|
|
58
|
+
id: params.id ?? randomUUID(),
|
|
59
|
+
timestamp: params.timestamp ?? Date.now(),
|
|
60
|
+
provider: params.provider,
|
|
61
|
+
model: params.model,
|
|
62
|
+
requestMethod: params.requestMethod,
|
|
63
|
+
// Sanitize numeric fields so NaN / Infinity / negative values don't reach
|
|
64
|
+
// the wire (§EV1). safeInt for integer counts; safeFiniteOrNull for floats.
|
|
65
|
+
maxTokens: params.maxTokens != null ? safeInt(params.maxTokens) : null,
|
|
66
|
+
temperature: safeFiniteOrNull(params.temperature),
|
|
67
|
+
topP: safeFiniteOrNull(params.topP),
|
|
68
|
+
systemPromptLength: params.systemPromptLength != null ? safeInt(params.systemPromptLength) : null,
|
|
69
|
+
messageCount: safeInt(params.messageCount),
|
|
70
|
+
toolCount: safeInt(params.toolCount ?? 0),
|
|
71
|
+
toolNames: params.toolNames ?? [],
|
|
72
|
+
thinkingEnabled: params.thinkingEnabled ?? false,
|
|
73
|
+
thinkingBudgetTokens: params.thinkingBudgetTokens != null ? safeInt(params.thinkingBudgetTokens) : null,
|
|
74
|
+
streamingEnabled: params.streamingEnabled,
|
|
75
|
+
'nr.appName': params.appName,
|
|
76
|
+
'nr.entityGuid': params.entityGuid ?? null,
|
|
77
|
+
customAttributes: params.customAttributes ?? {},
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
export function createAiResponse(params) {
|
|
81
|
+
if (!params.model) {
|
|
82
|
+
throw new Error('AiResponse requires a model');
|
|
83
|
+
}
|
|
84
|
+
if (!params.provider) {
|
|
85
|
+
throw new Error('AiResponse requires a provider');
|
|
86
|
+
}
|
|
87
|
+
if (!params.appName) {
|
|
88
|
+
throw new Error('AiResponse requires an appName');
|
|
89
|
+
}
|
|
90
|
+
warnIfMissingEntityGuid('AiResponse', params.entityGuid);
|
|
91
|
+
// coerce token fields through safeInt so NaN, Infinity,
|
|
92
|
+
// negative numbers, and floats from buggy callers don't propagate as
|
|
93
|
+
// null/Infinity into the serialized event (where JSON.stringify maps them
|
|
94
|
+
// to "null", which NR Events API silently drops).
|
|
95
|
+
const inputTokens = safeInt(params.inputTokens);
|
|
96
|
+
const outputTokens = safeInt(params.outputTokens);
|
|
97
|
+
const thinkingTokens = safeInt(params.thinkingTokens);
|
|
98
|
+
const cacheReadTokens = safeInt(params.cacheReadTokens);
|
|
99
|
+
const cacheCreationTokens = safeInt(params.cacheCreationTokens);
|
|
100
|
+
// For Google and OpenAI, inputTokens already includes cached content (cache
|
|
101
|
+
// tokens are a subset, not additive). Adding them again double-counts (§EV2).
|
|
102
|
+
// Same provider-aware logic as serialize.ts gen_ai.usage.input_tokens (§S1).
|
|
103
|
+
//
|
|
104
|
+
// §11.2: For OpenAI, thinkingTokens (reasoning_tokens from
|
|
105
|
+
// completion_tokens_details) is already a SUBSET of outputTokens
|
|
106
|
+
// (completion_tokens) — not a separate additive field. The prior code
|
|
107
|
+
// added it unconditionally, relying on a comment that said "extractors
|
|
108
|
+
// produce thinkingTokens=0 for OpenAI" — which is false for o1/o3/o4-mini.
|
|
109
|
+
// Fix: OpenAI totalTokens = inputTokens + outputTokens (no thinking, no cache).
|
|
110
|
+
// For Google, thinkingTokens (thoughtsTokenCount) IS disjoint from
|
|
111
|
+
// outputTokens (candidatesTokenCount) per the Gemini API spec, so it is
|
|
112
|
+
// still added for that provider.
|
|
113
|
+
const totalTokens = params.provider === 'openai'
|
|
114
|
+
? inputTokens + outputTokens
|
|
115
|
+
: params.provider === 'google'
|
|
116
|
+
? inputTokens + outputTokens + thinkingTokens
|
|
117
|
+
: inputTokens + outputTokens + thinkingTokens + cacheReadTokens + cacheCreationTokens;
|
|
118
|
+
// durationMs: coerce to a non-negative integer, matching createAiAgentTaskSummary
|
|
119
|
+
// (§FAC1). safeInt(NaN|Infinity|negative) → 0. Fractional ms is caller error.
|
|
120
|
+
const durationMs = safeInt(Number.isFinite(params.durationMs) && params.durationMs >= 0 ? params.durationMs : 0);
|
|
121
|
+
// timeToFirstTokenMs: apply the same non-negative finite guard (§FAC2).
|
|
122
|
+
// NaN → null; Infinity → null; negative → null.
|
|
123
|
+
const timeToFirstTokenMs = params.timeToFirstTokenMs != null &&
|
|
124
|
+
Number.isFinite(params.timeToFirstTokenMs) &&
|
|
125
|
+
params.timeToFirstTokenMs >= 0
|
|
126
|
+
? params.timeToFirstTokenMs
|
|
127
|
+
: null;
|
|
128
|
+
const tokensPerSecond = durationMs > 0 && outputTokens > 0 ? (outputTokens / durationMs) * 1000 : null;
|
|
129
|
+
return {
|
|
130
|
+
id: params.id ?? randomUUID(),
|
|
131
|
+
timestamp: params.timestamp ?? Date.now(),
|
|
132
|
+
provider: params.provider,
|
|
133
|
+
model: params.model,
|
|
134
|
+
durationMs,
|
|
135
|
+
timeToFirstTokenMs,
|
|
136
|
+
tokensPerSecond,
|
|
137
|
+
inputTokens,
|
|
138
|
+
outputTokens,
|
|
139
|
+
thinkingTokens,
|
|
140
|
+
cacheReadTokens,
|
|
141
|
+
cacheCreationTokens,
|
|
142
|
+
totalTokens,
|
|
143
|
+
costInputUsd: safeFiniteOrNull(params.costInputUsd),
|
|
144
|
+
costOutputUsd: safeFiniteOrNull(params.costOutputUsd),
|
|
145
|
+
costThinkingUsd: safeFiniteOrNull(params.costThinkingUsd),
|
|
146
|
+
costCacheReadUsd: safeFiniteOrNull(params.costCacheReadUsd),
|
|
147
|
+
costCacheCreationUsd: safeFiniteOrNull(params.costCacheCreationUsd),
|
|
148
|
+
costTotalUsd: safeFiniteOrNull(params.costTotalUsd),
|
|
149
|
+
stopReason: params.stopReason ?? null,
|
|
150
|
+
contentBlockTypes: params.contentBlockTypes ?? [],
|
|
151
|
+
error: params.error ?? null,
|
|
152
|
+
'nr.appName': params.appName,
|
|
153
|
+
'nr.entityGuid': params.entityGuid ?? null,
|
|
154
|
+
customAttributes: params.customAttributes ?? {},
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
export function createAiMessage(params) {
|
|
158
|
+
if (!params.role) {
|
|
159
|
+
throw new Error('AiMessage requires a role');
|
|
160
|
+
}
|
|
161
|
+
// 13: required-field validation made uniform across the
|
|
162
|
+
// three factory functions. `content` is typed as `string` but JS callers
|
|
163
|
+
// bypass the type system; reject `null` / `undefined` here so downstream
|
|
164
|
+
// serialization doesn't emit `content: "null"` / `content: "undefined"`
|
|
165
|
+
// verbatim. Empty string is allowed — a deliberately-empty assistant
|
|
166
|
+
// response is a valid record.
|
|
167
|
+
if (params.content === null || params.content === undefined) {
|
|
168
|
+
throw new Error('AiMessage requires content');
|
|
169
|
+
}
|
|
170
|
+
if (!params.appName) {
|
|
171
|
+
throw new Error('AiMessage requires an appName');
|
|
172
|
+
}
|
|
173
|
+
warnIfMissingEntityGuid('AiMessage', params.entityGuid);
|
|
174
|
+
return {
|
|
175
|
+
id: params.id ?? randomUUID(),
|
|
176
|
+
timestamp: params.timestamp ?? Date.now(),
|
|
177
|
+
role: params.role,
|
|
178
|
+
content: params.content,
|
|
179
|
+
contentLength: safeInt(params.contentLength),
|
|
180
|
+
sequence: params.sequence,
|
|
181
|
+
'nr.appName': params.appName,
|
|
182
|
+
'nr.entityGuid': params.entityGuid ?? null,
|
|
183
|
+
customAttributes: params.customAttributes ?? {},
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
export function createAiAgentTaskSummary(params) {
|
|
187
|
+
if (!params.traceId) {
|
|
188
|
+
throw new Error('AiAgentTaskSummary requires a traceId');
|
|
189
|
+
}
|
|
190
|
+
if (!params.spanId) {
|
|
191
|
+
throw new Error('AiAgentTaskSummary requires a spanId');
|
|
192
|
+
}
|
|
193
|
+
if (!params.taskName) {
|
|
194
|
+
throw new Error('AiAgentTaskSummary requires a taskName');
|
|
195
|
+
}
|
|
196
|
+
if (!params.appName) {
|
|
197
|
+
throw new Error('AiAgentTaskSummary requires an appName');
|
|
198
|
+
}
|
|
199
|
+
warnIfMissingEntityGuid('AiAgentTaskSummary', params.entityGuid);
|
|
200
|
+
return {
|
|
201
|
+
id: params.id ?? randomUUID(),
|
|
202
|
+
timestamp: params.timestamp ?? Date.now(),
|
|
203
|
+
traceId: params.traceId,
|
|
204
|
+
spanId: params.spanId,
|
|
205
|
+
taskName: params.taskName,
|
|
206
|
+
// Sanitize numeric fields through safeInt so a buggy caller passing NaN /
|
|
207
|
+
// Infinity doesn't propagate through serialize.ts as `null` and confuse
|
|
208
|
+
// downstream NRQL aggregations.
|
|
209
|
+
durationMs: safeInt(params.durationMs),
|
|
210
|
+
totalLlmCalls: safeInt(params.totalLlmCalls),
|
|
211
|
+
totalToolCalls: safeInt(params.totalToolCalls),
|
|
212
|
+
totalTokens: safeInt(params.totalTokens),
|
|
213
|
+
totalCostUsd: safeFiniteOrNull(params.totalCostUsd),
|
|
214
|
+
stepCount: safeInt(params.stepCount),
|
|
215
|
+
success: params.success,
|
|
216
|
+
provider: params.provider,
|
|
217
|
+
delegationCount: params.delegationCount !== undefined ? safeInt(params.delegationCount) : undefined,
|
|
218
|
+
spawnCount: params.spawnCount !== undefined ? safeInt(params.spawnCount) : undefined,
|
|
219
|
+
delegationDepth: params.delegationDepth !== undefined ? safeInt(params.delegationDepth) : undefined,
|
|
220
|
+
interAgentMessages: params.interAgentMessages !== undefined ? safeInt(params.interAgentMessages) : undefined,
|
|
221
|
+
delegationOverheadMs: params.delegationOverheadMs !== undefined ? safeInt(params.delegationOverheadMs) : undefined,
|
|
222
|
+
'nr.appName': params.appName,
|
|
223
|
+
'nr.entityGuid': params.entityGuid ?? null,
|
|
224
|
+
customAttributes: params.customAttributes ?? {},
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
export function createAiAntiPattern(params) {
|
|
228
|
+
if (!params.traceId) {
|
|
229
|
+
throw new Error('AiAntiPattern requires a traceId');
|
|
230
|
+
}
|
|
231
|
+
if (!params.patternType) {
|
|
232
|
+
throw new Error('AiAntiPattern requires a patternType');
|
|
233
|
+
}
|
|
234
|
+
if (!params.severity) {
|
|
235
|
+
throw new Error('AiAntiPattern requires a severity');
|
|
236
|
+
}
|
|
237
|
+
if (!params.description) {
|
|
238
|
+
throw new Error('AiAntiPattern requires a description');
|
|
239
|
+
}
|
|
240
|
+
if (!params.appName) {
|
|
241
|
+
throw new Error('AiAntiPattern requires an appName');
|
|
242
|
+
}
|
|
243
|
+
warnIfMissingEntityGuid('AiAntiPattern', params.entityGuid);
|
|
244
|
+
return {
|
|
245
|
+
id: params.id ?? randomUUID(),
|
|
246
|
+
timestamp: params.timestamp ?? Date.now(),
|
|
247
|
+
traceId: params.traceId,
|
|
248
|
+
patternType: params.patternType,
|
|
249
|
+
severity: params.severity,
|
|
250
|
+
description: params.description,
|
|
251
|
+
provider: params.provider,
|
|
252
|
+
toolName: params.toolName,
|
|
253
|
+
repeatCount: params.repeatCount !== undefined ? safeInt(params.repeatCount) : undefined,
|
|
254
|
+
depthIndex: params.depthIndex !== undefined ? safeInt(params.depthIndex) : undefined,
|
|
255
|
+
taskComplexity: params.taskComplexity,
|
|
256
|
+
contextPressure: safeFiniteOrNull(params.contextPressure),
|
|
257
|
+
tokenShare: safeFiniteOrNull(params.tokenShare),
|
|
258
|
+
attemptCount: params.attemptCount !== undefined ? safeInt(params.attemptCount) : undefined,
|
|
259
|
+
'nr.appName': params.appName,
|
|
260
|
+
'nr.entityGuid': params.entityGuid ?? null,
|
|
261
|
+
customAttributes: params.customAttributes ?? {},
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
export function createAiAgentMessage(params) {
|
|
265
|
+
if (!params.traceId) {
|
|
266
|
+
throw new Error('AiAgentMessage requires a traceId');
|
|
267
|
+
}
|
|
268
|
+
if (!params.fromAgent) {
|
|
269
|
+
throw new Error('AiAgentMessage requires a fromAgent');
|
|
270
|
+
}
|
|
271
|
+
if (!params.toAgent) {
|
|
272
|
+
throw new Error('AiAgentMessage requires a toAgent');
|
|
273
|
+
}
|
|
274
|
+
if (!params.messageType) {
|
|
275
|
+
throw new Error('AiAgentMessage requires a messageType');
|
|
276
|
+
}
|
|
277
|
+
if (!params.appName) {
|
|
278
|
+
throw new Error('AiAgentMessage requires an appName');
|
|
279
|
+
}
|
|
280
|
+
warnIfMissingEntityGuid('AiAgentMessage', params.entityGuid);
|
|
281
|
+
return {
|
|
282
|
+
id: params.id ?? randomUUID(),
|
|
283
|
+
timestamp: params.timestamp ?? Date.now(),
|
|
284
|
+
traceId: params.traceId,
|
|
285
|
+
fromAgent: params.fromAgent,
|
|
286
|
+
toAgent: params.toAgent,
|
|
287
|
+
messageType: params.messageType,
|
|
288
|
+
provider: params.provider,
|
|
289
|
+
tokenCount: params.tokenCount === undefined ? undefined : safeInt(params.tokenCount),
|
|
290
|
+
'nr.appName': params.appName,
|
|
291
|
+
'nr.entityGuid': params.entityGuid ?? null,
|
|
292
|
+
customAttributes: params.customAttributes ?? {},
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
export function createAiContextReset(params) {
|
|
296
|
+
if (!params.traceId) {
|
|
297
|
+
throw new Error('AiContextReset requires a traceId');
|
|
298
|
+
}
|
|
299
|
+
if (!params.conversationId) {
|
|
300
|
+
throw new Error('AiContextReset requires a conversationId');
|
|
301
|
+
}
|
|
302
|
+
if (!params.reason) {
|
|
303
|
+
throw new Error('AiContextReset requires a reason');
|
|
304
|
+
}
|
|
305
|
+
if (!params.appName) {
|
|
306
|
+
throw new Error('AiContextReset requires an appName');
|
|
307
|
+
}
|
|
308
|
+
warnIfMissingEntityGuid('AiContextReset', params.entityGuid);
|
|
309
|
+
const tokensBefore = safeInt(params.tokensBefore);
|
|
310
|
+
const tokensAfter = safeInt(params.tokensAfter);
|
|
311
|
+
// Derived fields — compute here so callers don't have to remember the
|
|
312
|
+
// contract. tokensRemoved is `before - after` (clamped at 0 because a
|
|
313
|
+
// post-reset count higher than the pre-reset count is nonsensical, and
|
|
314
|
+
// the resulting negative value would corrupt NRQL aggregations).
|
|
315
|
+
const tokensRemoved = Math.max(0, tokensBefore - tokensAfter);
|
|
316
|
+
// tokensBefore === 0 → identity reset (no content to compress); return 1.0
|
|
317
|
+
// so dashboards averaging compressionRatio don't see artificially low values
|
|
318
|
+
// from no-op resets. ratio > 1.0 is possible (summarizer preamble > savings)
|
|
319
|
+
// and is preserved; a debug log makes the rare case diagnosable (§F2).
|
|
320
|
+
let compressionRatio;
|
|
321
|
+
if (tokensBefore === 0) {
|
|
322
|
+
compressionRatio = 1;
|
|
323
|
+
}
|
|
324
|
+
else {
|
|
325
|
+
compressionRatio = tokensAfter / tokensBefore;
|
|
326
|
+
if (compressionRatio > 1) {
|
|
327
|
+
factoryLogger.debug('AiContextReset compressionRatio > 1 (post-reset tokens exceed pre-reset)', {
|
|
328
|
+
tokensBefore,
|
|
329
|
+
tokensAfter,
|
|
330
|
+
compressionRatio,
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
return {
|
|
335
|
+
id: params.id ?? randomUUID(),
|
|
336
|
+
timestamp: params.timestamp ?? Date.now(),
|
|
337
|
+
traceId: params.traceId,
|
|
338
|
+
conversationId: params.conversationId,
|
|
339
|
+
tokensBefore,
|
|
340
|
+
tokensAfter,
|
|
341
|
+
tokensRemoved,
|
|
342
|
+
compressionRatio,
|
|
343
|
+
reason: params.reason,
|
|
344
|
+
provider: params.provider,
|
|
345
|
+
turnsRemoved: params.turnsRemoved !== undefined ? safeInt(params.turnsRemoved) : undefined,
|
|
346
|
+
'nr.appName': params.appName,
|
|
347
|
+
'nr.entityGuid': params.entityGuid ?? null,
|
|
348
|
+
customAttributes: params.customAttributes ?? {},
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
//# sourceMappingURL=factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../../src/shared/events/factory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type { AiProvider, AiRequestMethod, AiRequest, AiResponse, AiMessageRole, AiMessage, NrEventData, AiAgentTaskSummary, AntiPatternType, AiAntiPattern, AiAgentMessage, AiContextReset, } from './types.js';
|
|
2
|
+
export { createAiRequest, createAiResponse, createAiMessage, createAiAgentTaskSummary, createAiAntiPattern, createAiAgentMessage, createAiContextReset, } from './factory.js';
|
|
3
|
+
export type { CreateAiRequestParams, CreateAiResponseParams, CreateAiMessageParams, CreateAiAgentTaskSummaryParams, CreateAiAntiPatternParams, CreateAiAgentMessageParams, CreateAiContextResetParams, } from './factory.js';
|
|
4
|
+
export { aiRequestToNrEvent, aiResponseToNrEvent, aiMessageToNrEvent, aiAgentTaskSummaryToNrEvent, aiAntiPatternToNrEvent, aiAgentMessageToNrEvent, aiContextResetToNrEvent, EVENT_SCHEMA_VERSION, } from './serialize.js';
|
|
5
|
+
export type { SerializeOptions } from './serialize.js';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/shared/events/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,UAAU,EACV,eAAe,EACf,SAAS,EACT,UAAU,EACV,aAAa,EACb,SAAS,EACT,WAAW,EACX,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,cAAc,EACd,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,wBAAwB,EACxB,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACrB,8BAA8B,EAC9B,yBAAyB,EACzB,0BAA0B,EAC1B,0BAA0B,GAC3B,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,2BAA2B,EAC3B,sBAAsB,EACtB,uBAAuB,EACvB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { createAiRequest, createAiResponse, createAiMessage, createAiAgentTaskSummary, createAiAntiPattern, createAiAgentMessage, createAiContextReset, } from './factory.js';
|
|
2
|
+
export { aiRequestToNrEvent, aiResponseToNrEvent, aiMessageToNrEvent, aiAgentTaskSummaryToNrEvent, aiAntiPatternToNrEvent, aiAgentMessageToNrEvent, aiContextResetToNrEvent, EVENT_SCHEMA_VERSION, } from './serialize.js';
|
|
3
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/shared/events/index.ts"],"names":[],"mappings":"AAcA,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,wBAAwB,EACxB,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,cAAc,CAAC;AAUtB,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,2BAA2B,EAC3B,sBAAsB,EACtB,uBAAuB,EACvB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import type { AiRequest, AiResponse, AiMessage, AiAgentTaskSummary, AiAntiPattern, AiAgentMessage, AiContextReset, NrEventData } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* High-security mode field-suppression contract.
|
|
4
|
+
*
|
|
5
|
+
* When `highSecurity: true` is passed to a serializer, the resulting
|
|
6
|
+
* NrEventData has the following content-bearing fields suppressed:
|
|
7
|
+
*
|
|
8
|
+
* - `error.message` is **omitted entirely** (provider error bodies often
|
|
9
|
+
* echo verbatim prompt fragments back). `error.type` and
|
|
10
|
+
* `error.statusCode` are still emitted — they are bounded enum-like
|
|
11
|
+
* values useful for triage and don't leak content. Applies to
|
|
12
|
+
* `aiResponseToNrEvent`.
|
|
13
|
+
*
|
|
14
|
+
* - Every string value in `customAttributes` is **clipped to 256
|
|
15
|
+
* characters** (with a trailing `...` marker). Numeric custom
|
|
16
|
+
* attributes pass through unchanged. Applies to **all** serializers.
|
|
17
|
+
* In normal mode (highSecurity: false / omitted), string values are
|
|
18
|
+
* still truncated at 4000 chars so a long attribute cannot push the
|
|
19
|
+
* event past NR's 4096-byte per-attribute cap.
|
|
20
|
+
*
|
|
21
|
+
* Structural / metadata fields are intentionally NOT suppressed in
|
|
22
|
+
* high-security mode — they are bounded identifiers, not free-form
|
|
23
|
+
* content:
|
|
24
|
+
*
|
|
25
|
+
* - `toolNames`, `contentBlockTypes`, `requestMethod`, `model`,
|
|
26
|
+
* `provider`, `stopReason`, `patternType`, `severity`, etc.
|
|
27
|
+
* - `AiAntiPattern.description` (enum-derived diagnostic text written
|
|
28
|
+
* by the agent, not by the upstream model).
|
|
29
|
+
*
|
|
30
|
+
* Per-message content (`AiMessage.content`) is gated separately by
|
|
31
|
+
* `recordContent` on the consumer's `AgentConfig`, which `highSecurity`
|
|
32
|
+
* forces to `false` at config-load time. The message serializer assumes
|
|
33
|
+
* the caller has already honored that flag and does not clip `content`
|
|
34
|
+
* here.
|
|
35
|
+
*/
|
|
36
|
+
export interface SerializeOptions {
|
|
37
|
+
readonly highSecurity?: boolean;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Event schema version. Bump whenever the wire-format
|
|
41
|
+
* shape of any serializer changes in a way that downstream NR dashboards
|
|
42
|
+
* built on the previous shape would silently mis-render. The current value
|
|
43
|
+
* is stamped on every emitted event (`schemaVersion: 1`) so dashboards can
|
|
44
|
+
* filter on `WHERE schemaVersion = 1` and catch a future migration before
|
|
45
|
+
* the data renders incorrectly.
|
|
46
|
+
*
|
|
47
|
+
* Bumping policy:
|
|
48
|
+
* - Add a field: NO bump required (new field is null/missing on old events).
|
|
49
|
+
* - Remove or rename a field: bump.
|
|
50
|
+
* - Change a field's type or unit: bump.
|
|
51
|
+
* - Change a field's semantic meaning: bump.
|
|
52
|
+
*
|
|
53
|
+
* The §4.9 metric-API summary migration is an analogous (separate) wire
|
|
54
|
+
* change and is covered by NR's metric `type` field, not this schema version.
|
|
55
|
+
*/
|
|
56
|
+
export declare const EVENT_SCHEMA_VERSION = 1;
|
|
57
|
+
export declare function aiRequestToNrEvent(event: AiRequest, options?: SerializeOptions): NrEventData;
|
|
58
|
+
export declare function aiResponseToNrEvent(event: AiResponse, options?: SerializeOptions): NrEventData;
|
|
59
|
+
export declare function aiMessageToNrEvent(event: AiMessage, options?: SerializeOptions): NrEventData;
|
|
60
|
+
/**
|
|
61
|
+
* dotted-key naming convention for the four newer
|
|
62
|
+
* agent-shaped event types (`AiAgentTaskSummary`, `AiAntiPattern`,
|
|
63
|
+
* `AiAgentMessage`, `AiContextReset`). These serializers emit attributes
|
|
64
|
+
* with a `<namespace>.<field>` shape (e.g. `ai.agent.task_duration_ms`,
|
|
65
|
+
* `ai.antipattern.severity`) alongside top-level non-namespaced fields
|
|
66
|
+
* (e.g. `id`, `timestamp`, `taskName`).
|
|
67
|
+
*
|
|
68
|
+
* The dotted form is the OTel-style and aligns with `gen_ai.*` already in
|
|
69
|
+
* use on AiRequest/AiResponse — operators querying these in NRQL must
|
|
70
|
+
* backtick-quote: `SELECT \`ai.agent.task_duration_ms\` FROM AiAgentTaskSummary`.
|
|
71
|
+
*
|
|
72
|
+
* The mixed top-level + namespaced shape (`taskName` flat, `ai.agent.*`
|
|
73
|
+
* dotted) is intentional: the top-level fields carry record identity that
|
|
74
|
+
* the eventType bucket already groups by (you query `FROM AiAgentTaskSummary`
|
|
75
|
+
* so `eventType` provides the namespace), while the `ai.<area>.*` fields
|
|
76
|
+
* cluster metric-shaped attributes by source area so dashboards can
|
|
77
|
+
* `SELECT keyset() WHERE attribute LIKE 'ai.agent.%'`.
|
|
78
|
+
*
|
|
79
|
+
* This convention is documented here rather than enforced — adding new
|
|
80
|
+
* fields to these event types should follow it for consistency, but the
|
|
81
|
+
* library does not validate the shape at runtime.
|
|
82
|
+
*/
|
|
83
|
+
export declare function aiAgentTaskSummaryToNrEvent(event: AiAgentTaskSummary, options?: SerializeOptions): NrEventData;
|
|
84
|
+
export declare function aiAntiPatternToNrEvent(event: AiAntiPattern, options?: SerializeOptions): NrEventData;
|
|
85
|
+
export declare function aiAgentMessageToNrEvent(event: AiAgentMessage, options?: SerializeOptions): NrEventData;
|
|
86
|
+
export declare function aiContextResetToNrEvent(event: AiContextReset, options?: SerializeOptions): NrEventData;
|
|
87
|
+
//# sourceMappingURL=serialize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serialize.d.ts","sourceRoot":"","sources":["../../../src/shared/events/serialize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,SAAS,EACT,UAAU,EACV,SAAS,EACT,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,cAAc,EACd,WAAW,EACZ,MAAM,YAAY,CAAC;AAsIpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;CACjC;AAsED;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,WAAW,CAwC5F;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,WAAW,CA8F9F;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,WAAW,CAoB5F;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAKH,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,kBAAkB,EACzB,OAAO,CAAC,EAAE,gBAAgB,GACzB,WAAW,CAkCb;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,aAAa,EACpB,OAAO,CAAC,EAAE,gBAAgB,GACzB,WAAW,CA0Bb;AAED,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,cAAc,EACrB,OAAO,CAAC,EAAE,gBAAgB,GACzB,WAAW,CAoBb;AAED,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,cAAc,EACrB,OAAO,CAAC,EAAE,gBAAgB,GACzB,WAAW,CAuBb"}
|