agent-token-sentinel 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/CHANGELOG.md +37 -1
  2. package/README.md +101 -10
  3. package/README.zh-TW.md +101 -10
  4. package/SKILL.md +19 -4
  5. package/dist/circuit-breaker/breaker.js +1 -0
  6. package/dist/circuit-breaker/breaker.js.map +1 -1
  7. package/dist/circuit-breaker/detector.d.ts +12 -0
  8. package/dist/circuit-breaker/detector.js +72 -16
  9. package/dist/circuit-breaker/detector.js.map +1 -1
  10. package/dist/cli/hooks.d.ts +16 -2
  11. package/dist/cli/hooks.js +73 -4
  12. package/dist/cli/hooks.js.map +1 -1
  13. package/dist/cli/index.js +62 -6
  14. package/dist/cli/index.js.map +1 -1
  15. package/dist/cli/install.d.ts +7 -0
  16. package/dist/cli/install.js +25 -11
  17. package/dist/cli/install.js.map +1 -1
  18. package/dist/cli/uninstall.d.ts +23 -0
  19. package/dist/cli/uninstall.js +176 -0
  20. package/dist/cli/uninstall.js.map +1 -0
  21. package/dist/config.d.ts +4 -0
  22. package/dist/config.js +12 -0
  23. package/dist/config.js.map +1 -1
  24. package/dist/mcp/server.js +17 -1
  25. package/dist/mcp/server.js.map +1 -1
  26. package/dist/sentinel.d.ts +14 -1
  27. package/dist/sentinel.js +61 -5
  28. package/dist/sentinel.js.map +1 -1
  29. package/dist/token-guard/compactor.d.ts +21 -2
  30. package/dist/token-guard/compactor.js +106 -33
  31. package/dist/token-guard/compactor.js.map +1 -1
  32. package/dist/token-guard/distiller.d.ts +16 -0
  33. package/dist/token-guard/distiller.js +40 -9
  34. package/dist/token-guard/distiller.js.map +1 -1
  35. package/dist/token-guard/log-store.d.ts +23 -0
  36. package/dist/token-guard/log-store.js +101 -0
  37. package/dist/token-guard/log-store.js.map +1 -0
  38. package/dist/types.d.ts +18 -0
  39. package/dist/utils/state-store.d.ts +1 -0
  40. package/dist/utils/state-store.js +3 -0
  41. package/dist/utils/state-store.js.map +1 -1
  42. package/package.json +7 -5
package/dist/sentinel.js CHANGED
@@ -8,14 +8,15 @@ import { isAbsolute, relative, resolve } from 'node:path';
8
8
  import { CheckpointManager } from './circuit-breaker/checkpoint.js';
9
9
  import { CircuitBreaker } from './circuit-breaker/breaker.js';
10
10
  import { loadConfig } from './config.js';
11
- import { compactState, historyStats, renderHistory } from './token-guard/compactor.js';
11
+ import { buildMemory, compactState, historyStats, renderHistory } from './token-guard/compactor.js';
12
12
  import { distillLog } from './token-guard/distiller.js';
13
13
  import { pruneSource } from './token-guard/pruner.js';
14
14
  import { findEnclosingSymbols } from './utils/ast.js';
15
15
  import { diffLines, parseUnifiedDiff } from './utils/diff.js';
16
16
  import { git } from './utils/git.js';
17
17
  import { sha256 } from './utils/hash.js';
18
- import { toPosix } from './utils/normalize.js';
18
+ import { stripAnsi, toPosix } from './utils/normalize.js';
19
+ import { sliceLog } from './token-guard/log-store.js';
19
20
  import { StateStore } from './utils/state-store.js';
