From 4467b1860f8ece2b4eebd7ad34a9634d2f21e617 Mon Sep 17 00:00:00 2001 From: Henry Li Date: Wed, 21 Jan 2026 09:45:55 +0800 Subject: [PATCH] feat: auto open artifact --- .../src/components/workspace/artifacts/context.tsx | 10 +++++++++- .../workspace/messages/message-group.tsx | 14 +++++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/frontend/src/components/workspace/artifacts/context.tsx b/frontend/src/components/workspace/artifacts/context.tsx index 50c92a2..1058ae8 100644 --- a/frontend/src/components/workspace/artifacts/context.tsx +++ b/frontend/src/components/workspace/artifacts/context.tsx @@ -9,6 +9,7 @@ export interface ArtifactsContextType { selectedArtifact: string | null; open: boolean; + autoOpen: boolean; setOpen: (open: boolean) => void; deselect: () => void; @@ -27,6 +28,7 @@ export function ArtifactsProvider({ children }: ArtifactsProviderProps) { const [artifacts, setArtifacts] = useState([]); const [selectedArtifact, setSelectedArtifact] = useState(null); const [open, setOpen] = useState(false); + const [autoOpen, setAutoOpen] = useState(true); const { setOpen: setSidebarOpen } = useSidebar(); const select = (artifact: string) => { @@ -43,7 +45,13 @@ export function ArtifactsProvider({ children }: ArtifactsProviderProps) { setArtifacts, open, - setOpen, + autoOpen, + setOpen: (isOpen: boolean) => { + if (!isOpen && autoOpen) { + setAutoOpen(false); + } + setOpen(isOpen); + }, selectedArtifact, select, diff --git a/frontend/src/components/workspace/messages/message-group.tsx b/frontend/src/components/workspace/messages/message-group.tsx index 11a242e..f64ff4c 100644 --- a/frontend/src/components/workspace/messages/message-group.tsx +++ b/frontend/src/components/workspace/messages/message-group.tsx @@ -181,7 +181,7 @@ function ToolCall({ result?: string | Record; }) { const { t } = useI18n(); - const { select, setOpen } = useArtifacts(); + const { setOpen, autoOpen, selectedArtifact, select } = useArtifacts(); if (name === "web_search") { let label: React.ReactNode = t.toolCalls.searchForRelatedInfo; if (typeof args.query === "string") { @@ -265,6 +265,18 @@ function ToolCall({ description = t.toolCalls.writeFile; } const path: string | undefined = (args as { path: string })?.path; + if (autoOpen && path) { + setTimeout(() => { + const url = new URL( + `write-file:${path}?message_id=${messageId}&tool_call_id=${id}`, + ).toString(); + if (selectedArtifact === url) { + return; + } + select(url); + setOpen(true); + }, 100); + } return (