diff --git a/app/app.css b/app/app.css index 5a718f4..83d11e1 100644 --- a/app/app.css +++ b/app/app.css @@ -17,6 +17,7 @@ @source "../../lib-search-ui/src"; @source "../../lib-feedback-ui/src"; @source "../../lib-auth-ui/src"; +@source "../../lib-agent-ui/src"; /* CREMA:SOURCES */ @custom-variant dark (&:is(.dark *)); diff --git a/app/routes/ai.tsx b/app/routes/ai.tsx index 91865a6..95b4b2d 100644 --- a/app/routes/ai.tsx +++ b/app/routes/ai.tsx @@ -62,7 +62,13 @@ import { addLibraryItem } from "~/lib/library" import { Avatar, AvatarFallback } from "~/components/ui/avatar" import { pageTitle } from "~/lib/page-meta" import { useArcadiaClient } from "@crema/arcadia-client" -import type { ToolCall } from "@crema/llm-ui" +import type { Message as LLMMessage, ToolCall } from "@crema/llm-ui" +import { + AgentAvatar, + ToolCallCard, + type ToolCall as AgentToolCall, + type ToolCallStatus, +} from "@crema/agent-ui" import { buildDenialMessages, classifyCalls, @@ -523,30 +529,60 @@ function ChatSurface({ ) : (
- {messages - .filter((m) => m.role !== "system") - .map((m, i) => ( + {messages.map((m, i) => { + if (m.role === "system" || m.role === "tool") return null + const calls = + m.role === "assistant" && m.toolCalls + ? m.toolCalls.map((tc) => + buildAgentToolCall(tc, messages, isStreaming, !!pendingConfirm), + ) + : [] + const isWritePending = + pendingConfirm?.afterIndex === i ? pendingConfirm.writes : null + return (
- {pendingConfirm?.afterIndex === i && ( + {calls.length > 0 && ( +
+ {calls.map((c) => ( + + ))} +
+ )} + {isWritePending && ( )}
- ))} - {isStreaming && messages.at(-1)?.role !== "assistant" && ( -
- -
- )} + ) + })} + {(() => { + const activity = deriveAgentActivity({ + isStreaming, + lastMessage: messages.at(-1), + pendingConfirm: !!pendingConfirm, + confirmBusy, + }) + if (activity === "idle") return null + return ( +
+ +
+ ) + })()}