@fabricorg/platform 1.6.0 → 1.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +79 -0
- package/README.md +216 -3
- package/dist/actions/index.cjs +6 -6
- package/dist/actions/index.d.cts +85 -3
- package/dist/actions/index.d.ts +85 -3
- package/dist/actions/index.js +1 -1
- package/dist/adapters/index.cjs +33 -9
- package/dist/adapters/index.d.cts +388 -1
- package/dist/adapters/index.d.ts +388 -1
- package/dist/adapters/index.js +1 -1
- package/dist/certification/index.cjs +6 -6
- package/dist/certification/index.js +3 -3
- package/dist/{chunk-VZ6C4LXC.cjs → chunk-45OKKLNY.cjs} +17 -9
- package/dist/chunk-45OKKLNY.cjs.map +1 -0
- package/dist/chunk-5FOCPRTR.js +511 -0
- package/dist/chunk-5FOCPRTR.js.map +1 -0
- package/dist/{chunk-USDLP4E7.cjs → chunk-5IVFPWK6.cjs} +4 -4
- package/dist/{chunk-USDLP4E7.cjs.map → chunk-5IVFPWK6.cjs.map} +1 -1
- package/dist/chunk-6HY35TKB.cjs +491 -0
- package/dist/chunk-6HY35TKB.cjs.map +1 -0
- package/dist/chunk-6UGEIDLC.cjs +26 -0
- package/dist/chunk-6UGEIDLC.cjs.map +1 -0
- package/dist/chunk-BJGZE3GE.js +20 -0
- package/dist/chunk-BJGZE3GE.js.map +1 -0
- package/dist/{chunk-X3GHYMAJ.cjs → chunk-CRZXTZ36.cjs} +2 -22
- package/dist/chunk-CRZXTZ36.cjs.map +1 -0
- package/dist/{chunk-TMMP4U2D.cjs → chunk-DBTAUI6C.cjs} +5 -2
- package/dist/chunk-DBTAUI6C.cjs.map +1 -0
- package/dist/{chunk-UYCQV65U.js → chunk-EMSAFNPX.js} +3 -3
- package/dist/{chunk-UYCQV65U.js.map → chunk-EMSAFNPX.js.map} +1 -1
- package/dist/{chunk-DCC3UIUJ.js → chunk-GFU7BGEJ.js} +3 -3
- package/dist/{chunk-DCC3UIUJ.js.map → chunk-GFU7BGEJ.js.map} +1 -1
- package/dist/{chunk-JFVEPAED.js → chunk-GU3LZWJD.js} +17 -9
- package/dist/chunk-GU3LZWJD.js.map +1 -0
- package/dist/chunk-HEYMMVDP.js +480 -0
- package/dist/chunk-HEYMMVDP.js.map +1 -0
- package/dist/chunk-IF6NJORI.cjs +526 -0
- package/dist/chunk-IF6NJORI.cjs.map +1 -0
- package/dist/{chunk-XS7EUS4T.cjs → chunk-MCWSUGB3.cjs} +4 -4
- package/dist/{chunk-XS7EUS4T.cjs.map → chunk-MCWSUGB3.cjs.map} +1 -1
- package/dist/{chunk-QHV6LOS6.js → chunk-PDN5DOLQ.js} +3 -3
- package/dist/{chunk-QHV6LOS6.js.map → chunk-PDN5DOLQ.js.map} +1 -1
- package/dist/{chunk-OZWUNGJE.js → chunk-PIDZQAEL.js} +5 -2
- package/dist/chunk-PIDZQAEL.js.map +1 -0
- package/dist/{chunk-ATWWZTRC.js → chunk-TYNIFC7J.js} +3 -18
- package/dist/chunk-TYNIFC7J.js.map +1 -0
- package/dist/{chunk-DDX5FKOM.cjs → chunk-UGWGHTNC.cjs} +5 -2
- package/dist/chunk-UGWGHTNC.cjs.map +1 -0
- package/dist/{chunk-ZF5HDNSU.js → chunk-WNZP53GI.js} +5 -2
- package/dist/chunk-WNZP53GI.js.map +1 -0
- package/dist/{chunk-2URHPZXL.cjs → chunk-WQ3BYI7T.cjs} +6 -6
- package/dist/{chunk-2URHPZXL.cjs.map → chunk-WQ3BYI7T.cjs.map} +1 -1
- package/dist/evidence/index.cjs +45 -1
- package/dist/evidence/index.d.cts +187 -1
- package/dist/evidence/index.d.ts +187 -1
- package/dist/evidence/index.js +3 -1
- package/dist/governance/index.d.cts +1 -0
- package/dist/governance/index.d.ts +1 -0
- package/dist/index.cjs +153 -88
- package/dist/index.d.cts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +11 -10
- package/dist/manifest/index.cjs +8 -8
- package/dist/manifest/index.js +2 -2
- package/dist/modules/index.cjs +9 -9
- package/dist/modules/index.js +1 -1
- package/dist/policies/index.cjs +9 -9
- package/dist/policies/index.d.cts +14 -1
- package/dist/policies/index.d.ts +14 -1
- package/dist/policies/index.js +1 -1
- package/dist/privacy/index.cjs +19 -18
- package/dist/privacy/index.js +2 -1
- package/dist/testing/index.cjs +5 -5
- package/dist/testing/index.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-ATWWZTRC.js.map +0 -1
- package/dist/chunk-DDX5FKOM.cjs.map +0 -1
- package/dist/chunk-FAG2RTPM.js +0 -120
- package/dist/chunk-FAG2RTPM.js.map +0 -1
- package/dist/chunk-JFVEPAED.js.map +0 -1
- package/dist/chunk-OZLZHISS.js +0 -3
- package/dist/chunk-OZLZHISS.js.map +0 -1
- package/dist/chunk-OZWUNGJE.js.map +0 -1
- package/dist/chunk-PG5LYTUX.cjs +0 -4
- package/dist/chunk-PG5LYTUX.cjs.map +0 -1
- package/dist/chunk-TMMP4U2D.cjs.map +0 -1
- package/dist/chunk-VZ6C4LXC.cjs.map +0 -1
- package/dist/chunk-X3GHYMAJ.cjs.map +0 -1
- package/dist/chunk-XZQZQ5SW.cjs +0 -129
- package/dist/chunk-XZQZQ5SW.cjs.map +0 -1
- package/dist/chunk-ZF5HDNSU.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../evidence/canonical-json.ts","../evidence/generator.ts"],"names":["byId","createHash","id","createFabricId","FABRIC_ID_PREFIXES","AnonymizationEngine"],"mappings":"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","file":"chunk-6HY35TKB.cjs","sourcesContent":["/**\n * Serializes a value as JSON with every object's keys sorted, recursively, by UTF-16 code-unit\n * order (locale-independent). Array order is preserved.\n *\n * This is the serialization behind the `fabric-canonical-json-sha256-v1` digests: Host's\n * parameter digests (`PARAMETER_DIGEST_ALGORITHM` in `@fabricorg/platform-host`) and evidence\n * packet checksums (`EVIDENCE_PACKET_CHECKSUM_ALGORITHM`). Its output is a durable contract, so it\n * must not change for any input. That includes values that are not plain JSON: any non-array\n * object is rebuilt from its own enumerable entries before serialization, so a `Date` (which has\n * none) serializes as `{}`, not as an ISO string. Convert dates to strings before calling this\n * when they must survive into the output.\n */\nexport function canonicalJson(value: unknown): string {\n\treturn JSON.stringify(sortKeys(value));\n}\n\nfunction sortKeys(value: unknown): unknown {\n\tif (Array.isArray(value)) return value.map(sortKeys);\n\tif (value && typeof value === \"object\") {\n\t\treturn Object.fromEntries(Object.entries(value as Record<string, unknown>)\n\t\t\t.sort(([left], [right]) => left < right ? -1 : left > right ? 1 : 0)\n\t\t\t.map(([key, child]) => [key, sortKeys(child)]));\n\t}\n\treturn value;\n}\n","import { createHash } from \"node:crypto\";\n\nimport { createFabricId, FABRIC_ID_PREFIXES } from \"../ids\";\nimport type { AnonymizationContext, AnonymizationMetadata, PlatformDataClass, RedactionMethod } from \"../privacy\";\nimport { AnonymizationEngine, type AnonymizationPolicy } from \"../privacy/engine\";\nimport { canonicalJson } from \"./canonical-json\";\nimport type {\n\tEvidenceGenerationContext,\n\tEvidencePacketEnvelope,\n\tEvidencePacketReference,\n\tEvidencePacketSubject,\n\tEvidenceRenderer,\n} from \"./index\";\n\n/**\n * Identifies how `EvidencePacketEnvelope.checksum` is computed: the lowercase hex SHA-256 of\n * `canonicalJson(payload)`. It is the same identifier as Host's `PARAMETER_DIGEST_ALGORITHM`\n * because the algorithm is the same (SHA-256 over `canonicalJson`).\n */\nexport const EVIDENCE_PACKET_CHECKSUM_ALGORITHM = \"fabric-canonical-json-sha256-v1\" as const;\n\n/** Version of the `EvidencePacketPayload` shape produced by `generateEvidencePacket`. */\nexport const EVIDENCE_PACKET_SCHEMA_VERSION = 1 as const;\n\n/** Packet type used when the input does not name one. */\nexport const DEFAULT_EVIDENCE_PACKET_TYPE = \"compliance_evidence\";\n\n/** Anonymization reason recorded when the caller does not supply one. */\nexport const DEFAULT_EVIDENCE_REDACTION_REASON = \"evidence_packet_generation\";\n\n/**\n * A `Date`, or an ISO 8601 / PostgreSQL ISO date-time string with an explicit zone (`Z`, `+HH`,\n * `+HH:MM` or `+HHMM`). Zone-less, non-ISO and out-of-range strings are rejected.\n */\nexport type EvidenceTimestamp = Date | string;\n\n/** Tenant and space every record read through the port must belong to. */\nexport interface EvidenceScope {\n\ttenantId: string;\n\tspaceId: string;\n}\n\n/**\n * An asset event as the read port returns it. `AssetEventEnvelope` (events) and `AssetEventLike`\n * (privacy) both satisfy this shape. Fields beyond these are kept in the packet payload.\n */\nexport interface EvidenceEventRecord {\n\tid: string;\n\ttenantId: string;\n\tspaceId: string;\n\teventType: string;\n\tsubjectType: string;\n\tsubjectId: string;\n\tactionInvocationId?: string | null;\n\tsequence: number;\n\toccurredAt: EvidenceTimestamp;\n\trecordedAt: EvidenceTimestamp;\n\tcorrelationId: string;\n\tcausationId?: string | null;\n\tpayload: unknown;\n}\n\n/** An action invocation, policy evaluation or adapter invocation record. Further fields are kept. */\nexport interface EvidenceRecord {\n\tid: string;\n\ttenantId: string;\n\tspaceId: string;\n\tactionInvocationId?: string | null;\n\t[field: string]: unknown;\n}\n\n/** A record that belongs to one action invocation (policy evaluations, adapter invocations). */\nexport interface EvidenceInvocationRecord extends EvidenceRecord {\n\tactionInvocationId: string;\n}\n\nexport interface EvidenceEventQuery extends EvidenceScope {\n\t/** The subject the packet is about. Always `subjects[0]`. */\n\tprimarySubject: EvidencePacketSubject;\n\t/** Primary subject first, then related subjects, de-duplicated and sorted. */\n\tsubjects: readonly EvidencePacketSubject[];\n}\n\ntype MaybePromise<T> = T | Promise<T>;\n\n/**\n * Read-only access to the application's evidence store. The generator filters nothing the port\n * returns; it rejects, rather than drops, a record that fails one of its checks:\n *\n * - every record must have the generation context's `tenantId` and `spaceId`;\n * - action invocations must have one of the requested ids, and policy evaluations and adapter\n * invocations one of the requested `actionInvocationId`s;\n * - records must have the documented shape (non-empty `id`, event fields, parseable timestamps) and\n * be representable as plain JSON, and any `_privacy` value must be engine-written\n * `AnonymizationMetadata`.\n *\n * Which events belong to the packet is the port's decision: the generator does not check an event's\n * subject against `subjects`, because a port may legitimately return events recorded against the\n * primary subject's own action invocations under another subject.\n */\nexport interface EvidencePacketReadPort {\n\t/** Asset events for the given subjects within the tenant and space. Required. */\n\tlistEvents(query: EvidenceEventQuery): MaybePromise<readonly EvidenceEventRecord[]>;\n\t/** The application's related-subject rules. When absent, only the primary subject is used. */\n\tresolveRelatedSubjects?(\n\t\tsubject: EvidencePacketSubject,\n\t\tscope: EvidenceScope,\n\t): MaybePromise<readonly EvidencePacketSubject[]>;\n\t/** Action invocations by id. When absent, the section is empty. */\n\tlistActionInvocations?(scope: EvidenceScope, ids: readonly string[]): MaybePromise<readonly EvidenceRecord[]>;\n\t/** Policy evaluations for the given action invocations. When absent, the section is empty. */\n\tlistPolicyEvaluations?(\n\t\tscope: EvidenceScope,\n\t\tactionInvocationIds: readonly string[],\n\t): MaybePromise<readonly EvidenceInvocationRecord[]>;\n\t/** Adapter invocations for the given action invocations. When absent, the section is empty. */\n\tlistAdapterInvocations?(\n\t\tscope: EvidenceScope,\n\t\tactionInvocationIds: readonly string[],\n\t): MaybePromise<readonly EvidenceInvocationRecord[]>;\n}\n\n/** A record after normalization: plain JSON, every `Date` replaced by its ISO string. */\nexport type EvidenceJsonRecord = Record<string, unknown>;\n\nexport interface EvidencePacketPayload {\n\tschemaVersion: typeof EVIDENCE_PACKET_SCHEMA_VERSION;\n\tpacketType: string;\n\ttenantId: string;\n\tspaceId: string;\n\tprimarySubject: EvidencePacketSubject;\n\tsubjects: EvidencePacketSubject[];\n\tincludeRelated: boolean;\n\tpolicyVersion?: string;\n\tevents: EvidenceJsonRecord[];\n\tactionInvocations: EvidenceJsonRecord[];\n\tpolicyEvaluations: EvidenceJsonRecord[];\n\tadapterInvocations: EvidenceJsonRecord[];\n\t/** Metadata from the anonymization pass over the rest of the payload (validated engine-written `_privacy` values pass through it unchanged). */\n\tredaction: AnonymizationMetadata;\n}\n\nexport interface GenerateEvidencePacketInput {\n\tsubject: EvidencePacketSubject;\n\t/** Set to `false` to skip `resolveRelatedSubjects`. Defaults to `true`. */\n\tincludeRelated?: boolean;\n\t/** Defaults to `DEFAULT_EVIDENCE_PACKET_TYPE`. */\n\tpacketType?: string;\n\tpolicyVersion?: string;\n}\n\nexport interface GenerateEvidencePacketOptions {\n\tport: EvidencePacketReadPort;\n\t/**\n\t * Redaction applied to the whole payload with data class `\"evidence_packet\"`. Required so that\n\t * redaction cannot be skipped by omission; pass `{ fields: [] }` to redact nothing.\n\t */\n\tanonymizationPolicy: AnonymizationPolicy;\n\tanonymization?: {\n\t\t/** Defaults to the packet id. */\n\t\tjobId?: string;\n\t\t/** Defaults to `DEFAULT_EVIDENCE_REDACTION_REASON`. */\n\t\treason?: string;\n\t\t/** Defaults to the engine's `ANONYMIZATION_POLICY_VERSION`. */\n\t\tpolicyVersion?: string;\n\t};\n\t/** Defaults to `createFabricId(FABRIC_ID_PREFIXES.complianceEvidencePacket)`. */\n\tidFactory?: () => string;\n}\n\nexport type EvidencePacketGenerationErrorCode =\n\t| \"EVIDENCE_SCOPE_MISMATCH\"\n\t| \"EVIDENCE_INVALID_RECORD\"\n\t| \"EVIDENCE_UNREQUESTED_RECORD\"\n\t| \"EVIDENCE_IDENTIFIER_REDACTED\";\n\nexport class EvidencePacketGenerationError extends Error {\n\treadonly code: EvidencePacketGenerationErrorCode;\n\n\tconstructor(code: EvidencePacketGenerationErrorCode, message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"EvidencePacketGenerationError\";\n\t\tthis.code = code;\n\t}\n}\n\ntype Section = \"events\" | \"actionInvocations\" | \"policyEvaluations\" | \"adapterInvocations\";\n\nfunction compareStrings(left: string, right: string): number {\n\treturn left < right ? -1 : left > right ? 1 : 0;\n}\n\nfunction assertNonEmptyString(value: unknown, what: string): asserts value is string {\n\tif (typeof value !== \"string\" || value.length === 0) {\n\t\tthrow new EvidencePacketGenerationError(\"EVIDENCE_INVALID_RECORD\", `${what} must be a non-empty string.`);\n\t}\n}\n\nfunction isPlainObject(value: object): boolean {\n\tconst prototype = Object.getPrototypeOf(value);\n\treturn prototype === Object.prototype || prototype === null;\n}\n\ntype MissingMembers<TUnion, TList extends readonly unknown[]> = Exclude<TUnion, TList[number]>;\n\n/**\n * Returns the list unchanged, but fails type-checking unless it names every member of `TUnion`\n * (and nothing else), so these runtime lists cannot drift from the privacy types.\n */\nfunction exhaustiveList<TUnion>() {\n\treturn <const TList extends readonly TUnion[]>(\n\t\tlist: TList & ([MissingMembers<TUnion, TList>] extends [never] ? unknown : { missingMembers: MissingMembers<TUnion, TList> }),\n\t): TList => list;\n}\n\n// Plain frozen arrays, not Sets: the boundary guard forbids module-scope Map/Set state in core.\nconst REDACTION_METHODS: readonly RedactionMethod[] = Object.freeze(\n\texhaustiveList<RedactionMethod>()([\"nullify\", \"mask\", \"hash\", \"tokenize\", \"generalize\", \"drop\"]),\n);\nconst PLATFORM_DATA_CLASSES: readonly PlatformDataClass[] = Object.freeze(\n\texhaustiveList<PlatformDataClass>()([\n\t\t\"asset_event\",\n\t\t\"read_model\",\n\t\t\"raw_payload\",\n\t\t\"evidence_packet\",\n\t\t\"action_evidence\",\n\t\t\"access_event\",\n\t]),\n);\nconst SHA256_HEX = /^[0-9a-f]{64}$/;\n\n/** True for a string `Date.prototype.toISOString` produced: it parses and serializes back unchanged. */\nfunction isIsoInstant(value: unknown): boolean {\n\tif (typeof value !== \"string\") return false;\n\tconst date = new Date(value);\n\treturn !Number.isNaN(date.getTime()) && date.toISOString() === value;\n}\nconst METADATA_STRING_KEYS = [\"policyVersion\", \"jobId\", \"redactedAt\", \"reason\"] as const;\nconst METADATA_KEYS: readonly string[] = Object.freeze([\n\t\"redactionState\",\n\t\"dataClass\",\n\t\"redactedFields\",\n\t\"preservedSemantics\",\n\t...METADATA_STRING_KEYS,\n]);\nconst FIELD_METADATA_KEYS: readonly string[] = Object.freeze([\n\t\"fieldPath\",\n\t\"method\",\n\t\"policyVersion\",\n\t\"jobId\",\n\t\"redactedAt\",\n\t\"reason\",\n\t\"dataClass\",\n\t\"beforeChecksum\",\n]);\n\nfunction hasExactKeys(value: Record<string, unknown>, keys: readonly string[]): boolean {\n\tconst present = Object.keys(value);\n\treturn present.length === keys.length && present.every((key) => keys.includes(key));\n}\n\n/**\n * `AnonymizationEngine` copies any `_privacy` key through unredacted, because that is where it\n * stores its own metadata. A `_privacy` value from the port is therefore accepted only when it has\n * exactly the shape the engine writes; anything else could carry raw data past the policy.\n */\nfunction assertEnginePrivacyMetadata(value: unknown, path: string): void {\n\tconst invalid = (detail: string) =>\n\t\tnew EvidencePacketGenerationError(\n\t\t\t\"EVIDENCE_INVALID_RECORD\",\n\t\t\t`${path} is not engine-written AnonymizationMetadata (${detail}); _privacy values bypass the anonymization policy, so other data is rejected.`,\n\t\t);\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) throw invalid(\"not an object\");\n\tconst metadata = value as Record<string, unknown>;\n\tif (!hasExactKeys(metadata, METADATA_KEYS)) throw invalid(\"unexpected or missing keys\");\n\tif (metadata.redactionState !== \"anonymized\") throw invalid(\"redactionState\");\n\tif (!PLATFORM_DATA_CLASSES.includes(metadata.dataClass as PlatformDataClass)) throw invalid(\"dataClass\");\n\tfor (const key of METADATA_STRING_KEYS) {\n\t\tif (typeof metadata[key] !== \"string\") throw invalid(key);\n\t}\n\t// The engine writes redactedAt with toISOString() (privacy/engine.ts buildMetadata).\n\tif (!isIsoInstant(metadata.redactedAt)) throw invalid(\"redactedAt\");\n\tif (!Array.isArray(metadata.preservedSemantics) || !metadata.preservedSemantics.every((item) => typeof item === \"string\")) {\n\t\tthrow invalid(\"preservedSemantics\");\n\t}\n\tif (!Array.isArray(metadata.redactedFields)) throw invalid(\"redactedFields\");\n\tmetadata.redactedFields.forEach((field, index) => {\n\t\tif (!field || typeof field !== \"object\" || Array.isArray(field)) throw invalid(`redactedFields[${index}]`);\n\t\tconst entry = field as Record<string, unknown>;\n\t\tif (!hasExactKeys(entry, FIELD_METADATA_KEYS) || !Object.values(entry).every((item) => typeof item === \"string\")) {\n\t\t\tthrow invalid(`redactedFields[${index}]`);\n\t\t}\n\t\tif (!REDACTION_METHODS.includes(entry.method as RedactionMethod)) throw invalid(`redactedFields[${index}].method`);\n\t\tif (!PLATFORM_DATA_CLASSES.includes(entry.dataClass as PlatformDataClass)) throw invalid(`redactedFields[${index}].dataClass`);\n\t\t// The engine writes these with toISOString() and a SHA-256 hex digest (privacy/engine.ts\n\t\t// anonymizeRecursive and stableChecksum), so free text in them is not engine output.\n\t\tif (!isIsoInstant(entry.redactedAt)) throw invalid(`redactedFields[${index}].redactedAt`);\n\t\tif (!SHA256_HEX.test(entry.beforeChecksum as string)) throw invalid(`redactedFields[${index}].beforeChecksum`);\n\t});\n}\n\n/**\n * Converts a value to plain JSON. Dates become ISO strings; objects with a `toJSON` method (for\n * example decimal types) are replaced by its result. Values JSON cannot represent faithfully\n * (bigint, functions, symbols, non-finite numbers, invalid dates, other non-plain objects, an own\n * `__proto__` key) throw rather than being silently changed or dropped. Objects are rebuilt with a\n * null prototype, so later reads cannot pick up inherited fields.\n */\nfunction toPlainJson(value: unknown, path: string): unknown {\n\tif (value === null || typeof value === \"string\" || typeof value === \"boolean\") return value;\n\tif (typeof value === \"number\") {\n\t\tif (!Number.isFinite(value)) {\n\t\t\tthrow new EvidencePacketGenerationError(\"EVIDENCE_INVALID_RECORD\", `${path} is not a finite number.`);\n\t\t}\n\t\treturn value;\n\t}\n\tif (value instanceof Date) {\n\t\tif (Number.isNaN(value.getTime())) {\n\t\t\tthrow new EvidencePacketGenerationError(\"EVIDENCE_INVALID_RECORD\", `${path} is an invalid Date.`);\n\t\t}\n\t\treturn value.toISOString();\n\t}\n\tif (Array.isArray(value)) {\n\t\treturn value.map((item, index) => (item === undefined ? null : toPlainJson(item, `${path}[${index}]`)));\n\t}\n\tif (typeof value === \"object\") {\n\t\tif (!isPlainObject(value)) {\n\t\t\tconst toJSON = (value as { toJSON?: unknown }).toJSON;\n\t\t\tif (typeof toJSON === \"function\") return toPlainJson(toJSON.call(value), path);\n\t\t\tthrow new EvidencePacketGenerationError(\n\t\t\t\t\"EVIDENCE_INVALID_RECORD\",\n\t\t\t\t`${path} is a non-plain object that cannot be represented as JSON.`,\n\t\t\t);\n\t\t}\n\t\tconst result: Record<string, unknown> = Object.create(null);\n\t\tfor (const [key, child] of Object.entries(value)) {\n\t\t\tif (key === \"__proto__\") {\n\t\t\t\tthrow new EvidencePacketGenerationError(\"EVIDENCE_INVALID_RECORD\", `${path} has an own \"__proto__\" key.`);\n\t\t\t}\n\t\t\tif (child === undefined) continue;\n\t\t\tconst normalized = toPlainJson(child, `${path}.${key}`);\n\t\t\tif (key === \"_privacy\") assertEnginePrivacyMetadata(normalized, `${path}._privacy`);\n\t\t\tresult[key] = normalized;\n\t\t}\n\t\treturn result;\n\t}\n\tthrow new EvidencePacketGenerationError(\"EVIDENCE_INVALID_RECORD\", `${path} has unsupported type ${typeof value}.`);\n}\n\n/**\n * The timestamp strings accepted for event `occurredAt`/`recordedAt`: an ISO 8601 date-time, or\n * PostgreSQL's ISO output, with an explicit zone. Groups: year (4 digits, or a sign and 4 to 6\n * digits), month, day, `T` or one space, hour, minute, optional second and fraction, an optional\n * single space, then `Z` or an offset written `+HH`, `+HH:MM` or `+HHMM`.\n */\nconst ZONED_TIMESTAMP =\n\t/^([+-]\\d{4,6}|\\d{4})-(\\d{2})-(\\d{2})[T ](\\d{2}):(\\d{2})(?::(\\d{2})(?:\\.(\\d+))?)? ?(?:(Z)|([+-])(\\d{2})(?::?(\\d{2}))?)$/;\n\nfunction isLeapYear(year: number): boolean {\n\treturn (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n}\n\nfunction daysInMonth(year: number, month: number): number {\n\treturn [31, isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month - 1]!;\n}\n\n/**\n * Parses a zoned timestamp string without `new Date(string)`, whose fallback parser accepts\n * non-ISO text and rolls invalid dates over. Every field is range-checked, so the result is exactly\n * the instant written, truncated to milliseconds. Returns `undefined` when the string is not\n * accepted. A zone-less string is rejected because reading it would depend on the host's time zone.\n */\nfunction parseZonedTimestamp(value: string): number | undefined {\n\tconst match = ZONED_TIMESTAMP.exec(value);\n\tif (!match) return undefined;\n\tconst [, yearText, monthText, dayText, hourText, minuteText, secondText, fraction, zulu, sign, offsetHourText, offsetMinuteText] = match;\n\tconst year = Number(yearText);\n\tconst month = Number(monthText);\n\tconst day = Number(dayText);\n\tconst hour = Number(hourText);\n\tconst minute = Number(minuteText);\n\tconst second = secondText === undefined ? 0 : Number(secondText);\n\tconst millisecond = fraction === undefined ? 0 : Number(fraction.padEnd(3, \"0\").slice(0, 3));\n\tif (month < 1 || month > 12 || day < 1 || day > daysInMonth(year, month)) return undefined;\n\tif (hour > 23 || minute > 59 || second > 59) return undefined;\n\tlet offsetMinutes = 0;\n\tif (!zulu) {\n\t\tconst offsetHours = Number(offsetHourText);\n\t\tconst offsetMinutePart = offsetMinuteText === undefined ? 0 : Number(offsetMinuteText);\n\t\tif (offsetHours > 14 || offsetMinutePart > 59) return undefined;\n\t\toffsetMinutes = (sign === \"-\" ? -1 : 1) * (offsetHours * 60 + offsetMinutePart);\n\t}\n\t// setUTCFullYear, not Date.UTC: Date.UTC maps years 0-99 to 1900-1999.\n\tconst date = new Date(0);\n\tdate.setUTCFullYear(year, month - 1, day);\n\tdate.setUTCHours(hour, minute, second, millisecond);\n\tconst instant = date.getTime() - offsetMinutes * 60_000;\n\treturn Number.isNaN(new Date(instant).getTime()) ? undefined : instant;\n}\n\n/** Normalizes a Date or zoned timestamp string to an ISO string, at millisecond precision. */\nfunction toIsoTimestamp(value: unknown, path: string): string {\n\tconst instant =\n\t\tvalue instanceof Date ? value.getTime() : typeof value === \"string\" ? parseZonedTimestamp(value) : undefined;\n\tif (instant === undefined || Number.isNaN(instant)) {\n\t\tthrow new EvidencePacketGenerationError(\n\t\t\t\"EVIDENCE_INVALID_RECORD\",\n\t\t\t`${path} must be a Date or an ISO 8601 / PostgreSQL ISO date-time with a valid date, time and explicit zone (Z, +HH, +HH:MM or +HHMM).`,\n\t\t);\n\t}\n\treturn new Date(instant).toISOString();\n}\n\nfunction assertScope(record: { id?: unknown; tenantId?: unknown; spaceId?: unknown }, scope: EvidenceScope, section: Section): void {\n\tif (record.tenantId !== scope.tenantId || record.spaceId !== scope.spaceId) {\n\t\tthrow new EvidencePacketGenerationError(\n\t\t\t\"EVIDENCE_SCOPE_MISMATCH\",\n\t\t\t`Evidence read port returned a ${section} record (${String(record.id)}) outside tenant/space ${scope.tenantId}/${scope.spaceId}.`,\n\t\t);\n\t}\n}\n\n/** Normalizes, scope-checks and de-duplicates a section. Conflicting records with one id throw. */\nfunction normalizeSection(\n\trecords: readonly object[],\n\tscope: EvidenceScope,\n\tsection: Section,\n\tprepare?: (record: EvidenceJsonRecord, path: string) => void,\n): EvidenceJsonRecord[] {\n\tif (!Array.isArray(records)) {\n\t\tthrow new EvidencePacketGenerationError(\"EVIDENCE_INVALID_RECORD\", `Evidence read port returned a non-array for ${section}.`);\n\t}\n\tconst byId = new Map<string, { record: EvidenceJsonRecord; canonical: string }>();\n\trecords.forEach((raw, index) => {\n\t\tconst path = `${section}[${index}]`;\n\t\tif (!raw || typeof raw !== \"object\" || Array.isArray(raw)) {\n\t\t\tthrow new EvidencePacketGenerationError(\"EVIDENCE_INVALID_RECORD\", `${path} must be an object.`);\n\t\t}\n\t\t// Scope is checked on the record as returned, before anything else is done with it, and again\n\t\t// on the normalized record, which is authoritative: it has a null prototype (so inherited\n\t\t// fields cannot satisfy the check) and reflects any toJSON conversion.\n\t\tassertScope(raw as EvidenceRecord, scope, section);\n\t\tconst record = toPlainJson(raw, path) as EvidenceJsonRecord;\n\t\tassertScope(record, scope, section);\n\t\tassertNonEmptyString(record.id, `${path}.id`);\n\t\tprepare?.(record, path);\n\t\tconst canonical = canonicalJson(record);\n\t\tconst existing = byId.get(record.id as string);\n\t\tif (existing && existing.canonical !== canonical) {\n\t\t\tthrow new EvidencePacketGenerationError(\n\t\t\t\t\"EVIDENCE_INVALID_RECORD\",\n\t\t\t\t`Evidence read port returned conflicting ${section} records with id ${String(record.id)}.`,\n\t\t\t);\n\t\t}\n\t\tbyId.set(record.id as string, { record, canonical });\n\t});\n\treturn [...byId.values()].map((entry) => entry.record);\n}\n\nfunction byId(left: EvidenceJsonRecord, right: EvidenceJsonRecord): number {\n\treturn compareStrings(left.id as string, right.id as string);\n}\n\nfunction byEventOrder(left: EvidenceJsonRecord, right: EvidenceJsonRecord): number {\n\t// Compare instants, not ISO strings: extended years (+010000-...) do not sort as strings.\n\treturn (\n\t\tDate.parse(left.occurredAt as string) - Date.parse(right.occurredAt as string) ||\n\t\tDate.parse(left.recordedAt as string) - Date.parse(right.recordedAt as string) ||\n\t\t(left.sequence as number) - (right.sequence as number) ||\n\t\tbyId(left, right)\n\t);\n}\n\nfunction assertSubject(subject: EvidencePacketSubject, path: string): EvidencePacketSubject {\n\tif (!subject || typeof subject !== \"object\") {\n\t\tthrow new EvidencePacketGenerationError(\"EVIDENCE_INVALID_RECORD\", `${path} must be an object.`);\n\t}\n\tassertNonEmptyString(subject.subjectType, `${path}.subjectType`);\n\tassertNonEmptyString(subject.subjectId, `${path}.subjectId`);\n\treturn { subjectType: subject.subjectType, subjectId: subject.subjectId };\n}\n\nfunction compareSubjects(left: EvidencePacketSubject, right: EvidencePacketSubject): number {\n\treturn compareStrings(left.subjectType, right.subjectType) || compareStrings(left.subjectId, right.subjectId);\n}\n\nasync function resolveSubjects(\n\tprimary: EvidencePacketSubject,\n\tincludeRelated: boolean,\n\tport: EvidencePacketReadPort,\n\tscope: EvidenceScope,\n): Promise<EvidencePacketSubject[]> {\n\tif (!includeRelated || !port.resolveRelatedSubjects) return [primary];\n\tconst related = await port.resolveRelatedSubjects({ ...primary }, { ...scope });\n\tif (!Array.isArray(related)) {\n\t\tthrow new EvidencePacketGenerationError(\"EVIDENCE_INVALID_RECORD\", \"resolveRelatedSubjects must return an array.\");\n\t}\n\tconst key = (subject: EvidencePacketSubject) => `${subject.subjectType}\\u0000${subject.subjectId}`;\n\tconst seen = new Set([key(primary)]);\n\tconst unique: EvidencePacketSubject[] = [];\n\trelated.forEach((candidate, index) => {\n\t\tconst subject = assertSubject(candidate, `relatedSubjects[${index}]`);\n\t\tif (seen.has(key(subject))) return;\n\t\tseen.add(key(subject));\n\t\tunique.push(subject);\n\t});\n\treturn [primary, ...unique.sort(compareSubjects)];\n}\n\nfunction assertRequestedInvocation(record: EvidenceJsonRecord, path: string, requested: ReadonlySet<string>): void {\n\tconst invocationId = record.actionInvocationId;\n\tif (typeof invocationId !== \"string\" || !requested.has(invocationId)) {\n\t\tthrow new EvidencePacketGenerationError(\n\t\t\t\"EVIDENCE_UNREQUESTED_RECORD\",\n\t\t\t`${path}.actionInvocationId (${String(invocationId)}) is not one of the requested action invocations.`,\n\t\t);\n\t}\n}\n\nconst REFERENCE_METADATA_FIELDS: Record<Section, readonly string[]> = {\n\tactionInvocations: [\"actionId\", \"status\"],\n\tevents: [\"eventType\", \"subjectType\", \"subjectId\", \"actionInvocationId\"],\n\tpolicyEvaluations: [\"actionInvocationId\", \"policyId\", \"policyVersion\", \"result\"],\n\tadapterInvocations: [\"actionInvocationId\", \"adapterType\", \"operation\", \"status\"],\n};\n\nconst REFERENCE_TYPES: Record<Section, EvidencePacketReference[\"referenceType\"]> = {\n\tactionInvocations: \"action_invocation\",\n\tevents: \"asset_event\",\n\tpolicyEvaluations: \"policy_evaluation\",\n\tadapterInvocations: \"adapter_invocation\",\n};\n\n/**\n * References are built from the redacted payload so nothing outside it can carry a raw value.\n * Each record's `id` must come through redaction unchanged, because references and verifiers\n * identify records by it.\n */\nfunction buildReferences(\n\tpayload: EvidencePacketPayload,\n\tunredacted: Pick<EvidencePacketPayload, Section>,\n): EvidencePacketReference[] {\n\tconst sections: Section[] = [\"actionInvocations\", \"events\", \"policyEvaluations\", \"adapterInvocations\"];\n\treturn sections.flatMap((section) =>\n\t\t(payload[section] as unknown[]).map((record, index) => {\n\t\t\tconst originalId = unredacted[section][index]?.id;\n\t\t\tif (!record || typeof record !== \"object\" || (record as EvidenceJsonRecord).id !== originalId) {\n\t\t\t\tthrow new EvidencePacketGenerationError(\n\t\t\t\t\t\"EVIDENCE_IDENTIFIER_REDACTED\",\n\t\t\t\t\t`The anonymization policy removed or changed ${section}[${index}].id; record ids must pass through redaction unchanged.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst metadata: Record<string, string> = {};\n\t\t\tfor (const field of REFERENCE_METADATA_FIELDS[section]) {\n\t\t\t\tconst value = (record as EvidenceJsonRecord)[field];\n\t\t\t\tif (typeof value === \"string\") metadata[field] = value;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\treferenceType: REFERENCE_TYPES[section],\n\t\t\t\treferenceId: (record as EvidenceJsonRecord).id as string,\n\t\t\t\tmetadata,\n\t\t\t};\n\t\t}),\n\t);\n}\n\nfunction redactedSubjects(value: unknown): EvidencePacketSubject[] {\n\tif (!Array.isArray(value)) {\n\t\tthrow new EvidencePacketGenerationError(\"EVIDENCE_IDENTIFIER_REDACTED\", \"The anonymization policy removed payload.subjects.\");\n\t}\n\treturn value.map((subject, index) => {\n\t\ttry {\n\t\t\treturn assertSubject(subject as EvidencePacketSubject, `subjects[${index}]`);\n\t\t} catch {\n\t\t\tthrow new EvidencePacketGenerationError(\n\t\t\t\t\"EVIDENCE_IDENTIFIER_REDACTED\",\n\t\t\t\t`The anonymization policy removed subjects[${index}] or made its subjectType/subjectId a non-string; subject identifiers may be transformed (for example tokenized) but must remain non-empty strings.`,\n\t\t\t);\n\t\t}\n\t});\n}\n\n/** Lowercase hex SHA-256 of `canonicalJson(payload)`. */\nexport function computeEvidencePacketChecksum(payload: unknown): string {\n\treturn createHash(\"sha256\").update(canonicalJson(payload)).digest(\"hex\");\n}\n\n/**\n * Builds a sealed evidence packet for one subject from the application's read port.\n *\n * Steps: resolve subjects (primary first, then related, de-duplicated and sorted); read events,\n * then the action invocations, policy evaluations and adapter invocations those events reference;\n * reject any record outside `context.tenantId`/`context.spaceId`; normalize to plain JSON and sort\n * deterministically; redact the payload with `AnonymizationEngine` (data class\n * `\"evidence_packet\"`); checksum the redacted payload; and build references from it.\n *\n * Nothing is persisted. Storing the returned envelope is the application's job.\n */\nexport async function generateEvidencePacket<TDb = unknown>(\n\tinput: GenerateEvidencePacketInput,\n\tcontext: EvidenceGenerationContext<TDb>,\n\toptions: GenerateEvidencePacketOptions,\n): Promise<EvidencePacketEnvelope<EvidencePacketPayload>> {\n\tconst { port } = options;\n\tif (!port || typeof port.listEvents !== \"function\") {\n\t\tthrow new TypeError(\"generateEvidencePacket requires a read port with listEvents().\");\n\t}\n\tif (!options.anonymizationPolicy || !Array.isArray(options.anonymizationPolicy.fields)) {\n\t\tthrow new TypeError(\"generateEvidencePacket requires an anonymizationPolicy (use { fields: [] } to redact nothing).\");\n\t}\n\tassertNonEmptyString(context.tenantId, \"context.tenantId\");\n\tassertNonEmptyString(context.spaceId, \"context.spaceId\");\n\tassertNonEmptyString(context.actorId, \"context.actorId\");\n\tassertNonEmptyString(context.correlationId, \"context.correlationId\");\n\n\tconst scope: EvidenceScope = { tenantId: context.tenantId, spaceId: context.spaceId };\n\tconst primary = assertSubject(input.subject, \"input.subject\");\n\t// Records whether a related-subject lookup actually ran, not only whether it was requested.\n\tconst includeRelated = input.includeRelated !== false && typeof port.resolveRelatedSubjects === \"function\";\n\tconst packetType = input.packetType ?? DEFAULT_EVIDENCE_PACKET_TYPE;\n\tassertNonEmptyString(packetType, \"input.packetType\");\n\n\tconst subjects = await resolveSubjects(primary, includeRelated, port, scope);\n\n\tconst rawEvents = await port.listEvents({\n\t\t...scope,\n\t\tprimarySubject: { ...primary },\n\t\tsubjects: subjects.map((subject) => ({ ...subject })),\n\t});\n\tconst events = normalizeSection(rawEvents, scope, \"events\", (record, path) => {\n\t\tfor (const field of [\"eventType\", \"subjectType\", \"subjectId\", \"correlationId\"]) {\n\t\t\tassertNonEmptyString(record[field], `${path}.${field}`);\n\t\t}\n\t\tif (typeof record.sequence !== \"number\") {\n\t\t\tthrow new EvidencePacketGenerationError(\"EVIDENCE_INVALID_RECORD\", `${path}.sequence must be a number.`);\n\t\t}\n\t\trecord.occurredAt = toIsoTimestamp(record.occurredAt, `${path}.occurredAt`);\n\t\trecord.recordedAt = toIsoTimestamp(record.recordedAt, `${path}.recordedAt`);\n\t\tconst invocationId = record.actionInvocationId;\n\t\tif (invocationId !== undefined && invocationId !== null) {\n\t\t\tassertNonEmptyString(invocationId, `${path}.actionInvocationId`);\n\t\t}\n\t}).sort(byEventOrder);\n\n\tconst invocationIds = [\n\t\t...new Set(\n\t\t\tevents\n\t\t\t\t.map((event) => event.actionInvocationId)\n\t\t\t\t.filter((id): id is string => typeof id === \"string\"),\n\t\t),\n\t].sort(compareStrings);\n\tconst requested = new Set(invocationIds);\n\n\tconst read = async (\n\t\tmethod: ((scope: EvidenceScope, ids: readonly string[]) => MaybePromise<readonly object[]>) | undefined,\n\t): Promise<readonly object[]> => {\n\t\tif (!method || invocationIds.length === 0) return [];\n\t\treturn method.call(port, { ...scope }, [...invocationIds]);\n\t};\n\tconst [rawActionInvocations, rawPolicyEvaluations, rawAdapterInvocations] = await Promise.all([\n\t\tread(port.listActionInvocations),\n\t\tread(port.listPolicyEvaluations),\n\t\tread(port.listAdapterInvocations),\n\t]);\n\n\tconst actionInvocations = normalizeSection(rawActionInvocations, scope, \"actionInvocations\", (record, path) => {\n\t\tif (!requested.has(record.id as string)) {\n\t\t\tthrow new EvidencePacketGenerationError(\n\t\t\t\t\"EVIDENCE_UNREQUESTED_RECORD\",\n\t\t\t\t`${path}.id (${String(record.id)}) is not one of the requested action invocations.`,\n\t\t\t);\n\t\t}\n\t}).sort(byId);\n\tconst policyEvaluations = normalizeSection(rawPolicyEvaluations, scope, \"policyEvaluations\", (record, path) =>\n\t\tassertRequestedInvocation(record, path, requested),\n\t).sort(byId);\n\tconst adapterInvocations = normalizeSection(rawAdapterInvocations, scope, \"adapterInvocations\", (record, path) =>\n\t\tassertRequestedInvocation(record, path, requested),\n\t).sort(byId);\n\n\tconst generatedAt = context.now ?? new Date();\n\tconst id = options.idFactory ? options.idFactory() : createFabricId(FABRIC_ID_PREFIXES.complianceEvidencePacket);\n\tassertNonEmptyString(id, \"packet id\");\n\n\tconst unredacted: Omit<EvidencePacketPayload, \"redaction\"> = {\n\t\tschemaVersion: EVIDENCE_PACKET_SCHEMA_VERSION,\n\t\tpacketType,\n\t\ttenantId: scope.tenantId,\n\t\tspaceId: scope.spaceId,\n\t\tprimarySubject: { ...primary },\n\t\tsubjects: subjects.map((subject) => ({ ...subject })),\n\t\tincludeRelated,\n\t\t...(input.policyVersion !== undefined ? { policyVersion: input.policyVersion } : {}),\n\t\tevents,\n\t\tactionInvocations,\n\t\tpolicyEvaluations,\n\t\tadapterInvocations,\n\t};\n\n\tconst anonymizationContext: AnonymizationContext = {\n\t\ttenantId: scope.tenantId,\n\t\tspaceId: scope.spaceId,\n\t\tjobId: options.anonymization?.jobId ?? id,\n\t\treason: options.anonymization?.reason ?? DEFAULT_EVIDENCE_REDACTION_REASON,\n\t\tredactedAt: generatedAt,\n\t\t...(options.anonymization?.policyVersion !== undefined\n\t\t\t? { policyVersion: options.anonymization.policyVersion }\n\t\t\t: {}),\n\t};\n\t// Rebuild the payload with sorted keys first: the engine walks keys in insertion order and lists\n\t// redacted fields in that order, so without this the record key order chosen by the store\n\t// would change the redaction metadata and therefore the checksum.\n\tconst keySorted = JSON.parse(canonicalJson(unredacted)) as typeof unredacted;\n\tconst redacted = new AnonymizationEngine(options.anonymizationPolicy).anonymizeJsonValue(\n\t\tkeySorted,\n\t\tanonymizationContext,\n\t\t\"evidence_packet\",\n\t);\n\t// The engine can replace any field, including the payload's own structure, so the result is\n\t// re-read defensively below rather than trusted to keep the declared shape.\n\tconst payload = { ...(redacted.value as object), redaction: redacted.metadata } as EvidencePacketPayload;\n\tfor (const section of [\"events\", \"actionInvocations\", \"policyEvaluations\", \"adapterInvocations\"] as const) {\n\t\tif (!Array.isArray(payload[section])) {\n\t\t\tthrow new EvidencePacketGenerationError(\n\t\t\t\t\"EVIDENCE_IDENTIFIER_REDACTED\",\n\t\t\t\t`The anonymization policy removed or replaced payload.${section}.`,\n\t\t\t);\n\t\t}\n\t}\n\tconst envelopeSubjects = redactedSubjects(payload.subjects);\n\tconst references = buildReferences(payload, keySorted);\n\n\treturn {\n\t\tid,\n\t\ttenantId: scope.tenantId,\n\t\tspaceId: scope.spaceId,\n\t\tpacketType,\n\t\tstatus: \"sealed\",\n\t\tsubjects: envelopeSubjects,\n\t\treferences,\n\t\tpayload,\n\t\tgeneratedAt: generatedAt.toISOString(),\n\t\tgeneratedBy: context.actorId,\n\t\t...(input.policyVersion !== undefined ? { policyVersion: input.policyVersion } : {}),\n\t\tchecksum: computeEvidencePacketChecksum(payload),\n\t\tchecksumAlgorithm: EVIDENCE_PACKET_CHECKSUM_ALGORITHM,\n\t\tcorrelationId: context.correlationId,\n\t\t...(context.causationId !== undefined ? { causationId: context.causationId } : {}),\n\t};\n}\n\n/**\n * Recomputes an envelope's checksum. Returns `false`, never throws, when the checksum is missing,\n * the algorithm is missing or unknown, the payload cannot be serialized, or the values differ.\n * It covers `payload` only, which includes the subjects and the redaction metadata; the other\n * envelope fields are not covered.\n */\nexport function verifyEvidencePacketChecksum(envelope: Pick<EvidencePacketEnvelope<unknown>, \"payload\" | \"checksum\" | \"checksumAlgorithm\">): boolean {\n\ttry {\n\t\tif (!envelope || typeof envelope.checksum !== \"string\" || envelope.checksum.length === 0) return false;\n\t\tif (envelope.checksumAlgorithm !== EVIDENCE_PACKET_CHECKSUM_ALGORITHM) return false;\n\t\treturn computeEvidencePacketChecksum(envelope.payload) === envelope.checksum;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport type EvidencePacketRendererInput = Omit<GenerateEvidencePacketInput, \"packetType\">;\n\nexport interface EvidencePacketRendererOptions extends GenerateEvidencePacketOptions {\n\tpacketType?: string;\n}\n\n/** Wraps `generateEvidencePacket` as an `EvidenceRenderer` for one packet type. */\nexport function createEvidencePacketRenderer<TDb = unknown>(\n\toptions: EvidencePacketRendererOptions,\n): EvidenceRenderer<EvidencePacketRendererInput, EvidencePacketPayload, TDb> {\n\tconst { packetType = DEFAULT_EVIDENCE_PACKET_TYPE, ...generatorOptions } = options;\n\treturn {\n\t\tpacketType,\n\t\trender: (input, context) => generateEvidencePacket({ ...input, packetType }, context, generatorOptions),\n\t};\n}\n"]}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkCRZXTZ36_cjs = require('./chunk-CRZXTZ36.cjs');
|
|
4
|
+
|
|
5
|
+
// privacy/index.ts
|
|
6
|
+
var PLATFORM_PRIVACY_POLICY_VERSION = "fabric-platform-privacy-v1";
|
|
7
|
+
function anonymizeJsonValue(value, context, dataClass, policy) {
|
|
8
|
+
return new chunkCRZXTZ36_cjs.AnonymizationEngine(policy).anonymizeJsonValue(value, context, dataClass);
|
|
9
|
+
}
|
|
10
|
+
function anonymizeAssetEventPayload(event, context, policy) {
|
|
11
|
+
return new chunkCRZXTZ36_cjs.AnonymizationEngine(policy).anonymizeAssetEventPayload(event, context);
|
|
12
|
+
}
|
|
13
|
+
function anonymizeEvidencePacket(packet, context, policy) {
|
|
14
|
+
return new chunkCRZXTZ36_cjs.AnonymizationEngine(policy).anonymizeEvidencePacket(packet, context);
|
|
15
|
+
}
|
|
16
|
+
function buildAnonymizationLifecycleEvidence(input, policy) {
|
|
17
|
+
return new chunkCRZXTZ36_cjs.AnonymizationEngine(policy).buildAnonymizationLifecycleEvidence(input);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
exports.PLATFORM_PRIVACY_POLICY_VERSION = PLATFORM_PRIVACY_POLICY_VERSION;
|
|
21
|
+
exports.anonymizeAssetEventPayload = anonymizeAssetEventPayload;
|
|
22
|
+
exports.anonymizeEvidencePacket = anonymizeEvidencePacket;
|
|
23
|
+
exports.anonymizeJsonValue = anonymizeJsonValue;
|
|
24
|
+
exports.buildAnonymizationLifecycleEvidence = buildAnonymizationLifecycleEvidence;
|
|
25
|
+
//# sourceMappingURL=chunk-6UGEIDLC.cjs.map
|
|
26
|
+
//# sourceMappingURL=chunk-6UGEIDLC.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../privacy/index.ts"],"names":["AnonymizationEngine"],"mappings":";;;;;AAAO,IAAM,+BAAA,GAAkC;AAuBxC,SAAS,kBAAA,CACf,KAAA,EACA,OAAA,EACA,SAAA,EACA,MAAA,EACgD;AAChD,EAAA,OAAO,IAAIA,qCAAA,CAAoB,MAAM,EAAE,kBAAA,CAAmB,KAAA,EAAO,SAAS,SAAS,CAAA;AACpF;AAEO,SAAS,0BAAA,CACf,KAAA,EACA,OAAA,EACA,MAAA,EACiD;AACjD,EAAA,OAAO,IAAIA,qCAAA,CAAoB,MAAM,CAAA,CAAE,0BAAA,CAA2B,OAAO,OAAO,CAAA;AACjF;AAEO,SAAS,uBAAA,CACf,MAAA,EACA,OAAA,EACA,MAAA,EAC+G;AAC/G,EAAA,OAAO,IAAIA,qCAAA,CAAoB,MAAM,CAAA,CAAE,uBAAA,CAAwB,QAAQ,OAAO,CAAA;AAC/E;AAEO,SAAS,mCAAA,CAAoC,OASjD,MAAA,EAAgF;AAClF,EAAA,OAAO,IAAIA,qCAAA,CAAoB,MAAM,CAAA,CAAE,oCAAoC,KAAK,CAAA;AACjF","file":"chunk-6UGEIDLC.cjs","sourcesContent":["export const PLATFORM_PRIVACY_POLICY_VERSION = \"fabric-platform-privacy-v1\";\n\nexport type RedactionMethod = \"nullify\" | \"mask\" | \"hash\" | \"tokenize\" | \"generalize\" | \"drop\";\n\nexport { ANONYMIZATION_POLICY_VERSION } from \"./engine\";\nexport {\n\tAnonymizationEngine,\n\tFieldRedactor,\n\tstableChecksum,\n\ttype AssetEventLike,\n\ttype EvidencePacketLike,\n\ttype AnonymizationLifecycleEvidence,\n\ttype AnonymizationFieldPolicy,\n\ttype AnonymizationPolicy,\n} from \"./engine\";\n\nimport {\n\tAnonymizationEngine,\n\ttype AssetEventLike,\n\ttype EvidencePacketLike,\n\ttype AnonymizationLifecycleEvidence,\n} from \"./engine\";\n\nexport function anonymizeJsonValue<TValue>(\n\tvalue: TValue,\n\tcontext: import(\"./index\").AnonymizationContext,\n\tdataClass: import(\"./index\").PlatformDataClass,\n\tpolicy: import(\"./engine\").AnonymizationPolicy,\n): import(\"./index\").AnonymizationResult<TValue> {\n\treturn new AnonymizationEngine(policy).anonymizeJsonValue(value, context, dataClass);\n}\n\nexport function anonymizeAssetEventPayload(\n\tevent: AssetEventLike,\n\tcontext: import(\"./index\").AnonymizationContext,\n\tpolicy: import(\"./engine\").AnonymizationPolicy,\n): import(\"./index\").AnonymizationResult<unknown> {\n\treturn new AnonymizationEngine(policy).anonymizeAssetEventPayload(event, context);\n}\n\nexport function anonymizeEvidencePacket(\n\tpacket: EvidencePacketLike,\n\tcontext: import(\"./index\").AnonymizationContext,\n\tpolicy: import(\"./engine\").AnonymizationPolicy,\n): import(\"./index\").AnonymizationResult<Pick<EvidencePacketLike, \"packet\" | \"redactionMetadata\" | \"checksum\">> {\n\treturn new AnonymizationEngine(policy).anonymizeEvidencePacket(packet, context);\n}\n\nexport function buildAnonymizationLifecycleEvidence(input: {\n\tcontext: import(\"./index\").AnonymizationContext;\n\tassetEvents?: Array<{ event: AssetEventLike; metadata: import(\"./index\").AnonymizationMetadata }>;\n\treadModels?: Array<{\n\t\tmodelKind: string;\n\t\trecord: Record<string, unknown> & { id: string };\n\t\tmetadata: import(\"./index\").AnonymizationMetadata;\n\t}>;\n\tevidencePackets?: Array<{ packet: EvidencePacketLike; metadata: import(\"./index\").AnonymizationMetadata }>;\n}, policy: import(\"./engine\").AnonymizationPolicy): AnonymizationLifecycleEvidence {\n\treturn new AnonymizationEngine(policy).buildAnonymizationLifecycleEvidence(input);\n}\n\nexport type PlatformDataClass =\n\t| \"asset_event\"\n\t| \"read_model\"\n\t| \"raw_payload\"\n\t| \"evidence_packet\"\n\t| \"action_evidence\"\n\t| \"access_event\";\n\nexport interface RedactionRule {\n\tfieldPath: string;\n\tmethod: RedactionMethod;\n\treason: string;\n\tdataClass?: PlatformDataClass;\n}\n\nexport interface DataClassificationRule {\n\tfieldPath: string;\n\tclassification: string;\n\tcontainsDirectIdentifier?: boolean;\n\tcontainsSensitiveData?: boolean;\n}\n\nexport interface AnonymizationContext {\n\ttenantId: string;\n\tspaceId?: string | null;\n\tjobId: string;\n\treason: string;\n\tredactedAt?: Date;\n\tpolicyVersion?: string;\n}\n\nexport interface AnonymizationFieldMetadata {\n\tfieldPath: string;\n\tmethod: RedactionMethod;\n\tpolicyVersion: string;\n\tjobId: string;\n\tredactedAt: string;\n\treason: string;\n\tdataClass: PlatformDataClass;\n\tbeforeChecksum: string;\n}\n\nexport interface AnonymizationMetadata {\n\tredactionState: \"anonymized\";\n\tpolicyVersion: string;\n\tjobId: string;\n\tredactedAt: string;\n\treason: string;\n\tdataClass: PlatformDataClass;\n\tredactedFields: AnonymizationFieldMetadata[];\n\tpreservedSemantics: string[];\n}\n\nexport interface AnonymizationResult<TValue> {\n\tvalue: TValue;\n\tmetadata: AnonymizationMetadata;\n}\n\nexport interface AnalyticsDataContractSource {\n\tname: string;\n\tprivacyClass:\n\t\t| \"raw\"\n\t\t| \"operational_pii\"\n\t\t| \"tenant_scoped_tokenized\"\n\t\t| \"anonymized\"\n\t\t| \"aggregated\"\n\t\t| \"differentially_minimized\";\n\tcontainsDirectIdentifiers?: boolean;\n\tcontainsGloballyStablePersonTokens?: boolean;\n\tanonymizationPolicyVersion?: string;\n\tminimumGroupSize?: number;\n}\n\nexport interface AnalyticsDataContract {\n\tcontractId: string;\n\tstatus: \"draft\" | \"accepted\" | \"deprecated\";\n\tcrossTenant: boolean;\n\tacceptedBy?: string;\n\tacceptedAt?: string;\n\tadrReference?: string;\n\tsources: AnalyticsDataContractSource[];\n}\n\nexport interface AnalyticsEligibilityDecision {\n\teligible: boolean;\n\tpolicyVersion: string;\n\treasons: string[];\n}\n\nexport interface RetentionRule {\n\tdataClass: PlatformDataClass;\n\tretainForDays: number;\n\tafterRetention: \"delete\" | \"anonymize\" | \"archive\";\n\tlegalHoldExempt?: boolean;\n}\n"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { AnonymizationEngine } from './chunk-TYNIFC7J.js';
|
|
2
|
+
|
|
3
|
+
// privacy/index.ts
|
|
4
|
+
var PLATFORM_PRIVACY_POLICY_VERSION = "fabric-platform-privacy-v1";
|
|
5
|
+
function anonymizeJsonValue(value, context, dataClass, policy) {
|
|
6
|
+
return new AnonymizationEngine(policy).anonymizeJsonValue(value, context, dataClass);
|
|
7
|
+
}
|
|
8
|
+
function anonymizeAssetEventPayload(event, context, policy) {
|
|
9
|
+
return new AnonymizationEngine(policy).anonymizeAssetEventPayload(event, context);
|
|
10
|
+
}
|
|
11
|
+
function anonymizeEvidencePacket(packet, context, policy) {
|
|
12
|
+
return new AnonymizationEngine(policy).anonymizeEvidencePacket(packet, context);
|
|
13
|
+
}
|
|
14
|
+
function buildAnonymizationLifecycleEvidence(input, policy) {
|
|
15
|
+
return new AnonymizationEngine(policy).buildAnonymizationLifecycleEvidence(input);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export { PLATFORM_PRIVACY_POLICY_VERSION, anonymizeAssetEventPayload, anonymizeEvidencePacket, anonymizeJsonValue, buildAnonymizationLifecycleEvidence };
|
|
19
|
+
//# sourceMappingURL=chunk-BJGZE3GE.js.map
|
|
20
|
+
//# sourceMappingURL=chunk-BJGZE3GE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../privacy/index.ts"],"names":[],"mappings":";;;AAAO,IAAM,+BAAA,GAAkC;AAuBxC,SAAS,kBAAA,CACf,KAAA,EACA,OAAA,EACA,SAAA,EACA,MAAA,EACgD;AAChD,EAAA,OAAO,IAAI,mBAAA,CAAoB,MAAM,EAAE,kBAAA,CAAmB,KAAA,EAAO,SAAS,SAAS,CAAA;AACpF;AAEO,SAAS,0BAAA,CACf,KAAA,EACA,OAAA,EACA,MAAA,EACiD;AACjD,EAAA,OAAO,IAAI,mBAAA,CAAoB,MAAM,CAAA,CAAE,0BAAA,CAA2B,OAAO,OAAO,CAAA;AACjF;AAEO,SAAS,uBAAA,CACf,MAAA,EACA,OAAA,EACA,MAAA,EAC+G;AAC/G,EAAA,OAAO,IAAI,mBAAA,CAAoB,MAAM,CAAA,CAAE,uBAAA,CAAwB,QAAQ,OAAO,CAAA;AAC/E;AAEO,SAAS,mCAAA,CAAoC,OASjD,MAAA,EAAgF;AAClF,EAAA,OAAO,IAAI,mBAAA,CAAoB,MAAM,CAAA,CAAE,oCAAoC,KAAK,CAAA;AACjF","file":"chunk-BJGZE3GE.js","sourcesContent":["export const PLATFORM_PRIVACY_POLICY_VERSION = \"fabric-platform-privacy-v1\";\n\nexport type RedactionMethod = \"nullify\" | \"mask\" | \"hash\" | \"tokenize\" | \"generalize\" | \"drop\";\n\nexport { ANONYMIZATION_POLICY_VERSION } from \"./engine\";\nexport {\n\tAnonymizationEngine,\n\tFieldRedactor,\n\tstableChecksum,\n\ttype AssetEventLike,\n\ttype EvidencePacketLike,\n\ttype AnonymizationLifecycleEvidence,\n\ttype AnonymizationFieldPolicy,\n\ttype AnonymizationPolicy,\n} from \"./engine\";\n\nimport {\n\tAnonymizationEngine,\n\ttype AssetEventLike,\n\ttype EvidencePacketLike,\n\ttype AnonymizationLifecycleEvidence,\n} from \"./engine\";\n\nexport function anonymizeJsonValue<TValue>(\n\tvalue: TValue,\n\tcontext: import(\"./index\").AnonymizationContext,\n\tdataClass: import(\"./index\").PlatformDataClass,\n\tpolicy: import(\"./engine\").AnonymizationPolicy,\n): import(\"./index\").AnonymizationResult<TValue> {\n\treturn new AnonymizationEngine(policy).anonymizeJsonValue(value, context, dataClass);\n}\n\nexport function anonymizeAssetEventPayload(\n\tevent: AssetEventLike,\n\tcontext: import(\"./index\").AnonymizationContext,\n\tpolicy: import(\"./engine\").AnonymizationPolicy,\n): import(\"./index\").AnonymizationResult<unknown> {\n\treturn new AnonymizationEngine(policy).anonymizeAssetEventPayload(event, context);\n}\n\nexport function anonymizeEvidencePacket(\n\tpacket: EvidencePacketLike,\n\tcontext: import(\"./index\").AnonymizationContext,\n\tpolicy: import(\"./engine\").AnonymizationPolicy,\n): import(\"./index\").AnonymizationResult<Pick<EvidencePacketLike, \"packet\" | \"redactionMetadata\" | \"checksum\">> {\n\treturn new AnonymizationEngine(policy).anonymizeEvidencePacket(packet, context);\n}\n\nexport function buildAnonymizationLifecycleEvidence(input: {\n\tcontext: import(\"./index\").AnonymizationContext;\n\tassetEvents?: Array<{ event: AssetEventLike; metadata: import(\"./index\").AnonymizationMetadata }>;\n\treadModels?: Array<{\n\t\tmodelKind: string;\n\t\trecord: Record<string, unknown> & { id: string };\n\t\tmetadata: import(\"./index\").AnonymizationMetadata;\n\t}>;\n\tevidencePackets?: Array<{ packet: EvidencePacketLike; metadata: import(\"./index\").AnonymizationMetadata }>;\n}, policy: import(\"./engine\").AnonymizationPolicy): AnonymizationLifecycleEvidence {\n\treturn new AnonymizationEngine(policy).buildAnonymizationLifecycleEvidence(input);\n}\n\nexport type PlatformDataClass =\n\t| \"asset_event\"\n\t| \"read_model\"\n\t| \"raw_payload\"\n\t| \"evidence_packet\"\n\t| \"action_evidence\"\n\t| \"access_event\";\n\nexport interface RedactionRule {\n\tfieldPath: string;\n\tmethod: RedactionMethod;\n\treason: string;\n\tdataClass?: PlatformDataClass;\n}\n\nexport interface DataClassificationRule {\n\tfieldPath: string;\n\tclassification: string;\n\tcontainsDirectIdentifier?: boolean;\n\tcontainsSensitiveData?: boolean;\n}\n\nexport interface AnonymizationContext {\n\ttenantId: string;\n\tspaceId?: string | null;\n\tjobId: string;\n\treason: string;\n\tredactedAt?: Date;\n\tpolicyVersion?: string;\n}\n\nexport interface AnonymizationFieldMetadata {\n\tfieldPath: string;\n\tmethod: RedactionMethod;\n\tpolicyVersion: string;\n\tjobId: string;\n\tredactedAt: string;\n\treason: string;\n\tdataClass: PlatformDataClass;\n\tbeforeChecksum: string;\n}\n\nexport interface AnonymizationMetadata {\n\tredactionState: \"anonymized\";\n\tpolicyVersion: string;\n\tjobId: string;\n\tredactedAt: string;\n\treason: string;\n\tdataClass: PlatformDataClass;\n\tredactedFields: AnonymizationFieldMetadata[];\n\tpreservedSemantics: string[];\n}\n\nexport interface AnonymizationResult<TValue> {\n\tvalue: TValue;\n\tmetadata: AnonymizationMetadata;\n}\n\nexport interface AnalyticsDataContractSource {\n\tname: string;\n\tprivacyClass:\n\t\t| \"raw\"\n\t\t| \"operational_pii\"\n\t\t| \"tenant_scoped_tokenized\"\n\t\t| \"anonymized\"\n\t\t| \"aggregated\"\n\t\t| \"differentially_minimized\";\n\tcontainsDirectIdentifiers?: boolean;\n\tcontainsGloballyStablePersonTokens?: boolean;\n\tanonymizationPolicyVersion?: string;\n\tminimumGroupSize?: number;\n}\n\nexport interface AnalyticsDataContract {\n\tcontractId: string;\n\tstatus: \"draft\" | \"accepted\" | \"deprecated\";\n\tcrossTenant: boolean;\n\tacceptedBy?: string;\n\tacceptedAt?: string;\n\tadrReference?: string;\n\tsources: AnalyticsDataContractSource[];\n}\n\nexport interface AnalyticsEligibilityDecision {\n\teligible: boolean;\n\tpolicyVersion: string;\n\treasons: string[];\n}\n\nexport interface RetentionRule {\n\tdataClass: PlatformDataClass;\n\tretainForDays: number;\n\tafterRetention: \"delete\" | \"anonymize\" | \"archive\";\n\tlegalHoldExempt?: boolean;\n}\n"]}
|
|
@@ -250,29 +250,9 @@ var AnonymizationEngine = class {
|
|
|
250
250
|
}
|
|
251
251
|
};
|
|
252
252
|
|
|
253
|
-
// privacy/index.ts
|
|
254
|
-
var PLATFORM_PRIVACY_POLICY_VERSION = "fabric-platform-privacy-v1";
|
|
255
|
-
function anonymizeJsonValue(value, context, dataClass, policy) {
|
|
256
|
-
return new AnonymizationEngine(policy).anonymizeJsonValue(value, context, dataClass);
|
|
257
|
-
}
|
|
258
|
-
function anonymizeAssetEventPayload(event, context, policy) {
|
|
259
|
-
return new AnonymizationEngine(policy).anonymizeAssetEventPayload(event, context);
|
|
260
|
-
}
|
|
261
|
-
function anonymizeEvidencePacket(packet, context, policy) {
|
|
262
|
-
return new AnonymizationEngine(policy).anonymizeEvidencePacket(packet, context);
|
|
263
|
-
}
|
|
264
|
-
function buildAnonymizationLifecycleEvidence(input, policy) {
|
|
265
|
-
return new AnonymizationEngine(policy).buildAnonymizationLifecycleEvidence(input);
|
|
266
|
-
}
|
|
267
|
-
|
|
268
253
|
exports.ANONYMIZATION_POLICY_VERSION = ANONYMIZATION_POLICY_VERSION;
|
|
269
254
|
exports.AnonymizationEngine = AnonymizationEngine;
|
|
270
255
|
exports.FieldRedactor = FieldRedactor;
|
|
271
|
-
exports.PLATFORM_PRIVACY_POLICY_VERSION = PLATFORM_PRIVACY_POLICY_VERSION;
|
|
272
|
-
exports.anonymizeAssetEventPayload = anonymizeAssetEventPayload;
|
|
273
|
-
exports.anonymizeEvidencePacket = anonymizeEvidencePacket;
|
|
274
|
-
exports.anonymizeJsonValue = anonymizeJsonValue;
|
|
275
|
-
exports.buildAnonymizationLifecycleEvidence = buildAnonymizationLifecycleEvidence;
|
|
276
256
|
exports.stableChecksum = stableChecksum;
|
|
277
|
-
//# sourceMappingURL=chunk-
|
|
278
|
-
//# sourceMappingURL=chunk-
|
|
257
|
+
//# sourceMappingURL=chunk-CRZXTZ36.cjs.map
|
|
258
|
+
//# sourceMappingURL=chunk-CRZXTZ36.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../privacy/engine.ts"],"names":["createHash"],"mappings":"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","file":"chunk-CRZXTZ36.cjs","sourcesContent":["import { createHash } from \"node:crypto\";\n\nimport type {\n\tAnonymizationContext,\n\tAnonymizationFieldMetadata,\n\tAnonymizationMetadata,\n\tAnonymizationResult,\n\tPlatformDataClass,\n\tRedactionMethod,\n} from \"./index\";\n\nexport const ANONYMIZATION_POLICY_VERSION = \"adr-026-platform-anonymization-v1\";\n\ntype JsonObject = Record<string, unknown>;\n\nexport interface AnonymizationFieldPolicy {\n\tmethod: RedactionMethod;\n\tmatch: \"key\" | \"path\";\n\tvalue: string;\n}\n\nexport interface AnonymizationPolicy {\n\tfields: readonly AnonymizationFieldPolicy[];\n\tpreservedSemantics?: readonly string[];\n}\n\nexport interface AssetEventLike {\n\tid: string;\n\ttenantId: string;\n\tspaceId: string;\n\teventType: string;\n\tsubjectType: string;\n\tsubjectId: string;\n\tactionInvocationId: string;\n\tpayload: unknown;\n\tsequence: number;\n\toccurredAt: Date;\n\trecordedAt: Date;\n\tcorrelationId: string;\n\tcausationId?: string | null;\n}\n\nexport interface EvidencePacketLike {\n\tid: string;\n\tpacket: unknown;\n\tredactionMetadata: unknown;\n\tchecksum: string;\n}\n\nexport interface AnonymizationLifecycleEvidence {\n\teventType: \"AnonymizationApplied\";\n\tpolicyVersion: string;\n\tjobId: string;\n\treason: string;\n\tappliedAt: string;\n\ttenantId: string;\n\tspaceId: string | null;\n\tcounts: {\n\t\tassetEvents: number;\n\t\treadModels: number;\n\t\tevidencePackets: number;\n\t\tredactedFields: number;\n\t};\n\trecords: Array<{\n\t\trecordClass: PlatformDataClass;\n\t\trecordId: string;\n\t\tsubjectType?: string;\n\t\tsubjectId?: string;\n\t\tfieldManifest: Array<\n\t\t\tPick<AnonymizationFieldMetadata, \"fieldPath\" | \"method\" | \"beforeChecksum\">\n\t\t>;\n\t}>;\n\tpreservedSemantics: string[];\n}\n\nfunction normalizeKey(key: string): string {\n\treturn key.replace(/[^a-zA-Z0-9]/g, \"\").toLowerCase();\n}\n\nexport function stableChecksum(value: unknown): string {\n\treturn createHash(\"sha256\").update(JSON.stringify(value)).digest(\"hex\");\n}\n\nfunction stableScopedToken(\n\tvalue: unknown,\n\tcontext: AnonymizationContext,\n\tfieldPath: string,\n): string {\n\tconst scope = `${context.tenantId}:${context.spaceId ?? \"global\"}:${fieldPath}`;\n\treturn `tok_${createHash(\"sha256\")\n\t\t.update(`${context.policyVersion ?? ANONYMIZATION_POLICY_VERSION}:${scope}:${String(value)}`)\n\t\t.digest(\"hex\")\n\t\t.slice(0, 24)}`;\n}\n\nfunction maskValue(value: unknown): string | null {\n\tif (value === null || value === undefined) {\n\t\treturn null;\n\t}\n\n\tconst stringValue = String(value);\n\tif (stringValue.length <= 4) {\n\t\treturn \"****\";\n\t}\n\n\treturn `${\"*\".repeat(Math.max(stringValue.length - 4, 4))}${stringValue.slice(-4)}`;\n}\n\nfunction generalizeValue(value: unknown): unknown {\n\tif (typeof value === \"number\") {\n\t\treturn Math.round(value / 1000) * 1000;\n\t}\n\n\tif (typeof value === \"string\" && /^\\d{5}(?:-\\d{4})?$/.test(value)) {\n\t\treturn `${value.slice(0, 3)}**`;\n\t}\n\n\treturn null;\n}\n\nfunction applyMethod(\n\tvalue: unknown,\n\tmethod: RedactionMethod,\n\tcontext: AnonymizationContext,\n\tpath: string,\n): unknown {\n\tswitch (method) {\n\t\tcase \"drop\":\n\t\t\treturn undefined;\n\t\tcase \"nullify\":\n\t\t\treturn null;\n\t\tcase \"mask\":\n\t\t\treturn maskValue(value);\n\t\tcase \"hash\":\n\t\t\treturn `sha256_${stableChecksum(value)}`;\n\t\tcase \"tokenize\":\n\t\t\treturn stableScopedToken(value, context, path);\n\t\tcase \"generalize\":\n\t\t\treturn generalizeValue(value);\n\t}\n}\n\nfunction policyForPath(policies: readonly AnonymizationFieldPolicy[], path: string, key?: string): AnonymizationFieldPolicy | undefined {\n\tconst normalizedPath = normalizeKey(path);\n\tconst normalizedKey = key ? normalizeKey(key) : undefined;\n\n\treturn policies.find((policy) => {\n\t\tconst normalizedValue = normalizeKey(policy.value);\n\t\tif (policy.match === \"key\") {\n\t\t\treturn normalizedValue === normalizedKey;\n\t\t}\n\n\t\treturn normalizedValue === normalizedPath;\n\t});\n}\n\nfunction isPlainObject(value: unknown): value is JsonObject {\n\treturn (\n\t\tBoolean(value) && typeof value === \"object\" && !Array.isArray(value) && !(value instanceof Date)\n\t);\n}\n\nfunction anonymizeRecursive(\n\tvalue: unknown,\n\tcontext: AnonymizationContext,\n\tdataClass: PlatformDataClass,\n\tpath: string,\n\tredactedFields: AnonymizationFieldMetadata[],\n\tpolicies: readonly AnonymizationFieldPolicy[],\n\tkey?: string,\n): unknown {\n\tconst fieldPolicy = policyForPath(policies, path, key);\n\tif (fieldPolicy && value !== null && value !== undefined) {\n\t\tredactedFields.push({\n\t\t\tfieldPath: path,\n\t\t\tmethod: fieldPolicy.method,\n\t\t\tpolicyVersion: context.policyVersion ?? ANONYMIZATION_POLICY_VERSION,\n\t\t\tjobId: context.jobId,\n\t\t\tredactedAt: (context.redactedAt ?? new Date()).toISOString(),\n\t\t\treason: context.reason,\n\t\t\tdataClass,\n\t\t\tbeforeChecksum: stableChecksum(value),\n\t\t});\n\n\t\treturn applyMethod(value, fieldPolicy.method, context, path);\n\t}\n\n\tif (Array.isArray(value)) {\n\t\treturn value.map((item, index) =>\n\t\t\tanonymizeRecursive(item, context, dataClass, `${path}[${index}]`, redactedFields, policies),\n\t\t);\n\t}\n\n\tif (!isPlainObject(value)) {\n\t\treturn value;\n\t}\n\n\tconst result: JsonObject = {};\n\tfor (const [childKey, childValue] of Object.entries(value)) {\n\t\tif (childKey === \"_privacy\") {\n\t\t\tresult[childKey] = childValue;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst anonymized = anonymizeRecursive(\n\t\t\tchildValue,\n\t\t\tcontext,\n\t\t\tdataClass,\n\t\t\t`${path}.${childKey}`,\n\t\t\tredactedFields,\n\t\t\tpolicies,\n\t\t\tchildKey,\n\t\t);\n\n\t\tif (anonymized !== undefined) {\n\t\t\tresult[childKey] = anonymized;\n\t\t}\n\t}\n\n\treturn result;\n}\n\nfunction buildMetadata(\n\tcontext: AnonymizationContext,\n\tdataClass: PlatformDataClass,\n\tredactedFields: AnonymizationFieldMetadata[],\n\tpreservedSemantics: readonly string[],\n): AnonymizationMetadata {\n\treturn {\n\t\tredactionState: \"anonymized\",\n\t\tpolicyVersion: context.policyVersion ?? ANONYMIZATION_POLICY_VERSION,\n\t\tjobId: context.jobId,\n\t\tredactedAt: (context.redactedAt ?? new Date()).toISOString(),\n\t\treason: context.reason,\n\t\tdataClass,\n\t\tredactedFields,\n\t\tpreservedSemantics: [...preservedSemantics],\n\t};\n}\n\nexport class FieldRedactor {\n\tredactField(value: unknown, method: RedactionMethod, context: AnonymizationContext, path: string): unknown {\n\t\treturn applyMethod(value, method, context, path);\n\t}\n\n\tmask(value: unknown): string | null {\n\t\treturn maskValue(value);\n\t}\n\n\thash(value: unknown): string {\n\t\treturn `sha256_${stableChecksum(value)}`;\n\t}\n\n\ttokenize(value: unknown, context: AnonymizationContext, path: string): string {\n\t\treturn stableScopedToken(value, context, path);\n\t}\n\n\tgeneralize(value: unknown): unknown {\n\t\treturn generalizeValue(value);\n\t}\n}\n\nexport class AnonymizationEngine {\n\treadonly #policy: AnonymizationPolicy;\n\n\tconstructor(policy: AnonymizationPolicy) {\n\t\tthis.#policy = {\n\t\t\tfields: policy.fields.map((field) => ({ ...field })),\n\t\t\tpreservedSemantics: [...(policy.preservedSemantics ?? [])],\n\t\t};\n\t}\n\n\tanonymizeJsonValue<TValue>(\n\t\tvalue: TValue,\n\t\tcontext: AnonymizationContext,\n\t\tdataClass: PlatformDataClass,\n\t): AnonymizationResult<TValue> {\n\t\treturn this.anonymizeJsonValueAtPath(value, context, dataClass, \"$\");\n\t}\n\n\tanonymizeJsonValueAtPath<TValue>(\n\t\tvalue: TValue,\n\t\tcontext: AnonymizationContext,\n\t\tdataClass: PlatformDataClass,\n\t\tbasePath: string,\n\t): AnonymizationResult<TValue> {\n\t\tconst redactedFields: AnonymizationFieldMetadata[] = [];\n\t\tconst anonymizedValue = anonymizeRecursive(\n\t\t\tvalue,\n\t\t\tcontext,\n\t\t\tdataClass,\n\t\t\tbasePath,\n\t\t\tredactedFields,\n\t\t\tthis.#policy.fields,\n\t\t) as TValue;\n\n\t\treturn {\n\t\t\tvalue: anonymizedValue,\n\t\t\tmetadata: buildMetadata(context, dataClass, redactedFields, this.#policy.preservedSemantics ?? []),\n\t\t};\n\t}\n\n\tanonymizeAssetEventPayload(\n\t\tevent: AssetEventLike,\n\t\tcontext: AnonymizationContext,\n\t): AnonymizationResult<unknown> {\n\t\tconst result = this.anonymizeJsonValue(event.payload, context, \"asset_event\");\n\t\tconst payload = isPlainObject(result.value)\n\t\t\t? { ...result.value, _privacy: result.metadata }\n\t\t\t: { value: result.value, _privacy: result.metadata };\n\n\t\treturn { value: payload, metadata: result.metadata };\n\t}\n\n\tanonymizeEvidencePacket(\n\t\tpacket: EvidencePacketLike,\n\t\tcontext: AnonymizationContext,\n\t): AnonymizationResult<Pick<EvidencePacketLike, \"packet\" | \"redactionMetadata\" | \"checksum\">> {\n\t\tconst result = this.anonymizeJsonValue(packet.packet, context, \"evidence_packet\");\n\t\tconst redactionMetadata = {\n\t\t\t...(isPlainObject(packet.redactionMetadata) ? packet.redactionMetadata : {}),\n\t\t\tlifecycleAnonymization: result.metadata,\n\t\t};\n\t\tconst anonymizedPacket = isPlainObject(result.value)\n\t\t\t? { ...result.value, _privacy: result.metadata }\n\t\t\t: { value: result.value, _privacy: result.metadata };\n\n\t\treturn {\n\t\t\tvalue: {\n\t\t\t\tpacket: anonymizedPacket,\n\t\t\t\tredactionMetadata,\n\t\t\t\tchecksum: stableChecksum({ packet: anonymizedPacket, redactionMetadata }),\n\t\t\t},\n\t\t\tmetadata: result.metadata,\n\t\t};\n\t}\n\n\tbuildAnonymizationLifecycleEvidence(input: {\n\t\tcontext: AnonymizationContext;\n\t\tassetEvents?: Array<{ event: AssetEventLike; metadata: AnonymizationMetadata }>;\n\t\treadModels?: Array<{\n\t\t\tmodelKind: string;\n\t\t\trecord: JsonObject & { id: string };\n\t\t\tmetadata: AnonymizationMetadata;\n\t\t}>;\n\t\tevidencePackets?: Array<{ packet: EvidencePacketLike; metadata: AnonymizationMetadata }>;\n\t}): AnonymizationLifecycleEvidence {\n\t\tconst assetEvents = input.assetEvents ?? [];\n\t\tconst readModels = input.readModels ?? [];\n\t\tconst evidencePackets = input.evidencePackets ?? [];\n\t\tconst redactedFields = [\n\t\t\t...assetEvents.flatMap((item) => item.metadata.redactedFields),\n\t\t\t...readModels.flatMap((item) => item.metadata.redactedFields),\n\t\t\t...evidencePackets.flatMap((item) => item.metadata.redactedFields),\n\t\t];\n\n\t\treturn {\n\t\t\teventType: \"AnonymizationApplied\",\n\t\t\tpolicyVersion: input.context.policyVersion ?? ANONYMIZATION_POLICY_VERSION,\n\t\t\tjobId: input.context.jobId,\n\t\t\treason: input.context.reason,\n\t\t\tappliedAt: (input.context.redactedAt ?? new Date()).toISOString(),\n\t\t\ttenantId: input.context.tenantId,\n\t\t\tspaceId: input.context.spaceId ?? null,\n\t\t\tcounts: {\n\t\t\t\tassetEvents: assetEvents.length,\n\t\t\t\treadModels: readModels.length,\n\t\t\t\tevidencePackets: evidencePackets.length,\n\t\t\t\tredactedFields: redactedFields.length,\n\t\t\t},\n\t\t\trecords: [\n\t\t\t\t...assetEvents.map((item) => ({\n\t\t\t\t\trecordClass: \"asset_event\" as PlatformDataClass,\n\t\t\t\t\trecordId: item.event.id,\n\t\t\t\t\tsubjectType: item.event.subjectType,\n\t\t\t\t\tsubjectId: item.event.subjectId,\n\t\t\t\t\tfieldManifest: item.metadata.redactedFields.map(\n\t\t\t\t\t\t({ fieldPath, method, beforeChecksum }) => ({\n\t\t\t\t\t\t\tfieldPath,\n\t\t\t\t\t\t\tmethod,\n\t\t\t\t\t\t\tbeforeChecksum,\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t})),\n\t\t\t\t...readModels.map((item) => ({\n\t\t\t\t\trecordClass: \"read_model\" as PlatformDataClass,\n\t\t\t\t\trecordId: item.record.id,\n\t\t\t\t\tsubjectType: item.modelKind,\n\t\t\t\t\tsubjectId: item.record.id,\n\t\t\t\t\tfieldManifest: item.metadata.redactedFields.map(\n\t\t\t\t\t\t({ fieldPath, method, beforeChecksum }) => ({\n\t\t\t\t\t\t\tfieldPath,\n\t\t\t\t\t\t\tmethod,\n\t\t\t\t\t\t\tbeforeChecksum,\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t})),\n\t\t\t\t...evidencePackets.map((item) => ({\n\t\t\t\t\trecordClass: \"evidence_packet\" as PlatformDataClass,\n\t\t\t\t\trecordId: item.packet.id,\n\t\t\t\t\tfieldManifest: item.metadata.redactedFields.map(\n\t\t\t\t\t\t({ fieldPath, method, beforeChecksum }) => ({\n\t\t\t\t\t\t\tfieldPath,\n\t\t\t\t\t\t\tmethod,\n\t\t\t\t\t\t\tbeforeChecksum,\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t})),\n\t\t\t],\n\t\t\tpreservedSemantics: [...(this.#policy.preservedSemantics ?? [])],\n\t\t};\n\t}\n}\n"]}
|
|
@@ -254,6 +254,9 @@ function validateManifest(module, context = {}) {
|
|
|
254
254
|
`Action "${action.actionId}" mutates domain but emits no events. Every mutating action must emit at least one AssetEvent.`
|
|
255
255
|
);
|
|
256
256
|
}
|
|
257
|
+
if (action.admitSubmission !== void 0 && typeof action.admitSubmission !== "function") {
|
|
258
|
+
throw new Error(`Action "${action.actionId}" declares admitSubmission that is not a function.`);
|
|
259
|
+
}
|
|
257
260
|
}
|
|
258
261
|
const viewKeys = /* @__PURE__ */ new Set();
|
|
259
262
|
for (const view of module.views ?? []) {
|
|
@@ -388,5 +391,5 @@ exports.registerFabricModule = registerFabricModule;
|
|
|
388
391
|
exports.registerFabricModules = registerFabricModules;
|
|
389
392
|
exports.validateAndOrderFabricModules = validateAndOrderFabricModules;
|
|
390
393
|
exports.validateModuleNamespace = validateModuleNamespace;
|
|
391
|
-
//# sourceMappingURL=chunk-
|
|
392
|
-
//# sourceMappingURL=chunk-
|
|
394
|
+
//# sourceMappingURL=chunk-DBTAUI6C.cjs.map
|
|
395
|
+
//# sourceMappingURL=chunk-DBTAUI6C.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../modules/index.ts"],"names":["viewContractKey","assertPortableJsonSchema","assertSurfaceDeclaration","createEventContractRegistry"],"mappings":"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","file":"chunk-DBTAUI6C.cjs","sourcesContent":["import { assertSurfaceDeclaration } from \"../discovery\";\nimport type { ActionDefinition } from \"../actions\";\nimport { createEventContractRegistry } from \"../events\";\nimport {\n\tassertPortableJsonSchema,\n\ttype JsonValue,\n\ttype PortableJsonSchema,\n} from \"../objects\";\nimport type { PolicyEvaluator, PolicyId } from \"../policies\";\nimport type { StateMachineDefinition } from \"../state-machines\";\nimport { viewContractKey, type ViewContract } from \"../projections\";\n\nexport interface ModuleDependency {\n\tnamespace: string;\n\tversion?: string;\n\toptional?: boolean;\n}\n\nexport type ModuleDependencyInput = string | ModuleDependency;\n\nexport interface IdPrefixRegistration {\n\tprefix: string;\n\tname: string;\n\tmodule: string;\n}\n\nexport interface EventTypeRegistration {\n\teventType: string;\n\tschemaVersion: number;\n\tdescription?: string;\n\tschema?: PortableJsonSchema;\n}\n\nexport type EventTypeRegistrationInput = string | EventTypeRegistration;\n\nexport interface ObjectTypeRegistration {\n\ttype: string;\n\tdisplayName?: string;\n\tidPrefix?: string;\n\tisCoreModuleType?: boolean;\n\tschema?: PortableJsonSchema;\n\tsemantics?: Record<string, JsonValue>;\n\trelations?: ObjectRelationDefinition[];\n\tinvariants?: DeclarativeInvariant[];\n}\n\nexport type ObjectRelationCardinality = \"one\" | \"many\";\nexport type ObjectRelationSemantics = \"reference\" | \"owned\";\nexport type ObjectRelationDeleteBehavior = \"restrict\" | \"cascade\" | \"set-null\";\n\nexport interface ObjectRelationDefinition {\n\tname: string;\n\ttarget: `${string}.${string}`;\n\tcardinality: ObjectRelationCardinality;\n\trequired?: boolean;\n\tsemantics: ObjectRelationSemantics;\n\tonTargetDelete: ObjectRelationDeleteBehavior;\n}\n\nexport type InvariantEnforcement =\n\t| \"json-schema\"\n\t| \"state-machine\"\n\t| \"policy\"\n\t| \"host-adapter\"\n\t| \"application\";\n\nexport interface DeclarativeInvariant {\n\tid: string;\n\tdescription: string;\n\trequired?: boolean;\n\tenforcement: InvariantEnforcement;\n\tenforcementRef?: string;\n}\n\nexport type ObjectTypeRegistrationInput = string | ObjectTypeRegistration;\n\nexport interface PolicyRegistration {\n\tid: string;\n\tversion?: string;\n\tdescription?: string;\n}\n\nexport interface StateMachineRegistration {\n\tentityType: string;\n\tstates: string[];\n}\n\nexport interface CapabilityPortRequirement {\n\tname: string;\n\tversion?: string;\n\tstandard?: { name: string; version?: string };\n}\n\nexport interface CapabilityRequirements {\n\tports?: CapabilityPortRequirement[];\n\tpermissions?: string[];\n\tentitlements?: string[];\n\tfeatureFlags?: string[];\n}\n\nexport interface CapabilityWorkflowTimer {\n\t/** Workflow-local identity of the deadline, for example \"right-to-cure\". */\n\tname: string;\n\t/** Configuration key the duration is resolved from when the workflow starts. */\n\tconfigKey: string;\n\tdescription?: string;\n}\n\nexport interface CapabilityWorkflowCompensation {\n\t/** Workflow step whose effect this reverses. */\n\tstep: string;\n\t/** Governed action that performs the reversal. Must belong to the declaring module. */\n\tactionId: `${string}.${string}`;\n}\n\n/**\n * A durable workflow this capability owns. Declaring it makes durability a\n * reviewable fact of the contract rather than a property of worker deployment:\n * the queue it runs on, the deadlines it carries, and what reverses each step\n * are all diffable.\n */\nexport interface CapabilityWorkflowDeclaration {\n\tname: string;\n\t/** Routing identity, conventionally `capability.vertical`. */\n\ttaskQueue: string;\n\t/** Event type whose arrival starts this workflow by choreography. */\n\tstartedBy?: string;\n\ttimers?: CapabilityWorkflowTimer[];\n\tcompensations?: CapabilityWorkflowCompensation[];\n}\n\nexport interface CapabilityMetadata {\n\tdisplayName: string;\n\tdescription: string;\n\tstability: \"experimental\" | \"beta\" | \"stable\" | \"deprecated\";\n\tdeprecated?: { since: string; replacement?: string; message: string };\n\trequirements?: CapabilityRequirements;\n\tcertification?: { profile: string; required: boolean };\n\t/** Durable workflows this capability owns, with their queues, deadlines and reversals. */\n\tworkflows?: CapabilityWorkflowDeclaration[];\n\t/** Namespaced declared data preserved by Platform and interpreted only by its owning package. */\n\textensions?: Record<string, JsonValue>;\n}\n\nexport interface FabricModule<TDb = unknown> {\n\tnamespace: string;\n\tversion?: string;\n\t/** Compiler manifest digest for exact runtime assembly verification. */\n\tmanifestDigest?: string;\n\tdisplayName?: string;\n\tdescription?: string;\n\tcapability?: CapabilityMetadata;\n\tdependencies?: ModuleDependencyInput[];\n\tobjectTypes?: ObjectTypeRegistrationInput[];\n\tsubjectTypes?: string[];\n\tidPrefixes?: IdPrefixRegistration[];\n\teventTypes?: EventTypeRegistrationInput[];\n\tactions?: ActionDefinition<TDb>[];\n\tpolicies?: unknown[];\n\tstateMachines?: unknown[];\n\tadapterDefinitions?: unknown[];\n\tpermissions?: unknown[];\n\troles?: unknown[];\n\tredactionRules?: unknown[];\n\tdataClassifications?: unknown[];\n\tretentionRules?: unknown[];\n\tevidenceRenderers?: unknown[];\n\tviews?: ViewContract[];\n}\n\nexport interface ModuleRegistry<TDb = unknown> {\n\tmodules: ReadonlyMap<string, FabricModule<TDb>>;\n\torderedModules: readonly FabricModule<TDb>[];\n\tresolveAction(actionId: `${string}.${string}`): ActionDefinition<TDb> | undefined;\n\tresolvePolicy(policyId: PolicyId): PolicyEvaluator | undefined;\n\tresolveStateMachine(entityType: string): StateMachineDefinition | undefined;\n\tresolveView(name: string, version: string): ViewContract | undefined;\n}\n\ninterface ModuleValidationContext {\n\tavailableNamespaces?: Set<string>;\n\tplannedEventTypes?: Set<string>;\n\tavailableObjectTypes?: Set<string>;\n}\n\nexport function getModuleDependencyNamespace(dependency: ModuleDependencyInput): string {\n\treturn typeof dependency === \"string\" ? dependency : dependency.namespace;\n}\n\nexport function getObjectTypeName(objectType: ObjectTypeRegistrationInput): string {\n\treturn typeof objectType === \"string\" ? objectType : objectType.type;\n}\n\nexport function getEventTypeName(eventType: EventTypeRegistrationInput): string {\n\treturn typeof eventType === \"string\" ? eventType : eventType.eventType;\n}\n\nexport function validateModuleNamespace(namespace: string): void {\n\tif (!namespace) {\n\t\tthrow new Error(\"Module namespace cannot be empty\");\n\t}\n\tif (!/^[a-z][a-z0-9-]*$/.test(namespace)) {\n\t\tthrow new Error(\n\t\t\t`Invalid module namespace: \"${namespace}\". Must be lowercase letters, numbers, and hyphens only.`,\n\t\t);\n\t}\n}\n\nexport function createModuleRegistry<TDb = unknown>(\n\tmodules: FabricModule<TDb>[] = [],\n): ModuleRegistry<TDb> {\n\tconst orderedModules = validateAndOrderFabricModules(modules);\n\tconst registered = new Map(orderedModules.map((module) => [module.namespace, module]));\n\tconst actions = new Map(orderedModules.flatMap((module) => (module.actions ?? []).map((action) => [action.actionId, action] as const)));\n\tconst policies = new Map(orderedModules.flatMap((module) => (module.policies ?? []).map((policy) => {\n\t\tconst evaluator = policy as PolicyEvaluator;\n\t\treturn [evaluator.policyId, evaluator] as const;\n\t})));\n\tconst machines = new Map(orderedModules.flatMap((module) => (module.stateMachines ?? []).map((machine) => {\n\t\tconst definition = machine as StateMachineDefinition;\n\t\treturn [definition.entityType, definition] as const;\n\t})));\n\tconst views = new Map(orderedModules.flatMap((module) => (module.views ?? []).map((view) => [viewContractKey(view), view] as const)));\n\treturn {\n\t\tmodules: registered,\n\t\torderedModules,\n\t\tresolveAction: (actionId) => actions.get(actionId),\n\t\tresolvePolicy: (policyId) => policies.get(policyId),\n\t\tresolveStateMachine: (entityType) => machines.get(entityType),\n\t\tresolveView: (name, version) => views.get(`${name}@${version}`),\n\t};\n}\n\nfunction validateIdentifierList(\n\tvalues: string[] | undefined,\n\tlabel: string,\n\tnamespace: string,\n): void {\n\tfor (const value of values ?? []) {\n\t\tif (!value) {\n\t\t\tthrow new Error(`Module \"${namespace}\" has an empty ${label} entry.`);\n\t\t}\n\t}\n}\n\nfunction assertJsonValue(value: unknown, path: string): asserts value is JsonValue {\n\tif (value === null || typeof value === \"string\" || typeof value === \"boolean\") return;\n\tif (typeof value === \"number\" && Number.isFinite(value)) return;\n\tif (Array.isArray(value)) {\n\t\tvalue.forEach((item, index) => assertJsonValue(item, `${path}[${index}]`));\n\t\treturn;\n\t}\n\tif (typeof value === \"object\") {\n\t\tfor (const [key, child] of Object.entries(value as Record<string, unknown>)) {\n\t\t\tassertJsonValue(child, `${path}.${key}`);\n\t\t}\n\t\treturn;\n\t}\n\tthrow new Error(`${path} must contain JSON-serializable values.`);\n}\n\nfunction qualifiedObjectType(namespace: string, type: string): string {\n\treturn `${namespace}.${type}`;\n}\n\nfunction validateObjectDefinition(\n\tobjectType: ObjectTypeRegistrationInput,\n\tnamespace: string,\n\tcontext: ModuleValidationContext,\n): void {\n\tif (typeof objectType === \"string\") return;\n\tif (objectType.schema !== undefined) {\n\t\tassertPortableJsonSchema(objectType.schema, `Module \"${namespace}\" object \"${objectType.type}\" schema`);\n\t}\n\tif (objectType.semantics !== undefined) {\n\t\tassertJsonValue(objectType.semantics, `Module \"${namespace}\" object \"${objectType.type}\" semantics`);\n\t}\n\tconst relationNames = new Set<string>();\n\tfor (const relation of objectType.relations ?? []) {\n\t\tif (!/^[a-z][a-zA-Z0-9]*$/.test(relation.name)) {\n\t\t\tthrow new Error(`Module \"${namespace}\" object \"${objectType.type}\" has invalid relation name \"${relation.name}\".`);\n\t\t}\n\t\tif (relationNames.has(relation.name)) {\n\t\t\tthrow new Error(`Module \"${namespace}\" object \"${objectType.type}\" has duplicate relation \"${relation.name}\".`);\n\t\t}\n\t\trelationNames.add(relation.name);\n\t\tif (!/^[a-z][a-z0-9-]*\\.[A-Z][a-zA-Z0-9]*$/.test(relation.target)) {\n\t\t\tthrow new Error(`Relation \"${relation.name}\" target \"${relation.target}\" must be module-qualified.`);\n\t\t}\n\t\tif (context.availableObjectTypes && !context.availableObjectTypes.has(relation.target)) {\n\t\t\tthrow new Error(`Relation \"${relation.name}\" targets missing object type \"${relation.target}\".`);\n\t\t}\n\t\tif (relation.required && relation.onTargetDelete === \"set-null\") {\n\t\t\tthrow new Error(`Required relation \"${relation.name}\" cannot use onTargetDelete \"set-null\".`);\n\t\t}\n\t}\n\tconst invariantIds = new Set<string>();\n\tfor (const invariant of objectType.invariants ?? []) {\n\t\tif (!invariant.id.trim() || !invariant.description.trim()) {\n\t\t\tthrow new Error(`Module \"${namespace}\" object \"${objectType.type}\" has an invariant without an id or description.`);\n\t\t}\n\t\tif (invariantIds.has(invariant.id)) {\n\t\t\tthrow new Error(`Module \"${namespace}\" object \"${objectType.type}\" has duplicate invariant \"${invariant.id}\".`);\n\t\t}\n\t\tinvariantIds.add(invariant.id);\n\t\tif (invariant.required && !invariant.enforcementRef?.trim()) {\n\t\t\tthrow new Error(`Required invariant \"${invariant.id}\" must declare enforcementRef.`);\n\t\t}\n\t}\n}\n\nfunction validateCapabilityWorkflows(module: FabricModule<unknown>, context: ModuleValidationContext): void {\n\tconst workflows = module.capability?.workflows ?? [];\n\tconst actionsById = new Map((module.actions ?? []).map((action) => [action.actionId, action]));\n\tconst names = new Set<string>();\n\tfor (const workflow of workflows) {\n\t\tif (!/^[A-Za-z][A-Za-z0-9_-]*$/.test(workflow.name)) {\n\t\t\tthrow new Error(`Module \"${module.namespace}\" declares invalid workflow name \"${workflow.name}\".`);\n\t\t}\n\t\tif (names.has(workflow.name)) {\n\t\t\tthrow new Error(`Module \"${module.namespace}\" declares duplicate workflow \"${workflow.name}\".`);\n\t\t}\n\t\tnames.add(workflow.name);\n\t\tif (!/^[a-z][a-z0-9-]*(\\.[a-z][a-z0-9-]*)*$/.test(workflow.taskQueue)) {\n\t\t\tthrow new Error(`Module \"${module.namespace}\" workflow \"${workflow.name}\" declares invalid task queue \"${workflow.taskQueue}\".`);\n\t\t}\n\t\tif (workflow.startedBy !== undefined) {\n\t\t\tconst known = context.plannedEventTypes?.has(workflow.startedBy)\n\t\t\t\t?? (module.eventTypes ?? []).some((eventType) => getEventTypeName(eventType) === workflow.startedBy);\n\t\t\tif (!known) {\n\t\t\t\tthrow new Error(`Module \"${module.namespace}\" workflow \"${workflow.name}\" is started by unknown event type \"${workflow.startedBy}\".`);\n\t\t\t}\n\t\t}\n\t\tconst timerNames = new Set<string>();\n\t\tfor (const timer of workflow.timers ?? []) {\n\t\t\tif (!timer.name.trim() || !timer.configKey.trim()) {\n\t\t\t\tthrow new Error(`Module \"${module.namespace}\" workflow \"${workflow.name}\" has a timer without a name or configKey.`);\n\t\t\t}\n\t\t\tif (timerNames.has(timer.name)) {\n\t\t\t\tthrow new Error(`Module \"${module.namespace}\" workflow \"${workflow.name}\" declares duplicate timer \"${timer.name}\".`);\n\t\t\t}\n\t\t\ttimerNames.add(timer.name);\n\t\t}\n\t\tconst steps = new Set<string>();\n\t\tfor (const compensation of workflow.compensations ?? []) {\n\t\t\tif (!compensation.step.trim()) {\n\t\t\t\tthrow new Error(`Module \"${module.namespace}\" workflow \"${workflow.name}\" has a compensation without a step.`);\n\t\t\t}\n\t\t\tif (steps.has(compensation.step)) {\n\t\t\t\tthrow new Error(`Module \"${module.namespace}\" workflow \"${workflow.name}\" declares duplicate compensation for step \"${compensation.step}\".`);\n\t\t\t}\n\t\t\tsteps.add(compensation.step);\n\t\t\tconst compensatingAction = actionsById.get(compensation.actionId);\n\t\t\tif (!compensatingAction) {\n\t\t\t\tthrow new Error(`Module \"${module.namespace}\" workflow \"${workflow.name}\" compensates step \"${compensation.step}\" with unknown action \"${compensation.actionId}\".`);\n\t\t\t}\n\t\t\t// An unwind is retried like any other durable step, so a reversal that cannot be\n\t\t\t// safely repeated would turn one failure into a different kind of corruption.\n\t\t\tif (!compensatingAction.idempotent || compensatingAction.execution?.idempotency === \"prohibited\") {\n\t\t\t\tthrow new Error(`Module \"${module.namespace}\" workflow \"${workflow.name}\" compensates step \"${compensation.step}\" with non-idempotent action \"${compensation.actionId}\"; a reversal must be safely repeatable.`);\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction validateManifest(module: FabricModule<unknown>, context: ModuleValidationContext = {}): void {\n\tvalidateModuleNamespace(module.namespace);\n\n\tconst dependencies = (module.dependencies ?? []).map(getModuleDependencyNamespace);\n\tconst objectTypes = (module.objectTypes ?? []).map(getObjectTypeName);\n\tconst eventTypes = (module.eventTypes ?? []).map(getEventTypeName);\n\tif (module.capability) {\n\t\tif (!module.capability.displayName.trim() || !module.capability.description.trim()) {\n\t\t\tthrow new Error(`Module \"${module.namespace}\" capability requires displayName and description.`);\n\t\t}\n\t\tfor (const namespace of Object.keys(module.capability.extensions ?? {})) {\n\t\t\tif (!/^[a-z][a-z0-9.-]*\\.[a-z0-9.-]+\\/v[1-9][0-9]*$/.test(namespace)) {\n\t\t\t\tthrow new Error(`Module \"${module.namespace}\" capability has invalid extension namespace \"${namespace}\".`);\n\t\t\t}\n\t\t}\n\t\tfor (const port of module.capability.requirements?.ports ?? []) {\n\t\t\t// Dotted segments are permitted so a capability can require a port\n\t\t\t// defined outside this repository: an enterprise integrates hundreds\n\t\t\t// of external systems, and namespacing is what keeps two of them from\n\t\t\t// colliding on a name. Widening only, so existing names still parse.\n\t\t\tif (!/^[a-z][a-z0-9-]*(?:\\.[a-z0-9-]+)*$/.test(port.name)) throw new Error(`Module \"${module.namespace}\" capability has invalid port requirement \"${port.name}\".`);\n\t\t}\n\t\tvalidateCapabilityWorkflows(module, context);\n\t}\n\tfor (const eventType of module.eventTypes ?? []) if (typeof eventType !== \"string\" && eventType.schema) assertPortableJsonSchema(eventType.schema, `Event \"${eventType.eventType}\" schema`);\n\tfor (const action of module.actions ?? []) {\n\t\tif (action.execution?.idempotency === \"required\" && !action.idempotent) throw new Error(`Action \"${action.actionId}\" requires idempotency but is not declared idempotent.`);\n\t\tif (action.execution?.connectivity === \"offline-capturable\" && action.execution.idempotency === \"prohibited\") throw new Error(`Offline action \"${action.actionId}\" cannot prohibit idempotency.`);\n\t\tif (action.execution?.completionDeadlineMs !== undefined && !(typeof action.execution.completionDeadlineMs === \"number\" && action.execution.completionDeadlineMs > 0)) throw new Error(`Action \"${action.actionId}\" completionDeadlineMs must be a positive number of milliseconds.`);\n\t\tif (action.execution?.completion === \"immediate\" && action.execution.completionDeadlineMs !== undefined) throw new Error(`Immediate action \"${action.actionId}\" cannot declare a completion deadline; nothing external completes it.`);\n\t}\n\tfor (const view of module.views ?? []) if (view.usage?.collection?.filterSchema) assertPortableJsonSchema(view.usage.collection.filterSchema, `View \"${view.name}\" filter schema`);\n\n\tfor (const dependency of dependencies) {\n\t\tvalidateModuleNamespace(dependency);\n\t\tif (dependency === module.namespace) {\n\t\t\tthrow new Error(`Module \"${module.namespace}\" cannot depend on itself.`);\n\t\t}\n\t\tif (context.availableNamespaces && !context.availableNamespaces.has(dependency)) {\n\t\t\tthrow new Error(`Module \"${module.namespace}\" depends on missing module \"${dependency}\".`);\n\t\t}\n\t}\n\n\tvalidateIdentifierList(objectTypes, \"objectTypes\", module.namespace);\n\tvalidateIdentifierList(module.subjectTypes, \"subjectTypes\", module.namespace);\n\tvalidateIdentifierList(eventTypes, \"eventTypes\", module.namespace);\n\n\tfor (const objectType of objectTypes) {\n\t\tif (!/^[A-Z][a-zA-Z0-9]*$/.test(objectType)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Invalid object type: \"${objectType}\". Object types must be PascalCase alphanumeric.`,\n\t\t\t);\n\t\t}\n\t}\n\tfor (const objectType of module.objectTypes ?? []) {\n\t\tif (typeof objectType !== \"string\") {\n\t\t\tfor (const relation of objectType.relations ?? []) {\n\t\t\t\tconst targetNamespace = relation.target.slice(0, relation.target.indexOf(\".\"));\n\t\t\t\tif (targetNamespace !== module.namespace && !dependencies.includes(targetNamespace)) {\n\t\t\t\t\tthrow new Error(`Module \"${module.namespace}\" relation \"${relation.name}\" targets module \"${targetNamespace}\" without declaring it as a dependency.`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tvalidateObjectDefinition(objectType, module.namespace, context);\n\t}\n\n\tfor (const action of module.actions ?? []) {\n\t\tassertSurfaceDeclaration(action, `Action \"${action?.actionId ?? \"unknown\"}\"`);\n\t\tlet parameterSchema: unknown;\n\t\ttry { parameterSchema = (action.schema as { toJSONSchema?: () => unknown }).toJSONSchema?.(); } catch { parameterSchema = undefined; }\n\t\tif (parameterSchema !== undefined) assertPortableJsonSchema(parameterSchema, `Action \"${action.actionId}\" parameters`);\n\t\tlet resultSchema: unknown;\n\t\ttry { resultSchema = (action.resultSchema as { toJSONSchema?: () => unknown } | undefined)?.toJSONSchema?.(); } catch { resultSchema = undefined; }\n\t\tif (resultSchema !== undefined) assertPortableJsonSchema(resultSchema, `Action \"${action.actionId}\" result`);\n\t\tif (!/^[a-z][a-z0-9-]*\\.[a-z][a-z0-9_]*$/.test(action.actionId)) {\n\t\t\tthrow new Error(`Invalid action ID: ${action.actionId}`);\n\t\t}\n\n\t\tif (action.namespace !== module.namespace) {\n\t\t\tthrow new Error(\n\t\t\t\t`Action \"${action.actionId}\" declares namespace \"${action.namespace}\" ` +\n\t\t\t\t\t`but is registered by module \"${module.namespace}\".`,\n\t\t\t);\n\t\t}\n\n\t\tif (!action.actionId.startsWith(`${module.namespace}.`)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Action \"${action.actionId}\" must start with module namespace \"${module.namespace}.\"`,\n\t\t\t);\n\t\t}\n\n\t\tif (action.mutatesDomain && action.emitsEvents.length === 0) {\n\t\t\tthrow new Error(\n\t\t\t\t`Action \"${action.actionId}\" mutates domain but emits no events. ` +\n\t\t\t\t\t`Every mutating action must emit at least one AssetEvent.`,\n\t\t\t);\n\t\t}\n\n\t\tif (action.admitSubmission !== undefined && typeof action.admitSubmission !== \"function\") {\n\t\t\tthrow new Error(`Action \"${action.actionId}\" declares admitSubmission that is not a function.`);\n\t\t}\n\t}\n\n\tconst viewKeys = new Set<string>();\n\tfor (const view of module.views ?? []) {\n\t\tassertSurfaceDeclaration(view, `View \"${view?.name ?? \"unknown\"}\"`);\n\t\tif (!view.name.startsWith(`${module.namespace}/`) || !/^[a-z][a-z0-9-]*\\/[a-z][a-z0-9/_-]*$/.test(view.name)) {\n\t\t\tthrow new Error(`View \"${view.name}\" must start with module namespace \"${module.namespace}/\" and use lowercase path segments.`);\n\t\t}\n\t\tif (!view.version.trim()) throw new Error(`View \"${view.name}\" must declare a version.`);\n\t\tconst key = `${view.name}@${view.version}`;\n\t\tif (viewKeys.has(key)) throw new Error(`Module \"${module.namespace}\" has duplicate view contract \"${key}\".`);\n\t\tviewKeys.add(key);\n\t\tassertPortableJsonSchema(view.shape, `View \"${key}\" shape`);\n\t\tif (view.parameterSchema !== undefined) assertPortableJsonSchema(view.parameterSchema, `View \"${key}\" parameters`);\n\t\tif (!Number.isInteger(view.snapshotVersion) || view.snapshotVersion < 1) {\n\t\t\tthrow new Error(`View \"${key}\" snapshotVersion must be a positive integer.`);\n\t\t}\n\t\tif ((view.compatibleSnapshotVersions?.some((version) => version !== view.snapshotVersion) ?? false) && !view.upgradeSnapshot) {\n\t\t\tthrow new Error(`View \"${key}\" declares older compatible snapshots but no upgradeSnapshot function.`);\n\t\t}\n\t\tfor (const consumption of view.consumes) {\n\t\t\tconst isPlanned = context.plannedEventTypes?.has(consumption.eventType) ?? false;\n\t\t\tconst isModuleEvent = eventTypes.includes(consumption.eventType);\n\t\t\tif (!isPlanned && !isModuleEvent) {\n\t\t\t\tthrow new Error(`View \"${key}\" consumes unknown event type \"${consumption.eventType}\".`);\n\t\t\t}\n\t\t\tif (consumption.schemaVersions.length === 0 || consumption.schemaVersions.some((version) => !Number.isInteger(version) || version < 1)) {\n\t\t\t\tthrow new Error(`View \"${key}\" must declare positive consumed schema versions for \"${consumption.eventType}\".`);\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction sortModulesByDependency(\n\tmodules: FabricModule<unknown>[],\n\tregisteredNamespaces: ReadonlySet<string> = new Set(),\n): FabricModule<unknown>[] {\n\tconst modulesByNamespace = new Map<string, FabricModule<unknown>>();\n\n\tfor (const module of modules) {\n\t\tvalidateModuleNamespace(module.namespace);\n\t\tif (modulesByNamespace.has(module.namespace)) {\n\t\t\tthrow new Error(`Duplicate FabricModule namespace \"${module.namespace}\".`);\n\t\t}\n\t\tmodulesByNamespace.set(module.namespace, module);\n\t}\n\n\tconst sorted: FabricModule<unknown>[] = [];\n\tconst visiting = new Set<string>();\n\tconst visited = new Set<string>();\n\n\tfunction visit(module: FabricModule<unknown>, path: string[]): void {\n\t\tif (visited.has(module.namespace)) {\n\t\t\treturn;\n\t\t}\n\t\tif (visiting.has(module.namespace)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Cyclic Fabric module dependency detected: ${[...path, module.namespace].join(\" -> \")}`,\n\t\t\t);\n\t\t}\n\n\t\tvisiting.add(module.namespace);\n\t\tfor (const dependency of (module.dependencies ?? []).map(getModuleDependencyNamespace)) {\n\t\t\tconst dependencyModule = modulesByNamespace.get(dependency);\n\t\t\tif (!dependencyModule) {\n\t\t\t\tif (registeredNamespaces.has(dependency)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tthrow new Error(`Module \"${module.namespace}\" depends on missing module \"${dependency}\".`);\n\t\t\t}\n\t\t\tvisit(dependencyModule, [...path, module.namespace]);\n\t\t}\n\t\tvisiting.delete(module.namespace);\n\t\tvisited.add(module.namespace);\n\t\tsorted.push(module);\n\t}\n\n\tfor (const module of modules) {\n\t\tvisit(module, []);\n\t}\n\n\treturn sorted;\n}\n\nfunction assertAcyclicRelations(modules: FabricModule<unknown>[]): void {\n\tconst relationKinds = [\n\t\t{ label: \"owned containment\", include: (relation: ObjectRelationDefinition) => relation.semantics === \"owned\" },\n\t\t{ label: \"cascade-delete\", include: (relation: ObjectRelationDefinition) => relation.onTargetDelete === \"cascade\" },\n\t\t{ label: \"required-construction\", include: (relation: ObjectRelationDefinition) => relation.required === true },\n\t];\n\tfor (const kind of relationKinds) {\n\t\tconst edges = new Map<string, string[]>();\n\t\tfor (const module of modules) {\n\t\t\tfor (const objectType of module.objectTypes ?? []) {\n\t\t\t\tif (typeof objectType === \"string\") continue;\n\t\t\t\tconst source = qualifiedObjectType(module.namespace, objectType.type);\n\t\t\t\tedges.set(source, (objectType.relations ?? []).filter(kind.include).map((relation) => relation.target));\n\t\t\t}\n\t\t}\n\t\tconst visiting = new Set<string>();\n\t\tconst visited = new Set<string>();\n\t\tconst visit = (node: string, path: string[]): void => {\n\t\t\tif (visiting.has(node)) {\n\t\t\t\tthrow new Error(`${kind.label} relation cycle detected: ${[...path, node].join(\" -> \")}`);\n\t\t\t}\n\t\t\tif (visited.has(node)) return;\n\t\t\tvisiting.add(node);\n\t\t\tfor (const target of edges.get(node) ?? []) visit(target, [...path, node]);\n\t\t\tvisiting.delete(node);\n\t\t\tvisited.add(node);\n\t\t};\n\t\tfor (const node of edges.keys()) visit(node, []);\n\t}\n}\n\nexport function validateAndOrderFabricModules<TDb = unknown>(modules: FabricModule<TDb>[]): FabricModule<TDb>[] {\n\tconst availableNamespaces = new Set(modules.map((module) => module.namespace));\n\tconst plannedEventTypes = new Set(\n\t\tmodules.flatMap((module) => (module.eventTypes ?? []).map(getEventTypeName)),\n\t);\n\tfor (const eventType of createEventContractRegistry().eventTypes()) plannedEventTypes.add(eventType);\n\tconst availableObjectTypes = new Set([\n\t\t...modules.flatMap((module) =>\n\t\t\t(module.objectTypes ?? []).map((objectType) => qualifiedObjectType(module.namespace, getObjectTypeName(objectType))),\n\t\t),\n\t]);\n\n\tfor (const module of modules) {\n\t\tvalidateManifest(module as FabricModule<unknown>, { availableNamespaces, plannedEventTypes, availableObjectTypes });\n\t}\n\tassertAcyclicRelations(modules as FabricModule<unknown>[]);\n\treturn sortModulesByDependency(modules as FabricModule<unknown>[]) as FabricModule<TDb>[];\n}\n\n/** @deprecated Use createModuleRegistry(); registration is now explicit and instance-scoped. */\nexport function registerFabricModules<TDb = unknown>(modules: FabricModule<TDb>[]): FabricModule<TDb>[] {\n\treturn validateAndOrderFabricModules(modules);\n}\n\n/** @deprecated Use createModuleRegistry([module]); registration is now explicit and instance-scoped. */\nexport function registerFabricModule<TDb = unknown>(module: FabricModule<TDb>): void {\n\tvalidateAndOrderFabricModules([module]);\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { exportModuleManifest } from './chunk-
|
|
1
|
+
import { exportModuleManifest } from './chunk-PDN5DOLQ.js';
|
|
2
2
|
|
|
3
3
|
// certification/index.ts
|
|
4
4
|
var STRICT_EXECUTION_CONTRACT_PROFILE_ID = "fabric.execution-contract.strict";
|
|
@@ -94,5 +94,5 @@ function isManifest(subject) {
|
|
|
94
94
|
}
|
|
95
95
|
|
|
96
96
|
export { STRICT_EXECUTION_CONTRACT_PROFILE, STRICT_EXECUTION_CONTRACT_PROFILE_ID, executionContractProfile };
|
|
97
|
-
//# sourceMappingURL=chunk-
|
|
98
|
-
//# sourceMappingURL=chunk-
|
|
97
|
+
//# sourceMappingURL=chunk-EMSAFNPX.js.map
|
|
98
|
+
//# sourceMappingURL=chunk-EMSAFNPX.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../certification/index.ts"],"names":[],"mappings":";;;AA+CO,IAAM,oCAAA,GAAuC;AAGpD,SAAS,mBAAA,GAAqE;AAC7E,EAAA,OAAO;AAAA,IACN,CAAC,gCAAgB,IAAI,GAAA,CAAI,CAAC,iBAAA,EAAmB,oBAAoB,CAAC,CAAC,CAAA;AAAA,IACnE,CAAC,mCAAmB,IAAI,GAAA,CAAI,CAAC,SAAA,EAAW,WAAA,EAAa,MAAM,CAAC,CAAC,CAAA;AAAA,IAC7D,CAAC,+BAAe,IAAI,GAAA,CAAI,CAAC,UAAA,EAAY,WAAA,EAAa,YAAY,CAAC,CAAC,CAAA;AAAA,IAChE,CAAC,8BAAc,IAAI,GAAA,CAAI,CAAC,WAAA,EAAa,UAAA,EAAY,cAAc,CAAC,CAAC,CAAA;AAAA,IACjE,CAAC,+BAAe,IAAI,GAAA,CAAI,CAAC,mBAAA,EAAqB,8BAA8B,CAAC,CAAC;AAAA,GAC/E;AACD;AACA,IAAM,sBAAA,GAAyB,sBAA2B,IAAI,GAAA,CAAI,CAAC,QAAA,EAAU,UAAA,EAAY,cAAA,EAAgB,YAAY,CAAC,CAAA;AAE/G,SAAS,wBAAA,CAAyB,OAAA,GAA2C,EAAC,EAA6B;AACjH,EAAA,MAAM,EAAA,GAAK,QAAQ,EAAA,IAAM,oCAAA;AACzB,EAAA,MAAM,kBAAA,GAAqB,QAAQ,kBAAA,IAAsB,IAAA;AACzD,EAAA,MAAM,kBAAA,GAAqB,IAAI,GAAA,CAA0B,OAAA,CAAQ,sBAAsB,CAAC,UAAA,EAAY,cAAc,CAAC,CAAA;AACnH,EAAA,MAAM,aAAa,mBAAA,EAAoB;AACvC,EAAA,MAAM,gBAAgB,sBAAA,EAAuB;AAC7C,EAAA,MAAM,QAAA,GAAW,CAAC,QAAA,KAAyD;AAC1E,IAAA,MAAM,WAAuC,EAAC;AAC9C,IAAA,KAAA,MAAW,MAAA,IAAU,SAAS,OAAA,EAAS;AACtC,MAAA,MAAM,WAAW,MAAA,CAAO,SAAA;AACxB,MAAA,IAAI,CAAC,QAAA,EAAU;AACd,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,UACb,IAAA,EAAM,4BAAA;AAAA,UACN,UAAU,MAAA,CAAO,QAAA;AAAA,UACjB,OAAA,EAAS,CAAA,QAAA,EAAW,MAAA,CAAO,QAAQ,CAAA,uHAAA;AAAA,SACnC,CAAA;AACD,QAAA;AAAA,MACD;AAIA,MAAA,IAAI,QAAA,GAAW,IAAA;AACf,MAAA,KAAA,MAAW,CAAC,SAAA,EAAW,SAAS,CAAA,IAAK,UAAA,EAAY;AAChD,QAAA,MAAM,KAAA,GAAS,SAAgD,SAAS,CAAA;AACxE,QAAA,IAAI,CAAC,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA,EAAG;AAC1B,UAAA,QAAA,GAAW,KAAA;AACX,UAAA,QAAA,CAAS,IAAA,CAAK;AAAA,YACb,IAAA,EAAM,6BAAA;AAAA,YACN,UAAU,MAAA,CAAO,QAAA;AAAA,YACjB,SAAS,CAAA,QAAA,EAAW,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK,UAAU,MAAA,GAAY,aAAA,GAAgB,CAAA,mBAAA,CAAqB,CAAA,CAAA,EAAI,SAAS,CAAA,EAAG,KAAA,KAAU,MAAA,GAAY,EAAA,GAAK,KAAK,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA,CAAG,0BAA0B,CAAC,GAAG,SAAS,CAAA,CAAE,IAAI,CAAC,IAAA,KAAS,CAAA,CAAA,EAAI,MAAA,CAAO,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,WACzP,CAAA;AAAA,QACF;AAAA,MACD;AACA,MAAA,IAAI,QAAA,CAAS,gBAAgB,MAAA,IAAa,CAAC,cAAc,GAAA,CAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACnF,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,UACb,IAAA,EAAM,6BAAA;AAAA,UACN,UAAU,MAAA,CAAO,QAAA;AAAA,UACjB,OAAA,EAAS,WAAW,MAAA,CAAO,QAAQ,sCAAsC,MAAA,CAAO,QAAA,CAAS,WAAW,CAAC,CAAA,wBAAA,EAA2B,CAAC,GAAG,aAAa,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,KAAS,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,SACxL,CAAA;AAAA,MACF;AACA,MAAA,IAAI,CAAC,QAAA,EAAU;AACf,MAAA,IAAI,QAAA,CAAS,UAAA,KAAe,WAAA,IAAe,QAAA,CAAS,yBAAyB,MAAA,EAAW;AACvF,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,UACb,IAAA,EAAM,gCAAA;AAAA,UACN,UAAU,MAAA,CAAO,QAAA;AAAA,UACjB,OAAA,EAAS,CAAA,QAAA,EAAW,MAAA,CAAO,QAAQ,CAAA,0FAAA;AAAA,SACnC,CAAA;AAAA,MACF;AACA,MAAA,IAAI,kBAAA,IAAsB,QAAA,CAAS,WAAA,KAAgB,MAAA,EAAW;AAC7D,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,UACb,IAAA,EAAM,qBAAA;AAAA,UACN,UAAU,MAAA,CAAO,QAAA;AAAA,UACjB,OAAA,EAAS,CAAA,QAAA,EAAW,MAAA,CAAO,QAAQ,CAAA,yGAAA;AAAA,SACnC,CAAA;AAAA,MACF;AACA,MAAA,IAAI,kBAAA,CAAmB,GAAA,CAAI,QAAA,CAAS,UAAU,CAAA,IAAK,EAAE,OAAO,QAAA,CAAS,oBAAA,KAAyB,QAAA,IAAY,QAAA,CAAS,oBAAA,GAAuB,CAAA,CAAA,EAAI;AAC7I,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,UACb,IAAA,EAAM,6BAAA;AAAA,UACN,UAAU,MAAA,CAAO,QAAA;AAAA,UACjB,SAAS,CAAA,QAAA,EAAW,MAAA,CAAO,QAAQ,CAAA,WAAA,EAAc,SAAS,UAAU,CAAA,4FAAA;AAAA,SACpE,CAAA;AAAA,MACF;AAAA,IACD;AACA,IAAA,OAAO,QAAA;AAAA,EACR,CAAA;AACA,EAAA,OAAO;AAAA,IACN,EAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAO,OAAA,EAAS;AACf,MAAA,MAAM,WAAW,UAAA,CAAW,OAAO,CAAA,GAAI,OAAA,GAAU,qBAAqB,OAAO,CAAA;AAC7E,MAAA,MAAM,QAAA,GAAW,SAAS,QAAQ,CAAA;AAClC,MAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACxB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,EAAE,CAAA,cAAA,EAAiB,SAAS,SAAS,CAAA;AAAA,EAAO,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,KAAY,CAAA,EAAA,EAAK,OAAA,CAAQ,OAAO,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,MAC1J;AAAA,IACD,CAAA;AAAA,IACA,OAAA,EAAS,EAAE,EAAA,EAAI,QAAA,EAAU,QAAA;AAAS,GACnC;AACD;AAGO,IAAM,oCAA8D,wBAAA;AAE3E,SAAS,WAAW,OAAA,EAA4E;AAC/F,EAAA,OAAO,OAAQ,OAAA,CAA2B,eAAA,KAAoB,YAAY,KAAA,CAAM,OAAA,CAAS,QAA2B,OAAO,CAAA;AAC5H","file":"chunk-UYCQV65U.js","sourcesContent":["import type { ActionCompletionMode } from \"../actions\";\nimport { exportModuleManifest, type ModuleManifest } from \"../manifest\";\nimport type { FabricModule } from \"../modules\";\n\n// ── Execution-contract certification ────────────────────────────────────────\n//\n// The base types keep the execution contract optional, because making it\n// mandatory is a break for every existing manifest. A deployment that wants\n// the guarantee applies a profile at certification instead: every governed\n// action declares all six dimensions, and any action that hands work to an\n// external system says how long it may wait. The profile is a seam a\n// vertical applies, not content the platform assumes.\n\nexport type ExecutionContractFindingCode =\n\t| \"missing_execution_contract\"\n\t| \"invalid_execution_dimension\"\n\t| \"missing_sensitivity\"\n\t| \"missing_completion_deadline\"\n\t| \"unexpected_completion_deadline\";\n\nexport interface ExecutionContractFinding {\n\tcode: ExecutionContractFindingCode;\n\tactionId: string;\n\tmessage: string;\n}\n\nexport interface ExecutionContractProfileOptions {\n\t/** Adapter and profile id. Defaults to the strict profile's id. */\n\tid?: string;\n\t/** Require `sensitivity`, which the base contract leaves optional. Defaults to true. */\n\trequireSensitivity?: boolean;\n\t/**\n\t * Completion modes that must declare `completionDeadlineMs`. Defaults to\n\t * both modes that hand work off, since without a deadline nothing sweeps a\n\t * callback that never comes.\n\t */\n\trequireDeadlineFor?: readonly ActionCompletionMode[];\n}\n\nexport interface ExecutionContractProfile {\n\treadonly id: string;\n\tvalidate(manifest: ModuleManifest): ExecutionContractFinding[];\n\tassert(subject: FabricModule<unknown> | ModuleManifest): void;\n\t/** For certification tooling: the compiler's conformance adapter shape. */\n\treadonly adapter: { id: string; evaluate(manifest: ModuleManifest): ExecutionContractFinding[] };\n}\n\nexport const STRICT_EXECUTION_CONTRACT_PROFILE_ID = \"fabric.execution-contract.strict\";\n\n/** The permitted values of each required dimension, mirrored from the action types. */\nfunction permittedDimensions(): ReadonlyArray<[string, ReadonlySet<unknown>]> {\n\treturn [\n\t\t[\"connectivity\", new Set([\"online-required\", \"offline-capturable\"])],\n\t\t[\"authorityMoment\", new Set([\"capture\", \"execution\", \"both\"])],\n\t\t[\"idempotency\", new Set([\"required\", \"supported\", \"prohibited\"])],\n\t\t[\"completion\", new Set([\"immediate\", \"accepted\", \"long-running\"])],\n\t\t[\"consistency\", new Set([\"authoritative-now\", \"provisional-until-reconciled\"])],\n\t];\n}\nconst permittedSensitivities = (): ReadonlySet<string> => new Set([\"public\", \"internal\", \"confidential\", \"restricted\"]);\n\nexport function executionContractProfile(options: ExecutionContractProfileOptions = {}): ExecutionContractProfile {\n\tconst id = options.id ?? STRICT_EXECUTION_CONTRACT_PROFILE_ID;\n\tconst requireSensitivity = options.requireSensitivity ?? true;\n\tconst requireDeadlineFor = new Set<ActionCompletionMode>(options.requireDeadlineFor ?? [\"accepted\", \"long-running\"]);\n\tconst dimensions = permittedDimensions();\n\tconst sensitivities = permittedSensitivities();\n\tconst validate = (manifest: ModuleManifest): ExecutionContractFinding[] => {\n\t\tconst findings: ExecutionContractFinding[] = [];\n\t\tfor (const action of manifest.actions) {\n\t\t\tconst contract = action.execution;\n\t\t\tif (!contract) {\n\t\t\t\tfindings.push({\n\t\t\t\t\tcode: \"missing_execution_contract\",\n\t\t\t\t\tactionId: action.actionId,\n\t\t\t\t\tmessage: `Action \"${action.actionId}\" declares no execution contract; connectivity, authorityMoment, idempotency, completion, and consistency are required.`,\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// The contract's presence proves nothing about its content: a manifest\n\t\t\t// reaches certification without passing through the registry, so each\n\t\t\t// dimension is checked against its permitted values here.\n\t\t\tlet complete = true;\n\t\t\tfor (const [dimension, permitted] of dimensions) {\n\t\t\t\tconst value = (contract as unknown as Record<string, unknown>)[dimension];\n\t\t\t\tif (!permitted.has(value)) {\n\t\t\t\t\tcomplete = false;\n\t\t\t\t\tfindings.push({\n\t\t\t\t\t\tcode: \"invalid_execution_dimension\",\n\t\t\t\t\t\tactionId: action.actionId,\n\t\t\t\t\t\tmessage: `Action \"${action.actionId}\" ${value === undefined ? \"declares no\" : `declares an unknown`} ${dimension}${value === undefined ? \"\" : ` \"${String(value)}\"`}; permitted values are ${[...permitted].map((item) => `\"${String(item)}\"`).join(\", \")}.`,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (contract.sensitivity !== undefined && !sensitivities.has(contract.sensitivity)) {\n\t\t\t\tfindings.push({\n\t\t\t\t\tcode: \"invalid_execution_dimension\",\n\t\t\t\t\tactionId: action.actionId,\n\t\t\t\t\tmessage: `Action \"${action.actionId}\" declares an unknown sensitivity \"${String(contract.sensitivity)}\"; permitted values are ${[...sensitivities].map((item) => `\"${item}\"`).join(\", \")}.`,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (!complete) continue;\n\t\t\tif (contract.completion === \"immediate\" && contract.completionDeadlineMs !== undefined) {\n\t\t\t\tfindings.push({\n\t\t\t\t\tcode: \"unexpected_completion_deadline\",\n\t\t\t\t\tactionId: action.actionId,\n\t\t\t\t\tmessage: `Action \"${action.actionId}\" declares immediate completion and a completionDeadlineMs; nothing external completes it.`,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (requireSensitivity && contract.sensitivity === undefined) {\n\t\t\t\tfindings.push({\n\t\t\t\t\tcode: \"missing_sensitivity\",\n\t\t\t\t\tactionId: action.actionId,\n\t\t\t\t\tmessage: `Action \"${action.actionId}\" declares no sensitivity; say whether its durable data is public, internal, confidential, or restricted.`,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (requireDeadlineFor.has(contract.completion) && !(typeof contract.completionDeadlineMs === \"number\" && contract.completionDeadlineMs > 0)) {\n\t\t\t\tfindings.push({\n\t\t\t\t\tcode: \"missing_completion_deadline\",\n\t\t\t\t\tactionId: action.actionId,\n\t\t\t\t\tmessage: `Action \"${action.actionId}\" declares ${contract.completion} completion and no completionDeadlineMs; a callback that never comes would never be noticed.`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\treturn findings;\n\t};\n\treturn {\n\t\tid,\n\t\tvalidate,\n\t\tassert(subject) {\n\t\t\tconst manifest = isManifest(subject) ? subject : exportModuleManifest(subject);\n\t\t\tconst findings = validate(manifest);\n\t\t\tif (findings.length > 0) {\n\t\t\t\tthrow new Error(`Execution-contract profile \"${id}\" failed for \"${manifest.namespace}\":\\n${findings.map((finding) => `- ${finding.message}`).join(\"\\n\")}`);\n\t\t\t}\n\t\t},\n\t\tadapter: { id, evaluate: validate },\n\t};\n}\n\n/** All six dimensions on every action, and a deadline wherever work is handed off. */\nexport const STRICT_EXECUTION_CONTRACT_PROFILE: ExecutionContractProfile = executionContractProfile();\n\nfunction isManifest(subject: FabricModule<unknown> | ModuleManifest): subject is ModuleManifest {\n\treturn typeof (subject as ModuleManifest).manifestVersion === \"number\" && Array.isArray((subject as ModuleManifest).actions);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../certification/index.ts"],"names":[],"mappings":"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","file":"chunk-EMSAFNPX.js","sourcesContent":["import type { ActionCompletionMode } from \"../actions\";\nimport { exportModuleManifest, type ModuleManifest } from \"../manifest\";\nimport type { FabricModule } from \"../modules\";\n\n// ── Execution-contract certification ────────────────────────────────────────\n//\n// The base types keep the execution contract optional, because making it\n// mandatory is a break for every existing manifest. A deployment that wants\n// the guarantee applies a profile at certification instead: every governed\n// action declares all six dimensions, and any action that hands work to an\n// external system says how long it may wait. The profile is a seam a\n// vertical applies, not content the platform assumes.\n\nexport type ExecutionContractFindingCode =\n\t| \"missing_execution_contract\"\n\t| \"invalid_execution_dimension\"\n\t| \"missing_sensitivity\"\n\t| \"missing_completion_deadline\"\n\t| \"unexpected_completion_deadline\";\n\nexport interface ExecutionContractFinding {\n\tcode: ExecutionContractFindingCode;\n\tactionId: string;\n\tmessage: string;\n}\n\nexport interface ExecutionContractProfileOptions {\n\t/** Adapter and profile id. Defaults to the strict profile's id. */\n\tid?: string;\n\t/** Require `sensitivity`, which the base contract leaves optional. Defaults to true. */\n\trequireSensitivity?: boolean;\n\t/**\n\t * Completion modes that must declare `completionDeadlineMs`. Defaults to\n\t * both modes that hand work off, since without a deadline nothing sweeps a\n\t * callback that never comes.\n\t */\n\trequireDeadlineFor?: readonly ActionCompletionMode[];\n}\n\nexport interface ExecutionContractProfile {\n\treadonly id: string;\n\tvalidate(manifest: ModuleManifest): ExecutionContractFinding[];\n\tassert(subject: FabricModule<unknown> | ModuleManifest): void;\n\t/** For certification tooling: the compiler's conformance adapter shape. */\n\treadonly adapter: { id: string; evaluate(manifest: ModuleManifest): ExecutionContractFinding[] };\n}\n\nexport const STRICT_EXECUTION_CONTRACT_PROFILE_ID = \"fabric.execution-contract.strict\";\n\n/** The permitted values of each required dimension, mirrored from the action types. */\nfunction permittedDimensions(): ReadonlyArray<[string, ReadonlySet<unknown>]> {\n\treturn [\n\t\t[\"connectivity\", new Set([\"online-required\", \"offline-capturable\"])],\n\t\t[\"authorityMoment\", new Set([\"capture\", \"execution\", \"both\"])],\n\t\t[\"idempotency\", new Set([\"required\", \"supported\", \"prohibited\"])],\n\t\t[\"completion\", new Set([\"immediate\", \"accepted\", \"long-running\"])],\n\t\t[\"consistency\", new Set([\"authoritative-now\", \"provisional-until-reconciled\"])],\n\t];\n}\nconst permittedSensitivities = (): ReadonlySet<string> => new Set([\"public\", \"internal\", \"confidential\", \"restricted\"]);\n\nexport function executionContractProfile(options: ExecutionContractProfileOptions = {}): ExecutionContractProfile {\n\tconst id = options.id ?? STRICT_EXECUTION_CONTRACT_PROFILE_ID;\n\tconst requireSensitivity = options.requireSensitivity ?? true;\n\tconst requireDeadlineFor = new Set<ActionCompletionMode>(options.requireDeadlineFor ?? [\"accepted\", \"long-running\"]);\n\tconst dimensions = permittedDimensions();\n\tconst sensitivities = permittedSensitivities();\n\tconst validate = (manifest: ModuleManifest): ExecutionContractFinding[] => {\n\t\tconst findings: ExecutionContractFinding[] = [];\n\t\tfor (const action of manifest.actions) {\n\t\t\tconst contract = action.execution;\n\t\t\tif (!contract) {\n\t\t\t\tfindings.push({\n\t\t\t\t\tcode: \"missing_execution_contract\",\n\t\t\t\t\tactionId: action.actionId,\n\t\t\t\t\tmessage: `Action \"${action.actionId}\" declares no execution contract; connectivity, authorityMoment, idempotency, completion, and consistency are required.`,\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// The contract's presence proves nothing about its content: a manifest\n\t\t\t// reaches certification without passing through the registry, so each\n\t\t\t// dimension is checked against its permitted values here.\n\t\t\tlet complete = true;\n\t\t\tfor (const [dimension, permitted] of dimensions) {\n\t\t\t\tconst value = (contract as unknown as Record<string, unknown>)[dimension];\n\t\t\t\tif (!permitted.has(value)) {\n\t\t\t\t\tcomplete = false;\n\t\t\t\t\tfindings.push({\n\t\t\t\t\t\tcode: \"invalid_execution_dimension\",\n\t\t\t\t\t\tactionId: action.actionId,\n\t\t\t\t\t\tmessage: `Action \"${action.actionId}\" ${value === undefined ? \"declares no\" : `declares an unknown`} ${dimension}${value === undefined ? \"\" : ` \"${String(value)}\"`}; permitted values are ${[...permitted].map((item) => `\"${String(item)}\"`).join(\", \")}.`,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (contract.sensitivity !== undefined && !sensitivities.has(contract.sensitivity)) {\n\t\t\t\tfindings.push({\n\t\t\t\t\tcode: \"invalid_execution_dimension\",\n\t\t\t\t\tactionId: action.actionId,\n\t\t\t\t\tmessage: `Action \"${action.actionId}\" declares an unknown sensitivity \"${String(contract.sensitivity)}\"; permitted values are ${[...sensitivities].map((item) => `\"${item}\"`).join(\", \")}.`,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (!complete) continue;\n\t\t\tif (contract.completion === \"immediate\" && contract.completionDeadlineMs !== undefined) {\n\t\t\t\tfindings.push({\n\t\t\t\t\tcode: \"unexpected_completion_deadline\",\n\t\t\t\t\tactionId: action.actionId,\n\t\t\t\t\tmessage: `Action \"${action.actionId}\" declares immediate completion and a completionDeadlineMs; nothing external completes it.`,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (requireSensitivity && contract.sensitivity === undefined) {\n\t\t\t\tfindings.push({\n\t\t\t\t\tcode: \"missing_sensitivity\",\n\t\t\t\t\tactionId: action.actionId,\n\t\t\t\t\tmessage: `Action \"${action.actionId}\" declares no sensitivity; say whether its durable data is public, internal, confidential, or restricted.`,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (requireDeadlineFor.has(contract.completion) && !(typeof contract.completionDeadlineMs === \"number\" && contract.completionDeadlineMs > 0)) {\n\t\t\t\tfindings.push({\n\t\t\t\t\tcode: \"missing_completion_deadline\",\n\t\t\t\t\tactionId: action.actionId,\n\t\t\t\t\tmessage: `Action \"${action.actionId}\" declares ${contract.completion} completion and no completionDeadlineMs; a callback that never comes would never be noticed.`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\treturn findings;\n\t};\n\treturn {\n\t\tid,\n\t\tvalidate,\n\t\tassert(subject) {\n\t\t\tconst manifest = isManifest(subject) ? subject : exportModuleManifest(subject);\n\t\t\tconst findings = validate(manifest);\n\t\t\tif (findings.length > 0) {\n\t\t\t\tthrow new Error(`Execution-contract profile \"${id}\" failed for \"${manifest.namespace}\":\\n${findings.map((finding) => `- ${finding.message}`).join(\"\\n\")}`);\n\t\t\t}\n\t\t},\n\t\tadapter: { id, evaluate: validate },\n\t};\n}\n\n/** All six dimensions on every action, and a deadline wherever work is handed off. */\nexport const STRICT_EXECUTION_CONTRACT_PROFILE: ExecutionContractProfile = executionContractProfile();\n\nfunction isManifest(subject: FabricModule<unknown> | ModuleManifest): subject is ModuleManifest {\n\treturn typeof (subject as ModuleManifest).manifestVersion === \"number\" && Array.isArray((subject as ModuleManifest).actions);\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AdapterRegistry } from './chunk-
|
|
1
|
+
import { AdapterRegistry } from './chunk-5FOCPRTR.js';
|
|
2
2
|
|
|
3
3
|
// testing/index.ts
|
|
4
4
|
function createFakeActionContext(options = {}) {
|
|
@@ -23,5 +23,5 @@ function createDeterministicIdFactory(prefix = "test") {
|
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
export { createDeterministicIdFactory, createFakeActionContext, createInMemoryAdapterRegistry };
|
|
26
|
-
//# sourceMappingURL=chunk-
|
|
27
|
-
//# sourceMappingURL=chunk-
|
|
26
|
+
//# sourceMappingURL=chunk-GFU7BGEJ.js.map
|
|
27
|
+
//# sourceMappingURL=chunk-GFU7BGEJ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../testing/index.ts"],"names":[],"mappings":";;;AAeO,SAAS,uBAAA,CACf,OAAA,GAAyC,EAAC,EACrB;AACrB,EAAA,OAAO;AAAA,IACN,kBAAA,EAAoB,QAAQ,kBAAA,IAAsB,UAAA;AAAA,IAClD,QAAA,EAAU,QAAQ,QAAA,IAAY,aAAA;AAAA,IAC9B,OAAA,EAAS,QAAQ,OAAA,IAAW,YAAA;AAAA,IAC5B,OAAA,EAAS,QAAQ,OAAA,IAAW,YAAA;AAAA,IAC5B,SAAA,EAAW,QAAQ,SAAA,IAAa,QAAA;AAAA,IAChC,aAAA,EAAe,QAAQ,aAAA,IAAiB,WAAA;AAAA,IACxC,aAAa,OAAA,CAAQ,WAAA;AAAA,IACrB,EAAA,EAAI,OAAA,CAAQ,EAAA,IAAO,EAAC;AAAA,IACpB,QAAA,EAAU,OAAA,CAAQ,QAAA,IAAY;AAAC,GAChC;AACD;AAEO,SAAS,6BAAA,GAAiD;AAChE,EAAA,OAAO,IAAI,eAAA,EAAgB;AAC5B;AAEO,SAAS,4BAAA,CAA6B,SAAS,MAAA,EAAsB;AAC3E,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,OAAO,MAAM,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,MAAA,CAAO,EAAE,QAAQ,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAC9D","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../testing/index.ts"],"names":[],"mappings":";;;AAeO,SAAS,uBAAA,CACf,OAAA,GAAyC,EAAC,EACrB;AACrB,EAAA,OAAO;AAAA,IACN,kBAAA,EAAoB,QAAQ,kBAAA,IAAsB,UAAA;AAAA,IAClD,QAAA,EAAU,QAAQ,QAAA,IAAY,aAAA;AAAA,IAC9B,OAAA,EAAS,QAAQ,OAAA,IAAW,YAAA;AAAA,IAC5B,OAAA,EAAS,QAAQ,OAAA,IAAW,YAAA;AAAA,IAC5B,SAAA,EAAW,QAAQ,SAAA,IAAa,QAAA;AAAA,IAChC,aAAA,EAAe,QAAQ,aAAA,IAAiB,WAAA;AAAA,IACxC,aAAa,OAAA,CAAQ,WAAA;AAAA,IACrB,EAAA,EAAI,OAAA,CAAQ,EAAA,IAAO,EAAC;AAAA,IACpB,QAAA,EAAU,OAAA,CAAQ,QAAA,IAAY;AAAC,GAChC;AACD;AAEO,SAAS,6BAAA,GAAiD;AAChE,EAAA,OAAO,IAAI,eAAA,EAAgB;AAC5B;AAEO,SAAS,4BAAA,CAA6B,SAAS,MAAA,EAAsB;AAC3E,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,OAAO,MAAM,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,MAAA,CAAO,EAAE,QAAQ,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAC9D","file":"chunk-GFU7BGEJ.js","sourcesContent":["import { AdapterRegistry } from \"../adapters\";\nimport type { ActionContext, ActorType } from \"../actions\";\n\nexport interface FakeActionContextOptions<TDb = Record<string, never>> {\n\tactionInvocationId?: string;\n\ttenantId?: string;\n\tspaceId?: string;\n\tactorId?: string;\n\tactorType?: ActorType;\n\tcorrelationId?: string;\n\tcausationId?: string;\n\tdb?: TDb;\n\tservices?: Record<string, unknown>;\n}\n\nexport function createFakeActionContext<TDb = Record<string, never>>(\n\toptions: FakeActionContextOptions<TDb> = {},\n): ActionContext<TDb> {\n\treturn {\n\t\tactionInvocationId: options.actionInvocationId ?? \"act_test\",\n\t\ttenantId: options.tenantId ?? \"tenant-test\",\n\t\tspaceId: options.spaceId ?? \"space-test\",\n\t\tactorId: options.actorId ?? \"actor-test\",\n\t\tactorType: options.actorType ?? \"system\",\n\t\tcorrelationId: options.correlationId ?? \"corr-test\",\n\t\tcausationId: options.causationId,\n\t\tdb: options.db ?? ({} as TDb),\n\t\tservices: options.services ?? {},\n\t};\n}\n\nexport function createInMemoryAdapterRegistry(): AdapterRegistry {\n\treturn new AdapterRegistry();\n}\n\nexport function createDeterministicIdFactory(prefix = \"test\"): () => string {\n\tlet sequence = 0;\n\treturn () => `${prefix}_${String(++sequence).padStart(6, \"0\")}`;\n}\n"]}
|
|
@@ -145,13 +145,21 @@ async function evaluatePolicyDefinitions(policies, ctx) {
|
|
|
145
145
|
return outcomes;
|
|
146
146
|
}
|
|
147
147
|
async function evaluatePolicyDefinition(policy, ctx) {
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
148
|
+
const authority = policy.authority ? { ...policy.authority } : void 0;
|
|
149
|
+
const outcome = policy.kind === "data" ? await evaluateDataPolicy(policy, ctx) : policy.kind === "code" ? await evaluateCodePolicy(policy, ctx) : await evaluateHybridPolicy(policy, ctx);
|
|
150
|
+
if (!authority) return outcome;
|
|
151
|
+
return {
|
|
152
|
+
...outcome,
|
|
153
|
+
dispatchEvidence: {
|
|
154
|
+
...outcome.dispatchEvidence ?? {
|
|
155
|
+
policyKind: policy.kind,
|
|
156
|
+
policyId: policy.policyId,
|
|
157
|
+
policyVersion: policy.policyVersion,
|
|
158
|
+
dispatchPath: []
|
|
159
|
+
},
|
|
160
|
+
authority
|
|
161
|
+
}
|
|
162
|
+
};
|
|
155
163
|
}
|
|
156
164
|
async function evaluateCodePolicy(policy, ctx) {
|
|
157
165
|
const codeEvaluatorPolicyId = policy.codeEvaluatorPolicyId ?? policy.policyId;
|
|
@@ -648,5 +656,5 @@ function aggregatePolicyOutcomes(outcomes) {
|
|
|
648
656
|
}
|
|
649
657
|
|
|
650
658
|
export { aggregatePolicyOutcomes, assertPolicyId, createPolicyRegistry, evaluatePolicyDefinition, evaluatePolicyDefinitions, evaluateRegisteredPolicies, validateDataPolicyDefinition, validatePolicyGuidance };
|
|
651
|
-
//# sourceMappingURL=chunk-
|
|
652
|
-
//# sourceMappingURL=chunk-
|
|
659
|
+
//# sourceMappingURL=chunk-GU3LZWJD.js.map
|
|
660
|
+
//# sourceMappingURL=chunk-GU3LZWJD.js.map
|