UNPKG

@receiz/mcp-server

Version:

MCP server for agents building and verifying Receiz proof-native applications through the canonical Receiz SDK rails.

1,251 lines • 68.6 kB
import { createHash } from "node:crypto";
import { RECEIZ_CURRENT_REGISTRY_DIGEST, RECEIZ_RELEASE_VERSION, RECEIZ_RULESET_VERSION, bindReceizArtifactAppendRegistryAuthority, commitArtifactTransition, encodeReceizAuthority, planArtifactAppend, sealArtifactTransitionCandidate, } from "@receiz/sdk";
import { RECEIZ_CURRENT_APPLICATION_OPERATION_MATRIX, RECEIZ_CURRENT_APPLICATION_OPERATION_MATRIX_DIGEST, } from "@receiz/sdk/compiler";
import { createReceizMcpGlobalReconciliationOperations, RECEIZ_V113_GLOBAL_RECONCILIATION_TOOL_NAMES, RECEIZ_V113_GLOBAL_RECONCILIATION_TOOLS, } from "./globalReconciliationOperations.js";
import { serializeReceizArtifactTransitionHistoryReport, } from "./artifactTransitionReport.js";
import { createReceizMcpLivingSubjectOperations, RECEIZ_V120_LIVING_SUBJECT_MCP_TOOL_NAMES, RECEIZ_V120_LIVING_SUBJECT_MCP_TOOLS, } from "./livingSubjectOperations.js";
import { RECEIZ_CURRENT_MCP_ATTEMPT_DIGEST_DOMAIN, RECEIZ_CURRENT_MCP_PLAN_DIGEST_DOMAIN, RECEIZ_CURRENT_MCP_PLAN_SCHEMA, RECEIZ_CURRENT_MCP_RESULT_SCHEMA, RECEIZ_CURRENT_MCP_RULESET_VERSION, RECEIZ_HISTORICAL_RECORD_SEAL_MCP_RESULT_SCHEMA, } from "./constitutional.js";
export const RECEIZ_V112_ARTIFACT_TRANSITION_MCP_TOOLS = Object.freeze([
    "receiz_artifact_verify",
    "receiz_artifact_admit",
    "receiz_artifact_append_plan",
    "receiz_artifact_transition_seal_and_stage",
    "receiz_artifact_transition_commit",
]);
export const REQUIRED_RECEIZ_MCP_OPERATION_TOOLS = RECEIZ_V112_ARTIFACT_TRANSITION_MCP_TOOLS;
export const RECEIZ_CURRENT_MCP_ARTIFACT_TOOLS = Object.freeze([
    ...RECEIZ_V112_ARTIFACT_TRANSITION_MCP_TOOLS,
    ...RECEIZ_V113_GLOBAL_RECONCILIATION_TOOL_NAMES,
]);
export const RECEIZ_CURRENT_MCP_LIVING_SUBJECT_TOOLS = RECEIZ_V120_LIVING_SUBJECT_MCP_TOOL_NAMES;
export const RECEIZ_MCP_CURRENT_RELEASE_IDENTITY = Object.freeze({
    version: RECEIZ_RELEASE_VERSION,
    ruleset: RECEIZ_RULESET_VERSION,
    registryDigest: RECEIZ_CURRENT_REGISTRY_DIGEST,
    operationMatrixDigest: RECEIZ_CURRENT_APPLICATION_OPERATION_MATRIX_DIGEST,
    operationAuthorityMatrix: RECEIZ_CURRENT_APPLICATION_OPERATION_MATRIX,
    artifactTools: RECEIZ_CURRENT_MCP_ARTIFACT_TOOLS,
    livingSubjectTools: RECEIZ_CURRENT_MCP_LIVING_SUBJECT_TOOLS,
});
const PROFILE_FIELDS = [
    "username",
    "displayName",
    "bio",
    "location",
    "websiteUrl",
    "socialXUrl",
    "socialInstagramUrl",
    "socialYoutubeUrl",
    "socialLinkedinUrl",
    "socialGithubUrl",
    "avatarUrl",
    "bannerUrl",
    "isPrivate",
    "showSchedulerButton",
];
const PROFILE_FIELD_SET = new Set(PROFILE_FIELDS);
const TEXT_OR_NULL_PROFILE_FIELDS = new Set([
    "displayName",
    "bio",
    "location",
    "websiteUrl",
    "socialXUrl",
    "socialInstagramUrl",
    "socialYoutubeUrl",
    "socialLinkedinUrl",
    "socialGithubUrl",
    "avatarUrl",
    "bannerUrl",
]);
const PROOF_OBJECT_TYPES = new Set([
    "proof_object",
    "sports_card",
    "signal_card",
    "wallet_note",
    "market_certificate",
    "profile_original",
    "document",
]);
const text = (description) => ({ type: "string", description });
const nullableText = (description) => ({ type: ["string", "null"], description });
const boolean = (description) => ({ type: "boolean", description });
const object = (properties, required) => ({ type: "object", additionalProperties: false, properties, required: [...required] });
const planInput = object({
    planDigest: text("Exact digest returned by the corresponding plan call."),
    confirmation: text("Exact local confirmation digest. This is not proof authority."),
}, ["planDigest", "confirmation"]);
const planOutput = object({
    schema: text(RECEIZ_CURRENT_MCP_PLAN_SCHEMA),
    status: text("planned"),
    operation: text("Current SDK operation."),
    planIdentity: text("Deterministic identity of the mutation intent."),
    confirmationDigest: text("Digest for local MCP mutation confirmation."),
    confirmationRequired: boolean("Always true for these MCP mutation tools."),
    writesPerformed: { type: "number", description: "Always zero for planning." },
    intent: { type: "object", additionalProperties: true },
    authority: { type: "object", additionalProperties: true },
}, ["schema", "status", "operation", "planIdentity", "confirmationDigest", "confirmationRequired", "writesPerformed", "authority"]);
const resultOutput = object({
    schema: text(RECEIZ_CURRENT_MCP_RESULT_SCHEMA),
    status: text("committed"),
    operation: text("Current SDK operation."),
    planIdentity: text("Deterministic identity of the completed plan."),
    confirmationDigest: text("Unique consumed execution-attempt identity."),
    result: { type: "object", additionalProperties: true },
    authority: { type: "object", additionalProperties: true },
}, ["schema", "status", "operation", "planIdentity", "confirmationDigest", "result", "authority"]);
const artifactRecordSealResultOutput = object({
    schema: text(RECEIZ_HISTORICAL_RECORD_SEAL_MCP_RESULT_SCHEMA),
    status: text("committed"),
    operation: text("Historical SDK operation."),
    planIdentity: text("Deterministic identity of the completed plan."),
    confirmationDigest: text("Unique consumed execution-attempt identity."),
    result: { type: "object", additionalProperties: true },
    authority: { type: "object", additionalProperties: true },
}, ["schema", "status", "operation", "planIdentity", "confirmationDigest", "result", "authority"]);
const artifactRecordSealPlanOutput = object({
    schema: text("receiz.mcp.artifact_record_seal_plan.v1"),
    status: text("planned"),
    operation: text("assets.createProofObject"),
    registryDigest: text("Current canonical v125 constitution registry digest."),
    payloadSha256: text("SHA-256 of the exact payload bytes."),
    ownerReceizId: text("Expected authenticated Receiz owner binding."),
    filename: text("Filename carried into the native Record to Seal operation."),
    mimeType: text("Payload MIME type carried into the native Record to Seal operation."),
    idempotencyKey: text("Stable SDK Record to Seal idempotency key."),
    planIdentity: text("Deterministic identity of the registry-bound plan."),
    confirmationDigest: text("Exact digest of the registry-bound artifact plan basis."),
    confirmationRequired: boolean("Always true for artifact mutation."),
    writesPerformed: { type: "number", description: "Always zero for planning." },
    intent: { type: "object", additionalProperties: true },
    authority: { type: "object", additionalProperties: true },
}, [
    "schema",
    "status",
    "operation",
    "registryDigest",
    "payloadSha256",
    "ownerReceizId",
    "filename",
    "mimeType",
    "idempotencyKey",
    "planIdentity",
    "confirmationDigest",
    "confirmationRequired",
    "writesPerformed",
    "intent",
    "authority",
]);
const exactArtifactProperties = {
    artifactBase64: text("Base64 encoding of the complete sealed Receiz artifact."),
    filename: text("Authoritative artifact filename supplied with the complete bytes."),
    mimeType: text("Authoritative artifact MIME type supplied with the complete bytes."),
};
const artifactAdmissionInputSchema = {
    type: "object",
    additionalProperties: false,
    properties: {
        ...exactArtifactProperties,
        profile: { enum: ["document", "portable-state", "identity"] },
        ownerConstraint: text("Optional owner constraint."),
        actorConstraint: text("Optional actor constraint."),
        identityPassphrase: text("Immediate-use identity passphrase."),
    },
    oneOf: [
        object({ ...exactArtifactProperties, profile: { const: "document" } }, ["artifactBase64", "filename", "mimeType", "profile"]),
        object({
            ...exactArtifactProperties,
            profile: { const: "portable-state" },
            ownerConstraint: text("Optional owner constraint that only narrows admission."),
            actorConstraint: text("Optional actor constraint that never creates actor evidence."),
        }, ["artifactBase64", "filename", "mimeType", "profile"]),
        object({
            ...exactArtifactProperties,
            profile: { const: "identity" },
            ownerConstraint: text("Optional owner constraint that only narrows admission."),
            actorConstraint: text("Optional actor constraint that never creates actor evidence."),
            identityPassphrase: text("Used only by the immediate SDK identity admission call and never retained or reported."),
        }, ["artifactBase64", "filename", "mimeType", "profile", "identityPassphrase"]),
    ],
};
const authorityDescription = "MCP is not authority; local confirmation is not proof authority. The current Receiz SDK composes the native operation beneath accepted identity proof or the complete sealed proof object.";
const RECEIZ_MCP_OPERATION_TOOL_DEFINITIONS = [
    {
        name: "receiz_identity_profile_update_plan",
        description: `Plan a neutral same-account profile update from profile intent only, without writing. ${authorityDescription}`,
        inputSchema: object({
            profile: object({
                username: text("New username intent."),
                displayName: nullableText("Display name intent."),
                bio: nullableText("Bio intent."),
                location: nullableText("Location intent."),
                websiteUrl: nullableText("Website URL intent."),
                socialXUrl: nullableText("X profile URL intent."),
                socialInstagramUrl: nullableText("Instagram profile URL intent."),
                socialYoutubeUrl: nullableText("YouTube profile URL intent."),
                socialLinkedinUrl: nullableText("LinkedIn profile URL intent."),
                socialGithubUrl: nullableText("GitHub profile URL intent."),
                avatarUrl: nullableText("Avatar URL intent."),
                bannerUrl: nullableText("Banner URL intent."),
                isPrivate: boolean("Profile privacy intent."),
                showSchedulerButton: boolean("Scheduler-button visibility intent."),
            }, []),
        }, ["profile"]),
        outputSchema: planOutput,
    },
    {
        name: "receiz_identity_profile_update_execute",
        description: `Execute the exactly confirmed neutral profile intent through current SDK profile.update. ${authorityDescription}`,
        inputSchema: planInput,
        outputSchema: resultOutput,
    },
    {
        name: "receiz_bearer_asset_claim_plan",
        description: `Plan bearer ownership from the complete sealed artifact bytes only, without opening or writing. ${authorityDescription}`,
        inputSchema: object({
            artifactBase64: text("Base64 encoding of the complete sealed Receiz artifact, never extracted payload bytes."),
            filename: text("Filename of the complete sealed artifact."),
            mimeType: text("MIME type of the complete sealed artifact."),
        }, ["artifactBase64", "filename", "mimeType"]),
        outputSchema: planOutput,
    },
    {
        name: "receiz_bearer_asset_claim_execute",
        description: `Verify and open the exact complete artifact through the SDK, then claim its SDK-issued sealed artifact and return the complete resealed artifact. ${authorityDescription}`,
        inputSchema: planInput,
        outputSchema: resultOutput,
    },
    {
        name: "receiz_artifact_record_seal_plan",
        description: `Plan native Record to Seal from payload bytes without writing. The plan is digest-bound and is not a sealed artifact. ${authorityDescription}`,
        inputSchema: object({
            assetType: text("Current Receiz proof-object type."),
            payloadBase64: text("Base64 encoding of application payload bytes, explicitly not artifact bytes."),
            payloadMimeType: text("MIME type of the application payload."),
            ownerReceizId: text("Expected authenticated Receiz owner; execution must return this same signed owner binding."),
            filename: text("Requested filename carried into the native Record to Seal operation."),
            idempotencyKey: text("Stable SDK Record to Seal idempotency key."),
        }, ["assetType", "payloadBase64", "payloadMimeType", "ownerReceizId", "filename", "idempotencyKey"]),
        outputSchema: artifactRecordSealPlanOutput,
    },
    {
        name: "receiz_artifact_record_seal_execute",
        description: `Execute the exactly confirmed plan through SDK assets.createProofObject, reopen it through SDK verification, and return only the complete native artifact. ${authorityDescription}`,
        inputSchema: planInput,
        outputSchema: artifactRecordSealResultOutput,
    },
    {
        name: "receiz_artifact_verify",
        description: `Verify complete artifact bytes through SDK verification.verifyArtifact; structural inspection never yields a verified result. ${authorityDescription}`,
        inputSchema: object({
            artifactBase64: text("Base64 encoding of the complete sealed Receiz artifact."),
            filename: text("Authoritative artifact filename supplied with the complete bytes."),
            mimeType: text("Authoritative artifact MIME type supplied with the complete bytes."),
        }, ["artifactBase64", "filename", "mimeType"]),
        outputSchema: { type: "object", additionalProperties: true },
    },
    {
        name: "receiz_artifact_extract_verified",
        description: `Verify and open the complete artifact in this operation, then return enclosing artifact bytes separately from verified payload bytes. ${authorityDescription}`,
        inputSchema: object({
            artifactBase64: text("Base64 encoding of the complete sealed Receiz artifact."),
            filename: text("Authoritative artifact filename supplied with the complete bytes."),
            mimeType: text("Authoritative artifact MIME type supplied with the complete bytes."),
        }, ["artifactBase64", "filename", "mimeType"]),
        outputSchema: { type: "object", additionalProperties: true },
    },
    {
        name: "receiz_artifact_round_trip_check",
        description: `Reopen exact complete artifact bytes twice through SDK verifyAndOpen and prove artifact-byte identity plus verified payload recovery without repacking. ${authorityDescription}`,
        inputSchema: object({
            artifactBase64: text("Base64 encoding of the complete sealed Receiz artifact."),
            filename: text("Authoritative artifact filename supplied with the complete bytes."),
            mimeType: text("Authoritative artifact MIME type supplied with the complete bytes."),
        }, ["artifactBase64", "filename", "mimeType"]),
        outputSchema: { type: "object", additionalProperties: true },
    },
    {
        name: "receiz_artifact_explain",
        description: `Explain the payload, sealed-artifact, inspection, and SDK-verification boundaries without inspecting or mutating bytes. ${authorityDescription}`,
        inputSchema: object({}, []),
        outputSchema: { type: "object", additionalProperties: true },
    },
    {
        name: "receiz_artifact_admit",
        description: `Verify exact complete artifact bytes locally, classify authority, and return a read-only admission result. ${authorityDescription}`,
        inputSchema: artifactAdmissionInputSchema,
        outputSchema: { type: "object", additionalProperties: true },
    },
    {
        name: "receiz_artifact_append_plan",
        description: `Plan a v112 append from runtime-custodied SDK admission, verified history, actor evidence, and registry law. ${authorityDescription}`,
        inputSchema: object({
            admissionDigest: text("Runtime admission identity returned by receiz_artifact_admit."),
            verifiedHistoryReference: text("Non-authoritative locator resolved out of band."),
            verifiedActorEvidenceReference: text("Non-authoritative locator resolved out of band."),
            commitDomain: text("Named atomic commit domain."),
            namespace: text("Target artifact namespace."),
            event: { type: ["object", "array", "string", "number", "boolean", "null"] },
            expectedHead: text("Exact lowercase SHA-256 verified-history head."),
            idempotencyKey: text("Domain-scoped idempotency identity."),
        }, ["admissionDigest", "verifiedHistoryReference", "verifiedActorEvidenceReference", "commitDomain", "namespace", "event", "expectedHead", "idempotencyKey"]),
        outputSchema: { type: "object", additionalProperties: true },
    },
    {
        name: "receiz_artifact_transition_seal_and_stage",
        description: `Consume one execution-attempt confirmation, seal canonical successor bytes, and durably stage without advancing a head. ${authorityDescription}`,
        inputSchema: object({
            planDigest: text("Exact SDK plan digest."),
            confirmation: text("Consumable MCP execution-attempt confirmation."),
        }, ["planDigest", "confirmation"]),
        outputSchema: { type: "object", additionalProperties: true },
    },
    {
        name: "receiz_artifact_transition_commit",
        description: `Consume one commit attempt and atomically accept the exact independently resolved staged artifact. ${authorityDescription}`,
        inputSchema: object({
            planDigest: text("Exact SDK recovery plan digest."),
            transitionDigest: text("Exact transition digest."),
            candidateArtifactDigest: text("Exact staged candidate artifact digest."),
            stagedReferenceDigest: text("Exact non-authoritative storage-key digest."),
            confirmation: text("Consumable MCP execution-attempt confirmation."),
        }, ["planDigest", "transitionDigest", "candidateArtifactDigest", "stagedReferenceDigest", "confirmation"]),
        outputSchema: { type: "object", additionalProperties: true },
    },
];
export const RECEIZ_MCP_OPERATION_TOOLS = [
    ...REQUIRED_RECEIZ_MCP_OPERATION_TOOLS.map((name) => {
        const tool = RECEIZ_MCP_OPERATION_TOOL_DEFINITIONS.find((candidate) => candidate.name === name);
        if (!tool)
            throw new Error(`RECEIZ_MCP_TOOL_SCHEMA_MISSING:${name}`);
        return tool;
    }),
    ...RECEIZ_V113_GLOBAL_RECONCILIATION_TOOLS,
    ...RECEIZ_V120_LIVING_SUBJECT_MCP_TOOLS,
];
class ReceizMcpOperationError extends Error {
    code;
    constructor(code) {
        super(code);
        this.name = "ReceizMcpOperationError";
        this.code = code;
    }
}
function isJsonObject(value) {
    return typeof value === "object" && value !== null && !Array.isArray(value);
}
function requiredText(value, key) {
    const field = value[key];
    if (typeof field !== "string" || !field.trim()) {
        throw new ReceizMcpOperationError(`receiz_mcp_${key}_required`);
    }
    return field;
}
function assertExactKeys(value, allowed) {
    const allowedSet = new Set(allowed);
    const unexpected = Object.keys(value).filter((key) => !allowedSet.has(key)).sort();
    if (unexpected.length) {
        throw new ReceizMcpOperationError(`receiz_mcp_unexpected_input:${unexpected.join(",")}`);
    }
}
function profileIntent(value) {
    if (!isJsonObject(value))
        throw new ReceizMcpOperationError("receiz_mcp_profile_required");
    const unexpected = Object.keys(value).filter((key) => !PROFILE_FIELD_SET.has(key)).sort();
    if (unexpected.length) {
        throw new ReceizMcpOperationError(`receiz_mcp_unexpected_input:profile.${unexpected.join(",profile.")}`);
    }
    if (Object.keys(value).length === 0)
        throw new ReceizMcpOperationError("receiz_mcp_profile_required");
    for (const [key, entry] of Object.entries(value)) {
        if (key === "username" && typeof entry !== "string") {
            throw new ReceizMcpOperationError("receiz_mcp_profile_invalid");
        }
        if (TEXT_OR_NULL_PROFILE_FIELDS.has(key) && entry !== null && typeof entry !== "string") {
            throw new ReceizMcpOperationError("receiz_mcp_profile_invalid");
        }
        if ((key === "isPrivate" || key === "showSchedulerButton") && typeof entry !== "boolean") {
            throw new ReceizMcpOperationError("receiz_mcp_profile_invalid");
        }
    }
    return structuredClone(value);
}
function canonical(value) {
    if (value === null || typeof value === "string" || typeof value === "boolean")
        return JSON.stringify(value);
    if (typeof value === "number" && Number.isFinite(value))
        return JSON.stringify(value);
    if (Array.isArray(value))
        return `[${value.map(canonical).join(",")}]`;
    if (isJsonObject(value)) {
        return `{${Object.keys(value).sort().map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`).join(",")}}`;
    }
    throw new ReceizMcpOperationError("receiz_mcp_noncanonical_input");
}
function digest(value) {
    return createHash("sha256").update(canonical(value)).digest("hex");
}
function authorityDigest(domain, schema, value) {
    return createHash("sha256").update(encodeReceizAuthority(domain, schema, value)).digest("hex");
}
function decodeCompleteArtifact(value) {
    if (!value
        || value.length % 4 !== 0
        || !/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(value)) {
        throw new ReceizMcpOperationError("receiz_mcp_complete_artifact_required");
    }
    const decoded = new Uint8Array(Buffer.from(value, "base64"));
    if (!decoded.byteLength || Buffer.from(decoded).toString("base64") !== value) {
        throw new ReceizMcpOperationError("receiz_mcp_complete_artifact_required");
    }
    return decoded;
}
function artifactPlanInput(raw) {
    assertExactKeys(raw, ["artifactBase64", "filename", "mimeType"]);
    const artifactBase64 = requiredText(raw, "artifactBase64");
    decodeCompleteArtifact(artifactBase64);
    const filename = requiredText(raw, "filename").trim();
    const mimeType = requiredText(raw, "mimeType").trim().toLowerCase();
    if (filename.length > 512 || /[\u0000-\u001f\u007f\\/]/.test(filename)) {
        throw new ReceizMcpOperationError("receiz_mcp_artifact_filename_invalid");
    }
    if (!mimeType.includes("/") || /[\r\n]/.test(mimeType)) {
        throw new ReceizMcpOperationError("receiz_mcp_artifact_mime_type_invalid");
    }
    return { artifactBase64, filename, mimeType };
}
function artifactAdmissionInput(raw) {
    const profile = requiredText(raw, "profile");
    const common = ["artifactBase64", "filename", "mimeType", "profile"];
    if (profile === "document")
        assertExactKeys(raw, common);
    else if (profile === "portable-state")
        assertExactKeys(raw, [...common, "ownerConstraint", "actorConstraint"]);
    else if (profile === "identity")
        assertExactKeys(raw, [...common, "ownerConstraint", "actorConstraint", "identityPassphrase"]);
    else
        throw new ReceizMcpOperationError("receiz_mcp_profile_invalid");
    const base = artifactPlanInput({
        artifactBase64: raw.artifactBase64,
        filename: raw.filename,
        mimeType: raw.mimeType,
    });
    const bytes = decodeCompleteArtifact(requiredText(base, "artifactBase64"));
    const ownerConstraint = typeof raw.ownerConstraint === "string" && raw.ownerConstraint.trim()
        ? raw.ownerConstraint.trim()
        : undefined;
    const actorConstraint = typeof raw.actorConstraint === "string" && raw.actorConstraint.trim()
        ? raw.actorConstraint.trim()
        : undefined;
    let options;
    if (profile === "document")
        options = { profile };
    else if (profile === "portable-state")
        options = {
            profile,
            ...(ownerConstraint ? { ownerConstraint } : {}),
            ...(actorConstraint ? { actorConstraint } : {}),
        };
    else {
        if (typeof raw.identityPassphrase !== "string")
            throw new ReceizMcpOperationError("receiz_mcp_identityPassphrase_required");
        options = {
            profile: "identity",
            ...(ownerConstraint ? { ownerConstraint } : {}),
            ...(actorConstraint ? { actorConstraint } : {}),
            identityPassphrase: raw.identityPassphrase,
        };
    }
    return {
        file: new File([new Uint8Array(bytes)], requiredText(base, "filename"), { type: requiredText(base, "mimeType") }),
        options,
    };
}
function recordSealPlanInput(raw) {
    assertExactKeys(raw, ["assetType", "payloadBase64", "payloadMimeType", "ownerReceizId", "filename", "idempotencyKey"]);
    const assetType = requiredText(raw, "assetType").trim();
    if (!PROOF_OBJECT_TYPES.has(assetType))
        throw new ReceizMcpOperationError("receiz_mcp_asset_type_invalid");
    const payloadBase64 = requiredText(raw, "payloadBase64");
    const payloadBytes = decodeCompleteArtifact(payloadBase64);
    const payloadMimeType = requiredText(raw, "payloadMimeType").trim().toLowerCase();
    const ownerReceizId = requiredText(raw, "ownerReceizId").trim();
    const filename = requiredText(raw, "filename").trim();
    const idempotencyKey = requiredText(raw, "idempotencyKey").trim();
    if (!payloadMimeType.includes("/") || /[\r\n]/.test(payloadMimeType)) {
        throw new ReceizMcpOperationError("receiz_mcp_payload_mime_type_invalid");
    }
    if (filename.length > 512 || /[\u0000-\u001f\u007f\\/]/.test(filename)) {
        throw new ReceizMcpOperationError("receiz_mcp_artifact_filename_invalid");
    }
    if (ownerReceizId.length > 512 || /[\u0000-\u001f\u007f]/.test(ownerReceizId)) {
        throw new ReceizMcpOperationError("receiz_mcp_owner_receiz_id_invalid");
    }
    if (idempotencyKey.length > 256)
        throw new ReceizMcpOperationError("receiz_mcp_idempotency_key_invalid");
    return { assetType, payloadBase64, payloadMimeType, ownerReceizId, filename, idempotencyKey, payloadSha256: digestBytes(payloadBytes) };
}
function digestBytes(bytes) {
    return createHash("sha256").update(bytes).digest("hex");
}
function completeArtifactFile(input) {
    const normalized = artifactPlanInput(input);
    const bytes = decodeCompleteArtifact(requiredText(normalized, "artifactBase64"));
    const filename = requiredText(normalized, "filename");
    const mimeType = requiredText(normalized, "mimeType");
    return { bytes, file: new File([new Uint8Array(bytes)], filename, { type: mimeType }), filename, mimeType };
}
export async function verifyCompleteReceizArtifact(client, input) {
    const complete = completeArtifactFile(input);
    const verification = await client.verification.verifyArtifact(complete.file);
    return Object.freeze({ ...complete, artifactSha256: digestBytes(complete.bytes), verification });
}
function planAuthority() {
    return {
        planIsAdmission: false,
        localConfirmationIsProofAuthority: false,
        strongerTruth: "sealed-receiz-proof-object",
    };
}
function operationAuthority() {
    return {
        operationResultIsProofAuthority: false,
        localConfirmationIsProofAuthority: false,
        strongerTruth: "sealed-receiz-proof-object",
    };
}
async function serializeReadableArtifact(value, currentOnly = true) {
    const kind = isJsonObject(value) && typeof value.kind === "string" ? value.kind : "";
    if (!isJsonObject(value)
        || (kind !== "receiz.native-record-seal" && (currentOnly || kind !== "receiz.verified-legacy-artifact"))) {
        throw new ReceizMcpOperationError("receiz_mcp_claimed_artifact_invalid");
    }
    const artifact = value.artifact;
    const filename = typeof value.filename === "string" ? value.filename : "";
    const mimeType = typeof value.mimeType === "string" ? value.mimeType : "";
    const artifactSha256 = typeof value.artifactSha256 === "string" ? value.artifactSha256 : "";
    const payloadSha256 = typeof value.payloadSha256 === "string" ? value.payloadSha256 : "";
    if (!(artifact instanceof Blob)
        || artifact.size <= 0
        || !filename
        || !mimeType
        || artifact.type !== mimeType
        || !/^[0-9a-f]{64}$/.test(artifactSha256)
        || !/^[0-9a-f]{64}$/.test(payloadSha256)
        || !isJsonObject(value.continuity)
        || !isJsonObject(value.verification)) {
        throw new ReceizMcpOperationError("receiz_mcp_claimed_artifact_invalid");
    }
    if (typeof File !== "undefined" && artifact instanceof File && artifact.name !== filename) {
        throw new ReceizMcpOperationError("receiz_mcp_claimed_artifact_invalid");
    }
    const bytes = new Uint8Array(await artifact.arrayBuffer());
    const actualArtifactSha256 = createHash("sha256").update(bytes).digest("hex");
    if (actualArtifactSha256 !== artifactSha256) {
        throw new ReceizMcpOperationError("receiz_mcp_claimed_artifact_digest_mismatch");
    }
    return {
        schema: "receiz.mcp.sealed-artifact.v112",
        kind,
        artifactBase64: Buffer.from(bytes).toString("base64"),
        filename,
        mimeType,
        size: bytes.byteLength,
        artifactSha256,
        payloadSha256,
        continuity: structuredClone(value.continuity),
        verification: structuredClone(value.verification),
    };
}
async function serializeVerifiedPayload(value) {
    if (!isJsonObject(value) || !(value.bytes instanceof Uint8Array)) {
        throw new ReceizMcpOperationError("receiz_mcp_verified_payload_invalid");
    }
    const bytes = new Uint8Array(value.bytes);
    const filename = typeof value.filename === "string" ? value.filename : "";
    const mimeType = typeof value.mimeType === "string" ? value.mimeType : "";
    const sha256 = typeof value.sha256 === "string" ? value.sha256 : "";
    if (!bytes.byteLength || !filename || !mimeType || digestBytes(bytes) !== sha256) {
        throw new ReceizMcpOperationError("receiz_mcp_verified_payload_invalid");
    }
    return {
        schema: "receiz.mcp.verified-payload.v112",
        payloadBase64: Buffer.from(bytes).toString("base64"),
        filename,
        mimeType,
        size: bytes.byteLength,
        sha256,
    };
}
async function serializeExactArtifactReport(value) {
    if (!isJsonObject(value) || !(value.artifact instanceof Blob)
        || typeof value.filename !== "string" || typeof value.mimeType !== "string"
        || typeof value.artifactSha256 !== "string" || typeof value.payloadSha256 !== "string") {
        throw new ReceizMcpOperationError("receiz_mcp_accepted_artifact_invalid");
    }
    const bytes = new Uint8Array(await value.artifact.arrayBuffer());
    if (digestBytes(bytes) !== value.artifactSha256)
        throw new ReceizMcpOperationError("receiz_mcp_accepted_artifact_digest_mismatch");
    return {
        artifactBase64: Buffer.from(bytes).toString("base64"),
        filename: value.filename,
        mimeType: value.mimeType,
        size: bytes.byteLength,
        artifactSha256: value.artifactSha256,
        payloadSha256: value.payloadSha256,
        verificationReportIsProofAuthority: false,
    };
}
async function openCompleteArtifact(client, input) {
    const complete = completeArtifactFile(input);
    const opened = await client.artifacts.verifyAndOpen(complete.file);
    if (!opened || !("sealedArtifact" in opened) || !("verifiedPayload" in opened)) {
        throw new ReceizMcpOperationError("receiz_mcp_complete_artifact_verification_failed");
    }
    return { complete, opened };
}
export function createReceizMcpOperations(client, options = {}) {
    const globalOperations = createReceizMcpGlobalReconciliationOperations(options.globalReconciliationDomain ?? null);
    const livingSubjectOperations = createReceizMcpLivingSubjectOperations(client, { localSubjectRuntime: options.localSubjectRuntime });
    const plans = new Map();
    const reservedOrConsumed = new Set();
    const planIssueCounts = new Map();
    const activePlanByBasis = new Map();
    const planStatus = new Map();
    const artifactAdmissions = new Map();
    const artifactReports = new Map();
    const artifactPlans = new Map();
    const stagedByPlan = new Map();
    const transitionAttempts = new Map();
    const activeAttemptByBasis = new Map();
    const attemptCountByBasis = new Map();
    function admissionIdentity(admission) {
        return digest({
            schema: admission.schema,
            verdict: admission.verdict,
            artifactSha256: admission.verdict === "invalid" ? null : admission.artifactSha256,
            errorCode: admission.error?.code ?? null,
        });
    }
    function serializeAdmission(admission) {
        const admissionDigest = admissionIdentity(admission);
        const common = {
            schema: admission.schema,
            verdict: admission.verdict,
            admissionDigest,
            error: structuredClone(admission.error),
            assessments: structuredClone(admission.assessments),
            explanation: structuredClone(admission.explanation),
            recoveryPlan: null,
            writesPerformed: 0,
            mcpAuthority: false,
            strongerTruth: "sealed-receiz-proof-object",
            admissionIsProofAuthority: false,
        };
        if (admission.verdict === "invalid")
            return common;
        if (admission.verdict === "profile-denied")
            return {
                ...common,
                artifactSha256: admission.artifactSha256,
                payloadSha256: admission.payloadSha256,
                ownerReceizId: admission.ownerReceizId,
                actorConstraint: admission.actorConstraint,
            };
        if (admission.verdict === "verified-document")
            return {
                ...common,
                artifactId: admission.artifactId,
                artifactSha256: admission.artifactSha256,
                payloadSha256: admission.payloadSha256,
                ownerReceizId: admission.ownerReceizId,
            };
        return {
            ...common,
            artifactId: admission.artifactId,
            artifactSha256: admission.artifactSha256,
            payloadSha256: admission.payloadSha256,
            ownerReceizId: admission.ownerReceizId,
            recoveredState: structuredClone(admission.recoveredState),
            ...("actor" in admission ? { reportedActor: {
                    actorId: admission.actor.actorId,
                    evidenceDigest: structuredClone(admission.actor.evidenceDigest),
                    admissionProfile: "identity",
                    registryDigest: structuredClone(admission.actor.registryDigest),
                    authority: { reportedActorIsRuntimeEvidence: false },
                } } : {}),
        };
    }
    function transitionBasis(phase, plan, staged) {
        return canonical(phase === "seal-and-stage" ? {
            phase, planDigest: plan.planDigest.value, transitionDigest: plan.transitionDigest.value,
        } : {
            phase, planDigest: plan.planDigest.value, transitionDigest: plan.transitionDigest.value,
            candidateArtifactDigest: staged?.reference.artifactDigest.value,
            stagedReferenceDigest: staged?.reference.storageKeyDigest.value,
            commitDomain: plan.commitDomain.value,
        });
    }
    function issueTransitionAttempt(phase, plan, staged) {
        const basis = transitionBasis(phase, plan, staged);
        const active = activeAttemptByBasis.get(basis);
        if (active && transitionAttempts.get(active)?.status === "planned")
            return active;
        const attemptNumber = (attemptCountByBasis.get(basis) ?? 0) + 1;
        attemptCountByBasis.set(basis, attemptNumber);
        const confirmation = authorityDigest("confirmation", "receiz.mcp-artifact-transition-attempt.v112", { basis, attempt: attemptNumber });
        transitionAttempts.set(confirmation, Object.freeze({ phase, basis, plan, status: "planned" }));
        activeAttemptByBasis.set(basis, confirmation);
        return confirmation;
    }
    function reserveAttempt(confirmation, phase, plan, staged) {
        const attempt = transitionAttempts.get(confirmation);
        const basis = transitionBasis(phase, plan, staged);
        if (!attempt || attempt.phase !== phase || attempt.plan !== plan || attempt.basis !== basis || attempt.status !== "planned") {
            throw new ReceizMcpOperationError("receiz_mcp_transition_confirmation_invalid");
        }
        const executing = Object.freeze({ ...attempt, status: "executing" });
        transitionAttempts.set(confirmation, executing);
        return executing;
    }
    function terminalAttempt(confirmation, attempt, status) {
        transitionAttempts.set(confirmation, Object.freeze({ ...attempt, status }));
    }
    function issuePlanDigest(baseDigest, attemptDigestDomain) {
        const activeDigest = activePlanByBasis.get(baseDigest);
        if (activeDigest && planStatus.get(activeDigest) === "planned") {
            return activeDigest;
        }
        const issue = (planIssueCounts.get(baseDigest) ?? 0) + 1;
        planIssueCounts.set(baseDigest, issue);
        const planDigest = authorityDigest("confirmation", attemptDigestDomain, {
            planIdentity: baseDigest,
            attempt: issue,
        });
        activePlanByBasis.set(baseDigest, planDigest);
        planStatus.set(planDigest, "planned");
        return planDigest;
    }
    function makePlan(operation, input, intent) {
        const basis = {
            schema: RECEIZ_CURRENT_MCP_PLAN_SCHEMA,
            rulesetVersion: RECEIZ_CURRENT_MCP_RULESET_VERSION,
            operation,
            input,
            ...(intent ? { intent } : {}),
            authority: planAuthority(),
        };
        const planIdentity = authorityDigest("plan", RECEIZ_CURRENT_MCP_PLAN_DIGEST_DOMAIN, basis);
        const plan = Object.freeze({
            operation,
            input: structuredClone(input),
            planIdentity,
            confirmationDigest: issuePlanDigest(planIdentity, RECEIZ_CURRENT_MCP_ATTEMPT_DIGEST_DOMAIN),
            resultSchema: RECEIZ_CURRENT_MCP_RESULT_SCHEMA,
        });
        plans.set(plan.confirmationDigest, plan);
        return {
            schema: RECEIZ_CURRENT_MCP_PLAN_SCHEMA,
            status: "planned",
            operation,
            planIdentity: plan.planIdentity,
            confirmationDigest: plan.confirmationDigest,
            confirmationRequired: true,
            writesPerformed: 0,
            ...(intent ? { intent: structuredClone(intent) } : {}),
            authority: planAuthority(),
        };
    }
    function makeArtifactRecordSealPlan(input) {
        const payloadSha256 = requiredText(input, "payloadSha256");
        const ownerReceizId = requiredText(input, "ownerReceizId");
        const filename = requiredText(input, "filename");
        const mimeType = requiredText(input, "payloadMimeType");
        const idempotencyKey = requiredText(input, "idempotencyKey");
        const basis = {
            schema: "receiz.mcp.artifact_record_seal_plan.v1",
            registryDigest: RECEIZ_CURRENT_REGISTRY_DIGEST,
            payloadSha256,
            ownerReceizId,
            filename,
            mimeType,
            idempotencyKey,
        };
        const planIdentity = authorityDigest("plan", "receiz.mcp-artifact-record-seal-plan.v112", basis);
        const plan = Object.freeze({
            operation: "assets.createProofObject",
            input: structuredClone(input),
            planIdentity,
            confirmationDigest: issuePlanDigest(planIdentity, "receiz.mcp-operation-attempt.v112"),
            resultSchema: RECEIZ_HISTORICAL_RECORD_SEAL_MCP_RESULT_SCHEMA,
        });
        plans.set(plan.confirmationDigest, plan);
        const intent = {
            assetType: input.assetType,
            payloadSha256,
            ownerReceizId,
            filename,
            payloadMimeType: mimeType,
            intendedContinuity: { carrier: "native-record-seal", signatureVersion: 4 },
        };
        return {
            ...basis,
            status: "planned",
            operation: "assets.createProofObject",
            planIdentity: plan.planIdentity,
            confirmationDigest: plan.confirmationDigest,
            confirmationRequired: true,
            writesPerformed: 0,
            intent,
            authority: planAuthority(),
        };
    }
    async function execute(raw, operation, run) {
        assertExactKeys(raw, ["planDigest", "confirmation"]);
        const planDigest = requiredText(raw, "planDigest");
        const confirmation = requiredText(raw, "confirmation");
        if (confirmation !== planDigest) {
            throw new ReceizMcpOperationError("receiz_mcp_confirmation_invalid");
        }
        const plan = plans.get(planDigest);
        if (!plan || plan.operation !== operation || reservedOrConsumed.has(planDigest)) {
            throw new ReceizMcpOperationError("receiz_mcp_plan_invalid");
        }
        // Reserve synchronously before any SDK await. Unknown mutation outcomes stay consumed;
        // retry requires a fresh plan instead of risking a duplicate mutation.
        reservedOrConsumed.add(planDigest);
        planStatus.set(planDigest, "executing");
        try {
            const result = await run(structuredClone(plan.input));
            planStatus.set(planDigest, "committed");
            return {
                schema: plan.resultSchema,
                status: "committed",
                operation,
                planIdentity: plan.planIdentity,
                confirmationDigest: plan.confirmationDigest,
                result,
                authority: operationAuthority(),
            };
        }
        catch (error) {
            planStatus.set(planDigest, "failed");
            throw error;
        }
    }
    return {
        has(name) {
            return RECEIZ_MCP_OPERATION_TOOLS.some((tool) => tool.name === name);
        },
        requiresDelegated(name) {
            return livingSubjectOperations.requiresDelegated(name)
                || name === "receiz_identity_profile_update_execute"
                || name === "receiz_bearer_asset_claim_execute"
                || name === "receiz_artifact_record_seal_execute";
        },
        async call(name, raw) {
            if (globalOperations.has(name))
                return globalOperations.call(name, raw);
            if (livingSubjectOperations.has(name))
                return livingSubjectOperations.call(name, raw);
            if (name === "receiz_artifact_admit") {
                const input = artifactAdmissionInput(raw);
                const complete = completeArtifactFile({
                    artifactBase64: raw.artifactBase64,
                    filename: raw.filename,
                    mimeType: raw.mimeType,
                });
                const verification = await client.verification.verifyArtifact(complete.file);
                let immediateOptions = input.options;
                let admission;
                try {
                    admission = await client.artifacts.admit(verification, immediateOptions);
                }
                catch (error) {
                    if (input.options.profile === "identity") {
                        throw new ReceizMcpOperationError("receiz_mcp_identity_admission_failed");
                    }
                    throw error;
                }
                finally {
                    immediateOptions = undefined;
                }
                artifactAdmissions.set(admissionIdentity(admission), admission);
                const exactArtifact = {
                    artifactBase64: Buffer.from(complete.bytes).toString("base64"),
                    filename: complete.filename,
                    mimeType: complete.mimeType,
                    size: complete.bytes.byteLength,
                    artifactSha256: digestBytes(complete.bytes),
                    verificationReportIsProofAuthority: false,
                };
                artifactReports.set(admissionIdentity(admission), exactArtifact);
                return { ...serializeAdmission(admission), exactArtifact };
            }
            if (name === "receiz_artifact_append_plan") {
                assertExactKeys(raw, ["admissionDigest", "verifiedHistoryReference", "verifiedActorEvidenceReference", "commitDomain", "namespace", "event", "expectedHead", "idempotencyKey"]);
                const admissionDigest = requiredText(raw, "admissionDigest");
                const admission = artifactAdmissions.get(admissionDigest);
                if (!admission)
                    throw new ReceizMcpOperationError("receiz_mcp_artifact_admission_invalid");
                const verifiedHistoryReference = requiredText(raw, "verifiedHistoryReference");
                const verifiedActorEvidenceReference = requiredText(raw, "verifiedActorEvidenceReference");
                const commitDomainValue = requiredText(raw, "commitDomain");
                const namespaceValue = requiredText(raw, "namespace");
                const expectedHeadValue = requiredText(raw, "expectedHead");
                if (!/^[0-9a-f]{64}$/.test(expectedHeadValue))
                    throw new ReceizMcpOperationError("receiz_mcp_expectedHead_invalid");
                if (!("event" in raw))
                    throw new ReceizMcpOperationError("receiz_mcp_event_required");
                canonical(raw.event);
                if (!options.resolveVerifiedProofHistory || !options.resolveVerifiedActorEvidence || !options.resolveVerifiedRegistryDiscovery) {
                    throw new ReceizMcpOperationError("receiz_mcp_transition_authority_required");
                }
                const expectedHead = Object.freeze({ algorithm: "sha-256", binds: "verified-proof-history", value: expectedHeadValue });
                const history = await options.resolveVerifiedProofHistory({ reference: verifiedHistoryReference, admission, expectedHead });
                const actor = await options.resolveVerifiedActorEvidence({ reference: verifiedActorEvidenceReference, admission });
                const registryDiscovery = await options.resolveVerifiedRegistryDiscovery({ admission });
                if (!history || !actor || !registryDiscovery)
                    throw new ReceizMcpOperationError("receiz_mcp_transition_authority_required");
                await bindReceizArtifactAppendRegistryAuthority({ admission, registryDiscovery });
                const planned = await planArtifactAppend({
                    admission,
                    verifiedHistory: history,
                    verifiedActorEvidence: actor,
                    commitDomain: Object.freeze({ scheme: "receiz-commit-domain.v1", value: commitDomainValue }),
                    namespace: Object.freeze({ scheme: "receiz-namespace.v1", value: namespaceValue }),
                    event: structuredClone(raw.event),
                    expectedHead,
                    idempotencyKey: requiredText(raw, "idempotencyKey"),
                });
                const plan = artifactPlans.get(planned.planDigest.value) ?? planned;
                artifactPlans.set(plan.planDigest.value, plan);
                const confirmation = issueTransitionAttempt("seal-and-stage", plan);
                return {
                    schema: "receiz.mcp.artifact-append-plan.v112",
                    planDigest: plan.planDigest.value,
                    transitionDigest: plan.transitionDigest.value,
                    effectsDigest: plan.effectsDigest.value,
                    idempotencyIdentityDigest: plan.idempotencyKeyDigest.value,
                    expectedHead: plan.transition.expectedHead.value,
                    proposedHead: plan.transition.proposedHistoryHead.value,
                    commitDomain: plan.commitDomain.value,
                    confirmation,
                    confirmationRequired: true,
                    writesPerformed: 0,
                    mcpAuthority: false,
                    strongerTruth: "sealed-receiz-proof-object",
                    planIsProofAuthority: false,
                };
            }
            if (name === "receiz_artifact_transition_seal_and_stage") {
                assertExactKeys(raw, ["planDigest", "confirmation"]);
                const planDigest = requiredText(raw, "planDigest");
                const confirmation = requiredText(raw, "confirmation");
                const plan = artifactPlans.get(planDigest);
                if (!plan)
                    throw new ReceizMcpOperationError("receiz_mcp_transition_plan_invalid");
                const attempt = reserveAttempt(confirmation, "seal-and-stage", plan);
                try {
                    if (!options.resolveVerifiedCapability || !options.resolveTransitionSealer || !options.resolveTransitionStore)
                        throw new ReceizMcpOperationError("receiz_mcp_transition_authority_required");
                    const capability = await options.resolveVerifiedCapability({ plan, phase: "seal-and-stage" });
                    const sealer = await options.resolveTransitionSealer({ plan });
                    const store = await options.resolveTransitionStore({ commitDomain: plan.commitDomain, plan });
                    if (!capability || !sealer || !store)
                        throw new ReceizMcpOperationError("receiz_mcp_transition_authority_required");
                    const candidate = await sealArtifactTransitionCandidate({ plan, capability, sealer });
                    const staged = await store.stageCandidate(candidate);
                    stagedByPlan.set(planDigest, staged);
                    terminalAttempt(confirmation, attempt, "committed");
                    const commitConfirmation = issueTransitionAttempt("commit", plan, staged);
                    return {
                        schema: "receiz.mcp.artifact-transition-stage.v112",
                        planDigest: plan.planDigest.value,
                        transitionDigest: plan.transitionDigest.value,
                        candidateArtifactDigest: staged.reference.artifactDigest.value,
                        stagedReferenceDigest: staged.reference.storageKeyDigest.value,
                        stagedReference: {
                            commitDomain: { scheme: staged.reference.commitDomain.scheme, value: staged.reference.commitDomain.value },
                            artifactDigest: { ...staged.reference.artifactDigest },
                            transitionDigest: { ...staged.reference.transitionDigest },
                            storageKeyDigest: { ...staged.reference.storageKeyDigest },
                            authority: {
                                stagingReferenceIsProofAuthority: false,
                                strongerTruth: "sealed-receiz-proof-object",
                            },
                        },
                        exactArtifact: {
                            artifactBase64: Buffer.from(staged.exactBytes).toString("base64"),
                            filename: staged.filename,
                            mimeType: staged.mimeType,
                            size: staged.exactBytes.byteLength,
                            artifactSha256: staged.reference.artifactDigest.value,
                        },
                        headWritesPerformed: 0,
                        commitConfirmation,
                        confirmationRequired: true,
                        mcpAuthority: false,
                        strongerTruth: "sealed-receiz-proof-object",
                        stagingReferenceIsProofAuthority: false,
                    };
                }
                catch (error) {
                    terminalAttempt(confirmation, attempt, "failed");
                    throw error;
                }
            }
            if (name === "receiz_artifact_transition_commit") {
                assertExactKeys(raw, ["planDigest", "transitionDigest", "candidateArtifactDigest", "stagedReferenceDigest", "confirmation"]);
                const planDigest = requiredText(raw, "planDigest");
                const plan = artifactPlans.get(planDigest);
                const staged = stagedByPlan.get(planDigest);
                if (!plan || !staged
                    || requiredText(raw, "transitionDigest") !== plan.transitionDigest.value
                    || requiredText(raw, "candidateArtifactDigest") !== staged.reference.artifactDigest.value
                    || requiredText(raw, "stagedReferenceDigest") !== staged.reference.storageKeyDigest.value) {
                    throw new ReceizMcpOperationError("receiz_mcp_transition_basis_invalid");
                }
                const confirmation = requiredText(raw, "confirmation");
                const attempt = reserveAttempt(confirmation, "commit", plan, staged);
                try {
                    if (!options.resolveVerifiedCapability || !options.resolveTransitionStore)
                        throw new ReceizMcpOperationError("receiz_mcp_transition_authority_required");
                    const capability = await options.resolveVerifiedCapability({ plan, phase: "commit" });
                    const store = await options.resolveTransitionStore({ commitDomain: plan.commitDomain, plan });
                    if (!capability || !store)
                        throw new ReceizMcpOperationError("receiz_mcp_transition_authority_required");
                    const result = await commitArtifactTransition({ plan, capability, staged, store });
                    terminalAttempt(confirmation, attempt, result.status === "committed-artifact-transition" ? "committed" : "failed");
                    if (result.status !== "committed-artifact-transition")
                        return {
                            ...structuredClone(result), writesPerformed: 0, mcpAuthority: false,
                            strongerTruth: "sealed-receiz-proof-object", receiptIsProofAuthority: false,
                        };
                    const artifact = await serializeExactArtifactReport(result.artifact);
                    const receipt = result.receipt;
                    const historyReport = serializeReceizArtifactTransitionHistoryReport(result);
                    return {
                        schema: "receiz.mcp.artifact-transition-commit.v112",
                        status: result.acceptance,
                        artifact,
                        ...historyReport,
                        receipt: {
                            commitDomain: { scheme: receipt.commitDomain.scheme, value: receipt.commitDomain.value },
                            actor: {
                                actorId: receipt.actor.actorId,
                                evidenceDigest: { ...receipt.actor.evidenceDigest },
                                admissionProfile: "identity",
                                registryDigest: { ...receipt.actor.registryDigest },
                            },
                            resource: receipt.resource,
                            operation: receipt.operation,
                            planDigest: { ...receipt.planDigest },
                            capabilityDigest: { ...receipt.capabilityDigest },
                            transitionDigest: { ...receipt.transitionDigest },
                            artifactDigest: { ...receipt.artifactDigest },
                            priorHead: { ...receipt.priorHead },
                            acceptedHead: { ...receipt.acceptedHead },
                            commandDigest: { ...receipt.commandDigest },
                            idempotencyIdentityDigest: { ...receipt.idempotencyIdentityDigest },
                            authority: {
                                receiptIsProofAuthority: false,
                                strongerTruth: "sealed-receiz-proof-object",
                            },
                        },
                        mcpAuthority: false,
                        strongerTruth: "sealed-receiz-proof-object",
                        receiptIsProofAuthority: false,
                    };
                }
                catch (error) {
                    terminalAttempt(confirmation, attempt, "failed");
                    throw error;
                }
            }
            if (name === "receiz_identity_profile_update_plan") {
                assertExactKeys(raw, ["profile"]);
                return makePlan("profile.update", { profile: profileIntent(raw.profile) });
            }
            if (name === "receiz_identity_profile_update_execute") {
                return execute(raw, "profile.update", async (input) => client.profile.update(profileIntent(input.profile)));
            }
            if (name === "receiz_bearer_asset_claim_plan") {
                return makePlan("ownership.claimBearerAsset", artifactPlanInput(raw));
            }
            if (name === "receiz_bearer_asset_claim_execute") {
                return execute(raw, "ownership.claimBearerAsset", async (input) => {
                    const artifactBase64 = requiredText(input, "artifactBase64");
                    const bytes = decodeCompleteArtifact(artifactBase64);
                    const filename = requiredText(input, "filename");
                    const mimeType = requiredText(input, "mimeType");
                    const completeArtifact = new File([new Uint8Array(bytes)], filename, { type: mimeType });
                    const opened = await client.artifacts.verifyAndOpen(completeArtifact);
                    if (!opened || !("sealedArtifact" in opened)) {
                        throw new ReceizMcpOperationError("receiz_mcp_complete_artifact_verification_failed");
                    }
                    const claimed = await client.ownership.claimBearerAsset({ artifact: opened.sealedArtifact });
                    if (!isJsonObject(claimed) || !(claimed.artifact instanceof Blob)) {
                        throw new ReceizMcpOperationError("receiz_mcp_claimed_artifact_invalid");
                    }
                    const sdkResult = await serializeReadableArtifact(claimed);
                    const reopened = await client.artifacts.verifyAndOpen(claimed.artifact);
                    if (!reopened || !("sealedArtifact" in reopened) || !("verifiedPayload" in reopened)) {
                        throw new ReceizMcpOperationError("receiz_mcp_claimed_artifact_reverification_failed");
                    }
                    const reverified = await serializeReadableArtifact(reopened.sealedArtifact);
                    if (reverified.artifactBase64 !== sdkResult.artifactBase64
                        || reverified.artifactSha256 !== sdkResult.artifactSha256
                        || reverified.payloadSha256 !== sdkResult.payloadSha256
                        || reverified.filename !== sdkResult.filename
                        || reverified.mimeType !== sdkResult.mimeType
                        || canonical(reverified.continuity) !== canonical(sdkResult.continuity)) {
                        throw new ReceizMcpOperationError("receiz_mcp_claimed_artifact_reverification_mismatch");
                    }
                    return reverified;
                });
            }
            if (name === "receiz_artifact_record_seal_plan") {
                const input = recordSealPlanInput(raw);
                return makeArtifactRecordSealPlan(input);
            }
            if (name === "receiz_artifact_record_seal_execute") {
                return execute(raw, "assets.createProofObject", async (input) => {
                    const payloadBytes = decodeCompleteArtifact(requiredText(input, "payloadBase64"));
                    if (digestBytes(payloadBytes) !== requiredText(input, "payloadSha256")) {
                        throw new ReceizMcpOperationError("receiz_mcp_payload_digest_mismatch");
                    }
                    const created = await client.assets.createProofObject({
                        assetType: requiredText(input, "assetType"),
                        payload: {
                            bytes: new Uint8Array(payloadBytes),
                            mimeType: requiredText(input, "payloadMimeType"),
                        },
                    }, {
                        filename: requiredText(input, "filename"),
                        idempotencyKey: requiredText(input, "idempotencyKey"),
                    });
                    if (!isJsonObject(created) || !(created.artifact instanceof Blob)) {
                        throw new ReceizMcpOperationError("receiz_mcp_created_artifact_invalid");
                    }
                    const expectedOwnerReceizId = requiredText(input, "ownerReceizId");
                    if (!isJsonObject(created.continuity) || created.continuity.ownerReceizId !== expectedOwnerReceizId) {
                        throw new ReceizMcpOperationError("receiz_mcp_owner_mismatch");
                    }
                    const opened = await client.artifacts.verifyAndOpen(created.artifact);
                    if (!opened || !("sealedArtifact" in opened)) {
                        throw new ReceizMcpOperationError("receiz_mcp_complete_artifact_verification_failed");
                    }
                    const createdArtifact = await serializeReadableArtifact(created);
                    const verifiedArtifact = await serializeReadableArtifact(opened.sealedArtifact);
                    if (!isJsonObject(verifiedArtifact.continuity)
                        || verifiedArtifact.continuity.ownerReceizId !== expectedOwnerReceizId)
                        throw new ReceizMcpOperationError("receiz_mcp_owner_mismatch");
                    if (createdArtifact.artifactBase64 !== verifiedArtifact.artifactBase64
                        || createdArtifact.artifactSha256 !== verifiedArtifact.artifactSha256
                        || createdArtifact.filename !== verifiedArtifact.filename
                        || createdArtifact.mimeType !== verifiedArtifact.mimeType)
                        throw new ReceizMcpOperationError("receiz_mcp_record_seal_round_trip_mismatch");
                    return verifiedArtifact;
                });
            }
            if (name === "receiz_artifact_verify") {
                const result = await verifyCompleteReceizArtifact(client, raw);
                const verification = isJsonObject(result.verification) ? result.verification : {};
                return {
                    schema: "receiz.mcp.artifact-verification.v112",
                    verificationPerformed: true,
                    status: verification.status ?? "unknown",
                    artifact: {
                        artifactBase64: Buffer.from(result.bytes).toString("base64"),
                        artifactSha256: result.artifactSha256,
                        filename: result.filename,
                        mimeType: result.mimeType,
                        size: result.bytes.byteLength,
                    },
                    artifactDigest: isJsonObject(verification.artifactDigest) ? structuredClone(verification.artifactDigest) : null,
                    payloadDigest: isJsonObject(verification.payloadDigest) ? structuredClone(verification.payloadDigest) : null,
                    continuity: isJsonObject(verification.continuity) ? structuredClone(verification.continuity) : null,
                    mcpAuthority: false,
                    strongerTruth: "sealed-receiz-proof-object",
                    verificationReportIsProofAuthority: false,
                };
            }
            if (name === "receiz_artifact_extract_verified") {
                const { complete, opened } = await openCompleteArtifact(client, raw);
                const artifact = await serializeReadableArtifact(opened.sealedArtifact, false);
                if (artifact.artifactBase64 !== Buffer.from(complete.bytes).toString("base64")) {
                    throw new ReceizMcpOperationError("receiz_mcp_artifact_byte_identity_failed");
                }
                return {
                    schema: "receiz.mcp.artifact-extraction.v112",
                    artifact,
                    verifiedPayload: await serializeVerifiedPayload(opened.verifiedPayload),
                    verification: structuredClone(opened.verification),
                    legacyCompatibility: opened.legacyCompatibility ?? null,
                    authority: operationAuthority(),
                };
            }
            if (name === "receiz_artifact_round_trip_check") {
                const { complete, opened } = await openCompleteArtifact(client, raw);
                if (!isJsonObject(opened.sealedArtifact) || !(opened.sealedArtifact.artifact instanceof Blob)) {
                    throw new ReceizMcpOperationError("receiz_mcp_complete_artifact_verification_failed");
                }
                const reopened = await client.artifacts.verifyAndOpen(opened.sealedArtifact.artifact);
                if (!reopened || !("sealedArtifact" in reopened) || !("verifiedPayload" in reopened)) {
                    throw new ReceizMcpOperationError("receiz_mcp_round_trip_verification_failed");
                }
                const firstArtifact = await serializeReadableArtifact(opened.sealedArtifact, false);
                const secondArtifact = await serializeReadableArtifact(reopened.sealedArtifact, false);
                const firstPayload = await serializeVerifiedPayload(opened.verifiedPayload);
                const secondPayload = await serializeVerifiedPayload(reopened.verifiedPayload);
                const inputBase64 = Buffer.from(complete.bytes).toString("base64");
                const artifactByteIdentity = firstArtifact.artifactBase64 === inputBase64
                    && secondArtifact.artifactBase64 === inputBase64
                    && firstArtifact.artifactSha256 === secondArtifact.artifactSha256;
                const payloadRecovery = firstPayload.sha256 === secondPayload.sha256
                    && firstPayload.payloadBase64 === secondPayload.payloadBase64;
                if (!artifactByteIdentity || !payloadRecovery) {
                    throw new ReceizMcpOperationError("receiz_mcp_round_trip_verification_failed");
                }
                return {
                    schema: "receiz.mcp.artifact-round-trip.v112",
                    artifactByteIdentity,
                    payloadRecovery,
                    destinationAppRecovery: "sdk-verify-and-open",
                    artifact: {
                        kind: firstArtifact.kind,
                        filename: firstArtifact.filename,
                        mimeType: firstArtifact.mimeType,
                        size: firstArtifact.size,
                        artifactSha256: firstArtifact.artifactSha256,
                        continuity: firstArtifact.continuity,
                    },
                    verifiedPayload: {
                        filename: firstPayload.filename,
                        mimeType: firstPayload.mimeType,
                        size: firstPayload.size,
                        sha256: firstPayload.sha256,
                    },
                    authority: operationAuthority(),
                };
            }
            if (name === "receiz_artifact_explain") {
                assertExactKeys(raw, []);
                return {
                    schema: "receiz.mcp.artifact-explanation.v112",
                    artifactBytes: "Artifact bytes are the exact indivisible bytes emitted by SDK native Record to Seal; authoritative filename and MIME remain attached.",
                    payloadBytes: "Payload bytes are application-domain bytes extracted only by SDK verifyAndOpen after enclosing-artifact verification.",
                    inspection: "Shape or metadata inspection is not verification.",
                    verification: "Only current SDK artifact verification can admit the complete enclosing artifact.",
                    safeWorkflow: ["assets.createProofObject", "artifacts.download", "artifacts.verifyAndOpen"],
                    forbidden: ["payload fallback", "artifact-as-domain-payload", "download original on failure", "manual Blob repacking"],
                    mcpIsProofAuthority: false,
                    strongerTruth: "sealed-receiz-proof-object",
                };
            }
            throw new ReceizMcpOperationError("receiz_mcp_tool_unknown");
        },
    };
}
//# sourceMappingURL=operations.js.map