File size: 2,242 Bytes
6b9d0d8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
<script lang="ts">

	import { Button } from '$lib/components/ui/button';

	import * as Dialog from '$lib/components/ui/dialog';

	import { McpServerForm } from '$lib/components/app/mcp';

	import { mcpStore } from '$lib/stores/mcp.svelte';

	import { conversationsStore } from '$lib/stores/conversations.svelte';

	import { uuid } from '$lib/utils';

	import { MCP_SERVER_ID_PREFIX } from '$lib/constants';



	interface Props {

		open: boolean;

		onOpenChange?: (open: boolean) => void;

	}



	let { open = $bindable(), onOpenChange }: Props = $props();



	let newServerUrl = $state('');

	let newServerHeaders = $state('');

	let newServerUrlError = $derived.by(() => {

		if (!newServerUrl.trim()) return 'URL is required';

		try {

			new URL(newServerUrl);



			return null;

		} catch {

			return 'Invalid URL format';

		}

	});



	function handleOpenChange(value: boolean) {

		if (!value) {

			newServerUrl = '';

			newServerHeaders = '';

		}

		open = value;

		onOpenChange?.(value);

	}



	function saveNewServer() {

		if (newServerUrlError) return;



		const newServerId = uuid() ?? `${MCP_SERVER_ID_PREFIX}-${Date.now()}`;



		mcpStore.addServer({

			id: newServerId,

			enabled: true,

			url: newServerUrl.trim(),

			headers: newServerHeaders.trim() || undefined

		});



		conversationsStore.setMcpServerOverride(newServerId, true);



		handleOpenChange(false);

	}

</script>

<Dialog.Root {open} onOpenChange={handleOpenChange}>
	<Dialog.Content class="sm:max-w-md">
		<Dialog.Header>
			<Dialog.Title>Add New Server</Dialog.Title>
		</Dialog.Header>

		<div class="space-y-4 py-4">
			<McpServerForm

				url={newServerUrl}

				headers={newServerHeaders}

				onUrlChange={(v) => (newServerUrl = v)}
				onHeadersChange={(v) => (newServerHeaders = v)}
				urlError={newServerUrl ? newServerUrlError : null}
				id="new-server"
			/>
		</div>

		<Dialog.Footer>
			<Button variant="secondary" size="sm" onclick={() => handleOpenChange(false)}>Cancel</Button>

			<Button

				variant="default"

				size="sm"

				onclick={saveNewServer}

				disabled={!!newServerUrlError}

				aria-label="Save"

			>
				Add
			</Button>
		</Dialog.Footer>
	</Dialog.Content>
</Dialog.Root>