@executor-js/plugin-mcp 1.4.31 → 1.4.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{AddMcpSource-3HUBFR3K.js → AddMcpSource-PADMBVX2.js} +3 -4
- package/dist/{AddMcpSource-3HUBFR3K.js.map → AddMcpSource-PADMBVX2.js.map} +1 -1
- package/dist/{EditMcpSource-UVGSSC2R.js → EditMcpSource-L5GC2B4J.js} +3 -4
- package/dist/{EditMcpSource-UVGSSC2R.js.map → EditMcpSource-L5GC2B4J.js.map} +1 -1
- package/dist/{McpSourceSummary-UWVCAJOU.js → McpSourceSummary-LE3WXFUE.js} +3 -4
- package/dist/{McpSourceSummary-UWVCAJOU.js.map → McpSourceSummary-LE3WXFUE.js.map} +1 -1
- package/dist/{chunk-3TGDWTNE.js → chunk-6OYEXHU3.js} +6 -3
- package/dist/{chunk-3TGDWTNE.js.map → chunk-6OYEXHU3.js.map} +1 -1
- package/dist/{chunk-2A4H3UVR.js → chunk-FMTVLO5L.js} +2 -2
- package/dist/{chunk-H5PLTEMB.js → chunk-LEGVPKYH.js} +182 -28
- package/dist/chunk-LEGVPKYH.js.map +1 -0
- package/dist/client.js +3 -4
- package/dist/client.js.map +1 -1
- package/dist/core.js +2 -3
- package/dist/index.js +2 -3
- package/dist/sdk/errors.d.ts +19 -0
- package/dist/sdk/invoke.d.ts +5 -5
- package/dist/{stdio-connector-MDW6PW36.js → stdio-connector-AA5S6UUJ.js} +1 -3
- package/dist/{stdio-connector-MDW6PW36.js.map → stdio-connector-AA5S6UUJ.js.map} +1 -1
- package/dist/testing.js +11 -13787
- package/dist/testing.js.map +1 -1
- package/package.json +6 -6
- package/dist/chunk-H5PLTEMB.js.map +0 -1
- package/dist/chunk-PZ5AY32C.js +0 -10
- package/dist/chunk-PZ5AY32C.js.map +0 -1
- /package/dist/{chunk-2A4H3UVR.js.map → chunk-FMTVLO5L.js.map} +0 -0
|
@@ -7,9 +7,8 @@ import {
|
|
|
7
7
|
import {
|
|
8
8
|
addMcpSourceOptimistic,
|
|
9
9
|
probeMcpEndpoint
|
|
10
|
-
} from "./chunk-
|
|
11
|
-
import "./chunk-
|
|
12
|
-
import "./chunk-PZ5AY32C.js";
|
|
10
|
+
} from "./chunk-FMTVLO5L.js";
|
|
11
|
+
import "./chunk-6OYEXHU3.js";
|
|
13
12
|
|
|
14
13
|
// src/react/AddMcpSource.tsx
|
|
15
14
|
import { useReducer, useCallback, useEffect, useRef, useState } from "react";
|
|
@@ -686,4 +685,4 @@ function AddMcpSource(props) {
|
|
|
686
685
|
export {
|
|
687
686
|
AddMcpSource as default
|
|
688
687
|
};
|
|
689
|
-
//# sourceMappingURL=AddMcpSource-
|
|
688
|
+
//# sourceMappingURL=AddMcpSource-PADMBVX2.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/react/AddMcpSource.tsx"],"sourcesContent":["import { useReducer, useCallback, useEffect, useRef, useState } from \"react\";\nimport { useAtomSet } from \"@effect/atom-react\";\nimport * as Exit from \"effect/Exit\";\nimport * as Match from \"effect/Match\";\nimport * as Option from \"effect/Option\";\nimport * as Schema from \"effect/Schema\";\n\nimport { useScope } from \"@executor-js/react/api/scope-context\";\nimport { Button } from \"@executor-js/react/components/button\";\nimport {\n CardStack,\n CardStackContent,\n CardStackEntryField,\n} from \"@executor-js/react/components/card-stack\";\nimport { FieldLabel } from \"@executor-js/react/components/field\";\nimport { FilterTabs } from \"@executor-js/react/components/filter-tabs\";\nimport { FloatActions } from \"@executor-js/react/components/float-actions\";\nimport { Input } from \"@executor-js/react/components/input\";\nimport { Spinner } from \"@executor-js/react/components/spinner\";\nimport { Textarea } from \"@executor-js/react/components/textarea\";\nimport {\n emptyHttpCredentials,\n httpCredentialsValid,\n HttpCredentialsEditor,\n serializeConfigureHttpCredentials,\n serializeHttpCredentials,\n serializeTemplateHttpCredentials,\n} from \"@executor-js/react/plugins/http-credentials\";\nimport {\n sourceDisplayNameFromUrl,\n slugifyNamespace,\n SourceIdentityFields,\n useSourceIdentity,\n} from \"@executor-js/react/plugins/source-identity\";\nimport { useSecretPickerSecrets } from \"@executor-js/react/plugins/use-secret-picker-secrets\";\nimport {\n oauthCallbackUrl,\n oauthConnectionId,\n useOAuthPopupFlow,\n type OAuthCompletionPayload,\n} from \"@executor-js/react/plugins/oauth-sign-in\";\nimport {\n CredentialControlField,\n CredentialUsageRow,\n useCredentialTargetScope,\n} from \"@executor-js/react/plugins/credential-target-scope\";\nimport {\n defaultHeaderAuthPresets,\n type HeaderAuthPreset,\n} from \"@executor-js/react/plugins/secret-header-auth\";\n\ntype RemoteAuthMode = \"none\" | \"oauth2\";\nimport { sourceWriteKeys } from \"@executor-js/react/api/reactivity-keys\";\nimport { probeMcpEndpoint, addMcpSourceOptimistic } from \"./atoms\";\nimport { McpRemoteSourceFields } from \"./McpRemoteSourceFields\";\nimport { mcpPresets, type McpPreset } from \"../sdk/presets\";\nimport type { McpConfiguredValueInput, McpCredentialInput } from \"../sdk/types\";\n\nconst mcpHeaderPresets: readonly HeaderAuthPreset[] = [\n { key: \"text\", label: \"Plaintext header\", name: \"\", valueKind: \"text\" },\n ...defaultHeaderAuthPresets,\n];\n\nconst ErrorMessage = Schema.Struct({ message: Schema.String });\nconst decodeErrorMessage = Schema.decodeUnknownOption(ErrorMessage);\nconst STDIO_ENV_ESCAPE_REPLACEMENTS: Readonly<Record<string, string>> = {\n \"\\\\\": \"\\\\\",\n n: \"\\n\",\n r: \"\\r\",\n t: \"\\t\",\n '\"': '\"',\n};\n\nconst errorMessageFromExit = (exit: Exit.Exit<unknown, unknown>, fallback: string): string =>\n Option.match(Option.flatMap(Exit.findErrorOption(exit), decodeErrorMessage), {\n onNone: () => fallback,\n onSome: ({ message }) => message,\n });\n\n// ---------------------------------------------------------------------------\n// Preset lookup\n// ---------------------------------------------------------------------------\n\nfunction findPreset(id: string | undefined): McpPreset | undefined {\n if (!id) return undefined;\n return mcpPresets.find((p) => p.id === id);\n}\n\n// ---------------------------------------------------------------------------\n// State machine (remote flow)\n// ---------------------------------------------------------------------------\n\ntype OAuthTokens = OAuthCompletionPayload;\n\ntype ProbeResult = {\n connected: boolean;\n requiresOAuth: boolean;\n supportsDynamicRegistration: boolean;\n name: string;\n namespace: string;\n toolCount: number | null;\n serverName: string | null;\n};\n\ntype State =\n | { step: \"url\"; url: string }\n | { step: \"probing\"; url: string; probe: ProbeResult | null }\n | { step: \"probed\"; url: string; probe: ProbeResult }\n | { step: \"oauth-starting\"; url: string; probe: ProbeResult }\n | {\n step: \"oauth-waiting\";\n url: string;\n probe: ProbeResult;\n sessionId: string;\n }\n | { step: \"oauth-done\"; url: string; probe: ProbeResult; tokens: OAuthTokens }\n | {\n step: \"adding\";\n url: string;\n probe: ProbeResult;\n tokens: OAuthTokens | null;\n }\n | {\n step: \"error\";\n url: string;\n probe: ProbeResult | null;\n tokens: OAuthTokens | null;\n error: string;\n };\n\ntype Action =\n | { type: \"set-url\"; url: string }\n | { type: \"probe-start\" }\n | { type: \"probe-ok\"; probe: ProbeResult }\n | { type: \"probe-fail\"; error: string }\n | { type: \"oauth-start\" }\n | { type: \"oauth-waiting\"; sessionId: string }\n | { type: \"oauth-ok\"; tokens: OAuthTokens }\n | { type: \"oauth-fail\"; error: string }\n | { type: \"oauth-cancelled\" }\n | { type: \"oauth-reset\" }\n | { type: \"add-start\" }\n | { type: \"add-fail\"; error: string }\n | { type: \"retry\" };\n\nconst init: State = { step: \"url\", url: \"\" };\n\nfunction reducer(state: State, action: Action): State {\n return Match.value(action).pipe(\n Match.discriminator(\"type\")(\"set-url\", (a): State => ({ step: \"url\", url: a.url })),\n Match.discriminator(\"type\")(\n \"probe-start\",\n (): State => ({\n step: \"probing\",\n url: state.url,\n probe: \"probe\" in state ? state.probe : null,\n }),\n ),\n Match.discriminator(\"type\")(\n \"probe-ok\",\n (a): State => ({ step: \"probed\", url: state.url, probe: a.probe }),\n ),\n Match.discriminator(\"type\")(\n \"probe-fail\",\n (a): State => ({\n step: \"error\",\n url: state.url,\n probe: null,\n tokens: null,\n error: a.error,\n }),\n ),\n Match.discriminator(\"type\")(\"oauth-start\", (): State => {\n if (state.step !== \"probed\" && state.step !== \"error\") return state;\n return {\n step: \"oauth-starting\",\n url: state.url,\n probe: state.step === \"probed\" ? state.probe : state.probe!,\n };\n }),\n Match.discriminator(\"type\")(\"oauth-waiting\", (a): State => {\n if (state.step !== \"oauth-starting\") return state;\n return {\n step: \"oauth-waiting\",\n url: state.url,\n probe: state.probe,\n sessionId: a.sessionId,\n };\n }),\n Match.discriminator(\"type\")(\"oauth-ok\", (a): State => {\n if (state.step !== \"oauth-waiting\") return state;\n return {\n step: \"oauth-done\",\n url: state.url,\n probe: state.probe,\n tokens: a.tokens,\n };\n }),\n Match.discriminator(\"type\")(\"oauth-fail\", (a): State => {\n if (state.step !== \"oauth-starting\" && state.step !== \"oauth-waiting\") return state;\n return {\n step: \"error\",\n url: state.url,\n probe: state.probe,\n tokens: null,\n error: a.error,\n };\n }),\n Match.discriminator(\"type\")(\"oauth-cancelled\", (): State => {\n if (state.step !== \"oauth-waiting\") return state;\n return { step: \"probed\", url: state.url, probe: state.probe };\n }),\n Match.discriminator(\"type\")(\"oauth-reset\", (): State => {\n if (\"probe\" in state && state.probe) {\n return { step: \"probed\", url: state.url, probe: state.probe };\n }\n return state;\n }),\n Match.discriminator(\"type\")(\"add-start\", (): State => {\n const tokens =\n state.step === \"oauth-done\" ? state.tokens : state.step === \"probed\" ? null : null;\n const probe = \"probe\" in state ? state.probe : null;\n if (!probe) return state;\n return { step: \"adding\", url: state.url, probe, tokens };\n }),\n Match.discriminator(\"type\")(\"add-fail\", (a): State => {\n if (state.step !== \"adding\") return state;\n return {\n step: \"error\",\n url: state.url,\n probe: state.probe,\n tokens: state.tokens,\n error: a.error,\n };\n }),\n Match.discriminator(\"type\")(\"retry\", (): State => {\n if (state.step !== \"error\") return state;\n return state.probe\n ? state.tokens\n ? {\n step: \"oauth-done\",\n url: state.url,\n probe: state.probe,\n tokens: state.tokens,\n }\n : { step: \"probed\", url: state.url, probe: state.probe }\n : { step: \"url\", url: state.url };\n }),\n Match.exhaustive,\n );\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport default function AddMcpSource(props: {\n onComplete: () => void;\n onCancel: () => void;\n initialUrl?: string;\n initialPreset?: string;\n /** Whether the stdio transport is enabled on the server. */\n allowStdio?: boolean;\n}) {\n const allowStdio = props.allowStdio ?? false;\n const rawPreset = findPreset(props.initialPreset);\n // Drop stdio presets when stdio is disabled — the caller should have\n // already filtered these out, but defence-in-depth.\n const preset = rawPreset?.transport === \"stdio\" && !allowStdio ? undefined : rawPreset;\n const isStdioPreset = preset?.transport === \"stdio\";\n\n const [transport, setTransport] = useState<\"remote\" | \"stdio\">(\n isStdioPreset && allowStdio ? \"stdio\" : \"remote\",\n );\n\n // --- Stdio state ---\n const [stdioCommand, setStdioCommand] = useState(isStdioPreset ? preset.command : \"\");\n const [stdioArgs, setStdioArgs] = useState(\n isStdioPreset && preset.args ? preset.args.join(\" \") : \"\",\n );\n const [stdioEnv, setStdioEnv] = useState(\"\");\n const stdioIdentity = useSourceIdentity({\n fallbackName: isStdioPreset ? preset.name : stdioCommand,\n });\n const [stdioAdding, setStdioAdding] = useState(false);\n const [stdioError, setStdioError] = useState<string | null>(null);\n\n // --- Remote state ---\n const remoteUrl =\n !isStdioPreset && preset?.transport === undefined && preset?.url\n ? preset.url\n : (props.initialUrl ?? \"\");\n\n const [state, dispatch] = useReducer(\n reducer,\n remoteUrl ? { step: \"url\" as const, url: remoteUrl } : init,\n );\n\n const scopeId = useScope();\n const { credentialTargetScope: requestCredentialTargetScope } = useCredentialTargetScope();\n const {\n credentialTargetScope: oauthCredentialTargetScope,\n setCredentialTargetScope: setOAuthCredentialTargetScope,\n credentialScopeOptions,\n } = useCredentialTargetScope();\n const doProbe = useAtomSet(probeMcpEndpoint, { mode: \"promiseExit\" });\n const doAdd = useAtomSet(addMcpSourceOptimistic(scopeId), {\n mode: \"promiseExit\",\n });\n const secretList = useSecretPickerSecrets();\n const oauth = useOAuthPopupFlow<OAuthCompletionPayload>({\n popupName: \"mcp-oauth\",\n popupBlockedMessage: \"OAuth popup was blocked\",\n detectPopupClosed: false,\n startErrorMessage: \"Failed to start OAuth\",\n });\n\n const [remoteAuthMode, setRemoteAuthMode] = useState<RemoteAuthMode>(\"none\");\n const [remoteCredentials, setRemoteCredentials] = useState(() => emptyHttpCredentials());\n\n const probe = \"probe\" in state ? state.probe : null;\n const tokens = \"tokens\" in state ? state.tokens : null;\n\n const remoteIdentity = useSourceIdentity({\n fallbackName:\n sourceDisplayNameFromUrl(state.url, \"MCP\") ?? probe?.serverName ?? probe?.name ?? \"\",\n });\n const isProbing = state.step === \"probing\";\n const isAdding = state.step === \"adding\";\n const isOAuthBusy =\n state.step === \"oauth-starting\" || state.step === \"oauth-waiting\" || oauth.busy;\n const canUseNone = probe?.requiresOAuth !== true || probe.supportsDynamicRegistration === false;\n const remoteCredentialsComplete = httpCredentialsValid(remoteCredentials);\n const authReady = remoteAuthMode === \"none\" ? canUseNone : tokens !== null;\n const canAdd =\n Boolean(probe) && authReady && remoteCredentialsComplete && !isAdding && !isOAuthBusy;\n // Probe failures are shown inline on the URL field; other failures\n // (OAuth start, add source) render in the bottom error block.\n const probeError = state.step === \"error\" && state.probe === null ? state.error : null;\n const otherError = state.step === \"error\" && state.probe !== null ? state.error : null;\n\n // ---- Remote actions ----\n\n const handleProbe = useCallback(async () => {\n dispatch({ type: \"probe-start\" });\n const { headers, queryParams } = serializeHttpCredentials(remoteCredentials);\n const exit = await doProbe({\n params: { scopeId },\n payload: {\n endpoint: state.url.trim(),\n ...(Object.keys(headers).length > 0 ? { headers } : {}),\n ...(Object.keys(queryParams).length > 0 ? { queryParams } : {}),\n },\n });\n if (Exit.isFailure(exit)) {\n dispatch({\n type: \"probe-fail\",\n error: errorMessageFromExit(exit, \"Failed to connect\"),\n });\n return;\n }\n setRemoteAuthMode(exit.value.requiresOAuth ? \"oauth2\" : \"none\");\n dispatch({ type: \"probe-ok\", probe: exit.value });\n }, [state.url, scopeId, doProbe, remoteCredentials]);\n\n // Keep the latest handleProbe in a ref so the debounced effect can call it\n // without depending on its identity (which changes every render).\n const handleProbeRef = useRef(handleProbe);\n handleProbeRef.current = handleProbe;\n\n // Auto-probe whenever the URL changes (debounced) while we're on the\n // remote transport and not already probing/probed.\n useEffect(() => {\n if (transport !== \"remote\") return;\n if (state.step !== \"url\") return;\n const trimmed = state.url.trim();\n if (!trimmed) return;\n const handle = setTimeout(() => {\n handleProbeRef.current();\n }, 400);\n return () => clearTimeout(handle);\n }, [transport, state.step, state.url]);\n\n const handleRemoteCredentialsChange = useCallback((next: typeof remoteCredentials) => {\n setRemoteCredentials(next);\n }, []);\n\n const handleOAuth = useCallback(async () => {\n dispatch({ type: \"oauth-start\" });\n const namespaceSlug =\n slugifyNamespace(remoteIdentity.namespace) ||\n slugifyNamespace(probe?.namespace ?? \"\") ||\n \"mcp\";\n const { headers, queryParams } = serializeHttpCredentials(remoteCredentials);\n await oauth.start({\n payload: {\n endpoint: state.url.trim(),\n ...(Object.keys(headers).length > 0 ? { headers } : {}),\n ...(Object.keys(queryParams).length > 0 ? { queryParams } : {}),\n redirectUrl: oauthCallbackUrl(),\n connectionId: oauthConnectionId({\n pluginId: \"mcp\",\n namespace: namespaceSlug,\n }),\n tokenScope: oauthCredentialTargetScope,\n strategy: { kind: \"dynamic-dcr\" },\n pluginId: \"mcp\",\n identityLabel: `${remoteIdentity.name.trim() || probe?.serverName || probe?.name || \"MCP\"} OAuth`,\n },\n onSuccess: (result) => {\n dispatch({\n type: \"oauth-ok\",\n tokens: {\n connectionId: result.connectionId,\n expiresAt: result.expiresAt,\n scope: result.scope,\n },\n });\n },\n onAuthorizationStarted: (result) =>\n dispatch({ type: \"oauth-waiting\", sessionId: result.sessionId }),\n onError: (error) => dispatch({ type: \"oauth-fail\", error }),\n });\n }, [state.url, remoteIdentity, probe, remoteCredentials, oauth, oauthCredentialTargetScope]);\n\n const handleCancelOAuth = useCallback(() => {\n oauth.cancel();\n dispatch({ type: \"oauth-cancelled\" });\n }, [oauth]);\n\n const handleAddRemote = useCallback(async () => {\n if (!probe) return;\n dispatch({ type: \"add-start\" });\n const templateCredentials = serializeTemplateHttpCredentials(remoteCredentials);\n const configureCredentials = serializeConfigureHttpCredentials(\n remoteCredentials,\n requestCredentialTargetScope,\n );\n const remoteRequestHeaders = templateCredentials.headers as Record<\n string,\n McpConfiguredValueInput\n >;\n const hasInitialCredentials =\n Object.keys(configureCredentials.headers).length > 0 ||\n Object.keys(configureCredentials.queryParams).length > 0 ||\n (remoteAuthMode === \"oauth2\" && tokens);\n const displayName = remoteIdentity.name.trim() || probe.serverName || probe.name;\n const slugNamespace = slugifyNamespace(remoteIdentity.namespace);\n const exit = await doAdd({\n params: { scopeId },\n payload: {\n transport: \"remote\" as const,\n name: displayName,\n namespace: slugNamespace || undefined,\n endpoint: state.url.trim(),\n ...(Object.keys(remoteRequestHeaders).length > 0 ? { headers: remoteRequestHeaders } : {}),\n ...(Object.keys(templateCredentials.queryParams).length > 0\n ? {\n queryParams: templateCredentials.queryParams as Record<\n string,\n McpConfiguredValueInput\n >,\n }\n : {}),\n ...(hasInitialCredentials\n ? {\n credentials: {\n scope: requestCredentialTargetScope,\n ...(Object.keys(configureCredentials.headers).length > 0\n ? {\n headers: configureCredentials.headers as Record<string, McpCredentialInput>,\n }\n : {}),\n ...(Object.keys(configureCredentials.queryParams).length > 0\n ? {\n queryParams: configureCredentials.queryParams as Record<\n string,\n McpCredentialInput\n >,\n }\n : {}),\n ...(remoteAuthMode === \"oauth2\" && tokens\n ? {\n auth: {\n oauth2: {\n connection: {\n kind: \"connection\" as const,\n connectionId: tokens.connectionId,\n },\n },\n },\n }\n : {}),\n },\n }\n : {}),\n },\n reactivityKeys: sourceWriteKeys,\n });\n if (Exit.isFailure(exit)) {\n dispatch({\n type: \"add-fail\",\n error: errorMessageFromExit(exit, \"Failed to add source\"),\n });\n return;\n }\n props.onComplete();\n }, [\n probe,\n remoteAuthMode,\n remoteCredentials,\n remoteIdentity,\n tokens,\n state.url,\n doAdd,\n props,\n scopeId,\n requestCredentialTargetScope,\n ]);\n\n // ---- Stdio actions ----\n\n const parseStdioArgs = (raw: string): string[] => {\n if (!raw.trim()) return [];\n const args: string[] = [];\n const regex = /[^\\s\"]+|\"([^\"]*)\"/g;\n let match;\n while ((match = regex.exec(raw)) !== null) {\n args.push(match[1] ?? match[0]);\n }\n return args;\n };\n\n const parseStdioEnvValue = (raw: string): string => {\n const value = raw.trim();\n if (value.length < 2) return value;\n\n const quote = value[0];\n if ((quote !== '\"' && quote !== \"'\") || value[value.length - 1] !== quote) {\n return value;\n }\n\n const inner = value.slice(1, -1);\n if (quote === \"'\") return inner;\n\n return inner.replace(\n /\\\\([\\\\nrt\"])/g,\n (_, escaped: string) => STDIO_ENV_ESCAPE_REPLACEMENTS[escaped] ?? escaped,\n );\n };\n\n const parseStdioEnv = (raw: string): Record<string, string> | undefined => {\n if (!raw.trim()) return undefined;\n const env: Record<string, string> = {};\n for (const line of raw.split(\"\\n\")) {\n const eq = line.indexOf(\"=\");\n if (eq > 0) {\n env[line.slice(0, eq).trim()] = parseStdioEnvValue(line.slice(eq + 1));\n }\n }\n return Object.keys(env).length > 0 ? env : undefined;\n };\n\n const handleAddStdio = useCallback(async () => {\n const cmd = stdioCommand.trim();\n if (!cmd) return;\n setStdioAdding(true);\n setStdioError(null);\n const displayName = stdioIdentity.name.trim() || cmd;\n const slugNamespace = slugifyNamespace(stdioIdentity.namespace);\n const exit = await doAdd({\n params: { scopeId },\n payload: {\n transport: \"stdio\" as const,\n name: displayName,\n namespace: slugNamespace || undefined,\n command: cmd,\n args: parseStdioArgs(stdioArgs),\n env: parseStdioEnv(stdioEnv),\n },\n reactivityKeys: sourceWriteKeys,\n });\n if (Exit.isFailure(exit)) {\n setStdioError(errorMessageFromExit(exit, \"Failed to add source\"));\n setStdioAdding(false);\n return;\n }\n props.onComplete();\n }, [stdioCommand, stdioArgs, stdioEnv, stdioIdentity, doAdd, scopeId, props]);\n\n // ---- Render ----\n\n return (\n <div className=\"flex flex-1 flex-col gap-6\">\n <div>\n <h1 className=\"text-xl font-semibold text-foreground\">Add MCP Source</h1>\n <p className=\"mt-1 text-[13px] text-muted-foreground\">\n Connect to an MCP server to discover and use its tools.\n </p>\n </div>\n\n {/* Transport toggle — only shown when stdio is enabled server-side */}\n {allowStdio && (\n <div className=\"flex gap-1 rounded-lg border border-border bg-muted/30 p-1\">\n <Button\n variant=\"ghost\"\n type=\"button\"\n onClick={() => setTransport(\"remote\")}\n className={`flex-1 rounded-md px-3 py-1.5 text-sm font-medium transition-colors ${\n transport === \"remote\"\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground hover:text-foreground\"\n }`}\n >\n Remote\n </Button>\n <Button\n variant=\"ghost\"\n type=\"button\"\n onClick={() => setTransport(\"stdio\")}\n className={`flex-1 rounded-md px-3 py-1.5 text-sm font-medium transition-colors ${\n transport === \"stdio\"\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground hover:text-foreground\"\n }`}\n >\n Stdio\n </Button>\n </div>\n )}\n\n {transport === \"remote\" ? (\n <>\n <McpRemoteSourceFields\n url={state.url}\n onUrlChange={(url) => dispatch({ type: \"set-url\", url })}\n identity={remoteIdentity}\n preview={probe}\n probing={isProbing}\n error={probeError}\n onRetry={handleProbe}\n />\n\n <HttpCredentialsEditor\n credentials={remoteCredentials}\n onChange={handleRemoteCredentialsChange}\n existingSecrets={secretList}\n sourceName={remoteIdentity.name}\n targetScope={requestCredentialTargetScope}\n credentialScopeOptions={credentialScopeOptions}\n bindingScopeOptions={credentialScopeOptions}\n headerPresets={mcpHeaderPresets}\n labels={{\n headers: \"Request headers\",\n queryParams: \"Query parameters\",\n }}\n />\n\n {/* Authentication */}\n {probe && (\n <section className=\"space-y-2.5\">\n <div className=\"flex items-center justify-between gap-3\">\n <FieldLabel>Authentication</FieldLabel>\n <FilterTabs<RemoteAuthMode>\n tabs={\n probe.requiresOAuth && probe.supportsDynamicRegistration\n ? [{ value: \"oauth2\", label: \"OAuth\" }]\n : [\n { value: \"none\", label: \"None\" },\n { value: \"oauth2\", label: \"OAuth\" },\n ]\n }\n value={remoteAuthMode}\n onChange={setRemoteAuthMode}\n />\n </div>\n\n {remoteAuthMode === \"oauth2\" && (\n <CredentialUsageRow\n value={oauthCredentialTargetScope}\n options={credentialScopeOptions}\n onChange={(targetScope) => {\n setOAuthCredentialTargetScope(targetScope);\n dispatch({ type: \"oauth-reset\" });\n }}\n label=\"Connection saved to\"\n help=\"Choose who can use the OAuth connection.\"\n >\n <CredentialControlField\n label=\"Connect via OAuth\"\n help=\"Start the provider OAuth flow.\"\n >\n {!tokens &&\n state.step === \"probed\" &&\n (probe.supportsDynamicRegistration ? (\n <Button\n type=\"button\"\n onClick={handleOAuth}\n variant=\"outline\"\n className=\"w-full\"\n >\n Sign in\n </Button>\n ) : (\n <div className=\"rounded-md border border-border bg-muted/30 px-3 py-2 text-xs text-muted-foreground\">\n This server requires OAuth, but its authorization server does not support\n dynamic client registration. Use request headers with a bearer token, or\n save the source and connect a supported OAuth connection later.\n </div>\n ))}\n\n {!tokens && state.step === \"oauth-starting\" && (\n <div className=\"flex min-h-9 items-center gap-2 rounded-md border border-border bg-muted/30 px-3 py-2\">\n <Spinner className=\"size-3.5\" />\n <span className=\"text-xs text-muted-foreground\">\n Starting authorization...\n </span>\n </div>\n )}\n\n {!tokens && state.step === \"oauth-waiting\" && (\n <div className=\"flex min-h-9 items-center gap-2 rounded-md border border-blue-500/30 bg-blue-500/5 px-3 py-2\">\n <Spinner className=\"size-3.5 text-blue-500\" />\n <span className=\"text-xs text-blue-600 dark:text-blue-400\">\n Waiting for authorization...\n </span>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleCancelOAuth}\n className=\"ml-auto h-7 px-2 text-xs\"\n >\n Cancel\n </Button>\n </div>\n )}\n\n {tokens && (\n <div className=\"flex min-h-9 items-center gap-2 rounded-md border border-emerald-500/30 bg-emerald-500/5 px-3 py-2\">\n <svg viewBox=\"0 0 16 16\" fill=\"none\" className=\"size-3.5 text-emerald-500\">\n <path\n d=\"M3 8.5l3 3 7-7\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <span className=\"text-xs font-medium text-emerald-600 dark:text-emerald-400\">\n Authenticated\n </span>\n </div>\n )}\n </CredentialControlField>\n </CredentialUsageRow>\n )}\n </section>\n )}\n\n {/* Error (OAuth / add source). Probe errors show inline on the field. */}\n {otherError && (\n <div className=\"space-y-2\">\n <div className=\"rounded-lg border border-destructive/30 bg-destructive/5 px-3 py-2\">\n <p className=\"text-[12px] text-destructive\">{otherError}</p>\n </div>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => dispatch({ type: \"retry\" })}\n className=\"text-xs\"\n >\n Try again\n </Button>\n </div>\n )}\n\n <FloatActions>\n <Button\n type=\"button\"\n variant=\"ghost\"\n onClick={() => {\n oauth.cancel();\n props.onCancel();\n }}\n disabled={isAdding}\n >\n Cancel\n </Button>\n {(probe || isProbing) && (\n <Button type=\"button\" onClick={handleAddRemote} disabled={!canAdd}>\n {isAdding ? (\n <>\n <Spinner className=\"size-3.5\" /> Adding…\n </>\n ) : (\n \"Add source\"\n )}\n </Button>\n )}\n </FloatActions>\n </>\n ) : (\n <>\n {/* Stdio form */}\n <CardStack>\n <CardStackContent className=\"border-t-0\">\n <CardStackEntryField\n label=\"Command\"\n description=\"- The executable to run (e.g. npx, uvx, node).\"\n >\n <Input\n value={stdioCommand}\n onChange={(e) => setStdioCommand((e.target as HTMLInputElement).value)}\n placeholder=\"npx\"\n className=\"font-mono text-sm\"\n />\n </CardStackEntryField>\n\n <CardStackEntryField\n label=\"Arguments\"\n description=\"- Space-separated arguments passed to the command.\"\n >\n <Input\n value={stdioArgs}\n onChange={(e) => setStdioArgs((e.target as HTMLInputElement).value)}\n placeholder=\"-y chrome-devtools-mcp@latest\"\n className=\"font-mono text-sm\"\n />\n </CardStackEntryField>\n\n <CardStackEntryField\n label=\"Environment variables\"\n description=\"- One per line, KEY=value format.\"\n >\n <Textarea\n value={stdioEnv}\n onChange={(e) => setStdioEnv((e.target as HTMLTextAreaElement).value)}\n placeholder={\"KEY=value\\nANOTHER=value\"}\n rows={3}\n maxRows={10}\n className=\"font-mono text-sm\"\n />\n </CardStackEntryField>\n </CardStackContent>\n </CardStack>\n\n <SourceIdentityFields identity={stdioIdentity} namePlaceholder=\"My MCP Server\" />\n\n {/* Stdio error */}\n {stdioError && (\n <div className=\"rounded-lg border border-destructive/30 bg-destructive/5 px-3 py-2\">\n <p className=\"text-[12px] text-destructive\">{stdioError}</p>\n </div>\n )}\n\n <FloatActions>\n <Button type=\"button\" variant=\"ghost\" onClick={props.onCancel} disabled={stdioAdding}>\n Cancel\n </Button>\n <Button\n type=\"button\"\n onClick={handleAddStdio}\n disabled={!stdioCommand.trim() || stdioAdding}\n >\n {stdioAdding ? (\n <>\n <Spinner className=\"size-3.5\" /> Adding…\n </>\n ) : (\n \"Add source\"\n )}\n </Button>\n </FloatActions>\n </>\n )}\n </div>\n );\n}\n"],"mappings":"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","names":["match","value"]}
|
|
1
|
+
{"version":3,"sources":["../src/react/AddMcpSource.tsx"],"sourcesContent":["import { useReducer, useCallback, useEffect, useRef, useState } from \"react\";\nimport { useAtomSet } from \"@effect/atom-react\";\nimport * as Exit from \"effect/Exit\";\nimport * as Match from \"effect/Match\";\nimport * as Option from \"effect/Option\";\nimport * as Schema from \"effect/Schema\";\n\nimport { useScope } from \"@executor-js/react/api/scope-context\";\nimport { Button } from \"@executor-js/react/components/button\";\nimport {\n CardStack,\n CardStackContent,\n CardStackEntryField,\n} from \"@executor-js/react/components/card-stack\";\nimport { FieldLabel } from \"@executor-js/react/components/field\";\nimport { FilterTabs } from \"@executor-js/react/components/filter-tabs\";\nimport { FloatActions } from \"@executor-js/react/components/float-actions\";\nimport { Input } from \"@executor-js/react/components/input\";\nimport { Spinner } from \"@executor-js/react/components/spinner\";\nimport { Textarea } from \"@executor-js/react/components/textarea\";\nimport {\n emptyHttpCredentials,\n httpCredentialsValid,\n HttpCredentialsEditor,\n serializeConfigureHttpCredentials,\n serializeHttpCredentials,\n serializeTemplateHttpCredentials,\n} from \"@executor-js/react/plugins/http-credentials\";\nimport {\n sourceDisplayNameFromUrl,\n slugifyNamespace,\n SourceIdentityFields,\n useSourceIdentity,\n} from \"@executor-js/react/plugins/source-identity\";\nimport { useSecretPickerSecrets } from \"@executor-js/react/plugins/use-secret-picker-secrets\";\nimport {\n oauthCallbackUrl,\n oauthConnectionId,\n useOAuthPopupFlow,\n type OAuthCompletionPayload,\n} from \"@executor-js/react/plugins/oauth-sign-in\";\nimport {\n CredentialControlField,\n CredentialUsageRow,\n useCredentialTargetScope,\n} from \"@executor-js/react/plugins/credential-target-scope\";\nimport {\n defaultHeaderAuthPresets,\n type HeaderAuthPreset,\n} from \"@executor-js/react/plugins/secret-header-auth\";\n\ntype RemoteAuthMode = \"none\" | \"oauth2\";\nimport { sourceWriteKeys } from \"@executor-js/react/api/reactivity-keys\";\nimport { probeMcpEndpoint, addMcpSourceOptimistic } from \"./atoms\";\nimport { McpRemoteSourceFields } from \"./McpRemoteSourceFields\";\nimport { mcpPresets, type McpPreset } from \"../sdk/presets\";\nimport type { McpConfiguredValueInput, McpCredentialInput } from \"../sdk/types\";\n\nconst mcpHeaderPresets: readonly HeaderAuthPreset[] = [\n { key: \"text\", label: \"Plaintext header\", name: \"\", valueKind: \"text\" },\n ...defaultHeaderAuthPresets,\n];\n\nconst ErrorMessage = Schema.Struct({ message: Schema.String });\nconst decodeErrorMessage = Schema.decodeUnknownOption(ErrorMessage);\nconst STDIO_ENV_ESCAPE_REPLACEMENTS: Readonly<Record<string, string>> = {\n \"\\\\\": \"\\\\\",\n n: \"\\n\",\n r: \"\\r\",\n t: \"\\t\",\n '\"': '\"',\n};\n\nconst errorMessageFromExit = (exit: Exit.Exit<unknown, unknown>, fallback: string): string =>\n Option.match(Option.flatMap(Exit.findErrorOption(exit), decodeErrorMessage), {\n onNone: () => fallback,\n onSome: ({ message }) => message,\n });\n\n// ---------------------------------------------------------------------------\n// Preset lookup\n// ---------------------------------------------------------------------------\n\nfunction findPreset(id: string | undefined): McpPreset | undefined {\n if (!id) return undefined;\n return mcpPresets.find((p) => p.id === id);\n}\n\n// ---------------------------------------------------------------------------\n// State machine (remote flow)\n// ---------------------------------------------------------------------------\n\ntype OAuthTokens = OAuthCompletionPayload;\n\ntype ProbeResult = {\n connected: boolean;\n requiresOAuth: boolean;\n supportsDynamicRegistration: boolean;\n name: string;\n namespace: string;\n toolCount: number | null;\n serverName: string | null;\n};\n\ntype State =\n | { step: \"url\"; url: string }\n | { step: \"probing\"; url: string; probe: ProbeResult | null }\n | { step: \"probed\"; url: string; probe: ProbeResult }\n | { step: \"oauth-starting\"; url: string; probe: ProbeResult }\n | {\n step: \"oauth-waiting\";\n url: string;\n probe: ProbeResult;\n sessionId: string;\n }\n | { step: \"oauth-done\"; url: string; probe: ProbeResult; tokens: OAuthTokens }\n | {\n step: \"adding\";\n url: string;\n probe: ProbeResult;\n tokens: OAuthTokens | null;\n }\n | {\n step: \"error\";\n url: string;\n probe: ProbeResult | null;\n tokens: OAuthTokens | null;\n error: string;\n };\n\ntype Action =\n | { type: \"set-url\"; url: string }\n | { type: \"probe-start\" }\n | { type: \"probe-ok\"; probe: ProbeResult }\n | { type: \"probe-fail\"; error: string }\n | { type: \"oauth-start\" }\n | { type: \"oauth-waiting\"; sessionId: string }\n | { type: \"oauth-ok\"; tokens: OAuthTokens }\n | { type: \"oauth-fail\"; error: string }\n | { type: \"oauth-cancelled\" }\n | { type: \"oauth-reset\" }\n | { type: \"add-start\" }\n | { type: \"add-fail\"; error: string }\n | { type: \"retry\" };\n\nconst init: State = { step: \"url\", url: \"\" };\n\nfunction reducer(state: State, action: Action): State {\n return Match.value(action).pipe(\n Match.discriminator(\"type\")(\"set-url\", (a): State => ({ step: \"url\", url: a.url })),\n Match.discriminator(\"type\")(\n \"probe-start\",\n (): State => ({\n step: \"probing\",\n url: state.url,\n probe: \"probe\" in state ? state.probe : null,\n }),\n ),\n Match.discriminator(\"type\")(\n \"probe-ok\",\n (a): State => ({ step: \"probed\", url: state.url, probe: a.probe }),\n ),\n Match.discriminator(\"type\")(\n \"probe-fail\",\n (a): State => ({\n step: \"error\",\n url: state.url,\n probe: null,\n tokens: null,\n error: a.error,\n }),\n ),\n Match.discriminator(\"type\")(\"oauth-start\", (): State => {\n if (state.step !== \"probed\" && state.step !== \"error\") return state;\n return {\n step: \"oauth-starting\",\n url: state.url,\n probe: state.step === \"probed\" ? state.probe : state.probe!,\n };\n }),\n Match.discriminator(\"type\")(\"oauth-waiting\", (a): State => {\n if (state.step !== \"oauth-starting\") return state;\n return {\n step: \"oauth-waiting\",\n url: state.url,\n probe: state.probe,\n sessionId: a.sessionId,\n };\n }),\n Match.discriminator(\"type\")(\"oauth-ok\", (a): State => {\n if (state.step !== \"oauth-waiting\") return state;\n return {\n step: \"oauth-done\",\n url: state.url,\n probe: state.probe,\n tokens: a.tokens,\n };\n }),\n Match.discriminator(\"type\")(\"oauth-fail\", (a): State => {\n if (state.step !== \"oauth-starting\" && state.step !== \"oauth-waiting\") return state;\n return {\n step: \"error\",\n url: state.url,\n probe: state.probe,\n tokens: null,\n error: a.error,\n };\n }),\n Match.discriminator(\"type\")(\"oauth-cancelled\", (): State => {\n if (state.step !== \"oauth-waiting\") return state;\n return { step: \"probed\", url: state.url, probe: state.probe };\n }),\n Match.discriminator(\"type\")(\"oauth-reset\", (): State => {\n if (\"probe\" in state && state.probe) {\n return { step: \"probed\", url: state.url, probe: state.probe };\n }\n return state;\n }),\n Match.discriminator(\"type\")(\"add-start\", (): State => {\n const tokens =\n state.step === \"oauth-done\" ? state.tokens : state.step === \"probed\" ? null : null;\n const probe = \"probe\" in state ? state.probe : null;\n if (!probe) return state;\n return { step: \"adding\", url: state.url, probe, tokens };\n }),\n Match.discriminator(\"type\")(\"add-fail\", (a): State => {\n if (state.step !== \"adding\") return state;\n return {\n step: \"error\",\n url: state.url,\n probe: state.probe,\n tokens: state.tokens,\n error: a.error,\n };\n }),\n Match.discriminator(\"type\")(\"retry\", (): State => {\n if (state.step !== \"error\") return state;\n return state.probe\n ? state.tokens\n ? {\n step: \"oauth-done\",\n url: state.url,\n probe: state.probe,\n tokens: state.tokens,\n }\n : { step: \"probed\", url: state.url, probe: state.probe }\n : { step: \"url\", url: state.url };\n }),\n Match.exhaustive,\n );\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport default function AddMcpSource(props: {\n onComplete: () => void;\n onCancel: () => void;\n initialUrl?: string;\n initialPreset?: string;\n /** Whether the stdio transport is enabled on the server. */\n allowStdio?: boolean;\n}) {\n const allowStdio = props.allowStdio ?? false;\n const rawPreset = findPreset(props.initialPreset);\n // Drop stdio presets when stdio is disabled — the caller should have\n // already filtered these out, but defence-in-depth.\n const preset = rawPreset?.transport === \"stdio\" && !allowStdio ? undefined : rawPreset;\n const isStdioPreset = preset?.transport === \"stdio\";\n\n const [transport, setTransport] = useState<\"remote\" | \"stdio\">(\n isStdioPreset && allowStdio ? \"stdio\" : \"remote\",\n );\n\n // --- Stdio state ---\n const [stdioCommand, setStdioCommand] = useState(isStdioPreset ? preset.command : \"\");\n const [stdioArgs, setStdioArgs] = useState(\n isStdioPreset && preset.args ? preset.args.join(\" \") : \"\",\n );\n const [stdioEnv, setStdioEnv] = useState(\"\");\n const stdioIdentity = useSourceIdentity({\n fallbackName: isStdioPreset ? preset.name : stdioCommand,\n });\n const [stdioAdding, setStdioAdding] = useState(false);\n const [stdioError, setStdioError] = useState<string | null>(null);\n\n // --- Remote state ---\n const remoteUrl =\n !isStdioPreset && preset?.transport === undefined && preset?.url\n ? preset.url\n : (props.initialUrl ?? \"\");\n\n const [state, dispatch] = useReducer(\n reducer,\n remoteUrl ? { step: \"url\" as const, url: remoteUrl } : init,\n );\n\n const scopeId = useScope();\n const { credentialTargetScope: requestCredentialTargetScope } = useCredentialTargetScope();\n const {\n credentialTargetScope: oauthCredentialTargetScope,\n setCredentialTargetScope: setOAuthCredentialTargetScope,\n credentialScopeOptions,\n } = useCredentialTargetScope();\n const doProbe = useAtomSet(probeMcpEndpoint, { mode: \"promiseExit\" });\n const doAdd = useAtomSet(addMcpSourceOptimistic(scopeId), {\n mode: \"promiseExit\",\n });\n const secretList = useSecretPickerSecrets();\n const oauth = useOAuthPopupFlow<OAuthCompletionPayload>({\n popupName: \"mcp-oauth\",\n popupBlockedMessage: \"OAuth popup was blocked\",\n detectPopupClosed: false,\n startErrorMessage: \"Failed to start OAuth\",\n });\n\n const [remoteAuthMode, setRemoteAuthMode] = useState<RemoteAuthMode>(\"none\");\n const [remoteCredentials, setRemoteCredentials] = useState(() => emptyHttpCredentials());\n\n const probe = \"probe\" in state ? state.probe : null;\n const tokens = \"tokens\" in state ? state.tokens : null;\n\n const remoteIdentity = useSourceIdentity({\n fallbackName:\n sourceDisplayNameFromUrl(state.url, \"MCP\") ?? probe?.serverName ?? probe?.name ?? \"\",\n });\n const isProbing = state.step === \"probing\";\n const isAdding = state.step === \"adding\";\n const isOAuthBusy =\n state.step === \"oauth-starting\" || state.step === \"oauth-waiting\" || oauth.busy;\n const canUseNone = probe?.requiresOAuth !== true || probe.supportsDynamicRegistration === false;\n const remoteCredentialsComplete = httpCredentialsValid(remoteCredentials);\n const authReady = remoteAuthMode === \"none\" ? canUseNone : tokens !== null;\n const canAdd =\n Boolean(probe) && authReady && remoteCredentialsComplete && !isAdding && !isOAuthBusy;\n // Probe failures are shown inline on the URL field; other failures\n // (OAuth start, add source) render in the bottom error block.\n const probeError = state.step === \"error\" && state.probe === null ? state.error : null;\n const otherError = state.step === \"error\" && state.probe !== null ? state.error : null;\n\n // ---- Remote actions ----\n\n const handleProbe = useCallback(async () => {\n dispatch({ type: \"probe-start\" });\n const { headers, queryParams } = serializeHttpCredentials(remoteCredentials);\n const exit = await doProbe({\n params: { scopeId },\n payload: {\n endpoint: state.url.trim(),\n ...(Object.keys(headers).length > 0 ? { headers } : {}),\n ...(Object.keys(queryParams).length > 0 ? { queryParams } : {}),\n },\n });\n if (Exit.isFailure(exit)) {\n dispatch({\n type: \"probe-fail\",\n error: errorMessageFromExit(exit, \"Failed to connect\"),\n });\n return;\n }\n setRemoteAuthMode(exit.value.requiresOAuth ? \"oauth2\" : \"none\");\n dispatch({ type: \"probe-ok\", probe: exit.value });\n }, [state.url, scopeId, doProbe, remoteCredentials]);\n\n // Keep the latest handleProbe in a ref so the debounced effect can call it\n // without depending on its identity (which changes every render).\n const handleProbeRef = useRef(handleProbe);\n handleProbeRef.current = handleProbe;\n\n // Auto-probe whenever the URL changes (debounced) while we're on the\n // remote transport and not already probing/probed.\n useEffect(() => {\n if (transport !== \"remote\") return;\n if (state.step !== \"url\") return;\n const trimmed = state.url.trim();\n if (!trimmed) return;\n const handle = setTimeout(() => {\n handleProbeRef.current();\n }, 400);\n return () => clearTimeout(handle);\n }, [transport, state.step, state.url]);\n\n const handleRemoteCredentialsChange = useCallback((next: typeof remoteCredentials) => {\n setRemoteCredentials(next);\n }, []);\n\n const handleOAuth = useCallback(async () => {\n dispatch({ type: \"oauth-start\" });\n const namespaceSlug =\n slugifyNamespace(remoteIdentity.namespace) ||\n slugifyNamespace(probe?.namespace ?? \"\") ||\n \"mcp\";\n const { headers, queryParams } = serializeHttpCredentials(remoteCredentials);\n await oauth.start({\n payload: {\n endpoint: state.url.trim(),\n ...(Object.keys(headers).length > 0 ? { headers } : {}),\n ...(Object.keys(queryParams).length > 0 ? { queryParams } : {}),\n redirectUrl: oauthCallbackUrl(),\n connectionId: oauthConnectionId({\n pluginId: \"mcp\",\n namespace: namespaceSlug,\n }),\n tokenScope: oauthCredentialTargetScope,\n strategy: { kind: \"dynamic-dcr\" },\n pluginId: \"mcp\",\n identityLabel: `${remoteIdentity.name.trim() || probe?.serverName || probe?.name || \"MCP\"} OAuth`,\n },\n onSuccess: (result) => {\n dispatch({\n type: \"oauth-ok\",\n tokens: {\n connectionId: result.connectionId,\n expiresAt: result.expiresAt,\n scope: result.scope,\n },\n });\n },\n onAuthorizationStarted: (result) =>\n dispatch({ type: \"oauth-waiting\", sessionId: result.sessionId }),\n onError: (error) => dispatch({ type: \"oauth-fail\", error }),\n });\n }, [state.url, remoteIdentity, probe, remoteCredentials, oauth, oauthCredentialTargetScope]);\n\n const handleCancelOAuth = useCallback(() => {\n oauth.cancel();\n dispatch({ type: \"oauth-cancelled\" });\n }, [oauth]);\n\n const handleAddRemote = useCallback(async () => {\n if (!probe) return;\n dispatch({ type: \"add-start\" });\n const templateCredentials = serializeTemplateHttpCredentials(remoteCredentials);\n const configureCredentials = serializeConfigureHttpCredentials(\n remoteCredentials,\n requestCredentialTargetScope,\n );\n const remoteRequestHeaders = templateCredentials.headers as Record<\n string,\n McpConfiguredValueInput\n >;\n const hasInitialCredentials =\n Object.keys(configureCredentials.headers).length > 0 ||\n Object.keys(configureCredentials.queryParams).length > 0 ||\n (remoteAuthMode === \"oauth2\" && tokens);\n const displayName = remoteIdentity.name.trim() || probe.serverName || probe.name;\n const slugNamespace = slugifyNamespace(remoteIdentity.namespace);\n const exit = await doAdd({\n params: { scopeId },\n payload: {\n transport: \"remote\" as const,\n name: displayName,\n namespace: slugNamespace || undefined,\n endpoint: state.url.trim(),\n ...(Object.keys(remoteRequestHeaders).length > 0 ? { headers: remoteRequestHeaders } : {}),\n ...(Object.keys(templateCredentials.queryParams).length > 0\n ? {\n queryParams: templateCredentials.queryParams as Record<\n string,\n McpConfiguredValueInput\n >,\n }\n : {}),\n ...(hasInitialCredentials\n ? {\n credentials: {\n scope: requestCredentialTargetScope,\n ...(Object.keys(configureCredentials.headers).length > 0\n ? {\n headers: configureCredentials.headers as Record<string, McpCredentialInput>,\n }\n : {}),\n ...(Object.keys(configureCredentials.queryParams).length > 0\n ? {\n queryParams: configureCredentials.queryParams as Record<\n string,\n McpCredentialInput\n >,\n }\n : {}),\n ...(remoteAuthMode === \"oauth2\" && tokens\n ? {\n auth: {\n oauth2: {\n connection: {\n kind: \"connection\" as const,\n connectionId: tokens.connectionId,\n },\n },\n },\n }\n : {}),\n },\n }\n : {}),\n },\n reactivityKeys: sourceWriteKeys,\n });\n if (Exit.isFailure(exit)) {\n dispatch({\n type: \"add-fail\",\n error: errorMessageFromExit(exit, \"Failed to add source\"),\n });\n return;\n }\n props.onComplete();\n }, [\n probe,\n remoteAuthMode,\n remoteCredentials,\n remoteIdentity,\n tokens,\n state.url,\n doAdd,\n props,\n scopeId,\n requestCredentialTargetScope,\n ]);\n\n // ---- Stdio actions ----\n\n const parseStdioArgs = (raw: string): string[] => {\n if (!raw.trim()) return [];\n const args: string[] = [];\n const regex = /[^\\s\"]+|\"([^\"]*)\"/g;\n let match;\n while ((match = regex.exec(raw)) !== null) {\n args.push(match[1] ?? match[0]);\n }\n return args;\n };\n\n const parseStdioEnvValue = (raw: string): string => {\n const value = raw.trim();\n if (value.length < 2) return value;\n\n const quote = value[0];\n if ((quote !== '\"' && quote !== \"'\") || value[value.length - 1] !== quote) {\n return value;\n }\n\n const inner = value.slice(1, -1);\n if (quote === \"'\") return inner;\n\n return inner.replace(\n /\\\\([\\\\nrt\"])/g,\n (_, escaped: string) => STDIO_ENV_ESCAPE_REPLACEMENTS[escaped] ?? escaped,\n );\n };\n\n const parseStdioEnv = (raw: string): Record<string, string> | undefined => {\n if (!raw.trim()) return undefined;\n const env: Record<string, string> = {};\n for (const line of raw.split(\"\\n\")) {\n const eq = line.indexOf(\"=\");\n if (eq > 0) {\n env[line.slice(0, eq).trim()] = parseStdioEnvValue(line.slice(eq + 1));\n }\n }\n return Object.keys(env).length > 0 ? env : undefined;\n };\n\n const handleAddStdio = useCallback(async () => {\n const cmd = stdioCommand.trim();\n if (!cmd) return;\n setStdioAdding(true);\n setStdioError(null);\n const displayName = stdioIdentity.name.trim() || cmd;\n const slugNamespace = slugifyNamespace(stdioIdentity.namespace);\n const exit = await doAdd({\n params: { scopeId },\n payload: {\n transport: \"stdio\" as const,\n name: displayName,\n namespace: slugNamespace || undefined,\n command: cmd,\n args: parseStdioArgs(stdioArgs),\n env: parseStdioEnv(stdioEnv),\n },\n reactivityKeys: sourceWriteKeys,\n });\n if (Exit.isFailure(exit)) {\n setStdioError(errorMessageFromExit(exit, \"Failed to add source\"));\n setStdioAdding(false);\n return;\n }\n props.onComplete();\n }, [stdioCommand, stdioArgs, stdioEnv, stdioIdentity, doAdd, scopeId, props]);\n\n // ---- Render ----\n\n return (\n <div className=\"flex flex-1 flex-col gap-6\">\n <div>\n <h1 className=\"text-xl font-semibold text-foreground\">Add MCP Source</h1>\n <p className=\"mt-1 text-[13px] text-muted-foreground\">\n Connect to an MCP server to discover and use its tools.\n </p>\n </div>\n\n {/* Transport toggle — only shown when stdio is enabled server-side */}\n {allowStdio && (\n <div className=\"flex gap-1 rounded-lg border border-border bg-muted/30 p-1\">\n <Button\n variant=\"ghost\"\n type=\"button\"\n onClick={() => setTransport(\"remote\")}\n className={`flex-1 rounded-md px-3 py-1.5 text-sm font-medium transition-colors ${\n transport === \"remote\"\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground hover:text-foreground\"\n }`}\n >\n Remote\n </Button>\n <Button\n variant=\"ghost\"\n type=\"button\"\n onClick={() => setTransport(\"stdio\")}\n className={`flex-1 rounded-md px-3 py-1.5 text-sm font-medium transition-colors ${\n transport === \"stdio\"\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground hover:text-foreground\"\n }`}\n >\n Stdio\n </Button>\n </div>\n )}\n\n {transport === \"remote\" ? (\n <>\n <McpRemoteSourceFields\n url={state.url}\n onUrlChange={(url) => dispatch({ type: \"set-url\", url })}\n identity={remoteIdentity}\n preview={probe}\n probing={isProbing}\n error={probeError}\n onRetry={handleProbe}\n />\n\n <HttpCredentialsEditor\n credentials={remoteCredentials}\n onChange={handleRemoteCredentialsChange}\n existingSecrets={secretList}\n sourceName={remoteIdentity.name}\n targetScope={requestCredentialTargetScope}\n credentialScopeOptions={credentialScopeOptions}\n bindingScopeOptions={credentialScopeOptions}\n headerPresets={mcpHeaderPresets}\n labels={{\n headers: \"Request headers\",\n queryParams: \"Query parameters\",\n }}\n />\n\n {/* Authentication */}\n {probe && (\n <section className=\"space-y-2.5\">\n <div className=\"flex items-center justify-between gap-3\">\n <FieldLabel>Authentication</FieldLabel>\n <FilterTabs<RemoteAuthMode>\n tabs={\n probe.requiresOAuth && probe.supportsDynamicRegistration\n ? [{ value: \"oauth2\", label: \"OAuth\" }]\n : [\n { value: \"none\", label: \"None\" },\n { value: \"oauth2\", label: \"OAuth\" },\n ]\n }\n value={remoteAuthMode}\n onChange={setRemoteAuthMode}\n />\n </div>\n\n {remoteAuthMode === \"oauth2\" && (\n <CredentialUsageRow\n value={oauthCredentialTargetScope}\n options={credentialScopeOptions}\n onChange={(targetScope) => {\n setOAuthCredentialTargetScope(targetScope);\n dispatch({ type: \"oauth-reset\" });\n }}\n label=\"Connection saved to\"\n help=\"Choose who can use the OAuth connection.\"\n >\n <CredentialControlField\n label=\"Connect via OAuth\"\n help=\"Start the provider OAuth flow.\"\n >\n {!tokens &&\n state.step === \"probed\" &&\n (probe.supportsDynamicRegistration ? (\n <Button\n type=\"button\"\n onClick={handleOAuth}\n variant=\"outline\"\n className=\"w-full\"\n >\n Sign in\n </Button>\n ) : (\n <div className=\"rounded-md border border-border bg-muted/30 px-3 py-2 text-xs text-muted-foreground\">\n This server requires OAuth, but its authorization server does not support\n dynamic client registration. Use request headers with a bearer token, or\n save the source and connect a supported OAuth connection later.\n </div>\n ))}\n\n {!tokens && state.step === \"oauth-starting\" && (\n <div className=\"flex min-h-9 items-center gap-2 rounded-md border border-border bg-muted/30 px-3 py-2\">\n <Spinner className=\"size-3.5\" />\n <span className=\"text-xs text-muted-foreground\">\n Starting authorization...\n </span>\n </div>\n )}\n\n {!tokens && state.step === \"oauth-waiting\" && (\n <div className=\"flex min-h-9 items-center gap-2 rounded-md border border-blue-500/30 bg-blue-500/5 px-3 py-2\">\n <Spinner className=\"size-3.5 text-blue-500\" />\n <span className=\"text-xs text-blue-600 dark:text-blue-400\">\n Waiting for authorization...\n </span>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleCancelOAuth}\n className=\"ml-auto h-7 px-2 text-xs\"\n >\n Cancel\n </Button>\n </div>\n )}\n\n {tokens && (\n <div className=\"flex min-h-9 items-center gap-2 rounded-md border border-emerald-500/30 bg-emerald-500/5 px-3 py-2\">\n <svg viewBox=\"0 0 16 16\" fill=\"none\" className=\"size-3.5 text-emerald-500\">\n <path\n d=\"M3 8.5l3 3 7-7\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <span className=\"text-xs font-medium text-emerald-600 dark:text-emerald-400\">\n Authenticated\n </span>\n </div>\n )}\n </CredentialControlField>\n </CredentialUsageRow>\n )}\n </section>\n )}\n\n {/* Error (OAuth / add source). Probe errors show inline on the field. */}\n {otherError && (\n <div className=\"space-y-2\">\n <div className=\"rounded-lg border border-destructive/30 bg-destructive/5 px-3 py-2\">\n <p className=\"text-[12px] text-destructive\">{otherError}</p>\n </div>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => dispatch({ type: \"retry\" })}\n className=\"text-xs\"\n >\n Try again\n </Button>\n </div>\n )}\n\n <FloatActions>\n <Button\n type=\"button\"\n variant=\"ghost\"\n onClick={() => {\n oauth.cancel();\n props.onCancel();\n }}\n disabled={isAdding}\n >\n Cancel\n </Button>\n {(probe || isProbing) && (\n <Button type=\"button\" onClick={handleAddRemote} disabled={!canAdd}>\n {isAdding ? (\n <>\n <Spinner className=\"size-3.5\" /> Adding…\n </>\n ) : (\n \"Add source\"\n )}\n </Button>\n )}\n </FloatActions>\n </>\n ) : (\n <>\n {/* Stdio form */}\n <CardStack>\n <CardStackContent className=\"border-t-0\">\n <CardStackEntryField\n label=\"Command\"\n description=\"- The executable to run (e.g. npx, uvx, node).\"\n >\n <Input\n value={stdioCommand}\n onChange={(e) => setStdioCommand((e.target as HTMLInputElement).value)}\n placeholder=\"npx\"\n className=\"font-mono text-sm\"\n />\n </CardStackEntryField>\n\n <CardStackEntryField\n label=\"Arguments\"\n description=\"- Space-separated arguments passed to the command.\"\n >\n <Input\n value={stdioArgs}\n onChange={(e) => setStdioArgs((e.target as HTMLInputElement).value)}\n placeholder=\"-y chrome-devtools-mcp@latest\"\n className=\"font-mono text-sm\"\n />\n </CardStackEntryField>\n\n <CardStackEntryField\n label=\"Environment variables\"\n description=\"- One per line, KEY=value format.\"\n >\n <Textarea\n value={stdioEnv}\n onChange={(e) => setStdioEnv((e.target as HTMLTextAreaElement).value)}\n placeholder={\"KEY=value\\nANOTHER=value\"}\n rows={3}\n maxRows={10}\n className=\"font-mono text-sm\"\n />\n </CardStackEntryField>\n </CardStackContent>\n </CardStack>\n\n <SourceIdentityFields identity={stdioIdentity} namePlaceholder=\"My MCP Server\" />\n\n {/* Stdio error */}\n {stdioError && (\n <div className=\"rounded-lg border border-destructive/30 bg-destructive/5 px-3 py-2\">\n <p className=\"text-[12px] text-destructive\">{stdioError}</p>\n </div>\n )}\n\n <FloatActions>\n <Button type=\"button\" variant=\"ghost\" onClick={props.onCancel} disabled={stdioAdding}>\n Cancel\n </Button>\n <Button\n type=\"button\"\n onClick={handleAddStdio}\n disabled={!stdioCommand.trim() || stdioAdding}\n >\n {stdioAdding ? (\n <>\n <Spinner className=\"size-3.5\" /> Adding…\n </>\n ) : (\n \"Add source\"\n )}\n </Button>\n </FloatActions>\n </>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;AAAA,SAAS,YAAY,aAAa,WAAW,QAAQ,gBAAgB;AACrE,SAAS,kBAAkB;AAC3B,YAAY,UAAU;AACtB,YAAY,WAAW;AACvB,YAAY,YAAY;AACxB,YAAY,YAAY;AAExB,SAAS,gBAAgB;AACzB,SAAS,cAAc;AACvB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,kBAAkB;AAC3B,SAAS,kBAAkB;AAC3B,SAAS,oBAAoB;AAC7B,SAAS,aAAa;AACtB,SAAS,eAAe;AACxB,SAAS,gBAAgB;AACzB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,8BAA8B;AACvC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,OAEK;AAGP,SAAS,uBAAuB;AA8hB1B,SAuMY,UAtMV,KADF;AAxhBN,IAAM,mBAAgD;AAAA,EACpD,EAAE,KAAK,QAAQ,OAAO,oBAAoB,MAAM,IAAI,WAAW,OAAO;AAAA,EACtE,GAAG;AACL;AAEA,IAAM,eAAsB,cAAO,EAAE,SAAgB,cAAO,CAAC;AAC7D,IAAM,qBAA4B,2BAAoB,YAAY;AAClE,IAAM,gCAAkE;AAAA,EACtE,MAAM;AAAA,EACN,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,KAAK;AACP;AAEA,IAAM,uBAAuB,CAAC,MAAmC,aACxD,aAAa,eAAa,qBAAgB,IAAI,GAAG,kBAAkB,GAAG;AAAA,EAC3E,QAAQ,MAAM;AAAA,EACd,QAAQ,CAAC,EAAE,QAAQ,MAAM;AAC3B,CAAC;AAMH,SAAS,WAAW,IAA+C;AACjE,MAAI,CAAC,GAAI,QAAO;AAChB,SAAO,WAAW,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAC3C;AA2DA,IAAM,OAAc,EAAE,MAAM,OAAO,KAAK,GAAG;AAE3C,SAAS,QAAQ,OAAc,QAAuB;AACpD,SAAa,YAAM,MAAM,EAAE;AAAA,IACnB,oBAAc,MAAM,EAAE,WAAW,CAAC,OAAc,EAAE,MAAM,OAAO,KAAK,EAAE,IAAI,EAAE;AAAA,IAC5E,oBAAc,MAAM;AAAA,MACxB;AAAA,MACA,OAAc;AAAA,QACZ,MAAM;AAAA,QACN,KAAK,MAAM;AAAA,QACX,OAAO,WAAW,QAAQ,MAAM,QAAQ;AAAA,MAC1C;AAAA,IACF;AAAA,IACM,oBAAc,MAAM;AAAA,MACxB;AAAA,MACA,CAAC,OAAc,EAAE,MAAM,UAAU,KAAK,MAAM,KAAK,OAAO,EAAE,MAAM;AAAA,IAClE;AAAA,IACM,oBAAc,MAAM;AAAA,MACxB;AAAA,MACA,CAAC,OAAc;AAAA,QACb,MAAM;AAAA,QACN,KAAK,MAAM;AAAA,QACX,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,OAAO,EAAE;AAAA,MACX;AAAA,IACF;AAAA,IACM,oBAAc,MAAM,EAAE,eAAe,MAAa;AACtD,UAAI,MAAM,SAAS,YAAY,MAAM,SAAS,QAAS,QAAO;AAC9D,aAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,MAAM;AAAA,QACX,OAAO,MAAM,SAAS,WAAW,MAAM,QAAQ,MAAM;AAAA,MACvD;AAAA,IACF,CAAC;AAAA,IACK,oBAAc,MAAM,EAAE,iBAAiB,CAAC,MAAa;AACzD,UAAI,MAAM,SAAS,iBAAkB,QAAO;AAC5C,aAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,MAAM;AAAA,QACX,OAAO,MAAM;AAAA,QACb,WAAW,EAAE;AAAA,MACf;AAAA,IACF,CAAC;AAAA,IACK,oBAAc,MAAM,EAAE,YAAY,CAAC,MAAa;AACpD,UAAI,MAAM,SAAS,gBAAiB,QAAO;AAC3C,aAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,MAAM;AAAA,QACX,OAAO,MAAM;AAAA,QACb,QAAQ,EAAE;AAAA,MACZ;AAAA,IACF,CAAC;AAAA,IACK,oBAAc,MAAM,EAAE,cAAc,CAAC,MAAa;AACtD,UAAI,MAAM,SAAS,oBAAoB,MAAM,SAAS,gBAAiB,QAAO;AAC9E,aAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,MAAM;AAAA,QACX,OAAO,MAAM;AAAA,QACb,QAAQ;AAAA,QACR,OAAO,EAAE;AAAA,MACX;AAAA,IACF,CAAC;AAAA,IACK,oBAAc,MAAM,EAAE,mBAAmB,MAAa;AAC1D,UAAI,MAAM,SAAS,gBAAiB,QAAO;AAC3C,aAAO,EAAE,MAAM,UAAU,KAAK,MAAM,KAAK,OAAO,MAAM,MAAM;AAAA,IAC9D,CAAC;AAAA,IACK,oBAAc,MAAM,EAAE,eAAe,MAAa;AACtD,UAAI,WAAW,SAAS,MAAM,OAAO;AACnC,eAAO,EAAE,MAAM,UAAU,KAAK,MAAM,KAAK,OAAO,MAAM,MAAM;AAAA,MAC9D;AACA,aAAO;AAAA,IACT,CAAC;AAAA,IACK,oBAAc,MAAM,EAAE,aAAa,MAAa;AACpD,YAAM,SACJ,MAAM,SAAS,eAAe,MAAM,SAAS,MAAM,SAAS,WAAW,OAAO;AAChF,YAAM,QAAQ,WAAW,QAAQ,MAAM,QAAQ;AAC/C,UAAI,CAAC,MAAO,QAAO;AACnB,aAAO,EAAE,MAAM,UAAU,KAAK,MAAM,KAAK,OAAO,OAAO;AAAA,IACzD,CAAC;AAAA,IACK,oBAAc,MAAM,EAAE,YAAY,CAAC,MAAa;AACpD,UAAI,MAAM,SAAS,SAAU,QAAO;AACpC,aAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,MAAM;AAAA,QACX,OAAO,MAAM;AAAA,QACb,QAAQ,MAAM;AAAA,QACd,OAAO,EAAE;AAAA,MACX;AAAA,IACF,CAAC;AAAA,IACK,oBAAc,MAAM,EAAE,SAAS,MAAa;AAChD,UAAI,MAAM,SAAS,QAAS,QAAO;AACnC,aAAO,MAAM,QACT,MAAM,SACJ;AAAA,QACE,MAAM;AAAA,QACN,KAAK,MAAM;AAAA,QACX,OAAO,MAAM;AAAA,QACb,QAAQ,MAAM;AAAA,MAChB,IACA,EAAE,MAAM,UAAU,KAAK,MAAM,KAAK,OAAO,MAAM,MAAM,IACvD,EAAE,MAAM,OAAO,KAAK,MAAM,IAAI;AAAA,IACpC,CAAC;AAAA,IACK;AAAA,EACR;AACF;AAMe,SAAR,aAA8B,OAOlC;AACD,QAAM,aAAa,MAAM,cAAc;AACvC,QAAM,YAAY,WAAW,MAAM,aAAa;AAGhD,QAAM,SAAS,WAAW,cAAc,WAAW,CAAC,aAAa,SAAY;AAC7E,QAAM,gBAAgB,QAAQ,cAAc;AAE5C,QAAM,CAAC,WAAW,YAAY,IAAI;AAAA,IAChC,iBAAiB,aAAa,UAAU;AAAA,EAC1C;AAGA,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,gBAAgB,OAAO,UAAU,EAAE;AACpF,QAAM,CAAC,WAAW,YAAY,IAAI;AAAA,IAChC,iBAAiB,OAAO,OAAO,OAAO,KAAK,KAAK,GAAG,IAAI;AAAA,EACzD;AACA,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,EAAE;AAC3C,QAAM,gBAAgB,kBAAkB;AAAA,IACtC,cAAc,gBAAgB,OAAO,OAAO;AAAA,EAC9C,CAAC;AACD,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,KAAK;AACpD,QAAM,CAAC,YAAY,aAAa,IAAI,SAAwB,IAAI;AAGhE,QAAM,YACJ,CAAC,iBAAiB,QAAQ,cAAc,UAAa,QAAQ,MACzD,OAAO,MACN,MAAM,cAAc;AAE3B,QAAM,CAAC,OAAO,QAAQ,IAAI;AAAA,IACxB;AAAA,IACA,YAAY,EAAE,MAAM,OAAgB,KAAK,UAAU,IAAI;AAAA,EACzD;AAEA,QAAM,UAAU,SAAS;AACzB,QAAM,EAAE,uBAAuB,6BAA6B,IAAI,yBAAyB;AACzF,QAAM;AAAA,IACJ,uBAAuB;AAAA,IACvB,0BAA0B;AAAA,IAC1B;AAAA,EACF,IAAI,yBAAyB;AAC7B,QAAM,UAAU,WAAW,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACpE,QAAM,QAAQ,WAAW,uBAAuB,OAAO,GAAG;AAAA,IACxD,MAAM;AAAA,EACR,CAAC;AACD,QAAM,aAAa,uBAAuB;AAC1C,QAAM,QAAQ,kBAA0C;AAAA,IACtD,WAAW;AAAA,IACX,qBAAqB;AAAA,IACrB,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,EACrB,CAAC;AAED,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAyB,MAAM;AAC3E,QAAM,CAAC,mBAAmB,oBAAoB,IAAI,SAAS,MAAM,qBAAqB,CAAC;AAEvF,QAAM,QAAQ,WAAW,QAAQ,MAAM,QAAQ;AAC/C,QAAM,SAAS,YAAY,QAAQ,MAAM,SAAS;AAElD,QAAM,iBAAiB,kBAAkB;AAAA,IACvC,cACE,yBAAyB,MAAM,KAAK,KAAK,KAAK,OAAO,cAAc,OAAO,QAAQ;AAAA,EACtF,CAAC;AACD,QAAM,YAAY,MAAM,SAAS;AACjC,QAAM,WAAW,MAAM,SAAS;AAChC,QAAM,cACJ,MAAM,SAAS,oBAAoB,MAAM,SAAS,mBAAmB,MAAM;AAC7E,QAAM,aAAa,OAAO,kBAAkB,QAAQ,MAAM,gCAAgC;AAC1F,QAAM,4BAA4B,qBAAqB,iBAAiB;AACxE,QAAM,YAAY,mBAAmB,SAAS,aAAa,WAAW;AACtE,QAAM,SACJ,QAAQ,KAAK,KAAK,aAAa,6BAA6B,CAAC,YAAY,CAAC;AAG5E,QAAM,aAAa,MAAM,SAAS,WAAW,MAAM,UAAU,OAAO,MAAM,QAAQ;AAClF,QAAM,aAAa,MAAM,SAAS,WAAW,MAAM,UAAU,OAAO,MAAM,QAAQ;AAIlF,QAAM,cAAc,YAAY,YAAY;AAC1C,aAAS,EAAE,MAAM,cAAc,CAAC;AAChC,UAAM,EAAE,SAAS,YAAY,IAAI,yBAAyB,iBAAiB;AAC3E,UAAM,OAAO,MAAM,QAAQ;AAAA,MACzB,QAAQ,EAAE,QAAQ;AAAA,MAClB,SAAS;AAAA,QACP,UAAU,MAAM,IAAI,KAAK;AAAA,QACzB,GAAI,OAAO,KAAK,OAAO,EAAE,SAAS,IAAI,EAAE,QAAQ,IAAI,CAAC;AAAA,QACrD,GAAI,OAAO,KAAK,WAAW,EAAE,SAAS,IAAI,EAAE,YAAY,IAAI,CAAC;AAAA,MAC/D;AAAA,IACF,CAAC;AACD,QAAS,eAAU,IAAI,GAAG;AACxB,eAAS;AAAA,QACP,MAAM;AAAA,QACN,OAAO,qBAAqB,MAAM,mBAAmB;AAAA,MACvD,CAAC;AACD;AAAA,IACF;AACA,sBAAkB,KAAK,MAAM,gBAAgB,WAAW,MAAM;AAC9D,aAAS,EAAE,MAAM,YAAY,OAAO,KAAK,MAAM,CAAC;AAAA,EAClD,GAAG,CAAC,MAAM,KAAK,SAAS,SAAS,iBAAiB,CAAC;AAInD,QAAM,iBAAiB,OAAO,WAAW;AACzC,iBAAe,UAAU;AAIzB,YAAU,MAAM;AACd,QAAI,cAAc,SAAU;AAC5B,QAAI,MAAM,SAAS,MAAO;AAC1B,UAAM,UAAU,MAAM,IAAI,KAAK;AAC/B,QAAI,CAAC,QAAS;AACd,UAAM,SAAS,WAAW,MAAM;AAC9B,qBAAe,QAAQ;AAAA,IACzB,GAAG,GAAG;AACN,WAAO,MAAM,aAAa,MAAM;AAAA,EAClC,GAAG,CAAC,WAAW,MAAM,MAAM,MAAM,GAAG,CAAC;AAErC,QAAM,gCAAgC,YAAY,CAAC,SAAmC;AACpF,yBAAqB,IAAI;AAAA,EAC3B,GAAG,CAAC,CAAC;AAEL,QAAM,cAAc,YAAY,YAAY;AAC1C,aAAS,EAAE,MAAM,cAAc,CAAC;AAChC,UAAM,gBACJ,iBAAiB,eAAe,SAAS,KACzC,iBAAiB,OAAO,aAAa,EAAE,KACvC;AACF,UAAM,EAAE,SAAS,YAAY,IAAI,yBAAyB,iBAAiB;AAC3E,UAAM,MAAM,MAAM;AAAA,MAChB,SAAS;AAAA,QACP,UAAU,MAAM,IAAI,KAAK;AAAA,QACzB,GAAI,OAAO,KAAK,OAAO,EAAE,SAAS,IAAI,EAAE,QAAQ,IAAI,CAAC;AAAA,QACrD,GAAI,OAAO,KAAK,WAAW,EAAE,SAAS,IAAI,EAAE,YAAY,IAAI,CAAC;AAAA,QAC7D,aAAa,iBAAiB;AAAA,QAC9B,cAAc,kBAAkB;AAAA,UAC9B,UAAU;AAAA,UACV,WAAW;AAAA,QACb,CAAC;AAAA,QACD,YAAY;AAAA,QACZ,UAAU,EAAE,MAAM,cAAc;AAAA,QAChC,UAAU;AAAA,QACV,eAAe,GAAG,eAAe,KAAK,KAAK,KAAK,OAAO,cAAc,OAAO,QAAQ,KAAK;AAAA,MAC3F;AAAA,MACA,WAAW,CAAC,WAAW;AACrB,iBAAS;AAAA,UACP,MAAM;AAAA,UACN,QAAQ;AAAA,YACN,cAAc,OAAO;AAAA,YACrB,WAAW,OAAO;AAAA,YAClB,OAAO,OAAO;AAAA,UAChB;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA,wBAAwB,CAAC,WACvB,SAAS,EAAE,MAAM,iBAAiB,WAAW,OAAO,UAAU,CAAC;AAAA,MACjE,SAAS,CAAC,UAAU,SAAS,EAAE,MAAM,cAAc,MAAM,CAAC;AAAA,IAC5D,CAAC;AAAA,EACH,GAAG,CAAC,MAAM,KAAK,gBAAgB,OAAO,mBAAmB,OAAO,0BAA0B,CAAC;AAE3F,QAAM,oBAAoB,YAAY,MAAM;AAC1C,UAAM,OAAO;AACb,aAAS,EAAE,MAAM,kBAAkB,CAAC;AAAA,EACtC,GAAG,CAAC,KAAK,CAAC;AAEV,QAAM,kBAAkB,YAAY,YAAY;AAC9C,QAAI,CAAC,MAAO;AACZ,aAAS,EAAE,MAAM,YAAY,CAAC;AAC9B,UAAM,sBAAsB,iCAAiC,iBAAiB;AAC9E,UAAM,uBAAuB;AAAA,MAC3B;AAAA,MACA;AAAA,IACF;AACA,UAAM,uBAAuB,oBAAoB;AAIjD,UAAM,wBACJ,OAAO,KAAK,qBAAqB,OAAO,EAAE,SAAS,KACnD,OAAO,KAAK,qBAAqB,WAAW,EAAE,SAAS,KACtD,mBAAmB,YAAY;AAClC,UAAM,cAAc,eAAe,KAAK,KAAK,KAAK,MAAM,cAAc,MAAM;AAC5E,UAAM,gBAAgB,iBAAiB,eAAe,SAAS;AAC/D,UAAM,OAAO,MAAM,MAAM;AAAA,MACvB,QAAQ,EAAE,QAAQ;AAAA,MAClB,SAAS;AAAA,QACP,WAAW;AAAA,QACX,MAAM;AAAA,QACN,WAAW,iBAAiB;AAAA,QAC5B,UAAU,MAAM,IAAI,KAAK;AAAA,QACzB,GAAI,OAAO,KAAK,oBAAoB,EAAE,SAAS,IAAI,EAAE,SAAS,qBAAqB,IAAI,CAAC;AAAA,QACxF,GAAI,OAAO,KAAK,oBAAoB,WAAW,EAAE,SAAS,IACtD;AAAA,UACE,aAAa,oBAAoB;AAAA,QAInC,IACA,CAAC;AAAA,QACL,GAAI,wBACA;AAAA,UACE,aAAa;AAAA,YACX,OAAO;AAAA,YACP,GAAI,OAAO,KAAK,qBAAqB,OAAO,EAAE,SAAS,IACnD;AAAA,cACE,SAAS,qBAAqB;AAAA,YAChC,IACA,CAAC;AAAA,YACL,GAAI,OAAO,KAAK,qBAAqB,WAAW,EAAE,SAAS,IACvD;AAAA,cACE,aAAa,qBAAqB;AAAA,YAIpC,IACA,CAAC;AAAA,YACL,GAAI,mBAAmB,YAAY,SAC/B;AAAA,cACE,MAAM;AAAA,gBACJ,QAAQ;AAAA,kBACN,YAAY;AAAA,oBACV,MAAM;AAAA,oBACN,cAAc,OAAO;AAAA,kBACvB;AAAA,gBACF;AAAA,cACF;AAAA,YACF,IACA,CAAC;AAAA,UACP;AAAA,QACF,IACA,CAAC;AAAA,MACP;AAAA,MACA,gBAAgB;AAAA,IAClB,CAAC;AACD,QAAS,eAAU,IAAI,GAAG;AACxB,eAAS;AAAA,QACP,MAAM;AAAA,QACN,OAAO,qBAAqB,MAAM,sBAAsB;AAAA,MAC1D,CAAC;AACD;AAAA,IACF;AACA,UAAM,WAAW;AAAA,EACnB,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAID,QAAM,iBAAiB,CAAC,QAA0B;AAChD,QAAI,CAAC,IAAI,KAAK,EAAG,QAAO,CAAC;AACzB,UAAM,OAAiB,CAAC;AACxB,UAAM,QAAQ;AACd,QAAIA;AACJ,YAAQA,SAAQ,MAAM,KAAK,GAAG,OAAO,MAAM;AACzC,WAAK,KAAKA,OAAM,CAAC,KAAKA,OAAM,CAAC,CAAC;AAAA,IAChC;AACA,WAAO;AAAA,EACT;AAEA,QAAM,qBAAqB,CAAC,QAAwB;AAClD,UAAMC,SAAQ,IAAI,KAAK;AACvB,QAAIA,OAAM,SAAS,EAAG,QAAOA;AAE7B,UAAM,QAAQA,OAAM,CAAC;AACrB,QAAK,UAAU,OAAO,UAAU,OAAQA,OAAMA,OAAM,SAAS,CAAC,MAAM,OAAO;AACzE,aAAOA;AAAA,IACT;AAEA,UAAM,QAAQA,OAAM,MAAM,GAAG,EAAE;AAC/B,QAAI,UAAU,IAAK,QAAO;AAE1B,WAAO,MAAM;AAAA,MACX;AAAA,MACA,CAAC,GAAG,YAAoB,8BAA8B,OAAO,KAAK;AAAA,IACpE;AAAA,EACF;AAEA,QAAM,gBAAgB,CAAC,QAAoD;AACzE,QAAI,CAAC,IAAI,KAAK,EAAG,QAAO;AACxB,UAAM,MAA8B,CAAC;AACrC,eAAW,QAAQ,IAAI,MAAM,IAAI,GAAG;AAClC,YAAM,KAAK,KAAK,QAAQ,GAAG;AAC3B,UAAI,KAAK,GAAG;AACV,YAAI,KAAK,MAAM,GAAG,EAAE,EAAE,KAAK,CAAC,IAAI,mBAAmB,KAAK,MAAM,KAAK,CAAC,CAAC;AAAA,MACvE;AAAA,IACF;AACA,WAAO,OAAO,KAAK,GAAG,EAAE,SAAS,IAAI,MAAM;AAAA,EAC7C;AAEA,QAAM,iBAAiB,YAAY,YAAY;AAC7C,UAAM,MAAM,aAAa,KAAK;AAC9B,QAAI,CAAC,IAAK;AACV,mBAAe,IAAI;AACnB,kBAAc,IAAI;AAClB,UAAM,cAAc,cAAc,KAAK,KAAK,KAAK;AACjD,UAAM,gBAAgB,iBAAiB,cAAc,SAAS;AAC9D,UAAM,OAAO,MAAM,MAAM;AAAA,MACvB,QAAQ,EAAE,QAAQ;AAAA,MAClB,SAAS;AAAA,QACP,WAAW;AAAA,QACX,MAAM;AAAA,QACN,WAAW,iBAAiB;AAAA,QAC5B,SAAS;AAAA,QACT,MAAM,eAAe,SAAS;AAAA,QAC9B,KAAK,cAAc,QAAQ;AAAA,MAC7B;AAAA,MACA,gBAAgB;AAAA,IAClB,CAAC;AACD,QAAS,eAAU,IAAI,GAAG;AACxB,oBAAc,qBAAqB,MAAM,sBAAsB,CAAC;AAChE,qBAAe,KAAK;AACpB;AAAA,IACF;AACA,UAAM,WAAW;AAAA,EACnB,GAAG,CAAC,cAAc,WAAW,UAAU,eAAe,OAAO,SAAS,KAAK,CAAC;AAI5E,SACE,qBAAC,SAAI,WAAU,8BACb;AAAA,yBAAC,SACC;AAAA,0BAAC,QAAG,WAAU,yCAAwC,4BAAc;AAAA,MACpE,oBAAC,OAAE,WAAU,0CAAyC,qEAEtD;AAAA,OACF;AAAA,IAGC,cACC,qBAAC,SAAI,WAAU,8DACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,SAAS,MAAM,aAAa,QAAQ;AAAA,UACpC,WAAW,uEACT,cAAc,WACV,4CACA,6CACN;AAAA,UACD;AAAA;AAAA,MAED;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,SAAS,MAAM,aAAa,OAAO;AAAA,UACnC,WAAW,uEACT,cAAc,UACV,4CACA,6CACN;AAAA,UACD;AAAA;AAAA,MAED;AAAA,OACF;AAAA,IAGD,cAAc,WACb,iCACE;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,KAAK,MAAM;AAAA,UACX,aAAa,CAAC,QAAQ,SAAS,EAAE,MAAM,WAAW,IAAI,CAAC;AAAA,UACvD,UAAU;AAAA,UACV,SAAS;AAAA,UACT,SAAS;AAAA,UACT,OAAO;AAAA,UACP,SAAS;AAAA;AAAA,MACX;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,aAAa;AAAA,UACb,UAAU;AAAA,UACV,iBAAiB;AAAA,UACjB,YAAY,eAAe;AAAA,UAC3B,aAAa;AAAA,UACb;AAAA,UACA,qBAAqB;AAAA,UACrB,eAAe;AAAA,UACf,QAAQ;AAAA,YACN,SAAS;AAAA,YACT,aAAa;AAAA,UACf;AAAA;AAAA,MACF;AAAA,MAGC,SACC,qBAAC,aAAQ,WAAU,eACjB;AAAA,6BAAC,SAAI,WAAU,2CACb;AAAA,8BAAC,cAAW,4BAAc;AAAA,UAC1B;AAAA,YAAC;AAAA;AAAA,cACC,MACE,MAAM,iBAAiB,MAAM,8BACzB,CAAC,EAAE,OAAO,UAAU,OAAO,QAAQ,CAAC,IACpC;AAAA,gBACE,EAAE,OAAO,QAAQ,OAAO,OAAO;AAAA,gBAC/B,EAAE,OAAO,UAAU,OAAO,QAAQ;AAAA,cACpC;AAAA,cAEN,OAAO;AAAA,cACP,UAAU;AAAA;AAAA,UACZ;AAAA,WACF;AAAA,QAEC,mBAAmB,YAClB;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,YACP,SAAS;AAAA,YACT,UAAU,CAAC,gBAAgB;AACzB,4CAA8B,WAAW;AACzC,uBAAS,EAAE,MAAM,cAAc,CAAC;AAAA,YAClC;AAAA,YACA,OAAM;AAAA,YACN,MAAK;AAAA,YAEL;AAAA,cAAC;AAAA;AAAA,gBACC,OAAM;AAAA,gBACN,MAAK;AAAA,gBAEJ;AAAA,mBAAC,UACA,MAAM,SAAS,aACd,MAAM,8BACL;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS;AAAA,sBACT,SAAQ;AAAA,sBACR,WAAU;AAAA,sBACX;AAAA;AAAA,kBAED,IAEA,oBAAC,SAAI,WAAU,uFAAsF,gOAIrG;AAAA,kBAGH,CAAC,UAAU,MAAM,SAAS,oBACzB,qBAAC,SAAI,WAAU,yFACb;AAAA,wCAAC,WAAQ,WAAU,YAAW;AAAA,oBAC9B,oBAAC,UAAK,WAAU,iCAAgC,uCAEhD;AAAA,qBACF;AAAA,kBAGD,CAAC,UAAU,MAAM,SAAS,mBACzB,qBAAC,SAAI,WAAU,gGACb;AAAA,wCAAC,WAAQ,WAAU,0BAAyB;AAAA,oBAC5C,oBAAC,UAAK,WAAU,4CAA2C,0CAE3D;AAAA,oBACA;AAAA,sBAAC;AAAA;AAAA,wBACC,MAAK;AAAA,wBACL,SAAQ;AAAA,wBACR,MAAK;AAAA,wBACL,SAAS;AAAA,wBACT,WAAU;AAAA,wBACX;AAAA;AAAA,oBAED;AAAA,qBACF;AAAA,kBAGD,UACC,qBAAC,SAAI,WAAU,sGACb;AAAA,wCAAC,SAAI,SAAQ,aAAY,MAAK,QAAO,WAAU,6BAC7C;AAAA,sBAAC;AAAA;AAAA,wBACC,GAAE;AAAA,wBACF,QAAO;AAAA,wBACP,aAAY;AAAA,wBACZ,eAAc;AAAA,wBACd,gBAAe;AAAA;AAAA,oBACjB,GACF;AAAA,oBACA,oBAAC,UAAK,WAAU,8DAA6D,2BAE7E;AAAA,qBACF;AAAA;AAAA;AAAA,YAEJ;AAAA;AAAA,QACF;AAAA,SAEJ;AAAA,MAID,cACC,qBAAC,SAAI,WAAU,aACb;AAAA,4BAAC,SAAI,WAAU,sEACb,8BAAC,OAAE,WAAU,gCAAgC,sBAAW,GAC1D;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,SAAS,MAAM,SAAS,EAAE,MAAM,QAAQ,CAAC;AAAA,YACzC,WAAU;AAAA,YACX;AAAA;AAAA,QAED;AAAA,SACF;AAAA,MAGF,qBAAC,gBACC;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAQ;AAAA,YACR,SAAS,MAAM;AACb,oBAAM,OAAO;AACb,oBAAM,SAAS;AAAA,YACjB;AAAA,YACA,UAAU;AAAA,YACX;AAAA;AAAA,QAED;AAAA,SACE,SAAS,cACT,oBAAC,UAAO,MAAK,UAAS,SAAS,iBAAiB,UAAU,CAAC,QACxD,qBACC,iCACE;AAAA,8BAAC,WAAQ,WAAU,YAAW;AAAA,UAAE;AAAA,WAClC,IAEA,cAEJ;AAAA,SAEJ;AAAA,OACF,IAEA,iCAEE;AAAA,0BAAC,aACC,+BAAC,oBAAiB,WAAU,cAC1B;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,aAAY;AAAA,YAEZ;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,gBACP,UAAU,CAAC,MAAM,gBAAiB,EAAE,OAA4B,KAAK;AAAA,gBACrE,aAAY;AAAA,gBACZ,WAAU;AAAA;AAAA,YACZ;AAAA;AAAA,QACF;AAAA,QAEA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,aAAY;AAAA,YAEZ;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,gBACP,UAAU,CAAC,MAAM,aAAc,EAAE,OAA4B,KAAK;AAAA,gBAClE,aAAY;AAAA,gBACZ,WAAU;AAAA;AAAA,YACZ;AAAA;AAAA,QACF;AAAA,QAEA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,aAAY;AAAA,YAEZ;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,gBACP,UAAU,CAAC,MAAM,YAAa,EAAE,OAA+B,KAAK;AAAA,gBACpE,aAAa;AAAA,gBACb,MAAM;AAAA,gBACN,SAAS;AAAA,gBACT,WAAU;AAAA;AAAA,YACZ;AAAA;AAAA,QACF;AAAA,SACF,GACF;AAAA,MAEA,oBAAC,wBAAqB,UAAU,eAAe,iBAAgB,iBAAgB;AAAA,MAG9E,cACC,oBAAC,SAAI,WAAU,sEACb,8BAAC,OAAE,WAAU,gCAAgC,sBAAW,GAC1D;AAAA,MAGF,qBAAC,gBACC;AAAA,4BAAC,UAAO,MAAK,UAAS,SAAQ,SAAQ,SAAS,MAAM,UAAU,UAAU,aAAa,oBAEtF;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS;AAAA,YACT,UAAU,CAAC,aAAa,KAAK,KAAK;AAAA,YAEjC,wBACC,iCACE;AAAA,kCAAC,WAAQ,WAAU,YAAW;AAAA,cAAE;AAAA,eAClC,IAEA;AAAA;AAAA,QAEJ;AAAA,SACF;AAAA,OACF;AAAA,KAEJ;AAEJ;","names":["match","value"]}
|
|
@@ -4,9 +4,8 @@ import {
|
|
|
4
4
|
import {
|
|
5
5
|
mcpSourceAtom,
|
|
6
6
|
mcpSourceBindingsAtom
|
|
7
|
-
} from "./chunk-
|
|
8
|
-
import "./chunk-
|
|
9
|
-
import "./chunk-PZ5AY32C.js";
|
|
7
|
+
} from "./chunk-FMTVLO5L.js";
|
|
8
|
+
import "./chunk-6OYEXHU3.js";
|
|
10
9
|
|
|
11
10
|
// src/react/EditMcpSource.tsx
|
|
12
11
|
import { useMemo, useState } from "react";
|
|
@@ -279,4 +278,4 @@ function EditMcpSource({
|
|
|
279
278
|
export {
|
|
280
279
|
EditMcpSource as default
|
|
281
280
|
};
|
|
282
|
-
//# sourceMappingURL=EditMcpSource-
|
|
281
|
+
//# sourceMappingURL=EditMcpSource-L5GC2B4J.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/react/EditMcpSource.tsx"],"sourcesContent":["import { useMemo, useState } from \"react\";\nimport { useAtomValue, useAtomSet } from \"@effect/atom-react\";\nimport * as AsyncResult from \"effect/unstable/reactivity/AsyncResult\";\nimport * as Exit from \"effect/Exit\";\nimport { mcpSourceAtom, mcpSourceBindingsAtom } from \"./atoms\";\nimport {\n configureSource,\n connectionsAtom,\n setSourceCredentialBinding,\n} from \"@executor-js/react/api/atoms\";\nimport { useScope, useUserScope } from \"@executor-js/react/api/scope-context\";\nimport { connectionWriteKeys, sourceWriteKeys } from \"@executor-js/react/api/reactivity-keys\";\nimport { slugifyNamespace, useSourceIdentity } from \"@executor-js/react/plugins/source-identity\";\nimport { useCredentialTargetScope } from \"@executor-js/react/plugins/credential-target-scope\";\nimport { useSecretPickerSecrets } from \"@executor-js/react/plugins/use-secret-picker-secrets\";\nimport {\n httpCredentialsFromConfiguredCredentialBindings,\n serializeHttpCredentials,\n type HttpCredentialsState,\n} from \"@executor-js/react/plugins/http-credentials\";\nimport {\n useSourceCredentialBindingScopes,\n useSourceCredentialBindingWriter,\n} from \"@executor-js/react/plugins/source-credential-bindings\";\nimport {\n SourceOAuthConnectionControl,\n sourceOAuthConnectionUiState,\n} from \"@executor-js/react/plugins/source-oauth-connection\";\nimport { Button } from \"@executor-js/react/components/button\";\nimport {\n CardStack,\n CardStackContent,\n CardStackEntry,\n CardStackEntryContent,\n CardStackEntryDescription,\n CardStackEntryTitle,\n} from \"@executor-js/react/components/card-stack\";\nimport { Badge } from \"@executor-js/react/components/badge\";\nimport { type CredentialBindingRef, ScopeId } from \"@executor-js/sdk/shared\";\nimport {\n SecretCredentialSlotBindings,\n secretCredentialSlotsFromHttpConfig,\n} from \"@executor-js/react/plugins/credential-slot-bindings\";\nimport { McpRemoteSourceFields } from \"./McpRemoteSourceFields\";\nimport type { McpStoredSourceSchemaType } from \"../sdk/stored-source\";\n\n// ---------------------------------------------------------------------------\n// Remote edit form\n// ---------------------------------------------------------------------------\n\nfunction RemoteEditForm(props: {\n sourceId: string;\n initial: McpStoredSourceSchemaType & { config: { transport: \"remote\" } };\n bindings: readonly CredentialBindingRef[];\n onSave: () => void;\n}) {\n const displayScope = useScope();\n const userScope = useUserScope();\n const sourceScope = ScopeId.make(props.initial.scope);\n const {\n credentialTargetScope: oauthCredentialTargetScope,\n setCredentialTargetScope: setOAuthCredentialTargetScope,\n } = useCredentialTargetScope({\n sourceScope,\n initialTargetScope: userScope,\n });\n const doConfigure = useAtomSet(configureSource, { mode: \"promiseExit\" });\n const setConnectionBinding = useAtomSet(setSourceCredentialBinding, { mode: \"promise\" });\n const secretList = useSecretPickerSecrets();\n const connectionsResult = useAtomValue(connectionsAtom(userScope));\n\n const identity = useSourceIdentity({\n fallbackName: props.initial.name,\n fallbackNamespace: props.initial.namespace,\n });\n const [endpoint, setEndpoint] = useState(props.initial.config.endpoint);\n const credentials = useMemo<HttpCredentialsState>(\n () =>\n httpCredentialsFromConfiguredCredentialBindings({\n headers: props.initial.config.headers,\n queryParams: props.initial.config.queryParams,\n bindings: props.bindings,\n }),\n [props.bindings, props.initial.config.headers, props.initial.config.queryParams],\n );\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const { busyKey, setSecretBinding, clearBinding } = useSourceCredentialBindingWriter({\n displayScope,\n source: { id: props.sourceId, scope: sourceScope },\n onError: setError,\n });\n\n const identityDirty = identity.name.trim() !== props.initial.name.trim();\n const metadataDirty = identityDirty || endpoint.trim() !== props.initial.config.endpoint.trim();\n const dirty = metadataDirty;\n const oauth2 = props.initial.config.auth.kind === \"oauth2\" ? props.initial.config.auth : null;\n const connections = AsyncResult.isSuccess(connectionsResult) ? connectionsResult.value : [];\n const { credentialScopeOptions, secretBindingScopes, scopeRanks } =\n useSourceCredentialBindingScopes({ sourceScope });\n const secretSlots = secretCredentialSlotsFromHttpConfig({\n headers: props.initial.config.headers,\n queryParams: props.initial.config.queryParams,\n });\n const oauthConnectionState = oauth2\n ? sourceOAuthConnectionUiState({\n bindings: props.bindings,\n connectionSlot: oauth2.connectionSlot,\n tokenScope: oauthCredentialTargetScope,\n scopeRanks,\n credentialScopeOptions,\n connections,\n })\n : null;\n const oauthRequestCredentials = serializeHttpCredentials(credentials);\n\n const handleSave = async () => {\n setSaving(true);\n setError(null);\n const config: {\n name?: string;\n endpoint?: string;\n } = {\n name: metadataDirty ? identity.name.trim() || undefined : undefined,\n endpoint: metadataDirty ? endpoint.trim() || undefined : undefined,\n };\n const exit = await doConfigure({\n params: { scopeId: displayScope },\n payload: {\n source: { id: props.sourceId, scope: sourceScope },\n scope: sourceScope,\n type: \"mcp\",\n config,\n },\n reactivityKeys: sourceWriteKeys,\n });\n if (Exit.isFailure(exit)) {\n setError(\"Failed to update source\");\n setSaving(false);\n return;\n }\n setSaving(false);\n props.onSave();\n };\n\n return (\n <div className=\"space-y-6\">\n <div>\n <h1 className=\"text-xl font-semibold text-foreground\">Edit MCP Source</h1>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n Update the endpoint and headers for this MCP connection.\n </p>\n </div>\n\n <div className=\"flex items-center gap-3 rounded-lg border border-border bg-card px-4 py-3\">\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-semibold text-card-foreground\">{props.sourceId}</p>\n </div>\n <Badge variant=\"secondary\" className=\"text-xs\">\n remote\n </Badge>\n </div>\n\n <McpRemoteSourceFields\n url={endpoint}\n onUrlChange={setEndpoint}\n identity={identity}\n preview={{\n name: props.initial.name,\n serverName: props.initial.name,\n connected: true,\n toolCount: null,\n }}\n namespaceReadOnly\n />\n\n {secretSlots.length > 0 && (\n <CardStack>\n <CardStackContent className=\"border-t-0\">\n <CardStackEntry>\n <CardStackEntryContent>\n <CardStackEntryTitle>Request credentials</CardStackEntryTitle>\n <CardStackEntryDescription>\n Headers and query parameters sent with every MCP request.\n </CardStackEntryDescription>\n </CardStackEntryContent>\n </CardStackEntry>\n <SecretCredentialSlotBindings\n slots={secretSlots}\n bindingScopes={secretBindingScopes}\n bindingRows={props.bindings}\n scopeRanks={scopeRanks}\n secrets={secretList}\n sourceId={props.sourceId}\n sourceName={identity.name}\n credentialScopeOptions={credentialScopeOptions}\n busyKey={busyKey}\n onSetSecretBinding={setSecretBinding}\n onClearBinding={clearBinding}\n />\n </CardStackContent>\n </CardStack>\n )}\n\n {oauth2 && oauthConnectionState && (\n <SourceOAuthConnectionControl\n popupName=\"mcp-oauth\"\n pluginId=\"mcp\"\n namespace={slugifyNamespace(props.initial.namespace) || \"mcp\"}\n fallbackNamespace=\"mcp\"\n endpoint={endpoint.trim()}\n tokenScope={oauthCredentialTargetScope}\n onTokenScopeChange={setOAuthCredentialTargetScope}\n credentialScopeOptions={credentialScopeOptions}\n connectionId={oauthConnectionState.connectionId}\n sourceLabel={`${identity.name.trim() || props.initial.namespace || \"MCP\"} OAuth`}\n headers={oauthRequestCredentials.headers}\n queryParams={oauthRequestCredentials.queryParams}\n isConnected={oauthConnectionState.isConnected}\n buttonIsConnected={oauthConnectionState.buttonIsConnected}\n statusLabel={oauthConnectionState.statusLabel}\n onConnected={async (connectionId) => {\n await setConnectionBinding({\n params: { scopeId: oauthCredentialTargetScope },\n payload: {\n scope: oauthCredentialTargetScope,\n source: { id: props.sourceId, scope: sourceScope },\n slotKey: oauth2.connectionSlot,\n value: { kind: \"connection\", connectionId },\n },\n reactivityKeys: [...sourceWriteKeys, ...connectionWriteKeys],\n });\n }}\n reconnectingLabel=\"Reconnecting…\"\n reconnectLabel=\"Reconnect\"\n signInLabel={oauthConnectionState.signInLabel}\n signingInLabel=\"Signing in…\"\n />\n )}\n\n {error && (\n <div className=\"rounded-lg border border-destructive/30 bg-destructive/5 px-3 py-2\">\n <p className=\"text-sm text-destructive\">{error}</p>\n </div>\n )}\n\n <div className=\"flex items-center justify-between border-t border-border pt-4\">\n <Button variant=\"ghost\" onClick={props.onSave}>\n Cancel\n </Button>\n <Button onClick={handleSave} disabled={!dirty || saving}>\n {saving ? \"Saving…\" : \"Save changes\"}\n </Button>\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Stdio read-only view\n// ---------------------------------------------------------------------------\n\nfunction StdioReadOnly(props: {\n sourceId: string;\n initial: McpStoredSourceSchemaType & { config: { transport: \"stdio\" } };\n onSave: () => void;\n}) {\n const { command, args } = props.initial.config;\n return (\n <div className=\"space-y-6\">\n <div>\n <h1 className=\"text-xl font-semibold text-foreground\">Edit MCP Source</h1>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n Stdio MCP sources cannot be edited in the UI. Remove and recreate the source with the\n updated command.\n </p>\n </div>\n\n <div className=\"flex items-center gap-3 rounded-lg border border-border bg-card px-4 py-3\">\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-semibold text-card-foreground\">{props.sourceId}</p>\n <p className=\"mt-0.5 text-xs text-muted-foreground font-mono\">\n {command} {(args ?? []).join(\" \")}\n </p>\n </div>\n <Badge variant=\"secondary\" className=\"text-xs\">\n stdio\n </Badge>\n </div>\n\n <div className=\"flex items-center justify-end border-t border-border pt-4\">\n <Button onClick={props.onSave}>Done</Button>\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Main component\n// ---------------------------------------------------------------------------\n\nexport default function EditMcpSource({\n sourceId,\n onSave,\n}: {\n readonly sourceId: string;\n readonly onSave: () => void;\n}) {\n const scopeId = useScope();\n const userScope = useUserScope();\n const sourceResult = useAtomValue(mcpSourceAtom(scopeId, sourceId)) as AsyncResult.AsyncResult<\n McpStoredSourceSchemaType | null,\n unknown\n >;\n const source =\n AsyncResult.isSuccess(sourceResult) && sourceResult.value ? sourceResult.value : null;\n const sourceScope = source ? ScopeId.make(source.scope) : scopeId;\n const bindingsResult = useAtomValue(mcpSourceBindingsAtom(userScope, sourceId, sourceScope));\n\n if (!AsyncResult.isSuccess(sourceResult) || !source || !AsyncResult.isSuccess(bindingsResult)) {\n return (\n <div className=\"space-y-6\">\n <div>\n <h1 className=\"text-xl font-semibold text-foreground\">Edit MCP Source</h1>\n <p className=\"mt-1 text-sm text-muted-foreground\">Loading configuration…</p>\n </div>\n </div>\n );\n }\n\n if (source.config.transport === \"stdio\") {\n return (\n <StdioReadOnly\n sourceId={sourceId}\n initial={source as McpStoredSourceSchemaType & { config: { transport: \"stdio\" } }}\n onSave={onSave}\n />\n );\n }\n\n return (\n <RemoteEditForm\n sourceId={sourceId}\n initial={source as McpStoredSourceSchemaType & { config: { transport: \"remote\" } }}\n bindings={bindingsResult.value}\n onSave={onSave}\n />\n );\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/react/EditMcpSource.tsx"],"sourcesContent":["import { useMemo, useState } from \"react\";\nimport { useAtomValue, useAtomSet } from \"@effect/atom-react\";\nimport * as AsyncResult from \"effect/unstable/reactivity/AsyncResult\";\nimport * as Exit from \"effect/Exit\";\nimport { mcpSourceAtom, mcpSourceBindingsAtom } from \"./atoms\";\nimport {\n configureSource,\n connectionsAtom,\n setSourceCredentialBinding,\n} from \"@executor-js/react/api/atoms\";\nimport { useScope, useUserScope } from \"@executor-js/react/api/scope-context\";\nimport { connectionWriteKeys, sourceWriteKeys } from \"@executor-js/react/api/reactivity-keys\";\nimport { slugifyNamespace, useSourceIdentity } from \"@executor-js/react/plugins/source-identity\";\nimport { useCredentialTargetScope } from \"@executor-js/react/plugins/credential-target-scope\";\nimport { useSecretPickerSecrets } from \"@executor-js/react/plugins/use-secret-picker-secrets\";\nimport {\n httpCredentialsFromConfiguredCredentialBindings,\n serializeHttpCredentials,\n type HttpCredentialsState,\n} from \"@executor-js/react/plugins/http-credentials\";\nimport {\n useSourceCredentialBindingScopes,\n useSourceCredentialBindingWriter,\n} from \"@executor-js/react/plugins/source-credential-bindings\";\nimport {\n SourceOAuthConnectionControl,\n sourceOAuthConnectionUiState,\n} from \"@executor-js/react/plugins/source-oauth-connection\";\nimport { Button } from \"@executor-js/react/components/button\";\nimport {\n CardStack,\n CardStackContent,\n CardStackEntry,\n CardStackEntryContent,\n CardStackEntryDescription,\n CardStackEntryTitle,\n} from \"@executor-js/react/components/card-stack\";\nimport { Badge } from \"@executor-js/react/components/badge\";\nimport { type CredentialBindingRef, ScopeId } from \"@executor-js/sdk/shared\";\nimport {\n SecretCredentialSlotBindings,\n secretCredentialSlotsFromHttpConfig,\n} from \"@executor-js/react/plugins/credential-slot-bindings\";\nimport { McpRemoteSourceFields } from \"./McpRemoteSourceFields\";\nimport type { McpStoredSourceSchemaType } from \"../sdk/stored-source\";\n\n// ---------------------------------------------------------------------------\n// Remote edit form\n// ---------------------------------------------------------------------------\n\nfunction RemoteEditForm(props: {\n sourceId: string;\n initial: McpStoredSourceSchemaType & { config: { transport: \"remote\" } };\n bindings: readonly CredentialBindingRef[];\n onSave: () => void;\n}) {\n const displayScope = useScope();\n const userScope = useUserScope();\n const sourceScope = ScopeId.make(props.initial.scope);\n const {\n credentialTargetScope: oauthCredentialTargetScope,\n setCredentialTargetScope: setOAuthCredentialTargetScope,\n } = useCredentialTargetScope({\n sourceScope,\n initialTargetScope: userScope,\n });\n const doConfigure = useAtomSet(configureSource, { mode: \"promiseExit\" });\n const setConnectionBinding = useAtomSet(setSourceCredentialBinding, { mode: \"promise\" });\n const secretList = useSecretPickerSecrets();\n const connectionsResult = useAtomValue(connectionsAtom(userScope));\n\n const identity = useSourceIdentity({\n fallbackName: props.initial.name,\n fallbackNamespace: props.initial.namespace,\n });\n const [endpoint, setEndpoint] = useState(props.initial.config.endpoint);\n const credentials = useMemo<HttpCredentialsState>(\n () =>\n httpCredentialsFromConfiguredCredentialBindings({\n headers: props.initial.config.headers,\n queryParams: props.initial.config.queryParams,\n bindings: props.bindings,\n }),\n [props.bindings, props.initial.config.headers, props.initial.config.queryParams],\n );\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const { busyKey, setSecretBinding, clearBinding } = useSourceCredentialBindingWriter({\n displayScope,\n source: { id: props.sourceId, scope: sourceScope },\n onError: setError,\n });\n\n const identityDirty = identity.name.trim() !== props.initial.name.trim();\n const metadataDirty = identityDirty || endpoint.trim() !== props.initial.config.endpoint.trim();\n const dirty = metadataDirty;\n const oauth2 = props.initial.config.auth.kind === \"oauth2\" ? props.initial.config.auth : null;\n const connections = AsyncResult.isSuccess(connectionsResult) ? connectionsResult.value : [];\n const { credentialScopeOptions, secretBindingScopes, scopeRanks } =\n useSourceCredentialBindingScopes({ sourceScope });\n const secretSlots = secretCredentialSlotsFromHttpConfig({\n headers: props.initial.config.headers,\n queryParams: props.initial.config.queryParams,\n });\n const oauthConnectionState = oauth2\n ? sourceOAuthConnectionUiState({\n bindings: props.bindings,\n connectionSlot: oauth2.connectionSlot,\n tokenScope: oauthCredentialTargetScope,\n scopeRanks,\n credentialScopeOptions,\n connections,\n })\n : null;\n const oauthRequestCredentials = serializeHttpCredentials(credentials);\n\n const handleSave = async () => {\n setSaving(true);\n setError(null);\n const config: {\n name?: string;\n endpoint?: string;\n } = {\n name: metadataDirty ? identity.name.trim() || undefined : undefined,\n endpoint: metadataDirty ? endpoint.trim() || undefined : undefined,\n };\n const exit = await doConfigure({\n params: { scopeId: displayScope },\n payload: {\n source: { id: props.sourceId, scope: sourceScope },\n scope: sourceScope,\n type: \"mcp\",\n config,\n },\n reactivityKeys: sourceWriteKeys,\n });\n if (Exit.isFailure(exit)) {\n setError(\"Failed to update source\");\n setSaving(false);\n return;\n }\n setSaving(false);\n props.onSave();\n };\n\n return (\n <div className=\"space-y-6\">\n <div>\n <h1 className=\"text-xl font-semibold text-foreground\">Edit MCP Source</h1>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n Update the endpoint and headers for this MCP connection.\n </p>\n </div>\n\n <div className=\"flex items-center gap-3 rounded-lg border border-border bg-card px-4 py-3\">\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-semibold text-card-foreground\">{props.sourceId}</p>\n </div>\n <Badge variant=\"secondary\" className=\"text-xs\">\n remote\n </Badge>\n </div>\n\n <McpRemoteSourceFields\n url={endpoint}\n onUrlChange={setEndpoint}\n identity={identity}\n preview={{\n name: props.initial.name,\n serverName: props.initial.name,\n connected: true,\n toolCount: null,\n }}\n namespaceReadOnly\n />\n\n {secretSlots.length > 0 && (\n <CardStack>\n <CardStackContent className=\"border-t-0\">\n <CardStackEntry>\n <CardStackEntryContent>\n <CardStackEntryTitle>Request credentials</CardStackEntryTitle>\n <CardStackEntryDescription>\n Headers and query parameters sent with every MCP request.\n </CardStackEntryDescription>\n </CardStackEntryContent>\n </CardStackEntry>\n <SecretCredentialSlotBindings\n slots={secretSlots}\n bindingScopes={secretBindingScopes}\n bindingRows={props.bindings}\n scopeRanks={scopeRanks}\n secrets={secretList}\n sourceId={props.sourceId}\n sourceName={identity.name}\n credentialScopeOptions={credentialScopeOptions}\n busyKey={busyKey}\n onSetSecretBinding={setSecretBinding}\n onClearBinding={clearBinding}\n />\n </CardStackContent>\n </CardStack>\n )}\n\n {oauth2 && oauthConnectionState && (\n <SourceOAuthConnectionControl\n popupName=\"mcp-oauth\"\n pluginId=\"mcp\"\n namespace={slugifyNamespace(props.initial.namespace) || \"mcp\"}\n fallbackNamespace=\"mcp\"\n endpoint={endpoint.trim()}\n tokenScope={oauthCredentialTargetScope}\n onTokenScopeChange={setOAuthCredentialTargetScope}\n credentialScopeOptions={credentialScopeOptions}\n connectionId={oauthConnectionState.connectionId}\n sourceLabel={`${identity.name.trim() || props.initial.namespace || \"MCP\"} OAuth`}\n headers={oauthRequestCredentials.headers}\n queryParams={oauthRequestCredentials.queryParams}\n isConnected={oauthConnectionState.isConnected}\n buttonIsConnected={oauthConnectionState.buttonIsConnected}\n statusLabel={oauthConnectionState.statusLabel}\n onConnected={async (connectionId) => {\n await setConnectionBinding({\n params: { scopeId: oauthCredentialTargetScope },\n payload: {\n scope: oauthCredentialTargetScope,\n source: { id: props.sourceId, scope: sourceScope },\n slotKey: oauth2.connectionSlot,\n value: { kind: \"connection\", connectionId },\n },\n reactivityKeys: [...sourceWriteKeys, ...connectionWriteKeys],\n });\n }}\n reconnectingLabel=\"Reconnecting…\"\n reconnectLabel=\"Reconnect\"\n signInLabel={oauthConnectionState.signInLabel}\n signingInLabel=\"Signing in…\"\n />\n )}\n\n {error && (\n <div className=\"rounded-lg border border-destructive/30 bg-destructive/5 px-3 py-2\">\n <p className=\"text-sm text-destructive\">{error}</p>\n </div>\n )}\n\n <div className=\"flex items-center justify-between border-t border-border pt-4\">\n <Button variant=\"ghost\" onClick={props.onSave}>\n Cancel\n </Button>\n <Button onClick={handleSave} disabled={!dirty || saving}>\n {saving ? \"Saving…\" : \"Save changes\"}\n </Button>\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Stdio read-only view\n// ---------------------------------------------------------------------------\n\nfunction StdioReadOnly(props: {\n sourceId: string;\n initial: McpStoredSourceSchemaType & { config: { transport: \"stdio\" } };\n onSave: () => void;\n}) {\n const { command, args } = props.initial.config;\n return (\n <div className=\"space-y-6\">\n <div>\n <h1 className=\"text-xl font-semibold text-foreground\">Edit MCP Source</h1>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n Stdio MCP sources cannot be edited in the UI. Remove and recreate the source with the\n updated command.\n </p>\n </div>\n\n <div className=\"flex items-center gap-3 rounded-lg border border-border bg-card px-4 py-3\">\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-semibold text-card-foreground\">{props.sourceId}</p>\n <p className=\"mt-0.5 text-xs text-muted-foreground font-mono\">\n {command} {(args ?? []).join(\" \")}\n </p>\n </div>\n <Badge variant=\"secondary\" className=\"text-xs\">\n stdio\n </Badge>\n </div>\n\n <div className=\"flex items-center justify-end border-t border-border pt-4\">\n <Button onClick={props.onSave}>Done</Button>\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Main component\n// ---------------------------------------------------------------------------\n\nexport default function EditMcpSource({\n sourceId,\n onSave,\n}: {\n readonly sourceId: string;\n readonly onSave: () => void;\n}) {\n const scopeId = useScope();\n const userScope = useUserScope();\n const sourceResult = useAtomValue(mcpSourceAtom(scopeId, sourceId)) as AsyncResult.AsyncResult<\n McpStoredSourceSchemaType | null,\n unknown\n >;\n const source =\n AsyncResult.isSuccess(sourceResult) && sourceResult.value ? sourceResult.value : null;\n const sourceScope = source ? ScopeId.make(source.scope) : scopeId;\n const bindingsResult = useAtomValue(mcpSourceBindingsAtom(userScope, sourceId, sourceScope));\n\n if (!AsyncResult.isSuccess(sourceResult) || !source || !AsyncResult.isSuccess(bindingsResult)) {\n return (\n <div className=\"space-y-6\">\n <div>\n <h1 className=\"text-xl font-semibold text-foreground\">Edit MCP Source</h1>\n <p className=\"mt-1 text-sm text-muted-foreground\">Loading configuration…</p>\n </div>\n </div>\n );\n }\n\n if (source.config.transport === \"stdio\") {\n return (\n <StdioReadOnly\n sourceId={sourceId}\n initial={source as McpStoredSourceSchemaType & { config: { transport: \"stdio\" } }}\n onSave={onSave}\n />\n );\n }\n\n return (\n <RemoteEditForm\n sourceId={sourceId}\n initial={source as McpStoredSourceSchemaType & { config: { transport: \"remote\" } }}\n bindings={bindingsResult.value}\n onSave={onSave}\n />\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
2
|
mcpSourceAtom,
|
|
3
3
|
mcpSourceBindingsAtom
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-
|
|
6
|
-
import "./chunk-PZ5AY32C.js";
|
|
4
|
+
} from "./chunk-FMTVLO5L.js";
|
|
5
|
+
import "./chunk-6OYEXHU3.js";
|
|
7
6
|
|
|
8
7
|
// src/react/McpSourceSummary.tsx
|
|
9
8
|
import { useAtomValue as useAtomValue2 } from "@effect/atom-react";
|
|
@@ -168,4 +167,4 @@ function McpSourceSummary(props) {
|
|
|
168
167
|
export {
|
|
169
168
|
McpSourceSummary as default
|
|
170
169
|
};
|
|
171
|
-
//# sourceMappingURL=McpSourceSummary-
|
|
170
|
+
//# sourceMappingURL=McpSourceSummary-LE3WXFUE.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/react/McpSourceSummary.tsx","../src/react/McpSignInButton.tsx"],"sourcesContent":["import { useAtomValue } from \"@effect/atom-react\";\nimport * as AsyncResult from \"effect/unstable/reactivity/AsyncResult\";\n\nimport { connectionsAtom } from \"@executor-js/react/api/atoms\";\nimport { useScope, useScopeStack, useUserScope } from \"@executor-js/react/api/scope-context\";\nimport { Button } from \"@executor-js/react/components/button\";\nimport {\n SourceCredentialNotice,\n SourceCredentialStatusBadge,\n missingSourceCredentialLabels,\n type SourceCredentialSlot,\n} from \"@executor-js/react/plugins/source-credential-status\";\nimport { ScopeId } from \"@executor-js/sdk/shared\";\n\nimport { mcpSourceAtom, mcpSourceBindingsAtom } from \"./atoms\";\nimport McpSignInButton from \"./McpSignInButton\";\nimport type { McpStoredSourceSchemaType } from \"../sdk/stored-source\";\n\nconst sourceCredentialSlots = (\n source: McpStoredSourceSchemaType,\n): readonly SourceCredentialSlot[] => {\n if (source.config.transport !== \"remote\") return [];\n const slots: SourceCredentialSlot[] = [];\n for (const [name, value] of Object.entries(source.config.headers ?? {})) {\n if (typeof value !== \"string\") slots.push({ kind: \"secret\", slot: value.slot, label: name });\n }\n for (const [name, value] of Object.entries(source.config.queryParams ?? {})) {\n if (typeof value !== \"string\") slots.push({ kind: \"secret\", slot: value.slot, label: name });\n }\n const auth = source.config.auth;\n if (auth.kind === \"header\") {\n slots.push({\n kind: \"secret\",\n slot: auth.secretSlot,\n label: auth.headerName,\n });\n }\n if (auth.kind === \"oauth2\") {\n if (auth.clientIdSlot) {\n slots.push({ kind: \"secret\", slot: auth.clientIdSlot, label: \"Client ID\" });\n }\n if (auth.clientSecretSlot) {\n slots.push({ kind: \"secret\", slot: auth.clientSecretSlot, label: \"Client Secret\" });\n }\n slots.push({\n kind: \"connection\",\n slot: auth.connectionSlot,\n label: \"OAuth sign-in\",\n });\n }\n return slots;\n};\n\nexport default function McpSourceSummary(props: {\n readonly sourceId: string;\n readonly variant?: \"badge\" | \"panel\";\n readonly onAction?: () => void;\n}) {\n const displayScope = useScope();\n const userScope = useUserScope();\n const scopeStack = useScopeStack();\n const sourceResult = useAtomValue(mcpSourceAtom(displayScope, props.sourceId));\n const source =\n AsyncResult.isSuccess(sourceResult) && sourceResult.value ? sourceResult.value : null;\n const sourceScope = source ? ScopeId.make(source.scope) : displayScope;\n const bindingsResult = useAtomValue(\n mcpSourceBindingsAtom(userScope, props.sourceId, sourceScope),\n );\n const connectionsResult = useAtomValue(connectionsAtom(userScope));\n\n if (!source) return null;\n const slots = sourceCredentialSlots(source as McpStoredSourceSchemaType);\n if (slots.length === 0) return null;\n if (!AsyncResult.isSuccess(bindingsResult) || !AsyncResult.isSuccess(connectionsResult)) {\n return props.variant === \"panel\" ? null : (\n <SourceCredentialStatusBadge missing={[\"credentials\"]} />\n );\n }\n\n const scopeRanks = new Map(scopeStack.map((scope, index) => [scope.id, index] as const));\n const liveConnectionIds = new Set(connectionsResult.value.map((connection) => connection.id));\n const missing = missingSourceCredentialLabels({\n slots,\n bindings: bindingsResult.value,\n targetScope: userScope,\n scopeRanks,\n liveConnectionIds,\n });\n\n if (props.variant === \"panel\") {\n const needsOAuth = missing.includes(\"OAuth sign-in\");\n const needsConfiguration = missing.some((label) => label !== \"OAuth sign-in\");\n return (\n <SourceCredentialNotice\n missing={missing}\n action={\n <div className=\"flex shrink-0 items-center gap-2\">\n {needsOAuth && <McpSignInButton sourceId={props.sourceId} />}\n {needsConfiguration && props.onAction && (\n <Button type=\"button\" size=\"sm\" variant=\"outline\" onClick={props.onAction}>\n Configure\n </Button>\n )}\n </div>\n }\n />\n );\n }\n\n return <SourceCredentialStatusBadge missing={missing} />;\n}\n","import { useAtomSet, useAtomValue } from \"@effect/atom-react\";\nimport * as AsyncResult from \"effect/unstable/reactivity/AsyncResult\";\n\nimport { ScopeId } from \"@executor-js/sdk/shared\";\nimport { useScope, useUserScope } from \"@executor-js/react/api/scope-context\";\nimport { connectionWriteKeys, sourceWriteKeys } from \"@executor-js/react/api/reactivity-keys\";\nimport { connectionsAtom, setSourceCredentialBinding } from \"@executor-js/react/api/atoms\";\nimport { SourceOAuthSignInButton } from \"@executor-js/react/plugins/oauth-sign-in\";\nimport { slugifyNamespace } from \"@executor-js/react/plugins/source-identity\";\nimport { secretBackedValuesFromConfiguredCredentialBindings } from \"@executor-js/react/plugins/credential-bindings\";\n\nimport { mcpSourceAtom, mcpSourceBindingsAtom } from \"./atoms\";\nimport type { McpStoredSourceSchemaType } from \"../sdk/stored-source\";\n\n// ---------------------------------------------------------------------------\n// McpSignInButton — top-bar action on the source detail page.\n//\n// Reads the source's stored endpoint + oauth2 slot, re-runs the DCR /\n// authorization-code flow against a stable `mcp-oauth2-${namespace}`\n// connection id, and on success writes the user's credential binding.\n// ---------------------------------------------------------------------------\n\nexport default function McpSignInButton(props: { sourceId: string }) {\n const scopeId = useScope();\n const userScopeId = useUserScope();\n const sourceResult = useAtomValue(\n mcpSourceAtom(scopeId, props.sourceId),\n ) as AsyncResult.AsyncResult<McpStoredSourceSchemaType | null, unknown>;\n const source =\n AsyncResult.isSuccess(sourceResult) && sourceResult.value ? sourceResult.value : null;\n const sourceScope = source ? ScopeId.make(source.scope) : scopeId;\n const bindingsResult = useAtomValue(\n mcpSourceBindingsAtom(userScopeId, props.sourceId, sourceScope),\n );\n const connectionsResult = useAtomValue(connectionsAtom(userScopeId));\n const setBinding = useAtomSet(setSourceCredentialBinding, { mode: \"promise\" });\n\n const remote = source && source.config.transport === \"remote\" ? source.config : null;\n const oauth2 = remote && remote.auth.kind === \"oauth2\" ? remote.auth : null;\n const connections = AsyncResult.isSuccess(connectionsResult)\n ? (connectionsResult.value as readonly { readonly id: string }[])\n : null;\n const bindings = AsyncResult.isSuccess(bindingsResult) ? bindingsResult.value : null;\n const connectionBinding = bindings?.find(\n (binding) => binding.slotKey === oauth2?.connectionSlot && binding.value.kind === \"connection\",\n );\n const connectionId =\n connectionBinding?.value.kind === \"connection\" ? connectionBinding.value.connectionId : null;\n const isConnected =\n oauth2 !== null &&\n connections !== null &&\n connectionId !== null &&\n connections.some((c) => c.id === connectionId);\n\n if (!remote || !oauth2 || !source) return null;\n const namespaceSlug = slugifyNamespace(source.namespace) || \"mcp\";\n\n return (\n <SourceOAuthSignInButton\n popupName=\"mcp-oauth\"\n pluginId=\"mcp\"\n namespace={namespaceSlug}\n fallbackNamespace=\"mcp\"\n endpoint={remote.endpoint}\n tokenScope={userScopeId}\n connectionId={connectionId}\n sourceLabel={`${source.name.trim() || source.namespace || \"MCP\"} OAuth`}\n headers={secretBackedValuesFromConfiguredCredentialBindings(remote.headers, bindings ?? [])}\n queryParams={secretBackedValuesFromConfiguredCredentialBindings(\n remote.queryParams,\n bindings ?? [],\n )}\n isConnected={isConnected}\n detectPopupClosed={false}\n onConnected={async (nextConnectionId) => {\n await setBinding({\n params: { scopeId: userScopeId },\n payload: {\n scope: userScopeId,\n source: { id: props.sourceId, scope: sourceScope },\n slotKey: oauth2.connectionSlot,\n value: { kind: \"connection\", connectionId: nextConnectionId },\n },\n reactivityKeys: [...sourceWriteKeys, ...connectionWriteKeys],\n });\n }}\n reconnectingLabel=\"Reconnecting…\"\n signingInLabel=\"Signing in…\"\n />\n );\n}\n"],"mappings":"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","names":["useAtomValue","AsyncResult","connectionsAtom","useScope","useUserScope","ScopeId","jsx","useScope","useUserScope","useAtomValue","ScopeId","connectionsAtom"]}
|
|
1
|
+
{"version":3,"sources":["../src/react/McpSourceSummary.tsx","../src/react/McpSignInButton.tsx"],"sourcesContent":["import { useAtomValue } from \"@effect/atom-react\";\nimport * as AsyncResult from \"effect/unstable/reactivity/AsyncResult\";\n\nimport { connectionsAtom } from \"@executor-js/react/api/atoms\";\nimport { useScope, useScopeStack, useUserScope } from \"@executor-js/react/api/scope-context\";\nimport { Button } from \"@executor-js/react/components/button\";\nimport {\n SourceCredentialNotice,\n SourceCredentialStatusBadge,\n missingSourceCredentialLabels,\n type SourceCredentialSlot,\n} from \"@executor-js/react/plugins/source-credential-status\";\nimport { ScopeId } from \"@executor-js/sdk/shared\";\n\nimport { mcpSourceAtom, mcpSourceBindingsAtom } from \"./atoms\";\nimport McpSignInButton from \"./McpSignInButton\";\nimport type { McpStoredSourceSchemaType } from \"../sdk/stored-source\";\n\nconst sourceCredentialSlots = (\n source: McpStoredSourceSchemaType,\n): readonly SourceCredentialSlot[] => {\n if (source.config.transport !== \"remote\") return [];\n const slots: SourceCredentialSlot[] = [];\n for (const [name, value] of Object.entries(source.config.headers ?? {})) {\n if (typeof value !== \"string\") slots.push({ kind: \"secret\", slot: value.slot, label: name });\n }\n for (const [name, value] of Object.entries(source.config.queryParams ?? {})) {\n if (typeof value !== \"string\") slots.push({ kind: \"secret\", slot: value.slot, label: name });\n }\n const auth = source.config.auth;\n if (auth.kind === \"header\") {\n slots.push({\n kind: \"secret\",\n slot: auth.secretSlot,\n label: auth.headerName,\n });\n }\n if (auth.kind === \"oauth2\") {\n if (auth.clientIdSlot) {\n slots.push({ kind: \"secret\", slot: auth.clientIdSlot, label: \"Client ID\" });\n }\n if (auth.clientSecretSlot) {\n slots.push({ kind: \"secret\", slot: auth.clientSecretSlot, label: \"Client Secret\" });\n }\n slots.push({\n kind: \"connection\",\n slot: auth.connectionSlot,\n label: \"OAuth sign-in\",\n });\n }\n return slots;\n};\n\nexport default function McpSourceSummary(props: {\n readonly sourceId: string;\n readonly variant?: \"badge\" | \"panel\";\n readonly onAction?: () => void;\n}) {\n const displayScope = useScope();\n const userScope = useUserScope();\n const scopeStack = useScopeStack();\n const sourceResult = useAtomValue(mcpSourceAtom(displayScope, props.sourceId));\n const source =\n AsyncResult.isSuccess(sourceResult) && sourceResult.value ? sourceResult.value : null;\n const sourceScope = source ? ScopeId.make(source.scope) : displayScope;\n const bindingsResult = useAtomValue(\n mcpSourceBindingsAtom(userScope, props.sourceId, sourceScope),\n );\n const connectionsResult = useAtomValue(connectionsAtom(userScope));\n\n if (!source) return null;\n const slots = sourceCredentialSlots(source as McpStoredSourceSchemaType);\n if (slots.length === 0) return null;\n if (!AsyncResult.isSuccess(bindingsResult) || !AsyncResult.isSuccess(connectionsResult)) {\n return props.variant === \"panel\" ? null : (\n <SourceCredentialStatusBadge missing={[\"credentials\"]} />\n );\n }\n\n const scopeRanks = new Map(scopeStack.map((scope, index) => [scope.id, index] as const));\n const liveConnectionIds = new Set(connectionsResult.value.map((connection) => connection.id));\n const missing = missingSourceCredentialLabels({\n slots,\n bindings: bindingsResult.value,\n targetScope: userScope,\n scopeRanks,\n liveConnectionIds,\n });\n\n if (props.variant === \"panel\") {\n const needsOAuth = missing.includes(\"OAuth sign-in\");\n const needsConfiguration = missing.some((label) => label !== \"OAuth sign-in\");\n return (\n <SourceCredentialNotice\n missing={missing}\n action={\n <div className=\"flex shrink-0 items-center gap-2\">\n {needsOAuth && <McpSignInButton sourceId={props.sourceId} />}\n {needsConfiguration && props.onAction && (\n <Button type=\"button\" size=\"sm\" variant=\"outline\" onClick={props.onAction}>\n Configure\n </Button>\n )}\n </div>\n }\n />\n );\n }\n\n return <SourceCredentialStatusBadge missing={missing} />;\n}\n","import { useAtomSet, useAtomValue } from \"@effect/atom-react\";\nimport * as AsyncResult from \"effect/unstable/reactivity/AsyncResult\";\n\nimport { ScopeId } from \"@executor-js/sdk/shared\";\nimport { useScope, useUserScope } from \"@executor-js/react/api/scope-context\";\nimport { connectionWriteKeys, sourceWriteKeys } from \"@executor-js/react/api/reactivity-keys\";\nimport { connectionsAtom, setSourceCredentialBinding } from \"@executor-js/react/api/atoms\";\nimport { SourceOAuthSignInButton } from \"@executor-js/react/plugins/oauth-sign-in\";\nimport { slugifyNamespace } from \"@executor-js/react/plugins/source-identity\";\nimport { secretBackedValuesFromConfiguredCredentialBindings } from \"@executor-js/react/plugins/credential-bindings\";\n\nimport { mcpSourceAtom, mcpSourceBindingsAtom } from \"./atoms\";\nimport type { McpStoredSourceSchemaType } from \"../sdk/stored-source\";\n\n// ---------------------------------------------------------------------------\n// McpSignInButton — top-bar action on the source detail page.\n//\n// Reads the source's stored endpoint + oauth2 slot, re-runs the DCR /\n// authorization-code flow against a stable `mcp-oauth2-${namespace}`\n// connection id, and on success writes the user's credential binding.\n// ---------------------------------------------------------------------------\n\nexport default function McpSignInButton(props: { sourceId: string }) {\n const scopeId = useScope();\n const userScopeId = useUserScope();\n const sourceResult = useAtomValue(\n mcpSourceAtom(scopeId, props.sourceId),\n ) as AsyncResult.AsyncResult<McpStoredSourceSchemaType | null, unknown>;\n const source =\n AsyncResult.isSuccess(sourceResult) && sourceResult.value ? sourceResult.value : null;\n const sourceScope = source ? ScopeId.make(source.scope) : scopeId;\n const bindingsResult = useAtomValue(\n mcpSourceBindingsAtom(userScopeId, props.sourceId, sourceScope),\n );\n const connectionsResult = useAtomValue(connectionsAtom(userScopeId));\n const setBinding = useAtomSet(setSourceCredentialBinding, { mode: \"promise\" });\n\n const remote = source && source.config.transport === \"remote\" ? source.config : null;\n const oauth2 = remote && remote.auth.kind === \"oauth2\" ? remote.auth : null;\n const connections = AsyncResult.isSuccess(connectionsResult)\n ? (connectionsResult.value as readonly { readonly id: string }[])\n : null;\n const bindings = AsyncResult.isSuccess(bindingsResult) ? bindingsResult.value : null;\n const connectionBinding = bindings?.find(\n (binding) => binding.slotKey === oauth2?.connectionSlot && binding.value.kind === \"connection\",\n );\n const connectionId =\n connectionBinding?.value.kind === \"connection\" ? connectionBinding.value.connectionId : null;\n const isConnected =\n oauth2 !== null &&\n connections !== null &&\n connectionId !== null &&\n connections.some((c) => c.id === connectionId);\n\n if (!remote || !oauth2 || !source) return null;\n const namespaceSlug = slugifyNamespace(source.namespace) || \"mcp\";\n\n return (\n <SourceOAuthSignInButton\n popupName=\"mcp-oauth\"\n pluginId=\"mcp\"\n namespace={namespaceSlug}\n fallbackNamespace=\"mcp\"\n endpoint={remote.endpoint}\n tokenScope={userScopeId}\n connectionId={connectionId}\n sourceLabel={`${source.name.trim() || source.namespace || \"MCP\"} OAuth`}\n headers={secretBackedValuesFromConfiguredCredentialBindings(remote.headers, bindings ?? [])}\n queryParams={secretBackedValuesFromConfiguredCredentialBindings(\n remote.queryParams,\n bindings ?? [],\n )}\n isConnected={isConnected}\n detectPopupClosed={false}\n onConnected={async (nextConnectionId) => {\n await setBinding({\n params: { scopeId: userScopeId },\n payload: {\n scope: userScopeId,\n source: { id: props.sourceId, scope: sourceScope },\n slotKey: oauth2.connectionSlot,\n value: { kind: \"connection\", connectionId: nextConnectionId },\n },\n reactivityKeys: [...sourceWriteKeys, ...connectionWriteKeys],\n });\n }}\n reconnectingLabel=\"Reconnecting…\"\n signingInLabel=\"Signing in…\"\n />\n );\n}\n"],"mappings":"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","names":["useAtomValue","AsyncResult","connectionsAtom","useScope","useUserScope","ScopeId","jsx","useScope","useUserScope","useAtomValue","ScopeId","connectionsAtom"]}
|
|
@@ -92,7 +92,7 @@ var McpToolBinding = Schema.Struct({
|
|
|
92
92
|
});
|
|
93
93
|
|
|
94
94
|
// src/sdk/errors.ts
|
|
95
|
-
import { Schema as Schema2 } from "effect";
|
|
95
|
+
import { Data, Schema as Schema2 } from "effect";
|
|
96
96
|
var McpConnectionError = class extends Schema2.TaggedErrorClass()(
|
|
97
97
|
"McpConnectionError",
|
|
98
98
|
{
|
|
@@ -128,6 +128,8 @@ var McpOAuthError = class extends Schema2.TaggedErrorClass()(
|
|
|
128
128
|
{ httpApiStatus: 400 }
|
|
129
129
|
) {
|
|
130
130
|
};
|
|
131
|
+
var McpAuthRequiredError = class extends Data.TaggedError("McpAuthRequiredError") {
|
|
132
|
+
};
|
|
131
133
|
|
|
132
134
|
export {
|
|
133
135
|
SecretBackedValue,
|
|
@@ -148,6 +150,7 @@ export {
|
|
|
148
150
|
McpToolBinding,
|
|
149
151
|
McpConnectionError,
|
|
150
152
|
McpToolDiscoveryError,
|
|
151
|
-
McpInvocationError
|
|
153
|
+
McpInvocationError,
|
|
154
|
+
McpAuthRequiredError
|
|
152
155
|
};
|
|
153
|
-
//# sourceMappingURL=chunk-
|
|
156
|
+
//# sourceMappingURL=chunk-6OYEXHU3.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/sdk/types.ts","../src/sdk/errors.ts"],"sourcesContent":["import { Effect, Schema } from \"effect\";\nimport {\n ConfiguredCredentialValue,\n credentialSlotKey,\n SecretBackedMap,\n SecretBackedValue,\n} from \"@executor-js/sdk/shared\";\nimport {\n HttpConfiguredValueInput,\n HttpCredentialInput,\n HttpOAuthConfigureInput,\n} from \"@executor-js/sdk/http-source\";\n\nexport { SecretBackedMap, SecretBackedValue };\n\n// ---------------------------------------------------------------------------\n// Remote transport type\n// ---------------------------------------------------------------------------\n\nexport const McpRemoteTransport = Schema.Literals([\"streamable-http\", \"sse\", \"auto\"]);\nexport type McpRemoteTransport = typeof McpRemoteTransport.Type;\n\n/** All transport types (used in the connector layer) */\nexport const McpTransport = Schema.Literals([\"streamable-http\", \"sse\", \"stdio\", \"auto\"]);\nexport type McpTransport = typeof McpTransport.Type;\n\nexport const ConfiguredMcpCredentialValue = ConfiguredCredentialValue;\nexport type ConfiguredMcpCredentialValue = typeof ConfiguredMcpCredentialValue.Type;\n\nexport const McpConfiguredValueInput = HttpConfiguredValueInput;\nexport type McpConfiguredValueInput = typeof McpConfiguredValueInput.Type;\n\nexport const McpCredentialInput = HttpCredentialInput;\nexport type McpCredentialInput = typeof McpCredentialInput.Type;\n\nexport const mcpHeaderSlot = (name: string): string => credentialSlotKey(\"header\", name);\nexport const mcpQueryParamSlot = (name: string): string => credentialSlotKey(\"query_param\", name);\nexport const MCP_HEADER_AUTH_SLOT = \"auth:header\";\nexport const MCP_OAUTH_CONNECTION_SLOT = \"auth:oauth2:connection\";\nexport const MCP_OAUTH_CLIENT_ID_SLOT = \"auth:oauth2:client-id\";\nexport const MCP_OAUTH_CLIENT_SECRET_SLOT = \"auth:oauth2:client-secret\";\n\n// ---------------------------------------------------------------------------\n// Connection auth (only applies to remote sources)\n//\n// `oauth2` is a source-owned credential slot. Concrete per-user or\n// per-workspace connection ids live in core credential_binding rows.\n// ---------------------------------------------------------------------------\n\n/** JSON object loosely typed — used for opaque OAuth state we just round-trip. */\nconst JsonObject = Schema.Record(Schema.String, Schema.Unknown);\nexport { JsonObject as McpJsonObject };\n\nexport const McpConnectionAuth = Schema.Union([\n Schema.Struct({ kind: Schema.Literal(\"none\") }),\n Schema.Struct({\n kind: Schema.Literal(\"header\"),\n headerName: Schema.String,\n secretSlot: Schema.String,\n prefix: Schema.optional(Schema.String),\n }),\n Schema.Struct({\n kind: Schema.Literal(\"oauth2\"),\n connectionSlot: Schema.String,\n clientIdSlot: Schema.optional(Schema.String),\n clientSecretSlot: Schema.optional(Schema.String),\n }),\n]);\nexport type McpConnectionAuth = typeof McpConnectionAuth.Type;\n\nexport const McpConnectionAuthInput = Schema.Union([\n Schema.Struct({\n kind: Schema.Literal(\"none\"),\n }),\n Schema.Struct({\n oauth2: Schema.optional(HttpOAuthConfigureInput),\n }),\n]);\nexport type McpConnectionAuthInput = typeof McpConnectionAuthInput.Type;\n\n// ---------------------------------------------------------------------------\n// Stored source data — discriminated union on transport\n// ---------------------------------------------------------------------------\n\n/** Common fields for remote string map schemas */\nconst StringMap = Schema.Record(Schema.String, Schema.String);\n\nexport const McpRemoteSourceData = Schema.Struct({\n transport: Schema.Literal(\"remote\"),\n /** The MCP server endpoint URL */\n endpoint: Schema.String,\n /** Transport preference for this remote source */\n remoteTransport: McpRemoteTransport.pipe(\n Schema.optionalKey,\n Schema.withConstructorDefault(Effect.succeed(\"auto\" as const)),\n ),\n /** Extra query params appended to the endpoint URL */\n queryParams: Schema.optional(Schema.Record(Schema.String, ConfiguredMcpCredentialValue)),\n /** Extra headers sent on every request */\n headers: Schema.optional(Schema.Record(Schema.String, ConfiguredMcpCredentialValue)),\n /** Auth configuration */\n auth: McpConnectionAuth,\n});\nexport type McpRemoteSourceData = typeof McpRemoteSourceData.Type;\n\nexport const McpStdioSourceData = Schema.Struct({\n transport: Schema.Literal(\"stdio\"),\n /** The command to run */\n command: Schema.String,\n /** Arguments to the command */\n args: Schema.optional(Schema.Array(Schema.String)),\n /** Environment variables */\n env: Schema.optional(StringMap),\n /** Working directory */\n cwd: Schema.optional(Schema.String),\n});\nexport type McpStdioSourceData = typeof McpStdioSourceData.Type;\n\nexport const McpStoredSourceData = Schema.Union([McpRemoteSourceData, McpStdioSourceData]);\nexport type McpStoredSourceData = typeof McpStoredSourceData.Type;\n\n// ---------------------------------------------------------------------------\n// Tool binding — maps a registered ToolId back to the MCP tool name\n// ---------------------------------------------------------------------------\n\nexport const McpToolAnnotations = Schema.Struct({\n title: Schema.optional(Schema.String),\n readOnlyHint: Schema.optional(Schema.Boolean),\n destructiveHint: Schema.optional(Schema.Boolean),\n idempotentHint: Schema.optional(Schema.Boolean),\n openWorldHint: Schema.optional(Schema.Boolean),\n});\nexport type McpToolAnnotations = typeof McpToolAnnotations.Type;\n\nexport const McpToolBinding = Schema.Struct({\n toolId: Schema.String,\n toolName: Schema.String,\n description: Schema.NullOr(Schema.String),\n inputSchema: Schema.optional(Schema.Unknown),\n outputSchema: Schema.optional(Schema.Unknown),\n annotations: Schema.optional(McpToolAnnotations),\n});\nexport type McpToolBinding = typeof McpToolBinding.Type;\n","// MCP plugin tagged errors. Each carries an `HttpApiSchema` annotation so\n// it can be `.addError(...)` directly on the API group — handlers return\n// these and HttpApi encodes them as 4xx responses with a typed body. No\n// per-handler sanitisation step.\n\nimport { Schema } from \"effect\";\n\nexport class McpConnectionError extends Schema.TaggedErrorClass<McpConnectionError>()(\n \"McpConnectionError\",\n {\n transport: Schema.String,\n message: Schema.String,\n },\n { httpApiStatus: 400 },\n) {}\n\nexport class McpToolDiscoveryError extends Schema.TaggedErrorClass<McpToolDiscoveryError>()(\n \"McpToolDiscoveryError\",\n {\n stage: Schema.Literals([\"connect\", \"list_tools\"]),\n message: Schema.String,\n },\n { httpApiStatus: 400 },\n) {}\n\nexport class McpInvocationError extends Schema.TaggedErrorClass<McpInvocationError>()(\n \"McpInvocationError\",\n {\n toolName: Schema.String,\n message: Schema.String,\n },\n { httpApiStatus: 400 },\n) {}\n\nexport class McpOAuthError extends Schema.TaggedErrorClass<McpOAuthError>()(\n \"McpOAuthError\",\n {\n message: Schema.String,\n },\n { httpApiStatus: 400 },\n) {}\n"],"mappings":"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","names":["Schema"]}
|
|
1
|
+
{"version":3,"sources":["../src/sdk/types.ts","../src/sdk/errors.ts"],"sourcesContent":["import { Effect, Schema } from \"effect\";\nimport {\n ConfiguredCredentialValue,\n credentialSlotKey,\n SecretBackedMap,\n SecretBackedValue,\n} from \"@executor-js/sdk/shared\";\nimport {\n HttpConfiguredValueInput,\n HttpCredentialInput,\n HttpOAuthConfigureInput,\n} from \"@executor-js/sdk/http-source\";\n\nexport { SecretBackedMap, SecretBackedValue };\n\n// ---------------------------------------------------------------------------\n// Remote transport type\n// ---------------------------------------------------------------------------\n\nexport const McpRemoteTransport = Schema.Literals([\"streamable-http\", \"sse\", \"auto\"]);\nexport type McpRemoteTransport = typeof McpRemoteTransport.Type;\n\n/** All transport types (used in the connector layer) */\nexport const McpTransport = Schema.Literals([\"streamable-http\", \"sse\", \"stdio\", \"auto\"]);\nexport type McpTransport = typeof McpTransport.Type;\n\nexport const ConfiguredMcpCredentialValue = ConfiguredCredentialValue;\nexport type ConfiguredMcpCredentialValue = typeof ConfiguredMcpCredentialValue.Type;\n\nexport const McpConfiguredValueInput = HttpConfiguredValueInput;\nexport type McpConfiguredValueInput = typeof McpConfiguredValueInput.Type;\n\nexport const McpCredentialInput = HttpCredentialInput;\nexport type McpCredentialInput = typeof McpCredentialInput.Type;\n\nexport const mcpHeaderSlot = (name: string): string => credentialSlotKey(\"header\", name);\nexport const mcpQueryParamSlot = (name: string): string => credentialSlotKey(\"query_param\", name);\nexport const MCP_HEADER_AUTH_SLOT = \"auth:header\";\nexport const MCP_OAUTH_CONNECTION_SLOT = \"auth:oauth2:connection\";\nexport const MCP_OAUTH_CLIENT_ID_SLOT = \"auth:oauth2:client-id\";\nexport const MCP_OAUTH_CLIENT_SECRET_SLOT = \"auth:oauth2:client-secret\";\n\n// ---------------------------------------------------------------------------\n// Connection auth (only applies to remote sources)\n//\n// `oauth2` is a source-owned credential slot. Concrete per-user or\n// per-workspace connection ids live in core credential_binding rows.\n// ---------------------------------------------------------------------------\n\n/** JSON object loosely typed — used for opaque OAuth state we just round-trip. */\nconst JsonObject = Schema.Record(Schema.String, Schema.Unknown);\nexport { JsonObject as McpJsonObject };\n\nexport const McpConnectionAuth = Schema.Union([\n Schema.Struct({ kind: Schema.Literal(\"none\") }),\n Schema.Struct({\n kind: Schema.Literal(\"header\"),\n headerName: Schema.String,\n secretSlot: Schema.String,\n prefix: Schema.optional(Schema.String),\n }),\n Schema.Struct({\n kind: Schema.Literal(\"oauth2\"),\n connectionSlot: Schema.String,\n clientIdSlot: Schema.optional(Schema.String),\n clientSecretSlot: Schema.optional(Schema.String),\n }),\n]);\nexport type McpConnectionAuth = typeof McpConnectionAuth.Type;\n\nexport const McpConnectionAuthInput = Schema.Union([\n Schema.Struct({\n kind: Schema.Literal(\"none\"),\n }),\n Schema.Struct({\n oauth2: Schema.optional(HttpOAuthConfigureInput),\n }),\n]);\nexport type McpConnectionAuthInput = typeof McpConnectionAuthInput.Type;\n\n// ---------------------------------------------------------------------------\n// Stored source data — discriminated union on transport\n// ---------------------------------------------------------------------------\n\n/** Common fields for remote string map schemas */\nconst StringMap = Schema.Record(Schema.String, Schema.String);\n\nexport const McpRemoteSourceData = Schema.Struct({\n transport: Schema.Literal(\"remote\"),\n /** The MCP server endpoint URL */\n endpoint: Schema.String,\n /** Transport preference for this remote source */\n remoteTransport: McpRemoteTransport.pipe(\n Schema.optionalKey,\n Schema.withConstructorDefault(Effect.succeed(\"auto\" as const)),\n ),\n /** Extra query params appended to the endpoint URL */\n queryParams: Schema.optional(Schema.Record(Schema.String, ConfiguredMcpCredentialValue)),\n /** Extra headers sent on every request */\n headers: Schema.optional(Schema.Record(Schema.String, ConfiguredMcpCredentialValue)),\n /** Auth configuration */\n auth: McpConnectionAuth,\n});\nexport type McpRemoteSourceData = typeof McpRemoteSourceData.Type;\n\nexport const McpStdioSourceData = Schema.Struct({\n transport: Schema.Literal(\"stdio\"),\n /** The command to run */\n command: Schema.String,\n /** Arguments to the command */\n args: Schema.optional(Schema.Array(Schema.String)),\n /** Environment variables */\n env: Schema.optional(StringMap),\n /** Working directory */\n cwd: Schema.optional(Schema.String),\n});\nexport type McpStdioSourceData = typeof McpStdioSourceData.Type;\n\nexport const McpStoredSourceData = Schema.Union([McpRemoteSourceData, McpStdioSourceData]);\nexport type McpStoredSourceData = typeof McpStoredSourceData.Type;\n\n// ---------------------------------------------------------------------------\n// Tool binding — maps a registered ToolId back to the MCP tool name\n// ---------------------------------------------------------------------------\n\nexport const McpToolAnnotations = Schema.Struct({\n title: Schema.optional(Schema.String),\n readOnlyHint: Schema.optional(Schema.Boolean),\n destructiveHint: Schema.optional(Schema.Boolean),\n idempotentHint: Schema.optional(Schema.Boolean),\n openWorldHint: Schema.optional(Schema.Boolean),\n});\nexport type McpToolAnnotations = typeof McpToolAnnotations.Type;\n\nexport const McpToolBinding = Schema.Struct({\n toolId: Schema.String,\n toolName: Schema.String,\n description: Schema.NullOr(Schema.String),\n inputSchema: Schema.optional(Schema.Unknown),\n outputSchema: Schema.optional(Schema.Unknown),\n annotations: Schema.optional(McpToolAnnotations),\n});\nexport type McpToolBinding = typeof McpToolBinding.Type;\n","// MCP plugin tagged errors. Each carries an `HttpApiSchema` annotation so\n// it can be `.addError(...)` directly on the API group — handlers return\n// these and HttpApi encodes them as 4xx responses with a typed body. No\n// per-handler sanitisation step.\n\nimport { Data, Schema } from \"effect\";\nimport type { AuthToolFailureCode } from \"@executor-js/sdk/core\";\n\nexport class McpConnectionError extends Schema.TaggedErrorClass<McpConnectionError>()(\n \"McpConnectionError\",\n {\n transport: Schema.String,\n message: Schema.String,\n },\n { httpApiStatus: 400 },\n) {}\n\nexport class McpToolDiscoveryError extends Schema.TaggedErrorClass<McpToolDiscoveryError>()(\n \"McpToolDiscoveryError\",\n {\n stage: Schema.Literals([\"connect\", \"list_tools\"]),\n message: Schema.String,\n },\n { httpApiStatus: 400 },\n) {}\n\nexport class McpInvocationError extends Schema.TaggedErrorClass<McpInvocationError>()(\n \"McpInvocationError\",\n {\n toolName: Schema.String,\n message: Schema.String,\n },\n { httpApiStatus: 400 },\n) {}\n\nexport class McpOAuthError extends Schema.TaggedErrorClass<McpOAuthError>()(\n \"McpOAuthError\",\n {\n message: Schema.String,\n },\n { httpApiStatus: 400 },\n) {}\n\nexport class McpAuthRequiredError extends Data.TaggedError(\"McpAuthRequiredError\")<{\n readonly code: AuthToolFailureCode;\n readonly message: string;\n readonly sourceId: string;\n readonly sourceScope: string;\n readonly credentialKind: \"secret\" | \"connection\" | \"oauth\" | \"upstream\";\n readonly credentialLabel?: string;\n readonly slotKey?: string;\n readonly secretId?: string;\n readonly connectionId?: string;\n readonly status?: number;\n readonly details?: unknown;\n readonly cause?: unknown;\n}> {}\n"],"mappings":"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","names":["Schema"]}
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
McpCredentialInput,
|
|
6
6
|
McpStoredSourceData,
|
|
7
7
|
McpToolDiscoveryError
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-6OYEXHU3.js";
|
|
9
9
|
|
|
10
10
|
// src/react/atoms.ts
|
|
11
11
|
import * as Atom from "effect/unstable/reactivity/Atom";
|
|
@@ -176,4 +176,4 @@ export {
|
|
|
176
176
|
probeMcpEndpoint,
|
|
177
177
|
addMcpSourceOptimistic
|
|
178
178
|
};
|
|
179
|
-
//# sourceMappingURL=chunk-
|
|
179
|
+
//# sourceMappingURL=chunk-FMTVLO5L.js.map
|