@newrelic/preflight 1.71.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 (152) hide show
  1. package/dist/dashboard/routes/api-handler.d.ts.map +1 -1
  2. package/dist/dashboard/routes/api-handler.js +2 -9
  3. package/dist/dashboard/routes/api-handler.js.map +1 -1
  4. package/dist/dashboard/subagent-timeline-store.d.ts +12 -1
  5. package/dist/dashboard/subagent-timeline-store.d.ts.map +1 -1
  6. package/dist/dashboard/subagent-timeline-store.js +32 -4
  7. package/dist/dashboard/subagent-timeline-store.js.map +1 -1
  8. package/dist/dashboard/workflow-store.d.ts.map +1 -1
  9. package/dist/dashboard/workflow-store.js +2 -3
  10. package/dist/dashboard/workflow-store.js.map +1 -1
  11. package/dist/hooks/event-processor.d.ts +20 -5
  12. package/dist/hooks/event-processor.d.ts.map +1 -1
  13. package/dist/hooks/event-processor.js +135 -39
  14. package/dist/hooks/event-processor.js.map +1 -1
  15. package/dist/hooks/index.d.ts +1 -1
  16. package/dist/hooks/index.d.ts.map +1 -1
  17. package/dist/hooks/index.js +1 -1
  18. package/dist/hooks/index.js.map +1 -1
  19. package/dist/hooks/parent-transcript-watcher.d.ts +1 -1
  20. package/dist/hooks/parent-transcript-watcher.d.ts.map +1 -1
  21. package/dist/hooks/parent-transcript-watcher.js +6 -2
  22. package/dist/hooks/parent-transcript-watcher.js.map +1 -1
  23. package/dist/hooks/session-resolver.d.ts.map +1 -1
  24. package/dist/hooks/session-resolver.js +2 -1
  25. package/dist/hooks/session-resolver.js.map +1 -1
  26. package/dist/hooks/subagent-watcher.d.ts +3 -1
  27. package/dist/hooks/subagent-watcher.d.ts.map +1 -1
  28. package/dist/hooks/subagent-watcher.js +6 -4
  29. package/dist/hooks/subagent-watcher.js.map +1 -1
  30. package/dist/hooks/workflow-watcher.d.ts.map +1 -1
  31. package/dist/hooks/workflow-watcher.js +2 -2
  32. package/dist/hooks/workflow-watcher.js.map +1 -1
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +53 -60
  35. package/dist/index.js.map +1 -1
  36. package/dist/install/cli.d.ts.map +1 -1
  37. package/dist/install/cli.js +81 -7
  38. package/dist/install/cli.js.map +1 -1
  39. package/dist/install/copilot-install-helper.d.ts +1 -0
  40. package/dist/install/copilot-install-helper.d.ts.map +1 -1
  41. package/dist/install/copilot-install-helper.js +82 -26
  42. package/dist/install/copilot-install-helper.js.map +1 -1
  43. package/dist/install/diagnostics.d.ts.map +1 -1
  44. package/dist/install/diagnostics.js +6 -3
  45. package/dist/install/diagnostics.js.map +1 -1
  46. package/dist/install/install-helper.d.ts +9 -0
  47. package/dist/install/install-helper.d.ts.map +1 -1
  48. package/dist/install/install-helper.js +42 -17
  49. package/dist/install/install-helper.js.map +1 -1
  50. package/dist/install/schedule.d.ts.map +1 -1
  51. package/dist/install/schedule.js +4 -1
  52. package/dist/install/schedule.js.map +1 -1
  53. package/dist/install/target-user.d.ts +33 -0
  54. package/dist/install/target-user.d.ts.map +1 -0
  55. package/dist/install/target-user.js +121 -0
  56. package/dist/install/target-user.js.map +1 -0
  57. package/dist/lib/claude-config-dir.d.ts +3 -0
  58. package/dist/lib/claude-config-dir.d.ts.map +1 -0
  59. package/dist/lib/claude-config-dir.js +10 -0
  60. package/dist/lib/claude-config-dir.js.map +1 -0
  61. package/dist/lib/claude-settings-env.d.ts +18 -0
  62. package/dist/lib/claude-settings-env.d.ts.map +1 -0
  63. package/dist/lib/claude-settings-env.js +78 -0
  64. package/dist/lib/claude-settings-env.js.map +1 -0
  65. package/dist/lib/date.d.ts +7 -0
  66. package/dist/lib/date.d.ts.map +1 -1
  67. package/dist/lib/date.js +11 -1
  68. package/dist/lib/date.js.map +1 -1
  69. package/dist/lib/subagent-transcript-parser.d.ts +2 -0
  70. package/dist/lib/subagent-transcript-parser.d.ts.map +1 -1
  71. package/dist/lib/subagent-transcript-parser.js +5 -0
  72. package/dist/lib/subagent-transcript-parser.js.map +1 -1
  73. package/dist/lib/transcript-types.d.ts +4 -0
  74. package/dist/lib/transcript-types.d.ts.map +1 -1
  75. package/dist/metrics/cost-forecast.d.ts +2 -0
  76. package/dist/metrics/cost-forecast.d.ts.map +1 -1
  77. package/dist/metrics/cost-forecast.js +46 -24
  78. package/dist/metrics/cost-forecast.js.map +1 -1
  79. package/dist/metrics/cost-tracker.d.ts +3 -3
  80. package/dist/metrics/cost-tracker.js +3 -3
  81. package/dist/metrics/efficiency-score.d.ts +2 -2
  82. package/dist/metrics/efficiency-score.js +2 -2
  83. package/dist/metrics/first-save-baselines.d.ts +60 -0
  84. package/dist/metrics/first-save-baselines.d.ts.map +1 -0
  85. package/dist/metrics/first-save-baselines.js +77 -0
  86. package/dist/metrics/first-save-baselines.js.map +1 -0
  87. package/dist/metrics/local-session-aggregator.d.ts +2 -1
  88. package/dist/metrics/local-session-aggregator.d.ts.map +1 -1
  89. package/dist/metrics/local-session-aggregator.js +21 -0
  90. package/dist/metrics/local-session-aggregator.js.map +1 -1
  91. package/dist/metrics/model-pricing.d.ts +1 -1
  92. package/dist/metrics/model-pricing.d.ts.map +1 -1
  93. package/dist/metrics/model-pricing.js +2 -2
  94. package/dist/metrics/model-pricing.js.map +1 -1
  95. package/dist/metrics/model-usage-tracker.d.ts +2 -2
  96. package/dist/metrics/model-usage-tracker.js +2 -2
  97. package/dist/metrics/pricing-init.d.ts.map +1 -1
  98. package/dist/metrics/pricing-init.js +5 -3
  99. package/dist/metrics/pricing-init.js.map +1 -1
  100. package/dist/metrics/pricing-overlay.d.ts.map +1 -1
  101. package/dist/metrics/pricing-overlay.js +1 -4
  102. package/dist/metrics/pricing-overlay.js.map +1 -1
  103. package/dist/metrics/pricing-refresh.d.ts +16 -4
  104. package/dist/metrics/pricing-refresh.d.ts.map +1 -1
  105. package/dist/metrics/pricing-refresh.js +47 -1
  106. package/dist/metrics/pricing-refresh.js.map +1 -1
  107. package/dist/metrics/quality-proxy-tracker.d.ts +2 -2
  108. package/dist/metrics/quality-proxy-tracker.js +2 -2
  109. package/dist/metrics/session-tracker.d.ts +5 -1
  110. package/dist/metrics/session-tracker.d.ts.map +1 -1
  111. package/dist/metrics/session-tracker.js +58 -17
  112. package/dist/metrics/session-tracker.js.map +1 -1
  113. package/dist/metrics/task-detector.d.ts +2 -2
  114. package/dist/metrics/task-detector.js +2 -2
  115. package/dist/metrics/token-usage.d.ts +6 -0
  116. package/dist/metrics/token-usage.d.ts.map +1 -0
  117. package/dist/metrics/token-usage.js +34 -0
  118. package/dist/metrics/token-usage.js.map +1 -0
  119. package/dist/metrics/turn-cost-attributor.d.ts.map +1 -1
  120. package/dist/metrics/turn-cost-attributor.js +3 -0
  121. package/dist/metrics/turn-cost-attributor.js.map +1 -1
  122. package/dist/platforms/copilot-adapter.d.ts.map +1 -1
  123. package/dist/platforms/copilot-adapter.js +3 -0
  124. package/dist/platforms/copilot-adapter.js.map +1 -1
  125. package/dist/platforms/copilot-sdk-adapter.d.ts.map +1 -1
  126. package/dist/platforms/copilot-sdk-adapter.js +3 -0
  127. package/dist/platforms/copilot-sdk-adapter.js.map +1 -1
  128. package/dist/storage/drain-claims.d.ts +33 -10
  129. package/dist/storage/drain-claims.d.ts.map +1 -1
  130. package/dist/storage/drain-claims.js +78 -13
  131. package/dist/storage/drain-claims.js.map +1 -1
  132. package/dist/storage/local-store.d.ts +21 -0
  133. package/dist/storage/local-store.d.ts.map +1 -1
  134. package/dist/storage/local-store.js +118 -19
  135. package/dist/storage/local-store.js.map +1 -1
  136. package/dist/storage/retention.d.ts.map +1 -1
  137. package/dist/storage/retention.js +7 -6
  138. package/dist/storage/retention.js.map +1 -1
  139. package/dist/storage/session-store.d.ts +16 -2
  140. package/dist/storage/session-store.d.ts.map +1 -1
  141. package/dist/storage/session-store.js +242 -37
  142. package/dist/storage/session-store.js.map +1 -1
  143. package/dist/storage/types.d.ts +7 -0
  144. package/dist/storage/types.d.ts.map +1 -1
  145. package/dist/storage/types.js +4 -0
  146. package/dist/storage/types.js.map +1 -1
  147. package/dist/tools/cost-tools.d.ts.map +1 -1
  148. package/dist/tools/cost-tools.js +1 -0
  149. package/dist/tools/cost-tools.js.map +1 -1
  150. package/dist/web/assets/{index-U9DPZ-Tb.js → index-CZvLy2Qy.js} +2 -2
  151. package/dist/web/index.html +1 -1
  152. package/package.json +4 -1
