bb-cc-lite 0.1.8 → 0.1.9
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/README.md +21 -4
- package/dist/baseline-builder.d.ts +5 -0
- package/dist/baseline-builder.js +126 -9
- package/dist/baseline-builder.js.map +1 -1
- package/dist/baseline-refresh.d.ts +4 -0
- package/dist/baseline-refresh.js +10 -1
- package/dist/baseline-refresh.js.map +1 -1
- package/dist/baseline.d.ts +40 -0
- package/dist/baseline.js +83 -4
- package/dist/baseline.js.map +1 -1
- package/dist/cli.js +13 -9
- package/dist/cli.js.map +1 -1
- package/dist/doctor.d.ts +2 -0
- package/dist/doctor.js +53 -7
- package/dist/doctor.js.map +1 -1
- package/dist/historical-replay.d.ts +7 -0
- package/dist/historical-replay.js +153 -2
- package/dist/historical-replay.js.map +1 -1
- package/dist/paths.d.ts +7 -0
- package/dist/paths.js +10 -0
- package/dist/paths.js.map +1 -1
- package/dist/signals.d.ts +13 -2
- package/dist/signals.js +205 -2
- package/dist/signals.js.map +1 -1
- package/dist/status-input.js +10 -9
- package/dist/status-input.js.map +1 -1
- package/dist/statusline.js +4 -3
- package/dist/statusline.js.map +1 -1
- package/dist/transcript.js +22 -0
- package/dist/transcript.js.map +1 -1
- package/dist/types.d.ts +21 -0
- package/package.json +1 -1
|
@@ -2,6 +2,7 @@ import { readdir, stat } from "node:fs/promises";
|
|
|
2
2
|
import { homedir } from "node:os";
|
|
3
3
|
import { join } from "node:path";
|
|
4
4
|
import { extractFailureEpisodesFromTranscriptLines, extractSafeToolResultEventsFromTranscriptLines } from "./failure-episodes.js";
|
|
5
|
+
import { asRecord, numberField } from "./status-input.js";
|
|
5
6
|
import { addFailureEpisodeToRecoveryCounters, blindRetryAggregatesFromCounters, emptyRecoveryBuildCounters, FAILURE_RECOVERY_CATEGORIES, recoveryAggregatesFromCounters, recoveryInsight } from "./recovery-stats.js";
|
|
6
7
|
import { readTranscriptTail } from "./transcript-reader.js";
|
|
7
8
|
const DEFAULT_MAX_FILES = 1500;
|
|
@@ -23,13 +24,20 @@ export async function evaluateHistoricalReplay(options = {}) {
|
|
|
23
24
|
}
|
|
24
25
|
export function formatHistoricalReplayMetrics(metrics) {
|
|
25
26
|
return [
|
|
27
|
+
`sessions evaluated ${metrics.sessionsEvaluated}`,
|
|
26
28
|
`holdout sessions ${metrics.holdoutSessions}`,
|
|
29
|
+
`warnings ${metrics.warnings}`,
|
|
27
30
|
`evaluated failure episodes ${metrics.evaluatedFailureEpisodes}`,
|
|
28
31
|
`Stop precision on unrecovered episodes ${formatMetricRate(metrics.stopPrecisionOnUnrecoveredEpisodes)}`,
|
|
32
|
+
`false Stop count ${metrics.falseStopCount}`,
|
|
29
33
|
`false Stop count on recovered episodes ${metrics.falseStopCountOnRecoveredEpisodes}`,
|
|
30
34
|
`missed unrecovered loop count ${metrics.missedUnrecoveredLoopCount}`,
|
|
31
35
|
`blind retry precision ${formatMetricRate(metrics.blindRetryPrecision)}`,
|
|
32
36
|
`average attempts before warning ${metrics.averageAttemptsBeforeWarning.toFixed(2)}`,
|
|
37
|
+
`average tool results before warning ${metrics.averageToolResultsBeforeWarning.toFixed(2)}`,
|
|
38
|
+
`average cost before warning ${formatOptionalCurrencyAverage(metrics.averageCostBeforeWarning)}`,
|
|
39
|
+
`average duration before warning ${formatOptionalDurationAverage(metrics.averageDurationBeforeWarning)}`,
|
|
40
|
+
`project-baseline suppressions ${metrics.projectBaselineSuppressions === undefined ? "n/a (not replayed)" : metrics.projectBaselineSuppressions}`,
|
|
33
41
|
`low-sample suppressions ${metrics.lowSampleSuppressions}`,
|
|
34
42
|
`category coverage ${formatCategoryCoverage(metrics.categoryCoverage)}`
|
|
35
43
|
].join("; ");
|
|
@@ -43,7 +51,11 @@ function evaluateHoldout(holdoutEventsBySession, baseline) {
|
|
|
43
51
|
let blindRetryTruePositive = 0;
|
|
44
52
|
let blindRetryTotal = 0;
|
|
45
53
|
let lowSampleSuppressions = 0;
|
|
54
|
+
let warnings = 0;
|
|
46
55
|
const attemptsBeforeWarning = [];
|
|
56
|
+
const toolResultsBeforeWarning = [];
|
|
57
|
+
const costBeforeWarning = [];
|
|
58
|
+
const durationBeforeWarning = [];
|
|
47
59
|
const categoryCoverage = {};
|
|
48
60
|
for (const events of holdoutEventsBySession) {
|
|
49
61
|
const replay = replaySession(events, baseline);
|
|
@@ -52,7 +64,17 @@ function evaluateHoldout(holdoutEventsBySession, baseline) {
|
|
|
52
64
|
evaluatedFailureEpisodes += 1;
|
|
53
65
|
categoryCoverage[outcome.category] = (categoryCoverage[outcome.category] || 0) + 1;
|
|
54
66
|
if (outcome.warningAttempt !== undefined) {
|
|
67
|
+
warnings += 1;
|
|
55
68
|
attemptsBeforeWarning.push(outcome.warningAttempt);
|
|
69
|
+
if (outcome.warningToolResultCount !== undefined) {
|
|
70
|
+
toolResultsBeforeWarning.push(outcome.warningToolResultCount);
|
|
71
|
+
}
|
|
72
|
+
if (outcome.warningCostUsd !== undefined) {
|
|
73
|
+
costBeforeWarning.push(outcome.warningCostUsd);
|
|
74
|
+
}
|
|
75
|
+
if (outcome.warningDurationMs !== undefined) {
|
|
76
|
+
durationBeforeWarning.push(outcome.warningDurationMs);
|
|
77
|
+
}
|
|
56
78
|
}
|
|
57
79
|
if (outcome.stopIssued) {
|
|
58
80
|
stopTotal += 1;
|
|
@@ -76,15 +98,24 @@ function evaluateHoldout(holdoutEventsBySession, baseline) {
|
|
|
76
98
|
}
|
|
77
99
|
}
|
|
78
100
|
return {
|
|
101
|
+
sessionsEvaluated: holdoutEventsBySession.length,
|
|
79
102
|
holdoutSessions: holdoutEventsBySession.length,
|
|
80
103
|
evaluatedFailureEpisodes,
|
|
104
|
+
warnings,
|
|
81
105
|
stopPrecisionOnUnrecoveredEpisodes: stopTotal > 0 ? roundRate(stopTruePositive / stopTotal) : undefined,
|
|
106
|
+
falseStopCount: falseStopCountOnRecoveredEpisodes,
|
|
82
107
|
falseStopCountOnRecoveredEpisodes,
|
|
83
108
|
missedUnrecoveredLoopCount,
|
|
84
109
|
blindRetryPrecision: blindRetryTotal > 0 ? roundRate(blindRetryTruePositive / blindRetryTotal) : undefined,
|
|
85
110
|
averageAttemptsBeforeWarning: attemptsBeforeWarning.length > 0
|
|
86
111
|
? Number((attemptsBeforeWarning.reduce((total, value) => total + value, 0) / attemptsBeforeWarning.length).toFixed(2))
|
|
87
112
|
: 0,
|
|
113
|
+
averageToolResultsBeforeWarning: toolResultsBeforeWarning.length > 0
|
|
114
|
+
? Number((toolResultsBeforeWarning.reduce((total, value) => total + value, 0) / toolResultsBeforeWarning.length).toFixed(2))
|
|
115
|
+
: 0,
|
|
116
|
+
averageCostBeforeWarning: averageOrUndefined(costBeforeWarning),
|
|
117
|
+
averageDurationBeforeWarning: averageOrUndefined(durationBeforeWarning),
|
|
118
|
+
projectBaselineSuppressions: undefined,
|
|
88
119
|
lowSampleSuppressions,
|
|
89
120
|
categoryCoverage
|
|
90
121
|
};
|
|
@@ -93,7 +124,8 @@ function replaySession(events, baseline) {
|
|
|
93
124
|
const active = new Map();
|
|
94
125
|
const outcomes = [];
|
|
95
126
|
let lowSampleSuppressions = 0;
|
|
96
|
-
for (const event of events) {
|
|
127
|
+
for (const [index, event] of events.entries()) {
|
|
128
|
+
const toolResultCount = index + 1;
|
|
97
129
|
if (event.outcome === "success") {
|
|
98
130
|
const sameIdentityEpisode = active.get(event.identity);
|
|
99
131
|
if (sameIdentityEpisode) {
|
|
@@ -129,6 +161,9 @@ function replaySession(events, baseline) {
|
|
|
129
161
|
const currentState = replayDecisionState(episode);
|
|
130
162
|
if (currentState !== "Healthy" && episode.warningAttempt === undefined) {
|
|
131
163
|
episode.warningAttempt = episode.attemptCount;
|
|
164
|
+
episode.warningToolResultCount = toolResultCount;
|
|
165
|
+
episode.warningCostUsd = event.costUsd;
|
|
166
|
+
episode.warningDurationMs = event.durationMs;
|
|
132
167
|
}
|
|
133
168
|
if (currentState !== "Healthy" && !recoveryInsight(baseline, episode.category, episode.attemptCount)) {
|
|
134
169
|
lowSampleSuppressions += 1;
|
|
@@ -161,6 +196,9 @@ function toReplayOutcome(episode, recovered) {
|
|
|
161
196
|
attemptCount: episode.attemptCount,
|
|
162
197
|
recovered,
|
|
163
198
|
warningAttempt: episode.warningAttempt,
|
|
199
|
+
warningToolResultCount: episode.warningToolResultCount,
|
|
200
|
+
warningCostUsd: episode.warningCostUsd,
|
|
201
|
+
warningDurationMs: episode.warningDurationMs,
|
|
164
202
|
stopIssued: episode.stopIssued,
|
|
165
203
|
blindRetryWarningIssued: episode.blindRetryWarningIssued
|
|
166
204
|
};
|
|
@@ -194,11 +232,106 @@ async function readEventsBySession(files, maxBytesPerTranscript) {
|
|
|
194
232
|
for (const file of files) {
|
|
195
233
|
const tail = await readTranscriptTail(file, { maxBytes: maxBytesPerTranscript });
|
|
196
234
|
if (tail.pathReadable) {
|
|
197
|
-
sessions.push(
|
|
235
|
+
sessions.push(extractReplayToolResultEvents(tail.lines));
|
|
198
236
|
}
|
|
199
237
|
}
|
|
200
238
|
return sessions;
|
|
201
239
|
}
|
|
240
|
+
function extractReplayToolResultEvents(lines) {
|
|
241
|
+
const events = extractSafeToolResultEventsFromTranscriptLines(lines);
|
|
242
|
+
const measurements = extractToolResultMeasurements(lines);
|
|
243
|
+
return events.map((event, index) => ({
|
|
244
|
+
...event,
|
|
245
|
+
...measurements[index]
|
|
246
|
+
}));
|
|
247
|
+
}
|
|
248
|
+
function extractToolResultMeasurements(lines) {
|
|
249
|
+
const measurements = [];
|
|
250
|
+
let latestCostUsd;
|
|
251
|
+
let latestDurationMs;
|
|
252
|
+
let firstTimestampMs;
|
|
253
|
+
for (const line of lines) {
|
|
254
|
+
let parsed;
|
|
255
|
+
try {
|
|
256
|
+
parsed = JSON.parse(line);
|
|
257
|
+
}
|
|
258
|
+
catch {
|
|
259
|
+
continue;
|
|
260
|
+
}
|
|
261
|
+
const entry = asRecord(parsed);
|
|
262
|
+
if (!entry) {
|
|
263
|
+
continue;
|
|
264
|
+
}
|
|
265
|
+
const timestampMs = timestampMsFromEntry(entry);
|
|
266
|
+
if (timestampMs !== undefined) {
|
|
267
|
+
firstTimestampMs ??= timestampMs;
|
|
268
|
+
latestDurationMs = Math.max(0, timestampMs - firstTimestampMs);
|
|
269
|
+
}
|
|
270
|
+
const costUsd = costUsdFromEntry(entry);
|
|
271
|
+
if (costUsd !== undefined) {
|
|
272
|
+
latestCostUsd = costUsd;
|
|
273
|
+
}
|
|
274
|
+
const durationMs = durationMsFromEntry(entry);
|
|
275
|
+
if (durationMs !== undefined) {
|
|
276
|
+
latestDurationMs = durationMs;
|
|
277
|
+
}
|
|
278
|
+
for (let index = 0; index < countToolResults(entry); index += 1) {
|
|
279
|
+
measurements.push({ costUsd: latestCostUsd, durationMs: latestDurationMs });
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
return measurements;
|
|
283
|
+
}
|
|
284
|
+
function countToolResults(entry) {
|
|
285
|
+
let count = 0;
|
|
286
|
+
for (const part of contentParts(entry)) {
|
|
287
|
+
if (part.type === "tool_result") {
|
|
288
|
+
count += 1;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
if (entry.type === "tool_result" || entry.type === "tool_result_delta") {
|
|
292
|
+
count += 1;
|
|
293
|
+
}
|
|
294
|
+
return count;
|
|
295
|
+
}
|
|
296
|
+
function contentParts(entry) {
|
|
297
|
+
const message = asRecord(entry.message);
|
|
298
|
+
const candidates = [entry.content, message?.content];
|
|
299
|
+
const parts = [];
|
|
300
|
+
for (const candidate of candidates) {
|
|
301
|
+
if (Array.isArray(candidate)) {
|
|
302
|
+
parts.push(...candidate.flatMap((part) => (asRecord(part) ? [asRecord(part)] : [])));
|
|
303
|
+
}
|
|
304
|
+
else if (asRecord(candidate)) {
|
|
305
|
+
parts.push(asRecord(candidate));
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
return parts;
|
|
309
|
+
}
|
|
310
|
+
function costUsdFromEntry(entry) {
|
|
311
|
+
const cost = asRecord(entry.cost);
|
|
312
|
+
const value = numberField(cost?.total_cost_usd) ??
|
|
313
|
+
numberField(cost?.totalCostUsd) ??
|
|
314
|
+
numberField(cost?.cost_usd) ??
|
|
315
|
+
numberField(entry.total_cost_usd) ??
|
|
316
|
+
numberField(entry.costUsd);
|
|
317
|
+
return value !== undefined && value >= 0 ? value : undefined;
|
|
318
|
+
}
|
|
319
|
+
function durationMsFromEntry(entry) {
|
|
320
|
+
const cost = asRecord(entry.cost);
|
|
321
|
+
const value = numberField(cost?.total_duration_ms) ??
|
|
322
|
+
numberField(cost?.totalDurationMs) ??
|
|
323
|
+
numberField(entry.duration_ms) ??
|
|
324
|
+
numberField(entry.durationMs);
|
|
325
|
+
return value !== undefined && value >= 0 ? value : undefined;
|
|
326
|
+
}
|
|
327
|
+
function timestampMsFromEntry(entry) {
|
|
328
|
+
const timestamp = entry.timestamp;
|
|
329
|
+
if (typeof timestamp !== "string") {
|
|
330
|
+
return undefined;
|
|
331
|
+
}
|
|
332
|
+
const value = Date.parse(timestamp);
|
|
333
|
+
return Number.isFinite(value) ? value : undefined;
|
|
334
|
+
}
|
|
202
335
|
async function listTranscriptFiles(root, maxFiles) {
|
|
203
336
|
if (maxFiles <= 0) {
|
|
204
337
|
return [];
|
|
@@ -250,6 +383,24 @@ function holdoutSessionCount(total, ratio) {
|
|
|
250
383
|
function formatMetricRate(value) {
|
|
251
384
|
return value === undefined ? "n/a" : value.toFixed(2);
|
|
252
385
|
}
|
|
386
|
+
function formatOptionalCurrencyAverage(value) {
|
|
387
|
+
if (value === undefined) {
|
|
388
|
+
return "n/a";
|
|
389
|
+
}
|
|
390
|
+
return `$${value.toFixed(2)}`;
|
|
391
|
+
}
|
|
392
|
+
function formatOptionalDurationAverage(value) {
|
|
393
|
+
if (value === undefined) {
|
|
394
|
+
return "n/a";
|
|
395
|
+
}
|
|
396
|
+
if (value < 60_000) {
|
|
397
|
+
return `${Math.round(value / 1000)}s`;
|
|
398
|
+
}
|
|
399
|
+
return `${Number((value / 60_000).toFixed(1))}m`;
|
|
400
|
+
}
|
|
401
|
+
function averageOrUndefined(values) {
|
|
402
|
+
return values.length > 0 ? Number((values.reduce((total, value) => total + value, 0) / values.length).toFixed(2)) : undefined;
|
|
403
|
+
}
|
|
253
404
|
function formatCategoryCoverage(coverage) {
|
|
254
405
|
const parts = FAILURE_RECOVERY_CATEGORIES.flatMap((category) => {
|
|
255
406
|
const count = coverage[category] || 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"historical-replay.js","sourceRoot":"","sources":["../src/historical-replay.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"historical-replay.js","sourceRoot":"","sources":["../src/historical-replay.ts"],"names":[],"mappings":"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"}
|
package/dist/paths.d.ts
CHANGED
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
export declare const APP_DIR_NAME = "bb-cc-lite";
|
|
2
|
+
export declare const PROJECT_BASELINE_DIR_NAME = "project-baselines";
|
|
2
3
|
export declare function appHome(homeDir?: string): string;
|
|
3
4
|
export declare function eventStorePath(): string;
|
|
4
5
|
export declare function baselinePath(homeDir?: string): string;
|
|
6
|
+
export declare function projectKeyFromPath(projectDir: string): string;
|
|
7
|
+
export declare function projectBaselinePath(options: {
|
|
8
|
+
projectKey: string;
|
|
9
|
+
homeDir?: string;
|
|
10
|
+
appHomePath?: string;
|
|
11
|
+
}): string;
|
|
5
12
|
export declare function backupDir(homeDir?: string): string;
|
|
6
13
|
export declare function pricingCachePath(): string;
|
|
7
14
|
export declare function cliPath(): string;
|
package/dist/paths.js
CHANGED
|
@@ -3,6 +3,7 @@ import { homedir } from "node:os";
|
|
|
3
3
|
import { dirname, join, resolve } from "node:path";
|
|
4
4
|
import { fileURLToPath } from "node:url";
|
|
5
5
|
export const APP_DIR_NAME = "bb-cc-lite";
|
|
6
|
+
export const PROJECT_BASELINE_DIR_NAME = "project-baselines";
|
|
6
7
|
export function appHome(homeDir = homedir()) {
|
|
7
8
|
return process.env.BB_CC_LITE_HOME || join(homeDir, ".claude", APP_DIR_NAME);
|
|
8
9
|
}
|
|
@@ -12,6 +13,15 @@ export function eventStorePath() {
|
|
|
12
13
|
export function baselinePath(homeDir) {
|
|
13
14
|
return join(appHome(homeDir), "baseline.json");
|
|
14
15
|
}
|
|
16
|
+
export function projectKeyFromPath(projectDir) {
|
|
17
|
+
return createHash("sha256").update(resolve(projectDir)).digest("hex");
|
|
18
|
+
}
|
|
19
|
+
export function projectBaselinePath(options) {
|
|
20
|
+
if (!/^[a-f0-9]{64}$/u.test(options.projectKey)) {
|
|
21
|
+
throw new Error("invalid project key");
|
|
22
|
+
}
|
|
23
|
+
return join(options.appHomePath ?? appHome(options.homeDir), PROJECT_BASELINE_DIR_NAME, `${options.projectKey}.json`);
|
|
24
|
+
}
|
|
15
25
|
export function backupDir(homeDir) {
|
|
16
26
|
return join(appHome(homeDir), "backups");
|
|
17
27
|
}
|
package/dist/paths.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,CAAC,MAAM,YAAY,GAAG,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,CAAC,MAAM,YAAY,GAAG,YAAY,CAAC;AACzC,MAAM,CAAC,MAAM,yBAAyB,GAAG,mBAAmB,CAAC;AAE7D,MAAM,UAAU,OAAO,CAAC,OAAO,GAAG,OAAO,EAAE;IACzC,OAAO,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,eAAe,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,UAAkB;IACnD,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAuE;IACzG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,yBAAyB,EAAE,GAAG,OAAO,CAAC,UAAU,OAAO,CAAC,CAAC;AACxH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAgB;IACxC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,sBAAsB,CAAC,CAAC;AACzF,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,OAAO,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;QACzD,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC;QAC5D,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAyB;IACjD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,OAAO,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC;AAC/C,CAAC"}
|
package/dist/signals.d.ts
CHANGED
|
@@ -1,7 +1,18 @@
|
|
|
1
|
-
import type { Decision, DecisionPersonalBaseline, StatusLineInput,
|
|
1
|
+
import type { Decision, DecisionPersonalBaseline, StatusLineInput, TranscriptSummary } from "./types.js";
|
|
2
2
|
export interface DecideOptions {
|
|
3
|
-
previous?:
|
|
3
|
+
previous?: {
|
|
4
|
+
costUsd?: number;
|
|
5
|
+
};
|
|
4
6
|
baseline?: DecisionPersonalBaseline;
|
|
7
|
+
budgetThresholds?: BudgetThresholds;
|
|
8
|
+
}
|
|
9
|
+
export interface BudgetThresholds {
|
|
10
|
+
costUsd?: number;
|
|
11
|
+
costTotalCarefulUsd?: number;
|
|
12
|
+
costDeltaUsd?: number;
|
|
13
|
+
costDeltaCarefulUsd?: number;
|
|
14
|
+
durationMs?: number;
|
|
15
|
+
durationCarefulMs?: number;
|
|
5
16
|
}
|
|
6
17
|
export declare function decide(input: StatusLineInput, transcript: TranscriptSummary, options?: DecideOptions): Decision;
|
|
7
18
|
export declare function formatCost(value: number): string;
|
package/dist/signals.js
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import { sessionKeyFromId } from "./session.js";
|
|
2
2
|
import { mergeUsage } from "./status-input.js";
|
|
3
3
|
import { recoveryInsight } from "./recovery-stats.js";
|
|
4
|
+
const DEFAULT_BUDGET_THRESHOLDS = {
|
|
5
|
+
costUsd: 2,
|
|
6
|
+
costDeltaUsd: 0.5,
|
|
7
|
+
durationMs: 45 * 60_000
|
|
8
|
+
};
|
|
4
9
|
export function decide(input, transcript, options = {}) {
|
|
5
10
|
const now = new Date().toISOString();
|
|
6
11
|
const usage = mergeUsage(input.usage, transcript.usage);
|
|
@@ -8,6 +13,8 @@ export function decide(input, transcript, options = {}) {
|
|
|
8
13
|
const sessionKey = sessionKeyFromId(input.sessionId);
|
|
9
14
|
const costUsd = input.costUsd;
|
|
10
15
|
const costSource = input.costSource;
|
|
16
|
+
const budgetThresholds = normalizeBudgetThresholds(options.budgetThresholds ?? budgetThresholdsFromEnv());
|
|
17
|
+
const costDelta = costUsd !== undefined && options.previous?.costUsd !== undefined ? costUsd - options.previous.costUsd : 0;
|
|
11
18
|
if (!input.rawValid) {
|
|
12
19
|
return baseDecision({
|
|
13
20
|
state: "Careful",
|
|
@@ -132,6 +139,30 @@ export function decide(input, transcript, options = {}) {
|
|
|
132
139
|
costSource
|
|
133
140
|
});
|
|
134
141
|
}
|
|
142
|
+
const budgetRepeatedFailure = transcript.repeatedFailures
|
|
143
|
+
.filter((item) => item.count >= 2)
|
|
144
|
+
.sort((a, b) => b.count - a.count)[0];
|
|
145
|
+
if (budgetRepeatedFailure &&
|
|
146
|
+
((costUsd !== undefined && costUsd >= budgetThresholds.costUsd) || costDelta >= budgetThresholds.costDeltaUsd)) {
|
|
147
|
+
const costEvidence = costDelta >= budgetThresholds.costDeltaUsd ? `cost +${formatCost(costDelta)}` : budgetCostEvidence(costUsd || 0, costSource);
|
|
148
|
+
return baseDecision({
|
|
149
|
+
state: "Stop",
|
|
150
|
+
reasonCode: "budget_with_repeated_failure",
|
|
151
|
+
diagnosisCode: "budget_with_repeated_failure",
|
|
152
|
+
diagnosis: "high cost plus repeated failures",
|
|
153
|
+
confidence: "high",
|
|
154
|
+
primaryEvidence: `${costEvidence} plus ${repeatedFailureEvidence(budgetRepeatedFailure)}`,
|
|
155
|
+
impact: "high cost plus repeated failures",
|
|
156
|
+
action: "stop and inspect first failure",
|
|
157
|
+
input,
|
|
158
|
+
usage,
|
|
159
|
+
transcript,
|
|
160
|
+
now,
|
|
161
|
+
sessionKey,
|
|
162
|
+
costUsd,
|
|
163
|
+
costSource
|
|
164
|
+
});
|
|
165
|
+
}
|
|
135
166
|
if (transcript.blindRetry && transcript.blindRetry.blindRetryFailureCount >= 2) {
|
|
136
167
|
const blindRetry = transcript.blindRetry;
|
|
137
168
|
return baseDecision({
|
|
@@ -304,8 +335,27 @@ export function decide(input, transcript, options = {}) {
|
|
|
304
335
|
costSource
|
|
305
336
|
});
|
|
306
337
|
}
|
|
307
|
-
const
|
|
308
|
-
if (
|
|
338
|
+
const budgetCarefulEvidence = budgetCarefulEvidenceFor(input, costDelta, costSource, budgetThresholds, options.baseline);
|
|
339
|
+
if (budgetCarefulEvidence && isBusyWithoutProgress(transcript)) {
|
|
340
|
+
return baseDecision({
|
|
341
|
+
state: "Careful",
|
|
342
|
+
reasonCode: "budget_busy_no_observed_progress",
|
|
343
|
+
diagnosisCode: "budget_busy_no_observed_progress",
|
|
344
|
+
diagnosis: "budget is high and no progress was observed",
|
|
345
|
+
confidence: "medium",
|
|
346
|
+
primaryEvidence: `${budgetCarefulEvidence} plus ${transcript.toolCalls} tool calls, no check or recovery seen`,
|
|
347
|
+
impact: "Budget is high and no observed progress signal was seen",
|
|
348
|
+
action: "pause and ask Claude what changed before continuing",
|
|
349
|
+
input,
|
|
350
|
+
usage,
|
|
351
|
+
transcript,
|
|
352
|
+
now,
|
|
353
|
+
sessionKey,
|
|
354
|
+
costUsd,
|
|
355
|
+
costSource
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
if (costDelta >= budgetThresholds.costDeltaUsd) {
|
|
309
359
|
return baseDecision({
|
|
310
360
|
state: "Careful",
|
|
311
361
|
reasonCode: "cost_growth",
|
|
@@ -321,6 +371,42 @@ export function decide(input, transcript, options = {}) {
|
|
|
321
371
|
costSource
|
|
322
372
|
});
|
|
323
373
|
}
|
|
374
|
+
if (costUsd !== undefined &&
|
|
375
|
+
costUsd >= budgetThresholds.costUsd &&
|
|
376
|
+
!baselineSuppressesCostBudget(costUsd, options.baseline)) {
|
|
377
|
+
return baseDecision({
|
|
378
|
+
state: "Careful",
|
|
379
|
+
reasonCode: "cost_budget",
|
|
380
|
+
primaryEvidence: budgetCostEvidence(costUsd, costSource),
|
|
381
|
+
impact: "Session cost is above the budget threshold",
|
|
382
|
+
action: "ask Claude to summarize progress before continuing",
|
|
383
|
+
input,
|
|
384
|
+
usage,
|
|
385
|
+
transcript,
|
|
386
|
+
now,
|
|
387
|
+
sessionKey,
|
|
388
|
+
costUsd,
|
|
389
|
+
costSource
|
|
390
|
+
});
|
|
391
|
+
}
|
|
392
|
+
if (input.durationMs !== undefined &&
|
|
393
|
+
input.durationMs >= budgetThresholds.durationMs &&
|
|
394
|
+
!baselineSuppressesDurationBudget(input.durationMs, options.baseline)) {
|
|
395
|
+
return baseDecision({
|
|
396
|
+
state: "Careful",
|
|
397
|
+
reasonCode: "duration_budget",
|
|
398
|
+
primaryEvidence: `session ran ${formatDuration(input.durationMs)}`,
|
|
399
|
+
impact: "Session has been running longer than expected",
|
|
400
|
+
action: "ask Claude to summarize progress before continuing",
|
|
401
|
+
input,
|
|
402
|
+
usage,
|
|
403
|
+
transcript,
|
|
404
|
+
now,
|
|
405
|
+
sessionKey,
|
|
406
|
+
costUsd,
|
|
407
|
+
costSource
|
|
408
|
+
});
|
|
409
|
+
}
|
|
324
410
|
if (transcript.validationRecovered) {
|
|
325
411
|
return baseDecision({
|
|
326
412
|
state: "Healthy",
|
|
@@ -340,6 +426,25 @@ export function decide(input, transcript, options = {}) {
|
|
|
340
426
|
costSource
|
|
341
427
|
});
|
|
342
428
|
}
|
|
429
|
+
if (isBusyWithoutProgress(transcript)) {
|
|
430
|
+
return baseDecision({
|
|
431
|
+
state: "Careful",
|
|
432
|
+
reasonCode: "busy_no_observed_progress",
|
|
433
|
+
diagnosisCode: "busy_no_observed_progress",
|
|
434
|
+
diagnosis: `${transcript.toolCalls} tool calls, no check or recovery seen`,
|
|
435
|
+
confidence: "medium",
|
|
436
|
+
primaryEvidence: `${transcript.toolCalls} tool calls, no check or recovery seen`,
|
|
437
|
+
impact: "Many safe activity signals were seen, but no observed progress signal was seen",
|
|
438
|
+
action: "pause and ask Claude what changed",
|
|
439
|
+
input,
|
|
440
|
+
usage,
|
|
441
|
+
transcript,
|
|
442
|
+
now,
|
|
443
|
+
sessionKey,
|
|
444
|
+
costUsd,
|
|
445
|
+
costSource
|
|
446
|
+
});
|
|
447
|
+
}
|
|
343
448
|
if (isReadHeavyCurrentSession(transcript) && supportsReadHeavyHealthy(options.baseline)) {
|
|
344
449
|
return baseDecision({
|
|
345
450
|
state: "Healthy",
|
|
@@ -449,6 +554,21 @@ function isReadHeavyCurrentSession(transcript) {
|
|
|
449
554
|
transcript.failedToolResults === 0 &&
|
|
450
555
|
!transcript.hasUnvalidatedEdits);
|
|
451
556
|
}
|
|
557
|
+
function isBusyWithoutProgress(transcript) {
|
|
558
|
+
const nonReadToolCalls = Math.max(0, transcript.toolCalls - transcript.readToolCalls);
|
|
559
|
+
return (transcript.toolCalls >= 8 &&
|
|
560
|
+
nonReadToolCalls >= 6 &&
|
|
561
|
+
transcript.failedToolResults === 0 &&
|
|
562
|
+
!transcript.hasUnvalidatedEdits &&
|
|
563
|
+
!hasObservedProgress(transcript) &&
|
|
564
|
+
!isReadHeavyCurrentSession(transcript));
|
|
565
|
+
}
|
|
566
|
+
function hasObservedProgress(transcript) {
|
|
567
|
+
return Boolean(transcript.observedProgress ||
|
|
568
|
+
transcript.validationRecovered ||
|
|
569
|
+
(transcript.validationSuccesses || 0) > 0 ||
|
|
570
|
+
(transcript.toolRecoveryEvents || 0) > 0);
|
|
571
|
+
}
|
|
452
572
|
function hasOpenCompactionBoundary(transcript) {
|
|
453
573
|
return transcript.compactionEvents > 0 && transcript.postCompactionActivity === 0;
|
|
454
574
|
}
|
|
@@ -491,6 +611,89 @@ function validationPurposeLabel(purpose) {
|
|
|
491
611
|
function formatFailureCount(count) {
|
|
492
612
|
return count === 2 ? "twice" : `${count}x`;
|
|
493
613
|
}
|
|
614
|
+
function normalizeBudgetThresholds(thresholds) {
|
|
615
|
+
return {
|
|
616
|
+
costUsd: thresholdOrDefault(thresholds?.costTotalCarefulUsd ?? thresholds?.costUsd, DEFAULT_BUDGET_THRESHOLDS.costUsd),
|
|
617
|
+
costDeltaUsd: thresholdOrDefault(thresholds?.costDeltaCarefulUsd ?? thresholds?.costDeltaUsd, DEFAULT_BUDGET_THRESHOLDS.costDeltaUsd),
|
|
618
|
+
durationMs: thresholdOrDefault(thresholds?.durationCarefulMs ?? thresholds?.durationMs, DEFAULT_BUDGET_THRESHOLDS.durationMs)
|
|
619
|
+
};
|
|
620
|
+
}
|
|
621
|
+
function budgetThresholdsFromEnv(env = process.env) {
|
|
622
|
+
const costUsd = numberEnv(env, "BB_CC_LITE_BUDGET_COST_USD", "BB_CC_LITE_COST_BUDGET_USD");
|
|
623
|
+
const costDeltaUsd = numberEnv(env, "BB_CC_LITE_BUDGET_COST_DELTA_USD", "BB_CC_LITE_COST_DELTA_BUDGET_USD");
|
|
624
|
+
const durationMs = numberEnv(env, "BB_CC_LITE_BUDGET_DURATION_MS", "BB_CC_LITE_DURATION_BUDGET_MS") ??
|
|
625
|
+
minutesEnv(env, "BB_CC_LITE_BUDGET_DURATION_MINUTES", "BB_CC_LITE_DURATION_BUDGET_MINUTES");
|
|
626
|
+
return costUsd === undefined && costDeltaUsd === undefined && durationMs === undefined
|
|
627
|
+
? undefined
|
|
628
|
+
: {
|
|
629
|
+
costUsd,
|
|
630
|
+
costDeltaUsd,
|
|
631
|
+
durationMs
|
|
632
|
+
};
|
|
633
|
+
}
|
|
634
|
+
function numberEnv(env, ...names) {
|
|
635
|
+
for (const name of names) {
|
|
636
|
+
const value = env[name];
|
|
637
|
+
if (value === undefined || value.trim() === "") {
|
|
638
|
+
continue;
|
|
639
|
+
}
|
|
640
|
+
const parsed = Number(value);
|
|
641
|
+
if (Number.isFinite(parsed) && parsed >= 0) {
|
|
642
|
+
return parsed;
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
return undefined;
|
|
646
|
+
}
|
|
647
|
+
function minutesEnv(env, ...names) {
|
|
648
|
+
const minutes = numberEnv(env, ...names);
|
|
649
|
+
return minutes === undefined ? undefined : minutes * 60_000;
|
|
650
|
+
}
|
|
651
|
+
function thresholdOrDefault(value, fallback) {
|
|
652
|
+
return value !== undefined && Number.isFinite(value) && value >= 0 ? value : fallback;
|
|
653
|
+
}
|
|
654
|
+
function budgetCostEvidence(costUsd, costSource) {
|
|
655
|
+
const cost = formatCost(costUsd);
|
|
656
|
+
return costSource === "estimated" ? `estimated cost ${cost}` : `cost ${cost}`;
|
|
657
|
+
}
|
|
658
|
+
function budgetCarefulEvidenceFor(input, costDelta, costSource, thresholds, baseline) {
|
|
659
|
+
if (costDelta >= thresholds.costDeltaUsd) {
|
|
660
|
+
return `cost +${formatCost(costDelta)}`;
|
|
661
|
+
}
|
|
662
|
+
if (input.costUsd !== undefined &&
|
|
663
|
+
input.costUsd >= thresholds.costUsd &&
|
|
664
|
+
!baselineSuppressesCostBudget(input.costUsd, baseline)) {
|
|
665
|
+
return budgetCostEvidence(input.costUsd, costSource);
|
|
666
|
+
}
|
|
667
|
+
if (input.durationMs !== undefined &&
|
|
668
|
+
input.durationMs >= thresholds.durationMs &&
|
|
669
|
+
!baselineSuppressesDurationBudget(input.durationMs, baseline)) {
|
|
670
|
+
return `session ran ${formatDuration(input.durationMs)}`;
|
|
671
|
+
}
|
|
672
|
+
return undefined;
|
|
673
|
+
}
|
|
674
|
+
function baselineSuppressesCostBudget(costUsd, baseline) {
|
|
675
|
+
const budget = baseline?.budget;
|
|
676
|
+
return Boolean(budget &&
|
|
677
|
+
(budget.costSamples || 0) >= 3 &&
|
|
678
|
+
budget.confidence !== "low" &&
|
|
679
|
+
(budget.p90CostUsd || 0) >= costUsd);
|
|
680
|
+
}
|
|
681
|
+
function baselineSuppressesDurationBudget(durationMs, baseline) {
|
|
682
|
+
const budget = baseline?.budget;
|
|
683
|
+
return Boolean(budget &&
|
|
684
|
+
(budget.durationSamples || 0) >= 3 &&
|
|
685
|
+
budget.confidence !== "low" &&
|
|
686
|
+
(budget.p90DurationMs || 0) >= durationMs);
|
|
687
|
+
}
|
|
688
|
+
function formatDuration(durationMs) {
|
|
689
|
+
const minutes = Math.max(1, Math.round(durationMs / 60_000));
|
|
690
|
+
if (minutes < 60) {
|
|
691
|
+
return `${minutes}m`;
|
|
692
|
+
}
|
|
693
|
+
const hours = Math.floor(minutes / 60);
|
|
694
|
+
const remainingMinutes = minutes % 60;
|
|
695
|
+
return remainingMinutes === 0 ? `${hours}h` : `${hours}h ${remainingMinutes}m`;
|
|
696
|
+
}
|
|
494
697
|
function hasUnusualEditValidationLag(transcript, baseline) {
|
|
495
698
|
const currentLag = transcript.unvalidatedEditToolSteps;
|
|
496
699
|
const p75 = baseline?.editValidation?.p75ToolStepsFromEditToValidation || 0;
|