refactor(mcp): share diagnostic evidence handling

This commit is contained in:
morluto
2026-10-27 10:48:36 +08:00
parent 37d6e8ca9a
commit e4cdf65e2c
2 changed files with 27 additions and 59 deletions
+13 -29
View File
@@ -7,13 +7,11 @@ import type { EvidenceLookup } from "../application/EvidenceInputResolver.js";
import type { EvidenceWriter } from "../application/investigation/InvestigationRecordPort.js";
import { toolContract } from "../contracts/toolContracts.js";
import type { Logger } from "pino";
import { deliverEvidenceResult } from "./contractToolHandler.js";
import { logToolExecution } from "./toolLogging.js";
import { runEvidenceToolOperation } from "./contractToolHandler.js";
import { applicationToolRegistrationOptions } from "./toolRegistrationOptions.js";
import { analysisInputErrorFromIssues } from "../domain/inputIssueProjection.js";
import { err } from "../domain/result.js";
import type { WithAdmittedAnalysis } from "./analysisAdmission.js";
import { runAdmittedToolOperation } from "./admittedToolOperation.js";
import { registerByteEntropyTool } from "./registerByteEntropyTool.js";
/** Bind offline layout inspection to its named contract and session Evidence owner. */
@@ -58,32 +56,18 @@ export const registerBinaryDiagnosticsTools = (
);
const { detail, ...request } = parsed.data;
const parameters = { detail };
return runAdmittedToolOperation(
server,
withAdmittedAnalysis,
contract.name,
context.mcpReq.signal,
async () => {
const result = await logToolExecution(
logger,
contract.name,
async () => {
const ready = delivery.preflight(parameters);
if (!ready.ok) return ready;
const inspected = await service.inspect(request, {
signal: context.mcpReq.signal,
});
return inspected.ok
? delivery.projectEvidence(parameters, inspected.value)
: inspected;
},
);
return deliverEvidenceResult(
server,
result,
contract,
recordEvidence,
);
return runEvidenceToolOperation(
{ server, logger, recordEvidence, withAdmittedAnalysis },
contract,
undefined,
{ input: request, context },
async (input, { signal }) => {
const ready = delivery.preflight(parameters);
if (!ready.ok) return ready;
const inspected = await service.inspect(input, { signal });
return inspected.ok
? delivery.projectEvidence(parameters, inspected.value)
: inspected;
},
);
},
+14 -30
View File
@@ -6,11 +6,9 @@ import type { EvidenceLookup } from "../application/EvidenceInputResolver.js";
import type { EvidenceWriter } from "../application/investigation/InvestigationRecordPort.js";
import { toolContract } from "../contracts/toolContracts.js";
import type { Logger } from "pino";
import { deliverEvidenceResult } from "./contractToolHandler.js";
import { logToolExecution } from "./toolLogging.js";
import { runEvidenceToolOperation } from "./contractToolHandler.js";
import { toolRegistrationOptions } from "./toolRegistrationOptions.js";
import type { WithAdmittedAnalysis } from "./analysisAdmission.js";
import { runAdmittedToolOperation } from "./admittedToolOperation.js";
/** Reject an unretained byte-entropy summary before reading the selected file. */
export const registerByteEntropyTool = (
@@ -30,33 +28,19 @@ export const registerByteEntropyTool = (
contract.name,
toolRegistrationOptions(contract),
async ({ detail, ...request }, context) =>
runAdmittedToolOperation(
server,
withAdmittedAnalysis,
contract.name,
context.mcpReq.signal,
async () => {
const result = await logToolExecution(
logger,
contract.name,
async () => {
const parameters = { detail };
const ready = delivery.preflight(parameters);
if (!ready.ok) return ready;
const inspected = await entropyService.inspect(request, {
signal: context.mcpReq.signal,
});
return inspected.ok
? delivery.projectEvidence(parameters, inspected.value)
: inspected;
},
);
return deliverEvidenceResult(
server,
result,
contract,
recordEvidence,
);
runEvidenceToolOperation(
{ server, logger, recordEvidence, withAdmittedAnalysis },
contract,
undefined,
{ input: request, context },
async (input, { signal }) => {
const parameters = { detail };
const ready = delivery.preflight(parameters);
if (!ready.ok) return ready;
const inspected = await entropyService.inspect(input, { signal });
return inspected.ok
? delivery.projectEvidence(parameters, inspected.value)
: inspected;
},
),
);