refactor(completions): improve completion handling and error states

- Move completion logic from App.tsx to useConnection hook
- Replace useCompletion with simpler useCompletionState hook
- Add graceful fallback for servers without completion support
- Improve error handling and state management
- Update PromptsTab and ResourcesTab to use new completion API
- Add type safety improvements across completion interfaces
This commit is contained in:
Gavin Aboulhosn
2025-02-12 19:05:51 -05:00
parent c66feff37d
commit 7f713fe40e
6 changed files with 166 additions and 180 deletions

View File

@@ -7,11 +7,12 @@ import { Textarea } from "@/components/ui/textarea";
import {
ListPromptsResult,
PromptReference,
ResourceReference,
} from "@modelcontextprotocol/sdk/types.js";
import { AlertCircle } from "lucide-react";
import { useEffect, useState } from "react";
import ListPane from "./ListPane";
import { useCompletions } from "@/lib/useCompletion";
import { useCompletionState } from "@/lib/hooks/useCompletionState";
export type Prompt = {
name: string;
@@ -30,7 +31,8 @@ const PromptsTab = ({
getPrompt,
selectedPrompt,
setSelectedPrompt,
onComplete,
handleCompletion,
completionsSupported,
promptContent,
nextCursor,
error,
@@ -41,19 +43,19 @@ const PromptsTab = ({
getPrompt: (name: string, args: Record<string, string>) => void;
selectedPrompt: Prompt | null;
setSelectedPrompt: (prompt: Prompt) => void;
onComplete: (
ref: PromptReference,
handleCompletion: (
ref: PromptReference | ResourceReference,
argName: string,
value: string,
) => Promise<string[]>;
completionsSupported: boolean;
promptContent: string;
nextCursor: ListPromptsResult["nextCursor"];
error: string | null;
}) => {
const [promptArgs, setPromptArgs] = useState<Record<string, string>>({});
const { completions, clearCompletions, requestCompletions } = useCompletions({
onComplete,
});
const { completions, clearCompletions, requestCompletions } =
useCompletionState(handleCompletion, completionsSupported);
useEffect(() => {
clearCompletions();

View File

@@ -9,11 +9,12 @@ import {
ResourceTemplate,
ListResourceTemplatesResult,
ResourceReference,
PromptReference,
} from "@modelcontextprotocol/sdk/types.js";
import { AlertCircle, ChevronRight, FileText, RefreshCw } from "lucide-react";
import ListPane from "./ListPane";
import { useEffect, useState } from "react";
import { useCompletions } from "@/lib/useCompletion";
import { useCompletionState } from "@/lib/hooks/useCompletionState";
const ResourcesTab = ({
resources,
@@ -25,7 +26,8 @@ const ResourcesTab = ({
readResource,
selectedResource,
setSelectedResource,
onComplete,
handleCompletion,
completionsSupported,
resourceContent,
nextCursor,
nextTemplateCursor,
@@ -40,11 +42,12 @@ const ResourcesTab = ({
readResource: (uri: string) => void;
selectedResource: Resource | null;
setSelectedResource: (resource: Resource | null) => void;
onComplete: (
ref: ResourceReference,
handleCompletion: (
ref: ResourceReference | PromptReference,
argName: string,
value: string,
) => Promise<string[]>;
completionsSupported: boolean;
resourceContent: string;
nextCursor: ListResourcesResult["nextCursor"];
nextTemplateCursor: ListResourceTemplatesResult["nextCursor"];
@@ -56,9 +59,8 @@ const ResourcesTab = ({
{},
);
const { clearCompletions, completions, requestCompletions } = useCompletions({
onComplete,
});
const { completions, clearCompletions, requestCompletions } =
useCompletionState(handleCompletion, completionsSupported);
useEffect(() => {
clearCompletions();