Flow Studio
Store State Shape
designerModeStore holds five top-level fields: currentMode, executionId, nodeStatuses, runProgress, and isReadonly. Each field drives specific canvas behaviors and UI rendering decisions.
State Fields
| Field | Type | Purpose |
|---|---|---|
currentMode | CanvasMode | "design" | "execution" | "readonly" |
executionId | string | null | Active execution being observed (null in design mode) |
nodeStatuses | Record<string, NodeExecutionStatus> | Per-node execution status map (keyed by nodeId) |
runProgress | RunProgress | totalNodes, completedNodes, failedNodes, progressPct |
isReadonly | boolean | True when currentMode is "execution" or "readonly" |
NodeExecutionStatus Type
// executionMode.types.ts
export interface NodeExecutionStatus {
nodeId : string;
status : 'pending' | 'running' | 'success' | 'failed' | 'skipped' | 'suspended';
startedAt : DateTimeOffset | null;
completedAt : DateTimeOffset | null;
durationMs : number | null;
errorMessage : string | null;
retryCount : number;
}
RunProgress Type
export interface RunProgress {
totalNodes : number; // Total nodes in the workflow graph
completedNodes : number; // Nodes that have reached success or failed
failedNodes : number; // Nodes that failed
progressPct : number; // Computed: completedNodes / totalNodes * 100
}
Example State Snapshot (Execution Mode)
{
"currentMode" : "execution",
"executionId" : "exec-abc-123",
"isReadonly" : true,
"runProgress" : { "totalNodes": 5, "completedNodes": 3, "failedNodes": 0, "progressPct": 60 },
"nodeStatuses": {
"node-trigger" : { "status": "success", "durationMs": 12 },
"node-approval" : { "status": "suspended", "durationMs": null },
"node-email" : { "status": "pending", "durationMs": null }
}
}
isReadonly is derived: It is
true whenever currentMode is "execution" or "readonly". Components read isReadonly directly rather than checking the mode string — this ensures they respond correctly to both modes that disable editing.