Flow Studio
Node Statuses in Execution Mode
The nodeStatuses map in designerModeStore is keyed by nodeId and holds the execution status of each node. It is populated by SignalR events during a live run and by the execution history API for past runs.
Status Values
| Status | Badge Color | Meaning |
|---|---|---|
pending | Grey | Node has not yet started |
running | Blue (animated) | Node is currently executing |
success | Green | Node completed successfully |
failed | Red | Node threw an error or returned a failure result |
skipped | Yellow | Node was bypassed (e.g., condition not met) |
suspended | Purple (pulsing) | Node is paused waiting for human input (HIL) |
setNodeStatus Action
setNodeStatus: (nodeId: string, status: NodeExecutionStatus) => void
// Called by the SignalR handler when a NodeStatusChanged event arrives
// Also called in bulk when loading a historical run
useDesignerModeStore.getState().setNodeStatus('node-approval', {
nodeId : 'node-approval',
status : 'suspended',
startedAt : '2026-05-25T09:00:00Z',
completedAt : null,
durationMs : null,
errorMessage: null,
retryCount : 0
});
Live Run — SignalR Wiring
// useExecutionSignalR.ts
connection.on("NodeStatusChanged", (event: NodeStatusChangedEvent) => {
useDesignerModeStore.getState().setNodeStatus(event.nodeId, {
nodeId : event.nodeId,
status : event.status,
startedAt : event.startedAt,
completedAt : event.completedAt,
durationMs : event.durationMs,
errorMessage: event.errorMessage,
retryCount : event.retryCount
});
// Also sync to executionStore so the Observer Panel sees the same data
useExecutionStore.getState().setNodeStatus(event.nodeId, event);
});
Historical Run — Bulk Load
// When loading a past execution for review:
// GET /api/executions/{executionId}/node-statuses
// Returns: NodeExecutionStatus[]
const statuses = await executionApiClient.getNodeStatuses(executionId);
statuses.forEach(s =>
useDesignerModeStore.getState().setNodeStatus(s.nodeId, s)
);
Dual-write on live runs: Every SignalR NodeStatusChanged event writes to BOTH
designerModeStore.nodeStatuses (for canvas overlays) and executionStore.nodeStatuses (for the Observer Panel). They are always kept in sync by the useExecutionSignalR hook.