From 03a0c3587bd1f50db314d23f6bdec68d793c96da Mon Sep 17 00:00:00 2001 From: Zoe <62722391+juls0730@users.noreply.github.com> Date: Mon, 27 Apr 2026 12:06:46 -0500 Subject: [PATCH] fix: improve chat flow and cleanup Awaits sendMessage before navigating to prevent race conditions. Passes agentId to startGeneration for correct agent resolution. Adds topic deletion via Ctrl+Alt+Backspace shortcut. Adds date/time prefix to user messages in LLM context. Fixes reasoning-container typo. --- app/components/Message/Agent/Reasoning.vue | 2 +- app/pages/agent/[id]/index.vue | 23 +++++++++--------- app/pages/agent/[id]/topic/[topicId].vue | 27 ++++++++++++++++------ app/pages/index.vue | 2 +- utils/message.ts | 7 +++--- 5 files changed, 37 insertions(+), 24 deletions(-) diff --git a/app/components/Message/Agent/Reasoning.vue b/app/components/Message/Agent/Reasoning.vue index 6880a44..024f6c2 100644 --- a/app/components/Message/Agent/Reasoning.vue +++ b/app/components/Message/Agent/Reasoning.vue @@ -72,7 +72,7 @@ const toggleReasoning = async () => { :class="reasoningOpen ? '' : '-rotate-90'">
+ :class="['reasoning-container max-h-[min(40vh,320px)] overflow-y-auto [scrollbar-width:thin] [scrollbar-color:#888_transparent] [scrollbar-gutter:stable]', scrollState]">
diff --git a/app/pages/agent/[id]/index.vue b/app/pages/agent/[id]/index.vue index b3e06e5..3a5624c 100644 --- a/app/pages/agent/[id]/index.vue +++ b/app/pages/agent/[id]/index.vue @@ -55,25 +55,26 @@ const handleSubmit = async (message: BaseMessage, model: ModelWithProvider | nul const { sendMessage, startGeneration } = await useChat(topic.id, false); - sendMessage(message).then(async res => { - if (res.ok === false) { - console.error('Failed to send message:', res.error); + const res = await sendMessage(message); + if (res.ok === false) { + console.error('Failed to send message:', res.error); - pendingMessage.value = null; + pendingMessage.value = null; - await navigateTo(`/agent/${route.params.id}`); + await navigateTo(`/agent/${route.params.id}`); - nextTick(() => { - inputValue.value = message; - }); - } - }); + nextTick(() => { + inputValue.value = message; + }); + + return; + } await navigateTo(`/agent/${route.params.id}/topic/${topic.id}`); autoRenameTopic(topic.id); - return startGeneration(model); + return startGeneration(model, undefined, route.params.id as string); }; diff --git a/app/pages/agent/[id]/topic/[topicId].vue b/app/pages/agent/[id]/topic/[topicId].vue index f99e4c4..582c690 100644 --- a/app/pages/agent/[id]/topic/[topicId].vue +++ b/app/pages/agent/[id]/topic/[topicId].vue @@ -8,7 +8,7 @@ const rootStart = Date.now(); const chatPaneWrapper = ref(null); const inputValue = ref({ content: '', fileIds: [] }); const route = useRoute(); -const { getAgent } = await useAgents(); +const { getAgent, deleteTopic } = await useAgents(); const { open: sidebarOpen, openSidebar } = useSidebar(); const { providers, allModels } = await useModels(); const { addShortcut } = useKeyboardShortcuts(); @@ -84,12 +84,6 @@ const handleRegenerate = async (message: Message) => { } } -const handleDelete = async (rootMessage: Message) => { - await $fetch(`/api/messages/${rootMessage.id}`, { - method: 'DELETE', - }); -} - const flatMessages = computed(() => { const messages: Message[] = []; @@ -103,6 +97,17 @@ const flatMessages = computed(() => { return messages; }); +const handleDelete = async (rootMessage: Message) => { + await $fetch(`/api/messages/${rootMessage.id}`, { + method: 'DELETE', + }); + + if (flatMessages.value.length === 0) { + await navigateTo(`/agent/${route.params.id}`); + deleteTopic(route.params.id as string, topicId.value); + } +} + const activeGeneration = computed(() => { if (topic.value === null) return null; const generations = flatMessages.value.flatMap(message => message.generation); @@ -190,6 +195,14 @@ addShortcut(['ctrl', 'alt', 'arrowright'], async (event) => { } }) +addShortcut(['ctrl', 'alt', 'backspace'], async (event) => { + event.preventDefault(); + event.stopPropagation(); + + await navigateTo(`/agent/${route.params.id}`); + deleteTopic(route.params.id as string, topicId.value); +}) + onMounted(() => { scrollToBottom('instant'); }); diff --git a/app/pages/index.vue b/app/pages/index.vue index 957814f..b2290cb 100644 --- a/app/pages/index.vue +++ b/app/pages/index.vue @@ -117,7 +117,7 @@ const handleChatSubmit = async (message: BaseMessage, model: ModelWithProvider | autoRenameTopic(topic.id); - return startGeneration(model); + return startGeneration(model, undefined, targetAgent.id); }; onMounted(() => { diff --git a/utils/message.ts b/utils/message.ts index f988bdd..028dd11 100644 --- a/utils/message.ts +++ b/utils/message.ts @@ -57,8 +57,6 @@ export const marshallMessages = (agent: Agent, messages: Readonly { if (attachment.file.mimeType.startsWith('image/')) { return { @@ -75,12 +73,13 @@ export const marshallMessages = (agent: Agent, messages: Readonly