import { type PersistedStreamEventEnvelope, parsePersistedStreamEventEnvelope, type SessionStreamEvent, } from './contract' type CreateEventBase = { chatId?: string cursor: string requestId: string seq: number streamId: string ts?: string } type CreateEventVariant = CreateEventBase & Pick export type CreateEventInput = SessionStreamEvent extends infer TEvent ? TEvent extends SessionStreamEvent ? CreateEventVariant : never : never type CreateEventResult = Extract< PersistedStreamEventEnvelope, { type: TInput['type']; payload: TInput['payload'] } > type StreamEventFromEnvelope = Extract< SessionStreamEvent, { type: TEnvelope['type']; payload: TEnvelope['payload'] } > export const TOOL_CALL_STATUS = { generating: 'generating', } as const export function createEvent( input: TInput ): CreateEventResult { const { streamId, chatId, cursor, seq, requestId, type, payload, scope, ts } = input return { v: 1, type, seq, ts: ts ?? new Date().toISOString(), stream: { streamId, ...(chatId ? { chatId } : {}), cursor, }, trace: { requestId, }, ...(scope ? { scope } : {}), payload, } as CreateEventResult } export function isEventRecord(value: unknown): value is PersistedStreamEventEnvelope { return parsePersistedStreamEventEnvelope(value).ok } export function eventToStreamEvent( envelope: TEnvelope ): StreamEventFromEnvelope { return { type: envelope.type, payload: envelope.payload, ...(envelope.scope ? { scope: envelope.scope } : {}), } as StreamEventFromEnvelope }