20
21
  export class Sentinel {
21
22
  root;
@@ -106,13 +107,27 @@ export class Sentinel {
106
107
  const log = params.log ?? '';
107
108
  return this.store.update((state) => {
108
109
  const outcome = this.breaker.recordRun(state, params);
110
+ if (log)
111
+ outcome.run.logId = this.saveLog(`run-${outcome.run.seq}`, log, state);
109
112
  if (outcome.trip)
110
113
  this.refreshSnapshots(outcome.trip.deadEnd.rollback);
111
114
  const compaction = compactState(state, { compactEvery: this.config.compactEvery }, this.now());
112
- const distilled = params.exitCode !== 0 && log ? this.distill(log) : undefined;
115
+ const distilled = params.exitCode !== 0 && log ? this.distill(log, { escalation: repeatCount(state) - 1, logRef: outcome.run.logId }) : undefined;
113
116
  return { ...outcome, distilled, compaction: compaction.episodes.length ? compaction : undefined };
114
117
  });
115
118
  }
119
+ /** Raw log of a recorded run (latest by default), sliced so it never floods the context. */
120
+ expandLog(options = {}) {
121
+ const state = this.store.load();
122
+ const runs = state.runs.filter((r) => r.logId);
123
+ const run = options.run ? runs.find((r) => r.logId === options.run || String(r.seq) === options.run) : runs[runs.length - 1];
124
+ if (!run?.logId)
125
+ throw new Error(options.run ? `No stored log for ${options.run}` : 'No stored logs yet');
126
+ const raw = this.store.readArtifact(`logs/${run.logId}.log`);
127
+ if (raw === undefined)
128
+ throw new Error(`Log ${run.logId} was pruned (only the last ${this.config.maxLogs} are kept)`);
129
+ return sliceLog(raw, { ...options, header: `${run.logId} · \`${run.command}\` · exit ${run.exitCode}` });
130
+ }
116
131
  /** Close the circuit. Remaining rounds are compacted first so the lesson survives the reset. */
117
132
  reset() {
118
133
  return this.store.update((state) => {
@@ -135,8 +150,33 @@ export class Sentinel {
135
150
  /* ---------------------------------------------------------------- */
136
151
  /* Token guard */
137
152
  /* ---------------------------------------------------------------- */
138
- distill(log, tokenBudget) {
139
- return distillLog(log, { root: this.root, tokenBudget: tokenBudget ?? this.config.distillTokenBudget, contextLines: this.config.contextLines });
153
+ distill(log, options = {}) {
154
+ return distillLog(log, {
155
+ root: this.root,
156
+ tokenBudget: options.tokenBudget ?? this.config.distillTokenBudget,
157
+ maxTokenBudget: this.config.distillMaxBudget,
158
+ contextLines: this.config.contextLines,
159
+ escalation: options.escalation,
160
+ logRef: options.logRef,
161
+ });
162
+ }
163
+ /** Persist a raw log and prune the oldest beyond `maxLogs`. Best-effort: never fails a run. */
164
+ saveLog(id, log, state) {
165
+ try {
166
+ this.store.writeArtifact(`logs/${id}.log`, stripAnsi(log));
167
+ const keep = new Set(state.runs.map((r) => r.logId).filter(Boolean).slice(-(this.config.maxLogs - 1)));
168
+ keep.add(id);
169
+ for (const r of state.runs) {
170
+ if (r.logId && !keep.has(r.logId)) {
171
+ this.store.deleteArtifact(`logs/${r.logId}.log`);
172
+ r.logId = undefined;
173
+ }
174
+ }
175
+ return id;
176
+ }
177
+ catch {
178
+ return undefined;
179
+ }
140
180
  }
141
181
  prune(file, options) {
142
182
  const full = this.resolveInRoot(file);
@@ -157,6 +197,11 @@ export class Sentinel {
157
197
  history() {
158
198
  return renderHistory(this.store.load());
159
199
  }
200
+ /** Debugging memory to re-inject after a session compacts / resumes (undefined when nothing is pending). */
201
+ memory(options = {}) {
202
+ const state = this.store.load();
203
+ return buildMemory(state, { reason: options.reason, tokenBudget: this.config.memoryTokenBudget, latestDeadEnd: this.deadEnds(1)[0]?.log });
204
+ }
160
205
  deadEnds(limit = 3) {
161
206
  const state = this.store.load();
162
207
  return state.deadEnds
@@ -249,6 +294,17 @@ export class Sentinel {
249
294
  return [{ file: rel, diff: diffLines(before, after), after }];
250
295
  }
251
296
  }
297
+ /** How many runs in a row (ending with the latest) share the latest failure fingerprint. */
298
+ function repeatCount(state) {
299
+ const runs = state.runs;
300
+ const last = runs[runs.length - 1];
301
+ if (!last || last.exitCode === 0 || !last.fingerprint)
302
+ return 1;
303
+ let n = 0;
304
+ for (let i = runs.length - 1; i >= 0 && runs[i]?.fingerprint === last.fingerprint; i--)
305
+ n++;
306
+ return n;
307
+ }
252
308
  /** List Dead-End markdown files without instantiating a Sentinel (used by the CLI). */
253
309
  export function listDeadEndFiles(root) {
254
310
  const dir = resolve(root, '.sentinel', 'dead-ends');
@@ -1 +1 @@
1
- {"version":3,"file":"sentinel.js","sourceRoot":"","sources":["../src/sentinel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sentinel.js","sourceRoot":"","sources":["../src/sentinel.ts"],"names":[],"mappings":"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"}
@@ -10,7 +10,7 @@
10
10
  * The agent replaces its verbose tool-call history with this view
11
11
  * (resource `sentinel://history`), freeing most of the stale context.
12
12
  */
13
- import type { CompactedEpisode, EditRound, RunRecord, SentinelState } from '../types.js';
13
+ import type { CompactedEpisode, DeadEndLog, EditRound, RunRecord, SentinelState } from '../types.js';
14
14
  export interface DebugRound {
15
15
  /** 1-based round number since the last reset. */
16
16
  index: number;
@@ -47,12 +47,31 @@ export interface CompactionResult {
47
47
  export declare function roundTokens(edits: readonly EditRound[], run: RunRecord): number;
48
48
  /** Group uncompacted edits and runs into debug rounds. */
49
49
  export declare function buildRounds(state: SentinelState): DebugRound[];
50
+ /** Structured facts about a block of rounds: what was tried, where, what failed, how it ended. */
51
+ export declare function describeRounds(rounds: readonly DebugRound[]): Omit<CompactedEpisode, 'summary' | 'freedTokens' | 'createdAt'>;
50
52
  export declare function summarizeRounds(rounds: readonly DebugRound[]): string;
53
+ /**
54
+ * Multi-line rendering of an episode: the summary plus the evidence a model
55
+ * needs to avoid repeating it (exact error message, failing test, status).
56
+ */
57
+ export declare function renderEpisode(e: CompactedEpisode): string[];
51
58
  /** Pure compaction over a list of rounds. */
52
59
  export declare function compactRounds(rounds: readonly DebugRound[], options: CompactOptions, now?: number): CompactionResult;
53
60
  /** Compact the state's uncompacted rounds in place. */
54
61
  export declare function compactState(state: SentinelState, options: CompactOptions, now?: number): CompactionResult;
55
62
  /** Whole-history accounting: what the agent would carry without vs. with compaction. */
56
63
  export declare function historyStats(state: SentinelState): HistoryStats;
57
- /** Context-ready history: compacted episodes followed by one line per recent round. */
64
+ /** Context-ready history: compacted episodes (with evidence) followed by one line per recent round. */
58
65
  export declare function renderHistory(state: SentinelState): string;
66
+ export interface MemoryOptions {
67
+ /** SessionStart source: startup | resume | clear | compact | fork. */
68
+ reason?: string;
69
+ tokenBudget: number;
70
+ latestDeadEnd?: DeadEndLog;
71
+ }
72
+ /**
73
+ * The debugging memory re-injected when Claude Code compacts, resumes or clears
74
+ * a session, so "what was already tried and failed" is never lost with the
75
+ * transcript. Returns undefined when there is nothing worth saying.
76
+ */
77
+ export declare function buildMemory(state: SentinelState, options: MemoryOptions): string | undefined;
@@ -20,26 +20,60 @@ export function buildRounds(state) {
20
20
  }
21
21
  return rounds;
22
22
  }
23
- export function summarizeRounds(rounds) {
24
- if (rounds.length === 0)
25
- return '[Compacted]: (no rounds)';
26
- const first = rounds[0]?.index ?? 0;
27
- const last = rounds[rounds.length - 1]?.index ?? first;
28
- const label = first === last ? `Round ${first}` : `Rounds ${first}-${last}`;
23
+ /** Structured facts about a block of rounds: what was tried, where, what failed, how it ended. */
24
+ export function describeRounds(rounds) {
29
25
  const edits = rounds.flatMap((r) => r.edits);
30
- const where = primaryLocation(edits);
31
- const approach = edits.length ? classifyApproach(edits) : 're-running without edits';
32
- const failures = rounds.filter((r) => r.run.exitCode !== 0);
33
- const names = new Map();
34
- for (const r of failures) {
35
- const n = r.run.errorName && r.run.errorName !== 'UnknownError' ? r.run.errorName : `exit ${r.run.exitCode}`;
36
- names.set(n, (names.get(n) ?? 0) + 1);
26
+ const errors = new Map();
27
+ for (const r of rounds) {
28
+ if (r.run.exitCode === 0)
29
+ continue;
30
+ const name = r.run.errorName && r.run.errorName !== 'UnknownError' ? r.run.errorName : `exit ${r.run.exitCode}`;
31
+ const key = `${name}|${r.run.message ?? ''}`;
32
+ const e = errors.get(key) ?? { name, message: r.run.message, count: 0 };
33
+ e.count++;
34
+ errors.set(key, e);
37
35
  }
38
- const errorText = [...names.entries()].map(([n, c]) => (c > 1 ? `${n} ×${c}` : n)).join(', ');
39
36
  const lastRun = rounds[rounds.length - 1]?.run;
40
- const outcome = failures.length === 0 ? 'all passed' : lastRun && lastRun.exitCode === 0 ? `failed with ${errorText}, then passed` : `failed with ${errorText}`;
41
- const reverted = rounds.some((r) => r.reverted) ? ' Reverted.' : '';
42
- return `[Compacted]: ${label} attempted ${approach}${where ? ` at ${where}` : ''}, ${outcome}.${reverted}`;
37
+ const status = rounds.some((r) => r.reverted) ? 'reverted' : lastRun && lastRun.exitCode === 0 ? 'resolved' : 'unresolved';
38
+ return {
39
+ fromRound: rounds[0]?.index ?? 0,
40
+ toRound: rounds[rounds.length - 1]?.index ?? 0,
41
+ status,
42
+ approach: edits.length ? classifyApproach(edits) : 're-running without edits',
43
+ location: primaryLocation(edits),
44
+ errors: [...errors.values()],
45
+ tests: [...new Set(rounds.map((r) => r.run.failingTest).filter((t) => !!t))].slice(0, 3),
46
+ files: [...new Set(edits.map((e) => e.file))].slice(0, 5),
47
+ };
48
+ }
49
+ export function summarizeRounds(rounds) {
50
+ if (rounds.length === 0)
51
+ return '[Compacted]: (no rounds)';
52
+ const d = describeRounds(rounds);
53
+ const label = d.fromRound === d.toRound ? `Round ${d.fromRound}` : `Rounds ${d.fromRound}-${d.toRound}`;
54
+ const byName = new Map();
55
+ for (const e of d.errors ?? [])
56
+ byName.set(e.name, (byName.get(e.name) ?? 0) + e.count);
57
+ const errorText = [...byName.entries()].map(([n, c]) => (c > 1 ? `${n} ×${c}` : n)).join(', ');
58
+ const failed = (d.errors ?? []).length > 0;
59
+ const outcome = !failed ? 'all passed' : d.status === 'resolved' ? `failed with ${errorText}, then passed` : `failed with ${errorText}`;
60
+ const reverted = d.status === 'reverted' ? ' Reverted.' : '';
61
+ return `[Compacted]: ${label} attempted ${d.approach}${d.location ? ` at ${d.location}` : ''}, ${outcome}.${reverted}`;
62
+ }
63
+ /**
64
+ * Multi-line rendering of an episode: the summary plus the evidence a model
65
+ * needs to avoid repeating it (exact error message, failing test, status).
66
+ */
67
+ export function renderEpisode(e) {
68
+ const lines = [e.summary];
69
+ if (e.status && e.status !== 'resolved')
70
+ lines.push(` status: ${e.status.toUpperCase()}`);
71
+ const top = [...(e.errors ?? [])].sort((a, b) => b.count - a.count)[0];
72
+ if (top?.message)
73
+ lines.push(` error: ${top.name}: ${top.message.slice(0, 140)}`);
74
+ if (e.tests?.length)
75
+ lines.push(` test: ${e.tests.join(' | ').slice(0, 160)}`);
76
+ return lines;
43
77
  }
44
78
  /** Pure compaction over a list of rounds. */
45
79
  export function compactRounds(rounds, options, now = Date.now()) {
@@ -55,18 +89,14 @@ export function compactRounds(rounds, options, now = Date.now()) {
55
89
  const block = compactable.slice(i, i + options.compactEvery);
56
90
  const summary = summarizeRounds(block);
57
91
  const blockTokens = block.reduce((s, r) => s + r.rawTokens, 0);
58
- episodes.push({
59
- fromRound: block[0]?.index ?? 0,
60
- toRound: block[block.length - 1]?.index ?? 0,
61
- summary,
62
- freedTokens: Math.max(0, blockTokens - estimateTokens(summary)),
63
- createdAt: now,
64
- });
92
+ const episode = { ...describeRounds(block), summary, freedTokens: 0, createdAt: now };
93
+ episode.freedTokens = Math.max(0, blockTokens - estimateTokens(renderEpisode(episode).join('\n')));
94
+ episodes.push(episode);
65
95
  consumed += block.length;
66
96
  }
67
97
  }
68
98
  const remaining = rounds.slice(consumed);
69
- const compactedTokens = episodes.reduce((s, e) => s + estimateTokens(e.summary), 0) + remaining.reduce((s, r) => s + r.rawTokens, 0);
99
+ const compactedTokens = episodes.reduce((s, e) => s + estimateTokens(renderEpisode(e).join('\n')), 0) + remaining.reduce((s, r) => s + r.rawTokens, 0);
70
100
  const freedTokens = Math.max(0, originalTokens - compactedTokens);
71
101
  return { episodes, remaining, originalTokens, compactedTokens, freedTokens, reduction: originalTokens > 0 ? freedTokens / originalTokens : 0 };
72
102
  }
@@ -86,21 +116,64 @@ export function compactState(state, options, now = Date.now()) {
86
116
  }
87
117
  /** Whole-history accounting: what the agent would carry without vs. with compaction. */
88
118
  export function historyStats(state) {
89
- const summaries = state.compacted.reduce((s, e) => s + estimateTokens(e.summary), 0);
119
+ const summaries = state.compacted.reduce((s, e) => s + estimateTokens(renderEpisode(e).join('\n')), 0);
90
120
  const freed = state.compacted.reduce((s, e) => s + e.freedTokens, 0);
91
121
  const recent = buildRounds(state).reduce((s, r) => s + r.rawTokens, 0);
92
122
  const originalTokens = summaries + freed + recent;
93
123
  const currentTokens = summaries + recent;
94
124
  return { originalTokens, currentTokens, freedTokens: freed, reduction: originalTokens > 0 ? freed / originalTokens : 0 };
95
125
  }
96
- /** Context-ready history: compacted episodes followed by one line per recent round. */
126
+ /** Context-ready history: compacted episodes (with evidence) followed by one line per recent round. */
97
127
  export function renderHistory(state) {
98
- const lines = state.compacted.slice(-20).map((e) => e.summary);
99
- for (const r of buildRounds(state)) {
100
- const files = [...new Set(r.edits.map((e) => `${e.file}${e.symbols.length ? `#${e.symbols.join(',')}` : ''}`))].join(', ') || 'no edits';
101
- const result = r.run.exitCode === 0 ? 'PASS' : `FAIL ${r.run.errorName ?? ''}${r.run.message ? `: ${r.run.message.slice(0, 100)}` : ''}`;
102
- lines.push(`Round ${r.index}: edited ${files}; \`${r.run.command}\` → ${result}${r.reverted ? ' (reverted)' : ''}`);
103
- }
128
+ const lines = state.compacted.slice(-20).flatMap(renderEpisode);
129
+ for (const r of buildRounds(state))
130
+ lines.push(renderRound(r));
104
131
  return lines.length ? lines.join('\n') : '(no debug history recorded)';
105
132
  }
133
+ function renderRound(r) {
134
+ const files = [...new Set(r.edits.map((e) => `${e.file}${e.symbols.length ? `#${e.symbols.join(',')}` : ''}`))].join(', ') || 'no edits';
135
+ const result = r.run.exitCode === 0 ? 'PASS' : `FAIL ${r.run.errorName ?? ''}${r.run.message ? `: ${r.run.message.slice(0, 100)}` : ''}`;
136
+ return `Round ${r.index}: edited ${files}; \`${r.run.command}\` → ${result}${r.reverted ? ' (reverted)' : ''}${r.run.logId ? ` [log ${r.run.logId}]` : ''}`;
137
+ }
138
+ /**
139
+ * The debugging memory re-injected when Claude Code compacts, resumes or clears
140
+ * a session, so "what was already tried and failed" is never lost with the
141
+ * transcript. Returns undefined when there is nothing worth saying.
142
+ */
143
+ export function buildMemory(state, options) {
144
+ const failing = state.consecutiveFailures > 0;
145
+ const open = state.circuit.status !== 'CLOSED';
146
+ const rounds = buildRounds(state);
147
+ const unresolved = state.compacted.filter((e) => e.status && e.status !== 'resolved');
148
+ const hasHistory = rounds.length > 0 || unresolved.length > 0;
149
+ // On a fresh startup only speak up when something is actually wrong.
150
+ if (!open && !failing && (options.reason === 'startup' || !hasHistory))
151
+ return undefined;
152
+ const out = [`[agent-token-sentinel memory${options.reason ? ` · after ${options.reason}` : ''}]`];
153
+ if (open) {
154
+ out.push(`Circuit ${state.circuit.status}: ${state.circuit.reasons.join('; ').slice(0, 200)}. Do not edit until you read sentinel://dead-ends and reset with a new hypothesis.`);
155
+ }
156
+ const last = state.runs[state.runs.length - 1];
157
+ if (failing && last) {
158
+ const what = `${last.errorName ?? 'failure'}${last.message ? `: ${last.message.slice(0, 140)}` : ''}`;
159
+ out.push(`Open problem: ${what}${last.failingTest ? ` (test: ${last.failingTest.slice(0, 100)})` : ''} — failing ${state.consecutiveFailures} run(s) in a row on \`${last.command}\`${last.logId ? `; full log: sentinel_expand_log run=${last.logId}` : ''}.`);
160
+ }
161
+ const tried = [
162
+ ...(options.latestDeadEnd && open ? options.latestDeadEnd.rejectedApproaches.map((a) => `- (dead end) ${a}`) : []),
163
+ ...unresolved.slice(-6).flatMap((e) => renderEpisode(e).map((l, i) => (i === 0 ? `- ${l}` : ` ${l}`))),
164
+ ];
165
+ if (tried.length)
166
+ out.push('Already tried, did not fix it:', ...tried);
167
+ if (rounds.length)
168
+ out.push('Recent rounds:', ...rounds.slice(-3).map((r) => `- ${renderRound(r)}`));
169
+ const green = [...state.checkpoints].reverse().find((c) => c.green);
170
+ if (green)
171
+ out.push(`Last green checkpoint: ${green.id} (${green.label}).`);
172
+ // Fit the budget by dropping the oldest detail first, never the header or the open problem.
173
+ const fixed = out.slice(0, 1 + (open ? 1 : 0) + (failing && last ? 1 : 0));
174
+ let rest = out.slice(fixed.length);
175
+ while (rest.length && estimateTokens([...fixed, ...rest].join('\n')) > options.tokenBudget)
176
+ rest = rest.slice(1);
177
+ return [...fixed, ...rest].join('\n');
178
+ }
106
179
  //# sourceMappingURL=compactor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"compactor.js","sourceRoot":"","sources":["../../src/token-guard/compactor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"compactor.js","sourceRoot":"","sources":["../../src/token-guard/compactor.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { type FailureSummary } from '../circuit-breaker/detector.js';
1
2
  export interface DistillOptions {
2
3
  /** Project root: used to relativize paths and read call-site source. */
3
4
  root?: string;
@@ -5,6 +6,17 @@ export interface DistillOptions {
5
6
  contextLines?: number;
6
7
  /** Read the call-site file from disk for context (default true). */
7
8
  readSource?: boolean;
9
+ /** Extra tokens granted per additional distinct failure (default 30). */
10
+ perFailureTokens?: number;
11
+ /** Hard ceiling for the dynamic budget (default 4 × tokenBudget). */
12
+ maxTokenBudget?: number;
13
+ /**
14
+ * 0 = first time this failure is seen. Each repeat widens the budget by 50%
15
+ * and the source context by 2 lines: being stuck calls for more evidence.
16
+ */
17
+ escalation?: number;
18
+ /** How the agent can fetch the full log, e.g. `run-12`; printed in the footer. */
19
+ logRef?: string;
8
20
  }
9
21
  export interface CallSite {
10
22
  file: string;
@@ -25,5 +37,9 @@ export interface DistillResult {
25
37
  reduction: number;
26
38
  originalLines: number;
27
39
  droppedNoiseFrames: number;
40
+ /** Every distinct failure found (the first one is shown in detail). */
41
+ failures: FailureSummary[];
42
+ /** Budget actually applied after scaling for failures and escalation. */
43
+ effectiveBudget: number;
28
44
  }
29
45
  export declare function distillLog(raw: string, options?: DistillOptions): DistillResult;
@@ -4,13 +4,19 @@
4
4
  *
5
5
  * Keeps: the first error headline (+ a continuation line), the failing test
6
6
  * name, assertion expected/received, the first *project* call site with
7
- * ±N lines of source, and a de-duplicated list of further tsc errors.
7
+ * ±N lines of source, a one-line entry for every *other* failing test, and a
8
+ * de-duplicated list of further tsc errors.
8
9
  * Drops: ANSI codes, progress redraws, node_modules / node:internal /
9
10
  * bundler & test-runner internals, repeated lines and summary chatter.
11
+ *
12
+ * The budget is dynamic: it grows with the number of distinct failures and
13
+ * with `escalation` (how many times the same failure has already been seen),
14
+ * because a model that keeps hitting the same error needs more context, not
15
+ * less. Nothing is lost: the raw log stays retrievable via `logRef`.
10
16
  */
11
17
  import { existsSync, readFileSync, statSync } from 'node:fs';
12
18
  import { isAbsolute, join } from 'node:path';
13
- import { extractError, isNoiseFrame, parseFrame } from '../circuit-breaker/detector.js';
19
+ import { collectFailures, extractError, isNoiseFrame, parseFrame } from '../circuit-breaker/detector.js';
14
20
  import { stripAnsi, toProjectPath } from '../utils/normalize.js';
15
21
  import { estimateTokens } from '../utils/tokens.js';
16
22
  const TSC_LINE = /^(.+?)(?:\((\d+),(\d+)\)|:(\d+):(\d+))\s*[:-]\s*error\s+(TS\d+):\s*(.*)$/;
@@ -26,12 +32,15 @@ const NOISE_LINE = [
26
32
  /^\s*\[vite\]\s+(?:hmr|page reload|connected)/i,
27
33
  ];
28
34
  export function distillLog(raw, options = {}) {
29
- const budget = options.tokenBudget ?? 150;
30
- const contextLines = options.contextLines ?? 3;
35
+ const baseBudget = options.tokenBudget ?? 150;
36
+ const escalation = Math.max(0, Math.min(options.escalation ?? 0, 4));
31
37
  const root = options.root;
32
38
  const clean = stripAnsi(raw);
33
39
  const lines = dedupeConsecutive(clean.split('\n'));
34
40
  const originalTokens = estimateTokens(raw);
41
+ const failures = collectFailures(clean);
42
+ const contextLines = Math.min((options.contextLines ?? 3) + 2 * escalation, 10);
43
+ const budget = Math.min(Math.round((baseBudget + (options.perFailureTokens ?? 30) * Math.min(Math.max(failures.length - 1, 0), 10)) * (1 + 0.5 * escalation)), options.maxTokenBudget ?? baseBudget * 4);
35
44
  const extracted = extractError(clean);
36
45
  const hasHeadline = extracted.errorName !== 'UnknownError';
37
46
  // Frames: split project vs noise.
@@ -90,14 +99,25 @@ export function distillLog(raw, options = {}) {
90
99
  if (extracted.failingTest)
91
100
  out.push(` test: ${truncate(extracted.failingTest, 120)}`);
92
101
  out.push(...assertionDetails(lines), ...callSiteLines);
102
+ const others = failures.filter((f) => !(f.test && f.test === extracted.failingTest) && !(f.errorName === extracted.errorName && f.message === extracted.message));
103
+ if (others.length) {
104
+ out.push(` also failing (${others.length}):`);
105
+ for (const f of others) {
106
+ const err = f.errorName ? `${f.errorName}${f.message ? `: ${truncate(f.message, 90)}` : ''}` : '';
107
+ out.push(` • ${[f.test ? truncate(f.test, 80) : '', err].filter(Boolean).join(' — ')}`);
108
+ }
109
+ }
93
110
  }
94
111
  if (out.length === 0)
95
112
  out.push(...genericFallback(lines));
96
- let text = out.join('\n');
97
- text = fitBudget(text, budget);
98
- const footer = `[sentinel: distilled ${originalTokens}→${estimateTokens(text)} tokens, dropped ${droppedNoiseFrames} framework frames]`;
99
- if (estimateTokens(`${text}\n${footer}`) <= budget)
100
- text = `${text}\n${footer}`;
113
+ const footerFor = (body) => `[sentinel: ${originalTokens}→${estimateTokens(body)} tokens, ${droppedNoiseFrames} framework frames hidden` +
114
+ (failures.length > 1 ? `, ${failures.length} failures` : '') +
115
+ (escalation ? `, escalated ×${escalation}` : '') +
116
+ (options.logRef ? ` · full log: sentinel_expand_log run=${options.logRef}` : '') +
117
+ ']';
118
+ // Reserve room for the footer: it is what lets the agent get the full log back.
119
+ let text = fitBudget(out.join('\n'), Math.max(budget - estimateTokens(footerFor('')) - 4, 30));
120
+ text = `${text}\n${footerFor(text)}`;
101
121
  const distilledTokens = estimateTokens(text);
102
122
  return {
103
123
  text,
@@ -110,6 +130,8 @@ export function distillLog(raw, options = {}) {
110
130
  reduction: originalTokens > 0 ? 1 - distilledTokens / originalTokens : 0,
111
131
  originalLines: raw.split('\n').length,
112
132
  droppedNoiseFrames,
133
+ failures,
134
+ effectiveBudget: budget,
113
135
  };
114
136
  }
115
137
  function dedupeConsecutive(lines) {
@@ -192,6 +214,15 @@ function fitBudget(text, budget) {
192
214
  if (estimateTokens(text) <= budget)
193
215
  return text;
194
216
  const lines = text.split('\n');
217
+ // Collapse the tail of the "also failing" list (keep the first 3 entries).
218
+ const bullets = () => lines.map((l, i) => (l.startsWith(' • ') ? i : -1)).filter((i) => i >= 0);
219
+ let hidden = 0;
220
+ while (estimateTokens(lines.join('\n')) > budget && bullets().length > 3) {
221
+ lines.splice(bullets().pop() ?? lines.length - 1, 1);
222
+ hidden++;
223
+ }
224
+ if (hidden)
225
+ lines.splice((bullets().pop() ?? lines.length - 1) + 1, 0, ` • … ${hidden} more (see full log)`);
195
226
  // Drop snippet context lines farthest from the target first (keep the '>' line).
196
227
  while (estimateTokens(lines.join('\n')) > budget) {
197
228
  const idx = findLastIndex(lines, (l) => /^\s{4}\s\s*\d+ \|/.test(l));