Skip to content

withReplay ​

Skips step execution for all steps before a given index. Use together with withCheckpoint to resume a flow from the last saved state after a crash or interruption.

Setup ​

typescript
import { FlowBuilder } from "flowneer";
import { withReplay } from "flowneer/plugins/persistence";

const AppFlow = FlowBuilder.extend([withCheckpoint, withReplay]);

Usage ​

typescript
// Normal run — save checkpoints
const checkpoints = new Map<number, State>();
const flow = new AppFlow<State>()
  .withCheckpoint({ save: (i, s) => checkpoints.set(i, structuredClone(s)) })
  .startWith(stepA)
  .then(stepB)
  .then(stepC) // crashes here
  .then(stepD);

try {
  await flow.run(initialState);
} catch {
  // Resume from last checkpoint
  const lastSaved = Math.max(...checkpoints.keys());
  const savedState = checkpoints.get(lastSaved)!;

  // Skip steps 0..lastSaved, resume from lastSaved + 1
  flow.withReplay(lastSaved + 1);
  await flow.run(savedState);
}

How It Works ​

Registers a wrapStep hook that skips (does not call next()) for any step whose index is less than fromStep. Steps at fromStep and above execute normally.

beforeStep and afterStep hooks still fire for skipped steps — only the body is skipped.

API ​

.withReplay(fromStep: number) ​

ParameterTypeDescription
fromStepnumberThe first step index that should actually execute

Combining with humanNode / interruptIf ​

typescript
import { resumeFlow } from "flowneer/plugins/agent";

// resumeFlow automatically applies withReplay internally:
await resumeFlow(flow, savedState, { approved: true }, interruptedAtStep);

See resumeFlow for a complete human-in-the-loop example.