pi-mono/packages/coding-agent/src/modes/json-event.ts
Christian Klotz a4475344fb
fix(coding-agent): make JSON streaming output linear (#7394)
Fixes #7290

Co-authored-by: Mario Zechner <badlogicgames@gmail.com>
2026-08-03 18:33:22 +02:00

40 lines
1.5 KiB
TypeScript

import type { AgentSessionEvent } from "../core/agent-session.ts";
type WithoutPartial<T> = T extends { partial: unknown } ? Omit<T, "partial"> : T;
type ToJsonEvent<T> = T extends {
type: "message_update";
assistantMessageEvent: infer TAssistantMessageEvent;
}
? {
type: "message_update";
assistantMessageEvent: WithoutPartial<TAssistantMessageEvent>;
}
: T;
/** Session event shape emitted by the JSON and RPC stdout protocols. */
export type JsonAgentSessionEvent = ToJsonEvent<AgentSessionEvent>;
type MessageUpdateEvent = Extract<AgentSessionEvent, { type: "message_update" }>;
type JsonMessageUpdateEvent = Extract<JsonAgentSessionEvent, { type: "message_update" }>;
/**
* Remove cumulative assistant snapshots from streaming wire events.
* `message_start` provides the initial message, deltas build it, and
* `message_end` provides the final authoritative message.
*/
export function toJsonEvent(event: MessageUpdateEvent): JsonMessageUpdateEvent;
export function toJsonEvent(event: AgentSessionEvent): JsonAgentSessionEvent;
export function toJsonEvent(event: AgentSessionEvent): JsonAgentSessionEvent {
if (event.type !== "message_update") {
return event;
}
const assistantMessageEvent = event.assistantMessageEvent;
if (!("partial" in assistantMessageEvent)) {
return { type: "message_update", assistantMessageEvent };
}
const { partial: _partial, ...deltaEvent } = assistantMessageEvent;
return { type: "message_update", assistantMessageEvent: deltaEvent };
}