Files
reverse-engineering-anything/src/server/registerManagedWorkflowTools/compareManagedMembers.ts
T

80 lines
3.4 KiB
TypeScript

import { recordSessionEvidenceSources } from "../sessionEvidence.js";
import type { McpServer } from "@modelcontextprotocol/server";
import { compareManagedMembersEvidenceValidated } from "../../application/ManagedMemberComparisonService.js";
import { managedMemberComparisonResultSchema } from "../../domain/managedMemberComparison.js";
import { logToolExecution } from "../toolLogging.js";
import { toolRegistrationOptions } from "../toolRegistrationOptions.js";
import { toCallToolResult } from "../toolResult.js";
import { managedWorkflowContract } from "./contract.js";
import { resolveManagedEvidence } from "./evidence.js";
import type { ManagedWorkflowToolRegistration } from "./types.js";
const compareContract = managedWorkflowContract("compare_managed_members");
/** Register the managed member comparison workflow tool. */
export const registerCompareManagedMembers = (
server: McpServer,
options: ManagedWorkflowToolRegistration,
): void => {
server.registerTool(
compareContract.name,
toolRegistrationOptions(compareContract),
async (input) => {
const leftResolved = resolveManagedEvidence(input.left);
const rightResolved = resolveManagedEvidence(input.right);
if (!leftResolved.ok)
return toCallToolResult(leftResolved, compareContract);
if (!rightResolved.ok)
return toCallToolResult(rightResolved, compareContract);
const [left] = leftResolved.value;
const [right] = rightResolved.value;
if (left === undefined || right === undefined)
throw new TypeError("Managed comparison Evidence resolution failed");
const parsed = { left, right };
const result = await logToolExecution(
options.logger,
compareContract.name,
() => Promise.resolve(compareManagedMembersEvidenceValidated(parsed)),
);
if (!result.ok) return toCallToolResult(result, compareContract);
const recorded = recordSessionEvidenceSources(options.recordEvidence, [
parsed.left,
parsed.right,
]);
if (!recorded.ok) return toCallToolResult(recorded, compareContract);
const comparison = managedMemberComparisonResultSchema.parse(
result.value.normalized_result,
);
const unknown = comparison.summary.unknown > 0;
const output = unknown
? options.recordEvidenceWithUnknown?.(result.value, {
question:
"Which managed members remain unmatched or ambiguous across these versions?",
severity: "medium",
domain: "managed-member-comparison",
supporting_evidence_ids: [result.value.evidence_id],
contradicting_evidence_ids: [],
required_authority: "shipped-artifact",
required_confidence: "observed",
required_environment: null,
recommended_probes: [
{
operation: "inspect_managed_members",
rationale:
"Review the inspection Evidence coverage and limit diagnostics; this operation has no page override, so unresolved members must remain unknown.",
},
],
relationships: [],
})
: options.recordEvidence?.(result.value);
if (output !== undefined && !output.ok)
return toCallToolResult(output, compareContract);
return toCallToolResult(
{ ok: true, value: result.value },
compareContract,
);
},
);
};