Skip to content

Commit 8ca9ac3

Browse files
committed
fix(status): preserve legacy context totals
1 parent ef587e3 commit 8ca9ac3

2 files changed

Lines changed: 33 additions & 5 deletions

File tree

src/auto-reply/status.test.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,30 @@ describe("buildStatusMessage", () => {
222222
expect(normalized).not.toContain("Context: 3.8m/1.0m");
223223
});
224224

225+
it("preserves legacy unknown-freshness totalTokens as context usage", () => {
226+
const text = buildStatusMessage({
227+
agent: {
228+
model: "anthropic/test:opus",
229+
contextTokens: 1_000_000,
230+
},
231+
sessionEntry: {
232+
sessionId: "abc",
233+
updatedAt: 0,
234+
totalTokens: 25_000,
235+
contextTokens: 1_000_000,
236+
},
237+
sessionKey: "agent:main:main",
238+
sessionScope: "per-sender",
239+
queue: { mode: "collect", depth: 0 },
240+
modelAuth: "api-key",
241+
now: 10 * 60_000,
242+
});
243+
const normalized = normalizeTestText(text);
244+
245+
expect(normalized).toContain("Context: 25k/1.0m");
246+
expect(normalized).not.toContain("Context: ?/1.0m");
247+
});
248+
225249
it("uses estimated context budget status when fresh totalTokens are unavailable", () => {
226250
const text = buildStatusMessage({
227251
agent: {

src/status/status-message.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -632,13 +632,14 @@ export function buildStatusMessage(args: StatusArgs): string {
632632
let outputTokens = entry?.outputTokens;
633633
let cacheRead = entry?.cacheRead;
634634
let cacheWrite = entry?.cacheWrite;
635-
const freshTotalTokens =
636-
entry?.totalTokensFresh === true ? resolveFreshSessionTotalTokens(entry) : undefined;
635+
const freshTotalTokens = resolveFreshSessionTotalTokens(entry);
636+
// Undefined freshness is legacy, not stale: keep persisted totals for /status,
637+
// but let a fresh transcript prompt snapshot replace them when available.
637638
const allowTranscriptContextUsage = entry?.totalTokensFresh !== false;
638639
let totalTokens = freshTotalTokens;
639640

640-
// Context percentages need a fresh prompt snapshot; cumulative session/cache
641-
// usage can still hydrate Tokens/Cache lines but must not become Context.
641+
// Explicitly stale session/cache usage can still hydrate Tokens/Cache lines
642+
// but must not become Context.
642643
if (args.includeTranscriptUsage) {
643644
const logUsage = readUsageFromSessionLog(
644645
entry?.sessionId,
@@ -655,7 +656,10 @@ export function buildStatusMessage(args: StatusArgs): string {
655656
allowTranscriptContextUsage &&
656657
candidate !== undefined &&
657658
candidate > 0 &&
658-
(!totalTokens || totalTokens === 0 || candidate > totalTokens)
659+
(entry?.totalTokensFresh !== true ||
660+
!totalTokens ||
661+
totalTokens === 0 ||
662+
candidate > totalTokens)
659663
) {
660664
totalTokens = candidate;
661665
}

0 commit comments

Comments
 (0)