@newrelic/preflight 1.70.0 → 1.72.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.
Files changed (181) hide show
  1. package/README.md +2 -0
  2. package/dist/config.d.ts.map +1 -1
  3. package/dist/config.js +7 -0
  4. package/dist/config.js.map +1 -1
  5. package/dist/dashboard/routes/api-handler.d.ts.map +1 -1
  6. package/dist/dashboard/routes/api-handler.js +11 -16
  7. package/dist/dashboard/routes/api-handler.js.map +1 -1
  8. package/dist/dashboard/subagent-timeline-store.d.ts +12 -1
  9. package/dist/dashboard/subagent-timeline-store.d.ts.map +1 -1
  10. package/dist/dashboard/subagent-timeline-store.js +32 -4
  11. package/dist/dashboard/subagent-timeline-store.js.map +1 -1
  12. package/dist/dashboard/workflow-store.d.ts.map +1 -1
  13. package/dist/dashboard/workflow-store.js +2 -3
  14. package/dist/dashboard/workflow-store.js.map +1 -1
  15. package/dist/hooks/collector-script.d.ts.map +1 -1
  16. package/dist/hooks/collector-script.js +14 -8
  17. package/dist/hooks/collector-script.js.map +1 -1
  18. package/dist/hooks/copilot-app-usage-watcher.d.ts.map +1 -1
  19. package/dist/hooks/copilot-app-usage-watcher.js +3 -4
  20. package/dist/hooks/copilot-app-usage-watcher.js.map +1 -1
  21. package/dist/hooks/copilot-usage-watcher.d.ts +25 -5
  22. package/dist/hooks/copilot-usage-watcher.d.ts.map +1 -1
  23. package/dist/hooks/copilot-usage-watcher.js +254 -92
  24. package/dist/hooks/copilot-usage-watcher.js.map +1 -1
  25. package/dist/hooks/event-processor.d.ts +24 -11
  26. package/dist/hooks/event-processor.d.ts.map +1 -1
  27. package/dist/hooks/event-processor.js +139 -45
  28. package/dist/hooks/event-processor.js.map +1 -1
  29. package/dist/hooks/index.d.ts +1 -1
  30. package/dist/hooks/index.d.ts.map +1 -1
  31. package/dist/hooks/index.js +1 -1
  32. package/dist/hooks/index.js.map +1 -1
  33. package/dist/hooks/parent-transcript-watcher.d.ts +1 -1
  34. package/dist/hooks/parent-transcript-watcher.d.ts.map +1 -1
  35. package/dist/hooks/parent-transcript-watcher.js +11 -6
  36. package/dist/hooks/parent-transcript-watcher.js.map +1 -1
  37. package/dist/hooks/session-resolver.d.ts.map +1 -1
  38. package/dist/hooks/session-resolver.js +2 -1
  39. package/dist/hooks/session-resolver.js.map +1 -1
  40. package/dist/hooks/subagent-watcher.d.ts +21 -15
  41. package/dist/hooks/subagent-watcher.d.ts.map +1 -1
  42. package/dist/hooks/subagent-watcher.js +89 -73
  43. package/dist/hooks/subagent-watcher.js.map +1 -1
  44. package/dist/hooks/throttled-warning.d.ts +5 -5
  45. package/dist/hooks/throttled-warning.d.ts.map +1 -1
  46. package/dist/hooks/throttled-warning.js +14 -12
  47. package/dist/hooks/throttled-warning.js.map +1 -1
  48. package/dist/hooks/workflow-watcher.d.ts.map +1 -1
  49. package/dist/hooks/workflow-watcher.js +2 -2
  50. package/dist/hooks/workflow-watcher.js.map +1 -1
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +57 -62
  53. package/dist/index.js.map +1 -1
  54. package/dist/install/cli.d.ts.map +1 -1
  55. package/dist/install/cli.js +131 -17
  56. package/dist/install/cli.js.map +1 -1
  57. package/dist/install/copilot-install-helper.d.ts +1 -0
  58. package/dist/install/copilot-install-helper.d.ts.map +1 -1
  59. package/dist/install/copilot-install-helper.js +82 -26
  60. package/dist/install/copilot-install-helper.js.map +1 -1
  61. package/dist/install/credentials.d.ts +23 -0
  62. package/dist/install/credentials.d.ts.map +1 -0
  63. package/dist/install/credentials.js +57 -0
  64. package/dist/install/credentials.js.map +1 -0
  65. package/dist/install/diagnostics.d.ts.map +1 -1
  66. package/dist/install/diagnostics.js +6 -3
  67. package/dist/install/diagnostics.js.map +1 -1
  68. package/dist/install/install-helper.d.ts +9 -0
  69. package/dist/install/install-helper.d.ts.map +1 -1
  70. package/dist/install/install-helper.js +42 -17
  71. package/dist/install/install-helper.js.map +1 -1
  72. package/dist/install/schedule.d.ts.map +1 -1
  73. package/dist/install/schedule.js +4 -1
  74. package/dist/install/schedule.js.map +1 -1
  75. package/dist/install/setup-wizard.d.ts.map +1 -1
  76. package/dist/install/setup-wizard.js +3 -3
  77. package/dist/install/setup-wizard.js.map +1 -1
  78. package/dist/install/target-user.d.ts +33 -0
  79. package/dist/install/target-user.d.ts.map +1 -0
  80. package/dist/install/target-user.js +121 -0
  81. package/dist/install/target-user.js.map +1 -0
  82. package/dist/lib/claude-config-dir.d.ts +3 -0
  83. package/dist/lib/claude-config-dir.d.ts.map +1 -0
  84. package/dist/lib/claude-config-dir.js +10 -0
  85. package/dist/lib/claude-config-dir.js.map +1 -0
  86. package/dist/lib/claude-settings-env.d.ts +18 -0
  87. package/dist/lib/claude-settings-env.d.ts.map +1 -0
  88. package/dist/lib/claude-settings-env.js +78 -0
  89. package/dist/lib/claude-settings-env.js.map +1 -0
  90. package/dist/lib/date.d.ts +7 -0
  91. package/dist/lib/date.d.ts.map +1 -1
  92. package/dist/lib/date.js +11 -1
  93. package/dist/lib/date.js.map +1 -1
  94. package/dist/lib/subagent-transcript-parser.d.ts +2 -0
  95. package/dist/lib/subagent-transcript-parser.d.ts.map +1 -1
  96. package/dist/lib/subagent-transcript-parser.js +5 -0
  97. package/dist/lib/subagent-transcript-parser.js.map +1 -1
  98. package/dist/lib/transcript-types.d.ts +4 -0
  99. package/dist/lib/transcript-types.d.ts.map +1 -1
  100. package/dist/metrics/cost-forecast.d.ts +2 -0
  101. package/dist/metrics/cost-forecast.d.ts.map +1 -1
  102. package/dist/metrics/cost-forecast.js +46 -24
  103. package/dist/metrics/cost-forecast.js.map +1 -1
  104. package/dist/metrics/cost-tracker.d.ts +3 -3
  105. package/dist/metrics/cost-tracker.js +3 -3
  106. package/dist/metrics/efficiency-score.d.ts +2 -2
  107. package/dist/metrics/efficiency-score.js +2 -2
  108. package/dist/metrics/first-save-baselines.d.ts +60 -0
  109. package/dist/metrics/first-save-baselines.d.ts.map +1 -0
  110. package/dist/metrics/first-save-baselines.js +77 -0
  111. package/dist/metrics/first-save-baselines.js.map +1 -0
  112. package/dist/metrics/local-session-aggregator.d.ts +6 -5
  113. package/dist/metrics/local-session-aggregator.d.ts.map +1 -1
  114. package/dist/metrics/local-session-aggregator.js +34 -6
  115. package/dist/metrics/local-session-aggregator.js.map +1 -1
  116. package/dist/metrics/model-pricing.d.ts +1 -1
  117. package/dist/metrics/model-pricing.d.ts.map +1 -1
  118. package/dist/metrics/model-pricing.js +2 -2
  119. package/dist/metrics/model-pricing.js.map +1 -1
  120. package/dist/metrics/model-usage-tracker.d.ts +2 -2
  121. package/dist/metrics/model-usage-tracker.js +2 -2
  122. package/dist/metrics/pricing-init.d.ts.map +1 -1
  123. package/dist/metrics/pricing-init.js +5 -3
  124. package/dist/metrics/pricing-init.js.map +1 -1
  125. package/dist/metrics/pricing-overlay.d.ts.map +1 -1
  126. package/dist/metrics/pricing-overlay.js +1 -4
  127. package/dist/metrics/pricing-overlay.js.map +1 -1
  128. package/dist/metrics/pricing-refresh.d.ts +16 -4
  129. package/dist/metrics/pricing-refresh.d.ts.map +1 -1
  130. package/dist/metrics/pricing-refresh.js +47 -1
  131. package/dist/metrics/pricing-refresh.js.map +1 -1
  132. package/dist/metrics/quality-proxy-tracker.d.ts +2 -2
  133. package/dist/metrics/quality-proxy-tracker.js +2 -2
  134. package/dist/metrics/session-tracker.d.ts +5 -1
  135. package/dist/metrics/session-tracker.d.ts.map +1 -1
  136. package/dist/metrics/session-tracker.js +58 -17
  137. package/dist/metrics/session-tracker.js.map +1 -1
  138. package/dist/metrics/task-detector.d.ts +2 -2
  139. package/dist/metrics/task-detector.js +2 -2
  140. package/dist/metrics/token-usage.d.ts +6 -0
  141. package/dist/metrics/token-usage.d.ts.map +1 -0
  142. package/dist/metrics/token-usage.js +34 -0
  143. package/dist/metrics/token-usage.js.map +1 -0
  144. package/dist/metrics/turn-cost-attributor.d.ts.map +1 -1
  145. package/dist/metrics/turn-cost-attributor.js +3 -0
  146. package/dist/metrics/turn-cost-attributor.js.map +1 -1
  147. package/dist/platforms/copilot-adapter.d.ts.map +1 -1
  148. package/dist/platforms/copilot-adapter.js +3 -0
  149. package/dist/platforms/copilot-adapter.js.map +1 -1
  150. package/dist/platforms/copilot-sdk-adapter.d.ts.map +1 -1
  151. package/dist/platforms/copilot-sdk-adapter.js +3 -0
  152. package/dist/platforms/copilot-sdk-adapter.js.map +1 -1
  153. package/dist/storage/drain-claims.d.ts +82 -0
  154. package/dist/storage/drain-claims.d.ts.map +1 -0
  155. package/dist/storage/drain-claims.js +239 -0
  156. package/dist/storage/drain-claims.js.map +1 -0
  157. package/dist/storage/hook-buffer.d.ts +7 -0
  158. package/dist/storage/hook-buffer.d.ts.map +1 -0
  159. package/dist/storage/hook-buffer.js +132 -0
  160. package/dist/storage/hook-buffer.js.map +1 -0
  161. package/dist/storage/local-store.d.ts +38 -16
  162. package/dist/storage/local-store.d.ts.map +1 -1
  163. package/dist/storage/local-store.js +228 -72
  164. package/dist/storage/local-store.js.map +1 -1
  165. package/dist/storage/retention.d.ts.map +1 -1
  166. package/dist/storage/retention.js +7 -6
  167. package/dist/storage/retention.js.map +1 -1
  168. package/dist/storage/session-store.d.ts +37 -8
  169. package/dist/storage/session-store.d.ts.map +1 -1
  170. package/dist/storage/session-store.js +255 -48
  171. package/dist/storage/session-store.js.map +1 -1
  172. package/dist/storage/types.d.ts +7 -0
  173. package/dist/storage/types.d.ts.map +1 -1
  174. package/dist/storage/types.js +4 -0
  175. package/dist/storage/types.js.map +1 -1
  176. package/dist/tools/cost-tools.d.ts.map +1 -1
  177. package/dist/tools/cost-tools.js +1 -0
  178. package/dist/tools/cost-tools.js.map +1 -1
  179. package/dist/web/assets/{index-U9DPZ-Tb.js → index-CZvLy2Qy.js} +2 -2
  180. package/dist/web/index.html +1 -1
  181. package/package.json +4 -1
