From e2646ad2b0c28bd64ad4efd6b154f97f8a35e0ad Mon Sep 17 00:00:00 2001 From: Adam Malczewski Date: Fri, 12 Jun 2026 00:43:55 +0900 Subject: feat(metrics): expose current context size to the frontend contextSize = the turn's FINAL step inputTokens+outputTokens (true context occupancy; NOT the aggregate usage, which sums per-step prompts and overcounts multi-step turns). Stamped on both the live done event (kernel) and persisted TurnMetrics (session-orchestrator); a client reads the latest turn's value. - @dispatch/wire 0.4.0->0.5.0: optional contextSize on TurnDoneEvent + TurnMetrics - @dispatch/transport-contract 0.5.0->0.6.0 (re-export only) - glossary: context size (reserve 'context window' for the model limit, later) - FE courier: frontend-context-size-handoff.md 881 vitest pass; tsc -b EXIT 0; biome clean. --- packages/kernel/src/runtime/run-turn.ts | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'packages/kernel/src/runtime/run-turn.ts') diff --git a/packages/kernel/src/runtime/run-turn.ts b/packages/kernel/src/runtime/run-turn.ts index b50e8ee..bf57854 100644 --- a/packages/kernel/src/runtime/run-turn.ts +++ b/packages/kernel/src/runtime/run-turn.ts @@ -449,6 +449,7 @@ export async function runTurn(input: RunTurnInput): Promise { const messages: ChatMessage[] = [...input.messages]; const resultMessages: ChatMessage[] = []; let totalUsage = zeroUsage(); + let lastStepUsage: Usage | undefined; let finishReason = "stop"; const toolMap = new Map(); @@ -513,6 +514,7 @@ export async function runTurn(input: RunTurnInput): Promise { }); totalUsage = addUsage(totalUsage, stepResult.usage); + lastStepUsage = stepResult.usage; if (stepResult.assistantMessage !== undefined) { messages.push(stepResult.assistantMessage); @@ -571,6 +573,10 @@ export async function runTurn(input: RunTurnInput): Promise { totalUsage.outputTokens > 0 || totalUsage.cacheReadTokens !== undefined || totalUsage.cacheWriteTokens !== undefined; + const contextSize = + hasUsage && lastStepUsage !== undefined + ? lastStepUsage.inputTokens + lastStepUsage.outputTokens + : undefined; input.emit( doneEvent( conversationId, @@ -578,6 +584,7 @@ export async function runTurn(input: RunTurnInput): Promise { finishReason, turnDurationMs, hasUsage ? totalUsage : undefined, + contextSize, ), ); -- cgit v1.2.3