diff --git a/src/components/conversations/conversation-detail-panel.tsx b/src/components/conversations/conversation-detail-panel.tsx index ea0cf1f..1c5bd4e 100644 --- a/src/components/conversations/conversation-detail-panel.tsx +++ b/src/components/conversations/conversation-detail-panel.tsx @@ -165,10 +165,6 @@ const ConversationTabView = memo(function ConversationTabView({ const dbConvIdRef = useRef(conversationId) const statusUpdatedRef = useRef(false) const selectedAgentRef = useRef(selectedAgent) - const pendingPromptRef = useRef<{ - draft: PromptDraft - modeId: string | null - } | null>(null) const createConversationPendingRef = useRef(false) const reconcileTimerRef = useRef | null>(null) const externalIdSavedRef = useRef(false) @@ -355,14 +351,6 @@ const ConversationTabView = memo(function ConversationTabView({ setSyncState, ]) - useEffect(() => { - if (connStatus === "connected" && pendingPromptRef.current) { - const pending = pendingPromptRef.current - pendingPromptRef.current = null - lifecycleSend(pending.draft, pending.modeId) - } - }, [connStatus, lifecycleSend]) - useEffect(() => { if (connStatus === "connected" || connStatus === "prompting") { statusUpdatedRef.current = false @@ -424,6 +412,7 @@ const ConversationTabView = memo(function ConversationTabView({ setAgentConnectError(tWelcome("enableAgentFirstPlaceholder")) return } + if (connStatus !== "connected") return const optimisticTurn = buildOptimisticUserTurnFromDraft( draft, @@ -436,32 +425,7 @@ const ConversationTabView = memo(function ConversationTabView({ ) setSendSignal((prev) => prev + 1) setSyncState(effectiveConversationId, "awaiting_persist") - - if (connStatus === "connected") { - lifecycleSend(draft, selectedModeIdArg) - } else { - pendingPromptRef.current = { - draft, - modeId: selectedModeIdArg ?? null, - } - if ( - (!connStatus || - connStatus === "disconnected" || - connStatus === "error") && - workingDirForConnection - ) { - connConnect( - selectedAgent, - workingDirForConnection, - dbConversationId != null ? externalId : undefined, - { - source: "auto_link", - } - ).catch((e) => { - setAgentConnectError(normalizeErrorMessage(e)) - }) - } - } + lifecycleSend(draft, selectedModeIdArg) const persistedId = dbConvIdRef.current if (persistedId) { @@ -511,11 +475,8 @@ const ConversationTabView = memo(function ConversationTabView({ appendOptimisticTurn, bindConversationTab, canAutoConnect, - connConnect, connStatus, - dbConversationId, effectiveConversationId, - externalId, folderId, hasPersistedConversation, lifecycleSend, @@ -530,7 +491,6 @@ const ConversationTabView = memo(function ConversationTabView({ tabId, temporaryConversationId, trySaveExternalId, - workingDirForConnection, ] ) @@ -659,12 +619,17 @@ export function ConversationDetailPanel() { const { tabs, activeTabId, openNewConversationTab, closeTab } = useTabContext() const [reloadByTabId, setReloadByTabId] = useState>({}) + const tabsRef = useRef(tabs) const conversationsRef = useRef(conversations) const pendingClosedConversationIdsRef = useRef>(new Set()) const pendingRefreshTimerRef = useRef | null>( null ) + useEffect(() => { + tabsRef.current = tabs + }, [tabs]) + useEffect(() => { conversationsRef.current = conversations }, [conversations]) @@ -744,6 +709,11 @@ export function ConversationDetailPanel() { runtimeConversationId ?? summary?.id ?? null if (!matchedConversationId) return + const isOpenInTabs = tabsRef.current.some( + (tab) => tab.conversationId === matchedConversationId + ) + if (isOpenInTabs) return + invalidateDetailCache(matchedConversationId) setSyncState(matchedConversationId, "reconciling") diff --git a/src/hooks/use-db-message-detail.ts b/src/hooks/use-db-message-detail.ts index d0a6acf..c325bb0 100644 --- a/src/hooks/use-db-message-detail.ts +++ b/src/hooks/use-db-message-detail.ts @@ -70,12 +70,6 @@ async function loadAndCacheDetail( return promise } -export async function warmupDetailCache( - conversationId: number -): Promise { - return loadAndCacheDetail(conversationId) -} - export async function refreshDetailCache( conversationId: number ): Promise {