@@ -0,0 +1,132 @@
1
+ import { closeSync, constants, fstatSync, openSync, readFileSync, readSync, statSync, unlinkSync, writeSync, } from 'node:fs';
2
+ export const DRAIN_SEAL = '\0preflight-drain-seal\n';
3
+ const TORN_SEAL_RE = /\0[a-z-]*/g;
4
+ const MAX_WRITES = 5;
5
+ const MAX_OPENS = 100;
6
+ // A short write leaves a fragment. Ending it with a control character as well as a newline keeps a
7
+ // fragment that is itself complete JSON from parsing as an event, since the line is written again whole.
8
+ const TORN_LINE_END = '\x1e\n';
9
+ const READ_ONLY_CODES = new Set(['EACCES', 'EPERM', 'EROFS']);
10
+ export function textBeforeSeal(raw) {
11
+ const seal = raw.indexOf(DRAIN_SEAL);
12
+ return (seal === -1 ? raw : raw.slice(0, seal)).replace(TORN_SEAL_RE, '');
13
+ }
14
+ function readRange(fd, start, end) {
15
+ const buf = Buffer.alloc(Math.max(0, end - start));
16
+ let read = 0;
17
+ while (read < buf.length) {
18
+ const n = readSync(fd, buf, read, buf.length - read, start + read);
19
+ if (n === 0)
20
+ break;
21
+ read += n;
22
+ }
23
+ return buf.subarray(0, read);
24
+ }
25
+ function readToEnd(fd, scratch) {
26
+ let total = 0;
27
+ for (let n; (n = readSync(fd, scratch, 0, scratch.length, null)) > 0;)
28
+ total += n;
29
+ return total;
30
+ }
31
+ // After an O_APPEND write the fd's offset is the end of that write. Reading
32
+ // on from it counts the bytes appended since, and a size that no further
33
+ // read moves past pins the offset.
34
+ function offsetAfterWrite(fd) {
35
+ const scratch = Buffer.alloc(64 * 1024);
36
+ let after = readToEnd(fd, scratch);
37
+ for (;;) {
38
+ const size = fstatSync(fd).size;
39
+ const more = readToEnd(fd, scratch);
40
+ if (more === 0)
41
+ return size - after;
42
+ after += more;
43
+ }
44
+ }
45
+ function isAt(path, file) {
46
+ const now = statSync(path, { bigint: true, throwIfNoEntry: false });
47
+ return now !== undefined && now.ino === file.ino && now.dev === file.dev;
48
+ }
49
+ function appendOnce(path, data) {
50
+ const fd = openSync(path, constants.O_RDWR | constants.O_CREAT | constants.O_APPEND, 0o600);
51
+ try {
52
+ const opened = fstatSync(fd, { bigint: true });
53
+ if (!isAt(path, opened))
54
+ return 'moved';
55
+ const sealFloor = Number(opened.size);
56
+ const written = writeSync(fd, data);
57
+ if (written < data.length) {
58
+ writeSync(fd, TORN_LINE_END);
59
+ return 'redo';
60
+ }
61
+ if (isAt(path, opened))
62
+ return 'kept';
63
+ const start = offsetAfterWrite(fd) - data.length;
64
+ return readRange(fd, sealFloor, start).includes(DRAIN_SEAL) ? 'redo' : 'kept';
65
+ }
66
+ finally {
67
+ closeSync(fd);
68
+ }
69
+ }
70
+ export function appendToHookBuffer(path, text) {
71
+ if (text.includes('\0')) {
72
+ throw new Error(`Hook buffer text contains NUL, which marks a drain seal: ${path}`);
73
+ }
74
+ if (!text.endsWith('\n') || text.indexOf('\n') !== text.length - 1) {
75
+ throw new Error(`Hook buffer text must be exactly one newline-terminated line: ${path}`);
76
+ }
77
+ const data = Buffer.from(text);
78
+ let writes = 0;
79
+ for (let opens = 0; opens < MAX_OPENS; opens++) {
80
+ const landing = appendOnce(path, data);
81
+ if (landing === 'kept')
82
+ return;
83
+ if (landing === 'redo' && ++writes === MAX_WRITES)
84
+ break;
85
+ }
86
+ throw new Error(`Hook buffer write raced a drain on all attempts and was not kept: ${path}`);
87
+ }
88
+ function writeSeal(fd, path) {
89
+ if (writeSync(fd, DRAIN_SEAL) < Buffer.byteLength(DRAIN_SEAL)) {
90
+ throw new Error(`Short write while sealing ${path}`);
91
+ }
92
+ }
93
+ export function sealHookBuffer(path) {
94
+ const fd = openSync(path, constants.O_WRONLY | constants.O_APPEND);
95
+ try {
96
+ writeSeal(fd, path);
97
+ }
98
+ finally {
99
+ closeSync(fd);
100
+ }
101
+ }
102
+ export function readSealed(path) {
103
+ let fd;
104
+ try {
105
+ fd = openSync(path, constants.O_RDWR | constants.O_APPEND);
106
+ }
107
+ catch (err) {
108
+ if (!READ_ONLY_CODES.has(err.code))
109
+ throw err;
110
+ // A writer running as the same user cannot open this file to append either, so no seal
111
+ // is needed. A writer with other credentials, or one whose fd opened before the
112
+ // permission change, can still append and lose that line.
113
+ return textBeforeSeal(readFileSync(path, 'utf-8'));
114
+ }
115
+ try {
116
+ const head = readRange(fd, 0, fstatSync(fd).size);
117
+ if (head.includes(DRAIN_SEAL))
118
+ return textBeforeSeal(head.toString('utf-8'));
119
+ writeSeal(fd, path);
120
+ const tail = readRange(fd, head.length, fstatSync(fd).size);
121
+ return textBeforeSeal(Buffer.concat([head, tail]).toString('utf-8'));
122
+ }
123
+ finally {
124
+ closeSync(fd);
125
+ }
126
+ }
127
+ export function takeClaimText(path) {
128
+ const text = readSealed(path);
129
+ unlinkSync(path);
130
+ return text;
131
+ }
132
+ //# sourceMappingURL=hook-buffer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-buffer.js","sourceRoot":"","sources":["../../src/storage/hook-buffer.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,10 @@ export declare class LocalStore {
11
11
  private readonly storagePath;
