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
commit 7f713fe40e

View file

@ -15,9 +15,6 @@ import {
Root,
ServerNotification,
Tool,
PromptReference,
ResourceReference,
CompleteResultSchema,
} from "@modelcontextprotocol/sdk/types.js";
import React, { Suspense, useEffect, useRef, useState } from "react";
import { useConnection } from "./lib/hooks/useConnection";
@ -154,6 +151,8 @@ const App = () => {
requestHistory,
makeRequest: makeConnectionRequest,
sendNotification,
handleCompletion,
completionsSupported,
connect: connectMcpServer,
} = useConnection({
transportType,
@ -267,38 +266,6 @@ const App = () => {
}
};
const handleCompletion = async (
ref: ResourceReference | PromptReference,
argName: string,
value: string,
signal?: AbortSignal,
) => {
if (!mcpClient) {
throw new Error("MCP client not connected");
}
const request: ClientRequest = {
method: "completion/complete",
params: {
argument: {
name: argName,
value,
},
ref,
},
};
try {
const result = await makeRequest(request, CompleteResultSchema);
return result.completion.values;
} catch (e: unknown) {
const errorMessage = e instanceof Error ? e.message : String(e);
toast.error(errorMessage);
throw e;
}
};
const listResources = async () => {
const response = await makeRequest(
{
@ -518,7 +485,8 @@ const App = () => {
clearError("resources");
setSelectedResource(resource);
}}
onComplete={handleCompletion}
handleCompletion={handleCompletion}
completionsSupported={completionsSupported}
resourceContent={resourceContent}
nextCursor={nextResourceCursor}
nextTemplateCursor={nextResourceTemplateCursor}
@ -543,7 +511,8 @@ const App = () => {
clearError("prompts");
setSelectedPrompt(prompt);
}}
onComplete={handleCompletion}
handleCompletion={handleCompletion}
completionsSupported={completionsSupported}
promptContent={promptContent}
nextCursor={nextPromptCursor}
error={errors.prompts}