UNPKG

agents

Version:

A home for your AI agents

193 lines (191 loc) • 6.23 kB
import { s as LifecycleCapability } from "./capability-runner-BiVUtjqC.js"; import { n as Streams } from "./streams-vrCtbUIn.js"; import { _ as TranscriptMessage, a as DispatchResult, b as ChannelMessageSurface, c as InboundEvent, i as ConversationSnapshot, m as ResponseChunk, n as ConversationInfo, o as EventOrigin, r as ConversationOperation, s as GatewayOrigin, y as TurnStatus } from "./protocol-CukuI73M.js"; import { i as WebSockets } from "./index-CBt8oRJt.js"; import { t as AgentHarness } from "./harness-B6B9S3rb.js"; //#region src/experimental/channels/conversations.d.ts /** * An inbound event as the gateway sends it. An approval response from a * webhook names no turn; Channels finds it from the conversation snapshot. */ type GatewayEvent = | InboundEvent | Omit< Extract< InboundEvent, { type: "approval-response"; } >, "turnId" >; /** How a response finished, as a reader sees it. */ type ResponseEnding = "ended" | "interrupted" | "not-found"; /** A change Channels pushes to every channel showing a conversation. */ type ConversationUpdate = | { type: "turn"; turn: TurnStatus; } | { type: "messages"; messages: TranscriptMessage[] /** Set when the messages arrived as an inbound event. */; origin?: EventOrigin /** The inbound event's id, set with `origin`. */; eventId?: string; } | { type: "reset"; } | { type: "response-end"; responseId: string; ending: ResponseEnding; }; type ResponseReadOptions = { from?: number; signal?: AbortSignal; onChunks( from: number, chunks: ResponseChunk[] ): void /** Everything recorded so far has been read; what follows is live. */; onCaughtUp(cursor: number): void; }; /** Durable state a channel keeps in the agent, private to that channel. */ type ChannelState = { get<T>(key: string): T | undefined; put(key: string, value: unknown): void; delete(key: string): void; }; /** What Channels gives a mounted channel. */ type ChannelsHost = { readonly channelKey: string; /** * The WebSockets this Channels' channels share: the instance Channels was * given, or else the one the first channel to ask creates. Install it with * `Lifecycle.use(channels.websockets)`. */ websockets( create: () => WebSockets ): WebSockets /** This channel's surfaces that have joined the conversation. */; surfaces(conversationId: string): Promise<ChannelMessageSurface[]>; readonly state: ChannelState; snapshot( conversationId: string ): Promise<ConversationSnapshot> /** The conversation a surface joins when it names none. */; defaultConversation(): string /** The conversation operations the agent supports. */; readonly operations: readonly ConversationOperation[] /** The agent's conversations. */; listConversations(): Promise<ConversationInfo[]>; /** * Deliver an event to the agent. Resolves once the agent accepted it and * rejects if the agent threw. */ dispatch(event: InboundEvent, origin: EventOrigin): Promise<DispatchResult>; readResponse( conversationId: string, responseId: string, options: ResponseReadOptions ): Promise<ResponseEnding>; }; /** An interface that shows conversations, such as the Web Channel. */ interface ConversationChannel { /** Called once, when Channels is constructed. Take shared dependencies here. */ mount(host: ChannelsHost): void; publish( conversationId: string, update: ConversationUpdate ): void | Promise<void>; } type ChannelsOptions = { /** * The agent: its sessions are served as conversations, a conversation's * id being its session's id. */ harness: AgentHarness /** Install it before Channels. */; streams: Streams /** Shared with channels that serve WebSockets, such as the Web Channel. */; websockets?: WebSockets; channels: Record<string, ConversationChannel>; }; type ForHarnessOptions = { channels: Record< string, ConversationChannel > /** Default: a new Streams, exposed as `channels.streams`. */; streams?: Streams /** Default: one the Web Channel creates, exposed as `channels.websockets`. */; websockets?: WebSockets; }; /** * Serves an agent harness's sessions as conversations: carries inbound * events to the harness, and responses, turn statuses and transcript * updates back to every channel showing the conversation. */ declare class Channels extends LifecycleCapability { #private; /** * Channels for any shared-interface harness, with their own Streams and * (when a channel needs them) WebSockets. Lifecycle does not install one * capability from another yet, so install them alongside: * * ```ts * readonly channels = Channels.forHarness(harness, { * channels: { web: new WebChannel() } * }); * readonly lifecycle = Lifecycle.install(this) * .use(this.harness) * .use(this.channels.streams) * .use(this.channels) * .use(this.channels.websockets); * * receive(event: GatewayEvent, origin: GatewayOrigin) { * return this.channels.receive(event, origin); * } * ``` */ static forHarness( harness: AgentHarness, options: ForHarnessOptions ): Channels; /** The responses' Streams. Install it before Channels. */ readonly streams: Streams; constructor(options: ChannelsOptions); /** * The WebSockets the channels share. Install it with Lifecycle. Throws * when no channel uses WebSockets. */ get websockets(): WebSockets; /** Mark responses left streaming by an earlier instance as interrupted. */ onStart(): Promise<void>; /** * Deliver an inbound event from the gateway, through the same path as * the agent's own channels. The agent calls this from its RPC method. */ receive( event: GatewayEvent, from: GatewayOrigin | EventOrigin ): Promise<void>; } //#endregion export { ConversationChannel as a, GatewayEvent as c, ChannelsOptions as i, ResponseEnding as l, Channels as n, ConversationUpdate as o, ChannelsHost as r, ForHarnessOptions as s, ChannelState as t, ResponseReadOptions as u }; //# sourceMappingURL=conversations-FjHDRZyD.d.ts.map