Files
rea/src/server/sessionEvidence.ts
T
morluto ee1cd40405 feat(mcp)!: harden contracts and evidence references
BREAKING CHANGE: comparison tools now require session-owned Evidence IDs or approved bundle paths, and structured Evidence results use compact references.
2026-07-16 19:49:58 +08:00

51 lines
1.5 KiB
TypeScript

import type { BinarySessionPort } from "../application/BinarySession.js";
import {
EvidenceIntegrityError,
EvidenceReferenceError,
} from "../domain/errors.js";
import type { Evidence } from "../domain/evidence.js";
import { err, ok, type Result } from "../domain/result.js";
type EvidenceAuthorityResult = Result<Evidence[], EvidenceIntegrityError>;
/** Resolve bounded IDs to authoritative records with exact semantic identity. */
export const resolveSessionEvidenceIds = (
session: BinarySessionPort,
evidenceIds: readonly string[],
expected: { readonly operation: string; readonly predicate: string },
): EvidenceAuthorityResult => {
const records: Evidence[] = [];
for (const evidenceId of evidenceIds) {
const record = session.evidenceById(evidenceId);
if (record === undefined)
return err(
new EvidenceReferenceError(
evidenceId,
"missing",
expected.operation,
null,
),
);
if (record.operation !== expected.operation)
return err(
new EvidenceReferenceError(
evidenceId,
"wrong_operation",
expected.operation,
record.operation,
),
);
if (record.predicate_type !== expected.predicate)
return err(
new EvidenceReferenceError(
evidenceId,
"wrong_predicate",
expected.predicate,
record.predicate_type,
),
);
records.push(record);
}
return ok(records);
};