import type { McpObservation } from "../shared/mcp"; import type { ExtensionDiagnosticInput, ExtensionDiagnosticSink, } from "../shared/extension-diagnostics"; import { emitExtensionDiagnostic } from "./extension-diagnostics"; import * as Cause from "effect/Cause"; export type McpDiagnostic = { operation: Extract; startedAt: number; }; export function mcpCauseOutcome( cause: Cause.Cause, failure: "authentication" | "connection", ) { return Cause.hasInterrupts(cause) ? { status: "aborted" as const, failure: "cancelled" as const } : { status: "error" as const, failure }; } export function recordMcpDiagnostic( sink: ExtensionDiagnosticSink | undefined, id: string, diagnostic: McpDiagnostic, outcome: Pick, ) { emitExtensionDiagnostic(sink, { ...diagnostic, source: { kind: "mcp", id }, ...outcome, }); } export function mcpDiagnosticOutcome( observation: McpObservation, ): Pick { if (observation.state === "ready") return { status: "completed" }; const error = observation.lastError; const failure = error === "authentication_required" || error === "authentication_failed" ? "authentication" : error === "credentials_unreadable" ? "storage" : error === "discovery_failed" ? "discovery" : "connection"; return { status: "error", failure }; }