]> git.djapps.eu Git - pkg/ggml/sources/llama.cpp/blob
143621cd9daaa5f9526cc73970bded52e5959431
[pkg/ggml/sources/llama.cpp] /
1 <script lang="ts">
2 import {
3 ChatAttachmentsListItemMcpPrompt,
4 ChatAttachmentsListItemMcpResource,
5 ChatAttachmentsListItemThumbnailImage,
6 ChatAttachmentsListItemThumbnailFile
7 } from '$lib/components/app';
8 import { AttachmentType } from '$lib/enums';
9 import type {
10 ChatAttachmentDisplayItem,
11 DatabaseMessageExtraMcpPrompt,
12 DatabaseMessageExtraMcpResource,
13 MCPResourceAttachment
14 } from '$lib/types';
15 import { isMcpPrompt, isMcpResource, isPdfFile } from '$lib/utils';
16
17 interface Props {
18 class?: string;
19 imageClass?: string;
20 imageHeight?: string;
21 imageWidth?: string;
22 item: ChatAttachmentDisplayItem;
23 limitToSingleRow?: boolean;
24 onFileRemove?: (fileId: string) => void;
25 onMcpResourcePreview?: (extra: DatabaseMessageExtraMcpResource) => void;
26 onPreview?: (item: ChatAttachmentDisplayItem) => void;
27 readonly?: boolean;
28 }
29
30 let {
31 class: className = '',
32 imageClass = '',
33 imageHeight = 'h-24',
34 imageWidth = 'w-auto',
35 item,
36 limitToSingleRow = false,
37 onFileRemove,
38 onMcpResourcePreview,
39 onPreview,
40 readonly = false
41 }: Props = $props();
42
43 const scrollClasses = $derived(limitToSingleRow ? 'first:ml-4 last:mr-4' : '');
44
45 function toMcpResourceAttachment(
46 extra: DatabaseMessageExtraMcpResource,
47 id: string
48 ): MCPResourceAttachment {
49 return {
50 id,
51 resource: {
52 uri: extra.uri,
53 name: extra.name,
54 title: extra.name,
55 serverName: extra.serverName
56 }
57 };
58 }
59 </script>
60
61 {#if isMcpPrompt(item)}
62 {@const mcpPrompt =
63 item.attachment?.type === AttachmentType.MCP_PROMPT
64 ? (item.attachment as DatabaseMessageExtraMcpPrompt)
65 : item.uploadedFile?.mcpPrompt
66 ? {
67 type: AttachmentType.MCP_PROMPT as const,
68 name: item.name,
69 serverName: item.uploadedFile.mcpPrompt.serverName,
70 promptName: item.uploadedFile.mcpPrompt.promptName,
71 content: item.textContent ?? '',
72 arguments: item.uploadedFile.mcpPrompt.arguments
73 }
74 : null}
75 {#if mcpPrompt}
76 <ChatAttachmentsListItemMcpPrompt
77 class="max-w-[300px] min-w-[200px] flex-shrink-0 {className} {scrollClasses}"
78 prompt={mcpPrompt}
79 {readonly}
80 isLoading={item.isLoading}
81 loadError={item.loadError}
82 onRemove={onFileRemove ? () => onFileRemove(item.id) : undefined}
83 />
84 {/if}
85 {:else if isMcpResource(item)}
86 {@const mcpResource = item.attachment as DatabaseMessageExtraMcpResource}
87
88 <ChatAttachmentsListItemMcpResource
89 class="flex-shrink-0 {className} {scrollClasses}"
90 attachment={toMcpResourceAttachment(mcpResource, item.id)}
91 onclick={() => onMcpResourcePreview?.(mcpResource)}
92 />
93 {:else if item.isImage && item.preview}
94 <ChatAttachmentsListItemThumbnailImage
95 class="flex-shrink-0 cursor-pointer {className} {scrollClasses}"
96 id={item.id}
97 name={item.name}
98 preview={item.preview}
99 {readonly}
100 onRemove={onFileRemove}
101 height={imageHeight}
102 width={imageWidth}
103 {imageClass}
104 onclick={() => onPreview?.(item)}
105 />
106 {:else if isPdfFile(item.attachment, item.uploadedFile)}
107 <ChatAttachmentsListItemThumbnailFile
108 class="flex-shrink-0 cursor-pointer {className} {scrollClasses}"
109 id={item.id}
110 name={item.name}
111 size={item.size}
112 {readonly}
113 onRemove={onFileRemove}
114 textContent={item.textContent}
115 attachment={item.attachment}
116 uploadedFile={item.uploadedFile}
117 onclick={() => onPreview?.(item)}
118 />
119 {:else}
120 <ChatAttachmentsListItemThumbnailFile
121 class="flex-shrink-0 cursor-pointer {className} {scrollClasses}"
122 id={item.id}
123 name={item.name}
124 size={item.size}
125 {readonly}
126 onRemove={onFileRemove}
127 textContent={item.textContent}
128 attachment={item.attachment}
129 uploadedFile={item.uploadedFile}
130 onclick={() => onPreview?.(item)}
131 />
132 {/if}