]> git.djapps.eu Git - pkg/ggml/sources/llama.cpp/blob
4337bb6a1e782a52a09146c9af36dec0196c0066
[pkg/ggml/sources/llama.cpp] /
1 <script lang="ts">
2 import { ChevronDown, ShieldQuestion } from '@lucide/svelte';
3 import { ChatMessageActionCard } from '$lib/components/app';
4 import { Button, buttonVariants } from '$lib/components/ui/button';
5 import * as ButtonGroup from '$lib/components/ui/button-group';
6 import { cn } from '$lib/components/ui/utils';
7 import * as DropdownMenu from '$lib/components/ui/dropdown-menu';
8 import { ToolSource, ToolPermissionDecision } from '$lib/enums';
9 import { TOOL_SERVER_LABELS } from '$lib/constants';
10 import { toolsStore } from '$lib/stores/tools.svelte';
11
12 interface Props {
13 toolName: string;
14 serverLabel: string;
15 onDecision: (decision: ToolPermissionDecision) => void;
16 }
17
18 let { toolName, serverLabel, onDecision }: Props = $props();
19 </script>
20
21 <ChatMessageActionCard icon={ShieldQuestion}>
22 {#snippet message()}
23 Allow use of <span class="font-semibold">{toolName}</span>{#if serverLabel}
24 from <span class="font-semibold">{serverLabel}</span>{/if}?
25 {/snippet}
26
27 {#snippet actions()}
28 <DropdownMenu.Root>
29 <ButtonGroup.Root class="overflow-hidden rounded-md shadow-sm">
30 <Button
31 variant="secondary"
32 size="sm"
33 class="!rounded-r-none !shadow-none"
34 onclick={() => onDecision(ToolPermissionDecision.ONCE)}
35 >
36 Allow once
37 </Button>
38
39 <ButtonGroup.Separator />
40
41 <DropdownMenu.Trigger
42 class={cn(
43 buttonVariants({ variant: 'secondary', size: 'sm' }),
44 'inline-flex cursor-pointer items-center !rounded-l-none !shadow-none !px-2'
45 )}
46 aria-label="More allow options"
47 >
48 <ChevronDown class="h-3.5 w-3.5" />
49 </DropdownMenu.Trigger>
50 </ButtonGroup.Root>
51
52 <DropdownMenu.Content align="start" class="min-w-[8rem]">
53 <DropdownMenu.Item onclick={() => onDecision(ToolPermissionDecision.ALWAYS)}>
54 Always allow <pre>{toolName}</pre>
55 tool
56 </DropdownMenu.Item>
57 {#if serverLabel}
58 <DropdownMenu.Item onclick={() => onDecision(ToolPermissionDecision.ALWAYS_SERVER)}>
59 Always allow all tools from {serverLabel}
60 </DropdownMenu.Item>
61 {:else}
62 {@const source = toolsStore.getToolSource(toolName)}
63 {@const providerName =
64 source === ToolSource.BUILTIN
65 ? TOOL_SERVER_LABELS[ToolSource.BUILTIN]
66 : source === ToolSource.CUSTOM
67 ? TOOL_SERVER_LABELS[ToolSource.CUSTOM]
68 : 'MCP Tools'}
69 <DropdownMenu.Item onclick={() => onDecision(ToolPermissionDecision.ALWAYS_SERVER)}>
70 Approve all tools from {providerName}
71 </DropdownMenu.Item>
72 {/if}
73 </DropdownMenu.Content>
74 </DropdownMenu.Root>
75
76 <Button variant="destructive" size="sm" onclick={() => onDecision(ToolPermissionDecision.DENY)}>
77 Deny
78 </Button>
79 {/snippet}
80 </ChatMessageActionCard>