From e002280cf6eac8ca75b1f97d8e4226a2dfac6fe7 Mon Sep 17 00:00:00 2001 From: "itpkcn@gmail.com" Date: Sat, 21 Mar 2026 10:45:41 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=B4=E6=97=B6=E4=BC=9A=E8=AF=9D=E8=A2=AB?= =?UTF-8?q?=E9=A1=B6=E6=9B=BF=E5=90=8E=E7=AB=8B=E5=8D=B3=E6=96=AD=E5=BC=80?= =?UTF-8?q?=E8=BF=9E=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../conversation-detail-panel.tsx | 10 +++++++ src/contexts/tab-context.tsx | 26 +++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/src/components/conversations/conversation-detail-panel.tsx b/src/components/conversations/conversation-detail-panel.tsx index 0139669..64481bd 100644 --- a/src/components/conversations/conversation-detail-panel.tsx +++ b/src/components/conversations/conversation-detail-panel.tsx @@ -13,6 +13,7 @@ import { Plus, RefreshCw, X } from "lucide-react" import { useTranslations } from "next-intl" import { toast } from "sonner" import { disposeTauriListener } from "@/lib/tauri-listener" +import { useAcpActions } from "@/contexts/acp-connections-context" import { useFolderContext } from "@/contexts/folder-context" import { useTabContext } from "@/contexts/tab-context" import { useSessionStats } from "@/contexts/session-stats-context" @@ -941,7 +942,9 @@ export function ConversationDetailPanel() { openNewConversationTab, closeTab, switchTab, + onPreviewTabReplaced, } = useTabContext() + const { disconnect: disconnectByKey } = useAcpActions() const [reloadByTabId, setReloadByTabId] = useState>({}) const tabsRef = useRef(tabs) const conversationsRef = useRef(conversations) @@ -954,6 +957,13 @@ export function ConversationDetailPanel() { conversationsRef.current = conversations }, [conversations]) + // Disconnect the old connection immediately when a preview tab is replaced + useEffect(() => { + return onPreviewTabReplaced((replacedTabId) => { + disconnectByKey(replacedTabId).catch(() => {}) + }) + }, [onPreviewTabReplaced, disconnectByKey]) + // Background turn_complete handler: for conversations not open in tabs useEffect(() => { let cancelled = false diff --git a/src/contexts/tab-context.tsx b/src/contexts/tab-context.tsx index c780ba2..de272d1 100644 --- a/src/contexts/tab-context.tsx +++ b/src/contexts/tab-context.tsx @@ -67,6 +67,7 @@ interface TabContextValue { runtimeConversationId: number ) => void reorderTabs: (reorderedTabs: TabItem[]) => void + onPreviewTabReplaced: (callback: (tabId: string) => void) => () => void } const TabContext = createContext(null) @@ -166,6 +167,20 @@ export function TabProvider({ children }: TabProviderProps) { conversationsRef.current = conversations }, [conversations]) + // Callback set for preview tab replacement notifications + const previewReplacedCallbacksRef = useRef( + new Set<(tabId: string) => void>() + ) + const onPreviewTabReplaced = useCallback( + (callback: (tabId: string) => void) => { + previewReplacedCallbacksRef.current.add(callback) + return () => { + previewReplacedCallbacksRef.current.delete(callback) + } + }, + [] + ) + // Restore tabs from folder.opened_conversations when folder first loads const [restoredFolderId, setRestoredFolderId] = useState(() => selectedConversation ? folderId : null @@ -328,6 +343,7 @@ export function TabProvider({ children }: TabProviderProps) { title?: string ) => { let activateTabId: string | undefined + let replacedPreviewTabId: string | undefined setTabs((prev) => { const existingIndex = findTabIndexForConversation( @@ -375,6 +391,7 @@ export function TabProvider({ children }: TabProviderProps) { // Preview (not pinned): replace existing preview tab const previewIndex = prev.findIndex((t) => !t.isPinned) if (previewIndex >= 0) { + replacedPreviewTabId = prev[previewIndex].id const updated = [...prev] updated[previewIndex] = newTab return updated @@ -383,6 +400,13 @@ export function TabProvider({ children }: TabProviderProps) { return [...prev, newTab] }) + // Notify listeners about the replaced preview tab + if (replacedPreviewTabId) { + for (const cb of previewReplacedCallbacksRef.current) { + cb(replacedPreviewTabId) + } + } + if (activateTabId) { setActiveTabId(activateTabId) } @@ -642,6 +666,7 @@ export function TabProvider({ children }: TabProviderProps) { bindConversationTab, setTabRuntimeConversationId, reorderTabs, + onPreviewTabReplaced, }), [ tabs, @@ -659,6 +684,7 @@ export function TabProvider({ children }: TabProviderProps) { bindConversationTab, setTabRuntimeConversationId, reorderTabs, + onPreviewTabReplaced, ] )