Files
windmill/frontend/src/lib/components/FlowJobResult.svelte
T
hugocasa 958e8af782 feat: ai agent steps (#6393)
* feat: ai agent steps base

* better backend and graph

* feat: anthropic, log viewer

* nit

* fix(frontend): hide tool nodes from timeline

* move ai agent actions from flow status to flow status module

* nits and workspace/hub scripts support

* tmp ref

* fix merge

* feat: display agent tools status in the graph

* fix reactivity

* fix flow status

* nit
2025-08-20 22:40:57 +00:00

80 lines
2.1 KiB
Svelte

<script lang="ts">
import { Loader2 } from 'lucide-svelte'
import DisplayResult from './DisplayResult.svelte'
import LogViewer from './LogViewer.svelte'
import type { CompletedJob, FlowModule, Job } from '$lib/gen'
import AiAgentLogViewer from './AIAgentLogViewer.svelte'
interface Props {
waitingForExecutor?: boolean
result: any
result_stream?: string
logs: string | undefined
col?: boolean
noBorder?: boolean
loading: boolean
filename?: string | undefined
jobId?: string | undefined
tag?: string | undefined
workspaceId?: string | undefined
refreshLog?: boolean
downloadLogs?: boolean
tagLabel?: string | undefined
aiAgentStatus?: {
tools: FlowModule[]
agentJob: Partial<CompletedJob> & Pick<CompletedJob, 'id'> & { type: 'CompletedJob' }
storedToolCallJobs?: Record<number, Job>
onToolJobLoaded?: (job: Job, idx: number) => void
}
}
let {
waitingForExecutor = false,
result,
result_stream,
logs,
col = false,
noBorder = false,
loading,
filename = undefined,
jobId = undefined,
tag = undefined,
workspaceId = undefined,
downloadLogs = true,
tagLabel = undefined,
aiAgentStatus = undefined
}: Props = $props()
</script>
<div
class:border={!noBorder}
class="grid {!col
? 'grid-cols-2'
: 'grid-rows-2 max-h-screen'} shadow border border-tertiary-inverse grow overflow-hidden"
>
<div class="bg-surface {col ? '' : 'max-h-80'} p-1 overflow-auto relative">
<span class="text-tertiary">Result</span>
{#if result !== undefined || result_stream !== undefined}
<DisplayResult {workspaceId} {jobId} {filename} {result} {result_stream} growVertical />
{:else if loading}
<Loader2 class="animate-spin" />
{:else}
<div class="text-gray-400">No result (result is undefined)</div>
{/if}
</div>
<div class="overflow-auto {col ? '' : 'max-h-80'} relative">
{#if aiAgentStatus}
<AiAgentLogViewer {...aiAgentStatus} {workspaceId} />
{:else}
<LogViewer
{tagLabel}
download={downloadLogs}
content={logs ?? ''}
{jobId}
isLoading={waitingForExecutor}
{tag}
/>
{/if}
</div>
</div>