@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.
- package/dist/dashboard/routes/api-handler.d.ts.map +1 -1
- package/dist/dashboard/routes/api-handler.js +2 -9
- package/dist/dashboard/routes/api-handler.js.map +1 -1
- package/dist/dashboard/subagent-timeline-store.d.ts +12 -1
- package/dist/dashboard/subagent-timeline-store.d.ts.map +1 -1
- package/dist/dashboard/subagent-timeline-store.js +32 -4
- package/dist/dashboard/subagent-timeline-store.js.map +1 -1
- package/dist/dashboard/workflow-store.d.ts.map +1 -1
- package/dist/dashboard/workflow-store.js +2 -3
- package/dist/dashboard/workflow-store.js.map +1 -1
- package/dist/hooks/event-processor.d.ts +20 -5
- package/dist/hooks/event-processor.d.ts.map +1 -1
- package/dist/hooks/event-processor.js +135 -39
- package/dist/hooks/event-processor.js.map +1 -1
- package/dist/hooks/index.d.ts +1 -1
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -1
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/parent-transcript-watcher.d.ts +1 -1
- package/dist/hooks/parent-transcript-watcher.d.ts.map +1 -1
- package/dist/hooks/parent-transcript-watcher.js +6 -2
- package/dist/hooks/parent-transcript-watcher.js.map +1 -1
- package/dist/hooks/session-resolver.d.ts.map +1 -1
- package/dist/hooks/session-resolver.js +2 -1
- package/dist/hooks/session-resolver.js.map +1 -1
- package/dist/hooks/subagent-watcher.d.ts +3 -1
- package/dist/hooks/subagent-watcher.d.ts.map +1 -1
- package/dist/hooks/subagent-watcher.js +6 -4
- package/dist/hooks/subagent-watcher.js.map +1 -1
- package/dist/hooks/workflow-watcher.d.ts.map +1 -1
- package/dist/hooks/workflow-watcher.js +2 -2
- package/dist/hooks/workflow-watcher.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +53 -60
- package/dist/index.js.map +1 -1
- package/dist/install/cli.d.ts.map +1 -1
- package/dist/install/cli.js +81 -7
- package/dist/install/cli.js.map +1 -1
- package/dist/install/copilot-install-helper.d.ts +1 -0
- package/dist/install/copilot-install-helper.d.ts.map +1 -1
- package/dist/install/copilot-install-helper.js +82 -26
- package/dist/install/copilot-install-helper.js.map +1 -1
- package/dist/install/diagnostics.d.ts.map +1 -1
- package/dist/install/diagnostics.js +6 -3
- package/dist/install/diagnostics.js.map +1 -1
- package/dist/install/install-helper.d.ts +9 -0
- package/dist/install/install-helper.d.ts.map +1 -1
- package/dist/install/install-helper.js +42 -17
- package/dist/install/install-helper.js.map +1 -1
- package/dist/install/schedule.d.ts.map +1 -1
- package/dist/install/schedule.js +4 -1
- package/dist/install/schedule.js.map +1 -1
- package/dist/install/target-user.d.ts +33 -0
- package/dist/install/target-user.d.ts.map +1 -0
- package/dist/install/target-user.js +121 -0
- package/dist/install/target-user.js.map +1 -0
- package/dist/lib/claude-config-dir.d.ts +3 -0
- package/dist/lib/claude-config-dir.d.ts.map +1 -0
- package/dist/lib/claude-config-dir.js +10 -0
- package/dist/lib/claude-config-dir.js.map +1 -0
- package/dist/lib/claude-settings-env.d.ts +18 -0
- package/dist/lib/claude-settings-env.d.ts.map +1 -0
- package/dist/lib/claude-settings-env.js +78 -0
- package/dist/lib/claude-settings-env.js.map +1 -0
- package/dist/lib/date.d.ts +7 -0
- package/dist/lib/date.d.ts.map +1 -1
- package/dist/lib/date.js +11 -1
- package/dist/lib/date.js.map +1 -1
- package/dist/lib/subagent-transcript-parser.d.ts +2 -0
- package/dist/lib/subagent-transcript-parser.d.ts.map +1 -1
- package/dist/lib/subagent-transcript-parser.js +5 -0
- package/dist/lib/subagent-transcript-parser.js.map +1 -1
- package/dist/lib/transcript-types.d.ts +4 -0
- package/dist/lib/transcript-types.d.ts.map +1 -1
- package/dist/metrics/cost-forecast.d.ts +2 -0
- package/dist/metrics/cost-forecast.d.ts.map +1 -1
- package/dist/metrics/cost-forecast.js +46 -24
- package/dist/metrics/cost-forecast.js.map +1 -1
- package/dist/metrics/cost-tracker.d.ts +3 -3
- package/dist/metrics/cost-tracker.js +3 -3
- package/dist/metrics/efficiency-score.d.ts +2 -2
- package/dist/metrics/efficiency-score.js +2 -2
- package/dist/metrics/first-save-baselines.d.ts +60 -0
- package/dist/metrics/first-save-baselines.d.ts.map +1 -0
- package/dist/metrics/first-save-baselines.js +77 -0
- package/dist/metrics/first-save-baselines.js.map +1 -0
- package/dist/metrics/local-session-aggregator.d.ts +2 -1
- package/dist/metrics/local-session-aggregator.d.ts.map +1 -1
- package/dist/metrics/local-session-aggregator.js +21 -0
- package/dist/metrics/local-session-aggregator.js.map +1 -1
- package/dist/metrics/model-pricing.d.ts +1 -1
- package/dist/metrics/model-pricing.d.ts.map +1 -1
- package/dist/metrics/model-pricing.js +2 -2
- package/dist/metrics/model-pricing.js.map +1 -1
- package/dist/metrics/model-usage-tracker.d.ts +2 -2
- package/dist/metrics/model-usage-tracker.js +2 -2
- package/dist/metrics/pricing-init.d.ts.map +1 -1
- package/dist/metrics/pricing-init.js +5 -3
- package/dist/metrics/pricing-init.js.map +1 -1
- package/dist/metrics/pricing-overlay.d.ts.map +1 -1
- package/dist/metrics/pricing-overlay.js +1 -4
- package/dist/metrics/pricing-overlay.js.map +1 -1
- package/dist/metrics/pricing-refresh.d.ts +16 -4
- package/dist/metrics/pricing-refresh.d.ts.map +1 -1
- package/dist/metrics/pricing-refresh.js +47 -1
- package/dist/metrics/pricing-refresh.js.map +1 -1
- package/dist/metrics/quality-proxy-tracker.d.ts +2 -2
- package/dist/metrics/quality-proxy-tracker.js +2 -2
- package/dist/metrics/session-tracker.d.ts +5 -1
- package/dist/metrics/session-tracker.d.ts.map +1 -1
- package/dist/metrics/session-tracker.js +58 -17
- package/dist/metrics/session-tracker.js.map +1 -1
- package/dist/metrics/task-detector.d.ts +2 -2
- package/dist/metrics/task-detector.js +2 -2
- package/dist/metrics/token-usage.d.ts +6 -0
- package/dist/metrics/token-usage.d.ts.map +1 -0
- package/dist/metrics/token-usage.js +34 -0
- package/dist/metrics/token-usage.js.map +1 -0
- package/dist/metrics/turn-cost-attributor.d.ts.map +1 -1
- package/dist/metrics/turn-cost-attributor.js +3 -0
- package/dist/metrics/turn-cost-attributor.js.map +1 -1
- package/dist/platforms/copilot-adapter.d.ts.map +1 -1
- package/dist/platforms/copilot-adapter.js +3 -0
- package/dist/platforms/copilot-adapter.js.map +1 -1
- package/dist/platforms/copilot-sdk-adapter.d.ts.map +1 -1
- package/dist/platforms/copilot-sdk-adapter.js +3 -0
- package/dist/platforms/copilot-sdk-adapter.js.map +1 -1
- package/dist/storage/drain-claims.d.ts +33 -10
- package/dist/storage/drain-claims.d.ts.map +1 -1
- package/dist/storage/drain-claims.js +78 -13
- package/dist/storage/drain-claims.js.map +1 -1
- package/dist/storage/local-store.d.ts +21 -0
- package/dist/storage/local-store.d.ts.map +1 -1
- package/dist/storage/local-store.js +118 -19
- package/dist/storage/local-store.js.map +1 -1
- package/dist/storage/retention.d.ts.map +1 -1
- package/dist/storage/retention.js +7 -6
- package/dist/storage/retention.js.map +1 -1
- package/dist/storage/session-store.d.ts +16 -2
- package/dist/storage/session-store.d.ts.map +1 -1
- package/dist/storage/session-store.js +242 -37
- package/dist/storage/session-store.js.map +1 -1
- package/dist/storage/types.d.ts +7 -0
- package/dist/storage/types.d.ts.map +1 -1
- package/dist/storage/types.js +4 -0
- package/dist/storage/types.js.map +1 -1
- package/dist/tools/cost-tools.d.ts.map +1 -1
- package/dist/tools/cost-tools.js +1 -0
- package/dist/tools/cost-tools.js.map +1 -1
- package/dist/web/assets/{index-U9DPZ-Tb.js → index-CZvLy2Qy.js} +2 -2
- package/dist/web/index.html +1 -1
- 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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"}
|
package/dist/lib/date.d.ts
CHANGED
|
@@ -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
|
package/dist/lib/date.d.ts.map
CHANGED
|
@@ -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
|
|
223
|
+
const dayEnd = localEndOfDay(dayStart);
|
|
214
224
|
if (session.endTime < dayStart)
|
|
215
225
|
return 0;
|
|
216
226
|
if (session.startTime >= dayEnd)
|
package/dist/lib/date.js.map
CHANGED
|
@@ -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,
|
|
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":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"subagent-transcript-parser.js","sourceRoot":"","sources":["../../src/lib/subagent-transcript-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AA6CzC,MAAM,UAAU,sBAAsB,CAAC,IAAY;IACjD,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IAC7C,CAAC;IACD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;IACvF,MAAM,GAAG,GAAG,MAA4B,CAAC;IACzC,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW;QAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;IAE1E,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;IAC5B,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;IACzF,MAAM,CAAC,GAAG,OAA8B,CAAC;IAEzC,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;IACtB,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;IACrF,MAAM,CAAC,GAAG,KAAiB,CAAC;IAE5B,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3D,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACzD,MAAM,QAAQ,GAAG,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9D,MAAM,YAAY,GAAG,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9E,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5E,MAAM,WAAW,GAAG,GAAG,CAAC,WAAW,KAAK,IAAI,CAAC;IAE7C,MAAM,WAAW,GAAG,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IACxC,MAAM,YAAY,GAAG,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;IAC1C,MAAM,eAAe,GAAG,GAAG,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC;IACvD,MAAM,mBAAmB,GAAG,GAAG,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC;IAC/D,MAAM,aAAa,GAAG,CAAC,CAAC,cAAc,CAAC;IACvC,MAAM,qBAAqB,GACzB,aAAa,IAAI,OAAO,aAAa,KAAK,QAAQ;QAChD,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,yBAAyB,CAAC,EAAE,mBAAmB,CAAC;QAC7E,CAAC,CAAC,CAAC,CAAC;IACR,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,MAAM,GAAG,GAAG,CAAC,CAAC,qBAAqB,CAAC;IACpC,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACnC,eAAe,GAAG,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,oBAAoB,GAAG,2BAA2B,CAAC,CAAC,CAAC,CAAC;IAC5D,MAAM,4BAA4B,GAAG,mCAAmC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACpF,MAAM,UAAU,GAAG,iBAAiB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAEhD,OAAO;QACL,MAAM,EAAE;YACN,SAAS;YACT,KAAK;YACL,QAAQ;YACR,YAAY;YACZ,WAAW;YACX,YAAY;YACZ,eAAe;YACf,mBAAmB;YACnB,qBAAqB;YACrB,eAAe;YACf,UAAU;YACV,oBAAoB;YACpB,4BAA4B;YAC5B,UAAU;YACV,WAAW;SACZ;QACD,WAAW,EAAE,KAAK;KACnB,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAyB;IAC3D,IAAI,KAAK,CAAC,WAAW,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC7C,MAAM,OAAO,GAAG,KAAK,CAAC,OAA0C,CAAC;IACjE,OAAO,OAAO,EAAE,KAAK,KAAK,aAAa,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,CAAU;IAC5B,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACvE,CAAC;AAED,SAAS,2BAA2B,CAAC,KAA8B;IACjE,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE;QAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACxD,yEAAyE;IACzE,yEAAyE;IACzE,MAAM,GAAG,GAAG,KAAK,CAAC,qBAAqB,CAAC;IACxC,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACnC,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,GAA8B,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YACnE,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,EAAE,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,mCAAmC,CAAC,OAAgB;IAC3D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,SAAS,CAAC,EAAE,CAAC,CAAC;IAClD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IACE,KAAK;YACL,OAAO,KAAK,KAAK,QAAQ;YACzB,OAAQ,KAA4B,CAAC,IAAI,KAAK,QAAQ,EACtD,CAAC;YACD,GAAG,CAAC,GAAG,CAAC,MAAM,CAAE,KAA0B,CAAC,IAAI,CAAC,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACtC,OAAO,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAgB;IAChD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IACvC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IACE,KAAK;YACL,OAAO,KAAK,KAAK,QAAQ;YACxB,KAA4B,CAAC,IAAI,KAAK,UAAU;YACjD,OAAQ,KAA0B,CAAC,EAAE,KAAK,QAAQ,EAClD,CAAC;YACD,GAAG,CAAC,IAAI,CAAE,KAAwB,CAAC,EAAE,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACrE,CAAC"}
|
|
@@ -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":"
|
|
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
|
-
//
|
|
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
|
|
46
|
+
const dayEndMs = localEndOfDay(dayStartMs);
|
|
43
47
|
const msUntilEndOfDay = Math.max(0, dayEndMs - nowMs);
|
|
44
|
-
//
|
|
45
|
-
|
|
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
|
-
|
|
56
|
-
effectiveRateUsdPerMs = dailySpentUsd /
|
|
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
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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 =
|
|
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 =
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
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":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;
|
|
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,
|
|
340
|
-
*
|
|
341
|
-
*
|
|
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,
|
|
326
|
-
*
|
|
327
|
-
*
|
|
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,
|
|
110
|
-
*
|
|
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,
|
|
117
|
-
*
|
|
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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"}
|