<script> import { createEventDispatcher, onMount } from 'svelte'; import { toast } from 'svelte-sonner'; const dispatch = createEventDispatcher(); import { knowledge, prompts } from '$lib/stores'; import { removeLastWordFromString } from '$lib/utils'; import { getPrompts } from '$lib/apis/prompts'; import { getKnowledgeBases } from '$lib/apis/knowledge'; import Prompts from './Commands/Prompts.svelte'; import Knowledge from './Commands/Knowledge.svelte'; import Models from './Commands/Models.svelte'; import Spinner from '$lib/components/common/Spinner.svelte'; export let prompt = ''; export let files = []; let loading = false; let commandElement = null; export const selectUp = () => { commandElement?.selectUp(); }; export const selectDown = () => { commandElement?.selectDown(); }; let command = ''; $: command = prompt?.split('\n').pop()?.split(' ')?.pop() ?? ''; let show = false; $: show = ['/', '#', '@'].includes(command?.charAt(0)) || '\\#' === command.slice(0, 2); $: if (show) { init(); } const init = async () => { loading = true; await Promise.all([ (async () => { prompts.set(await getPrompts(localStorage.token)); })(), (async () => { knowledge.set(await getKnowledgeBases(localStorage.token)); })() ]); loading = false; }; </script> {#if show} {#if !loading} {#if command?.charAt(0) === '/'} <Prompts bind:this={commandElement} bind:prompt bind:files {command} /> {:else if (command?.charAt(0) === '#' && command.startsWith('#') && !command.includes('# ')) || ('\\#' === command.slice(0, 2) && command.startsWith('#') && !command.includes('# '))} <Knowledge bind:this={commandElement} bind:prompt command={command.includes('\\#') ? command.slice(2) : command} on:youtube={(e) => { console.log(e); dispatch('upload', { type: 'youtube', data: e.detail }); }} on:url={(e) => { console.log(e); dispatch('upload', { type: 'web', data: e.detail }); }} on:select={(e) => { console.log(e); files = [ ...files, { ...e.detail, status: 'processed' } ]; dispatch('select'); }} /> {:else if command?.charAt(0) === '@'} <Models bind:this={commandElement} {command} on:select={(e) => { prompt = removeLastWordFromString(prompt, command); dispatch('select', { type: 'model', data: e.detail }); }} /> {/if} {:else} <div id="commands-container" class="px-2 mb-2 text-left w-full absolute bottom-0 left-0 right-0 z-10" > <div class="flex w-full rounded-xl border border-gray-50 dark:border-gray-850"> <div class="max-h-60 flex flex-col w-full rounded-xl bg-white dark:bg-gray-900 dark:text-gray-100" > <Spinner /> </div> </div> </div> {/if} {/if}