@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":["../policies/index.ts"],"names":["result","passed"],"mappings":"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","file":"chunk-GU3LZWJD.js","sourcesContent":["import type { ActionId, ActorType, FabricRuntimeServices } from \"../actions\";\n\nexport type PolicyEvaluationResult = \"pass\" | \"warn\" | \"block\";\n\nexport type PolicyKind = \"code\" | \"data\" | \"hybrid\";\n\nexport type PolicyId = `${string}.v${number}`;\n\nexport type PolicyEvaluationMode = \"preview\" | \"execute\";\n\nexport function assertPolicyId(policyId: string): asserts policyId is PolicyId {\n\tif (!/^[a-z][a-z0-9_-]*(\\.[a-z][a-z0-9_-]*)*\\.v[0-9]+$/.test(policyId)) {\n\t\tthrow new Error(`Invalid policy ID: ${policyId}`);\n\t}\n}\n\nexport interface PolicyContext<TDb = unknown> {\n\ttenantId: string;\n\tspaceId: string;\n\tactionInvocationId: string;\n\tactionId: string;\n\t/** Authenticated actor identity supplied by the host. Omitted only by legacy hosts and previews. */\n\tactorId?: string;\n\tactorType?: ActorType;\n\tparameters: unknown;\n\tdb: TDb;\n\tnow?: Date;\n\tmode?: PolicyEvaluationMode;\n\t/**\n\t * Optional runtime services bag, mirroring {@link FabricRuntimeServices} on\n\t * `ActionContext`. Lets the host inject dependencies (HTTP clients, secret\n\t * managers, external policy engines such as OPA, feature flags, etc.) that\n\t * a code policy evaluator may need without resorting to module-level\n\t * globals. The shape is opaque to the platform — adapters narrow it.\n\t */\n\tservices?: FabricRuntimeServices;\n\t/** Explicit code-policy catalog for this runtime; absence fails closed. */\n\tresolveCodePolicy?: (policyId: PolicyId) => PolicyEvaluator | undefined;\n}\n\nexport interface PolicyFact {\n\tname: string;\n\tvalue: unknown;\n\tlabel?: string;\n}\n\nexport type PolicyCorrectiveActionKind = \"invoke_action\" | \"navigate\" | \"manual\";\n\nexport interface PolicyCorrectiveActionBase {\n\tkind: PolicyCorrectiveActionKind;\n\tlabel: string;\n\tdescription?: string;\n\trequiresRole?: string[];\n\trequiresConfirmation?: boolean;\n}\n\nexport interface PolicyInvokeActionCorrectiveAction extends PolicyCorrectiveActionBase {\n\tkind: \"invoke_action\";\n\tactionId: ActionId;\n\tparameters?: Record<string, unknown>;\n}\n\nexport interface PolicyNavigateCorrectiveAction extends PolicyCorrectiveActionBase {\n\tkind: \"navigate\";\n\troute?: string;\n\ttarget?: {\n\t\tsurface?: string;\n\t\ttab?: string;\n\t\tfield?: string;\n\t};\n}\n\nexport interface PolicyManualCorrectiveAction extends PolicyCorrectiveActionBase {\n\tkind: \"manual\";\n}\n\nexport type PolicyCorrectiveAction =\n\t| PolicyInvokeActionCorrectiveAction\n\t| PolicyNavigateCorrectiveAction\n\t| PolicyManualCorrectiveAction;\n\nexport interface PolicyGuidance {\n\tsummary?: string;\n\tfactsUsed: PolicyFact[];\n\tcorrectiveActions: PolicyCorrectiveAction[];\n}\n\nexport interface PolicyGuidanceValidationResult {\n\tvalid: boolean;\n\terrors: string[];\n}\n\nexport function validatePolicyGuidance(guidance: unknown): PolicyGuidanceValidationResult {\n\tconst errors: string[] = [];\n\n\tif (!isPlainRecord(guidance)) {\n\t\treturn { valid: false, errors: [\"guidance must be an object\"] };\n\t}\n\n\tif (guidance.summary !== undefined && typeof guidance.summary !== \"string\") {\n\t\terrors.push(\"guidance.summary must be a string when present\");\n\t}\n\n\tif (!Array.isArray(guidance.factsUsed)) {\n\t\terrors.push(\"guidance.factsUsed must be an array\");\n\t} else {\n\t\tguidance.factsUsed.forEach((fact, index) => {\n\t\t\tif (!isPlainRecord(fact)) {\n\t\t\t\terrors.push(`guidance.factsUsed[${index}] must be an object`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (typeof fact.name !== \"string\" || fact.name.length === 0) {\n\t\t\t\terrors.push(`guidance.factsUsed[${index}].name must be a non-empty string`);\n\t\t\t}\n\t\t\tif (fact.label !== undefined && typeof fact.label !== \"string\") {\n\t\t\t\terrors.push(`guidance.factsUsed[${index}].label must be a string when present`);\n\t\t\t}\n\t\t});\n\t}\n\n\tif (!Array.isArray(guidance.correctiveActions)) {\n\t\terrors.push(\"guidance.correctiveActions must be an array\");\n\t} else {\n\t\tguidance.correctiveActions.forEach((action, index) => {\n\t\t\terrors.push(...validatePolicyCorrectiveAction(action, index));\n\t\t});\n\t}\n\n\treturn { valid: errors.length === 0, errors };\n}\n\nfunction validatePolicyCorrectiveAction(action: unknown, index: number): string[] {\n\tconst errors: string[] = [];\n\tconst prefix = `guidance.correctiveActions[${index}]`;\n\n\tif (!isPlainRecord(action)) {\n\t\treturn [`${prefix} must be an object`];\n\t}\n\n\tif (\n\t\taction.kind !== \"invoke_action\" &&\n\t\taction.kind !== \"navigate\" &&\n\t\taction.kind !== \"manual\"\n\t) {\n\t\terrors.push(`${prefix}.kind must be \"invoke_action\" | \"navigate\" | \"manual\"`);\n\t}\n\tif (typeof action.label !== \"string\" || action.label.length === 0) {\n\t\terrors.push(`${prefix}.label must be a non-empty string`);\n\t}\n\tif (action.description !== undefined && typeof action.description !== \"string\") {\n\t\terrors.push(`${prefix}.description must be a string when present`);\n\t}\n\tif (action.requiresConfirmation !== undefined && typeof action.requiresConfirmation !== \"boolean\") {\n\t\terrors.push(`${prefix}.requiresConfirmation must be a boolean when present`);\n\t}\n\tif (action.requiresRole !== undefined) {\n\t\tif (!Array.isArray(action.requiresRole)) {\n\t\t\terrors.push(`${prefix}.requiresRole must be an array when present`);\n\t\t} else if (action.requiresRole.some((role) => typeof role !== \"string\" || role.length === 0)) {\n\t\t\terrors.push(`${prefix}.requiresRole must contain only non-empty strings`);\n\t\t}\n\t}\n\n\tif (action.kind === \"invoke_action\") {\n\t\tif (typeof action.actionId !== \"string\" || action.actionId.length === 0) {\n\t\t\terrors.push(`${prefix}.actionId must be a non-empty string for invoke_action`);\n\t\t}\n\t\tif (action.parameters !== undefined && !isPlainRecord(action.parameters)) {\n\t\t\terrors.push(`${prefix}.parameters must be an object when present`);\n\t\t}\n\t}\n\n\tif (action.kind === \"navigate\") {\n\t\tif (action.route !== undefined && typeof action.route !== \"string\") {\n\t\t\terrors.push(`${prefix}.route must be a string when present`);\n\t\t}\n\t\tif (action.target !== undefined && !isPlainRecord(action.target)) {\n\t\t\terrors.push(`${prefix}.target must be an object when present`);\n\t\t}\n\t}\n\n\treturn errors;\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n\treturn value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nexport interface PolicyOutcome {\n\tpolicyId: PolicyId;\n\tpolicyVersion: number;\n\tpolicyKind?: PolicyKind;\n\tresult: PolicyEvaluationResult;\n\treason?: string;\n\tguidance?: PolicyGuidance;\n\tmetadata?: Record<string, unknown>;\n\tdispatchEvidence?: PolicyDispatchEvidence;\n}\n\nexport interface PolicyEvaluator<TDb = unknown> {\n\tpolicyId: PolicyId;\n\tversion: number;\n\tkind?: Extract<PolicyKind, \"code\">;\n\tpreviewSafe?: boolean;\n\tevaluate: (ctx: PolicyContext<TDb>) => Promise<PolicyOutcome>;\n}\n\nexport type DataPolicySource = \"parameters\" | \"context\";\n\nexport type DataPolicyLiteral = string | number | boolean | null;\n\nexport type DataPolicyComparisonOperator =\n\t| \"exists\"\n\t| \"equals\"\n\t| \"notEquals\"\n\t| \"gt\"\n\t| \"gte\"\n\t| \"lt\"\n\t| \"lte\";\n\nexport interface DataPolicySourceReference {\n\tsource: DataPolicySource;\n\tpath: string;\n}\n\nexport type DataPolicyCondition =\n\t| {\n\t\t\tconditionId: string;\n\t\t\ttype: \"always\";\n\t\t\tresult: PolicyEvaluationResult;\n\t\t\treason?: string;\n\t\t}\n\t| {\n\t\t\tconditionId: string;\n\t\t\ttype: \"parameter\";\n\t\t\tpath: string;\n\t\t\toperator: DataPolicyComparisonOperator;\n\t\t\tvalue?: DataPolicyLiteral;\n\t\t\tonPass?: PolicyEvaluationResult;\n\t\t\tonFail?: PolicyEvaluationResult;\n\t\t\treason?: string;\n\t\t}\n\t| {\n\t\t\tconditionId: string;\n\t\t\ttype: \"comparison\";\n\t\t\tleft: DataPolicySourceReference;\n\t\t\toperator: DataPolicyComparisonOperator;\n\t\t\tvalue?: DataPolicyLiteral;\n\t\t\tonPass?: PolicyEvaluationResult;\n\t\t\tonFail?: PolicyEvaluationResult;\n\t\t\treason?: string;\n\t\t}\n\t| {\n\t\t\tconditionId: string;\n\t\t\ttype: \"all\" | \"any\";\n\t\t\tconditions: DataPolicyCondition[];\n\t\t\tonPass?: PolicyEvaluationResult;\n\t\t\tonFail?: PolicyEvaluationResult;\n\t\t\treason?: string;\n\t\t}\n\t| {\n\t\t\tconditionId: string;\n\t\t\ttype: \"not\";\n\t\t\tcondition: DataPolicyCondition;\n\t\t\tonPass?: PolicyEvaluationResult;\n\t\t\tonFail?: PolicyEvaluationResult;\n\t\t\treason?: string;\n\t\t};\n\nexport interface DataPolicyDefinition {\n\tconditions: DataPolicyCondition[];\n\tdefaultResult?: PolicyEvaluationResult;\n\treason?: string;\n}\n\nexport interface DataPolicyValidationResult {\n\tvalid: boolean;\n\terrors: string[];\n}\n\nconst DATA_POLICY_MAX_DEPTH = 5;\nconst DATA_POLICY_MAX_CONDITIONS_PER_NODE = 20;\nconst DATA_POLICY_MAX_TOTAL_CONDITIONS = 100;\nconst DATA_POLICY_MAX_PATH_SEGMENTS = 12;\nconst DATA_POLICY_MAX_STRING_LENGTH = 500;\n\nconst DATA_POLICY_CONTEXT_PATHS = Object.freeze([\n\t\"tenantId\",\n\t\"spaceId\",\n\t\"actionInvocationId\",\n\t\"actionId\",\n\t\"mode\",\n]);\n\nconst DATA_POLICY_COMPARISON_OPERATORS: readonly DataPolicyComparisonOperator[] = Object.freeze([\n\t\"exists\",\n\t\"equals\",\n\t\"notEquals\",\n\t\"gt\",\n\t\"gte\",\n\t\"lt\",\n\t\"lte\",\n]);\n\nconst POLICY_RESULTS: readonly PolicyEvaluationResult[] = Object.freeze([\"pass\", \"warn\", \"block\"]);\n\nexport interface PolicyFallbackDefinition {\n\tcodeEvaluatorPolicyId: PolicyId;\n\tonResults?: PolicyEvaluationResult[];\n\ttriggers?: PolicyFallbackTrigger[];\n\treason?: string;\n}\n\nexport type PolicyFallbackTrigger =\n\t| \"data_result\"\n\t| \"missing_data_definition\"\n\t| \"invalid_data_definition\";\n\nexport interface DataPolicyConditionResult {\n\tconditionId: string;\n\tpassed: boolean;\n\tresult: PolicyEvaluationResult;\n\treason?: string;\n}\n\n/**\n * Opaque, consumer-defined reference to the immutable policy authority or\n * snapshot a runtime policy definition was resolved from. Platform records it\n * in dispatch evidence and does not interpret it.\n */\nexport interface PolicyAuthorityReference {\n\tsnapshotId: string;\n\tcontentHash?: string;\n}\n\nexport interface RuntimePolicyDefinition {\n\tpolicyId: PolicyId;\n\tpolicyVersion: number;\n\tkind: PolicyKind;\n\t/** Snapshot/authority this definition came from; copied into dispatch evidence. */\n\tauthority?: PolicyAuthorityReference;\n\tdataDefinition?: DataPolicyDefinition;\n\tcodeEvaluatorPolicyId?: PolicyId;\n\tfallback?: PolicyFallbackDefinition;\n}\n\nexport interface PolicyDispatchEvidence {\n\tpolicyKind: PolicyKind;\n\tpolicyId?: PolicyId;\n\tpolicyVersion?: number;\n\t/** Snapshot/authority the evaluated definition was resolved from, when supplied. */\n\tauthority?: PolicyAuthorityReference;\n\tdispatchPath: Array<\"data\" | \"code\" | \"fallback\">;\n\tdata?: {\n\t\tdefinitionVersion: number;\n\t\tdefinitionStatus: \"evaluated\" | \"missing\" | \"invalid\";\n\t\tconditionResults: DataPolicyConditionResult[];\n\t\tvalidationErrors?: string[];\n\t};\n\tcode?: {\n\t\trequestedPolicyId?: PolicyId;\n\t\tpolicyId: PolicyId;\n\t\tversion?: number;\n\t\tregistered: boolean;\n\t\tskipped?: boolean;\n\t\tskipReason?: string;\n\t};\n\tfallback?: {\n\t\tused: boolean;\n\t\ttrigger: PolicyFallbackTrigger | \"not_triggered\";\n\t\treason: string;\n\t\tfromResult?: PolicyEvaluationResult;\n\t\tdefinitionVersion: number;\n\t\tcodeEvaluatorPolicyId: PolicyId;\n\t};\n\t/**\n\t * Provenance for the engine that produced this decision when a code\n\t * evaluator delegates to an external policy engine (OPA, Cedar, Cerbos,\n\t * Topaz, etc.). Fabric's `policyId` / `policyVersion` remain canonical for\n\t * audit; this block carries deployment provenance (decision path, bundle\n\t * revision, decision ID, input hash). Adapters populate it; the platform\n\t * keeps `metadata` open-ended so engine-specific typing can live in the\n\t * adapter package.\n\t */\n\tengine?: {\n\t\tname: string;\n\t\tversion?: string;\n\t\tmetadata?: Record<string, unknown>;\n\t};\n}\n\nexport interface PolicyRegistry {\n\tregister(evaluator: PolicyEvaluator): void;\n\tregisterIfMissing(evaluator: PolicyEvaluator): void;\n\tresolve(policyId: PolicyId): PolicyEvaluator | undefined;\n\tids(): PolicyId[];\n}\n\nexport function createPolicyRegistry(evaluators: readonly PolicyEvaluator[] = []): PolicyRegistry {\n\tconst policies = new Map<PolicyId, PolicyEvaluator>();\n\tconst register = (evaluator: PolicyEvaluator): void => {\n\t\tassertPolicyId(evaluator.policyId);\n\t\tconst existing = policies.get(evaluator.policyId);\n\t\tif (existing && existing !== evaluator) throw new Error(`Conflicting policy registration for \"${evaluator.policyId}\". A different evaluator is already registered.`);\n\t\tpolicies.set(evaluator.policyId, evaluator);\n\t};\n\tfor (const evaluator of evaluators) register(evaluator);\n\treturn {\n\t\tregister,\n\t\tregisterIfMissing(evaluator) {\n\t\t\tconst existing = policies.get(evaluator.policyId);\n\t\t\tif (!existing) register(evaluator);\n\t\t\telse if (existing !== evaluator) throw new Error(`Conflicting policy registration for \"${evaluator.policyId}\". A different evaluator is already registered.`);\n\t\t},\n\t\tresolve: (policyId) => policies.get(policyId),\n\t\tids: () => Array.from(policies.keys()),\n\t};\n}\n\nexport async function evaluateRegisteredPolicies(\n\tpolicyIds: PolicyId[],\n\tctx: PolicyContext,\n): Promise<PolicyOutcome[]> {\n\treturn evaluatePolicyDefinitions(\n\t\tpolicyIds.map((policyId) => ({\n\t\t\tpolicyId,\n\t\t\tpolicyVersion: parsePolicyVersion(policyId),\n\t\t\tkind: \"code\",\n\t\t\tcodeEvaluatorPolicyId: policyId,\n\t\t})),\n\t\tctx,\n\t);\n}\n\nexport async function evaluatePolicyDefinitions(\n\tpolicies: RuntimePolicyDefinition[],\n\tctx: PolicyContext,\n): Promise<PolicyOutcome[]> {\n\tconst outcomes: PolicyOutcome[] = [];\n\n\tfor (const policy of policies) {\n\t\tassertPolicyId(policy.policyId);\n\t\toutcomes.push(await evaluatePolicyDefinition(policy, ctx));\n\t}\n\n\treturn outcomes;\n}\n\nexport async function evaluatePolicyDefinition(\n\tpolicy: RuntimePolicyDefinition,\n\tctx: PolicyContext,\n): Promise<PolicyOutcome> {\n\t// Copy before awaiting so a resolver that mutates or replaces a cached\n\t// definition mid-evaluation cannot change the authority this outcome records.\n\tconst authority = policy.authority ? { ...policy.authority } : undefined;\n\tconst outcome =\n\t\tpolicy.kind === \"data\"\n\t\t\t? await evaluateDataPolicy(policy, ctx)\n\t\t\t: policy.kind === \"code\"\n\t\t\t\t? await evaluateCodePolicy(policy, ctx)\n\t\t\t\t: await evaluateHybridPolicy(policy, ctx);\n\tif (!authority) return outcome;\n\treturn {\n\t\t...outcome,\n\t\tdispatchEvidence: {\n\t\t\t...(outcome.dispatchEvidence ?? {\n\t\t\t\tpolicyKind: policy.kind,\n\t\t\t\tpolicyId: policy.policyId,\n\t\t\t\tpolicyVersion: policy.policyVersion,\n\t\t\t\tdispatchPath: [],\n\t\t\t}),\n\t\t\tauthority,\n\t\t},\n\t};\n}\n\nasync function evaluateCodePolicy(\n\tpolicy: RuntimePolicyDefinition,\n\tctx: PolicyContext,\n): Promise<PolicyOutcome> {\n\tconst codeEvaluatorPolicyId = policy.codeEvaluatorPolicyId ?? policy.policyId;\n\tconst evaluator = ctx.resolveCodePolicy?.(codeEvaluatorPolicyId);\n\n\tif (!evaluator) {\n\t\treturn {\n\t\t\tpolicyId: policy.policyId,\n\t\t\tpolicyVersion: policy.policyVersion,\n\t\t\tpolicyKind: policy.kind,\n\t\t\tresult: \"block\",\n\t\t\treason: `No evaluator registered for policy ${codeEvaluatorPolicyId}`,\n\t\t\tmetadata: {\n\t\t\t\tmissingCodeEvaluatorPolicyId: codeEvaluatorPolicyId,\n\t\t\t},\n\t\t\tdispatchEvidence: {\n\t\t\t\tpolicyKind: policy.kind,\n\t\t\t\tpolicyId: policy.policyId,\n\t\t\t\tpolicyVersion: policy.policyVersion,\n\t\t\t\tdispatchPath: [\"code\"],\n\t\t\t\tcode: {\n\t\t\t\t\trequestedPolicyId: codeEvaluatorPolicyId,\n\t\t\t\t\tpolicyId: codeEvaluatorPolicyId,\n\t\t\t\t\tregistered: false,\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t}\n\n\tif (ctx.mode === \"preview\" && evaluator.previewSafe !== true) {\n\t\tconst skipReason =\n\t\t\t`Policy ${evaluator.policyId} skipped in preview mode ` +\n\t\t\t`(evaluator is not declared previewSafe)`;\n\t\treturn {\n\t\t\tpolicyId: policy.policyId,\n\t\t\tpolicyVersion: policy.policyVersion,\n\t\t\tpolicyKind: policy.kind,\n\t\t\tresult: \"warn\",\n\t\t\treason: skipReason,\n\t\t\tmetadata: {\n\t\t\t\tcodePolicyId: evaluator.policyId,\n\t\t\t\tcodePolicyVersion: evaluator.version,\n\t\t\t\tpreviewSkipped: true,\n\t\t\t},\n\t\t\tdispatchEvidence: {\n\t\t\t\tpolicyKind: policy.kind,\n\t\t\t\tpolicyId: policy.policyId,\n\t\t\t\tpolicyVersion: policy.policyVersion,\n\t\t\t\tdispatchPath: [\"code\"],\n\t\t\t\tcode: {\n\t\t\t\t\trequestedPolicyId: codeEvaluatorPolicyId,\n\t\t\t\t\tpolicyId: evaluator.policyId,\n\t\t\t\t\tversion: evaluator.version,\n\t\t\t\t\tregistered: true,\n\t\t\t\t\tskipped: true,\n\t\t\t\t\tskipReason,\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t}\n\n\tconst outcome = await evaluator.evaluate(ctx);\n\treturn normalizeOutcome(policy, outcome, {\n\t\tpolicyKind: policy.kind,\n\t\tpolicyId: policy.policyId,\n\t\tpolicyVersion: policy.policyVersion,\n\t\tdispatchPath: [\"code\"],\n\t\tcode: {\n\t\t\trequestedPolicyId: codeEvaluatorPolicyId,\n\t\t\tpolicyId: evaluator.policyId,\n\t\t\tversion: evaluator.version,\n\t\t\tregistered: true,\n\t\t},\n\t});\n}\n\nasync function evaluateHybridPolicy(\n\tpolicy: RuntimePolicyDefinition,\n\tctx: PolicyContext,\n): Promise<PolicyOutcome> {\n\tconst dataOutcome = evaluateDataPolicy(policy, ctx);\n\tconst fallback = policy.fallback;\n\tconst fallbackDecision = fallback\n\t\t? resolveFallbackDecision(policy, dataOutcome, fallback)\n\t\t: { shouldFallback: false, trigger: \"not_triggered\" as const };\n\n\tif (!fallback || !fallbackDecision.shouldFallback) {\n\t\tif (fallback && dataOutcome.dispatchEvidence) {\n\t\t\treturn {\n\t\t\t\t...dataOutcome,\n\t\t\t\tdispatchEvidence: {\n\t\t\t\t\t...dataOutcome.dispatchEvidence,\n\t\t\t\t\tfallback: {\n\t\t\t\t\t\tused: false,\n\t\t\t\t\t\ttrigger: \"not_triggered\",\n\t\t\t\t\t\treason: \"Data policy result did not trigger fallback\",\n\t\t\t\t\t\tfromResult: dataOutcome.result,\n\t\t\t\t\t\tdefinitionVersion: policy.policyVersion,\n\t\t\t\t\t\tcodeEvaluatorPolicyId: fallback.codeEvaluatorPolicyId,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\treturn dataOutcome;\n\t}\n\n\tconst codePolicy: RuntimePolicyDefinition = {\n\t\tpolicyId: policy.policyId,\n\t\tpolicyVersion: policy.policyVersion,\n\t\tkind: \"hybrid\",\n\t\tcodeEvaluatorPolicyId: fallback.codeEvaluatorPolicyId,\n\t};\n\tconst codeOutcome = await evaluateCodePolicy(codePolicy, ctx);\n\n\treturn normalizeOutcome(policy, codeOutcome, {\n\t\t...(codeOutcome.dispatchEvidence ?? {\n\t\t\tpolicyKind: \"hybrid\",\n\t\t\tpolicyId: policy.policyId,\n\t\t\tpolicyVersion: policy.policyVersion,\n\t\t\tdispatchPath: [\"code\"],\n\t\t}),\n\t\tpolicyKind: \"hybrid\",\n\t\tpolicyId: policy.policyId,\n\t\tpolicyVersion: policy.policyVersion,\n\t\tdispatchPath: [\"data\", \"fallback\", \"code\"],\n\t\tdata: dataOutcome.dispatchEvidence?.data,\n\t\tfallback: {\n\t\t\tused: true,\n\t\t\ttrigger: fallbackDecision.trigger,\n\t\t\treason: fallback.reason ?? \"Data policy result triggered code fallback\",\n\t\t\tfromResult: dataOutcome.result,\n\t\t\tdefinitionVersion: policy.policyVersion,\n\t\t\tcodeEvaluatorPolicyId: fallback.codeEvaluatorPolicyId,\n\t\t},\n\t});\n}\n\nfunction resolveFallbackDecision(\n\tpolicy: RuntimePolicyDefinition,\n\tdataOutcome: PolicyOutcome,\n\tfallback: PolicyFallbackDefinition,\n): { shouldFallback: boolean; trigger: PolicyFallbackTrigger | \"not_triggered\" } {\n\tconst allowedTriggers = fallback.triggers ?? [\n\t\t\"data_result\",\n\t\t\"missing_data_definition\",\n\t\t\"invalid_data_definition\",\n\t];\n\tconst definitionStatus = dataOutcome.dispatchEvidence?.data?.definitionStatus;\n\n\tif (definitionStatus === \"missing\") {\n\t\treturn {\n\t\t\tshouldFallback: allowedTriggers.includes(\"missing_data_definition\"),\n\t\t\ttrigger: \"missing_data_definition\",\n\t\t};\n\t}\n\n\tif (definitionStatus === \"invalid\") {\n\t\treturn {\n\t\t\tshouldFallback: allowedTriggers.includes(\"invalid_data_definition\"),\n\t\t\ttrigger: \"invalid_data_definition\",\n\t\t};\n\t}\n\n\tconst fallbackResults = fallback.onResults ?? [\"warn\", \"block\"];\n\treturn {\n\t\tshouldFallback:\n\t\t\tpolicy.kind === \"hybrid\" &&\n\t\t\tallowedTriggers.includes(\"data_result\") &&\n\t\t\tfallbackResults.includes(dataOutcome.result),\n\t\ttrigger: \"data_result\",\n\t};\n}\n\nfunction evaluateDataPolicy(policy: RuntimePolicyDefinition, ctx: PolicyContext): PolicyOutcome {\n\tconst definition = policy.dataDefinition;\n\n\tif (!definition) {\n\t\treturn {\n\t\t\tpolicyId: policy.policyId,\n\t\t\tpolicyVersion: policy.policyVersion,\n\t\t\tpolicyKind: policy.kind,\n\t\t\tresult: \"block\",\n\t\t\treason: \"Data policy definition is missing\",\n\t\t\tdispatchEvidence: {\n\t\t\t\tpolicyKind: policy.kind,\n\t\t\t\tpolicyId: policy.policyId,\n\t\t\t\tpolicyVersion: policy.policyVersion,\n\t\t\t\tdispatchPath: [\"data\"],\n\t\t\t\tdata: {\n\t\t\t\t\tdefinitionVersion: policy.policyVersion,\n\t\t\t\t\tdefinitionStatus: \"missing\",\n\t\t\t\t\tconditionResults: [],\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t}\n\n\tconst validation = validateDataPolicyDefinition(definition);\n\tif (!validation.valid) {\n\t\treturn {\n\t\t\tpolicyId: policy.policyId,\n\t\t\tpolicyVersion: policy.policyVersion,\n\t\t\tpolicyKind: policy.kind,\n\t\t\tresult: \"block\",\n\t\t\treason: `Invalid data policy definition: ${validation.errors.join(\"; \")}`,\n\t\t\tmetadata: {\n\t\t\t\tvalidationErrors: validation.errors,\n\t\t\t},\n\t\t\tdispatchEvidence: {\n\t\t\t\tpolicyKind: policy.kind,\n\t\t\t\tpolicyId: policy.policyId,\n\t\t\t\tpolicyVersion: policy.policyVersion,\n\t\t\t\tdispatchPath: [\"data\"],\n\t\t\t\tdata: {\n\t\t\t\t\tdefinitionVersion: policy.policyVersion,\n\t\t\t\t\tdefinitionStatus: \"invalid\",\n\t\t\t\t\tconditionResults: [],\n\t\t\t\t\tvalidationErrors: validation.errors,\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t}\n\n\tconst evaluations = definition.conditions.map((condition) => evaluateDataPolicyCondition(condition, ctx));\n\tconst conditionResults = evaluations.flatMap((evaluation) => evaluation.evidence);\n\tconst topLevelResults = evaluations.map((evaluation) => evaluation.result);\n\tconst aggregate =\n\t\ttopLevelResults.find((result) => result.result === \"block\") ??\n\t\ttopLevelResults.find((result) => result.result === \"warn\");\n\tconst result = aggregate?.result ?? definition.defaultResult ?? \"pass\";\n\n\treturn {\n\t\tpolicyId: policy.policyId,\n\t\tpolicyVersion: policy.policyVersion,\n\t\tpolicyKind: policy.kind,\n\t\tresult,\n\t\treason: aggregate?.reason ?? definition.reason,\n\t\tmetadata: {\n\t\t\tconditionCount: definition.conditions.length,\n\t\t\tfailedConditionId: aggregate?.conditionId,\n\t\t},\n\t\tdispatchEvidence: {\n\t\t\tpolicyKind: policy.kind,\n\t\t\tpolicyId: policy.policyId,\n\t\t\tpolicyVersion: policy.policyVersion,\n\t\t\tdispatchPath: [\"data\"],\n\t\t\tdata: {\n\t\t\t\tdefinitionVersion: policy.policyVersion,\n\t\t\t\tdefinitionStatus: \"evaluated\",\n\t\t\t\tconditionResults,\n\t\t\t},\n\t\t},\n\t};\n}\n\nexport function validateDataPolicyDefinition(\n\tdefinition: DataPolicyDefinition,\n): DataPolicyValidationResult {\n\tconst errors: string[] = [];\n\n\tif (!Array.isArray(definition.conditions) || definition.conditions.length === 0) {\n\t\terrors.push(\"conditions must contain at least one condition\");\n\t} else if (definition.conditions.length > DATA_POLICY_MAX_CONDITIONS_PER_NODE) {\n\t\terrors.push(\n\t\t\t`conditions must contain at most ${DATA_POLICY_MAX_CONDITIONS_PER_NODE} top-level conditions`,\n\t\t);\n\t}\n\n\tif (definition.defaultResult && !POLICY_RESULTS.includes(definition.defaultResult)) {\n\t\terrors.push(\"defaultResult must be pass, warn, or block\");\n\t}\n\n\tlet totalConditions = 0;\n\tfor (const condition of definition.conditions ?? []) {\n\t\tvalidateDataPolicyCondition(condition, errors, 1, () => {\n\t\t\ttotalConditions += 1;\n\t\t});\n\t}\n\n\tif (totalConditions > DATA_POLICY_MAX_TOTAL_CONDITIONS) {\n\t\terrors.push(`policy must contain at most ${DATA_POLICY_MAX_TOTAL_CONDITIONS} total conditions`);\n\t}\n\n\treturn { valid: errors.length === 0, errors };\n}\n\nfunction validateDataPolicyCondition(\n\tcondition: DataPolicyCondition,\n\terrors: string[],\n\tdepth: number,\n\tcount: () => void,\n): void {\n\tcount();\n\n\tif (!condition || typeof condition !== \"object\") {\n\t\terrors.push(\"condition must be an object\");\n\t\treturn;\n\t}\n\n\tif (depth > DATA_POLICY_MAX_DEPTH) {\n\t\terrors.push(`condition depth must not exceed ${DATA_POLICY_MAX_DEPTH}`);\n\t\treturn;\n\t}\n\n\tif (!isNonEmptyBoundedString(condition.conditionId)) {\n\t\terrors.push(\"conditionId must be a non-empty bounded string\");\n\t}\n\n\tvalidateOptionalPolicyResult(\"onPass\" in condition ? condition.onPass : undefined, \"onPass\", errors);\n\tvalidateOptionalPolicyResult(\"onFail\" in condition ? condition.onFail : undefined, \"onFail\", errors);\n\n\tif (condition.reason !== undefined && !isNonEmptyBoundedString(condition.reason)) {\n\t\terrors.push(`condition ${condition.conditionId} reason must be a bounded string`);\n\t}\n\n\tif (condition.type === \"always\") {\n\t\tif (!POLICY_RESULTS.includes(condition.result)) {\n\t\t\terrors.push(`condition ${condition.conditionId} result must be pass, warn, or block`);\n\t\t}\n\t\treturn;\n\t}\n\n\tif (condition.type === \"parameter\") {\n\t\tvalidatePath(condition.path, `condition ${condition.conditionId} path`, errors);\n\t\tvalidateComparison(condition.operator, condition.value, condition.conditionId, errors);\n\t\treturn;\n\t}\n\n\tif (condition.type === \"comparison\") {\n\t\tvalidateSourceReference(condition.left, condition.conditionId, errors);\n\t\tvalidateComparison(condition.operator, condition.value, condition.conditionId, errors);\n\t\treturn;\n\t}\n\n\tif (condition.type === \"all\" || condition.type === \"any\") {\n\t\tif (!Array.isArray(condition.conditions) || condition.conditions.length === 0) {\n\t\t\terrors.push(`condition ${condition.conditionId} must contain child conditions`);\n\t\t\treturn;\n\t\t}\n\n\t\tif (condition.conditions.length > DATA_POLICY_MAX_CONDITIONS_PER_NODE) {\n\t\t\terrors.push(\n\t\t\t\t`condition ${condition.conditionId} must contain at most ${DATA_POLICY_MAX_CONDITIONS_PER_NODE} child conditions`,\n\t\t\t);\n\t\t}\n\n\t\tfor (const child of condition.conditions) {\n\t\t\tvalidateDataPolicyCondition(child, errors, depth + 1, count);\n\t\t}\n\t\treturn;\n\t}\n\n\tif (condition.type === \"not\") {\n\t\tvalidateDataPolicyCondition(condition.condition, errors, depth + 1, count);\n\t\treturn;\n\t}\n\n\terrors.push(`condition ${condition.conditionId} has unsupported type`);\n}\n\nfunction validateOptionalPolicyResult(\n\tresult: PolicyEvaluationResult | undefined,\n\tfieldName: string,\n\terrors: string[],\n): void {\n\tif (result !== undefined && !POLICY_RESULTS.includes(result)) {\n\t\terrors.push(`${fieldName} must be pass, warn, or block`);\n\t}\n}\n\nfunction validateSourceReference(\n\treference: DataPolicySourceReference,\n\tconditionId: string,\n\terrors: string[],\n): void {\n\tif (!reference || typeof reference !== \"object\") {\n\t\terrors.push(`condition ${conditionId} left must be a source reference`);\n\t\treturn;\n\t}\n\n\tif (reference.source !== \"parameters\" && reference.source !== \"context\") {\n\t\terrors.push(`condition ${conditionId} source must be parameters or context`);\n\t}\n\n\tvalidatePath(reference.path, `condition ${conditionId} left.path`, errors);\n\n\tif (reference.source === \"context\" && !DATA_POLICY_CONTEXT_PATHS.includes(reference.path)) {\n\t\terrors.push(`condition ${conditionId} uses an unsupported context path`);\n\t}\n}\n\nfunction validateComparison(\n\toperator: DataPolicyComparisonOperator,\n\tvalue: DataPolicyLiteral | undefined,\n\tconditionId: string,\n\terrors: string[],\n): void {\n\tif (!DATA_POLICY_COMPARISON_OPERATORS.includes(operator)) {\n\t\terrors.push(`condition ${conditionId} has unsupported operator`);\n\t\treturn;\n\t}\n\n\tif (operator === \"exists\") {\n\t\treturn;\n\t}\n\n\tif (!isDataPolicyLiteral(value)) {\n\t\terrors.push(`condition ${conditionId} comparison value must be a bounded literal`);\n\t\treturn;\n\t}\n\n\tif ([\"gt\", \"gte\", \"lt\", \"lte\"].includes(operator) && typeof value !== \"number\") {\n\t\terrors.push(`condition ${conditionId} numeric comparison requires a number value`);\n\t}\n}\n\nfunction validatePath(path: string, fieldName: string, errors: string[]): void {\n\tif (!isNonEmptyBoundedString(path)) {\n\t\terrors.push(`${fieldName} must be a non-empty bounded string`);\n\t\treturn;\n\t}\n\n\tconst segments = path.split(\".\");\n\tif (segments.length > DATA_POLICY_MAX_PATH_SEGMENTS) {\n\t\terrors.push(`${fieldName} must contain at most ${DATA_POLICY_MAX_PATH_SEGMENTS} segments`);\n\t\treturn;\n\t}\n\n\tfor (const segment of segments) {\n\t\tif (!/^[A-Za-z][A-Za-z0-9_-]*$/.test(segment)) {\n\t\t\terrors.push(`${fieldName} contains an invalid path segment`);\n\t\t\treturn;\n\t\t}\n\n\t\tif ([\"__proto__\", \"constructor\", \"prototype\"].includes(segment)) {\n\t\t\terrors.push(`${fieldName} contains a forbidden path segment`);\n\t\t\treturn;\n\t\t}\n\t}\n}\n\nfunction isDataPolicyLiteral(value: unknown): value is DataPolicyLiteral {\n\tif (value === null || typeof value === \"number\" || typeof value === \"boolean\") {\n\t\treturn true;\n\t}\n\n\treturn typeof value === \"string\" && value.length <= DATA_POLICY_MAX_STRING_LENGTH;\n}\n\nfunction isNonEmptyBoundedString(value: unknown): value is string {\n\treturn typeof value === \"string\" && value.length > 0 && value.length <= DATA_POLICY_MAX_STRING_LENGTH;\n}\n\nfunction evaluateDataPolicyCondition(\n\tcondition: DataPolicyCondition,\n\tctx: PolicyContext,\n): { result: DataPolicyConditionResult; evidence: DataPolicyConditionResult[] } {\n\tif (condition.type === \"always\") {\n\t\tconst result = {\n\t\t\tconditionId: condition.conditionId,\n\t\t\tpassed: condition.result === \"pass\",\n\t\t\tresult: condition.result,\n\t\t\treason: condition.reason,\n\t\t};\n\t\treturn { result, evidence: [result] };\n\t}\n\n\tif (condition.type === \"all\" || condition.type === \"any\") {\n\t\tconst childEvaluations = condition.conditions.map((child) => evaluateDataPolicyCondition(child, ctx));\n\t\tconst passed =\n\t\t\tcondition.type === \"all\"\n\t\t\t\t? childEvaluations.every((evaluation) => evaluation.result.passed)\n\t\t\t\t: childEvaluations.some((evaluation) => evaluation.result.passed);\n\t\tconst result = {\n\t\t\tconditionId: condition.conditionId,\n\t\t\tpassed,\n\t\t\tresult: passed ? (condition.onPass ?? \"pass\") : (condition.onFail ?? \"block\"),\n\t\t\treason: passed ? undefined : condition.reason,\n\t\t};\n\n\t\treturn {\n\t\t\tresult,\n\t\t\tevidence: [result, ...childEvaluations.flatMap((evaluation) => evaluation.evidence)],\n\t\t};\n\t}\n\n\tif (condition.type === \"not\") {\n\t\tconst childEvaluation = evaluateDataPolicyCondition(condition.condition, ctx);\n\t\tconst passed = !childEvaluation.result.passed;\n\t\tconst result = {\n\t\t\tconditionId: condition.conditionId,\n\t\t\tpassed,\n\t\t\tresult: passed ? (condition.onPass ?? \"pass\") : (condition.onFail ?? \"block\"),\n\t\t\treason: passed ? undefined : condition.reason,\n\t\t};\n\n\t\treturn { result, evidence: [result, ...childEvaluation.evidence] };\n\t}\n\n\tif (condition.type !== \"parameter\" && condition.type !== \"comparison\") {\n\t\tconst result: DataPolicyConditionResult = {\n\t\t\tconditionId: condition.conditionId,\n\t\t\tpassed: false,\n\t\t\tresult: \"block\",\n\t\t\treason: \"Unsupported data policy condition type\",\n\t\t};\n\t\treturn { result, evidence: [result] };\n\t}\n\n\tconst value =\n\t\tcondition.type === \"parameter\"\n\t\t\t? readPath(ctx.parameters, condition.path)\n\t\t\t: readDataPolicySource(ctx, condition.left);\n\tconst operator = condition.operator;\n\tconst expected = condition.value;\n\tconst passed = evaluateOperator(value, operator, expected);\n\tconst result = {\n\t\tconditionId: condition.conditionId,\n\t\tpassed,\n\t\tresult: passed ? (condition.onPass ?? \"pass\") : (condition.onFail ?? \"block\"),\n\t\treason: passed ? undefined : condition.reason,\n\t};\n\treturn { result, evidence: [result] };\n}\n\nfunction evaluateOperator(\n\tactual: unknown,\n\toperator: DataPolicyComparisonOperator,\n\texpected: unknown,\n): boolean {\n\tswitch (operator) {\n\t\tcase \"exists\":\n\t\t\treturn actual !== undefined && actual !== null && actual !== \"\";\n\t\tcase \"equals\":\n\t\t\treturn actual === expected;\n\t\tcase \"notEquals\":\n\t\t\treturn actual !== expected;\n\t\tcase \"gt\":\n\t\t\treturn typeof actual === \"number\" && typeof expected === \"number\" && actual > expected;\n\t\tcase \"gte\":\n\t\t\treturn typeof actual === \"number\" && typeof expected === \"number\" && actual >= expected;\n\t\tcase \"lt\":\n\t\t\treturn typeof actual === \"number\" && typeof expected === \"number\" && actual < expected;\n\t\tcase \"lte\":\n\t\t\treturn typeof actual === \"number\" && typeof expected === \"number\" && actual <= expected;\n\t}\n}\n\nfunction readDataPolicySource(ctx: PolicyContext, reference: DataPolicySourceReference): unknown {\n\tif (reference.source === \"parameters\") {\n\t\treturn readPath(ctx.parameters, reference.path);\n\t}\n\n\treturn readPath(\n\t\t{\n\t\t\ttenantId: ctx.tenantId,\n\t\t\tspaceId: ctx.spaceId,\n\t\t\tactionInvocationId: ctx.actionInvocationId,\n\t\t\tactionId: ctx.actionId,\n\t\t\tmode: ctx.mode,\n\t\t},\n\t\treference.path,\n\t);\n}\n\nfunction readPath(source: unknown, path: string): unknown {\n\tif (!source || typeof source !== \"object\") {\n\t\treturn undefined;\n\t}\n\n\treturn path.split(\".\").reduce<unknown>((current, segment) => {\n\t\tif (!current || typeof current !== \"object\") {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn (current as Record<string, unknown>)[segment];\n\t}, source);\n}\n\nfunction normalizeOutcome(\n\tpolicy: RuntimePolicyDefinition,\n\toutcome: PolicyOutcome,\n\tdispatchEvidence: PolicyDispatchEvidence,\n): PolicyOutcome {\n\tif (outcome.guidance !== undefined) {\n\t\tconst guidanceValidation = validatePolicyGuidance(outcome.guidance);\n\t\tif (!guidanceValidation.valid) {\n\t\t\tthrow new Error(\n\t\t\t\t`Invalid guidance for policy ${outcome.policyId}: ${guidanceValidation.errors.join(\"; \")}`,\n\t\t\t);\n\t\t}\n\t}\n\n\t// The platform owns the dispatch envelope (kind, id, version, path,\n\t// data/code/fallback blocks). Engine provenance is evaluator-controlled —\n\t// preserve it so BYO-engine adapters (OPA, Cedar, ...) can attach decision\n\t// path, bundle revision, decision ID, input hash, etc.\n\tconst engine = outcome.dispatchEvidence?.engine;\n\treturn {\n\t\t...outcome,\n\t\tpolicyId: policy.policyId,\n\t\tpolicyVersion: policy.policyVersion,\n\t\tpolicyKind: policy.kind,\n\t\tmetadata: {\n\t\t\t...(outcome.metadata ?? {}),\n\t\t\tcodePolicyId: dispatchEvidence.code?.policyId ?? outcome.policyId,\n\t\t\tcodePolicyVersion: dispatchEvidence.code?.version ?? outcome.policyVersion,\n\t\t},\n\t\tdispatchEvidence: engine ? { ...dispatchEvidence, engine } : dispatchEvidence,\n\t};\n}\n\nfunction parsePolicyVersion(policyId: PolicyId): number {\n\tconst segments = policyId.split(\".v\");\n\treturn Number(segments[segments.length - 1] ?? 1);\n}\n\nexport function aggregatePolicyOutcomes(outcomes: PolicyOutcome[]): PolicyOutcome | undefined {\n\treturn (\n\t\toutcomes.find((outcome) => outcome.result === \"block\") ??\n\t\toutcomes.find((outcome) => outcome.result === \"warn\")\n\t);\n}\n"]}
|
|
@@ -0,0 +1,480 @@
|
|
|
1
|
+
import { createFabricId, FABRIC_ID_PREFIXES } from './chunk-RALMUSOX.js';
|
|
2
|
+
import { AnonymizationEngine } from './chunk-TYNIFC7J.js';
|
|
3
|
+
import { createHash } from 'crypto';
|
|
4
|
+
|
|
5
|
+
// evidence/canonical-json.ts
|
|
6
|
+
function canonicalJson(value) {
|
|
7
|
+
return JSON.stringify(sortKeys(value));
|
|
8
|
+
}
|
|
9
|
+
function sortKeys(value) {
|
|
10
|
+
if (Array.isArray(value)) return value.map(sortKeys);
|
|
11
|
+
if (value && typeof value === "object") {
|
|
12
|
+
return Object.fromEntries(Object.entries(value).sort(([left], [right]) => left < right ? -1 : left > right ? 1 : 0).map(([key, child]) => [key, sortKeys(child)]));
|
|
13
|
+
}
|
|
14
|
+
return value;
|
|
15
|
+
}
|
|
16
|
+
var EVIDENCE_PACKET_CHECKSUM_ALGORITHM = "fabric-canonical-json-sha256-v1";
|
|
17
|
+
var EVIDENCE_PACKET_SCHEMA_VERSION = 1;
|
|
18
|
+
var DEFAULT_EVIDENCE_PACKET_TYPE = "compliance_evidence";
|
|
19
|
+
var DEFAULT_EVIDENCE_REDACTION_REASON = "evidence_packet_generation";
|
|
20
|
+
var EvidencePacketGenerationError = class extends Error {
|
|
21
|
+
code;
|
|
22
|
+
constructor(code, message) {
|
|
23
|
+
super(message);
|
|
24
|
+
this.name = "EvidencePacketGenerationError";
|
|
25
|
+
this.code = code;
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
function compareStrings(left, right) {
|
|
29
|
+
return left < right ? -1 : left > right ? 1 : 0;
|
|
30
|
+
}
|
|
31
|
+
function assertNonEmptyString(value, what) {
|
|
32
|
+
if (typeof value !== "string" || value.length === 0) {
|
|
33
|
+
throw new EvidencePacketGenerationError("EVIDENCE_INVALID_RECORD", `${what} must be a non-empty string.`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function isPlainObject(value) {
|
|
37
|
+
const prototype = Object.getPrototypeOf(value);
|
|
38
|
+
return prototype === Object.prototype || prototype === null;
|
|
39
|
+
}
|
|
40
|
+
function exhaustiveList() {
|
|
41
|
+
return (list) => list;
|
|
42
|
+
}
|
|
43
|
+
var REDACTION_METHODS = Object.freeze(
|
|
44
|
+
exhaustiveList()(["nullify", "mask", "hash", "tokenize", "generalize", "drop"])
|
|
45
|
+
);
|
|
46
|
+
var PLATFORM_DATA_CLASSES = Object.freeze(
|
|
47
|
+
exhaustiveList()([
|
|
48
|
+
"asset_event",
|
|
49
|
+
"read_model",
|
|
50
|
+
"raw_payload",
|
|
51
|
+
"evidence_packet",
|
|
52
|
+
"action_evidence",
|
|
53
|
+
"access_event"
|
|
54
|
+
])
|
|
55
|
+
);
|
|
56
|
+
var SHA256_HEX = /^[0-9a-f]{64}$/;
|
|
57
|
+
function isIsoInstant(value) {
|
|
58
|
+
if (typeof value !== "string") return false;
|
|
59
|
+
const date = new Date(value);
|
|
60
|
+
return !Number.isNaN(date.getTime()) && date.toISOString() === value;
|
|
61
|
+
}
|
|
62
|
+
var METADATA_STRING_KEYS = ["policyVersion", "jobId", "redactedAt", "reason"];
|
|
63
|
+
var METADATA_KEYS = Object.freeze([
|
|
64
|
+
"redactionState",
|
|
65
|
+
"dataClass",
|
|
66
|
+
"redactedFields",
|
|
67
|
+
"preservedSemantics",
|
|
68
|
+
...METADATA_STRING_KEYS
|
|
69
|
+
]);
|
|
70
|
+
var FIELD_METADATA_KEYS = Object.freeze([
|
|
71
|
+
"fieldPath",
|
|
72
|
+
"method",
|
|
73
|
+
"policyVersion",
|
|
74
|
+
"jobId",
|
|
75
|
+
"redactedAt",
|
|
76
|
+
"reason",
|
|
77
|
+
"dataClass",
|
|
78
|
+
"beforeChecksum"
|
|
79
|
+
]);
|
|
80
|
+
function hasExactKeys(value, keys) {
|
|
81
|
+
const present = Object.keys(value);
|
|
82
|
+
return present.length === keys.length && present.every((key) => keys.includes(key));
|
|
83
|
+
}
|
|
84
|
+
function assertEnginePrivacyMetadata(value, path) {
|
|
85
|
+
const invalid = (detail) => new EvidencePacketGenerationError(
|
|
86
|
+
"EVIDENCE_INVALID_RECORD",
|
|
87
|
+
`${path} is not engine-written AnonymizationMetadata (${detail}); _privacy values bypass the anonymization policy, so other data is rejected.`
|
|
88
|
+
);
|
|
89
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) throw invalid("not an object");
|
|
90
|
+
const metadata = value;
|
|
91
|
+
if (!hasExactKeys(metadata, METADATA_KEYS)) throw invalid("unexpected or missing keys");
|
|
92
|
+
if (metadata.redactionState !== "anonymized") throw invalid("redactionState");
|
|
93
|
+
if (!PLATFORM_DATA_CLASSES.includes(metadata.dataClass)) throw invalid("dataClass");
|
|
94
|
+
for (const key of METADATA_STRING_KEYS) {
|
|
95
|
+
if (typeof metadata[key] !== "string") throw invalid(key);
|
|
96
|
+
}
|
|
97
|
+
if (!isIsoInstant(metadata.redactedAt)) throw invalid("redactedAt");
|
|
98
|
+
if (!Array.isArray(metadata.preservedSemantics) || !metadata.preservedSemantics.every((item) => typeof item === "string")) {
|
|
99
|
+
throw invalid("preservedSemantics");
|
|
100
|
+
}
|
|
101
|
+
if (!Array.isArray(metadata.redactedFields)) throw invalid("redactedFields");
|
|
102
|
+
metadata.redactedFields.forEach((field, index) => {
|
|
103
|
+
if (!field || typeof field !== "object" || Array.isArray(field)) throw invalid(`redactedFields[${index}]`);
|
|
104
|
+
const entry = field;
|
|
105
|
+
if (!hasExactKeys(entry, FIELD_METADATA_KEYS) || !Object.values(entry).every((item) => typeof item === "string")) {
|
|
106
|
+
throw invalid(`redactedFields[${index}]`);
|
|
107
|
+
}
|
|
108
|
+
if (!REDACTION_METHODS.includes(entry.method)) throw invalid(`redactedFields[${index}].method`);
|
|
109
|
+
if (!PLATFORM_DATA_CLASSES.includes(entry.dataClass)) throw invalid(`redactedFields[${index}].dataClass`);
|
|
110
|
+
if (!isIsoInstant(entry.redactedAt)) throw invalid(`redactedFields[${index}].redactedAt`);
|
|
111
|
+
if (!SHA256_HEX.test(entry.beforeChecksum)) throw invalid(`redactedFields[${index}].beforeChecksum`);
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
function toPlainJson(value, path) {
|
|
115
|
+
if (value === null || typeof value === "string" || typeof value === "boolean") return value;
|
|
116
|
+
if (typeof value === "number") {
|
|
117
|
+
if (!Number.isFinite(value)) {
|
|
118
|
+
throw new EvidencePacketGenerationError("EVIDENCE_INVALID_RECORD", `${path} is not a finite number.`);
|
|
119
|
+
}
|
|
120
|
+
return value;
|
|
121
|
+
}
|
|
122
|
+
if (value instanceof Date) {
|
|
123
|
+
if (Number.isNaN(value.getTime())) {
|
|
124
|
+
throw new EvidencePacketGenerationError("EVIDENCE_INVALID_RECORD", `${path} is an invalid Date.`);
|
|
125
|
+
}
|
|
126
|
+
return value.toISOString();
|
|
127
|
+
}
|
|
128
|
+
if (Array.isArray(value)) {
|
|
129
|
+
return value.map((item, index) => item === void 0 ? null : toPlainJson(item, `${path}[${index}]`));
|
|
130
|
+
}
|
|
131
|
+
if (typeof value === "object") {
|
|
132
|
+
if (!isPlainObject(value)) {
|
|
133
|
+
const toJSON = value.toJSON;
|
|
134
|
+
if (typeof toJSON === "function") return toPlainJson(toJSON.call(value), path);
|
|
135
|
+
throw new EvidencePacketGenerationError(
|
|
136
|
+
"EVIDENCE_INVALID_RECORD",
|
|
137
|
+
`${path} is a non-plain object that cannot be represented as JSON.`
|
|
138
|
+
);
|
|
139
|
+
}
|
|
140
|
+
const result = /* @__PURE__ */ Object.create(null);
|
|
141
|
+
for (const [key, child] of Object.entries(value)) {
|
|
142
|
+
if (key === "__proto__") {
|
|
143
|
+
throw new EvidencePacketGenerationError("EVIDENCE_INVALID_RECORD", `${path} has an own "__proto__" key.`);
|
|
144
|
+
}
|
|
145
|
+
if (child === void 0) continue;
|
|
146
|
+
const normalized = toPlainJson(child, `${path}.${key}`);
|
|
147
|
+
if (key === "_privacy") assertEnginePrivacyMetadata(normalized, `${path}._privacy`);
|
|
148
|
+
result[key] = normalized;
|
|
149
|
+
}
|
|
150
|
+
return result;
|
|
151
|
+
}
|
|
152
|
+
throw new EvidencePacketGenerationError("EVIDENCE_INVALID_RECORD", `${path} has unsupported type ${typeof value}.`);
|
|
153
|
+
}
|
|
154
|
+
var ZONED_TIMESTAMP = /^([+-]\d{4,6}|\d{4})-(\d{2})-(\d{2})[T ](\d{2}):(\d{2})(?::(\d{2})(?:\.(\d+))?)? ?(?:(Z)|([+-])(\d{2})(?::?(\d{2}))?)$/;
|
|
155
|
+
function isLeapYear(year) {
|
|
156
|
+
return year % 4 === 0 && year % 100 !== 0 || year % 400 === 0;
|
|
157
|
+
}
|
|
158
|
+
function daysInMonth(year, month) {
|
|
159
|
+
return [31, isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month - 1];
|
|
160
|
+
}
|
|
161
|
+
function parseZonedTimestamp(value) {
|
|
162
|
+
const match = ZONED_TIMESTAMP.exec(value);
|
|
163
|
+
if (!match) return void 0;
|
|
164
|
+
const [, yearText, monthText, dayText, hourText, minuteText, secondText, fraction, zulu, sign, offsetHourText, offsetMinuteText] = match;
|
|
165
|
+
const year = Number(yearText);
|
|
166
|
+
const month = Number(monthText);
|
|
167
|
+
const day = Number(dayText);
|
|
168
|
+
const hour = Number(hourText);
|
|
169
|
+
const minute = Number(minuteText);
|
|
170
|
+
const second = secondText === void 0 ? 0 : Number(secondText);
|
|
171
|
+
const millisecond = fraction === void 0 ? 0 : Number(fraction.padEnd(3, "0").slice(0, 3));
|
|
172
|
+
if (month < 1 || month > 12 || day < 1 || day > daysInMonth(year, month)) return void 0;
|
|
173
|
+
if (hour > 23 || minute > 59 || second > 59) return void 0;
|
|
174
|
+
let offsetMinutes = 0;
|
|
175
|
+
if (!zulu) {
|
|
176
|
+
const offsetHours = Number(offsetHourText);
|
|
177
|
+
const offsetMinutePart = offsetMinuteText === void 0 ? 0 : Number(offsetMinuteText);
|
|
178
|
+
if (offsetHours > 14 || offsetMinutePart > 59) return void 0;
|
|
179
|
+
offsetMinutes = (sign === "-" ? -1 : 1) * (offsetHours * 60 + offsetMinutePart);
|
|
180
|
+
}
|
|
181
|
+
const date = /* @__PURE__ */ new Date(0);
|
|
182
|
+
date.setUTCFullYear(year, month - 1, day);
|
|
183
|
+
date.setUTCHours(hour, minute, second, millisecond);
|
|
184
|
+
const instant = date.getTime() - offsetMinutes * 6e4;
|
|
185
|
+
return Number.isNaN(new Date(instant).getTime()) ? void 0 : instant;
|
|
186
|
+
}
|
|
187
|
+
function toIsoTimestamp(value, path) {
|
|
188
|
+
const instant = value instanceof Date ? value.getTime() : typeof value === "string" ? parseZonedTimestamp(value) : void 0;
|
|
189
|
+
if (instant === void 0 || Number.isNaN(instant)) {
|
|
190
|
+
throw new EvidencePacketGenerationError(
|
|
191
|
+
"EVIDENCE_INVALID_RECORD",
|
|
192
|
+
`${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).`
|
|
193
|
+
);
|
|
194
|
+
}
|
|
195
|
+
return new Date(instant).toISOString();
|
|
196
|
+
}
|
|
197
|
+
function assertScope(record, scope, section) {
|
|
198
|
+
if (record.tenantId !== scope.tenantId || record.spaceId !== scope.spaceId) {
|
|
199
|
+
throw new EvidencePacketGenerationError(
|
|
200
|
+
"EVIDENCE_SCOPE_MISMATCH",
|
|
201
|
+
`Evidence read port returned a ${section} record (${String(record.id)}) outside tenant/space ${scope.tenantId}/${scope.spaceId}.`
|
|
202
|
+
);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
function normalizeSection(records, scope, section, prepare) {
|
|
206
|
+
if (!Array.isArray(records)) {
|
|
207
|
+
throw new EvidencePacketGenerationError("EVIDENCE_INVALID_RECORD", `Evidence read port returned a non-array for ${section}.`);
|
|
208
|
+
}
|
|
209
|
+
const byId2 = /* @__PURE__ */ new Map();
|
|
210
|
+
records.forEach((raw, index) => {
|
|
211
|
+
const path = `${section}[${index}]`;
|
|
212
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw)) {
|
|
213
|
+
throw new EvidencePacketGenerationError("EVIDENCE_INVALID_RECORD", `${path} must be an object.`);
|
|
214
|
+
}
|
|
215
|
+
assertScope(raw, scope, section);
|
|
216
|
+
const record = toPlainJson(raw, path);
|
|
217
|
+
assertScope(record, scope, section);
|
|
218
|
+
assertNonEmptyString(record.id, `${path}.id`);
|
|
219
|
+
prepare?.(record, path);
|
|
220
|
+
const canonical = canonicalJson(record);
|
|
221
|
+
const existing = byId2.get(record.id);
|
|
222
|
+
if (existing && existing.canonical !== canonical) {
|
|
223
|
+
throw new EvidencePacketGenerationError(
|
|
224
|
+
"EVIDENCE_INVALID_RECORD",
|
|
225
|
+
`Evidence read port returned conflicting ${section} records with id ${String(record.id)}.`
|
|
226
|
+
);
|
|
227
|
+
}
|
|
228
|
+
byId2.set(record.id, { record, canonical });
|
|
229
|
+
});
|
|
230
|
+
return [...byId2.values()].map((entry) => entry.record);
|
|
231
|
+
}
|
|
232
|
+
function byId(left, right) {
|
|
233
|
+
return compareStrings(left.id, right.id);
|
|
234
|
+
}
|
|
235
|
+
function byEventOrder(left, right) {
|
|
236
|
+
return Date.parse(left.occurredAt) - Date.parse(right.occurredAt) || Date.parse(left.recordedAt) - Date.parse(right.recordedAt) || left.sequence - right.sequence || byId(left, right);
|
|
237
|
+
}
|
|
238
|
+
function assertSubject(subject, path) {
|
|
239
|
+
if (!subject || typeof subject !== "object") {
|
|
240
|
+
throw new EvidencePacketGenerationError("EVIDENCE_INVALID_RECORD", `${path} must be an object.`);
|
|
241
|
+
}
|
|
242
|
+
assertNonEmptyString(subject.subjectType, `${path}.subjectType`);
|
|
243
|
+
assertNonEmptyString(subject.subjectId, `${path}.subjectId`);
|
|
244
|
+
return { subjectType: subject.subjectType, subjectId: subject.subjectId };
|
|
245
|
+
}
|
|
246
|
+
function compareSubjects(left, right) {
|
|
247
|
+
return compareStrings(left.subjectType, right.subjectType) || compareStrings(left.subjectId, right.subjectId);
|
|
248
|
+
}
|
|
249
|
+
async function resolveSubjects(primary, includeRelated, port, scope) {
|
|
250
|
+
if (!includeRelated || !port.resolveRelatedSubjects) return [primary];
|
|
251
|
+
const related = await port.resolveRelatedSubjects({ ...primary }, { ...scope });
|
|
252
|
+
if (!Array.isArray(related)) {
|
|
253
|
+
throw new EvidencePacketGenerationError("EVIDENCE_INVALID_RECORD", "resolveRelatedSubjects must return an array.");
|
|
254
|
+
}
|
|
255
|
+
const key = (subject) => `${subject.subjectType}\0${subject.subjectId}`;
|
|
256
|
+
const seen = /* @__PURE__ */ new Set([key(primary)]);
|
|
257
|
+
const unique = [];
|
|
258
|
+
related.forEach((candidate, index) => {
|
|
259
|
+
const subject = assertSubject(candidate, `relatedSubjects[${index}]`);
|
|
260
|
+
if (seen.has(key(subject))) return;
|
|
261
|
+
seen.add(key(subject));
|
|
262
|
+
unique.push(subject);
|
|
263
|
+
});
|
|
264
|
+
return [primary, ...unique.sort(compareSubjects)];
|
|
265
|
+
}
|
|
266
|
+
function assertRequestedInvocation(record, path, requested) {
|
|
267
|
+
const invocationId = record.actionInvocationId;
|
|
268
|
+
if (typeof invocationId !== "string" || !requested.has(invocationId)) {
|
|
269
|
+
throw new EvidencePacketGenerationError(
|
|
270
|
+
"EVIDENCE_UNREQUESTED_RECORD",
|
|
271
|
+
`${path}.actionInvocationId (${String(invocationId)}) is not one of the requested action invocations.`
|
|
272
|
+
);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
var REFERENCE_METADATA_FIELDS = {
|
|
276
|
+
actionInvocations: ["actionId", "status"],
|
|
277
|
+
events: ["eventType", "subjectType", "subjectId", "actionInvocationId"],
|
|
278
|
+
policyEvaluations: ["actionInvocationId", "policyId", "policyVersion", "result"],
|
|
279
|
+
adapterInvocations: ["actionInvocationId", "adapterType", "operation", "status"]
|
|
280
|
+
};
|
|
281
|
+
var REFERENCE_TYPES = {
|
|
282
|
+
actionInvocations: "action_invocation",
|
|
283
|
+
events: "asset_event",
|
|
284
|
+
policyEvaluations: "policy_evaluation",
|
|
285
|
+
adapterInvocations: "adapter_invocation"
|
|
286
|
+
};
|
|
287
|
+
function buildReferences(payload, unredacted) {
|
|
288
|
+
const sections = ["actionInvocations", "events", "policyEvaluations", "adapterInvocations"];
|
|
289
|
+
return sections.flatMap(
|
|
290
|
+
(section) => payload[section].map((record, index) => {
|
|
291
|
+
const originalId = unredacted[section][index]?.id;
|
|
292
|
+
if (!record || typeof record !== "object" || record.id !== originalId) {
|
|
293
|
+
throw new EvidencePacketGenerationError(
|
|
294
|
+
"EVIDENCE_IDENTIFIER_REDACTED",
|
|
295
|
+
`The anonymization policy removed or changed ${section}[${index}].id; record ids must pass through redaction unchanged.`
|
|
296
|
+
);
|
|
297
|
+
}
|
|
298
|
+
const metadata = {};
|
|
299
|
+
for (const field of REFERENCE_METADATA_FIELDS[section]) {
|
|
300
|
+
const value = record[field];
|
|
301
|
+
if (typeof value === "string") metadata[field] = value;
|
|
302
|
+
}
|
|
303
|
+
return {
|
|
304
|
+
referenceType: REFERENCE_TYPES[section],
|
|
305
|
+
referenceId: record.id,
|
|
306
|
+
metadata
|
|
307
|
+
};
|
|
308
|
+
})
|
|
309
|
+
);
|
|
310
|
+
}
|
|
311
|
+
function redactedSubjects(value) {
|
|
312
|
+
if (!Array.isArray(value)) {
|
|
313
|
+
throw new EvidencePacketGenerationError("EVIDENCE_IDENTIFIER_REDACTED", "The anonymization policy removed payload.subjects.");
|
|
314
|
+
}
|
|
315
|
+
return value.map((subject, index) => {
|
|
316
|
+
try {
|
|
317
|
+
return assertSubject(subject, `subjects[${index}]`);
|
|
318
|
+
} catch {
|
|
319
|
+
throw new EvidencePacketGenerationError(
|
|
320
|
+
"EVIDENCE_IDENTIFIER_REDACTED",
|
|
321
|
+
`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.`
|
|
322
|
+
);
|
|
323
|
+
}
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
function computeEvidencePacketChecksum(payload) {
|
|
327
|
+
return createHash("sha256").update(canonicalJson(payload)).digest("hex");
|
|
328
|
+
}
|
|
329
|
+
async function generateEvidencePacket(input, context, options) {
|
|
330
|
+
const { port } = options;
|
|
331
|
+
if (!port || typeof port.listEvents !== "function") {
|
|
332
|
+
throw new TypeError("generateEvidencePacket requires a read port with listEvents().");
|
|
333
|
+
}
|
|
334
|
+
if (!options.anonymizationPolicy || !Array.isArray(options.anonymizationPolicy.fields)) {
|
|
335
|
+
throw new TypeError("generateEvidencePacket requires an anonymizationPolicy (use { fields: [] } to redact nothing).");
|
|
336
|
+
}
|
|
337
|
+
assertNonEmptyString(context.tenantId, "context.tenantId");
|
|
338
|
+
assertNonEmptyString(context.spaceId, "context.spaceId");
|
|
339
|
+
assertNonEmptyString(context.actorId, "context.actorId");
|
|
340
|
+
assertNonEmptyString(context.correlationId, "context.correlationId");
|
|
341
|
+
const scope = { tenantId: context.tenantId, spaceId: context.spaceId };
|
|
342
|
+
const primary = assertSubject(input.subject, "input.subject");
|
|
343
|
+
const includeRelated = input.includeRelated !== false && typeof port.resolveRelatedSubjects === "function";
|
|
344
|
+
const packetType = input.packetType ?? DEFAULT_EVIDENCE_PACKET_TYPE;
|
|
345
|
+
assertNonEmptyString(packetType, "input.packetType");
|
|
346
|
+
const subjects = await resolveSubjects(primary, includeRelated, port, scope);
|
|
347
|
+
const rawEvents = await port.listEvents({
|
|
348
|
+
...scope,
|
|
349
|
+
primarySubject: { ...primary },
|
|
350
|
+
subjects: subjects.map((subject) => ({ ...subject }))
|
|
351
|
+
});
|
|
352
|
+
const events = normalizeSection(rawEvents, scope, "events", (record, path) => {
|
|
353
|
+
for (const field of ["eventType", "subjectType", "subjectId", "correlationId"]) {
|
|
354
|
+
assertNonEmptyString(record[field], `${path}.${field}`);
|
|
355
|
+
}
|
|
356
|
+
if (typeof record.sequence !== "number") {
|
|
357
|
+
throw new EvidencePacketGenerationError("EVIDENCE_INVALID_RECORD", `${path}.sequence must be a number.`);
|
|
358
|
+
}
|
|
359
|
+
record.occurredAt = toIsoTimestamp(record.occurredAt, `${path}.occurredAt`);
|
|
360
|
+
record.recordedAt = toIsoTimestamp(record.recordedAt, `${path}.recordedAt`);
|
|
361
|
+
const invocationId = record.actionInvocationId;
|
|
362
|
+
if (invocationId !== void 0 && invocationId !== null) {
|
|
363
|
+
assertNonEmptyString(invocationId, `${path}.actionInvocationId`);
|
|
364
|
+
}
|
|
365
|
+
}).sort(byEventOrder);
|
|
366
|
+
const invocationIds = [
|
|
367
|
+
...new Set(
|
|
368
|
+
events.map((event) => event.actionInvocationId).filter((id2) => typeof id2 === "string")
|
|
369
|
+
)
|
|
370
|
+
].sort(compareStrings);
|
|
371
|
+
const requested = new Set(invocationIds);
|
|
372
|
+
const read = async (method) => {
|
|
373
|
+
if (!method || invocationIds.length === 0) return [];
|
|
374
|
+
return method.call(port, { ...scope }, [...invocationIds]);
|
|
375
|
+
};
|
|
376
|
+
const [rawActionInvocations, rawPolicyEvaluations, rawAdapterInvocations] = await Promise.all([
|
|
377
|
+
read(port.listActionInvocations),
|
|
378
|
+
read(port.listPolicyEvaluations),
|
|
379
|
+
read(port.listAdapterInvocations)
|
|
380
|
+
]);
|
|
381
|
+
const actionInvocations = normalizeSection(rawActionInvocations, scope, "actionInvocations", (record, path) => {
|
|
382
|
+
if (!requested.has(record.id)) {
|
|
383
|
+
throw new EvidencePacketGenerationError(
|
|
384
|
+
"EVIDENCE_UNREQUESTED_RECORD",
|
|
385
|
+
`${path}.id (${String(record.id)}) is not one of the requested action invocations.`
|
|
386
|
+
);
|
|
387
|
+
}
|
|
388
|
+
}).sort(byId);
|
|
389
|
+
const policyEvaluations = normalizeSection(
|
|
390
|
+
rawPolicyEvaluations,
|
|
391
|
+
scope,
|
|
392
|
+
"policyEvaluations",
|
|
393
|
+
(record, path) => assertRequestedInvocation(record, path, requested)
|
|
394
|
+
).sort(byId);
|
|
395
|
+
const adapterInvocations = normalizeSection(
|
|
396
|
+
rawAdapterInvocations,
|
|
397
|
+
scope,
|
|
398
|
+
"adapterInvocations",
|
|
399
|
+
(record, path) => assertRequestedInvocation(record, path, requested)
|
|
400
|
+
).sort(byId);
|
|
401
|
+
const generatedAt = context.now ?? /* @__PURE__ */ new Date();
|
|
402
|
+
const id = options.idFactory ? options.idFactory() : createFabricId(FABRIC_ID_PREFIXES.complianceEvidencePacket);
|
|
403
|
+
assertNonEmptyString(id, "packet id");
|
|
404
|
+
const unredacted = {
|
|
405
|
+
schemaVersion: EVIDENCE_PACKET_SCHEMA_VERSION,
|
|
406
|
+
packetType,
|
|
407
|
+
tenantId: scope.tenantId,
|
|
408
|
+
spaceId: scope.spaceId,
|
|
409
|
+
primarySubject: { ...primary },
|
|
410
|
+
subjects: subjects.map((subject) => ({ ...subject })),
|
|
411
|
+
includeRelated,
|
|
412
|
+
...input.policyVersion !== void 0 ? { policyVersion: input.policyVersion } : {},
|
|
413
|
+
events,
|
|
414
|
+
actionInvocations,
|
|
415
|
+
policyEvaluations,
|
|
416
|
+
adapterInvocations
|
|
417
|
+
};
|
|
418
|
+
const anonymizationContext = {
|
|
419
|
+
tenantId: scope.tenantId,
|
|
420
|
+
spaceId: scope.spaceId,
|
|
421
|
+
jobId: options.anonymization?.jobId ?? id,
|
|
422
|
+
reason: options.anonymization?.reason ?? DEFAULT_EVIDENCE_REDACTION_REASON,
|
|
423
|
+
redactedAt: generatedAt,
|
|
424
|
+
...options.anonymization?.policyVersion !== void 0 ? { policyVersion: options.anonymization.policyVersion } : {}
|
|
425
|
+
};
|
|
426
|
+
const keySorted = JSON.parse(canonicalJson(unredacted));
|
|
427
|
+
const redacted = new AnonymizationEngine(options.anonymizationPolicy).anonymizeJsonValue(
|
|
428
|
+
keySorted,
|
|
429
|
+
anonymizationContext,
|
|
430
|
+
"evidence_packet"
|
|
431
|
+
);
|
|
432
|
+
const payload = { ...redacted.value, redaction: redacted.metadata };
|
|
433
|
+
for (const section of ["events", "actionInvocations", "policyEvaluations", "adapterInvocations"]) {
|
|
434
|
+
if (!Array.isArray(payload[section])) {
|
|
435
|
+
throw new EvidencePacketGenerationError(
|
|
436
|
+
"EVIDENCE_IDENTIFIER_REDACTED",
|
|
437
|
+
`The anonymization policy removed or replaced payload.${section}.`
|
|
438
|
+
);
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
const envelopeSubjects = redactedSubjects(payload.subjects);
|
|
442
|
+
const references = buildReferences(payload, keySorted);
|
|
443
|
+
return {
|
|
444
|
+
id,
|
|
445
|
+
tenantId: scope.tenantId,
|
|
446
|
+
spaceId: scope.spaceId,
|
|
447
|
+
packetType,
|
|
448
|
+
status: "sealed",
|
|
449
|
+
subjects: envelopeSubjects,
|
|
450
|
+
references,
|
|
451
|
+
payload,
|
|
452
|
+
generatedAt: generatedAt.toISOString(),
|
|
453
|
+
generatedBy: context.actorId,
|
|
454
|
+
...input.policyVersion !== void 0 ? { policyVersion: input.policyVersion } : {},
|
|
455
|
+
checksum: computeEvidencePacketChecksum(payload),
|
|
456
|
+
checksumAlgorithm: EVIDENCE_PACKET_CHECKSUM_ALGORITHM,
|
|
457
|
+
correlationId: context.correlationId,
|
|
458
|
+
...context.causationId !== void 0 ? { causationId: context.causationId } : {}
|
|
459
|
+
};
|
|
460
|
+
}
|
|
461
|
+
function verifyEvidencePacketChecksum(envelope) {
|
|
462
|
+
try {
|
|
463
|
+
if (!envelope || typeof envelope.checksum !== "string" || envelope.checksum.length === 0) return false;
|
|
464
|
+
if (envelope.checksumAlgorithm !== EVIDENCE_PACKET_CHECKSUM_ALGORITHM) return false;
|
|
465
|
+
return computeEvidencePacketChecksum(envelope.payload) === envelope.checksum;
|
|
466
|
+
} catch {
|
|
467
|
+
return false;
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
function createEvidencePacketRenderer(options) {
|
|
471
|
+
const { packetType = DEFAULT_EVIDENCE_PACKET_TYPE, ...generatorOptions } = options;
|
|
472
|
+
return {
|
|
473
|
+
packetType,
|
|
474
|
+
render: (input, context) => generateEvidencePacket({ ...input, packetType }, context, generatorOptions)
|
|
475
|
+
};
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
export { DEFAULT_EVIDENCE_PACKET_TYPE, DEFAULT_EVIDENCE_REDACTION_REASON, EVIDENCE_PACKET_CHECKSUM_ALGORITHM, EVIDENCE_PACKET_SCHEMA_VERSION, EvidencePacketGenerationError, canonicalJson, computeEvidencePacketChecksum, createEvidencePacketRenderer, generateEvidencePacket, verifyEvidencePacketChecksum };
|
|
479
|
+
//# sourceMappingURL=chunk-HEYMMVDP.js.map
|
|
480
|
+
//# sourceMappingURL=chunk-HEYMMVDP.js.map
|