import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"; import { Button } from "@/components/ui/button"; import { Combobox } from "@/components/ui/combobox"; import { Label } from "@/components/ui/label"; import { TabsContent } from "@/components/ui/tabs"; import { ListPromptsResult, PromptReference, ResourceReference, } from "@modelcontextprotocol/sdk/types.js"; import { AlertCircle } from "lucide-react"; import { useEffect, useState } from "react"; import ListPane from "./ListPane"; import { useCompletionState } from "@/lib/hooks/useCompletionState"; import JsonView from "./JsonView"; export type Prompt = { name: string; description?: string; arguments?: { name: string; description?: string; required?: boolean; }[]; }; const PromptsTab = ({ prompts, listPrompts, clearPrompts, getPrompt, selectedPrompt, setSelectedPrompt, handleCompletion, completionsSupported, promptContent, nextCursor, error, }: { prompts: Prompt[]; listPrompts: () => void; clearPrompts: () => void; getPrompt: (name: string, args: Record) => void; selectedPrompt: Prompt | null; setSelectedPrompt: (prompt: Prompt) => void; handleCompletion: ( ref: PromptReference | ResourceReference, argName: string, value: string, ) => Promise; completionsSupported: boolean; promptContent: string; nextCursor: ListPromptsResult["nextCursor"]; error: string | null; }) => { const [promptArgs, setPromptArgs] = useState>({}); const { completions, clearCompletions, requestCompletions } = useCompletionState(handleCompletion, completionsSupported); useEffect(() => { clearCompletions(); }, [clearCompletions, selectedPrompt]); const handleInputChange = async (argName: string, value: string) => { setPromptArgs((prev) => ({ ...prev, [argName]: value })); if (selectedPrompt) { requestCompletions( { type: "ref/prompt", name: selectedPrompt.name, }, argName, value, ); } }; const handleGetPrompt = () => { if (selectedPrompt) { getPrompt(selectedPrompt.name, promptArgs); } }; return (
{ setSelectedPrompt(prompt); setPromptArgs({}); }} renderItem={(prompt) => ( <> {prompt.name} {prompt.description} )} title="Prompts" buttonText={nextCursor ? "List More Prompts" : "List Prompts"} isButtonDisabled={!nextCursor && prompts.length > 0} />

{selectedPrompt ? selectedPrompt.name : "Select a prompt"}

{error ? ( Error {error} ) : selectedPrompt ? (
{selectedPrompt.description && (

{selectedPrompt.description}

)} {selectedPrompt.arguments?.map((arg) => (
handleInputChange(arg.name, value)} onInputChange={(value) => handleInputChange(arg.name, value) } options={completions[arg.name] || []} /> {arg.description && (

{arg.description} {arg.required && ( (Required) )}

)}
))} {promptContent && ( )}
) : ( Select a prompt from the list to view and use it )}
); }; export default PromptsTab;