@@ -0,0 +1,78 @@
1
+ import { existsSync, readdirSync, readFileSync } from 'node:fs';
2
+ import { homedir, platform } from 'node:os';
3
+ import { dirname, join } from 'node:path';
4
+ import { createLogger } from '../shared/index.js';
5
+ import { claudeConfigDir } from './claude-config-dir.js';
6
+ const logger = createLogger('claude-settings-env');
7
+ function managedSettingsPath(os) {
8
+ if (os === 'darwin')
9
+ return '/Library/Application Support/ClaudeCode/managed-settings.json';
10
+ if (os === 'linux')
11
+ return '/etc/claude-code/managed-settings.json';
12
+ if (os === 'win32')
13
+ return 'C:\\Program Files\\ClaudeCode\\managed-settings.json';
14
+ return null;
15
+ }
16
+ const EXPORTER_KEY = /^OTEL_[A-Z]+_EXPORTER$/;
17
+ function managedDropIns(managedPath) {
18
+ const dir = join(dirname(managedPath), 'managed-settings.d');
19
+ try {
20
+ return readdirSync(dir)
21
+ .filter((name) => name.endsWith('.json') && !name.startsWith('.'))
22
+ .sort()
23
+ .map((name) => join(dir, name));
24
+ }
25
+ catch {
26
+ return [];
27
+ }
28
+ }
29
+ function onlyExportersTurnedOff(block) {
30
+ const out = {};
31
+ for (const [key, value] of Object.entries(block)) {
32
+ if (EXPORTER_KEY.test(key) && value.trim() === 'none')
33
+ out[key] = value;
34
+ }
35
+ return out;
36
+ }
37
+ function readEnvBlock(path) {
38
+ if (!existsSync(path))
39
+ return {};
40
+ try {
41
+ const parsed = JSON.parse(readFileSync(path, 'utf-8'));
42
+ const block = parsed?.env;
43
+ if (typeof block !== 'object' || block === null || Array.isArray(block))
44
+ return {};
45
+ const out = {};
46
+ for (const [key, value] of Object.entries(block)) {
47
+ if (typeof value === 'string')
48
+ out[key] = value;
49
+ }
50
+ return out;
51
+ }
52
+ catch (err) {
53
+ logger.debug('Could not read Claude Code settings env block', { path, error: String(err) });
54
+ return {};
55
+ }
56
+ }
57
+ /**
58
+ * Overlays the `env` blocks of the settings files Claude Code reads onto `env`,
59
+ * lowest to highest precedence: user, project, project-local, managed. The
60
+ * shell value stays as the fallback for any key no settings file sets. Claude
61
+ * Code ignores telemetry variables in project and local `env` blocks, so those
62
+ * two files contribute only an `OTEL_*_EXPORTER` of `none`, which still turns
63
+ * export off. Managed policy is managed-settings.json followed by the
64
+ * managed-settings.d/*.json drop-ins in alphabetical order; server-managed,
65
+ * MDM, and registry sources are not read.
66
+ */
67
+ export function withClaudeSettingsEnv(env, options = {}) {
68
+ const cwd = options.cwd ?? process.cwd();
69
+ const managed = options.managedSettingsPath ?? managedSettingsPath(options.platform ?? platform());
70
+ const blocks = [
71
+ readEnvBlock(join(claudeConfigDir(env, options.home ?? homedir()), 'settings.json')),
72
+ onlyExportersTurnedOff(readEnvBlock(join(cwd, '.claude', 'settings.json'))),
73
+ onlyExportersTurnedOff(readEnvBlock(join(cwd, '.claude', 'settings.local.json'))),
74
+ ...(managed ? [managed, ...managedDropIns(managed)].map(readEnvBlock) : []),
75
+ ];
76
+ return Object.assign({}, env, ...blocks);
77
+ }
78
+ //# sourceMappingURL=claude-settings-env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-settings-env.js","sourceRoot":"","sources":["../../src/lib/claude-settings-env.ts"],"names":[],"mappings":"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"}
@@ -23,6 +23,13 @@
23
23
  * name) is given, in which case midnight is computed in that zone instead.
