diff --git a/src/lib/components/chat/Chat.svelte b/src/lib/components/chat/Chat.svelte index 381d26cd53..768975dacb 100644 --- a/src/lib/components/chat/Chat.svelte +++ b/src/lib/components/chat/Chat.svelte @@ -46,7 +46,8 @@ selectedTerminalId, showFileNavPath, showFileNavDir, - chatRequestQueues + chatRequestQueues, + desktopEvent } from '$lib/stores'; import { WEBUI_API_BASE_URL } from '$lib/constants'; @@ -1225,7 +1226,19 @@ showControls.set(true); } - if ($page.url.searchParams.get('q')) { + // Consume one-shot desktop event (e.g. Spotlight query + attachments) + if ($desktopEvent) { + const { query, files: eventFiles } = $desktopEvent; + desktopEvent.set(null); + + // TODO: handle eventFiles (attach to chat) + + if (query) { + messageInput?.setText(query); + await tick(); + submitHandler(query); + } + } else if ($page.url.searchParams.get('q')) { const q = $page.url.searchParams.get('q') ?? ''; messageInput?.setText(q); diff --git a/src/lib/stores/index.ts b/src/lib/stores/index.ts index 5cd7f0d632..edcea62137 100644 --- a/src/lib/stores/index.ts +++ b/src/lib/stores/index.ts @@ -111,6 +111,15 @@ export const artifactContents = writable(null); export const embed = writable(null); export const temporaryChatEnabled = writable(false); + +// Transient one-shot event from the desktop shell (Spotlight, drag-and-drop, etc.). +// Set by +layout.svelte, consumed and cleared by Chat.svelte. +export type DesktopEventFile = { name: string; mimeType: string; dataUrl: string }; +export type DesktopEvent = { + query?: string; + files?: DesktopEventFile[]; +}; +export const desktopEvent: Writable = writable(null); export const scrollPaginationEnabled = writable(false); export const currentChatPage = writable(1); diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 75da2acd23..0f032c6642 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -35,7 +35,8 @@ showControls, showFileNavPath, showFileNavDir, - pyodideWorker + pyodideWorker, + desktopEvent } from '$lib/stores'; import { getFileContentById } from '$lib/apis/files'; import { goto } from '$app/navigation'; @@ -711,7 +712,8 @@ return; } if (event.type === 'query' && event.data?.query) { - await goto(`/?q=${encodeURIComponent(event.data.query)}`); + desktopEvent.set({ query: event.data.query }); + await goto('/'); return; } if (event.type === 'theme:update' && event.data?.theme) {