{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../../src/core/mission/contract.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAE1E,MAAM,WAAW,oBAAoB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,qEAAqE;IACrE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,yDAAyD;IACzD,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,2BAA2B;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IAClC,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CAC1C,QAAQ,EAAE,oBAAoB,EAC9B,QAAQ,EAAE,2BAA2B,GACnC,kBAAkB,CAUpB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,oBAAoB,EAAE,QAAQ,EAAE,2BAA2B,GAAG,OAAO,CAE9G;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CACnC,QAAQ,EAAE,eAAe,EACzB,QAAQ,EAAE,oBAAoB,EAC9B,QAAQ,EAAE,2BAA2B,GACnC,sBAAsB,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,CAAC,CAUrE","sourcesContent":["/**\n * Durable Mission Graph — typed contracts & producer/consumer linking (2.0.0).\n *\n * Contracts are typed bindings between a producer objective and a consumer\n * objective. Compatibility is verified by comparing contract revisions and\n * schema digests; stale producer revisions are detected and block the consumer.\n */\n\nimport type { MissionContract, MissionOperationResult } from \"./types.js\";\n\nexport interface ProducerContractRoot {\n\tid: string;\n\trevision: number;\n\tschema: string;\n\t/** The last revision actually produced/satisfied by the producer. */\n\tproducedRevision?: number;\n\t/** SHA-256 of the current producer schema definition. */\n\tproducedSchemaDigest?: string;\n}\n\nexport interface ConsumerContractRequirement {\n\tcontractId: string;\n\trequiredRevision: number;\n\trequiredSchema?: string;\n}\n\nexport interface CompatibilityCheck {\n\tcompatible: boolean;\n\treasons: string[];\n}\n\n/**\n * Verify that a producer's produced output satisfies a consumer's required\n * contract revision. A mismatch in revision or schema digest marks the\n * producer output stale for that consumer.\n */\nexport function verifyContractCompatibility(\n\tproducer: ProducerContractRoot,\n\tconsumer: ConsumerContractRequirement,\n): CompatibilityCheck {\n\tconst reasons: string[] = [];\n\tconst producedRevision = producer.producedRevision ?? producer.revision;\n\tif (producedRevision < consumer.requiredRevision) {\n\t\treasons.push(`producer ${producer.id} revision ${producedRevision} < required ${consumer.requiredRevision}`);\n\t}\n\tif (consumer.requiredSchema && producer.schema !== consumer.requiredSchema) {\n\t\treasons.push(`producer ${producer.id} schema '${producer.schema}' != required '${consumer.requiredSchema}'`);\n\t}\n\treturn { compatible: reasons.length === 0, reasons };\n}\n\n/**\n * Detect whether a mission's consumer-side contract requirement is stale\n * relative to the producer's current revision.\n */\nexport function isContractStale(producer: ProducerContractRoot, consumer: ConsumerContractRequirement): boolean {\n\treturn !verifyContractCompatibility(producer, consumer).compatible;\n}\n\n/**\n * Link a typed contract from the mission contract registry to a producer root\n * and a consumer requirement. Validates that both roles reference the same\n * contract id and that consumer/producer reference known objectives elsewhere.\n */\nexport function linkProducerConsumer(\n\tcontract: MissionContract,\n\tproducer: ProducerContractRoot,\n\tconsumer: ConsumerContractRequirement,\n): MissionOperationResult<{ contractId: string; compatible: boolean }> {\n\tif (contract.id !== producer.id || contract.id !== consumer.contractId) {\n\t\treturn {\n\t\t\tok: false,\n\t\t\tcode: \"CONTRACT_MISMATCH\",\n\t\t\terror: `contract id mismatch: registry='${contract.id}', producer='${producer.id}', consumer='${consumer.contractId}'`,\n\t\t};\n\t}\n\tconst check = verifyContractCompatibility(producer, consumer);\n\treturn { ok: true, value: { contractId: contract.id, compatible: check.compatible } };\n}\n"]}