/**
 * Workflow data envelope (spec: workflow-dataflow-and-triggers-spec.md §A2).
 *
 * Control/data separation: DagScheduler manages control (ready/skip/loop/ports) and
 * never touches these values. The runtime data-routing layer carries DataItem[] along
 * data edges; NodeExecutors consume/produce them.
 *
 * Media travels by-ref (BinaryRef → content-addressed blob store), keeping the envelope
 * small and hash-cacheable.
 */
/** A content-addressed reference to a large binary (image/video/audio), never inlined into json. */
export interface BinaryRef {
    /** Pointer into the engine-managed blob store; content-addressed hash. */
    ref: string;
    mimeType: string;
    size: number;
    fileName?: string;
    meta?: Record<string, unknown>;
}
/** A single unit of data flowing through a port. Most nodes emit one item per port. */
export interface DataItem {
    /** Structured data — what expressions reference. */
    json: Record<string, unknown>;
    /** Large binaries by reference; kept out of json. */
    binary?: Record<string, BinaryRef>;
}
/** Per-port payload: every port carries an array of items (supports fan-out / batching). */
export type PortMap = Record<string, DataItem[]>;
/** Convenience: wrap a plain object into a single-item DataItem. */
export declare function item(json: Record<string, unknown>, binary?: Record<string, BinaryRef>): DataItem;
/** Convenience: a single-item port map on the given port (default "default"). */
export declare function singlePort(json: Record<string, unknown>, port?: string): PortMap;
/**
 * Stable content signature of a port map, for the run-from-node cache key (§A5).
 * Binary participates via its content-addressed ref (not its bytes).
 */
export declare function signaturePortMap(ports: PortMap): string;
/** Deterministic JSON stringify with sorted object keys (arrays keep order). */
export declare function stableStringify(value: unknown): string;
