- {mode === 'aiagent' ? 'AI Agent' : level == 0 ? 'Flow' : 'Subflow'}
+ {level == 0 ? 'Flow' : 'Subflow'}
{#if flowInfo?.label}
: {flowInfo.label}
{/if}
@@ -703,32 +701,22 @@
- {#if mode === 'aiagent'}
- {#if module.summary}
- Tool call: {module.summary}
- {:else}
- Message
- {/if}
- {:else}
- {module.id}
- {/if}
+ {module.id}
- {#if mode === 'flow'}
- {#if module.value.type === 'forloopflow'}
- For loop
- {:else if module.value.type === 'whileloopflow'}
- While loop
- {:else if module.value.type === 'branchall'}
- Branch to all
- {:else if module.value.type === 'branchone'}
- Branch to one
- {:else if module.value.type === 'flow'}
- Subflow
- {:else}
- Step
- {/if}
+ {#if module.value.type === 'forloopflow'}
+ For loop
+ {:else if module.value.type === 'whileloopflow'}
+ While loop
+ {:else if module.value.type === 'branchall'}
+ Branch to all
+ {:else if module.value.type === 'branchone'}
+ Branch to one
+ {:else if module.value.type === 'flow'}
+ Subflow
+ {:else}
+ Step
{/if}
- {#if module.summary && mode !== 'aiagent'}
+ {#if module.summary}
: {module.summary}
{/if}
{#if hasEmptySubflowValue}
diff --git a/frontend/src/lib/components/FlowLogViewerWrapper.svelte b/frontend/src/lib/components/FlowLogViewerWrapper.svelte
index 648dbc9f06..3a1c3add1f 100644
--- a/frontend/src/lib/components/FlowLogViewerWrapper.svelte
+++ b/frontend/src/lib/components/FlowLogViewerWrapper.svelte
@@ -20,7 +20,6 @@
| { id: string; index: number; manuallySet: true; moduleId: string }
| { manuallySet: false; moduleId: string }
) => Promise
- mode?: 'flow' | 'aiagent'
}
let {
@@ -30,7 +29,6 @@
workspaceId,
render,
onSelectedIteration,
- mode = 'flow'
}: Props = $props()
// State for tracking expanded rows - using Record to allow explicit control
@@ -180,7 +178,6 @@
{render}
{getSelectedIteration}
flowId="root"
- {mode}
{currentId}
bind:navigationChain
{select}
diff --git a/frontend/src/lib/components/FlowStatusViewerInner.svelte b/frontend/src/lib/components/FlowStatusViewerInner.svelte
index 3b860dc3a1..be99de1798 100644
--- a/frontend/src/lib/components/FlowStatusViewerInner.svelte
+++ b/frontend/src/lib/components/FlowStatusViewerInner.svelte
@@ -65,7 +65,6 @@
import { getActiveReplay } from './recording/replay.svelte'
import { publishLinkedAgentTools } from './flows/flowState'
import {
- getLinkedAgentTools,
linkedToolsScope,
releaseLinkedToolsScope,
retainLinkedToolsScope
@@ -2142,15 +2141,6 @@
No arguments
{/if}
{:else if node}
- {@const module =
- stepDetail && typeof stepDetail !== 'string' ? stepDetail : undefined}
- {@const agentTools =
- module && module.value.type === 'aiagent'
- ? module.value.agent
- ? getLinkedAgentTools(linkedToolsViewScope, module.id)
- : (module.value.tools ?? [])
- : undefined}
- {@const parentLoopsPrefix = getParentLoopsPrefix(module?.id ?? '')}
{#if node.flow_jobs_results}
{
- if (module) {
- const storeKey = parentLoopsPrefix + module.id + '-' + idx
- toolCallStore?.setStoredToolCallJob(storeKey, job)
- }
- }
- }
- : undefined}
/>
diff --git a/frontend/src/lib/components/ModulePreviewResultViewer.svelte b/frontend/src/lib/components/ModulePreviewResultViewer.svelte
index 3f39531b0a..e1ae3915bb 100644
--- a/frontend/src/lib/components/ModulePreviewResultViewer.svelte
+++ b/frontend/src/lib/components/ModulePreviewResultViewer.svelte
@@ -8,10 +8,10 @@
import OutputPickerInner from '$lib/components/flows/propPicker/OutputPickerInner.svelte'
import { Pane, Splitpanes } from 'svelte-splitpanes'
import type { FlowEditorContext, OutputViewerJob } from './flows/types'
- import type { AgentTool } from './flows/agentToolUtils'
import { getContext } from 'svelte'
import { getStringError } from './copilot/chat/utils'
- import AiAgentLogViewer from './AIAgentLogViewer.svelte'
+ import AgentTranscript from './AgentTranscript.svelte'
+ import { parseAgentResult } from './aiAgentResult'
interface Props {
lang: Script['language']
@@ -27,9 +27,6 @@
onUpdateMock?: (mock: { enabled: boolean; return_value?: unknown }) => void
loadingJob?: boolean
tagLabel?: string
- // A linked agent persists no tools of its own; its resolved resource tools are passed here so
- // the log viewer can label each tool_call with the definition that ran.
- linkedAgentTools?: AgentTool[]
}
let {
@@ -45,8 +42,7 @@
disableHistory = false,
onUpdateMock,
loadingJob = false,
- tagLabel = undefined,
- linkedAgentTools = undefined
+ tagLabel = undefined
}: Props = $props()
const { stepsInputArgs, flowStateStore } = getContext
('FlowEditorContext')
@@ -61,6 +57,10 @@
)
const logJob = $derived(testJob ?? selectedJob)
const preview = $derived.by(() => outputPickerInner?.getPreview?.())
+ // The trace of an agent step is its conversation, which its own result carries.
+ const agentResult = $derived(
+ logJob?.type === 'CompletedJob' ? parseAgentResult(logJob.result) : undefined
+ )
@@ -105,15 +105,10 @@
customEmptyMessage="Using pinned data"
{tagLabel}
/>
- {:else if mod.value.type === 'aiagent' && logJob?.type === 'CompletedJob'}
-
+ {:else if agentResult}
+
{:else}