12
12
  private readonly bufferPath;
13
13
  private readonly sessionId;
14
+ private readonly countedDir;
15
+ private readonly ownCountedIds;
16
+ private readonly holds;
17
+ private giveUpOrder;
14
18
  /**
15
19
  * @param storagePath The base storage directory (e.g. ~/.newrelic-preflight).
16
20
  * @param bufferPathOrSessionId Either an explicit absolute buffer path
@@ -25,17 +29,26 @@ export declare class LocalStore {
25
29
  */
26
30
  constructor(storagePath: string, bufferPathOrSessionId?: string, sessionId?: string);
27
31
  initialize(): void;
28
- /**
29
- * Append a hook event as a JSON line to the buffer file.
30
- * Uses appendFileSync for minimal latency (<5ms budget).
31
- */
32
32
  appendToBuffer(event: HookEvent): void;
33
33
  /**
34
- * Atomically drain all events from the buffer file.
35
- * Renames the file to a temp path (atomic on POSIX), reads it, then deletes.
36
- * This avoids data loss from concurrent hook writes during drain.
34
+ * Drain this store's buffer, plus this process's own leftover claims of any
35
+ * buffer. The buffer is renamed into a claim of this process's own before it
36
+ * is read, so concurrent drainers never return an event twice, and a claim
37
+ * left by a drainer that died mid-drain is adopted by another.
38
+ *
39
+ * Reading a claim appends a seal to it first. A hook that opened the buffer
40
+ * before the rename and whose line lands after the seal writes the line
41
+ * again to the live buffer, so it is drained on a later pass.
37
42
  */
