bug fixes, and performance improvements, and drawer
This commit is contained in:
@@ -66,7 +66,7 @@ const handleSubmit = async (message: BaseMessage, model: ModelWithProvider | nul
|
||||
updatedAt: new Date(),
|
||||
}
|
||||
|
||||
const topic = await createTopic(agent.value!.id);
|
||||
const topic = await createTopic(agent.value!.id, message);
|
||||
if (!topic) throw new Error('Failed to create topic');
|
||||
|
||||
const { sendMessage, startGeneration } = await useChat(topic.id, false);
|
||||
@@ -100,7 +100,7 @@ const handleAddMessage = async (message: BaseMessage, role: 'user' | 'assistant'
|
||||
return;
|
||||
}
|
||||
|
||||
const topic = await createTopic(agent.value!.id);
|
||||
const topic = await createTopic(agent.value!.id, message);
|
||||
if (!topic) throw new Error('Failed to create topic');
|
||||
|
||||
const { sendMessage } = await useChat(topic.id, false);
|
||||
@@ -118,7 +118,8 @@ const handleAddMessage = async (message: BaseMessage, role: 'user' | 'assistant'
|
||||
|
||||
<template>
|
||||
<div class="flex flex-col h-full w-full max-w-full overflow-x-hidden">
|
||||
<div class="h-14 flex items-center justify-between px-4 border-b border-[var(--color-border)]">
|
||||
<div
|
||||
class="z-5 h-14 flex items-center justify-between px-4 border-b border-[var(--color-border)] bg-[var(--bg-surface)]">
|
||||
<div class="flex items-center gap-2 max-w-full">
|
||||
<button v-if="!sidebarOpen" @click="openSidebar"
|
||||
class="flex p-2 rounded-lg text-[var(--text-primary)] bg-transparent @hover:bg-[var(--color-hover)] transition-colors">
|
||||
@@ -131,7 +132,7 @@ const handleAddMessage = async (message: BaseMessage, role: 'user' | 'assistant'
|
||||
</div>
|
||||
|
||||
<div ref="chatPaneWrapper"
|
||||
class="chat-scroll-container justify-center w-full h-full [scrollbar-width:thin] [scrollbar-color:#888_transparent] overflow-y-scroll overflow-x-hidden flex justify-center pt-4">
|
||||
class="chat-scroll-container justify-center w-full flex-1 min-h-0 [scrollbar-width:thin] [scrollbar-color:#888_transparent] overflow-y-scroll overflow-x-hidden flex justify-center pt-4">
|
||||
<div class="chatPane max-w-4xl w-full min-h-full flex flex-col px-4">
|
||||
<div class="w-full px-px flex flex-col flex-grow gap-2"
|
||||
:class="pendingMessage === null ? 'justify-end pb-28' : 'pb-9'">
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
<script setup lang="ts">
|
||||
import { type BaseMessage, type Message, ChatErrorType } from '~/composables/useChat';
|
||||
import type { ModelWithProvider } from '~/composables/useModels';
|
||||
import { buildFocusedMessageTree } from '~~/utils/message';
|
||||
|
||||
const rootStart = Date.now();
|
||||
import { buildFocusedMessageTree, getActiveMessage, getNextActiveChildId } from '~~/utils/message';
|
||||
|
||||
const chatPaneWrapper = ref<HTMLElement | null>(null);
|
||||
const inputValue = ref<BaseMessage>({ content: '', fileIds: [] });
|
||||
@@ -81,11 +79,10 @@ const handleRegenerate = async (message: Message) => {
|
||||
return;
|
||||
}
|
||||
|
||||
let messageId: string;
|
||||
if (message.activeChildId && message.children.length > 0) {
|
||||
messageId = message.activeChildId;
|
||||
} else {
|
||||
messageId = message.id;
|
||||
const activeMsg = getActiveMessage(message);
|
||||
if (!activeMsg) {
|
||||
console.error('No active message');
|
||||
return;
|
||||
}
|
||||
|
||||
const model = allModels.value.find(m => m.id === agent.value!.defaultModelId);
|
||||
@@ -94,20 +91,26 @@ const handleRegenerate = async (message: Message) => {
|
||||
return;
|
||||
}
|
||||
|
||||
const res = await regenerateMessage(messageId, buildFocusedMessageTree(topic.value!.messages), model);
|
||||
const res = await regenerateMessage(activeMsg.id, buildFocusedMessageTree(topic.value!.messages), model);
|
||||
if (!res.ok) {
|
||||
console.error('Failed to regenerate message:', ChatErrorType[res.error]);
|
||||
return;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const flatMessages = computed(() => {
|
||||
const messages: Message[] = [];
|
||||
|
||||
for (const message of topic.value?.messages ?? []) {
|
||||
messages.push(message);
|
||||
if (!message.deleted) {
|
||||
messages.push(message);
|
||||
}
|
||||
if (message.children.length > 0) {
|
||||
messages.push(...message.children as Message[]);
|
||||
for (const child of message.children) {
|
||||
if (child && !child.deleted) {
|
||||
messages.push(child as Message);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -115,11 +118,13 @@ const flatMessages = computed(() => {
|
||||
});
|
||||
|
||||
const handleFork = async (message: Message) => {
|
||||
const messageId = message.activeChildId && message.children.length > 0
|
||||
? message.activeChildId
|
||||
: message.id;
|
||||
const activeMsg = getActiveMessage(message);
|
||||
if (!activeMsg) {
|
||||
console.error('No active message');
|
||||
return;
|
||||
}
|
||||
|
||||
const newTopicId = await forkTopic(topicId.value, messageId);
|
||||
const newTopicId = await forkTopic(topicId.value, activeMsg.id);
|
||||
if (newTopicId) {
|
||||
await navigateTo(`/agent/${route.params.id}/topic/${newTopicId}`);
|
||||
} else {
|
||||
@@ -128,14 +133,12 @@ const handleFork = async (message: Message) => {
|
||||
};
|
||||
|
||||
const handleDelete = async (rootMessage: Message) => {
|
||||
let messageId: string;
|
||||
if (rootMessage.activeChildId && rootMessage.children.length > 0) {
|
||||
messageId = rootMessage.activeChildId;
|
||||
} else {
|
||||
messageId = rootMessage.id;
|
||||
const activeMsg = getActiveMessage(rootMessage);
|
||||
if (!activeMsg) {
|
||||
return;
|
||||
}
|
||||
|
||||
const result = await deleteMessagesFocusedDescendant(messageId);
|
||||
const result = await deleteMessagesFocusedDescendant(activeMsg.id);
|
||||
if (!result.ok) {
|
||||
console.error('Failed to delete message:', result.error);
|
||||
return;
|
||||
@@ -145,7 +148,7 @@ const handleDelete = async (rootMessage: Message) => {
|
||||
await navigateTo(`/agent/${route.params.id}`);
|
||||
deleteTopic(route.params.id as string, topicId.value);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const { scrollToBottom, isAtBottom } = useAutoScroll(chatPaneWrapper);
|
||||
|
||||
@@ -198,76 +201,39 @@ addShortcut(['ctrl', 'shift', 'c'], (event) => {
|
||||
handleCancel();
|
||||
})
|
||||
|
||||
addShortcut(['alt', '['], async (event) => {
|
||||
const navigateLastMessage = (direction: -1 | 1) => {
|
||||
const lastMessage = topic.value?.messages?.at(-1);
|
||||
if (!lastMessage || lastMessage.children.length === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
const nextActiveChildId = getNextActiveChildId(lastMessage, direction);
|
||||
patchMessageLocally(lastMessage.id, { activeChildId: nextActiveChildId });
|
||||
};
|
||||
|
||||
addShortcut(['alt', '['], (event) => {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
navigateLastMessage(-1);
|
||||
});
|
||||
|
||||
const lastMessage = topic.value?.messages?.at(-1);
|
||||
if (lastMessage && lastMessage.children.length > 0) {
|
||||
const currentIdx = lastMessage.children.findIndex(c => c?.id === lastMessage.activeChildId);
|
||||
const prevIdx = Math.max(0, currentIdx);
|
||||
if (currentIdx > 0) {
|
||||
patchMessageLocally(lastMessage.id, { activeChildId: lastMessage.children[prevIdx - 1]!.id });
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
addShortcut(['alt', ']'], async (event) => {
|
||||
addShortcut(['ctrl', 'alt', 'arrowleft'], (event) => {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
navigateLastMessage(-1);
|
||||
});
|
||||
|
||||
const lastMessage = topic.value?.messages?.at(-1);
|
||||
if (lastMessage && lastMessage.children.length > 0) {
|
||||
const currentIdx = lastMessage.children.findIndex(c => c?.id === lastMessage.activeChildId);
|
||||
const maxIdx = lastMessage.deleted ? lastMessage.children.length - 1 : lastMessage.children.length;
|
||||
const nextIdx = Math.min(maxIdx, currentIdx + 1);
|
||||
addShortcut(['alt', ']'], (event) => {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
navigateLastMessage(1);
|
||||
});
|
||||
|
||||
if (lastMessage.deleted) {
|
||||
patchMessageLocally(lastMessage.id, { activeChildId: lastMessage.children[nextIdx]?.id ?? null });
|
||||
} else {
|
||||
if (nextIdx === 0) {
|
||||
patchMessageLocally(lastMessage.id, { activeChildId: null });
|
||||
} else {
|
||||
patchMessageLocally(lastMessage.id, { activeChildId: lastMessage.children[nextIdx - 1]?.id ?? null });
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
addShortcut(['ctrl', 'alt', 'arrowleft'], async (event) => {
|
||||
const lastMessage = topic.value?.messages?.at(-1);
|
||||
if (lastMessage && lastMessage.children.length > 0) {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
|
||||
const currentIdx = lastMessage.children.findIndex(c => c?.id === lastMessage.activeChildId);
|
||||
if (currentIdx > 0) {
|
||||
patchMessageLocally(lastMessage.id, { activeChildId: lastMessage.children[currentIdx - 1]!.id });
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
addShortcut(['ctrl', 'alt', 'arrowright'], async (event) => {
|
||||
const lastMessage = topic.value?.messages?.at(-1);
|
||||
if (lastMessage && lastMessage.children.length > 0) {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
|
||||
const currentIdx = lastMessage.children.findIndex(c => c?.id === lastMessage.activeChildId);
|
||||
const maxIdx = lastMessage.deleted ? lastMessage.children.length - 1 : lastMessage.children.length;
|
||||
const nextIdx = Math.min(maxIdx, currentIdx + 1);
|
||||
|
||||
if (lastMessage.deleted) {
|
||||
patchMessageLocally(lastMessage.id, { activeChildId: lastMessage.children[nextIdx]?.id ?? null });
|
||||
} else {
|
||||
if (nextIdx === 0) {
|
||||
patchMessageLocally(lastMessage.id, { activeChildId: null });
|
||||
} else {
|
||||
patchMessageLocally(lastMessage.id, { activeChildId: lastMessage.children[nextIdx - 1]?.id ?? null });
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
addShortcut(['ctrl', 'alt', 'arrowright'], (event) => {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
navigateLastMessage(1);
|
||||
});
|
||||
|
||||
addShortcut(['ctrl', 'alt', 'backspace'], async (event) => {
|
||||
event.preventDefault();
|
||||
@@ -287,13 +253,12 @@ const handleCancel = async () => {
|
||||
method: 'POST',
|
||||
});
|
||||
};
|
||||
|
||||
console.log("full page render took", Date.now() - rootStart);
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="flex flex-col h-full w-full max-w-full overflow-x-hidden">
|
||||
<div class="h-14 flex items-center justify-between px-4 border-b border-[var(--color-border)]">
|
||||
<div
|
||||
class="z-5 h-14 flex items-center justify-between px-4 border-b border-[var(--color-border)] bg-[var(--bg-surface)]">
|
||||
<div class="flex items-center gap-2 max-w-full">
|
||||
<button v-if="!sidebarOpen" @click="openSidebar"
|
||||
class="flex p-2 rounded-lg text-[var(--text-primary)] bg-transparent @hover:bg-[var(--color-hover)] transition-colors">
|
||||
@@ -307,7 +272,7 @@ console.log("full page render took", Date.now() - rootStart);
|
||||
|
||||
<!-- chat pane -->
|
||||
<div ref="chatPaneWrapper"
|
||||
class="chat-scroll-container justify-center w-full h-full [scrollbar-width:thin] [scrollbar-color:#888_transparent] overflow-y-scroll overflow-x-hidden flex justify-center pt-4">
|
||||
class="chat-scroll-container justify-center w-full flex-1 min-h-0 [scrollbar-width:thin] [scrollbar-color:#888_transparent] overflow-y-scroll overflow-x-hidden flex justify-center pt-4">
|
||||
<div class="chatPane max-w-4xl w-full min-h-full flex flex-col px-4">
|
||||
<div class="w-full px-px flex flex-col flex-grow gap-2 pb-9">
|
||||
<Suspense>
|
||||
|
||||
+1
-1
@@ -95,7 +95,7 @@ const handleChatSubmit = async (message: BaseMessage, model: ModelWithProvider |
|
||||
}
|
||||
}
|
||||
|
||||
const topic = await createTopic(targetAgent.id);
|
||||
const topic = await createTopic(targetAgent.id, message);
|
||||
if (!topic) {
|
||||
console.error('Failed to create topic');
|
||||
return;
|
||||
|
||||
Reference in New Issue
Block a user