mirror of
https://github.com/windmill-labs/windmill.git
synced 2026-10-17 08:03:06 +00:00
* feat: render an AI agent result as its answer, not as raw JSON Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * fix: sanitize agent markdown through the shared plugin chain Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * refactor: fold agent stream events incrementally per poll Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * fix: separate the agent meta line from the result toggle group Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * feat: add a transcript view of an agent run's conversation Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * refactor: retire AIAgentLogViewer in favour of the transcript Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * feat: show the partial transcript a max-iterations failure carries Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * fix: move the agent meta line and system prompt below the conversation Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * refactor: show an agent run as what it did, not as a conversation Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * refactor: name the agent run breakdown a trace Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * fix(ai-agent): label the save-as-agent form fields per the guidelines Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * fix(ai-agent): reuse the resource form's path and description fields Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * fix(ai-agent): keep the action tags on a max-iterations failure Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * fix(ai-agent): keep offline replay inert and the streamed answer to one turn Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * fix(ai-agent): reset the streamed answer on providers that skip tool_call Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * fix: carry the event type narrowing through the stream parser Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * fix: survive a malformed message rather than take the viewer down Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * refactor: coerce agent messages once at the parse boundary Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * feat: show an agent run as one scroll ending in its output Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * fix: keep every streamed turn instead of dropping the narration Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * fix: share the chat divider and drop the unsafe run auto-scroll Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * fix: give the labelled divider a border colour and the standard pretty icon Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * fix: pad the agent run below its badges as well as above Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * feat: follow a streaming run's pane without moving the page Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * refactor: share the chat's stick-to-bottom mechanics with the agent run Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * fix: keep the answer's citations and end a turn's reasoning with the turn Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * refactor: read the agent stream through the windmill-chat sdk parser Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * fix: show an agent run's thinking instead of falling back to raw json Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * fix: stop a stream the fold cannot use from claiming the run pane Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * fix: identify an agent run by more than the job id the replay withholds Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * refactor: drop the tests and comment lines that were not earning their place Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * fix: stop a streamed turn's text shifting when a tool call closes it Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
86 lines
2.0 KiB
Svelte
86 lines
2.0 KiB
Svelte
<script lang="ts">
|
|
import { Loader2 } from 'lucide-svelte'
|
|
import DisplayResult from './DisplayResult.svelte'
|
|
import LogViewer from './LogViewer.svelte'
|
|
import { twMerge } from 'tailwind-merge'
|
|
|
|
interface Props {
|
|
waitingForExecutor?: boolean
|
|
result: any
|
|
result_stream?: string
|
|
logs: string | undefined
|
|
col?: boolean
|
|
loading: boolean
|
|
filename?: string | undefined
|
|
jobId?: string | undefined
|
|
/** Identifies the run, which `jobId` cannot on the replay page. */
|
|
runKey?: string | undefined
|
|
tag?: string | undefined
|
|
workspaceId?: string | undefined
|
|
refreshLog?: boolean
|
|
downloadLogs?: boolean
|
|
tagLabel?: string | undefined
|
|
}
|
|
|
|
let {
|
|
waitingForExecutor = false,
|
|
result,
|
|
result_stream,
|
|
logs,
|
|
col = false,
|
|
loading,
|
|
filename = undefined,
|
|
jobId = undefined,
|
|
runKey = undefined,
|
|
tag = undefined,
|
|
workspaceId = undefined,
|
|
downloadLogs = true,
|
|
tagLabel = undefined
|
|
}: Props = $props()
|
|
</script>
|
|
|
|
<div
|
|
class={twMerge(
|
|
'grow overflow-hidden text-xs',
|
|
!col ? 'grid grid-cols-2 gap-2' : 'flex flex-col max-h-screen gap-6 overflow-hidden'
|
|
)}
|
|
>
|
|
<div class="relative flex flex-col gap-1">
|
|
<span class="text-emphasis text-xs font-semibold">Result</span>
|
|
<div
|
|
class="{col
|
|
? 'max-h-1/2 grow'
|
|
: 'max-h-80'} overflow-auto rounded-md grow min-h-0 border bg-surface-tertiary p-2"
|
|
>
|
|
{#if result !== undefined || result_stream !== undefined}
|
|
<DisplayResult
|
|
{workspaceId}
|
|
{jobId}
|
|
{runKey}
|
|
{filename}
|
|
{result}
|
|
{result_stream}
|
|
growVertical
|
|
/>
|
|
{:else if loading}
|
|
<Loader2 class="animate-spin" />
|
|
{:else}
|
|
<div class="text-secondary">No result (result is undefined)</div>
|
|
{/if}
|
|
</div>
|
|
</div>
|
|
<div class="relative flex flex-col gap-1">
|
|
<span class="text-emphasis text-xs font-semibold">Logs</span>
|
|
<div class="rounded-md grow min-h-0 border bg-surface-tertiary overflow-hidden">
|
|
<LogViewer
|
|
{tagLabel}
|
|
download={downloadLogs}
|
|
content={logs ?? ''}
|
|
{jobId}
|
|
isLoading={waitingForExecutor}
|
|
{tag}
|
|
/>
|
|
</div>
|
|
</div>
|
|
</div>
|