38
43
  drainBuffer(): HookEvent[];
44
+ /**
45
+ * For a processor that is shutting down: every later drain takes each claim
46
+ * it can rather than holding the claims after one it cannot take. The
47
+ * processor flushes its pending pre events as timeouts right after its last
48
+ * drain, so a post left behind would pair with nothing and count its call
49
+ * twice.
50
+ */
51
+ giveUpHeldOrder(): void;
39
52
  /**
40
53
  * Drain every per-session buffer file under the storage path. Used by
41
54
  * `--local` standalone mode where the dashboard owner sees all live
@@ -44,15 +57,18 @@ export declare class LocalStore {
44
57
  * MCP isn't running) are picked up too.
45
58
  *
46
59
  * A per-session buffer whose `active-<sessionId>.pid` heartbeat names a
47
- * live PID is skipped: that session's own `--stdio` process is already
48
- * polling and draining that exact file via its own scoped drainBuffer() on
49
- * the same cadence. Draining it here too would race that rename-then-read
50
- * against the owner's — whichever process wins a given poll cycle silently
51
- * keeps the batch, and the loser sees nothing, with no error on either
52
- * side. The owner's copy always wins fairly since this call skips the file
53
- * outright rather than racing it.
60
+ * live PID is left to that session's own `--stdio` process.
54
61
  */
