This commit is contained in:
Timothy Jaeryang Baek committed 2026-08-05 07:44:06 -05:00
1 parent 29eeda9f9a
commit 6c4d0ace16
4 files changed
+144 -51

No files matched your search

+82 -45
View File
@@ -1523,12 +1523,16 @@
toast.success($i18n.t('File uploaded successfully'));
} catch (e) {
console.error('Error uploading file:', e);
fileItem.status = 'error';
fileItem.error = e.message || `${e}`;
files = files.filter((f) => f.itemId !== tempItemId);
toast.error(
$i18n.t('Error uploading file: {{error}}', {
error: e.message || 'Unknown error'
})
);
} finally {
await processNextInQueue($chatId);
}
};
@@ -1573,10 +1577,14 @@
files = [...files];
} catch (e) {
fileItem.status = 'error';
fileItem.error = `${e}`;
files = files.filter((f) => f.name !== url);
toast.error(`${e}`);
}
}
await processNextInQueue($chatId);
};
const onUpload = async (event) => {
@@ -1586,6 +1594,8 @@
await uploadGoogleDriveFile(data);
} else if (type === 'web') {
await uploadWeb(data);
} else if (type === 'file') {
await processNextInQueue($chatId);
}
};
@@ -2159,6 +2169,15 @@
const queue = $chatRequestQueues[targetChatId];
if (!queue || queue.length === 0) return;
const lastMessage = history.currentId ? history.messages[history.currentId] : null;
if (
(lastMessage && lastMessage.role === 'assistant' && !lastMessage.done) ||
queue.some((m) =>
(m.files ?? []).some((file) => ['uploading', 'error'].includes(file.status))
)
) {
return;
}
processingQueueChats.add(targetChatId);
try {
@@ -2176,6 +2195,43 @@
}
};
const sendQueuedMessageNow = async (id) => {
const queue = $chatRequestQueues[$chatId] ?? [];
const item = queue.find((m) => m.id === id);
if (!item || (item.files ?? []).some((file) => ['uploading', 'error'].includes(file.status))) {
return;
}
chatRequestQueues.update((q) => ({
...q,
[$chatId]: queue.filter((m) => m.id !== id)
}));
await stopResponse(false);
await tick();
await submitPrompt(item.prompt, item.files);
};
const editQueuedMessage = (id) => {
const queue = $chatRequestQueues[$chatId] ?? [];
const item = queue.find((m) => m.id === id);
if (!item) return;
chatRequestQueues.update((q) => ({
...q,
[$chatId]: queue.filter((m) => m.id !== id)
}));
files = item.files;
messageInput?.setText(item.prompt);
};
const deleteQueuedMessage = (id) => {
const queue = $chatRequestQueues[$chatId] ?? [];
chatRequestQueues.update((q) => ({
...q,
[$chatId]: queue.filter((m) => m.id !== id)
}));
};
const chatCompletedHandler = async (_chatId, modelId, responseMessageId, messages) => {
// Backend handles outlet filters and persistence inline.
// Just refresh the sidebar chat list.
@@ -2736,16 +2792,6 @@
return;
}
if (
files.length > 0 &&
files.filter((file) => file.type !== 'image' && file.status === 'uploading').length > 0
) {
toast.error(
$i18n.t(`Oops! There are files still uploading. Please wait for the upload to complete.`)
);
return;
}
if (
($config?.file?.max_count ?? null) !== null &&
files.length + chatFiles.length > $config?.file?.max_count
@@ -2768,6 +2814,22 @@
return;
}
if (
($chatRequestQueues[$chatId] ?? []).some((m) =>
(m.files ?? []).some((file) => ['uploading', 'error'].includes(file.status))
) ||
(files.length > 0 && files.some((file) => ['uploading', 'error'].includes(file.status)))
) {
chatRequestQueues.update((q) => ({
...q,
[$chatId]: [...(q[$chatId] ?? []), { id: uuidv4(), prompt: userPrompt, files }]
}));
messageInput?.setText('');
prompt = '';
files = [];
return;
}
// Check if the assistant is still generating the main response
// (don't block on background tasks like title gen, follow-ups, tags)
const lastMessage = history.currentId ? history.messages[history.currentId] : null;
@@ -4029,41 +4091,9 @@
{onUpload}
messageQueue={$chatRequestQueues[$chatId] ?? []}
{chatTasks}
onQueueSendNow={async (id) => {
const queue = $chatRequestQueues[$chatId] ?? [];
const item = queue.find((m) => m.id === id);
if (item) {
// Remove from queue
chatRequestQueues.update((q) => ({
...q,
[$chatId]: queue.filter((m) => m.id !== id)
}));
await stopResponse(false);
await tick();
await submitPrompt(item.prompt, item.files);
}
}}
onQueueEdit={(id) => {
const queue = $chatRequestQueues[$chatId] ?? [];
const item = queue.find((m) => m.id === id);
if (item) {
// Remove from queue
chatRequestQueues.update((q) => ({
...q,
[$chatId]: queue.filter((m) => m.id !== id)
}));
// Set files and restore prompt to input
files = item.files;
messageInput?.setText(item.prompt);
}
}}
onQueueDelete={(id) => {
const queue = $chatRequestQueues[$chatId] ?? [];
chatRequestQueues.update((q) => ({
...q,
[$chatId]: queue.filter((m) => m.id !== id)
}));
}}
onQueueSendNow={sendQueuedMessageNow}
onQueueEdit={editQueuedMessage}
onQueueDelete={deleteQueuedMessage}
onChange={(data) => {
if (!$temporaryChatEnabled) {
saveDraft(data, $chatId);
@@ -4148,6 +4178,9 @@
{onUpload}
messageQueue={$chatRequestQueues[$chatId] ?? []}
{chatTasks}
onQueueSendNow={sendQueuedMessageNow}
onQueueEdit={editQueuedMessage}
onQueueDelete={deleteQueuedMessage}
onWebSearchToggle={handleWebSearchToggle}
on:chatVariables={() => {
showChatVariablesModal = true;
@@ -4186,6 +4219,10 @@
{createMessagePair}
{onSelect}
{onUpload}
messageQueue={$chatRequestQueues[$chatId] ?? []}
onQueueSendNow={sendQueuedMessageNow}
onQueueEdit={editQueuedMessage}
onQueueDelete={deleteQueuedMessage}
onWebSearchToggle={handleWebSearchToggle}
on:chatVariables={() => {
showChatVariablesModal = true;