mirror of
https://github.com/windmill-labs/windmill.git
synced 2026-10-19 00:03:19 +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>
60 lines
1.8 KiB
Svelte
60 lines
1.8 KiB
Svelte
<!-- The description field of a resource, wherever one is created or edited: the
|
|
resource form and the save-as-reusable-agent drawer. One component, for the same
|
|
reason as ResourcePathHint next to it — two copies drift. -->
|
|
<script lang="ts">
|
|
import { Pen } from 'lucide-svelte'
|
|
import { Button } from '$lib/components/common'
|
|
import GfmMarkdown from './GfmMarkdown.svelte'
|
|
import Required from './Required.svelte'
|
|
import TextInput from './text_input/TextInput.svelte'
|
|
|
|
interface Props {
|
|
description: string
|
|
label?: string
|
|
placeholder?: string
|
|
canWrite?: boolean
|
|
}
|
|
|
|
let {
|
|
description = $bindable(),
|
|
label = 'Resource description',
|
|
placeholder = 'Describe what this resource is for',
|
|
canWrite = true
|
|
}: Props = $props()
|
|
|
|
let editing = $state(false)
|
|
</script>
|
|
|
|
<div class="flex flex-col gap-1">
|
|
<h4 class="inline-flex items-center gap-2 text-xs text-emphasis font-semibold"
|
|
>{label}
|
|
<Required required={false} />
|
|
{#if canWrite}
|
|
<Button
|
|
variant="subtle"
|
|
unifiedSize="xs"
|
|
btnClasses={editing ? 'bg-surface-hover' : ''}
|
|
startIcon={{ icon: Pen }}
|
|
iconOnly
|
|
title={editing ? 'Stop editing the description' : 'Edit the description'}
|
|
aria-label={editing ? 'Stop editing the description' : 'Edit the description'}
|
|
on:click={() => (editing = !editing)}
|
|
/>
|
|
{/if}
|
|
</h4>
|
|
{#if canWrite && editing}
|
|
<div class="relative">
|
|
<div class="text-2xs text-primary absolute -top-4 right-0">GH Markdown</div>
|
|
<TextInput
|
|
underlyingInputEl="textarea"
|
|
bind:value={description}
|
|
inputProps={{ placeholder, 'aria-label': label, disabled: !canWrite }}
|
|
/>
|
|
</div>
|
|
{:else if description == undefined || description == ''}
|
|
<div class="text-xs text-secondary font-normal">No description provided</div>
|
|
{:else}
|
|
<GfmMarkdown md={description} prose="sm" noPadding />
|
|
{/if}
|
|
</div>
|