+ Custom workflows now start from a family-safe starter graph instead of a mixed free canvas. +
++ New workflow will be cloned from {selectedBlueprint.name} + {selectedBlueprintFamily ? ` (${GRAPH_FAMILY_LABELS[selectedBlueprintFamily]})` : ''} + {selectedBlueprintLabel ? ` as ${selectedBlueprintLabel.toLowerCase()}` : ''}. +
+ )} +Add Workflow Node
++ Search by label, step, family, or execution mode. +
++ Node Library +
+ + {onSelectStep ? 'Click insert to add to canvas' : `${definitions.length} definitions`} + ++ Browse by runtime family and module contract, then insert nodes directly from the sidebar. +
++ {executionModeHint} +
+No node selected
++ Select a node on the canvas to edit its settings here. +
+No preflight yet
++ Run `Dry Run` to inspect graph readiness and node-level issues here. +
+No workflow selected
++ Select a workflow from the list or create a new one. +
+ > + ) : ( + <> +No workflows configured.
++ Workflows define the sequence of pipeline steps for rendering orders. + Click "New Workflow" to create one. +
+ > + )} + +{blueprintDescription}
+ )} ++ Modules +
+ + family + runtime scoped + +No matching nodes
++ Adjust search, runtime, family, or module filters to bring nodes back into view. +
+ {onEmptyAction && ( + + )} +{NODE_LIBRARY_GROUP_DESCRIPTIONS[group]}
+{definition.label}
+ + {FAMILY_FILTER_LABELS[family]} + + {getDefinitionBadges(definition).map(badge => ( + + {badge.label} + + ))} +{definition.step}
+{definition.description}
+ ++ Production Module +
+{moduleLabel}
+{moduleKey}
+Inputs
+ {inputContextLabel &&Context: {inputContextLabel}
} + {requiredInputs.length > 0 ? ( +No declared upstream requirements.
+ )} + {consumedArtifacts.length > 0 && ( +Artifacts Consumed
+Outputs
+ {outputContextLabel &&Context: {outputContextLabel}
} + {providedOutputs.length > 0 ? ( +No declared downstream outputs.
+ )} + {producedArtifacts.length > 0 && ( +Artifacts Produced
+{nodeDefinition.description}
+ {graphFamily !== 'mixed' && ( ++ Step selection is scoped to {FAMILY_FILTER_LABELS[graphFamily]} nodes for this workflow. +
+ )} + + {nodeDefinition.execution_kind === 'bridge' ? 'Legacy Bridge' : 'Native Node'} + ++ This node currently has no configurable settings in the editor. +
+ )} + + {Object.entries(fieldsBySection).map(([section, fields]) => ( +{field.description}
+ )} + {disableRenderOverrideField && ( ++ In Graph/Shadow mode this field inherits from Output Type and Template until + Custom Render Settings is enabled. +
+ )} +{preflight.summary}
++ Expected `{preflight.expected_context_kind}` · Resolved `{preflight.context_kind ?? 'n/a'}` +
+Order Line: {preflight.resolved_order_line_id}
} + {preflight.resolved_cad_file_id &&CAD File: {preflight.resolved_cad_file_id}
} ++ Global Issues +
+ {preflight.issues.map(issue => ( ++ Node Checks +
+ {preflight.nodes.map(node => ( +{node.label ?? node.node_id}
+{node.step}
++ {issue.message} +
+ ))} ++ No workflow runs recorded for this workflow yet. +
+ )} + + {runs.length > 0 && ( +Run {selectedRun.id.slice(0, 8)}
++ Started {formatDateTime(selectedRun.started_at ?? selectedRun.created_at)} +
+{selectedRun.error_message}
+ )} + ++ Node Results +
+ {selectedRun.node_results.map(result => ( +{result.log}
+ )} ++ Shadow Comparison +
+ {isComparisonLoading &&{comparison.summary}
+Status: {comparison.status}
++ Authoritative: {comparison.authoritative_output.image_width ?? '?'} x {comparison.authoritative_output.image_height ?? '?'} +
++ Observer: {comparison.observer_output.image_width ?? '?'} x {comparison.observer_output.image_height ?? '?'} +
+ {comparison.mean_pixel_delta != null && ( +Mean Pixel Delta: {comparison.mean_pixel_delta.toFixed(6)}
+ )} +Utility Rail
++ Context-aware tools without sacrificing canvas space. +
+{nodeDefinition.description}
- - {nodeDefinition.execution_kind === 'bridge' ? 'Legacy Bridge' : 'Native Node'} - -- This node currently has no configurable settings in the editor. -
- )} - - {Object.entries(fieldsBySection).map(([section, fields]) => ( -{field.description}
- )} - {disableRenderOverrideField && ( -- In Graph/Shadow mode this field inherits from Output Type and Template until - Custom Render Settings is enabled. -
- )} -{definition.label}
- - {FAMILY_FILTER_LABELS[family]} - - - {definition.execution_kind === 'bridge' ? 'Bridge' : 'Native'} - -{definition.step}
-{definition.description}
-- Available Nodes -
-{definition.label}
- - {definition.execution_kind === 'bridge' ? 'Bridge' : 'Native'} - -{definition.step}
-{definition.description}
-- No workflow runs recorded for this workflow yet. -
- )} - - {runs.length > 0 && ( -Run {selectedRun.id.slice(0, 8)}
-- Started {formatDateTime(selectedRun.started_at ?? selectedRun.created_at)} -
-{selectedRun.error_message}
- )} - -- Node Results -
- {selectedRun.node_results.map(result => ( -{result.log}
- )} -- Shadow Comparison -
- {isComparisonLoading &&{comparison.summary}
-Status: {comparison.status}
-- Authoritative: {comparison.authoritative_output.image_width ?? '?'} x {comparison.authoritative_output.image_height ?? '?'} -
-- Observer: {comparison.observer_output.image_width ?? '?'} x {comparison.observer_output.image_height ?? '?'} -
- {comparison.mean_pixel_delta != null && ( -Mean Pixel Delta: {comparison.mean_pixel_delta.toFixed(6)}
- )} -{preflight.summary}
-- Expected `{preflight.expected_context_kind}` · Resolved `{preflight.context_kind ?? 'n/a'}` -
-Order Line: {preflight.resolved_order_line_id}
} - {preflight.resolved_cad_file_id &&CAD File: {preflight.resolved_cad_file_id}
} -- Global Issues -
- {preflight.issues.map(issue => ( -- Node Checks -
- {preflight.nodes.map(node => ( -{node.label ?? node.node_id}
-{node.step}
-- {issue.message} -
- ))} -- New workflow will be cloned from {selectedBlueprint.name} - {selectedBlueprintFamily ? ` (${GRAPH_FAMILY_LABELS[selectedBlueprintFamily]})` : ''} - {selectedBlueprintLabel ? ` as ${selectedBlueprintLabel.toLowerCase()}` : ''}. -
- )} -{EXECUTION_MODE_HINTS[executionMode]}
-- `Graph Run` dispatches the current editor graph directly for debugging and does not replace the legacy production path. -
- {graphFamily === 'mixed' && ( -- Mixed CAD-file and order-line node families are not graph-dispatchable today. Split them into separate workflows for parity. -
- )} -- `Dry Run` validates the current editor graph against the supplied context and reports graph-runtime blockers without dispatching tasks. -
-{selectedWorkflow.name}
- - {GRAPH_FAMILY_LABELS[inferWorkflowFamily(selectedWorkflow.config)]} - - - {EXECUTION_MODE_LABELS[selectedWorkflow.config.ui?.execution_mode ?? 'legacy']} - - {getWorkflowBlueprint(selectedWorkflow.config) && ( - - {BLUEPRINT_LABELS[getWorkflowBlueprint(selectedWorkflow.config)!] ?? 'Blueprint'} - - )} -- {BLUEPRINT_DESCRIPTION[getWorkflowBlueprint(selectedWorkflow.config)!] ?? 'Reference workflow graph.'} -
- )} -No workflows configured.
-- Workflows define the sequence of pipeline steps for rendering orders. - Click "New Workflow" to create one. -
- > - ) : ( - <> -No workflow selected
-- Select a workflow from the list or create a new one. -
- > - )} - -