<script lang="ts">
import { ICON_CLASS_DEFAULT } from '$lib/constants/css-classes';
+ import { URL_PARAMS } from '$lib/constants';
import * as AlertDialog from '$lib/components/ui/alert-dialog';
import { AlertTriangle, ArrowRight } from '@lucide/svelte';
import { goto } from '$app/navigation';
function handleSelectModel(model: string) {
// Build URL with selected model, preserving other params
const url = new URL(page.url);
- url.searchParams.set('model', model);
+ url.searchParams.set(URL_PARAMS.MODEL, model);
handleOpenChange(false);
goto(url.toString());
-export const NEW_CHAT_PARAM = 'new_chat';
+/** Query params the chat routes read from the URL. */
+export const URL_PARAMS = {
+ /** Prompt to send on arrival. */
+ QUERY: 'q',
+ /** Model to select. */
+ MODEL: 'model',
+ /** Load the selected model instead of waiting for the first message. */
+ LOAD: 'load',
+ /** Start a new chat. */
+ NEW_CHAT: 'new_chat'
+} as const;
/** Settings section slugs — used for routes and navigation. */
export const SETTINGS_SECTION_SLUGS = {
/** Root — start of the app. */
START: '#/',
/** New chat — root with new chat query param. */
- NEW_CHAT: `?${NEW_CHAT_PARAM}=true#/`,
+ NEW_CHAT: `?${URL_PARAMS.NEW_CHAT}=true#/`,
/** Chat base — for dynamic chat URLs use RouterService. */
CHAT: '#/chat',
/** MCP servers. */
import { chatStore } from '$lib/stores/chat.svelte';
import { conversationsStore, isConversationsInitialized } from '$lib/stores/conversations.svelte';
import { modelsStore, modelOptions } from '$lib/stores/models.svelte';
+ import { isRouterMode } from '$lib/stores/server.svelte';
import { onMount } from 'svelte';
import { page } from '$app/state';
import { replaceState } from '$app/navigation';
- import { APP_NAME, NEW_CHAT_PARAM } from '$lib/constants';
+ import { APP_NAME, URL_PARAMS } from '$lib/constants';
- let qParam = $derived(page.url.searchParams.get('q'));
- let modelParam = $derived(page.url.searchParams.get('model'));
- let newChatParam = $derived(page.url.searchParams.get(NEW_CHAT_PARAM));
+ let qParam = $derived(page.url.searchParams.get(URL_PARAMS.QUERY));
+ let modelParam = $derived(page.url.searchParams.get(URL_PARAMS.MODEL));
+ let newChatParam = $derived(page.url.searchParams.get(URL_PARAMS.NEW_CHAT));
+ let loadParam = $derived(page.url.searchParams.get(URL_PARAMS.LOAD));
// Dialog state for model not available error
let showModelNotAvailable = $state(false);
function clearUrlParams() {
const url = new URL(page.url);
- url.searchParams.delete('q');
- url.searchParams.delete('model');
- url.searchParams.delete(NEW_CHAT_PARAM);
+ url.searchParams.delete(URL_PARAMS.QUERY);
+ url.searchParams.delete(URL_PARAMS.MODEL);
+ url.searchParams.delete(URL_PARAMS.LOAD);
+ url.searchParams.delete(URL_PARAMS.NEW_CHAT);
replaceState(url.toString(), {});
}
if (model) {
try {
await modelsStore.selectModelById(model.id);
+
+ // with ?load=true, start loading right away so the model is ready sooner;
+ // not awaited, so the UI stays usable during the load
+ if (loadParam === 'true' && isRouterMode() && !modelsStore.isModelLoaded(model.id)) {
+ modelsStore
+ .loadModel(model.id)
+ .catch((error) => console.error('Failed to load model:', error));
+ }
} catch (error) {
console.error('Failed to select model:', error);
requestedModelName = modelParam;
import { page } from '$app/state';
import { afterNavigate } from '$app/navigation';
import { DialogModelNotAvailable } from '$lib/components/app';
- import { APP_NAME, ROUTES } from '$lib/constants';
+ import { APP_NAME, ROUTES, URL_PARAMS } from '$lib/constants';
import { chatStore } from '$lib/stores/chat.svelte';
import { conversationsStore, activeConversation } from '$lib/stores/conversations.svelte';
import { modelsStore, modelOptions } from '$lib/stores/models.svelte';
let currentChatId: string | undefined = undefined;
// URL parameters for prompt and model selection
- let qParam = $derived(page.url.searchParams.get('q'));
- let modelParam = $derived(page.url.searchParams.get('model'));
+ let qParam = $derived(page.url.searchParams.get(URL_PARAMS.QUERY));
+ let modelParam = $derived(page.url.searchParams.get(URL_PARAMS.MODEL));
// Dialog state for model not available error
let showModelNotAvailable = $state(false);
*/
function clearUrlParams() {
const url = new URL(page.url);
- url.searchParams.delete('q');
- url.searchParams.delete('model');
+ url.searchParams.delete(URL_PARAMS.QUERY);
+ url.searchParams.delete(URL_PARAMS.MODEL);
replaceState(url.toString(), {});
}