55
62
  drainAllBuffers(): HookEvent[];
63
+ /**
64
+ * Records toolUseIds this process counted without a post, in
65
+ * `counted/<sessionId>.<pid>.json`. Each process writes only its own file,
66
+ * so concurrent writers never lose each other's ids; readers take the union.
67
+ */
68
+ rememberCountedToolUseIds(sessionId: string, ids: readonly string[], cap: number): boolean;
69
+ hasCountedToolUseId(sessionId: string, toolUseId: string): boolean;
70
+ gcCountedToolUseIds(now?: number): void;
71
+ private countedFileNames;
56
72
  /**
57
73
  * True when `buffer-<sessionId>.jsonl`'s matching `active-<sessionId>.pid`
58
74
  * heartbeat names a currently-alive PID. `bufferFileName` must already be
@@ -77,7 +93,9 @@ export declare class LocalStore {
77
93
  *
78
94
  * The legacy shared `buffer.jsonl` is included so an upgrading user with
79
95
  * unmigrated events still appears in aggregate views before the next
80
- * `migrateLegacyBuffer()` runs.
96
+ * `migrateLegacyBuffer()` runs. Lines held in drain claims are included
97
+ * too: they are still waiting for a drainer to return them, so a claim
98
+ * that no drainer can unlink keeps showing up here.
81
99
  */
