From 7c459c7d919d1e08a228e8abc56129be174d8abe Mon Sep 17 00:00:00 2001 From: Adam Malczewski Date: Sun, 7 Jun 2026 17:46:53 +0900 Subject: feat(wire,kernel,session-orchestrator): live turn metrics on the stream Expose the backend's authoritative token+timing metrics on the live AgentEvent stream (observability-only -> now also client-facing). All additive/optional. - wire@0.3.0: new TurnStepCompleteEvent (type:step-complete) with per-step ttftMs/decodeMs/genTotalMs; usage += stepId; tool-result += durationMs (exec); done += durationMs (turn wall-clock) + usage (turn total). RunTurnInput += now?. transport-contract@0.3.0 (re-export bump). - kernel-runtime: when now injected, measures + emits the above (reuses the ttft/decode first-token detection); omits timing gracefully without a clock. - session-orchestrator: adds now? to deps, threads into RunTurnInput; extension activate injects () => Date.now(). - transport/cli/host-bin: untouched (verbatim pass-through; additive fields). FE handoff: frontend-metrics-handoff.md. typecheck clean; 520 vitest + 89 bun; biome 0/0. Replay/persistence = deferred Pass 2 (documented in tasks.md). --- packages/kernel/src/contracts/events.ts | 1 + packages/kernel/src/contracts/index.ts | 1 + packages/kernel/src/contracts/runtime.ts | 10 ++++++++++ 3 files changed, 12 insertions(+) (limited to 'packages/kernel/src/contracts') diff --git a/packages/kernel/src/contracts/events.ts b/packages/kernel/src/contracts/events.ts index 8737b02..be09066 100644 --- a/packages/kernel/src/contracts/events.ts +++ b/packages/kernel/src/contracts/events.ts @@ -13,6 +13,7 @@ export type { TurnReasoningDeltaEvent, TurnSealedEvent, TurnStartEvent, + TurnStepCompleteEvent, TurnTextDeltaEvent, TurnToolCallEvent, TurnToolOutputEvent, diff --git a/packages/kernel/src/contracts/index.ts b/packages/kernel/src/contracts/index.ts index 1698486..38f1442 100644 --- a/packages/kernel/src/contracts/index.ts +++ b/packages/kernel/src/contracts/index.ts @@ -35,6 +35,7 @@ export type { TurnReasoningDeltaEvent, TurnSealedEvent, TurnStartEvent, + TurnStepCompleteEvent, TurnTextDeltaEvent, TurnToolCallEvent, TurnToolOutputEvent, diff --git a/packages/kernel/src/contracts/runtime.ts b/packages/kernel/src/contracts/runtime.ts index 8917709..b7fe23c 100644 --- a/packages/kernel/src/contracts/runtime.ts +++ b/packages/kernel/src/contracts/runtime.ts @@ -90,6 +90,16 @@ export interface RunTurnInput { * emitted (backward-compatible with callers that don't yet pass a logger). */ readonly logger?: Logger; + + /** + * Optional monotonic-ish clock (milliseconds) for emitting wall-clock timing + * on outward events: per-step `step-complete` (ttft/decode/genTotal), tool + * execution `durationMs` on `tool-result`, and turn `durationMs` on `done`. + * Injected (not ambient) so the runtime stays pure and deterministic in tests. + * If omitted, the runtime emits no such timing (the optional fields stay + * absent) — backward-compatible with callers that don't provide a clock. + */ + readonly now?: () => number; } /** -- cgit v1.2.3