diff --git a/backend/workflow_executor.py b/backend/workflow_executor.py index 809b40a..691482e 100644 --- a/backend/workflow_executor.py +++ b/backend/workflow_executor.py @@ -166,10 +166,13 @@ async def execute_workflow( enable_debug=enable_debug ) - # Add human-readable label to node_state for debug UI + # Add human-readable label and name to node_state for debug UI node_label = node.prompt_slug if hasattr(node, 'prompt_slug') and node.prompt_slug else f"{node.type.value}-{node_id[:8]}" if not node_state.debug_prompt_slug: node_state.debug_prompt_slug = node_label + # Set node_name from graph (user-defined name in editor) + if not node_state.node_name and hasattr(node, 'name'): + node_state.node_name = node.name node_states.append(node_state) context["node_results"][node_id] = node_state diff --git a/backend/workflow_models.py b/backend/workflow_models.py index 1d67142..7b9e01e 100644 --- a/backend/workflow_models.py +++ b/backend/workflow_models.py @@ -196,6 +196,7 @@ class WorkflowNode(BaseModel): """ id: str = Field(..., description="Eindeutige Knoten-ID") type: NodeType = Field(..., description="Knotentyp") + name: Optional[str] = Field(None, description="Node-Name (vom Editor)") position: Optional[Position] = Field(None, description="Position im visuellen Editor") # ANALYSIS-Knoten @@ -341,6 +342,7 @@ class NodeExecutionState(BaseModel): Erweitert NodeState um Phase-1-Komponenten (analysis_core, decision_signals, etc.) """ node_id: str = Field(..., description="Knoten-ID") + node_name: Optional[str] = Field(None, description="Node-Name aus Workflow-Editor") status: NodeStatus = Field(..., description="Ausführungsstatus") # Phase 1 Result Container diff --git a/frontend/src/components/workflow/panels/WorkflowResultViewer.jsx b/frontend/src/components/workflow/panels/WorkflowResultViewer.jsx index 9971180..51a839a 100644 --- a/frontend/src/components/workflow/panels/WorkflowResultViewer.jsx +++ b/frontend/src/components/workflow/panels/WorkflowResultViewer.jsx @@ -226,7 +226,7 @@ export function WorkflowResultViewer({ result, onClose }) { {(node.debug_node_type || node.node_type) === 'join' && '🔀'} {(node.debug_node_type || node.node_type) === 'end' && '🏁'} {' '} - {node.debug_prompt_slug || node.node_label || ((node.debug_node_type || node.node_type) ? `${node.debug_node_type || node.node_type}-${node.node_id.substring(0, 8)}` : node.node_id)} + {node.node_name || node.debug_prompt_slug || node.node_label || node.node_id} {node.status === 'skipped' && ( (skipped)