82
100
  peekAllBuffers(): HookEvent[];
83
101
  /**
@@ -285,12 +303,16 @@ export declare class LocalStore {
285
303
  * accept this trade because re-migrating from `.migrating-<pid>` would
286
304
  * re-append already-migrated partitions and produce duplicate events,
287
305
  * which is worse than a once-only loss bounded by the size of the legacy
288
- * file at upgrade time.
306
+ * file at upgrade time. The file is sealed, so recover it by hand with
307
+ * the text before the seal (`\0preflight-drain-seal`), not by appending
308
+ * it whole to a live buffer, where the seal would hide every later line.
289
309
  *
290
310
  * Returns the number of events migrated.
291
311
  */
292
312
  migrateLegacyBuffer(): number;
313
+ private bufferDrains;
293
314
  private drainPath;
315
+ private claimDrain;
294
316
  /** The buffer path this store is currently scoped to (test helper). */
295
317
  getBufferPath(): string;
296
318
  /** The sessionId this store was scoped to, if any (test helper). */
@@ -1 +1 @@
1
- {"version":3,"file":"local-store.d.ts","sourceRoot":"","sources":["../../src/storage/local-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"local-store.d.ts","sourceRoot":"","sources":["../../src/storage/local-store.ts"],"names":[],"mappings":"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"}