inspector/core/react/useManagedRequestorTasks.ts
Cliff Hall ed6eda7492
feat(web): wire up MCP task support — Tasks screen, Run-as-task, status toasts (#1422) (#1424)
Wires the ported Tasks screen + core task subsystem through App.tsx: sticky Clear Completed, cancel/refresh error toasts, core-side per-task progress correlation, Run-as-task on the Tools screen (gated on server support), per-server Task TTL, and live task-status toasts.
2026-06-04 08:49:47 -04:00

63 lines
1.9 KiB
TypeScript

import { useState, useEffect, useCallback } from "react";
import type { InspectorClientProtocol } from "../mcp/inspectorClientProtocol.js";
import type {
ManagedRequestorTasksState,
ManagedRequestorTasksStateEventMap,
} from "../mcp/state/managedRequestorTasksState.js";
import type { Task } from "@modelcontextprotocol/sdk/types.js";
import type { TypedEventGeneric } from "../mcp/typedEventTarget.js";
export interface UseManagedRequestorTasksResult {
tasks: Task[];
refresh: () => Promise<Task[]>;
clearCompleted: () => void;
}
/**
* React hook that subscribes to ManagedRequestorTasksState and returns
* requestor tasks + refresh.
*/
export function useManagedRequestorTasks(
client: InspectorClientProtocol | null,
managedRequestorTasksState: ManagedRequestorTasksState | null,
): UseManagedRequestorTasksResult {
const [tasks, setTasks] = useState<Task[]>(
managedRequestorTasksState?.getTasks() ?? [],
);
useEffect(() => {
if (!managedRequestorTasksState) {
setTasks([]);
return;
}
setTasks(managedRequestorTasksState.getTasks());
const onTasksChange = (
event: TypedEventGeneric<
ManagedRequestorTasksStateEventMap,
"tasksChange"
>,
) => {
setTasks(event.detail);
};
managedRequestorTasksState.addEventListener("tasksChange", onTasksChange);
return () => {
managedRequestorTasksState.removeEventListener(
"tasksChange",
onTasksChange,
);
};
}, [managedRequestorTasksState]);
const refresh = useCallback(async (): Promise<Task[]> => {
if (!managedRequestorTasksState || !client) return [];
const next = await managedRequestorTasksState.refresh();
setTasks(next);
return next;
}, [client, managedRequestorTasksState]);
const clearCompleted = useCallback((): void => {
managedRequestorTasksState?.clearCompleted();
}, [managedRequestorTasksState]);
return { tasks, refresh, clearCompleted };
}