footprintjs - v11.2.0
    Preparing search index...

    Interface SerializedPipelineStructure

    interface SerializedPipelineStructure {
        branchIds?: string[];
        budgetMs?: number;
        children?: SerializedPipelineStructure[];
        convergeAt?: string;
        description?: string;
        hasDecider?: boolean;
        hasSelector?: boolean;
        icon?: string;
        id: string;
        isDynamicParallel?: boolean;
        isLazy?: boolean;
        isLoopReference?: boolean;
        isParallelChild?: boolean;
        isPausable?: boolean;
        isStreaming?: boolean;
        isSubflowRoot?: boolean;
        iterationCount?: number;
        loopTarget?: string;
        name: string;
        next?: SerializedPipelineStructure;
        parallelGroupId?: string;
        retryAttempts?: number;
        streamId?: string;
        subflowId?: string;
        subflowName?: string;
        subflowStructure?: SerializedPipelineStructure;
        tags?: readonly string[];
        timeoutMs?: number;
        touches?: string;
        type:
            | "stage"
            | "subflow"
            | "loop"
            | "decider"
            | "fork"
            | "selector"
            | "streaming";
    }
    Index
    branchIds?: string[]
    budgetMs?: number

    The chart's declared time budget (.budget(ms)), on the ROOT spec only — the most milliseconds a caller gives one run. build() refused the chart if its declared policies could already take longer. Absent when undeclared.

    convergeAt?: string

    STRUCTURE-ONLY: for a fork/selector/decider branch, the downstream stage id its convergence next edge points to, instead of the shared next-stage its siblings converge at. Set from SubflowMountOptions.convergeAt; read by _fireNextEdgeFromParent to express an unequal-depth merge (e.g. tools → call-llm, bypassing message-api). Visualization-only — runtime convergence is unchanged.

    description?: string
    hasDecider?: boolean
    hasSelector?: boolean
    icon?: string

    Semantic icon hint for visualization (e.g., "llm", "tool", "rag", "agent", "start")

    id: string
    isDynamicParallel?: boolean

    True for an addParallelForEach fan-out — one branch per item, count decided at runtime. A flag, not a type: type stays 'fork' so existing consumers keep rendering it as the fan-out it is.

    isLazy?: boolean

    True when this subflow uses lazy resolution (deferred until execution).

    isLoopReference?: boolean

    True when this node is a back-edge reference created by loopTo() — not an executable stage.

    isParallelChild?: boolean
    isPausable?: boolean

    When true, this stage can pause execution (PausableHandler pattern).

    isStreaming?: boolean
    isSubflowRoot?: boolean
    iterationCount?: number
    loopTarget?: string
    name: string
    parallelGroupId?: string
    retryAttempts?: number

    Total attempts this stage's function may run, from its declared RetryPolicy. Present only when a policy was declared — the COUNT only, because backoffMs and retryOn can be functions and a JSON-safe spec cannot carry those.

    Read it from the BUILT spec (chart.buildTimeStructure / toSpec()), not from a StructureRecorder.onStageAdded event: the .retry() modifier is chained AFTER the stage is added, so the event fires first. That is why there is no retryAttempts discriminator on the event payload — it would be undefined at fire time for exactly the stages that have a policy.

    streamId?: string
    subflowId?: string
    subflowName?: string
    subflowStructure?: SerializedPipelineStructure

    Nested pipeline structure for a subflow node. WARNING: Any future walker that traverses this field recursively must apply its own depth and cycle guards across both the next chain and this nested structure. Chart OpenAPI generation reads the builder-prepared description, not this graph.

    tags?: readonly string[]

    Declared tags (9.21.0) — the NAMES the author put on this stage at build time, copied as-is (JSON-safe, free strings; footprintjs owns no vocabulary). The Map advertises what a chart CAN produce; the commit bundle (CommitBundle.tags) records which a run DID hit. Absent when the stage declares none. Same read-it-from-the-built-spec caveat as retryAttempts: .tag() is chained AFTER onStageAdded fires.

    timeoutMs?: number

    The cap on ONE attempt of this stage, from its declared RetryPolicy (timeoutMs). Present only when declared. With retryAttempts it is what bounds the stage in time: at most retryAttempts × timeoutMs plus the waits between attempts (timeBudget). Same read-it-from-the-built-spec caveat as retryAttempts.

    touches?: string

    The outside system this stage changes (.touches(system, …), 10.1) — the NAME only; the key rule is a function and stays on the node. Present only when declared. Same read-it-from-the-built-spec caveat as retryAttempts.

    type:
        | "stage"
        | "subflow"
        | "loop"
        | "decider"
        | "fork"
        | "selector"
        | "streaming"