UNPKG

eve

Version:

Filesystem-first framework for durable backend AI agents that run anywhere.

55 lines (54 loc) • 2.97 kB
import type { DeliverPayload, HookPayload, SessionCommand } from "#channel/types.js"; import type { WorkflowToolRunMessage } from "#execution/tools/workflow/messages.js"; /** All session addresses accept the same protocol. Callback routes construct * their own message kind; they never accept arbitrary session commands. */ export interface AuthorizationCallbackPayload { readonly kind: "authorization-callback"; readonly payloads: DeliverPayload[]; } export type SessionInboxPayload = HookPayload | SessionCommand | WorkflowToolRunMessage | AuthorizationCallbackPayload; export interface SessionInboxReader { /** * Waits for and removes the next accepted payload in arrival order, or * `undefined` once every hook is released. Only one consumer waits at a * time; the owner program is strictly sequential. */ next(): Promise<SessionInboxPayload | undefined>; /** Removes every payload accepted so far, in arrival order. */ drain(): SessionInboxPayload[]; hasPending(): boolean; /** * Called from the pump the moment an interrupt (`cancel`, `reset`, * `session-timeout`) is accepted, ahead of any consumer read. Handlers must * be synchronous and idempotent. The payload stays in the queue so the * consumer still processes it in order. */ onInterrupt(handler: (payload: SessionInboxPayload) => void): () => void; /** Observes deliveries without consuming them; replays unread deliveries on subscription. */ onDelivery(handler: (payload: SessionInboxPayload) => void): () => void; restore(payloads: readonly SessionInboxPayload[]): void; } export interface SessionInboxOwnership { /** Logical tokens currently claimed, in claim order. */ readonly claimedTokens: readonly string[]; claimSessionHook(token: string): Promise<void>; /** Registers every token as one batch; all claims settle before the first failure propagates. */ claimSessionHooks(tokens: readonly string[]): Promise<void>; } export interface SessionInbox extends SessionInboxReader, SessionInboxOwnership { } export interface SessionInboxHandle extends SessionInbox { dispose(): Promise<void>; /** Disposes every hook and returns each payload the hooks accepted but the owner never read. */ release(): Promise<SessionInboxPayload[]>; } export declare function isInterrupt(value: SessionInboxPayload): boolean; /** * One FIFO queue for the session lifetime, fed by a continuous reader per * claimed hook. The pump never waits on queue depth: interrupts share each * hook's ordered stream, so any backpressure on ordinary payloads would also * hold back the cancel behind them. Accepted payloads are already durable on * the hook, so the queue is a mirror rather than the source of truth. */ export declare function createSessionInbox(sessionId: string): SessionInboxHandle; export declare function isWorkflowMessage(value: SessionInboxPayload): value is WorkflowToolRunMessage;