From 4a8a841f7266d75d9542524e0f6c8a504693982e Mon Sep 17 00:00:00 2001 From: Mohamed Boudra Date: Thu, 2 Jul 2026 08:37:37 +0200 Subject: [PATCH] Report context window usage for Paseo Agent toAgentUsage dropped SessionStats.contextUsage, leaving the context-window indicator blank on every Paseo Agent session. Mirror the Pi provider's mapping into contextWindowMaxTokens/contextWindowUsedTokens. --- .../agent/providers/paseo-agent/agent.test.ts | 10 +++++++++- .../providers/paseo-agent/event-mapping.ts | 20 +++++++++++++++++-- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/packages/server/src/server/agent/providers/paseo-agent/agent.test.ts b/packages/server/src/server/agent/providers/paseo-agent/agent.test.ts index a9a636166b..5e966258c4 100644 --- a/packages/server/src/server/agent/providers/paseo-agent/agent.test.ts +++ b/packages/server/src/server/agent/providers/paseo-agent/agent.test.ts @@ -108,6 +108,7 @@ class FakeInProcessPiSession { totalMessages: 2, tokens: { input: 3, output: 5, cacheRead: 2, cacheWrite: 0, total: 10 }, cost: 0.01, + contextUsage: { contextWindow: 200000, tokens: 1234, percentage: 0.6 }, }; } @@ -452,7 +453,14 @@ describe("PaseoAgentSession runtime events", () => { await expect(resultPromise).resolves.toEqual({ sessionId: "pi-session-1", finalText: "done", - usage: { inputTokens: 3, cachedInputTokens: 2, outputTokens: 5, totalCostUsd: 0.01 }, + usage: { + inputTokens: 3, + cachedInputTokens: 2, + outputTokens: 5, + totalCostUsd: 0.01, + contextWindowMaxTokens: 200000, + contextWindowUsedTokens: 1234, + }, timeline: [ { type: "reasoning", text: "thinking" }, { diff --git a/packages/server/src/server/agent/providers/paseo-agent/event-mapping.ts b/packages/server/src/server/agent/providers/paseo-agent/event-mapping.ts index 5e308f7646..281f11dff8 100644 --- a/packages/server/src/server/agent/providers/paseo-agent/event-mapping.ts +++ b/packages/server/src/server/agent/providers/paseo-agent/event-mapping.ts @@ -327,10 +327,26 @@ export function toAgentUsage(stats: SessionStats): AgentUsage | undefined { const cachedInputTokens = stats.tokens.cacheRead; const outputTokens = stats.tokens.output; const totalCostUsd = stats.cost; - if (inputTokens === 0 && cachedInputTokens === 0 && outputTokens === 0 && totalCostUsd === 0) { + const contextWindowMaxTokens = stats.contextUsage?.contextWindow ?? undefined; + const contextWindowUsedTokens = stats.contextUsage?.tokens ?? undefined; + if ( + inputTokens === 0 && + cachedInputTokens === 0 && + outputTokens === 0 && + totalCostUsd === 0 && + contextWindowMaxTokens === undefined && + contextWindowUsedTokens === undefined + ) { return undefined; } - return { inputTokens, cachedInputTokens, outputTokens, totalCostUsd }; + return { + inputTokens, + cachedInputTokens, + outputTokens, + totalCostUsd, + ...(typeof contextWindowMaxTokens === "number" ? { contextWindowMaxTokens } : {}), + ...(typeof contextWindowUsedTokens === "number" ? { contextWindowUsedTokens } : {}), + }; } const PiTextContentSchema = z.object({ type: z.literal("text"), text: z.string() });