diff --git a/examples/basic-host/src/index.module.css b/examples/basic-host/src/index.module.css index 961d078..c162aa8 100644 --- a/examples/basic-host/src/index.module.css +++ b/examples/basic-host/src/index.module.css @@ -1,9 +1,3 @@ -.connecting { - padding: 1rem 0; - text-align: center; - color: #666; -} - .callToolPanel, .toolCallInfoPanel { margin: 0 auto; padding: 1rem; @@ -16,9 +10,6 @@ } .callToolPanel { - display: flex; - flex-direction: column; - gap: 1rem; max-width: 480px; form { @@ -39,12 +30,16 @@ padding: 0.5rem; border: 1px solid #ccc; border-radius: 4px; - font-family: monospace; font-size: inherit; } - textarea { + .toolSelect { + font-family: monospace; + } + + .toolInput { min-height: 6rem; + font-family: monospace; resize: vertical; &[aria-invalid="true"] { @@ -92,10 +87,15 @@ gap: 0.5rem; min-width: 0; - .toolName { + h2 { + display: flex; + flex-direction: column; margin: 0; - font-family: monospace; font-size: 1.5rem; + + .toolName { + font-family: monospace; + } } } diff --git a/examples/basic-host/src/index.tsx b/examples/basic-host/src/index.tsx index 0307d12..37eac43 100644 --- a/examples/basic-host/src/index.tsx +++ b/examples/basic-host/src/index.tsx @@ -4,84 +4,39 @@ import { callTool, connectToServer, hasAppHtml, initializeApp, loadSandboxProxy, import styles from "./index.module.css"; -// Wrapper to track server name with each tool call -interface ToolCallEntry { - serverName: string; - info: ToolCallInfo; -} - -// Host receives connected servers via promise, uses single use() call +// Host passes serversPromise to CallToolPanel interface HostProps { serversPromise: Promise; } function Host({ serversPromise }: HostProps) { - const servers = use(serversPromise); - const [toolCalls, setToolCalls] = useState([]); - - if (servers.length === 0) { - return

No servers configured. Set SERVERS environment variable.

; - } + const [toolCalls, setToolCalls] = useState([]); return ( <> - {toolCalls.map((entry, i) => ( - + {toolCalls.map((info, i) => ( + ))} setToolCalls([...toolCalls, { serverName, info }])} + serversPromise={serversPromise} + addToolCall={(info) => setToolCalls([...toolCalls, info])} /> ); } -// CallToolPanel manages server selection from already-connected servers +// CallToolPanel renders the unified form with Suspense around ServerSelect interface CallToolPanelProps { - servers: ServerInfo[]; - addToolCall: (serverName: string, info: ToolCallInfo) => void; + serversPromise: Promise; + addToolCall: (info: ToolCallInfo) => void; } -function CallToolPanel({ servers, addToolCall }: CallToolPanelProps) { - const [selectedIndex, setSelectedIndex] = useState(0); - const selectedServer = servers[selectedIndex]; - - return ( -
- - -
- ); -} - - -// ToolCallForm receives already-resolved serverInfo -interface ToolCallFormProps { - serverName: string; - serverInfo: ServerInfo; - addToolCall: (serverName: string, info: ToolCallInfo) => void; -} -function ToolCallForm({ serverName, serverInfo, addToolCall }: ToolCallFormProps) { - const toolNames = Array.from(serverInfo.tools.keys()); - const [selectedTool, setSelectedTool] = useState(toolNames[0] ?? ""); +function CallToolPanel({ serversPromise, addToolCall }: CallToolPanelProps) { + const [selectedServer, setSelectedServer] = useState(null); + const [selectedTool, setSelectedTool] = useState(""); const [inputJson, setInputJson] = useState("{}"); + const toolNames = selectedServer ? Array.from(selectedServer.tools.keys()) : []; + const isValidJson = useMemo(() => { try { JSON.parse(inputJson); @@ -91,49 +46,104 @@ function ToolCallForm({ serverName, serverInfo, addToolCall }: ToolCallFormProps } }, [inputJson]); + const handleServerSelect = (server: ServerInfo) => { + setSelectedServer(server); + const [firstTool] = server.tools.keys(); + setSelectedTool(firstTool ?? ""); + }; + const handleSubmit = () => { - const toolCallInfo = callTool(serverInfo, selectedTool, JSON.parse(inputJson)); - addToolCall(serverName, toolCallInfo); + if (!selectedServer) return; + const toolCallInfo = callTool(selectedServer, selectedTool, JSON.parse(inputJson)); + addToolCall(toolCallInfo); }; return ( -
{ e.preventDefault(); handleSubmit(); }}> - -