24
24
  */
25
25
  export declare function localStartOfDay(refTs?: number, tz?: string): number;
26
+ /**
27
+ * Epoch ms at the next local midnight after `dayStart` (a value from
28
+ * `localStartOfDay`). Built from Y/M/D parts so a 23h or 25h day ends at the
29
+ * real midnight, and a zone that skips midnight (Santiago) lands on its
30
+ * 00:00 or 01:00 start via `localStartOfDay` instead of drifting by an hour.
31
+ */
32
+ export declare function localEndOfDay(dayStart: number): number;
26
33
  /**
27
34
  * True iff `ts` and `refTs` (or now) fall on the same calendar day.
28
35
  * Uses Y/M/D comparison so DST transitions don't introduce off-by-one bugs
@@ -1 +1 @@
1
- {"version":3,"file":"date.d.ts","sourceRoot":"","sources":["../../src/lib/date.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAqIH;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CASnE;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAa/E;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAU7D;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE;IACP,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,aAAa,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjD,EACD,KAAK,CAAC,EAAE,MAAM,GACb,MAAM,CAqBR;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE;IACP,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,EAAE,aAAa,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjD,EACD,KAAK,CAAC,EAAE,MAAM,GACb,MAAM,CAIR"}
1
+ {"version":3,"file":"date.d.ts","sourceRoot":"","sources":["../../src/lib/date.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAqIH;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CASnE;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGtD;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAa/E;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAU7D;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE;IACP,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,aAAa,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjD,EACD,KAAK,CAAC,EAAE,MAAM,GACb,MAAM,CAqBR;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE;IACP,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,EAAE,aAAa,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjD,EACD,KAAK,CAAC,EAAE,MAAM,GACb,MAAM,CAIR"}
package/dist/lib/date.js CHANGED
@@ -154,6 +154,16 @@ export function localStartOfDay(refTs, tz) {
154
154
  d.setHours(0, 0, 0, 0);
155
155
  return d.getTime();
156
156
  }
157
+ /**
158
+ * Epoch ms at the next local midnight after `dayStart` (a value from
159
+ * `localStartOfDay`). Built from Y/M/D parts so a 23h or 25h day ends at the
160
+ * real midnight, and a zone that skips midnight (Santiago) lands on its
161
+ * 00:00 or 01:00 start via `localStartOfDay` instead of drifting by an hour.
162
+ */
163
+ export function localEndOfDay(dayStart) {
164
+ const d = new Date(dayStart);
165
+ return localStartOfDay(new Date(d.getFullYear(), d.getMonth(), d.getDate() + 1).getTime());
166
+ }
157
167
  /**
158
168
  * True iff `ts` and `refTs` (or now) fall on the same calendar day.
159
169
  * Uses Y/M/D comparison so DST transitions don't introduce off-by-one bugs
@@ -210,7 +220,7 @@ export function localDateKey(ts, tz) {
210
220
  */
