eve
Version:
Filesystem-first framework for durable backend AI agents that run anywhere.
55 lines • 2.6 kB
TypeScript
import type { Span } from '#compiled/@opentelemetry/api/index.js';
import { type WorkflowRun, type World } from '#compiled/@workflow/world/index.js';
import type { StepInvocationQueueItem, WorkflowSuspension } from '../global.js';
export interface SuspensionHandlerParams {
suspension: WorkflowSuspension;
world: World;
run: WorkflowRun;
span?: Span;
requestId?: string;
}
/**
* Result of handling a suspension. Returns pending step items so the caller
* can decide which to execute inline vs queue to background.
*/
export interface SuspensionHandlerResult {
/** Pending step items with events created but NOT queued */
pendingSteps: StepInvocationQueueItem[];
/**
* Correlation IDs for which this suspension call actually wrote the
* step_created event (as opposed to catching EntityConflictError because
* a concurrent handler wrote it first). Only the handler that wrote the
* step_created event should queue / inline-execute the step — this
* guarantees a single owner per step, even when multiple handlers race
* into the same batch boundary.
*/
createdStepCorrelationIds: Set<string>;
/**
* The soonest pending wait, if any: seconds until it elapses and the
* correlationId of the wait that produced that timeout. The
* correlationId seeds the idempotency key for the wait-continuation
* queue message so that repeated suspension passes over the same
* pending wait collapse into a single delayed continuation.
*/
waitTimeout?: {
seconds: number;
correlationId: string;
};
/** Whether a hook conflict was detected (should re-invoke immediately) */
hasHookConflict: boolean;
/** Whether a `hook.getConflict()` awaiter needs the workflow to continue immediately */
hasAwaitedHookCreation: boolean;
/** Whether native workflow attribute events were written for replay. */
hasAttributeEvents: boolean;
}
/**
* Handles a workflow suspension by processing all pending operations (hooks, steps, waits).
* Creates events for all operations but does NOT queue step messages — returns the pending
* steps so the caller can decide which to execute inline vs queue to background.
*
* Processing order:
* 1. Hooks are processed first to prevent race conditions with webhook receivers
* 2. Step events and wait events are created in parallel
*/
export declare function handleSuspension({ suspension, world, run, span, requestId, }: SuspensionHandlerParams): Promise<SuspensionHandlerResult>;
//# sourceMappingURL=suspension-handler.d.ts.map