]> git.djapps.eu Git - pkg/ggml/sources/llama.cpp/blob
175eb3c8c7fda359c4ccde6437ccd093cd0721b6
[pkg/ggml/sources/llama.cpp] /
1 <script lang="ts">
2 import type { Snippet } from 'svelte';
3 import * as DropdownMenu from '$lib/components/ui/dropdown-menu';
4 import * as Tooltip from '$lib/components/ui/tooltip';
5 import {
6 ATTACHMENT_FILE_ITEMS,
7 ATTACHMENT_EXTRA_ITEMS,
8 ATTACHMENT_MCP_ITEMS,
9 TOOLTIP_DELAY_DURATION
10 } from '$lib/constants';
11 import { AttachmentMenuItemId } from '$lib/enums';
12 import {
13 ChatFormActionAddToolsSubmenu,
14 ChatFormActionAddMcpServersSubmenu
15 } from '$lib/components/app';
16
17 import { useAttachmentMenu } from '$lib/hooks/use-attachment-menu.svelte';
18
19 interface Props {
20 class?: string;
21 disabled?: boolean;
22 hasAudioModality?: boolean;
23 hasVisionModality?: boolean;
24 hasMcpPromptsSupport?: boolean;
25 hasMcpResourcesSupport?: boolean;
26 onFileUpload?: () => void;
27 onSystemPromptClick?: () => void;
28 onMcpPromptClick?: () => void;
29 onMcpSettingsClick?: () => void;
30 onMcpResourcesClick?: () => void;
31 trigger: Snippet<[{ disabled: boolean }]>;
32 }
33
34 let {
35 class: className = '',
36 disabled = false,
37 hasAudioModality = false,
38 hasVisionModality = false,
39 hasMcpPromptsSupport = false,
40 hasMcpResourcesSupport = false,
41 onFileUpload,
42 onSystemPromptClick,
43 onMcpPromptClick,
44 onMcpSettingsClick,
45 onMcpResourcesClick,
46 trigger
47 }: Props = $props();
48
49 let dropdownOpen = $state(false);
50
51 function handleMcpSettingsClick() {
52 dropdownOpen = false;
53 onMcpSettingsClick?.();
54 }
55
56 const attachmentMenu = useAttachmentMenu(
57 () => ({ hasVisionModality, hasAudioModality, hasMcpPromptsSupport, hasMcpResourcesSupport }),
58 () => ({ onFileUpload, onSystemPromptClick, onMcpPromptClick, onMcpResourcesClick }),
59 () => {
60 dropdownOpen = false;
61 }
62 );
63 </script>
64
65 <div class="flex items-center gap-1 {className}">
66 <DropdownMenu.Root bind:open={dropdownOpen}>
67 <DropdownMenu.Trigger name="Attach files" {disabled}>
68 {@render trigger({ disabled })}
69 </DropdownMenu.Trigger>
70
71 <DropdownMenu.Content align="start" class="w-48">
72 {#each ATTACHMENT_FILE_ITEMS as item (item.id)}
73 {@const enabled = attachmentMenu.isItemEnabled(item.enabledWhen)}
74 {#if enabled}
75 <DropdownMenu.Item
76 class="{item.class ?? ''} flex cursor-pointer items-center gap-2"
77 onclick={() => attachmentMenu.callbacks[item.action]()}
78 >
79 <item.icon class="h-4 w-4" />
80
81 <span>{item.label}</span>
82 </DropdownMenu.Item>
83 {:else if item.disabledTooltip}
84 <Tooltip.Root delayDuration={TOOLTIP_DELAY_DURATION}>
85 <Tooltip.Trigger class="w-full">
86 <DropdownMenu.Item
87 class="{item.class ?? ''} flex cursor-pointer items-center gap-2"
88 disabled
89 >
90 <item.icon class="h-4 w-4" />
91
92 <span>{item.label}</span>
93 </DropdownMenu.Item>
94 </Tooltip.Trigger>
95
96 <Tooltip.Content side="right">
97 <p>{item.disabledTooltip}</p>
98 </Tooltip.Content>
99 </Tooltip.Root>
100 {/if}
101 {/each}
102
103 {#if !attachmentMenu.isItemEnabled('hasVisionModality')}
104 <Tooltip.Root delayDuration={TOOLTIP_DELAY_DURATION}>
105 <Tooltip.Trigger class="w-full">
106 <DropdownMenu.Item
107 class="flex cursor-pointer items-center gap-2"
108 onclick={attachmentMenu.callbacks.onFileUpload}
109 >
110 {@const pdfItem = ATTACHMENT_FILE_ITEMS.find(
111 (i) => i.id === AttachmentMenuItemId.PDF
112 )}
113 {#if pdfItem}
114 <pdfItem.icon class="h-4 w-4" />
115
116 <span>{pdfItem.label}</span>
117 {/if}
118 </DropdownMenu.Item>
119 </Tooltip.Trigger>
120
121 <Tooltip.Content side="right">
122 <p>PDFs will be converted to text. Image-based PDFs may not work properly.</p>
123 </Tooltip.Content>
124 </Tooltip.Root>
125 {/if}
126
127 <DropdownMenu.Separator />
128
129 {#each ATTACHMENT_EXTRA_ITEMS as item (item.id)}
130 {#if item.id === AttachmentMenuItemId.SYSTEM_MESSAGE}
131 <Tooltip.Root delayDuration={TOOLTIP_DELAY_DURATION}>
132 <Tooltip.Trigger class="w-full">
133 <DropdownMenu.Item
134 class="flex cursor-pointer items-center gap-2"
135 onclick={() => attachmentMenu.callbacks[item.action]()}
136 >
137 <item.icon class="h-4 w-4" />
138
139 <span>{item.label}</span>
140 </DropdownMenu.Item>
141 </Tooltip.Trigger>
142
143 <Tooltip.Content side="right">
144 <p>{attachmentMenu.getSystemMessageTooltip()}</p>
145 </Tooltip.Content>
146 </Tooltip.Root>
147 {/if}
148 {/each}
149
150 <ChatFormActionAddToolsSubmenu />
151
152 <ChatFormActionAddMcpServersSubmenu onMcpSettingsClick={handleMcpSettingsClick} />
153
154 {#each ATTACHMENT_MCP_ITEMS as item (item.id)}
155 {#if attachmentMenu.isItemVisible(item.visibleWhen)}
156 <DropdownMenu.Item
157 class="flex cursor-pointer items-center gap-2"
158 onclick={() => attachmentMenu.callbacks[item.action]()}
159 >
160 <item.icon class="h-4 w-4" />
161
162 <span>{item.label}</span>
163 </DropdownMenu.Item>
164 {/if}
165 {/each}
166 </DropdownMenu.Content>
167 </DropdownMenu.Root>
168 </div>