@newrelic/preflight 1.62.0 → 1.63.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/dist/config.d.ts +10 -0
  2. package/dist/config.d.ts.map +1 -1
  3. package/dist/config.js +21 -8
  4. package/dist/config.js.map +1 -1
  5. package/dist/dashboard/dashboard-server.d.ts +9 -0
  6. package/dist/dashboard/dashboard-server.d.ts.map +1 -1
  7. package/dist/dashboard/dashboard-server.js +6 -1
  8. package/dist/dashboard/dashboard-server.js.map +1 -1
  9. package/dist/hooks/process-ancestry.d.ts +33 -0
  10. package/dist/hooks/process-ancestry.d.ts.map +1 -1
  11. package/dist/hooks/process-ancestry.js +55 -0
  12. package/dist/hooks/process-ancestry.js.map +1 -1
  13. package/dist/hooks/session-resolver.d.ts +66 -3
  14. package/dist/hooks/session-resolver.d.ts.map +1 -1
  15. package/dist/hooks/session-resolver.js +155 -6
  16. package/dist/hooks/session-resolver.js.map +1 -1
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +47 -11
  19. package/dist/index.js.map +1 -1
  20. package/dist/metrics/efficiency-score.d.ts +27 -0
  21. package/dist/metrics/efficiency-score.d.ts.map +1 -1
  22. package/dist/metrics/efficiency-score.js +21 -5
  23. package/dist/metrics/efficiency-score.js.map +1 -1
  24. package/dist/metrics/model-provider.d.ts +22 -0
  25. package/dist/metrics/model-provider.d.ts.map +1 -0
  26. package/dist/metrics/model-provider.js +32 -0
  27. package/dist/metrics/model-provider.js.map +1 -0
  28. package/dist/storage/local-store.d.ts +7 -0
  29. package/dist/storage/local-store.d.ts.map +1 -1
  30. package/dist/storage/local-store.js +23 -14
  31. package/dist/storage/local-store.js.map +1 -1
  32. package/dist/transport/nr-ingest.d.ts.map +1 -1
  33. package/dist/transport/nr-ingest.js +10 -2
  34. package/dist/transport/nr-ingest.js.map +1 -1
  35. package/dist/transport/unforwarded-session-monitor.d.ts +95 -0
  36. package/dist/transport/unforwarded-session-monitor.d.ts.map +1 -0
  37. package/dist/transport/unforwarded-session-monitor.js +120 -0
  38. package/dist/transport/unforwarded-session-monitor.js.map +1 -0
  39. package/package.json +1 -1
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Makes `--local`'s silent New Relic data loss visible (#479).
3
+ *
4
+ * `--local` drains every per-session buffer that has no live owning `--stdio`
5
+ * engine (`LocalStore.drainAllBuffers()` skips any buffer whose
6
+ * `active-<sessionId>.pid` heartbeat names a live PID). When `--local` has
7
+ * cloud credentials it forwards those sessions to New Relic itself. When the
8
+ * config asks for cloud export (mode `cloud`/`both`) but this process can't
9
+ * see the credentials — typically because they live only in a shell
10
+ * environment variable, which the dashboard LaunchAgent does not inherit —
11
+ * `--local` falls back to local mode and those sessions never reach New
12
+ * Relic. This monitor records each such session, warns once per session, and
13
+ * backs the `unforwardedSessions` field on `GET /api/health`. The fix-it
14
+ * hint is logged once, by the caller's startup warning, not per session.
15
+ */
16
+ import { type Mode } from '../config.js';
17
+ /** Which credential this process was missing when it fell back to local mode. */
18
+ export type CloudForwardingGapReason = 'missing-license-key' | 'missing-account-id';
19
+ export interface CloudForwardingGap {
20
+ readonly reason: CloudForwardingGapReason;
21
+ /** The config field named by `reason`. */
22
+ readonly missingField: 'licenseKey' | 'accountId';
23
+ /** The mode the config asked for before the fallback (`cloud` or `both`). */
24
+ readonly requestedMode: Mode;
25
+ }
26
+ export interface UnforwardedSessionEntry {
27
+ readonly sessionId: string;
28
+ readonly toolCalls: number;
29
+ readonly firstSeenMs: number;
30
+ readonly lastSeenMs: number;
31
+ }
32
+ export interface UnforwardedSessionsSnapshot {
33
+ readonly reason: CloudForwardingGapReason;
34
+ readonly requestedMode: Mode;
35
+ /**
36
+ * Distinct identified sessions drained without forwarding, among those
37
+ * still tracked: past the cap the least recently active are evicted.
38
+ */
39
+ readonly count: number;
40
+ /** Sessions evicted to stay under the cap. One seen again counts again. */
41
+ readonly evictedSessions: number;
42
+ /** Tool calls drained without forwarding, across every session. */
43
+ readonly toolCalls: number;
44
+ /** The share of `toolCalls` with no usable session id. Not in `count`. */
45
+ readonly untrackedToolCalls: number;
46
+ /** Up to 20 sessions, most recently active first. */
47
+ readonly sessions: readonly UnforwardedSessionEntry[];
48
+ /** True when `sessions` omits some of the `count` sessions. */
49
+ readonly truncated: boolean;
50
+ readonly hint: string;
51
+ }
52
+ export interface UnforwardedSessionMonitorOptions {
53
+ readonly gap: CloudForwardingGap;
54
+ /**
55
+ * Cap on per-session entries kept in memory. Default 500. Past it the least
56
+ * recently active entry is evicted, so a session losing data now is always
57
+ * listed however long the process has been up.
58
+ */
59
+ readonly maxTrackedSessions?: number;
60
+ /** Test seam for the one-per-session warning. */
61
+ readonly warn?: (message: string, fields: Record<string, unknown>) => void;
62
+ /** Test seam for the clock. */
63
+ readonly now?: () => number;
64
+ }
65
+ /** How to fix the gap. Log it once at startup; the per-session warnings omit it. */
66
+ export declare const UNFORWARDED_SESSIONS_HINT: string;
67
+ /**
68
+ * Read the config-load error `--local` catches before falling back to local
69
+ * mode: a `MissingCloudCredentialError`, thrown directly or carried as the
70
+ * `cause` of a wrapping error. Returns null for any other error, which
71
+ * `--local` rethrows.
72
+ */
73
+ export declare function detectCloudForwardingGap(err: unknown): CloudForwardingGap | null;
74
+ export declare class UnforwardedSessionMonitor {
75
+ private readonly gap;
76
+ private readonly maxTrackedSessions;
77
+ private readonly warn;
78
+ private readonly now;
79
+ /** Least recently active first: an update re-inserts its entry at the end. */
80
+ private readonly sessions;
81
+ private evictedSessions;
82
+ private untrackedToolCalls;
83
+ private totalToolCalls;
84
+ private warnedUntracked;
85
+ constructor(options: UnforwardedSessionMonitorOptions);
86
+ /**
87
+ * Record one tool call drained from an ownerless buffer and not forwarded.
88
+ * Warns the first time each session is seen, and again if it comes back
89
+ * after eviction. A missing or malformed session id is counted without an
90
+ * entry.
91
+ */
92
+ recordToolCall(sessionId: string | null | undefined): void;
93
+ getSnapshot(): UnforwardedSessionsSnapshot;
94
+ }
95
+ //# sourceMappingURL=unforwarded-session-monitor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unforwarded-session-monitor.d.ts","sourceRoot":"","sources":["../../src/transport/unforwarded-session-monitor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EAA+B,KAAK,IAAI,EAAE,MAAM,cAAc,CAAC;AAStE,iFAAiF;AACjF,MAAM,MAAM,wBAAwB,GAAG,qBAAqB,GAAG,oBAAoB,CAAC;AAEpF,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,wBAAwB,CAAC;IAC1C,0CAA0C;IAC1C,QAAQ,CAAC,YAAY,EAAE,YAAY,GAAG,WAAW,CAAC;IAClD,6EAA6E;IAC7E,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,MAAM,EAAE,wBAAwB,CAAC;IAC1C,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC;IAC7B;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,2EAA2E;IAC3E,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,mEAAmE;IACnE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,0EAA0E;IAC1E,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,qDAAqD;IACrD,QAAQ,CAAC,QAAQ,EAAE,SAAS,uBAAuB,EAAE,CAAC;IACtD,+DAA+D;IAC/D,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,GAAG,EAAE,kBAAkB,CAAC;IACjC;;;;OAIG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,iDAAiD;IACjD,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAC3E,+BAA+B;IAC/B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CAC7B;AAED,oFAAoF;AACpF,eAAO,MAAM,yBAAyB,QAGwC,CAAC;AAE/E;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,OAAO,GAAG,kBAAkB,GAAG,IAAI,CAahF;AAQD,qBAAa,yBAAyB;IACpC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAqB;IACzC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA6D;IAClF,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,8EAA8E;IAC9E,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmC;IAC5D,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,kBAAkB,CAAK;IAC/B,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,eAAe,CAAS;gBAEpB,OAAO,EAAE,gCAAgC;IAOrD;;;;;OAKG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI;IAmC1D,WAAW,IAAI,2BAA2B;CAiB3C"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Makes `--local`'s silent New Relic data loss visible (#479).
3
+ *
4
+ * `--local` drains every per-session buffer that has no live owning `--stdio`
5
+ * engine (`LocalStore.drainAllBuffers()` skips any buffer whose
6
+ * `active-<sessionId>.pid` heartbeat names a live PID). When `--local` has
7
+ * cloud credentials it forwards those sessions to New Relic itself. When the
8
+ * config asks for cloud export (mode `cloud`/`both`) but this process can't
9
+ * see the credentials — typically because they live only in a shell
10
+ * environment variable, which the dashboard LaunchAgent does not inherit —
11
+ * `--local` falls back to local mode and those sessions never reach New
12
+ * Relic. This monitor records each such session, warns once per session, and
13
+ * backs the `unforwardedSessions` field on `GET /api/health`. The fix-it
14
+ * hint is logged once, by the caller's startup warning, not per session.
15
+ */
16
+ import { createLogger } from '../shared/index.js';
17
+ import { MissingCloudCredentialError } from '../config.js';
18
+ const logger = createLogger('unforwarded-session-monitor');
19
+ const SESSION_ID_RE = /^[a-zA-Z0-9_-]{1,128}$/;
20
+ const DEFAULT_MAX_TRACKED_SESSIONS = 500;
21
+ /** How many sessions `getSnapshot()` lists, newest activity first. */
22
+ const SNAPSHOT_SESSION_LIMIT = 20;
23
+ /** How to fix the gap. Log it once at startup; the per-session warnings omit it. */
24
+ export const UNFORWARDED_SESSIONS_HINT = 'This dashboard process is not forwarding to New Relic because it cannot see your cloud ' +
25
+ 'credentials. Add licenseKey and accountId to the config file (the dashboard LaunchAgent ' +
26
+ 'does not inherit shell environment variables), then restart the dashboard.';
27
+ /**
28
+ * Read the config-load error `--local` catches before falling back to local
29
+ * mode: a `MissingCloudCredentialError`, thrown directly or carried as the
30
+ * `cause` of a wrapping error. Returns null for any other error, which
31
+ * `--local` rethrows.
32
+ */
33
+ export function detectCloudForwardingGap(err) {
34
+ const source = err instanceof MissingCloudCredentialError
35
+ ? err
36
+ : err instanceof Error && err.cause instanceof MissingCloudCredentialError
37
+ ? err.cause
38
+ : undefined;
39
+ if (!source)
40
+ return null;
41
+ return {
42
+ reason: source.missingField === 'licenseKey' ? 'missing-license-key' : 'missing-account-id',
43
+ missingField: source.missingField,
44
+ requestedMode: source.mode,
45
+ };
46
+ }
47
+ export class UnforwardedSessionMonitor {
48
+ gap;
49
+ maxTrackedSessions;
50
+ warn;
51
+ now;
52
+ /** Least recently active first: an update re-inserts its entry at the end. */
53
+ sessions = new Map();
54
+ evictedSessions = 0;
55
+ untrackedToolCalls = 0;
56
+ totalToolCalls = 0;
57
+ warnedUntracked = false;
58
+ constructor(options) {
59
+ this.gap = options.gap;
60
+ this.maxTrackedSessions = options.maxTrackedSessions ?? DEFAULT_MAX_TRACKED_SESSIONS;
61
+ this.warn = options.warn ?? ((message, fields) => logger.warn(message, fields));
62
+ this.now = options.now ?? Date.now;
63
+ }
64
+ /**
65
+ * Record one tool call drained from an ownerless buffer and not forwarded.
66
+ * Warns the first time each session is seen, and again if it comes back
67
+ * after eviction. A missing or malformed session id is counted without an
68
+ * entry.
69
+ */
70
+ recordToolCall(sessionId) {
71
+ this.totalToolCalls++;
72
+ const nowMs = this.now();
73
+ const existing = typeof sessionId === 'string' ? this.sessions.get(sessionId) : undefined;
74
+ if (typeof sessionId === 'string' && existing) {
75
+ existing.toolCalls++;
76
+ existing.lastSeenMs = nowMs;
77
+ this.sessions.delete(sessionId);
78
+ this.sessions.set(sessionId, existing);
79
+ return;
80
+ }
81
+ if (typeof sessionId !== 'string' || !SESSION_ID_RE.test(sessionId)) {
82
+ this.untrackedToolCalls++;
83
+ if (!this.warnedUntracked) {
84
+ this.warnedUntracked = true;
85
+ this.warn('Tool calls with no trackable session id are not reaching New Relic; counting them as untrackedToolCalls', { reason: this.gap.reason, requestedMode: this.gap.requestedMode });
86
+ }
87
+ return;
88
+ }
89
+ if (this.sessions.size >= this.maxTrackedSessions) {
90
+ const leastRecent = this.sessions.keys().next().value;
91
+ if (leastRecent !== undefined)
92
+ this.sessions.delete(leastRecent);
93
+ this.evictedSessions++;
94
+ }
95
+ this.sessions.set(sessionId, { toolCalls: 1, firstSeenMs: nowMs, lastSeenMs: nowMs });
96
+ this.warn('Session has no owning --stdio engine and is not reaching New Relic', {
97
+ sessionId,
98
+ reason: this.gap.reason,
99
+ requestedMode: this.gap.requestedMode,
100
+ });
101
+ }
102
+ getSnapshot() {
103
+ const sessions = [...this.sessions]
104
+ .slice(-SNAPSHOT_SESSION_LIMIT)
105
+ .reverse()
106
+ .map(([sessionId, e]) => ({ sessionId, ...e }));
107
+ return {
108
+ reason: this.gap.reason,
109
+ requestedMode: this.gap.requestedMode,
110
+ count: this.sessions.size,
111
+ evictedSessions: this.evictedSessions,
112
+ toolCalls: this.totalToolCalls,
113
+ untrackedToolCalls: this.untrackedToolCalls,
114
+ sessions,
115
+ truncated: sessions.length < this.sessions.size,
116
+ hint: UNFORWARDED_SESSIONS_HINT,
117
+ };
118
+ }
119
+ }
120
+ //# sourceMappingURL=unforwarded-session-monitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unforwarded-session-monitor.js","sourceRoot":"","sources":["../../src/transport/unforwarded-session-monitor.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@newrelic/preflight",
3
- "version": "1.62.0",
3
+ "version": "1.63.1",
4
4
  "mcpName": "io.github.newrelic-experimental/preflight",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",