import { Badge } from "@executor-js/react/components/badge"; import { CardStack, CardStackContent, CardStackEntry, CardStackEntryActions, CardStackEntryContent, CardStackEntryDescription, CardStackEntryField, CardStackEntryMedia, CardStackEntryTitle, } from "@executor-js/react/components/card-stack"; import { FieldError } from "@executor-js/react/components/field"; import { Input } from "@executor-js/react/components/input"; import { Skeleton } from "@executor-js/react/components/skeleton"; import { IntegrationFavicon } from "@executor-js/react/components/integration-favicon"; import { IOSSpinner } from "@executor-js/react/components/spinner"; import { Button } from "@executor-js/react/components/button"; import { IntegrationIdentityFieldRows, type IntegrationIdentity, } from "@executor-js/react/plugins/integration-identity"; export type McpRemoteSourcePreview = { readonly name: string; readonly serverName: string | null; readonly connected: boolean; readonly requiresAuthentication: boolean; readonly requiresOAuth: boolean; readonly toolCount: number | null; }; export function McpRemoteSourceFields(props: { readonly url: string; readonly onUrlChange: (url: string) => void; readonly identity: IntegrationIdentity; readonly preview: McpRemoteSourcePreview | null; readonly probing?: boolean; readonly error?: string | null; readonly onRetry?: () => void; readonly namespaceReadOnly?: boolean; readonly urlDisabled?: boolean; }) { const previewDescription = props.preview ? props.preview.connected ? props.preview.toolCount === null ? null : `${props.preview.toolCount} tool${props.preview.toolCount !== 1 ? "s" : ""} available` : props.preview.requiresOAuth ? "OAuth required to discover tools" : props.preview.requiresAuthentication ? "Authentication required to discover tools" : "Ready to add" : null; if (props.preview) { return ( {props.preview.serverName ?? props.preview.name} {previewDescription ? ( {previewDescription} ) : null} {props.preview.connected ? ( Connected ) : props.preview.requiresOAuth ? ( OAuth required ) : ( Auth required )} props.onUrlChange((e.target as HTMLInputElement).value)} placeholder="https://mcp.example.com" className="w-full font-mono text-sm" disabled={props.urlDisabled} /> ); } if (props.probing) { return ( ); } return (
props.onUrlChange((e.target as HTMLInputElement).value)} placeholder="https://mcp.example.com" className="w-full pr-9 font-mono text-sm" aria-invalid={props.error ? true : undefined} disabled={props.urlDisabled} /> {props.probing && (
)}
{props.error && (
{props.error} {props.onRetry && ( )}
)}
); }