import { Component, type ErrorInfo, type ReactNode, StrictMode, Suspense, use, useEffect, useMemo, useRef, useState } from "react"; import { createRoot } from "react-dom/client"; import { callTool, connectToServer, hasAppHtml, initializeApp, loadSandboxProxy, log, newAppBridge, type ServerInfo, type ToolCallInfo } from "./implementation"; import styles from "./index.module.css"; // Host passes serversPromise to CallToolPanel interface HostProps { serversPromise: Promise; } function Host({ serversPromise }: HostProps) { const [toolCalls, setToolCalls] = useState([]); return ( <> {toolCalls.map((info, i) => ( ))} setToolCalls([...toolCalls, info])} /> ); } // CallToolPanel renders the unified form with Suspense around ServerSelect interface CallToolPanelProps { serversPromise: Promise; addToolCall: (info: ToolCallInfo) => void; } 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); return true; } catch { return false; } }, [inputJson]); const handleServerSelect = (server: ServerInfo) => { setSelectedServer(server); const [firstTool] = server.tools.keys(); setSelectedTool(firstTool ?? ""); }; const handleSubmit = () => { if (!selectedServer) return; const toolCallInfo = callTool(selectedServer, selectedTool, JSON.parse(inputJson)); addToolCall(toolCallInfo); }; return (
{ e.preventDefault(); handleSubmit(); }}>