diff options
| author | Adam Malczewski <[email protected]> | 2026-06-12 00:43:55 +0900 |
|---|---|---|
| committer | Adam Malczewski <[email protected]> | 2026-06-12 00:43:55 +0900 |
| commit | e2646ad2b0c28bd64ad4efd6b154f97f8a35e0ad (patch) | |
| tree | 0f739576bbabf19ebb0e254776188b0950c4f489 /packages/kernel/src/runtime/events.ts | |
| parent | e7eada4802ceebd86c83bcd6e3eca70152e7f331 (diff) | |
| download | dispatch-e2646ad2b0c28bd64ad4efd6b154f97f8a35e0ad.tar.gz dispatch-e2646ad2b0c28bd64ad4efd6b154f97f8a35e0ad.zip | |
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.
Diffstat (limited to 'packages/kernel/src/runtime/events.ts')
| -rw-r--r-- | packages/kernel/src/runtime/events.ts | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/packages/kernel/src/runtime/events.ts b/packages/kernel/src/runtime/events.ts index 300e711..b194577 100644 --- a/packages/kernel/src/runtime/events.ts +++ b/packages/kernel/src/runtime/events.ts @@ -127,16 +127,29 @@ export function doneEvent( reason: string, durationMs?: number, usage?: Usage, + contextSize?: number, ): AgentEvent { + if (durationMs !== undefined && usage !== undefined && contextSize !== undefined) { + return { type: "done", conversationId, turnId, reason, durationMs, usage, contextSize }; + } if (durationMs !== undefined && usage !== undefined) { return { type: "done", conversationId, turnId, reason, durationMs, usage }; } + if (durationMs !== undefined && contextSize !== undefined) { + return { type: "done", conversationId, turnId, reason, durationMs, contextSize }; + } + if (usage !== undefined && contextSize !== undefined) { + return { type: "done", conversationId, turnId, reason, usage, contextSize }; + } if (durationMs !== undefined) { return { type: "done", conversationId, turnId, reason, durationMs }; } if (usage !== undefined) { return { type: "done", conversationId, turnId, reason, usage }; } + if (contextSize !== undefined) { + return { type: "done", conversationId, turnId, reason, contextSize }; + } return { type: "done", conversationId, turnId, reason }; } |
