diff --git a/frontend/src/lib/components/FlowStatusViewerInner.svelte b/frontend/src/lib/components/FlowStatusViewerInner.svelte index 57c4714849..d109a23b97 100644 --- a/frontend/src/lib/components/FlowStatusViewerInner.svelte +++ b/frontend/src/lib/components/FlowStatusViewerInner.svelte @@ -1864,7 +1864,7 @@
-
+
{#each Object.values(retryStatus?.val ?? {}) as count} {#if count} @@ -1884,6 +1884,7 @@ triggerNode={true} download={!hideDownloadInGraph} minHeight={wrapperHeight - retryStatusHeight} + outerDivClass="max-h-screen" success={jobId != undefined && isSuccess(job?.['success'])} flowModuleStates={localModuleStates} bind:expandedSubflows @@ -1932,8 +1933,8 @@
-
- +
+ {#if !hideTimeline} {/if} @@ -1946,238 +1947,244 @@ {/if} - {#if rightColumnSelect == 'timeline'} - buildSubflowKey(key, prefix)} - durationStatuses={localDurationStatuses} - /> - {:else if rightColumnSelect == 'node_status'} -
- {#if selectedNode?.startsWith(AI_TOOL_MESSAGE_PREFIX)} -
+
+ {#if rightColumnSelect == 'timeline'} + buildSubflowKey(key, prefix)} + durationStatuses={localDurationStatuses} + /> + {:else if rightColumnSelect == 'node_status'} +
+ {#if selectedNode?.startsWith(AI_TOOL_MESSAGE_PREFIX)} +
+ +
+ {:else if selectedNode?.startsWith(AI_MCP_TOOL_CALL_PREFIX)} + {@const [, agentModuleId, toolCallIndex] = selectedNode.split('-')} + {@const agentNode = localModuleStates?.[agentModuleId]} + {@const agentActions = agentNode?.agent_actions} + {@const mcpActionIndex = parseInt(toolCallIndex)} + {@const mcpAction = + agentActions && + mcpActionIndex >= 0 && + mcpActionIndex < agentActions.length + ? agentActions[mcpActionIndex] + : undefined} + {#if mcpAction?.type === 'mcp_tool_call' && agentNode?.result?.messages} + {@const message = agentNode.result.messages.find( + (m: { agent_action?: { call_id?: string }; content?: any }) => + m.agent_action?.call_id === mcpAction.call_id + )} + + {/if} + {:else if selectedNode?.startsWith(AI_WEBSEARCH_PREFIX)} -
- {:else if selectedNode?.startsWith(AI_MCP_TOOL_CALL_PREFIX)} - {@const [, agentModuleId, toolCallIndex] = selectedNode.split('-')} - {@const agentNode = localModuleStates?.[agentModuleId]} - {@const agentActions = agentNode?.agent_actions} - {@const mcpActionIndex = parseInt(toolCallIndex)} - {@const mcpAction = - agentActions && mcpActionIndex >= 0 && mcpActionIndex < agentActions.length - ? agentActions[mcpActionIndex] - : undefined} - {#if mcpAction?.type === 'mcp_tool_call' && agentNode?.result?.messages} - {@const message = agentNode.result.messages.find( - (m: { agent_action?: { call_id?: string }; content?: any }) => - m.agent_action?.call_id === mcpAction.call_id - )} - - {/if} - {:else if selectedNode?.startsWith(AI_WEBSEARCH_PREFIX)} - - {:else if selectedNode} - {@const node = localModuleStates[selectedNode]} - {#if selectedNode == 'end'} - - {:else if selectedNode == 'start'} - {#if job.args} - - {:else} -

No arguments

- {/if} - {:else if node} - {@const module = - stepDetail && typeof stepDetail !== 'string' ? stepDetail : undefined} - {@const agentTools = - module && module.value.type === 'aiagent' - ? module.value.tools - : undefined} - {@const parentLoopsPrefix = getParentLoopsPrefix(module?.id ?? '')} - {#if node.flow_jobs_results} -
- Result of step as collection of all subflows -
- -
-
- {/if} -
- {#if node.flow_jobs_results} - Selected subflow + {:else if selectedNode == 'start'} + {#if job.args} + + {:else} +

No arguments

{/if} -
-
-
- + Result of step as collection of all subflows +
+ - {#if node.duration_ms} - - - {msToSec(node.duration_ms)} s - - {/if} - {#if node.job_id && !isReplay} -
- +
+ {/if} +
+ {#if node.flow_jobs_results} + Selected subflow + {/if} +
+
+ + {#if !node.isListJob} +
+
Inputs
- {truncateRev(node.job_id ?? '', 10)} - - + +
+ {/if} + {#if node.workflow_as_code_status} +
+
Workflow timeline
+
{/if}
- {#if !node.isListJob} -
-
Inputs
- -
- {/if} - {#if node.workflow_as_code_status} -
-
Workflow timeline
- -
- {/if} -
- { - if (module) { - const storeKey = parentLoopsPrefix + module.id + '-' + idx - toolCallStore?.setStoredToolCallJob(storeKey, job) + { + if (module) { + const storeKey = parentLoopsPrefix + module.id + '-' + idx + toolCallStore?.setStoredToolCallJob(storeKey, job) + } } } - } - : undefined} - /> + : undefined} + /> +
-
- {:else} -

The execution of this node has no information attached to it. The job - likely did not run yet

- {/if} - {:else}

Select a node to see its details here

{/if} -
- {:else if rightColumnSelect == 'node_definition'} - {@const node = selectedNode ? localModuleStates[selectedNode] : undefined} - - {:else if rightColumnSelect == 'user_states'} -
- -
- {:else if rightColumnSelect == 'tracing'} - {@const node = selectedNode ? localModuleStates[selectedNode] : undefined} - {#if node?.job_id} - - {:else} -
Select a node with a job to see HTTP request traces
+ {:else} +

The execution of this node has no information attached to it. The job + likely did not run yet

+ {/if} + {:else}

Select a node to see its details here

{/if} +
+ {:else if rightColumnSelect == 'node_definition'} + {@const node = selectedNode ? localModuleStates[selectedNode] : undefined} + + {:else if rightColumnSelect == 'user_states'} +
+ +
+ {:else if rightColumnSelect == 'tracing'} + {@const node = selectedNode ? localModuleStates[selectedNode] : undefined} + {#if node?.job_id} + + {:else} +
Select a node with a job to see HTTP request traces
+ {/if} {/if} - {/if} +
diff --git a/frontend/src/lib/components/graph/FlowGraphV2.svelte b/frontend/src/lib/components/graph/FlowGraphV2.svelte index 973c7172b3..3c7b0dd771 100644 --- a/frontend/src/lib/components/graph/FlowGraphV2.svelte +++ b/frontend/src/lib/components/graph/FlowGraphV2.svelte @@ -198,6 +198,7 @@ diffBeforeFlow?: OpenFlow currentInputSchema?: Record markRemovedAsShadowed?: boolean + outerDivClass?: string } let { @@ -269,7 +270,8 @@ onDeleteMultiple = undefined, onDuplicateMultiple = undefined, onMoveMultiple = undefined, - movingIds = undefined + movingIds = undefined, + outerDivClass = '' }: Props = $props() // Initialize note manager with fine-grained reactivity @@ -1059,7 +1061,7 @@ {/if}
diff --git a/frontend/src/routes/(root)/(logged)/run/[...run]/+page.svelte b/frontend/src/routes/(root)/(logged)/run/[...run]/+page.svelte index b1c5f9419e..e2cd1097c9 100644 --- a/frontend/src/routes/(root)/(logged)/run/[...run]/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/run/[...run]/+page.svelte @@ -505,10 +505,10 @@ {#snippet left()}

run/{page.params.run}

{/snippet} - {#snippet right()} - {@const isScript = job?.job_kind === 'script'} - {@const isHubFlowPreview = isFlowPreview(job?.job_kind) && isHubFlowPath(job?.script_path)} - {@const runsHref = `/runs/${job?.script_path}${!isScript ? '?jobKind=flow' : ''}`} + {#snippet right()} + {@const isScript = job?.job_kind === 'script'} + {@const isHubFlowPreview = isFlowPreview(job?.job_kind) && isHubFlowPath(job?.script_path)} + {@const runsHref = `/runs/${job?.script_path}${!isScript ? '?jobKind=flow' : ''}`} {#if job && 'deleted' in job && !job?.deleted && ($superadmin || ($userStore?.is_admin ?? false))}
{/if} - {#if isFlowPreview(job?.job_kind) || isScriptPreview(job?.job_kind)} - - {/if} + {#if isFlowPreview(job?.job_kind) || isScriptPreview(job?.job_kind)} + + {/if} {#if persistentScriptDefinition !== undefined}