211
221
  export function todayPortionRatio(session, refTs) {
212
222
  const dayStart = localStartOfDay(refTs);
213
- const dayEnd = dayStart + 86_400_000;
223
+ const dayEnd = localEndOfDay(dayStart);
214
224
  if (session.endTime < dayStart)
215
225
  return 0;
216
226
  if (session.startTime >= dayEnd)
@@ -1 +1 @@
1
- {"version":3,"file":"date.js","sourceRoot":"","sources":["../../src/lib/date.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"date.js","sourceRoot":"","sources":["../../src/lib/date.ts"],"names":[],"mappings":"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"}
@@ -18,6 +18,8 @@ export interface ParsedAssistantTurnFields {
18
18
  readonly outputTokens: number;
19
19
  readonly cacheReadTokens: number;
20
20
  readonly cacheCreationTokens: number;
21
+ /** Subset of `cacheCreationTokens` written to the 1-hour cache; the rest are 5-minute writes. */
22
+ readonly cacheCreation1hTokens: number;
21
23
  readonly reasoningTokens: number;
22
24
  readonly stopReason: string | null;
23
25
  readonly usageKeysFingerprint: string;
@@ -1 +1 @@
1
- {"version":3,"file":"subagent-transcript-parser.d.ts","sourceRoot":"","sources":["../../src/lib/subagent-transcript-parser.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAiC,MAAM,uBAAuB,CAAC;AAE/F;;;;;;;;;GASG;AACH,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,4BAA4B,EAAE,MAAM,CAAC;IAC9C,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,oHAAoH;IACpH,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;CAC/B;AAED,MAAM,WAAW,4BAA4B;IAC3C;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,yBAAyB,GAAG,IAAI,CAAC;IAClD,6DAA6D;IAC7D,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;CAC/B;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,4BAA4B,CA2DjF;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAItE;AAED,wBAAgB,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAEtC;AAgCD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,MAAM,EAAE,CAcrE"}
1
+ {"version":3,"file":"subagent-transcript-parser.d.ts","sourceRoot":"","sources":["../../src/lib/subagent-transcript-parser.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAiC,MAAM,uBAAuB,CAAC;AAE/F;;;;;;;;;GASG;AACH,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,iGAAiG;IACjG,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,4BAA4B,EAAE,MAAM,CAAC;IAC9C,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,oHAAoH;IACpH,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;CAC/B;AAED,MAAM,WAAW,4BAA4B;IAC3C;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,yBAAyB,GAAG,IAAI,CAAC;IAClD,6DAA6D;IAC7D,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;CAC/B;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,4BAA4B,CAiEjF;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAItE;AAED,wBAAgB,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAEtC;AAgCD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,MAAM,EAAE,CAcrE"}
@@ -30,6 +30,10 @@ export function parseAssistantTurnLine(line) {
30
30
  const outputTokens = num(u.output_tokens);
31
31
  const cacheReadTokens = num(u.cache_read_input_tokens);
32
32
  const cacheCreationTokens = num(u.cache_creation_input_tokens);
33
+ const cacheCreation = u.cache_creation;
34
+ const cacheCreation1hTokens = cacheCreation && typeof cacheCreation === 'object'
35
+ ? Math.min(num(cacheCreation.ephemeral_1h_input_tokens), cacheCreationTokens)
36
+ : 0;
33
37
  let reasoningTokens = 0;
34
38
  const otd = u.output_tokens_details;
35
39
  if (otd && typeof otd === 'object') {
@@ -48,6 +52,7 @@ export function parseAssistantTurnLine(line) {
48
52
  outputTokens,
49
53
  cacheReadTokens,
50
54
  cacheCreationTokens,
55
+ cacheCreation1hTokens,
51
56
  reasoningTokens,
52
57
  stopReason,
53
58
  usageKeysFingerprint,
@@ -1 +1 @@
1
- {"version":3,"file":"subagent-transcript-parser.js","sourceRoot":"","sources":["../../src/lib/subagent-transcript-parser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"subagent-transcript-parser.js","sourceRoot":"","sources":["../../src/lib/subagent-transcript-parser.ts"],"names":[],"mappings":"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"}
@@ -45,6 +45,10 @@ export interface RawUsage {
45
45
  readonly output_tokens?: number;
46
46
  readonly cache_read_input_tokens?: number;
47
47
  readonly cache_creation_input_tokens?: number;
48
+ readonly cache_creation?: {
49
+ readonly ephemeral_1h_input_tokens?: number;
50
+ readonly ephemeral_5m_input_tokens?: number;
51
+ };
48
52
  readonly output_tokens_details?: {
49
53
  readonly reasoning_tokens?: number;
50
54
  };
@@ -1 +1 @@
1
- {"version":3,"file":"transcript-types.d.ts","sourceRoot":"","sources":["../../src/lib/transcript-types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,gEAAgE;AAChE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,gFAAgF;IAChF,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,0EAA0E;IAC1E,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,gEAAgE;IAChE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IACpC,yGAAyG;IACzG,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,qFAAqF;IACrF,QAAQ,CAAC,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9C;AAED,iEAAiE;AACjE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAC1C,QAAQ,CAAC,2BAA2B,CAAC,EAAE,MAAM,CAAC;IAC9C,QAAQ,CAAC,qBAAqB,CAAC,EAAE;QAAE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACxE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACjC"}
1
+ {"version":3,"file":"transcript-types.d.ts","sourceRoot":"","sources":["../../src/lib/transcript-types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,gEAAgE;AAChE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,gFAAgF;IAChF,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,0EAA0E;IAC1E,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,gEAAgE;IAChE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IACpC,yGAAyG;IACzG,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,qFAAqF;IACrF,QAAQ,CAAC,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9C;AAED,iEAAiE;AACjE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAC1C,QAAQ,CAAC,2BAA2B,CAAC,EAAE,MAAM,CAAC;IAC9C,QAAQ,CAAC,cAAc,CAAC,EAAE;QACxB,QAAQ,CAAC,yBAAyB,CAAC,EAAE,MAAM,CAAC;QAC5C,QAAQ,CAAC,yBAAyB,CAAC,EAAE,MAAM,CAAC;KAC7C,CAAC;IACF,QAAQ,CAAC,qBAAqB,CAAC,EAAE;QAAE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACxE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACjC"}
@@ -6,6 +6,8 @@ export interface CostForecast {
6
6
  readonly forecastEndOfWeekUsd: number | null;
7
7
  readonly forecastSessionEndUsd: number | null;
8
8
  readonly confidenceNote: string;
9
+ /** Why the end-of-day and end-of-week forecasts are held. Null when they are shown, and also for the no-data and no-spend early returns. */
10
+ readonly heldReason: string | null;
9
11
  }
10
12
  export interface CostForecastInputs {
11
13
  /** Total spend during the live session, used for the session-end forecast. */
@@ -1 +1 @@
1
- {"version":3,"file":"cost-forecast.d.ts","sourceRoot":"","sources":["../../src/metrics/cost-forecast.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C,QAAQ,CAAC,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7C,QAAQ,CAAC,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9C,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,kBAAkB;IACjC,8EAA8E;IAC9E,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,+CAA+C;IAC/C,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/C;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,EACtB,KAAK,GAAE,MAAmB,GACzB,YAAY,CAEd;AAED,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,kBAAkB,EAC1B,KAAK,GAAE,MAAmB,GACzB,YAAY,CA4Fd"}
1
+ {"version":3,"file":"cost-forecast.d.ts","sourceRoot":"","sources":["../../src/metrics/cost-forecast.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C,QAAQ,CAAC,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7C,QAAQ,CAAC,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9C,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,4IAA4I;IAC5I,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC;AAED,MAAM,WAAW,kBAAkB;IACjC,8EAA8E;IAC9E,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,+CAA+C;IAC/C,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/C;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,EACtB,KAAK,GAAE,MAAmB,GACzB,YAAY,CAEd;AAED,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,kBAAkB,EAC1B,KAAK,GAAE,MAAmB,GACzB,YAAY,CA6Gd"}
@@ -1,4 +1,8 @@
1
- import { localStartOfDay } from '../lib/date.js';
1
+ import { localEndOfDay, localStartOfDay } from '../lib/date.js';
2
+ const MIN_FORECAST_WINDOW_MS = 10 * 60_000;
3
+ const MODERATE_CONFIDENCE_WINDOW_MS = 30 * 60_000;
4
+ const MIN_FORECAST_WINDOW_MIN = MIN_FORECAST_WINDOW_MS / 60_000;
5
+ const MODERATE_CONFIDENCE_WINDOW_MIN = MODERATE_CONFIDENCE_WINDOW_MS / 60_000;
2
6
  /**
3
7
  * Backward-compatible legacy entrypoint. Prefer `buildCostForecastFromInputs`
4
8
  * so the EoD forecast can be anchored to today's spend rather than the full
@@ -19,6 +23,7 @@ export function buildCostForecastFromInputs(inputs, nowMs = Date.now()) {
19
23
  forecastEndOfWeekUsd: null,
20
24
  forecastSessionEndUsd: null,
21
25
  confidenceNote: 'Insufficient data for forecast.',
26
+ heldReason: null,
22
27
  };
23
28
  }
24
29
  // Session running but nothing spent yet — return zero forecasts so callers
@@ -32,54 +37,70 @@ export function buildCostForecastFromInputs(inputs, nowMs = Date.now()) {
32
37
  forecastEndOfWeekUsd: 0,
33
38
  forecastSessionEndUsd: 0,
34
39
  confidenceNote: 'Session running — no spend recorded yet.',
40
+ heldReason: null,
35
41
  };
36
42
  }
37
43
  const sessionRateUsdPerMs = sessionSpentUsd / elapsedMs;
38
- // End-of-day boundary in **local** time, matching the rest of the dashboard
39
- // (lib/date.ts localStartOfDay). Previously this used UTC, which drifted
40
- // a forecast across the day boundary for non-UTC users.
44
+ // Local-time day boundary, matching the dashboard's day bucketing.
41
45
  const dayStartMs = localStartOfDay(nowMs);
42
- const dayEndMs = dayStartMs + 86_400_000;
46
+ const dayEndMs = localEndOfDay(dayStartMs);
43
47
  const msUntilEndOfDay = Math.max(0, dayEndMs - nowMs);
44
- // Daily-anchored EoD/EoW forecast when caller supplies today's spend +
45
- // first-activity-of-day. Both the day and week projections use the same
46
- // effective rate and base so they are internally consistent: the week
47
- // forecast is simply the day forecast extended to the full remaining week.
48
- // Falls back to session rate/base when the daily anchor is absent.
48
+ // Day and week projections share one effective rate and base.
49
+ let effectiveElapsedMs;
49
50
  let effectiveRateUsdPerMs;
50
51
  let effectiveBaseUsd;
52
+ let anchorMissing = false;
51
53
  if (typeof dailySpentUsd === 'number' &&
52
54
  dailySpentUsd >= 0 &&
53
55
  typeof dailyFirstActivityMs === 'number' &&
54
56
  dailyFirstActivityMs > 0) {
55
- const dailyElapsedMs = Math.max(1, nowMs - dailyFirstActivityMs);
56
- effectiveRateUsdPerMs = dailySpentUsd / dailyElapsedMs;
57
+ effectiveElapsedMs = Math.max(1, nowMs - dailyFirstActivityMs);
58
+ effectiveRateUsdPerMs = dailySpentUsd / effectiveElapsedMs;
57
59
  effectiveBaseUsd = dailySpentUsd;
58
60
  }
59
61
  else {
62
+ // Without a daily anchor, only a session that began today has all its
63
+ // spend in today's base. An older session's spend is mostly yesterday's.
64
+ effectiveElapsedMs = elapsedMs;
60
65
  effectiveRateUsdPerMs = sessionRateUsdPerMs;
61
66
  effectiveBaseUsd = sessionSpentUsd;
67
+ anchorMissing = sessionStartMs < dayStartMs;
62
68
  }
63
- const forecastEndOfDayUsd = effectiveBaseUsd + effectiveRateUsdPerMs * msUntilEndOfDay;
64
- // ISO week ends on Sunday. Convert local getDay() (0=Sun…6=Sat) to ISO day (1=Mon…7=Sun)
65
- // then compute remaining days: Sunday → 0 remaining, Monday → 6, …, Saturday → 1.
66
- // Use getDay() (local) not getUTCDay() — the week boundary must match the local EoD boundary.
69
+ const forecastHeld = anchorMissing || effectiveElapsedMs < MIN_FORECAST_WINDOW_MS;
70
+ const heldReason = !forecastHeld
71
+ ? null
72
+ : anchorMissing
73
+ ? 'held: no spend yet today'
74
+ : `held: under ${MIN_FORECAST_WINDOW_MIN} minutes of today's data`;
75
+ const project = (msRemaining) => forecastHeld ? null : effectiveBaseUsd + effectiveRateUsdPerMs * msRemaining;
76
+ const forecastEndOfDayUsd = project(msUntilEndOfDay);
77
+ // Local weekday, so the week boundary matches the local day boundary.
67
78
  const now = new Date(nowMs);
68
79
  const dayOfWeek = now.getDay();
69
80
  const isoDay = dayOfWeek === 0 ? 7 : dayOfWeek;
70
81
  const msUntilEndOfWeek = ((7 - isoDay) % 7) * 86_400_000 + msUntilEndOfDay;
71
- const forecastEndOfWeekUsd = effectiveBaseUsd + effectiveRateUsdPerMs * msUntilEndOfWeek;
82
+ const forecastEndOfWeekUsd = project(msUntilEndOfWeek);
72
83
  // Assumes a full 8-hour workday as the session-end horizon — there's no
73
84
  // real "end of session" signal to anchor this forecast to otherwise.
74
85
  const SESSION_TARGET_MS = 8 * 60 * 60 * 1000;
75
86
  const msUntilSessionEnd = Math.max(0, SESSION_TARGET_MS - elapsedMs);
76
- const forecastSessionEndUsd = sessionSpentUsd + sessionRateUsdPerMs * msUntilSessionEnd;
77
- const elapsedMinutes = elapsedMs / 60_000;
78
- const confidenceNote = elapsedMinutes < 10
79
- ? 'Low confidence — less than 10 minutes of data.'
80
- : elapsedMinutes < 30
81
- ? 'Moderate confidence — based on less than 30 minutes of data.'
82
- : 'Reasonable confidence — based on 30+ minutes of data.';
87
+ const forecastSessionEndUsd = elapsedMs < MIN_FORECAST_WINDOW_MS
88
+ ? null
89
+ : sessionSpentUsd + sessionRateUsdPerMs * msUntilSessionEnd;
90
+ // Grades the window of the number the caller sees: the day/week window while
91
+ // those forecasts are shown, else the session window behind the session-end one.
92
+ const sessionEndShown = forecastSessionEndUsd !== null;
93
+ const gradedWindowMs = forecastHeld ? (sessionEndShown ? elapsedMs : 0) : effectiveElapsedMs;
94
+ let confidenceNote;
95
+ if (gradedWindowMs < MIN_FORECAST_WINDOW_MS) {
96
+ confidenceNote = `Low confidence — less than ${MIN_FORECAST_WINDOW_MIN} minutes of data.`;
97
+ }
98
+ else if (gradedWindowMs < MODERATE_CONFIDENCE_WINDOW_MS) {
99
+ confidenceNote = `Moderate confidence — based on less than ${MODERATE_CONFIDENCE_WINDOW_MIN} minutes of data.`;
100
+ }
101
+ else {
102
+ confidenceNote = `Reasonable confidence — based on ${MODERATE_CONFIDENCE_WINDOW_MIN}+ minutes of data.`;
103
+ }
83
104
  return {
84
105
  elapsedMs,
85
106
  spentUsd: sessionSpentUsd,
@@ -88,6 +109,7 @@ export function buildCostForecastFromInputs(inputs, nowMs = Date.now()) {
88
109
  forecastEndOfWeekUsd,
89
110
  forecastSessionEndUsd,
90
111
  confidenceNote,
112
+ heldReason,
91
113
  };
92
114
  }
93
115
  //# sourceMappingURL=cost-forecast.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cost-forecast.js","sourceRoot":"","sources":["../../src/metrics/cost-forecast.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cost-forecast.js","sourceRoot":"","sources":["../../src/metrics/cost-forecast.ts"],"names":[],"mappings":"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"}
@@ -336,9 +336,9 @@ export declare class CostTracker implements Resettable {
336
336
  /**
337
337
  * Seeds cumulative totals from a previous process's last checkpoint for
338
338
  * this same session. Adds to current state rather than overwriting, so
339
- * callers must invoke this at most once per (re)adopted session id, before
340
- * any real activity for that id has been recorded here — see the call
341
- * sites in `index.ts` for the once-per-id guard.
339
+ * callers must invoke this at most once per (re)adopted session id, with
340
+ * totals this tracker has not already counted — see
341
+ * `rehydrateTrackersIfResumed` in `index.ts`.
342
342
  *
343
343
  * Restart data-loss fix: `ParentTranscriptWatcher`'s transcript-read cursor
344
344
  * is durably persisted across process restarts so a resumed session never
@@ -322,9 +322,9 @@ export class CostTracker {
322
322
  /**
323
323
  * Seeds cumulative totals from a previous process's last checkpoint for
324
324
  * this same session. Adds to current state rather than overwriting, so
325
- * callers must invoke this at most once per (re)adopted session id, before
326
- * any real activity for that id has been recorded here — see the call
327
- * sites in `index.ts` for the once-per-id guard.
325
+ * callers must invoke this at most once per (re)adopted session id, with
326
+ * totals this tracker has not already counted — see
327
+ * `rehydrateTrackersIfResumed` in `index.ts`.
328
328
  *
329
329
  * Restart data-loss fix: `ParentTranscriptWatcher`'s transcript-read cursor
330
330
  * is durably persisted across process restarts so a resumed session never
@@ -106,8 +106,8 @@ export declare class EfficiencyScorer implements Resettable {
106
106
  * reconstructable from a checkpoint, only the average is.
107
107
  *
108
108
  * Adds to current totals rather than overwriting, so callers must invoke
109
- * this at most once per (re)adopted session id, before any real activity
110
- * for that id has reached this tracker.
109
+ * this at most once per (re)adopted session id, with totals this tracker
110
+ * has not already counted — see `rehydrateTrackersIfResumed` in `index.ts`.
111
111
  */
112
112
  seedFromPersisted(seed: EfficiencyScoreSeed): void;
113
113
  /**
@@ -113,8 +113,8 @@ export class EfficiencyScorer {
113
113
  * reconstructable from a checkpoint, only the average is.
114
114
  *
115
115
  * Adds to current totals rather than overwriting, so callers must invoke
116
- * this at most once per (re)adopted session id, before any real activity
117
- * for that id has reached this tracker.
116
+ * this at most once per (re)adopted session id, with totals this tracker
117
+ * has not already counted — see `rehydrateTrackersIfResumed` in `index.ts`.
118
118
  */
119
119
  seedFromPersisted(seed) {
120
120
  if (seed.sampleCount <= 0)
@@ -0,0 +1,60 @@
1
+ import type { FullSessionSummary } from '../storage/session-store.js';
2
+ import type { CostTrackerSeed } from './cost-tracker.js';
3
+ import type { ModelBreakdownEntry } from './model-usage-tracker.js';
4
+ import type { EfficiencyScoreSeed } from './efficiency-score.js';
5
+ import type { QualityProxyRawCounts } from './quality-proxy-tracker.js';
6
+ import type { SessionTrackerSeed } from './session-tracker.js';
7
+ import type { TaskDetectorSeed } from './task-detector.js';
8
+ /** What SessionTracker, QualityProxyTracker, TaskDetector and EfficiencyScorer seed from. */
9
+ export interface ToolCallSeed {
10
+ readonly sessionTracker: SessionTrackerSeed;
11
+ readonly qualityProxy: QualityProxyRawCounts;
12
+ readonly taskDetector: TaskDetectorSeed;
13
+ readonly efficiency: EfficiencyScoreSeed | null;
14
+ }
15
+ export declare function toolCallSeedOf(summary: FullSessionSummary): ToolCallSeed;
16
+ /** What CostTracker, ModelUsageTracker and the budget thresholds seed from. */
17
+ export interface CostSeed {
18
+ readonly costTracker: CostTrackerSeed;
19
+ readonly modelBreakdown: Readonly<Record<string, ModelBreakdownEntry>>;
20
+ /** The prior spend alone, which is all the budget thresholds may be seeded from. */
21
+ readonly estimatedCostUsd: number | null;
22
+ }
23
+ export declare function costSeedOf(summary: FullSessionSummary): CostSeed;
24
+ /** The session file each tracker family seeds from; null seeds nothing. */
25
+ export interface RehydrationSeeds {
26
+ readonly toolCalls: ToolCallSeed | null;
27
+ /** For CostTracker, ModelUsageTracker and the budget thresholds. */
28
+ readonly cost: CostSeed | null;
29
+ }
30
+ /**
31
+ * Seeding adds, so each tracker family of a --stdio engine must seed a
32
+ * session from its file as it stood before this process saved anything that
33
+ * family already counted. The tool-call trackers count every record the
34
+ * process drains, provisional rollups of other sessions included, so their
35
+ * snapshot is taken at the first save of any kind. The cost trackers only
36
+ * price another session's tokens, so theirs is taken at the first save of
37
+ * the process's own summary; until then they seed from the current file,
38
+ * which holds the rollup cost they never counted.
39
+ *
40
+ * Entries stay until their id is rehydrated. A provisional engine keeps one
41
+ * small tool-call record per session it rolls up, next to the full rollup
42
+ * (timeline included) LocalSessionAggregator already keeps for that session
43
+ * for the life of the process. Evicting a record would bring the double
44
+ * count back. Only the cwd-guessed id ever has an own-summary snapshot.
45
+ */
46
+ export declare class FirstSaveBaselines {
47
+ private readonly toolCalls;
48
+ private readonly cost;
49
+ /** `previous` is the file the save merged against, null for a new file. */
50
+ recordSave(save: {
51
+ readonly sessionId: string;
52
+ readonly previous: FullSessionSummary | null;
53
+ readonly ownSession: boolean;
54
+ }): void;
55
+ /** Drops a session id that a correction showed was a wrong guess. */
56
+ forget(sessionId: string): void;
57
+ /** Seeds for `sessionId`, falling back to `loadCurrent()` per family, and forgets it. */
58
+ take(sessionId: string, loadCurrent: () => FullSessionSummary | null): RehydrationSeeds;
59
+ }
60
+ //# sourceMappingURL=first-save-baselines.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"first-save-baselines.d.ts","sourceRoot":"","sources":["../../src/metrics/first-save-baselines.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAG3D,6FAA6F;AAC7F,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,cAAc,EAAE,kBAAkB,CAAC;IAC5C,QAAQ,CAAC,YAAY,EAAE,qBAAqB,CAAC;IAC7C,QAAQ,CAAC,YAAY,EAAE,gBAAgB,CAAC;IACxC,QAAQ,CAAC,UAAU,EAAE,mBAAmB,GAAG,IAAI,CAAC;CACjD;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,kBAAkB,GAAG,YAAY,CAkBxE;AAED,+EAA+E;AAC/E,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,WAAW,EAAE,eAAe,CAAC;IACtC,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAAC;IACvE,oFAAoF;IACpF,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1C;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,kBAAkB,GAAG,QAAQ,CAMhE;AAED,2EAA2E;AAC3E,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,SAAS,EAAE,YAAY,GAAG,IAAI,CAAC;IACxC,oEAAoE;IACpE,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;CAChC;AAED;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0C;IACpE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAsC;IAE3D,2EAA2E;IAC3E,UAAU,CAAC,IAAI,EAAE;QACf,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,GAAG,IAAI,CAAC;QAC7C,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;KAC9B,GAAG,IAAI;IASR,qEAAqE;IACrE,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAK/B,yFAAyF;IACzF,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,kBAAkB,GAAG,IAAI,GAAG,gBAAgB;CAexF"}
@@ -0,0 +1,77 @@
1
+ import { buildCostTrackerSeed } from './cost-tracker-seed.js';
2
+ import { buildTaskDetectorSeed } from './task-detector-seed.js';
3
+ export function toolCallSeedOf(summary) {
4
+ const sampleCount = summary.efficiencyScoreSampleCount ?? 0;
5
+ return {
6
+ sessionTracker: {
7
+ toolCallCount: summary.toolCallCount,
8
+ bashCommandCount: summary.bashCommandCount,
9
+ },
10
+ qualityProxy: summary.qualityProxy,
11
+ taskDetector: buildTaskDetectorSeed(summary),
12
+ efficiency: summary.efficiencyScore !== null && summary.efficiencyScoreComponents && sampleCount > 0
13
+ ? {
14
+ score: summary.efficiencyScore,
15
+ components: summary.efficiencyScoreComponents,
16
+ sampleCount,
17
+ }
18
+ : null,
19
+ };
20
+ }
21
+ export function costSeedOf(summary) {
22
+ return {
23
+ costTracker: buildCostTrackerSeed(summary),
24
+ modelBreakdown: summary.modelBreakdown,
25
+ estimatedCostUsd: summary.estimatedCostUsd,
26
+ };
27
+ }
28
+ /**
29
+ * Seeding adds, so each tracker family of a --stdio engine must seed a
30
+ * session from its file as it stood before this process saved anything that
31
+ * family already counted. The tool-call trackers count every record the
32
+ * process drains, provisional rollups of other sessions included, so their
33
+ * snapshot is taken at the first save of any kind. The cost trackers only
34
+ * price another session's tokens, so theirs is taken at the first save of
35
+ * the process's own summary; until then they seed from the current file,
36
+ * which holds the rollup cost they never counted.
37
+ *
38
+ * Entries stay until their id is rehydrated. A provisional engine keeps one
39
+ * small tool-call record per session it rolls up, next to the full rollup
40
+ * (timeline included) LocalSessionAggregator already keeps for that session
41
+ * for the life of the process. Evicting a record would bring the double
42
+ * count back. Only the cwd-guessed id ever has an own-summary snapshot.
43
+ */
44
+ export class FirstSaveBaselines {
45
+ toolCalls = new Map();
46
+ cost = new Map();
47
+ /** `previous` is the file the save merged against, null for a new file. */
48
+ recordSave(save) {
49
+ const { sessionId, previous, ownSession } = save;
50
+ if (!this.toolCalls.has(sessionId)) {
51
+ this.toolCalls.set(sessionId, previous && toolCallSeedOf(previous));
52
+ }
53
+ if (ownSession && !this.cost.has(sessionId))
54
+ this.cost.set(sessionId, previous && costSeedOf(previous));
55
+ }
56
+ /** Drops a session id that a correction showed was a wrong guess. */
57
+ forget(sessionId) {
58
+ this.toolCalls.delete(sessionId);
59
+ this.cost.delete(sessionId);
60
+ }
61
+ /** Seeds for `sessionId`, falling back to `loadCurrent()` per family, and forgets it. */
62
+ take(sessionId, loadCurrent) {
63
+ const current = this.toolCalls.has(sessionId) && this.cost.has(sessionId) ? null : loadCurrent();
64
+ const seeds = {
65
+ toolCalls: this.toolCalls.has(sessionId)
66
+ ? (this.toolCalls.get(sessionId) ?? null)
67
+ : current && toolCallSeedOf(current),
68
+ cost: this.cost.has(sessionId)
69
+ ? (this.cost.get(sessionId) ?? null)
70
+ : current && costSeedOf(current),
71
+ };
72
+ this.toolCalls.delete(sessionId);
73
+ this.cost.delete(sessionId);
74
+ return seeds;
75
+ }
76
+ }
77
+ //# sourceMappingURL=first-save-baselines.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"first-save-baselines.js","sourceRoot":"","sources":["../../src/metrics/first-save-baselines.ts"],"names":[],"mappings":"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"}