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.
@@ -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(extractSafeToolResultEventsFromTranscriptLines(tail.lines));
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":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,yCAAyC,EACzC,8CAA8C,EAE/C,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,mCAAmC,EACnC,gCAAgC,EAChC,0BAA0B,EAC1B,2BAA2B,EAC3B,8BAA8B,EAC9B,eAAe,EAEhB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAG5D,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAC/B,MAAM,gCAAgC,GAAG,IAAI,GAAG,IAAI,CAAC;AACrD,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAgDlC,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,UAAmC,EAAE;IAClF,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,EAAE,CAAC;IAC7C,MAAM,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,IAAI,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IAC5F,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,iBAAiB,CAAC;IACvD,MAAM,qBAAqB,GAAG,OAAO,CAAC,qBAAqB,IAAI,gCAAgC,CAAC;IAChG,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;IACrE,MAAM,YAAY,GAAG,mBAAmB,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,IAAI,qBAAqB,CAAC,CAAC;IACtG,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;IAClD,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAChD,MAAM,gBAAgB,GAAG,MAAM,YAAY,CAAC,aAAa,EAAE,qBAAqB,CAAC,CAAC;IAClF,MAAM,sBAAsB,GAAG,MAAM,mBAAmB,CAAC,YAAY,EAAE,qBAAqB,CAAC,CAAC;IAC9F,MAAM,QAAQ,GAAG,oBAAoB,CAAC,gBAAgB,CAAC,CAAC;IACxD,OAAO,eAAe,CAAC,sBAAsB,EAAE,QAAQ,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,OAAgC;IAC5E,OAAO;QACL,oBAAoB,OAAO,CAAC,eAAe,EAAE;QAC7C,8BAA8B,OAAO,CAAC,wBAAwB,EAAE;QAChE,0CAA0C,gBAAgB,CAAC,OAAO,CAAC,kCAAkC,CAAC,EAAE;QACxG,0CAA0C,OAAO,CAAC,iCAAiC,EAAE;QACrF,iCAAiC,OAAO,CAAC,0BAA0B,EAAE;QACrE,yBAAyB,gBAAgB,CAAC,OAAO,CAAC,mBAAmB,CAAC,EAAE;QACxE,mCAAmC,OAAO,CAAC,4BAA4B,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;QACpF,2BAA2B,OAAO,CAAC,qBAAqB,EAAE;QAC1D,qBAAqB,sBAAsB,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE;KACxE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CACtB,sBAA+C,EAC/C,QAAkC;IAElC,IAAI,wBAAwB,GAAG,CAAC,CAAC;IACjC,IAAI,gBAAgB,GAAG,CAAC,CAAC;IACzB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,iCAAiC,GAAG,CAAC,CAAC;IAC1C,IAAI,0BAA0B,GAAG,CAAC,CAAC;IACnC,IAAI,sBAAsB,GAAG,CAAC,CAAC;IAC/B,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,IAAI,qBAAqB,GAAG,CAAC,CAAC;IAC9B,MAAM,qBAAqB,GAAa,EAAE,CAAC;IAC3C,MAAM,gBAAgB,GAAqD,EAAE,CAAC;IAE9E,KAAK,MAAM,MAAM,IAAI,sBAAsB,EAAE,CAAC;QAC5C,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC/C,qBAAqB,IAAI,MAAM,CAAC,qBAAqB,CAAC;QACtD,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACtC,wBAAwB,IAAI,CAAC,CAAC;YAC9B,gBAAgB,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,gBAAgB,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YACnF,IAAI,OAAO,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;gBACzC,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;YACrD,CAAC;YAED,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;gBACvB,SAAS,IAAI,CAAC,CAAC;gBACf,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;oBACtB,iCAAiC,IAAI,CAAC,CAAC;gBACzC,CAAC;qBAAM,CAAC;oBACN,gBAAgB,IAAI,CAAC,CAAC;gBACxB,CAAC;YACH,CAAC;YAED,MAAM,eAAe,GAAG,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,YAAY,IAAI,CAAC,CAAC;YACxE,IAAI,eAAe,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;gBAC3C,0BAA0B,IAAI,CAAC,CAAC;YAClC,CAAC;YAED,IAAI,OAAO,CAAC,uBAAuB,EAAE,CAAC;gBACpC,eAAe,IAAI,CAAC,CAAC;gBACrB,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;oBACvB,sBAAsB,IAAI,CAAC,CAAC;gBAC9B,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,eAAe,EAAE,sBAAsB,CAAC,MAAM;QAC9C,wBAAwB;QACxB,kCAAkC,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;QACvG,iCAAiC;QACjC,0BAA0B;QAC1B,mBAAmB,EAAE,eAAe,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,sBAAsB,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,SAAS;QAC1G,4BAA4B,EAC1B,qBAAqB,CAAC,MAAM,GAAG,CAAC;YAC9B,CAAC,CAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,KAAK,EAAE,CAAC,CAAC,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACtH,CAAC,CAAC,CAAC;QACP,qBAAqB;QACrB,gBAAgB;KACjB,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CACpB,MAA6B,EAC7B,QAAkC;IAElC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAyB,CAAC;IAChD,MAAM,QAAQ,GAAoB,EAAE,CAAC;IACrC,IAAI,qBAAqB,GAAG,CAAC,CAAC;IAE9B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAChC,MAAM,mBAAmB,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACvD,IAAI,mBAAmB,EAAE,CAAC;gBACxB,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC,CAAC;gBAC1D,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAChC,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;gBACvC,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;oBACtC,OAAO,CAAC,kCAAkC,GAAG,IAAI,CAAC;gBACpD,CAAC;YACH,CAAC;YACD,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI;YAC5C,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,YAAY,EAAE,CAAC;YACf,aAAa,EAAE,CAAC;YAChB,gBAAgB,EAAE,CAAC;YACnB,kCAAkC,EAAE,KAAK;YACzC,UAAU,EAAE,KAAK;YACjB,uBAAuB,EAAE,KAAK;SAC/B,CAAC;QACF,IAAI,OAAO,CAAC,YAAY,KAAK,CAAC,IAAI,OAAO,CAAC,kCAAkC,EAAE,CAAC;YAC7E,OAAO,CAAC,aAAa,GAAG,CAAC,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,aAAa,IAAI,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,CAAC,YAAY,IAAI,CAAC,CAAC;QAC1B,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,gBAAgB,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;QACrF,OAAO,CAAC,kCAAkC,GAAG,KAAK,CAAC;QAEnD,MAAM,YAAY,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,YAAY,KAAK,SAAS,IAAI,OAAO,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;YACvE,OAAO,CAAC,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC;QAChD,CAAC;QACD,IAAI,YAAY,KAAK,SAAS,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;YACrG,qBAAqB,IAAI,CAAC,CAAC;QAC7B,CAAC;QACD,IAAI,OAAO,CAAC,gBAAgB,IAAI,CAAC,EAAE,CAAC;YAClC,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC;QACzC,CAAC;QACD,IAAI,YAAY,KAAK,MAAM,EAAE,CAAC;YAC5B,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;QAC5B,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;QACtC,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,qBAAqB,EAAE,CAAC;AAC7C,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAsB;IACjD,IAAI,OAAO,CAAC,gBAAgB,IAAI,CAAC,IAAI,OAAO,CAAC,YAAY,IAAI,CAAC,EAAE,CAAC;QAC/D,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,OAAO,CAAC,gBAAgB,IAAI,CAAC,IAAI,OAAO,CAAC,YAAY,IAAI,CAAC,EAAE,CAAC;QAC/D,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,eAAe,CAAC,OAAsB,EAAE,SAAkB;IACjE,OAAO;QACL,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,SAAS;QACT,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,uBAAuB,EAAE,OAAO,CAAC,uBAAuB;KACzD,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,QAAiC;IAC7D,MAAM,QAAQ,GAAG,0BAA0B,EAAE,CAAC;IAC9C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,mCAAmC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACzD,CAAC;IACD,OAAO;QACL,eAAe,EAAE,8BAA8B,CAAC,QAAQ,CAAC;QACzD,UAAU,EAAE,gCAAgC,CAAC,QAAQ,CAAC;KACvD,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,KAAe,EAAE,qBAA6B;IACxE,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,KAAK,EAAE,qBAAqB,CAAC,CAAC;IAC3E,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,KAAe,EAAE,qBAA6B;IACjF,MAAM,QAAQ,GAA8B,EAAE,CAAC;IAC/C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,MAAM,kBAAkB,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,qBAAqB,EAAE,CAAC,CAAC;QACjF,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,QAAQ,CAAC,IAAI,CAAC,yCAAyC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,KAAe,EAAE,qBAA6B;IAC/E,MAAM,QAAQ,GAA4B,EAAE,CAAC;IAC7C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,MAAM,kBAAkB,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,qBAAqB,EAAE,CAAC,CAAC;QACjF,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,QAAQ,CAAC,IAAI,CAAC,8CAA8C,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,IAAY,EAAE,QAAgB;IAC/D,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;QAClB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,UAAU,GAA0B,EAAE,CAAC;IAC7C,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC;IACvB,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAG,CAAC;QAC/B,IAAI,OAAO,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACxC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC;iBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC3D,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,KAAK,CAAC,CAAC;gBACjD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;oBAC1B,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;gBAC5C,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,UAAU;SACd,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;SAC1F,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC;SAClB,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AACxC,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,IAAY;IAC7C,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,OAAO,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAa,EAAE,KAAa;IACvD,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACf,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACnG,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAyB;IACjD,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,sBAAsB,CAAC,QAA0D;IACxF,MAAM,KAAK,GAAG,2BAA2B,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;QAC7D,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACtC,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACnD,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AACtD,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AAClC,CAAC"}
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;AAEzC,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,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"}
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, StoredDecision, TranscriptSummary } from "./types.js";
1
+ import type { Decision, DecisionPersonalBaseline, StatusLineInput, TranscriptSummary } from "./types.js";
2
2
  export interface DecideOptions {
3
- previous?: StoredDecision;
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 costDelta = costUsd !== undefined && options.previous?.costUsd !== undefined ? costUsd - options.previous.costUsd : 0;
308
- if (costDelta >= 0.5) {
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;