diff --git a/packages/ui/registry.json b/packages/ui/registry.json index 85522ea..2d19508 100644 --- a/packages/ui/registry.json +++ b/packages/ui/registry.json @@ -3655,6 +3655,10 @@ "path": "registry/constructive/blocks/agents-builder/agent-run-panel.tsx", "type": "registry:component" }, + { + "path": "registry/constructive/blocks/agents-builder/agent-status.tsx", + "type": "registry:component" + }, { "path": "registry/constructive/blocks/agents-builder/agent-view.tsx", "type": "registry:component" @@ -3711,6 +3715,10 @@ "path": "registry/constructive/blocks/agents-builder/demo-schedules.ts", "type": "registry:lib" }, + { + "path": "registry/constructive/blocks/agents-builder/demo-agents.ts", + "type": "registry:lib" + }, { "path": "registry/constructive/blocks/agents-builder/fixtures.ts", "type": "registry:lib" diff --git a/packages/ui/scripts/build-registry.ts b/packages/ui/scripts/build-registry.ts index d409a25..74c51ad 100644 --- a/packages/ui/scripts/build-registry.ts +++ b/packages/ui/scripts/build-registry.ts @@ -96,6 +96,7 @@ const clientFiles = new Set([ 'storage-empty-state.tsx', 'upload-dropzone.tsx', 'agent-canvas.tsx', + 'agent-status.tsx', 'agent-run-panel.tsx', 'agent-view.tsx', 'agents-builder-context.tsx', diff --git a/packages/ui/src/components/agents-builder/agent-canvas.tsx b/packages/ui/src/components/agents-builder/agent-canvas.tsx index 0de1220..9649a10 100644 --- a/packages/ui/src/components/agents-builder/agent-canvas.tsx +++ b/packages/ui/src/components/agents-builder/agent-canvas.tsx @@ -71,8 +71,8 @@ type AgentCanvasProps = { * each new node on screen. */ function AgentCanvas({ state, panelOpen, onTogglePanel }: AgentCanvasProps) { - const { data, integration, emit } = useAgentsBuilder(); - const { agent } = data; + const { currentAgent, integration, emit } = useAgentsBuilder(); + const { agent } = currentAgent; const layerRef = React.useRef(null); const viewport = useCanvasViewport(CONTENT_WIDTH); const nodes = useCollapsed(); diff --git a/packages/ui/src/components/agents-builder/agent-run-panel.tsx b/packages/ui/src/components/agents-builder/agent-run-panel.tsx index 3523327..35720d6 100644 --- a/packages/ui/src/components/agents-builder/agent-run-panel.tsx +++ b/packages/ui/src/components/agents-builder/agent-run-panel.tsx @@ -1,10 +1,11 @@ 'use client'; -import { Bot, Check, ChevronRight, Hand, Sparkles, Square, Zap } from 'lucide-react'; +import { Bot, Check, ChevronRight, CircleAlert, Clock3, Hand, MessageCircleQuestion, RotateCcw, Sparkles, Square, Zap } from 'lucide-react'; import * as React from 'react'; import { cn } from '../../lib/utils'; import { ApprovalCard } from '../ai/approval-card'; +import { type AskChoice, AskCard } from '../ai/ask-card'; import { ChatContainer } from '../ai/chat-container'; import { CodeBlock } from '../ai/code-block'; import { FeedbackBar } from '../ai/feedback-bar'; @@ -14,19 +15,41 @@ import { Reasoning } from '../ai/reasoning'; import { Source, Sources } from '../ai/source'; import { ThinkingStatus } from '../ai/thinking-status'; import { ToolTrace } from '../ai/tool-trace'; +import { Button } from '../button'; import { Spinner } from '../spinner'; import { useAgentsBuilder } from './agents-builder-context'; import { Composer } from './composer'; import { IntegrationMark } from './integration-mark'; import { enterClass, focusRingClass, SurfaceBody, surfaceInsetClass, ToneBadge, TooltipIconButton, useInert } from '../workspace-kit/primitives'; +import { useLatest } from '../workspace-kit/use-latest'; import { RevealText } from './reveal-text'; import { usePlaybackClock } from './playback'; -import type { AgentRunScript, RunApproval, RunQuery, ToolStep } from './types'; +import type { AgentRunScript, RunApproval, RunFailure, RunQuery, RunQuestion, ToolStep } from './types'; import { type AgentRunState, RUN_TIMING, type RunGroupPlay } from './use-agent-run'; const GROUP_ICON = { subagents: , skills: } as const; const GROUP_NOUN = { subagents: ['agent', 'agents'], skills: ['skill', 'skills'] } as const; +// Status lines for the cards a run stops on. Static, so they are built once. +const APPROVAL_EYEBROW = ( + <> +