Files
rea/src/server/registerApplicationTools/compareVersions.ts
T

56 lines
2.1 KiB
TypeScript

import type { EvidenceMcpServer } from "../EvidenceMcpServer.js";
import { runAdmittedToolOperation } from "../admittedToolOperation.js";
import { recordSessionEvidenceSources } from "../sessionEvidence.js";
import { compareApplicationVersionsEvidence } from "../../application/javascript/JavaScriptApplicationWorkflowService.js";
import { applicationToolContract } from "../../contracts/applicationToolContracts.js";
import { logToolExecution } from "../toolLogging.js";
import { toolRegistrationOptions } from "../toolRegistrationOptions.js";
import { recordResult } from "./helpers.js";
import type { ApplicationToolRegistration } from "./types.js";
const compareContract = applicationToolContract("compare_application_versions");
/** Register the provider-neutral JavaScript version comparison tool. */
export const registerCompareApplicationVersionsTool = (
server: EvidenceMcpServer,
options: ApplicationToolRegistration,
): void => {
server.registerTool(
compareContract.name,
toolRegistrationOptions(compareContract),
async (input, context) =>
runAdmittedToolOperation(
server,
options.withAdmittedAnalysis,
compareContract.name,
context.mcpReq.signal,
async () => {
const result = await logToolExecution(
options.logger,
compareContract.name,
() =>
Promise.resolve(
compareApplicationVersionsEvidence(input, options.evidenceById),
),
);
if (!result.ok)
return server.delivery.toCallToolResult(result, compareContract);
const recorded = recordSessionEvidenceSources(
options.recordEvidence,
result.value.sources,
);
if (!recorded.ok)
return server.delivery.toCallToolResult(recorded, compareContract);
const unknown = result.value.result.summary.unknown > 0;
return recordResult(
{ ...options, delivery: server.delivery },
compareContract,
result.value.evidence,
unknown ? "application-version-comparison" : undefined,
);
},
),
);
};