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