Skip to main content

Run.timeTravelStream()

The .timeTravelStream() method re-executes a workflow starting from any specific step with streaming events. This allows you to receive real-time updates during time travel execution while maintaining full visibility into each step's progress.

Usage exampleDirect link to Usage example

const run = await workflow.createRunAsync();

const output = run.timeTravelStream({
step: "step2",
inputData: { value: 10 },
});

// Process events as they arrive
for await (const event of output.fullStream) {
console.log(event.type, event.payload);
}

// Get the final result
const result = await output.result;

ParametersDirect link to Parameters

All parameters are the same as Run.timeTravel(). See the timeTravel reference for detailed parameter documentation.

ReturnsDirect link to Returns

output:

WorkflowRunOutput<WorkflowResult<TState, TInput, TOutput, TSteps>>
An object containing both the stream and result promise

output.fullStream:

ReadableStream<WorkflowStreamEvent>
A readable stream that emits workflow events as execution progresses

output.result:

Promise<WorkflowResult<TState, TInput, TOutput, TSteps>>
A promise that resolves to the final workflow execution result

output.traceId?:

string
The trace ID associated with this execution when Tracing is enabled

Stream eventsDirect link to Stream events

The stream emits various workflow events during execution:

  • workflow-step-start: Emitted when a step begins execution
  • workflow-step-finish: Emitted when a step completes successfully
  • workflow-step-error: Emitted when a step encounters an error
  • workflow-step-suspended: Emitted when a step suspends
  • Additional events depending on step types (agents, tools, etc.)

Extended usage examplesDirect link to Extended usage examples

Processing events during time travelDirect link to Processing events during time travel

const run = await workflow.createRunAsync();

const output = run.timeTravelStream({
step: "step2",
inputData: { value: 10 },
});

for await (const event of output.fullStream) {
switch (event.type) {
case "workflow-step-start":
console.log(`Starting step: ${event.payload.stepName}`);
break;
case "workflow-step-finish":
console.log(`Completed step: ${event.payload.stepName}`);
break;
case "workflow-step-error":
console.error(`Error in step: ${event.payload.stepName}`, event.payload.error);
break;
}
}

const result = await output.result;
console.log("Time travel completed:", result);

Time travel stream with contextDirect link to Time travel stream with context

const output = run.timeTravelStream({
step: "step2",
context: {
step1: {
status: "success",
payload: { value: 0 },
output: { step1Result: 2 },
startedAt: Date.now(),
endedAt: Date.now(),
},
},
});

for await (const event of output.fullStream) {
// Handle events
console.log(event);
}

const result = await output.result;

Time travel stream with nested workflowsDirect link to Time travel stream with nested workflows

const output = run.timeTravelStream({
step: ["nestedWorkflow", "step3"],
inputData: { value: 10 },
nestedStepsContext: {
nestedWorkflow: {
step2: {
status: "success",
payload: { step1Result: 2 },
output: { step2Result: 3 },
startedAt: Date.now(),
endedAt: Date.now(),
},
},
},
});

for await (const event of output.fullStream) {
console.log(event.type, event.payload);
}

const result = await output.result;

NotesDirect link to Notes

  • The stream closes automatically when time travel execution completes or encounters an error
  • You can process events from the stream while the workflow is still executing
  • The result promise resolves only after all steps have completed
  • Stream events follow the same format as regular workflow streaming
  • Time travel streaming requires storage to be configured since it relies on persisted workflow snapshots