/** * Typed event payloads for `init({ onEvent })` and `session.stream()`. * * Fabric Harness already emits a structured event stream via the * untyped `FabricEvent` interface (see `types.ts`). This module layers * a discriminated union on top so consumers can write `if (event.type * === 'tool_start')` and have TypeScript narrow `event.data` for them. * * Subscribing: * * ```ts * import { init, type AgentEvent } from '@fabric-harness/sdk'; * * const fabric = await init({ * onEvent: (event: AgentEvent) => { * switch (event.type) { * case 'text_delta': console.log(event.data.delta); break; * case 'tool_start': console.log(`> ${event.data.toolName}`); break; * case 'compaction': console.log(`compacted ${event.data.messagesBefore} → ${event.data.messagesAfter}`); break; * case 'error': console.error(event.data.error); break; * } * }, * }); * ``` * * The same callback shape is accepted by `init()`, `agent.session()`, * and `session.prompt()`. Streaming via `session.stream()` yields these * events as an `AsyncGenerator`. */ import type { ApprovalGrant, JsonObject } from "./types.js"; /** Common envelope shared by every event variant. */ export interface AgentEventBase { /** Stable id for this event occurrence. */ id: string; /** ISO-8601 timestamp. */ timestamp: string; /** Session that emitted the event. May be a child task session. */ sessionId?: string; /** Parent session id for child tasks. */ parentSessionId?: string; /** Task id when the event came from `session.task()`. */ taskId?: string; } export type AgentEvent = (AgentEventBase & { type: "agent_start"; data?: JsonObject; }) | (AgentEventBase & { type: "session_start"; data?: { id?: string; }; }) | (AgentEventBase & { type: "prompt_start"; data?: { text?: string; }; }) | (AgentEventBase & { type: "prompt_end"; data?: { text?: string; result?: unknown; }; }) | (AgentEventBase & { type: "turn_start"; data?: JsonObject; }) | (AgentEventBase & { type: "turn_end"; data?: { stopReason?: string; }; }) | (AgentEventBase & { type: "model_attempt"; data?: JsonObject; }) | (AgentEventBase & { type: "text_delta"; data: { delta: string; kind?: "thinking" | "output"; }; }) | (AgentEventBase & { type: "toolcall_delta"; data: { toolCallId: string; toolName: string; argumentTextDelta: string; }; }) | (AgentEventBase & { type: "submission_queued"; data: { submissionId: string; kind: "dispatch" | "direct"; }; }) | (AgentEventBase & { type: "submission_running"; data: { submissionId: string; kind: "dispatch" | "direct"; attemptCount: number; maxAttempts: number; }; }) | (AgentEventBase & { type: "submission_recovery"; data: JsonObject; }) | (AgentEventBase & { type: "submission_settled"; data: { submissionId: string; outcome: "completed" | "failed" | "aborted"; }; }) | (AgentEventBase & { type: "cost_limit"; data: { scope: "call" | "session"; observedUsd: number; limitUsd: number; }; }) | (AgentEventBase & { type: "webhook_received"; data: { subscriptionId: string; eventType?: string; idempotencyKey?: string; }; }) | (AgentEventBase & { type: "tool_start"; data: { toolName: string; toolCallId?: string; args?: JsonObject; }; }) | (AgentEventBase & { type: "tool_end"; data: { toolName: string; toolCallId?: string; isError?: boolean; result?: unknown; }; }) | (AgentEventBase & { type: "command_start"; data: { command: string; cwd?: string; }; }) | (AgentEventBase & { type: "command_end"; data: { command: string; exitCode: number; durationMs?: number; }; }) | (AgentEventBase & { type: "skill_start"; data: { name: string; }; }) | (AgentEventBase & { type: "skill_end"; data: { name: string; result?: unknown; }; }) | (AgentEventBase & { type: "task_start"; data: { taskId: string; depth: number; }; }) | (AgentEventBase & { type: "task_end"; data: { taskId: string; depth: number; durationMs?: number; }; }) | (AgentEventBase & { type: "task_failed"; data: { taskId: string; error: string; }; }) | (AgentEventBase & { type: "task_cancelled"; data: { taskId: string; }; }) | (AgentEventBase & { type: "task_checkpoint"; data: { taskId: string; }; }) | (AgentEventBase & { type: "compaction"; data: { reason?: "threshold" | "overflow"; messagesBefore: number; messagesAfter: number; tokensBefore?: number; tokensAfter?: number; }; }) | (AgentEventBase & { type: "artifact_created"; data: { path: string; contentType?: string; }; }) | (AgentEventBase & { type: "checkpoint_created"; data: { id: string; }; }) | (AgentEventBase & { type: "checkpoint_restored"; data: { id: string; }; }) | (AgentEventBase & { type: "approval_requested"; data: { approvalId: string; subject: string; kind: "tool" | "command"; risk?: "low" | "medium" | "high"; }; }) | (AgentEventBase & { type: "approval_voted"; data: { approvalId: string; outcome: "approved" | "denied"; }; }) | (AgentEventBase & { type: "approval_granted"; data: { approvalId: string; grant?: ApprovalGrant; }; }) | (AgentEventBase & { type: "approval_denied"; data: { approvalId: string; }; }) | (AgentEventBase & { type: "approval_expired"; data: { approvalId: string; }; }) | (AgentEventBase & { type: "metric"; data: JsonObject; }) | (AgentEventBase & { type: "result"; data?: { usage?: JsonObject; }; }) | (AgentEventBase & { type: "result_retry"; data?: JsonObject; }) | (AgentEventBase & { type: "error"; data: { error: string; cause?: unknown; }; }); export type AgentEventType = AgentEvent["type"]; /** * Callback signature accepted by `init({ onEvent })`, * `agent.session(id, { onEvent })`, and `session.prompt(text, { onEvent })`. */ export type AgentEventCallback = (event: AgentEvent) => void | Promise; /** * Type guard: narrow an `AgentEvent` to a specific variant. * * ```ts * onEvent: (event) => { * if (isEvent(event, 'tool_start')) { * console.log(event.data.toolName); * } * } * ``` */ export declare function isEvent(event: AgentEvent, type: T): event is Extract; //# sourceMappingURL=events.d.ts.map