import type { AgentId, FrameId, StepId, TaskId, TurnId, } from '../model/ids'; import type { TranscriptAttachment } from '../model/attachment'; import type { TranscriptFrame } from '../model/frame'; import type { TranscriptInteraction } from '../model/interaction'; import type { TranscriptItem, TranscriptMarker, TranscriptTaskRef } from '../model/item'; import type { TranscriptMeta, TranscriptMetaMerge } from '../model/meta'; import type { TranscriptPrompt } from '../model/prompt'; import type { TranscriptTask } from '../model/task'; import type { TranscriptTodo } from '../model/todo'; import type { TranscriptStep, TranscriptTurn } from '../model/turn'; export type TurnHeader = Omit; export type StepHeader = Omit; export interface ResetOp { readonly op: 'reset'; readonly agentId: AgentId; readonly snapshot: AgentTranscriptSnapshot; } export interface TurnUpsertOp { readonly op: 'turn.upsert'; readonly turn: TurnHeader; } export interface StepUpsertOp { readonly op: 'step.upsert'; readonly turnId: TurnId; readonly step: StepHeader; } export interface FrameUpsertOp { readonly op: 'frame.upsert'; readonly turnId: TurnId; readonly stepId: StepId; readonly frame: TranscriptFrame; } export type AppendTarget = | { readonly type: 'frame'; readonly turnId: TurnId; readonly stepId: StepId; readonly frameId: FrameId } | { readonly type: 'task'; readonly taskId: TaskId }; export interface AppendOp { readonly op: 'append'; readonly target: AppendTarget; readonly offset: number; readonly text: string; } export interface MarkerUpsertOp { readonly op: 'marker.upsert'; readonly item: TranscriptMarker; readonly beforeTurn?: number; } export interface TaskRefUpsertOp { readonly op: 'taskref.upsert'; readonly item: TranscriptTaskRef; readonly beforeTurn?: number; } export interface TaskUpsertOp { readonly op: 'task.upsert'; readonly task: TranscriptTask; } export interface InteractionUpsertOp { readonly op: 'interaction.upsert'; readonly interaction: TranscriptInteraction; } export interface AttachmentUpsertOp { readonly op: 'attachment.upsert'; readonly attachment: TranscriptAttachment; } export interface TodoUpsertOp { readonly op: 'todo.upsert'; readonly todo: TranscriptTodo; } export interface PromptUpsertOp { readonly op: 'prompt.upsert'; readonly prompt: TranscriptPrompt; } export interface MetaMergeOp { readonly op: 'meta.merge'; readonly meta: TranscriptMetaMerge; } export interface ItemsRemoveOp { readonly op: 'items.remove'; readonly ids: readonly string[]; } export type TranscriptOperation = | ResetOp | TurnUpsertOp | StepUpsertOp | FrameUpsertOp | AppendOp | MarkerUpsertOp | TaskRefUpsertOp | TaskUpsertOp | InteractionUpsertOp | AttachmentUpsertOp | TodoUpsertOp | PromptUpsertOp | MetaMergeOp | ItemsRemoveOp; export interface TranscriptOpBatch { readonly agentId: AgentId; readonly ops: readonly TranscriptOperation[]; } export interface AgentTranscriptSnapshot { readonly items: readonly TranscriptItem[]; readonly tasks: readonly TranscriptTask[]; readonly interactions: readonly TranscriptInteraction[]; readonly attachments: readonly TranscriptAttachment[]; readonly todos: readonly TranscriptTodo[]; readonly prompts: readonly TranscriptPrompt[]; readonly meta: TranscriptMeta; readonly hasMoreOlder?: boolean; } export interface AppliedOps { readonly accepted: readonly TranscriptOperation[]; readonly gap?: { readonly target: AppendTarget; readonly expected: number; readonly got: number }; } export interface TranscriptChangeEvent { readonly agentId: AgentId; readonly ops: readonly TranscriptOperation[]; }