sfscanner 0.1.0 → 0.2.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.
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/v2/scan-worker.ts", "../../../node_modules/@noble/hashes/_u64.js", "../../../node_modules/@noble/hashes/utils.js", "../../../node_modules/@noble/hashes/_md.js", "../../../node_modules/@noble/hashes/sha2.js", "../../../contracts/exclusion-registry.ts", "../../../contracts/limits.ts", "../../../contracts/scanner-limits.ts", "../../../contracts/scanner-limits-v2.ts", "../../scanner-core/src/canonical-json.ts", "../../../node_modules/@humanwhocodes/momoa/dist/momoa.js", "../../scanner-core/src/source/source-preflight.ts", "../../scanner-core/src/json-pointer.ts", "../../scanner-core/src/source/source-identities.ts", "../../scanner-core/src/source/source-tree-helpers.ts", "../../scanner-core/src/source/source-tree.ts", "../../scanner-core/src/source/scanner-limit-resolution.ts", "../../scanner-core/src/source/source-document-provenance.ts", "../../scanner-core/src/source/source-parser.ts", "../../scanner-core/src/workflow-v2/node-edge-identity.ts", "../../scanner-core/src/workflow-v2/ambiguity.ts", "../../scanner-core/src/workflow-v2/duplicate-ambiguities.ts", "../../scanner-core/src/workflow-v2/edge-normalization.ts", "../../scanner-core/src/analyzers/expression/expression-islands.ts", "../../scanner-core/src/provider-token-patterns.ts", "../../scanner-core/src/analyzers/expression/placeholder-classifier.ts", "../../scanner-core/src/analyzers/secrets/provider-token-registry.ts", "../../scanner-core/src/secret-classifier.ts", "../../scanner-core/src/workflow-v2/semantic-fields.ts", "../../scanner-core/src/workflow-v2/node-normalization.ts", "../../scanner-core/src/workflow-v2/workflow-digest.ts", "../../scanner-core/src/workflow-v2/validate-source-document.ts", "../../scanner-core/src/workflow-v2/normalize-security-workflow.ts", "../../scanner-core/src/semantics/semver.ts", "../../scanner-core/src/semantics/target-context.ts", "../../scanner-core/src/semantics/version-range.ts", "../../scanner-core/src/semantics/catalogue-admission.ts", "../../../docs/scanner/semantic-source-receipts.json", "../../scanner-core/src/semantics/builtin-provenance.ts", "../../scanner-core/src/semantics/builtin-catalogue.ts", "../../scanner-core/src/semantics/catalogue-resolver.ts", "../../scanner-core/src/semantics/generic-fallback.ts", "../../scanner-core/src/admission/snapshot.ts", "../../scanner-core/src/facts/safe-fact-registry.ts", "../../scanner-core/src/facts/safe-fact-validator.ts", "../../scanner-core/src/diagnostics/registry.ts", "../../scanner-core/src/diagnostics/identity.ts", "../../scanner-core/src/rules-v2/rule-authority.ts", "../../scanner-core/src/capabilities/adapter-evidence.ts", "../../scanner-core/src/advisories/advisory-applicability.ts", "../../scanner-core/src/analyzers/destinations/inventory.ts", "../../scanner-core/src/capabilities/semantic-context.ts", "../../scanner-core/src/workflow-graph-views.ts", "../../scanner-core/src/workflow-graph.ts", "../../scanner-core/src/capabilities/adapter-workflow.ts", "../../scanner-core/src/policy/policy-helpers.ts", "../../scanner-core/src/policies/domain-policy.ts", "../../scanner-core/src/policies/secret-indicators.ts", "../../scanner-core/src/policies/credential-policies.ts", "../../scanner-core/src/policies/execution-policies.ts", "../../scanner-core/src/policies/package-and-webhook-policies.ts", "../../scanner-core/src/policies/beta-policies.ts", "../../scanner-core/src/stable-order.ts", "../../scanner-core/src/workflow-insights.ts", "../../scanner-core/src/scan-insights.ts", "../../scanner-core/src/capabilities/count-lattice.ts", "../../scanner-core/src/policy/rule-catalog.ts", "../../scanner-core/src/capabilities/profile-manifest.ts", "../../scanner-core/src/capabilities/candidate-validator.ts", "../../scanner-core/src/capabilities/context-view.ts", "../../scanner-core/src/capabilities/scheduler.ts", "../../scanner-core/src/capabilities/beta-default.ts", "../../../contracts/scanner-v2-diagnostics.generated.ts", "../../../contracts/scanner-v2-result.ts", "../../scanner-core/src/result-v2/canonical-bytes.ts", "../../scanner-core/src/result-v2/display-label.ts", "../../scanner-core/src/result-v2/identities.ts", "../../scanner-core/src/v2/admitted-registry.ts", "../../scanner-core/src/result-v2/finding-authority.ts", "../../scanner-core/src/result-v2/compose-result.ts", "../../scanner-core/src/result-v2/scoring.ts", "../../scanner-core/src/workflow-v2/budget-outcomes.ts", "../../scanner-core/src/v2/span-loss-classification.ts", "../../scanner-core/src/v2/scan-workflow.ts"],
4
+ "sourcesContent": ["import { parentPort, workerData } from 'node:worker_threads';\nimport { scanWorkflowV2 } from '@hub/scanner-core/v2';\nimport type { ScanWorkerData } from './scan-worker-host';\n\nparentPort?.postMessage(scanWorkflowV2(workerData as ScanWorkerData));\n", "const U32_MASK64 = /* @__PURE__ */ (() => BigInt(2 ** 32 - 1))();\nconst _32n = /* @__PURE__ */ BigInt(32);\n// Split bigint into two 32-bit halves. With `le=true`, returned fields become `{ h: low, l: high\n// }` to match little-endian word order rather than the property names.\nfunction fromBig(n, le = false) {\n if (le)\n return { h: Number(n & U32_MASK64), l: Number((n >> _32n) & U32_MASK64) };\n return { h: Number((n >> _32n) & U32_MASK64) | 0, l: Number(n & U32_MASK64) | 0 };\n}\n// Split bigint list into `[highWords, lowWords]` when `le=false`; with `le=true`, the first array\n// holds the low halves because `fromBig(...)` swaps the semantic meaning of `h` and `l`.\nfunction split(lst, le = false) {\n const len = lst.length;\n let Ah = new Uint32Array(len);\n let Al = new Uint32Array(len);\n for (let i = 0; i < len; i++) {\n const { h, l } = fromBig(lst[i], le);\n [Ah[i], Al[i]] = [h, l];\n }\n return [Ah, Al];\n}\n// Combine explicit `(high, low)` 32-bit halves into a bigint; `>>> 0` normalizes signed JS\n// bitwise results back to uint32 first, and little-endian callers must swap.\nconst toBig = (h, l) => (BigInt(h >>> 0) << _32n) | BigInt(l >>> 0);\n// Split a JS number into u32 halves without a BigInt allocation. Exact only for integers\n// `0 <= n < 2**53`; callers use it on byte / bit counters, which JS length math caps far below\n// that (an ArrayBuffer cannot exceed 2**53 - 1 bytes).\nconst fromNumH = (n) => (n / 2 ** 32) | 0;\nconst fromNumL = (n) => n >>> 0;\n// Drop-in replacement for `view.setBigUint64(byteOffset, BigInt(n), isLE)` without the per-call\n// BigInt allocation. Same `n < 2**53` precondition as `fromNumH`/`fromNumL`.\nfunction setU64FromNum(view, byteOffset, n, isLE) {\n const h = fromNumH(n);\n const l = fromNumL(n);\n view.setUint32(byteOffset, isLE ? l : h, isLE);\n view.setUint32(byteOffset + 4, isLE ? h : l, isLE);\n}\n// High 32-bit half of a 64-bit logical right shift for `s` in `0..31`.\nconst shrSH = (h, _l, s) => h >>> s;\n// Low 32-bit half of a 64-bit logical right shift, valid for `s` in `1..31`.\nconst shrSL = (h, l, s) => (h << (32 - s)) | (l >>> s);\n// High 32-bit half of a 64-bit right rotate, valid for `s` in `1..31`.\nconst rotrSH = (h, l, s) => (h >>> s) | (l << (32 - s));\n// Low 32-bit half of a 64-bit right rotate, valid for `s` in `1..31`.\nconst rotrSL = (h, l, s) => (h << (32 - s)) | (l >>> s);\n// High 32-bit half of a 64-bit right rotate, valid for `s` in `33..63`; `32` uses `rotr32*`.\nconst rotrBH = (h, l, s) => (h << (64 - s)) | (l >>> (s - 32));\n// Low 32-bit half of a 64-bit right rotate, valid for `s` in `33..63`; `32` uses `rotr32*`.\nconst rotrBL = (h, l, s) => (h >>> (s - 32)) | (l << (64 - s));\n// High 32-bit half of a 64-bit right rotate for `s === 32`; this is just the swapped low half.\nconst rotr32H = (_h, l) => l;\n// Low 32-bit half of a 64-bit right rotate for `s === 32`; this is just the swapped high half.\nconst rotr32L = (h, _l) => h;\n// 64-bit left rotates (rotl*) are not defined here: sha3.ts, their only consumer, keeps\n// local copies so V8 inlines them into keccakP.\n// Add two split 64-bit words and return the split `{ h, l }` sum.\n// JS uses 32-bit signed integers for bitwise operations, so we cannot simply shift the carry out\n// of the low sum and instead use division.\nfunction add(Ah, Al, Bh, Bl) {\n const l = (Al >>> 0) + (Bl >>> 0);\n return { h: (Ah + Bh + ((l / 2 ** 32) | 0)) | 0, l: l | 0 };\n}\n// Addition with more than 2 elements\n// Unmasked low-word accumulator for 3-way addition; pass the raw result into `add3H(...)`.\nconst add3L = (Al, Bl, Cl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0);\n// High-word finalize step for 3-way addition; `low` must be the untruncated output of `add3L(...)`.\nconst add3H = (low, Ah, Bh, Ch) => (Ah + Bh + Ch + ((low / 2 ** 32) | 0)) | 0;\n// Unmasked low-word accumulator for 4-way addition; pass the raw result into `add4H(...)`.\nconst add4L = (Al, Bl, Cl, Dl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0);\n// High-word finalize step for 4-way addition; `low` must be the untruncated output of `add4L(...)`.\nconst add4H = (low, Ah, Bh, Ch, Dh) => (Ah + Bh + Ch + Dh + ((low / 2 ** 32) | 0)) | 0;\n// Unmasked low-word accumulator for 5-way addition; pass the raw result into `add5H(...)`.\nconst add5L = (Al, Bl, Cl, Dl, El) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0) + (El >>> 0);\n// High-word finalize step for 5-way addition; `low` must be the untruncated output of `add5L(...)`.\nconst add5H = (low, Ah, Bh, Ch, Dh, Eh) => (Ah + Bh + Ch + Dh + Eh + ((low / 2 ** 32) | 0)) | 0;\n// prettier-ignore\nexport { add, add3H, add3L, add4H, add4L, add5H, add5L, fromBig, fromNumH, fromNumL, rotr32H, rotr32L, rotrBH, rotrBL, rotrSH, rotrSL, setU64FromNum, shrSH, shrSL, split, toBig };\n", "/**\n * Checks if something is Uint8Array. Be careful: nodejs Buffer will return true.\n * @param a - value to test\n * @returns `true` when the value is a Uint8Array-compatible view.\n * @example\n * Check whether a value is a Uint8Array-compatible view.\n * ```ts\n * isBytes(new Uint8Array([1, 2, 3]));\n * ```\n */\nexport function isBytes(a) {\n // Plain `instanceof Uint8Array` is too strict for some Buffer / proxy / cross-realm cases.\n // The fallback still requires a real ArrayBuffer view, so plain\n // JSON-deserialized `{ constructor: ... }` spoofing is rejected, and\n // `BYTES_PER_ELEMENT === 1` keeps the fallback on byte-oriented views.\n return (a instanceof Uint8Array ||\n (ArrayBuffer.isView(a) &&\n a.constructor.name === 'Uint8Array' &&\n 'BYTES_PER_ELEMENT' in a &&\n a.BYTES_PER_ELEMENT === 1));\n}\n// Shared error-message prefix builder. Only called on throw paths, so assert\n// success paths never pay for the string concatenation.\nconst atitle = (title) => (title ? `\"${title}\" ` : '');\n/**\n * Asserts something is a non-negative integer.\n * @param n - number to validate\n * @param title - label included in thrown errors\n * @returns The validated number.\n * @throws On wrong argument types. {@link TypeError}\n * @throws On wrong argument ranges or values. {@link RangeError}\n * @example\n * Validate a non-negative integer option.\n * ```ts\n * anumber(32, 'length');\n * ```\n */\nexport function anumber(n, title = '') {\n if (typeof n !== 'number')\n throw new TypeError(atitle(title) + 'expected number, got ' + typeof n);\n if (!Number.isSafeInteger(n) || n < 0)\n throw new RangeError(atitle(title) + 'expected integer >= 0, got ' + n);\n return n;\n}\n/**\n * Asserts something is a boolean.\n * @param value - value to validate\n * @param title - label included in thrown errors\n * @returns The validated boolean.\n * @throws On wrong argument types. {@link TypeError}\n * @example\n * Validate a boolean option.\n * ```ts\n * abool(true, 'enableXOF');\n * ```\n */\nexport function abool(value, title = '') {\n if (typeof value !== 'boolean')\n throw new TypeError(atitle(title) + 'expected boolean, got type=' + typeof value);\n return value;\n}\n/**\n * Asserts something is Uint8Array.\n * @param value - value to validate\n * @param length - optional exact length constraint\n * @param title - label included in thrown errors\n * @returns The validated byte array.\n * @throws On wrong argument types. {@link TypeError}\n * @throws On wrong argument ranges or values. {@link RangeError}\n * @example\n * Validate that a value is a byte array.\n * ```ts\n * abytes(new Uint8Array([1, 2, 3]));\n * ```\n */\nexport function abytes(value, length, title = '') {\n // Success path first: this runs at the start of every update() / digestInto(), and the\n // common `abytes(data)` form must not pay for length handling it does not use.\n if (isBytes(value) && (length === undefined || value.length === length))\n return value;\n // Error path: recompute freely to build the exact message.\n if (length !== undefined)\n anumber(length, 'length');\n const bytes = isBytes(value);\n const ofLen = length !== undefined ? ` of length ${length}` : '';\n const got = bytes ? `length=${value.length}` : `type=${typeof value}`;\n const message = atitle(title) + 'expected Uint8Array' + ofLen + ', got ' + got;\n if (!bytes)\n throw new TypeError(message);\n throw new RangeError(message);\n}\n/**\n * Copies bytes into a fresh Uint8Array.\n * Buffer-style slices can alias the same backing store, so callers that need ownership should copy.\n * @param bytes - source bytes to clone\n * @returns Freshly allocated copy of `bytes`.\n * @throws On wrong argument types. {@link TypeError}\n * @example\n * Clone a byte array before mutating it.\n * ```ts\n * const copy = copyBytes(new Uint8Array([1, 2, 3]));\n * ```\n */\nexport function copyBytes(bytes) {\n // `Uint8Array.from(...)` would also accept arrays / other typed arrays. Keep this helper strict\n // because callers use it at byte-validation boundaries before mutating the detached copy.\n return Uint8Array.from(abytes(bytes));\n}\n/**\n * Asserts something is a wrapped hash constructor.\n * @param h - hash constructor to validate\n * @throws On wrong argument types or invalid hash wrapper shape. {@link TypeError}\n * @throws On invalid hash metadata ranges or values. {@link RangeError}\n * @throws If the hash metadata allows empty outputs or block sizes. {@link Error}\n * @example\n * Validate a callable hash wrapper.\n * ```ts\n * import { ahash } from '@noble/hashes/utils.js';\n * import { sha256 } from '@noble/hashes/sha2.js';\n * ahash(sha256);\n * ```\n */\nexport function ahash(h) {\n if (typeof h !== 'function' || typeof h.create !== 'function')\n throw new TypeError('expected hash wrapped by utils.createHasher');\n anumber(h.outputLen);\n anumber(h.blockLen);\n // HMAC and KDF callers treat these as real byte lengths; allowing zero lets fake wrappers pass\n // validation and can produce empty outputs instead of failing fast.\n if (h.outputLen < 1 || h.blockLen < 1)\n throw new Error('hash blockLen / outputLen must be >= 1');\n}\nconst aobject = (value, label) => {\n if (value === null || typeof value !== 'object' || Array.isArray(value))\n throw new TypeError((label === 'object' ? '' : `\"${label}\" `) + 'expected object, got type=' + typeof value);\n};\nconst aopts = (value, label) => {\n aobject(value, label);\n const proto = Object.getPrototypeOf(value);\n if (proto !== Object.prototype && proto !== null)\n throw new TypeError(`\"${label}\" expected plain object`);\n // Object.assign() treats an own \"__proto__\" source key as a write to the target's legacy\n // prototype setter. Reject it before merging so inherited option values cannot be injected.\n if (Object.hasOwn(value, '__proto__'))\n throw new TypeError(`\"${label}.__proto__\" is not allowed`);\n};\n/**\n * Asserts a hash instance has not been destroyed or finished.\n * @param instance - hash instance to validate\n * @param checkFinished - whether to reject finalized instances\n * @throws If the hash instance has already been destroyed or finalized. {@link Error}\n * @example\n * Validate that a hash instance is still usable.\n * ```ts\n * import { aexists } from '@noble/hashes/utils.js';\n * import { sha256 } from '@noble/hashes/sha2.js';\n * const hash = sha256.create();\n * aexists(hash);\n * ```\n */\nexport function aexists(instance, checkFinished = true) {\n // Runs on every update()/digestInto(); the flags are library-owned booleans, so only their\n // truthiness is checked - re-validating their type per call was pure hot-path overhead.\n if (instance.destroyed)\n throw new Error('hash was destroyed');\n if (checkFinished && instance.finished)\n throw new Error('digest() was already called');\n}\n/**\n * Asserts output is a sufficiently-sized byte array.\n * @param out - destination buffer\n * @param instance - hash instance providing output length\n * Oversized buffers are allowed; downstream code only promises to fill the first `outputLen` bytes.\n * @throws On wrong argument types. {@link TypeError}\n * @throws On wrong argument ranges or values. {@link RangeError}\n * @example\n * Validate a caller-provided digest buffer.\n * ```ts\n * import { aoutput } from '@noble/hashes/utils.js';\n * import { sha256 } from '@noble/hashes/sha2.js';\n * const hash = sha256.create();\n * aoutput(new Uint8Array(hash.outputLen), hash);\n * ```\n */\nexport function aoutput(out, instance) {\n abytes(out, undefined, 'output');\n // `outputLen` is a library-owned readonly number; the negated comparison keeps failing fast\n // when it is missing/NaN (comparisons with undefined/NaN are false) without an anumber() call.\n const min = instance.outputLen;\n if (!(out.length >= min)) {\n throw new RangeError('\"output\" expected length >= ' + min);\n }\n}\n/**\n * Casts a typed array view to Uint8Array.\n * @param arr - source typed array\n * @returns Uint8Array view over the same buffer.\n * @example\n * Reinterpret a typed array as bytes.\n * ```ts\n * u8(new Uint32Array([1, 2]));\n * ```\n */\nexport function u8(arr) {\n return new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n/**\n * Casts a typed array view to Uint32Array.\n * `arr.byteOffset` must already be 4-byte aligned or the platform\n * Uint32Array constructor will throw.\n * @param arr - source typed array\n * @returns Uint32Array view over the same buffer.\n * @example\n * Reinterpret a byte array as 32-bit words.\n * ```ts\n * u32(new Uint8Array(8));\n * ```\n */\nexport function u32(arr) {\n return new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));\n}\n/**\n * Zeroizes typed arrays in place. Warning: JS provides no guarantees.\n * @param arrays - arrays to overwrite with zeros\n * @example\n * Zeroize sensitive buffers in place.\n * ```ts\n * clean(new Uint8Array([1, 2, 3]));\n * ```\n */\nexport function clean(...arrays) {\n for (let i = 0; i < arrays.length; i++) {\n arrays[i].fill(0);\n }\n}\n/**\n * Creates a DataView for byte-level manipulation.\n * @param arr - source typed array\n * @returns DataView over the same buffer region.\n * @example\n * Create a DataView over an existing buffer.\n * ```ts\n * createView(new Uint8Array(4));\n * ```\n */\nexport function createView(arr) {\n return new DataView(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n/**\n * Rotate-right operation for uint32 values.\n * @param word - source word\n * @param shift - shift amount in bits\n * @returns Rotated word.\n * @example\n * Rotate a 32-bit word to the right.\n * ```ts\n * rotr(0x12345678, 8);\n * ```\n */\nexport function rotr(word, shift) {\n return (word << (32 - shift)) | (word >>> shift);\n}\n/**\n * Rotate-left operation for uint32 values.\n * @param word - source word\n * @param shift - shift amount in bits\n * @returns Rotated word.\n * @example\n * Rotate a 32-bit word to the left.\n * ```ts\n * rotl(0x12345678, 8);\n * ```\n */\nexport function rotl(word, shift) {\n return (word << shift) | ((word >>> (32 - shift)) >>> 0);\n}\n/** Whether the current platform is little-endian. */\nexport const isLE = /* @__PURE__ */ (() => new Uint8Array(new Uint32Array([0x11223344]).buffer)[0] === 0x44)();\n/**\n * Byte-swap operation for uint32 values.\n * @param word - source word\n * @returns Word with reversed byte order.\n * @example\n * Reverse the byte order of a 32-bit word.\n * ```ts\n * byteSwap(0x11223344);\n * ```\n */\nexport function byteSwap(word) {\n return (((word << 24) & 0xff000000) |\n ((word << 8) & 0xff0000) |\n ((word >>> 8) & 0xff00) |\n ((word >>> 24) & 0xff));\n}\n/**\n * Conditionally byte-swaps one 32-bit word on big-endian platforms.\n * @param n - source word\n * @returns Original or byte-swapped word depending on platform endianness.\n * @example\n * Normalize a 32-bit word for host endianness.\n * ```ts\n * swap8IfBE(0x11223344);\n * ```\n */\nexport const swap8IfBE = isLE\n ? (n) => n\n : (n) => byteSwap(n) >>> 0;\n/**\n * Byte-swaps every word of a Uint32Array in place.\n * @param arr - array to mutate\n * @returns The same array after mutation; callers pass live state arrays here.\n * @example\n * Reverse the byte order of every word in place.\n * ```ts\n * byteSwap32(new Uint32Array([0x11223344]));\n * ```\n */\nexport function byteSwap32(arr) {\n for (let i = 0; i < arr.length; i++) {\n arr[i] = byteSwap(arr[i]);\n }\n return arr;\n}\n/**\n * Conditionally byte-swaps a Uint32Array on big-endian platforms.\n * @param u - array to normalize for host endianness\n * @returns Original or byte-swapped array depending on platform endianness.\n * On big-endian runtimes this mutates `u` in place via `byteSwap32(...)`.\n * @example\n * Normalize a word array for host endianness.\n * ```ts\n * swap32IfBE(new Uint32Array([0x11223344]));\n * ```\n */\nexport const swap32IfBE = isLE\n ? (u) => u\n : byteSwap32;\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\nconst hasHexBuiltin = /* @__PURE__ */ (() => \n// @ts-ignore\ntypeof Uint8Array.from([]).toHex === 'function' && typeof Uint8Array.fromHex === 'function')();\n// Array where index 0xf0 (240) is mapped to string 'f0'\nconst hexes = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, '0'));\n/**\n * Convert byte array to hex string.\n * Uses the built-in function when available and assumes it matches the tested\n * fallback semantics.\n * @param bytes - bytes to encode\n * @returns Lowercase hexadecimal string.\n * @throws On wrong argument types. {@link TypeError}\n * @example\n * Convert bytes to lowercase hexadecimal.\n * ```ts\n * bytesToHex(Uint8Array.from([0xca, 0xfe, 0x01, 0x23])); // 'cafe0123'\n * ```\n */\nexport function bytesToHex(bytes) {\n abytes(bytes);\n // @ts-ignore\n if (hasHexBuiltin)\n return bytes.toHex();\n // pre-caching improves the speed 6x\n let hex = '';\n for (let i = 0; i < bytes.length; i++) {\n hex += hexes[bytes[i]];\n }\n return hex;\n}\n// Strict ASCII nibble parser: non-ASCII hex lookalikes are rejected as undefined.\n// ASCII codes: '0'..'9' = 48..57, 'A'..'F' = 65..70, 'a'..'f' = 97..102.\n// prettier-ignore\nfunction asciiToBase16(ch) {\n return ch >= 48 && ch <= 57 ? ch - 48 // '2' => 50-48\n : ch >= 65 && ch <= 70 ? ch - (65 - 10) // 'B' => 66-(65-10)\n : ch >= 97 && ch <= 102 ? ch - (97 - 10) // 'b' => 98-(97-10)\n : undefined;\n}\n/**\n * Convert hex string to byte array. Uses built-in function, when available.\n * @param hex - hexadecimal string to decode\n * @returns Decoded bytes.\n * @throws On wrong argument types. {@link TypeError}\n * @throws On wrong argument ranges or values. {@link RangeError}\n * @example\n * Decode lowercase hexadecimal into bytes.\n * ```ts\n * hexToBytes('cafe0123'); // Uint8Array.from([0xca, 0xfe, 0x01, 0x23])\n * ```\n */\nexport function hexToBytes(hex) {\n if (typeof hex !== 'string')\n throw new TypeError('hex string expected, got ' + typeof hex);\n if (hasHexBuiltin) {\n try {\n return Uint8Array.fromHex(hex);\n }\n catch (error) {\n if (error instanceof SyntaxError)\n throw new RangeError(error.message);\n throw error;\n }\n }\n const hl = hex.length;\n const al = hl / 2;\n if (hl % 2)\n throw new RangeError('hex string expected, got unpadded hex of length ' + hl);\n const array = new Uint8Array(al);\n for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {\n const n1 = asciiToBase16(hex.charCodeAt(hi)); // parse first char, multiply it by 16\n const n2 = asciiToBase16(hex.charCodeAt(hi + 1)); // parse second char\n if (n1 === undefined || n2 === undefined) {\n const char = hex[hi] + hex[hi + 1];\n throw new RangeError('hex string expected, got non-hex character \"' + char + '\" at index ' + hi);\n }\n array[ai] = n1 * 16 + n2; // example: 'A9' => 10*16 + 9\n }\n return array;\n}\n/**\n * Yields to the host task scheduler so timers, I/O, and rendering can make progress.\n * Uses the Web Scheduling API when available or `setTimeout` as a cross-platform fallback.\n * Host-task yields are much slower than microtasks (roughly 1ms with the timer fallback), so\n * async loops should use `asyncTick >= 10` to amortize scheduling overhead to about 10% while\n * still allowing other event-loop work to proceed.\n * @param onReject - optional cleanup invoked only if the host yield fails\n * @example\n * Yield to the next scheduler tick.\n * ```ts\n * await nextTick();\n * ```\n */\nexport function nextTick(onReject) {\n const host = globalThis;\n if (typeof host.scheduler?.yield === 'function') {\n const promise = host.scheduler.yield();\n // Keep the original scheduler rejection; this handler exists only for cleanup.\n if (onReject)\n promise.catch(onReject);\n return promise;\n }\n return new Promise((resolve) => host.setTimeout(resolve, 0));\n}\n/**\n * Returns control to the host event loop every `tick` milliseconds to avoid blocking long loops.\n * @param iters - number of loop iterations to run\n * @param tick - maximum time slice in milliseconds\n * @param cb - callback executed on each iteration\n * @param onReject - optional cleanup invoked only if a host yield fails\n * @throws On wrong argument types. {@link TypeError}\n * @throws On wrong argument ranges or values. {@link RangeError}\n * @example\n * Run a loop that periodically yields back to the event loop.\n * ```ts\n * await asyncLoop(2, 0, () => {});\n * ```\n */\nexport async function asyncLoop(iters, tick, cb, onReject) {\n anumber(iters, 'iters');\n anumber(tick, 'tick');\n if (typeof cb !== 'function')\n throw new TypeError('callback must be a function');\n // Callback is synchronous by contract; asyncLoop only yields between sync work windows.\n let ts = Date.now();\n for (let i = 0; i < iters; i++) {\n cb(i);\n // Date.now() is not monotonic, so in case if clock goes backwards we return return control too\n const diff = Date.now() - ts;\n if (diff >= 0 && diff < tick)\n continue;\n await nextTick(onReject);\n // Track only synchronous work time; scheduler delay after yielding is outside our budget.\n ts = Date.now();\n }\n}\n/**\n * Converts string to bytes using UTF8 encoding.\n * Built-in doesn't validate input to be string: we do the check.\n * Non-ASCII details are delegated to the platform `TextEncoder`.\n * @param str - string to encode\n * @returns UTF-8 encoded bytes.\n * @throws On wrong argument types. {@link TypeError}\n * @example\n * Encode a string as UTF-8 bytes.\n * ```ts\n * utf8ToBytes('abc'); // Uint8Array.from([97, 98, 99])\n * ```\n */\nexport function utf8ToBytes(str) {\n if (typeof str !== 'string')\n throw new TypeError('string expected');\n const encoded = new TextEncoder().encode(str);\n try {\n // Copy into the current realm for Firefox extension contexts. Callers that own the returned\n // buffer can then wipe it independently of TextEncoder's temporary result.\n return new Uint8Array(encoded); // https://bugzil.la/1681809\n }\n finally {\n clean(encoded);\n }\n}\n/**\n * Helper for KDFs: consumes Uint8Array or string.\n * String inputs are UTF-8 encoded; byte-array inputs stay aliased to the caller buffer.\n * @param data - user-provided KDF input\n * @param errorTitle - label included in thrown errors\n * @returns Byte representation of the input.\n * @throws On wrong argument types. {@link TypeError}\n * @example\n * Normalize KDF input to bytes.\n * ```ts\n * kdfInputToBytes('password');\n * ```\n */\nexport function kdfInputToBytes(data, errorTitle = '') {\n if (typeof data === 'string')\n return utf8ToBytes(data);\n return abytes(data, undefined, errorTitle);\n}\n/**\n * Copies several Uint8Arrays into one.\n * @param arrays - arrays to concatenate\n * @returns Concatenated byte array.\n * @throws On wrong argument types. {@link TypeError}\n * @example\n * Concatenate multiple byte arrays.\n * ```ts\n * concatBytes(new Uint8Array([1]), new Uint8Array([2]));\n * ```\n */\nexport function concatBytes(...arrays) {\n let sum = 0;\n for (let i = 0; i < arrays.length; i++) {\n const a = arrays[i];\n abytes(a);\n sum += a.length;\n }\n const res = new Uint8Array(sum);\n for (let i = 0, pad = 0; i < arrays.length; i++) {\n const a = arrays[i];\n res.set(a, pad);\n pad += a.length;\n }\n return res;\n}\n/**\n * Validates declared required and optional field types on a plain object.\n * This walks field schemas and formats detailed errors, so avoid it on hot paths; use direct\n * one-line guards such as `abytes()`, `abool()`, or `anumber()` instead.\n * @param object - object to validate\n * @param fields - map of required field names to expected types\n * @param optFields - map of optional field names to expected types\n * @param title - label included in thrown errors\n * @throws On wrong argument types. {@link TypeError}\n * @example\n * Validate required and optional option fields.\n * ```ts\n * validateObject({ N: 1024, dkLen: 32 }, { N: 'number' }, { dkLen: 'number' });\n * ```\n */\nexport const validateObject = (object, fields = {}, optFields = {}, title = 'object') => {\n aobject(object, title);\n aobject(fields, 'fields');\n aobject(optFields, 'optFields');\n function checkField(fieldName, expectedType, isOpt) {\n const label = title === 'object' ? `param \"${String(fieldName)}\"` : `\"${title}.${String(fieldName)}\"`;\n // Config fields must be explicit own properties. Optional inherited values are rejected too\n // because callers keep reading the same options object after validation.\n const val = object[fieldName];\n // Runtime objects such as Field instances intentionally satisfy required method slots\n // via their shared prototype.\n if (!Object.hasOwn(object, fieldName) &&\n (isOpt ? val !== undefined : expectedType !== 'function')) {\n throw new TypeError(`${label} is invalid: expected own property`);\n }\n if (isOpt && val === undefined)\n return;\n const current = typeof val;\n if (current !== expectedType || val === null)\n throw new TypeError(`${label} is invalid: expected ${expectedType}, got ${current}`);\n }\n const iter = (f, isOpt) => Object.entries(f).forEach(([k, v]) => checkField(k, v, isOpt));\n iter(fields, false);\n iter(optFields, true);\n};\n/**\n * Merges default options and passed options.\n * @param defaults - base option object\n * @param opts - user overrides\n * @param title - label included in thrown override errors\n * @returns Fresh merged option object with a null prototype.\n * @throws On wrong argument types. {@link TypeError}\n * @example\n * Merge user overrides onto default options.\n * ```ts\n * checkOpts({ dkLen: 32 }, { asyncTick: 10 });\n * ```\n */\nexport function checkOpts(defaults, opts, title = 'opts') {\n aopts(defaults, 'defaults');\n if (opts !== undefined)\n aopts(opts, title);\n // Callers read optional fields directly, so omitted values must not fall through to ambient\n // Object.prototype pollution (for example a forged `dkLen` changing SHAKE's default output).\n const merged = Object.assign(Object.create(null), defaults, opts);\n return merged;\n}\n/**\n * Creates a callable hash function from a stateful class constructor.\n * @param hashCons - hash constructor or factory\n * @param info - optional metadata such as DER OID\n * @returns Frozen callable hash wrapper with `.create()`.\n * Wrapper construction eagerly calls `hashCons(undefined)` once to read\n * `outputLen` / `blockLen`, so constructor side effects happen at module\n * init time.\n * @throws On wrong argument types. {@link TypeError}\n * @example\n * Wrap a stateful hash constructor into a callable helper.\n * ```ts\n * import { createHasher } from '@noble/hashes/utils.js';\n * import { sha256 } from '@noble/hashes/sha2.js';\n * const wrapped = createHasher(sha256.create, { oid: sha256.oid });\n * wrapped(new Uint8Array([1]));\n * ```\n */\nexport function createHasher(hashCons, info = {}) {\n if (typeof hashCons !== 'function')\n throw new TypeError('\"hashCons\" expected function, got type=' + typeof hashCons);\n info = checkOpts({}, info, 'info');\n const hashC = (msg, opts) => hashCons(opts)\n .update(msg)\n .digest();\n const tmp = hashCons(undefined);\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.canXOF = tmp.canXOF;\n hashC.create = (opts) => hashCons(opts);\n Object.assign(hashC, info);\n return Object.freeze(hashC);\n}\n/**\n * Cryptographically secure PRNG backed by `crypto.getRandomValues`.\n * @param bytesLength - number of random bytes to generate\n * @returns Random bytes.\n * The platform `getRandomValues()` implementation still defines any\n * single-call length cap, and this helper rejects oversize requests\n * with a stable library `RangeError` instead of host-specific errors.\n * @throws On wrong argument types. {@link TypeError}\n * @throws On wrong argument ranges or values. {@link RangeError}\n * @throws If the current runtime does not provide `crypto.getRandomValues`. {@link Error}\n * @example\n * Generate a fresh random key or nonce.\n * ```ts\n * const key = randomBytes(16);\n * ```\n */\nexport function randomBytes(bytesLength = 32) {\n // Match the repo's other length-taking helpers instead of relying on Uint8Array coercion.\n anumber(bytesLength, 'bytesLength');\n const cr = typeof globalThis === 'object' ? globalThis.crypto : null;\n if (typeof cr?.getRandomValues !== 'function')\n throw new Error('crypto.getRandomValues must be defined');\n // Web Cryptography API Level 2 \u00A710.1.1:\n // if `byteLength > 65536`, throw `QuotaExceededError`.\n // Keep the guard explicit so callers can see the quota in code\n // instead of discovering it by reading the spec or host errors.\n // This wrapper surfaces the same quota as a stable library RangeError.\n if (bytesLength > 65536)\n throw new RangeError(`\"bytesLength\" expected <= 65536, got ${bytesLength}`);\n return cr.getRandomValues(new Uint8Array(bytesLength));\n}\n/**\n * Creates OID metadata for NIST hashes with prefix `06 09 60 86 48 01 65 03 04 02`.\n * @param suffix - final OID byte for the selected hash.\n * The helper accepts any byte even though only the documented NIST hash\n * suffixes are meaningful downstream.\n * @returns Object containing the DER-encoded OID.\n * @example\n * Build OID metadata for a NIST hash.\n * ```ts\n * oidNist(0x01);\n * ```\n */\nexport const oidNist = (suffix) => ({\n // Current NIST hashAlgs suffixes used here fit in one DER subidentifier octet.\n // Larger suffix values would need base-128 OID encoding and a different length byte.\n oid: Uint8Array.from([0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, suffix]),\n});\n", "/**\n * Internal Merkle-Damgard hash utils.\n * @module\n */\nimport { setU64FromNum } from \"./_u64.js\";\nimport { abytes, aexists, aoutput, createView } from \"./utils.js\";\n/**\n * Shared 32-bit conditional boolean primitive reused by SHA-256, SHA-1, and MD5 `F`.\n * Returns bits from `b` when `a` is set, otherwise from `c`.\n * The XOR form is equivalent to MD5's `F(X,Y,Z) = XY v not(X)Z` because the masked terms never\n * set the same bit.\n * @param a - selector word\n * @param b - word chosen when selector bit is set\n * @param c - word chosen when selector bit is clear\n * @returns Mixed 32-bit word.\n * @example\n * Combine three words with the shared 32-bit choice primitive.\n * ```ts\n * Chi(0xffffffff, 0x12345678, 0x87654321);\n * ```\n */\nexport function Chi(a, b, c) {\n return (a & b) ^ (~a & c);\n}\n/**\n * Shared 32-bit majority primitive reused by SHA-256 and SHA-1.\n * Returns bits shared by at least two inputs.\n * @param a - first input word\n * @param b - second input word\n * @param c - third input word\n * @returns Mixed 32-bit word.\n * @example\n * Combine three words with the shared 32-bit majority primitive.\n * ```ts\n * Maj(0xffffffff, 0x12345678, 0x87654321);\n * ```\n */\nexport function Maj(a, b, c) {\n return (a & b) ^ (a & c) ^ (b & c);\n}\n/**\n * Merkle-Damgard hash construction base class.\n * Could be used to create MD5, RIPEMD, SHA1, SHA2.\n * Accepts only byte-aligned `Uint8Array` input, even when the underlying spec describes bit\n * strings with partial-byte tails.\n * @param blockLen - internal block size in bytes\n * @param outputLen - digest size in bytes\n * @param padOffset - trailing length field size in bytes\n * @param isLE - whether length and state words are encoded in little-endian\n * @example\n * Use a concrete subclass to get the shared Merkle-Damgard update/digest flow.\n * ```ts\n * import { _SHA1 } from '@noble/hashes/legacy.js';\n * const hash = new _SHA1();\n * hash.update(new Uint8Array([97, 98, 99]));\n * hash.digest();\n * ```\n */\nexport class HashMD {\n blockLen;\n outputLen;\n canXOF = false;\n padOffset;\n isLE;\n // For partial updates less than block size\n buffer;\n view;\n finished = false;\n length = 0;\n pos = 0;\n destroyed = false;\n constructor(blockLen, outputLen, padOffset, isLE) {\n this.blockLen = blockLen;\n this.outputLen = outputLen;\n this.padOffset = padOffset;\n this.isLE = isLE;\n this.buffer = new Uint8Array(blockLen);\n this.view = createView(this.buffer);\n }\n update(data) {\n aexists(this);\n abytes(data);\n const { view, buffer, blockLen } = this;\n const len = data.length;\n let processed = false;\n for (let pos = 0; pos < len;) {\n const take = Math.min(blockLen - this.pos, len - pos);\n // Fast path only when there is no buffered partial block: `take === blockLen` implies\n // `this.pos === 0`, so we can process full blocks directly from the input view.\n if (take === blockLen) {\n const dataView = createView(data);\n for (; blockLen <= len - pos; pos += blockLen)\n this.process(dataView, pos);\n processed = true;\n continue;\n }\n // When the whole input is buffered in one go (common for short messages), passing `data`\n // directly avoids allocating a subarray view.\n buffer.set(pos === 0 && take === len ? data : data.subarray(pos, pos + take), this.pos);\n this.pos += take;\n pos += take;\n if (this.pos === blockLen) {\n this.process(view, 0);\n this.pos = 0;\n processed = true;\n }\n }\n this.length += data.length;\n // Shared schedule buffers only pick up input-derived words inside process(); if everything\n // was buffered without processing, there is nothing to zero.\n if (processed)\n this.roundClean();\n return this;\n }\n digestInto(out) {\n aexists(this);\n aoutput(out, this);\n this.finished = true;\n // Padding\n // We can avoid allocation of buffer for padding completely if it\n // was previously not allocated here. But it won't change performance.\n const { buffer, view, blockLen, isLE } = this;\n let { pos } = this;\n // append the bit '1' to the message, then zero-pad the rest of the block\n buffer[pos++] = 0b10000000;\n buffer.fill(0, pos);\n // we have less than padOffset left in buffer, so we cannot put length in\n // current block, need process it and pad again\n if (this.padOffset > blockLen - pos) {\n this.process(view, 0);\n buffer.fill(0);\n }\n // `padOffset` reserves the whole length field. For SHA-384/512 the high 64 bits stay zero from\n // the padding fill above, and JS will overflow before user input can make that half non-zero.\n // So we only need to write the low 64 bits here (`length * 8` only scales the exponent of an\n // integer below 2**53, so the split inside the helper stays exact).\n setU64FromNum(view, blockLen - 8, this.length * 8, isLE);\n this.process(view, 0);\n // The final block above is processed outside update(), so the shared message-schedule\n // buffers (e.g. SHA256_W) would otherwise retain input-derived words after digest().\n this.roundClean();\n // digest() passes our own `buffer` as `out`; reuse its cached view instead of allocating one.\n const oview = out === buffer ? view : createView(out);\n const len = this.outputLen;\n // NOTE: we do division by 4 later, which must be fused in single op with modulo by JIT\n const outLen = len / 4;\n const state = this.get();\n // Subclass-misconfiguration invariant: outputLen must be 32-bit aligned and fit the state.\n if (len % 4 || outLen > state.length)\n throw new Error('invalid outputLen');\n for (let i = 0; i < outLen; i++)\n oview.setUint32(4 * i, state[i], isLE);\n }\n digest() {\n const { buffer, outputLen } = this;\n this.digestInto(buffer);\n // Copy before destroy(): subclasses wipe `buffer` during cleanup, but `digest()` must return\n // fresh bytes to the caller.\n const res = buffer.slice(0, outputLen);\n this.destroy();\n return res;\n }\n _cloneIntoMeta(to) {\n const { buffer, length, finished, destroyed, pos } = this;\n to.destroyed = destroyed;\n to.finished = finished;\n to.length = length;\n to.pos = pos;\n // Only partial-block bytes need copying: when `length % blockLen === 0`, `pos === 0` and\n // later `update()` / `digestInto()` overwrite `to.buffer` from the start before reading it.\n if (pos)\n to.buffer.set(buffer); // Avoid a hot modulo guard.\n return to;\n }\n clone() {\n return this._cloneInto();\n }\n}\n/**\n * Initial SHA-2 state: fractional parts of square roots of first 16 primes 2..53.\n * Check out `test/misc/sha2-gen-iv.js` for recomputation guide.\n */\n/** Initial SHA256 state from RFC 6234 \u00A76.1: the first 32 bits of the fractional parts of the\n * square roots of the first eight prime numbers. Exported as a shared table; callers must treat\n * it as read-only because constructors copy words from it by index. */\nexport const SHA256_IV = /* @__PURE__ */ Uint32Array.from([\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,\n]);\n/** Initial SHA224 state `H(0)` from RFC 6234 \u00A76.1. Exported as a shared table; callers must\n * treat it as read-only because constructors copy words from it by index. */\nexport const SHA224_IV = /* @__PURE__ */ Uint32Array.from([\n 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4,\n]);\n/** Initial SHA384 state from RFC 6234 \u00A76.3: eight RFC 64-bit `H(0)` words stored as sixteen\n * big-endian 32-bit halves. Derived from the fractional parts of the square roots of the ninth\n * through sixteenth prime numbers. Exported as a shared table; callers must treat it as read-only\n * because constructors copy halves from it by index. */\nexport const SHA384_IV = /* @__PURE__ */ Uint32Array.from([\n 0xcbbb9d5d, 0xc1059ed8, 0x629a292a, 0x367cd507, 0x9159015a, 0x3070dd17, 0x152fecd8, 0xf70e5939,\n 0x67332667, 0xffc00b31, 0x8eb44a87, 0x68581511, 0xdb0c2e0d, 0x64f98fa7, 0x47b5481d, 0xbefa4fa4,\n]);\n/** Initial SHA512 state from RFC 6234 \u00A76.3: eight RFC 64-bit `H(0)` words stored as sixteen\n * big-endian 32-bit halves. Derived from the fractional parts of the square roots of the first\n * eight prime numbers. Exported as a shared table; callers must treat it as read-only because\n * constructors copy halves from it by index. */\nexport const SHA512_IV = /* @__PURE__ */ Uint32Array.from([\n 0x6a09e667, 0xf3bcc908, 0xbb67ae85, 0x84caa73b, 0x3c6ef372, 0xfe94f82b, 0xa54ff53a, 0x5f1d36f1,\n 0x510e527f, 0xade682d1, 0x9b05688c, 0x2b3e6c1f, 0x1f83d9ab, 0xfb41bd6b, 0x5be0cd19, 0x137e2179,\n]);\n", "/**\n * SHA2 hash function. A.k.a. sha256, sha384, sha512, sha512_224, sha512_256.\n * SHA256 is the fastest hash implementable in JS, even faster than Blake3.\n * Check out {@link https://www.rfc-editor.org/rfc/rfc4634 | RFC 4634} and\n * {@link https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf | FIPS 180-4}.\n * @module\n */\nimport { Chi, HashMD, Maj, SHA224_IV, SHA256_IV, SHA384_IV, SHA512_IV } from \"./_md.js\";\nimport * as u64 from \"./_u64.js\";\nimport { clean, createHasher, oidNist, rotr } from \"./utils.js\";\n/**\n * SHA-224 / SHA-256 round constants from RFC 6234 \u00A75.1: the first 32 bits\n * of the cube roots of the first 64 primes (2..311).\n */\n// prettier-ignore\nconst SHA256_K = /* @__PURE__ */ Uint32Array.from([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\n]);\n/** Reusable SHA-224 / SHA-256 message schedule buffer `W_t` from RFC 6234 \u00A76.2 step 1. */\nconst SHA256_W = /* @__PURE__ */ new Uint32Array(64);\n/** Internal SHA-224 / SHA-256 compression engine from RFC 6234 \u00A76.2. */\nclass SHA2_32B extends HashMD {\n // We cannot use array here since array allows indexing by variable\n // which means optimizer/compiler cannot use registers.\n // Numeric initializers matter: starting the fields as `undefined` changes\n // V8's field representation and makes sha256 3x slower (measured).\n A = 0;\n B = 0;\n C = 0;\n D = 0;\n E = 0;\n F = 0;\n G = 0;\n H = 0;\n constructor(outputLen, IV) {\n super(64, outputLen, 8, false);\n this.A = IV[0] | 0;\n this.B = IV[1] | 0;\n this.C = IV[2] | 0;\n this.D = IV[3] | 0;\n this.E = IV[4] | 0;\n this.F = IV[5] | 0;\n this.G = IV[6] | 0;\n this.H = IV[7] | 0;\n }\n get() {\n const { A, B, C, D, E, F, G, H } = this;\n return [A, B, C, D, E, F, G, H];\n }\n // prettier-ignore\n set(A, B, C, D, E, F, G, H) {\n this.A = A | 0;\n this.B = B | 0;\n this.C = C | 0;\n this.D = D | 0;\n this.E = E | 0;\n this.F = F | 0;\n this.G = G | 0;\n this.H = H | 0;\n }\n _cloneInto(to) {\n (to ||= new this.constructor()).set(...this.get());\n return this._cloneIntoMeta(to);\n }\n process(view, offset) {\n // Extend the first 16 words into the remaining 48 words w[16..63] of the message schedule array\n for (let i = 0; i < 16; i++, offset += 4)\n SHA256_W[i] = view.getUint32(offset, false);\n for (let i = 16; i < 64; i++) {\n const W15 = SHA256_W[i - 15];\n const W2 = SHA256_W[i - 2];\n const s0 = rotr(W15, 7) ^ rotr(W15, 18) ^ (W15 >>> 3);\n const s1 = rotr(W2, 17) ^ rotr(W2, 19) ^ (W2 >>> 10);\n SHA256_W[i] = (s1 + SHA256_W[i - 7] + s0 + SHA256_W[i - 16]) | 0;\n }\n // Compression function main loop, 64 rounds\n let { A, B, C, D, E, F, G, H } = this;\n for (let i = 0; i < 64; i++) {\n const sigma1 = rotr(E, 6) ^ rotr(E, 11) ^ rotr(E, 25);\n const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n const sigma0 = rotr(A, 2) ^ rotr(A, 13) ^ rotr(A, 22);\n const T2 = (sigma0 + Maj(A, B, C)) | 0;\n H = G;\n G = F;\n F = E;\n E = (D + T1) | 0;\n D = C;\n C = B;\n B = A;\n A = (T1 + T2) | 0;\n }\n // Add the compressed chunk to the current hash value\n A = (A + this.A) | 0;\n B = (B + this.B) | 0;\n C = (C + this.C) | 0;\n D = (D + this.D) | 0;\n E = (E + this.E) | 0;\n F = (F + this.F) | 0;\n G = (G + this.G) | 0;\n H = (H + this.H) | 0;\n this.set(A, B, C, D, E, F, G, H);\n }\n roundClean() {\n clean(SHA256_W);\n }\n destroy() {\n // HashMD callers route post-destroy usability through `destroyed`; zeroizing alone still leaves\n // update()/digest() callable on reused instances.\n this.destroyed = true;\n this.set(0, 0, 0, 0, 0, 0, 0, 0);\n clean(this.buffer);\n }\n}\n/** Internal SHA-256 hash class grounded in RFC 6234 \u00A76.2. */\nexport class _SHA256 extends SHA2_32B {\n constructor() {\n super(32, SHA256_IV);\n }\n}\n/** Internal SHA-224 hash class grounded in RFC 6234 \u00A76.2 and \u00A78.5. */\nexport class _SHA224 extends SHA2_32B {\n constructor() {\n super(28, SHA224_IV);\n }\n}\n// SHA2-512 is slower than sha256 in js because u64 operations are slow.\n// SHA-384 / SHA-512 round constants from RFC 6234 \u00A75.2:\n// 80 full 64-bit words split into high/low halves.\n// prettier-ignore\nconst K512 = /* @__PURE__ */ (() => u64.split([\n '0x428a2f98d728ae22', '0x7137449123ef65cd', '0xb5c0fbcfec4d3b2f', '0xe9b5dba58189dbbc',\n '0x3956c25bf348b538', '0x59f111f1b605d019', '0x923f82a4af194f9b', '0xab1c5ed5da6d8118',\n '0xd807aa98a3030242', '0x12835b0145706fbe', '0x243185be4ee4b28c', '0x550c7dc3d5ffb4e2',\n '0x72be5d74f27b896f', '0x80deb1fe3b1696b1', '0x9bdc06a725c71235', '0xc19bf174cf692694',\n '0xe49b69c19ef14ad2', '0xefbe4786384f25e3', '0x0fc19dc68b8cd5b5', '0x240ca1cc77ac9c65',\n '0x2de92c6f592b0275', '0x4a7484aa6ea6e483', '0x5cb0a9dcbd41fbd4', '0x76f988da831153b5',\n '0x983e5152ee66dfab', '0xa831c66d2db43210', '0xb00327c898fb213f', '0xbf597fc7beef0ee4',\n '0xc6e00bf33da88fc2', '0xd5a79147930aa725', '0x06ca6351e003826f', '0x142929670a0e6e70',\n '0x27b70a8546d22ffc', '0x2e1b21385c26c926', '0x4d2c6dfc5ac42aed', '0x53380d139d95b3df',\n '0x650a73548baf63de', '0x766a0abb3c77b2a8', '0x81c2c92e47edaee6', '0x92722c851482353b',\n '0xa2bfe8a14cf10364', '0xa81a664bbc423001', '0xc24b8b70d0f89791', '0xc76c51a30654be30',\n '0xd192e819d6ef5218', '0xd69906245565a910', '0xf40e35855771202a', '0x106aa07032bbd1b8',\n '0x19a4c116b8d2d0c8', '0x1e376c085141ab53', '0x2748774cdf8eeb99', '0x34b0bcb5e19b48a8',\n '0x391c0cb3c5c95a63', '0x4ed8aa4ae3418acb', '0x5b9cca4f7763e373', '0x682e6ff3d6b2b8a3',\n '0x748f82ee5defb2fc', '0x78a5636f43172f60', '0x84c87814a1f0ab72', '0x8cc702081a6439ec',\n '0x90befffa23631e28', '0xa4506cebde82bde9', '0xbef9a3f7b2c67915', '0xc67178f2e372532b',\n '0xca273eceea26619c', '0xd186b8c721c0c207', '0xeada7dd6cde0eb1e', '0xf57d4f7fee6ed178',\n '0x06f067aa72176fba', '0x0a637dc5a2c898a6', '0x113f9804bef90dae', '0x1b710b35131c471b',\n '0x28db77f523047d84', '0x32caab7b40c72493', '0x3c9ebe0a15c9bebc', '0x431d67c49c100d4c',\n '0x4cc5d4becb3e42b6', '0x597f299cfc657e2a', '0x5fcb6fab3ad6faec', '0x6c44198c4a475817'\n].map(n => BigInt(n))))();\nconst SHA512_Kh = /* @__PURE__ */ (() => K512[0])();\nconst SHA512_Kl = /* @__PURE__ */ (() => K512[1])();\n// Reusable high-half schedule buffer for the RFC 6234 \u00A76.4 64-bit `W_t` words.\nconst SHA512_W_H = /* @__PURE__ */ new Uint32Array(80);\n// Reusable low-half schedule buffer for the RFC 6234 \u00A76.4 64-bit `W_t` words.\nconst SHA512_W_L = /* @__PURE__ */ new Uint32Array(80);\n/** Internal SHA-384 / SHA-512 compression engine from RFC 6234 \u00A76.4. */\nclass SHA2_64B extends HashMD {\n // We cannot use array here since array allows indexing by variable\n // which means optimizer/compiler cannot use registers.\n // h -- high 32 bits, l -- low 32 bits\n // Numeric initializers matter: starting the fields as `undefined` changes\n // V8's field representation and slows hashing down (measured on sha256).\n Ah = 0;\n Al = 0;\n Bh = 0;\n Bl = 0;\n Ch = 0;\n Cl = 0;\n Dh = 0;\n Dl = 0;\n Eh = 0;\n El = 0;\n Fh = 0;\n Fl = 0;\n Gh = 0;\n Gl = 0;\n Hh = 0;\n Hl = 0;\n constructor(outputLen, IV) {\n super(128, outputLen, 16, false);\n this.Ah = IV[0] | 0;\n this.Al = IV[1] | 0;\n this.Bh = IV[2] | 0;\n this.Bl = IV[3] | 0;\n this.Ch = IV[4] | 0;\n this.Cl = IV[5] | 0;\n this.Dh = IV[6] | 0;\n this.Dl = IV[7] | 0;\n this.Eh = IV[8] | 0;\n this.El = IV[9] | 0;\n this.Fh = IV[10] | 0;\n this.Fl = IV[11] | 0;\n this.Gh = IV[12] | 0;\n this.Gl = IV[13] | 0;\n this.Hh = IV[14] | 0;\n this.Hl = IV[15] | 0;\n }\n // prettier-ignore\n get() {\n const { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n return [Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl];\n }\n // prettier-ignore\n set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl) {\n this.Ah = Ah | 0;\n this.Al = Al | 0;\n this.Bh = Bh | 0;\n this.Bl = Bl | 0;\n this.Ch = Ch | 0;\n this.Cl = Cl | 0;\n this.Dh = Dh | 0;\n this.Dl = Dl | 0;\n this.Eh = Eh | 0;\n this.El = El | 0;\n this.Fh = Fh | 0;\n this.Fl = Fl | 0;\n this.Gh = Gh | 0;\n this.Gl = Gl | 0;\n this.Hh = Hh | 0;\n this.Hl = Hl | 0;\n }\n _cloneInto(to) {\n (to ||= new this.constructor()).set(...this.get());\n return this._cloneIntoMeta(to);\n }\n process(view, offset) {\n // Extend the first 16 words into the remaining 64 words w[16..79] of the message schedule array\n for (let i = 0; i < 16; i++, offset += 4) {\n SHA512_W_H[i] = view.getUint32(offset);\n SHA512_W_L[i] = view.getUint32((offset += 4));\n }\n for (let i = 16; i < 80; i++) {\n // s0 := (w[i-15] rightrotate 1) xor (w[i-15] rightrotate 8) xor (w[i-15] rightshift 7)\n const W15h = SHA512_W_H[i - 15] | 0;\n const W15l = SHA512_W_L[i - 15] | 0;\n const s0h = u64.rotrSH(W15h, W15l, 1) ^ u64.rotrSH(W15h, W15l, 8) ^ u64.shrSH(W15h, W15l, 7);\n const s0l = u64.rotrSL(W15h, W15l, 1) ^ u64.rotrSL(W15h, W15l, 8) ^ u64.shrSL(W15h, W15l, 7);\n // s1 := (w[i-2] rightrotate 19) xor (w[i-2] rightrotate 61) xor (w[i-2] rightshift 6)\n const W2h = SHA512_W_H[i - 2] | 0;\n const W2l = SHA512_W_L[i - 2] | 0;\n const s1h = u64.rotrSH(W2h, W2l, 19) ^ u64.rotrBH(W2h, W2l, 61) ^ u64.shrSH(W2h, W2l, 6);\n const s1l = u64.rotrSL(W2h, W2l, 19) ^ u64.rotrBL(W2h, W2l, 61) ^ u64.shrSL(W2h, W2l, 6);\n // SHA512_W[i] = s0 + s1 + SHA512_W[i - 7] + SHA512_W[i - 16];\n const SUMl = u64.add4L(s0l, s1l, SHA512_W_L[i - 7], SHA512_W_L[i - 16]);\n const SUMh = u64.add4H(SUMl, s0h, s1h, SHA512_W_H[i - 7], SHA512_W_H[i - 16]);\n SHA512_W_H[i] = SUMh | 0;\n SHA512_W_L[i] = SUMl | 0;\n }\n let { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n // Compression function main loop, 80 rounds\n for (let i = 0; i < 80; i++) {\n // S1 := (e rightrotate 14) xor (e rightrotate 18) xor (e rightrotate 41)\n const sigma1h = u64.rotrSH(Eh, El, 14) ^ u64.rotrSH(Eh, El, 18) ^ u64.rotrBH(Eh, El, 41);\n const sigma1l = u64.rotrSL(Eh, El, 14) ^ u64.rotrSL(Eh, El, 18) ^ u64.rotrBL(Eh, El, 41);\n //const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n const CHIh = (Eh & Fh) ^ (~Eh & Gh);\n const CHIl = (El & Fl) ^ (~El & Gl);\n // T1 = H + sigma1 + Chi(E, F, G) + SHA512_K[i] + SHA512_W[i]\n // prettier-ignore\n const T1ll = u64.add5L(Hl, sigma1l, CHIl, SHA512_Kl[i], SHA512_W_L[i]);\n const T1h = u64.add5H(T1ll, Hh, sigma1h, CHIh, SHA512_Kh[i], SHA512_W_H[i]);\n const T1l = T1ll | 0;\n // S0 := (a rightrotate 28) xor (a rightrotate 34) xor (a rightrotate 39)\n const sigma0h = u64.rotrSH(Ah, Al, 28) ^ u64.rotrBH(Ah, Al, 34) ^ u64.rotrBH(Ah, Al, 39);\n const sigma0l = u64.rotrSL(Ah, Al, 28) ^ u64.rotrBL(Ah, Al, 34) ^ u64.rotrBL(Ah, Al, 39);\n const MAJh = (Ah & Bh) ^ (Ah & Ch) ^ (Bh & Ch);\n const MAJl = (Al & Bl) ^ (Al & Cl) ^ (Bl & Cl);\n Hh = Gh | 0;\n Hl = Gl | 0;\n Gh = Fh | 0;\n Gl = Fl | 0;\n Fh = Eh | 0;\n Fl = El | 0;\n ({ h: Eh, l: El } = u64.add(Dh | 0, Dl | 0, T1h | 0, T1l | 0));\n Dh = Ch | 0;\n Dl = Cl | 0;\n Ch = Bh | 0;\n Cl = Bl | 0;\n Bh = Ah | 0;\n Bl = Al | 0;\n const All = u64.add3L(T1l, sigma0l, MAJl);\n Ah = u64.add3H(All, T1h, sigma0h, MAJh);\n Al = All | 0;\n }\n // Add the compressed chunk to the current hash value\n ({ h: Ah, l: Al } = u64.add(this.Ah | 0, this.Al | 0, Ah | 0, Al | 0));\n ({ h: Bh, l: Bl } = u64.add(this.Bh | 0, this.Bl | 0, Bh | 0, Bl | 0));\n ({ h: Ch, l: Cl } = u64.add(this.Ch | 0, this.Cl | 0, Ch | 0, Cl | 0));\n ({ h: Dh, l: Dl } = u64.add(this.Dh | 0, this.Dl | 0, Dh | 0, Dl | 0));\n ({ h: Eh, l: El } = u64.add(this.Eh | 0, this.El | 0, Eh | 0, El | 0));\n ({ h: Fh, l: Fl } = u64.add(this.Fh | 0, this.Fl | 0, Fh | 0, Fl | 0));\n ({ h: Gh, l: Gl } = u64.add(this.Gh | 0, this.Gl | 0, Gh | 0, Gl | 0));\n ({ h: Hh, l: Hl } = u64.add(this.Hh | 0, this.Hl | 0, Hh | 0, Hl | 0));\n this.set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl);\n }\n roundClean() {\n clean(SHA512_W_H, SHA512_W_L);\n }\n destroy() {\n // HashMD callers route post-destroy usability through `destroyed`; zeroizing alone still leaves\n // update()/digest() callable on reused instances.\n this.destroyed = true;\n clean(this.buffer);\n this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);\n }\n}\n/** Internal SHA-512 hash class grounded in RFC 6234 \u00A76.3 and \u00A76.4. */\nexport class _SHA512 extends SHA2_64B {\n constructor() {\n super(64, SHA512_IV);\n }\n}\n/** Internal SHA-384 hash class grounded in RFC 6234 \u00A76.3 and \u00A76.4. */\nexport class _SHA384 extends SHA2_64B {\n constructor() {\n super(48, SHA384_IV);\n }\n}\n/**\n * Truncated SHA512/256 and SHA512/224.\n * SHA512_IV is XORed with 0xa5a5a5a5a5a5a5a5, then used as \"intermediary\" IV of SHA512/t.\n * Then t hashes string to produce result IV.\n * See the repo-side derivation recipe in `test/misc/sha2-gen-iv.js`.\n * These IV literals are checked against that script rather than a dedicated\n * local RFC section.\n */\n/** SHA-512/224 IV derived by the SHA-512/t recipe in `test/misc/sha2-gen-iv.js` and\n * stored as sixteen big-endian 32-bit halves. */\nconst T224_IV = /* @__PURE__ */ Uint32Array.from([\n 0x8c3d37c8, 0x19544da2, 0x73e19966, 0x89dcd4d6, 0x1dfab7ae, 0x32ff9c82, 0x679dd514, 0x582f9fcf,\n 0x0f6d2b69, 0x7bd44da8, 0x77e36f73, 0x04c48942, 0x3f9d85a8, 0x6a1d36c8, 0x1112e6ad, 0x91d692a1,\n]);\n/** SHA-512/256 IV derived by the SHA-512/t recipe in `test/misc/sha2-gen-iv.js` and\n * stored as sixteen big-endian 32-bit halves. */\nconst T256_IV = /* @__PURE__ */ Uint32Array.from([\n 0x22312194, 0xfc2bf72c, 0x9f555fa3, 0xc84c64c2, 0x2393b86b, 0x6f53b151, 0x96387719, 0x5940eabd,\n 0x96283ee2, 0xa88effe3, 0xbe5e1e25, 0x53863992, 0x2b0199fc, 0x2c85b8aa, 0x0eb72ddc, 0x81c52ca2,\n]);\n/** Internal SHA-512/224 hash class using the derived `T224_IV` and the shared\n * RFC 6234 \u00A76.4 compression engine. */\nexport class _SHA512_224 extends SHA2_64B {\n constructor() {\n super(28, T224_IV);\n }\n}\n/** Internal SHA-512/256 hash class using the derived `T256_IV` and the shared\n * RFC 6234 \u00A76.4 compression engine. */\nexport class _SHA512_256 extends SHA2_64B {\n constructor() {\n super(32, T256_IV);\n }\n}\n/**\n * SHA2-256 hash function from RFC 4634. In JS it's the fastest: even faster than Blake3. Some info:\n *\n * - Trying 2^128 hashes would get 50% chance of collision, using birthday attack.\n * - BTC network is doing 2^70 hashes/sec (2^95 hashes/year) as per 2025.\n * - Each sha256 hash is executing 2^18 bit operations.\n * - Good 2024 ASICs can do 200Th/sec with 3500 watts of power, corresponding to 2^36 hashes/joule.\n * @param msg - message bytes to hash\n * @param opts - Reserved hash options.\n * @returns Digest bytes.\n * @example\n * Hash a message with SHA2-256.\n * ```ts\n * sha256(new Uint8Array([97, 98, 99]));\n * ```\n */\nexport const sha256 = /* @__PURE__ */ createHasher(() => new _SHA256(), \n/* @__PURE__ */ oidNist(0x01));\n/**\n * SHA2-224 hash function from RFC 4634.\n * @param msg - message bytes to hash\n * @param opts - Reserved hash options.\n * @returns Digest bytes.\n * @example\n * Hash a message with SHA2-224.\n * ```ts\n * sha224(new Uint8Array([97, 98, 99]));\n * ```\n */\nexport const sha224 = /* @__PURE__ */ createHasher(() => new _SHA224(), \n/* @__PURE__ */ oidNist(0x04));\n/**\n * SHA2-512 hash function from RFC 4634.\n * @param msg - message bytes to hash\n * @param opts - Reserved hash options.\n * @returns Digest bytes.\n * @example\n * Hash a message with SHA2-512.\n * ```ts\n * sha512(new Uint8Array([97, 98, 99]));\n * ```\n */\nexport const sha512 = /* @__PURE__ */ createHasher(() => new _SHA512(), \n/* @__PURE__ */ oidNist(0x03));\n/**\n * SHA2-384 hash function from RFC 4634.\n * @param msg - message bytes to hash\n * @param opts - Reserved hash options.\n * @returns Digest bytes.\n * @example\n * Hash a message with SHA2-384.\n * ```ts\n * sha384(new Uint8Array([97, 98, 99]));\n * ```\n */\nexport const sha384 = /* @__PURE__ */ createHasher(() => new _SHA384(), \n/* @__PURE__ */ oidNist(0x02));\n/**\n * SHA2-512/256 \"truncated\" hash function, with improved resistance to length extension attacks.\n * See the paper on {@link https://eprint.iacr.org/2010/548.pdf | truncated SHA512}.\n * @param msg - message bytes to hash\n * @param opts - Reserved hash options.\n * @returns Digest bytes.\n * @example\n * Hash a message with SHA2-512/256.\n * ```ts\n * sha512_256(new Uint8Array([97, 98, 99]));\n * ```\n */\nexport const sha512_256 = /* @__PURE__ */ createHasher(() => new _SHA512_256(), \n/* @__PURE__ */ oidNist(0x06));\n/**\n * SHA2-512/224 \"truncated\" hash function, with improved resistance to length extension attacks.\n * See the paper on {@link https://eprint.iacr.org/2010/548.pdf | truncated SHA512}.\n * @param msg - message bytes to hash\n * @param opts - Reserved hash options.\n * @returns Digest bytes.\n * @example\n * Hash a message with SHA2-512/224.\n * ```ts\n * sha512_224(new Uint8Array([97, 98, 99]));\n * ```\n */\nexport const sha512_224 = /* @__PURE__ */ createHasher(() => new _SHA512_224(), \n/* @__PURE__ */ oidNist(0x05));\n", "/**\n * The exclusion registry: an immutable, append-only list of workflow\n * identities withheld from every downstream artifact, keyed by reason and\n * date.\n *\n * **Identity.** A record is keyed by the same canonical id every `Entry`/\n * `Candidate` already carries \u2014 the 16-hex-character output of\n * `pipeline/acquire/entry-id.ts`'s `entryId(kind, ref, path)`. No second\n * identity scheme is introduced: a title or slug can change on a re-scrape or\n * a re-describe, but `entryId` is a hash of the source coordinates\n * (kind + ref + path) that never changes for the same workflow, which is\n * exactly the stability an exclusion needs \u2014 an exclusion recorded against a\n * workflow must still match it after its title, tags, or description change.\n *\n * **Registry vs. rights status.** This module answers a different question\n * than `rights.ts`'s `excluded` status does. The registry is the *cause* and\n * the *authority*: it is consulted at the earliest possible pipeline point\n * (immediately after acquisition, before rights are even decided \u2014 see\n * `pipeline/rights/exclusion-filter.ts`), so an excluded workflow is dropped\n * before it becomes a `Candidate` that anything downstream can see. A record\n * never becomes a full `Entry` at all in the ordinary path, so\n * `EntryRights.status === 'excluded'` is not how exclusion normally\n * propagates \u2014 it exists in the rights union as a second, independent gate:\n * if a record ever reaches rights decision or entry construction carrying an\n * id this registry recognizes, that code path can name it `excluded` instead\n * of guessing, rather than treating an already-answered question as still\n * open. Two gates, not one, because the registry's contents can change\n * (append-only growth) independently of any single pipeline run, and a\n * resumed or partially-cached run is exactly the case where the earlier gate\n * could be bypassed by stale state.\n *\n * **Immutable, append-only.** A registry value is frozen and exposes no\n * mutation method. Growing it means calling `appendExclusion`, which returns\n * a *new* registry with strictly one more record \u2014 it never edits or removes\n * an existing one. There is deliberately no `remove`/`update` API: a\n * retraction is a policy decision ([B]-blocked per\n * `openspec/changes/legal-rights-and-release-integrity/tasks.md`), not a data\n * operation this module should make easy to do quietly.\n */\n\nconst ENTRY_ID_PATTERN = /^[0-9a-f]{16}$/;\n\nexport type ExclusionRecord = {\n /** Canonical `entryId(kind, ref, path)` output \u2014 see module doc comment. */\n id: string;\n /** Human-readable, non-empty. Evidence, not a legal conclusion. */\n reason: string;\n /** ISO 8601 timestamp the exclusion was recorded. */\n excludedAt: string;\n};\n\nexport type ExclusionRegistry = {\n readonly records: readonly ExclusionRecord[];\n isExcluded(id: string): boolean;\n recordFor(id: string): ExclusionRecord | undefined;\n};\n\nfunction validateRecord(record: ExclusionRecord): void {\n if (!ENTRY_ID_PATTERN.test(record.id)) {\n throw new Error(\n `Exclusion registry record has a malformed id \"${record.id}\": expected the 16-hex-character ` +\n 'output of entryId(kind, ref, path), not a title, slug, or free-text identifier.',\n );\n }\n if (!record.reason.trim()) {\n throw new Error(`Exclusion registry record for id \"${record.id}\" has no reason recorded.`);\n }\n if (!Number.isFinite(Date.parse(record.excludedAt))) {\n throw new Error(\n `Exclusion registry record for id \"${record.id}\" has an invalid excludedAt timestamp: \"${record.excludedAt}\".`,\n );\n }\n}\n\n/**\n * Builds a frozen registry from a list of records, validating every one and\n * rejecting a duplicate id outright \u2014 the registry has exactly one record per\n * excluded identity, so two different reasons for the same id is a data bug,\n * not a merge to resolve silently.\n */\nexport function createExclusionRegistry(records: readonly ExclusionRecord[]): ExclusionRegistry {\n const seen = new Set<string>();\n for (const record of records) {\n validateRecord(record);\n if (seen.has(record.id)) {\n throw new Error(`Exclusion registry has more than one record for id \"${record.id}\".`);\n }\n seen.add(record.id);\n }\n const frozenRecords = Object.freeze(records.map((record) => Object.freeze({ ...record })));\n const byId = new Map(frozenRecords.map((record) => [record.id, record]));\n\n return Object.freeze({\n records: frozenRecords,\n isExcluded: (id: string) => byId.has(id),\n recordFor: (id: string) => byId.get(id),\n });\n}\n\n/** The starting registry: no exclusions recorded yet (owner decision [B]-blocked). */\nexport const EMPTY_EXCLUSION_REGISTRY: ExclusionRegistry = createExclusionRegistry([]);\n\n/**\n * Returns a *new* registry with `record` appended. Never mutates `registry`.\n * Throws if `record.id` is already present \u2014 append-only means every id is\n * recorded once, with one reason and one date; changing either requires a\n * conscious new record kept separately, not an overwrite of this one.\n */\nexport function appendExclusion(registry: ExclusionRegistry, record: ExclusionRecord): ExclusionRegistry {\n if (registry.isExcluded(record.id)) {\n throw new Error(\n `Id \"${record.id}\" is already recorded in the exclusion registry (reason: ` +\n `\"${registry.recordFor(record.id)?.reason}\"). Append-only: it cannot be re-added or overwritten.`,\n );\n }\n return createExclusionRegistry([...registry.records, record]);\n}\n", "/** SPDX ids we treat as redistributable. Static allowlist, deliberately short. */\nexport const REDISTRIBUTABLE_LICENCES: Record<string, true> = {\n 'MIT': true,\n 'Apache-2.0': true,\n 'BSD-2-Clause': true,\n 'BSD-3-Clause': true,\n 'ISC': true,\n 'CC0-1.0': true,\n 'Unlicense': true,\n};\n\n/** Hard limits. Shared by acquisition, the worker, and the browser scanner. */\nexport const LIMITS = {\n maxWorkflowBytes: 1_536_000,\n maxNodes: 5_000,\n scanTimeoutMs: 30_000,\n packSize: 250,\n shardSize: 2_000,\n maxPublicFindings: 20,\n} as const;\n", "import { LIMITS } from './limits';\n\n/**\n * The one versioned scanner-limits contract browser, worker, and pipeline\n * callers share. `LIMITS` (limits.ts) stays the source for the three numbers\n * it already owned (maxWorkflowBytes/maxNodes/scanTimeoutMs are read from it\n * below, not re-declared) so this cannot silently drift from it.\n */\nexport const SCANNER_LIMITS_SCHEMA_VERSION = 'scanner-limits-v1' as const;\n\nexport type ScannerLimitsV1 = {\n schemaVersion: typeof SCANNER_LIMITS_SCHEMA_VERSION;\n maxBytes: number;\n maxNodes: number;\n maxEdges: number;\n maxConnectionDepth: number;\n maxParameterDepth: number;\n maxParameterLeaves: number;\n workerDeadlineMs: number;\n};\n\nconst SCANNER_LIMITS_FIELDS = [\n 'schemaVersion',\n 'maxBytes',\n 'maxNodes',\n 'maxEdges',\n 'maxConnectionDepth',\n 'maxParameterDepth',\n 'maxParameterLeaves',\n 'workerDeadlineMs',\n] as const satisfies readonly (keyof ScannerLimitsV1)[];\n\nexport const DEFAULT_SCANNER_LIMITS: ScannerLimitsV1 = Object.freeze({\n schemaVersion: SCANNER_LIMITS_SCHEMA_VERSION,\n maxBytes: LIMITS.maxWorkflowBytes,\n maxNodes: LIMITS.maxNodes,\n maxEdges: 10_000,\n // Previously declared as a `workflow.ts` option but never wired to any\n // production caller (see scanner-contract-and-calibration tasks.md P1.1) \u2014\n // this is the first real default for it.\n maxConnectionDepth: 64,\n maxParameterDepth: 64,\n maxParameterLeaves: 10_000,\n workerDeadlineMs: LIMITS.scanTimeoutMs,\n});\n\nexport type ScannerLimitsValidationResult =\n | { ok: true; limits: ScannerLimitsV1 }\n | { ok: false; errors: string[] };\n\n/** Fails closed and reports every violation, not just the first, so a bad config is fully diagnosable. */\nexport function validateScannerLimits(candidate: unknown): ScannerLimitsValidationResult {\n if (typeof candidate !== 'object' || candidate === null || Array.isArray(candidate)) {\n return { ok: false, errors: ['limits must be an object'] };\n }\n\n const value = candidate as Record<string, unknown>;\n const errors: string[] = [];\n const knownFields = new Set<string>(SCANNER_LIMITS_FIELDS);\n\n for (const field of Object.keys(value)) {\n if (!knownFields.has(field)) errors.push(`unknown field: ${field}`);\n }\n\n if (value.schemaVersion !== SCANNER_LIMITS_SCHEMA_VERSION) {\n errors.push(`unsupported schemaVersion: ${String(value.schemaVersion)}`);\n }\n\n for (const field of SCANNER_LIMITS_FIELDS) {\n if (field === 'schemaVersion') continue;\n if (!(field in value)) {\n errors.push(`missing field: ${field}`);\n continue;\n }\n const raw = value[field];\n if (typeof raw !== 'number' || !Number.isInteger(raw) || raw < 0) {\n errors.push(`${field} must be a non-negative integer`);\n }\n }\n\n if (errors.length > 0) return { ok: false, errors };\n\n return {\n ok: true,\n limits: {\n schemaVersion: SCANNER_LIMITS_SCHEMA_VERSION,\n maxBytes: value.maxBytes as number,\n maxNodes: value.maxNodes as number,\n maxEdges: value.maxEdges as number,\n maxConnectionDepth: value.maxConnectionDepth as number,\n maxParameterDepth: value.maxParameterDepth as number,\n maxParameterLeaves: value.maxParameterLeaves as number,\n workerDeadlineMs: value.workerDeadlineMs as number,\n },\n };\n}\n\n/** Stable key order regardless of the input object's own construction order. */\nexport function serializeScannerLimits(limits: ScannerLimitsV1): string {\n return JSON.stringify(limits, SCANNER_LIMITS_FIELDS as unknown as string[]);\n}\n\n/** The exact option shape `parseWorkflowJson` accepts \u2014 one mapping, not one per caller. */\nexport function toWorkflowParseOptions(limits: ScannerLimitsV1): {\n maxBytes: number;\n maxNodes: number;\n maxEdges: number;\n maxConnectionDepth: number;\n maxParameterDepth: number;\n maxParameterLeaves: number;\n} {\n return {\n maxBytes: limits.maxBytes,\n maxNodes: limits.maxNodes,\n maxEdges: limits.maxEdges,\n maxConnectionDepth: limits.maxConnectionDepth,\n maxParameterDepth: limits.maxParameterDepth,\n maxParameterLeaves: limits.maxParameterLeaves,\n };\n}\n", "import {\n DEFAULT_SCANNER_LIMITS,\n type ScannerLimitsV1,\n} from './scanner-limits';\n\nexport const SCANNER_LIMITS_V2_SCHEMA_VERSION = 'scanner-limits-v2' as const;\n\nconst SCANNER_LIMITS_V2_NUMERIC_FIELDS = [\n 'maxBytes',\n 'maxNodes',\n 'maxEdges',\n 'maxConnectionDepth',\n 'maxParameterDepth',\n 'maxParameterLeaves',\n 'workerDeadlineMs',\n 'maxSyntaxNodes',\n 'maxDocumentDepth',\n 'maxMembersAndElements',\n 'maxRawEdges',\n 'maxDuplicateKeys',\n 'maxDiagnostics',\n 'maxStoredSourceSpans',\n 'maxSourceWork',\n 'maxExpressionTokens',\n 'maxCodeSyntaxNodes',\n 'maxGraphOperations',\n 'maxTaintStates',\n 'maxTraceStepsPerFinding',\n 'maxFindings',\n 'maxRedactionPatches',\n 'maxRedactedArtifactBytes',\n 'maxEvidenceBytes',\n 'maxSerializedResultBytes',\n 'maxRuleOperations',\n] as const;\n\nconst SCANNER_LIMITS_V2_FIELDS = [\n 'schemaVersion',\n ...SCANNER_LIMITS_V2_NUMERIC_FIELDS,\n] as const;\n\nexport type ScannerLimitsV2 = Omit<ScannerLimitsV1, 'schemaVersion'> & {\n schemaVersion: typeof SCANNER_LIMITS_V2_SCHEMA_VERSION;\n maxSyntaxNodes: number;\n maxDocumentDepth: number;\n maxMembersAndElements: number;\n maxRawEdges: number;\n maxDuplicateKeys: number;\n maxDiagnostics: number;\n maxStoredSourceSpans: number;\n maxSourceWork: number;\n maxExpressionTokens: number;\n maxCodeSyntaxNodes: number;\n maxGraphOperations: number;\n maxTaintStates: number;\n maxTraceStepsPerFinding: number;\n maxFindings: number;\n maxRedactionPatches: number;\n maxRedactedArtifactBytes: number;\n maxEvidenceBytes: number;\n maxSerializedResultBytes: number;\n maxRuleOperations: number;\n};\n\nexport const DEFAULT_SCANNER_LIMITS_V2: ScannerLimitsV2 = Object.freeze({\n ...DEFAULT_SCANNER_LIMITS,\n schemaVersion: SCANNER_LIMITS_V2_SCHEMA_VERSION,\n maxSyntaxNodes: 250_000,\n maxDocumentDepth: 256,\n maxMembersAndElements: 250_000,\n maxRawEdges: 50_000,\n maxDuplicateKeys: 1_000,\n maxDiagnostics: 1_000,\n maxStoredSourceSpans: 25_000,\n maxSourceWork: 1_000_000,\n maxExpressionTokens: 100_000,\n maxCodeSyntaxNodes: 250_000,\n maxGraphOperations: 1_000_000,\n maxTaintStates: 250_000,\n maxTraceStepsPerFinding: 100,\n maxFindings: 5_000,\n maxRedactionPatches: 10_000,\n maxRedactedArtifactBytes: 1_536_000,\n maxEvidenceBytes: 1_536_000,\n maxSerializedResultBytes: 5_000_000,\n maxRuleOperations: 1_000_000,\n});\n\nexport type ScannerLimitsV2ValidationResult =\n | { ok: true; limits: ScannerLimitsV2 }\n | { ok: false; errors: string[] };\n\nexport type AdmittedLimitStateV2 = 'WIRED' | 'DORMANT' | 'UNWIRED';\nexport type ScannerLimitNameV2 = (typeof SCANNER_LIMITS_V2_NUMERIC_FIELDS)[number];\n\n/**\n * The one authority every help surface and usage row reads. `WIRED` is consumed by the admitted\n * beta-default path, `DORMANT` only by an unadmitted profile (the hardened code, value-flow, taint\n * and graph analyzers), and `UNWIRED` by no shipped path (redaction-v2 is development-only).\n * `workerDeadlineMs` is wired because the CLI worker host enforces it.\n */\nexport const ADMITTED_LIMIT_STATES: Readonly<Record<ScannerLimitNameV2, AdmittedLimitStateV2>> = Object.freeze({\n maxBytes: 'WIRED',\n maxNodes: 'WIRED',\n maxEdges: 'WIRED',\n maxConnectionDepth: 'WIRED',\n maxParameterDepth: 'WIRED',\n maxParameterLeaves: 'WIRED',\n workerDeadlineMs: 'WIRED',\n maxSyntaxNodes: 'WIRED',\n maxDocumentDepth: 'WIRED',\n maxMembersAndElements: 'WIRED',\n maxRawEdges: 'WIRED',\n maxDuplicateKeys: 'WIRED',\n maxDiagnostics: 'WIRED',\n maxStoredSourceSpans: 'WIRED',\n maxSourceWork: 'WIRED',\n maxExpressionTokens: 'DORMANT',\n maxCodeSyntaxNodes: 'DORMANT',\n maxGraphOperations: 'DORMANT',\n maxTaintStates: 'DORMANT',\n maxTraceStepsPerFinding: 'DORMANT',\n maxFindings: 'WIRED',\n maxRedactionPatches: 'UNWIRED',\n maxRedactedArtifactBytes: 'UNWIRED',\n maxEvidenceBytes: 'WIRED',\n maxSerializedResultBytes: 'WIRED',\n maxRuleOperations: 'WIRED',\n});\n\n/**\n * The subset with a real per-scan counter. The narrow tuple is deliberate: a wide annotation would\n * make every one of the 26 names assignable, so the 13-key counter object below would not typecheck.\n * A budget without a counter is enforced where it is consumed but has no honest `usage` row.\n */\nexport const MEASURED_LIMIT_IDS = [\n 'maxBytes', 'maxNodes', 'maxEdges', 'maxConnectionDepth', 'maxParameterDepth',\n 'maxParameterLeaves', 'maxSyntaxNodes', 'maxRawEdges', 'maxDuplicateKeys',\n 'maxDiagnostics', 'maxStoredSourceSpans', 'maxSourceWork', 'maxFindings',\n] as const satisfies readonly ScannerLimitNameV2[];\n\nexport function validateScannerLimitsV2(candidate: unknown): ScannerLimitsV2ValidationResult {\n if (typeof candidate !== 'object' || candidate === null || Array.isArray(candidate)) {\n return { ok: false, errors: ['limits must be an object'] };\n }\n\n const value = candidate as Record<string, unknown>;\n const knownFields = new Set<string>(SCANNER_LIMITS_V2_FIELDS);\n const errors = Object.keys(value)\n .filter((field) => !knownFields.has(field))\n .sort()\n .map((field) => `unknown field: ${field}`);\n\n if (!Object.prototype.hasOwnProperty.call(value, 'schemaVersion')) {\n errors.push('missing field: schemaVersion');\n } else if (value.schemaVersion !== SCANNER_LIMITS_V2_SCHEMA_VERSION) {\n errors.push(`unsupported schemaVersion: ${String(value.schemaVersion)}`);\n }\n\n for (const field of SCANNER_LIMITS_V2_NUMERIC_FIELDS) {\n if (!Object.prototype.hasOwnProperty.call(value, field)) {\n errors.push(`missing field: ${field}`);\n continue;\n }\n const raw = value[field];\n if (!Number.isSafeInteger(raw) || (raw as number) < 0) {\n errors.push(`${field} must be a non-negative safe integer`);\n } else if (field === 'maxDiagnostics' && (raw as number) < 1) {\n errors.push('maxDiagnostics must be at least 1');\n }\n }\n\n if (errors.length > 0) return { ok: false, errors };\n return {\n ok: true,\n limits: {\n schemaVersion: SCANNER_LIMITS_V2_SCHEMA_VERSION,\n ...Object.fromEntries(SCANNER_LIMITS_V2_NUMERIC_FIELDS.map((field) => [field, value[field]])),\n } as ScannerLimitsV2,\n };\n}\n\nexport function toWorkflowParseOptionsV2(limits: ScannerLimitsV2): {\n maxBytes: number;\n maxNodes: number;\n maxEdges: number;\n maxConnectionDepth: number;\n maxParameterDepth: number;\n maxParameterLeaves: number;\n} {\n return {\n maxBytes: limits.maxBytes,\n maxNodes: limits.maxNodes,\n maxEdges: limits.maxEdges,\n maxConnectionDepth: limits.maxConnectionDepth,\n maxParameterDepth: limits.maxParameterDepth,\n maxParameterLeaves: limits.maxParameterLeaves,\n };\n}\n", "/**\n * Serialize JSON-compatible values with locale-independent object ordering.\n * Arrays retain their input order; they are never treated as sets.\n */\nexport function canonicalizeJson(value: unknown): string {\n return encodeCanonical(value, new Set<object>());\n}\n\n/** Encode the canonical representation using the platform's UTF-8 encoder. */\nexport function canonicalJsonBytes(value: unknown): Uint8Array {\n return new TextEncoder().encode(canonicalizeJson(value));\n}\n\nfunction encodeCanonical(value: unknown, seen: Set<object>): string {\n if (value === null) return 'null';\n if (typeof value === 'string') return JSON.stringify(value);\n if (typeof value === 'boolean') return value ? 'true' : 'false';\n if (typeof value === 'number') {\n if (!Number.isFinite(value)) throw new TypeError('Cannot encode non-finite number as canonical JSON');\n return JSON.stringify(Object.is(value, -0) ? 0 : value);\n }\n if (typeof value !== 'object' || value === undefined) {\n throw new TypeError(`Cannot encode ${typeof value} as canonical JSON`);\n }\n if (seen.has(value)) throw new TypeError('Cannot encode cyclic value as canonical JSON');\n seen.add(value);\n\n try {\n if (Array.isArray(value)) return encodeArray(value, seen);\n return encodeObject(value as Record<string, unknown>, seen);\n } finally {\n seen.delete(value);\n }\n}\n\nfunction encodeArray(value: readonly unknown[], seen: Set<object>): string {\n const values = Array.from({ length: value.length }, (_, index) => {\n if (!Object.prototype.hasOwnProperty.call(value, index)) {\n throw new TypeError('Cannot encode sparse array as canonical JSON');\n }\n return encodeCanonical(value[index], seen);\n });\n return `[${values.join(',')}]`;\n}\n\nfunction encodeObject(value: Record<string, unknown>, seen: Set<object>): string {\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) {\n throw new TypeError('Cannot encode a non-plain object as canonical JSON');\n }\n if (Object.getOwnPropertySymbols(value).some((symbol) =>\n Object.prototype.propertyIsEnumerable.call(value, symbol))) {\n throw new TypeError('Cannot encode symbol properties as canonical JSON');\n }\n\n const pairs = Object.keys(value)\n .sort(compareCanonicalStrings)\n .map((key) => `${JSON.stringify(key)}:${encodeCanonical(value[key], seen)}`);\n return `{${pairs.join(',')}}`;\n}\n\nfunction compareCanonicalStrings(left: string, right: string): number {\n if (left === right) return 0;\n return left < right ? -1 : 1;\n}\n", "/**\n * @fileoverview Character codes.\n * @author Nicholas C. Zakas\n */\n\nconst CHAR_0 = 48; // 0\nconst CHAR_1 = 49; // 1\nconst CHAR_9 = 57; // 9\nconst CHAR_BACKSLASH = 92; // \\\nconst CHAR_DOLLAR = 36; // $\nconst CHAR_DOT = 46; // .\nconst CHAR_DOUBLE_QUOTE = 34; // \"\nconst CHAR_LOWER_A = 97; // a\nconst CHAR_LOWER_E = 101; // e\nconst CHAR_LOWER_F = 102; // f\nconst CHAR_LOWER_N = 110; // n\nconst CHAR_LOWER_T = 116; // t\nconst CHAR_LOWER_U = 117; // u\nconst CHAR_LOWER_X = 120; // x\nconst CHAR_LOWER_Z = 122; // z\nconst CHAR_MINUS = 45; // -\nconst CHAR_NEWLINE = 10; // newline\nconst CHAR_PLUS = 43; // +\nconst CHAR_RETURN = 13; // return\nconst CHAR_SINGLE_QUOTE = 39; // '\nconst CHAR_SLASH = 47; // /\nconst CHAR_SPACE = 32; // space\nconst CHAR_TAB = 9; // tab\nconst CHAR_UNDERSCORE = 95; // _\nconst CHAR_UPPER_A = 65; // A\nconst CHAR_UPPER_E = 69; // E\nconst CHAR_UPPER_F = 70; // F\nconst CHAR_UPPER_N = 78; // N\nconst CHAR_UPPER_X = 88; // X\nconst CHAR_UPPER_Z = 90; // Z\nconst CHAR_LOWER_B = 98; // b\nconst CHAR_LOWER_R = 114; // r\nconst CHAR_LOWER_V = 118; // v\nconst CHAR_LINE_SEPARATOR = 0x2028;\nconst CHAR_PARAGRAPH_SEPARATOR = 0x2029;\nconst CHAR_UPPER_I = 73; // I\nconst CHAR_STAR = 42; // *\nconst CHAR_VTAB = 11; // U+000B Vertical tab\nconst CHAR_FORM_FEED = 12; // U+000C Form feed\nconst CHAR_NBSP = 160; // U+00A0 Non-breaking space\nconst CHAR_BOM = 65279; // U+FEFF\nconst CHAR_NON_BREAKING_SPACE = 160;\nconst CHAR_EN_QUAD = 8192;\nconst CHAR_EM_QUAD = 8193;\nconst CHAR_EN_SPACE = 8194;\nconst CHAR_EM_SPACE = 8195;\nconst CHAR_THREE_PER_EM_SPACE = 8196;\nconst CHAR_FOUR_PER_EM_SPACE = 8197;\nconst CHAR_SIX_PER_EM_SPACE = 8198;\nconst CHAR_FIGURE_SPACE = 8199;\nconst CHAR_PUNCTUATION_SPACE = 8200;\nconst CHAR_THIN_SPACE = 8201;\nconst CHAR_HAIR_SPACE = 8202;\nconst CHAR_NARROW_NO_BREAK_SPACE = 8239;\nconst CHAR_MEDIUM_MATHEMATICAL_SPACE = 8287;\nconst CHAR_IDEOGRAPHIC_SPACE = 12288;\n\n/**\n * @fileoverview JSON syntax helpers\n * @author Nicholas C. Zakas\n */\n\n\n//-----------------------------------------------------------------------------\n// Types\n//-----------------------------------------------------------------------------\n\n/** @typedef {import(\"./typedefs.js\").TokenType} TokenType */\n\n//-----------------------------------------------------------------------------\n// Predefined Tokens\n//-----------------------------------------------------------------------------\n\nconst LBRACKET = \"[\";\nconst RBRACKET = \"]\";\nconst LBRACE = \"{\";\nconst RBRACE = \"}\";\nconst COLON = \":\";\nconst COMMA = \",\";\n\nconst TRUE = \"true\";\nconst FALSE = \"false\";\nconst NULL = \"null\";\nconst NAN$1 = \"NaN\";\nconst INFINITY$1 = \"Infinity\";\nconst QUOTE = \"\\\"\";\n\nconst escapeToChar = new Map([\n [CHAR_DOUBLE_QUOTE, QUOTE],\n [CHAR_BACKSLASH, \"\\\\\"],\n [CHAR_SLASH, \"/\"],\n [CHAR_LOWER_B, \"\\b\"],\n [CHAR_LOWER_N, \"\\n\"],\n [CHAR_LOWER_F, \"\\f\"],\n [CHAR_LOWER_R, \"\\r\"],\n [CHAR_LOWER_T, \"\\t\"]\n]);\n\nconst json5EscapeToChar = new Map([\n ...escapeToChar,\n [CHAR_LOWER_V, \"\\v\"],\n [CHAR_0, \"\\0\"]\n]);\n\nconst charToEscape = new Map([\n [QUOTE, QUOTE],\n [\"\\\\\", \"\\\\\"],\n [\"/\", \"/\"],\n [\"\\b\", \"b\"],\n [\"\\n\", \"n\"],\n [\"\\f\", \"f\"],\n [\"\\r\", \"r\"],\n [\"\\t\", \"t\"]\n]);\n\nconst json5CharToEscape = new Map([\n ...charToEscape,\n [\"\\v\", \"v\"],\n [\"\\0\", \"0\"],\n [\"\\u2028\", \"u2028\"],\n [\"\\u2029\", \"u2029\"]\n]);\n\n/** @type {Map<string,TokenType>} */\nconst knownTokenTypes = new Map([\n [LBRACKET, \"LBracket\"],\n [RBRACKET, \"RBracket\"],\n [LBRACE, \"LBrace\"],\n [RBRACE, \"RBrace\"],\n [COLON, \"Colon\"],\n [COMMA, \"Comma\"],\n [TRUE, \"Boolean\"],\n [FALSE, \"Boolean\"],\n [NULL, \"Null\"]\n]);\n\n/** @type {Map<string,TokenType>} */\nconst knownJSON5TokenTypes = new Map([\n ...knownTokenTypes,\n [NAN$1, \"Number\"],\n [INFINITY$1, \"Number\"]\n]);\n\n// JSON5\nconst json5LineTerminators = new Set([\n CHAR_NEWLINE,\n CHAR_RETURN,\n CHAR_LINE_SEPARATOR,\n CHAR_PARAGRAPH_SEPARATOR\n]);\n\n/**\n * @fileoverview JSON tokenization/parsing errors\n * @author Nicholas C. Zakas\n */\n\n//-----------------------------------------------------------------------------\n// Typedefs\n//-----------------------------------------------------------------------------\n\n/** @typedef {import(\"./typedefs.js\").Location} Location */\n/** @typedef {import(\"./typedefs.js\").Token} Token */\n\n//-----------------------------------------------------------------------------\n// Errors\n//-----------------------------------------------------------------------------\n\n/**\n * Base class that attaches location to an error.\n */\nclass ErrorWithLocation extends Error {\n\n /**\n * Creates a new instance.\n * @param {string} message The error message to report. \n * @param {Location} loc The location information for the error.\n */\n constructor(message, { line, column, offset }) {\n super(`${ message } (${ line }:${ column})`);\n\n /**\n * The line on which the error occurred.\n * @type {number}\n */\n this.line = line;\n\n /**\n * The column on which the error occurred.\n * @type {number}\n */\n this.column = column;\n \n /**\n * The index into the string where the error occurred.\n * @type {number}\n */\n this.offset = offset;\n }\n\n}\n\n/**\n * Error thrown when an unexpected character is found during tokenizing.\n */\nclass UnexpectedChar extends ErrorWithLocation {\n\n /**\n * Creates a new instance.\n * @param {number} unexpected The character that was found.\n * @param {Location} loc The location information for the found character.\n */\n constructor(unexpected, loc) {\n super(`Unexpected character '${ String.fromCharCode(unexpected) }' found.`, loc);\n }\n}\n\n/**\n * Error thrown when an unexpected identifier is found during tokenizing.\n */\nclass UnexpectedIdentifier extends ErrorWithLocation {\n\n /**\n * Creates a new instance.\n * @param {string} unexpected The character that was found.\n * @param {Location} loc The location information for the found character.\n */\n constructor(unexpected, loc) {\n super(`Unexpected identifier '${ unexpected }' found.`, loc);\n }\n}\n\n/**\n * Error thrown when an unexpected token is found during parsing.\n */\nclass UnexpectedToken extends ErrorWithLocation {\n\n /**\n * Creates a new instance.\n * @param {Token} token The token that was found. \n */\n constructor(token) {\n super(`Unexpected token ${ token.type } found.`, token.loc.start);\n }\n}\n\n/**\n * Error thrown when the end of input is found where it isn't expected.\n */\nclass UnexpectedEOF extends ErrorWithLocation {\n\n /**\n * Creates a new instance.\n * @param {Location} loc The location information for the found character.\n */\n constructor(loc) {\n super(\"Unexpected end of input found.\", loc);\n }\n}\n\n/*\n * The following is extracted from https://github.com/json5/json5/\n *\n * MIT License\n * \n * Copyright (c) 2012-2018 Aseem Kishore, and others.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n\nconst ID_Start = /[\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u0860-\\u086A\\u08A0-\\u08B4\\u08B6-\\u08BD\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u09FC\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C60\\u0C61\\u0C80\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D54-\\u0D56\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u1884\\u1887-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1C80-\\u1C88\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312E\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FEA\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6EF\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AE\\uA7B0-\\uA7B7\\uA7F7-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]|\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDD40-\\uDD74\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDF00-\\uDF1F\\uDF2D-\\uDF4A\\uDF50-\\uDF75\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF\\uDFD1-\\uDFD5]|\\uD801[\\uDC00-\\uDC9D\\uDCB0-\\uDCD3\\uDCD8-\\uDCFB\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00\\uDE10-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2]|\\uD804[\\uDC03-\\uDC37\\uDC83-\\uDCAF\\uDCD0-\\uDCE8\\uDD03-\\uDD26\\uDD50-\\uDD72\\uDD76\\uDD83-\\uDDB2\\uDDC1-\\uDDC4\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE2B\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEDE\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D\\uDF50\\uDF5D-\\uDF61]|\\uD805[\\uDC00-\\uDC34\\uDC47-\\uDC4A\\uDC80-\\uDCAF\\uDCC4\\uDCC5\\uDCC7\\uDD80-\\uDDAE\\uDDD8-\\uDDDB\\uDE00-\\uDE2F\\uDE44\\uDE80-\\uDEAA\\uDF00-\\uDF19]|\\uD806[\\uDCA0-\\uDCDF\\uDCFF\\uDE00\\uDE0B-\\uDE32\\uDE3A\\uDE50\\uDE5C-\\uDE83\\uDE86-\\uDE89\\uDEC0-\\uDEF8]|\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC2E\\uDC40\\uDC72-\\uDC8F\\uDD00-\\uDD06\\uDD08\\uDD09\\uDD0B-\\uDD30\\uDD46]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC00-\\uDC6E\\uDC80-\\uDD43]|[\\uD80C\\uD81C-\\uD820\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872\\uD874-\\uD879][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDED0-\\uDEED\\uDF00-\\uDF2F\\uDF40-\\uDF43\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50\\uDF93-\\uDF9F\\uDFE0\\uDFE1]|\\uD821[\\uDC00-\\uDFEC]|\\uD822[\\uDC00-\\uDEF2]|\\uD82C[\\uDC00-\\uDD1E\\uDD70-\\uDEFB]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB]|\\uD83A[\\uDC00-\\uDCC4\\uDD00-\\uDD43]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1\\uDEB0-\\uDFFF]|\\uD87A[\\uDC00-\\uDFE0]|\\uD87E[\\uDC00-\\uDE1D]/;\n// eslint-disable-next-line no-misleading-character-class\nconst ID_Continue = /[\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0300-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u0483-\\u0487\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0610-\\u061A\\u0620-\\u0669\\u066E-\\u06D3\\u06D5-\\u06DC\\u06DF-\\u06E8\\u06EA-\\u06FC\\u06FF\\u0710-\\u074A\\u074D-\\u07B1\\u07C0-\\u07F5\\u07FA\\u0800-\\u082D\\u0840-\\u085B\\u0860-\\u086A\\u08A0-\\u08B4\\u08B6-\\u08BD\\u08D4-\\u08E1\\u08E3-\\u0963\\u0966-\\u096F\\u0971-\\u0983\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BC-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CE\\u09D7\\u09DC\\u09DD\\u09DF-\\u09E3\\u09E6-\\u09F1\\u09FC\\u0A01-\\u0A03\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A59-\\u0A5C\\u0A5E\\u0A66-\\u0A75\\u0A81-\\u0A83\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABC-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AD0\\u0AE0-\\u0AE3\\u0AE6-\\u0AEF\\u0AF9-\\u0AFF\\u0B01-\\u0B03\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3C-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B5C\\u0B5D\\u0B5F-\\u0B63\\u0B66-\\u0B6F\\u0B71\\u0B82\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD0\\u0BD7\\u0BE6-\\u0BEF\\u0C00-\\u0C03\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C58-\\u0C5A\\u0C60-\\u0C63\\u0C66-\\u0C6F\\u0C80-\\u0C83\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBC-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CDE\\u0CE0-\\u0CE3\\u0CE6-\\u0CEF\\u0CF1\\u0CF2\\u0D00-\\u0D03\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4E\\u0D54-\\u0D57\\u0D5F-\\u0D63\\u0D66-\\u0D6F\\u0D7A-\\u0D7F\\u0D82\\u0D83\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DE6-\\u0DEF\\u0DF2\\u0DF3\\u0E01-\\u0E3A\\u0E40-\\u0E4E\\u0E50-\\u0E59\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB9\\u0EBB-\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EC8-\\u0ECD\\u0ED0-\\u0ED9\\u0EDC-\\u0EDF\\u0F00\\u0F18\\u0F19\\u0F20-\\u0F29\\u0F35\\u0F37\\u0F39\\u0F3E-\\u0F47\\u0F49-\\u0F6C\\u0F71-\\u0F84\\u0F86-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u1000-\\u1049\\u1050-\\u109D\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u135D-\\u135F\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1714\\u1720-\\u1734\\u1740-\\u1753\\u1760-\\u176C\\u176E-\\u1770\\u1772\\u1773\\u1780-\\u17D3\\u17D7\\u17DC\\u17DD\\u17E0-\\u17E9\\u180B-\\u180D\\u1810-\\u1819\\u1820-\\u1877\\u1880-\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1920-\\u192B\\u1930-\\u193B\\u1946-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u19D0-\\u19D9\\u1A00-\\u1A1B\\u1A20-\\u1A5E\\u1A60-\\u1A7C\\u1A7F-\\u1A89\\u1A90-\\u1A99\\u1AA7\\u1AB0-\\u1ABD\\u1B00-\\u1B4B\\u1B50-\\u1B59\\u1B6B-\\u1B73\\u1B80-\\u1BF3\\u1C00-\\u1C37\\u1C40-\\u1C49\\u1C4D-\\u1C7D\\u1C80-\\u1C88\\u1CD0-\\u1CD2\\u1CD4-\\u1CF9\\u1D00-\\u1DF9\\u1DFB-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u203F\\u2040\\u2054\\u2071\\u207F\\u2090-\\u209C\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20F0\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D7F-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2DE0-\\u2DFF\\u2E2F\\u3005-\\u3007\\u3021-\\u302F\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u3099\\u309A\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312E\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FEA\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA62B\\uA640-\\uA66F\\uA674-\\uA67D\\uA67F-\\uA6F1\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AE\\uA7B0-\\uA7B7\\uA7F7-\\uA827\\uA840-\\uA873\\uA880-\\uA8C5\\uA8D0-\\uA8D9\\uA8E0-\\uA8F7\\uA8FB\\uA8FD\\uA900-\\uA92D\\uA930-\\uA953\\uA960-\\uA97C\\uA980-\\uA9C0\\uA9CF-\\uA9D9\\uA9E0-\\uA9FE\\uAA00-\\uAA36\\uAA40-\\uAA4D\\uAA50-\\uAA59\\uAA60-\\uAA76\\uAA7A-\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEF\\uAAF2-\\uAAF6\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABEA\\uABEC\\uABED\\uABF0-\\uABF9\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE00-\\uFE0F\\uFE20-\\uFE2F\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF10-\\uFF19\\uFF21-\\uFF3A\\uFF3F\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]|\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDD40-\\uDD74\\uDDFD\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDEE0\\uDF00-\\uDF1F\\uDF2D-\\uDF4A\\uDF50-\\uDF7A\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF\\uDFD1-\\uDFD5]|\\uD801[\\uDC00-\\uDC9D\\uDCA0-\\uDCA9\\uDCB0-\\uDCD3\\uDCD8-\\uDCFB\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE38-\\uDE3A\\uDE3F\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE6\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2]|\\uD804[\\uDC00-\\uDC46\\uDC66-\\uDC6F\\uDC7F-\\uDCBA\\uDCD0-\\uDCE8\\uDCF0-\\uDCF9\\uDD00-\\uDD34\\uDD36-\\uDD3F\\uDD50-\\uDD73\\uDD76\\uDD80-\\uDDC4\\uDDCA-\\uDDCC\\uDDD0-\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE37\\uDE3E\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEEA\\uDEF0-\\uDEF9\\uDF00-\\uDF03\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3C-\\uDF44\\uDF47\\uDF48\\uDF4B-\\uDF4D\\uDF50\\uDF57\\uDF5D-\\uDF63\\uDF66-\\uDF6C\\uDF70-\\uDF74]|\\uD805[\\uDC00-\\uDC4A\\uDC50-\\uDC59\\uDC80-\\uDCC5\\uDCC7\\uDCD0-\\uDCD9\\uDD80-\\uDDB5\\uDDB8-\\uDDC0\\uDDD8-\\uDDDD\\uDE00-\\uDE40\\uDE44\\uDE50-\\uDE59\\uDE80-\\uDEB7\\uDEC0-\\uDEC9\\uDF00-\\uDF19\\uDF1D-\\uDF2B\\uDF30-\\uDF39]|\\uD806[\\uDCA0-\\uDCE9\\uDCFF\\uDE00-\\uDE3E\\uDE47\\uDE50-\\uDE83\\uDE86-\\uDE99\\uDEC0-\\uDEF8]|\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC36\\uDC38-\\uDC40\\uDC50-\\uDC59\\uDC72-\\uDC8F\\uDC92-\\uDCA7\\uDCA9-\\uDCB6\\uDD00-\\uDD06\\uDD08\\uDD09\\uDD0B-\\uDD36\\uDD3A\\uDD3C\\uDD3D\\uDD3F-\\uDD47\\uDD50-\\uDD59]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC00-\\uDC6E\\uDC80-\\uDD43]|[\\uD80C\\uD81C-\\uD820\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872\\uD874-\\uD879][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDE60-\\uDE69\\uDED0-\\uDEED\\uDEF0-\\uDEF4\\uDF00-\\uDF36\\uDF40-\\uDF43\\uDF50-\\uDF59\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50-\\uDF7E\\uDF8F-\\uDF9F\\uDFE0\\uDFE1]|\\uD821[\\uDC00-\\uDFEC]|\\uD822[\\uDC00-\\uDEF2]|\\uD82C[\\uDC00-\\uDD1E\\uDD70-\\uDEFB]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99\\uDC9D\\uDC9E]|\\uD834[\\uDD65-\\uDD69\\uDD6D-\\uDD72\\uDD7B-\\uDD82\\uDD85-\\uDD8B\\uDDAA-\\uDDAD\\uDE42-\\uDE44]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB\\uDFCE-\\uDFFF]|\\uD836[\\uDE00-\\uDE36\\uDE3B-\\uDE6C\\uDE75\\uDE84\\uDE9B-\\uDE9F\\uDEA1-\\uDEAF]|\\uD838[\\uDC00-\\uDC06\\uDC08-\\uDC18\\uDC1B-\\uDC21\\uDC23\\uDC24\\uDC26-\\uDC2A]|\\uD83A[\\uDC00-\\uDCC4\\uDCD0-\\uDCD6\\uDD00-\\uDD4A\\uDD50-\\uDD59]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1\\uDEB0-\\uDFFF]|\\uD87A[\\uDC00-\\uDFE0]|\\uD87E[\\uDC00-\\uDE1D]|\\uDB40[\\uDD00-\\uDDEF]/;\n\n/**\n * @fileoverview A charactor code reader.\n * @author Nicholas C. Zakas\n */\n\n//-----------------------------------------------------------------------------\n// Type Definitions\n//-----------------------------------------------------------------------------\n\n\n//-----------------------------------------------------------------------------\n// Data\n//-----------------------------------------------------------------------------\n\nconst CHAR_CR = 13; // \\r\nconst CHAR_LF = 10; // \\n\n\n//-----------------------------------------------------------------------------\n// CharCodeReader\n//-----------------------------------------------------------------------------\n\n/**\n * A reader that reads character codes from a string.\n */\nclass CharCodeReader {\n\n /**\n * The text to read from.\n * @type {string}\n */\n #text = \"\";\n\n /**\n * The current line number.\n * @type {number}\n */\n #line = 1;\n\n /**\n * The current column number.\n * @type {number}\n */\n #column = 0;\n\n /**\n * The current offset in the text.\n * @type {number}\n */\n #offset = -1;\n\n /**\n * Whether the last character read was a new line.\n * @type {boolean}\n */\n #newLine = false;\n\n /**\n * The last character code read.\n * @type {number}\n */\n #last = -1;\n\n /**\n * Whether the reader has ended.\n * @type {boolean}\n */\n #ended = false;\n\n /**\n * Creates a new instance.\n * @param {string} text The text to read from\n */\n constructor(text) {\n this.#text = text;\n }\n\n /**\n * Ends the reader.\n * @returns {void}\n */\n #end() {\n if (this.#ended) {\n return;\n }\n\n this.#column++;\n this.#offset++;\n this.#last = -1;\n this.#ended = true;\n }\n\n /**\n * Returns the current position of the reader.\n * @returns {Location} An object with line, column, and offset properties.\n */\n locate() {\n return {\n line: this.#line,\n column: this.#column,\n offset: this.#offset\n };\n }\n\n /**\n * Reads the next character code in the text.\n * @returns {number} The next character code, or -1 if there are no more characters.\n */\n next() {\n if (this.#offset >= this.#text.length - 1) {\n this.#end();\n return -1;\n }\n\n this.#offset++;\n const charCode = this.#text.charCodeAt(this.#offset);\n\n if (this.#newLine) {\n this.#line++;\n this.#column = 1;\n this.#newLine = false;\n } else {\n this.#column++;\n }\n\n if (charCode === CHAR_CR) {\n this.#newLine = true;\n\n // if we already see a \\r, just ignore upcoming \\n\n if (this.peek() === CHAR_LF) {\n this.#offset++;\n }\n } else if (charCode === CHAR_LF) {\n this.#newLine = true;\n }\n\n this.#last = charCode;\n\n return charCode;\n }\n\n /**\n * Peeks at the next character code in the text.\n * @returns {number} The next character code, or -1 if there are no more characters.\n */\n peek() {\n if (this.#offset === this.#text.length - 1) {\n return -1;\n }\n\n return this.#text.charCodeAt(this.#offset + 1);\n }\n\n /**\n * Determines if the next character code in the text matches a specific character code.\n * @param {(number) => boolean} fn A function to call on the next character.\n * @returns {boolean} True if the next character code matches, false if not.\n */ \n match(fn) {\n if (fn(this.peek())) {\n this.next();\n return true;\n }\n\n return false;\n }\n\n /**\n * Returns the last character code read.\n * @returns {number} The last character code read.\n */\n current() {\n return this.#last;\n }\n\n\n}\n\n/**\n * @fileoverview JSON tokenizer\n * @author Nicholas C. Zakas\n */\n\n\n//-----------------------------------------------------------------------------\n// Typedefs\n//-----------------------------------------------------------------------------\n\n/** @typedef {import(\"./typedefs.js\").Range} Range */\n/** @typedef {import(\"./typedefs.js\").TokenizeOptions} TokenizeOptions */\n\n//-----------------------------------------------------------------------------\n// Helpers\n//-----------------------------------------------------------------------------\n\nconst INFINITY = \"Infinity\";\nconst NAN = \"NaN\";\n\nconst keywordStarts = new Set([CHAR_LOWER_T, CHAR_LOWER_F, CHAR_LOWER_N]);\nconst whitespace = new Set([CHAR_SPACE, CHAR_TAB, CHAR_NEWLINE, CHAR_RETURN]);\nconst json5Whitespace = new Set([\n ...whitespace,\n CHAR_VTAB,\n CHAR_FORM_FEED,\n CHAR_NBSP,\n CHAR_LINE_SEPARATOR,\n CHAR_PARAGRAPH_SEPARATOR,\n CHAR_BOM,\n CHAR_NON_BREAKING_SPACE,\n CHAR_EN_QUAD,\n CHAR_EM_QUAD,\n CHAR_EN_SPACE,\n CHAR_EM_SPACE,\n CHAR_THREE_PER_EM_SPACE,\n CHAR_FOUR_PER_EM_SPACE,\n CHAR_SIX_PER_EM_SPACE,\n CHAR_FIGURE_SPACE,\n CHAR_PUNCTUATION_SPACE,\n CHAR_THIN_SPACE,\n CHAR_HAIR_SPACE,\n CHAR_NARROW_NO_BREAK_SPACE,\n CHAR_MEDIUM_MATHEMATICAL_SPACE,\n CHAR_IDEOGRAPHIC_SPACE,\n]);\n\n\n/** @type {TokenizeOptions} */\nconst DEFAULT_OPTIONS$1 = {\n mode: \"json\",\n ranges: false\n};\n\nconst jsonKeywords = new Set([\"true\", \"false\", \"null\"]);\n\nconst tt = {\n EOF: 0,\n Number: 1,\n String: 2,\n Boolean: 3,\n Null: 4,\n NaN: 5,\n Infinity: 6,\n Identifier: 7,\n Colon: 20,\n LBrace: 21,\n RBrace: 22,\n LBracket: 23,\n RBracket: 24,\n Comma: 25,\n LineComment: 40,\n BlockComment: 41\n};\n\n\n// #region Helpers\n\n\n/**\n * Determines if a given character is a decimal digit.\n * @param {number} c The character to check.\n * @returns {boolean} `true` if the character is a digit.\n */\nfunction isDigit(c) {\n return c >= CHAR_0 && c <= CHAR_9;\n}\n\n/**\n * Determines if a given character is a hexadecimal digit.\n * @param {number} c The character to check.\n * @returns {boolean} `true` if the character is a hexadecimal digit.\n */\nfunction isHexDigit(c) {\n return isDigit(c) ||\n c >= CHAR_UPPER_A && c <= CHAR_UPPER_F ||\n c >= CHAR_LOWER_A && c <= CHAR_LOWER_F;\n}\n\n/**\n * Determines if a given character is a positive digit (1-9).\n * @param {number} c The character to check.\n * @returns {boolean} `true` if the character is a positive digit.\n */\nfunction isPositiveDigit(c) {\n return c >= CHAR_1 && c <= CHAR_9;\n}\n\n/**\n * Determines if a given character is the start of a keyword.\n * @param {number} c The character to check.\n * @returns {boolean} `true` if the character is the start of a keyword.\n */\nfunction isKeywordStart(c) {\n return keywordStarts.has(c);\n}\n\n/**\n * Determines if a given character is the start of a number.\n * @param {number} c The character to check.\n * @returns {boolean} `true` if the character is the start of a number.\n */\nfunction isNumberStart(c) {\n return isDigit(c) || c === CHAR_DOT || c === CHAR_MINUS;\n}\n\n/**\n * Determines if a given character is the start of a JSON5 number.\n * @param {number} c The character to check.\n * @returns {boolean} `true` if the character is the start of a JSON5 number.\n */\nfunction isJSON5NumberStart(c) {\n return isNumberStart(c) || c === CHAR_PLUS;\n}\n\n/**\n * Determines if a given character is the start of a string.\n * @param {number} c The character to check.\n * @param {boolean} json5 `true` if JSON5 mode is enabled.\n * @returns {boolean} `true` if the character is the start of a string.\n */\nfunction isStringStart(c, json5) {\n return c === CHAR_DOUBLE_QUOTE || (json5 && c === CHAR_SINGLE_QUOTE);\n}\n\n/**\n * Tests that a given character is a valid first character of a\n * JSON5 identifier\n * @param {number} c The character to check.\n * @returns {boolean} `true` if the character is a valid first character. \n */\nfunction isJSON5IdentifierStart(c) {\n\n // test simple cases first\n\n if (c === CHAR_DOLLAR || c === CHAR_UNDERSCORE || c === CHAR_BACKSLASH) {\n return true;\n }\n\n if (c >= CHAR_LOWER_A && c <= CHAR_LOWER_Z || c >= CHAR_UPPER_A && c <= CHAR_UPPER_Z) {\n return true;\n }\n\n if (c === 0x200C || c === 0x200D) {\n return true;\n }\n \n const ct = String.fromCharCode(c);\n return ID_Start.test(ct);\n}\n\n/**\n * Tests that a given character is a valid part of a JSON5 identifier.\n * @param {number} c The character to check.\n * @returns {boolean} `true` if the character is a valid part of an identifier.\n */\nfunction isJSON5IdentifierPart(c) {\n\n // fast path for simple cases\n if (isJSON5IdentifierStart(c) || isDigit(c)) {\n return true;\n }\n\n const ct = String.fromCharCode(c);\n return ID_Continue.test(ct);\n}\n\n\n// #endregion\n\nclass Tokenizer {\n\n /**\n * Options for the tokenizer.\n * @type {TokenizeOptions}\n */\n #options;\n\n /**\n * The source text to tokenize.\n * @type {string}\n */\n #text;\n\n /**\n * The reader for the source text.\n * @type {CharCodeReader}\n */\n #reader;\n\n /**\n * Indicates if the tokenizer is in JSON5 mode.\n * @type {boolean}\n */\n #json5;\n\n /**\n * Indicates if comments are allowed.\n * @type {boolean}\n */\n #allowComments;\n\n /**\n * Indicates if ranges should be included in the tokens.\n * @type {boolean}\n */\n #ranges;\n\n /**\n * The last token type read.\n * @type {Token}\n */\n #token;\n\n /**\n * Determines if a character is an escaped character.\n * @type {(c:number) => boolean}\n */\n #isEscapedCharacter;\n\n /**\n * Determines if a character is a JSON5 line terminator.\n * @type {(c:number) => boolean}\n */\n #isJSON5LineTerminator;\n\n\n /**\n * Determines if a character is a JSON5 hex escape.\n * @type {(c:number) => boolean}\n */\n #isJSON5HexEscape;\n\n /**\n * Determines if a character is whitespace.\n * @type {(c:number) => boolean}\n */\n #isWhitespace;\n\n /**\n * Creates a new instance of the tokenizer.\n * @param {string} text The source text\n * @param {TokenizeOptions} [options] Options for the tokenizer.\n */ \n constructor(text, options) {\n this.#text = text;\n this.#options = {\n ...DEFAULT_OPTIONS$1,\n ...options\n };\n\n this.#reader = new CharCodeReader(text);\n this.#json5 = this.#options.mode === \"json5\";\n this.#allowComments = this.#options.mode !== \"json\";\n this.#ranges = this.#options.ranges;\n\n // TODO: Clean this up\n this.#isEscapedCharacter = this.#json5 ? json5EscapeToChar.has.bind(json5EscapeToChar) : escapeToChar.has.bind(escapeToChar);\n this.#isJSON5LineTerminator = this.#json5 ? json5LineTerminators.has.bind(json5LineTerminators) : () => false;\n this.#isJSON5HexEscape = this.#json5 ? c => c === CHAR_LOWER_X : () => false;\n this.#isWhitespace = this.#json5 ? json5Whitespace.has.bind(json5Whitespace) : whitespace.has.bind(whitespace);\n }\n\n // #region Errors\n\n /**\n * Convenience function for throwing unexpected character errors.\n * @param {number} c The unexpected character.\n * @param {Location} [loc] The location of the unexpected character.\n * @returns {never}\n * @throws {UnexpectedChar} always.\n */\n #unexpected(c, loc = this.#reader.locate()) {\n throw new UnexpectedChar(c, loc);\n }\n\n /**\n * Convenience function for throwing unexpected identifier errors.\n * @param {string} identifier The unexpected identifier.\n * @param {Location} [loc] The location of the unexpected identifier.\n * @returns {never}\n * @throws {UnexpectedIdentifier} always.\n */\n #unexpectedIdentifier(identifier, loc = this.#reader.locate()) {\n throw new UnexpectedIdentifier(identifier, loc);\n }\n\n /**\n * Convenience function for throwing unexpected EOF errors.\n * @returns {never}\n * @throws {UnexpectedEOF} always.\n */\n #unexpectedEOF() {\n throw new UnexpectedEOF(this.#reader.locate());\n }\n\n // #endregion\n\n // #region Helpers\n\n /**\n * Creates a new token.\n * @param {TokenType} tokenType The type of token to create.\n * @param {number} length The length of the token.\n * @param {Location} startLoc The start location for the token.\n * @param {Location} [endLoc] The end location for the token.\n * @returns {Token} The token.\n */\n #createToken(tokenType, length, startLoc, endLoc) {\n\n const endOffset = startLoc.offset + length;\n\n let range = this.#options.ranges ? {\n range: /** @type {Range} */ ([startLoc.offset, endOffset])\n } : undefined;\n\n return {\n type: tokenType,\n loc: {\n start: startLoc,\n end: endLoc || {\n line: startLoc.line,\n column: startLoc.column + length,\n offset: endOffset\n }\n },\n ...range\n }; \n }\n\n /**\n * Reads in a specific number of hex digits.\n * @param {number} count The number of hex digits to read.\n * @returns {string} The hex digits read.\n */\n #readHexDigits(count) {\n let value = \"\";\n let c;\n\n for (let i = 0; i < count; i++) {\n c = this.#reader.peek();\n if (isHexDigit(c)) {\n this.#reader.next();\n value += String.fromCharCode(c);\n continue;\n }\n\n this.#unexpected(c);\n }\n\n return value;\n }\n\n /**\n * Reads in a JSON5 identifier. Also used for JSON but we validate\n * the identifier later.\n * @param {number} c The first character of the identifier.\n * @returns {string} The identifier read.\n * @throws {UnexpectedChar} when the identifier cannot be read.\n */\n #readIdentifier(c) {\n let value = \"\";\n\n do {\n\n value += String.fromCharCode(c);\n\n if (c === CHAR_BACKSLASH) {\n\n c = this.#reader.next();\n\n if (c !== CHAR_LOWER_U) {\n this.#unexpected(c);\n }\n\n value += String.fromCharCode(c);\n\n const hexDigits = this.#readHexDigits(4);\n\n // check for a valid character code\n const charCode = parseInt(hexDigits, 16);\n\n if (value.length === 2 && !isJSON5IdentifierStart(charCode)) {\n const loc = this.#reader.locate();\n this.#unexpected(CHAR_BACKSLASH, { line: loc.line, column: loc.column - 5, offset: loc.offset - 5 });\n } else if (!isJSON5IdentifierPart(charCode)) {\n const loc = this.#reader.locate();\n this.#unexpected(charCode, { line: loc.line, column: loc.column - 5, offset: loc.offset - 5 });\n }\n\n value += hexDigits;\n }\n\n c = this.#reader.peek();\n\n if (!isJSON5IdentifierPart(c)) {\n break;\n }\n\n this.#reader.next();\n\n } while (true); // eslint-disable-line no-constant-condition\n\n return value;\n }\n\n /**\n * Reads in a string. Works for both JSON and JSON5.\n * @param {number} c The first character of the string (either \" or ').\n * @returns {number} The length of the string.\n * @throws {UnexpectedChar} when the string cannot be read.\n * @throws {UnexpectedEOF} when EOF is reached before the string is finalized.\n */\n #readString(c) {\n \n const delimiter = c;\n let length = 1;\n c = this.#reader.peek();\n\n while (c !== -1 && c !== delimiter) {\n\n this.#reader.next();\n length++;\n\n // escapes\n if (c === CHAR_BACKSLASH) {\n c = this.#reader.peek();\n\n if (this.#isEscapedCharacter(c) || this.#isJSON5LineTerminator(c)) {\n this.#reader.next();\n length++;\n } else if (c === CHAR_LOWER_U) {\n this.#reader.next();\n length++;\n\n const result = this.#readHexDigits(4);\n length += result.length;\n } else if (this.#isJSON5HexEscape(c)) {\n this.#reader.next();\n length++;\n\n // hex escapes: \\xHH\n const result = this.#readHexDigits(2);\n length += result.length;\n } else if (this.#json5) { // JSON doesn't allow anything else\n this.#reader.next();\n length++;\n } else {\n this.#unexpected(c);\n }\n }\n\n c = this.#reader.peek();\n }\n\n if (c === -1) {\n this.#reader.next();\n this.#unexpectedEOF();\n }\n\n // c is the delimiter\n this.#reader.next();\n length++;\n\n return length;\n \n \n }\n\n /**\n * Reads a number. Works for both JSON and JSON5.\n * @param {number} c The first character of the number.\n * @returns {number} The length of the number.\n * @throws {UnexpectedChar} when the number cannot be read.\n * @throws {UnexpectedEOF} when EOF is reached before the number is finalized.\n */\n #readNumber(c) {\n \n // we've already read the first character\n let length = 1;\n\n // JSON number may start with a minus but not a plus\n // JSON5 allows a plus.\n if (c === CHAR_MINUS || this.#json5 && c === CHAR_PLUS) {\n \n c = this.#reader.peek();\n \n /*\n * JSON5 allows Infinity or NaN preceded by a sign.\n * This blocks handles +Infinity, -Infinity, +NaN, and -NaN.\n * Standalone Infinity and NaN are handled in `readJSON5Identifier()`\n */\n if (this.#json5) {\n\n if (c === CHAR_UPPER_I || c === CHAR_UPPER_N) {\n this.#reader.next();\n const identifier = this.#readIdentifier(c);\n\n if (identifier !== INFINITY && identifier !== NAN) {\n this.#unexpected(c);\n }\n\n return length + identifier.length;\n }\n }\n\n // Next digit cannot be zero\n if (!isDigit(c)) {\n this.#unexpected(c);\n }\n\n // if we made it here, we need to continue on, so register the character\n this.#reader.next();\n length++;\n }\n\n /*\n * In JSON, a zero must be followed by a decimal point or nothing.\n * In JSON5, a zero can additionally be followed by an `x` indicating\n * that it's a hexadecimal number.\n */\n if (c === CHAR_0) {\n\n // c = this.#reader.next();\n // length++;\n c = this.#reader.peek();\n\n // check for a hex number\n if (this.#json5 && (c === CHAR_LOWER_X || c === CHAR_UPPER_X)) {\n\n this.#reader.next();\n length++;\n\n c = this.#reader.peek();\n\n if (!isHexDigit(c)) {\n this.#reader.next();\n this.#unexpected(c);\n }\n\n do {\n this.#reader.next();\n length++;\n c = this.#reader.peek();\n } while (isHexDigit(c));\n\n } else if (isDigit(c)) {\n this.#unexpected(c);\n }\n\n } else {\n\n // JSON5 allows leading decimal points\n if (!this.#json5 || c !== CHAR_DOT) {\n if (!isPositiveDigit(c)) {\n this.#unexpected(c);\n }\n\n c = this.#reader.peek();\n\n while (isDigit(c)) {\n this.#reader.next();\n length++;\n c = this.#reader.peek();\n }\n }\n }\n\n /*\n * In JSON, a decimal point must be followed by at least one digit.\n * In JSON5, a decimal point need not be followed by any digits.\n */\n if (c === CHAR_DOT) {\n \n let digitCount = -1;\n this.#reader.next();\n length++;\n digitCount++;\n\n c = this.#reader.peek();\n\n while (isDigit(c)) {\n this.#reader.next();\n length++;\n digitCount++;\n c = this.#reader.peek();\n }\n\n if (!this.#json5 && digitCount === 0) {\n this.#reader.next();\n if (c) {\n this.#unexpected(c);\n } else {\n this.#unexpectedEOF();\n }\n }\n }\n\n // Exponent is always last\n if (c === CHAR_LOWER_E || c === CHAR_UPPER_E) {\n\n this.#reader.next();\n length++;\n c = this.#reader.peek();\n\n if (c === CHAR_PLUS || c === CHAR_MINUS) {\n this.#reader.next();\n length++;\n c = this.#reader.peek();\n }\n\n /*\n * Must always have a digit in this position to avoid:\n * 5e\n * 12E+\n * 42e-\n */\n if (c === -1) {\n this.#reader.next();\n this.#unexpectedEOF();\n }\n\n if (!isDigit(c)) {\n this.#reader.next();\n this.#unexpected(c);\n }\n\n while (isDigit(c)) {\n this.#reader.next();\n length++;\n c = this.#reader.peek();\n }\n }\n\n return length;\n }\n\n /**\n * Reads a comment. Works for both JSON and JSON5.\n * @param {number} c The first character of the comment.\n * @returns {{length: number, multiline: boolean}} The length of the comment, and whether the comment is multi-line.\n * @throws {UnexpectedChar} when the comment cannot be read.\n * @throws {UnexpectedEOF} when EOF is reached before the comment is finalized.\n */ \n #readComment(c) {\n \n let length = 1;\n\n // next character determines single- or multi-line\n c = this.#reader.peek();\n\n // single-line comments\n if (c === CHAR_SLASH) {\n \n do {\n this.#reader.next();\n length += 1;\n c = this.#reader.peek();\n } while (c > -1 && c !== CHAR_RETURN && c !== CHAR_NEWLINE);\n\n return { length, multiline: false };\n }\n\n // multi-line comments\n if (c === CHAR_STAR) {\n\n this.#reader.next();\n length += 1;\n\n while (c > -1) {\n c = this.#reader.peek();\n\n // check for end of comment\n if (c === CHAR_STAR) {\n this.#reader.next();\n length += 1;\n c = this.#reader.peek();\n \n //end of comment\n if (c === CHAR_SLASH) {\n this.#reader.next();\n length += 1;\n\n return { length, multiline: true };\n }\n } else {\n this.#reader.next();\n length += 1;\n }\n }\n\n this.#reader.next();\n this.#unexpectedEOF();\n \n }\n\n // if we've made it here, there's an invalid character\n this.#reader.next();\n this.#unexpected(c); \n }\n // #endregion\n\n /**\n * Returns the next token in the source text.\n * @returns {number} The code for the next token.\n */\n next() {\n\n let c = this.#reader.next();\n\n while (this.#isWhitespace(c)) {\n c = this.#reader.next();\n }\n\n if (c === -1) {\n return tt.EOF;\n }\n\n const start = this.#reader.locate();\n const ct = String.fromCharCode(c);\n\n // check for JSON5 syntax only\n if (this.#json5) {\n \n if (knownJSON5TokenTypes.has(ct)) {\n this.#token = this.#createToken(knownJSON5TokenTypes.get(ct), 1, start);\n } else if (isJSON5IdentifierStart(c)) {\n const value = this.#readIdentifier(c);\n\n if (knownJSON5TokenTypes.has(value)) {\n this.#token = this.#createToken(knownJSON5TokenTypes.get(value), value.length, start);\n } else {\n this.#token = this.#createToken(\"Identifier\", value.length, start);\n }\n } else if (isJSON5NumberStart(c)) {\n const result = this.#readNumber(c);\n this.#token = this.#createToken(\"Number\", result, start);\n } else if (isStringStart(c, this.#json5)) {\n const result = this.#readString(c);\n const lastCharLoc = this.#reader.locate();\n this.#token = this.#createToken(\"String\", result, start, {\n line: lastCharLoc.line,\n column: lastCharLoc.column + 1,\n offset: lastCharLoc.offset + 1\n });\n } else if (c === CHAR_SLASH && this.#allowComments) {\n const result = this.#readComment(c);\n const lastCharLoc = this.#reader.locate();\n this.#token = this.#createToken(!result.multiline ? \"LineComment\" : \"BlockComment\", result.length, start, {\n line: lastCharLoc.line,\n column: lastCharLoc.column + 1,\n offset: lastCharLoc.offset + 1\n });\n } else {\n this.#unexpected(c);\n }\n\n } else {\n\n // check for JSON/JSONC syntax only\n if (knownTokenTypes.has(ct)) {\n this.#token = this.#createToken(knownTokenTypes.get(ct), 1, start);\n } else if (isKeywordStart(c)) {\n const value = this.#readIdentifier(c);\n\n if (!jsonKeywords.has(value)) {\n this.#unexpectedIdentifier(value, start);\n }\n\n this.#token = this.#createToken(knownTokenTypes.get(value), value.length, start);\n } else if (isNumberStart(c)) {\n const result = this.#readNumber(c);\n this.#token = this.#createToken(\"Number\", result, start);\n } else if (isStringStart(c, this.#json5)) {\n const result = this.#readString(c);\n this.#token = this.#createToken(\"String\", result, start);\n } else if (c === CHAR_SLASH && this.#allowComments) {\n const result = this.#readComment(c);\n const lastCharLoc = this.#reader.locate();\n this.#token = this.#createToken(!result.multiline ? \"LineComment\" : \"BlockComment\", result.length, start, {\n line: lastCharLoc.line,\n column: lastCharLoc.column + 1,\n offset: lastCharLoc.offset + 1\n });\n } else {\n this.#unexpected(c);\n }\n }\n return tt[this.#token.type];\n }\n\n /**\n * Returns the current token in the source text.\n * @returns {Token} The current token.\n */\n get token() {\n return this.#token;\n }\n}\n\n//-----------------------------------------------------------------------------\n// Main\n//-----------------------------------------------------------------------------\n\n/**\n * Creates an iterator over the tokens representing the source text.\n * @param {string} text The source text to tokenize.\n * @param {TokenizeOptions} [options] Options for doing the tokenization.\n * @returns {Array<Token>} An iterator over the tokens. \n */\nfunction tokenize(text, options) {\n\n const tokenizer = new Tokenizer(text, options);\n const tokens = [];\n\n while (tokenizer.next() !== tt.EOF) {\n tokens.push(tokenizer.token);\n }\n\n return tokens;\n\n}\n\n/**\n * @fileoverview JSON AST types\n * @author Nicholas C. Zakas\n */\n\n//-----------------------------------------------------------------------------\n// Typedefs\n//-----------------------------------------------------------------------------\n\n/** @typedef {import(\"./typedefs.js\").LocationRange} LocationRange */\n/** @typedef {import(\"./typedefs.js\").NodeParts} NodeParts */\n/** @typedef {import(\"./typedefs.js\").DocumentNode} DocumentNode */\n/** @typedef {import(\"./typedefs.js\").StringNode} StringNode */\n/** @typedef {import(\"./typedefs.js\").NumberNode} NumberNode */\n/** @typedef {import(\"./typedefs.js\").BooleanNode} BooleanNode */\n/** @typedef {import(\"./typedefs.js\").MemberNode} MemberNode */\n/** @typedef {import(\"./typedefs.js\").ObjectNode} ObjectNode */\n/** @typedef {import(\"./typedefs.js\").ElementNode} ElementNode */\n/** @typedef {import(\"./typedefs.js\").ArrayNode} ArrayNode */\n/** @typedef {import(\"./typedefs.js\").NullNode} NullNode */\n/** @typedef {import(\"./typedefs.js\").ValueNode} ValueNode */\n/** @typedef {import(\"./typedefs.js\").IdentifierNode} IdentifierNode */\n/** @typedef {import(\"./typedefs.js\").NaNNode} NaNNode */\n/** @typedef {import(\"./typedefs.js\").InfinityNode} InfinityNode */\n/** @typedef {import(\"./typedefs.js\").Sign} Sign */\n\n//-----------------------------------------------------------------------------\n// Exports\n//-----------------------------------------------------------------------------\n\nconst types = {\n\n /**\n * Creates a document node.\n * @param {ValueNode} body The body of the document.\n * @param {NodeParts} parts Additional properties for the node. \n * @returns {DocumentNode} The document node.\n */\n document(body, parts = {}) {\n return {\n type: \"Document\",\n body,\n loc: parts.loc,\n ...parts\n };\n },\n\n /**\n * Creates a string node.\n * @param {string} value The value for the string.\n * @param {NodeParts} parts Additional properties for the node. \n * @returns {StringNode} The string node.\n */\n string(value, parts = {}) {\n return {\n type: \"String\",\n value,\n loc: parts.loc,\n ...parts\n };\n },\n\n /**\n * Creates a number node.\n * @param {number} value The value for the number.\n * @param {NodeParts} parts Additional properties for the node. \n * @returns {NumberNode} The number node.\n */\n number(value, parts = {}) {\n return {\n type: \"Number\",\n value,\n loc: parts.loc,\n ...parts\n };\n },\n\n /**\n * Creates a boolean node.\n * @param {boolean} value The value for the boolean.\n * @param {NodeParts} parts Additional properties for the node. \n * @returns {BooleanNode} The boolean node.\n */\n boolean(value, parts = {}) {\n return {\n type: \"Boolean\",\n value,\n loc: parts.loc,\n ...parts\n };\n },\n\n /**\n * Creates a null node.\n * @param {NodeParts} parts Additional properties for the node. \n * @returns {NullNode} The null node.\n */\n null(parts = {}) {\n return {\n type: \"Null\",\n loc: parts.loc,\n ...parts\n };\n },\n\n /**\n * Creates an array node.\n * @param {Array<ElementNode>} elements The elements to add.\n * @param {NodeParts} parts Additional properties for the node. \n * @returns {ArrayNode} The array node.\n */\n array(elements, parts = {}) {\n return {\n type: \"Array\",\n elements,\n loc: parts.loc,\n ...parts\n };\n },\n\n /**\n * Creates an element node.\n * @param {ValueNode} value The value for the element.\n * @param {NodeParts} parts Additional properties for the node. \n * @returns {ElementNode} The element node.\n */\n element(value, parts = {}) {\n return {\n type: \"Element\",\n value,\n loc: parts.loc,\n ...parts\n };\n },\n\n /**\n * Creates an object node.\n * @param {Array<MemberNode>} members The members to add.\n * @param {NodeParts} parts Additional properties for the node. \n * @returns {ObjectNode} The object node.\n */\n object(members, parts = {}) {\n return {\n type: \"Object\",\n members,\n loc: parts.loc,\n ...parts\n };\n },\n\n /**\n * Creates a member node.\n * @param {StringNode|IdentifierNode} name The name for the member.\n * @param {ValueNode} value The value for the member.\n * @param {NodeParts} parts Additional properties for the node. \n * @returns {MemberNode} The member node.\n */\n member(name, value, parts = {}) {\n return {\n type: \"Member\",\n name,\n value,\n loc: parts.loc,\n ...parts\n };\n },\n\n /**\n * Creates an identifier node.\n * @param {string} name The name for the identifier.\n * @param {NodeParts} parts Additional properties for the node.\n * @returns {IdentifierNode} The identifier node.\n */\n identifier(name, parts = {}) {\n return {\n type: \"Identifier\",\n name,\n loc: parts.loc,\n ...parts\n };\n },\n\n /**\n * Creates a NaN node.\n * @param {Sign} sign The sign for the Infinity.\n * @param {NodeParts} parts Additional properties for the node.\n * @returns {NaNNode} The NaN node.\n */ \n nan(sign = \"\", parts = {}) {\n return {\n type: \"NaN\",\n sign,\n loc: parts.loc,\n ...parts\n };\n },\n\n /**\n * Creates an Infinity node.\n * @param {Sign} sign The sign for the Infinity.\n * @param {NodeParts} parts Additional properties for the node.\n * @returns {InfinityNode} The Infinity node.\n */\n infinity(sign = \"\", parts = {}) {\n return {\n type: \"Infinity\",\n sign,\n loc: parts.loc,\n ...parts\n };\n },\n\n};\n\n/**\n * @fileoverview JSON parser\n * @author Nicholas C. Zakas\n */\n\n\n//-----------------------------------------------------------------------------\n// Typedefs\n//-----------------------------------------------------------------------------\n\n/** @typedef {import(\"./typedefs.js\").Node} Node */\n/** @typedef {import(\"./typedefs.js\").Mode} Mode */\n/** @typedef {import(\"./typedefs.js\").ParseOptions} ParseOptions */\n\n//-----------------------------------------------------------------------------\n// Helpers\n//-----------------------------------------------------------------------------\n\n/** @type {ParseOptions} */\nconst DEFAULT_OPTIONS = {\n mode: \"json\",\n ranges: false,\n tokens: false,\n allowTrailingCommas: false\n};\n\nconst UNICODE_SEQUENCE = /\\\\u[\\da-fA-F]{4}/gu;\n\n/**\n * Normalizes a JSON5 identifier by converting Unicode escape sequences into\n * their corresponding characters.\n * @param {string} identifier The identifier to normalize.\n * @returns {string} The normalized identifier.\n */\nfunction normalizeIdentifier(identifier) {\n return identifier.replace(UNICODE_SEQUENCE, unicodeEscape => {\n return String.fromCharCode(parseInt(unicodeEscape.slice(2), 16));\n });\n}\n\n/**\n * Calculates the location at the end of the given text.\n * @param {string} text The text to calculate the end location for.\n * @returns {Location} The location at the end of the text.\n */\nfunction getEndLocation(text) {\n let line = 1;\n let column = 1;\n \n for (let i = 0; i < text.length; i++) {\n const char = text[i];\n if (char === \"\\n\") {\n line++;\n column = 1;\n } else if (char === \"\\r\") {\n // Handle \\r\\n as a single line ending\n if (text[i + 1] === \"\\n\") {\n i++; // Skip the \\n\n }\n line++;\n column = 1;\n } else {\n column++;\n }\n }\n \n return {\n line,\n column,\n offset: text.length\n };\n}\n\n/**\n * Converts a JSON-encoded string into a JavaScript string, interpreting each\n * escape sequence.\n * @param {string} value The text for the token.\n * @param {Token} token The string token to convert into a JavaScript string.\n * @param {boolean} json5 `true` if parsing JSON5, `false` otherwise.\n * @returns {string} A JavaScript string.\n */\nfunction getStringValue(value, token, json5 = false) {\n \n let result = \"\";\n let escapeIndex = value.indexOf(\"\\\\\");\n let lastIndex = 0;\n\n // While there are escapes, interpret them to build up the result\n while (escapeIndex >= 0) {\n\n // append the text that happened before the escape\n result += value.slice(lastIndex, escapeIndex);\n\n // get the character immediately after the \\\n const escapeChar = value.charAt(escapeIndex + 1);\n const escapeCharCode = escapeChar.charCodeAt(0);\n \n // check for the non-Unicode escape sequences first\n if (json5 && json5EscapeToChar.has(escapeCharCode)) {\n result += json5EscapeToChar.get(escapeCharCode);\n lastIndex = escapeIndex + 2;\n } else if (escapeToChar.has(escapeCharCode)) {\n result += escapeToChar.get(escapeCharCode);\n lastIndex = escapeIndex + 2;\n } else if (escapeChar === \"u\") {\n const hexCode = value.slice(escapeIndex + 2, escapeIndex + 6);\n if (hexCode.length < 4 || /[^0-9a-f]/i.test(hexCode)) {\n throw new ErrorWithLocation(\n `Invalid unicode escape \\\\u${ hexCode}.`,\n {\n line: token.loc.start.line,\n column: token.loc.start.column + escapeIndex,\n offset: token.loc.start.offset + escapeIndex\n }\n );\n }\n\n result += String.fromCharCode(parseInt(hexCode, 16));\n lastIndex = escapeIndex + 6;\n } else if (json5 && escapeChar === \"x\") {\n const hexCode = value.slice(escapeIndex + 2, escapeIndex + 4);\n if (hexCode.length < 2 || /[^0-9a-f]/i.test(hexCode)) {\n throw new ErrorWithLocation(\n `Invalid hex escape \\\\x${ hexCode}.`,\n {\n line: token.loc.start.line,\n column: token.loc.start.column + escapeIndex,\n offset: token.loc.start.offset + escapeIndex\n }\n );\n }\n\n result += String.fromCharCode(parseInt(hexCode, 16));\n lastIndex = escapeIndex + 4;\n } else if (json5 && json5LineTerminators.has(escapeCharCode)) {\n lastIndex = escapeIndex + 2;\n\n // we also need to skip \\n after a \\r\n if (escapeChar === \"\\r\" && value.charAt(lastIndex) === \"\\n\") {\n lastIndex++;\n }\n \n } else {\n // all characters can be escaped in JSON5\n if (json5) {\n result += escapeChar;\n lastIndex = escapeIndex + 2;\n } else {\n throw new ErrorWithLocation(\n `Invalid escape \\\\${ escapeChar }.`,\n {\n line: token.loc.start.line,\n column: token.loc.start.column + escapeIndex,\n offset: token.loc.start.offset + escapeIndex\n }\n );\n }\n }\n\n // find the next escape sequence\n escapeIndex = value.indexOf(\"\\\\\", lastIndex);\n }\n\n // get the last segment of the string value\n result += value.slice(lastIndex);\n\n return result;\n}\n\n/**\n * Gets the JavaScript value represented by a JSON token.\n * @param {string} value The text value of the token.\n * @param {Token} token The JSON token to get a value for.\n * @param {boolean} json5 `true` if parsing JSON5, `false` otherwise.\n * @returns {string|boolean|number} A number, string, or boolean.\n * @throws {TypeError} If an unknown token type is found. \n */\nfunction getLiteralValue(value, token, json5 = false) {\n switch (token.type) {\n case \"Boolean\":\n return value === \"true\";\n \n case \"Number\":\n if (json5) {\n\n /*\n * Numbers like -0x1 are converted to NaN by Number(), so we need\n * to handle them separately. Rather than checking for -0x, we can\n * just check if the first character is a minus sign. The same for\n * checking for +0x.\n */\n\n if (value.charCodeAt(0) === 45) { // 45 is the char code for '-'\n return -Number(value.slice(1));\n }\n\n if (value.charCodeAt(0) === 43) { // 43 is the char code for '+'\n return Number(value.slice(1));\n }\n }\n return Number(value);\n\n case \"String\":\n return getStringValue(value.slice(1, -1), token, json5);\n\n default:\n throw new TypeError(`Unknown token type \"${token.type}.`);\n }\n}\n\n//-----------------------------------------------------------------------------\n// Main Function\n//-----------------------------------------------------------------------------\n\n/**\n * \n * @param {string} text The text to parse.\n * @param {ParseOptions} [options] The options object.\n * @returns {DocumentNode} The AST representing the parsed JSON.\n * @throws {Error} When there is a parsing error. \n */\nfunction parse(text, options) {\n\n options = Object.freeze({\n ...DEFAULT_OPTIONS,\n ...options\n });\n\n const tokens = [];\n const tokenizer = new Tokenizer(text, {\n mode: options.mode,\n ranges: options.ranges\n });\n\n const json5 = options.mode === \"json5\";\n const allowTrailingCommas = options.allowTrailingCommas || json5;\n\n /**\n * Returns the next token knowing there are no comments.\n * @returns {number} The next token type or 0 if no next token.\n */\n function nextNoComments() {\n const nextType = tokenizer.next();\n\n if (nextType && options.tokens) {\n tokens.push(tokenizer.token);\n }\n return nextType;\n }\n \n /**\n * Returns the next token knowing there are comments to skip.\n * @returns {number} The next token type or 0 if no next token.\n */\n function nextSkipComments() {\n const nextType = tokenizer.next();\n if (nextType && options.tokens) {\n tokens.push(tokenizer.token);\n }\n\n if (nextType >= tt.LineComment) {\n return nextSkipComments();\n }\n\n return nextType;\n\n }\n\n // determine correct way to evaluate tokens based on presence of comments\n const next = options.mode === \"json\" ? nextNoComments : nextSkipComments;\n\n /**\n * Asserts a token has the given type.\n * @param {number} token The token to check.\n * @param {number} type The token type.\n * @throws {UnexpectedToken} If the token type isn't expected.\n * @returns {void}\n */\n function assertTokenType(token, type) {\n if (token !== type) {\n throw new UnexpectedToken(tokenizer.token);\n }\n }\n\n /**\n * Asserts a token has one of the given types.\n * @param {number} token The token to check.\n * @param {number[]} types The token types.\n * @returns {void}\n * @throws {UnexpectedToken} If the token type isn't expected.\n */ \n function assertTokenTypes(token, types) {\n if (!types.includes(token)) {\n throw new UnexpectedToken(tokenizer.token);\n }\n }\n\n /**\n * Creates a range only if ranges are specified.\n * @param {Location} start The start offset for the range.\n * @param {Location} end The end offset for the range.\n * @returns {{range:[number,number]}|undefined} An object with a \n */\n function createRange(start, end) {\n // @ts-ignore tsc incorrect - options might be undefined\n return options.ranges ? {\n range: [start.offset, end.offset]\n } : undefined;\n }\n\n /**\n * Creates a node for a string, boolean, or number.\n * @param {number} tokenType The token representing the literal. \n * @returns {StringNode|NumberNode|BooleanNode} The node representing\n * the value.\n */\n function createLiteralNode(tokenType) {\n const token = tokenizer.token;\n const range = createRange(token.loc.start, token.loc.end);\n const value = getLiteralValue(\n text.slice(token.loc.start.offset, token.loc.end.offset),\n token,\n json5\n );\n const loc = {\n start: {\n ...token.loc.start\n },\n end: {\n ...token.loc.end\n }\n };\n const parts = { loc, ...range };\n\n switch (tokenType) {\n case tt.String:\n return types.string(/** @type {string} */ (value), parts);\n\n case tt.Number:\n return types.number(/** @type {number} */ (value), parts);\n \n case tt.Boolean:\n return types.boolean(/** @type {boolean} */ (value), parts);\n\n default:\n throw new TypeError(`Unknown token type ${token.type}.`);\n }\n }\n\n /**\n * Creates a node for a JSON5 identifier.\n * @param {Token} token The token representing the identifer. \n * @returns {NaNNode|InfinityNode|IdentifierNode} The node representing\n * the value.\n */\n function createJSON5IdentifierNode(token) {\n const range = createRange(token.loc.start, token.loc.end);\n const identifier = text.slice(token.loc.start.offset, token.loc.end.offset);\n const loc = {\n start: {\n ...token.loc.start\n },\n end: {\n ...token.loc.end\n }\n };\n const parts = { loc, ...range };\n\n // Check for NaN or Infinity\n if (token.type !== \"Identifier\") {\n\n let sign = \"\";\n\n // check if the first character in the token is a plus or minus\n if (identifier[0] === \"+\" || identifier[0] === \"-\") {\n sign = identifier[0];\n }\n\n // check if the token is NaN or Infinity\n return types[identifier.includes(\"NaN\") ? \"nan\" : \"infinity\"](/** @type {Sign} */ (sign), parts);\n }\n return types.identifier(normalizeIdentifier(identifier), parts);\n }\n\n /**\n * Creates a node for a null.\n * @param {Token} token The token representing null. \n * @returns {NullNode} The node representing null.\n */\n function createNullNode(token) {\n const range = createRange(token.loc.start, token.loc.end);\n\n return types.null({\n loc: {\n start: {\n ...token.loc.start\n },\n end: {\n ...token.loc.end\n }\n },\n ...range\n });\n }\n\n\n /**\n * Parses a property in an object.\n * @param {number} tokenType The token representing the property.\n * @returns {MemberNode} The node representing the property.\n * @throws {UnexpectedToken} When an unexpected token is found.\n * @throws {UnexpectedEOF} When the end of the file is reached.\n */\n function parseProperty(tokenType) {\n\n if (json5) {\n assertTokenTypes(tokenType, [tt.String, tt.Identifier, tt.Number]);\n } else {\n assertTokenType(tokenType, tt.String);\n }\n\n const token = tokenizer.token;\n\n // check for -NaN, +NaN, -Infinity, +Infinity, and any number\n if (json5 && tokenType === tt.Number && /[+\\-0-9]/.test(text[token.loc.start.offset])) {\n throw new UnexpectedToken(token);\n }\n\n // TODO: Clean this up a bit\n let key = tokenType === tt.String\n ? /** @type {StringNode} */ (createLiteralNode(tokenType))\n : /** @type {IdentifierNode|NaNNode|InfinityNode} */ (createJSON5IdentifierNode(token));\n\n // in JSON5, need to check for NaN and Infinity and create identifier nodes\n if (json5 && (key.type === \"NaN\" || key.type === \"Infinity\")) {\n\n // NaN and Infinity cannot be signed and be a property key\n if (key.sign !== \"\") {\n throw new UnexpectedToken(tokenizer.token);\n }\n\n key = types.identifier(key.type, { loc: key.loc, ...createRange(key.loc.start, key.loc.end) });\n }\n\n tokenType = next();\n assertTokenType(tokenType, tt.Colon);\n const value = parseValue();\n const range = createRange(key.loc.start, value.loc.end);\n\n return types.member(\n /** @type {StringNode|IdentifierNode} */ (key),\n /** @type {ValueNode} */ (value),\n {\n loc: {\n start: {\n ...key.loc.start\n },\n end: {\n ...value.loc.end\n }\n },\n ...range\n }\n );\n }\n\n /**\n * Parses an object literal.\n * @param {number} firstTokenType The first token type in the object.\n * @returns {ObjectNode} The object node.\n * @throws {UnexpectedEOF} When the end of the file is reached.\n * @throws {UnexpectedToken} When an unexpected token is found.\n */\n function parseObject(firstTokenType) {\n\n // The first token must be a { or else it's an error\n assertTokenType(firstTokenType, tt.LBrace);\n\n const firstToken = tokenizer.token;\n const members = [];\n let tokenType = next();\n\n if (tokenType !== tt.RBrace) {\n do {\n \n // add the value into the array\n members.push(parseProperty(tokenType));\n \n tokenType = next();\n\n if (!tokenType) {\n throw new UnexpectedEOF(members[members.length-1].loc.end);\n }\n \n if (tokenType === tt.Comma) {\n tokenType = next();\n\n /*\n * Trailing commas.\n * So we need to check if the token is a comma,\n * and if so, then we need to check if the next\n * token is a RBrace. If it is, then we need to\n * break out of the loop.\n */\n if (allowTrailingCommas && tokenType === tt.RBrace) {\n break;\n } \n } else {\n break;\n }\n } while (tokenType);\n }\n\n assertTokenType(tokenType, tt.RBrace);\n const lastToken = tokenizer.token;\n const range = createRange(firstToken.loc.start, lastToken.loc.end);\n\n return types.object(members, {\n loc: {\n start: {\n ...firstToken.loc.start\n },\n end: {\n ...lastToken.loc.end\n }\n },\n ...range\n });\n\n }\n\n /**\n * Parses an array literal.\n * @param {number} firstTokenType The first token in the array.\n * @returns {ArrayNode} The array node.\n * @throws {UnexpectedToken} When an unexpected token is found.\n * @throws {UnexpectedEOF} When the end of the file is reached.\n */\n function parseArray(firstTokenType) {\n\n // The first token must be a [ or else it's an error\n assertTokenType(firstTokenType, tt.LBracket);\n\n const firstToken = tokenizer.token;\n const elements = [];\n let tokenType = next();\n \n if (tokenType !== tt.RBracket) {\n\n do {\n\n // add the value into the array\n const value = parseValue(tokenType);\n\n elements.push(types.element(\n /** @type {ValueNode} */ (value),\n { loc: value.loc }\n ));\n\n tokenType = next();\n \n if (tokenType === tt.Comma) {\n tokenType = next();\n\n /*\n * Trailing commas.\n * So we need to check if the token is a comma,\n * and if so, then we need to check if the next\n * token is a RBracket. If it is, then we need to\n * break out of the loop.\n */\n if (allowTrailingCommas && tokenType === tt.RBracket) {\n break;\n } \n } else {\n break;\n }\n } while (tokenType);\n }\n\n assertTokenType(tokenType, tt.RBracket);\n\n const lastToken = tokenizer.token;\n const range = createRange(firstToken.loc.start, lastToken.loc.end);\n\n return types.array(elements, {\n loc: {\n start: {\n ...firstToken.loc.start\n },\n end: {\n ...lastToken.loc.end\n }\n },\n ...range\n });\n\n }\n\n /**\n * Parses a JSON value.\n * @param {number} [tokenType] The token type to parse.\n * @returns {ValueNode|IdentifierNode} The node representing the value.\n */\n function parseValue(tokenType) {\n\n tokenType = tokenType ?? next();\n const token = tokenizer.token;\n \n switch (tokenType) {\n case tt.String:\n case tt.Boolean:\n return createLiteralNode(tokenType);\n\n case tt.Number:\n if (json5) {\n let tokenText = text.slice(token.loc.start.offset, token.loc.end.offset);\n if (tokenText[0] === \"+\" || tokenText[0] === \"-\") {\n tokenText = tokenText.slice(1);\n }\n\n if (tokenText === \"NaN\" || tokenText === \"Infinity\") {\n return createJSON5IdentifierNode(token);\n }\n }\n return createLiteralNode(tokenType);\n\n case tt.Null:\n return createNullNode(token);\n\n case tt.LBrace:\n return parseObject(tokenType);\n\n case tt.LBracket:\n return parseArray(tokenType);\n\n default:\n throw new UnexpectedToken(token);\n }\n\n }\n\n \n const docBody = parseValue();\n \n const unexpectedToken = next();\n if (unexpectedToken) {\n throw new UnexpectedToken(tokenizer.token);\n }\n \n \n const textEndLocation = getEndLocation(text);\n const docParts = {\n loc: {\n start: {\n line: 1,\n column: 1,\n offset: 0\n },\n end: {\n ...textEndLocation\n }\n }\n };\n \n if (options.tokens) {\n docParts.tokens = tokens;\n }\n\n if (options.ranges) {\n docParts.range = [\n docParts.loc.start.offset,\n docParts.loc.end.offset\n ];\n }\n\n return types.document(/** @type {ValueNode} */ (docBody), docParts);\n}\n\n/**\n * @fileoverview Traversal approaches for Momoa JSON AST.\n * @author Nicholas C. Zakas\n */\n\n//-----------------------------------------------------------------------------\n// Typedefs\n//-----------------------------------------------------------------------------\n\n/** @typedef {import(\"./typedefs.js\").TraversalPhase} TraversalPhase */\n/**\n * @typedef {Object} TraversalVisitor\n * @property {(node: Node, parent?: Node) => void} [enter]\n * @property {(node: Node, parent?: Node) => void} [exit]\n */\n\n//-----------------------------------------------------------------------------\n// Data\n//-----------------------------------------------------------------------------\n\nconst childKeys = new Map([\n [\"Document\", [\"body\"]],\n [\"Object\", [\"members\"]],\n [\"Member\", [\"name\", \"value\"]],\n [\"Element\", [\"value\"]],\n [\"Array\", [\"elements\"]],\n [\"String\", []],\n [\"Number\", []],\n [\"Boolean\", []],\n [\"Null\", []],\n [\"NaN\", []],\n [\"Infinity\", []],\n [\"Identifier\", []],\n]);\n\n//-----------------------------------------------------------------------------\n// Helpers\n//-----------------------------------------------------------------------------\n\n/**\n * Determines if a given value is an object.\n * @param {*} value The value to check.\n * @returns {boolean} True if the value is an object, false if not. \n */\nfunction isObject(value) {\n return value && (typeof value === \"object\");\n}\n\n/**\n * Determines if a given value is an AST node.\n * @param {*} value The value to check.\n * @returns {boolean} True if the value is a node, false if not. \n */\nfunction isNode(value) {\n return isObject(value) && (typeof value.type === \"string\");\n}\n\n//-----------------------------------------------------------------------------\n// Exports\n//-----------------------------------------------------------------------------\n\n/**\n * Traverses an AST from the given node.\n * @param {Node} root The node to traverse from \n * @param {TraversalVisitor} visitor An object with an `enter` and `exit` method. \n */\nfunction traverse(root, visitor) {\n\n /**\n * Recursively visits a node.\n * @param {Node} node The node to visit.\n * @param {Node} [parent] The parent of the node to visit.\n * @returns {void}\n */\n function visitNode(node, parent) {\n\n if (typeof visitor.enter === \"function\") {\n visitor.enter(node, parent);\n }\n\n for (const key of childKeys.get(node.type)) {\n const value = node[key];\n\n if (isObject(value)) {\n if (Array.isArray(value)) {\n value.forEach(child => visitNode(child, node));\n } else if (isNode(value)) {\n visitNode(value, node);\n }\n }\n }\n\n if (typeof visitor.exit === \"function\") {\n visitor.exit(node, parent);\n }\n }\n\n visitNode(root);\n}\n\n/**\n * @callback FilterPredicate\n * @param {{node: Node, parent?: Node, phase: TraversalPhase}} item\n * @param {number} index\n * @param {Array<{node: Node, parent?: Node, phase: TraversalPhase}>} array\n * @returns {boolean}\n */\n\n/**\n * Creates an iterator over the given AST.\n * @param {Node} root The root AST node to traverse. \n * @param {FilterPredicate} [filter] A filter function to determine which steps to\n * return;\n * @returns {IterableIterator<{node: Node, parent?: Node, phase: TraversalPhase}>} An iterator over the AST. \n */\nfunction iterator(root, filter = () => true) {\n\n /** @type {Array<{node: Node, parent?: Node, phase: TraversalPhase}>} */\n const traversal = [];\n\n traverse(root, {\n enter(node, parent) {\n traversal.push({ node, parent, phase: \"enter\" });\n },\n exit(node, parent) {\n traversal.push({ node, parent, phase: \"exit\" });\n }\n });\n\n return traversal.filter(filter).values();\n}\n\n/**\n * @fileoverview Evaluator for Momoa AST.\n * @author Nicholas C. Zakas\n */\n\n//-----------------------------------------------------------------------------\n// Typedefs\n//-----------------------------------------------------------------------------\n\n/** @typedef {import(\"./typedefs.js\").AnyNode} AnyNode */\n/** @typedef {import(\"./typedefs.js\").JSONValue} JSONValue */\n\n//-----------------------------------------------------------------------------\n// Exports\n//-----------------------------------------------------------------------------\n\n/**\n * Evaluates a Momoa AST node into a JavaScript value.\n * @param {AnyNode} node The node to interpet.\n * @returns {JSONValue} The JavaScript value for the node. \n */\nfunction evaluate(node) {\n switch (node.type) {\n case \"String\":\n return node.value;\n\n case \"Number\":\n return node.value;\n\n case \"Boolean\":\n return node.value;\n\n case \"Null\":\n return null;\n\n case \"NaN\":\n return NaN;\n \n case \"Infinity\":\n return node.sign === \"-\" ? -Infinity : Infinity;\n\n case \"Identifier\":\n return node.name;\n\n case \"Array\": {\n // const arrayNode = /** @type {ArrayNode} */ (node);\n return node.elements.map(element => evaluate(element.value));\n }\n\n case \"Object\": {\n\n /** @type {{[property: string]: JSONValue}} */\n const object = {};\n\n node.members.forEach(member => {\n object[/** @type {string} */ (evaluate(member.name))] = evaluate(member.value);\n }); \n\n return object;\n } \n\n case \"Document\": {\n return evaluate(node.body);\n }\n\n case \"Element\":\n throw new Error(\"Cannot evaluate array element outside of an array.\");\n\n case \"Member\":\n throw new Error(\"Cannot evaluate object member outside of an object.\");\n\n default:\n // @ts-ignore tsc doesn't know about the type property here?\n throw new Error(`Unknown node type ${ node.type }.`);\n }\n}\n\n/**\n * @fileoverview Printer for Momoa AST.\n * @author Nicholas C. Zakas\n */\n\n\n//-----------------------------------------------------------------------------\n// Typedefs\n//-----------------------------------------------------------------------------\n\n\n//-----------------------------------------------------------------------------\n// Helpers\n//-----------------------------------------------------------------------------\n\n/**\n * Prints the string representation of a Boolean node.\n * @param {BooleanNode} node The node to print.\n * @returns {string} The boolean value.\n */\nfunction printBoolean(node) {\n return node.value ? \"true\" : \"false\";\n}\n\n/**\n * Prints the string representation of a null node.\n * @returns {string} The string \"null\".\n */\nfunction printNull() {\n return \"null\";\n}\n\n/**\n * Prints the string representation of a number node.\n * @param {NumberNode} node The node to print.\n * @returns {string} The number value.\n */\nfunction printNumber(node) {\n return node.value.toString();\n}\n\n/**\n * Prints the string representation of a NaN node.\n * @returns {string} The string \"NaN\".\n */\nfunction printNaN() {\n return \"NaN\";\n}\n\n/**\n * Prints the string representation of an Infinity node.\n * @param {InfinityNode} node The node to print.\n * @returns {string} The string \"Infinity\" or \"-Infinity\".\n */\nfunction printInfinity(node) {\n return node.sign + \"Infinity\";\n}\n\n/**\n * Prints the string representation of a string node.\n * @param {StringNode} node The node to print.\n * @returns {string} The string value.\n */\nfunction printString(node) {\n\n let result = \"\\\"\";\n\n // escape all characters that need escaping\n for (const c of node.value) {\n\n const newChar = json5CharToEscape.get(c);\n\n if (newChar) {\n result += \"\\\\\" + newChar;\n continue;\n }\n\n // if it's a double quote, escape it\n if (c === \"\\\"\") {\n result += \"\\\\\\\"\";\n continue;\n }\n\n // if it's a control character, escape it\n if (c < \" \" || c === \"\\u007F\") {\n const hex = c.codePointAt(0).toString(16).toUpperCase();\n result += `\\\\u${\"0000\".substring(hex.length)}${hex}`;\n continue;\n }\n\n // otherwise, just add the character\n result += c;\n\n }\n \n return result + \"\\\"\";\n}\n\n/**\n * Prints the string representation of an identifier node.\n * @param {IdentifierNode} node The node to print.\n * @returns {string} The identifier name.\n */\nfunction printIdentifier(node) {\n return node.name;\n}\n\n/**\n * Prints the string representation of an array node.\n * @param {ArrayNode} node The node to print.\n * @param {string} indent The string to use for indentation.\n * @param {number} indentLevel The current level of indentation.\n * @returns {string} The array value.\n */\nfunction printArray(node, indent, indentLevel) {\n const newLine = indent ? \"\\n\" : \"\";\n const indentString = indent.repeat(indentLevel);\n const elementIndentString = indent.repeat(indentLevel + 1);\n\n return `[${newLine}${\n node.elements.map(element =>\n `${elementIndentString}${printValue(element.value, indent, indentLevel + 1)}`\n ).join(`,${newLine}`)\n }${newLine}${indentString}]`;\n}\n\n/**\n * Prints the string representation of a member node.\n * @param {MemberNode} node The node to print.\n * @param {string} indent The string to use for indentation.\n * @param {number} indentLevel The current level of indentation.\n * @returns {string} The member value.\n */\nfunction printMember(node, indent, indentLevel) {\n const space = indent ? \" \" : \"\";\n return `${printValue(node.name, indent, indentLevel)}:${space}${printValue(node.value, indent, indentLevel + 1)}`;\n}\n\n/**\n * Prints the string representation of an object node.\n * @param {ObjectNode} node The node to print.\n * @param {string} indent The string to use for indentation.\n * @param {number} indentLevel The current level of indentation.\n * @returns {string} The object value.\n */\nfunction printObject(node, indent, indentLevel) {\n const newLine = indent ? \"\\n\" : \"\";\n const indentString = indent.repeat(indentLevel);\n const memberIndentString = indent.repeat(indentLevel + 1);\n\n return `{${newLine}${\n node.members.map(member => \n `${memberIndentString}${printMember(member, indent, indentLevel)}`\n ).join(`,${newLine}`)\n }${newLine}${indentString}}`;\n}\n\n/**\n * Prints the string representation of a node.\n * @param {AnyNode} node The node to print.\n * @param {string} indentString The string to use for indentation.\n * @param {number} indentLevel The current level of indentation.\n * @returns {string} The string representation of the node.\n * @throws {TypeError} If the node type is unknown.\n\n */\nfunction printValue(node, indentString, indentLevel) {\n switch (node.type) {\n case \"String\":\n return printString(node);\n case \"Number\":\n return printNumber(node);\n case \"Boolean\":\n return printBoolean(node);\n case \"Null\":\n return printNull();\n case \"NaN\":\n return printNaN();\n case \"Infinity\":\n return printInfinity(node);\n case \"Identifier\":\n return printIdentifier(node);\n case \"Array\":\n return printArray(node, indentString, indentLevel);\n case \"Object\":\n return printObject(node, indentString, indentLevel);\n case \"Document\":\n return printValue(node.body, indentString, indentLevel);\n default:\n throw new TypeError(`Unknown node type: ${node.type}`);\n }\n}\n\n\n//-----------------------------------------------------------------------------\n// Exports\n//-----------------------------------------------------------------------------\n\n/**\n * Converts a Momoa AST back into a JSON string.\n * @param {AnyNode} node The node to print.\n * @param {Object} options Options for the print.\n * @param {number} [options.indent=0] The number of spaces to indent each line. If\n * greater than 0, then newlines and indents will be added to output. \n * @returns {string} The JSON representation of the AST.\n */\nfunction print(node, { indent = 0 } = {}) {\n\n const indentLevel = 0;\n const indentString = \" \".repeat(indent);\n\n return printValue(node, indentString, indentLevel);\n}\n\nexport { evaluate, iterator, parse, print, tokenize, traverse, types, childKeys as visitorKeys };\n", "/**\n * Finds JSON container depth without building an AST. Strings and escapes are\n * skipped so attacker-controlled brackets inside string values do not charge.\n */\nexport const MAX_SOURCE_PARSER_DEPTH = 512;\n\nexport function exceedsJsonDocumentDepth(text: string, maximum: number): boolean {\n let depth = 0;\n let sawValue = false;\n let inString = false;\n let escaped = false;\n\n for (let index = 0; index < text.length; index += 1) {\n const character = text[index];\n if (inString) {\n if (escaped) {\n escaped = false;\n } else if (character === '\\\\') {\n escaped = true;\n } else if (character === '\"') {\n inString = false;\n }\n continue;\n }\n if (character === '\"') {\n inString = true;\n sawValue = true;\n } else if (character === '{' || character === '[') {\n sawValue = true;\n depth += 1;\n if (depth > maximum) return true;\n } else if (character === '}' || character === ']') {\n depth -= 1;\n } else if (!/\\s/.test(character) && character !== ',' && character !== ':') {\n sawValue = true;\n }\n }\n return sawValue && maximum < 1;\n}\n", "export function toJsonPointer(segments: Array<string | number>): string {\n return `/${segments.map((segment) => escapeJsonPointerSegment(String(segment))).join('/')}`;\n}\n\nexport function escapeJsonPointerSegment(segment: string): string {\n return segment.replace(/~/g, '~0').replace(/\\//g, '~1');\n}\n", "import { sha256 } from '@noble/hashes/sha2.js';\nimport { bytesToHex } from '@noble/hashes/utils.js';\nimport type { SourceMemberRefV2 } from './source-types';\n\nconst encoder = new TextEncoder();\n\nexport type SourceSlot =\n | { readonly kind: 'ROOT' }\n | { readonly kind: 'ARRAY'; readonly index: number }\n | { readonly kind: 'MEMBER'; readonly nameLexeme: string; readonly occurrence: number };\n\nexport function encodeSourceTuple(parts: readonly string[]): string {\n return parts.map(encodeIdentityPart).join('');\n}\n\nfunction encodeIdentityPart(part: string): string {\n if (!containsLoneSurrogate(part)) {\n const tagged = `N${encoder.encode(part).byteLength}:${part}`;\n return `${encoder.encode(tagged).byteLength}:${tagged}`;\n }\n let codeUnits = '';\n for (let index = 0; index < part.length; index += 1) codeUnits += part.charCodeAt(index).toString(16).padStart(4, '0');\n const tagged = `C${part.length}:${codeUnits}`;\n return `${encoder.encode(tagged).byteLength}:${tagged}`;\n}\n\nfunction containsLoneSurrogate(value: string): boolean {\n for (let index = 0; index < value.length; index += 1) {\n const code = value.charCodeAt(index);\n if (code >= 0xd800 && code <= 0xdbff) {\n const next = value.charCodeAt(index + 1);\n if (!(next >= 0xdc00 && next <= 0xdfff)) return true;\n index += 1;\n } else if (code >= 0xdc00 && code <= 0xdfff) return true;\n }\n return false;\n}\n\nexport function encodeSourceSlot(slot: SourceSlot): string {\n if (slot.kind === 'ROOT') return 'ROOT';\n if (slot.kind === 'ARRAY') return encodeSourceTuple(['ARRAY', String(slot.index)]);\n return encodeSourceTuple(['MEMBER', slot.nameLexeme, String(slot.occurrence)]);\n}\n\nexport function createSourceAstNodeId(input: {\n readonly occurrencePath: readonly number[];\n readonly slot: string;\n readonly kind: string;\n readonly payload: string;\n}): string {\n const path = encodeSourceTuple(input.occurrencePath.map(String));\n return bytesToHex(sha256(encoder.encode(encodeSourceTuple([\n 'secureflow-source-member-v2', path, input.slot, input.kind, input.payload,\n ]))));\n}\n\nexport function createSourceMemberRef(input: {\n readonly pointer: string;\n readonly occurrencePath: readonly number[];\n readonly slot: SourceSlot;\n readonly kind: string;\n readonly payload: string;\n readonly span: SourceMemberRefV2['span'];\n readonly astNodeId?: string;\n readonly reuseOccurrencePath?: boolean;\n}): SourceMemberRefV2 {\n const occurrencePath = input.reuseOccurrencePath\n ? Object.freeze(input.occurrencePath)\n : Object.freeze([...input.occurrencePath]);\n return Object.freeze({\n pointer: input.pointer,\n occurrencePath,\n astNodeId: input.astNodeId ?? createSourceAstNodeId({\n occurrencePath, slot: encodeSourceSlot(input.slot), kind: input.kind, payload: input.payload,\n }),\n span: input.span,\n });\n}\n", "import type { IdentifierNode, StringNode, ValueNode } from '@humanwhocodes/momoa';\nimport type { SourceMemberRefV2, SourceParseResult, SourceValueV2 } from './source-types';\n\nexport function memberName(node: StringNode | IdentifierNode): string {\n return node.type === 'String' ? node.value : node.name;\n}\n\nexport function sourceKind(node: ValueNode): SourceValueV2['kind'] {\n return node.type === 'Null' ? 'NULL' : node.type.toUpperCase() as SourceValueV2['kind'];\n}\n\nexport function scalarValue(node: ValueNode): string | number | boolean | null {\n if (node.type === 'Null') return null;\n if (node.type === 'Number') {\n if (!Number.isFinite(node.value)) throw new TypeError('Non-finite JSON number');\n return node.value;\n }\n if (node.type === 'String' || node.type === 'Boolean') return node.value;\n throw new TypeError('Unexpected non-JSON scalar');\n}\n\nexport function syntaxContribution(node: ValueNode): number {\n if (node.type === 'Object') return 1 + (node.members.length * 2);\n if (node.type === 'Array') return 1 + node.elements.length;\n return 1;\n}\n\nexport function countDuplicates(names: readonly string[]): number {\n const seen = new Set<string>();\n let count = 0;\n for (const name of names) seen.has(name) ? count += 1 : seen.add(name);\n return count;\n}\n\nexport function sliceNode(text: string, node: { range?: [number, number] }): string {\n if (!node.range) throw new TypeError('Source range missing');\n return text.slice(node.range[0], node.range[1]);\n}\n\nexport function createUtf8OffsetMap(text: string): Uint32Array {\n const offsets = new Uint32Array(text.length + 1);\n let bytes = 0;\n for (let index = 0; index < text.length;) {\n offsets[index] = bytes;\n const codePoint = text.codePointAt(index) ?? 0;\n const width = codePoint > 0xffff ? 2 : 1;\n if (width === 2) offsets[index + 1] = bytes;\n bytes += codePoint <= 0x7f ? 1 : codePoint <= 0x7ff ? 2 : codePoint <= 0xffff ? 3 : 4;\n index += width;\n offsets[index] = bytes;\n }\n return offsets;\n}\n\nexport function sourceSpan(\n node: ValueNode,\n byteOffsets: Uint32Array,\n): SourceMemberRefV2['span'] {\n if (!node.range) throw new TypeError('Source range missing');\n const [start, end] = node.range;\n return Object.freeze({\n start: Object.freeze({\n line: node.loc.start.line,\n column: node.loc.start.column,\n utf16Offset: start,\n utf8ByteOffset: byteOffsets[start],\n }),\n end: Object.freeze({\n line: node.loc.end.line,\n column: node.loc.end.column,\n utf16Offset: end,\n utf8ByteOffset: byteOffsets[end],\n }),\n });\n}\n\nexport function complex(\n cause: 'SYNTAX_NODE_LIMIT' | 'DOCUMENT_DEPTH_LIMIT' | 'MEMBER_ELEMENT_LIMIT' | 'DUPLICATE_KEY_LIMIT' | 'SOURCE_WORK_LIMIT',\n): SourceParseResult {\n return {\n ok: false,\n code: 'WORKFLOW_TOO_COMPLEX',\n cause,\n message: 'Workflow bytes exceed the configured source complexity limit.',\n };\n}\n", "import type { ValueNode } from '@humanwhocodes/momoa';\nimport type { ScannerLimitsV2 } from '@hub/contracts';\nimport { escapeJsonPointerSegment } from '../json-pointer';\nimport {\n createSourceAstNodeId,\n createSourceMemberRef,\n encodeSourceSlot,\n encodeSourceTuple,\n type SourceSlot,\n} from './source-identities';\nimport {\n complex,\n countDuplicates,\n createUtf8OffsetMap,\n memberName,\n scalarValue,\n sliceNode,\n sourceKind,\n sourceSpan,\n syntaxContribution,\n} from './source-tree-helpers';\nimport type {\n SourceMemberRefV2,\n SourceParseResult,\n SourceSpanUsageV2,\n SourceValueV2,\n} from './source-types';\n\nexport type NodeContext = {\n node: ValueNode;\n pointer: string;\n occurrencePath: readonly number[];\n slot: SourceSlot;\n depth: number;\n};\n\nexport type SourceAnalysis = {\n contexts: NodeContext[];\n duplicateCount: number;\n syntaxNodeCount: number;\n sourceWorkUnits: number;\n};\n\ntype NodeIdentity = { astNodeId: string; payload: string };\n\nexport function analyzeSource(\n root: ValueNode,\n text: string,\n limits: ScannerLimitsV2,\n): SourceAnalysis | SourceParseResult {\n const contexts: NodeContext[] = [];\n const pending: NodeContext[] = [{\n node: root, pointer: '', occurrencePath: [], slot: { kind: 'ROOT' }, depth: 1,\n }];\n let duplicateCount = 0;\n let syntaxNodeCount = 1;\n let membersAndElements = 0;\n let sourceWorkUnits = 0;\n\n while (pending.length > 0) {\n const context = pending.pop()!;\n if (context.depth > limits.maxDocumentDepth) return complex('DOCUMENT_DEPTH_LIMIT');\n contexts.push(context);\n syntaxNodeCount += syntaxContribution(context.node);\n if (syntaxNodeCount > limits.maxSyntaxNodes) return complex('SYNTAX_NODE_LIMIT');\n\n const childCount = directChildCount(context.node);\n membersAndElements += childCount;\n if (membersAndElements > limits.maxMembersAndElements) return complex('MEMBER_ELEMENT_LIMIT');\n if (context.node.type === 'Object') {\n duplicateCount += countDuplicates(context.node.members.map((member) => memberName(member.name)));\n if (duplicateCount > limits.maxDuplicateKeys) return complex('DUPLICATE_KEY_LIMIT');\n }\n if (contexts.length === 1) {\n if (context.depth > limits.maxSourceWork) return complex('SOURCE_WORK_LIMIT');\n sourceWorkUnits += context.depth;\n }\n const childDepth = context.depth + 1;\n const childWorkUnits = childCount * childDepth;\n if (sourceWorkUnits > limits.maxSourceWork - childWorkUnits) return complex('SOURCE_WORK_LIMIT');\n sourceWorkUnits += childWorkUnits;\n const children = childContexts(context, text);\n for (let index = children.length - 1; index >= 0; index -= 1) pending.push(children[index]);\n }\n return { contexts, duplicateCount, syntaxNodeCount, sourceWorkUnits };\n}\n\nfunction directChildCount(node: ValueNode): number {\n if (node.type === 'Array') return node.elements.length;\n if (node.type === 'Object') return node.members.length;\n return 0;\n}\n\nexport function buildSourceTree(\n contexts: NodeContext[],\n text: string,\n spanLimit: number,\n): Readonly<{ value: SourceValueV2; usage: SourceSpanUsageV2 }> {\n const identities = new WeakMap<ValueNode, NodeIdentity>();\n for (let index = contexts.length - 1; index >= 0; index -= 1) {\n const context = contexts[index];\n const payload = sourcePayload(context.node, text, identities);\n const astNodeId = createSourceAstNodeId({\n occurrencePath: context.occurrencePath,\n slot: encodeSourceSlot(context.slot),\n kind: sourceKind(context.node),\n payload,\n });\n identities.set(context.node, { astNodeId, payload });\n }\n const retained = new Set(contexts.slice(0, spanLimit).map((context) => context.node));\n const values = new WeakMap<ValueNode, SourceValueV2>();\n const byteOffsets = createUtf8OffsetMap(text);\n for (let index = contexts.length - 1; index >= 0; index -= 1) {\n const context = contexts[index];\n const identity = identities.get(context.node)!;\n const ref = createSourceMemberRef({\n pointer: context.pointer,\n occurrencePath: context.occurrencePath,\n slot: context.slot,\n kind: sourceKind(context.node),\n payload: identity.payload,\n astNodeId: identity.astNodeId,\n reuseOccurrencePath: true,\n span: retained.has(context.node) ? sourceSpan(context.node, byteOffsets) : null,\n });\n values.set(context.node, materializeValue(context.node, text, ref, values));\n }\n return Object.freeze({\n value: values.get(contexts[0].node)!,\n usage: Object.freeze({ examined: contexts.length, omitted: contexts.length - retained.size }),\n });\n}\n\nfunction childContexts(parent: NodeContext, text: string): NodeContext[] {\n if (parent.node.type === 'Array') return parent.node.elements.map((element, index) => ({\n node: element.value,\n pointer: `${parent.pointer}/${index}`,\n occurrencePath: [...parent.occurrencePath, index],\n slot: { kind: 'ARRAY', index },\n depth: parent.depth + 1,\n }));\n if (parent.node.type !== 'Object') return [];\n const seen = new Map<string, number>();\n return parent.node.members.map((member, index) => {\n const name = memberName(member.name);\n const occurrence = seen.get(name) ?? 0;\n seen.set(name, occurrence + 1);\n return {\n node: member.value,\n pointer: `${parent.pointer}/${escapeJsonPointerSegment(name)}`,\n occurrencePath: [...parent.occurrencePath, index],\n slot: { kind: 'MEMBER', nameLexeme: sliceNode(text, member.name), occurrence },\n depth: parent.depth + 1,\n };\n });\n}\n\nfunction materializeValue(\n node: ValueNode,\n text: string,\n ref: SourceMemberRefV2,\n values: WeakMap<ValueNode, SourceValueV2>,\n): SourceValueV2 {\n if (node.type === 'Array') return Object.freeze({\n kind: 'ARRAY',\n ref,\n items: Object.freeze(node.elements.map((element) => values.get(element.value)!)),\n });\n if (node.type === 'Object') {\n const seen = new Map<string, number>();\n const members = node.members.map((member) => {\n const name = memberName(member.name);\n const occurrence = seen.get(name) ?? 0;\n seen.set(name, occurrence + 1);\n const value = values.get(member.value)!;\n return Object.freeze({\n nameLexeme: sliceNode(text, member.name),\n name,\n occurrence,\n ref: value.ref,\n value,\n });\n });\n return Object.freeze({ kind: 'OBJECT', ref, members: Object.freeze(members) });\n }\n return Object.freeze({\n kind: sourceKind(node),\n lexeme: sliceNode(text, node),\n value: scalarValue(node),\n ref,\n }) as SourceValueV2;\n}\n\nfunction sourcePayload(node: ValueNode, text: string, identities: WeakMap<ValueNode, NodeIdentity>): string {\n if (node.type === 'Array') {\n return encodeSourceTuple(node.elements.map((element) => identities.get(element.value)!.astNodeId));\n }\n if (node.type === 'Object') {\n return encodeSourceTuple(node.members.map((member) => identities.get(member.value)!.astNodeId));\n }\n return sliceNode(text, node);\n}\n", "import {\n DEFAULT_SCANNER_LIMITS_V2,\n validateScannerLimitsV2,\n type ScannerLimitsV2,\n} from '@hub/contracts';\n\nconst LIMIT_FIELDS = Object.freeze(Object.getOwnPropertyNames(DEFAULT_SCANNER_LIMITS_V2));\n\nexport function resolveScannerLimits(partial: unknown): ScannerLimitsV2 | undefined {\n try {\n if (partial === undefined) return DEFAULT_SCANNER_LIMITS_V2;\n if (!plainDataRecord(partial)) return undefined;\n const candidate = Object.create(null) as Record<string, unknown>;\n for (const field of LIMIT_FIELDS) candidate[field] = DEFAULT_SCANNER_LIMITS_V2[field as keyof ScannerLimitsV2];\n for (const field of Object.getOwnPropertyNames(partial)) {\n if (!LIMIT_FIELDS.includes(field)) return undefined;\n const descriptor = Object.getOwnPropertyDescriptor(partial, field);\n if (!descriptor || !Object.prototype.hasOwnProperty.call(descriptor, 'value')) return undefined;\n candidate[field] = descriptor.value;\n }\n if (Object.getOwnPropertySymbols(partial).length > 0) return undefined;\n const result = validateScannerLimitsV2(candidate);\n return result.ok ? result.limits : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction plainDataRecord(value: unknown): value is object {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false;\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) return false;\n if (Object.getOwnPropertySymbols(value).length > 0) return false;\n for (const field of Object.getOwnPropertyNames(value)) {\n const descriptor = Object.getOwnPropertyDescriptor(value, field);\n if (!descriptor || !Object.prototype.hasOwnProperty.call(descriptor, 'value')) return false;\n }\n return true;\n}\n", "import type { ReadonlySourceDocumentV2 } from './source-types';\n\nconst parserDocuments = new WeakSet<object>();\n\nexport function markParsedSourceDocument(document: ReadonlySourceDocumentV2): void {\n parserDocuments.add(document as object);\n}\n\nexport function isParsedSourceDocument(value: unknown): value is ReadonlySourceDocumentV2 {\n return typeof value === 'object' && value !== null && parserDocuments.has(value);\n}\n", "import { parse, type ValueNode } from '@humanwhocodes/momoa';\nimport { sha256 } from '@noble/hashes/sha2.js';\nimport { bytesToHex } from '@noble/hashes/utils.js';\nimport type { ScannerLimitsV2 } from '@hub/contracts';\nimport { exceedsJsonDocumentDepth, MAX_SOURCE_PARSER_DEPTH } from './source-preflight';\nimport { analyzeSource, buildSourceTree } from './source-tree';\nimport { resolveScannerLimits } from './scanner-limit-resolution';\nimport { markParsedSourceDocument } from './source-document-provenance';\nimport type { SourceParseResult } from './source-types';\n\nconst INVALID_JSON = Object.freeze({\n ok: false,\n code: 'INVALID_JSON',\n message: 'Workflow bytes are not valid JSON.',\n} as const);\n\nexport function parseSourceDocument(bytes: Uint8Array, partialLimits?: Partial<ScannerLimitsV2>): SourceParseResult {\n try {\n if (!(bytes instanceof Uint8Array)) return INVALID_JSON;\n const limits = resolveScannerLimits(partialLimits);\n if (!limits) return INVALID_JSON;\n return parseSourceDocumentWithLimits(bytes, limits);\n } catch {\n return INVALID_JSON;\n }\n}\n\nfunction parseSourceDocumentWithLimits(bytes: Uint8Array, limits: ScannerLimitsV2): SourceParseResult {\n if (bytes.length > limits.maxBytes) {\n return {\n ok: false,\n code: 'WORKFLOW_TOO_LARGE',\n message: 'Workflow bytes exceed the configured payload limit.',\n };\n }\n const hasBom = bytes.length >= 3 && bytes[0] === 0xef && bytes[1] === 0xbb && bytes[2] === 0xbf;\n const payload = hasBom ? bytes.subarray(3) : bytes;\n let text: string;\n try {\n text = new TextDecoder('utf-8', { fatal: true, ignoreBOM: true }).decode(payload);\n } catch {\n return {\n ok: false,\n code: 'UTF8_DECODING_FAILED',\n message: 'Workflow bytes are not valid UTF-8.',\n };\n }\n const effectiveDepth = Math.min(limits.maxDocumentDepth, MAX_SOURCE_PARSER_DEPTH);\n if (exceedsJsonDocumentDepth(text, effectiveDepth)) {\n return {\n ok: false,\n code: 'WORKFLOW_TOO_COMPLEX',\n cause: 'DOCUMENT_DEPTH_LIMIT',\n message: 'Workflow bytes exceed the configured source complexity limit.',\n };\n }\n\n let root: ValueNode;\n try {\n root = parse(text, { mode: 'json', ranges: true }).body;\n } catch {\n return INVALID_JSON;\n }\n let analysis: ReturnType<typeof analyzeSource>;\n try {\n analysis = analyzeSource(root, text, limits);\n } catch {\n return INVALID_JSON;\n }\n if ('ok' in analysis) return analysis;\n\n try {\n const tree = buildSourceTree(analysis.contexts, text, limits.maxStoredSourceSpans);\n const document = Object.freeze({\n rawSha256: bytesToHex(sha256(bytes)),\n utf8Bytes: bytes.length,\n bom: hasBom ? 'UTF8' : 'NONE',\n root: tree.value,\n duplicateCount: analysis.duplicateCount,\n syntaxNodeCount: analysis.syntaxNodeCount,\n });\n markParsedSourceDocument(document);\n return {\n ok: true,\n document,\n sourceWorkUnits: analysis.sourceWorkUnits,\n sourceSpanUsage: tree.usage,\n };\n } catch {\n return INVALID_JSON;\n }\n}\n", "import { sha256 } from '@noble/hashes/sha2.js';\nimport { bytesToHex } from '@noble/hashes/utils.js';\nimport type { SourceMemberRefV2 } from '../source/source-types';\nimport type { EdgeRefV2, NodeRefV2 } from './security-workflow';\n\nconst encoder = new TextEncoder();\n\n/** The tuple format is deliberately byte-length-prefixed and locale independent. */\nexport function encodeIdentityTuple(parts: readonly string[]): string {\n return parts.map(encodeIdentityPart).join('');\n}\n\nfunction encodeIdentityPart(part: string): string {\n if (!containsLoneSurrogate(part)) {\n const tagged = `N${encoder.encode(part).byteLength}:${part}`;\n return `${encoder.encode(tagged).byteLength}:${tagged}`;\n }\n let codeUnits = '';\n for (let index = 0; index < part.length; index += 1) codeUnits += part.charCodeAt(index).toString(16).padStart(4, '0');\n const tagged = `C${part.length}:${codeUnits}`;\n return `${encoder.encode(tagged).byteLength}:${tagged}`;\n}\n\nfunction containsLoneSurrogate(value: string): boolean {\n for (let index = 0; index < value.length; index += 1) {\n const code = value.charCodeAt(index);\n if (code >= 0xd800 && code <= 0xdbff) {\n const next = value.charCodeAt(index + 1);\n if (!(next >= 0xdc00 && next <= 0xdfff)) return true;\n index += 1;\n } else if (code >= 0xdc00 && code <= 0xdfff) return true;\n }\n return false;\n}\n\nexport function createNodeIdentityDigest(ordinal: number, source: SourceMemberRefV2): string {\n if (!Number.isSafeInteger(ordinal) || ordinal < 0) throw new TypeError('Invalid node ordinal');\n return digest(['secureflow-node-ref-v2', String(ordinal), source.astNodeId]);\n}\n\nexport function createNodeRef(input: {\n ordinal: number;\n source: SourceMemberRefV2;\n explicitId?: unknown;\n name?: unknown;\n}): NodeRefV2 {\n const ref: NodeRefV2 = {\n ordinal: input.ordinal,\n source: input.source,\n ...(typeof input.explicitId === 'string' ? { explicitId: input.explicitId } : {}),\n ...(typeof input.name === 'string' ? { name: input.name } : {}),\n identityDigest: createNodeIdentityDigest(input.ordinal, input.source),\n };\n return Object.freeze(ref);\n}\n\nexport function createEdgeIdentityDigest(edge: Pick<\n EdgeRefV2,\n 'ordinal' | 'sourceNode' | 'sourceLabel' | 'targetNode' | 'targetLabel' | 'connectionType' | 'sourcePort' | 'targetPort' | 'source' | 'resolution'\n>): string {\n return digest([\n 'secureflow-edge-ref-v2',\n unsigned(edge.ordinal),\n edge.sourceNode?.identityDigest ?? 'NONE',\n edge.sourceLabel,\n edge.targetNode?.identityDigest ?? 'NONE',\n edge.targetLabel ?? 'NONE',\n edge.connectionType,\n unsigned(edge.sourcePort),\n unsigned(edge.targetPort),\n edge.source.astNodeId,\n edge.resolution,\n ]);\n}\n\nfunction unsigned(value: number): string {\n if (!Number.isSafeInteger(value) || value < 0) throw new TypeError('Invalid identity ordinal');\n return String(value);\n}\n\nfunction digest(parts: readonly string[]): string {\n return bytesToHex(sha256(encoder.encode(encodeIdentityTuple(parts))));\n}\n", "import { sha256 } from '@noble/hashes/sha2.js';\nimport { bytesToHex } from '@noble/hashes/utils.js';\nimport type { SourceMemberRefV2 } from '../source/source-types';\nimport { encodeIdentityTuple } from './node-edge-identity';\nimport type {\n NormalizationAmbiguityKind,\n NormalizationAmbiguityV2,\n NormalizationResolution,\n NormalizationSecurityImpact,\n} from './security-workflow';\n\nconst encoder = new TextEncoder();\nconst KIND_ORDER: Record<NormalizationAmbiguityKind, number> = {\n DUPLICATE_MEMBER: 0,\n AMBIGUOUS_NODE: 1,\n AMBIGUOUS_EDGE: 2,\n UNRESOLVED_EDGE: 3,\n MALFORMED_SECURITY_VALUE: 4,\n};\n\nexport function createAmbiguity(input: {\n kind: NormalizationAmbiguityKind;\n subject: SourceMemberRefV2;\n related?: readonly SourceMemberRefV2[];\n securityImpact: NormalizationSecurityImpact;\n resolution: NormalizationResolution;\n}): NormalizationAmbiguityV2 {\n const related = [...(input.related ?? [])].sort(compareRefs);\n const ambiguityId = bytesToHex(sha256(encoder.encode(encodeIdentityTuple([\n 'secureflow-normalization-ambiguity-v2',\n input.kind,\n input.subject.astNodeId,\n ...related.map((ref) => ref.astNodeId),\n input.securityImpact,\n input.resolution,\n ]))));\n return Object.freeze({\n ambiguityId,\n kind: input.kind,\n subject: input.subject,\n related: Object.freeze(related),\n securityImpact: input.securityImpact,\n resolution: input.resolution,\n });\n}\n\nexport function sortAmbiguities(items: readonly NormalizationAmbiguityV2[]): NormalizationAmbiguityV2[] {\n return [...items].sort((left, right) => {\n const occurrence = comparePath(left.subject.occurrencePath, right.subject.occurrencePath);\n if (occurrence !== 0) return occurrence;\n const kind = KIND_ORDER[left.kind] - KIND_ORDER[right.kind];\n if (kind !== 0) return kind;\n const related = compareStrings(left.related.map((ref) => ref.astNodeId).join('\\u0000'), right.related.map((ref) => ref.astNodeId).join('\\u0000'));\n if (related !== 0) return related;\n return compareStrings(left.ambiguityId, right.ambiguityId);\n });\n}\n\nfunction compareRefs(left: SourceMemberRefV2, right: SourceMemberRefV2): number {\n const ids = compareStrings(left.astNodeId, right.astNodeId);\n return ids === 0 ? comparePath(left.occurrencePath, right.occurrencePath) : ids;\n}\n\nfunction comparePath(left: readonly number[], right: readonly number[]): number {\n const length = Math.min(left.length, right.length);\n for (let index = 0; index < length; index += 1) {\n if (left[index] !== right[index]) return left[index] < right[index] ? -1 : 1;\n }\n return left.length - right.length;\n}\n\nfunction compareStrings(left: string, right: string): number {\n return left === right ? 0 : left < right ? -1 : 1;\n}\n", "import type { ReadonlySourceDocumentV2, SourceMemberRefV2, SourceValueV2 } from '../source/source-types';\nimport { createAmbiguity } from './ambiguity';\nimport type { NormalizationAmbiguityV2, NormalizationSecurityImpact } from './security-workflow';\n\ntype Region = 'ROOT' | 'NODES' | 'NODE' | 'PARAMETERS' | 'CREDENTIALS' | 'SETTINGS' | 'CONNECTIONS' | 'METADATA';\n\nexport function collectDuplicateAmbiguities(source: ReadonlySourceDocumentV2): NormalizationAmbiguityV2[] {\n const ambiguities: NormalizationAmbiguityV2[] = [];\n visit(source.root, 'ROOT', ambiguities);\n return ambiguities;\n}\n\nexport function hasDuplicateMembers(value: SourceValueV2, visitBudget: number): boolean {\n const pending: SourceValueV2[] = [value];\n let visited = 0;\n while (pending.length > 0) {\n const current = pending.pop()!;\n visited += 1;\n if (visited > visitBudget) return true;\n if (current.kind === 'ARRAY') {\n for (const item of current.items) pending.push(item);\n continue;\n }\n if (current.kind !== 'OBJECT') continue;\n const names = new Set<string>();\n for (const member of current.members) {\n if (names.has(member.name)) return true;\n names.add(member.name);\n pending.push(member.value);\n }\n }\n return false;\n}\n\nfunction visit(value: SourceValueV2, region: Region, ambiguities: NormalizationAmbiguityV2[]): void {\n if (value.kind === 'ARRAY') {\n for (const item of value.items) visit(item, region === 'NODES' ? 'NODE' : region, ambiguities);\n return;\n }\n if (value.kind !== 'OBJECT') return;\n\n const byName = new Map<string, SourceMemberRefV2[]>();\n for (const member of value.members) {\n const refs = byName.get(member.name) ?? [];\n refs.push(member.ref);\n byName.set(member.name, refs);\n }\n for (const [name, refs] of byName) {\n if (refs.length < 2) continue;\n const memberRegion = childRegion(name, region);\n ambiguities.push(createAmbiguity({\n kind: 'DUPLICATE_MEMBER',\n subject: refs[0],\n related: refs.slice(1),\n securityImpact: duplicateImpact(name, memberRegion, region),\n resolution: 'RETAINED_ALL',\n }));\n }\n for (const member of value.members) visit(member.value, childRegion(member.name, region), ambiguities);\n}\n\nfunction childRegion(name: string, parent: Region): Region {\n const normalized = name.toLowerCase();\n if (parent === 'ROOT' && normalized === 'nodes') return 'NODES';\n if (parent === 'ROOT' && normalized === 'connections') return 'CONNECTIONS';\n if (parent === 'NODE' && normalized === 'parameters') return 'PARAMETERS';\n if (parent === 'NODE' && (normalized === 'credentials' || normalized.includes('credential'))) return 'CREDENTIALS';\n if (parent === 'NODE' && normalized === 'settings') return 'SETTINGS';\n if (parent === 'PARAMETERS' || parent === 'CREDENTIALS' || parent === 'SETTINGS' || parent === 'CONNECTIONS') return parent;\n if (parent === 'NODES') return 'NODE';\n return parent === 'ROOT' ? 'METADATA' : parent;\n}\n\nfunction duplicateImpact(name: string, memberRegion: Region, parent: Region): NormalizationSecurityImpact {\n const normalized = name.toLowerCase();\n if (memberRegion === 'NODES' || memberRegion === 'CONNECTIONS' ||\n (parent === 'NODE' && ['id', 'name'].includes(normalized))) return 'GRAPH_IDENTITY';\n if (memberRegion === 'PARAMETERS' || memberRegion === 'CREDENTIALS' || memberRegion === 'SETTINGS' ||\n ['active', 'disabled', 'type', 'typeversion', 'retryonfail', 'maxtries', 'waitbetweentries', 'onerror',\n 'pindata', 'staticdata', 'trigger', 'tags', 'meta', 'credentials', 'settings', 'parameters'].includes(normalized)) {\n return 'SCORING_INPUT';\n }\n return 'METADATA_ONLY';\n}\n", "import type { ScannerLimitsV2 } from '@hub/contracts';\nimport type { SourceMemberRefV2, SourceValueV2 } from '../source/source-types';\nimport { createAmbiguity } from './ambiguity';\nimport type { EdgeRefV2, NodeRefV2, NormalizationAmbiguityV2 } from './security-workflow';\n\ntype EdgeCollection = {\n edges: EdgeRefV2[];\n ambiguities: NormalizationAmbiguityV2[];\n rawEdgesExamined: number;\n connectionDepth: number;\n error?: 'RAW_EDGE_LIMIT' | 'EDGE_LIMIT' | 'CONNECTION_DEPTH_LIMIT';\n};\n\ntype ParsedCandidate = {\n target: string;\n targetPort: number;\n duplicateNode?: SourceMemberRefV2[];\n duplicateIndex?: SourceMemberRefV2[];\n};\n\nexport function normalizeEdges(\n connections: SourceValueV2,\n nodes: readonly NodeRefV2[],\n labels: ReadonlyMap<string, readonly NodeRefV2[]>,\n limits: ScannerLimitsV2,\n edgeOrdinalOffset = 0,\n rawEdgeOffset = 0,\n relatedRefsBudget: { used: number } = { used: 0 },\n): EdgeCollection {\n const result: EdgeCollection = { edges: [], ambiguities: [], rawEdgesExamined: rawEdgeOffset, connectionDepth: 0 };\n if (connections.kind !== 'OBJECT') return result;\n result.connectionDepth = connectionContainerDepth(connections);\n if (result.connectionDepth > limits.maxConnectionDepth) return depthLimit(result);\n\n for (const sourceMember of connections.members) {\n result.connectionDepth = Math.max(result.connectionDepth, 1);\n if (result.connectionDepth > limits.maxConnectionDepth) return depthLimit(result);\n if (sourceMember.value.kind !== 'OBJECT') continue;\n for (const typeMember of sourceMember.value.members) {\n result.connectionDepth = Math.max(result.connectionDepth, 2);\n if (result.connectionDepth > limits.maxConnectionDepth) return depthLimit(result);\n if (typeMember.value.kind !== 'ARRAY') continue;\n for (const [sourcePort, targets] of typeMember.value.items.entries()) {\n result.connectionDepth = Math.max(result.connectionDepth, 3);\n if (result.connectionDepth > limits.maxConnectionDepth) return depthLimit(result);\n if (targets.kind !== 'ARRAY') continue;\n for (const candidate of targets.items) {\n result.connectionDepth = Math.max(result.connectionDepth, 4);\n if (result.connectionDepth > limits.maxConnectionDepth) return depthLimit(result);\n result.rawEdgesExamined += 1;\n if (result.rawEdgesExamined > limits.maxRawEdges) {\n result.error = 'RAW_EDGE_LIMIT';\n return result;\n }\n const parsed = parseCandidate(candidate);\n if (!parsed) continue;\n const sourceMatches = labels.get(sourceMember.name) ?? [];\n const targetMatches = labels.get(parsed.target) ?? [];\n const duplicateSecurity = parsed.duplicateNode !== undefined || parsed.duplicateIndex !== undefined;\n const sourceNode = sourceMatches.length === 1 ? sourceMatches[0] : undefined;\n const targetNode = duplicateSecurity || targetMatches.length !== 1 ? undefined : targetMatches[0];\n const resolution: EdgeRefV2['resolution'] = duplicateSecurity || sourceMatches.length === 0 || targetMatches.length === 0\n ? 'UNRESOLVED' : sourceMatches.length > 1 || targetMatches.length > 1 ? 'AMBIGUOUS' : 'RESOLVED';\n if (edgeOrdinalOffset + result.edges.length >= limits.maxEdges) {\n result.error = 'EDGE_LIMIT';\n return result;\n }\n const edge: EdgeRefV2 = Object.freeze({\n ordinal: edgeOrdinalOffset + result.edges.length,\n ...(sourceNode ? { sourceNode } : {}),\n sourceLabel: sourceMember.name,\n ...(targetNode ? { targetNode } : {}),\n targetLabel: parsed.target,\n connectionType: typeMember.name,\n sourcePort,\n targetPort: parsed.targetPort,\n source: candidate.ref,\n resolution,\n });\n result.edges.push(edge);\n if (duplicateSecurity) {\n for (const refs of [parsed.duplicateNode, parsed.duplicateIndex]) if (refs) result.ambiguities.push(createAmbiguity({\n kind: 'MALFORMED_SECURITY_VALUE', subject: refs[0], related: refs.slice(1), securityImpact: 'GRAPH_IDENTITY', resolution: 'EXCLUDED_FROM_SCORING',\n }));\n }\n if (resolution === 'AMBIGUOUS') result.ambiguities.push(createAmbiguity({\n kind: 'AMBIGUOUS_EDGE',\n subject: candidate.ref,\n related: takeRelatedNodes(undefined, sourceMatches, targetMatches, relatedRefsBudget, limits.maxDiagnostics),\n securityImpact: 'GRAPH_IDENTITY',\n resolution: 'RETAINED_ALL',\n }));\n if (resolution === 'UNRESOLVED') result.ambiguities.push(createAmbiguity({\n kind: 'UNRESOLVED_EDGE',\n subject: candidate.ref,\n related: takeRelatedNodes(sourceNode ? undefined : sourceMember.ref, sourceNode ? [sourceNode] : [], [], relatedRefsBudget, limits.maxDiagnostics),\n securityImpact: 'GRAPH_IDENTITY',\n resolution: 'UNRESOLVED',\n }));\n }\n }\n }\n }\n return result;\n}\n\nfunction takeRelatedNodes(primary: SourceMemberRefV2 | undefined, sourceNodes: readonly NodeRefV2[], targetNodes: readonly NodeRefV2[], budget: { used: number }, maximum: number): SourceMemberRefV2[] {\n const remaining = Math.max(0, maximum - budget.used);\n const retained: SourceMemberRefV2[] = [];\n if (primary && retained.length < remaining) retained.push(primary);\n for (const node of sourceNodes) {\n if (retained.length >= remaining) break;\n retained.push(node.source);\n }\n for (const node of targetNodes) {\n if (retained.length >= remaining) break;\n retained.push(node.source);\n }\n budget.used += retained.length;\n return retained;\n}\n\nfunction connectionContainerDepth(value: SourceValueV2): number {\n const pending: Array<{ value: SourceValueV2; depth: number }> = [{ value, depth: 0 }];\n let maximum = 0;\n while (pending.length > 0) {\n const current = pending.pop()!;\n if (current.value.kind !== 'OBJECT' && current.value.kind !== 'ARRAY') continue;\n maximum = Math.max(maximum, current.depth);\n if (current.value.kind === 'OBJECT') {\n for (const member of current.value.members) pending.push({ value: member.value, depth: current.depth + 1 });\n } else {\n for (const item of current.value.items) pending.push({ value: item, depth: current.depth + 1 });\n }\n }\n return maximum;\n}\n\nfunction parseCandidate(value: SourceValueV2): ParsedCandidate | undefined {\n if (value.kind !== 'OBJECT') return undefined;\n const nodeMembers = value.members.filter((member) => member.name === 'node');\n const indexMembers = value.members.filter((member) => member.name === 'index');\n const validTargets = nodeMembers.filter((member) => member.value.kind === 'STRING');\n if (validTargets.length === 0) return undefined;\n const validIndexes = indexMembers.filter((member) => member.value.kind === 'NUMBER' && Number.isSafeInteger(member.value.value) && member.value.value >= 0);\n if (indexMembers.length === 1 && validIndexes.length === 0) return undefined;\n return {\n target: (validTargets[0].value.kind === 'STRING' ? validTargets[0].value.value : ''),\n targetPort: validIndexes.length > 0 && validIndexes[0].value.kind === 'NUMBER' ? validIndexes[0].value.value : 0,\n ...(nodeMembers.length > 1 ? { duplicateNode: nodeMembers.map((member) => member.ref) } : {}),\n ...(indexMembers.length > 1 ? { duplicateIndex: indexMembers.map((member) => member.ref) } : {}),\n };\n}\n\nfunction depthLimit(result: EdgeCollection): EdgeCollection {\n result.error = 'CONNECTION_DEPTH_LIMIT';\n return result;\n}\n", "export type ExpressionIslandV2 = Readonly<{\n kind: 'LITERAL' | 'EXPRESSION';\n start: number;\n end: number;\n}>;\n\nconst MAX_LEXER_STACK_DEPTH = 256;\n\ntype Frame =\n | { kind: 'EXPRESSION' | 'TEMPLATE_EXPRESSION'; braces: number }\n | { kind: 'TEMPLATE' | 'SINGLE' | 'DOUBLE' };\n\nconst literal = (start: number, end: number): ExpressionIslandV2 => Object.freeze({ kind: 'LITERAL', start, end });\nconst expression = (start: number, end: number): ExpressionIslandV2 => Object.freeze({ kind: 'EXPRESSION', start, end });\n\n/** Segment n8n expression islands without evaluating or exposing their contents. */\nexport function segmentExpressionIslands(value: string): readonly ExpressionIslandV2[] {\n if (typeof value !== 'string' || value.length === 0) return Object.freeze([]);\n const segments: ExpressionIslandV2[] = [];\n let cursor = 0;\n while (cursor < value.length) {\n const open = value.indexOf('{{', cursor);\n if (open < 0) break;\n if (open > cursor) segments.push(literal(cursor, open));\n const end = scanIsland(value, open + 2);\n segments.push(expression(open, end));\n cursor = end;\n if (end >= value.length) break;\n }\n if (cursor < value.length) segments.push(literal(cursor, value.length));\n if (segments.length === 0) segments.push(literal(0, value.length));\n return Object.freeze(segments);\n}\n\nfunction scanIsland(source: string, start: number): number {\n const frames: Frame[] = [{ kind: 'EXPRESSION', braces: 0 }];\n let index = start;\n while (index < source.length && frames.length > 0) {\n const frame = frames[frames.length - 1];\n const character = source[index];\n if (frame.kind === 'SINGLE' || frame.kind === 'DOUBLE') {\n if (character === '\\\\') { index += 2; continue; }\n const quote = frame.kind === 'SINGLE' ? \"'\" : '\"';\n if (character === quote) frames.pop();\n index += 1;\n continue;\n }\n if (frame.kind === 'TEMPLATE') {\n if (character === '\\\\') { index += 2; continue; }\n if (character === '`') { frames.pop(); index += 1; continue; }\n if (character === '$' && source[index + 1] === '{') {\n if (frames.length >= MAX_LEXER_STACK_DEPTH) return source.length;\n frames.push({ kind: 'TEMPLATE_EXPRESSION', braces: 0 }); index += 2; continue;\n }\n index += 1;\n continue;\n }\n if (character === \"'\") { frames.push({ kind: 'SINGLE' }); index += 1; continue; }\n if (character === '\"') { frames.push({ kind: 'DOUBLE' }); index += 1; continue; }\n if (character === '`') { frames.push({ kind: 'TEMPLATE' }); index += 1; continue; }\n if (frame.kind !== 'EXPRESSION' && frame.kind !== 'TEMPLATE_EXPRESSION') {\n index += 1;\n continue;\n }\n if (character === '{') { frame.braces += 1; index += 1; continue; }\n if (character === '}') {\n if (frame.braces > 0) { frame.braces -= 1; index += 1; continue; }\n if (frame.kind === 'TEMPLATE_EXPRESSION') { frames.pop(); index += 1; continue; }\n if (source[index + 1] === '}') return index + 2;\n }\n index += 1;\n }\n return source.length;\n}\n", "/**\n * Provider token shapes shared by scanner classification and evidence redaction.\n *\n * Bodies are intentionally unanchored. Classifiers wrap them as complete values,\n * while redaction finds a token inside arbitrary text.\n */\nexport type ProviderTokenSurface = 'classify' | 'redact';\n\nexport type ProviderTokenProvenance =\n | { kind: 'VENDOR_DOCS'; url: string }\n | { kind: 'FIRST_PARTY'; ref: string };\n\nexport type ProviderTokenPattern = {\n kind: string;\n body: string;\n flags: '' | 'i';\n redactionBoundary?: 'start' | 'both';\n surfaces: readonly ProviderTokenSurface[];\n provenance: ProviderTokenProvenance;\n canary: { positive: string; nearMiss: string };\n};\n\nexport const PROVIDER_TOKEN_PATTERNS = [\n {\n kind: 'bearer token',\n body: 'Bearer[ \\t]+[A-Za-z0-9._~+/=-]{8,}',\n flags: 'i',\n redactionBoundary: 'start',\n surfaces: ['classify', 'redact'],\n provenance: { kind: 'VENDOR_DOCS', url: 'https://www.rfc-editor.org/rfc/rfc6750' },\n canary: { positive: 'Bearer opaque-token-value-123', nearMiss: 'Bearer short' },\n },\n {\n kind: 'basic auth',\n body: 'Basic[ \\t]+[A-Za-z0-9+/=-]{8,}',\n flags: 'i',\n redactionBoundary: 'start',\n surfaces: ['classify', 'redact'],\n provenance: { kind: 'VENDOR_DOCS', url: 'https://www.rfc-editor.org/rfc/rfc7617' },\n canary: { positive: 'Basic YWJjZGVmZw==', nearMiss: 'Basic short' },\n },\n {\n kind: 'Stripe API key',\n body: 'sk_(?:live|test)_[A-Za-z0-9_]{8,}',\n flags: '',\n surfaces: ['classify', 'redact'],\n provenance: { kind: 'VENDOR_DOCS', url: 'https://docs.stripe.com/keys' },\n canary: { positive: 'sk_live_12345678', nearMiss: 'sk_live_1234567' },\n },\n {\n kind: 'Google API key',\n body: 'AIza[0-9A-Za-z_-]{35}',\n flags: '',\n surfaces: ['classify', 'redact'],\n provenance: { kind: 'VENDOR_DOCS', url: 'https://cloud.google.com/docs/authentication/api-keys' },\n canary: { positive: `AIza${'A'.repeat(35)}`, nearMiss: `AIza${'A'.repeat(34)}` },\n },\n {\n kind: 'AWS access key',\n body: '(?:AKIA|ASIA)[0-9A-Z]{16}',\n flags: '',\n surfaces: ['classify', 'redact'],\n provenance: { kind: 'VENDOR_DOCS', url: 'https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html' },\n canary: { positive: `AKIA${'A'.repeat(16)}`, nearMiss: `AKIA${'A'.repeat(15)}` },\n },\n {\n kind: 'Slack token',\n body: 'xox[baprs]-[A-Za-z0-9-]{10,}',\n flags: '',\n surfaces: ['classify', 'redact'],\n provenance: { kind: 'VENDOR_DOCS', url: 'https://api.slack.com/authentication/token-types' },\n canary: { positive: 'xoxb-1234567890', nearMiss: 'xoxb-123456789' },\n },\n {\n kind: 'GitHub token',\n // GitHub documents token types by prefix, not complete grammars. These\n // minimum shapes are local precision heuristics informed by its examples.\n // Example bodies: https://docs.github.com/en/rest/credentials/revoke.\n // For ghs_, use GitHub's opaque matcher for stateful and stateless formats;\n // see https://github.blog/changelog/2026-05-15-github-app-installation-tokens-per-request-override-header/.\n body: '(?:(?:ghp|gho|ghu)_[A-Za-z0-9_]{36,}(?![A-Za-z0-9_.-])|ghr_[A-Za-z0-9_]{76,}(?![A-Za-z0-9_.-])|github_pat_[A-Za-z0-9]{22}_[A-Za-z0-9]{59,}(?![A-Za-z0-9_.-])|ghs_[A-Za-z0-9._-]{36,})',\n flags: '',\n surfaces: ['classify', 'redact'],\n provenance: { kind: 'VENDOR_DOCS', url: 'https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/about-authentication-to-github' },\n canary: { positive: `ghp_${'A'.repeat(36)}`, nearMiss: `ghp_${'A'.repeat(35)}` },\n },\n {\n kind: 'JWT',\n body: 'eyJ[A-Za-z0-9_-]+\\\\.[A-Za-z0-9_-]+\\\\.[A-Za-z0-9_-]+',\n flags: '',\n surfaces: ['classify', 'redact'],\n provenance: { kind: 'VENDOR_DOCS', url: 'https://www.rfc-editor.org/rfc/rfc7519' },\n canary: { positive: 'eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.c2lnbmF0dXJl', nearMiss: 'eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.' },\n },\n {\n kind: 'Anthropic API key',\n body: 'sk-ant-[A-Za-z0-9_-]{20,}',\n flags: '',\n surfaces: ['classify', 'redact'],\n provenance: { kind: 'VENDOR_DOCS', url: 'https://docs.anthropic.com/en/api/getting-started' },\n canary: { positive: `sk-ant-api03-${'A'.repeat(20)}`, nearMiss: `sk-ant-api03-${'A'.repeat(13)}` },\n },\n {\n kind: 'OpenAI API key',\n body: 'sk-(?!ant-)[A-Za-z0-9_-]{20,}',\n flags: '',\n surfaces: ['classify', 'redact'],\n provenance: { kind: 'VENDOR_DOCS', url: 'https://platform.openai.com/docs/api-reference/authentication' },\n canary: { positive: `sk-proj-${'A'.repeat(20)}`, nearMiss: `sk-proj-${'A'.repeat(14)}` },\n },\n {\n kind: 'Hugging Face token',\n body: 'hf_[A-Za-z0-9]{20,}',\n flags: '',\n surfaces: ['classify', 'redact'],\n provenance: { kind: 'VENDOR_DOCS', url: 'https://huggingface.co/docs/hub/security-tokens' },\n canary: { positive: `hf_${'A'.repeat(20)}`, nearMiss: `hf_${'A'.repeat(19)}` },\n },\n {\n kind: 'Replicate API token',\n body: 'r8_[A-Za-z0-9]{37}',\n flags: '',\n surfaces: ['classify', 'redact'],\n provenance: { kind: 'VENDOR_DOCS', url: 'https://replicate.com/docs/topics/security/api-tokens' },\n canary: { positive: `r8_${'A'.repeat(37)}`, nearMiss: `r8_${'A'.repeat(36)}` },\n },\n {\n kind: 'SecureFlow API key',\n body: 'sfk_[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}_[A-Za-z0-9_-]{8,16}\\\\.[A-Za-z0-9_-]{32,128}(?![A-Za-z0-9_-])',\n flags: 'i',\n redactionBoundary: 'start',\n surfaces: ['redact'],\n provenance: { kind: 'FIRST_PARTY', ref: 'src/auth/api-keys.ts:139-141' },\n canary: {\n positive: `sfk_22222222-2222-4222-8222-222222222222_AbCdEf12345.${'s'.repeat(43)}`,\n nearMiss: `sfk_22222222-2222-4222-8222-222222222222_AbCdEf12345.${'s'.repeat(31)}`,\n },\n },\n {\n kind: 'Stripe restricted key',\n body: 'rk_(?:live|test)_[A-Za-z0-9_]{8,}',\n flags: '',\n surfaces: ['classify', 'redact'],\n provenance: { kind: 'VENDOR_DOCS', url: 'https://docs.stripe.com/keys#limit-access' },\n canary: { positive: 'rk_live_12345678', nearMiss: 'rk_live_1234567' },\n },\n] as const satisfies readonly ProviderTokenPattern[];\n\nexport function classifierPattern(entry: ProviderTokenPattern): RegExp {\n return new RegExp(`^(?:${entry.body})$`, entry.flags);\n}\n\nexport function redactionPattern(entry: ProviderTokenPattern): RegExp {\n const suffix = entry.redactionBoundary === 'start' ? '' : '\\\\b';\n return new RegExp(`\\\\b(?:${entry.body})${suffix}`, `${entry.flags}g`);\n}\n", "import { classifierPattern, PROVIDER_TOKEN_PATTERNS } from '../../provider-token-patterns';\n\nexport type PlaceholderClassificationV2 = Readonly<{\n kind: 'PLACEHOLDER';\n indicator: string;\n}>;\n\nconst MAX_PLACEHOLDER_LENGTH = 256;\nconst MAX_DYNAMIC_PROPERTY_LENGTH = 128;\nconst dynamicRootNames = new Set(['json', 'node', 'env', 'credentials', 'secrets', 'vars', 'parameter']);\nconst placeholderWords = '(?:your|my|example|sample|placeholder|dummy|test|fake|changeme|todo|insert|replace|enter|add)';\nconst placeholderNouns = '(?:api|access|auth|secret|token|key|password|credential|value|here|id|url|name)';\nconst wordPlaceholder = new RegExp(`^${placeholderWords}(?:[\\\\s_-]+(?:${placeholderWords}|${placeholderNouns}))*$`, 'i');\nconst nounPlaceholder = new RegExp(`^${placeholderNouns}(?:[\\\\s_-]+(?:${placeholderWords}|${placeholderNouns}))*$`, 'i');\nconst wrappedPlaceholder = /^<([^>\\r\\n]{1,256})>$/;\nconst bracketPlaceholder = /^\\[([^\\]\\r\\n]{1,256})\\]$/;\nconst namedPlaceholder = new RegExp(`^__(?:${placeholderWords}|${placeholderNouns})(?:[_-](?:${placeholderWords}|${placeholderNouns}))*__$`, 'i');\nconst maskPlaceholder = /^[*x._-]{3,64}$/i;\nconst classifiedProviderPatterns = PROVIDER_TOKEN_PATTERNS.filter((entry) => entry.surfaces.some((surface) => surface === 'classify'));\n\n/** Classify only complete, reviewed placeholder forms; never return the input text. */\nexport function classifyAnchoredPlaceholder(value: unknown): PlaceholderClassificationV2 | undefined {\n if (typeof value !== 'string') return undefined;\n const candidate = value.trim();\n if (candidate.length === 0 || candidate.length > MAX_PLACEHOLDER_LENGTH) return undefined;\n const angle = wrappedPlaceholder.exec(candidate);\n if (angle && isReviewedPlaceholderInner(angle[1]) && !isProviderToken(angle[1])) return Object.freeze({ kind: 'PLACEHOLDER', indicator: 'ANGLE_WRAPPED' });\n const square = bracketPlaceholder.exec(candidate);\n if (square && isReviewedPlaceholderInner(square[1]) && !isProviderToken(square[1])) return Object.freeze({ kind: 'PLACEHOLDER', indicator: 'SQUARE_WRAPPED' });\n const indicator = namedPlaceholder.test(candidate)\n ? 'NAMED_PLACEHOLDER'\n : maskPlaceholder.test(candidate)\n ? 'MASK'\n : isDynamicRootPlaceholder(candidate)\n ? 'DYNAMIC_ROOT'\n : wordPlaceholder.test(candidate) || nounPlaceholder.test(candidate)\n ? 'PLACEHOLDER_WORD'\n : undefined;\n return indicator === undefined ? undefined : Object.freeze({ kind: 'PLACEHOLDER', indicator });\n}\n\nfunction isReviewedPlaceholderInner(value: string): boolean {\n return namedPlaceholder.test(value) || maskPlaceholder.test(value) || isDynamicRootPlaceholder(value)\n || wordPlaceholder.test(value) || nounPlaceholder.test(value);\n}\n\nfunction isProviderToken(value: string): boolean {\n return classifiedProviderPatterns.some((entry) => classifierPattern(entry).test(value));\n}\n\nfunction isDynamicRootPlaceholder(value: string): boolean {\n if (value.length > MAX_PLACEHOLDER_LENGTH) return false;\n let cursor = value.startsWith('$') ? 1 : 0;\n const rootStart = cursor;\n while (cursor < value.length && isDynamicIdentifierPart(value[cursor])) cursor += 1;\n if (!dynamicRootNames.has(value.slice(rootStart, cursor).toLowerCase())) return false;\n\n while (cursor < value.length) {\n if (value[cursor] === '.') {\n cursor += 1;\n if (cursor >= value.length || !isDynamicIdentifierStart(value[cursor])) return false;\n cursor += 1;\n while (cursor < value.length && isDynamicIdentifierPart(value[cursor])) cursor += 1;\n continue;\n }\n if (value[cursor] !== '[') return false;\n const quote = value[cursor + 1];\n if (quote !== '\"' && quote !== \"'\") return false;\n cursor += 2;\n const propertyStart = cursor;\n let escaped = false;\n while (cursor < value.length) {\n const character = value[cursor];\n if (character === '\\r' || character === '\\n') return false;\n if (escaped) {\n escaped = false;\n } else if (character === '\\\\') {\n escaped = true;\n } else if (character === quote) {\n break;\n }\n cursor += 1;\n }\n if (cursor >= value.length || cursor - propertyStart === 0 || cursor - propertyStart > MAX_DYNAMIC_PROPERTY_LENGTH) return false;\n if (value[cursor + 1] !== ']') return false;\n cursor += 2;\n }\n return true;\n}\n\nfunction isDynamicIdentifierStart(character: string): boolean {\n return character === '$' || character === '_' || isAsciiLetter(character);\n}\n\nfunction isDynamicIdentifierPart(character: string): boolean {\n return isDynamicIdentifierStart(character) || isAsciiDigit(character);\n}\n\nfunction isAsciiLetter(character: string): boolean {\n const code = character.charCodeAt(0);\n return code >= 65 && code <= 90 || code >= 97 && code <= 122;\n}\n\nfunction isAsciiDigit(character: string): boolean {\n const code = character.charCodeAt(0);\n return code >= 48 && code <= 57;\n}\n", "import {\n PROVIDER_TOKEN_PATTERNS,\n classifierPattern,\n type ProviderTokenPattern,\n} from '../../provider-token-patterns';\n\nconst MAX_PROVIDER_TOKEN_CHARS = 4_096;\nconst wrapperPattern = /^(?:<([^>\\r\\n]{1,512})>|\\[([^\\]\\r\\n]{1,512})\\])$/;\n\nexport type ProviderTokenClassification = Readonly<{ kind: string }>;\nexport type ProviderTokenGrammar = Readonly<ProviderTokenPattern>;\n\nfunction freezeGrammar(entry: ProviderTokenPattern): ProviderTokenGrammar {\n return Object.freeze({\n ...entry,\n surfaces: Object.freeze([...entry.surfaces]),\n provenance: Object.freeze({ ...entry.provenance }),\n canary: Object.freeze({ ...entry.canary }),\n });\n}\n\n/** Reviewed provider grammars. SecureFlow's own key remains redaction-only by policy. */\nexport const PROVIDER_TOKEN_GRAMMARS_V2 = Object.freeze(\n PROVIDER_TOKEN_PATTERNS.map(freezeGrammar),\n);\n\nconst classifiedGrammars = PROVIDER_TOKEN_GRAMMARS_V2\n .filter((entry) => entry.surfaces.includes('classify'))\n .map((entry) => ({ kind: entry.kind, pattern: classifierPattern(entry) }));\n\n/** Return a provider label only when the entire value (or one reviewed wrapper) matches. */\nexport function classifyProviderToken(value: unknown): ProviderTokenClassification | undefined {\n if (typeof value !== 'string') return undefined;\n const candidate = value.trim();\n if (candidate.length === 0 || candidate.length > MAX_PROVIDER_TOKEN_CHARS) return undefined;\n\n const direct = matchClassifiedGrammar(candidate);\n if (direct) return Object.freeze({ kind: direct });\n\n const wrapper = wrapperPattern.exec(candidate);\n if (!wrapper) return undefined;\n const inner = (wrapper[1] ?? wrapper[2]).trim();\n const wrapped = matchClassifiedGrammar(inner);\n return wrapped ? Object.freeze({ kind: wrapped }) : undefined;\n}\n\nfunction matchClassifiedGrammar(value: string): string | undefined {\n let matched: string | undefined;\n for (const grammar of classifiedGrammars) {\n if (!grammar.pattern.test(value)) continue;\n if (matched !== undefined) return undefined;\n matched = grammar.kind;\n }\n return matched;\n}\n", "import { segmentExpressionIslands } from './analyzers/expression/expression-islands';\nimport { classifyAnchoredPlaceholder } from './analyzers/expression/placeholder-classifier';\nimport { classifyProviderToken } from './analyzers/secrets/provider-token-registry';\n\nconst MAX_SECRET_VALUE_CHARS = 4_096;\nexport const MAX_SECRET_INDICATORS = 10;\nconst opaqueSecretSyntax = /^[A-Za-z0-9~+/=_!$.-]{20,512}$/;\nconst sensitiveContext = /(?:api[-_ ]?key|token|secret|password|credential|authorization|cookie)/i;\n\nexport type SecretClassification = Readonly<{ kind: string }>;\nexport type LiteralClassification = Readonly<{\n classification?: SecretClassification;\n indicatorCount: number;\n omitted: boolean;\n}>;\n\n/**\n * Classifies bounded literal values without returning their contents. Expression code is not\n * evaluated; complete provider tokens in quoted string values are classified, while each\n * surrounding literal is considered independently.\n */\nexport function classifySecretValue(\n value: string,\n contextKey?: string,\n): SecretClassification | undefined {\n if (typeof value !== 'string') return undefined;\n const candidate = value.trim();\n if (candidate.length === 0 || candidate.length > MAX_SECRET_VALUE_CHARS) return undefined;\n return classifyLiteralSegments(candidate, contextKey).classification;\n}\n\nexport function classifyLiteralSegments(value: string, contextKey?: string): LiteralClassification {\n if (typeof value !== 'string' || value.length === 0 || value.length > MAX_SECRET_VALUE_CHARS) {\n return Object.freeze({ classification: undefined, indicatorCount: 0, omitted: false });\n }\n // n8n marks expression mode with a leading `=`; the marker is not part of the value.\n const body = value.startsWith('=') ? value.slice(1) : value;\n let classification: SecretClassification | undefined;\n let indicatorCount = 0;\n let omitted = false;\n for (const segment of segmentExpressionIslands(body)) {\n if (segment.kind === 'EXPRESSION') {\n const found: SecretClassification[] = [];\n collectQuotedExpressionTokens(body, segment.start, segment.end, found);\n for (const providerClassification of found) {\n if (indicatorCount >= MAX_SECRET_INDICATORS) { omitted = true; continue; }\n indicatorCount += 1;\n classification ??= providerClassification;\n }\n continue;\n }\n if (segment.end <= segment.start) continue;\n const found = classifyLiteral(body.slice(segment.start, segment.end), contextKey);\n if (found === undefined) continue;\n if (indicatorCount >= MAX_SECRET_INDICATORS) { omitted = true; continue; }\n indicatorCount += 1;\n classification ??= found;\n }\n return Object.freeze({ classification, indicatorCount, omitted });\n}\n\n/**\n * Classifies complete provider tokens inside single- or double-quoted string values of n8n\n * expressions. The expression is never evaluated; unquoted template-literal text and quoted\n * property names are not scanned, and escape sequences are not decoded (the raw two-character\n * escape is kept, so an escaped fragment cannot be spliced into a token).\n */\nexport function classifyQuotedExpressionTokens(value: string): readonly SecretClassification[] {\n if (typeof value !== 'string' || value.length === 0 || value.length > MAX_SECRET_VALUE_CHARS) {\n return Object.freeze([]);\n }\n const classifications: SecretClassification[] = [];\n for (const segment of segmentExpressionIslands(value)) {\n if (segment.kind !== 'EXPRESSION') continue;\n collectQuotedExpressionTokens(value, segment.start, segment.end, classifications);\n if (classifications.length >= MAX_SECRET_INDICATORS) break;\n }\n return Object.freeze(classifications);\n}\n\nfunction collectQuotedExpressionTokens(\n source: string,\n start: number,\n end: number,\n output: SecretClassification[],\n): void {\n let index = start;\n while (index < end && output.length < MAX_SECRET_INDICATORS) {\n const quote = source[index];\n if (quote !== '\"' && quote !== \"'\") { index += 1; continue; }\n const opening = index;\n let literal = '';\n index += 1;\n while (index < end) {\n const character = source[index];\n if (character === '\\\\') {\n // Keep the backslash with its escaped character: dropping it turns `\\n` into `n` and\n // can splice two fragments into a provider token the runtime never holds.\n if (index + 1 < end) literal += source.slice(index, index + 2);\n index += 2;\n continue;\n }\n if (character === quote) break;\n literal += character;\n index += 1;\n }\n const closing = index;\n const closed = closing < end && source[closing] === quote;\n index += 1;\n if (!closed || isQuotedPropertyName(source, opening, closing, start, end)) continue;\n const classification = classifyProviderToken(literal);\n if (classification) output.push(classification);\n }\n}\n\nfunction isQuotedPropertyName(\n source: string,\n opening: number,\n closing: number,\n start: number,\n end: number,\n): boolean {\n const previous = previousNonWhitespace(source, opening - 1, start);\n const next = nextNonWhitespace(source, closing + 1, end);\n if (next === ':' && (previous === '{' || previous === ',')) return true;\n if (previous !== '[') return false;\n const owner = previousNonWhitespace(source, opening - 2, start);\n return owner !== undefined && /[A-Za-z0-9_$.)\\].'\"`]/.test(owner);\n}\n\nfunction previousNonWhitespace(source: string, index: number, lowerBound: number): string | undefined {\n for (let cursor = index; cursor >= lowerBound; cursor -= 1) {\n if (!/\\s/.test(source[cursor])) return source[cursor];\n }\n return undefined;\n}\n\nfunction nextNonWhitespace(source: string, index: number, upperBound: number): string | undefined {\n for (let cursor = index; cursor < upperBound; cursor += 1) {\n if (!/\\s/.test(source[cursor])) return source[cursor];\n }\n return undefined;\n}\n\nfunction classifyLiteral(value: string, contextKey?: string): SecretClassification | undefined {\n const candidate = value.trim();\n if (candidate.length === 0 || isDynamicReference(candidate)) return undefined;\n const provider = classifyProviderToken(candidate);\n if (provider) return provider;\n if (classifyAnchoredPlaceholder(candidate)) return undefined;\n if (!contextKey || !sensitiveContext.test(contextKey) || !opaqueSecretSyntax.test(candidate)) return undefined;\n return shannonEntropy(candidate) >= 3.5 ? Object.freeze({ kind: 'opaque secret' }) : undefined;\n}\n\nfunction isDynamicReference(value: string): boolean {\n return value.includes('${') || value.startsWith('=');\n}\n\nfunction shannonEntropy(value: string): number {\n const counts = new Map<string, number>();\n for (const character of value) counts.set(character, (counts.get(character) ?? 0) + 1);\n return [...counts.values()].reduce((entropy, count) => {\n const probability = count / value.length;\n return entropy - probability * Math.log2(probability);\n }, 0);\n}\n", "import type { SourceObjectMemberV2, SourceValueV2 } from '../source/source-types';\nimport { classifySecretValue } from '../secret-classifier';\nimport type { SemanticClassification, SemanticFieldV2 } from './security-workflow';\n\nexport type SemanticRegion = 'ROOT' | 'PARAMETERS' | 'CREDENTIALS' | 'SETTINGS' | 'CONNECTIONS' | 'METADATA';\n\nconst CODE_NAMES = new Set([\n 'code', 'jscode', 'pythoncode', 'functioncode', 'function', 'script', 'sourcecode',\n]);\n\nexport function semanticFields(value: SourceValueV2, region: SemanticRegion = 'METADATA'): SemanticFieldV2[] {\n if (value.kind === 'OBJECT') return value.members.map((member) => fieldFromMember(member, region));\n if (value.kind === 'ARRAY') return value.items.map((item) => fieldFromValue(item, region));\n return [fieldFromValue(value, region)];\n}\n\nexport function fieldFromMember(member: SourceObjectMemberV2, region: SemanticRegion): SemanticFieldV2 {\n const childRegion = regionFor(member.name, region);\n return Object.freeze({\n pointer: member.ref.pointer,\n occurrences: Object.freeze([member.ref]),\n value: valueFor(member.value, childRegion),\n classification: classify(member.name, member.value, childRegion),\n });\n}\n\nfunction fieldFromValue(value: SourceValueV2, region: SemanticRegion): SemanticFieldV2 {\n return Object.freeze({\n pointer: value.ref.pointer,\n occurrences: Object.freeze([value.ref]),\n value: valueFor(value, region),\n classification: classify(undefined, value, region),\n });\n}\n\nfunction valueFor(value: SourceValueV2, region: SemanticRegion): SemanticFieldV2['value'] {\n if (value.kind === 'NULL' || value.kind === 'BOOLEAN' || value.kind === 'STRING') return value.value;\n if (value.kind === 'NUMBER') {\n if (!Number.isFinite(value.value)) throw new TypeError('Non-finite semantic number');\n return value.value;\n }\n if (value.kind === 'ARRAY') return Object.freeze(value.items.map((item) => fieldFromValue(item, region)));\n return Object.freeze(value.members.map((member) => fieldFromMember(member, region)));\n}\n\nfunction regionFor(name: string, parent: SemanticRegion): SemanticRegion {\n const normalized = name.toLowerCase();\n if (normalized === 'parameters') return 'PARAMETERS';\n if (normalized === 'credentials' || normalized.includes('credential')) return 'CREDENTIALS';\n if (normalized === 'settings') return 'SETTINGS';\n if (normalized === 'connections') return 'CONNECTIONS';\n if (parent === 'PARAMETERS' || parent === 'CREDENTIALS' || parent === 'SETTINGS' || parent === 'CONNECTIONS') return parent;\n return 'METADATA';\n}\n\nfunction classify(name: string | undefined, value: SourceValueV2, region: SemanticRegion): SemanticClassification {\n if (region === 'CREDENTIALS' || (name !== undefined && /credential/i.test(name))) return 'CREDENTIAL_REF';\n if (value.kind === 'STRING' && containsExpression(value.value)) return 'EXPRESSION';\n if (name !== undefined && CODE_NAMES.has(name.toLowerCase())) return 'CODE';\n if (name !== undefined && isSensitiveName(name)) return 'SECRET_CANDIDATE';\n if (value.kind === 'STRING' && classifySecretValue(value.value, name)) return 'SECRET_CANDIDATE';\n return 'PLAIN';\n}\n\nfunction containsExpression(value: string): boolean {\n const start = value.indexOf('={{');\n return start >= 0 && value.indexOf('}}', start + 3) >= 0;\n}\n\nfunction isSensitiveName(name: string): boolean {\n return /(?:password|passphrase|secret|token|api[-_]?key|private[-_]?key|access[-_]?key|authorization|cookie)/i.test(name);\n}\n", "import type { ScannerLimitsV2 } from '@hub/contracts';\nimport type { SourceObjectMemberV2, SourceValueV2 } from '../source/source-types';\nimport { createAmbiguity } from './ambiguity';\nimport { createNodeRef } from './node-edge-identity';\nimport { hasDuplicateMembers } from './duplicate-ambiguities';\nimport { fieldFromMember, semanticFields } from './semantic-fields';\nimport type { NormalizationAmbiguityV2, SecurityNodeV2, NodeRefV2 } from './security-workflow';\n\ntype NodeCollection = {\n nodes: SecurityNodeV2[];\n refs: NodeRefV2[];\n ambiguities: NormalizationAmbiguityV2[];\n parameterDepth: number;\n parameterLeaves: number;\n error?: 'MALFORMED_WORKFLOW' | 'NODE_LIMIT' | 'PARAMETER_DEPTH_LIMIT' | 'PARAMETER_LEAF_LIMIT';\n};\n\nconst CORE_NODE_MEMBERS = new Set(['type', 'disabled', 'parameters', 'credentials', 'settings']);\n\nexport function normalizeNodes(\n value: SourceValueV2,\n limits: ScannerLimitsV2,\n ordinalOffset = 0,\n): NodeCollection {\n const result: NodeCollection = { nodes: [], refs: [], ambiguities: [], parameterDepth: 0, parameterLeaves: 0 };\n if (value.kind !== 'ARRAY') return { ...result, error: 'MALFORMED_WORKFLOW' };\n\n for (const [ordinal, item] of value.items.entries()) {\n if (item.kind !== 'OBJECT') return { ...result, error: 'MALFORMED_WORKFLOW' };\n const typeMembers = membersNamed(item, 'type');\n const type = effectiveMember(item, 'type');\n const typeValue = type?.value;\n if (typeMembers.length === 0 || (typeMembers.length === 1 && (typeValue?.kind !== 'STRING' || typeValue.value.length === 0))) {\n return { ...result, error: 'MALFORMED_WORKFLOW' };\n }\n const id = effectiveMember(item, 'id');\n const name = effectiveMember(item, 'name');\n const idMembers = membersNamed(item, 'id');\n const nameMembers = membersNamed(item, 'name');\n const nodeRef = createNodeRef({\n ordinal: ordinalOffset + ordinal,\n source: item.ref,\n explicitId: idMembers.length === 1 && id?.value.kind === 'STRING' ? id.value.value : undefined,\n name: nameMembers.length === 1 && name?.value.kind === 'STRING' ? name.value.value : undefined,\n });\n const parameterFields: ReturnType<typeof semanticFields> = [];\n let scoringEligibility: SecurityNodeV2['scoringEligibility'] = typeMembers.length > 1 ? 'INDETERMINATE' : 'ELIGIBLE';\n if (hasDuplicateMembers(item, limits.maxMembersAndElements)) scoringEligibility = 'INDETERMINATE';\n if (idMembers.length > 1 || nameMembers.length > 1) scoringEligibility = 'INDETERMINATE';\n const parameterMembers = membersNamed(item, 'parameters');\n if (parameterMembers.length > 1) scoringEligibility = 'INDETERMINATE';\n for (const parameters of parameterMembers) {\n if (parameters.value.kind !== 'OBJECT') scoringEligibility = 'INDETERMINATE';\n const normalized = normalizeParameterFields(parameters, limits, result);\n if (normalized.error) return { ...result, error: normalized.error };\n parameterFields.push(...normalized.fields);\n }\n const credentialsMembers = membersNamed(item, 'credentials');\n if (credentialsMembers.length > 1 || credentialsMembers.some((member) => member.value.kind !== 'OBJECT')) scoringEligibility = 'INDETERMINATE';\n const credentials = normalizeRegionFields(item, 'credentials', result);\n const settings = normalizeSettings(item, result);\n const disabled = effectiveMember(item, 'disabled');\n const disabledMembers = membersNamed(item, 'disabled');\n const typeVersionMembers = membersNamed(item, 'typeVersion');\n if (disabledMembers.length > 1 || (disabled && disabled.value.kind !== 'BOOLEAN')) {\n scoringEligibility = 'INDETERMINATE';\n if (disabled && disabled.value.kind !== 'BOOLEAN') result.ambiguities.push(createAmbiguity({\n kind: 'MALFORMED_SECURITY_VALUE', subject: disabled.ref, securityImpact: 'SCORING_INPUT', resolution: 'EXCLUDED_FROM_SCORING',\n }));\n }\n if (typeVersionMembers.length > 1) scoringEligibility = 'INDETERMINATE';\n const typeVersionMember = effectiveMember(item, 'typeVersion');\n const typeVersion = normalizedTypeVersion(typeVersionMember);\n if (typeVersionMember && typeVersion === undefined) result.ambiguities.push(createAmbiguity({\n kind: 'MALFORMED_SECURITY_VALUE', subject: typeVersionMember.ref, securityImpact: 'SCORING_INPUT', resolution: 'EXCLUDED_FROM_SCORING',\n }));\n if (typeVersionMember && typeVersion === undefined) scoringEligibility = 'INDETERMINATE';\n if (membersNamed(item, 'settings').length > 1 || membersNamed(item, 'settings').some((member) => member.value.kind !== 'OBJECT')) scoringEligibility = 'INDETERMINATE';\n const node: SecurityNodeV2 = Object.freeze({\n ref: nodeRef,\n type: typeMembers.length > 1 ? '' : typeValue?.kind === 'STRING' ? typeValue.value : '',\n ...(typeVersion === undefined ? {} : { typeVersion }),\n disabled: disabled?.value.kind === 'BOOLEAN' ? disabled.value.value : false,\n scoringEligibility,\n parameters: Object.freeze(parameterFields),\n credentials: Object.freeze(credentials),\n settings: Object.freeze(settings),\n });\n result.nodes.push(node);\n result.refs.push(nodeRef);\n }\n return result;\n}\n\nfunction normalizedTypeVersion(member: SourceObjectMemberV2 | undefined): string | undefined {\n if (!member) return undefined;\n if (member.value.kind === 'STRING') return member.value.value;\n if (member.value.kind !== 'NUMBER' || !Number.isFinite(member.value.value) || member.value.value < 0) return undefined;\n const numeric = String(member.value.value);\n if (/^\\d+$/.test(numeric)) return `${numeric}.0.0`;\n if (/^\\d+\\.\\d+$/.test(numeric)) return `${numeric}.0`;\n return undefined;\n}\n\nfunction normalizeParameterFields(member: SourceObjectMemberV2 | undefined, limits: ScannerLimitsV2, result: NodeCollection) {\n if (!member) return { fields: [] as ReturnType<typeof semanticFields> };\n if (member.value.kind !== 'OBJECT') {\n result.ambiguities.push(createAmbiguity({\n kind: 'MALFORMED_SECURITY_VALUE', subject: member.ref, securityImpact: 'SCORING_INPUT', resolution: 'EXCLUDED_FROM_SCORING',\n }));\n return { fields: [] as ReturnType<typeof semanticFields> };\n }\n const budget = parameterBudget(member.value, limits.maxParameterDepth, limits.maxParameterLeaves);\n result.parameterDepth = Math.max(result.parameterDepth, budget.depth);\n result.parameterLeaves += budget.leaves;\n if (budget.depthExceeded) return { fields: [], error: 'PARAMETER_DEPTH_LIMIT' as const };\n if (budget.leafExceeded) return { fields: [], error: 'PARAMETER_LEAF_LIMIT' as const };\n return { fields: semanticFields(member.value, 'PARAMETERS') };\n}\n\nfunction normalizeRegionFields(value: Extract<SourceValueV2, { kind: 'OBJECT' }>, name: string, result: NodeCollection) {\n const fields: ReturnType<typeof semanticFields> = [];\n for (const member of membersNamed(value, name)) {\n if (member.value.kind === 'OBJECT') fields.push(...semanticFields(member.value, 'CREDENTIALS'));\n else {\n result.ambiguities.push(createAmbiguity({\n kind: 'MALFORMED_SECURITY_VALUE', subject: member.ref, securityImpact: 'SCORING_INPUT', resolution: 'EXCLUDED_FROM_SCORING',\n }));\n fields.push(fieldFromMember(member, 'CREDENTIALS'));\n }\n }\n return fields;\n}\n\nfunction normalizeSettings(value: Extract<SourceValueV2, { kind: 'OBJECT' }>, result: NodeCollection) {\n const fields = value.members\n .filter((member) => !CORE_NODE_MEMBERS.has(member.name.toLowerCase()))\n .map((member) => fieldFromMember(member, 'SETTINGS'));\n for (const member of membersNamed(value, 'settings')) {\n if (member.value.kind === 'OBJECT') fields.push(...semanticFields(member.value, 'SETTINGS'));\n else {\n result.ambiguities.push(createAmbiguity({\n kind: 'MALFORMED_SECURITY_VALUE', subject: member.ref, securityImpact: 'SCORING_INPUT', resolution: 'EXCLUDED_FROM_SCORING',\n }));\n fields.push(fieldFromMember(member, 'SETTINGS'));\n }\n }\n return fields;\n}\n\nfunction membersNamed(value: Extract<SourceValueV2, { kind: 'OBJECT' }>, name: string): SourceObjectMemberV2[] {\n return value.members.filter((member) => member.name === name);\n}\n\nfunction parameterBudget(value: SourceValueV2, maxDepth: number, maxLeaves: number) {\n const pending: Array<{ value: SourceValueV2; depth: number }> = [{ value, depth: 0 }];\n let depth = 0;\n let leaves = 0;\n while (pending.length > 0) {\n const current = pending.pop()!;\n depth = Math.max(depth, current.depth);\n if (current.depth > maxDepth) return { depth, leaves, depthExceeded: true, leafExceeded: false };\n if (current.value.kind === 'OBJECT') {\n for (const member of current.value.members) pending.push({ value: member.value, depth: current.depth + 1 });\n } else if (current.value.kind === 'ARRAY') {\n for (const item of current.value.items) pending.push({ value: item, depth: current.depth + 1 });\n } else {\n leaves += 1;\n if (leaves > maxLeaves) return { depth, leaves, depthExceeded: false, leafExceeded: true };\n }\n }\n return { depth, leaves, depthExceeded: false, leafExceeded: false };\n}\n\nfunction effectiveMember(value: Extract<SourceValueV2, { kind: 'OBJECT' }>, name: string) {\n for (let index = value.members.length - 1; index >= 0; index -= 1) {\n if (value.members[index].name === name) return value.members[index];\n }\n return undefined;\n}\n", "import { sha256 } from '@noble/hashes/sha2.js';\nimport { bytesToHex } from '@noble/hashes/utils.js';\nimport { canonicalizeJson } from '../canonical-json';\nimport type { SourceMemberRefV2 } from '../source/source-types';\nimport type { NormalizationAmbiguityV2, SecurityWorkflowV2, NodeRefV2 } from './security-workflow';\n\nexport function projectAmbiguities(items: readonly NormalizationAmbiguityV2[]) {\n return items.map((item) => ({\n ambiguityId: item.ambiguityId, kind: item.kind, subject: refWithoutSpan(item.subject),\n related: item.related.map(refWithoutSpan), securityImpact: item.securityImpact, resolution: item.resolution,\n }));\n}\n\nexport function projectWorkflow(workflow: SecurityWorkflowV2) {\n return {\n workflowFields: workflow.workflowFields.map(projectField),\n nodes: workflow.nodes.map((node) => ({\n ref: projectNode(node.ref), type: node.type, ...(node.typeVersion !== undefined ? { typeVersion: node.typeVersion } : {}), disabled: node.disabled,\n scoringEligibility: node.scoringEligibility, parameters: node.parameters.map(projectField), credentials: node.credentials.map(projectField), settings: node.settings.map(projectField),\n })),\n edges: workflow.edges.map((edge) => ({\n ordinal: edge.ordinal, ...(edge.sourceNode ? { sourceNode: projectNode(edge.sourceNode) } : {}), sourceLabel: edge.sourceLabel,\n ...(edge.targetNode ? { targetNode: projectNode(edge.targetNode) } : {}), ...(edge.targetLabel !== undefined ? { targetLabel: edge.targetLabel } : {}),\n connectionType: edge.connectionType, sourcePort: edge.sourcePort, targetPort: edge.targetPort, source: refWithoutSpan(edge.source), resolution: edge.resolution,\n })),\n ambiguities: projectAmbiguities(workflow.ambiguities),\n };\n}\n\nexport function digest(value: unknown): string {\n return bytesToHex(sha256(new TextEncoder().encode(canonicalizeJson(value))));\n}\n\nexport function freeze<T>(value: T): T {\n if (value === null || typeof value !== 'object' || Object.isFrozen(value)) return value;\n for (const child of Object.values(value as Record<string, unknown>)) freeze(child);\n return Object.freeze(value);\n}\n\nfunction projectField(field: SecurityWorkflowV2['workflowFields'][number]): unknown {\n return { pointer: field.pointer, occurrences: field.occurrences.map(refWithoutSpan), value: Array.isArray(field.value) ? field.value.map(projectField) : field.value, classification: field.classification };\n}\n\nfunction projectNode(node: NodeRefV2) {\n return { ordinal: node.ordinal, source: refWithoutSpan(node.source), ...(node.explicitId !== undefined ? { explicitId: node.explicitId } : {}), ...(node.name !== undefined ? { name: node.name } : {}), identityDigest: node.identityDigest };\n}\n\nfunction refWithoutSpan(ref: SourceMemberRefV2) {\n return { pointer: ref.pointer, occurrencePath: [...ref.occurrencePath], astNodeId: ref.astNodeId, span: null };\n}\n", "import type { ScannerLimitsV2 } from '@hub/contracts';\nimport { isParsedSourceDocument } from '../source/source-document-provenance';\nexport function validateSourceDocument(value: unknown, limits: ScannerLimitsV2): boolean {\n try {\n if (!isParsedSourceDocument(value) || !record(value) || !exactKeys(value, DOCUMENT_KEYS)) return false;\n const document = value as Record<string, unknown>;\n if (!hex(document.rawSha256) || !Number.isSafeInteger(document.utf8Bytes) || (document.utf8Bytes as number) < 0 || (document.utf8Bytes as number) > limits.maxBytes) return false;\n if (document.bom !== 'NONE' && document.bom !== 'UTF8') return false;\n if (!Number.isSafeInteger(document.duplicateCount) || (document.duplicateCount as number) < 0 || (document.duplicateCount as number) > limits.maxDuplicateKeys ||\n !Number.isSafeInteger(document.syntaxNodeCount) || (document.syntaxNodeCount as number) < 0 || (document.syntaxNodeCount as number) > limits.maxSyntaxNodes) return false;\n const state = {\n seen: new Set<object>(), refs: new Map<string, { owner: object; ref: object }>(), units: 0, syntaxNodes: 1,\n duplicates: 0, spans: 0, depth: 0, utf8Bytes: document.utf8Bytes as number,\n maxMembers: limits.maxMembersAndElements, maxSyntaxNodes: limits.maxSyntaxNodes,\n maxDuplicateKeys: limits.maxDuplicateKeys, maxStoredSourceSpans: limits.maxStoredSourceSpans,\n };\n const pending: Array<{ value: unknown; depth: number }> = [{ value: document.root, depth: 1 }];\n while (pending.length > 0) {\n const current = pending.pop()!;\n state.depth = Math.max(state.depth, current.depth);\n if (current.depth > limits.maxDocumentDepth) return false;\n if (!validateValue(current.value, current.depth, pending, state)) return false;\n if (state.units > limits.maxMembersAndElements || state.syntaxNodes > limits.maxSyntaxNodes || state.spans > limits.maxStoredSourceSpans) return false;\n }\n return state.duplicates === document.duplicateCount && state.syntaxNodes === document.syntaxNodeCount;\n } catch {\n return false;\n }\n}\n\nfunction validateValue(value: unknown, depth: number, pending: Array<{ value: unknown; depth: number }>, state: ValidationState): boolean {\n if (!record(value)) return false;\n if (state.seen.has(value)) return false;\n state.seen.add(value);\n const candidate = value as Record<string, unknown>;\n if (!valueKind(candidate.kind) || !exactKeys(candidate, VALUE_KEYS[candidate.kind])) return false;\n if (!validateRef(candidate.ref, state, value)) return false;\n if (candidate.kind === 'NULL') { if (!addSyntax(state, 1)) return false; return candidate.lexeme === 'null' && candidate.value === null; }\n if (candidate.kind === 'BOOLEAN') { if (!addSyntax(state, 1)) return false; return typeof candidate.lexeme === 'string' && typeof candidate.value === 'boolean'; }\n if (candidate.kind === 'STRING') { if (!addSyntax(state, 1)) return false; return typeof candidate.lexeme === 'string' && typeof candidate.value === 'string'; }\n if (candidate.kind === 'NUMBER') { if (!addSyntax(state, 1)) return false; return typeof candidate.lexeme === 'string' && typeof candidate.value === 'number' && Number.isFinite(candidate.value); }\n if (candidate.kind === 'ARRAY') {\n if (!containerBudget(state, candidate.items, 1)) return false;\n state.syntaxNodes += 1 + candidate.items.length;\n state.units += candidate.items.length;\n for (let index = candidate.items.length - 1; index >= 0; index -= 1) pending.push({ value: candidate.items[index], depth: depth + 1 });\n return true;\n }\n if (candidate.kind !== 'OBJECT' || !containerBudget(state, candidate.members, 2)) return false;\n state.syntaxNodes += 1 + candidate.members.length * 2;\n state.units += candidate.members.length;\n const names = new Set<string>();\n for (let index = candidate.members.length - 1; index >= 0; index -= 1) {\n const member = candidate.members[index];\n if (!record(member) || !exactKeys(member, MEMBER_KEYS) || !record(member.value) || member.ref !== (member.value as Record<string, unknown>).ref ||\n typeof member.nameLexeme !== 'string' || typeof member.name !== 'string' || !Number.isSafeInteger(member.occurrence) || (member.occurrence as number) < 0 ||\n !validateRef(member.ref, state, member.value)) return false;\n if (names.has(member.name)) {\n state.duplicates += 1;\n if (state.duplicates > state.maxDuplicateKeys) return false;\n }\n names.add(member.name);\n pending.push({ value: member.value, depth: depth + 1 });\n }\n return true;\n}\n\ntype ValidationState = {\n seen: Set<object>;\n refs: Map<string, { owner: object; ref: object }>;\n units: number;\n syntaxNodes: number;\n duplicates: number;\n spans: number;\n depth: number;\n utf8Bytes: number;\n maxMembers: number;\n maxSyntaxNodes: number;\n maxDuplicateKeys: number;\n maxStoredSourceSpans: number;\n};\n\nfunction validateRef(value: unknown, state: ValidationState, owner: object): boolean {\n if (!record(value) || !exactKeys(value, REF_KEYS)) return false;\n const ref = value as Record<string, unknown>;\n if (typeof ref.pointer !== 'string' || (ref.pointer !== '' && !ref.pointer.startsWith('/')) || !dense(ref.occurrencePath) ||\n ref.occurrencePath.length > 10_000 || ref.occurrencePath.some((part) => !Number.isSafeInteger(part) || (part as number) < 0) || !hex(ref.astNodeId)) return false;\n const prior = state.refs.get(ref.astNodeId as string);\n if (ref.span === null) {\n if (prior !== undefined) return prior.owner === owner && prior.ref === value;\n state.refs.set(ref.astNodeId as string, { owner, ref: value });\n return true;\n }\n if (!record(ref.span) || !exactKeys(ref.span, SPAN_KEYS) || !position((ref.span as Record<string, unknown>).start) || !position((ref.span as Record<string, unknown>).end)) return false;\n const span = ref.span as Record<string, Record<string, unknown>>;\n const start = span.start;\n const end = span.end;\n if ((end.utf16Offset as number) < (start.utf16Offset as number) ||\n (end.utf8ByteOffset as number) < (start.utf8ByteOffset as number) ||\n (end.line as number) < (start.line as number) ||\n ((end.line as number) === (start.line as number) && (end.column as number) < (start.column as number)) ||\n (start.utf8ByteOffset as number) > state.utf8Bytes || (end.utf8ByteOffset as number) > state.utf8Bytes) return false;\n if (prior !== undefined) return prior.owner === owner && prior.ref === value;\n if (state.spans >= state.maxStoredSourceSpans) return false;\n state.refs.set(ref.astNodeId as string, { owner, ref: value });\n state.spans += 1;\n return true;\n}\n\nfunction addSyntax(state: ValidationState, amount: number): boolean {\n if (amount > state.maxSyntaxNodes - state.syntaxNodes) return false;\n state.syntaxNodes += amount;\n return true;\n}\n\nfunction containerBudget(state: ValidationState, value: unknown, syntaxMultiplier: number): value is readonly unknown[] {\n if (!Array.isArray(value) || !Number.isSafeInteger(value.length) || value.length < 0) return false;\n if (value.length > state.maxMembers - state.units) return false;\n const syntax = 1 + value.length * syntaxMultiplier;\n if (syntax > state.maxSyntaxNodes - state.syntaxNodes || !dense(value)) return false;\n return true;\n}\n\nfunction position(value: unknown): boolean {\n if (!record(value) || !exactKeys(value, POSITION_KEYS)) return false;\n return ['line', 'column', 'utf16Offset', 'utf8ByteOffset'].every((key) => Number.isSafeInteger((value as Record<string, unknown>)[key]) && ((value as Record<string, unknown>)[key] as number) >= (key === 'line' || key === 'column' ? 1 : 0));\n}\n\nfunction dense(value: unknown): value is readonly unknown[] {\n try {\n if (!Array.isArray(value) || !Object.isFrozen(value) || Object.getPrototypeOf(value) !== Array.prototype || Object.getOwnPropertySymbols(value).length > 0) return false;\n for (const name of Object.getOwnPropertyNames(value)) {\n if (name === 'length') continue;\n const index = Number(name);\n const descriptor = Object.getOwnPropertyDescriptor(value, name);\n if (!Number.isSafeInteger(index) || index < 0 || index >= value.length || String(index) !== name ||\n !descriptor || !Object.prototype.hasOwnProperty.call(descriptor, 'value')) return false;\n }\n for (let index = 0; index < value.length; index += 1) if (!Object.prototype.hasOwnProperty.call(value, index)) return false;\n return true;\n } catch {\n return false;\n }\n}\n\nfunction record(value: unknown): value is Record<string, unknown> {\n try {\n if (typeof value !== 'object' || value === null || Array.isArray(value) || !Object.isFrozen(value)) return false;\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) return false;\n if (Object.getOwnPropertySymbols(value).length > 0) return false;\n for (const name of Object.getOwnPropertyNames(value)) {\n const descriptor = Object.getOwnPropertyDescriptor(value, name);\n if (!descriptor || !Object.prototype.hasOwnProperty.call(descriptor, 'value')) return false;\n }\n return true;\n } catch {\n return false;\n }\n}\n\nfunction hex(value: unknown): value is string { return typeof value === 'string' && /^[0-9a-f]{64}$/.test(value); }\n\nconst DOCUMENT_KEYS = ['rawSha256', 'utf8Bytes', 'bom', 'root', 'duplicateCount', 'syntaxNodeCount'];\nconst MEMBER_KEYS = ['nameLexeme', 'name', 'occurrence', 'ref', 'value'];\nconst REF_KEYS = ['pointer', 'occurrencePath', 'astNodeId', 'span'];\nconst SPAN_KEYS = ['start', 'end'];\nconst POSITION_KEYS = ['line', 'column', 'utf16Offset', 'utf8ByteOffset'];\nconst VALUE_KEYS = {\n NULL: ['kind', 'lexeme', 'value', 'ref'], BOOLEAN: ['kind', 'lexeme', 'value', 'ref'],\n NUMBER: ['kind', 'lexeme', 'value', 'ref'], STRING: ['kind', 'lexeme', 'value', 'ref'],\n ARRAY: ['kind', 'ref', 'items'], OBJECT: ['kind', 'ref', 'members'],\n} as const;\n\nfunction valueKind(value: unknown): value is keyof typeof VALUE_KEYS {\n return typeof value === 'string' && Object.prototype.hasOwnProperty.call(VALUE_KEYS, value);\n}\n\nfunction exactKeys(value: object, expected: readonly string[]): boolean {\n const actual = Object.getOwnPropertyNames(value);\n return actual.length === expected.length && expected.every((key) => actual.includes(key));\n}\n", "import type { ScannerLimitsV2 } from '@hub/contracts';\nimport type { ReadonlySourceDocumentV2, SourceObjectMemberV2, SourceMemberRefV2 } from '../source/source-types';\nimport { resolveScannerLimits } from '../source/scanner-limit-resolution';\nimport { createAmbiguity, sortAmbiguities } from './ambiguity';\nimport { collectDuplicateAmbiguities } from './duplicate-ambiguities';\nimport { normalizeEdges } from './edge-normalization';\nimport { createNodeRef } from './node-edge-identity';\nimport { normalizeNodes } from './node-normalization';\nimport { semanticFields } from './semantic-fields';\nimport { digest, freeze, projectAmbiguities, projectWorkflow } from './workflow-digest';\nimport { validateSourceDocument } from './validate-source-document';\nimport type {\n NormalizationComplexityCause,\n NormalizationAmbiguityV2,\n EdgeRefV2,\n NodeRefV2,\n SecurityWorkflowResult,\n SecurityWorkflowV2,\n} from './security-workflow';\n\nconst TOO_COMPLEX_MESSAGES: Record<NormalizationComplexityCause, string> = {\n NODE_LIMIT: 'Workflow exceeds the configured node normalization limit.',\n RAW_EDGE_LIMIT: 'Workflow exceeds the configured raw edge normalization limit.',\n EDGE_LIMIT: 'Workflow exceeds the configured edge normalization limit.',\n CONNECTION_DEPTH_LIMIT: 'Workflow exceeds the configured connection depth limit.',\n PARAMETER_DEPTH_LIMIT: 'Workflow exceeds the configured parameter depth limit.',\n PARAMETER_LEAF_LIMIT: 'Workflow exceeds the configured parameter leaf limit.',\n};\n\nexport function normalizeSecurityWorkflow(source: unknown, partialLimits?: Partial<ScannerLimitsV2>): SecurityWorkflowResult {\n try {\n const limits = resolveLimits(partialLimits);\n if (!limits || !validateSourceDocument(source, limits)) return malformed();\n return normalizeSecurityWorkflowUnsafe(source as ReadonlySourceDocumentV2, limits);\n } catch {\n return malformed();\n }\n}\n\nfunction normalizeSecurityWorkflowUnsafe(source: ReadonlySourceDocumentV2, limits: ScannerLimitsV2): SecurityWorkflowResult {\n if (source.root.kind !== 'OBJECT') return malformed();\n const nodeMembers = membersNamed(source.root, 'nodes');\n const connectionMembers = membersNamed(source.root, 'connections');\n const nodesValue = nodeMembers[nodeMembers.length - 1]?.value;\n const connectionsValue = connectionMembers[connectionMembers.length - 1]?.value;\n if (!nodesValue || nodesValue.kind !== 'ARRAY' || !connectionsValue || connectionsValue.kind !== 'OBJECT') return malformed();\n const totalNodeOccurrences = nodeMembers.reduce((total, member) => total + (member.value.kind === 'ARRAY' ? member.value.items.length : 0), 0);\n if (totalNodeOccurrences > limits.maxNodes) return tooComplex('NODE_LIMIT');\n const allNodes = [] as ReturnType<typeof normalizeNodes>['nodes'];\n const allRefs = [] as NodeRefV2[];\n const nodeAmbiguities = [] as NormalizationAmbiguityV2[];\n let parameterDepth = 0;\n let parameterLeaves = 0;\n for (const member of nodeMembers) {\n if (member.value.kind !== 'ARRAY') continue;\n const nodeResult = normalizeNodes(member.value, limits, allRefs.length);\n if (nodeResult.error) return nodeResult.error === 'MALFORMED_WORKFLOW' ? malformed() : tooComplex(nodeResult.error);\n allNodes.push(...nodeResult.nodes);\n allRefs.push(...nodeResult.refs);\n nodeAmbiguities.push(...nodeResult.ambiguities);\n parameterDepth = Math.max(parameterDepth, nodeResult.parameterDepth);\n parameterLeaves += nodeResult.parameterLeaves;\n }\n const labels = labelsByValue(allRefs);\n const allEdges = [] as EdgeRefV2[];\n const edgeAmbiguities = [] as NormalizationAmbiguityV2[];\n let rawEdgesExamined = 0;\n let connectionDepth = 0;\n const relatedRefsBudget = { used: 0 };\n for (const member of connectionMembers) {\n if (member.value.kind !== 'OBJECT') continue;\n const edgeResult = normalizeEdges(member.value, allRefs, labels, limits, allEdges.length, rawEdgesExamined, relatedRefsBudget);\n if (edgeResult.error) return tooComplex(edgeResult.error);\n allEdges.push(...edgeResult.edges);\n edgeAmbiguities.push(...edgeResult.ambiguities);\n rawEdgesExamined = edgeResult.rawEdgesExamined;\n connectionDepth = Math.max(connectionDepth, edgeResult.connectionDepth);\n }\n const ambiguities = collectDuplicateAmbiguities(source);\n ambiguities.push(...duplicateLabelAmbiguities(nodeMembers, 'id'));\n ambiguities.push(...duplicateLabelAmbiguities(nodeMembers, 'name'));\n ambiguities.push(...nodeAmbiguities, ...edgeAmbiguities);\n const orderedAmbiguities = uniqueAmbiguities(ambiguities);\n const workflow: SecurityWorkflowV2 = Object.freeze({\n workflowFields: Object.freeze(semanticFields(source.root, 'ROOT')),\n nodes: Object.freeze(allNodes),\n edges: Object.freeze(allEdges),\n ambiguities: Object.freeze(orderedAmbiguities),\n });\n const ambiguitySha256 = digest(projectAmbiguities(orderedAmbiguities));\n const semanticSha256 = digest(projectWorkflow(workflow));\n return freeze({\n ok: true,\n workflow,\n semanticSha256,\n ambiguitySha256,\n ambiguityCount: orderedAmbiguities.length,\n counters: {\n nodesExamined: allRefs.length,\n rawEdgesExamined,\n edgesRetained: allEdges.length,\n connectionDepth,\n parameterDepth,\n parameterLeaves,\n },\n });\n}\n\nfunction malformed(): SecurityWorkflowResult {\n return Object.freeze({ ok: false, code: 'MALFORMED_WORKFLOW', message: 'Workflow shape is not valid for security normalization.' });\n}\n\nfunction tooComplex(cause: NormalizationComplexityCause): SecurityWorkflowResult {\n return Object.freeze({ ok: false, code: 'WORKFLOW_TOO_COMPLEX', cause, message: TOO_COMPLEX_MESSAGES[cause] });\n}\n\nfunction resolveLimits(partialLimits: Partial<ScannerLimitsV2> | undefined): ScannerLimitsV2 | undefined {\n return resolveScannerLimits(partialLimits);\n}\n\nfunction effectiveMember(value: Extract<ReadonlySourceDocumentV2['root'], { kind: 'OBJECT' }>, name: string): SourceObjectMemberV2 | undefined {\n for (let index = value.members.length - 1; index >= 0; index -= 1) if (value.members[index].name === name) return value.members[index];\n return undefined;\n}\n\nfunction membersNamed(value: Extract<ReadonlySourceDocumentV2['root'], { kind: 'OBJECT' }>, name: string): SourceObjectMemberV2[] {\n return value.members.filter((member) => member.name === name);\n}\n\nfunction labelsByValue(nodes: readonly NodeRefV2[]): Map<string, readonly NodeRefV2[]> {\n const labels = new Map<string, NodeRefV2[]>();\n for (const node of nodes) {\n if (node.name === undefined) continue;\n const existing = labels.get(node.name) ?? [];\n if (!existing.some((item) => item.ordinal === node.ordinal)) existing.push(node);\n labels.set(node.name, existing);\n }\n return labels;\n}\n\nfunction duplicateLabelAmbiguities(nodeMembers: readonly SourceObjectMemberV2[], key: 'id' | 'name'): NormalizationAmbiguityV2[] {\n const grouped = new Map<string, SourceMemberRefV2[]>();\n for (const nodesValue of nodeMembers) {\n if (nodesValue.value.kind !== 'ARRAY') continue;\n for (const node of nodesValue.value.items) {\n if (node.kind !== 'OBJECT') continue;\n const member = effectiveMember(node, key);\n if (!member || member.value.kind !== 'STRING') continue;\n const refs = grouped.get(member.value.value) ?? [];\n refs.push(member.ref);\n grouped.set(member.value.value, refs);\n }\n }\n return [...grouped.values()].filter((refs) => refs.length > 1).map((refs) => createAmbiguity({\n kind: 'AMBIGUOUS_NODE', subject: refs[0], related: refs.slice(1), securityImpact: 'GRAPH_IDENTITY', resolution: 'RETAINED_ALL',\n }));\n}\n\nfunction uniqueAmbiguities(items: readonly NormalizationAmbiguityV2[]): NormalizationAmbiguityV2[] {\n const unique = new Map<string, NormalizationAmbiguityV2>();\n for (const item of items) unique.set(item.ambiguityId, item);\n return sortAmbiguities([...unique.values()]);\n}\n", "export type StrictSemver = Readonly<{\n major: number;\n minor: number;\n patch: number;\n prerelease: readonly string[];\n build: readonly string[];\n}>;\n\n/** Alias matching the SemVer spelling used by some catalogue contracts. */\nexport type StrictSemVer = StrictSemver;\n\ntype SemverParts = Readonly<{\n major: string;\n minor: string;\n patch: string;\n prerelease: readonly string[];\n build: readonly string[];\n}>;\n\nconst NUMERIC = /^[0-9]+$/;\nconst parsedParts = new WeakMap<object, SemverParts>();\n\nfunction invalid(): TypeError {\n return new TypeError('Invalid strict SemVer 2.0.0 value');\n}\n\nfunction compareAscii(left: string, right: string): number {\n if (left === right) return 0;\n const length = Math.min(left.length, right.length);\n for (let index = 0; index < length; index += 1) {\n const difference = left.charCodeAt(index) - right.charCodeAt(index);\n if (difference !== 0) return difference < 0 ? -1 : 1;\n }\n return left.length < right.length ? -1 : 1;\n}\n\nfunction compareNumericStrings(left: string, right: string): number {\n if (left.length !== right.length) return left.length < right.length ? -1 : 1;\n return compareAscii(left, right);\n}\n\nfunction identifier(value: string, prerelease: boolean): string {\n if (!/^[0-9A-Za-z-]+$/.test(value)) throw invalid();\n if (prerelease && NUMERIC.test(value) && value.length > 1 && value[0] === '0') throw invalid();\n return value;\n}\n\nfunction numberPart(value: string): string {\n if (value.length > 1 && value[0] === '0') throw invalid();\n return value;\n}\nfunction isDigit(code: number): boolean { return code >= 48 && code <= 57; }\nfunction readNumber(input: string, index: number): { value: string; next: number } {\n const start = index;\n while (index < input.length && isDigit(input.charCodeAt(index))) index += 1;\n if (index === start) throw invalid();\n const value = input.slice(start, index); numberPart(value);\n return { value, next: index };\n}\nfunction readVersionIdentifiers(input: string, index: number, prerelease: boolean): { values: readonly string[]; next: number } {\n const values: string[] = [];\n while (true) {\n const start = index;\n while (index < input.length) {\n const code = input.charCodeAt(index);\n if (code === 46 || (prerelease && code === 43)) break;\n index += 1;\n }\n if (index === start) throw invalid();\n values.push(identifier(input.slice(start, index), prerelease));\n if (index >= input.length || input.charCodeAt(index) !== 46) return { values, next: index };\n index += 1;\n }\n}\nfunction parseParts(input: unknown): SemverParts {\n if (typeof input !== 'string') throw invalid();\n let index = 0;\n const major = readNumber(input, index);\n index = major.next;\n if (input.charCodeAt(index) !== 46) throw invalid();\n index += 1;\n const minor = readNumber(input, index);\n index = minor.next;\n if (input.charCodeAt(index) !== 46) throw invalid();\n index += 1;\n const patch = readNumber(input, index);\n index = patch.next;\n let prerelease: readonly string[] = [];\n if (input.charCodeAt(index) === 45) {\n const parsed = readVersionIdentifiers(input, index + 1, true);\n prerelease = parsed.values;\n index = parsed.next;\n }\n let build: readonly string[] = [];\n if (input.charCodeAt(index) === 43) {\n const parsed = readVersionIdentifiers(input, index + 1, false);\n build = parsed.values;\n index = parsed.next;\n }\n\n if (index !== input.length) throw invalid();\n return { major: major.value, minor: minor.value, patch: patch.value, prerelease, build };\n}\n\n/** Parse a strict, complete SemVer 2.0.0 string into immutable numeric parts. */\nexport function parseStrictSemver(input: unknown): StrictSemver {\n const parts = parseParts(input);\n const result = Object.freeze({\n major: Number(parts.major),\n minor: Number(parts.minor),\n patch: Number(parts.patch),\n prerelease: Object.freeze([...parts.prerelease]),\n build: Object.freeze([...parts.build]),\n });\n parsedParts.set(result, parts);\n return result;\n}\n\nfunction readIdentifiers(input: unknown, prerelease: boolean): readonly string[] {\n if (!Array.isArray(input) || Object.getPrototypeOf(input) !== Array.prototype) throw invalid();\n const names = Object.getOwnPropertyNames(input);\n if (names.length !== input.length + 1 || !names.includes('length')) throw invalid();\n if (Object.getOwnPropertySymbols(input).length !== 0) throw invalid();\n const result: string[] = [];\n for (let index = 0; index < input.length; index += 1) {\n const descriptor = Object.getOwnPropertyDescriptor(input, String(index));\n if (descriptor === undefined || !('value' in descriptor) || typeof descriptor.value !== 'string') throw invalid();\n result.push(identifier(descriptor.value, prerelease));\n }\n return result;\n}\n\nfunction readParts(input: unknown): SemverParts {\n if (input === null || typeof input !== 'object' || Array.isArray(input)) throw invalid();\n const known = parsedParts.get(input);\n if (known !== undefined) return known;\n if (Object.getPrototypeOf(input) !== Object.prototype && Object.getPrototypeOf(input) !== null) throw invalid();\n const names = Object.getOwnPropertyNames(input);\n const fields = ['major', 'minor', 'patch', 'prerelease', 'build'];\n if (names.length !== fields.length || fields.some((field) => !names.includes(field)) || Object.getOwnPropertySymbols(input).length !== 0) throw invalid();\n const read = (field: string): unknown => {\n const descriptor = Object.getOwnPropertyDescriptor(input, field);\n if (descriptor === undefined || !('value' in descriptor)) throw invalid();\n return descriptor.value;\n };\n const major = read('major');\n const minor = read('minor');\n const patch = read('patch');\n if (typeof major !== 'number' || !Number.isSafeInteger(major) || major < 0 || Object.is(major, -0) || typeof minor !== 'number' || !Number.isSafeInteger(minor) || minor < 0 || Object.is(minor, -0) || typeof patch !== 'number' || !Number.isSafeInteger(patch) || patch < 0 || Object.is(patch, -0)) throw invalid();\n return { major: String(major), minor: String(minor), patch: String(patch), prerelease: readIdentifiers(read('prerelease'), true), build: readIdentifiers(read('build'), false) };\n}\n\n/** Compare two parsed SemVer values; build metadata is intentionally ignored. */\nexport function compareSemver(left: StrictSemver, right: StrictSemver): number {\n try {\n const first = readParts(left);\n const second = readParts(right);\n for (const key of ['major', 'minor', 'patch'] as const) {\n const result = compareNumericStrings(first[key], second[key]);\n if (result !== 0) return result;\n }\n if (first.prerelease.length === 0 && second.prerelease.length === 0) return 0;\n if (first.prerelease.length === 0) return 1;\n if (second.prerelease.length === 0) return -1;\n const length = Math.min(first.prerelease.length, second.prerelease.length);\n for (let index = 0; index < length; index += 1) {\n const leftIdentifier = first.prerelease[index];\n const rightIdentifier = second.prerelease[index];\n const leftNumeric = NUMERIC.test(leftIdentifier);\n const rightNumeric = NUMERIC.test(rightIdentifier);\n if (leftNumeric && rightNumeric) {\n const result = compareNumericStrings(leftIdentifier, rightIdentifier);\n if (result !== 0) return result;\n } else if (leftNumeric !== rightNumeric) return leftNumeric ? -1 : 1;\n else {\n const result = compareAscii(leftIdentifier, rightIdentifier);\n if (result !== 0) return result;\n }\n }\n return first.prerelease.length === second.prerelease.length ? 0 : first.prerelease.length < second.prerelease.length ? -1 : 1;\n } catch (error) {\n if (error instanceof TypeError) throw error;\n throw invalid();\n }\n}\n\n/** Compare only MAJOR.MINOR.PATCH, preserving arbitrary-length numeric identifiers. */\nexport function sameSemverBase(left: StrictSemver, right: StrictSemver): boolean {\n try {\n const first = readParts(left);\n const second = readParts(right);\n return first.major === second.major && first.minor === second.minor && first.patch === second.patch;\n } catch (error) {\n if (error instanceof TypeError) throw error;\n throw invalid();\n }\n}\n", "import { sha256 } from '@noble/hashes/sha2.js';\nimport { bytesToHex } from '@noble/hashes/utils.js';\nimport { canonicalJsonBytes } from '../canonical-json';\nimport { parseStrictSemver } from './semver';\n\nexport type TargetContextV2 = Readonly<{\n n8nVersion?: string;\n edition: 'COMMUNITY' | 'ENTERPRISE' | 'CLOUD' | 'UNKNOWN';\n deployment: 'SELF_HOSTED' | 'CLOUD' | 'UNKNOWN';\n role: 'OWNER' | 'ADMIN' | 'MEMBER' | 'UNKNOWN';\n taskRunner: 'LEGACY' | 'NATIVE' | 'UNKNOWN';\n communityPackages: readonly Readonly<{ name: string; version?: string }>[];\n configuration: readonly Readonly<{ key: string; state: 'ENABLED' | 'DISABLED' | 'UNKNOWN' }>[];\n contextDigest: string;\n}>;\n\nexport type TargetContextValidationOptions = Readonly<{\n allowedConfigurationKeys?: ReadonlySet<string> | readonly string[];\n}>;\ntype Plain = Record<string, unknown>;\ntype Body = Omit<TargetContextV2, 'contextDigest'>;\nconst TOP = ['n8nVersion', 'edition', 'deployment', 'role', 'taskRunner', 'communityPackages', 'configuration', 'contextDigest'] as const;\nconst DIGEST = /^[0-9a-f]{64}$/;\nconst BAD_KEY = /[%\\\\]/;\nconst PACKAGE_NAME = /^(?:[a-z0-9][a-z0-9._-]*|@[a-z0-9][a-z0-9._-]*\\/[a-z0-9][a-z0-9._-]*)$/;\nconst MAX_TEXT_LENGTH = 4096;\nconst MAX_COLLECTION_ITEMS = 100_000;\nconst ENUMS = {\n edition: ['COMMUNITY', 'ENTERPRISE', 'CLOUD', 'UNKNOWN'],\n deployment: ['SELF_HOSTED', 'CLOUD', 'UNKNOWN'],\n role: ['OWNER', 'ADMIN', 'MEMBER', 'UNKNOWN'],\n taskRunner: ['LEGACY', 'NATIVE', 'UNKNOWN'],\n} as const;\n\nclass TargetContextError extends TypeError {}\nfunction invalid(reason: string): never { throw new TargetContextError(reason); }\nfunction has(value: Plain, key: string): boolean { return Object.prototype.hasOwnProperty.call(value, key); }\nfunction ownRecord(input: unknown, allowed: readonly string[], label: string): Plain {\n try {\n if (input === null || typeof input !== 'object' || Array.isArray(input)) return invalid(`UNSAFE_INPUT: ${label}`);\n const prototype = Object.getPrototypeOf(input);\n if (prototype !== Object.prototype && prototype !== null) return invalid(`UNSAFE_INPUT: ${label}`);\n const names = Object.getOwnPropertyNames(input);\n if (Object.getOwnPropertySymbols(input).length !== 0) return invalid(`UNSAFE_INPUT: ${label}`);\n for (const name of names) if (!allowed.includes(name)) return invalid(`UNKNOWN_KEY: ${label}.${name}`);\n const result: Plain = Object.create(null);\n for (const name of names) {\n const descriptor = Object.getOwnPropertyDescriptor(input, name);\n if (descriptor === undefined || !('value' in descriptor)) return invalid(`UNSAFE_INPUT: ${label}.${name}`);\n result[name] = descriptor.value;\n }\n return result;\n } catch (error) {\n if (error instanceof TargetContextError) throw error;\n return invalid(`UNSAFE_INPUT: ${label}`);\n }\n}\nfunction denseArray(input: unknown, label: string): readonly unknown[] {\n try {\n if (!Array.isArray(input) || Object.getPrototypeOf(input) !== Array.prototype) return invalid(`UNSAFE_INPUT: ${label}`);\n const length = Object.getOwnPropertyDescriptor(input, 'length');\n if (length === undefined || !('value' in length) || typeof length.value !== 'number' || !Number.isSafeInteger(length.value) || length.value < 0 || length.value > MAX_COLLECTION_ITEMS) return invalid(`UNSAFE_INPUT: ${label}`);\n const names = Object.getOwnPropertyNames(input);\n if (names.length !== length.value + 1 || !names.includes('length') || Object.getOwnPropertySymbols(input).length !== 0) return invalid(`UNSAFE_INPUT: ${label}`);\n const result: unknown[] = [];\n for (let index = 0; index < length.value; index += 1) {\n const descriptor = Object.getOwnPropertyDescriptor(input, String(index));\n if (descriptor === undefined || !('value' in descriptor)) return invalid(`UNSAFE_INPUT: ${label}[${index}]`);\n result.push(descriptor.value);\n }\n return result;\n } catch (error) {\n if (error instanceof TargetContextError) throw error;\n return invalid(`UNSAFE_INPUT: ${label}`);\n }\n}\nfunction safeText(value: unknown, label: string): string {\n if (typeof value !== 'string' || value.length === 0 || value.length > MAX_TEXT_LENGTH || value !== value.normalize('NFC') || BAD_KEY.test(value)) return invalid(`INVALID_TEXT: ${label}`);\n for (let index = 0; index < value.length; index += 1) {\n const code = value.charCodeAt(index);\n if (code <= 0x1f || code === 0x7f) return invalid(`INVALID_TEXT: ${label}`);\n if (code >= 0xd800 && code <= 0xdbff) {\n const next = value.charCodeAt(index + 1);\n if (!(next >= 0xdc00 && next <= 0xdfff)) return invalid(`INVALID_TEXT: ${label}`);\n index += 1;\n } else if (code >= 0xdc00 && code <= 0xdfff) return invalid(`INVALID_TEXT: ${label}`);\n }\n return value;\n}\nfunction packageName(value: unknown): string {\n const name = safeText(value, 'package.name');\n if (name.length > 214 || !PACKAGE_NAME.test(name)) return invalid('INVALID_PACKAGE_NAME');\n return name;\n}\nfunction compareCodePoints(left: string, right: string): number {\n if (left === right) return 0;\n const a = [...left], b = [...right];\n for (let index = 0; index < Math.min(a.length, b.length); index += 1) { const difference = a[index].codePointAt(0)! - b[index].codePointAt(0)!; if (difference !== 0) return difference < 0 ? -1 : 1; }\n return a.length < b.length ? -1 : 1;\n}\nfunction allowedKeys(options?: TargetContextValidationOptions): ReadonlySet<string> | undefined {\n if (options === undefined) return undefined;\n const safeOptions = ownRecord(options, ['allowedConfigurationKeys'], 'options');\n const candidate = has(safeOptions, 'allowedConfigurationKeys') ? safeOptions.allowedConfigurationKeys : undefined;\n if (candidate === undefined) return undefined;\n const values = Array.isArray(candidate) ? denseArray(candidate, 'allowedConfigurationKeys') : candidate instanceof Set ? setValues(candidate) : invalid('UNSAFE_INPUT: allowedConfigurationKeys');\n const result = new Set<string>();\n for (const value of values) { const key = safeText(value, 'allowedConfigurationKeys'); if (result.has(key)) return invalid('DUPLICATE_CONFIGURATION_KEY'); result.add(key); }\n return result;\n}\nfunction setValues(value: Set<unknown>): readonly unknown[] {\n const result: unknown[] = [];\n Set.prototype.forEach.call(value, (item) => result.push(item));\n return result;\n}\nfunction enumValue(value: Plain, key: keyof typeof ENUMS): string {\n if (!has(value, key)) return 'UNKNOWN';\n if (typeof value[key] !== 'string' || !(ENUMS[key] as readonly string[]).includes(value[key] as string)) return invalid(`INVALID_${key.toUpperCase()}`);\n return value[key] as string;\n}\nfunction body(input: unknown, options?: TargetContextValidationOptions): Body {\n const value = ownRecord(input, TOP, 'target');\n const output: Plain = {};\n if (has(value, 'n8nVersion')) { if (typeof value.n8nVersion !== 'string') return invalid('INVALID_N8N_VERSION'); try { parseStrictSemver(value.n8nVersion); } catch { return invalid('INVALID_N8N_VERSION'); } output.n8nVersion = value.n8nVersion; }\n output.edition = enumValue(value, 'edition'); output.deployment = enumValue(value, 'deployment'); output.role = enumValue(value, 'role'); output.taskRunner = enumValue(value, 'taskRunner');\n const packages = has(value, 'communityPackages') ? denseArray(value.communityPackages, 'communityPackages') : [];\n const packageNames = new Set<string>();\n output.communityPackages = packages.map((raw, index) => { const item = ownRecord(raw, ['name', 'version'], `communityPackages[${index}]`); if (!has(item, 'name')) return invalid('MISSING_KEY: package.name'); const name = packageName(item.name); if (packageNames.has(name)) return invalid('DUPLICATE_PACKAGE'); packageNames.add(name); const result: Plain = { name }; if (has(item, 'version')) { if (typeof item.version !== 'string') return invalid('INVALID_PACKAGE_VERSION'); try { parseStrictSemver(item.version); } catch { return invalid('INVALID_PACKAGE_VERSION'); } result.version = item.version; } return result; }).sort((left, right) => compareCodePoints(left.name as string, right.name as string) || compareCodePoints((left.version as string | undefined) ?? '', (right.version as string | undefined) ?? ''));\n const vocabulary = allowedKeys(options);\n const configs = has(value, 'configuration') ? denseArray(value.configuration, 'configuration') : [];\n const configKeys = new Set<string>();\n output.configuration = configs.map((raw, index) => { const item = ownRecord(raw, ['key', 'state'], `configuration[${index}]`); if (!has(item, 'key')) return invalid('MISSING_KEY: configuration.key'); const key = safeText(item.key, 'configuration.key'); if (vocabulary && !vocabulary.has(key)) return invalid('UNKNOWN_CONFIGURATION_KEY'); if (configKeys.has(key)) return invalid('DUPLICATE_CONFIGURATION_KEY'); configKeys.add(key); const state = has(item, 'state') ? item.state : 'UNKNOWN'; if (typeof state !== 'string' || !['ENABLED', 'DISABLED', 'UNKNOWN'].includes(state)) return invalid('INVALID_CONFIGURATION_STATE'); return { key, state } as Plain; }).sort((left, right) => compareCodePoints(left.key as string, right.key as string) || compareCodePoints(left.state as string, right.state as string));\n return output as Body;\n}\nfunction digestBody(value: Body): string { return bytesToHex(sha256(canonicalJsonBytes(value))); }\nfunction freeze<T>(value: T, seen = new WeakSet<object>()): T { if (value !== null && typeof value === 'object') { if (seen.has(value)) return value; seen.add(value); for (const key of Object.getOwnPropertyNames(value)) freeze((value as Plain)[key], seen); Object.freeze(value); } return value; }\n\nexport function createTargetDigest(targetWithoutDigest: Omit<TargetContextV2, 'contextDigest'>): string {\n return digestBody(body(targetWithoutDigest));\n}\nexport function validateTargetContextV2(input: unknown, options?: TargetContextValidationOptions): TargetContextV2 {\n try {\n const normalized = body(input, options); const digest = digestBody(normalized); const value = ownRecord(input, TOP, 'target');\n if (has(value, 'contextDigest')) { if (typeof value.contextDigest !== 'string' || !DIGEST.test(value.contextDigest)) return invalid('INVALID_CONTEXT_DIGEST'); if (value.contextDigest !== digest) return invalid('CONTEXT_DIGEST_MISMATCH'); }\n return freeze({ ...normalized, contextDigest: digest }) as TargetContextV2;\n } catch (error) { if (error instanceof TargetContextError) throw error; return invalid('UNSAFE_INPUT'); }\n}\n", "import { compareSemver, parseStrictSemver, sameSemverBase, type StrictSemver } from './semver';\n\nexport type VersionOperator = 'EQ' | 'LT' | 'LTE' | 'GT' | 'GTE';\nexport type VersionComparatorV2 = Readonly<{ op: VersionOperator; version: string }>;\nexport type VersionRangeV2 = Readonly<{ clauses: readonly (readonly VersionComparatorV2[])[] }>;\n\nconst operators: Readonly<Record<VersionOperator, number>> = { EQ: 0, LT: 1, LTE: 2, GT: 3, GTE: 4 };\nconst validOperators: Readonly<Record<VersionOperator, true>> = { EQ: true, LT: true, LTE: true, GT: true, GTE: true };\n\ntype CheckedComparator = Readonly<{ value: VersionComparatorV2; parsed: StrictSemver }>;\ntype CheckedClause = readonly CheckedComparator[];\n\nfunction invalid(): TypeError {\n return new TypeError('Invalid or noncanonical comparator version range');\n}\n\nfunction asciiCompare(left: string, right: string): number {\n if (left === right) return 0;\n const length = Math.min(left.length, right.length);\n for (let index = 0; index < length; index += 1) {\n const difference = left.charCodeAt(index) - right.charCodeAt(index);\n if (difference !== 0) return difference < 0 ? -1 : 1;\n }\n return left.length < right.length ? -1 : 1;\n}\n\nfunction ownRecord(input: unknown, fields: readonly string[]): Record<string, unknown> {\n if (input === null || typeof input !== 'object' || Array.isArray(input)) throw invalid();\n const prototype = Object.getPrototypeOf(input);\n if (prototype !== Object.prototype && prototype !== null) throw invalid();\n const names = Object.getOwnPropertyNames(input);\n if (names.length !== fields.length || fields.some((field) => !names.includes(field)) || Object.getOwnPropertySymbols(input).length !== 0) throw invalid();\n const result: Record<string, unknown> = {};\n for (const field of fields) {\n const descriptor = Object.getOwnPropertyDescriptor(input, field);\n if (descriptor === undefined || !('value' in descriptor)) throw invalid();\n result[field] = descriptor.value;\n }\n return result;\n}\n\nfunction denseArray(input: unknown): readonly unknown[] {\n if (!Array.isArray(input) || Object.getPrototypeOf(input) !== Array.prototype) throw invalid();\n const length = Object.getOwnPropertyDescriptor(input, 'length');\n if (length === undefined || !('value' in length) || typeof length.value !== 'number' || !Number.isSafeInteger(length.value) || length.value < 0) throw invalid();\n const names = Object.getOwnPropertyNames(input);\n if (names.length !== length.value + 1 || !names.includes('length') || Object.getOwnPropertySymbols(input).length !== 0) throw invalid();\n const result: unknown[] = [];\n for (let index = 0; index < length.value; index += 1) {\n const descriptor = Object.getOwnPropertyDescriptor(input, String(index));\n if (descriptor === undefined || !('value' in descriptor)) throw invalid();\n result.push(descriptor.value);\n }\n return result;\n}\n\nfunction comparator(input: unknown): CheckedComparator {\n const value = ownRecord(input, ['op', 'version']);\n if (typeof value.op !== 'string' || !Object.prototype.hasOwnProperty.call(validOperators, value.op) || typeof value.version !== 'string') throw invalid();\n const parsed = parseStrictSemver(value.version);\n return { value: { op: value.op as VersionOperator, version: value.version }, parsed };\n}\n\nfunction compareComparator(left: CheckedComparator, right: CheckedComparator): number {\n const byVersion = compareSemver(left.parsed, right.parsed);\n if (byVersion !== 0) return byVersion;\n const byText = asciiCompare(left.value.version, right.value.version);\n if (byText !== 0) return byText;\n return operators[left.value.op] - operators[right.value.op];\n}\n\nfunction compareClause(left: CheckedClause, right: CheckedClause): number {\n const length = Math.min(left.length, right.length);\n for (let index = 0; index < length; index += 1) {\n const result = compareComparator(left[index], right[index]);\n if (result !== 0) return result;\n }\n return left.length === right.length ? 0 : left.length < right.length ? -1 : 1;\n}\n\ntype CheckedRange = Readonly<{ range: VersionRangeV2; clauses: readonly CheckedClause[] }>;\n\nfunction checkedRange(input: unknown): CheckedRange {\n const value = ownRecord(input, ['clauses']);\n const rawClauses = denseArray(value.clauses);\n const checked: CheckedClause[] = [];\n for (const rawClause of rawClauses) {\n const rawComparators = denseArray(rawClause);\n if (rawComparators.length === 0) throw invalid();\n const clause = rawComparators.map(comparator);\n for (let index = 1; index < clause.length; index += 1) if (compareComparator(clause[index - 1], clause[index]) >= 0) throw invalid();\n checked.push(Object.freeze(clause));\n }\n for (let index = 1; index < checked.length; index += 1) if (compareClause(checked[index - 1], checked[index]) >= 0) throw invalid();\n const clauses = checked.map((clause) => Object.freeze(clause.map((item) => Object.freeze({ ...item.value }))));\n return Object.freeze({ range: Object.freeze({ clauses: Object.freeze(clauses) }), clauses: Object.freeze(checked) });\n}\n\n/** Validate a closed, sorted comparator-clause range and return immutable data. */\nexport function validateVersionRange(input: unknown): VersionRangeV2 {\n try {\n return checkedRange(input).range;\n } catch (error) {\n if (error instanceof TypeError) throw error;\n throw invalid();\n }\n}\n\nfunction candidateHasPrerelease(version: StrictSemver): boolean {\n compareSemver(version, version);\n if (version === null || typeof version !== 'object' || Array.isArray(version)) throw invalid();\n const prerelease = Object.getOwnPropertyDescriptor(version, 'prerelease');\n if (prerelease === undefined || !('value' in prerelease) || !Array.isArray(prerelease.value)) throw invalid();\n const length = Object.getOwnPropertyDescriptor(prerelease.value, 'length');\n if (length === undefined || !('value' in length) || typeof length.value !== 'number' || !Number.isSafeInteger(length.value) || length.value < 0) throw invalid();\n return length.value > 0;\n}\n\nfunction satisfies(version: StrictSemver, comparatorValue: CheckedComparator): boolean {\n const comparison = compareSemver(version, comparatorValue.parsed);\n switch (comparatorValue.value.op) {\n case 'EQ': return comparison === 0;\n case 'LT': return comparison < 0;\n case 'LTE': return comparison <= 0;\n case 'GT': return comparison > 0;\n case 'GTE': return comparison >= 0;\n }\n}\n\n/** Match a parsed version against a validated canonical range. */\nexport function matchesVersionRange(version: StrictSemver, range: VersionRangeV2): boolean {\n try {\n const candidate = version;\n const candidatePrerelease = candidateHasPrerelease(candidate);\n const checked = checkedRange(range);\n if (checked.clauses.length === 0) return !candidatePrerelease;\n return checked.clauses.some((clause) => {\n if (candidatePrerelease && !clause.some((item) => item.parsed.prerelease.length > 0 && sameSemverBase(candidate, item.parsed))) return false;\n return clause.every((item) => satisfies(candidate, item));\n });\n } catch (error) {\n if (error instanceof TypeError) throw error;\n throw invalid();\n }\n}\n", "import { sha256 } from '@noble/hashes/sha2.js';\nimport { bytesToHex } from '@noble/hashes/utils.js';\nimport { canonicalJsonBytes, canonicalizeJson } from '../canonical-json';\nimport { validateVersionRange, matchesVersionRange, type VersionRangeV2 } from './version-range';\nimport { parseStrictSemver, type StrictSemver } from './semver';\nimport type {\n ResolvedNodeSemanticsV2, SemanticAuthenticationV2, SemanticCatalogueBodyV2, SemanticCatalogueV2, SemanticEndpointV2,\n SemanticEffectV2, SemanticPathV2, SemanticPortV2, SemanticProvenanceV2,\n} from './catalogue-schema';\n\ntype Dict = Record<string, unknown>;\nexport type SemanticCatalogueErrorCode = 'UNSAFE_INPUT' | 'UNKNOWN_KEY' | 'MISSING_KEY' | 'INVALID_SCHEMA_VERSION' | 'INVALID_VERSION' | 'INVALID_TEXT' | 'INVALID_ENUM' | 'INVALID_RANGE' | 'INVALID_PROVENANCE' | 'INVALID_AUTHENTICATION' | 'DUPLICATE_ID' | 'DUPLICATE_RECORD' | 'DUPLICATE_CONFIGURATION_KEY' | 'DIGEST_MISMATCH' | 'SEMANTIC_CATALOGUE_AMBIGUOUS';\nexport class SemanticCatalogueAdmissionError extends TypeError {\n readonly code: SemanticCatalogueErrorCode;\n constructor(code: SemanticCatalogueErrorCode, label?: string) { super(`${code}${label ? `: ${label}` : ''}`); this.name = 'SemanticCatalogueAdmissionError'; this.code = code; }\n}\nconst TOP = ['schemaVersion', 'id', 'version', 'records', 'configurationKeys', 'digest'] as const;\nconst RECORD = ['semanticId', 'nodeType', 'versionRange', 'operation', 'entry', 'parameterPaths', 'authentication', 'credentialPaths', 'destinationPaths', 'effects', 'endpoints', 'ports', 'overwritePaths', 'errorMode', 'retryMode', 'disabledMode', 'provenance'] as const;\nconst PROVENANCE = ['sourceUrl', 'sourceDigest', 'reviewedAt', 'reviewer'] as const;\nconst MAX_ITEMS = 100_000;\nconst MAX_TEXT = 4_096;\nconst DIGEST = /^[0-9a-f]{64}$/;\nconst REVIEWED_AT = /^(\\d{4})-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])(?:T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d{1,3})?Z)?$/;\nconst enums = {\n entry: ['TRIGGER', 'MANUAL', 'SUBWORKFLOW', 'NONE'], valueType: ['ANY', 'STRING', 'BOOLEAN', 'NUMBER', 'OBJECT', 'ARRAY'],\n effect: ['READ_EXTERNAL', 'WRITE_EXTERNAL', 'EXECUTE_CODE', 'EXECUTE_COMMAND', 'READ_FILE', 'WRITE_FILE', 'DATABASE_READ', 'DATABASE_WRITE', 'SEND_MESSAGE', 'CALL_TOOL', 'START_SUBWORKFLOW'],\n channel: ['DATA', 'CONTROL', 'ERROR', 'MODEL', 'TOOL', 'CONTEXT'], direction: ['SOURCE', 'SINK', 'SANITIZER'], taint: ['CONFIDENTIALITY', 'INTEGRITY', 'BOTH'],\n itemMode: ['EACH', 'ALL', 'PAIRWISE', 'UNKNOWN'], errorMode: ['STOP', 'CONTINUE', 'OUTPUT', 'UNKNOWN'], retryMode: ['NONE', 'BOUNDED', 'PLATFORM', 'UNKNOWN'], disabledMode: ['SKIP', 'UNKNOWN'], unknownValueEffect: ['UNKNOWN', 'EXPOSED'],\n} as const;\nconst has = (value: Dict, key: string): boolean => Object.prototype.hasOwnProperty.call(value, key);\nfunction fail(code: SemanticCatalogueErrorCode, label?: string): never { throw new SemanticCatalogueAdmissionError(code, label); }\nfunction own(input: unknown, allowed: readonly string[], label: string): Dict {\n try {\n if (input === null || typeof input !== 'object' || Array.isArray(input)) return fail('UNSAFE_INPUT', label);\n const proto = Object.getPrototypeOf(input); if (proto !== Object.prototype && proto !== null) return fail('UNSAFE_INPUT', label);\n const names = Object.getOwnPropertyNames(input); if (Object.getOwnPropertySymbols(input).length !== 0) return fail('UNSAFE_INPUT', label);\n for (const name of names) if (!allowed.includes(name)) return fail('UNKNOWN_KEY', `${label}.${name}`);\n const output: Dict = Object.create(null);\n for (const name of names) { const descriptor = Object.getOwnPropertyDescriptor(input, name); if (!descriptor || !('value' in descriptor)) return fail('UNSAFE_INPUT', `${label}.${name}`); output[name] = descriptor.value; }\n return output;\n } catch (error) { if (error instanceof SemanticCatalogueAdmissionError) throw error; return fail('UNSAFE_INPUT', label); }\n}\nfunction required(value: Dict, keys: readonly string[], label: string): void { for (const key of keys) if (!has(value, key)) fail('MISSING_KEY', `${label}.${key}`); }\nfunction dense(input: unknown, label: string): unknown[] {\n try {\n if (!Array.isArray(input) || Object.getPrototypeOf(input) !== Array.prototype) return fail('UNSAFE_INPUT', label);\n const length = Object.getOwnPropertyDescriptor(input, 'length'); if (!length || !('value' in length) || typeof length.value !== 'number' || !Number.isSafeInteger(length.value) || length.value < 0 || length.value > MAX_ITEMS) return fail('UNSAFE_INPUT', label);\n const names = Object.getOwnPropertyNames(input); if (names.length !== length.value + 1 || Object.getOwnPropertySymbols(input).length !== 0) return fail('UNSAFE_INPUT', label);\n for (const name of names) if (name !== 'length' && (!/^(0|[1-9]\\d*)$/.test(name) || Number(name) >= length.value)) return fail('UNSAFE_INPUT', label);\n const output: unknown[] = []; for (let index = 0; index < length.value; index += 1) { const descriptor = Object.getOwnPropertyDescriptor(input, String(index)); if (!descriptor || !('value' in descriptor)) return fail('UNSAFE_INPUT', `${label}[${index}]`); output.push(descriptor.value); } return output;\n } catch (error) { if (error instanceof SemanticCatalogueAdmissionError) throw error; return fail('UNSAFE_INPUT', label); }\n}\nfunction text(input: unknown, label: string, maximum = MAX_TEXT, allowEmpty = false): string {\n if (typeof input !== 'string' || (!allowEmpty && input.length === 0) || input.length > maximum || input !== input.normalize('NFC')) return fail('INVALID_TEXT', label);\n for (let index = 0; index < input.length; index += 1) { const code = input.charCodeAt(index); if (code <= 0x1f || code >= 0x7f && code <= 0x9f) return fail('INVALID_TEXT', label); if (code >= 0xd800 && code <= 0xdbff) { const next = input.charCodeAt(index + 1); if (next < 0xdc00 || next > 0xdfff) return fail('INVALID_TEXT', label); index += 1; } else if (code >= 0xdc00 && code <= 0xdfff) return fail('INVALID_TEXT', label); }\n if (new TextEncoder().encode(input).length > maximum) return fail('INVALID_TEXT', label); return input;\n}\nfunction enumValue<T extends string>(input: unknown, values: readonly T[], label: string): T { if (typeof input !== 'string' || !values.includes(input as T)) return fail('INVALID_ENUM', label); return input as T; }\nfunction pointer(input: unknown, label: string): string { const value = text(input, label, 2_048, true); if (!/^(?:|\\/(?:[^~]|~0|~1)*)$/.test(value)) return fail('INVALID_TEXT', label); return value; }\nfunction compare(left: string, right: string): number { return left === right ? 0 : left < right ? -1 : 1; }\nfunction sortedUnique(values: string[], label: string): readonly string[] { const unique = new Set(values); if (unique.size !== values.length) return fail(label === 'configurationKeys' ? 'DUPLICATE_CONFIGURATION_KEY' : 'DUPLICATE_RECORD', label); return Object.freeze([...unique].sort()); }\nfunction baseText(value: StrictSemver): string { return `${value.major}.${value.minor}.${value.patch}`; }\nfunction versionText(value: StrictSemver): string {\n const prerelease = value.prerelease.length ? `-${value.prerelease.join('.')}` : '';\n const build = value.build.length ? `+${value.build.join('.')}` : '';\n return `${baseText(value)}${prerelease}${build}`;\n}\nfunction addPrereleaseSamples(result: Set<string>, value: StrictSemver): void {\n if (value.prerelease.length === 0) return;\n const base = baseText(value); const ids = [...value.prerelease];\n result.add(versionText(value));\n for (let index = 0; index < ids.length; index += 1) {\n const item = ids[index];\n if (/^\\d+$/.test(item)) {\n const number = Number(item);\n if (Number.isSafeInteger(number)) {\n if (number > 0) result.add(`${base}-${ids.slice(0, index).concat(String(number - 1)).join('.')}`);\n if (number < Number.MAX_SAFE_INTEGER) result.add(`${base}-${ids.slice(0, index).concat(String(number + 1)).join('.')}`);\n }\n } else {\n for (const replacement of ['a', 'b', 'z']) result.add(`${base}-${ids.slice(0, index).concat(replacement).join('.')}`);\n }\n for (const suffix of ['0', '1', 'z']) result.add(`${base}-${ids.slice(0, index + 1).concat(suffix).join('.')}`);\n }\n}\nfunction addVersionSamples(result: Set<string>, value: StrictSemver): void {\n const base = baseText(value);\n result.add(versionText(value)); result.add(base); result.add(`${base}-0`); result.add(`${base}-z`); addPrereleaseSamples(result, value);\n if (value.patch < Number.MAX_SAFE_INTEGER) result.add(`${value.major}.${value.minor}.${value.patch + 1}`);\n if (value.minor < Number.MAX_SAFE_INTEGER) result.add(`${value.major}.${value.minor + 1}.0`);\n if (value.major < Number.MAX_SAFE_INTEGER) result.add(`${value.major + 1}.0.0`);\n if (value.patch > 0) result.add(`${value.major}.${value.minor}.${value.patch - 1}`);\n if (value.minor > 0) result.add(`${value.major}.${value.minor - 1}.0`);\n if (value.major > 0) result.add(`${value.major - 1}.0.0`);\n}\nfunction rangeSamples(left: VersionRangeV2, right: VersionRangeV2): readonly string[] {\n const result = new Set(['0.0.0', '1.0.0', '2.0.0', '999999.0.0']);\n for (const range of [left, right]) for (const clause of range.clauses) for (const item of clause) addVersionSamples(result, parseStrictSemver(item.version));\n return [...result];\n}\nfunction subset(left: VersionRangeV2, right: VersionRangeV2): boolean {\n let rightOnly = false;\n for (const textValue of rangeSamples(left, right)) { const value = parseStrictSemver(textValue); const leftMatch = matchesVersionRange(value, left); const rightMatch = matchesVersionRange(value, right); if (leftMatch && !rightMatch) return false; if (rightMatch && !leftMatch) rightOnly = true; }\n return rightOnly;\n}\nfunction overlap(left: VersionRangeV2, right: VersionRangeV2): boolean {\n return rangeSamples(left, right).some((textValue) => {\n const value = parseStrictSemver(textValue);\n return matchesVersionRange(value, left) && matchesVersionRange(value, right);\n });\n}\n\nfunction stringList(input: unknown, label: string, isPointer = false): readonly string[] { const values = dense(input, label).map((item, index) => isPointer ? pointer(item, `${label}[${index}]`) : text(item, `${label}[${index}]`)); return sortedUnique(values, label); }\nfunction path(input: unknown, label: string): SemanticPathV2 { const value = own(input, ['pointer', 'valueType', 'required'], label); required(value, ['pointer', 'valueType', 'required'], label); return Object.freeze({ pointer: pointer(value.pointer, `${label}.pointer`), valueType: enumValue(value.valueType, enums.valueType, `${label}.valueType`), required: typeof value.required === 'boolean' ? value.required : fail('INVALID_TEXT', `${label}.required`) }); }\nfunction paths(input: unknown, label: string): readonly SemanticPathV2[] {\n const output = dense(input, label).map((item, index) => path(item, `${label}[${index}]`));\n const keys = output.map((item) => canonicalizeJson(item));\n if (new Set(keys).size !== keys.length) return fail('DUPLICATE_RECORD', label);\n return Object.freeze(output.sort((a, b) => compare(canonicalizeJson(a), canonicalizeJson(b))));\n}\nfunction authentication(input: unknown, label: string): SemanticAuthenticationV2 | null {\n if (input === null) return null;\n const value = own(input, ['path', 'noneValues', 'authenticatedValues', 'unknownValueEffect'], label);\n required(value, ['path', 'noneValues', 'authenticatedValues', 'unknownValueEffect'], label);\n const noneValues = stringList(value.noneValues, `${label}.noneValues`);\n const authenticatedValues = stringList(value.authenticatedValues, `${label}.authenticatedValues`);\n if (noneValues.some((item) => authenticatedValues.includes(item))) return fail('INVALID_AUTHENTICATION', label);\n return Object.freeze({ path: pointer(value.path, `${label}.path`), noneValues, authenticatedValues, unknownValueEffect: enumValue(value.unknownValueEffect, enums.unknownValueEffect, `${label}.unknownValueEffect`) });\n}\nfunction endpoint(input: unknown, label: string): SemanticEndpointV2 { const value = own(input, ['path', 'channel', 'direction', 'taint', 'scope'], label); required(value, ['path', 'channel', 'direction', 'taint'], label); const result: Dict = { path: pointer(value.path, `${label}.path`), channel: enumValue(value.channel, enums.channel, `${label}.channel`), direction: enumValue(value.direction, enums.direction, `${label}.direction`), taint: enumValue(value.taint, enums.taint, `${label}.taint`) }; if (has(value, 'scope')) result.scope = text(value.scope, `${label}.scope`); return Object.freeze(result) as SemanticEndpointV2; }\nfunction endpoints(input: unknown, label: string): readonly SemanticEndpointV2[] { const output = dense(input, label).map((item, index) => endpoint(item, `${label}[${index}]`)); const keys = output.map((item) => canonicalizeJson(item)); if (new Set(keys).size !== keys.length) return fail('DUPLICATE_RECORD', label); return Object.freeze(output.sort((a, b) => compare(canonicalizeJson(a), canonicalizeJson(b)))); }\nfunction ports(input: unknown, label: string): readonly SemanticPortV2[] { const output = dense(input, label).map((item, index) => { const value = own(item, ['type', 'index', 'itemMode'], `${label}[${index}]`); required(value, ['type', 'index', 'itemMode'], `${label}[${index}]`); if (typeof value.index !== 'number' || !Number.isSafeInteger(value.index) || value.index < 0) return fail('INVALID_TEXT', `${label}[${index}].index`); return Object.freeze({ type: text(value.type, `${label}[${index}].type`, 256), index: value.index, itemMode: enumValue(value.itemMode, enums.itemMode, `${label}[${index}].itemMode`) }); }); const keys = output.map((item) => canonicalizeJson(item)); if (new Set(keys).size !== keys.length) return fail('DUPLICATE_RECORD', label); return Object.freeze(output.sort((a, b) => compare(canonicalizeJson(a), canonicalizeJson(b)))); }\nfunction reviewedAt(input: unknown, label: string): string {\n const value = text(input, label, 24);\n const match = REVIEWED_AT.exec(value);\n if (!match) return fail('INVALID_PROVENANCE', label);\n const year = Number(match[1]); const month = Number(match[2]); const day = Number(match[3]);\n const leap = year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);\n const days = month === 2 ? (leap ? 29 : 28) : [4, 6, 9, 11].includes(month) ? 30 : 31;\n if (day > days) return fail('INVALID_PROVENANCE', label);\n return value;\n}\nfunction provenance(input: unknown, label: string): SemanticProvenanceV2 { const value = own(input, PROVENANCE, label); required(value, PROVENANCE, label); const sourceUrl = text(value.sourceUrl, `${label}.sourceUrl`, 2_048); try { const parsed = new URL(sourceUrl); if (parsed.protocol !== 'https:' || parsed.username || parsed.password || !parsed.hostname) return fail('INVALID_PROVENANCE', `${label}.sourceUrl`); } catch { return fail('INVALID_PROVENANCE', `${label}.sourceUrl`); } const sourceDigest = text(value.sourceDigest, `${label}.sourceDigest`, 64); if (!DIGEST.test(sourceDigest)) return fail('INVALID_PROVENANCE', `${label}.sourceDigest`); return Object.freeze({ sourceUrl, sourceDigest, reviewedAt: reviewedAt(value.reviewedAt, `${label}.reviewedAt`), reviewer: text(value.reviewer, `${label}.reviewer`) }); }\nfunction nodeType(input: unknown, label: string): string { const value = text(input, label, 512); if (value !== '*' && !/^@?[A-Za-z0-9][A-Za-z0-9._/@-]*\\.[A-Za-z0-9_$-]+$/.test(value)) return fail('INVALID_TEXT', label); return value; }\nfunction record(input: unknown, label: string): ResolvedNodeSemanticsV2 { const value = own(input, RECORD, label); required(value, RECORD, label); const operation = value.operation === null ? null : text(value.operation, `${label}.operation`, 256); const range = (() => { try { return validateVersionRange(value.versionRange); } catch { return fail('INVALID_RANGE', `${label}.versionRange`); } })(); const result: Dict = { semanticId: text(value.semanticId, `${label}.semanticId`, 512), nodeType: nodeType(value.nodeType, `${label}.nodeType`), versionRange: range, operation, entry: enumValue(value.entry, enums.entry, `${label}.entry`), parameterPaths: paths(value.parameterPaths, `${label}.parameterPaths`), authentication: authentication(value.authentication, `${label}.authentication`), credentialPaths: stringList(value.credentialPaths, `${label}.credentialPaths`, true), destinationPaths: stringList(value.destinationPaths, `${label}.destinationPaths`, true), effects: sortedUnique(dense(value.effects, `${label}.effects`).map((item, index) => enumValue(item, enums.effect, `${label}.effects[${index}]`)), `${label}.effects`) as readonly SemanticEffectV2[], endpoints: endpoints(value.endpoints, `${label}.endpoints`), ports: ports(value.ports, `${label}.ports`), overwritePaths: stringList(value.overwritePaths, `${label}.overwritePaths`, true), errorMode: enumValue(value.errorMode, enums.errorMode, `${label}.errorMode`), retryMode: enumValue(value.retryMode, enums.retryMode, `${label}.retryMode`), disabledMode: enumValue(value.disabledMode, enums.disabledMode, `${label}.disabledMode`), provenance: provenance(value.provenance, `${label}.provenance`) }; return Object.freeze(result) as ResolvedNodeSemanticsV2; }\nfunction freeze<T>(value: T, seen = new WeakSet<object>()): T { if (value !== null && typeof value === 'object') { if (seen.has(value)) return value; seen.add(value); for (const name of Object.getOwnPropertyNames(value)) { const descriptor = Object.getOwnPropertyDescriptor(value, name); if (descriptor && 'value' in descriptor) freeze(descriptor.value, seen); } Object.freeze(value); } return value; }\nfunction preflight(input: unknown, seen = new Set<object>(), depth = 0): void {\n if (input === null || typeof input !== 'object') return;\n if (depth > 256 || seen.has(input)) return fail('UNSAFE_INPUT');\n seen.add(input);\n try {\n const proto = Object.getPrototypeOf(input); if (Array.isArray(input) ? proto !== Array.prototype : proto !== Object.prototype && proto !== null) return fail('UNSAFE_INPUT');\n const names = Object.getOwnPropertyNames(input); if (names.length > MAX_ITEMS || Object.getOwnPropertySymbols(input).length !== 0) return fail('UNSAFE_INPUT');\n if (Array.isArray(input)) {\n const length = Object.getOwnPropertyDescriptor(input, 'length');\n if (!length || !('value' in length) || typeof length.value !== 'number' || !Number.isSafeInteger(length.value) || length.value < 0 || length.value > MAX_ITEMS || names.length !== length.value + 1) return fail('UNSAFE_INPUT');\n for (const name of names) if (name !== 'length' && (!/^(0|[1-9]\\d*)$/.test(name) || Number(name) >= length.value)) return fail('UNSAFE_INPUT');\n }\n for (const name of names) { if (name === 'length' && Array.isArray(input)) continue; const descriptor = Object.getOwnPropertyDescriptor(input, name); if (!descriptor || !('value' in descriptor)) return fail('UNSAFE_INPUT'); preflight(descriptor.value, seen, depth + 1); }\n } catch (error) { if (error instanceof SemanticCatalogueAdmissionError) throw error; return fail('UNSAFE_INPUT'); } finally { seen.delete(input); }\n}\nfunction body(input: unknown): SemanticCatalogueBodyV2 {\n const value = own(input, TOP, 'catalogue'); required(value, TOP.slice(0, -1), 'catalogue');\n if (value.schemaVersion !== 'scanner-semantics-v2') return fail('INVALID_SCHEMA_VERSION');\n const version = text(value.version, 'catalogue.version', 128);\n try { parseStrictSemver(version); } catch { return fail('INVALID_VERSION', 'catalogue.version'); }\n const records = dense(value.records, 'catalogue.records').map((item, index) => record(item, `catalogue.records[${index}]`));\n const ids = new Set<string>(); const recordsByKey = new Map<string, ResolvedNodeSemanticsV2>(); const recordsByScope = new Map<string, ResolvedNodeSemanticsV2[]>();\n for (const item of records) {\n if (ids.has(item.semanticId)) return fail('DUPLICATE_ID', item.semanticId); ids.add(item.semanticId);\n const scope = `${item.nodeType}\\0${item.operation ?? ''}`;\n const key = `${scope}\\0${canonicalizeJson(item.versionRange)}`;\n const prior = recordsByKey.get(key);\n if (prior !== undefined) return fail(canonicalizeJson(prior) === canonicalizeJson(item) ? 'DUPLICATE_RECORD' : 'SEMANTIC_CATALOGUE_AMBIGUOUS', item.semanticId);\n const scoped = recordsByScope.get(scope) ?? [];\n for (const candidate of scoped) {\n if (overlap(candidate.versionRange, item.versionRange) && !subset(candidate.versionRange, item.versionRange) && !subset(item.versionRange, candidate.versionRange)) {\n return fail('SEMANTIC_CATALOGUE_AMBIGUOUS', item.semanticId);\n }\n }\n recordsByKey.set(key, item); scoped.push(item); recordsByScope.set(scope, scoped);\n }\n records.sort((a, b) => compare(canonicalizeJson(a), canonicalizeJson(b)));\n return Object.freeze({ schemaVersion: 'scanner-semantics-v2', id: text(value.id, 'catalogue.id', 512), version, records: Object.freeze(records), configurationKeys: sortedUnique(dense(value.configurationKeys, 'configurationKeys').map((item, index) => text(item, `configurationKeys[${index}]`)), 'configurationKeys') });\n}\nexport function createSemanticCatalogueDigest(value: SemanticCatalogueBodyV2): string { return bytesToHex(sha256(canonicalJsonBytes(body(value)))); }\nexport const createCatalogueDigest = createSemanticCatalogueDigest;\nexport function admitSemanticCatalogue(input: unknown): SemanticCatalogueV2 { try { preflight(input); const normalized = body(input); const value = own(input, TOP, 'catalogue'); const digest = text(value.digest, 'catalogue.digest', 64); if (!DIGEST.test(digest)) return fail('DIGEST_MISMATCH', 'catalogue.digest'); const expected = createSemanticCatalogueDigest(normalized); if (digest !== expected) return fail('DIGEST_MISMATCH'); return freeze({ ...normalized, digest }) as SemanticCatalogueV2; } catch (error) { if (error instanceof SemanticCatalogueAdmissionError) throw error; return fail('UNSAFE_INPUT'); } }\n", "{\n \"schemaVersion\": \"semantic-source-receipts-v1\",\n \"note\": \"Identity-only provenance receipts for the two pinned upstream packages that the built-in semantic catalogue records describe. Every file digest below is a SHA-256 computed from the published npm tarball on 2026-10-17 by the AI review worker for packet B1a (review identity: scanner-core-semantics-review; this is an agent review, not a human sign-off); the upstream bytes are deliberately not retained in this repository. Deviation from the plan's retained-snapshot wording, with reason: n8n-nodes-base and @n8n/n8n-nodes-langchain are published under 'SEE LICENSE IN LICENSE.md', which is not an OSI licence, so no upstream source bytes may be copied into this repository and the repository's link-only rights posture applies (same class of reason as RULING-2). The receipt therefore binds package name, version, tarball URL and digest, registry integrity, per-file path, byte length and SHA-256, review date and review identity, with a documented re-fetch command in docs/audit/2026-10-17-remediation/B1a-report.md, without retaining the bytes. documentsRecords maps each catalogue semanticId to the upstream files that were reviewed for that record's claims.\",\n \"packages\": [\n {\n \"package\": \"n8n-nodes-base\",\n \"version\": \"2.15.1\",\n \"registry\": \"https://registry.npmjs.org\",\n \"tarballUrl\": \"https://registry.npmjs.org/n8n-nodes-base/-/n8n-nodes-base-2.15.1.tgz\",\n \"tarballSha256\": \"43e200c1cbe1c4a9f967efa079facb00cc3cbe51ede23c9a3cfc66c9a4051406\",\n \"distIntegrity\": \"sha512-E4/vb8sBb4tzZSFoBAP2EigAHSc3uEn52RdfyTu1C7xPBNLYDfw5y5OxvMmHBQ8of9YQwcK9AQsoEsggyu7ztQ==\",\n \"fetchedAt\": \"2026-10-17\",\n \"files\": [\n {\n \"path\": \"dist/credentials/MySql.credentials.js\",\n \"bytes\": 2661,\n \"sha256\": \"2b887261e175c08a804577a13dad6cd2dc160668cb480ae668f2d04a56b61380\"\n },\n {\n \"path\": \"dist/credentials/Postgres.credentials.js\",\n \"bytes\": 2485,\n \"sha256\": \"8d2f881eb6fa169b1b1fb34059424767df54e717850008274308c08a4077e905\"\n },\n {\n \"path\": \"dist/nodes/Code/Code.node.js\",\n \"bytes\": 7874,\n \"sha256\": \"b86fceda544451fce8dbdadf7f68c0417b79f1d6f3a79d6986d5f0f2d0027289\"\n },\n {\n \"path\": \"dist/nodes/Code/descriptions/JavascriptCodeDescription.js\",\n \"bytes\": 2136,\n \"sha256\": \"8ac750eb00492b3cb8ffbb7d4165489370f965aab45b1cb50b72ace59dbd8452\"\n },\n {\n \"path\": \"dist/nodes/EmailSend/EmailSend.node.js\",\n \"bytes\": 1004,\n \"sha256\": \"d76e18808343c4d0a7c35db3213e8e69bdb684cdda5c613e60b184da12c76b4c\"\n },\n {\n \"path\": \"dist/nodes/EmailSend/v2/EmailSendV2.node.js\",\n \"bytes\": 4489,\n \"sha256\": \"712169b216a6edc2d2a10ec378bd6ae8871a1ecb76387e670eacb78a113bc37a\"\n },\n {\n \"path\": \"dist/nodes/EmailSend/v2/descriptions.js\",\n \"bytes\": 759,\n \"sha256\": \"5516434cbebe759f4620cd1d06453e01e0a19f09282b9726467ea3274f8bfefa\"\n },\n {\n \"path\": \"dist/nodes/EmailSend/v2/send.operation.js\",\n \"bytes\": 8807,\n \"sha256\": \"6faad70b99bc41f757bb53f02784a5925cba8b9d33246d785ba613a47ff13134\"\n },\n {\n \"path\": \"dist/nodes/ExecuteCommand/ExecuteCommand.node.js\",\n \"bytes\": 3666,\n \"sha256\": \"e710b4f054ecb8002dd3fe6d02f977bce00fb0722d23b7cc7c2c8bcc8834338a\"\n },\n {\n \"path\": \"dist/nodes/ExecuteWorkflow/ExecuteWorkflow/ExecuteWorkflow.node.js\",\n \"bytes\": 19378,\n \"sha256\": \"5f351ab2c88cfc14d192530ccdb869ccaee135d8267a1491535037b4011b28a0\"\n },\n {\n \"path\": \"dist/nodes/ExecuteWorkflow/ExecuteWorkflowTrigger/ExecuteWorkflowTrigger.node.js\",\n \"bytes\": 10448,\n \"sha256\": \"e75d626746d865a458d57c496d85c444fa72a73a7ade7e6018f91e2f6b9e7195\"\n },\n {\n \"path\": \"dist/nodes/Form/FormTrigger.node.js\",\n \"bytes\": 1372,\n \"sha256\": \"86c7128a1256494968b7fff4908e36956447eb23b09cfca8c5cfb15f6b008a9f\"\n },\n {\n \"path\": \"dist/nodes/Form/common.descriptions.js\",\n \"bytes\": 24412,\n \"sha256\": \"36e8efc3f3f2cb6030aaeec30bac9ac3c564fc6fa54607c209adf7c708c0b6fa\"\n },\n {\n \"path\": \"dist/nodes/Form/v2/FormTriggerV2.node.js\",\n \"bytes\": 7991,\n \"sha256\": \"4c20e9dd7b48d7019c1f30762dfa6e0261f050c7328a38901dcf0b64b3585941\"\n },\n {\n \"path\": \"dist/nodes/Git/Git.node.js\",\n \"bytes\": 28226,\n \"sha256\": \"c42647afb36dcf5abe558c29090d8edeb26932f3e53c01db250b58fa35b2a9f7\"\n },\n {\n \"path\": \"dist/nodes/Git/descriptions/CloneDescription.js\",\n \"bytes\": 567,\n \"sha256\": \"d7931770204f7d8416124ea47e62ef8afbb8b86a64d98af6adfdbe0a2538e270\"\n },\n {\n \"path\": \"dist/nodes/Git/descriptions/CommitDescription.js\",\n \"bytes\": 1492,\n \"sha256\": \"022963b6ed776114e1e5f488019a912651b5e14f3d40c559ab9d8857066bf540\"\n },\n {\n \"path\": \"dist/nodes/Git/descriptions/PushDescription.js\",\n \"bytes\": 1106,\n \"sha256\": \"710634a4f149c7f6e57b72ad3ce99c261d62f0fb4bf0fc430f6c602ca7b36540\"\n },\n {\n \"path\": \"dist/nodes/HttpRequest/HttpRequest.node.js\",\n \"bytes\": 2163,\n \"sha256\": \"7a516ec8527fbb7c209c489fc05cb7fd6f2b32baff838ac4f5230a08e9d2e6db\"\n },\n {\n \"path\": \"dist/nodes/HttpRequest/V3/Description.js\",\n \"bytes\": 45912,\n \"sha256\": \"8b9f0334842600a60d9f23bd07de163142b66075fda9f0d191433cb86b9ace2f\"\n },\n {\n \"path\": \"dist/nodes/HttpRequest/V3/HttpRequestV3.node.js\",\n \"bytes\": 45490,\n \"sha256\": \"00b6f6963b3487b1607dd4731a877fa4e7ce1d8822795a27fb6c4bcf1f902885\"\n },\n {\n \"path\": \"dist/nodes/ManualTrigger/ManualTrigger.node.js\",\n \"bytes\": 1509,\n \"sha256\": \"aa3151c441a98c2b047ddbb64266bdee8d383aea890b29368124ff4e831af1e4\"\n },\n {\n \"path\": \"dist/nodes/MySql/MySql.node.js\",\n \"bytes\": 1259,\n \"sha256\": \"11f0dd39f78221f9f6e0c4dce4e024c7ea9db47268dca640a0d5f25b32f94ea3\"\n },\n {\n \"path\": \"dist/nodes/MySql/v2/actions/database/Database.resource.js\",\n \"bytes\": 4320,\n \"sha256\": \"bf7a1c2d5b1231fc7e11f3cefee10b7e0f38606826df57beff7bc6277b76eb4a\"\n },\n {\n \"path\": \"dist/nodes/MySql/v2/actions/database/executeQuery.operation.js\",\n \"bytes\": 2918,\n \"sha256\": \"4c1c388c764f4ed8fd4802d48da3a162a19a4d730c2e783e2a8e5a6a64e63db8\"\n },\n {\n \"path\": \"dist/nodes/MySql/v2/actions/versionDescription.js\",\n \"bytes\": 2745,\n \"sha256\": \"3a9307265ff4d0c8197883da853dd664a494cd2b8230449e135a6309ea434c82\"\n },\n {\n \"path\": \"dist/nodes/NoOp/NoOp.node.js\",\n \"bytes\": 813,\n \"sha256\": \"015ada9acac98a289039faf2ee2f55ba6c0f3f414f467c269cc6c65a5bdd045e\"\n },\n {\n \"path\": \"dist/nodes/NoOp/NoOp.node.json\",\n \"bytes\": 2666,\n \"sha256\": \"ec5012a56869016dc99ecdddd3df25ffe630a8ec5a3398141d75e06fc9dbc6a4\"\n },\n {\n \"path\": \"dist/nodes/OpenAi/ChatDescription.js\",\n \"bytes\": 14151,\n \"sha256\": \"540f8dd69bb38c25eb82c514c688fc21161f711de404e146306cd4fbf9c01903\"\n },\n {\n \"path\": \"dist/nodes/OpenAi/OpenAi.node.js\",\n \"bytes\": 2803,\n \"sha256\": \"a2e5f5722375b520c2c689670d6b3b16c0f693e0f16300a8c1ca47e57d3089dd\"\n },\n {\n \"path\": \"dist/nodes/OpenAi/TextDescription.js\",\n \"bytes\": 17012,\n \"sha256\": \"f2d22bf998130bd40c034a58fdb6a06c48bf7c98e6af250bc2e0187cdce86cee\"\n },\n {\n \"path\": \"dist/nodes/Postgres/Postgres.node.js\",\n \"bytes\": 1368,\n \"sha256\": \"54c0194e046a08723991d4baa747bbade7ea95e2e6713ef2218329f6e0bed260\"\n },\n {\n \"path\": \"dist/nodes/Postgres/v2/actions/database/Database.resource.js\",\n \"bytes\": 4404,\n \"sha256\": \"629948e576cdba7cbe1e5d16b9622f7f72bff2161d52533033aa5b82b1ff250d\"\n },\n {\n \"path\": \"dist/nodes/Postgres/v2/actions/database/executeQuery.operation.js\",\n \"bytes\": 4985,\n \"sha256\": \"0de44810a69b1c89d2d430882a064a39f1587fd0f565e2997506f37070fc7b38\"\n },\n {\n \"path\": \"dist/nodes/Postgres/v2/actions/versionDescription.js\",\n \"bytes\": 2731,\n \"sha256\": \"71cd65f264791a3debf9db37320903f3e7726cdb96e426eb9099c5aa23a702c7\"\n },\n {\n \"path\": \"dist/nodes/ReadBinaryFile/ReadBinaryFile.node.js\",\n \"bytes\": 3211,\n \"sha256\": \"ff3b4d896ab2a0b72be74497a0bff1ae134e700db0f697eed310863a455a3576\"\n },\n {\n \"path\": \"dist/nodes/Slack/Slack.node.js\",\n \"bytes\": 1193,\n \"sha256\": \"852da1fc867bfc03d01ddac6e1acdf96c1b8e185db4c556aef89984c40591069\"\n },\n {\n \"path\": \"dist/nodes/Slack/V2/MessageDescription.js\",\n \"bytes\": 37505,\n \"sha256\": \"d1583a16230dad669ccc91acb2ab5c422850d652ccfbfd0adf5593b58b596103\"\n },\n {\n \"path\": \"dist/nodes/Slack/V2/SlackV2.node.js\",\n \"bytes\": 58179,\n \"sha256\": \"902cff7c1bcb4ce3c5fc601cc977d29702558abfa0c9673ebe0716f304b5a49d\"\n },\n {\n \"path\": \"dist/nodes/Webhook/Webhook.node.js\",\n \"bytes\": 13110,\n \"sha256\": \"402d01fdd04a2a71738c189e0b76a87415978bb414660f13fd9c2ece96ee3e37\"\n },\n {\n \"path\": \"dist/nodes/Webhook/description.js\",\n \"bytes\": 15348,\n \"sha256\": \"0bca9f9b690a9965bc8ce05c56c7532430eb4c839198b07eafd4b175850595cb\"\n },\n {\n \"path\": \"dist/nodes/WriteBinaryFile/WriteBinaryFile.node.js\",\n \"bytes\": 4588,\n \"sha256\": \"c495d4696d5f051ffed6a622442405429c344593bee70d4b129997c33334d11f\"\n },\n {\n \"path\": \"dist/utils/workflowInputsResourceMapping/constants.js\",\n \"bytes\": 1022,\n \"sha256\": \"14930146d4c928a51815eeba1f057f2d86de0243578e62512ebd6e43b56eeefd\"\n },\n {\n \"path\": \"dist/nodes/Set/Set.node.js\",\n \"bytes\": 1161,\n \"sha256\": \"05fb602270c01e7244291b7e9fa04d60d7aa9ba0f2ecfc2dbd11741c71cc6722\"\n },\n {\n \"path\": \"dist/nodes/Set/v1/SetV1.node.js\",\n \"bytes\": 8069,\n \"sha256\": \"8a2c21be95ce48161465e787a6a7ccaf3f90c15010af19ce23626d8b470db146\"\n },\n {\n \"path\": \"dist/nodes/Set/v2/SetV2.node.js\",\n \"bytes\": 14293,\n \"sha256\": \"cc71e353359e4107787cfaafb0f5ec6fc5c7416efb4f43f61139f835d32593ec\"\n },\n {\n \"path\": \"dist/nodes/If/If.node.js\",\n \"bytes\": 1044,\n \"sha256\": \"8690fc5d4a28a6267a21e95adeffd0d48f36ea28ff1657943a48eae81d7cc6f4\"\n },\n {\n \"path\": \"dist/nodes/If/V1/IfV1.node.js\",\n \"bytes\": 22171,\n \"sha256\": \"790fc1cb6065f24eb670e15ada6876ad1f21d21006f94c290f855a39d10cb036\"\n },\n {\n \"path\": \"dist/nodes/If/V2/IfV2.node.js\",\n \"bytes\": 5145,\n \"sha256\": \"6b7ed12d8da084049c4ffb7cd04bb5529c0ea757c7dd7aeb103123d9e38b40ad\"\n },\n {\n \"path\": \"dist/nodes/Switch/Switch.node.js\",\n \"bytes\": 1320,\n \"sha256\": \"d71978230704fb4cc865d3ee0e00b824273324d5196991aba202584cd034c080\"\n },\n {\n \"path\": \"dist/nodes/Switch/V1/SwitchV1.node.js\",\n \"bytes\": 28845,\n \"sha256\": \"3f97bb96782c26c2299fd98ead79e5ae9585ad3d8e01b58def3813a9dac4f5dd\"\n },\n {\n \"path\": \"dist/nodes/Switch/V2/SwitchV2.node.js\",\n \"bytes\": 29354,\n \"sha256\": \"124637d7cf57fa6b61323bdd4c9bff9b4b2cc26e7c5d4fd472f47f378497f289\"\n },\n {\n \"path\": \"dist/nodes/Switch/V3/SwitchV3.node.js\",\n \"bytes\": 18071,\n \"sha256\": \"7cdfe9d3773fa7f78d8ffc7ce0a66f85f48d30dc4cf2d87c1ed63f747dc63fbf\"\n },\n {\n \"path\": \"dist/nodes/Merge/Merge.node.js\",\n \"bytes\": 1257,\n \"sha256\": \"3c32794aae7af1277d689bbaa6b013f4d5f80141625a61d363d45937215bb777\"\n },\n {\n \"path\": \"dist/nodes/Merge/v1/MergeV1.node.js\",\n \"bytes\": 19431,\n \"sha256\": \"e6ffc04766805f99950dbe5710a727755c7fb222a4fb4d36ea5951a7072e1d67\"\n },\n {\n \"path\": \"dist/nodes/Merge/v2/MergeV2.node.js\",\n \"bytes\": 23341,\n \"sha256\": \"b280182890e773550276b809ba1d9f8ee353372c89079a74e2a3086afb38e28c\"\n },\n {\n \"path\": \"dist/nodes/Merge/v3/MergeV3.node.js\",\n \"bytes\": 674,\n \"sha256\": \"d5c9edbb8c4a7b12e238f22bbecd3081a3ab846f94d83239b3c1295c61e56c2d\"\n },\n {\n \"path\": \"dist/nodes/SplitInBatches/SplitInBatches.node.js\",\n \"bytes\": 1172,\n \"sha256\": \"93c3f12852542f08f58f2d71277916eba6f524898b8e410c9b7466f06cc144b9\"\n },\n {\n \"path\": \"dist/nodes/SplitInBatches/v1/SplitInBatchesV1.node.js\",\n \"bytes\": 4673,\n \"sha256\": \"25ccdb50dd10f982af270c8681d727924460ef989ae49123eb198608308c5002\"\n },\n {\n \"path\": \"dist/nodes/SplitInBatches/v2/SplitInBatchesV2.node.js\",\n \"bytes\": 5350,\n \"sha256\": \"279f601f57541c2a2598b79a8eac0d505a0ce09c0471048216fe8ea6d49202be\"\n },\n {\n \"path\": \"dist/nodes/SplitInBatches/v3/SplitInBatchesV3.node.js\",\n \"bytes\": 5471,\n \"sha256\": \"753a1ecaa7f2e9de387212b26e5b6b3e0d827b4190184e32947aad7bdb8ef2bb\"\n },\n {\n \"path\": \"dist/nodes/Schedule/ScheduleTrigger.node.js\",\n \"bytes\": 23132,\n \"sha256\": \"bac9111de5ea6cf97cbfbcf4253f524eadb94979586b253962723a23110c3919\"\n },\n {\n \"path\": \"dist/nodes/Google/Sheet/GoogleSheets.node.js\",\n \"bytes\": 2229,\n \"sha256\": \"af00ac359dfefa93783bc9f559259d1ebc5f4c41065077547f89cec1d7a1b94a\"\n },\n {\n \"path\": \"dist/nodes/Google/Sheet/v1/GoogleSheetsV1.node.js\",\n \"bytes\": 18853,\n \"sha256\": \"ade3d4012749f407ba3370318b6a7c5538bc78596ef130103e397499ce5b31ad\"\n },\n {\n \"path\": \"dist/nodes/Google/Sheet/v2/GoogleSheetsV2.node.js\",\n \"bytes\": 853,\n \"sha256\": \"de4c47cdaeb1019a8711ed385a24ed690ce1498123ef2426d3bf70472b96ca91\"\n },\n {\n \"path\": \"dist/nodes/Google/Sheet/v2/actions/versionDescription.js\",\n \"bytes\": 5546,\n \"sha256\": \"71408af602bd2f915426b963d3e2d88f197e80bf528cca2ec1400fa01b0d97c7\"\n },\n {\n \"path\": \"dist/nodes/Google/Sheet/v2/actions/sheet/read.operation.js\",\n \"bytes\": 5830,\n \"sha256\": \"3dace7a812e6c322b92572cef4d47429c0112931096203d4313c306cfe39edbb\"\n },\n {\n \"path\": \"dist/nodes/Google/Sheet/v2/actions/sheet/append.operation.js\",\n \"bytes\": 9449,\n \"sha256\": \"be18d376b86460f5e884de130705bb317d9a35011a3fdd3ac2fec06b05e8a993\"\n },\n {\n \"path\": \"dist/nodes/Google/Sheet/v2/actions/sheet/update.operation.js\",\n \"bytes\": 15965,\n \"sha256\": \"29c92be3cd21dfd117134700911d3511b69d3f4cdb9308dc96af9b9ecc5d565f\"\n },\n {\n \"path\": \"dist/nodes/Google/Sheet/v2/helpers/GoogleSheet.js\",\n \"bytes\": 24180,\n \"sha256\": \"70e477ba7d00aaf39290e4b53b9134c5ef4a4771cba78b17156c94c3a23100c5\"\n },\n {\n \"path\": \"dist/nodes/Google/Sheet/v2/actions/router.js\",\n \"bytes\": 3948,\n \"sha256\": \"c78e0e050f752b04d286cf3d1e0231fa5d16061abc0676ae9bc72e78c6df399c\"\n },\n {\n \"path\": \"dist/nodes/Google/Gmail/Gmail.node.js\",\n \"bytes\": 1474,\n \"sha256\": \"51d583d04cfa9ed2f8e71e0ebb1ea4c68545470f673fa53467f4ee17fcb6db5b\"\n },\n {\n \"path\": \"dist/nodes/Google/Gmail/v2/GmailV2.node.js\",\n \"bytes\": 33094,\n \"sha256\": \"43ab5dff34987ab01175fc832a35190f0c9a1d172a0830a05c538c9a6c7071a7\"\n },\n {\n \"path\": \"dist/node-definitions/nodes/n8n-nodes-base/gmail/v1/index.schema.js\",\n \"bytes\": 1128,\n \"sha256\": \"78a51412dbf0119e846a137b4ca3855cca480deb5a7f54694d3965b5b2008376\"\n },\n {\n \"path\": \"dist/node-definitions/nodes/n8n-nodes-base/gmail/v2/index.schema.js\",\n \"bytes\": 1111,\n \"sha256\": \"346a9b3f9166c8b1a4749c49cdb6729a4c8a14490524067d4aadbdbb58bd66d8\"\n },\n {\n \"path\": \"dist/node-definitions/nodes/n8n-nodes-base/gmail/v21/index.schema.js\",\n \"bytes\": 1113,\n \"sha256\": \"ebcad04fe71130c425d963bf7fa0ed69ea692e3a9fa6e2f17d9c8b7002a6d9df\"\n },\n {\n \"path\": \"dist/node-definitions/nodes/n8n-nodes-base/gmail/v22/index.schema.js\",\n \"bytes\": 1113,\n \"sha256\": \"cea2ae376538c3009fd94346ded5f10a8fd4c85fde1121edd82540436f39de5c\"\n },\n {\n \"path\": \"dist/credentials/GmailOAuth2Api.credentials.js\",\n \"bytes\": 917,\n \"sha256\": \"d26a4ac3387ceec1f0edfe09c9d9a375dda82825b4588c8a35edf9e5ff5e4fb6\"\n },\n {\n \"path\": \"dist/nodes/Wait/Wait.node.js\",\n \"bytes\": 21116,\n \"sha256\": \"8b45af6d1167e83ae2c39e0778a07863080806cd7844dce613689ecf09a0f63f\"\n },\n {\n \"path\": \"dist/node-definitions/nodes/n8n-nodes-base/wait/v1.schema.js\",\n \"bytes\": 7719,\n \"sha256\": \"1d136e35600febc0124585e6483e4e453101b748947455c4275973ff69f5e355\"\n },\n {\n \"path\": \"dist/node-definitions/nodes/n8n-nodes-base/wait/v11.schema.js\",\n \"bytes\": 7721,\n \"sha256\": \"6dc663befce6251b1ecc7906510460b9a5dc260209858f6c8e4ce4e140f8ab65\"\n },\n {\n \"path\": \"dist/nodes/Telegram/Telegram.node.js\",\n \"bytes\": 92819,\n \"sha256\": \"9e3d1e7db6df87ac6ee7648e2d67d52ab9aafdf87e09503fb2f0ce774c206a9a\"\n },\n {\n \"path\": \"dist/node-definitions/nodes/n8n-nodes-base/telegram/v1/index.schema.js\",\n \"bytes\": 1114,\n \"sha256\": \"0b6219091e0481eff54e45098dd86d233da61954b24d3fa9a7dc52de3a9b3351\"\n },\n {\n \"path\": \"dist/node-definitions/nodes/n8n-nodes-base/telegram/v11/index.schema.js\",\n \"bytes\": 1116,\n \"sha256\": \"06d4c646a0aeee2f4d01674e3ab725aef3377253e33061cd02d169791e0d5dce\"\n },\n {\n \"path\": \"dist/node-definitions/nodes/n8n-nodes-base/telegram/v12/index.schema.js\",\n \"bytes\": 1116,\n \"sha256\": \"7ee3807d5b76829555b55ab27bb459f2ccbd43e8e489fbaa678a55af852307c7\"\n },\n {\n \"path\": \"dist/credentials/TelegramApi.credentials.js\",\n \"bytes\": 1034,\n \"sha256\": \"5b14055bf4688b6a56cac314e9c6ca7937bdd6e7a9067f043ccadaae33016fe5\"\n },\n {\n \"path\": \"dist/nodes/Transform/SplitOut/SplitOut.node.js\",\n \"bytes\": 10605,\n \"sha256\": \"9b367f65f121c5571d9daecd9df9bb609d7c2de013555bfa2af2fab62d5bd057\"\n },\n {\n \"path\": \"dist/node-definitions/nodes/n8n-nodes-base/splitOut/v1.schema.js\",\n \"bytes\": 1431,\n \"sha256\": \"b4937c0a04a9ef31a9a4deb6628d7a84c64b468163e909b9df1fd603a83a5f31\"\n }\n ]\n },\n {\n \"package\": \"@n8n/n8n-nodes-langchain\",\n \"version\": \"2.43.5\",\n \"registry\": \"https://registry.npmjs.org\",\n \"tarballUrl\": \"https://registry.npmjs.org/@n8n/n8n-nodes-langchain/-/n8n-nodes-langchain-2.43.5.tgz\",\n \"tarballSha256\": \"63a7a9108d2c944e278ed1389c4eacf8e8dc309a649442d704e316d266c360b7\",\n \"distIntegrity\": \"sha512-TuAopltLsyCBbalz4fUvD0/Bdcvjl4MaoWAz2XvijP4fDR7dkbzYXhuKYwBU/rZg7LioouAktR8t3djG0m766w==\",\n \"fetchedAt\": \"2026-10-17\",\n \"files\": [\n {\n \"path\": \"dist/nodes/agents/Agent/Agent.node.js\",\n \"bytes\": 7126,\n \"sha256\": \"4b37709cb6c170e5a92d54870d6d7b75b7df7f8931ee4c84c5d5123b4a14c777\"\n },\n {\n \"path\": \"dist/nodes/agents/Agent/agents/ToolsAgent/V3/description.js\",\n \"bytes\": 1742,\n \"sha256\": \"17a8b4999dd8ae7199cf8527e0501cb1b68cbaa953e338f6486be60d5a6dc2b6\"\n },\n {\n \"path\": \"dist/nodes/agents/Agent/agents/ToolsAgent/options.js\",\n \"bytes\": 6352,\n \"sha256\": \"bcf373fa125fa545ef1c98972a21db70834dc792d9f7b20d29543a6411ac41fe\"\n },\n {\n \"path\": \"dist/nodes/code/Code.node.js\",\n \"bytes\": 16924,\n \"sha256\": \"fe6912416ed6ccf16ff777162681c00bceaffe76284c809f8e5096aa14a3e123\"\n },\n {\n \"path\": \"dist/nodes/llms/LMChatOpenAi/LmChatOpenAi.node.js\",\n \"bytes\": 40036,\n \"sha256\": \"5fdb1f45f58b27a75baee66ad066316dacd79c2585684fd9b292b9b312f43562\"\n },\n {\n \"path\": \"dist/nodes/mcp/McpClientTool/McpClientTool.node.js\",\n \"bytes\": 10891,\n \"sha256\": \"19eaeece51b0e6fc56d02c9704c77da1eedf53226e2663efb7be30aab3d1e1d5\"\n },\n {\n \"path\": \"dist/nodes/tools/ToolCode/ToolCode.node.js\",\n \"bytes\": 11554,\n \"sha256\": \"f7d0886d66ed93533a577fa415dc2dadb66e4493eec97b27dd6f27dbca31ed7b\"\n },\n {\n \"path\": \"dist/nodes/tools/ToolWorkflow/ToolWorkflow.node.js\",\n \"bytes\": 1985,\n \"sha256\": \"98e79b8f438ac669b0635a7c921be418dade424c6531bfd5dd21de6a68b1d692\"\n },\n {\n \"path\": \"dist/nodes/tools/ToolWorkflow/v2/versionDescription.js\",\n \"bytes\": 4790,\n \"sha256\": \"02b194c5da74b3c238eee4b6d904eceaa8b823d7a0e92e1e284d7514ae727d7c\"\n },\n {\n \"path\": \"dist/nodes/trigger/ChatTrigger/ChatTrigger.node.js\",\n \"bytes\": 48392,\n \"sha256\": \"498f05b57eb73e9f2a00f330c37a12a696016a7808480d332fe883c58d17eaca\"\n },\n {\n \"path\": \"dist/nodes/output_parser/OutputParserStructured/OutputParserStructured.node.js\",\n \"bytes\": 8612,\n \"sha256\": \"1de5e957d3f4d8f89638d18c15b718c8ebd5c20624d471953cdc5109e9b54c32\"\n },\n {\n \"path\": \"dist/node-definitions/nodes/n8n-nodes-langchain/outputParserStructured/v1.schema.js\",\n \"bytes\": 2172,\n \"sha256\": \"1da2069dbc726eca4af1859fa5bc86ef89acb05d00eefa9deb9a6cb9c5854dc8\"\n }\n ]\n }\n ],\n \"documentsRecords\": {\n \"ingress.webhook\": [\n \"n8n-nodes-base@2.15.1:dist/nodes/Webhook/Webhook.node.js\",\n \"n8n-nodes-base@2.15.1:dist/nodes/Webhook/description.js\"\n ],\n \"ingress.form-trigger\": [\n \"n8n-nodes-base@2.15.1:dist/nodes/Form/FormTrigger.node.js\",\n \"n8n-nodes-base@2.15.1:dist/nodes/Form/v2/FormTriggerV2.node.js\",\n \"n8n-nodes-base@2.15.1:dist/nodes/Form/common.descriptions.js\"\n ],\n \"ingress.chat-trigger\": [\n \"@n8n/n8n-nodes-langchain@2.43.5:dist/nodes/trigger/ChatTrigger/ChatTrigger.node.js\"\n ],\n \"ingress.manual-trigger\": [\n \"n8n-nodes-base@2.15.1:dist/nodes/ManualTrigger/ManualTrigger.node.js\"\n ],\n \"http-ai.http-request\": [\n \"n8n-nodes-base@2.15.1:dist/nodes/HttpRequest/HttpRequest.node.js\",\n \"n8n-nodes-base@2.15.1:dist/nodes/HttpRequest/V3/Description.js\",\n \"n8n-nodes-base@2.15.1:dist/nodes/HttpRequest/V3/HttpRequestV3.node.js\"\n ],\n \"http-ai.http-request.request\": [\n \"n8n-nodes-base@2.15.1:dist/nodes/HttpRequest/HttpRequest.node.js\",\n \"n8n-nodes-base@2.15.1:dist/nodes/HttpRequest/V3/Description.js\",\n \"n8n-nodes-base@2.15.1:dist/nodes/HttpRequest/V3/HttpRequestV3.node.js\"\n ],\n \"http-ai.openai\": [\n \"n8n-nodes-base@2.15.1:dist/nodes/OpenAi/OpenAi.node.js\",\n \"n8n-nodes-base@2.15.1:dist/nodes/OpenAi/TextDescription.js\",\n \"n8n-nodes-base@2.15.1:dist/nodes/OpenAi/ChatDescription.js\"\n ],\n \"http-ai.ai-agent\": [\n \"@n8n/n8n-nodes-langchain@2.43.5:dist/nodes/agents/Agent/Agent.node.js\",\n \"@n8n/n8n-nodes-langchain@2.43.5:dist/nodes/agents/Agent/agents/ToolsAgent/options.js\",\n \"@n8n/n8n-nodes-langchain@2.43.5:dist/nodes/agents/Agent/agents/ToolsAgent/V3/description.js\"\n ],\n \"http-ai.chat-model\": [\n \"@n8n/n8n-nodes-langchain@2.43.5:dist/nodes/llms/LMChatOpenAi/LmChatOpenAi.node.js\"\n ],\n \"database-file.postgres\": [\n \"n8n-nodes-base@2.15.1:dist/nodes/Postgres/Postgres.node.js\",\n \"n8n-nodes-base@2.15.1:dist/nodes/Postgres/v2/actions/database/Database.resource.js\",\n \"n8n-nodes-base@2.15.1:dist/nodes/Postgres/v2/actions/database/executeQuery.operation.js\",\n \"n8n-nodes-base@2.15.1:dist/nodes/Postgres/v2/actions/versionDescription.js\",\n \"n8n-nodes-base@2.15.1:dist/credentials/Postgres.credentials.js\"\n ],\n \"database-file.mysql\": [\n \"n8n-nodes-base@2.15.1:dist/nodes/MySql/MySql.node.js\",\n \"n8n-nodes-base@2.15.1:dist/nodes/MySql/v2/actions/database/Database.resource.js\",\n \"n8n-nodes-base@2.15.1:dist/nodes/MySql/v2/actions/database/executeQuery.operation.js\",\n \"n8n-nodes-base@2.15.1:dist/nodes/MySql/v2/actions/versionDescription.js\",\n \"n8n-nodes-base@2.15.1:dist/credentials/MySql.credentials.js\"\n ],\n \"database-file.read-binary-file\": [\n \"n8n-nodes-base@2.15.1:dist/nodes/ReadBinaryFile/ReadBinaryFile.node.js\"\n ],\n \"database-file.write-binary-file\": [\n \"n8n-nodes-base@2.15.1:dist/nodes/WriteBinaryFile/WriteBinaryFile.node.js\"\n ],\n \"code-command.execute-command\": [\n \"n8n-nodes-base@2.15.1:dist/nodes/ExecuteCommand/ExecuteCommand.node.js\"\n ],\n \"code-command.code\": [\n \"n8n-nodes-base@2.15.1:dist/nodes/Code/Code.node.js\",\n \"n8n-nodes-base@2.15.1:dist/nodes/Code/descriptions/JavascriptCodeDescription.js\"\n ],\n \"code-command.langchain-tool-code\": [\n \"@n8n/n8n-nodes-langchain@2.43.5:dist/nodes/tools/ToolCode/ToolCode.node.js\"\n ],\n \"code-command.langchain-code\": [\n \"@n8n/n8n-nodes-langchain@2.43.5:dist/nodes/code/Code.node.js\"\n ],\n \"message-mcp.slack\": [\n \"n8n-nodes-base@2.15.1:dist/nodes/Slack/Slack.node.js\",\n \"n8n-nodes-base@2.15.1:dist/nodes/Slack/V2/SlackV2.node.js\",\n \"n8n-nodes-base@2.15.1:dist/nodes/Slack/V2/MessageDescription.js\"\n ],\n \"message-mcp.email-send\": [\n \"n8n-nodes-base@2.15.1:dist/nodes/EmailSend/EmailSend.node.js\",\n \"n8n-nodes-base@2.15.1:dist/nodes/EmailSend/v2/EmailSendV2.node.js\",\n \"n8n-nodes-base@2.15.1:dist/nodes/EmailSend/v2/descriptions.js\",\n \"n8n-nodes-base@2.15.1:dist/nodes/EmailSend/v2/send.operation.js\"\n ],\n \"message-mcp.tool-mcp\": [\n \"@n8n/n8n-nodes-langchain@2.43.5:dist/nodes/mcp/McpClientTool/McpClientTool.node.js\"\n ],\n \"subworkflow.execute-workflow-trigger\": [\n \"n8n-nodes-base@2.15.1:dist/nodes/ExecuteWorkflow/ExecuteWorkflowTrigger/ExecuteWorkflowTrigger.node.js\",\n \"n8n-nodes-base@2.15.1:dist/utils/workflowInputsResourceMapping/constants.js\"\n ],\n \"subworkflow.execute-workflow\": [\n \"n8n-nodes-base@2.15.1:dist/nodes/ExecuteWorkflow/ExecuteWorkflow/ExecuteWorkflow.node.js\"\n ],\n \"subworkflow.tool-workflow\": [\n \"@n8n/n8n-nodes-langchain@2.43.5:dist/nodes/tools/ToolWorkflow/ToolWorkflow.node.js\",\n \"@n8n/n8n-nodes-langchain@2.43.5:dist/nodes/tools/ToolWorkflow/v2/versionDescription.js\"\n ],\n \"git.git\": [\n \"n8n-nodes-base@2.15.1:dist/nodes/Git/Git.node.js\",\n \"n8n-nodes-base@2.15.1:dist/nodes/Git/descriptions/CloneDescription.js\",\n \"n8n-nodes-base@2.15.1:dist/nodes/Git/descriptions/CommitDescription.js\",\n \"n8n-nodes-base@2.15.1:dist/nodes/Git/descriptions/PushDescription.js\"\n ],\n \"noop.passthrough\": [\n \"n8n-nodes-base@2.15.1:dist/nodes/NoOp/NoOp.node.js\",\n \"n8n-nodes-base@2.15.1:dist/nodes/NoOp/NoOp.node.json\"\n ],\n \"flow-control.set\": [\n \"n8n-nodes-base@2.15.1:dist/nodes/Set/Set.node.js\",\n \"n8n-nodes-base@2.15.1:dist/nodes/Set/v1/SetV1.node.js\",\n \"n8n-nodes-base@2.15.1:dist/nodes/Set/v2/SetV2.node.js\"\n ],\n \"flow-control.if\": [\n \"n8n-nodes-base@2.15.1:dist/nodes/If/If.node.js\",\n \"n8n-nodes-base@2.15.1:dist/nodes/If/V1/IfV1.node.js\",\n \"n8n-nodes-base@2.15.1:dist/nodes/If/V2/IfV2.node.js\"\n ],\n \"flow-control.switch\": [\n \"n8n-nodes-base@2.15.1:dist/nodes/Switch/Switch.node.js\",\n \"n8n-nodes-base@2.15.1:dist/nodes/Switch/V1/SwitchV1.node.js\",\n \"n8n-nodes-base@2.15.1:dist/nodes/Switch/V2/SwitchV2.node.js\",\n \"n8n-nodes-base@2.15.1:dist/nodes/Switch/V3/SwitchV3.node.js\"\n ],\n \"flow-control.merge\": [\n \"n8n-nodes-base@2.15.1:dist/nodes/Merge/Merge.node.js\",\n \"n8n-nodes-base@2.15.1:dist/nodes/Merge/v1/MergeV1.node.js\",\n \"n8n-nodes-base@2.15.1:dist/nodes/Merge/v2/MergeV2.node.js\",\n \"n8n-nodes-base@2.15.1:dist/nodes/Merge/v3/MergeV3.node.js\"\n ],\n \"flow-control.split-in-batches\": [\n \"n8n-nodes-base@2.15.1:dist/nodes/SplitInBatches/SplitInBatches.node.js\",\n \"n8n-nodes-base@2.15.1:dist/nodes/SplitInBatches/v1/SplitInBatchesV1.node.js\",\n \"n8n-nodes-base@2.15.1:dist/nodes/SplitInBatches/v2/SplitInBatchesV2.node.js\",\n \"n8n-nodes-base@2.15.1:dist/nodes/SplitInBatches/v3/SplitInBatchesV3.node.js\"\n ],\n \"flow-control.schedule-trigger\": [\n \"n8n-nodes-base@2.15.1:dist/nodes/Schedule/ScheduleTrigger.node.js\"\n ],\n \"google-workspace.google-sheets\": [\n \"n8n-nodes-base@2.15.1:dist/nodes/Google/Sheet/GoogleSheets.node.js\",\n \"n8n-nodes-base@2.15.1:dist/nodes/Google/Sheet/v1/GoogleSheetsV1.node.js\",\n \"n8n-nodes-base@2.15.1:dist/nodes/Google/Sheet/v2/GoogleSheetsV2.node.js\",\n \"n8n-nodes-base@2.15.1:dist/nodes/Google/Sheet/v2/actions/versionDescription.js\",\n \"n8n-nodes-base@2.15.1:dist/nodes/Google/Sheet/v2/actions/sheet/read.operation.js\",\n \"n8n-nodes-base@2.15.1:dist/nodes/Google/Sheet/v2/actions/sheet/append.operation.js\",\n \"n8n-nodes-base@2.15.1:dist/nodes/Google/Sheet/v2/actions/sheet/update.operation.js\",\n \"n8n-nodes-base@2.15.1:dist/nodes/Google/Sheet/v2/helpers/GoogleSheet.js\",\n \"n8n-nodes-base@2.15.1:dist/nodes/Google/Sheet/v2/actions/router.js\"\n ],\n \"message-mcp.gmail\": [\n \"n8n-nodes-base@2.15.1:dist/nodes/Google/Gmail/Gmail.node.js\",\n \"n8n-nodes-base@2.15.1:dist/nodes/Google/Gmail/v2/GmailV2.node.js\",\n \"n8n-nodes-base@2.15.1:dist/node-definitions/nodes/n8n-nodes-base/gmail/v1/index.schema.js\",\n \"n8n-nodes-base@2.15.1:dist/node-definitions/nodes/n8n-nodes-base/gmail/v2/index.schema.js\",\n \"n8n-nodes-base@2.15.1:dist/node-definitions/nodes/n8n-nodes-base/gmail/v21/index.schema.js\",\n \"n8n-nodes-base@2.15.1:dist/node-definitions/nodes/n8n-nodes-base/gmail/v22/index.schema.js\",\n \"n8n-nodes-base@2.15.1:dist/credentials/GmailOAuth2Api.credentials.js\"\n ],\n \"flow-control.wait\": [\n \"n8n-nodes-base@2.15.1:dist/nodes/Wait/Wait.node.js\",\n \"n8n-nodes-base@2.15.1:dist/node-definitions/nodes/n8n-nodes-base/wait/v1.schema.js\",\n \"n8n-nodes-base@2.15.1:dist/node-definitions/nodes/n8n-nodes-base/wait/v11.schema.js\"\n ],\n \"message-mcp.telegram\": [\n \"n8n-nodes-base@2.15.1:dist/nodes/Telegram/Telegram.node.js\",\n \"n8n-nodes-base@2.15.1:dist/node-definitions/nodes/n8n-nodes-base/telegram/v1/index.schema.js\",\n \"n8n-nodes-base@2.15.1:dist/node-definitions/nodes/n8n-nodes-base/telegram/v11/index.schema.js\",\n \"n8n-nodes-base@2.15.1:dist/node-definitions/nodes/n8n-nodes-base/telegram/v12/index.schema.js\",\n \"n8n-nodes-base@2.15.1:dist/credentials/TelegramApi.credentials.js\"\n ],\n \"transform.split-out\": [\n \"n8n-nodes-base@2.15.1:dist/nodes/Transform/SplitOut/SplitOut.node.js\",\n \"n8n-nodes-base@2.15.1:dist/node-definitions/nodes/n8n-nodes-base/splitOut/v1.schema.js\"\n ],\n \"ai.output-parser-structured\": [\n \"@n8n/n8n-nodes-langchain@2.43.5:dist/nodes/output_parser/OutputParserStructured/OutputParserStructured.node.js\",\n \"@n8n/n8n-nodes-langchain@2.43.5:dist/node-definitions/nodes/n8n-nodes-langchain/outputParserStructured/v1.schema.js\"\n ]\n }\n}\n", "import { sha256 } from '@noble/hashes/sha2.js';\nimport { bytesToHex } from '@noble/hashes/utils.js';\nimport receiptDocument from '../../../../docs/scanner/semantic-source-receipts.json';\nimport { SemanticCatalogueAdmissionError } from './catalogue-admission';\nimport type { SemanticProvenanceV2 } from './catalogue-schema';\n\n/**\n * Built-in semantic catalogue provenance binding (packet B1b, subpacket 1).\n *\n * Before this module, every record's `provenance.sourceDigest` was one of two repeated\n * placeholder strings. The digest is now *derived* from\n * `docs/scanner/semantic-source-receipts.json` (packet B1a), so a changed upstream byte or a\n * changed supporting-file list changes that record's digest, and with it the catalogue digest.\n *\n * Frozen binding rule, pinned by `builtin-catalogue.test.ts`:\n *\n * - `sourceUrl` stays the human-facing n8n documentation page for the node family\n * (`CORE_DOCS`/`LANGCHAIN_DOCS` in the catalogue). This is a deliberate split between the\n * *documentation* URL and the *provenance* digest: the admission contract requires an https\n * URL without credentials, and the receipt's tarball URL is not a page a reader can use.\n * - `sourceDigest` is the canonical digest over the record's supporting files: take the\n * record's `documentsRecords` entries (`<package>@<version>:<path>`), sort them as strings,\n * emit `<entry>:<sha256>` per entry, join with `\\n` and no trailing newline, and hash the\n * UTF-8 bytes. Sorting makes the digest order-insensitive; every entry and every digest\n * inside it changes the result.\n * - `reviewedAt` is the `fetchedAt` of the receipt packages the record's files come from (all\n * of them must agree), and `reviewer` is `REVIEW_IDENTITY` \u2014 an explicit *agent*-review\n * label. The B1a receipt records an AI review worker, so no human sign-off is claimed.\n *\n * Fail closed: a record with no `documentsRecords` entry, an empty entry, an entry whose file is\n * absent from the receipt packages, a non-string entry, a package entry missing fields, or a\n * malformed digest throws `SemanticCatalogueAdmissionError('INVALID_PROVENANCE')` \u2014 the typed\n * error the catalogue admission path already raises for invalid input. There is no silent\n * fallback to a placeholder.\n *\n * The receipt is a static JSON import rather than a `loadSemanticSourceReceipts(...)` call:\n * this module is reachable from the browser worker bundle (`app/src/scanner/scan.worker.ts` ->\n * `@hub/scanner-core/v2` -> `builtin-catalogue.ts`), and `packages/scanner-core/src` is a\n * browser-safe tree that must not import node builtins (`pipeline/check-browser-safe.mjs`).\n * `scripts/lib/semantic-source-receipts.mjs` remains the shape authority for the receipt file;\n * this module revalidates the subset of it that the binding depends on.\n */\nexport type SourceReceiptFile = { readonly path: string; readonly sha256: string };\nexport type SourceReceiptPackage = {\n readonly package: string;\n readonly version: string;\n readonly fetchedAt: string;\n readonly files: readonly SourceReceiptFile[];\n};\nexport type SourceReceipts = {\n readonly packages: readonly SourceReceiptPackage[];\n readonly documentsRecords?: Readonly<Record<string, readonly string[]>>;\n};\nexport type SourceProvenanceBinding = (semanticId: string, sourceUrl: string) => SemanticProvenanceV2;\n\nconst DIGEST = /^[0-9a-f]{64}$/;\nconst REVIEW_IDENTITY = 'scanner-core-semantics-agent-review';\n\nfunction fail(label: string, reason: string): never {\n throw new SemanticCatalogueAdmissionError('INVALID_PROVENANCE', `${label}: ${reason}`);\n}\n\nfunction receiptIndex(receipts: SourceReceipts): Map<string, { sha256: string; fetchedAt: string }> {\n const index = new Map<string, { sha256: string; fetchedAt: string }>();\n for (const entry of receipts?.packages ?? []) {\n const usable = typeof entry?.package === 'string' && typeof entry.version === 'string' && typeof entry.fetchedAt === 'string';\n if (!usable || !Array.isArray(entry.files) || entry.files.length === 0) fail('receipt', 'a package entry is missing package, version, fetchedAt or files');\n for (const file of entry.files) {\n if (typeof file?.path !== 'string' || typeof file.sha256 !== 'string') fail('receipt', 'a package file entry is missing path or sha256');\n index.set(`${entry.package}@${entry.version}:${file.path}`, { sha256: file.sha256, fetchedAt: entry.fetchedAt });\n }\n }\n return index;\n}\n\nexport function createSourceProvenanceBinding(receipts: SourceReceipts): SourceProvenanceBinding {\n const index = receiptIndex(receipts);\n return (semanticId, sourceUrl) => {\n const refs = receipts?.documentsRecords?.[semanticId];\n if (refs === undefined) fail(semanticId, 'the receipt documents no supporting files for this record');\n if (!Array.isArray(refs) || refs.length === 0) fail(semanticId, 'the documentsRecords entry lists no supporting files');\n const files = [...refs].sort().map((ref) => {\n if (typeof ref !== 'string') fail(semanticId, 'a documentsRecords entry is not a string');\n const file = index.get(ref);\n if (file === undefined) fail(semanticId, `${ref} is absent from the receipt packages`);\n if (!DIGEST.test(file.sha256)) fail(semanticId, `${ref} carries a malformed digest`);\n return { ref, sha256: file.sha256, fetchedAt: file.fetchedAt };\n });\n if (new Set(files.map((file) => file.fetchedAt)).size !== 1) fail(semanticId, 'supporting files were fetched on different dates');\n const lines = files.map((file) => `${file.ref}:${file.sha256}`);\n return Object.freeze({\n sourceUrl,\n sourceDigest: bytesToHex(sha256(new TextEncoder().encode(lines.join('\\n')))),\n reviewedAt: files[0].fetchedAt,\n reviewer: REVIEW_IDENTITY,\n });\n };\n}\n\n/** Provenance for the built-in catalogue, bound to the committed receipt. */\nexport const builtinSourceProvenance: SourceProvenanceBinding = createSourceProvenanceBinding(receiptDocument as SourceReceipts);\n", "import { admitSemanticCatalogue, createSemanticCatalogueDigest } from './catalogue-admission';\nimport { builtinSourceProvenance } from './builtin-provenance';\nimport type {\n ResolvedNodeSemanticsV2, SemanticAuthenticationV2, SemanticCatalogueBodyV2, SemanticCatalogueV2,\n SemanticChannelV2, SemanticDirectionV2, SemanticEndpointV2, SemanticItemModeV2,\n SemanticPathV2, SemanticPathValueTypeV2, SemanticPortV2, SemanticProvenanceV2, SemanticTaintV2,\n} from './catalogue-schema';\nimport type { VersionRangeV2 } from './version-range';\n\nconst CORE_DOCS = 'https://docs.n8n.io/integrations/builtin/core-nodes/';\nconst LANGCHAIN_DOCS = 'https://docs.n8n.io/integrations/builtin/cluster-nodes/';\n\ntype OptionalFields = Partial<Omit<ResolvedNodeSemanticsV2, 'semanticId' | 'nodeType'>>;\nconst range = (op: 'GTE' | 'EQ' = 'GTE', version = '1.0.0'): VersionRangeV2 => ({ clauses: [[{ op, version }]] });\nconst versions = (values: readonly string[]): VersionRangeV2 => ({\n clauses: values.map((version) => [{ op: 'EQ' as const, version }]),\n});\nconst provenance = (semanticId: string, sourceUrl: string): SemanticProvenanceV2 => builtinSourceProvenance(semanticId, sourceUrl);\nconst parameter = (pointer: string, valueType: SemanticPathValueTypeV2 = 'ANY', required = false): SemanticPathV2 => ({ pointer, valueType, required });\nconst endpoint = (path: string, channel: SemanticChannelV2 = 'DATA', direction: SemanticDirectionV2 = 'SINK', taint: SemanticTaintV2 = 'BOTH'): SemanticEndpointV2 => ({ path, channel, direction, taint });\nconst port = (type = 'main', index = 0, itemMode: SemanticItemModeV2 = 'EACH'): SemanticPortV2 => ({ type, index, itemMode });\nconst auth = (path: string, noneValues: readonly string[], authenticatedValues: readonly string[]): SemanticAuthenticationV2 => ({ path, noneValues, authenticatedValues, unknownValueEffect: 'EXPOSED' });\nconst record = (semanticId: string, nodeType: string, fields: OptionalFields = {}, sourceUrl = nodeType.startsWith('@') ? LANGCHAIN_DOCS : CORE_DOCS): ResolvedNodeSemanticsV2 => ({\n semanticId, nodeType, versionRange: fields.versionRange ?? range(), operation: fields.operation ?? null, entry: fields.entry ?? 'NONE',\n parameterPaths: fields.parameterPaths ?? [], authentication: fields.authentication ?? null, credentialPaths: fields.credentialPaths ?? [],\n destinationPaths: fields.destinationPaths ?? [], effects: fields.effects ?? [], endpoints: fields.endpoints ?? [], ports: fields.ports ?? [port()],\n overwritePaths: fields.overwritePaths ?? [], errorMode: fields.errorMode ?? 'UNKNOWN', retryMode: fields.retryMode ?? 'UNKNOWN',\n disabledMode: fields.disabledMode ?? 'SKIP', provenance: fields.provenance ?? provenance(semanticId, sourceUrl),\n});\n\nconst records: ResolvedNodeSemanticsV2[] = [\n record('ingress.webhook', 'n8n-nodes-base.webhook', { entry: 'TRIGGER', parameterPaths: [parameter('/path', 'STRING', true), parameter('/authentication', 'STRING')], authentication: auth('/authentication', ['none'], ['basicAuth', 'headerAuth', 'jwtAuth']), endpoints: [endpoint('/body', 'DATA', 'SOURCE')], ports: [port()], errorMode: 'STOP', retryMode: 'PLATFORM' }),\n record('ingress.form-trigger', 'n8n-nodes-base.formTrigger', { entry: 'TRIGGER', parameterPaths: [parameter('/path', 'STRING', true), parameter('/authentication', 'STRING')], authentication: auth('/authentication', ['none'], ['basicAuth']), endpoints: [endpoint('/form', 'DATA', 'SOURCE')], ports: [port()], errorMode: 'STOP', retryMode: 'PLATFORM' }),\n record('ingress.chat-trigger', '@n8n/n8n-nodes-langchain.chatTrigger', { entry: 'TRIGGER', parameterPaths: [parameter('/path', 'STRING', true), parameter('/authentication', 'STRING')], authentication: auth('/authentication', ['none'], ['basicAuth']), endpoints: [endpoint('/chatInput', 'DATA', 'SOURCE')], ports: [port()], errorMode: 'STOP', retryMode: 'PLATFORM' }),\n record('ingress.manual-trigger', 'n8n-nodes-base.manualTrigger', { entry: 'MANUAL', ports: [port()], errorMode: 'STOP', retryMode: 'NONE' }),\n\n record('http-ai.http-request', 'n8n-nodes-base.httpRequest', { parameterPaths: [parameter('/url', 'STRING', true), parameter('/method', 'STRING')], credentialPaths: ['/credentials/httpRequestAuth'], destinationPaths: ['/url'], effects: ['READ_EXTERNAL', 'WRITE_EXTERNAL'], endpoints: [endpoint('/url', 'DATA', 'SINK', 'BOTH')], ports: [port()], retryMode: 'PLATFORM' }),\n record('http-ai.http-request.request', 'n8n-nodes-base.httpRequest', { versionRange: range('EQ'), operation: 'request', parameterPaths: [parameter('/url', 'STRING', true), parameter('/method', 'STRING')], credentialPaths: ['/credentials/httpRequestAuth'], destinationPaths: ['/url'], effects: ['READ_EXTERNAL', 'WRITE_EXTERNAL'], endpoints: [endpoint('/url', 'DATA', 'SINK', 'BOTH')], ports: [port()], errorMode: 'CONTINUE', retryMode: 'BOUNDED' }),\n record('http-ai.openai', 'n8n-nodes-base.openAi', { parameterPaths: [parameter('/resource', 'STRING', true), parameter('/operation', 'STRING', true), parameter('/prompt', 'STRING')], credentialPaths: ['/credentials/openAiApi'], destinationPaths: ['/options/baseURL'], effects: ['READ_EXTERNAL', 'WRITE_EXTERNAL'], endpoints: [endpoint('/prompt', 'MODEL', 'SINK', 'BOTH')], ports: [port()], retryMode: 'PLATFORM' }),\n record('http-ai.ai-agent', '@n8n/n8n-nodes-langchain.agent', { parameterPaths: [parameter('/options/systemMessage', 'STRING')], credentialPaths: ['/credentials'], destinationPaths: ['/options/baseURL'], effects: ['CALL_TOOL', 'READ_EXTERNAL', 'WRITE_EXTERNAL'], endpoints: [endpoint('/options/systemMessage', 'MODEL', 'SINK', 'BOTH')], ports: [port(), port('ai_tool', 0, 'ALL')], retryMode: 'PLATFORM' }),\n record('http-ai.chat-model', '@n8n/n8n-nodes-langchain.lmChatOpenAi', { parameterPaths: [parameter('/modelName', 'STRING', true), parameter('/options', 'OBJECT')], credentialPaths: ['/credentials/openAiApi'], destinationPaths: ['/options/baseURL'], effects: ['READ_EXTERNAL', 'WRITE_EXTERNAL'], endpoints: [endpoint('/modelName', 'MODEL', 'SINK', 'BOTH')], ports: [port()], retryMode: 'PLATFORM' }),\n\n record('database-file.postgres', 'n8n-nodes-base.postgres', { parameterPaths: [parameter('/operation', 'STRING', true), parameter('/query', 'STRING')], credentialPaths: ['/credentials/postgres'], destinationPaths: ['/options/host', '/options/database'], effects: ['DATABASE_READ', 'DATABASE_WRITE'], endpoints: [endpoint('/query', 'DATA', 'SINK', 'BOTH')], ports: [port()], retryMode: 'BOUNDED' }),\n record('database-file.mysql', 'n8n-nodes-base.mySql', { parameterPaths: [parameter('/operation', 'STRING', true), parameter('/query', 'STRING')], credentialPaths: ['/credentials/mySql'], destinationPaths: ['/options/host', '/options/database'], effects: ['DATABASE_READ', 'DATABASE_WRITE'], endpoints: [endpoint('/query', 'DATA', 'SINK', 'BOTH')], ports: [port()], retryMode: 'BOUNDED' }),\n record('database-file.read-binary-file', 'n8n-nodes-base.readBinaryFile', { parameterPaths: [parameter('/filePath', 'STRING', true)], destinationPaths: ['/filePath'], effects: ['READ_FILE'], endpoints: [endpoint('/filePath', 'DATA', 'SINK', 'CONFIDENTIALITY')], ports: [port()], retryMode: 'NONE' }),\n record('database-file.write-binary-file', 'n8n-nodes-base.writeBinaryFile', { parameterPaths: [parameter('/fileName', 'STRING', true)], destinationPaths: ['/fileName'], effects: ['WRITE_FILE'], endpoints: [endpoint('/fileName', 'DATA', 'SINK', 'INTEGRITY')], ports: [port()], overwritePaths: ['/fileName'], retryMode: 'NONE' }),\n\n record('code-command.execute-command', 'n8n-nodes-base.executeCommand', { parameterPaths: [parameter('/command', 'STRING', true)], effects: ['EXECUTE_COMMAND'], ports: [port()], errorMode: 'STOP', retryMode: 'NONE' }),\n record('code-command.code', 'n8n-nodes-base.code', { parameterPaths: [parameter('/jsCode', 'STRING', true), parameter('/mode', 'STRING')], effects: ['EXECUTE_CODE'], ports: [port()], errorMode: 'STOP', retryMode: 'NONE' }),\n record('code-command.langchain-tool-code', '@n8n/n8n-nodes-langchain.toolCode', { parameterPaths: [parameter('/jsCode', 'STRING'), parameter('/pythonCode', 'STRING'), parameter('/language', 'STRING')], effects: ['EXECUTE_CODE'], ports: [port(), port('ai_tool', 0, 'ALL')], errorMode: 'STOP', retryMode: 'NONE' }),\n record('code-command.langchain-code', '@n8n/n8n-nodes-langchain.code', { parameterPaths: [parameter('/code/execute/code', 'STRING'), parameter('/code/supplyData/code', 'STRING')], effects: ['EXECUTE_CODE'], ports: [], errorMode: 'UNKNOWN', retryMode: 'NONE' }),\n\n record('message-mcp.slack', 'n8n-nodes-base.slack', { parameterPaths: [parameter('/channelId', 'STRING', true), parameter('/text', 'STRING', true)], credentialPaths: ['/credentials/slackApi'], destinationPaths: ['/channelId'], effects: ['SEND_MESSAGE'], endpoints: [endpoint('/text', 'DATA', 'SINK', 'CONFIDENTIALITY')], ports: [port()], errorMode: 'CONTINUE', retryMode: 'BOUNDED' }),\n record('message-mcp.email-send', 'n8n-nodes-base.emailSend', { parameterPaths: [parameter('/to', 'STRING', true), parameter('/subject', 'STRING'), parameter('/text', 'STRING')], credentialPaths: ['/credentials/smtp'], destinationPaths: ['/to'], effects: ['SEND_MESSAGE'], endpoints: [endpoint('/text', 'DATA', 'SINK', 'CONFIDENTIALITY')], ports: [port()], errorMode: 'CONTINUE', retryMode: 'BOUNDED' }),\n record('message-mcp.tool-mcp', '@n8n/n8n-nodes-langchain.toolMcp', { parameterPaths: [parameter('/serverUrl', 'STRING', true), parameter('/tool', 'STRING')], credentialPaths: ['/credentials'], destinationPaths: ['/serverUrl'], effects: ['CALL_TOOL'], endpoints: [endpoint('/serverUrl', 'TOOL', 'SINK', 'BOTH')], ports: [port(), port('ai_tool', 0, 'ALL')], errorMode: 'STOP', retryMode: 'BOUNDED' }),\n\n record('subworkflow.execute-workflow-trigger', 'n8n-nodes-base.executeWorkflowTrigger', { entry: 'SUBWORKFLOW', parameterPaths: [parameter('/workflowInputs', 'OBJECT')], endpoints: [], ports: [port()], errorMode: 'STOP', retryMode: 'NONE' }),\n record('subworkflow.execute-workflow', 'n8n-nodes-base.executeWorkflow', { parameterPaths: [parameter('/workflowId', 'STRING', true), parameter('/workflowInputs', 'OBJECT')], destinationPaths: ['/workflowId'], effects: ['START_SUBWORKFLOW'], endpoints: [], ports: [port()], errorMode: 'STOP', retryMode: 'BOUNDED' }),\n record('subworkflow.tool-workflow', '@n8n/n8n-nodes-langchain.toolWorkflow', { parameterPaths: [parameter('/workflowId', 'STRING', true), parameter('/workflowInputs', 'OBJECT')], destinationPaths: ['/workflowId'], effects: ['START_SUBWORKFLOW'], endpoints: [], ports: [port(), port('ai_tool', 0, 'ALL')], errorMode: 'STOP', retryMode: 'BOUNDED' }),\n record('git.git', 'n8n-nodes-base.git', { parameterPaths: [parameter('/operation', 'STRING', true), parameter('/repositoryUrl', 'STRING', true), parameter('/branch', 'STRING')], credentialPaths: ['/credentials'], destinationPaths: ['/repositoryUrl'], effects: ['READ_EXTERNAL', 'WRITE_EXTERNAL'], endpoints: [endpoint('/repositoryUrl')], ports: [port()], errorMode: 'UNKNOWN', retryMode: 'BOUNDED' }),\n\n // Flow-control and trigger records. Versions are the exact `nodeVersions` keys in the pinned\n // wrapper files, rendered as canonical strict semver; they are EQ clauses because behaviour and\n // parameters differ by version. `switch` has no fixed port list: its output count is rule-driven.\n record('flow-control.set', 'n8n-nodes-base.set', {\n versionRange: versions(['1.0.0', '2.0.0', '3.0.0', '3.1.0', '3.2.0', '3.3.0', '3.4.0']),\n parameterPaths: [parameter('/keepOnlySet', 'BOOLEAN'), parameter('/values', 'OBJECT'),\n parameter('/mode', 'STRING'), parameter('/duplicateItem', 'BOOLEAN'),\n parameter('/fields/values', 'OBJECT'), parameter('/assignments', 'OBJECT'),\n parameter('/includeOtherFields', 'BOOLEAN'), parameter('/options', 'OBJECT')],\n ports: [port()],\n }),\n record('flow-control.if', 'n8n-nodes-base.if', {\n versionRange: versions(['1.0.0', '2.0.0', '2.1.0', '2.2.0', '2.3.0']),\n parameterPaths: [parameter('/conditions', 'OBJECT'), parameter('/options', 'OBJECT')],\n ports: [port(), port('main', 1)],\n }),\n record('flow-control.switch', 'n8n-nodes-base.switch', {\n versionRange: versions(['1.0.0', '2.0.0', '3.0.0', '3.1.0', '3.2.0', '3.3.0', '3.4.0']),\n parameterPaths: [parameter('/mode', 'STRING'), parameter('/rules', 'OBJECT'),\n parameter('/value1', 'STRING'), parameter('/numberOutputs', 'NUMBER'),\n parameter('/output', 'STRING'), parameter('/options', 'OBJECT')],\n // Output count is rule-driven; an empty list is the honest claim.\n ports: [],\n }),\n record('flow-control.merge', 'n8n-nodes-base.merge', {\n versionRange: versions(['1.0.0', '2.0.0', '2.1.0', '3.0.0', '3.1.0', '3.2.0']),\n parameterPaths: [parameter('/mode', 'STRING'), parameter('/join', 'STRING'),\n parameter('/combinationMode', 'STRING'), parameter('/joinMode', 'STRING'),\n parameter('/options', 'OBJECT')],\n ports: [port('main', 0, 'ALL')],\n }),\n record('flow-control.split-in-batches', 'n8n-nodes-base.splitInBatches', {\n versionRange: versions(['1.0.0', '2.0.0', '3.0.0']),\n parameterPaths: [parameter('/batchSize', 'NUMBER'), parameter('/options', 'OBJECT')],\n ports: [port(), port('main', 1)],\n }),\n record('flow-control.schedule-trigger', 'n8n-nodes-base.scheduleTrigger', {\n entry: 'TRIGGER', versionRange: versions(['1.0.0', '1.1.0', '1.2.0', '1.3.0']),\n parameterPaths: [parameter('/rule', 'OBJECT')], ports: [port()],\n }),\n // Google Sheets is a network integration, not flow control: conservative read+write effects and\n // the v2 destination parameters, no operation-specific claim. It is not a pure-flow record.\n record('google-workspace.google-sheets', 'n8n-nodes-base.googleSheets', {\n versionRange: versions(['1.0.0', '2.0.0', '3.0.0', '4.0.0', '4.1.0', '4.2.0', '4.3.0', '4.4.0', '4.5.0', '4.6.0', '4.7.0']),\n parameterPaths: [parameter('/resource', 'STRING'), parameter('/operation', 'STRING'),\n parameter('/documentId', 'STRING'), parameter('/sheetName', 'STRING'),\n parameter('/range', 'STRING'), parameter('/columns', 'OBJECT')],\n credentialPaths: ['/credentials/googleApi', '/credentials/googleSheetsOAuth2Api'],\n destinationPaths: ['/documentId', '/sheetName', '/range', '/columns'],\n effects: ['READ_EXTERNAL', 'WRITE_EXTERNAL'],\n endpoints: [endpoint('/documentId')],\n ports: [port()],\n }),\n\n // Five frequent, previously unmodelled families. Versions are EQ clauses taken from the\n // `typeVersion` values actually present in the 11,394 bound readable inputs; anything else\n // (for example telegram typeVersion 2, which upstream does not declare) stays generic fallback.\n // Effects, credential names, destination parameters and ports are read from the pinned\n // `n8n-nodes-base@2.15.1` / `@n8n/n8n-nodes-langchain@2.43.5` files in the source receipts.\n record('message-mcp.gmail', 'n8n-nodes-base.gmail', {\n versionRange: versions(['1.0.0', '2.0.0', '2.1.0', '2.2.0']),\n parameterPaths: [parameter('/resource', 'STRING'), parameter('/operation', 'STRING'),\n parameter('/sendTo', 'STRING'), parameter('/messageId', 'STRING')],\n credentialPaths: ['/credentials/gmailOAuth2'],\n destinationPaths: ['/sendTo', '/messageId', '/threadId'],\n effects: ['READ_EXTERNAL', 'WRITE_EXTERNAL', 'SEND_MESSAGE'],\n endpoints: [endpoint('/sendTo', 'DATA', 'SINK', 'CONFIDENTIALITY')],\n ports: [port()],\n }),\n record('flow-control.wait', 'n8n-nodes-base.wait', {\n versionRange: versions(['1.0.0', '1.1.0']),\n parameterPaths: [parameter('/resume', 'STRING'), parameter('/amount', 'NUMBER'),\n parameter('/unit', 'STRING'), parameter('/dateTime', 'STRING'),\n parameter('/httpMethod', 'STRING'), parameter('/incomingAuthentication', 'STRING')],\n ports: [port()],\n }),\n record('message-mcp.telegram', 'n8n-nodes-base.telegram', {\n versionRange: versions(['1.0.0', '1.1.0', '1.2.0']),\n parameterPaths: [parameter('/resource', 'STRING'), parameter('/operation', 'STRING'),\n parameter('/chatId', 'STRING')],\n credentialPaths: ['/credentials/telegramApi'],\n destinationPaths: ['/chatId'],\n effects: ['READ_EXTERNAL', 'SEND_MESSAGE'],\n endpoints: [endpoint('/chatId', 'DATA', 'SINK', 'BOTH')],\n ports: [port()],\n }),\n record('transform.split-out', 'n8n-nodes-base.splitOut', {\n versionRange: versions(['1.0.0']),\n parameterPaths: [parameter('/fieldToSplitOut', 'STRING', true), parameter('/include', 'STRING'),\n parameter('/options', 'OBJECT')],\n ports: [port()],\n }),\n record('ai.output-parser-structured', '@n8n/n8n-nodes-langchain.outputParserStructured', {\n versionRange: versions(['1.0.0', '1.1.0', '1.2.0', '1.3.0']),\n parameterPaths: [parameter('/schemaType', 'STRING'), parameter('/jsonSchema', 'STRING'),\n parameter('/inputSchema', 'STRING'), parameter('/autoFix', 'BOOLEAN')],\n ports: [port('ai_outputParser', 0, 'EACH'), port('ai_languageModel', 0, 'EACH')],\n }),\n\n // NoOp v1 is a pure passthrough: `properties: []`, no credentials, and `execute()` returns\n // `this.getInputData()` (pinned NoOp.node.js). The pinned file declares no error, retry, or\n // disabled handling of its own, so errorMode/retryMode stay at the catalogue's conservative\n // `UNKNOWN` defaults and disabledMode at `SKIP`.\n record('noop.passthrough', 'n8n-nodes-base.noOp', { versionRange: range('EQ') }),\n];\n\nconst catalogueBody: SemanticCatalogueBodyV2 = { schemaVersion: 'scanner-semantics-v2', id: 'scanner-core-builtins', version: '2.2.0', records, configurationKeys: ['allowNetwork', 'approvedDomains'] };\nexport const BUILTIN_SEMANTIC_CATALOGUE_V2: SemanticCatalogueV2 = admitSemanticCatalogue({ ...catalogueBody, digest: createSemanticCatalogueDigest(catalogueBody) });\n", "import { matchesVersionRange, type VersionRangeV2 } from './version-range';\nimport { parseStrictSemver, type StrictSemver } from './semver';\nimport { SemanticCatalogueAdmissionError } from './catalogue-admission';\nimport type { ResolvedNodeSemanticsV2, SemanticCatalogueV2, SemanticResolutionQueryV2 } from './catalogue-schema';\n\ntype Dict = Record<string, unknown>;\nconst NODE = /^(?:\\*|@?[A-Za-z0-9][A-Za-z0-9._/@-]*\\.[A-Za-z0-9_$-]+)$/;\nconst MAX_ITEMS = 100_000;\nconst CATALOGUE = ['schemaVersion', 'id', 'version', 'records', 'configurationKeys', 'digest'] as const;\nfunction fail(code: 'UNSAFE_INPUT' | 'UNKNOWN_KEY' | 'INVALID_TEXT' | 'INVALID_VERSION' | 'DUPLICATE_RECORD' | 'SEMANTIC_CATALOGUE_AMBIGUOUS', label?: string): never { throw new SemanticCatalogueAdmissionError(code, label); }\nfunction own(input: unknown, allowed: readonly string[], label: string): Dict {\n try {\n if (input === null || typeof input !== 'object' || Array.isArray(input)) return fail('UNSAFE_INPUT', label);\n const proto = Object.getPrototypeOf(input); if (proto !== Object.prototype && proto !== null) return fail('UNSAFE_INPUT', label);\n const names = Object.getOwnPropertyNames(input); if (Object.getOwnPropertySymbols(input).length !== 0) return fail('UNSAFE_INPUT', label);\n for (const name of names) if (!allowed.includes(name)) return fail('UNKNOWN_KEY', `${label}.${name}`);\n const output: Dict = Object.create(null);\n for (const name of names) { const descriptor = Object.getOwnPropertyDescriptor(input, name); if (!descriptor || !('value' in descriptor)) return fail('UNSAFE_INPUT', `${label}.${name}`); output[name] = descriptor.value; }\n return output;\n } catch (error) { if (error instanceof SemanticCatalogueAdmissionError) throw error; return fail('UNSAFE_INPUT', label); }\n}\nfunction text(input: unknown, label: string, maximum = 4_096): string {\n if (typeof input !== 'string' || input.length === 0 || input.length > maximum || input !== input.normalize('NFC')) return fail('INVALID_TEXT', label);\n for (let index = 0; index < input.length; index += 1) { const code = input.charCodeAt(index); if (code <= 0x1f || code >= 0x7f && code <= 0x9f) return fail('INVALID_TEXT', label); if (code >= 0xd800 && code <= 0xdbff) { const next = input.charCodeAt(index + 1); if (next < 0xdc00 || next > 0xdfff) return fail('INVALID_TEXT', label); index += 1; } else if (code >= 0xdc00 && code <= 0xdfff) return fail('INVALID_TEXT', label); }\n if (new TextEncoder().encode(input).length > maximum) return fail('INVALID_TEXT', label);\n return input;\n}\nfunction nodeType(input: unknown, label: string): string { const value = text(input, label, 512); if (!NODE.test(value)) return fail('INVALID_TEXT', label); return value; }\nfunction dense(input: unknown, label: string): unknown[] {\n try {\n if (!Array.isArray(input) || Object.getPrototypeOf(input) !== Array.prototype) return fail('UNSAFE_INPUT', label);\n const length = Object.getOwnPropertyDescriptor(input, 'length'); if (!length || !('value' in length) || typeof length.value !== 'number' || !Number.isSafeInteger(length.value) || length.value < 0 || length.value > MAX_ITEMS) return fail('UNSAFE_INPUT', label);\n const names = Object.getOwnPropertyNames(input); if (names.length !== length.value + 1 || Object.getOwnPropertySymbols(input).length !== 0) return fail('UNSAFE_INPUT', label);\n const output: unknown[] = []; for (let index = 0; index < length.value; index += 1) { if (!names.includes(String(index))) return fail('UNSAFE_INPUT', `${label}[${index}]`); const descriptor = Object.getOwnPropertyDescriptor(input, String(index)); if (!descriptor || !('value' in descriptor)) return fail('UNSAFE_INPUT', `${label}[${index}]`); output.push(descriptor.value); } return output;\n } catch (error) { if (error instanceof SemanticCatalogueAdmissionError) throw error; return fail('UNSAFE_INPUT', label); }\n}\nfunction catalogueRecords(input: unknown): readonly ResolvedNodeSemanticsV2[] {\n try {\n const value = own(input, CATALOGUE, 'catalogue');\n const records = dense(value.records, 'catalogue.records');\n for (let index = 0; index < records.length; index += 1) {\n const item = records[index];\n if (item === null || typeof item !== 'object' || Array.isArray(item)) return fail('UNSAFE_INPUT', `catalogue.records[${index}]`);\n const prototype = Object.getPrototypeOf(item);\n if ((prototype !== Object.prototype && prototype !== null) || Object.getOwnPropertySymbols(item).length !== 0) return fail('UNSAFE_INPUT', `catalogue.records[${index}]`);\n for (const name of Object.getOwnPropertyNames(item)) {\n const descriptor = Object.getOwnPropertyDescriptor(item, name);\n if (!descriptor || !('value' in descriptor)) return fail('UNSAFE_INPUT', `catalogue.records[${index}].${name}`);\n }\n }\n return records as ResolvedNodeSemanticsV2[];\n } catch (error) {\n if (error instanceof SemanticCatalogueAdmissionError) throw error;\n return fail('UNSAFE_INPUT', 'catalogue');\n }\n}\n\nfunction queryValue(input: unknown): { nodeType: string; version: StrictSemver; operation: string | null; aliases: readonly string[] } {\n const value = own(input, ['nodeType', 'version', 'operation', 'aliases'], 'query'); if (!Object.prototype.hasOwnProperty.call(value, 'nodeType') || !Object.prototype.hasOwnProperty.call(value, 'version')) return fail('UNSAFE_INPUT', 'query');\n const node = nodeType(value.nodeType, 'query.nodeType'); let version: StrictSemver; try { version = parseStrictSemver(value.version); } catch { return fail('INVALID_VERSION', 'query.version'); }\n const operation = Object.prototype.hasOwnProperty.call(value, 'operation') ? value.operation === null ? null : text(value.operation, 'query.operation', 256) : null;\n const aliases = Object.prototype.hasOwnProperty.call(value, 'aliases') ? dense(value.aliases, 'query.aliases').map((item, index) => nodeType(item, `query.aliases[${index}]`)) : [];\n if (new Set(aliases).size !== aliases.length) return fail('DUPLICATE_RECORD', 'query.aliases');\n return { nodeType: node, version, operation, aliases: Object.freeze([...aliases].sort()) };\n}\nfunction versionText(value: StrictSemver): string {\n const base = `${value.major}.${value.minor}.${value.patch}`;\n const prerelease = value.prerelease.length ? `-${value.prerelease.join('.')}` : '';\n const build = value.build.length ? `+${value.build.join('.')}` : '';\n return `${base}${prerelease}${build}`;\n}\nfunction addPrereleaseSamples(samples: Set<string>, value: StrictSemver): void {\n if (value.prerelease.length === 0) return;\n const base = `${value.major}.${value.minor}.${value.patch}`; const ids = [...value.prerelease];\n samples.add(versionText(value));\n for (let index = 0; index < ids.length; index += 1) {\n const item = ids[index];\n if (/^\\d+$/.test(item)) {\n const number = Number(item);\n if (Number.isSafeInteger(number)) {\n if (number > 0) samples.add(`${base}-${ids.slice(0, index).concat(String(number - 1)).join('.')}`);\n if (number < Number.MAX_SAFE_INTEGER) samples.add(`${base}-${ids.slice(0, index).concat(String(number + 1)).join('.')}`);\n }\n } else for (const replacement of ['a', 'b', 'z']) samples.add(`${base}-${ids.slice(0, index).concat(replacement).join('.')}`);\n for (const suffix of ['0', '1', 'z']) samples.add(`${base}-${ids.slice(0, index + 1).concat(suffix).join('.')}`);\n }\n}\nfunction addSamples(samples: Set<string>, value: StrictSemver): void {\n const base = `${value.major}.${value.minor}.${value.patch}`;\n samples.add(versionText(value)); samples.add(base); samples.add(`${base}-0`); samples.add(`${base}-z`); addPrereleaseSamples(samples, value);\n if (value.patch < Number.MAX_SAFE_INTEGER) samples.add(`${value.major}.${value.minor}.${value.patch + 1}`);\n if (value.minor < Number.MAX_SAFE_INTEGER) samples.add(`${value.major}.${value.minor + 1}.0`);\n if (value.major < Number.MAX_SAFE_INTEGER) samples.add(`${value.major + 1}.0.0`);\n if (value.patch > 0) samples.add(`${value.major}.${value.minor}.${value.patch - 1}`);\n if (value.minor > 0) samples.add(`${value.major}.${value.minor - 1}.0`);\n if (value.major > 0) samples.add(`${value.major - 1}.0.0`);\n}\nfunction rangeSamples(left: VersionRangeV2, right: VersionRangeV2): readonly string[] {\n const samples = new Set(['0.0.0', '1.0.0', '2.0.0', '999999.0.0']);\n for (const range of [left, right]) for (const clause of range.clauses) for (const comparator of clause) addSamples(samples, parseStrictSemver(comparator.version));\n return [...samples];\n}\nfunction strictSubset(left: VersionRangeV2, right: VersionRangeV2): boolean {\n let rightOnly = false;\n for (const candidate of rangeSamples(left, right)) { let value: StrictSemver; try { value = parseStrictSemver(candidate); } catch { continue; } const leftMatch = matchesVersionRange(value, left); const rightMatch = matchesVersionRange(value, right); if (leftMatch && !rightMatch) return false; if (rightMatch && !leftMatch) rightOnly = true; }\n return rightOnly;\n}\nfunction best(candidates: readonly ResolvedNodeSemanticsV2[]): ResolvedNodeSemanticsV2 | null {\n if (candidates.length === 0) return null;\n const winners = candidates.filter((candidate, index) => candidates.every((other, otherIndex) => index === otherIndex || strictSubset(candidate.versionRange, other.versionRange)));\n if (winners.length !== 1) return fail('SEMANTIC_CATALOGUE_AMBIGUOUS');\n return winners[0];\n}\nexport function resolveNodeSemantics(catalogue: SemanticCatalogueV2, input: SemanticResolutionQueryV2): ResolvedNodeSemanticsV2 | null {\n const query = queryValue(input); const records = catalogueRecords(catalogue);\n let candidates = records.filter((record) => record.nodeType === query.nodeType && matchesVersionRange(query.version, record.versionRange));\n if (candidates.length === 0) candidates = records.filter((record) => query.aliases.includes(record.nodeType) && matchesVersionRange(query.version, record.versionRange));\n if (candidates.length === 0) candidates = records.filter((record) => record.nodeType === '*' && matchesVersionRange(query.version, record.versionRange));\n if (query.operation !== null) { const exact = candidates.filter((record) => record.operation === query.operation); if (exact.length > 0) candidates = exact; else candidates = candidates.filter((record) => record.operation === null); } else candidates = candidates.filter((record) => record.operation === null);\n return best(candidates);\n}\n", "import { sha256 } from '@noble/hashes/sha2.js';\nimport { bytesToHex } from '@noble/hashes/utils.js';\nimport { resolveNodeSemantics } from './catalogue-resolver';\nimport type { ResolvedNodeSemanticsV2, SemanticCatalogueV2, SemanticProvenanceV2 } from './catalogue-schema';\n\n/**\n * Generic semantic fallback for node types the admitted catalogue does not model.\n *\n * Before this module, an unmodelled node resolved to nothing: it was absent from the semantic view\n * and `capabilities/semantic-context.ts` raised `SEMANTIC_CATALOGUE_MISS` at requiredness, which\n * withheld the whole workflow's verdict (`assessment: null`). The catalogued node families are a\n * small subset of n8n's node types, so that refusal applied to nearly every real workflow even\n * though the parameter, credential and destination audits had already run.\n *\n * The fallback states the *assumption* instead of refusing: main-in \u2192 main-out passthrough, both\n * external effects, no claim about destinations, credentials kept where n8n keeps them, and\n * error/retry modes left at the catalogue's own conservative `UNKNOWN`. Parameter auditing does not\n * depend on this record \u2014 the structural policies read node parameters directly \u2014 so the fallback\n * changes what the engine assumes about data flow, never whether it looks. The workflow still\n * receives a coverage diagnostic per fallback node (`SEMANTIC_CATALOGUE_MISS` at degraded\n * requiredness, rendered by the report as `SEMANTIC_CATALOGUE_MISS \u00B7 DEGRADED`); the decision record\n * is `docs/decisions/ADR-generic-node-semantic-fallback.md`.\n *\n * The record is not part of the admitted catalogue: adding it there would move the catalogue digest\n * pinned by the CLI, and the fallback is not a claim about n8n (no upstream page exists for it).\n * Provenance therefore binds to the contract text below rather than to source bytes.\n */\nexport const GENERIC_FALLBACK_SEMANTIC_ID = 'generic.fallback';\n\nconst CONTRACT = 'scanner-core generic node semantic fallback v1: main-in/main-out passthrough, READ_EXTERNAL + WRITE_EXTERNAL, unknown error/retry modes, no destination claim, parameters audited by the structural policies';\nconst PROVENANCE: SemanticProvenanceV2 = Object.freeze({\n sourceUrl: 'https://docs.n8n.io/',\n sourceDigest: bytesToHex(sha256(new TextEncoder().encode(CONTRACT))),\n reviewedAt: '2026-10-17',\n reviewer: 'scanner-core-generic-fallback',\n});\n\nexport type NodeSemanticsQueryV2 = Readonly<{\n type: string;\n typeVersion?: string;\n /** The scanned node's parameter fields, in the normalized engine shape. */\n parameters: readonly Readonly<{ pointer: string; value: unknown }>[];\n scoringEligibility: 'ELIGIBLE' | 'INDETERMINATE';\n}>;\nexport type NodeSemanticsResolutionV2 = Readonly<{\n semantics: ResolvedNodeSemanticsV2;\n origin: 'CATALOGUE' | 'GENERIC_FALLBACK';\n}>;\n\n/** Deep-freezes the record: the semantic view's consumers validate frozen plain data. */\nfunction deepFreeze<T>(value: T, seen = new WeakSet<object>()): T {\n if (value !== null && typeof value === 'object') {\n if (seen.has(value)) return value;\n seen.add(value);\n for (const name of Object.getOwnPropertyNames(value)) {\n const descriptor = Object.getOwnPropertyDescriptor(value, name);\n if (descriptor && 'value' in descriptor) deepFreeze(descriptor.value, seen);\n }\n Object.freeze(value);\n }\n return value;\n}\n\n/**\n * The conservative record for one unmodelled node type. `nodeType` must be the scanned node's own\n * type: `analyzers/destinations/inventory.ts` refuses a record whose `nodeType` does not match.\n */\nexport function createGenericFallbackSemantics(nodeType: string): ResolvedNodeSemanticsV2 {\n return deepFreeze<ResolvedNodeSemanticsV2>({\n semanticId: GENERIC_FALLBACK_SEMANTIC_ID,\n nodeType,\n versionRange: { clauses: [[{ op: 'GTE', version: '1.0.0' }]] },\n operation: null,\n entry: 'NONE',\n parameterPaths: [],\n authentication: null,\n credentialPaths: ['/credentials'],\n destinationPaths: [],\n effects: ['READ_EXTERNAL', 'WRITE_EXTERNAL'],\n endpoints: [],\n ports: [{ type: 'main', index: 0, itemMode: 'EACH' }],\n overwritePaths: [],\n errorMode: 'UNKNOWN',\n retryMode: 'UNKNOWN',\n disabledMode: 'SKIP',\n provenance: PROVENANCE,\n });\n}\n\n/**\n * The one per-node resolution both seams use (`v2/scan-workflow.ts` builds the admitted view from\n * it; `capabilities/semantic-context.ts` derives the coverage diagnostics from it), so a node can\n * never be fallback-covered in one seam and missing in the other.\n *\n * `null` means genuinely unresolvable: the node's fields were not readable\n * (`scoringEligibility: 'INDETERMINATE'`), and the caller keeps the fail-closed miss. A node whose\n * `type` member itself was unreadable never reaches this decision \u2014 the resolver refuses an empty\n * node type and the scan fails closed with `SEMANTIC_CATALOGUE_INVALID`.\n */\nexport function resolveNodeSemanticsForScan(\n catalogue: SemanticCatalogueV2,\n query: NodeSemanticsQueryV2,\n): NodeSemanticsResolutionV2 | null {\n // The shipped pointer match is a suffix match, not pointer equality. It is unchanged here: the\n // per-node resolution seam only needs the top-level parameter and no consumer has demonstrated\n // an ambiguous nested pointer. A string operation always wins; a non-string operation falls\n // through to the action value. A conflicting pair resolves operation-first with no extra\n // diagnostic, and a non-string value on either pointer is never passed to the resolver.\n const operationField = query.parameters.find((field) => field.pointer.endsWith('/operation'));\n const actionField = query.parameters.find((field) => field.pointer.endsWith('/action'));\n const operation = typeof operationField?.value === 'string' ? operationField.value : actionField?.value;\n const semantics = resolveNodeSemantics(catalogue, {\n nodeType: query.type,\n version: query.typeVersion ?? '1.0.0',\n operation: typeof operation === 'string' ? operation : null,\n });\n if (semantics !== null) return Object.freeze({ semantics, origin: 'CATALOGUE' as const });\n if (query.scoringEligibility !== 'ELIGIBLE') return null;\n return Object.freeze({ semantics: createGenericFallbackSemantics(query.type), origin: 'GENERIC_FALLBACK' as const });\n}\n", "import { SCANNER_LIMITS_V2_SCHEMA_VERSION, type ScannerLimitsV2 } from '@hub/contracts';\nimport type { AnalysisDiagnosticV2 } from '../diagnostics/registry';\nimport { parseSourceDocument } from '../source/source-parser';\nimport type { ReadonlySourceDocumentV2, SourceMemberRefV2, SourcePositionV2 } from '../source/source-types';\nimport type { EdgeRefV2, NodeRefV2 } from '../workflow-v2/security-workflow';\nimport type { CapabilityCandidateV2, FindingCandidateV2, SafeFactV2, SubjectV2, TraceV2 } from '../capabilities/scheduler';\n\ndeclare const scannerAdmissionBrandV2: unique symbol;\nexport type ScannerAdmissionSnapshotV2<T> = Readonly<T> & { readonly [scannerAdmissionBrandV2]: 'private' };\nexport type AdmissionSnapshotResultV2<T> =\n | { ok: true; snapshot: ScannerAdmissionSnapshotV2<T> }\n | { ok: false; code: 'UNSAFE_INPUT' | 'LIMIT_EXCEEDED' };\nexport type ParserOwnedAdmissionBoundaryV2 = {\n fromBoundedBytes(bytes: Uint8Array, limits: ScannerLimitsV2): AdmissionSnapshotResultV2<ReadonlySourceDocumentV2>;\n};\n\nconst admittedSnapshotsV2 = new WeakSet<object>();\nconst unsafeInput = Object.freeze({ ok: false, code: 'UNSAFE_INPUT' } as const);\nconst limitExceeded = Object.freeze({ ok: false, code: 'LIMIT_EXCEEDED' } as const);\nexport function isScannerAdmissionSnapshotV2<T = unknown>(value: unknown): value is ScannerAdmissionSnapshotV2<T> {\n return typeof value === 'object' && value !== null && admittedSnapshotsV2.has(value);\n}\nfunction brandSnapshot<T extends object>(value: T): ScannerAdmissionSnapshotV2<T> {\n admittedSnapshotsV2.add(value);\n if (!isScannerAdmissionSnapshotV2<T>(value)) throw new TypeError();\n return value;\n}\n\nfunction freezeGraph<T extends object>(value: T): T {\n const stack: object[] = [value]; const seen = new Set<object>();\n while (stack.length > 0) {\n const current = stack.pop()!;\n if (seen.has(current)) continue;\n seen.add(current);\n for (const key of Object.getOwnPropertyNames(current)) {\n const descriptor = Object.getOwnPropertyDescriptor(current, key);\n if (descriptor && 'value' in descriptor && descriptor.value !== null && typeof descriptor.value === 'object') stack.push(descriptor.value);\n }\n Object.freeze(current);\n }\n return value;\n}\n\nfunction readLimitNumber(input: object, field: string): number | undefined {\n const descriptor = Object.getOwnPropertyDescriptor(input, field);\n if (!descriptor || !('value' in descriptor) || !Number.isSafeInteger(descriptor.value) || descriptor.value < 0) return undefined;\n return descriptor.value;\n}\nfunction readLimitSchemaVersion(input: object): typeof SCANNER_LIMITS_V2_SCHEMA_VERSION | undefined {\n const descriptor = Object.getOwnPropertyDescriptor(input, 'schemaVersion');\n return descriptor && 'value' in descriptor && descriptor.value === SCANNER_LIMITS_V2_SCHEMA_VERSION ? SCANNER_LIMITS_V2_SCHEMA_VERSION : undefined;\n}\nfunction normalizeLimits(input: unknown): ScannerLimitsV2 | undefined {\n if (typeof input !== 'object' || input === null || Array.isArray(input) || Object.getPrototypeOf(input) !== Object.prototype) return undefined;\n const schemaVersion = readLimitSchemaVersion(input);\n const maxBytes = readLimitNumber(input, 'maxBytes'); const maxNodes = readLimitNumber(input, 'maxNodes');\n const maxEdges = readLimitNumber(input, 'maxEdges'); const maxConnectionDepth = readLimitNumber(input, 'maxConnectionDepth');\n const maxParameterDepth = readLimitNumber(input, 'maxParameterDepth'); const maxParameterLeaves = readLimitNumber(input, 'maxParameterLeaves');\n const workerDeadlineMs = readLimitNumber(input, 'workerDeadlineMs'); const maxSyntaxNodes = readLimitNumber(input, 'maxSyntaxNodes');\n const maxDocumentDepth = readLimitNumber(input, 'maxDocumentDepth'); const maxMembersAndElements = readLimitNumber(input, 'maxMembersAndElements');\n const maxRawEdges = readLimitNumber(input, 'maxRawEdges'); const maxDuplicateKeys = readLimitNumber(input, 'maxDuplicateKeys');\n const maxDiagnostics = readLimitNumber(input, 'maxDiagnostics'); const maxStoredSourceSpans = readLimitNumber(input, 'maxStoredSourceSpans');\n const maxSourceWork = readLimitNumber(input, 'maxSourceWork');\n const maxExpressionTokens = readLimitNumber(input, 'maxExpressionTokens'); const maxCodeSyntaxNodes = readLimitNumber(input, 'maxCodeSyntaxNodes');\n const maxGraphOperations = readLimitNumber(input, 'maxGraphOperations'); const maxTaintStates = readLimitNumber(input, 'maxTaintStates');\n const maxTraceStepsPerFinding = readLimitNumber(input, 'maxTraceStepsPerFinding'); const maxFindings = readLimitNumber(input, 'maxFindings');\n const maxRedactionPatches = readLimitNumber(input, 'maxRedactionPatches'); const maxRedactedArtifactBytes = readLimitNumber(input, 'maxRedactedArtifactBytes');\n const maxEvidenceBytes = readLimitNumber(input, 'maxEvidenceBytes'); const maxSerializedResultBytes = readLimitNumber(input, 'maxSerializedResultBytes');\n const maxRuleOperations = readLimitNumber(input, 'maxRuleOperations');\n if (schemaVersion === undefined || maxDiagnostics === undefined || maxDiagnostics < 1 || maxBytes === undefined || maxNodes === undefined ||\n maxEdges === undefined || maxConnectionDepth === undefined || maxParameterDepth === undefined || maxParameterLeaves === undefined ||\n workerDeadlineMs === undefined || maxSyntaxNodes === undefined || maxDocumentDepth === undefined || maxMembersAndElements === undefined ||\n maxRawEdges === undefined || maxDuplicateKeys === undefined || maxStoredSourceSpans === undefined || maxSourceWork === undefined || maxExpressionTokens === undefined ||\n maxCodeSyntaxNodes === undefined || maxGraphOperations === undefined || maxTaintStates === undefined || maxTraceStepsPerFinding === undefined ||\n maxFindings === undefined || maxRedactionPatches === undefined || maxRedactedArtifactBytes === undefined || maxEvidenceBytes === undefined ||\n maxSerializedResultBytes === undefined || maxRuleOperations === undefined) return undefined;\n return Object.freeze({ schemaVersion, maxBytes, maxNodes, maxEdges, maxConnectionDepth, maxParameterDepth, maxParameterLeaves, workerDeadlineMs,\n maxSyntaxNodes, maxDocumentDepth, maxMembersAndElements, maxRawEdges, maxDuplicateKeys, maxDiagnostics, maxStoredSourceSpans,\n maxSourceWork, maxExpressionTokens, maxCodeSyntaxNodes, maxGraphOperations, maxTaintStates, maxTraceStepsPerFinding, maxFindings, maxRedactionPatches,\n maxRedactedArtifactBytes, maxEvidenceBytes, maxSerializedResultBytes, maxRuleOperations });\n}\n\nfunction fromBoundedBytes(bytes: Uint8Array, limits: ScannerLimitsV2): AdmissionSnapshotResultV2<ReadonlySourceDocumentV2> {\n try {\n const normalizedLimits = normalizeLimits(limits);\n if (normalizedLimits === undefined) return unsafeInput;\n const parsed = parseSourceDocument(bytes, normalizedLimits);\n if (!parsed.ok) return parsed.code === 'WORKFLOW_TOO_LARGE' || parsed.code === 'WORKFLOW_TOO_COMPLEX' ? limitExceeded : unsafeInput;\n return Object.freeze({ ok: true, snapshot: brandSnapshot(freezeGraph(parsed.document)) });\n } catch { return unsafeInput; }\n}\n\nfunction copyPosition(input: SourcePositionV2): SourcePositionV2 {\n return Object.freeze({ line: input.line, column: input.column, utf16Offset: input.utf16Offset, utf8ByteOffset: input.utf8ByteOffset });\n}\nfunction copyMemberRef(input: SourceMemberRefV2): SourceMemberRefV2 {\n const span = input.span === null ? null : Object.freeze({ start: copyPosition(input.span.start), end: copyPosition(input.span.end) });\n return Object.freeze({ pointer: input.pointer, occurrencePath: Object.freeze(input.occurrencePath.map((item) => item)), astNodeId: input.astNodeId, span });\n}\nfunction copyNode(input: NodeRefV2): NodeRefV2 {\n const copy: NodeRefV2 = { ordinal: input.ordinal, source: copyMemberRef(input.source), identityDigest: input.identityDigest };\n if (input.explicitId !== undefined) copy.explicitId = input.explicitId;\n if (input.name !== undefined) copy.name = input.name;\n return Object.freeze(copy);\n}\nfunction copyEdge(input: EdgeRefV2): EdgeRefV2 {\n const copy: EdgeRefV2 = { ordinal: input.ordinal, sourceLabel: input.sourceLabel, connectionType: input.connectionType, sourcePort: input.sourcePort,\n targetPort: input.targetPort, source: copyMemberRef(input.source), resolution: input.resolution };\n if (input.sourceNode !== undefined) copy.sourceNode = copyNode(input.sourceNode);\n if (input.targetNode !== undefined) copy.targetNode = copyNode(input.targetNode);\n if (input.targetLabel !== undefined) copy.targetLabel = input.targetLabel;\n return Object.freeze(copy);\n}\nfunction copySubject(input: SubjectV2): SubjectV2 {\n if (input.kind === 'WORKFLOW') return Object.freeze({ kind: 'WORKFLOW' });\n if (input.kind === 'NODE') return Object.freeze({ kind: 'NODE', node: copyNode(input.node) });\n if (input.kind === 'EDGE') return Object.freeze({ kind: 'EDGE', edge: copyEdge(input.edge) });\n return Object.freeze({ kind: 'SOURCE', source: copyMemberRef(input.source) });\n}\n\ntype SafeFactScalarV2 = string | number | boolean | null;\ntype SafeFactPropertyV2 = SafeFactScalarV2 | readonly SafeFactScalarV2[];\nfunction copyFact(input: SafeFactV2): SafeFactV2 {\n const properties: Record<string, SafeFactPropertyV2> = {};\n for (const key of Object.keys(input.properties)) {\n const value = input.properties[key]; properties[key] = Array.isArray(value) ? Object.freeze(value.map((item) => item)) : value;\n }\n return Object.freeze({ factId: input.factId, kind: input.kind, subject: copySubject(input.subject), properties: Object.freeze(properties) });\n}\nfunction copyFinding(input: FindingCandidateV2): FindingCandidateV2 {\n return Object.freeze({ ruleId: input.ruleId, evidenceClass: input.evidenceClass, conclusion: input.conclusion, applicability: input.applicability,\n subject: copySubject(input.subject), factRefs: Object.freeze(input.factRefs.map((item) => item)), traceRefs: Object.freeze(input.traceRefs.map((item) => item)), remediationId: input.remediationId });\n}\ntype MutableDiagnosticV2 = { -readonly [K in keyof AnalysisDiagnosticV2]: AnalysisDiagnosticV2[K] };\nfunction copyDiagnostic(input: AnalysisDiagnosticV2): AnalysisDiagnosticV2 {\n const copy: MutableDiagnosticV2 = { id: input.id, code: input.code, category: input.category, capabilityId: input.capabilityId,\n aggregateEffect: input.aggregateEffect, assessmentEligible: input.assessmentEligible };\n if (input.location !== undefined) copy.location = copyMemberRef(input.location);\n if (input.observed !== undefined) copy.observed = input.observed;\n if (input.maximum !== undefined) copy.maximum = input.maximum;\n if (input.omitted !== undefined) copy.omitted = input.omitted;\n return Object.freeze(copy);\n}\ntype TraceStepV2 = TraceV2['steps'][number];\ntype MutableTraceStepV2 = { -readonly [K in keyof TraceStepV2]: TraceStepV2[K] };\nfunction copyTraceStep(input: TraceStepV2): TraceStepV2 {\n const copy: MutableTraceStepV2 = { ordinal: input.ordinal, kind: input.kind, subject: copySubject(input.subject), factRefs: Object.freeze(input.factRefs.map((item) => item)) };\n return Object.freeze(copy);\n}\nfunction copyTrace(input: TraceV2): TraceV2 {\n return Object.freeze({ traceId: input.traceId, kind: input.kind, steps: Object.freeze(input.steps.map(copyTraceStep)) });\n}\n\nexport function createSafeFactAdmissionSnapshotV2(fact: SafeFactV2): ScannerAdmissionSnapshotV2<SafeFactV2> {\n return brandSnapshot(freezeGraph(copyFact(fact)));\n}\nexport function createCapabilityCandidateAdmissionSnapshotV2(candidate: CapabilityCandidateV2): ScannerAdmissionSnapshotV2<CapabilityCandidateV2> {\n const copy = { findings: Object.freeze(candidate.findings.map(copyFinding)), diagnostics: Object.freeze(candidate.diagnostics.map(copyDiagnostic)),\n facts: Object.freeze(candidate.facts.map(copyFact)), traces: Object.freeze(candidate.traces.map(copyTrace)),\n seen: candidate.seen, analyzed: candidate.analyzed, skipped: candidate.skipped, omitted: candidate.omitted };\n return brandSnapshot(freezeGraph(Object.freeze(copy)));\n}\nexport const ParserOwnedAdmissionBoundaryV2: ParserOwnedAdmissionBoundaryV2 = Object.freeze({ fromBoundedBytes });\n", "import { sha256 } from '@noble/hashes/sha2.js';\nimport { bytesToHex } from '@noble/hashes/utils.js';\nimport { canonicalizeJson } from '../canonical-json';\n\nexport type SafePropertyTypeV2 =\n | 'STRING' | 'INTEGER' | 'BOOLEAN' | 'NULLABLE_STRING' | 'STRING_LIST' | 'INTEGER_LIST';\nexport type SafeFactSchemaV2 = Readonly<{\n kind: string; ownerCapabilityId: string;\n properties: Readonly<Record<string, SafePropertyTypeV2>>;\n maxStringBytes: number; maxItems: number;\n sensitivity: 'PUBLIC_METADATA' | 'REDACTED_SECURITY';\n}>;\nexport type SafeFactRegistryV2 = Readonly<{\n schemaVersion: 'scanner-safe-facts-v2'; version: string;\n schemas: readonly SafeFactSchemaV2[]; digest: string;\n}>;\n\nexport type SafeFactEvidenceMappingV2 = Readonly<{\n ruleId: string; ownerCapabilityId: string; evidenceSchemaId: string;\n factKinds: readonly string[]; factProperties: readonly string[];\n factPropertiesByKind: Readonly<Record<string, readonly string[]>>;\n evidenceClass: 'CAPABILITY' | 'CONFIGURATION' | 'SUSPICIOUS_SYNTAX' | 'POTENTIAL_DATAFLOW';\n}>;\n\nexport type SafeFactSubjectKindV2 = 'WORKFLOW' | 'NODE' | 'EDGE' | 'SOURCE';\nexport type SafeFactSpanPolicyV2 = 'NONE' | 'OPTIONAL_HALF_OPEN';\n\nconst frozenList = <T>(values: readonly T[]): readonly T[] => Object.freeze([...values]);\n\nexport const SAFE_FACT_ENUMS_V2: Readonly<Record<string, readonly string[]>> = Object.freeze({\n businessCategory: frozenList(['MANUAL_AUTOMATION', 'WEBHOOK_API', 'SCHEDULED_AUTOMATION', 'DATA_SYNC', 'NOTIFICATION', 'CUSTOM_LOGIC', 'GENERAL_AUTOMATION']),\n confidence: frozenList(['LOW', 'MEDIUM', 'HIGH']), namespaceClass: frozenList(['OFFICIAL_BASE', 'OFFICIAL_SCOPED', 'NON_OFFICIAL']),\n language: frozenList(['JAVASCRIPT', 'PYTHON']), parseState: frozenList(['VERIFIED', 'RECOVERED']), flowKind: frozenList(['TAINT_SINK', 'AGENT_INFLUENCE']),\n sink: frozenList(['SQL', 'COMMAND', 'SSRF', 'HEADER', 'PATH', 'CODE', 'PROMPT']), scheme: frozenList(['HTTP', 'HTTPS', 'UNKNOWN']),\n authorityState: frozenList(['KNOWN', 'UNKNOWN']), valueMode: frozenList(['LITERAL', 'DYNAMIC', 'UNKNOWN']),\n authenticationState: frozenList(['MISSING', 'NONE', 'AUTHENTICATED', 'UNKNOWN']), applicability: frozenList(['APPLICABLE', 'NOT_APPLICABLE', 'UNKNOWN']),\n reviewState: frozenList(['ADMITTED', 'QUARANTINED', 'WITHDRAWN', 'REJECTED']), observation: frozenList(['AUTH_HEADER', 'SECRET_INDICATOR']),\n secretKind: frozenList(['api key', 'password', 'token', 'secret', 'credential', 'authorization', 'cookie', 'bearer token', 'basic auth', 'Stripe API key', 'Google API key', 'AWS access key', 'Slack token', 'GitHub token', 'JWT', 'Anthropic API key', 'OpenAI API key', 'Hugging Face token', 'Replicate API token', 'opaque secret']),\n capability: frozenList(['EXECUTE_COMMAND', 'CUSTOM_CODE', 'WEBHOOK', 'AI_AGENT', 'AI_TOOL']), taintLabel: frozenList(['WEBHOOK_BODY', 'WEBHOOK_QUERY', 'WEBHOOK_HEADER', 'INBOUND_MESSAGE', 'EXTERNAL_HTTP_RESPONSE', 'EXTERNAL_FILE', 'AI_MODEL_OUTPUT']),\n indicator: frozenList(['EVAL', 'FUNCTION_CONSTRUCTOR', 'EXEC', 'DYNAMIC_IMPORT', 'SECRET_ACCESS', 'ENVIRONMENT_ACCESS', 'NETWORK_ACCESS', 'CHILD_PROCESS_METHOD', 'FILESYSTEM_ACCESS', 'SHELL_SUBPROCESS', 'CHILD_PROCESS_REQUIRE', 'CHILD_PROCESS_IMPORT', 'CHILD_PROCESS_DYNAMIC_IMPORT', 'FILESYSTEM_REQUIRE', 'FILESYSTEM_IMPORT', 'FILESYSTEM_DYNAMIC_IMPORT', 'NETWORK_REQUIRE', 'NETWORK_IMPORT', 'NETWORK_DYNAMIC_IMPORT']),\n configurationIndicator: frozenList(['SENSITIVE_KEY', 'SENSITIVE_VALUE']),\n});\n\nexport const SAFE_FACT_SUBJECT_KINDS_V2: Readonly<Record<string, readonly SafeFactSubjectKindV2[]>> = Object.freeze({\n 'workflow.summary.v1': frozenList<SafeFactSubjectKindV2>(['WORKFLOW']), 'workflow.function.v1': frozenList<SafeFactSubjectKindV2>(['WORKFLOW']), 'workflow.risk-summary.v1': frozenList<SafeFactSubjectKindV2>(['WORKFLOW']),\n 'workflow.fingerprint.v1': frozenList<SafeFactSubjectKindV2>(['WORKFLOW']), 'integration.v1': frozenList<SafeFactSubjectKindV2>(['WORKFLOW']), 'node.capability.v2': frozenList<SafeFactSubjectKindV2>(['NODE']),\n 'node.configuration.v2': frozenList<SafeFactSubjectKindV2>(['SOURCE']), 'code.indicator.v2': frozenList<SafeFactSubjectKindV2>(['SOURCE']), 'dataflow.summary.v2': frozenList<SafeFactSubjectKindV2>(['SOURCE', 'NODE']),\n 'destination.v2': frozenList<SafeFactSubjectKindV2>(['SOURCE']), 'ingress.v2': frozenList<SafeFactSubjectKindV2>(['NODE']), 'advisory.applicability.v2': frozenList<SafeFactSubjectKindV2>(['WORKFLOW']),\n});\n\nexport const SAFE_FACT_SPAN_POLICIES_V2: Readonly<Record<string, SafeFactSpanPolicyV2>> = Object.freeze({\n 'workflow.summary.v1': 'NONE', 'workflow.function.v1': 'NONE', 'workflow.risk-summary.v1': 'NONE', 'workflow.fingerprint.v1': 'NONE',\n 'integration.v1': 'NONE', 'node.capability.v2': 'OPTIONAL_HALF_OPEN', 'node.configuration.v2': 'OPTIONAL_HALF_OPEN',\n 'code.indicator.v2': 'OPTIONAL_HALF_OPEN', 'dataflow.summary.v2': 'OPTIONAL_HALF_OPEN', 'destination.v2': 'OPTIONAL_HALF_OPEN',\n 'ingress.v2': 'OPTIONAL_HALF_OPEN', 'advisory.applicability.v2': 'NONE',\n});\n\nexport const SAFE_FACT_REQUIRED_PROPERTIES_V2: Readonly<Record<string, readonly string[]>> = Object.freeze({\n 'workflow.summary.v1': frozenList(['connectionCount']), 'workflow.function.v1': frozenList(['basicPurpose', 'triggerDescription', 'dataFlowSummary', 'businessCategory', 'confidence']),\n 'workflow.risk-summary.v1': frozenList(['topRisks', 'dataExposure', 'complexityDrivers']), 'workflow.fingerprint.v1': frozenList(['value']),\n 'integration.v1': frozenList(['service', 'usage', 'nodeTypes', 'nodeCount', 'riskNotes']), 'node.capability.v2': frozenList(['nodeType', 'nodePackage', 'namespaceClass', 'capabilities', 'toolCount', 'contextCount']),\n 'node.configuration.v2': frozenList(['observation']), 'code.indicator.v2': frozenList(['language', 'indicator', 'start', 'end', 'parseState']),\n 'dataflow.summary.v2': frozenList(['flowKind', 'propertyPathComplete', 'humanGatePresent', 'humanGateDominates', 'taintLabels']),\n 'destination.v2': frozenList(['parameterPath', 'scheme', 'hostname', 'authorityState', 'valueMode']), 'ingress.v2': frozenList(['authentication', 'authenticationState', 'legacyAuthenticated']),\n 'advisory.applicability.v2': frozenList(['advisoryId', 'applicability', 'reviewState', 'matchedPrerequisites', 'unknownPrerequisites']),\n});\n\nconst STRING_BYTES = 4_096;\nconst schema = (\n kind: string, ownerCapabilityId: string,\n properties: Record<string, SafePropertyTypeV2>,\n sensitivity: SafeFactSchemaV2['sensitivity'],\n): SafeFactSchemaV2 => Object.freeze({\n kind, ownerCapabilityId, properties: Object.freeze(properties),\n maxStringBytes: STRING_BYTES, maxItems: STRING_BYTES, sensitivity,\n});\n\nconst schemas: readonly SafeFactSchemaV2[] = Object.freeze([\n schema('workflow.summary.v1', 'workflow-insights', { connectionCount: 'INTEGER' }, 'PUBLIC_METADATA'),\n schema('workflow.function.v1', 'workflow-insights', {\n basicPurpose: 'STRING', triggerDescription: 'STRING', dataFlowSummary: 'STRING',\n businessCategory: 'STRING', confidence: 'STRING',\n }, 'PUBLIC_METADATA'),\n schema('workflow.risk-summary.v1', 'workflow-insights', {\n topRisks: 'STRING_LIST', dataExposure: 'STRING', complexityDrivers: 'STRING_LIST',\n }, 'REDACTED_SECURITY'),\n schema('workflow.fingerprint.v1', 'source-normalization', { value: 'STRING' }, 'PUBLIC_METADATA'),\n schema('integration.v1', 'workflow-insights', {\n service: 'STRING', usage: 'STRING', nodeTypes: 'STRING_LIST', nodeCount: 'INTEGER', riskNotes: 'STRING_LIST',\n }, 'REDACTED_SECURITY'),\n schema('node.capability.v2', 'structural-policies', {\n nodeType: 'STRING', nodePackage: 'STRING', namespaceClass: 'STRING', capabilities: 'STRING_LIST',\n toolCount: 'INTEGER', contextCount: 'INTEGER',\n }, 'REDACTED_SECURITY'),\n schema('node.configuration.v2', 'structural-policies', {\n observation: 'STRING', header: 'NULLABLE_STRING', literalValue: 'BOOLEAN', parameterPath: 'STRING',\n secretKind: 'STRING', indicator: 'STRING', hasLiteralValue: 'BOOLEAN',\n }, 'REDACTED_SECURITY'),\n schema('code.indicator.v2', 'expression-security', {\n language: 'STRING', indicator: 'STRING', member: 'STRING', start: 'INTEGER', end: 'INTEGER', parseState: 'STRING',\n }, 'REDACTED_SECURITY'),\n schema('dataflow.summary.v2', 'graph-semantics', {\n flowKind: 'STRING', sink: 'STRING', parameterPath: 'STRING', referenceRoot: 'STRING', propertyPath: 'STRING',\n sourceNodeId: 'STRING', sourceNodeName: 'STRING', propertyPathComplete: 'BOOLEAN',\n humanGatePresent: 'BOOLEAN', humanGateDominates: 'BOOLEAN', taintLabels: 'STRING_LIST',\n }, 'REDACTED_SECURITY'),\n schema('destination.v2', 'structural-policies', {\n parameterPath: 'STRING', scheme: 'STRING', hostname: 'NULLABLE_STRING', authorityState: 'STRING', valueMode: 'STRING',\n }, 'REDACTED_SECURITY'),\n schema('ingress.v2', 'structural-policies', {\n authentication: 'NULLABLE_STRING', authenticationState: 'STRING', legacyAuthenticated: 'BOOLEAN',\n }, 'REDACTED_SECURITY'),\n schema('advisory.applicability.v2', 'assessment', {\n advisoryId: 'STRING', applicability: 'STRING', reviewState: 'STRING',\n matchedPrerequisites: 'STRING_LIST', unknownPrerequisites: 'STRING_LIST',\n }, 'REDACTED_SECURITY'),\n]);\n\nconst mapping = (\n ruleId: string, ownerCapabilityId: string, evidenceSchemaId: string,\n factKinds: readonly string[], factProperties: readonly string[],\n evidenceClass: SafeFactEvidenceMappingV2['evidenceClass'],\n factPropertiesByKind: Readonly<Record<string, readonly string[]>> = Object.fromEntries(factKinds.map((kind) => [kind, factProperties])),\n): SafeFactEvidenceMappingV2 => Object.freeze({\n ruleId, ownerCapabilityId, evidenceSchemaId,\n factKinds: Object.freeze([...factKinds]), factProperties: Object.freeze([...factProperties]),\n factPropertiesByKind: Object.freeze(Object.fromEntries(Object.entries(factPropertiesByKind).map(([kind, properties]) => [kind, Object.freeze([...properties])]))) as Readonly<Record<string, readonly string[]>>,\n evidenceClass,\n});\n\nexport const SAFE_FACT_EVIDENCE_MAPPINGS_V2: readonly SafeFactEvidenceMappingV2[] = Object.freeze([\n mapping('N8N_EXECUTE_COMMAND', 'structural-policies', 'v1.node-type', ['node.capability.v2'], ['nodeType'], 'CAPABILITY'),\n mapping('N8N_CODE_NODE', 'structural-policies', 'v1.node-type', ['node.capability.v2'], ['nodeType'], 'CAPABILITY'),\n mapping('RAW_AUTH_HEADER', 'structural-policies', 'v1.auth-header', ['node.configuration.v2'], ['header', 'literalValue'], 'CONFIGURATION'),\n mapping('RAW_SECRET_INDICATOR', 'structural-policies', 'v1.secret-indicator', ['node.configuration.v2'], ['parameterPath', 'secretKind', 'indicator', 'hasLiteralValue'], 'CONFIGURATION'),\n mapping('UNAPPROVED_DOMAIN', 'structural-policies', 'v1.domain', ['destination.v2'], ['hostname'], 'CONFIGURATION'),\n mapping('UNKNOWN_NODE_PACKAGE', 'structural-policies', 'v1.node-package', ['node.capability.v2'], ['nodeType', 'nodePackage'], 'CONFIGURATION'),\n mapping('WEBHOOK_EXPOSURE', 'structural-policies', 'v1.webhook-auth', ['ingress.v2'], ['authentication'], 'CONFIGURATION'),\n mapping('JAVASCRIPT_DYNAMIC_EXECUTION', 'javascript-security', 'v1.code-indicator', ['code.indicator.v2'], ['indicator', 'member', 'start', 'end'], 'SUSPICIOUS_SYNTAX'),\n mapping('PYTHON_DYNAMIC_EXECUTION', 'python-security', 'v1.code-indicator', ['code.indicator.v2'], ['indicator', 'member', 'start', 'end'], 'SUSPICIOUS_SYNTAX'),\n mapping('TAINTED_COMMAND', 'taint-integrity', 'v1.taint', ['dataflow.summary.v2'], ['sink', 'parameterPath', 'referenceRoot', 'propertyPath', 'propertyPathComplete', 'taintLabels', 'sourceNodeId', 'sourceNodeName'], 'POTENTIAL_DATAFLOW', { 'dataflow.summary.v2': ['sink', 'taintLabels', 'parameterPath', 'referenceRoot', 'propertyPath', 'propertyPathComplete', 'sourceNodeId', 'sourceNodeName'] }),\n mapping('TAINTED_SQL_QUERY', 'taint-integrity', 'v1.taint', ['dataflow.summary.v2'], ['sink', 'parameterPath', 'referenceRoot', 'propertyPath', 'propertyPathComplete', 'taintLabels', 'sourceNodeId', 'sourceNodeName'], 'POTENTIAL_DATAFLOW', { 'dataflow.summary.v2': ['sink', 'taintLabels', 'parameterPath', 'referenceRoot', 'propertyPath', 'propertyPathComplete', 'sourceNodeId', 'sourceNodeName'] }),\n mapping('TAINTED_REQUEST_URL', 'taint-integrity', 'v1.taint', ['dataflow.summary.v2'], ['sink', 'parameterPath', 'referenceRoot', 'propertyPath', 'propertyPathComplete', 'taintLabels', 'sourceNodeId', 'sourceNodeName'], 'POTENTIAL_DATAFLOW', { 'dataflow.summary.v2': ['sink', 'taintLabels', 'parameterPath', 'referenceRoot', 'propertyPath', 'propertyPathComplete', 'sourceNodeId', 'sourceNodeName'] }),\n mapping('TAINTED_FILE_PATH', 'taint-integrity', 'v1.taint', ['dataflow.summary.v2'], ['sink', 'parameterPath', 'referenceRoot', 'propertyPath', 'propertyPathComplete', 'taintLabels', 'sourceNodeId', 'sourceNodeName'], 'POTENTIAL_DATAFLOW', { 'dataflow.summary.v2': ['sink', 'taintLabels', 'parameterPath', 'referenceRoot', 'propertyPath', 'propertyPathComplete', 'sourceNodeId', 'sourceNodeName'] }),\n mapping('TAINTED_CODE_INPUT', 'taint-integrity', 'v1.taint', ['dataflow.summary.v2'], ['sink', 'parameterPath', 'referenceRoot', 'propertyPath', 'propertyPathComplete', 'taintLabels', 'sourceNodeId', 'sourceNodeName'], 'POTENTIAL_DATAFLOW', { 'dataflow.summary.v2': ['sink', 'taintLabels', 'parameterPath', 'referenceRoot', 'propertyPath', 'propertyPathComplete', 'sourceNodeId', 'sourceNodeName'] }),\n mapping('TAINTED_REQUEST_HEADER', 'taint-integrity', 'v1.taint', ['dataflow.summary.v2'], ['sink', 'parameterPath', 'referenceRoot', 'propertyPath', 'propertyPathComplete', 'taintLabels', 'sourceNodeId', 'sourceNodeName'], 'POTENTIAL_DATAFLOW', { 'dataflow.summary.v2': ['sink', 'taintLabels', 'parameterPath', 'referenceRoot', 'propertyPath', 'propertyPathComplete', 'sourceNodeId', 'sourceNodeName'] }),\n mapping('TAINTED_AI_PROMPT', 'taint-integrity', 'v1.taint', ['dataflow.summary.v2'], ['sink', 'parameterPath', 'referenceRoot', 'propertyPath', 'propertyPathComplete', 'taintLabels', 'sourceNodeId', 'sourceNodeName'], 'POTENTIAL_DATAFLOW', { 'dataflow.summary.v2': ['sink', 'taintLabels', 'parameterPath', 'referenceRoot', 'propertyPath', 'propertyPathComplete', 'sourceNodeId', 'sourceNodeName'] }),\n mapping('AI_AGENT_UNGATED_TOOL', 'agentic-control', 'v1.agent-control', ['node.capability.v2', 'dataflow.summary.v2'], ['toolCount', 'contextCount', 'taintLabels', 'humanGatePresent', 'humanGateDominates'], 'CAPABILITY', { 'node.capability.v2': ['toolCount', 'contextCount'], 'dataflow.summary.v2': ['taintLabels', 'humanGatePresent', 'humanGateDominates'] }),\n]);\n\nconst body = Object.freeze({ schemaVersion: 'scanner-safe-facts-v2' as const, version: '2.0.0', schemas });\nexport const SAFE_FACT_REGISTRY_V2: SafeFactRegistryV2 = Object.freeze({\n ...body, digest: bytesToHex(sha256(new TextEncoder().encode(canonicalizeJson(body)))),\n});\n\nconst authorityBody = Object.freeze({\n ...body, enums: SAFE_FACT_ENUMS_V2, subjects: SAFE_FACT_SUBJECT_KINDS_V2, spans: SAFE_FACT_SPAN_POLICIES_V2,\n requiredProperties: SAFE_FACT_REQUIRED_PROPERTIES_V2, evidenceMappings: SAFE_FACT_EVIDENCE_MAPPINGS_V2,\n});\nexport const SAFE_FACT_AUTHORITY_DIGEST_V2 = bytesToHex(sha256(new TextEncoder().encode(canonicalizeJson(authorityBody))));\n", "import type { ScannerLimitsV2 } from '@hub/contracts';\nimport { sha256 } from '@noble/hashes/sha2.js';\nimport { bytesToHex } from '@noble/hashes/utils.js';\nimport { canonicalizeJson } from '../canonical-json';\nimport { createEdgeIdentityDigest, createNodeIdentityDigest } from '../workflow-v2/node-edge-identity';\nimport type { SafeFactV2, SubjectV2 } from '../capabilities/scheduler';\nimport type { EdgeRefV2, NodeRefV2 } from '../workflow-v2/security-workflow';\nimport type { SourceMemberRefV2, SourcePositionV2, SourceSpanV2 } from '../source/source-types';\nimport { createSafeFactAdmissionSnapshotV2, isScannerAdmissionSnapshotV2 } from '../admission/snapshot';\nimport {\n SAFE_FACT_ENUMS_V2, SAFE_FACT_REGISTRY_V2, SAFE_FACT_REQUIRED_PROPERTIES_V2, SAFE_FACT_SPAN_POLICIES_V2,\n SAFE_FACT_SUBJECT_KINDS_V2, type SafeFactSchemaV2,\n} from './safe-fact-registry';\n\nexport type SafeFactRejectionReasonV2 = 'UNKNOWN_FACT_KIND' | 'UNKNOWN_PROPERTY' | 'INVALID_PROPERTY' | 'INVALID_SUBJECT' | 'FORBIDDEN_CONTENT' | 'LIMIT_EXCEEDED' | 'UNSAFE_INPUT' | 'REGISTRY_MISMATCH';\nexport type SafeFactValidationResultV2 = Readonly<{ ok: true; fact: SafeFactV2 } | { ok: false; code: 'SAFE_FACT_REJECTED'; reason: SafeFactRejectionReasonV2 }>;\nexport type SafeFactSubjectV2 = Readonly<SubjectV2>;\ntype Bad = SafeFactRejectionReasonV2;\ntype Property = string | number | boolean | null | readonly (string | number | boolean | null)[];\ntype RecordValue = Record<string, unknown>;\n\nconst LIMITS = ['schemaVersion', 'maxBytes', 'maxNodes', 'maxEdges', 'maxConnectionDepth', 'maxParameterDepth', 'maxParameterLeaves', 'workerDeadlineMs', 'maxSyntaxNodes', 'maxDocumentDepth', 'maxMembersAndElements', 'maxRawEdges', 'maxDuplicateKeys', 'maxDiagnostics', 'maxStoredSourceSpans', 'maxSourceWork', 'maxExpressionTokens', 'maxCodeSyntaxNodes', 'maxGraphOperations', 'maxTaintStates', 'maxTraceStepsPerFinding', 'maxFindings', 'maxRedactionPatches', 'maxRedactedArtifactBytes', 'maxEvidenceBytes', 'maxSerializedResultBytes', 'maxRuleOperations'] as const;\nconst FACT_KEYS = ['factId', 'kind', 'subject', 'properties'];\nconst SECRET = /\\bsecureflow[-_ ]?token\\b|\\b(?:sk[-_]?(?:live|test|proj)[-_][\\w-]+|AIza[\\w-]{35}|AKIA[0-9A-Z]{16}|eyJ[\\w-]{12,}\\.[\\w-]{8,}|(?:api[ _-]*key|password|secret|credential|authorization|cookie|bearer(?:[ _-]*token)?|basic[ _-]*auth|access[ _-]*(?:key|token)|token)\\s*[:=]\\s*[^\\s,;]+|[A-Za-z][\\w-]*(?:api[ _-]*key|password|secret|credential|authorization|cookie|bearer(?:[ _-]*token)?|basic[ _-]*auth|access[ _-]*(?:key|token))\\s*[:=])/i;\nconst CODE = /\\b(?:require|import|export|const|let|var|function|return|class)\\b|\\bprocess\\.env\\b|\\bconsole\\.[A-Za-z_$][\\w$]*\\s*\\(|\\b[A-Za-z_$][\\w$]*\\.[A-Za-z_$][\\w$]*\\s*\\(|\\(\\s*[\"']/;\nconst PATH = /(?:^|[/\\\\])\\.\\.(?:[/\\\\]|$)|^(?:[/\\\\]|~[/\\\\]|[A-Za-z]:[/\\\\]|\\\\\\\\)/;\nconst PROSE = /\\b(?:source\\s+(?:code|snippet|prose|text)|snippet\\s+(?:code|prose|text))\\b|\\b(?:source|snippet)\\s*[:=]|(?:https?|ftp):\\/\\/|\\bAuthorization\\s*:|\\b(?:DROP\\s+TABLE|DELETE\\s+FROM|INSERT\\s+INTO|UPDATE\\s+\\w+\\s+SET|SELECT\\s+.+\\s+FROM)\\b/i;\nfunction fail(reason: Bad): never { throw reason; }\nexport function readPlainRecord(input: unknown, allowed: readonly string[], required: readonly string[] = allowed, rejectSymbols = true): RecordValue { const value = record(input, allowed, 'UNKNOWN_PROPERTY'); if (!rejectSymbols && Object.getOwnPropertySymbols(value).length !== 0) fail('UNSAFE_INPUT'); for (const key of required) data(value, key, 'INVALID_PROPERTY'); return value; }\nexport function readArrayLength(input: unknown, maximum: number, dense = true): number { if (!Array.isArray(input) || Object.getPrototypeOf(input) !== Array.prototype) fail('UNSAFE_INPUT'); const descriptor = Object.getOwnPropertyDescriptor(input, 'length'); if (!descriptor || !('value' in descriptor)) fail('UNSAFE_INPUT'); const length = integer(descriptor.value, 0, 'UNSAFE_INPUT'); if (length > maximum) fail('LIMIT_EXCEEDED'); if (dense) readDenseArray(input, maximum); return length; }\nexport function readArrayItem(input: unknown, index: number): unknown { if (!Array.isArray(input) || Object.getPrototypeOf(input) !== Array.prototype) fail('UNSAFE_INPUT'); return data(input, String(index), 'UNSAFE_INPUT'); }\nexport function readDenseArray(input: unknown, maximum: number): unknown[] { const length = readArrayLength(input, maximum, false); const names = Object.getOwnPropertyNames(input as object); if (names.length !== length + 1 || Object.getOwnPropertySymbols(input as object).length !== 0) fail('UNSAFE_INPUT'); for (const name of names) if (name !== 'length' && (!/^(0|[1-9]\\d*)$/.test(name) || Number(name) >= length)) fail('UNSAFE_INPUT'); const output: unknown[] = []; for (let index = 0; index < length; index += 1) output.push(readArrayItem(input, index)); return output; }\nexport function readSourceMemberRef(input: unknown, limits: ScannerLimitsV2): SourceMemberRefV2 { return sourceRef(input, { maxMembersAndElements: limits.maxMembersAndElements, maxStoredSourceSpans: limits.maxStoredSourceSpans }, true); }\nexport function readSubject(input: unknown, limits: ScannerLimitsV2): SafeFactSubjectV2 { return subject(input, '', { maxNodes: limits.maxNodes, maxMembersAndElements: limits.maxMembersAndElements, maxStoredSourceSpans: limits.maxStoredSourceSpans }); }\nexport function freezeData<T>(value: T): T { if (value !== null && typeof value === 'object') { for (const key of Object.getOwnPropertyNames(value)) { const descriptor = Object.getOwnPropertyDescriptor(value, key); if (descriptor && 'value' in descriptor) freezeData(descriptor.value); } Object.freeze(value); } return value; }\nfunction data(input: object, key: string, missing: Bad = 'UNSAFE_INPUT'): unknown { const descriptor = Object.getOwnPropertyDescriptor(input, key); if (!descriptor) fail(missing); if (!('value' in descriptor)) fail('UNSAFE_INPUT'); return descriptor.value; }\nfunction record(input: unknown, allowed: readonly string[], unknownReason: Bad, maximum?: number): RecordValue {\n if (input === null || typeof input !== 'object' || Array.isArray(input) || Object.getPrototypeOf(input) !== Object.prototype) fail('UNSAFE_INPUT');\n const value = input as RecordValue; const names = Object.getOwnPropertyNames(value);\n if (maximum !== undefined && names.length > maximum) fail('LIMIT_EXCEEDED'); if (Object.getOwnPropertySymbols(value).length !== 0) fail('UNSAFE_INPUT');\n for (const name of names) if (!allowed.includes(name)) fail(unknownReason); for (const name of names) data(value, name);\n return value;\n}\nfunction exactRecord(input: unknown, keys: readonly string[], reason: Bad): RecordValue { const value = record(input, keys, reason); if (Object.getOwnPropertyNames(value).length !== keys.length) fail(reason); return value; }\nfunction integer(input: unknown, minimum = 0, reason: Bad = 'INVALID_PROPERTY'): number { if (typeof input !== 'number' || !Number.isSafeInteger(input) || input < minimum) fail(reason); return input; }\nfunction utf8Bytes(value: string, maximum: number): number {\n let bytes = 0;\n for (let index = 0; index < value.length; index += 1) {\n const code = value.charCodeAt(index); const next = value.charCodeAt(index + 1);\n if (code === 0 || code >= 0xdc00 && code <= 0xdfff || code >= 0xd800 && code <= 0xdbff && (Number.isNaN(next) || next < 0xdc00 || next > 0xdfff)) fail('FORBIDDEN_CONTENT');\n if (code >= 0xd800) { bytes += 4; index += 1; } else bytes += code <= 0x7f ? 1 : code <= 0x7ff ? 2 : 3;\n if (bytes > maximum) fail('LIMIT_EXCEEDED');\n } return bytes; }\nfunction stringValue(input: unknown, maximum: number): string { if (typeof input !== 'string') fail('INVALID_PROPERTY'); utf8Bytes(input, maximum); return input; }\nfunction safeText(input: unknown, maximum: number): string { const value = stringValue(input, maximum); if (SECRET.test(value) || PROSE.test(value) || PATH.test(value) || CODE.test(value)) fail('FORBIDDEN_CONTENT'); return value; }\n// A display name is text the user chose, so every visible class is admissible: letters, marks,\n// numbers, punctuation, symbols, and spaces. Only the invisible classes stay refused \u2014 control,\n// format, surrogate, private-use, unassigned, and line/paragraph separators \u2014 with the two text\n// joiners exempted because ZWJ and ZWNJ compose real scripts and emoji sequences. `INVISIBLE`\n// exempts them by inspection, so `JOINERS_ONLY` keeps an all-joiner string (invisible content) out.\nconst INVISIBLE = /(?![\\u200C\\u200D])[\\p{C}\\p{Zl}\\p{Zp}]/u;\nconst JOINERS_ONLY = /^[\\u200C\\u200D]*$/u;\nfunction display(input: unknown, maximum: number): string { const value = safeText(input, maximum); if (INVISIBLE.test(value) || JOINERS_ONLY.test(value)) fail('FORBIDDEN_CONTENT'); return value; }\nfunction pointer(input: unknown): string { const value = stringValue(input, 2_048); if (!/^(?:|\\/(?:[^~]|~0|~1)*)$/.test(value)) fail('INVALID_PROPERTY'); return value; }\nfunction field(kind: string, key: string, input: unknown, maximum: number): string {\n if (key === 'member') { const value = stringValue(input, maximum); if (!/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(value) || SECRET.test(value)) fail('FORBIDDEN_CONTENT'); return value; }\n if (key === 'header') { const value = stringValue(input, maximum); if (!/^[A-Za-z][A-Za-z0-9-]{0,62}$/.test(value)) fail('FORBIDDEN_CONTENT'); return value; }\n if (key === 'parameterPath' || key === 'propertyPath') return pointer(input);\n if (key === 'referenceRoot') { const value = stringValue(input, maximum); const parts = value.split('.'); const first = parts.shift() ?? ''; const valid = (/^\\$[A-Za-z_][A-Za-z0-9_]*$/.test(first) || /^[A-Z][A-Z0-9_]*$/.test(first)) && parts.every((part) => /^[A-Za-z_][A-Za-z0-9_]*$/.test(part)); if (!valid) fail('FORBIDDEN_CONTENT'); return value; }\n if (key === 'nodeType' || key === 'nodeTypes') { const value = stringValue(input, maximum); if (!/^@?[A-Za-z0-9][A-Za-z0-9._/@-]*\\.[A-Za-z0-9_$-]+$/.test(value) || SECRET.test(value)) fail('FORBIDDEN_CONTENT'); return value; }\n if (key === 'nodePackage') { const value = stringValue(input, maximum); if (!/^@?[A-Za-z0-9][A-Za-z0-9._/-]*$/.test(value) || SECRET.test(value)) fail('FORBIDDEN_CONTENT'); return value; }\n if (key === 'sourceNodeId') { const value = stringValue(input, maximum); if (!/^[A-Za-z0-9][A-Za-z0-9._:@-]{0,127}$/.test(value) || SECRET.test(value)) fail('FORBIDDEN_CONTENT'); return value; }\n if (key === 'sourceNodeName' || key === 'sourceLabel' || key === 'targetLabel' || key === 'connectionType') return display(input, maximum);\n if (kind === 'integration.v1' && key === 'service') { const value = display(input, maximum); if (/\\b(?:api[ _-]*key|password|secret|credential|authorization|cookie|bearer|basic auth|token)\\b/i.test(value)) fail('FORBIDDEN_CONTENT'); return value; }\n if (kind === 'advisory.applicability.v2' && ['advisoryId', 'matchedPrerequisites', 'unknownPrerequisites'].includes(key)) { const value = stringValue(input, maximum); if (!/^[A-Za-z0-9][A-Za-z0-9._:/-]{0,255}$/.test(value) || /(?:https?|ftp):\\/\\//i.test(value) || /\\b\\d+\\.\\d+\\.\\d+[-~^]\\d+\\.\\d+\\.\\d+\\b/.test(value)) fail('FORBIDDEN_CONTENT'); return value; }\n return safeText(input, maximum);\n}\nfunction enumValue(input: unknown, key: string, kind: string, maximum: number): string { const value = stringValue(input, maximum); const enumKey = kind === 'node.configuration.v2' && key === 'indicator' ? 'configurationIndicator' : key === 'capabilities' ? 'capability' : key === 'taintLabels' ? 'taintLabel' : key; const values = SAFE_FACT_ENUMS_V2[enumKey]; if (values === undefined || !values.includes(value)) fail('INVALID_PROPERTY'); return value; }\nfunction boundedLimit(input: unknown, key: string): number {\n if (input === null || typeof input !== 'object' || Array.isArray(input) || Object.getPrototypeOf(input) !== Object.prototype) fail('UNSAFE_INPUT');\n const value = data(input, key);\n if (key === 'schemaVersion') { if (value !== 'scanner-limits-v2') fail('UNSAFE_INPUT'); return 0; }\n if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < 0 || key === 'maxDiagnostics' && value < 1) fail('UNSAFE_INPUT');\n return value;\n}\nfunction limitsSnapshot(input: unknown): Record<string, number> { const result: Record<string, number> = {}; for (const key of LIMITS) result[key] = boundedLimit(input, key); return result; }\nfunction arrayValue(input: unknown, maximum: number): unknown[] {\n if (!Array.isArray(input) || Object.getPrototypeOf(input) !== Array.prototype) fail('UNSAFE_INPUT');\n const lengthDescriptor = Object.getOwnPropertyDescriptor(input, 'length'); if (!lengthDescriptor || !('value' in lengthDescriptor)) fail('UNSAFE_INPUT'); const length = integer(lengthDescriptor.value, 0, 'UNSAFE_INPUT'); if (length > maximum) fail('LIMIT_EXCEEDED');\n const names = Object.getOwnPropertyNames(input); if (names.length !== length + 1 || Object.getOwnPropertySymbols(input).length !== 0) fail('UNSAFE_INPUT'); for (const name of names) if (name !== 'length' && (!/^(0|[1-9]\\d*)$/.test(name) || Number(name) >= length)) fail('UNSAFE_INPUT');\n const result: unknown[] = []; for (let index = 0; index < length; index += 1) result.push(data(input, String(index), 'UNSAFE_INPUT')); return result;\n}\nfunction position(input: unknown): SourcePositionV2 { const value = exactRecord(input, ['line', 'column', 'utf16Offset', 'utf8ByteOffset'], 'INVALID_SUBJECT'); return { line: integer(data(value, 'line', 'INVALID_SUBJECT'), 1), column: integer(data(value, 'column', 'INVALID_SUBJECT'), 1), utf16Offset: integer(data(value, 'utf16Offset', 'INVALID_SUBJECT')), utf8ByteOffset: integer(data(value, 'utf8ByteOffset', 'INVALID_SUBJECT')) }; }\nfunction sourceRef(input: unknown, limits: Record<string, number>, allowSpan: boolean): SourceMemberRefV2 { const value = exactRecord(input, ['pointer', 'occurrencePath', 'astNodeId', 'span'], 'INVALID_SUBJECT');\n const occurrencePath = arrayValue(data(value, 'occurrencePath', 'INVALID_SUBJECT'), limits.maxMembersAndElements).map((item) => integer(item, 0, 'INVALID_SUBJECT'));\n const astNodeId = stringValue(data(value, 'astNodeId', 'INVALID_SUBJECT'), 64);\n if (!/^[0-9a-f]{64}$/.test(astNodeId)) fail('INVALID_SUBJECT');\n const rawSpan = data(value, 'span', 'INVALID_SUBJECT'); let span: SourceSpanV2 | null = null;\n if (rawSpan !== null) {\n if (!allowSpan) fail('INVALID_SUBJECT'); if (limits.maxStoredSourceSpans < 1) fail('LIMIT_EXCEEDED');\n const spanValue = exactRecord(rawSpan, ['start', 'end'], 'INVALID_SUBJECT'); const start = position(data(spanValue, 'start', 'INVALID_SUBJECT')); const end = position(data(spanValue, 'end', 'INVALID_SUBJECT'));\n if (!(end.line > start.line || end.line === start.line && end.column > start.column) || end.utf16Offset <= start.utf16Offset || end.utf8ByteOffset <= start.utf8ByteOffset) fail('INVALID_SUBJECT'); span = { start, end };\n }\n return { pointer: pointer(data(value, 'pointer', 'INVALID_SUBJECT')), occurrencePath, astNodeId, span };\n}\nfunction nodeRef(input: unknown, limits: Record<string, number>, allowSpan: boolean): NodeRefV2 { const value = record(input, ['ordinal', 'source', 'identityDigest', 'explicitId', 'name'], 'INVALID_SUBJECT');\n const ordinal = integer(data(value, 'ordinal', 'INVALID_SUBJECT'));\n if (ordinal >= limits.maxNodes) fail('LIMIT_EXCEEDED');\n const source = sourceRef(data(value, 'source', 'INVALID_SUBJECT'), limits, allowSpan);\n const identityDigest = stringValue(data(value, 'identityDigest', 'INVALID_SUBJECT'), 64);\n if (!/^[0-9a-f]{64}$/.test(identityDigest) || identityDigest !== createNodeIdentityDigest(ordinal, source)) fail('INVALID_SUBJECT');\n const result: NodeRefV2 = { ordinal, source, identityDigest };\n if (Object.prototype.hasOwnProperty.call(value, 'explicitId')) result.explicitId = display(data(value, 'explicitId'), 4_096);\n if (Object.prototype.hasOwnProperty.call(value, 'name')) result.name = display(data(value, 'name'), 4_096);\n return result;\n}\nfunction subject(input: unknown, kind: string, limits: Record<string, number>): SafeFactSubjectV2 {\n const value = record(input, ['kind', 'node', 'source'], 'INVALID_SUBJECT');\n const subjectKind = data(value, 'kind', 'INVALID_SUBJECT');\n const allowSpan = kind === '' || SAFE_FACT_SPAN_POLICIES_V2[kind] === 'OPTIONAL_HALF_OPEN';\n if (subjectKind === 'WORKFLOW') { exactRecord(value, ['kind'], 'INVALID_SUBJECT'); return { kind: 'WORKFLOW' }; }\n if (subjectKind === 'NODE') { exactRecord(value, ['kind', 'node'], 'INVALID_SUBJECT'); return { kind: 'NODE', node: nodeRef(data(value, 'node', 'INVALID_SUBJECT'), limits, allowSpan) }; }\n if (subjectKind === 'SOURCE') { exactRecord(value, ['kind', 'source'], 'INVALID_SUBJECT'); return { kind: 'SOURCE', source: sourceRef(data(value, 'source', 'INVALID_SUBJECT'), limits, allowSpan) }; }\n fail('INVALID_SUBJECT');\n}\nfunction properties(kind: string, schema: SafeFactSchemaV2, input: unknown, limits: Record<string, number>): Record<string, Property> {\n const allowed = Object.getOwnPropertyNames(schema.properties);\n const value = record(input, allowed, 'UNKNOWN_PROPERTY', limits.maxMembersAndElements);\n const required = SAFE_FACT_REQUIRED_PROPERTIES_V2[kind]; if (required === undefined) fail('UNKNOWN_FACT_KIND');\n for (const key of required) data(value, key, 'INVALID_PROPERTY');\n const observation = kind === 'node.configuration.v2' ? enumValue(data(value, 'observation', 'INVALID_PROPERTY'), 'observation', kind, schema.maxStringBytes) : undefined;\n if (observation === 'AUTH_HEADER') exactRecord(value, ['observation', 'header', 'literalValue'], 'INVALID_PROPERTY');\n if (observation === 'SECRET_INDICATOR') exactRecord(value, ['observation', 'parameterPath', 'secretKind', 'indicator', 'hasLiteralValue'], 'INVALID_PROPERTY');\n let malformedAuth = false;\n if (kind === 'ingress.v2') {\n const auth = data(value, 'authentication', 'INVALID_PROPERTY');\n if (auth !== null) { try { const text = stringValue(auth, schema.maxStringBytes); malformedAuth = !/^[A-Za-z][A-Za-z0-9_.-]{0,63}$/.test(text) || SECRET.test(text) || PATH.test(text); } catch { malformedAuth = true; } }\n }\n const output: Record<string, Property> = {};\n for (const key of allowed) {\n if (!Object.prototype.hasOwnProperty.call(value, key) || malformedAuth && key !== 'authentication') continue;\n const raw = data(value, key); const type = schema.properties[key];\n if (kind === 'code.indicator.v2' && key === 'member') {\n if (typeof raw !== 'string') continue;\n try { output[key] = field(kind, key, raw, schema.maxStringBytes); } catch (error) {\n if (error === 'LIMIT_EXCEEDED' || raw.includes('\\0') || /(?:https?|ftp):\\/\\//i.test(raw)) continue;\n throw error;\n }\n continue;\n }\n if (kind === 'ingress.v2' && key === 'authentication' && malformedAuth) { output[key] = null; continue; }\n if (type === 'STRING') output[key] = ['businessCategory', 'confidence', 'namespaceClass', 'language', 'parseState', 'flowKind', 'sink', 'scheme', 'authorityState', 'valueMode', 'authenticationState', 'applicability', 'reviewState', 'observation', 'secretKind', 'indicator'].includes(key) ? enumValue(raw, key, kind, schema.maxStringBytes) : field(kind, key, raw, schema.maxStringBytes);\n else if (type === 'NULLABLE_STRING') output[key] = raw === null ? null : key === 'hostname' ? stringValue(raw, 253) : field(kind, key, raw, schema.maxStringBytes);\n else if (type === 'BOOLEAN') { if (typeof raw !== 'boolean') fail('INVALID_PROPERTY'); output[key] = raw; }\n else if (type === 'INTEGER') output[key] = integer(raw, key === 'nodeCount' ? 1 : 0);\n else if (type === 'STRING_LIST') {\n const maximum = kind === 'workflow.risk-summary.v1' || key === 'riskNotes' ? 3 : kind === 'integration.v1' && key === 'nodeTypes' ? Math.min(schema.maxItems, limits.maxNodes) : Math.min(schema.maxItems, limits.maxMembersAndElements);\n output[key] = Object.freeze(arrayValue(raw, maximum).map((item) => ['capabilities', 'taintLabels'].includes(key) ? enumValue(item, key, kind, schema.maxStringBytes) : field(kind, key, item, schema.maxStringBytes)));\n } else if (type === 'INTEGER_LIST') output[key] = Object.freeze(arrayValue(raw, Math.min(schema.maxItems, limits.maxMembersAndElements)).map((item) => integer(item)));\n else fail('REGISTRY_MISMATCH');\n }\n if (malformedAuth) return { authentication: null, authenticationState: 'UNKNOWN', legacyAuthenticated: false };\n if (kind === 'code.indicator.v2' && typeof output.start === 'number' && typeof output.end === 'number' && output.start >= output.end) fail('INVALID_PROPERTY');\n if (kind === 'workflow.fingerprint.v1' && (typeof output.value !== 'string' || !/^[0-9a-f]{64}$/.test(output.value))) fail('INVALID_PROPERTY');\n if (kind === 'destination.v2' && typeof output.hostname === 'string' && !/^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/.test(output.hostname)) fail('INVALID_PROPERTY');\n return output;\n}\n/**\n * The producer-side half of the invariant `validateSafeFact` enforces when it recomputes a fact's\n * ID: the ID hashes the canonical properties, not the ones a capability handed in. Property values\n * that survive validation are returned unchanged, so every admissible fact keeps the ID it had.\n *\n * The one rewrite is the ingress quarantine: a value the ingress rule refuses becomes\n * `{ authentication: null, authenticationState: 'UNKNOWN', legacyAuthenticated: false }`, and\n * `code.indicator.v2` drops an inadmissible `member`. A producer that hashed the raw value was\n * rejected for an ID mismatch and its whole capability was dropped (65-F1), even though the policy\n * had already reported the finding.\n *\n * `undefined` means the validator would refuse these properties outright. The caller hashes them\n * unchanged then, so the fact still fails closed at validation exactly as before. The collection\n * bounds here are deliberately unbounded: the validator applies the real limit before any ID is\n * compared, so binding here could only manufacture a second, different refusal.\n */\nexport function canonicalSafeFactProperties(kind: string, input: unknown): Record<string, string | number | boolean | null | readonly (string | number | boolean | null)[]> | undefined {\n const schema = SAFE_FACT_REGISTRY_V2.schemas.find((item) => item.kind === kind);\n if (schema === undefined) return undefined;\n const unbounded = { maxMembersAndElements: Number.MAX_SAFE_INTEGER, maxNodes: Number.MAX_SAFE_INTEGER };\n try { return properties(kind, schema, input, unbounded); } catch { return undefined; }\n}\nfunction writeUtf8(hash: ReturnType<typeof sha256.create>, value: string): void {\n const chunk = new Uint8Array(4_096); let used = 0; const push = (byte: number): void => { chunk[used] = byte; used += 1; if (used === chunk.length) { hash.update(chunk); used = 0; } };\n for (let index = 0; index < value.length; index += 1) { let code = value.charCodeAt(index); if (code >= 0xd800) { code = 0x10000 + ((code - 0xd800) << 10) + value.charCodeAt(index + 1) - 0xdc00; index += 1; } if (code <= 0x7f) push(code); else if (code <= 0x7ff) { push(0xc0 | code >> 6); push(0x80 | code & 63); } else if (code <= 0xffff) { push(0xe0 | code >> 12); push(0x80 | code >> 6 & 63); push(0x80 | code & 63); } else { push(0xf0 | code >> 18); push(0x80 | code >> 12 & 63); push(0x80 | code >> 6 & 63); push(0x80 | code & 63); } }\n if (used) hash.update(chunk.subarray(0, used));\n}\nfunction factDigest(parts: readonly string[]): string {\n const hash = sha256.create();\n for (const part of parts) { const tagged = `N${utf8Bytes(part, 64 * 1024 * 1024)}:${part}`; const framed = `${utf8Bytes(tagged, 64 * 1024 * 1024)}:${tagged}`; writeUtf8(hash, framed); }\n return bytesToHex(hash.digest());\n}\nexport function canonicalSafeFactSubjectIdentity(subject: SafeFactSubjectV2): string {\n if (subject.kind === 'WORKFLOW') return 'WORKFLOW';\n if (subject.kind === 'SOURCE') return `SOURCE${subject.source.astNodeId}`;\n if (subject.kind === 'NODE') return `NODE${subject.node.identityDigest}`;\n return `EDGE${createEdgeIdentityDigest(subject.edge)}`;\n}\nfunction knownReason(value: unknown): value is Bad {\n return value === 'UNKNOWN_FACT_KIND' || value === 'UNKNOWN_PROPERTY' || value === 'INVALID_PROPERTY' || value === 'INVALID_SUBJECT' || value === 'FORBIDDEN_CONTENT' || value === 'LIMIT_EXCEEDED' || value === 'UNSAFE_INPUT' || value === 'REGISTRY_MISMATCH';\n}\nexport function validateSafeFact(candidate: unknown, schema: SafeFactSchemaV2, limits: ScannerLimitsV2): SafeFactValidationResultV2 {\n if (!isScannerAdmissionSnapshotV2<SafeFactV2>(candidate)) return Object.freeze({ ok: false, code: 'SAFE_FACT_REJECTED', reason: 'UNSAFE_INPUT' });\n try {\n const value = record(candidate, FACT_KEYS, 'UNKNOWN_PROPERTY');\n const kind = data(value, 'kind'); if (typeof kind !== 'string') fail('UNKNOWN_FACT_KIND');\n const expected = SAFE_FACT_REGISTRY_V2.schemas.find((item) => item.kind === kind);\n if (expected === undefined) fail('UNKNOWN_FACT_KIND');\n if (schema !== expected) fail('REGISTRY_MISMATCH');\n const effective = limitsSnapshot(limits);\n const subjectValue = subject(data(value, 'subject'), kind, effective);\n const subjects = SAFE_FACT_SUBJECT_KINDS_V2[kind]; if (subjects === undefined || !subjects.includes(subjectValue.kind)) fail('INVALID_SUBJECT');\n const propertiesValue = properties(kind, expected, data(value, 'properties'), effective);\n const expectedId = factDigest(['secureflow-fact-id-v2', kind, canonicalSafeFactSubjectIdentity(subjectValue), canonicalizeJson(propertiesValue)]);\n if (data(value, 'factId') !== expectedId) fail('INVALID_PROPERTY');\n const fact: SafeFactV2 = { factId: expectedId, kind, subject: subjectValue, properties: propertiesValue };\n return Object.freeze({ ok: true, fact: createSafeFactAdmissionSnapshotV2(fact) });\n } catch (error) {\n return Object.freeze({ ok: false, code: 'SAFE_FACT_REJECTED', reason: knownReason(error) ? error : 'UNSAFE_INPUT' });\n }\n}\n", "// Generated by scripts/generate-diagnostic-registry.mjs; DO NOT EDIT.\n// diagnostic-registry:version=diagnostic-registry-v1\n// diagnostic-registry:source=openspec/changes/world-class-scanner-cli/diagnostic-and-exit-registry.md\n// diagnostic-registry:rows=28\n// diagnostic-registry:digest=f66f90ea2cca06ddccefeff924fcb8abe672050fcee861ceb9b4e66551ddfc3c\n// Regenerate with `npm run generate:diagnostic-registry` after editing the registry table.\n// Every code, category, effect mode, assessment mode, and v1 projection below is projected from it.\nimport type { SourceMemberRefV2 } from '../source/source-types';\n\nexport type DiagnosticCategoryV2 = 'LIMIT' | 'SOURCE' | 'PARSER' | 'POLICY' | 'GRAPH' | 'CATALOGUE' | 'COMPATIBILITY';\nexport type DiagnosticAggregateEffectV2 = 'NONE' | 'DEGRADED' | 'INDETERMINATE';\nexport type DiagnosticAggregateEffectModeV2 = DiagnosticAggregateEffectV2 | 'BY_CAPABILITY';\nexport type DiagnosticAssessmentEligibilityModeV2 = boolean | 'BY_CAPABILITY';\nexport type DiagnosticV1ProjectionV2 = 'SAME' | 'MIGRATED' | 'PROJECTION_LOSS' | 'SENTINEL';\n\nexport type DiagnosticCodeV2 =\n | 'SOURCE_SPAN_UNAVAILABLE' | 'DUPLICATE_FINDING_COLLAPSED' | 'UNCLASSIFIED_CONNECTION_TYPE'\n | 'DUPLICATE_METADATA_KEY' | 'OPTIONAL_LIMIT_EXCEEDED' | 'UNSUPPORTED_CODE_NODE_VARIANT'\n | 'JAVASCRIPT_PARSE_FAILED' | 'JAVASCRIPT_SOURCE_UNAVAILABLE' | 'PYTHON_SOURCE_UNAVAILABLE'\n | 'PYTHON_PARSE_FAILED' | 'PYTHON_PARSER_UNAVAILABLE' | 'EXPRESSION_PARSE_FAILED'\n | 'GRAPH_ENTRY_UNRESOLVED' | 'GRAPH_WORK_LIMIT_EXCEEDED' | 'GRAPH_ANALYSIS_DEGRADED'\n | 'SEMANTIC_CATALOGUE_MISS' | 'GENERIC_NODE_UNMODELED_CAPABILITY' | 'POLICY_EXECUTION_FAILED'\n | 'DEPENDENCY_UNAVAILABLE' | 'UNKNOWN_REPORT_ONLY_RULE' | 'REQUIRED_LIMIT_EXCEEDED'\n | 'DUPLICATE_SECURITY_KEY' | 'MALFORMED_NODE_PARAMETERS' | 'MALFORMED_CONNECTION_INDEX'\n | 'REQUIRED_CAPABILITY_FAILED' | 'UNKNOWN_SCORING_RULE' | 'COMPATIBILITY_PROJECTION_LOSS'\n | 'REQUIRED_STAGE_FAILURE';\n\nexport type AnalysisDiagnosticV2 = Readonly<{\n id: string;\n code: DiagnosticCodeV2;\n category: DiagnosticCategoryV2;\n capabilityId: string;\n aggregateEffect: DiagnosticAggregateEffectV2;\n assessmentEligible: boolean;\n location?: SourceMemberRefV2;\n observed?: number;\n maximum?: number;\n omitted?: number;\n}>;\n\nexport type DiagnosticRegistryEntryV2 = Readonly<{\n code: DiagnosticCodeV2;\n category: DiagnosticCategoryV2;\n aggregateEffect: DiagnosticAggregateEffectModeV2;\n assessmentEligible: DiagnosticAssessmentEligibilityModeV2;\n v1Code: string | null;\n v1Projection: DiagnosticV1ProjectionV2;\n}>;\n\nconst row = (\n code: DiagnosticCodeV2,\n category: DiagnosticCategoryV2,\n aggregateEffect: DiagnosticAggregateEffectModeV2,\n assessmentEligible: DiagnosticAssessmentEligibilityModeV2,\n v1Code: string | null,\n v1Projection: DiagnosticV1ProjectionV2,\n): DiagnosticRegistryEntryV2 => Object.freeze({\n code, category, aggregateEffect, assessmentEligible, v1Code, v1Projection,\n});\n\nexport const DIAGNOSTIC_REGISTRY: readonly DiagnosticRegistryEntryV2[] = Object.freeze([\n row('SOURCE_SPAN_UNAVAILABLE', 'SOURCE', 'DEGRADED', true, 'SOURCE_SPAN_UNAVAILABLE', 'SAME'),\n row('DUPLICATE_FINDING_COLLAPSED', 'POLICY', 'DEGRADED', true, 'DUPLICATE_FINDING_COLLAPSED', 'SAME'),\n row('UNCLASSIFIED_CONNECTION_TYPE', 'GRAPH', 'DEGRADED', true, 'UNCLASSIFIED_CONNECTION_TYPE', 'SAME'),\n row('DUPLICATE_METADATA_KEY', 'PARSER', 'DEGRADED', true, 'DUPLICATE_JSON_KEY', 'MIGRATED'),\n row('OPTIONAL_LIMIT_EXCEEDED', 'LIMIT', 'DEGRADED', true, 'ANALYSIS_LIMIT_EXCEEDED', 'MIGRATED'),\n row('UNSUPPORTED_CODE_NODE_VARIANT', 'PARSER', 'BY_CAPABILITY', 'BY_CAPABILITY', 'UNSUPPORTED_CODE_NODE_VARIANT', 'SAME'),\n row('JAVASCRIPT_PARSE_FAILED', 'PARSER', 'BY_CAPABILITY', 'BY_CAPABILITY', 'JAVASCRIPT_PARSE_FAILED', 'SAME'),\n row('JAVASCRIPT_SOURCE_UNAVAILABLE', 'SOURCE', 'BY_CAPABILITY', 'BY_CAPABILITY', 'JAVASCRIPT_SOURCE_UNAVAILABLE', 'SAME'),\n row('PYTHON_SOURCE_UNAVAILABLE', 'SOURCE', 'BY_CAPABILITY', 'BY_CAPABILITY', 'PYTHON_SOURCE_UNAVAILABLE', 'SAME'),\n row('PYTHON_PARSE_FAILED', 'PARSER', 'BY_CAPABILITY', 'BY_CAPABILITY', 'PYTHON_PARSE_FAILED', 'SAME'),\n row('PYTHON_PARSER_UNAVAILABLE', 'PARSER', 'BY_CAPABILITY', 'BY_CAPABILITY', 'PYTHON_PARSER_UNAVAILABLE', 'SAME'),\n row('EXPRESSION_PARSE_FAILED', 'PARSER', 'BY_CAPABILITY', 'BY_CAPABILITY', 'EXPRESSION_PARSE_FAILED', 'SAME'),\n row('GRAPH_ENTRY_UNRESOLVED', 'GRAPH', 'BY_CAPABILITY', 'BY_CAPABILITY', 'GRAPH_ANALYSIS_DEGRADED', 'MIGRATED'),\n row('GRAPH_WORK_LIMIT_EXCEEDED', 'GRAPH', 'BY_CAPABILITY', 'BY_CAPABILITY', 'ANALYSIS_LIMIT_EXCEEDED', 'MIGRATED'),\n row('GRAPH_ANALYSIS_DEGRADED', 'GRAPH', 'BY_CAPABILITY', 'BY_CAPABILITY', 'GRAPH_ANALYSIS_DEGRADED', 'SAME'),\n row('SEMANTIC_CATALOGUE_MISS', 'CATALOGUE', 'BY_CAPABILITY', 'BY_CAPABILITY', null, 'PROJECTION_LOSS'),\n row('GENERIC_NODE_UNMODELED_CAPABILITY', 'CATALOGUE', 'DEGRADED', true, null, 'PROJECTION_LOSS'),\n row('POLICY_EXECUTION_FAILED', 'POLICY', 'BY_CAPABILITY', 'BY_CAPABILITY', 'POLICY_EXECUTION_FAILED', 'SAME'),\n row('DEPENDENCY_UNAVAILABLE', 'POLICY', 'BY_CAPABILITY', 'BY_CAPABILITY', null, 'PROJECTION_LOSS'),\n row('UNKNOWN_REPORT_ONLY_RULE', 'POLICY', 'DEGRADED', true, null, 'PROJECTION_LOSS'),\n row('REQUIRED_LIMIT_EXCEEDED', 'LIMIT', 'INDETERMINATE', false, 'ANALYSIS_LIMIT_EXCEEDED', 'MIGRATED'),\n row('DUPLICATE_SECURITY_KEY', 'PARSER', 'INDETERMINATE', false, 'DUPLICATE_JSON_KEY', 'MIGRATED'),\n row('MALFORMED_NODE_PARAMETERS', 'PARSER', 'INDETERMINATE', false, 'MALFORMED_NODE_PARAMETERS', 'SAME'),\n row('MALFORMED_CONNECTION_INDEX', 'GRAPH', 'INDETERMINATE', false, 'MALFORMED_CONNECTION_INDEX', 'SAME'),\n row('REQUIRED_CAPABILITY_FAILED', 'POLICY', 'INDETERMINATE', false, null, 'PROJECTION_LOSS'),\n row('UNKNOWN_SCORING_RULE', 'POLICY', 'INDETERMINATE', false, null, 'PROJECTION_LOSS'),\n row('COMPATIBILITY_PROJECTION_LOSS', 'COMPATIBILITY', 'INDETERMINATE', false, 'POLICY_EXECUTION_FAILED', 'SENTINEL'),\n row('REQUIRED_STAGE_FAILURE', 'POLICY', 'INDETERMINATE', false, 'REQUIRED_STAGE_FAILURE', 'SAME'),\n]);\n\nexport const DIAGNOSTIC_CODES_V2: readonly DiagnosticCodeV2[] = Object.freeze(\n DIAGNOSTIC_REGISTRY.map((entry) => entry.code),\n);\n\nconst categorySet: Readonly<Record<DiagnosticCategoryV2, true>> = Object.freeze({ 'LIMIT': true, 'SOURCE': true, 'PARSER': true, 'POLICY': true, 'GRAPH': true, 'CATALOGUE': true, 'COMPATIBILITY': true });\nconst effectSet: Readonly<Record<DiagnosticAggregateEffectModeV2, true>> = Object.freeze({ 'NONE': true, 'DEGRADED': true, 'INDETERMINATE': true, 'BY_CAPABILITY': true });\nconst projectionSet: Readonly<Record<DiagnosticV1ProjectionV2, true>> = Object.freeze({ 'SAME': true, 'MIGRATED': true, 'PROJECTION_LOSS': true, 'SENTINEL': true });\nconst byCode = new Map<string, DiagnosticRegistryEntryV2>(DIAGNOSTIC_REGISTRY.map((entry) => [entry.code, entry]));\n\nif (DIAGNOSTIC_REGISTRY.length !== 28 || byCode.size !== DIAGNOSTIC_REGISTRY.length) throw new TypeError('Invalid diagnostic registry');\nfor (const entry of DIAGNOSTIC_REGISTRY) {\n if (categorySet[entry.category] !== true || effectSet[entry.aggregateEffect] !== true || projectionSet[entry.v1Projection] !== true) {\n throw new TypeError('Invalid diagnostic registry');\n }\n if (entry.assessmentEligible !== 'BY_CAPABILITY' && typeof entry.assessmentEligible !== 'boolean') {\n throw new TypeError('Invalid diagnostic registry');\n }\n}\n\n/**\n * The status mapping (aggregate effect) and the assessment mapping. A `BY_CAPABILITY`\n * row is resolved by the owning capability's registry-fixed requiredness: required loss\n * is `INDETERMINATE`/ineligible, optional or report-only loss is `DEGRADED`/eligible.\n */\nexport function classifyDiagnostic(code: DiagnosticCodeV2, capabilityRequiredness?: boolean): Readonly<{\n category: DiagnosticCategoryV2;\n aggregateEffect: DiagnosticAggregateEffectV2;\n assessmentEligible: boolean;\n}> {\n const entry = byCode.get(code);\n if (!entry) throw new TypeError('Unknown diagnostic code');\n if (entry.aggregateEffect === 'BY_CAPABILITY' && typeof capabilityRequiredness !== 'boolean') {\n throw new TypeError('Diagnostic capability requiredness is not fixed');\n }\n const required = entry.aggregateEffect === 'BY_CAPABILITY' && capabilityRequiredness === true;\n return Object.freeze({\n category: entry.category,\n aggregateEffect: entry.aggregateEffect === 'BY_CAPABILITY' ? (required ? 'INDETERMINATE' : 'DEGRADED') : entry.aggregateEffect,\n assessmentEligible: entry.assessmentEligible === 'BY_CAPABILITY' ? !required : entry.assessmentEligible,\n });\n}\n", "import { sha256 } from '@noble/hashes/sha2.js';\nimport { bytesToHex } from '@noble/hashes/utils.js';\nimport { encodeIdentityTuple } from '../workflow-v2/node-edge-identity';\nimport type { SourceMemberRefV2, SourcePositionV2 } from '../source/source-types';\nimport { classifyDiagnostic, DIAGNOSTIC_REGISTRY, type AnalysisDiagnosticV2,\n type DiagnosticAggregateEffectV2, type DiagnosticCategoryV2, type DiagnosticCodeV2 } from './registry';\n\nexport type DiagnosticIdentityInputV2 = Readonly<{\n code: DiagnosticCodeV2; capabilityId: string; aggregateEffect: DiagnosticAggregateEffectV2;\n category?: DiagnosticCategoryV2; assessmentEligible?: boolean; location?: SourceMemberRefV2;\n observed?: number; maximum?: number; omitted?: number;\n}>;\ntype NormalizedIdentity = { code: DiagnosticCodeV2; capabilityId: string; category: DiagnosticCategoryV2;\n aggregateEffect: DiagnosticAggregateEffectV2; assessmentEligible: boolean; location?: SourceMemberRefV2;\n observed?: number; maximum?: number; omitted?: number; astNodeId: string };\nconst encoder = new TextEncoder();\nconst registryOrder = new Map(DIAGNOSTIC_REGISTRY.map((entry, index) => [entry.code, index]));\nconst identityKeys = ['code', 'capabilityId', 'aggregateEffect', 'category', 'assessmentEligible', 'location', 'observed', 'maximum', 'omitted'] as const;\nconst diagnosticKeys = ['id', ...identityKeys] as const;\nconst locationKeys = ['pointer', 'occurrencePath', 'astNodeId', 'span'] as const;\nconst spanKeys = ['start', 'end'] as const;\nconst positionKeys = ['line', 'column', 'utf16Offset', 'utf8ByteOffset'] as const;\n\nexport function createDiagnosticId(input: DiagnosticIdentityInputV2): string {\n try { return identityDigest(normalizeIdentity(input)); }\n catch { throw new TypeError('Invalid diagnostic identity'); }\n}\nexport function sortDiagnostics(diagnostics: readonly AnalysisDiagnosticV2[], capabilityOrder: readonly string[] = []): readonly AnalysisDiagnosticV2[] {\n try {\n assertDenseArray(diagnostics); const order = capabilityRanks(capabilityOrder);\n const groups = new Map<string, AnalysisDiagnosticV2[]>();\n for (const diagnostic of diagnostics) {\n const normalized = normalizeDiagnostic(diagnostic); const group = groups.get(normalized.id);\n if (group) group.push(normalized); else groups.set(normalized.id, [normalized]);\n }\n const unique = [...groups.values()].map((group) => duplicateRepresentative(group, order));\n return Object.freeze(unique.sort((left, right) => compareDiagnostics(left, right, order)));\n } catch { throw new TypeError('Invalid diagnostic collection'); }\n}\nfunction normalizeIdentity(input: DiagnosticIdentityInputV2): NormalizedIdentity {\n const value = record(input, identityKeys); const code = required(value, 'code') as DiagnosticCodeV2;\n const capabilityId = required(value, 'capabilityId'); const effect = required(value, 'aggregateEffect');\n const category = optional(value, 'category'); const eligible = optional(value, 'assessmentEligible');\n if (typeof capabilityId !== 'string' || capabilityId.length === 0) throw new TypeError();\n if (eligible !== undefined && typeof eligible !== 'boolean') throw new TypeError();\n const classification = eligible === undefined ? classifyDiagnostic(code) : classifyDiagnostic(code, !eligible);\n if (eligible !== undefined && eligible !== classification.assessmentEligible) throw new TypeError();\n if (effect !== classification.aggregateEffect || category !== undefined && category !== classification.category) throw new TypeError();\n const locationValue = optional(value, 'location'); const location = locationValue === undefined ? undefined : cloneLocation(locationValue);\n return { code, capabilityId, category: classification.category, aggregateEffect: classification.aggregateEffect,\n assessmentEligible: classification.assessmentEligible, location, observed: optionalNumber(value, 'observed'),\n maximum: optionalNumber(value, 'maximum'), omitted: optionalNumber(value, 'omitted'), astNodeId: location?.astNodeId ?? 'NONE' };\n}\nfunction normalizeDiagnostic(input: AnalysisDiagnosticV2): AnalysisDiagnosticV2 {\n const value = record(input, diagnosticKeys); const identity = normalizeIdentity({\n code: required(value, 'code') as DiagnosticCodeV2, capabilityId: required(value, 'capabilityId') as string,\n aggregateEffect: required(value, 'aggregateEffect') as DiagnosticAggregateEffectV2,\n category: required(value, 'category') as DiagnosticCategoryV2, assessmentEligible: required(value, 'assessmentEligible') as boolean,\n location: optional(value, 'location') as SourceMemberRefV2 | undefined, observed: optionalNumber(value, 'observed'),\n maximum: optionalNumber(value, 'maximum'), omitted: optionalNumber(value, 'omitted') });\n const id = required(value, 'id'); if (typeof id !== 'string' || id !== identityDigest(identity)) throw new TypeError();\n return Object.freeze({ id, code: identity.code, category: identity.category, capabilityId: identity.capabilityId,\n aggregateEffect: identity.aggregateEffect, assessmentEligible: identity.assessmentEligible,\n ...(identity.location === undefined ? {} : { location: identity.location }),\n ...(identity.observed === undefined ? {} : { observed: identity.observed }),\n ...(identity.maximum === undefined ? {} : { maximum: identity.maximum }),\n ...(identity.omitted === undefined ? {} : { omitted: identity.omitted }) });\n}\nfunction identityDigest(input: NormalizedIdentity): string {\n return bytesToHex(sha256(encoder.encode(encodeIdentityTuple(['secureflow-diagnostic-id-v2', input.capabilityId, input.code,\n input.aggregateEffect, input.astNodeId, input.observed === undefined ? 'NONE' : String(input.observed),\n input.maximum === undefined ? 'NONE' : String(input.maximum), input.omitted === undefined ? 'NONE' : String(input.omitted)]))));\n}\nfunction duplicateRepresentative(group: readonly AnalysisDiagnosticV2[], order: Map<string, number>): AnalysisDiagnosticV2 {\n let representative = group[0];\n for (const candidate of group.slice(1)) if (compareDiagnostics(candidate, representative, order) < 0) representative = candidate;\n if (group.length === 1 || representative.location === undefined) return representative;\n return Object.freeze({ ...representative, location: Object.freeze({ ...representative.location, span: null }) });\n}\nfunction cloneLocation(input: unknown): SourceMemberRefV2 {\n const value = record(input, locationKeys); const pointer = required(value, 'pointer'); const astNodeId = required(value, 'astNodeId');\n if (typeof pointer !== 'string' || typeof astNodeId !== 'string' || astNodeId.length === 0) throw new TypeError();\n const path = required(value, 'occurrencePath'); assertDenseArray(path);\n const occurrencePath = Object.freeze((path as readonly unknown[]).map(numericValue)); const span = required(value, 'span');\n return Object.freeze({ pointer, occurrencePath, astNodeId, span: span === null ? null : cloneSpan(span) });\n}\nfunction cloneSpan(input: unknown): NonNullable<SourceMemberRefV2['span']> {\n const value = record(input, spanKeys); return Object.freeze({ start: clonePosition(required(value, 'start')), end: clonePosition(required(value, 'end')) });\n}\nfunction clonePosition(input: unknown): SourcePositionV2 {\n const value = record(input, positionKeys); return Object.freeze({ line: numericValue(required(value, 'line')), column: numericValue(required(value, 'column')),\n utf16Offset: numericValue(required(value, 'utf16Offset')), utf8ByteOffset: numericValue(required(value, 'utf8ByteOffset')) });\n}\nfunction optionalNumber(value: Record<string, unknown>, key: string): number | undefined {\n const number = optional(value, key); return number === undefined ? undefined : numericValue(number);\n}\nfunction numericValue(value: unknown): number {\n if (!Number.isSafeInteger(value) || (value as number) < 0) throw new TypeError(); return value as number;\n}\nfunction capabilityRanks(order: readonly string[]): Map<string, number> {\n assertDenseArray(order); const ranks = new Map<string, number>();\n for (const [index, capability] of order.entries()) { if (typeof capability !== 'string' || ranks.has(capability)) throw new TypeError(); ranks.set(capability, index); }\n return ranks;\n}\nfunction compareDiagnostics(left: AnalysisDiagnosticV2, right: AnalysisDiagnosticV2, ranks: Map<string, number>): number {\n const leftRank = ranks.get(left.capabilityId); const rightRank = ranks.get(right.capabilityId);\n if (leftRank !== undefined || rightRank !== undefined) {\n if (leftRank === undefined) return 1; if (rightRank === undefined) return -1; if (leftRank !== rightRank) return leftRank - rightRank;\n } else if (left.capabilityId !== right.capabilityId) return compareCodePoints(left.capabilityId, right.capabilityId);\n const codeOrder = (registryOrder.get(left.code) ?? Number.MAX_SAFE_INTEGER) - (registryOrder.get(right.code) ?? Number.MAX_SAFE_INTEGER);\n if (codeOrder !== 0) return codeOrder; const locationOrder = compareLocations(left.location, right.location);\n return locationOrder !== 0 ? locationOrder : left.id === right.id ? 0 : compareCodePoints(left.id, right.id);\n}\nfunction compareLocations(left: SourceMemberRefV2 | undefined, right: SourceMemberRefV2 | undefined): number {\n if (left === undefined) return right === undefined ? 0 : 1; if (right === undefined) return -1;\n const pointerOrder = compareCodePoints(left.pointer, right.pointer); return pointerOrder !== 0 ? pointerOrder : comparePaths(left.occurrencePath, right.occurrencePath);\n}\nfunction comparePaths(left: readonly number[], right: readonly number[]): number {\n for (let index = 0; index < Math.min(left.length, right.length); index += 1) if (left[index] !== right[index]) return left[index] - right[index];\n return left.length - right.length;\n}\nfunction compareCodePoints(left: string, right: string): number {\n const leftPoints = Array.from(left, (value) => value.codePointAt(0)!); const rightPoints = Array.from(right, (value) => value.codePointAt(0)!);\n for (let index = 0; index < Math.min(leftPoints.length, rightPoints.length); index += 1) if (leftPoints[index] !== rightPoints[index]) return leftPoints[index] - rightPoints[index];\n return leftPoints.length - rightPoints.length;\n}\nfunction record(input: unknown, allowed: readonly string[]): Record<string, unknown> {\n if (input === null || typeof input !== 'object' || Array.isArray(input)) throw new TypeError(); const prototype = Object.getPrototypeOf(input);\n if (prototype !== Object.prototype && prototype !== null || Object.getOwnPropertySymbols(input).length > 0) throw new TypeError();\n for (const key of Object.getOwnPropertyNames(input)) { const descriptor = Object.getOwnPropertyDescriptor(input, key);\n if (!allowed.includes(key) || !descriptor || !('value' in descriptor)) throw new TypeError(); }\n return input as Record<string, unknown>;\n}\nfunction required(value: Record<string, unknown>, key: string): unknown { if (!Object.prototype.hasOwnProperty.call(value, key)) throw new TypeError(); return value[key]; }\nfunction optional(value: Record<string, unknown>, key: string): unknown { return Object.prototype.hasOwnProperty.call(value, key) ? value[key] : undefined; }\nfunction assertDenseArray(input: unknown): asserts input is readonly unknown[] {\n if (!Array.isArray(input) || Object.getPrototypeOf(input) !== Array.prototype || Object.getOwnPropertySymbols(input).length > 0) throw new TypeError();\n const names = Object.getOwnPropertyNames(input); if (names.length !== input.length + 1 || !names.includes('length')) throw new TypeError();\n for (let index = 0; index < input.length; index += 1) { const descriptor = Object.getOwnPropertyDescriptor(input, String(index)); if (!descriptor || !('value' in descriptor)) throw new TypeError(); }\n if (names.some((name) => name !== 'length' && !/^\\d+$/.test(name))) throw new TypeError();\n}\n", "import type { AdmittedRuleV2 } from '../capabilities/scheduler';\n\n/**\n * The admitted rule catalogue is the only authority for what a rule is.\n *\n * A rule id that is not in the admitted catalogue is never neutral. It is either a rule that\n * would have been scored or one that would only have been reported, and those are not the same\n * failure: a scoring unknown must fail closed \u2014 the finding is refused, the owning capability is\n * refused, and the run cannot publish an assessment \u2014 while a report-only unknown may degrade the\n * run and let the assessment stand without that rule.\n *\n * The burden of proof is on \"report-only\". Only a declared, non-required owner proves it, because\n * a capability becomes required/scoring only in a new admitted profile version\n * (`core-registry-contracts.md`). An id whose owner cannot be established \u2014 a finding at the result\n * boundary, a pack body, a synthetic catalogue lookup \u2014 is treated as scoring.\n *\n * This module is the reason those rules cannot drift: the case, its registry code, and the\n * fields the catalogue owns are declared once here and consumed by the pack admission boundary,\n * the scheduler, the analyzer adapter, and the result composer.\n */\nexport type UnknownRuleCaseV2 = 'SCORING' | 'REPORT_ONLY';\n\n/** The closed-registry codes the two cases map to (`diagnostic-and-exit-registry.md`). */\nexport const UNKNOWN_RULE_DIAGNOSTIC_V2 = Object.freeze({\n SCORING: 'UNKNOWN_SCORING_RULE',\n REPORT_ONLY: 'UNKNOWN_REPORT_ONLY_RULE',\n} as const);\nexport type UnknownRuleDiagnosticCodeV2 = (typeof UNKNOWN_RULE_DIAGNOSTIC_V2)[UnknownRuleCaseV2];\n\n/**\n * The identity fields the admitted catalogue owns. A rule body, a safe fact, or a caller may\n * repeat them; none of them may set them.\n */\nexport const RULE_AUTHORITY_FIELDS_V2 = Object.freeze([\n 'revision', 'capabilityId', 'effect', 'severity', 'confidence', 'evidenceSchemaId', 'remediationId',\n] as const);\nexport type RuleAuthorityFieldV2 = (typeof RULE_AUTHORITY_FIELDS_V2)[number];\nexport type RuleAuthorityClaimV2 = Readonly<Partial<Record<RuleAuthorityFieldV2, string>>>;\n\n/** A capability that declares rules, and therefore an owner an unknown id can be attributed to. */\nexport type UnknownRuleOwnerV2 = Readonly<{ required: boolean }>;\n\n/**\n * Which unknown case an id is. Every boundary asks this one question, so the answer lives once:\n * only a declared, non-required owner makes an unknown id report-only.\n */\nexport function unknownRuleCaseV2(owner: UnknownRuleOwnerV2 | undefined): UnknownRuleCaseV2 {\n return owner !== undefined && owner.required === false ? 'REPORT_ONLY' : 'SCORING';\n}\n\n/** True when every field the claim repeats is the admitted value. A claim may omit, never override. */\nexport function ruleAuthorityMatchesV2(rule: AdmittedRuleV2, claim: RuleAuthorityClaimV2): boolean {\n for (const field of RULE_AUTHORITY_FIELDS_V2) {\n const claimed = claim[field];\n if (claimed !== undefined && claimed !== rule[field]) return false;\n }\n return true;\n}\n\n/**\n * Read an admitted rule from a catalogue. Real `Map` instances and the scheduler's frozen\n * immutable map view are the only admitted shapes; anything else yields no rule rather than a\n * caller-defined lookup.\n */\nexport function admittedRuleV2(rules: ReadonlyMap<string, AdmittedRuleV2>, ruleId: string): AdmittedRuleV2 | undefined {\n if (rules instanceof Map && Object.getPrototypeOf(rules) === Map.prototype) return Map.prototype.get.call(rules, ruleId);\n const descriptor = Object.getOwnPropertyDescriptor(rules, 'get');\n if (Object.getPrototypeOf(rules) !== null || !Object.isFrozen(rules) || descriptor === undefined || !('value' in descriptor) || typeof descriptor.value !== 'function') return undefined;\n return (descriptor.value as (key: string) => AdmittedRuleV2 | undefined).call(rules, ruleId);\n}\n\nexport type RuleResolutionV2 = Readonly<\n | { ok: true; rule: AdmittedRuleV2 }\n | { ok: false; ruleId: string; case: UnknownRuleCaseV2; diagnosticCode: UnknownRuleDiagnosticCodeV2 }\n>;\n\nexport function resolveRuleAuthorityV2(rules: ReadonlyMap<string, AdmittedRuleV2>, ruleId: string, owner?: UnknownRuleOwnerV2): RuleResolutionV2 {\n const rule = admittedRuleV2(rules, ruleId);\n if (rule !== undefined) return Object.freeze({ ok: true as const, rule });\n const ruleCase = unknownRuleCaseV2(owner);\n return Object.freeze({ ok: false as const, ruleId, case: ruleCase, diagnosticCode: UNKNOWN_RULE_DIAGNOSTIC_V2[ruleCase] });\n}\n\nexport type DeclaredRulesResolutionV2 = Readonly<\n | { ok: true; rules: ReadonlyMap<string, AdmittedRuleV2> }\n | { ok: false; ruleId: string; case: UnknownRuleCaseV2; diagnosticCode: UnknownRuleDiagnosticCodeV2 }\n>;\n\n/**\n * Resolve every rule a capability declares. A capability may not run against a catalogue that is\n * missing a rule it declares: the first unknown id decides the case for the whole declaration.\n */\nexport function resolveDeclaredRulesV2(declared: readonly string[], rules: ReadonlyMap<string, AdmittedRuleV2>, owner: UnknownRuleOwnerV2): DeclaredRulesResolutionV2 {\n const resolved = new Map<string, AdmittedRuleV2>();\n for (const ruleId of declared) {\n const resolution = resolveRuleAuthorityV2(rules, ruleId, owner);\n if (!resolution.ok) return resolution;\n resolved.set(ruleId, resolution.rule);\n }\n return Object.freeze({ ok: true as const, rules: resolved });\n}\n", "import { sha256 } from '@noble/hashes/sha2.js';\nimport { bytesToHex } from '@noble/hashes/utils.js';\nimport { segmentExpressionIslands } from '../analyzers/expression/expression-islands';\nimport type { AnalysisDiagnostic, ScanFinding } from '../policy/policy';\nimport { canonicalizeJson } from '../canonical-json';\nimport { canonicalSafeFactProperties } from '../facts/safe-fact-validator';\nimport { createDiagnosticId } from '../diagnostics/identity';\nimport { classifyDiagnostic, type AnalysisDiagnosticV2, type DiagnosticCodeV2 } from '../diagnostics/registry';\nimport { UNKNOWN_RULE_DIAGNOSTIC_V2, resolveRuleAuthorityV2, unknownRuleCaseV2 } from '../rules-v2/rule-authority';\nimport { createCapabilityCandidateAdmissionSnapshotV2, type ScannerAdmissionSnapshotV2 } from '../admission/snapshot';\nimport type { SecurityNodeV2, SemanticFieldV2 } from '../workflow-v2/security-workflow';\nimport type { AnalyzerContextV2, CapabilityCandidateV2, FindingCandidateV2, SafeFactV2, SubjectV2 } from './scheduler';\nimport type { ProfileCapabilityV2 } from './profile-manifest';\n\nexport type AdmittedCapabilityCandidateV2 = ScannerAdmissionSnapshotV2<CapabilityCandidateV2>;\n\nexport function admitCandidate(candidate: CapabilityCandidateV2): AdmittedCapabilityCandidateV2 {\n return createCapabilityCandidateAdmissionSnapshotV2(candidate);\n}\n\nconst digest = (parts: readonly string[]): string => bytesToHex(sha256(new TextEncoder().encode(requireTuple(parts))));\nconst requireTuple = (parts: readonly string[]): string => parts.map((part) => {\n const tagged = `N${new TextEncoder().encode(part).byteLength}:${part}`;\n return `${new TextEncoder().encode(tagged).byteLength}:${tagged}`;\n}).join('');\n\ntype FactProperties = Record<string, string | number | boolean | null | readonly (string | number | boolean | null)[]>;\n\nexport function makeFact(kind: string, subject: SubjectV2, properties: FactProperties): SafeFactV2 {\n const subjectId = subject.kind === 'WORKFLOW' ? 'WORKFLOW' : subject.kind === 'SOURCE' ? `SOURCE${subject.source.astNodeId}` : subject.kind === 'NODE' ? `NODE${subject.node.identityDigest}` : `EDGE${subject.edge.ordinal}`;\n // The ID must hash the properties `validateSafeFact` will admit, not the ones a policy handed\n // over: an ingress fact quarantines malformed authentication, so hashing the raw value made the\n // validator reject its own producer's fact and drop the finding's whole capability (65-F1).\n // `undefined` keeps the raw properties, which fails closed at validation exactly as before.\n const admitted = canonicalSafeFactProperties(kind, properties) ?? properties;\n return { factId: digest(['secureflow-fact-id-v2', kind, subjectId, canonicalizeJson(admitted)]), kind, subject, properties: admitted };\n}\n\nexport function emptyCandidate(seen = 0, analyzed = seen): CapabilityCandidateV2 {\n return createCapabilityCandidateAdmissionSnapshotV2({ findings: [], diagnostics: [], facts: [], traces: [], seen, analyzed, skipped: 0, omitted: 0 });\n}\n\nexport function createDiagnostic(code: DiagnosticCodeV2, capabilityId: string, required: boolean, location?: SecurityNodeV2['ref']['source'], counts?: Pick<AnalysisDiagnosticV2, 'observed' | 'maximum' | 'omitted'>): AnalysisDiagnosticV2 {\n const classification = classifyDiagnostic(code, required);\n const identity = { code, capabilityId, ...classification, ...(location === undefined ? {} : { location }), ...counts };\n return Object.freeze({ ...identity, id: createDiagnosticId(identity) });\n}\n\nexport function adaptDiagnostic(input: AnalysisDiagnostic, context: AnalyzerContextV2, capability: ProfileCapabilityV2): AnalysisDiagnosticV2 {\n const isLimit = input.code === 'ANALYSIS_LIMIT_EXCEEDED';\n const code = isLimit ? capability.required ? 'REQUIRED_LIMIT_EXCEEDED' : 'OPTIONAL_LIMIT_EXCEEDED' : input.code === 'DUPLICATE_JSON_KEY' ? 'DUPLICATE_SECURITY_KEY' : input.code as DiagnosticCodeV2;\n const nodeIndex = input.location?.path?.match(/^\\/nodes\\/(\\d+)$/)?.[1];\n const node = nodeIndex === undefined ? undefined : Array.prototype.at.call(context.workflow.nodes, Number(nodeIndex)) as SecurityNodeV2 | undefined;\n const counts = isLimit ? { observed: 1, maximum: 0, omitted: 1 } : undefined;\n return createDiagnostic(code, capability.id, capability.required, node === undefined ? undefined : admittedSource(node.ref.source), counts);\n}\n\nexport function unknownRuleDiagnostic(capability: ProfileCapabilityV2): AnalysisDiagnosticV2 {\n const ruleCase = unknownRuleCaseV2(capability);\n return createDiagnostic(UNKNOWN_RULE_DIAGNOSTIC_V2[ruleCase], capability.id, capability.required);\n}\n\nexport function policyFailureDiagnostic(capability: ProfileCapabilityV2): AnalysisDiagnosticV2 {\n return createDiagnostic('POLICY_EXECUTION_FAILED', capability.id, capability.required);\n}\n\nexport function candidateFinding(\n finding: ScanFinding,\n node: SecurityNodeV2,\n context: AnalyzerContextV2,\n capability: ProfileCapabilityV2,\n facts: SafeFactV2[],\n): FindingCandidateV2 | undefined {\n const resolution = resolveRuleAuthorityV2(context.rules.rules, finding.policyId, capability);\n if (!resolution.ok || !capability.ruleIds.includes(finding.policyId) || resolution.rule.capabilityId !== capability.id) return undefined;\n const rule = resolution.rule;\n const subject: SubjectV2 = { kind: 'NODE', node: admittedNode(node.ref) };\n const evidence = finding.evidence;\n const add = (kind: string, properties: FactProperties, factSubject: SubjectV2 = subject): string => {\n const created = makeFact(kind, factSubject, properties); if (!facts.some((item) => item.factId === created.factId)) facts.push(created); return created.factId;\n };\n const factRefs = findingFactRefs(finding, node, add);\n if (factRefs === undefined) return undefined;\n const conclusion = rule.effect === 'SCORING' && node.scoringEligibility === 'INDETERMINATE' ? 'UNKNOWN' : 'OBSERVED';\n const evidenceClass = finding.policyId.startsWith('TAINTED_') ? 'POTENTIAL_DATAFLOW' : finding.policyId.includes('DYNAMIC_EXECUTION') ? 'SUSPICIOUS_SYNTAX' : ['RAW_AUTH_HEADER', 'RAW_SECRET_INDICATOR', 'UNAPPROVED_DOMAIN', 'UNKNOWN_NODE_PACKAGE', 'WEBHOOK_EXPOSURE'].includes(finding.policyId) ? 'CONFIGURATION' : 'CAPABILITY';\n return { ruleId: finding.policyId, evidenceClass, conclusion, applicability: 'APPLICABLE', subject, factRefs, traceRefs: [], remediationId: 'r' };\n}\n\nexport function candidateFacts(finding: ScanFinding, node: SecurityNodeV2, facts: SafeFactV2[]): readonly string[] {\n const subject: SubjectV2 = { kind: 'NODE', node: admittedNode(node.ref) };\n const add = (kind: string, properties: FactProperties, factSubject: SubjectV2 = subject): string => {\n const created = makeFact(kind, factSubject, properties); if (!facts.some((item) => item.factId === created.factId)) facts.push(created); return created.factId;\n };\n return findingFactRefs(finding, node, add) ?? [];\n}\n\nfunction admittedSource(source: SecurityNodeV2['ref']['source']): SecurityNodeV2['ref']['source'] {\n const span = source.span === null ? null : { start: { ...source.span.start }, end: { ...source.span.end } };\n return { pointer: source.pointer, occurrencePath: Array.prototype.slice.call(source.occurrencePath) as number[], astNodeId: source.astNodeId, span };\n}\n\nfunction admittedNode(ref: SecurityNodeV2['ref']): SecurityNodeV2['ref'] {\n return { ...ref, source: admittedSource(ref.source) };\n}\n\nfunction findingFactRefs(finding: ScanFinding, node: SecurityNodeV2, add: (kind: string, properties: FactProperties, subject?: SubjectV2) => string): string[] | undefined {\n const e = finding.evidence; const source: SubjectV2 = { kind: 'SOURCE', source: admittedSource(node.ref.source) };\n if (finding.policyId === 'N8N_EXECUTE_COMMAND' || finding.policyId === 'N8N_CODE_NODE' || finding.policyId === 'UNKNOWN_NODE_PACKAGE') return [add('node.capability.v2', nodeCapability(node, e))];\n if (finding.policyId === 'RAW_AUTH_HEADER') return [add('node.configuration.v2', { observation: 'AUTH_HEADER', header: 'Authorization', literalValue: e.literalValue === true }, source)];\n if (finding.policyId === 'RAW_SECRET_INDICATOR') return [add('node.configuration.v2', { observation: 'SECRET_INDICATOR', parameterPath: pointer(String(e.parameterPath ?? '')), secretKind: String(e.secretKind ?? 'opaque secret'), indicator: e.indicator === 'sensitive_key' ? 'SENSITIVE_KEY' : 'SENSITIVE_VALUE', hasLiteralValue: e.hasLiteralValue === true }, source)];\n if (finding.policyId === 'UNAPPROVED_DOMAIN') {\n const destination = destinationEvidence(finding, node);\n return [add('destination.v2', destination.properties, { kind: 'SOURCE', source: destination.source })];\n }\n if (finding.policyId === 'WEBHOOK_EXPOSURE') return [add('ingress.v2', { authentication: typeof e.authentication === 'string' ? e.authentication : null, authenticationState: 'MISSING', legacyAuthenticated: false })];\n if (finding.policyId === 'JAVASCRIPT_DYNAMIC_EXECUTION' || finding.policyId === 'PYTHON_DYNAMIC_EXECUTION') return [add('code.indicator.v2', { language: finding.policyId.startsWith('JAVA') ? 'JAVASCRIPT' : 'PYTHON', indicator: String(e.indicator), ...(typeof e.member === 'string' ? { member: e.member } : {}), start: Number(e.start), end: Number(e.end), parseState: 'VERIFIED' }, source)];\n if (finding.policyId.startsWith('TAINTED_')) return [add('dataflow.summary.v2', taintProperties(finding), source)];\n if (finding.policyId === 'AI_AGENT_UNGATED_TOOL') return [add('node.capability.v2', nodeCapability(node, e)), add('dataflow.summary.v2', { flowKind: 'AGENT_INFLUENCE', propertyPathComplete: true, humanGatePresent: e.humanGatePresent === true, humanGateDominates: e.humanGateDominates === true, taintLabels: labels(e.taintLabels) }, source)];\n return undefined;\n}\nfunction destinationEvidence(finding: ScanFinding, node: SecurityNodeV2): Readonly<{ properties: FactProperties; source: SecurityNodeV2['ref']['source'] }> {\n const domain = typeof finding.evidence.domain === 'string' ? finding.evidence.domain.toLowerCase() : null;\n if (domain !== null) {\n const fields: SemanticFieldV2[] = [];\n collectSemanticFields(node.parameters, fields);\n let match: Readonly<{ path: string; source: SecurityNodeV2['ref']['source']; scheme: 'HTTP' | 'HTTPS'; hostname: string | null; authorityState: 'KNOWN' | 'UNKNOWN'; valueMode: 'LITERAL' | 'DYNAMIC' }> | undefined;\n for (const field of fields) {\n if (typeof field.value !== 'string') continue;\n let url: URL;\n try { url = new URL(field.value); } catch { continue; }\n if (url.protocol !== 'http:' && url.protocol !== 'https:' || url.hostname.toLowerCase() !== domain) continue;\n const prefix = `${node.ref.source.pointer}/parameters`;\n if (!field.pointer.startsWith(`${prefix}/`)) continue;\n const path = field.pointer.slice(prefix.length);\n for (let occurrenceIndex = 0; occurrenceIndex < field.occurrences.length; occurrenceIndex += 1) {\n const source = field.occurrences[occurrenceIndex];\n if (match === undefined || path < match.path || path === match.path && source.astNodeId < match.source.astNodeId) {\n const islands = segmentExpressionIslands(field.value);\n const valueMode = field.classification === 'EXPRESSION' || islands.some((part) => part.kind === 'EXPRESSION') ? 'DYNAMIC' : 'LITERAL';\n const masked = maskExpressions(field.value, islands);\n const authorityBoundary = authorityEnd(masked);\n const dynamicAuthority = valueMode === 'DYNAMIC' && (authorityBoundary === 0 || islands.some((part) => part.kind === 'EXPRESSION' && part.start < authorityBoundary));\n const hostname = dynamicAuthority ? null : url.hostname.toLowerCase();\n const authorityState = dynamicAuthority || hostname === null ? 'UNKNOWN' : 'KNOWN';\n match = { path, source: admittedSource(source), scheme: url.protocol === 'https:' ? 'HTTPS' : 'HTTP', hostname, authorityState, valueMode };\n }\n }\n }\n if (match !== undefined) return { source: match.source, properties: { parameterPath: match.path, scheme: match.scheme, hostname: match.hostname, authorityState: match.authorityState, valueMode: match.valueMode } };\n }\n return { source: admittedSource(node.ref.source), properties: { parameterPath: '', scheme: 'UNKNOWN', hostname: domain, authorityState: 'KNOWN', valueMode: 'UNKNOWN' } };\n}\n\nfunction maskExpressions(value: string, islands: readonly { kind: string; start: number; end: number }[]): string {\n let output = '';\n let cursor = 0;\n for (const island of islands) {\n if (island.kind !== 'EXPRESSION') continue;\n output += `${value.slice(cursor, island.start)}x`;\n cursor = island.end;\n }\n return output + value.slice(cursor);\n}\n\nfunction authorityEnd(value: string): number {\n const match = /^([A-Za-z][A-Za-z0-9+.-]*:)?\\/\\//.exec(value);\n if (!match) return 0;\n const start = match[0].length;\n const offset = value.slice(start).search(/[/?#]/);\n return offset < 0 ? value.length : start + offset;\n}\n\nfunction collectSemanticFields(fields: readonly SemanticFieldV2[], output: SemanticFieldV2[]): void {\n for (let fieldIndex = 0; fieldIndex < fields.length; fieldIndex += 1) {\n const field = fields[fieldIndex];\n output.push(field);\n if (Array.isArray(field.value)) collectSemanticFields(field.value, output);\n }\n}\nfunction nodeCapability(node: SecurityNodeV2, evidence: Record<string, unknown>): FactProperties {\n const type = node.type; const namespaceClass = type.startsWith('n8n-nodes-base.') ? 'OFFICIAL_BASE' : type.startsWith('@n8n/') ? 'OFFICIAL_SCOPED' : 'NON_OFFICIAL';\n const capabilities = type.endsWith('executeCommand') ? ['EXECUTE_COMMAND'] : type.endsWith('.code') || type.endsWith('.function') || type.endsWith('.functionItem') ? ['CUSTOM_CODE'] : type.endsWith('.webhook') ? ['WEBHOOK'] : Number(evidence.toolCount ?? 0) > 0 ? ['AI_AGENT'] : Array.isArray(evidence.capabilities) ? labels(evidence.capabilities) : [];\n return { nodeType: type, nodePackage: type.split('.')[0] ?? type, namespaceClass, capabilities, toolCount: Number(evidence.toolCount ?? 0), contextCount: Number(evidence.contextCount ?? 0) };\n}\n\nfunction taintProperties(finding: ScanFinding): FactProperties {\n const e = finding.evidence; const sink = finding.policyId === 'TAINTED_SQL_QUERY' ? 'SQL' : finding.policyId === 'TAINTED_COMMAND' ? 'COMMAND' : finding.policyId === 'TAINTED_REQUEST_URL' ? 'SSRF' : finding.policyId === 'TAINTED_FILE_PATH' ? 'PATH' : finding.policyId === 'TAINTED_CODE_INPUT' ? 'CODE' : finding.policyId === 'TAINTED_REQUEST_HEADER' ? 'HEADER' : 'PROMPT';\n return { flowKind: 'TAINT_SINK', sink, parameterPath: pointer(String(e.parameterPath ?? '')), referenceRoot: String(e.referenceRoot ?? 'DYNAMIC_NODE'), ...(typeof e.propertyPath === 'string' ? { propertyPath: pointer(e.propertyPath) } : {}), ...(typeof e.sourceNodeId === 'string' ? { sourceNodeId: e.sourceNodeId } : {}), ...(typeof e.sourceNodeName === 'string' ? { sourceNodeName: e.sourceNodeName } : {}), propertyPathComplete: e.propertyPathComplete === true, humanGatePresent: false, humanGateDominates: false, taintLabels: labels(e.taintLabels) };\n}\n\nfunction labels(value: unknown): readonly string[] { return Array.isArray(value) ? value.filter((item): item is string => typeof item === 'string') : []; }\nfunction pointer(value: string): string { if (value === '') return ''; const parts = value.replace(/^parameters(?:\\.|$)/, '').split('.').filter(Boolean).flatMap((part) => part.match(/^[^\\[]+/)?.[0] ? [part.match(/^[^\\[]+/)![0], ...(part.match(/\\[(\\d+)\\]/g) ?? []).map((item) => item.slice(1, -1))] : []); return parts.length === 0 ? '' : `/${parts.map((part) => part.replaceAll('~', '~0').replaceAll('/', '~1')).join('/')}`; }\n", "import { compareSemver, parseStrictSemver, type StrictSemver } from '../semantics/semver';\nimport { matchesVersionRange } from '../semantics/version-range';\nimport type { TargetContextV2 } from '../semantics/target-context';\nimport type { AdvisoryRecordV2 } from './advisory-schema';\n\ntype Applicability = 'APPLICABLE' | 'NOT_APPLICABLE' | 'UNKNOWN';\ntype PrerequisiteState = 'MISSING' | 'FAILED' | 'MATCHED';\n\nfunction targetValue(key: string, target: TargetContextV2): string | undefined {\n if (key === 'n8nVersion') return target.n8nVersion;\n if (key === 'edition') return target.edition === 'UNKNOWN' ? undefined : target.edition;\n if (key === 'deployment') return target.deployment === 'UNKNOWN' ? undefined : target.deployment;\n if (key === 'role') return target.role === 'UNKNOWN' ? undefined : target.role;\n if (key === 'taskRunner') return target.taskRunner === 'UNKNOWN' ? undefined : target.taskRunner;\n if (key.startsWith('package:')) {\n const packageName = key.slice(8);\n for (const item of target.communityPackages) if (item.name === packageName) return item.version;\n return undefined;\n }\n if (key.startsWith('configuration:')) {\n const configKey = key.slice(14);\n for (const item of target.configuration) if (item.key === configKey) return item.state === 'UNKNOWN' ? undefined : item.state;\n return undefined;\n }\n return undefined;\n}\n\nfunction packageVersion(advisory: AdvisoryRecordV2, target: TargetContextV2): string | undefined {\n if (advisory.packageName === 'n8n') return target.n8nVersion;\n for (const item of target.communityPackages) if (item.name === advisory.packageName) return item.version;\n return undefined;\n}\n\nfunction missingRequiredTarget(advisory: AdvisoryRecordV2, target: TargetContextV2): boolean {\n if (target.n8nVersion === undefined) return true;\n if (packageVersion(advisory, target) === undefined) return true;\n for (const prerequisite of advisory.prerequisites) if (targetValue(prerequisite.key, target) === undefined) return true;\n return false;\n}\n\nfunction expectedValue(key: string, expected: string): string {\n if (key === 'edition' || key === 'deployment' || key === 'role' || key === 'taskRunner' || key.startsWith('configuration:')) return expected.toUpperCase();\n return expected;\n}\n\nfunction semverEquals(left: string, right: StrictSemver): boolean {\n try { return compareSemver(parseStrictSemver(left), right) === 0; } catch { return false; }\n}\n\nfunction prerequisitesMatch(prerequisites: readonly Readonly<{ key: string; expected: string }>[], target: TargetContextV2): boolean {\n for (const prerequisite of prerequisites) {\n const actual = targetValue(prerequisite.key, target);\n if (actual === undefined) return false;\n if (prerequisite.key === 'n8nVersion' || prerequisite.key.startsWith('package:')) {\n try { if (!semverEquals(actual, parseStrictSemver(expectedValue(prerequisite.key, prerequisite.expected)))) return false; } catch { return false; }\n } else if (actual !== expectedValue(prerequisite.key, prerequisite.expected)) return false;\n }\n return true;\n}\n\nfunction prerequisiteState(prerequisites: readonly Readonly<{ key: string; expected: string }>[], target: TargetContextV2): PrerequisiteState {\n for (const prerequisite of prerequisites) if (targetValue(prerequisite.key, target) === undefined) return 'MISSING';\n return prerequisitesMatch(prerequisites, target) ? 'MATCHED' : 'FAILED';\n}\n\nexport function evaluateAdvisoryApplicability(advisory: AdvisoryRecordV2, target: TargetContextV2): Applicability {\n if (missingRequiredTarget(advisory, target)) return 'UNKNOWN';\n if (advisory.reviewState !== 'ADMITTED') return 'UNKNOWN';\n const versionText = packageVersion(advisory, target);\n if (versionText === undefined) return 'UNKNOWN';\n let version: StrictSemver;\n try { version = parseStrictSemver(versionText); } catch { return 'UNKNOWN'; }\n for (const fixed of advisory.fixedVersions) {\n try { if (compareSemver(version, fixed) === 0) return 'NOT_APPLICABLE'; } catch { return 'UNKNOWN'; }\n }\n try { if (!matchesVersionRange(version, advisory.affected)) return 'NOT_APPLICABLE'; } catch { return 'UNKNOWN'; }\n const state = prerequisiteState(advisory.prerequisites, target);\n if (state === 'MISSING') return 'UNKNOWN';\n if (state === 'FAILED') return 'NOT_APPLICABLE';\n return 'APPLICABLE';\n}\n", "import { DEFAULT_SCANNER_LIMITS_V2, type ScannerLimitsV2 } from '@hub/contracts';\nimport { segmentExpressionIslands } from '../expression/expression-islands';\nimport type { ResolvedNodeSemanticsV2 } from '../../semantics/catalogue-schema';\nimport type { SemanticFieldV2, SecurityNodeV2, SecurityWorkflowV2 } from '../../workflow-v2/security-workflow';\nconst MAX_DESTINATION_TEXT = 16_384;\n\nexport type DestinationScheme = 'HTTP' | 'HTTPS' | 'UNKNOWN';\nexport type DestinationAuthorityState = 'KNOWN' | 'UNKNOWN';\nexport type DestinationValueMode = 'LITERAL' | 'DYNAMIC' | 'UNKNOWN';\nexport type DestinationEvidence = 'OBSERVED' | 'MISSING_PATH' | 'MALFORMED_PATH';\nexport type DestinationInventoryRecord = Readonly<{\n nodeIdentity: string; parameterPath: string; scheme: DestinationScheme; hostname: string | null;\n authorityState: DestinationAuthorityState; valueMode: DestinationValueMode; evidence: DestinationEvidence;\n}>;\nexport type DestinationInventoryError = Readonly<{\n code: 'MISSING_SEMANTICS' | 'MISSING_PATH' | 'MALFORMED_PATH' | 'LIMIT_EXCEEDED' | 'UNSAFE_INPUT';\n nodeIdentity: string | null; parameterPath: string | null;\n}>;\nexport type DestinationInventoryCounters = Readonly<{\n nodesExamined: number; pathsConfigured: number; semanticMembersExamined: number;\n occurrencesExamined: number; recordsEmitted: number; membersAndElementsExamined: number;\n}>;\nexport type DestinationInventoryResult = Readonly<{\n status: 'COMPLETE' | 'UNKNOWN' | 'LIMIT_EXCEEDED' | 'UNSAFE_INPUT';\n records: readonly DestinationInventoryRecord[]; counters: DestinationInventoryCounters;\n errors: readonly DestinationInventoryError[];\n}>;\nexport type DestinationSemanticSource = ReadonlyMap<string, ResolvedNodeSemanticsV2> | Readonly<{\n resolvedNodeSemantics: ReadonlyMap<string, ResolvedNodeSemanticsV2>;\n}>;\nexport type DestinationInventoryOptions = Readonly<{ maxMembersAndElements?: number }> | ScannerLimitsV2 | number;\n\ntype MutableCounters = { nodesExamined: number; pathsConfigured: number; semanticMembersExamined: number; occurrencesExamined: number; recordsEmitted: number; membersAndElementsExamined: number };\ntype MutableState = { records: DestinationInventoryRecord[]; errors: DestinationInventoryError[]; counters: MutableCounters; used: number; maximum: number };\ntype Pointer = readonly string[];\n\nexport function inventoryDestinations(workflow: SecurityWorkflowV2, semantics: DestinationSemanticSource, options: DestinationInventoryOptions = DEFAULT_SCANNER_LIMITS_V2): DestinationInventoryResult {\n const maximum = readMaximum(options);\n if (maximum === undefined || !safeWorkflow(workflow) || !safeSemantics(semantics)) return result('UNSAFE_INPUT', [], [], emptyCounters());\n const state: MutableState = { records: [], errors: [], counters: emptyCounters(), used: 0, maximum };\n for (const node of workflow.nodes) {\n state.counters.nodesExamined += 1;\n const record = lookup(semantics, node.ref.identityDigest);\n if (record === undefined || record.nodeType !== node.type) { state.errors.push(error('MISSING_SEMANTICS', node.ref.identityDigest, null)); continue; }\n const paths = record.destinationPaths;\n if (!charge(state, paths.length)) return result('LIMIT_EXCEEDED', [], [...state.errors, error('LIMIT_EXCEEDED', node.ref.identityDigest, null)], state.counters);\n state.counters.pathsConfigured += paths.length;\n const parsedPaths = paths.map((path) => ({ path, segments: pointer(path) }));\n if (!charge(state, node.parameters.length)) return result('LIMIT_EXCEEDED', [], [...state.errors, error('LIMIT_EXCEEDED', node.ref.identityDigest, null)], state.counters);\n state.counters.semanticMembersExamined += node.parameters.length;\n const fields: SemanticFieldV2[] = [];\n if (!collectFields(node.parameters, state, fields)) return result('LIMIT_EXCEEDED', [], [...state.errors, error('LIMIT_EXCEEDED', node.ref.identityDigest, null)], state.counters);\n for (const configured of parsedPaths) {\n if (configured.segments === undefined) {\n emit(state, unknownRecord(node.ref.identityDigest, configured.path, 'MALFORMED_PATH'));\n state.errors.push(error('MALFORMED_PATH', node.ref.identityDigest, configured.path));\n continue;\n }\n let found = false;\n for (const field of fields) {\n if (!matches(node, field, configured.segments)) continue;\n found = true;\n const occurrences = field.occurrences.length;\n state.counters.occurrencesExamined += occurrences;\n for (let index = 0; index < occurrences; index += 1) emit(state, observedRecord(node.ref.identityDigest, configured.path, field));\n }\n if (!found) {\n emit(state, unknownRecord(node.ref.identityDigest, configured.path, 'MISSING_PATH'));\n state.errors.push(error('MISSING_PATH', node.ref.identityDigest, configured.path));\n }\n }\n }\n return result(state.errors.length === 0 ? 'COMPLETE' : 'UNKNOWN', state.records, state.errors, state.counters);\n}\n\nfunction collectFields(fields: readonly SemanticFieldV2[], state: MutableState, output: SemanticFieldV2[]): boolean {\n for (const field of fields) {\n if (!charge(state, field.occurrences.length)) return false;\n output.push(field);\n if (Array.isArray(field.value)) {\n if (!charge(state, field.value.length)) return false;\n state.counters.semanticMembersExamined += field.value.length;\n if (!collectFields(field.value, state, output)) return false;\n }\n }\n return true;\n}\nfunction matches(node: SecurityNodeV2, field: SemanticFieldV2, segments: Pointer): boolean {\n const prefix = pointer(node.ref.source.pointer);\n const fieldPath = pointer(field.pointer);\n if (prefix === undefined || fieldPath === undefined || fieldPath.length < prefix.length + 2) return false;\n for (let i = 0; i < prefix.length; i += 1) if (fieldPath[i] !== prefix[i]) return false;\n if (fieldPath[prefix.length] !== 'parameters') return false;\n const relative = fieldPath.slice(prefix.length + 1);\n return relative.length === segments.length && relative.every((item, index) => item === segments[index]);\n}\nfunction observedRecord(nodeIdentity: string, parameterPath: string, field: SemanticFieldV2): DestinationInventoryRecord {\n if (typeof field.value !== 'string') return unknownRecord(nodeIdentity, parameterPath, 'OBSERVED');\n const dynamic = field.classification === 'EXPRESSION' || segmentExpressionIslands(field.value).some((part) => part.kind === 'EXPRESSION');\n return Object.freeze({ nodeIdentity, parameterPath, ...authority(field.value), valueMode: dynamic ? 'DYNAMIC' : 'LITERAL', evidence: 'OBSERVED' });\n}\nfunction authority(value: string): Pick<DestinationInventoryRecord, 'scheme' | 'hostname' | 'authorityState'> {\n const islands = segmentExpressionIslands(value); const masked = mask(value, islands); const dynamicValue = islands.some((part) => part.kind === 'EXPRESSION'); const authorityBoundary = authorityEnd(masked); const dynamicAuthority = dynamicValue && (authorityBoundary === 0 || islands.some((part) => part.kind === 'EXPRESSION' && part.start < authorityBoundary));\n const match = /^([A-Za-z][A-Za-z0-9+.-]*):\\/\\//.exec(masked); const protocolRelative = masked.startsWith('//');\n const candidate = match ? masked : protocolRelative ? `http:${masked}` : !dynamicValue && hostLike(masked) ? `http://${masked}` : undefined;\n if (candidate === undefined) return { scheme: 'UNKNOWN', hostname: null, authorityState: 'UNKNOWN' };\n try { const url = new URL(candidate); const hostname = url.hostname || null;\n return { scheme: match?.[1].toLowerCase() === 'http' ? 'HTTP' : match?.[1].toLowerCase() === 'https' ? 'HTTPS' : 'UNKNOWN', hostname: dynamicAuthority ? null : hostname, authorityState: dynamicAuthority || hostname === null ? 'UNKNOWN' : 'KNOWN' };\n } catch { return { scheme: match?.[1].toLowerCase() === 'http' ? 'HTTP' : match?.[1].toLowerCase() === 'https' ? 'HTTPS' : 'UNKNOWN', hostname: null, authorityState: 'UNKNOWN' }; }\n}\nfunction authorityEnd(value: string): number { const match = /^([A-Za-z][A-Za-z0-9+.-]*:)?\\/\\//.exec(value); if (!match) return 0; const start = match[0].length; const rest = value.slice(start); const offset = rest.search(/[/?#]/); return offset < 0 ? value.length : start + offset; }\nfunction hostLike(value: string): boolean { return !value.startsWith('=') && /^[^/\\\\?#\\s:@]+(?::\\d{1,5})?(?:[/?#].*)?$/.test(value) && !value.startsWith('.'); }\nfunction mask(value: string, islands: readonly { kind: string; start: number; end: number }[]): string { let output = ''; let cursor = 0; for (const island of islands) { if (island.kind !== 'EXPRESSION') continue; output += value.slice(cursor, island.start) + 'x'; cursor = island.end; } return output + value.slice(cursor); }\nfunction pointer(value: string): Pointer | undefined { if (typeof value !== 'string' || value.length > 4_096) return undefined; if (value.length === 0) return Object.freeze([]); if (!value.startsWith('/')) return undefined; const parts = value.slice(1).split('/'); const decoded: string[] = []; for (const part of parts) { let item = ''; for (let i = 0; i < part.length; i += 1) { if (part[i] !== '~') { item += part[i]; continue; } const next = part[i + 1]; if (next !== '0' && next !== '1') return undefined; item += next === '0' ? '~' : '/'; i += 1; } decoded.push(item); } return Object.freeze(decoded); }\nfunction unknownRecord(nodeIdentity: string, parameterPath: string, evidence: 'MISSING_PATH' | 'MALFORMED_PATH' | 'OBSERVED'): DestinationInventoryRecord { return Object.freeze({ nodeIdentity, parameterPath, scheme: 'UNKNOWN', hostname: null, authorityState: 'UNKNOWN', valueMode: 'UNKNOWN', evidence }); }\nfunction emptyCounters(): MutableCounters { return { nodesExamined: 0, pathsConfigured: 0, semanticMembersExamined: 0, occurrencesExamined: 0, recordsEmitted: 0, membersAndElementsExamined: 0 }; }\nfunction emit(state: MutableState, record: DestinationInventoryRecord): void { state.records.push(record); state.counters.recordsEmitted += 1; }\nfunction charge(state: MutableState, count: number): boolean { if (!Number.isSafeInteger(count) || count < 0 || state.used > state.maximum - count) return false; state.used += count; state.counters.membersAndElementsExamined = state.used; return true; }\nfunction error(code: DestinationInventoryError['code'], nodeIdentity: string | null, parameterPath: string | null): DestinationInventoryError { return Object.freeze({ code, nodeIdentity, parameterPath }); }\nfunction result(status: DestinationInventoryResult['status'], records: readonly DestinationInventoryRecord[], errors: readonly DestinationInventoryError[], counters: MutableCounters): DestinationInventoryResult { return Object.freeze({ status, records: Object.freeze([...records]), counters: Object.freeze({ ...counters }), errors: Object.freeze([...errors]) }); }\nfunction readMaximum(options: DestinationInventoryOptions): number | undefined { if (typeof options === 'number') return Number.isSafeInteger(options) && options >= 0 ? options : undefined; if (options === null || typeof options !== 'object') return undefined; const descriptor = Object.getOwnPropertyDescriptor(options, 'maxMembersAndElements'); const value = descriptor && 'value' in descriptor ? descriptor.value : undefined; return value === undefined ? DEFAULT_SCANNER_LIMITS_V2.maxMembersAndElements : Number.isSafeInteger(value) && value >= 0 ? value : undefined; }\nfunction lookup(source: DestinationSemanticSource, identity: string): ResolvedNodeSemanticsV2 | undefined { const map = 'resolvedNodeSemantics' in source ? source.resolvedNodeSemantics : source; return Map.prototype.get.call(map, identity) as ResolvedNodeSemanticsV2 | undefined; }\nfunction plainFrozen(value: unknown): value is Record<string, unknown> { if (value === null || typeof value !== 'object' || Array.isArray(value) || Object.getPrototypeOf(value) !== Object.prototype || !Object.isFrozen(value)) return false; return Object.getOwnPropertyNames(value).every((name) => { const descriptor = Object.getOwnPropertyDescriptor(value, name); return descriptor !== undefined && 'value' in descriptor; }); }\nfunction safeRef(value: unknown): boolean { if (!plainFrozen(value) || !closed(value, ['pointer', 'occurrencePath', 'astNodeId', 'span'], ['pointer', 'occurrencePath', 'astNodeId', 'span'])) return false; const pointerValue = value.pointer; const astNodeId = value.astNodeId; return typeof pointerValue === 'string' && pointer(pointerValue) !== undefined && denseFrozen(value.occurrencePath) && typeof astNodeId === 'string' && /^[0-9a-f]{64}$/.test(astNodeId); }\nfunction safeWorkflow(value: unknown): value is SecurityWorkflowV2 { if (!plainFrozen(value) || !closed(value, ['workflowFields', 'nodes', 'edges', 'ambiguities'], ['workflowFields', 'nodes', 'edges', 'ambiguities']) || !denseFrozen(value.nodes) || !denseFrozen(value.workflowFields) || !denseFrozen(value.edges) || !denseFrozen(value.ambiguities)) return false; return value.nodes.every((node) => { if (!plainFrozen(node) || !closed(node, ['ref', 'type', 'typeVersion', 'disabled', 'scoringEligibility', 'parameters', 'credentials', 'settings'], ['ref', 'type', 'disabled', 'scoringEligibility', 'parameters', 'credentials', 'settings']) || !plainFrozen(node.ref) || !closed(node.ref, ['ordinal', 'source', 'explicitId', 'name', 'identityDigest'], ['ordinal', 'source', 'identityDigest']) || typeof node.ref.identityDigest !== 'string' || !/^[0-9a-f]{64}$/.test(node.ref.identityDigest) || !safeRef(node.ref.source) || !denseFrozen(node.parameters) || !denseFrozen(node.credentials) || !denseFrozen(node.settings)) return false; return node.parameters.every((field) => safeField(field)); }); }\nfunction safeField(value: unknown, depth = 0): value is SemanticFieldV2 { if (depth > 256 || !plainFrozen(value) || !closed(value, ['pointer', 'occurrences', 'value', 'classification'], ['pointer', 'occurrences', 'value', 'classification'])) return false; if (pointer(value.pointer as string) === undefined || !denseFrozen(value.occurrences) || !['PLAIN', 'EXPRESSION', 'CODE', 'CREDENTIAL_REF', 'SECRET_CANDIDATE'].includes(value.classification as string)) return false; if (!value.occurrences.every(safeRef)) return false; if (Array.isArray(value.value)) return denseFrozen(value.value) && value.value.every((item) => safeField(item, depth + 1)); return value.value === null || typeof value.value === 'boolean' || typeof value.value === 'number' && Number.isFinite(value.value) || typeof value.value === 'string' && value.value.length <= MAX_DESTINATION_TEXT; }\nfunction denseFrozen(value: unknown): value is readonly unknown[] { if (!Array.isArray(value) || Object.getPrototypeOf(value) !== Array.prototype || !Object.isFrozen(value) || Object.getOwnPropertySymbols(value).length > 0) return false; const names = Object.getOwnPropertyNames(value); return names.length === value.length + 1 && names.includes('length') && names.every((name) => { if (name === 'length') return true; const descriptor = Object.getOwnPropertyDescriptor(value, name); return /^(0|[1-9]\\d*)$/.test(name) && descriptor !== undefined && 'value' in descriptor; }); }\nfunction safeSemantics(value: unknown): value is DestinationSemanticSource { const map = value instanceof Map ? value : plainFrozen(value) && closed(value, ['resolvedNodeSemantics'], ['resolvedNodeSemantics']) ? value.resolvedNodeSemantics : undefined; if (!(map instanceof Map) || Object.getPrototypeOf(map) !== Map.prototype || Object.getOwnPropertyNames(map).length !== 0 || Object.getOwnPropertySymbols(map).length !== 0) return false; const keys = ['semanticId', 'nodeType', 'versionRange', 'operation', 'entry', 'parameterPaths', 'authentication', 'credentialPaths', 'destinationPaths', 'effects', 'endpoints', 'ports', 'overwritePaths', 'errorMode', 'retryMode', 'disabledMode', 'provenance']; for (const [key, record] of map.entries()) if (typeof key !== 'string' || !deeplyFrozen(record) || !plainFrozen(record) || !closed(record, keys, keys) || !denseFrozen(record.destinationPaths) || !record.destinationPaths.every((path) => typeof path === 'string')) return false; return true; }\nfunction closed(value: Record<string, unknown>, allowed: readonly string[], required: readonly string[]): boolean { const names = Object.getOwnPropertyNames(value); return names.length === new Set(names).size && names.every((name) => allowed.includes(name)) && required.every((name) => Object.prototype.hasOwnProperty.call(value, name)); }\nfunction deeplyFrozen(value: unknown, seen = new WeakSet<object>()): boolean { if (value === null || typeof value !== 'object') return true; if (seen.has(value)) return true; if (!Object.isFrozen(value)) return false; seen.add(value); return Object.getOwnPropertyNames(value).every((name) => { const descriptor = Object.getOwnPropertyDescriptor(value, name); return descriptor !== undefined && 'value' in descriptor && deeplyFrozen(descriptor.value, seen); }); }\n", "import type { AdvisoryRecordV2 } from '../advisories/advisory-schema';\nimport { evaluateAdvisoryApplicability } from '../advisories/advisory-applicability';\nimport { createDiagnostic, makeFact } from './adapter-evidence';\nimport type { AnalysisDiagnosticV2 } from '../diagnostics/registry';\nimport { inventoryDestinations, type DestinationInventoryRecord } from '../analyzers/destinations/inventory';\nimport { sortDiagnostics } from '../diagnostics/identity';\nimport { resolveNodeSemanticsForScan } from '../semantics/generic-fallback';\nimport type { ResolvedNodeSemanticsV2, SemanticCatalogueV2 } from '../semantics/catalogue-schema';\nimport type { TargetContextV2 } from '../semantics/target-context';\nimport type { ReadonlySourceDocumentV2, SourceMemberRefV2 } from '../source/source-types';\nimport type { SemanticFieldV2, SecurityWorkflowV2 } from '../workflow-v2/security-workflow';\nimport type { SafeFactV2 } from './scheduler';\n\nexport type SemanticContextV2 = Readonly<{\n facts: readonly SafeFactV2[];\n diagnostics: readonly AnalysisDiagnosticV2[];\n}>;\n\nexport const EMPTY_ADVISORY_CATALOGUE_V2: Readonly<{\n records: readonly AdvisoryRecordV2[];\n}> = Object.freeze({ records: Object.freeze([]) });\n\nexport function resolveAnalyzerSemanticContext(input: Readonly<{\n source: ReadonlySourceDocumentV2;\n workflow: SecurityWorkflowV2;\n target: TargetContextV2;\n catalogue: SemanticCatalogueV2;\n advisories: Readonly<{ records: readonly AdvisoryRecordV2[] }>;\n capabilityId: string;\n required: boolean;\n}>): SemanticContextV2 {\n const diagnostics: AnalysisDiagnosticV2[] = [];\n const resolved = new Map<string, ResolvedNodeSemanticsV2>();\n for (const node of input.workflow.nodes) {\n const resolution = resolveNodeSemanticsForScan(input.catalogue, node);\n if (resolution === null) diagnostics.push(createDiagnostic('SEMANTIC_CATALOGUE_MISS', input.capabilityId, input.required, node.ref.source));\n else {\n resolved.set(node.ref.identityDigest, resolution.semantics);\n // Two meanings, never one substitute for the other. The miss says the node type has no\n // admitted catalogue record (the same code the fail-closed path uses at caller requiredness);\n // the capability code says the verdict rests on unmodelled-capability defaults whose\n // destinations are unknown, not audited-and-empty. Both are per node at that node's source\n // location and both are degraded/eligible, so the report's coverage section names exactly\n // which nodes rest on the assumption without withholding the workflow's verdict.\n if (resolution.origin === 'GENERIC_FALLBACK') {\n diagnostics.push(createDiagnostic('SEMANTIC_CATALOGUE_MISS', input.capabilityId, false, node.ref.source));\n diagnostics.push(createDiagnostic('GENERIC_NODE_UNMODELED_CAPABILITY', input.capabilityId, false, node.ref.source));\n }\n }\n }\n const factsById = new Map<string, SafeFactV2>();\n for (const advisory of input.advisories.records) {\n const applicability = evaluateAdvisoryApplicability(advisory, input.target);\n const fact = createAdvisoryApplicabilityFact({\n advisoryId: advisory.id,\n applicability,\n reviewState: advisory.reviewState,\n matchedPrerequisites: [],\n unknownPrerequisites: applicability === 'UNKNOWN' ? ['target'] : [],\n });\n if (!factsById.has(fact.factId)) factsById.set(fact.factId, fact);\n }\n for (const fact of destinationFacts(input.workflow, resolved)) if (!factsById.has(fact.factId)) factsById.set(fact.factId, fact);\n const facts = [...factsById.values()];\n facts.sort((left, right) => compareStrings(left.factId, right.factId));\n return Object.freeze({\n facts: Object.freeze(facts),\n diagnostics: sortDiagnostics(diagnostics, [input.capabilityId]),\n });\n}\n\nfunction createAdvisoryApplicabilityFact(input: Readonly<{\n advisoryId: string;\n applicability: 'APPLICABLE' | 'NOT_APPLICABLE' | 'UNKNOWN';\n reviewState: AdvisoryRecordV2['reviewState'];\n matchedPrerequisites: readonly string[];\n unknownPrerequisites: readonly string[];\n}>): SafeFactV2 {\n const subject = Object.freeze({ kind: 'WORKFLOW' as const });\n const properties = Object.freeze({\n advisoryId: input.advisoryId,\n applicability: input.applicability,\n reviewState: input.reviewState,\n matchedPrerequisites: Object.freeze([...input.matchedPrerequisites]),\n unknownPrerequisites: Object.freeze([...input.unknownPrerequisites]),\n });\n const fact = makeFact('advisory.applicability.v2', subject, properties);\n return Object.freeze({ factId: fact.factId, kind: fact.kind, subject, properties });\n}\n\nfunction destinationFacts(workflow: SecurityWorkflowV2, semantics: ReadonlyMap<string, ResolvedNodeSemanticsV2>): SafeFactV2[] {\n const sources = new Map<string, SourceMemberRefV2[]>();\n for (const node of workflow.nodes) {\n const fields: SemanticFieldV2[] = [];\n collectFields(node.parameters, fields);\n for (const field of fields) {\n const parameterPath = relativeParameterPath(node.ref.source.pointer, field.pointer);\n if (parameterPath === undefined) continue;\n for (const source of field.occurrences) {\n const key = `${node.ref.identityDigest}\\u0000${parameterPath}`;\n const values = sources.get(key);\n if (values === undefined) sources.set(key, [source]);\n else values.push(source);\n }\n }\n }\n const inventory = inventoryDestinations(workflow, semantics);\n const facts: SafeFactV2[] = [];\n for (const record of inventory.records) {\n const node = workflow.nodes.find((candidate) => candidate.ref.identityDigest === record.nodeIdentity);\n if (node === undefined) continue;\n const key = `${record.nodeIdentity}\\u0000${record.parameterPath}`;\n const source = sources.get(key)?.shift() ?? node.ref.source;\n facts.push(createDestinationFact(record, source));\n }\n return facts;\n}\n\nfunction relativeParameterPath(nodePointer: string, fieldPointer: string): string | undefined {\n const prefix = `${nodePointer}/parameters`;\n return fieldPointer.startsWith(`${prefix}/`) ? fieldPointer.slice(prefix.length) : undefined;\n}\n\nfunction collectFields(fields: readonly SemanticFieldV2[], output: SemanticFieldV2[]): void {\n for (const field of fields) {\n output.push(field);\n if (Array.isArray(field.value)) collectFields(field.value, output);\n }\n}\n\nfunction createDestinationFact(record: DestinationInventoryRecord, source: SourceMemberRefV2): SafeFactV2 {\n const subject = Object.freeze({ kind: 'SOURCE' as const, source });\n const properties = Object.freeze({\n parameterPath: record.parameterPath,\n scheme: record.scheme,\n hostname: record.hostname,\n authorityState: record.authorityState,\n valueMode: record.valueMode,\n });\n const fact = makeFact('destination.v2', subject, properties);\n return Object.freeze({ factId: fact.factId, kind: fact.kind, subject, properties });\n}\n\nfunction compareStrings(left: string, right: string): number {\n if (left === right) return 0;\n return left < right ? -1 : 1;\n}\n", "import type { RawWorkflowEdge, WorkflowGraphViews } from './workflow-graph';\n\nconst EXECUTION_TYPES = new Set(['main']);\nconst CAPABILITY_TYPES = new Set(['ai_tool']);\nconst CONTEXT_TYPES = new Set([\n 'ai_document',\n 'ai_embedding',\n 'ai_languageModel',\n 'ai_memory',\n 'ai_outputParser',\n 'ai_retriever',\n 'ai_reranker',\n 'ai_textSplitter',\n 'ai_vectorStore',\n]);\n\n/** Classify edges only when their connection type has been reviewed. */\nexport function deriveGraphViews(edges: readonly RawWorkflowEdge[]): WorkflowGraphViews {\n return {\n execution: edges.filter((edge) => EXECUTION_TYPES.has(edge.connectionType)),\n capability: edges.filter((edge) => CAPABILITY_TYPES.has(edge.connectionType)),\n context: edges.filter((edge) => CONTEXT_TYPES.has(edge.connectionType)),\n unknown: edges.filter((edge) => !EXECUTION_TYPES.has(edge.connectionType)\n && !CAPABILITY_TYPES.has(edge.connectionType)\n && !CONTEXT_TYPES.has(edge.connectionType)),\n };\n}\n", "import { deriveGraphViews } from './workflow-graph-views';\nimport { toJsonPointer } from './json-pointer';\n\nexport type WorkflowGraphDiagnostic =\n | {\n code:\n | 'UNKNOWN_CONNECTION_SOURCE'\n | 'AMBIGUOUS_CONNECTION_SOURCE'\n | 'UNKNOWN_CONNECTION_TARGET'\n | 'AMBIGUOUS_CONNECTION_TARGET'\n | 'MALFORMED_CONNECTION_ENTRY';\n }\n // The target `index` was present but not a finite non-negative integer (e.g. -1, 1.5,\n // NaN, a numeric string, or an object). Rejected rather than coerced: a coerced index\n // would silently change which taint edges hardened analysis can see. `pointer` locates\n // the offending `index` value in the source connections object.\n | { code: 'MALFORMED_CONNECTION_INDEX'; pointer: string };\n\nexport type RawWorkflowEdge = {\n ordinal: number;\n connectionType: string;\n fromNodeIndex: number;\n fromOutputIndex: number;\n toNodeIndex: number;\n toInputIndex: number;\n};\n\nexport type WorkflowGraphViews = {\n execution: RawWorkflowEdge[];\n capability: RawWorkflowEdge[];\n context: RawWorkflowEdge[];\n unknown: RawWorkflowEdge[];\n};\n\nexport type WorkflowGraph = {\n edges: RawWorkflowEdge[];\n views: WorkflowGraphViews;\n diagnostics: WorkflowGraphDiagnostic[];\n limitExceeded: boolean;\n};\n\nexport function buildWorkflowGraph(\n nodes: ReadonlyArray<{ name: string }>,\n connections: Record<string, unknown>,\n options: { maxEdges?: number } = {},\n): WorkflowGraph {\n const maxEdges = options.maxEdges ?? Infinity;\n const nodeIndexesByName = indexesByName(nodes);\n const edges: RawWorkflowEdge[] = [];\n const diagnostics: WorkflowGraphDiagnostic[] = [];\n\n for (const [sourceName, byType] of Object.entries(connections)) {\n const fromNodeIndex = resolveIndex(nodeIndexesByName, sourceName, diagnostics, 'SOURCE');\n if (fromNodeIndex === undefined) continue;\n if (!isRecord(byType)) {\n diagnostics.push({ code: 'MALFORMED_CONNECTION_ENTRY' });\n continue;\n }\n\n for (const [connectionType, outputs] of Object.entries(byType)) {\n if (!Array.isArray(outputs)) {\n diagnostics.push({ code: 'MALFORMED_CONNECTION_ENTRY' });\n continue;\n }\n for (const [fromOutputIndex, targets] of outputs.entries()) {\n if (targets === null || targets === undefined) continue;\n if (!Array.isArray(targets)) {\n diagnostics.push({ code: 'MALFORMED_CONNECTION_ENTRY' });\n continue;\n }\n\n for (const [targetIndex, target] of targets.entries()) {\n if (edges.length >= maxEdges) {\n return { edges, views: deriveGraphViews(edges), diagnostics, limitExceeded: true };\n }\n if (!isRecord(target) || typeof target.node !== 'string') {\n diagnostics.push({ code: 'MALFORMED_CONNECTION_ENTRY' });\n continue;\n }\n\n const toNodeIndex = resolveIndex(nodeIndexesByName, target.node, diagnostics, 'TARGET');\n if (toNodeIndex === undefined) continue;\n\n const toInputIndex = resolveTargetInputIndex(target.index);\n if (toInputIndex === undefined) {\n diagnostics.push({\n code: 'MALFORMED_CONNECTION_INDEX',\n pointer: toJsonPointer(['connections', sourceName, connectionType, fromOutputIndex, targetIndex, 'index']),\n });\n continue;\n }\n\n edges.push({\n ordinal: edges.length,\n connectionType,\n fromNodeIndex,\n fromOutputIndex,\n toNodeIndex,\n toInputIndex,\n });\n }\n }\n }\n }\n\n return { edges, views: deriveGraphViews(edges), diagnostics, limitExceeded: false };\n}\n\nfunction resolveIndex(\n nodeIndexesByName: Map<string, number[]>,\n name: string,\n diagnostics: WorkflowGraphDiagnostic[],\n end: 'SOURCE' | 'TARGET',\n): number | undefined {\n const indexes = nodeIndexesByName.get(name);\n if (!indexes) {\n diagnostics.push({ code: end === 'SOURCE' ? 'UNKNOWN_CONNECTION_SOURCE' : 'UNKNOWN_CONNECTION_TARGET' });\n return undefined;\n }\n if (indexes.length !== 1) {\n diagnostics.push({ code: end === 'SOURCE' ? 'AMBIGUOUS_CONNECTION_SOURCE' : 'AMBIGUOUS_CONNECTION_TARGET' });\n return undefined;\n }\n return indexes[0];\n}\n\nfunction indexesByName(nodes: ReadonlyArray<{ name: string }>): Map<string, number[]> {\n const result = new Map<string, number[]>();\n nodes.forEach((node, index) => result.set(node.name, [...(result.get(node.name) ?? []), index]));\n return result;\n}\n\n// A missing `index` (the key is absent from the JSON) defaults to 0, matching real n8n\n// exports that omit it for a node's sole input. Any other value must be a strict,\n// finite, non-negative integer \u2014 including a numeric string like \"0\", which is\n// rejected rather than coerced.\nfunction resolveTargetInputIndex(rawIndex: unknown): number | undefined {\n if (rawIndex === undefined) return 0;\n return typeof rawIndex === 'number' && Number.isInteger(rawIndex) && rawIndex >= 0 ? rawIndex : undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n", "import type { NormalizedWorkflow, NormalizedWorkflowNode } from '../workflow';\nimport { buildWorkflowGraph } from '../workflow-graph';\nimport type { SourceValueV2 } from '../source/source-types';\nimport type { AnalyzerContextV2 } from './scheduler';\nimport type { SemanticFieldV2, SecurityNodeV2 } from '../workflow-v2/security-workflow';\n\ntype DataRecord = Record<string, unknown>;\n\nexport function toNativeWorkflow(context: AnalyzerContextV2): NormalizedWorkflow {\n const rawRoot = sourceValue(context.source.root);\n const root = record(rawRoot);\n const rawNodes = Array.isArray(root.nodes) ? root.nodes : [];\n const nodes = Array.prototype.map.call(context.workflow.nodes, (node: SecurityNodeV2) => nativeNode(node, rawNodes[node.ref.ordinal])) as NormalizedWorkflowNode[];\n const connections = record(root.connections);\n return {\n ...(typeof root.name === 'string' ? { name: root.name } : {}),\n fingerprint: context.source.rawSha256,\n payloadBytes: context.source.utf8Bytes,\n nodeCount: nodes.length,\n nodes,\n connections,\n parseDiagnostics: [],\n graph: buildWorkflowGraph(nodes, connections, { maxEdges: context.limits.maxEdges }),\n };\n}\n\nfunction nativeNode(node: SecurityNodeV2, raw: unknown): NormalizedWorkflowNode {\n const source = record(raw);\n const parameters = record(source.parameters);\n const fallback = fieldsObject(node.parameters);\n const value = Object.keys(parameters).length === 0 && node.parameters.length > 0 ? fallback : parameters;\n return {\n id: node.ref.explicitId ?? node.ref.name ?? String(node.ref.ordinal),\n name: node.ref.name ?? String(node.ref.ordinal),\n type: node.type,\n ...(node.typeVersion !== undefined ? { typeVersion: node.typeVersion } : {}),\n parameters: value,\n sourcePath: node.ref.source.pointer,\n ...(node.ref.source.span === null ? {} : { sourceSpan: {\n start: { line: node.ref.source.span.start.line, column: node.ref.source.span.start.column, offset: node.ref.source.span.start.utf16Offset },\n end: { line: node.ref.source.span.end.line, column: node.ref.source.span.end.column, offset: node.ref.source.span.end.utf16Offset },\n } }),\n };\n}\n\nfunction sourceValue(value: SourceValueV2): unknown {\n if (value.kind === 'NULL' || value.kind === 'BOOLEAN' || value.kind === 'NUMBER' || value.kind === 'STRING') return value.value;\n if (value.kind === 'ARRAY') {\n const items: unknown[] = []; for (let index = 0; index < value.items.length; index += 1) { const item = value.items[index]; if (item) items.push(sourceValue(item)); }\n return items;\n }\n const output = Object.create(null) as DataRecord;\n for (const member of value.members) output[member.name] = sourceValue(member.value);\n return output;\n}\n\nfunction record(value: unknown): DataRecord {\n return value !== null && typeof value === 'object' && !Array.isArray(value) ? value as DataRecord : Object.create(null) as DataRecord;\n}\n\nfunction fieldsObject(fields: readonly SemanticFieldV2[]): DataRecord {\n const output = Object.create(null) as DataRecord;\n for (let index = 0; index < fields.length; index += 1) {\n const field = fields[index]; if (field) output[fieldName(field.pointer)] = semanticValue(field.value);\n }\n return output;\n}\n\nfunction semanticValue(value: SemanticFieldV2['value']): unknown {\n if (!Array.isArray(value)) return value;\n if (value.length === 0) return [];\n const names: string[] = [];\n for (let index = 0; index < value.length; index += 1) { const field = value[index]; if (field) names.push(fieldName(field.pointer)); }\n if (names.every((name, index) => name === String(index))) {\n const items: unknown[] = []; for (let index = 0; index < value.length; index += 1) { const field = value[index]; if (field) items.push(semanticValue(field.value)); }\n return items;\n }\n const output = Object.create(null) as DataRecord;\n for (let index = 0; index < value.length; index += 1) { const field = value[index]; if (field) output[names[index] ?? String(index)] = semanticValue(field.value); }\n return output;\n}\n\nfunction fieldName(pointer: string): string {\n const segment = pointer.split('/').at(-1) ?? '';\n return segment.replaceAll('~1', '/').replaceAll('~0', '~');\n}\n", "import type { FindingConfidence, NormalizedWorkflowNode, ScanFinding, ScanSeverity } from './policy';\nimport { segmentExpressionIslands } from '../analyzers/expression/expression-islands';\nimport { classifyProviderToken } from '../analyzers/secrets/provider-token-registry';\nimport { classifyQuotedExpressionTokens } from '../secret-classifier';\n\nexport type SecretIndicator = {\n path: string;\n kind: string;\n indicator: 'sensitive_key' | 'sensitive_value';\n hasLiteralValue: boolean;\n};\n\n/** n8n runtime references, which make a surrounding literal a template rather than raw material. */\nconst RUNTIME_REFERENCE =\n /\\$(?:json|node|nodeVersion|env|credentials|secrets|vars|parameter|execution|workflow|item|items|thisItem|input|binary|now|today|prevNode|runIndex|position|jmespath|if|loop|max|min|randomInt|request|response|body|data|pageCount|itemIndex|self|evaluateExpression|getWorkflowStaticData)\\b/i;\n\ntype LiteralIslands = Readonly<{ literals: string[]; templated: boolean }>;\n\nconst PLACEHOLDER_PREFIXES = new Set([\n 'your', 'my', 'example', 'sample', 'placeholder', 'dummy', 'test', 'fake', 'changeme',\n 'todo', 'insert', 'replace', 'enter', 'add',\n]);\nconst PLACEHOLDER_WORDS = [\n ...PLACEHOLDER_PREFIXES, 'api', 'access', 'auth', 'secret', 'token', 'key', 'password', 'here', 'value',\n].sort((left, right) => right.length - left.length);\n\n/**\n * Splits a parameter value into the literal text it ships verbatim. n8n marks expression mode\n * with a leading `=` and evaluates `{{ \u2026 }}` islands at runtime, so both are stripped.\n */\nfunction literalIslands(value: string): LiteralIslands {\n const body = value.startsWith('=') ? value.slice(1) : value;\n const segments = segmentExpressionIslands(body);\n const literals = segments\n .filter((segment) => segment.kind === 'LITERAL' && segment.end > segment.start)\n .map((segment) => body.slice(segment.start, segment.end))\n .filter((island) => island.trim().length > 0);\n return { literals, templated: segments.some((segment) => segment.kind === 'EXPRESSION') };\n}\n\n/**\n * Public RFC 7235 authentication-scheme tokens. A scheme-only literal island is protocol text,\n * not credential material; any additional literal text keeps the fail-closed result.\n */\nconst AUTH_SCHEME_ONLY = /^(?:bearer|basic|digest|negotiate|hoba|mutual|token)$/i;\n\n/** Expressions and conventional placeholders are not literal secret material. */\nexport function isNonSecretLiteral(value: string): boolean {\n const candidate = value.trim();\n if (candidate.length === 0) return true;\n if (classifyProviderToken(candidate) !== undefined) return false;\n if (classifyQuotedExpressionTokens(candidate).length > 0) return false;\n const { literals } = literalIslands(candidate);\n // Only expression-mode text may hide a literal behind a runtime-reference token; an unmarked\n // value such as `mySecret $json` is still literal text this workflow ships.\n const expressionMode = candidate.startsWith('=');\n const raw = literals.filter((island) => !(expressionMode && RUNTIME_REFERENCE.test(island)));\n if (raw.length === 0) return true;\n const material = raw.filter((island) => !AUTH_SCHEME_ONLY.test(island.trim()));\n return material.every(isPlaceholderLiteral);\n}\n\n/** Conventional placeholder forms that never carry secret material. */\nfunction isPlaceholderLiteral(candidate: string): boolean {\n const trimmed = candidate.trim();\n if (trimmed.length === 0) return true;\n if (/^\\$?(json|node|env|credentials|secrets|vars|parameter)\\b/i.test(trimmed)) return true;\n if (/^[*x._-]+$/i.test(trimmed)) return true;\n if (/^<[^>]*>$/.test(trimmed) || /^\\[[^\\]]*\\]$/.test(trimmed)) return true;\n return isPlaceholderPhrase(trimmed.toLowerCase());\n}\n\n/** Match the small placeholder vocabulary in one forward pass without nested quantifiers. */\nfunction isPlaceholderPhrase(value: string): boolean {\n let offset = 0;\n let firstWord = true;\n\n while (offset < value.length) {\n if (!firstWord) {\n while (offset < value.length && isPlaceholderSeparator(value[offset])) offset += 1;\n if (offset === value.length) return false;\n }\n\n const word = PLACEHOLDER_WORDS.find((candidate) => value.startsWith(candidate, offset));\n if (!word || (firstWord && !PLACEHOLDER_PREFIXES.has(word))) return false;\n offset += word.length;\n firstWord = false;\n }\n\n return !firstWord;\n}\n\nfunction isPlaceholderSeparator(character: string | undefined): boolean {\n return character === '_' || character === '-' || (character !== undefined && /\\s/.test(character));\n}\n\nexport function nodeFinding(input: {\n policyId: string;\n title?: string;\n severity: ScanSeverity;\n node: NormalizedWorkflowNode;\n evidence: Record<string, unknown>;\n message: string;\n explanation?: string;\n whyItMatters?: string;\n possibleImpact?: string;\n remediation: string;\n remediationSteps?: string[];\n confidence?: FindingConfidence;\n}): ScanFinding {\n return {\n policyId: input.policyId,\n title: input.title ?? input.message,\n severity: input.severity,\n location: { nodeId: input.node.id, nodeName: input.node.name },\n evidence: input.evidence,\n message: input.message,\n explanation: input.explanation ?? input.message,\n whyItMatters: input.whyItMatters ?? 'This issue can change the trust boundary, data exposure, or operational behavior of the workflow.',\n possibleImpact: input.possibleImpact ?? 'The workflow may be harder to review, monitor, or operate safely without additional controls.',\n remediation: input.remediation,\n remediationSteps: input.remediationSteps ?? [input.remediation],\n confidence: input.confidence ?? 'MEDIUM',\n };\n}\n\nexport function authorizationHeaderEvidence(value: unknown): { present: boolean; literal: boolean } {\n if (Array.isArray(value)) {\n return value.reduce<{ present: boolean; literal: boolean }>((result, child) => {\n const nested = authorizationHeaderEvidence(child);\n return { present: result.present || nested.present, literal: result.literal || nested.literal };\n }, { present: false, literal: false });\n }\n\n if (!isRecord(value)) return { present: false, literal: false };\n let present = false;\n let literal = false;\n const name = typeof value.name === 'string' ? value.name.trim().toLowerCase() : '';\n for (const [key, child] of Object.entries(value)) {\n if (key.trim().toLowerCase() === 'authorization') {\n present = true;\n if (typeof child === 'string' && !isNonSecretLiteral(child)) literal = true;\n }\n if (typeof child === 'string' && child.trim().toLowerCase() === 'authorization') present = true;\n const nested = authorizationHeaderEvidence(child);\n present = present || nested.present;\n literal = literal || nested.literal;\n }\n if (name === 'authorization') {\n present = true;\n for (const key of ['value', 'val', 'headerValue', 'content'] as const) {\n const paired = value[key];\n if (typeof paired === 'string' && !isNonSecretLiteral(paired)) literal = true;\n }\n }\n return { present, literal };\n}\n\nexport function collectUrls(value: unknown): URL[] {\n if (Array.isArray(value)) return value.flatMap(collectUrls);\n if (isRecord(value)) return Object.values(value).flatMap(collectUrls);\n if (typeof value !== 'string') return [];\n return literalIslands(value).literals.flatMap(parseHttpUrl);\n}\n\nfunction parseHttpUrl(value: string): URL[] {\n try {\n const url = new URL(value);\n return url.protocol === 'https:' || url.protocol === 'http:' ? [url] : [];\n } catch {\n return [];\n }\n}\n\n// The pinned n8n-nodes-base@2.15.1 Webhook description offers exactly these three\n// authenticated modes (plus `none`). `oauth2` is not an option in that version, so it\n// must not be treated as authenticated; the corrected probe and plan-owned sidecar use\n// this pinned enum.\n//\n// `validateWebhookAuthentication` (dist/nodes/Webhook/utils.js:205-289) compares the stored\n// value with strict equality, never trims or case-folds it, and has no final `else`, so an\n// unknown value fails open at runtime. Only an exact match may suppress WEBHOOK_EXPOSURE.\nconst AUTHENTICATED_WEBHOOK_METHODS: Readonly<Record<string, true>> = {\n basicAuth: true, headerAuth: true, jwtAuth: true,\n};\n\nexport function hasWebhookAuthentication(parameters: Record<string, unknown>): boolean {\n const authentication = parameters.authentication;\n return typeof authentication === 'string'\n && AUTHENTICATED_WEBHOOK_METHODS[authentication] === true;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n", "import type { ScanPolicy } from '../policy/policy';\nimport { collectUrls, nodeFinding } from '../policy/policy-helpers';\n\nexport function createUnapprovedDomainPolicy(approvedDomains: readonly string[]): ScanPolicy {\n const approved = new Set(approvedDomains.map((domain) => domain.toLowerCase()));\n\n return {\n id: 'UNAPPROVED_DOMAIN',\n name: 'Unapproved external domain',\n description: 'Flags external URLs outside the configured domain allowlist.',\n evaluate(workflow) {\n if (approved.size === 0) return [];\n\n return workflow.nodes.flatMap((node) =>\n uniqueDomains(node.parameters)\n .filter((domain) => !approved.has(domain))\n .map((domain) => nodeFinding({\n policyId: 'UNAPPROVED_DOMAIN',\n title: 'External domain is outside the approved allowlist',\n severity: 'MEDIUM',\n node,\n evidence: { domain },\n message: 'This workflow calls a domain outside the approved allowlist.',\n explanation:\n 'The node parameters contain a URL whose hostname is not present in the approved domain list supplied for this scan.',\n whyItMatters:\n 'Unexpected outbound domains can indicate data exfiltration, shadow integrations, or environment drift.',\n possibleImpact:\n 'Workflow data may be sent to an unreviewed third party or an endpoint that is not covered by enterprise controls.',\n remediation: 'Add the domain to the approved list or replace the external call.',\n remediationSteps: [\n 'Confirm the business owner and purpose for the external domain.',\n 'Add the domain to the approved list only after security and compliance review.',\n 'Replace the call if the destination is unnecessary or untrusted.',\n ],\n confidence: 'HIGH',\n })),\n );\n },\n };\n}\n\nfunction uniqueDomains(value: unknown): string[] {\n const domains = collectUrls(value).map((url) => url.hostname.toLowerCase());\n return domains.filter((domain, index) => domains.indexOf(domain) === index);\n}\n", "import { classifyProviderToken } from '../analyzers/secrets/provider-token-registry';\nimport { classifySecretValue } from '../secret-classifier';\nimport { isNonSecretLiteral } from '../policy/policy-helpers';\n\nexport type SecretIndicator = {\n path: string;\n kind: string;\n indicator: 'sensitive_key' | 'sensitive_value';\n hasLiteralValue: boolean;\n};\n\nexport function collectSecretIndicators(\n value: unknown,\n path = 'parameters',\n contextKey?: string,\n): SecretIndicator[] {\n if (Array.isArray(value)) {\n return value.flatMap((child, index) => collectSecretIndicators(child, `${path}[${index}]`, contextKey));\n }\n\n if (!isRecord(value)) {\n const classification = typeof value === 'string'\n ? classifyProviderToken(value) ?? classifySecretValue(value, contextKey)\n : undefined;\n return classification\n ? [{ path, kind: classification.kind, indicator: 'sensitive_value', hasLiteralValue: true }]\n : [];\n }\n\n return Object.entries(value).flatMap(([key, child]) => {\n const childPath = `${path}.${key}`;\n const keyKind = secretKindFromKey(key);\n const suppressed = typeof child === 'string' && isNonSecretLiteral(child);\n const nested = collectSecretIndicators(child, childPath, key);\n const valueAlreadyReported = nested.some(\n (indicator) => indicator.path === childPath && indicator.indicator === 'sensitive_value',\n );\n const keyFinding = keyKind && !suppressed && !valueAlreadyReported\n ? [{\n path: childPath,\n kind: keyKind,\n indicator: 'sensitive_key' as const,\n hasLiteralValue: typeof child === 'string' && child.trim().length > 0,\n }]\n : [];\n return [...keyFinding, ...nested];\n });\n}\n\n/**\n * n8n fields that name credential *plumbing* \u2014 which credential, or which credential type, a\n * node uses \u2014 rather than credential material, so a key named like one of them is not itself a\n * secret indicator. The comparison is a whole, case-insensitive key name, so a parameter key\n * that merely contains \"credential\" (for example `credentialName`) keeps being classified.\n *\n * - `credentials`: n8n's credential reference block (`INode.credentials`, typed\n * `INodeCredentials` = `{ [credentialType]: { id, name } }`; n8n `packages/workflow/src/interfaces.ts`).\n * Its value is a reference to the credential store, never the stored secret.\n * - `nodeCredentialType`: the credential *type* selector (the HTTP Request node's \"Predefined\n * Credential Type\" field), whose value is a credential type name such as `todoistApi` or\n * `openAiApi`.\n *\n * These keys are skipped only for the key-name signal: their children are still traversed, so a\n * literal secret nested inside a reference block is still reported as `sensitive_value`.\n */\nconst CREDENTIAL_PLUMBING_KEYS: Readonly<Record<string, true>> = {\n credentials: true,\n nodecredentialtype: true,\n};\n\nfunction secretKindFromKey(key: string): string | null {\n const normalized = key.toLowerCase();\n if (CREDENTIAL_PLUMBING_KEYS[normalized] === true) return null;\n if (normalized.includes('apikey') || normalized.includes('api_key') || normalized.includes('api-key')) return 'api key';\n if (normalized.includes('password') || normalized.includes('passwd')) return 'password';\n if (normalized.includes('token')) return 'token';\n if (normalized.includes('secret')) return 'secret';\n if (normalized.includes('credential')) return 'credential';\n if (normalized === 'authorization' || normalized === 'cookie') return normalized;\n return null;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n", "import type { ScanPolicy } from '../policy/policy';\nimport {\n authorizationHeaderEvidence,\n isNonSecretLiteral,\n nodeFinding,\n} from '../policy/policy-helpers';\nimport { collectSecretIndicators } from './secret-indicators';\n\nexport const rawSecretIndicatorPolicy: ScanPolicy = {\n id: 'RAW_SECRET_INDICATOR',\n name: 'Raw secret indicator',\n description: 'Flags workflow parameters that look like embedded secrets.',\n evaluate(workflow) {\n return workflow.nodes.flatMap((node) =>\n collectSecretIndicators(node.parameters).slice(0, 10).map((indicator) => nodeFinding({\n policyId: 'RAW_SECRET_INDICATOR',\n title:\n indicator.indicator === 'sensitive_value'\n ? 'Workflow parameters contain raw secret material'\n : 'Workflow parameter is named like a secret',\n severity:\n indicator.indicator === 'sensitive_value'\n ? 'HIGH'\n : indicator.hasLiteralValue\n ? 'MEDIUM'\n : 'LOW',\n node,\n evidence: {\n parameterPath: indicator.path,\n secretKind: indicator.kind,\n indicator: indicator.indicator,\n hasLiteralValue: indicator.hasLiteralValue,\n },\n message: 'This node contains a parameter that looks like a raw secret.',\n explanation:\n 'The scanner found a parameter key or value pattern commonly used for tokens, passwords, API keys, cookies, or credentials.',\n whyItMatters:\n 'Raw secrets in workflow JSON can be exposed through exports, scan history, logs, backups, or support bundles.',\n possibleImpact:\n 'An exposed token or password can allow unauthorized access to connected systems even if the workflow itself is not malicious.',\n remediation:\n 'Move the value into n8n credentials or an approved secret manager, then rotate any exposed secret.',\n remediationSteps: [\n 'Move the raw value into n8n credentials or an approved secret manager.',\n 'Rotate the secret if it has already been exported, shared, or stored in history.',\n 'Re-scan the workflow after replacing the raw value with a managed credential reference.',\n ],\n confidence: indicator.indicator === 'sensitive_key' ? 'MEDIUM' : 'HIGH',\n })),\n );\n },\n};\n\nexport const rawAuthorizationHeaderPolicy: ScanPolicy = {\n id: 'RAW_AUTH_HEADER',\n name: 'Raw Authorization header',\n description: 'Flags manually configured Authorization headers.',\n evaluate(workflow) {\n return workflow.nodes\n .map((node) => ({ node, evidence: authorizationHeaderEvidence(node.parameters) }))\n .filter((candidate) => candidate.evidence.present)\n .map(({ node, evidence }) => nodeFinding({\n policyId: 'RAW_AUTH_HEADER',\n title: evidence.literal\n ? 'Raw Authorization header may expose credentials'\n : 'Authorization header is set from an expression',\n severity: evidence.literal ? 'HIGH' : 'INFO',\n node,\n evidence: { header: 'Authorization', literalValue: evidence.literal },\n message: 'This node configures a raw Authorization header.',\n explanation:\n 'The workflow parameters appear to define an Authorization header directly instead of using managed n8n credentials.',\n whyItMatters:\n 'Raw credential material in node parameters is easier to copy, persist, log, or expose in exported workflow JSON.',\n possibleImpact:\n 'API keys or bearer tokens can be leaked through workflow exports, scan history, logs, or support bundles.',\n remediation: 'Use n8n credentials or a managed secret reference instead of raw headers.',\n remediationSteps: [\n 'Move the secret into n8n credentials or an approved secret manager.',\n 'Rotate any token that has already been stored in raw workflow JSON.',\n 'Re-scan after replacing the raw header with a managed credential reference.',\n ],\n confidence: 'MEDIUM',\n }));\n },\n};\n\nexport { isNonSecretLiteral };\n", "import type { ScanPolicy } from '../policy/policy';\nimport { nodeFinding } from '../policy/policy-helpers';\n\nexport const executeCommandPolicy: ScanPolicy = {\n id: 'N8N_EXECUTE_COMMAND',\n name: 'Execute Command node',\n description: 'Flags shell command execution from n8n workflows.',\n evaluate(workflow) {\n return workflow.nodes\n .filter((node) => node.type === 'n8n-nodes-base.executeCommand')\n .map((node) => nodeFinding({\n policyId: 'N8N_EXECUTE_COMMAND',\n title: 'Execute Command node can run shell commands',\n severity: 'CRITICAL',\n node,\n evidence: { nodeType: node.type },\n message: 'This workflow can execute shell commands.',\n explanation:\n 'The Execute Command node allows the workflow to launch shell commands from the n8n runtime environment.',\n whyItMatters:\n 'Shell command access can cross from workflow automation into the host or worker environment that runs n8n.',\n possibleImpact:\n 'A malicious or compromised workflow path could lead to command execution, file access, lateral movement, or service disruption.',\n remediation: 'Remove the Execute Command node or isolate it behind strict approval.',\n remediationSteps: [\n 'Remove the Execute Command node when shell access is not explicitly required.',\n 'Replace shell logic with a narrow, reviewed integration or managed service call.',\n 'If it must remain, isolate the workflow runner and require manual approval before execution.',\n ],\n confidence: 'HIGH',\n }));\n },\n};\n\nconst codeNodeTypes = new Set([\n 'n8n-nodes-base.code',\n 'n8n-nodes-base.function',\n 'n8n-nodes-base.functionItem',\n '@n8n/n8n-nodes-langchain.code',\n '@n8n/n8n-nodes-langchain.toolCode',\n]);\n\nexport const codeNodePolicy: ScanPolicy = {\n id: 'N8N_CODE_NODE',\n name: 'Code node',\n description: 'Flags JavaScript, legacy Function, and LangChain code nodes.',\n evaluate(workflow) {\n return workflow.nodes\n .filter((node) => codeNodeTypes.has(node.type))\n .map((node) => nodeFinding({\n policyId: 'N8N_CODE_NODE',\n title: 'Custom code node requires security review',\n severity: 'LOW',\n node,\n evidence: { nodeType: node.type },\n message: 'This workflow contains custom script execution.',\n explanation:\n 'Code and legacy Function nodes can transform data with arbitrary JavaScript inside the workflow runtime.',\n whyItMatters:\n 'Custom code is harder to audit than declarative node configuration and may handle secrets or external data.',\n possibleImpact:\n 'Unsafe code can leak data, mishandle credentials, or create behavior that reviewers cannot understand from node settings alone.',\n remediation: 'Review the code path, remove unnecessary scripting, and require approval.',\n remediationSteps: [\n 'Review the node source code for secret access, outbound requests, and unsafe parsing.',\n 'Move repeatable logic into a reviewed service or reusable library when possible.',\n 'Require approval for changes to custom code nodes in production workflows.',\n ],\n confidence: 'HIGH',\n }));\n },\n};\n", "import type { ScanPolicy } from '../policy/policy';\nimport { hasWebhookAuthentication, nodeFinding } from '../policy/policy-helpers';\n\nconst officialNodeNamespaces = ['n8n-nodes-base.', '@n8n/'];\n\nexport const unknownNodePackagePolicy: ScanPolicy = {\n id: 'UNKNOWN_NODE_PACKAGE',\n name: 'Unknown node package',\n description: 'Flags nodes that do not come from an official n8n package namespace.',\n evaluate(workflow) {\n const seen = new Set<string>();\n return workflow.nodes\n .filter((node) => !officialNodeNamespaces.some((namespace) => node.type.startsWith(namespace)))\n .filter((node) => {\n const packageName = node.type.split('.')[0] ?? node.type;\n if (seen.has(packageName)) return false;\n seen.add(packageName);\n return true;\n })\n .map((node) => nodeFinding({\n policyId: 'UNKNOWN_NODE_PACKAGE',\n title: 'Node package is not from an official n8n namespace',\n severity: 'LOW',\n node,\n evidence: { nodeType: node.type, nodePackage: node.type.split('.')[0] ?? node.type },\n message: 'This workflow uses a community or custom node package.',\n explanation:\n 'The node type does not start with an official n8n package namespace, so it comes from a community or custom package.',\n whyItMatters:\n 'Community and custom packages can add supply-chain, maintenance, and permission risks that differ from core nodes.',\n possibleImpact:\n 'A vulnerable or unmaintained package could process sensitive workflow data or run unexpected code.',\n remediation: 'Review the package source, version, permissions, and maintenance status.',\n remediationSteps: [\n 'Verify the package source, maintainer, and version history.',\n 'Check whether the node requires credentials or broad runtime permissions.',\n 'Pin approved versions and remove packages that are not actively maintained.',\n ],\n confidence: 'MEDIUM',\n }));\n },\n};\n\nexport const webhookExposurePolicy: ScanPolicy = {\n id: 'WEBHOOK_EXPOSURE',\n name: 'Webhook exposure',\n description: 'Flags webhook triggers without clear authentication markers.',\n evaluate(workflow) {\n return workflow.nodes\n .filter((node) => node.type === 'n8n-nodes-base.webhook')\n .filter((node) => !hasWebhookAuthentication(node.parameters))\n .map((node) => nodeFinding({\n policyId: 'WEBHOOK_EXPOSURE',\n title: 'Webhook trigger lacks clear authentication',\n severity: 'MEDIUM',\n node,\n evidence: { authentication: node.parameters.authentication ?? null },\n message: 'This webhook does not show a clear authentication marker.',\n explanation:\n 'The webhook node appears to accept inbound requests without an explicit authentication mode in the workflow parameters.',\n whyItMatters:\n 'Unauthenticated inbound endpoints can be abused for spam, data injection, or unexpected workflow execution.',\n possibleImpact:\n 'External callers may trigger automations, create records, or send data into connected systems without authorization.',\n remediation: 'Require webhook authentication or place the endpoint behind trusted controls.',\n remediationSteps: [\n 'Enable webhook authentication in n8n when the endpoint is not intentionally public.',\n 'Place the endpoint behind a gateway, allowlist, or rate limiter for production use.',\n 'Monitor webhook usage for unexpected request volume or payloads.',\n ],\n confidence: 'MEDIUM',\n }));\n },\n};\n", "import type { ScanPolicy } from '../policy/policy';\nimport { createUnapprovedDomainPolicy } from './domain-policy';\nimport { rawAuthorizationHeaderPolicy, rawSecretIndicatorPolicy } from './credential-policies';\nimport { codeNodePolicy, executeCommandPolicy } from './execution-policies';\nimport { unknownNodePackagePolicy, webhookExposurePolicy } from './package-and-webhook-policies';\n\nexport type BetaPolicyOptions = {\n approvedDomains?: readonly string[];\n};\n\nexport function createBetaDefaultPolicies(options: BetaPolicyOptions = {}): ScanPolicy[] {\n return [\n executeCommandPolicy,\n codeNodePolicy,\n rawAuthorizationHeaderPolicy,\n rawSecretIndicatorPolicy,\n createUnapprovedDomainPolicy(options.approvedDomains ?? []),\n unknownNodePackagePolicy,\n webhookExposurePolicy,\n ];\n}\n", "/** Locale-independent UTF-16 ordering for deterministic scanner output. */\nexport function compareCanonicalStrings(left: string, right: string): number {\n if (left === right) return 0;\n return left < right ? -1 : 1;\n}\n", "import type { NormalizedWorkflowNode } from './workflow';\nimport { compareCanonicalStrings } from './stable-order';\n\nexport type WorkflowComplexity = 'LOW' | 'MEDIUM' | 'HIGH';\n\nexport type WorkflowIntegration = {\n service: string;\n nodeTypes: string[];\n nodeCount: number;\n usage: string;\n riskNotes: string[];\n};\n\nconst serviceLabels: Record<string, string> = {\n code: 'Code',\n executeCommand: 'Execute Command',\n function: 'Function',\n functionItem: 'Function Item',\n httpRequest: 'HTTP Request',\n manualTrigger: 'Manual Trigger',\n scheduleTrigger: 'Schedule Trigger',\n slack: 'Slack',\n webhook: 'Webhook',\n};\n\nexport function summarizeIntegrations(nodes: NormalizedWorkflowNode[]): WorkflowIntegration[] {\n const byService = new Map<string, NormalizedWorkflowNode[]>();\n\n for (const node of nodes) {\n const service = serviceNameFromType(node.type);\n byService.set(service, [...(byService.get(service) ?? []), node]);\n }\n\n return [...byService.entries()]\n .map(([service, serviceNodes]) => ({\n service,\n nodeTypes: unique(serviceNodes.map((node) => node.type)),\n nodeCount: serviceNodes.length,\n usage: usageForService(service, serviceNodes),\n riskNotes: riskNotesForService(service, serviceNodes),\n }))\n .sort((left, right) => compareCanonicalStrings(left.service, right.service));\n}\n\nexport function classifyComplexity(\n nodeCount: number,\n connectionCount: number,\n integrationCount: number,\n): WorkflowComplexity {\n if (nodeCount >= 15 || connectionCount >= 20 || integrationCount >= 8) {\n return 'HIGH';\n }\n\n if (nodeCount >= 6 || connectionCount >= 8 || integrationCount >= 4) {\n return 'MEDIUM';\n }\n\n return 'LOW';\n}\n\nexport function complexityWeight(complexity: WorkflowComplexity): number {\n switch (complexity) {\n case 'HIGH':\n return 20;\n case 'MEDIUM':\n return 10;\n case 'LOW':\n return 0;\n }\n}\n\n/** Shared with app-only trigger prose so service labels cannot drift. */\nexport function serviceNameFromType(type: string): string {\n const compactType = compactNodeType(type);\n return serviceLabels[compactType] ?? titleCase(splitCamelCase(compactType));\n}\n\nfunction compactNodeType(type: string): string {\n const segments = type.split('.');\n return segments[segments.length - 1] ?? type;\n}\n\nfunction usageForService(service: string, nodes: NormalizedWorkflowNode[]): string {\n if (service === 'Webhook') return 'Receives external HTTP requests into the workflow.';\n if (service === 'HTTP Request') return 'Calls external HTTP APIs or internal web services.';\n if (service === 'Slack') return 'Sends or manages Slack workspace messages and notifications.';\n if (service === 'Execute Command') return 'Runs operating-system commands from a workflow node.';\n if (service === 'Code' || service === 'Function' || service === 'Function Item') {\n return 'Runs custom JavaScript logic inside the workflow.';\n }\n return `Uses ${nodes.length} ${service} node(s) in the workflow.`;\n}\n\nfunction riskNotesForService(service: string, nodes: NormalizedWorkflowNode[]): string[] {\n if (service === 'Execute Command') return ['Can run shell commands on the n8n host or worker environment.'];\n if (service === 'HTTP Request') return ['Can send workflow data to external URLs configured in node parameters.'];\n if (service === 'Webhook') return ['Can expose an inbound endpoint that may need authentication and rate limits.'];\n if (service === 'Code' || service === 'Function' || service === 'Function Item') {\n return ['Custom code should be reviewed for secret handling and data exfiltration.'];\n }\n return nodes.some((node) => !node.type.startsWith('n8n-nodes-base.'))\n ? ['This integration comes from a non-core or community package namespace.']\n : [];\n}\n\nfunction titleCase(value: string): string {\n return value\n .split(' ')\n .filter(Boolean)\n .map((word) => `${word.slice(0, 1).toUpperCase()}${word.slice(1)}`)\n .join(' ');\n}\n\nfunction splitCamelCase(value: string): string {\n return value.replace(/([a-z0-9])([A-Z])/g, '$1 $2');\n}\n\nfunction unique(values: string[]): string[] {\n return values.filter((value, index) => values.indexOf(value) === index);\n}\n", "import type { NormalizedWorkflow, NormalizedWorkflowNode } from './workflow';\nimport {\n classifyComplexity,\n serviceNameFromType,\n summarizeIntegrations,\n type WorkflowComplexity,\n type WorkflowIntegration,\n} from './workflow-insights';\n\nexport type WorkflowRiskGrade = 'LOW' | 'MEDIUM' | 'HIGH' | 'CRITICAL';\n\nexport type WorkflowOverview = {\n name: string | null;\n nodeCount: number;\n rawNodeCount: number;\n annotationNodeCount: number;\n triggerCount: number;\n actionCount: number;\n integrationCount: number;\n connectionCount: number;\n payloadBytes: number;\n complexity: WorkflowComplexity;\n isSubWorkflow: boolean;\n};\n\nexport type WorkflowFunctionSummary = {\n basicPurpose: string;\n triggerDescription: string;\n dataFlowSummary: string;\n businessCategory:\n | 'MANUAL_AUTOMATION'\n | 'WEBHOOK_API'\n | 'SCHEDULED_AUTOMATION'\n | 'DATA_SYNC'\n | 'NOTIFICATION'\n | 'CUSTOM_LOGIC'\n | 'GENERAL_AUTOMATION';\n confidence: 'LOW' | 'MEDIUM' | 'HIGH';\n};\n\nexport type WorkflowInsights = {\n workflow: WorkflowOverview;\n functionSummary: WorkflowFunctionSummary;\n integrations: WorkflowIntegration[];\n};\n\nexport type WorkflowRiskAssessment = {\n score: number;\n grade: WorkflowRiskGrade;\n topRisks: string[];\n dataExposure: string;\n complexityDrivers: string[];\n};\n\nconst triggerHints = ['trigger', 'webhook', 'cron', 'schedule', 'formtrigger', 'manualtrigger'];\n\n/** Builds the browser and CLI workflow description from the same pure contract. */\nexport function analyzeWorkflowInsights(workflow: NormalizedWorkflow): WorkflowInsights {\n const nodes = functionalNodes(workflow.nodes);\n const integrations = summarizeIntegrations(nodes);\n const triggerCount = nodes.filter(isTriggerNode).length;\n const nodeCount = nodes.length;\n const connectionCount = workflow.graph.edges.length;\n const overview: WorkflowOverview = {\n name: workflow.name ?? null,\n nodeCount,\n rawNodeCount: workflow.nodeCount,\n annotationNodeCount: workflow.nodeCount - nodeCount,\n triggerCount,\n actionCount: Math.max(nodeCount - triggerCount, 0),\n integrationCount: integrations.length,\n connectionCount,\n payloadBytes: workflow.payloadBytes,\n complexity: classifyComplexity(nodeCount, connectionCount, integrations.length),\n isSubWorkflow: isSubWorkflow(workflow.nodes),\n };\n\n return {\n workflow: overview,\n functionSummary: summarizeFunction(nodes, overview, integrations),\n integrations,\n };\n}\n\nfunction summarizeFunction(\n nodes: NormalizedWorkflowNode[],\n overview: WorkflowOverview,\n integrations: WorkflowIntegration[],\n): WorkflowFunctionSummary {\n const triggers = nodes.filter(isTriggerNode).map((node) => serviceNameFromType(node.type));\n const services = integrations\n .filter((integration) => !integration.service.toLowerCase().includes('trigger'))\n .slice(0, 3)\n .map((integration) => integration.service);\n const prefix = isWebhookWorkflow(nodes)\n ? 'Webhook-triggered workflow'\n : isScheduledWorkflow(nodes)\n ? 'Scheduled workflow'\n : overview.triggerCount > 0\n ? 'Manual workflow'\n : 'Workflow';\n\n return {\n basicPurpose: `${prefix} with ${overview.nodeCount} node(s) that ${services.length > 0 ? `uses ${formatList(services)}` : 'does not use a recognized external service'}.`,\n triggerDescription: triggers.length > 0\n ? `Triggered by ${formatList(unique(triggers))}.`\n : 'No explicit trigger node was detected.',\n dataFlowSummary: overview.connectionCount > 0\n ? `The workflow has ${overview.connectionCount} configured connection(s) linking ${overview.nodeCount} node(s).`\n : 'No explicit node-to-node connections were found in the workflow JSON.',\n businessCategory: categorizeWorkflow(nodes, integrations),\n confidence: overview.nodeCount > 1 ? 'MEDIUM' : 'LOW',\n };\n}\n\nfunction isTriggerNode(node: NormalizedWorkflowNode): boolean {\n return triggerHints.some((hint) => compactNodeType(node.type).toLowerCase().includes(hint));\n}\n\nfunction isWebhookWorkflow(nodes: NormalizedWorkflowNode[]): boolean {\n return nodes.some((node) => compactNodeType(node.type).toLowerCase().includes('webhook'));\n}\n\nfunction isScheduledWorkflow(nodes: NormalizedWorkflowNode[]): boolean {\n return nodes.some((node) => {\n const type = compactNodeType(node.type).toLowerCase();\n return type.includes('schedule') || type.includes('cron');\n });\n}\n\nfunction categorizeWorkflow(\n nodes: NormalizedWorkflowNode[],\n integrations: WorkflowIntegration[],\n): WorkflowFunctionSummary['businessCategory'] {\n if (isWebhookWorkflow(nodes)) return 'WEBHOOK_API';\n if (isScheduledWorkflow(nodes)) return 'SCHEDULED_AUTOMATION';\n if (integrations.some((integration) => integration.service === 'Slack')) return 'NOTIFICATION';\n if (integrations.some((integration) => integration.service === 'HTTP Request')) return 'DATA_SYNC';\n if (integrations.some((integration) => integration.service === 'Code')) return 'CUSTOM_LOGIC';\n if (nodes.some((node) => compactNodeType(node.type) === 'manualTrigger')) return 'MANUAL_AUTOMATION';\n return 'GENERAL_AUTOMATION';\n}\n\nfunction isSubWorkflow(nodes: NormalizedWorkflowNode[]): boolean {\n const triggers = nodes.filter(isTriggerLikeType);\n return triggers.length > 0 && triggers.every(\n (node) => compactNodeType(node.type).toLowerCase() === 'executeworkflowtrigger',\n );\n}\n\nfunction isTriggerLikeType(node: NormalizedWorkflowNode): boolean {\n return triggerHints.some((hint) => compactNodeType(node.type).toLowerCase().includes(hint));\n}\n\nfunction functionalNodes(nodes: NormalizedWorkflowNode[]): NormalizedWorkflowNode[] {\n return nodes.filter((node) => !['stickynote', 'noop'].includes(compactNodeType(node.type).toLowerCase()));\n}\n\nfunction compactNodeType(type: string): string {\n const segments = type.split('.');\n return segments[segments.length - 1] ?? type;\n}\n\nfunction formatList(values: string[]): string {\n if (values.length <= 1) return values[0] ?? '';\n if (values.length === 2) return `${values[0]} and ${values[1]}`;\n return `${values.slice(0, -1).join(', ')}, and ${values[values.length - 1]}`;\n}\n\nfunction unique(values: string[]): string[] {\n return values.filter((value, index) => values.indexOf(value) === index);\n}\n", "import type { DiagnosticAggregateEffectV2 } from '../diagnostics/registry';\n\n/**\n * The per-capability work record and the lattice that has to survive it.\n *\n * Every capability declared by a manifest reports `seen / analyzed / skipped / omitted`. Those\n * counters are the capability's own record of the work it did, so they are also the evidence a\n * completeness claim must be consistent with: a capability that records skipped or omitted units\n * has not done the work that a `COMPLETED` row would claim. This module is the single authority for\n * which count sets can describe a run and for what a count set permits a published outcome to say.\n */\nexport type CapabilityCountsV2 = Readonly<{ seen: number; analyzed: number; skipped: number; omitted: number }>;\n\n/** The capability outcome vocabulary a count set has to corroborate. */\nexport type CapabilityOutcomeStatusV2 = 'COMPLETED' | 'SKIPPED' | 'DEGRADED' | 'FAILED';\n\n/** The analysis status order `COMPLETE < DEGRADED < INDETERMINATE`. */\nexport type AnalysisStatusV2 = 'COMPLETE' | 'DEGRADED' | 'INDETERMINATE';\n\n/** Count sets no real run can produce, in the order the boundary reports them. */\nexport type CountInconsistencyV2 =\n | 'ELIGIBLE_UNITS_UNKNOWN'\n | 'UNSEEN_ANALYSIS'\n | 'UNACCOUNTED_SEEN'\n | 'UNRECORDED_OMISSION'\n | 'ZERO_ELIGIBLE_WORK';\n\n/**\n * Exact `total > sum(parts)` for non-negative safe integers. Subtracting one part at a time keeps\n * every intermediate an exact difference of safe integers, where summing first can round past 2^53.\n */\nfunction exceeds(total: number, parts: readonly [number, number, number]): boolean {\n let remaining = total;\n for (const part of parts) { if (remaining <= part) return false; remaining -= part; }\n return true;\n}\n\n/**\n * `analyzed` units were claimed as analyzed and `seen` units as observed. A capability cannot\n * analyze units it never accounted for, and it cannot leave observed units unaccounted for: the\n * unrecorded loss is exactly what would let a derived status read as complete.\n *\n * The counters are deliberately not required to partition `seen`. Analyzers count in their own\n * units \u2014 `javascript-security` reports one seen node as one analyzed source plus its recorded\n * omission \u2014 so only the two directions that cannot describe any run are refused.\n */\nexport function countInconsistency(counts: CapabilityCountsV2, eligibleUnits: number): CountInconsistencyV2 | null {\n if (!Number.isSafeInteger(eligibleUnits) || eligibleUnits < 0) return 'ELIGIBLE_UNITS_UNKNOWN';\n if (exceeds(counts.analyzed, [counts.seen, counts.skipped, counts.omitted])) return 'UNSEEN_ANALYSIS';\n if (exceeds(counts.seen, [counts.analyzed, counts.skipped, counts.omitted])) return 'UNACCOUNTED_SEEN';\n if (eligibleUnits > 0 && counts.seen === 0) return 'ZERO_ELIGIBLE_WORK';\n return null;\n}\n\n/**\n * A diagnostic that records its own truncation while the counters claim nothing was omitted is the\n * reachable form of silent truncation: the snapshot cannot be both truncated and complete.\n */\nexport function omissionInconsistency(counts: CapabilityCountsV2, diagnostics: readonly Readonly<{ omitted?: number }>[]): CountInconsistencyV2 | null {\n if (counts.omitted > 0) return null;\n for (const diagnostic of diagnostics) if ((diagnostic.omitted ?? 0) > 0) return 'UNRECORDED_OMISSION';\n return null;\n}\n\n/** `skipped` and `omitted` are the units a capability recorded but did not do. */\nexport function recordsUnperformedWork(counts: CapabilityCountsV2): boolean {\n return counts.skipped > 0 || counts.omitted > 0;\n}\n\n/**\n * `COMPLETED` is the one outcome a count set can be inconsistent with: a capability that recorded\n * unperformed work publishes the degraded outcome its counts corroborate. A weaker outcome is never\n * raised by counts, because counts record worked loss, not proof of work.\n */\nexport function corroboratedCapabilityStatus(status: CapabilityOutcomeStatusV2, counts: CapabilityCountsV2): CapabilityOutcomeStatusV2 {\n return status === 'COMPLETED' && recordsUnperformedWork(counts) ? 'DEGRADED' : status;\n}\n\n/**\n * The completeness effect a count set alone imposes. Skipped or omitted units are a bounded,\n * recorded gap in the work the capability was asked to do, so they degrade; an omission from a\n * required capability is unsafe truncation and is indeterminate.\n */\nexport function countLatticeEffect(counts: CapabilityCountsV2, required: boolean): DiagnosticAggregateEffectV2 {\n if (!recordsUnperformedWork(counts)) return 'NONE';\n return required && counts.omitted > 0 ? 'INDETERMINATE' : 'DEGRADED';\n}\n\n/**\n * The lattice order over analysis status. Nothing weaker than the evidence may be published, so a\n * claimed status can only ever be raised to the status the evidence derives; an unknown claim is\n * discarded in favour of the derived status rather than published.\n */\nexport function strongestAnalysisStatus(claimed: unknown, derived: AnalysisStatusV2): AnalysisStatusV2 {\n if (derived === 'INDETERMINATE' || claimed === 'INDETERMINATE') return 'INDETERMINATE';\n if (derived === 'DEGRADED' || claimed === 'DEGRADED') return 'DEGRADED';\n return 'COMPLETE';\n}\n", "import type { FindingConfidence, PolicyEffect, ScanSeverity } from './policy';\n\nexport type RuleCatalogEntry = {\n policyId: string;\n defaultSeverity: ScanSeverity;\n defaultConfidence: FindingConfidence;\n precision: 'HIGH' | 'MEDIUM' | 'LOW';\n policyEffect: PolicyEffect;\n curationAction: 'NONE' | 'REVIEW';\n serveAction: 'DISPLAY' | 'HIDE';\n /** CWE identifiers (`CWE-###`) this rule's finding maps to. See docs/scanner/policy-inventory.md\n * for the reviewed rationale behind each mapping, including the ones this catalog deliberately\n * narrows or rejects. Empty only for a policy ID listed in `RULES_WITHOUT_CWE`. */\n cweIds: readonly string[];\n /** OWASP Agentic Top 10 category names. Only the two agentic rules carry this; every other\n * rule leaves it undefined rather than an empty array, so \"not agentic\" and \"agentic with an\n * unresolved mapping\" stay distinguishable. */\n owaspAgenticIds?: readonly string[];\n};\n\n/**\n * Policy IDs with no CWE mapping, on purpose, not by omission. `UNAPPROVED_DOMAIN` was reviewed\n * against CWE-918 (SSRF) and that mapping was rejected: SSRF requires an attacker-influenced\n * destination, but this rule fires on any URL outside an allowlist, including one hardcoded by\n * the workflow's own author with no external input involved. CWE-918 is reserved for\n * `TAINTED_REQUEST_URL`, the rule with an actual tainted-destination claim. See the `[^domain]`\n * footnote in docs/scanner/policy-inventory.md for the full rationale.\n */\nexport const RULES_WITHOUT_CWE = ['UNAPPROVED_DOMAIN'] as const;\n\nconst betaRule = (\n policyId: string,\n defaultSeverity: ScanSeverity,\n defaultConfidence: FindingConfidence,\n precision: RuleCatalogEntry['precision'],\n cweIds: readonly string[],\n): RuleCatalogEntry => ({\n policyId,\n defaultSeverity,\n defaultConfidence,\n precision,\n policyEffect: 'LEGACY_SCORE',\n curationAction: 'NONE',\n serveAction: 'DISPLAY',\n cweIds,\n});\n\nexport const betaDefaultRuleCatalog: readonly RuleCatalogEntry[] = [\n betaRule('N8N_EXECUTE_COMMAND', 'CRITICAL', 'HIGH', 'HIGH', ['CWE-78']),\n betaRule('N8N_CODE_NODE', 'LOW', 'HIGH', 'HIGH', ['CWE-94']),\n // Literal Authorization values are a hardcoded credential (CWE-798); expression/credential-\n // driven values that still leaked as a raw header are an insufficiently protected transmission\n // (CWE-522). Both apply to this rule depending on evidence shape, so both are catalogued.\n betaRule('RAW_AUTH_HEADER', 'HIGH', 'MEDIUM', 'MEDIUM', ['CWE-798', 'CWE-522']),\n betaRule('RAW_SECRET_INDICATOR', 'HIGH', 'MEDIUM', 'MEDIUM', ['CWE-798']),\n betaRule('UNAPPROVED_DOMAIN', 'MEDIUM', 'HIGH', 'HIGH', []),\n betaRule('UNKNOWN_NODE_PACKAGE', 'LOW', 'MEDIUM', 'MEDIUM', ['CWE-1357']),\n betaRule('WEBHOOK_EXPOSURE', 'MEDIUM', 'MEDIUM', 'MEDIUM', ['CWE-306']),\n];\n\nconst reportOnlyRule = (\n policyId: string,\n defaultSeverity: ScanSeverity,\n defaultConfidence: FindingConfidence,\n precision: RuleCatalogEntry['precision'],\n cweIds: readonly string[],\n owaspAgenticIds?: readonly string[],\n): RuleCatalogEntry => ({\n policyId,\n defaultSeverity,\n defaultConfidence,\n precision,\n policyEffect: 'REPORT_ONLY',\n curationAction: 'REVIEW',\n serveAction: 'DISPLAY',\n cweIds,\n ...(owaspAgenticIds ? { owaspAgenticIds } : {}),\n});\n\nexport const TAINT_POLICY_IDS = [\n 'TAINTED_COMMAND',\n 'TAINTED_SQL_QUERY',\n 'TAINTED_REQUEST_URL',\n 'TAINTED_FILE_PATH',\n 'TAINTED_CODE_INPUT',\n 'TAINTED_REQUEST_HEADER',\n 'TAINTED_AI_PROMPT',\n 'AI_AGENT_UNGATED_TOOL',\n] as const;\n\nexport type TaintPolicyId = (typeof TAINT_POLICY_IDS)[number];\n\nexport const betaHardenedRuleCatalog: readonly RuleCatalogEntry[] = [\n ...betaDefaultRuleCatalog,\n // CWE-95 (\"Eval Injection\") precisely fits only this rule's EVAL/FUNCTION_CONSTRUCTOR\n // indicators; CHILD_PROCESS_* is closer to CWE-78 and FILESYSTEM_ACCESS to CWE-73. One CWE per\n // policy ID is a simplification of the eight indicators this rule reports under; see the\n // `[^js]`/`[^py]` footnotes in docs/scanner/policy-inventory.md.\n reportOnlyRule('JAVASCRIPT_DYNAMIC_EXECUTION', 'HIGH', 'HIGH', 'HIGH', ['CWE-95']),\n reportOnlyRule('PYTHON_DYNAMIC_EXECUTION', 'HIGH', 'MEDIUM', 'MEDIUM', ['CWE-95']),\n reportOnlyRule('TAINTED_COMMAND', 'CRITICAL', 'MEDIUM', 'MEDIUM', ['CWE-78']),\n reportOnlyRule('TAINTED_SQL_QUERY', 'HIGH', 'MEDIUM', 'MEDIUM', ['CWE-89']),\n reportOnlyRule('TAINTED_REQUEST_URL', 'HIGH', 'MEDIUM', 'MEDIUM', ['CWE-918']),\n reportOnlyRule('TAINTED_FILE_PATH', 'HIGH', 'MEDIUM', 'MEDIUM', ['CWE-22']),\n reportOnlyRule('TAINTED_CODE_INPUT', 'HIGH', 'MEDIUM', 'MEDIUM', ['CWE-94']),\n reportOnlyRule('TAINTED_REQUEST_HEADER', 'MEDIUM', 'MEDIUM', 'MEDIUM', ['CWE-113']),\n // No CWE is dedicated to LLM prompt injection; CWE-77 (\"Command Injection\") is the nearest\n // structural analogy (untrusted data reaching an interpreter that blends instructions and\n // data). OWASP Agentic's \"Prompt Injection\" is the precise, purpose-built taxonomy tag and\n // should be treated as primary; CWE-77 is a bridge for CWE-only tooling.\n reportOnlyRule('TAINTED_AI_PROMPT', 'MEDIUM', 'LOW', 'LOW', ['CWE-77'], ['Prompt Injection']),\n // CWE-269 (Improper Privilege Management) frames the agent as holding privilege it should not\n // autonomously exercise; the alternative CWE-862 (Missing Authorization) was reviewed and is\n // also defensible, but the OWASP Agentic \"Excessive Agency\" pairing does the precise work\n // either way, so CWE-269 is kept per docs/scanner/policy-inventory.md.\n reportOnlyRule('AI_AGENT_UNGATED_TOOL', 'MEDIUM', 'LOW', 'LOW', ['CWE-269'], ['Excessive Agency']),\n];\n", "import { sha256 } from '@noble/hashes/sha2.js';\nimport { bytesToHex } from '@noble/hashes/utils.js';\nimport { canonicalizeJson } from '../canonical-json';\nimport { SAFE_FACT_EVIDENCE_MAPPINGS_V2 } from '../facts/safe-fact-registry';\nimport type { AnalyzerContextV2, CapabilityCandidateV2 } from './scheduler';\n\nexport type ProfileCapabilityV2 = Readonly<{ id: string; version: string; required: boolean; dependsOn: readonly string[]; ruleIds: readonly string[] }>;\nexport type ProfileManifestV2 = Readonly<{ schemaVersion: 'scanner-profile-v2'; id: string; version: string; capabilities: readonly ProfileCapabilityV2[]; scoringPolicyVersion: string; digest: string }>;\nexport type ProfileRegistryEntryV2 = Readonly<ProfileCapabilityV2 & { run(context: AnalyzerContextV2): CapabilityCandidateV2 }>;\nexport type ProfileManifestInvalidReason = 'UNKNOWN_CAPABILITY' | 'DUPLICATE_CAPABILITY' | 'DUPLICATE_RULE_OWNER' | 'MISSING_RULE_OWNER' | 'UNKNOWN_RULE' | 'MISSING_DEPENDENCY' | 'FORWARD_DEPENDENCY' | 'DEPENDENCY_CYCLE' | 'MANIFEST_DIGEST_MISMATCH' | 'PROFILE_NOT_ADMITTED';\nexport type ProfileManifestValidationResult = Readonly<\n | { ok: true; manifest: ProfileManifestV2 }\n | { ok: false; code: 'PROFILE_MANIFEST_INVALID' | 'PROFILE_MANIFEST_NOT_ADMITTED'; reason: ProfileManifestInvalidReason }\n>;\n\nconst CAPABILITY_KEYS = ['id', 'version', 'required', 'dependsOn', 'ruleIds'] as const;\nconst MANIFEST_KEYS = ['schemaVersion', 'id', 'version', 'capabilities', 'scoringPolicyVersion', 'digest'] as const;\nconst RUN_KEYS = [...CAPABILITY_KEYS, 'run'] as const;\n/**\n * Rule ownership is a property of the rule, not a second declaration: the safe-fact evidence\n * registry (`SAFE_FACT_EVIDENCE_MAPPINGS_V2`) is the single owner authority behind the admitted\n * rule's `capabilityId`, so a capability's `ruleIds` is projected from it in registry order.\n * Nothing here may hand-declare an owner, claim a rule the registry does not know, or leave a\n * registry rule unowned.\n */\nconst KNOWN_RULE_IDS: ReadonlySet<string> = new Set(SAFE_FACT_EVIDENCE_MAPPINGS_V2.map(({ ruleId }) => ruleId));\nconst NO_RULES: readonly string[] = Object.freeze([]);\nconst RULE_IDS_BY_CAPABILITY: ReadonlyMap<string, readonly string[]> = (() => {\n const owned = new Map<string, string[]>();\n for (const { ruleId, ownerCapabilityId } of SAFE_FACT_EVIDENCE_MAPPINGS_V2) {\n const rules = owned.get(ownerCapabilityId);\n if (rules) rules.push(ruleId); else owned.set(ownerCapabilityId, [ruleId]);\n }\n return new Map([...owned].map(([capabilityId, rules]) => [capabilityId, Object.freeze(rules)] as const));\n})();\n\nconst SCORING_POLICY_VERSION = 'secureflow-risk-v2@2.0.0';\nconst MAX_CAPABILITIES = 32;\nconst MAX_LIST_ITEMS = 17;\nconst MAX_STRING_LENGTH = 128;\n\nfunction capability(id: string, required: boolean, dependsOn: readonly string[]): ProfileCapabilityV2 {\n return Object.freeze({ id, version: '2.0.0', required, dependsOn: Object.freeze([...dependsOn]), ruleIds: RULE_IDS_BY_CAPABILITY.get(id) ?? NO_RULES });\n}\nfunction buildManifest(id: string, capabilities: readonly ProfileCapabilityV2[]): ProfileManifestV2 {\n const body = { schemaVersion: 'scanner-profile-v2' as const, id, version: '2.0.0', capabilities: Object.freeze([...capabilities]), scoringPolicyVersion: SCORING_POLICY_VERSION };\n return Object.freeze({ ...body, digest: computeProfileManifestDigest(body) });\n}\n\nconst source = capability('source-normalization', true, []);\nconst insights = capability('workflow-insights', true, ['source-normalization']);\nconst structural = capability('structural-policies', true, ['source-normalization']);\nconst assessment = capability('assessment', true, ['workflow-insights', 'structural-policies']);\nconst presentation = capability('presentation-facts', true, ['assessment']);\n\nexport const BETA_DEFAULT_PROFILE_MANIFEST = buildManifest('beta-default', [source, insights, structural, assessment, presentation]);\nexport const BETA_HARDENED_PROFILE_MANIFEST = buildManifest('beta-hardened', [\n source, insights, structural, capability('expression-security', false, ['source-normalization']),\n capability('javascript-security', false, ['source-normalization']),\n capability('python-security', false, ['source-normalization']),\n capability('graph-semantics', false, ['source-normalization']),\n capability('taint-confidentiality', false, ['graph-semantics', 'expression-security', 'javascript-security', 'python-security']),\n capability('taint-integrity', false, ['graph-semantics', 'expression-security', 'javascript-security', 'python-security']),\n capability('agentic-control', false, ['graph-semantics', 'taint-confidentiality', 'taint-integrity']), assessment, presentation,\n]);\nexport const PROFILE_MANIFEST_REGISTRY_V2 = Object.freeze([BETA_DEFAULT_PROFILE_MANIFEST, BETA_HARDENED_PROFILE_MANIFEST]);\nexport const ADMITTED_PROFILE_MANIFESTS_V2 = Object.freeze([BETA_DEFAULT_PROFILE_MANIFEST]);\nexport const PROFILE_MANIFEST_REGISTRY = PROFILE_MANIFEST_REGISTRY_V2;\nexport const ADMITTED_PROFILE_REGISTRY_V2 = ADMITTED_PROFILE_MANIFESTS_V2;\nexport const BETA_DEFAULT_MANIFEST = BETA_DEFAULT_PROFILE_MANIFEST;\nexport const BETA_HARDENED_MANIFEST = BETA_HARDENED_PROFILE_MANIFEST;\n\nexport function computeProfileManifestDigest(manifest: Omit<ProfileManifestV2, 'digest'>): string {\n return bytesToHex(sha256(new TextEncoder().encode(canonicalizeJson(manifest))));\n}\n\nexport function isProfileAdmitted(candidate: unknown): boolean {\n try {\n const manifest = readManifest(candidate, true);\n const { digest, ...body } = manifest;\n return sameManifest(manifest, BETA_DEFAULT_PROFILE_MANIFEST) && computeProfileManifestDigest(body) === digest;\n } catch { return false; }\n}\n\nexport function validateProfileManifest(candidate: unknown, registry: ReadonlyMap<string, ProfileRegistryEntryV2>): ProfileManifestValidationResult {\n try {\n const manifest = readManifest(candidate, false);\n const expected = PROFILE_MANIFEST_REGISTRY_V2.find((item) => item.id === manifest.id && item.version === manifest.version);\n if (!expected) return invalid('UNKNOWN_CAPABILITY');\n const ids = new Set<string>();\n for (const item of manifest.capabilities) { if (ids.has(item.id)) return invalid('DUPLICATE_CAPABILITY'); ids.add(item.id); }\n const index = new Map(manifest.capabilities.map((item, position) => [item.id, position]));\n for (const item of manifest.capabilities) for (const dependency of item.dependsOn) {\n if (!ids.has(dependency)) return invalid('MISSING_DEPENDENCY');\n }\n if (hasCycle(manifest.capabilities)) return invalid('DEPENDENCY_CYCLE');\n for (const item of manifest.capabilities) if (item.dependsOn.some((dependency) => index.get(dependency)! >= index.get(item.id)!)) return invalid('FORWARD_DEPENDENCY');\n const owners = new Map<string, string>();\n for (const item of manifest.capabilities) for (const ruleId of item.ruleIds) {\n if (!KNOWN_RULE_IDS.has(ruleId)) return invalid('UNKNOWN_RULE');\n if (owners.has(ruleId)) return invalid('DUPLICATE_RULE_OWNER');\n owners.set(ruleId, item.id);\n }\n for (const item of manifest.capabilities) for (const ruleId of RULE_IDS_BY_CAPABILITY.get(item.id) ?? NO_RULES) {\n if (owners.get(ruleId) !== item.id) return invalid('MISSING_RULE_OWNER');\n }\n if (!sameCapabilities(manifest.capabilities, expected.capabilities)) return invalid('UNKNOWN_CAPABILITY');\n if (manifest.scoringPolicyVersion !== SCORING_POLICY_VERSION) return invalid('UNKNOWN_CAPABILITY');\n const { digest: _digest, ...body } = manifest;\n if (computeProfileManifestDigest(body) !== manifest.digest) return invalid('MANIFEST_DIGEST_MISMATCH');\n const normalized = freezeManifest(manifest);\n if (!isProfileAdmitted(normalized)) return Object.freeze({ ok: false, code: 'PROFILE_MANIFEST_NOT_ADMITTED', reason: 'PROFILE_NOT_ADMITTED' });\n for (const item of normalized.capabilities) {\n const spec = registryEntry(registry, item.id);\n if (!spec || !sameCapability(item, readCapability(spec, true, false))) return invalid('UNKNOWN_CAPABILITY');\n }\n return Object.freeze({ ok: true, manifest: normalized });\n } catch { return invalid('UNKNOWN_CAPABILITY'); }\n}\n\nfunction invalid(reason: ProfileManifestInvalidReason): ProfileManifestValidationResult { return Object.freeze({ ok: false, code: 'PROFILE_MANIFEST_INVALID', reason }); }\nfunction registryEntry(registry: ReadonlyMap<string, ProfileRegistryEntryV2>, id: string): ProfileRegistryEntryV2 | undefined {\n if (!(registry instanceof Map) || Object.getPrototypeOf(registry) !== Map.prototype) throw new TypeError();\n ownNames(registry, 0, 0);\n return Map.prototype.get.call(registry, id) as ProfileRegistryEntryV2 | undefined;\n}\nfunction readManifest(input: unknown, requireFrozen: boolean): ProfileManifestV2 {\n const value = record(input, MANIFEST_KEYS, requireFrozen); const capabilities = dense(value.capabilities, MAX_CAPABILITIES, requireFrozen).map((item) => readCapability(item, false, requireFrozen));\n if (value.schemaVersion !== 'scanner-profile-v2' || typeof value.id !== 'string' || typeof value.version !== 'string' || typeof value.scoringPolicyVersion !== 'string' || typeof value.digest !== 'string') throw new TypeError();\n return { schemaVersion: value.schemaVersion, id: value.id, version: value.version, capabilities, scoringPolicyVersion: value.scoringPolicyVersion, digest: value.digest };\n}\nfunction readCapability(input: unknown, withRunner: boolean, requireFrozen: boolean): ProfileCapabilityV2 {\n const value = record(input, withRunner ? RUN_KEYS : CAPABILITY_KEYS, requireFrozen); const id = boundedString(value.id); const version = boundedString(value.version);\n const dependsOn = stringList(value.dependsOn, requireFrozen); const ruleIds = stringList(value.ruleIds, requireFrozen);\n if (typeof value.required !== 'boolean' || withRunner && typeof value.run !== 'function') throw new TypeError();\n return { id, version, required: value.required, dependsOn, ruleIds };\n}\nfunction record(input: unknown, allowed: readonly string[], requireFrozen: boolean): Record<string, unknown> {\n if (input === null || typeof input !== 'object' || Array.isArray(input) || Object.getPrototypeOf(input) !== Object.prototype && Object.getPrototypeOf(input) !== null) throw new TypeError();\n if (requireFrozen && !Object.isFrozen(input)) throw new TypeError();\n const names = ownNames(input, allowed.length, 0);\n const result = Object.create(null) as Record<string, unknown>;\n for (const name of names) { if (!allowed.includes(name)) throw new TypeError(); const descriptor = Object.getOwnPropertyDescriptor(input, name); if (!descriptor || !('value' in descriptor)) throw new TypeError(); result[name] = descriptor.value; }\n for (const name of allowed) if (!Object.prototype.hasOwnProperty.call(result, name)) throw new TypeError();\n return result;\n}\nfunction dense(input: unknown, maximum: number, requireFrozen: boolean): unknown[] {\n if (!Array.isArray(input) || Object.getPrototypeOf(input) !== Array.prototype) throw new TypeError();\n if (requireFrozen && !Object.isFrozen(input)) throw new TypeError();\n const lengthDescriptor = Object.getOwnPropertyDescriptor(input, 'length');\n if (!lengthDescriptor || !('value' in lengthDescriptor) || !Number.isSafeInteger(lengthDescriptor.value) || lengthDescriptor.value < 0 || lengthDescriptor.value > maximum) throw new TypeError();\n const names = ownNames(input, lengthDescriptor.value + 1, 0); if (names.length !== lengthDescriptor.value + 1) throw new TypeError();\n const values: unknown[] = [];\n for (let index = 0; index < lengthDescriptor.value; index += 1) { const descriptor = Object.getOwnPropertyDescriptor(input, String(index)); if (!descriptor || !('value' in descriptor)) throw new TypeError(); values.push(descriptor.value); }\n for (const name of names) if (name !== 'length' && (!/^\\d+$/.test(name) || Number(name) >= lengthDescriptor.value)) throw new TypeError();\n return values;\n}\nfunction stringList(input: unknown, requireFrozen: boolean): readonly string[] {\n const values = dense(input, MAX_LIST_ITEMS, requireFrozen); return Object.freeze(values.map((value) => boundedString(value)));\n}\nfunction ownNames(input: object, maximum: number, maximumSymbols: number): readonly string[] {\n const names = Object.getOwnPropertyNames(input); if (names.length > maximum) throw new TypeError();\n if (Object.getOwnPropertySymbols(input).length > maximumSymbols) throw new TypeError(); return names;\n}\nfunction boundedString(value: unknown): string { if (typeof value !== 'string' || value.length === 0 || value.length > MAX_STRING_LENGTH) throw new TypeError(); return value; }\nfunction hasCycle(capabilities: readonly ProfileCapabilityV2[]): boolean {\n const indegree = new Map(capabilities.map((item) => [item.id, item.dependsOn.length])); const dependents = new Map(capabilities.map((item) => [item.id, [] as string[]]));\n for (const item of capabilities) for (const dependency of item.dependsOn) dependents.get(dependency)!.push(item.id);\n const queue = capabilities.filter((item) => indegree.get(item.id) === 0).map(({ id }) => id); let visited = 0;\n for (let cursor = 0; cursor < queue.length; cursor += 1) { const id = queue[cursor]; visited += 1; for (const dependent of dependents.get(id)!) { const next = indegree.get(dependent)! - 1; indegree.set(dependent, next); if (next === 0) queue.push(dependent); } }\n return visited !== capabilities.length;\n}\nfunction sameCapability(left: ProfileCapabilityV2, right: ProfileCapabilityV2): boolean { return left.id === right.id && left.version === right.version && left.required === right.required && sameList(left.dependsOn, right.dependsOn) && sameList(left.ruleIds, right.ruleIds); }\nfunction sameCapabilities(left: readonly ProfileCapabilityV2[], right: readonly ProfileCapabilityV2[]): boolean { return left.length === right.length && left.every((item, index) => sameCapability(item, right[index])); }\nfunction sameManifest(left: ProfileManifestV2, right: ProfileManifestV2): boolean { return left.schemaVersion === right.schemaVersion && left.id === right.id && left.version === right.version && left.scoringPolicyVersion === right.scoringPolicyVersion && left.digest === right.digest && sameCapabilities(left.capabilities, right.capabilities); }\nfunction sameList(left: readonly string[], right: readonly string[]): boolean { return left.length === right.length && left.every((item, index) => item === right[index]); }\nfunction freezeManifest(manifest: ProfileManifestV2): ProfileManifestV2 {\n const capabilities = Object.freeze(manifest.capabilities.map((item) => Object.freeze({ ...item, dependsOn: Object.freeze([...item.dependsOn]), ruleIds: Object.freeze([...item.ruleIds]) })));\n return Object.freeze({ ...manifest, capabilities });\n}\n", "import type { ScannerLimitsV2 } from '@hub/contracts';\nimport { sha256 } from '@noble/hashes/sha2.js';\nimport { bytesToHex } from '@noble/hashes/utils.js';\nimport { canonicalizeJson } from '../canonical-json';\nimport { createDiagnosticId } from '../diagnostics/identity';\nimport { DIAGNOSTIC_CODES_V2, classifyDiagnostic, type AnalysisDiagnosticV2 } from '../diagnostics/registry';\nimport { countInconsistency, omissionInconsistency } from './count-lattice';\nimport { createEdgeIdentityDigest, encodeIdentityTuple } from '../workflow-v2/node-edge-identity';\nimport type { EdgeRefV2 } from '../workflow-v2/security-workflow';\nimport { freezeData, readArrayItem, readArrayLength, readDenseArray, readPlainRecord, readSourceMemberRef, readSubject, type SafeFactValidationResultV2, validateSafeFact } from '../facts/safe-fact-validator';\nimport { createSafeFactAdmissionSnapshotV2, isScannerAdmissionSnapshotV2 } from '../admission/snapshot';\nimport { betaHardenedRuleCatalog } from '../policy/rule-catalog';\nimport { PROFILE_MANIFEST_REGISTRY_V2 } from './profile-manifest';\nimport { SAFE_FACT_AUTHORITY_DIGEST_V2, SAFE_FACT_EVIDENCE_MAPPINGS_V2, SAFE_FACT_REGISTRY_V2, type SafeFactEvidenceMappingV2, type SafeFactRegistryV2, type SafeFactSchemaV2, type SafePropertyTypeV2 } from '../facts/safe-fact-registry';\nimport type { AdmittedRuleV2, CapabilityCandidateV2, CapabilitySpecV2, FindingCandidateV2, SafeFactV2, SubjectV2, TraceV2 } from './scheduler';\n\ntype RuleRegistryV2 = ReadonlyMap<string, AdmittedRuleV2>;\ntype MutableCandidateCountersV2 = { seen: number; analyzed: number; skipped: number; omitted: number };\ntype CandidateCountersV2 = Readonly<MutableCandidateCountersV2>;\ntype CandidateLimitNumbersV2 = Readonly<{ observed: number; maximum: number }>;\ntype MutableDiagnosticCountersV2 = { observed?: number; maximum?: number; omitted?: number };\ntype SafeFactScalarV2 = string | number | boolean | null;\ntype SafeFactValueV2 = SafeFactScalarV2 | readonly SafeFactScalarV2[];\ntype EvidenceBudgetV2 = { bytes: number; counts: [number, number, number, number]; maximum: number };\nconst getOwnPropertyNames = Object.getOwnPropertyNames;\nconst getOwnPropertySymbols = Object.getOwnPropertySymbols;\nexport type CandidateRegistriesV2 = Readonly<{ facts: SafeFactRegistryV2; rules: RuleRegistryV2 }>;\nexport type CandidateRejectionReasonV2 = 'MALFORMED_CANDIDATE' | 'UNKNOWN_KEY' | 'DUPLICATE_ID' | 'DANGLING_REFERENCE' | 'UNKNOWN_RULE' | 'UNOWNED_RULE' | 'INVALID_COUNTER' | 'LIMIT_EXCEEDED' | 'FORBIDDEN_CONTENT' | 'UNSAFE_INPUT';\nexport type CapabilityCandidateValidationResultV2 = Readonly<{ ok: true; candidate: CapabilityCandidateV2 } | { ok: false; code: 'CAPABILITY_CANDIDATE_REJECTED'; reason: CandidateRejectionReasonV2; counters: Readonly<CandidateCountersV2>; limit?: CandidateLimitNumbersV2 }>;\ntype AuxiliaryRejectionReasonV2 = 'UNKNOWN_PROPERTY' | 'INVALID_PROPERTY' | 'INVALID_SUBJECT' | 'UNKNOWN_FACT_KIND' | 'REGISTRY_MISMATCH';\ntype Reason = CandidateRejectionReasonV2 | AuxiliaryRejectionReasonV2;\nfunction fail(reason: Reason): never { throw reason; }\n/**\n * A limit refusal that carries the numbers the scheduler publishes. The shared array readers throw\n * the bare reason, so the checks below re-read a collection's size before delegating and report the\n * refusal as `observed` (the real size that crossed, or the one item over a zero allowance) against\n * `maximum` (the bound that fired) \u2014 the numbers `readDiagnostics` here already demands of\n * capability-emitted LIMIT diagnostics, and previously missing from the validator's own refusals.\n */\nclass CandidateLimitExceededV2 extends TypeError {\n readonly observed: number;\n readonly maximum: number;\n constructor(observed: number, maximum: number) { super('Limit exceeded'); this.observed = observed; this.maximum = maximum; }\n}\nfunction limitExceeded(observed: number, maximum: number): never { throw new CandidateLimitExceededV2(observed > Number.MAX_SAFE_INTEGER ? Number.MAX_SAFE_INTEGER : observed, maximum); }\n/** The length a shared array reader compares, read for the refusal's numbers only. */\nfunction observedArrayLength(input: unknown): number | undefined {\n if (!Array.isArray(input) || Object.getPrototypeOf(input) !== Array.prototype) return undefined;\n const descriptor = Object.getOwnPropertyDescriptor(input, 'length');\n return descriptor !== undefined && 'value' in descriptor && Number.isSafeInteger(descriptor.value) && descriptor.value >= 0 ? descriptor.value : undefined;\n}\nfunction readBoundedLength(input: unknown, maximum: number, dense = true): number {\n const observed = observedArrayLength(input);\n if (observed !== undefined && observed > maximum) limitExceeded(observed, maximum);\n return readArrayLength(input, maximum, dense);\n}\nfunction readBoundedArray(input: unknown, maximum: number): unknown[] {\n const observed = observedArrayLength(input);\n if (observed !== undefined && observed > maximum) limitExceeded(observed, maximum);\n return readDenseArray(input, maximum);\n}\nconst knownReasons: Readonly<Record<string, true>> = { MALFORMED_CANDIDATE: true, UNKNOWN_KEY: true, DUPLICATE_ID: true, DANGLING_REFERENCE: true, UNKNOWN_RULE: true, UNOWNED_RULE: true, INVALID_COUNTER: true, LIMIT_EXCEEDED: true, FORBIDDEN_CONTENT: true, UNSAFE_INPUT: true };\nconst auxiliaryReasons: readonly AuxiliaryRejectionReasonV2[] = ['UNKNOWN_PROPERTY', 'INVALID_PROPERTY', 'INVALID_SUBJECT', 'UNKNOWN_FACT_KIND', 'REGISTRY_MISMATCH'];\nconst isReason = (value: string): value is Reason => knownReasons[value] === true || auxiliaryReasons.some((reason) => reason === value);\nconst has = (value: Readonly<Record<string, unknown>>, key: string): boolean => Object.prototype.hasOwnProperty.call(value, key);\nconst keys = ['findings', 'diagnostics', 'facts', 'traces', 'seen', 'analyzed', 'skipped', 'omitted'] as const;\nconst text = (value: unknown, maximum = 4_096): string => { if (typeof value !== 'string') return fail('MALFORMED_CANDIDATE'); let bytes = 0; for (let index = 0; index < value.length; index += 1) { const code = value.charCodeAt(index); if (code === 0) return fail('FORBIDDEN_CONTENT'); if (code >= 0xd800 && code <= 0xdbff) { if (index + 1 >= value.length || value.charCodeAt(index + 1) < 0xdc00 || value.charCodeAt(index + 1) > 0xdfff) return fail('FORBIDDEN_CONTENT'); bytes += 4; index += 1; } else if (code >= 0xdc00 && code <= 0xdfff) return fail('FORBIDDEN_CONTENT'); else bytes += code <= 0x7f ? 1 : code <= 0x7ff ? 2 : 3; if (bytes > maximum) return fail('FORBIDDEN_CONTENT'); } return value; };\nconst absolutePath = (value: string): boolean => value.startsWith('/') || value.startsWith('\\\\') || value.startsWith('~/') || /^(?:\\.\\.[\\\\/]|[A-Za-z]:[\\\\/])/.test(value) || /(?:^|[\\\\/])\\.\\.(?:[\\\\/]|$)/.test(value);\nconst sourceLike = (value: string): boolean => /[=;{}[\\]`\\\\]/.test(value) || /\\b(?:require|import|export|const|let|var|function)\\b/.test(value) || /\\(\\s*[\"']/.test(value) || /^\\\\\\\\/.test(value);\nconst secretLike = /(?:\\b(?:api[ _-]*key|password|secret|credential|authorization|cookie|bearer(?:[ _-]+token)?|basic[ _-]+auth|access[ _-]*(?:key|token)|token)\\s*[:=]\\s*[^\\s,;]+|\\b(?:sk|gh[pousr]|xox[baprs])[-_][A-Za-z0-9_-]{8,}|\\beyJ[A-Za-z0-9_-]{12,}\\.[A-Za-z0-9_-]{8,})/i;\nfunction validateSubjectContent(subject: SubjectV2): void { const walk = (value: unknown, key = ''): void => { if (typeof value === 'string') { if (!['kind', 'resolution', 'astNodeId', 'pointer'].includes(key) && (absolutePath(value) || sourceLike(value) || secretLike.test(value))) fail('FORBIDDEN_CONTENT'); return; } if (Array.isArray(value)) { value.forEach((item) => walk(item, key)); return; } if (value !== null && typeof value === 'object') for (const name of Object.keys(value)) walk((value as Record<string, unknown>)[name], name); }; walk(subject); }\nfunction fieldText(value: unknown, field: string, maximum = 4_096): string { const result = text(value, maximum); if (secretLike.test(result)) return fail('FORBIDDEN_CONTENT'); if (field === 'member' && !/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(result)) return fail('FORBIDDEN_CONTENT'); if (field === 'header' && result !== '' && !/^[!#$%&'*+\\-.^_`|~0-9A-Za-z]+$/.test(result)) return fail('FORBIDDEN_CONTENT'); if (field === 'authentication' && !/^[A-Za-z0-9_.:-]*$/.test(result)) return fail('FORBIDDEN_CONTENT'); if (['member', 'sourceNodeName', 'nodeType', 'nodePackage', 'service'].includes(field) && absolutePath(result)) return fail('FORBIDDEN_CONTENT'); return result; }\nconst id = (value: unknown): string => { const result = text(value, 64); if (!/^[0-9a-f]{64}$/.test(result)) fail('MALFORMED_CANDIDATE'); return result; };\nconst integer = (value: unknown): number => { if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < 0) return fail('INVALID_COUNTER'); return value; };\nconst compare = (left: string, right: string): number => { const a = Array.from(left, (c) => c.codePointAt(0)!); const b = Array.from(right, (c) => c.codePointAt(0)!); for (let i = 0; i < Math.min(a.length, b.length); i += 1) if (a[i] !== b[i]) return a[i] - b[i]; return a.length - b.length; };\nconst digest = (parts: readonly string[]): string => bytesToHex(sha256(new TextEncoder().encode(encodeIdentityTuple(parts))));\nconst enums = { evidenceClass: ['CAPABILITY', 'CONFIGURATION', 'SUSPICIOUS_SYNTAX', 'POTENTIAL_DATAFLOW', 'VERSION_APPLICABILITY'], conclusion: ['OBSERVED', 'POTENTIAL', 'UNKNOWN'], applicability: ['APPLICABLE', 'NOT_APPLICABLE', 'UNKNOWN'], trace: ['CONFIDENTIALITY', 'INTEGRITY', 'CONTROL'], step: ['SOURCE', 'PROPAGATION', 'SANITIZER', 'SINK'] } as const;\nfunction enumValue<T extends string>(value: unknown, values: readonly T[]): T { const candidate = text(value); const match = values.find((item) => item === candidate); if (match !== undefined) return match; return fail('MALFORMED_CANDIDATE'); }\nfunction rejected(reason: Reason, counters: CandidateCountersV2, limit?: CandidateLimitNumbersV2): CapabilityCandidateValidationResultV2 {\n let normalized: CandidateRejectionReasonV2;\n switch (reason) {\n case 'UNKNOWN_PROPERTY': normalized = 'UNKNOWN_KEY'; break;\n case 'INVALID_PROPERTY':\n case 'INVALID_SUBJECT':\n case 'UNKNOWN_FACT_KIND':\n case 'REGISTRY_MISMATCH': normalized = 'MALFORMED_CANDIDATE'; break;\n default: normalized = reason;\n }\n return Object.freeze({ ok: false as const, code: 'CAPABILITY_CANDIDATE_REJECTED' as const, reason: normalized, counters: Object.freeze({ ...counters }), ...(limit === undefined ? {} : { limit: Object.freeze({ observed: limit.observed, maximum: limit.maximum }) }) });\n}\nfunction counters(value: Record<string, unknown>): MutableCandidateCountersV2 { for (const key of ['seen', 'analyzed', 'skipped', 'omitted']) if (typeof value[key] === 'string') text(value[key]); return { seen: integer(value.seen), analyzed: integer(value.analyzed), skipped: integer(value.skipped), omitted: integer(value.omitted) }; }\nfunction ownRecord(input: unknown, allowed: readonly string[], unknownReason: Reason, required = allowed): Record<string, unknown> { void unknownReason; return readPlainRecord(input, allowed, required, true); } function candidateRecord(input: unknown): Record<string, unknown> { if (input === null || typeof input !== 'object') return fail('UNSAFE_INPUT'); const value: Record<string, unknown> = {}; for (const key of keys) { const descriptor = Object.getOwnPropertyDescriptor(input, key); if (!descriptor || !('value' in descriptor)) return fail('UNSAFE_INPUT'); value[key] = descriptor.value; } return value; }\nfunction capabilityRecord(input: unknown): Record<string, unknown> { return ownRecord(input, ['id', 'version', 'required', 'dependsOn', 'ruleIds', 'run'], 'MALFORMED_CANDIDATE'); }\nconst capabilityAuthorities = PROFILE_MANIFEST_REGISTRY_V2.flatMap((profile) => profile.capabilities);\nconst sameList = (left: readonly string[], right: readonly string[]): boolean => left.length === right.length && left.every((item, index) => item === right[index]);\nfunction capabilityView(input: CapabilitySpecV2, limits: ScannerLimitsV2): { id: string; version: string; required: boolean; dependsOn: readonly string[]; ruleIds: ReadonlySet<string> } { const value = capabilityRecord(input); const capabilityId = text(value.id); const version = text(value.version); const required = value.required; const run = value.run; if (typeof required !== 'boolean' || typeof run !== 'function') return fail('MALFORMED_CANDIDATE'); const dependencies = readBoundedArray(value.dependsOn, limits.maxMembersAndElements).map((item) => text(item)); const ruleValues = readBoundedArray(value.ruleIds, limits.maxMembersAndElements).map((item) => text(item)); const authority = capabilityAuthorities.find((item) => item.id === capabilityId && item.version === version && item.required === required && sameList(dependencies, item.dependsOn) && sameList(ruleValues, item.ruleIds)); if (!authority) return fail('MALFORMED_CANDIDATE'); const ruleIds = new Set(ruleValues); return { id: capabilityId, version, required, dependsOn: Object.freeze(dependencies), ruleIds }; }\nconst propertyTypes = ['STRING', 'INTEGER', 'BOOLEAN', 'NULLABLE_STRING', 'STRING_LIST', 'INTEGER_LIST'] as const;\nconst sensitivities = ['PUBLIC_METADATA', 'REDACTED_SECURITY'] as const;\nfunction schemaProperties(input: unknown, expected: SafeFactSchemaV2): Readonly<Record<string, SafePropertyTypeV2>> { const value = ownRecord(input, Object.keys(expected.properties), 'MALFORMED_CANDIDATE'); const properties: Record<string, SafePropertyTypeV2> = {}; for (const key of Object.keys(expected.properties)) properties[key] = enumValue(value[key], propertyTypes); return Object.freeze(properties); }\nfunction snapshotRegistry(input: unknown): readonly SafeFactSchemaV2[] { const value = ownRecord(input, ['schemaVersion', 'version', 'schemas', 'digest'], 'MALFORMED_CANDIDATE'); if (value.schemaVersion !== 'scanner-safe-facts-v2' || value.version !== SAFE_FACT_REGISTRY_V2.version) return fail('MALFORMED_CANDIDATE'); const rawSchemas = readBoundedArray(value.schemas, SAFE_FACT_REGISTRY_V2.schemas.length); if (rawSchemas.length !== SAFE_FACT_REGISTRY_V2.schemas.length) return fail('MALFORMED_CANDIDATE'); const schemas = rawSchemas.map((raw) => { const schema = ownRecord(raw, ['kind', 'ownerCapabilityId', 'properties', 'maxStringBytes', 'maxItems', 'sensitivity'], 'MALFORMED_CANDIDATE'); const expected = SAFE_FACT_REGISTRY_V2.schemas.find((item) => item.kind === schema.kind); if (expected === undefined) return fail('MALFORMED_CANDIDATE'); const copy: SafeFactSchemaV2 = Object.freeze({ kind: text(schema.kind), ownerCapabilityId: text(schema.ownerCapabilityId), properties: schemaProperties(schema.properties, expected), maxStringBytes: integer(schema.maxStringBytes), maxItems: integer(schema.maxItems), sensitivity: enumValue(schema.sensitivity, sensitivities) }); if (canonicalizeJson(copy) !== canonicalizeJson(expected)) return fail('MALFORMED_CANDIDATE'); return expected; }); const body = { schemaVersion: 'scanner-safe-facts-v2' as const, version: text(value.version), schemas }; const expectedDigest = bytesToHex(sha256(new TextEncoder().encode(canonicalizeJson(body)))); if (id(value.digest) !== expectedDigest || id(value.digest) !== SAFE_FACT_REGISTRY_V2.digest) return fail('MALFORMED_CANDIDATE'); return Object.freeze(schemas); }\ntype RuleAuthorityV2 = Omit<AdmittedRuleV2, 'packDigest'>;\nconst ruleAuthorities = new Map(SAFE_FACT_EVIDENCE_MAPPINGS_V2.map((mapping) => { const catalog = betaHardenedRuleCatalog.find((entry) => entry.policyId === mapping.ruleId); if (!catalog) throw new TypeError('Incomplete rule authority'); return [mapping.ruleId, Object.freeze({ ruleId: mapping.ruleId, revision: '1', capabilityId: mapping.ownerCapabilityId, effect: mapping.ownerCapabilityId === 'structural-policies' ? 'SCORING' : 'REPORT_ONLY', severity: catalog.defaultSeverity, confidence: catalog.defaultConfidence, evidenceSchemaId: mapping.evidenceSchemaId, remediationId: 'r', cweIds: Object.freeze([...catalog.cweIds]), owaspAgenticIds: Object.freeze([...(catalog.owaspAgenticIds ?? [])]) }) as RuleAuthorityV2] as const; }));\nconst ruleAuthorityBody = Object.freeze([...ruleAuthorities.values()].sort((left, right) => left.ruleId < right.ruleId ? -1 : 1));\nexport const RULE_PACK_DIGEST_V2 = digest(['secureflow-rule-pack-v2', '2.0.0', SAFE_FACT_AUTHORITY_DIGEST_V2, canonicalizeJson(ruleAuthorityBody)]);\nfunction sameRule(left: RuleAuthorityV2, right: RuleAuthorityV2): boolean {\n return canonicalizeJson(left) === canonicalizeJson(right);\n}\nfunction normalizeRule(key: unknown, raw: unknown, limits: ScannerLimitsV2): AdmittedRuleV2 { if (typeof key !== 'string') return fail('UNSAFE_INPUT'); const expected = ruleAuthorities.get(key); if (!expected) return fail('MALFORMED_CANDIDATE'); const value = ownRecord(raw, ['ruleId', 'revision', 'capabilityId', 'effect', 'severity', 'confidence', 'evidenceSchemaId', 'remediationId', 'cweIds', 'owaspAgenticIds', 'packDigest'], 'MALFORMED_CANDIDATE'); const effect = enumValue(value.effect, ['SCORING', 'REPORT_ONLY']); const severity = enumValue(value.severity, ['CRITICAL', 'HIGH', 'MEDIUM', 'LOW', 'INFO']); const confidence = enumValue(value.confidence, ['HIGH', 'MEDIUM', 'LOW']); const list = (input: unknown): readonly string[] => Object.freeze(readBoundedArray(input, Math.min(4_096, limits.maxMembersAndElements)).map((item) => fieldText(item, 'registry'))); const actual: AdmittedRuleV2 = Object.freeze({ ruleId: fieldText(value.ruleId, 'ruleId'), revision: fieldText(value.revision, 'revision'), capabilityId: fieldText(value.capabilityId, 'capabilityId'), effect, severity, confidence, evidenceSchemaId: fieldText(value.evidenceSchemaId, 'evidenceSchemaId'), remediationId: fieldText(value.remediationId, 'remediationId'), cweIds: list(value.cweIds), owaspAgenticIds: list(value.owaspAgenticIds), packDigest: id(value.packDigest) }); const { packDigest, ...metadata } = actual; if (actual.ruleId !== key || packDigest !== RULE_PACK_DIGEST_V2 || !sameRule(metadata, expected)) return fail('MALFORMED_CANDIDATE'); return actual; }\nfunction ruleRegistry(input: unknown, limits: ScannerLimitsV2, required: ReadonlySet<string>): RuleRegistryV2 {\n try {\n if (input === null || typeof input !== 'object') return fail('UNSAFE_INPUT');\n const sizeDescriptor = Object.getOwnPropertyDescriptor(Map.prototype, 'size');\n if (!sizeDescriptor || typeof sizeDescriptor.get !== 'function') return fail('UNSAFE_INPUT');\n let size: unknown; try { size = sizeDescriptor.get.call(input); } catch { return fail('UNSAFE_INPUT'); }\n if (!Number.isSafeInteger(size) || (size as number) < 0) return fail('UNSAFE_INPUT');\n if ((size as number) > limits.maxRuleOperations) return limitExceeded(size as number, limits.maxRuleOperations);\n let ownNames: string[]; let ownSymbols: symbol[];\n try { ownNames = getOwnPropertyNames(input); ownSymbols = getOwnPropertySymbols(input); } catch { return fail('UNSAFE_INPUT'); }\n if (ownNames.length !== 0) return fail('UNKNOWN_KEY');\n if (ownSymbols.length !== 0) return fail('UNSAFE_INPUT');\n const snapshot = new Map<string, unknown>();\n const entries = Map.prototype.entries.call(input) as Iterator<[unknown, unknown]>;\n for (let index = 0; index < (size as number); index += 1) {\n const next = entries.next(); if (next.done) return fail('UNSAFE_INPUT'); const [key, raw] = next.value;\n if (typeof key !== 'string') return fail('UNSAFE_INPUT');\n snapshot.set(key, normalizeRule(key, raw, limits));\n }\n if (snapshot.size !== required.size || [...required].some((ruleId) => !snapshot.has(ruleId))) return fail('MALFORMED_CANDIDATE');\n return Object.freeze(snapshot) as RuleRegistryV2;\n } catch (error) {\n if (error instanceof CandidateLimitExceededV2) throw error;\n if (typeof error === 'string') throw error;\n return fail('UNSAFE_INPUT');\n }\n}\nfunction ruleEntry(registry: RuleRegistryV2, ruleId: string): AdmittedRuleV2 { const rule = Map.prototype.get.call(registry, ruleId); if (rule === undefined) return fail('UNKNOWN_RULE'); return rule; }\nfunction stringListContains(value: unknown, expected: string): boolean { if (!Array.isArray(value)) return false; for (const item of value) if (typeof item !== 'string') return false; return value.includes(expected); }\nfunction projection(capability: { id: string; dependsOn: readonly string[] }, schema: SafeFactSchemaV2, fact: SafeFactV2): boolean { if (schema.ownerCapabilityId === capability.id) return true; const depends = (id: string): boolean => capability.dependsOn.includes(id); if (capability.id === 'javascript-security') return depends('source-normalization') && schema.kind === 'code.indicator.v2' && schema.ownerCapabilityId === 'expression-security' && fact.properties.language === 'JAVASCRIPT'; if (capability.id === 'python-security') return depends('source-normalization') && schema.kind === 'code.indicator.v2' && schema.ownerCapabilityId === 'expression-security' && fact.properties.language === 'PYTHON'; if (capability.id === 'taint-integrity' || capability.id === 'taint-confidentiality') return depends('graph-semantics') && schema.kind === 'dataflow.summary.v2' && schema.ownerCapabilityId === 'graph-semantics' && fact.properties.flowKind === 'TAINT_SINK'; if (capability.id === 'agentic-control') return depends('graph-semantics') && ((schema.kind === 'node.capability.v2' && schema.ownerCapabilityId === 'structural-policies' && stringListContains(fact.properties.capabilities, 'AI_AGENT')) || (schema.kind === 'dataflow.summary.v2' && schema.ownerCapabilityId === 'graph-semantics' && fact.properties.flowKind === 'AGENT_INFLUENCE' && fact.properties.humanGatePresent === false && fact.properties.humanGateDominates === false)); return false; }\nfunction factLimit(kind: string, limits: ScannerLimitsV2): number { if (kind.startsWith('workflow.')) return 1; if (kind === 'advisory.applicability.v2') return 0; if (kind === 'integration.v1' || kind === 'node.capability.v2' || kind === 'ingress.v2') return limits.maxNodes; if (kind === 'node.configuration.v2') return Math.min(limits.maxMembersAndElements, limits.maxFindings); if (kind === 'destination.v2') return limits.maxMembersAndElements; return limits.maxFindings; }\nfunction refs(input: unknown, maximum: number): string[] { const values = readBoundedArray(input, maximum).map(id); const unique = new Set(values); if (unique.size !== values.length) fail('DUPLICATE_ID'); return values.sort(compare); }\nfunction candidateSubject(input: unknown, limits: ScannerLimitsV2): SubjectV2 { const value = readPlainRecord(input, ['kind', 'node', 'edge', 'source'], [], true); if (value.kind !== 'EDGE') return readSubject(input, limits); if (has(value, 'node') || has(value, 'source')) fail('UNKNOWN_PROPERTY'); const raw = readPlainRecord(value.edge, ['ordinal', 'sourceNode', 'targetNode', 'sourceLabel', 'targetLabel', 'connectionType', 'sourcePort', 'targetPort', 'source', 'resolution'], ['ordinal', 'sourceLabel', 'connectionType', 'sourcePort', 'targetPort', 'source', 'resolution'], true); const ordinal = integer(raw.ordinal); if (ordinal >= limits.maxEdges) limitExceeded(ordinal + 1, limits.maxEdges); const node = (nodeInput: unknown): EdgeRefV2['sourceNode'] => { const subject = readSubject({ kind: 'NODE', node: nodeInput }, limits); if (subject.kind !== 'NODE') return fail('INVALID_SUBJECT'); return subject.node; }; const edge: EdgeRefV2 = { ordinal, sourceLabel: text(raw.sourceLabel), connectionType: text(raw.connectionType), sourcePort: integer(raw.sourcePort), targetPort: integer(raw.targetPort), source: readSourceMemberRef(raw.source, limits), resolution: enumValue(raw.resolution, ['RESOLVED', 'AMBIGUOUS', 'UNRESOLVED']) }; if (has(raw, 'sourceNode')) edge.sourceNode = node(raw.sourceNode); if (has(raw, 'targetNode')) edge.targetNode = node(raw.targetNode); if (has(raw, 'targetLabel')) edge.targetLabel = text(raw.targetLabel); return { kind: 'EDGE', edge }; }\nfunction subjectKey(subject: SubjectV2): string { if (subject.kind === 'WORKFLOW') return 'WORKFLOW'; if (subject.kind === 'SOURCE') return `SOURCE${subject.source.astNodeId}`; if (subject.kind === 'NODE') return `NODE${subject.node.identityDigest}`; return `EDGE${createEdgeIdentityDigest(subject.edge)}`; } function schemaFor(schemas: readonly SafeFactSchemaV2[], kind: string): SafeFactSchemaV2 { const schema = schemas.find((item) => item.kind === kind); if (schema === undefined) return fail('MALFORMED_CANDIDATE'); return schema; }\nfunction typedFact(raw: unknown, schema: SafeFactSchemaV2, limits: ScannerLimitsV2): SafeFactV2 { const value = ownRecord(raw, ['factId', 'kind', 'subject', 'properties'], 'MALFORMED_CANDIDATE'); const source = readPlainRecord(value.properties, Object.keys(schema.properties), [], true); const properties: Record<string, SafeFactValueV2> = {}; for (const key of Object.keys(source)) { const item = source[key]; if (item === null || typeof item === 'string' || typeof item === 'number' || typeof item === 'boolean') properties[key] = item; else if (Array.isArray(item)) properties[key] = Object.freeze(readBoundedArray(item, limits.maxMembersAndElements).map((scalar) => { if (scalar === null || typeof scalar === 'string' || typeof scalar === 'number' || typeof scalar === 'boolean') return scalar; return fail('UNSAFE_INPUT'); })); else fail('UNSAFE_INPUT'); } return { factId: text(value.factId), kind: text(value.kind), subject: readSubject(value.subject, limits), properties: Object.freeze(properties) }; }\n/**\n * A refusal the shared safe-fact validator produced reports the bare reason: its result type\n * carries no numbers, and the bound it refused against is the schema-property bound\n * `facts/safe-fact-validator.ts` applies (two key-specific cases included). Re-deriving that rule\n * here would create a second source of truth that can disagree with the first, so the crossing is\n * left unpublished; the scheduler still classifies the refusal as a LIMIT failure, only without an\n * `observed`/`maximum` pair. Every crossing this module measures itself publishes both numbers.\n */\nfunction admittedFact(result: SafeFactValidationResultV2): SafeFactV2 { if (result.ok) return result.fact; if (result.reason === 'LIMIT_EXCEEDED') return fail('LIMIT_EXCEEDED'); if (result.reason === 'FORBIDDEN_CONTENT') return fail('FORBIDDEN_CONTENT'); if (result.reason === 'UNSAFE_INPUT') return fail('UNSAFE_INPUT'); if (result.reason === 'UNKNOWN_PROPERTY') return fail('UNKNOWN_KEY'); return fail('MALFORMED_CANDIDATE'); }\nfunction readFacts(input: unknown, schemas: readonly SafeFactSchemaV2[], limits: ScannerLimitsV2, budget: EvidenceBudgetV2): { facts: SafeFactV2[]; ids: Set<string>; recovered: Set<string> } { const facts: SafeFactV2[] = []; const ids = new Set<string>(); const counts = new Map<string, number>(); const services = new Set<string>(); const sourceCounts = new Map<string, number>(); const length = readBoundedLength(input, limits.maxMembersAndElements); for (let index = 0; index < length; index += 1) { const raw = readArrayItem(input, index); const header = ownRecord(raw, ['factId', 'kind', 'subject', 'properties'], 'UNKNOWN_KEY'); const kind = text(header.kind); const schema = schemaFor(schemas, kind); const maximum = factLimit(kind, limits); if (maximum === 0) limitExceeded(1, 0); const admittedInput = createSafeFactAdmissionSnapshotV2(typedFact(raw, schema, limits)); const fact = admittedFact(validateSafeFact(admittedInput, schema, limits)); validateSubjectContent(fact.subject); if (ids.has(fact.factId)) fail('DUPLICATE_ID'); const count = (counts.get(kind) ?? 0) + 1; if (count > maximum) limitExceeded(count, maximum); let serviceKey: string | undefined; if (kind === 'integration.v1') { const service = fact.properties.service; serviceKey = typeof service === 'string' ? service : fail('DUPLICATE_ID'); if (services.has(serviceKey)) fail('DUPLICATE_ID'); } let sourceId: string | undefined; let sourceCount: number | undefined; if (kind === 'code.indicator.v2' && fact.subject.kind === 'SOURCE') { sourceId = fact.subject.source.astNodeId; sourceCount = (sourceCounts.get(sourceId) ?? 0) + 1; if (sourceCount > 10) limitExceeded(sourceCount, 10); } chargeEvidence(budget, 2, fact); if (sourceId !== undefined && sourceCount !== undefined) sourceCounts.set(sourceId, sourceCount); ids.add(fact.factId); counts.set(kind, count); if (serviceKey !== undefined) services.add(serviceKey); facts.push(fact); } const recovered = new Set<string>(); for (let index = 0; index < facts.length; index += 1) if (facts[index].kind === 'code.indicator.v2' && facts[index].properties.parseState === 'RECOVERED') recovered.add(facts[index].factId); return { facts, ids, recovered }; }\nfunction traceId(kind: string, steps: readonly unknown[]): string { return digest(['secureflow-trace-id-v2', kind, canonicalizeJson(steps)]); }\nfunction readTraces(input: unknown, limits: ScannerLimitsV2, budget: EvidenceBudgetV2): { traces: TraceV2[]; ids: Set<string> } { const traces: TraceV2[] = []; const ids = new Set<string>(); const length = readBoundedLength(input, limits.maxMembersAndElements); for (let index = 0; index < length; index += 1) { const raw = readArrayItem(input, index); const value = ownRecord(raw, ['traceId', 'kind', 'steps'], 'MALFORMED_CANDIDATE'); const kind = enumValue(value.kind, enums.trace); const rawSteps = readBoundedArray(value.steps, Math.min(limits.maxTraceStepsPerFinding, limits.maxMembersAndElements)); const steps = rawSteps.map((rawStep, ordinal) => { const step = ownRecord(rawStep, ['ordinal', 'kind', 'subject', 'factRefs'], 'MALFORMED_CANDIDATE'); if (step.ordinal !== ordinal) fail('MALFORMED_CANDIDATE'); const stepKind = enumValue(step.kind, enums.step); const subject = candidateSubject(step.subject, limits); validateSubjectContent(subject); return { ordinal, kind: stepKind, subject, factRefs: Object.freeze(refs(step.factRefs, limits.maxMembersAndElements)) }; }); const valueId = id(value.traceId); if (valueId !== traceId(kind, steps)) fail('MALFORMED_CANDIDATE'); if (ids.has(valueId)) fail('DUPLICATE_ID'); const trace = { traceId: valueId, kind, steps: Object.freeze(steps) }; chargeEvidence(budget, 3, trace); ids.add(valueId); traces.push(trace); } return { traces: traces.sort((a, b) => compare(a.traceId, b.traceId)), ids }; }\nfunction mappingFor(ruleId: string): SafeFactEvidenceMappingV2 { const mapping = SAFE_FACT_EVIDENCE_MAPPINGS_V2.find((item) => item.ruleId === ruleId); if (mapping !== undefined) return mapping; return fail('UNKNOWN_RULE'); }\nfunction optionalEvidenceProperty(mapping: SafeFactEvidenceMappingV2, factKind: string, property: string): boolean { return mapping.evidenceSchemaId === 'v1.taint' && factKind === 'dataflow.summary.v2' && ['propertyPath', 'sourceNodeId', 'sourceNodeName'].includes(property); }\nfunction evidenceFact(facts: Map<string, SafeFactV2>, mapping: SafeFactEvidenceMappingV2, ref: string): SafeFactV2 { const fact = facts.get(ref); if (fact === undefined || !mapping.factKinds.includes(fact.kind)) return fail('DANGLING_REFERENCE'); return fact; }\nfunction validateEvidence(finding: FindingCandidateV2, rule: AdmittedRuleV2, mapping: SafeFactEvidenceMappingV2, facts: Map<string, SafeFactV2>, recovered: ReadonlySet<string>): void { const referenced = finding.factRefs.map((ref) => evidenceFact(facts, mapping, ref)); if (rule.capabilityId !== mapping.ownerCapabilityId || rule.evidenceSchemaId !== mapping.evidenceSchemaId || rule.remediationId !== finding.remediationId || finding.evidenceClass !== mapping.evidenceClass) fail('UNOWNED_RULE'); const seenKinds = new Set<string>(); for (const fact of referenced) { const properties = mapping.factPropertiesByKind[fact.kind] ?? []; for (const property of properties) if (!(fact.kind === 'code.indicator.v2' && property === 'member') && !optionalEvidenceProperty(mapping, fact.kind, property) && !has(fact.properties, property)) fail('DANGLING_REFERENCE'); seenKinds.add(fact.kind); if (finding.ruleId === 'RAW_AUTH_HEADER' && fact.properties.observation !== 'AUTH_HEADER') fail('DANGLING_REFERENCE'); if (finding.ruleId === 'RAW_SECRET_INDICATOR' && fact.properties.observation !== 'SECRET_INDICATOR') fail('DANGLING_REFERENCE'); if ((finding.ruleId === 'JAVASCRIPT_DYNAMIC_EXECUTION' && fact.properties.language !== 'JAVASCRIPT') || (finding.ruleId === 'PYTHON_DYNAMIC_EXECUTION' && fact.properties.language !== 'PYTHON')) fail('DANGLING_REFERENCE'); if (finding.ruleId.startsWith('TAINTED_')) { const sink = finding.ruleId === 'TAINTED_SQL_QUERY' ? 'SQL' : finding.ruleId.slice(8).replace('REQUEST_URL', 'SSRF').replace('FILE_PATH', 'PATH').replace('CODE_INPUT', 'CODE').replace('REQUEST_HEADER', 'HEADER').replace('AI_PROMPT', 'PROMPT'); if (fact.properties.flowKind !== 'TAINT_SINK' || fact.properties.sink !== sink) fail('DANGLING_REFERENCE'); } if (finding.ruleId === 'AI_AGENT_UNGATED_TOOL' && ((fact.kind === 'dataflow.summary.v2' && (fact.properties.flowKind !== 'AGENT_INFLUENCE' || fact.properties.humanGatePresent !== false || fact.properties.humanGateDominates !== false)) || (fact.kind === 'node.capability.v2' && (!stringListContains(fact.properties.capabilities, 'AI_AGENT') || fact.properties.toolCount === 0)))) fail('DANGLING_REFERENCE'); if (finding.ruleId === 'UNAPPROVED_DOMAIN' && (fact.properties.authorityState !== 'KNOWN' || fact.properties.hostname === null)) fail('DANGLING_REFERENCE'); if (fact.kind === 'code.indicator.v2' && recovered.has(fact.factId) && (rule.effect !== 'REPORT_ONLY' || finding.conclusion !== 'POTENTIAL')) fail('FORBIDDEN_CONTENT'); } for (const kind of mapping.factKinds) if (!seenKinds.has(kind)) fail('DANGLING_REFERENCE'); }\nfunction findingId(finding: FindingCandidateV2, rule: AdmittedRuleV2): string { return digest(['secureflow-finding-id-v2', finding.ruleId, rule.revision, finding.evidenceClass, finding.conclusion, finding.applicability, subjectKey(finding.subject), ...[...finding.factRefs].sort(compare), ...[...finding.traceRefs].sort(compare)]); }\nfunction readFindings(input: unknown, capability: { id: string; ruleIds: ReadonlySet<string> }, rules: RuleRegistryV2, facts: Map<string, SafeFactV2>, recovered: ReadonlySet<string>, limits: ScannerLimitsV2, budget: EvidenceBudgetV2): FindingCandidateV2[] { const output: Array<{ item: FindingCandidateV2; id: string; severity: number }> = []; const ids = new Set<string>(); const ranks: Readonly<Record<AdmittedRuleV2['severity'], number>> = { CRITICAL: 0, HIGH: 1, MEDIUM: 2, LOW: 3, INFO: 4 }; const length = readBoundedLength(input, limits.maxFindings); for (let index = 0; index < length; index += 1) { const raw = readArrayItem(input, index); const value = ownRecord(raw, ['ruleId', 'evidenceClass', 'conclusion', 'applicability', 'subject', 'factRefs', 'traceRefs', 'remediationId'], 'MALFORMED_CANDIDATE'); const ruleId = text(value.ruleId); const rule = ruleEntry(rules, ruleId); if (!capability.ruleIds.has(ruleId)) fail('UNOWNED_RULE'); if (rule.capabilityId !== capability.id) fail('UNOWNED_RULE'); const mapping = mappingFor(ruleId); const subject = candidateSubject(value.subject, limits); validateSubjectContent(subject); const item: FindingCandidateV2 = { ruleId, evidenceClass: enumValue(value.evidenceClass, enums.evidenceClass), conclusion: enumValue(value.conclusion, enums.conclusion), applicability: enumValue(value.applicability, enums.applicability), subject, factRefs: Object.freeze(refs(value.factRefs, limits.maxMembersAndElements)), traceRefs: Object.freeze(refs(value.traceRefs, limits.maxMembersAndElements)), remediationId: text(value.remediationId) }; validateEvidence(item, rule, mapping, facts, recovered); const itemId = findingId(item, rule); if (ids.has(itemId)) fail('DUPLICATE_ID'); chargeEvidence(budget, 0, item); ids.add(itemId); output.push({ item, id: itemId, severity: ranks[rule.severity] }); } return output.sort((a, b) => a.severity - b.severity || compare(a.item.ruleId, b.item.ruleId) || compare(subjectKey(a.item.subject), subjectKey(b.item.subject)) || compare(a.id, b.id)).map(({ item }) => item); }\nfunction compareDiagnosticLocations(left: AnalysisDiagnosticV2['location'], right: AnalysisDiagnosticV2['location']): number {\n if (left === undefined) return right === undefined ? 0 : 1;\n if (right === undefined) return -1;\n const pointerOrder = compare(left.pointer, right.pointer);\n if (pointerOrder !== 0) return pointerOrder;\n for (let index = 0; index < Math.min(left.occurrencePath.length, right.occurrencePath.length); index += 1) {\n if (left.occurrencePath[index] !== right.occurrencePath[index]) return left.occurrencePath[index] - right.occurrencePath[index];\n }\n return left.occurrencePath.length - right.occurrencePath.length;\n}\nfunction compareDiagnostics(left: AnalysisDiagnosticV2, right: AnalysisDiagnosticV2): number {\n const capabilityOrder = compare(left.capabilityId, right.capabilityId);\n if (capabilityOrder !== 0) return capabilityOrder;\n const codeOrder = DIAGNOSTIC_CODES_V2.indexOf(left.code) - DIAGNOSTIC_CODES_V2.indexOf(right.code);\n if (codeOrder !== 0) return codeOrder;\n const locationOrder = compareDiagnosticLocations(left.location, right.location);\n return locationOrder !== 0 ? locationOrder : compare(left.id, right.id);\n}\nfunction readDiagnostics(input: readonly unknown[], capabilityId: string, required: boolean, limits: ScannerLimitsV2, diagnosticsBudget: EvidenceBudgetV2): AnalysisDiagnosticV2[] {\n const output: AnalysisDiagnosticV2[] = []; const ids = new Set<string>();\n const length = readBoundedLength(input, limits.maxDiagnostics);\n for (let index = 0; index < length; index += 1) {\n const raw = readArrayItem(input, index);\n const value = ownRecord(raw, ['id', 'code', 'category', 'capabilityId', 'aggregateEffect', 'assessmentEligible', 'location', 'observed', 'maximum', 'omitted'], 'MALFORMED_CANDIDATE', ['id', 'code', 'category', 'capabilityId', 'aggregateEffect', 'assessmentEligible']);\n const code = enumValue(value.code, DIAGNOSTIC_CODES_V2); const classification = classifyDiagnostic(code, required);\n if ((code === 'REQUIRED_LIMIT_EXCEEDED' || code === 'OPTIONAL_LIMIT_EXCEEDED') && !(['observed', 'maximum', 'omitted'] as const).every((key) => has(value, key))) fail('MALFORMED_CANDIDATE');\n if (text(value.capabilityId) !== capabilityId || value.category !== classification.category || value.aggregateEffect !== classification.aggregateEffect || value.assessmentEligible !== classification.assessmentEligible) fail('MALFORMED_CANDIDATE');\n const location = has(value, 'location') ? readSourceMemberRef(value.location, limits) : undefined; const counts: MutableDiagnosticCountersV2 = {};\n for (const key of ['observed', 'maximum', 'omitted'] as const) if (has(value, key)) counts[key] = integer(value[key]);\n const identity = { code, capabilityId, aggregateEffect: classification.aggregateEffect, category: classification.category, assessmentEligible: classification.assessmentEligible, ...(location ? { location } : {}), ...counts };\n const diagnosticId = id(value.id); if (diagnosticId !== createDiagnosticId(identity)) fail('MALFORMED_CANDIDATE'); if (ids.has(diagnosticId)) fail('DUPLICATE_ID');\n const diagnostic = Object.freeze({ id: diagnosticId, ...identity }); chargeEvidence(diagnosticsBudget, 1, diagnostic); output.push(diagnostic);\n }\n return output.sort(compareDiagnostics);\n}\nconst utf8Bytes = (value: string): number => new TextEncoder().encode(value).length;\nconst isSafeFactScalar = (value: unknown): value is SafeFactScalarV2 => value === null || typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';\nconst scalarJson = (value: SafeFactScalarV2): string => canonicalizeJson(value);\nconst safeValueJson = (value: SafeFactValueV2): string => { if (isSafeFactScalar(value)) return scalarJson(value); const arrayValue: readonly SafeFactScalarV2[] = value; return `[${arrayValue.map((item) => scalarJson(item)).join(',')}]`; };\nfunction canonicalBytes(value: SafeFactValueV2 | Readonly<Record<string, unknown>>): number {\n if (isSafeFactScalar(value)) return utf8Bytes(scalarJson(value));\n if (Array.isArray(value)) return utf8Bytes(safeValueJson(value as readonly SafeFactScalarV2[]));\n return utf8Bytes(canonicalizeJson(value));\n}\nconst limitNumber = (input: object, key: string, minimum = 0): number => { const descriptor = Object.getOwnPropertyDescriptor(input, key); if (!descriptor || !('value' in descriptor) || typeof descriptor.value !== 'number' || !Number.isSafeInteger(descriptor.value) || descriptor.value < minimum) fail('UNSAFE_INPUT'); return descriptor.value; };\nfunction snapshotLimits(input: unknown): ScannerLimitsV2 { if (typeof input !== 'object' || input === null || Array.isArray(input) || Object.getPrototypeOf(input) !== Object.prototype) fail('UNSAFE_INPUT'); const schema = Object.getOwnPropertyDescriptor(input, 'schemaVersion'); if (!schema || !('value' in schema) || schema.value !== 'scanner-limits-v2') fail('UNSAFE_INPUT'); const maxBytes = limitNumber(input, 'maxBytes'); const maxNodes = limitNumber(input, 'maxNodes'); const maxEdges = limitNumber(input, 'maxEdges'); const maxConnectionDepth = limitNumber(input, 'maxConnectionDepth'); const maxParameterDepth = limitNumber(input, 'maxParameterDepth'); const maxParameterLeaves = limitNumber(input, 'maxParameterLeaves'); const workerDeadlineMs = limitNumber(input, 'workerDeadlineMs'); const maxSyntaxNodes = limitNumber(input, 'maxSyntaxNodes'); const maxDocumentDepth = limitNumber(input, 'maxDocumentDepth'); const maxMembersAndElements = limitNumber(input, 'maxMembersAndElements'); const maxRawEdges = limitNumber(input, 'maxRawEdges'); const maxDuplicateKeys = limitNumber(input, 'maxDuplicateKeys'); const maxDiagnostics = limitNumber(input, 'maxDiagnostics', 1); const maxStoredSourceSpans = limitNumber(input, 'maxStoredSourceSpans'); const maxSourceWork = limitNumber(input, 'maxSourceWork'); const maxExpressionTokens = limitNumber(input, 'maxExpressionTokens'); const maxCodeSyntaxNodes = limitNumber(input, 'maxCodeSyntaxNodes'); const maxGraphOperations = limitNumber(input, 'maxGraphOperations'); const maxTaintStates = limitNumber(input, 'maxTaintStates'); const maxTraceStepsPerFinding = limitNumber(input, 'maxTraceStepsPerFinding'); const maxFindings = limitNumber(input, 'maxFindings'); const maxRedactionPatches = limitNumber(input, 'maxRedactionPatches'); const maxRedactedArtifactBytes = limitNumber(input, 'maxRedactedArtifactBytes'); const maxEvidenceBytes = limitNumber(input, 'maxEvidenceBytes'); const maxSerializedResultBytes = limitNumber(input, 'maxSerializedResultBytes'); const maxRuleOperations = limitNumber(input, 'maxRuleOperations'); return Object.freeze({ schemaVersion: 'scanner-limits-v2', maxBytes, maxNodes, maxEdges, maxConnectionDepth, maxParameterDepth, maxParameterLeaves, workerDeadlineMs, maxSyntaxNodes, maxDocumentDepth, maxMembersAndElements, maxRawEdges, maxDuplicateKeys, maxDiagnostics, maxStoredSourceSpans, maxSourceWork, maxExpressionTokens, maxCodeSyntaxNodes, maxGraphOperations, maxTaintStates, maxTraceStepsPerFinding, maxFindings, maxRedactionPatches, maxRedactedArtifactBytes, maxEvidenceBytes, maxSerializedResultBytes, maxRuleOperations }); }\nfunction evidenceBudget(maximum: number): EvidenceBudgetV2 { const bytes = utf8Length(canonicalizeJson({ findings: [], diagnostics: [], facts: [], traces: [] })); if (bytes > maximum) limitExceeded(bytes, maximum); return { bytes, counts: [0, 0, 0, 0], maximum }; }\nfunction chargeEvidence(budget: EvidenceBudgetV2, section: 0 | 1 | 2 | 3, value: Readonly<Record<string, unknown>>): void { budget.bytes += canonicalBytes(value) + (budget.counts[section] === 0 ? 0 : 1); budget.counts[section] += 1; if (budget.bytes > budget.maximum) limitExceeded(budget.bytes, budget.maximum); }\ntype EvidenceCollectionV2 = Readonly<Pick<CapabilityCandidateV2, 'findings' | 'diagnostics' | 'facts' | 'traces'>>;\nfunction sharedEvidence(value: EvidenceCollectionV2): number { return canonicalBytes({ findings: value.findings, diagnostics: value.diagnostics, facts: value.facts, traces: value.traces }); }\nfunction utf8Length(value: string): number { let bytes = 0; for (let index = 0; index < value.length; index += 1) { const code = value.charCodeAt(index); if (code >= 0xd800 && code <= 0xdbff && index + 1 < value.length && value.charCodeAt(index + 1) >= 0xdc00 && value.charCodeAt(index + 1) <= 0xdfff) { bytes += 4; index += 1; } else bytes += code <= 0x7f ? 1 : code <= 0x7ff ? 2 : 3; } return bytes; }\nfunction jsonStringBytes(value: string): number { let bytes = 2; for (let index = 0; index < value.length; index += 1) { const code = value.charCodeAt(index); if (code === 0x22 || code === 0x5c || code === 8 || code === 9 || code === 10 || code === 12 || code === 13) bytes += 2; else if (code <= 0x1f) bytes += 6; else if (code >= 0xd800 && code <= 0xdbff && index + 1 < value.length && value.charCodeAt(index + 1) >= 0xdc00 && value.charCodeAt(index + 1) <= 0xdfff) { bytes += 4; index += 1; } else if (code >= 0xd800 && code <= 0xdfff) bytes += 6; else bytes += code <= 0x7f ? 1 : code <= 0x7ff ? 2 : 3; } return bytes; }\nfunction scalarLowerBound(value: unknown): number { if (typeof value === 'string') return jsonStringBytes(value); if (value === null) return 4; if (typeof value === 'boolean') return value ? 4 : 5; if (typeof value === 'number') return Number.isFinite(value) ? String(Object.is(value, -0) ? 0 : value).length : 1; return 0; }\nconst structureFields: Readonly<Record<string, readonly string[]>> = { subject: ['kind', 'node', 'edge', 'source'], node: ['ordinal', 'source', 'explicitId', 'name', 'identityDigest'], edge: ['ordinal', 'sourceNode', 'sourceLabel', 'targetNode', 'targetLabel', 'connectionType', 'sourcePort', 'targetPort', 'source', 'resolution'], source: ['pointer', 'occurrencePath', 'astNodeId', 'span'], location: ['pointer', 'occurrencePath', 'astNodeId', 'span'], span: ['start', 'end'], start: ['line', 'column', 'utf16Offset', 'utf8ByteOffset'], end: ['line', 'column', 'utf16Offset', 'utf8ByteOffset'], finding: ['ruleId', 'evidenceClass', 'conclusion', 'applicability', 'subject', 'factRefs', 'traceRefs', 'remediationId'], trace: ['traceId', 'kind', 'steps'], step: ['ordinal', 'kind', 'subject', 'factRefs'], diagnostic: ['id', 'code', 'category', 'capabilityId', 'aggregateEffect', 'assessmentEligible', 'location', 'observed', 'maximum', 'omitted'] };\nconst fieldShape = (key: string): readonly string[] => structureFields[key] ?? [];\nconst fit = (value: number, maximum: number): number => value > maximum ? limitExceeded(value, maximum) : value;\nconst PREFLIGHT_MAX_DEPTH = 512; const PREFLIGHT_MAX_WORK = 1_000_000; type PreflightFrame = { value: object; fields: readonly string[]; itemFields: readonly string[]; propertyFields: readonly string[]; index: number; length: number; present: number; array: boolean; depth: number };\nfunction boundedValue(value: unknown, maximum: number, fields: readonly string[] = [], itemFields: readonly string[] = [], propertyFields: readonly string[] = [], cap = Number.MAX_SAFE_INTEGER): number {\n let total = 0; let work = 0; const active = new Set<object>(); const stack: Array<PreflightFrame | { leave: object }> = [];\n const add = (amount: number): void => { if (!Number.isSafeInteger(amount) || amount < 0) fail('LIMIT_EXCEEDED'); if (total > cap - amount) limitExceeded(total + amount, cap); total += amount; };\n const push = (next: unknown, nextFields: readonly string[], nextItems: readonly string[], nextProperties: readonly string[], depth: number): void => {\n const workCap = Math.min(PREFLIGHT_MAX_WORK, Math.max(1_024, maximum * 64));\n if (++work > workCap) limitExceeded(work, workCap); if (depth > PREFLIGHT_MAX_DEPTH) fail('UNSAFE_INPUT');\n if (isSafeFactScalar(next)) { add(scalarLowerBound(next)); return; }\n if (next === null || typeof next !== 'object') return; if (active.has(next)) fail('UNSAFE_INPUT'); active.add(next); add(2);\n if (Array.isArray(next)) { const length = readBoundedLength(next, maximum, false); stack.push({ leave: next }); stack.push({ value: next, fields: [], itemFields: nextItems, propertyFields: [], index: 0, length, present: 0, array: true, depth }); }\n else { stack.push({ leave: next }); stack.push({ value: next, fields: nextFields, itemFields: [], propertyFields: nextProperties, index: 0, length: nextFields.length, present: 0, array: false, depth }); }\n };\n push(value, fields, itemFields, propertyFields, 0);\n while (stack.length) {\n const frame = stack[stack.length - 1]; if ('leave' in frame) { stack.pop(); active.delete(frame.leave); continue; }\n if (frame.index >= frame.length) { stack.pop(); continue; }\n const index = frame.index++; if (frame.array) { add(index ? 1 : 0); push(readArrayItem(frame.value, index), frame.itemFields, [], [], frame.depth + 1); continue; }\n const key = frame.fields[index]; const descriptor = Object.getOwnPropertyDescriptor(frame.value, key); if (descriptor === undefined) continue; if (!('value' in descriptor)) fail('UNSAFE_INPUT'); add((frame.present ? 1 : 0) + jsonStringBytes(key) + 1); frame.present += 1; push(descriptor.value, key === 'properties' ? frame.propertyFields : fieldShape(key), key === 'steps' ? fieldShape('step') : [], [], frame.depth + 1);\n }\n return total; }\nfunction boundedItem(value: unknown, section: string, maximum: number, cap = Number.MAX_SAFE_INTEGER): number { if (section === 'facts') { const kind = Object.getOwnPropertyDescriptor(value as object, 'kind'); const schema = kind && 'value' in kind && typeof kind.value === 'string' ? SAFE_FACT_REGISTRY_V2.schemas.find((item) => item.kind === kind.value) : undefined; return boundedValue(value, maximum, ['factId', 'kind', 'subject', 'properties'], [], schema ? Object.keys(schema.properties) : [], cap); } return boundedValue(value, maximum, fieldShape(section === 'findings' ? 'finding' : section === 'traces' ? 'trace' : 'diagnostic'), [], [], cap); }\nfunction preflightSection(input: unknown, section: string, maximum: number, cap: number): number { const length = readBoundedLength(input, maximum, false); let total = 0; for (let index = 0; index < length; index += 1) { const separator = index ? 1 : 0; total = fit(total + separator, cap); total += boundedItem(readArrayItem(input, index), section, maximum, cap - total); total = fit(total, cap); } return total; }\nfunction preflightCandidate(input: unknown, limits: ScannerLimitsV2, budget: EvidenceBudgetV2): void { if (input === null || typeof input !== 'object' || Array.isArray(input)) return fail('UNSAFE_INPUT'); let minimum = 0; for (const section of ['findings', 'diagnostics', 'facts', 'traces']) { const descriptor = Object.getOwnPropertyDescriptor(input, section); if (descriptor === undefined || !('value' in descriptor)) return fail('UNSAFE_INPUT'); const maximum = section === 'findings' ? limits.maxFindings : section === 'diagnostics' ? limits.maxDiagnostics : limits.maxMembersAndElements; minimum += preflightSection(descriptor.value, section, maximum, budget.maximum - budget.bytes - minimum); if (budget.bytes + minimum > budget.maximum) limitExceeded(budget.bytes + minimum, budget.maximum); } }\nexport function validateCapabilityCandidate(candidate: unknown, capability: CapabilitySpecV2, registries: CandidateRegistriesV2, limits: ScannerLimitsV2, eligibleUnits: number): CapabilityCandidateValidationResultV2 { let safeCounters: MutableCandidateCountersV2 = { seen: 0, analyzed: 0, skipped: 0, omitted: 0 }; if (!isScannerAdmissionSnapshotV2<CapabilityCandidateV2>(candidate)) return rejected('UNSAFE_INPUT', safeCounters); try { const safeLimits = snapshotLimits(limits); const budget = evidenceBudget(safeLimits.maxEvidenceBytes); const value = candidateRecord(candidate); safeCounters = counters(value); if (countInconsistency(safeCounters, eligibleUnits) !== null) fail('INVALID_COUNTER'); preflightCandidate(value, safeLimits, budget); const capabilityViewValue = capabilityView(capability, safeLimits); const registryValue = ownRecord(registries, ['facts', 'rules'], 'MALFORMED_CANDIDATE'); const schemas = snapshotRegistry(registryValue.facts); const admittedFacts = readFacts(value.facts, schemas, safeLimits, budget); const rules = ruleRegistry(registryValue.rules, safeLimits, capabilityViewValue.ruleIds); const factMap = new Map(admittedFacts.facts.map((fact) => [fact.factId, fact])); const admittedTraces = readTraces(value.traces, safeLimits, budget); const findings = readFindings(value.findings, capabilityViewValue, rules, factMap, admittedFacts.recovered, safeLimits, budget); for (let index = 0; index < findings.length; index += 1) { const finding = findings[index]; for (const ref of finding.traceRefs) if (!admittedTraces.ids.has(ref)) fail('DANGLING_REFERENCE'); for (const ref of finding.factRefs) if (!admittedFacts.ids.has(ref)) fail('DANGLING_REFERENCE'); } for (let index = 0; index < admittedTraces.traces.length; index += 1) for (const step of admittedTraces.traces[index].steps) for (const ref of step.factRefs) if (!admittedFacts.ids.has(ref)) fail('DANGLING_REFERENCE'); for (let index = 0; index < admittedFacts.facts.length; index += 1) { const fact = admittedFacts.facts[index]; const schema = schemaFor(schemas, fact.kind); if (!projection(capabilityViewValue, schema, fact)) fail('MALFORMED_CANDIDATE'); } const diagnostics = readDiagnostics(readBoundedArray(value.diagnostics, safeLimits.maxDiagnostics), capabilityViewValue.id, capabilityViewValue.required, safeLimits, budget); if (omissionInconsistency(safeCounters, diagnostics) !== null) fail('INVALID_COUNTER'); const ordered = { findings, diagnostics, facts: [...admittedFacts.facts].sort((a, b) => compare(a.factId, b.factId)), traces: admittedTraces.traces }; if (sharedEvidence(ordered) !== budget.bytes) fail('UNSAFE_INPUT'); const normalized: CapabilityCandidateV2 = { findings: Object.freeze(ordered.findings), diagnostics: Object.freeze(ordered.diagnostics), facts: Object.freeze(ordered.facts), traces: Object.freeze(ordered.traces), ...safeCounters }; return freezeData({ ok: true as const, candidate: freezeData(normalized) }); } catch (error) { if (error instanceof CandidateLimitExceededV2) return rejected('LIMIT_EXCEEDED', safeCounters, { observed: error.observed, maximum: error.maximum }); const reason = typeof error === 'string' && isReason(error) ? error : 'UNSAFE_INPUT'; return rejected(reason, safeCounters); } }\n", "/**\n * The immutable view the scheduler hands each capability: the per-field copy budgets derived from\n * the documented limits, and the bounded copy walk that enforces them. Extracted from\n * `scheduler.ts` (2026-10-17 file-size remediation) with no behaviour change: every function,\n * bound, comment and refusal path below is the reviewed D-1 implementation, moved verbatim.\n */\nimport { DEFAULT_SCANNER_LIMITS_V2, type ScannerLimitsV2 } from '@hub/contracts';\nimport { isParsedSourceDocument } from '../source/source-document-provenance';\nimport { MAX_SOURCE_PARSER_DEPTH } from '../source/source-preflight';\nimport type { AnalyzerContextV2 } from './scheduler';\n/**\n * The bounds on the immutable view the scheduler hands each capability. They are a guard against a\n * runaway walk, never an admission limit: everything they bound is already bounded by the\n * documented limits the parser and normalizer enforce, so exporting a constant here would refuse a\n * workflow the documentation says is admissible. D-1 (2026-10-17): the constant was\n * `{ depth: 64, objects: 8192, items: 4096 }`, and it refused every workflow of roughly 2,500\n * source members as `REQUIRED_CAPABILITY_FAILED` while every limit row reported `exhausted: false`\n * \u2014 a ceiling two orders of magnitude below the documented `maxMembersAndElements = 250000`, and\n * one no operator could see or raise.\n *\n * The floor keeps the original tightness for the context fields whose admissible size is a constant\n * (`limits`, `rules`, `priorOutcomes`, the parser-owned `source`), where an oversized graph is\n * always hostile rather than admissible. `target` is not one of those: the target admission admits\n * far more than the floor, so it carries its own budget below (D-1 review, finding 3).\n */\nconst CONTEXT_SNAPSHOT_FLOOR_V2: SnapshotBudgetV2 = Object.freeze({ objects: 8_192, items: 4_096, depth: 64 });\n/**\n * What the target admission admits, which the floor must not undercut: `semantics/target-context.ts`\n * bounds `communityPackages` and `configuration` at `MAX_COLLECTION_ITEMS = 100_000` items each, so\n * a target that passes `validateTargetContextV2` can sit far above the floor and is not a hostile\n * graph. Both constants must stay in step with that file.\n */\nconst CONTEXT_TARGET_COLLECTION_ITEMS_V2 = 100_000;\nconst CONTEXT_TARGET_UNITS_V2 = 2 * CONTEXT_TARGET_COLLECTION_ITEMS_V2;\n/**\n * The copy cost of one admissible unit, measured on the D-1 fixtures. The normalized workflow\n * mirrors every source member at least twice \u2014 once in `workflowFields`, once under the owning\n * node's `parameters`/`credentials`/`settings` \u2014 and each mirror costs two copied objects (the\n * semantic field and its occurrence list), so one member costs about four objects before refs and\n * spans. The factor of two over that measurement is headroom for the retained spans (the span\n * object, its two positions and its occurrence path), the node and edge refs, identity and label\n * objects that share those members; the seven measured shapes ran 1.73\u20132.65 objects per unit\n * against this factor of 8 (D1-FIX-REVIEW.md).\n */\nconst CONTEXT_OBJECTS_PER_UNIT_V2 = 8;\nconst CONTEXT_DEPTH_PER_DOCUMENT_LEVEL_V2 = 2;\nconst CONTEXT_DEPTH_OVERHEAD_V2 = 16;\nconst CONTEXT_SEMANTIC_OBJECTS_PER_NODE_V2 = 64;\nconst LIMIT_KEYS = Object.getOwnPropertyNames(DEFAULT_SCANNER_LIMITS_V2);\n/** `Map.prototype.size` through its intrinsic getter: an instance cannot lie about its own size. */\nconst MAP_SIZE_V2 = Object.getOwnPropertyDescriptor(Map.prototype, 'size')!.get as (this: ReadonlyMap<unknown, unknown>) => number;\ntype SnapshotBudgetV2 = Readonly<{ objects: number; items: number; depth: number }>;\nexport type SnapshotBoundV2 = Readonly<{ observed: number; maximum: number; omitted: number }>;\ntype SnapshotState = { nodes: number; budget: SnapshotBudgetV2 };\n/**\n * The numbers one limit refusal publishes. `observed` is the real size of the collection that\n * crossed a per-container bound (`omitted` is the part that bound saw and refused); for the two\n * cumulative budgets \u2014 which stop the walk at the first crossing and cannot say how far past it the\n * document goes \u2014 it is the bound that fired, because `maximum + 1` would dress a design stop as a\n * size measurement and tell an operator nothing about the document.\n */\nexport const snapshotBound = (observed: number, maximum: number): SnapshotBoundV2 => ({ observed, maximum, omitted: Math.max(0, observed - maximum) });\n/**\n * The wrapped failure of a context-view walk. It carries the numbers the diagnostic publishes, so a\n * refused view reports the size that fired and the bound it fired against instead of an opaque\n * capability failure (D-1).\n */\nexport class ContextSnapshotLimitV2 extends TypeError {\n readonly observed: number;\n readonly maximum: number;\n constructor(observed: number, maximum: number) {\n super('Context snapshot bound exceeded');\n this.observed = observed;\n this.maximum = maximum;\n }\n}\n/**\n * The per-field copy budgets of one context view, derived from the documented limits that bound the\n * field's content. `workflow` is the only field that carries the normalized document: its arrays are\n * bounded by `maxNodes`, `maxEdges`, `maxStoredSourceSpans` and `maxMembersAndElements`, its depth by\n * `maxDocumentDepth` (each document level costs two levels in the semantic mirror), and its object\n * count by the per-unit copy cost measured above. `semantics` carries one resolved catalogue entry\n * per node, and `target` carries what its own admission admits (at most two collections of\n * `CONTEXT_TARGET_COLLECTION_ITEMS_V2` items each); every other field is request metadata whose\n * admissible size is a constant.\n */\nfunction contextSnapshotBudgets(limits: ScannerLimitsV2): Readonly<Record<string, SnapshotBudgetV2>> {\n const units = limits.maxMembersAndElements + limits.maxStoredSourceSpans + limits.maxNodes + limits.maxEdges;\n return Object.freeze({\n target: Object.freeze({\n objects: CONTEXT_SNAPSHOT_FLOOR_V2.objects + CONTEXT_OBJECTS_PER_UNIT_V2 * CONTEXT_TARGET_UNITS_V2,\n items: Math.max(CONTEXT_SNAPSHOT_FLOOR_V2.items, CONTEXT_TARGET_COLLECTION_ITEMS_V2),\n depth: CONTEXT_SNAPSHOT_FLOOR_V2.depth,\n }),\n workflow: Object.freeze({\n objects: CONTEXT_SNAPSHOT_FLOOR_V2.objects + CONTEXT_OBJECTS_PER_UNIT_V2 * units,\n items: Math.max(CONTEXT_SNAPSHOT_FLOOR_V2.items, limits.maxMembersAndElements, limits.maxStoredSourceSpans, limits.maxNodes, limits.maxEdges, limits.maxParameterLeaves),\n depth: CONTEXT_SNAPSHOT_FLOOR_V2.depth + CONTEXT_DEPTH_OVERHEAD_V2 + CONTEXT_DEPTH_PER_DOCUMENT_LEVEL_V2 * Math.min(limits.maxDocumentDepth, MAX_SOURCE_PARSER_DEPTH),\n }),\n semantics: Object.freeze({\n objects: CONTEXT_SNAPSHOT_FLOOR_V2.objects + CONTEXT_SEMANTIC_OBJECTS_PER_NODE_V2 * limits.maxNodes,\n items: Math.max(CONTEXT_SNAPSHOT_FLOOR_V2.items, limits.maxNodes),\n depth: CONTEXT_SNAPSHOT_FLOOR_V2.depth,\n }),\n });\n}\n/**\n * The top-level record guard the walk applied to its own root before this view existed: a plain\n * prototype, no symbols, no more own names than the floor admits, and every own property a data\n * property. It cannot be left to the walk \u2014 `contextSnapshotBudgets(input.limits)` reads a property\n * and the spread copies the rest, so either would touch an accessor before any check \u2014 and it is not\n * the spread's job: `...` invokes accessors and silently drops symbol keys.\n */\nfunction assertContextRecord(input: unknown): void {\n if (input === null || typeof input !== 'object' || Array.isArray(input)) throw new TypeError();\n const prototype = Object.getPrototypeOf(input);\n const names = ownNames(input, CONTEXT_SNAPSHOT_FLOOR_V2.items, 0);\n if (prototype !== Object.prototype && prototype !== null) throw new TypeError();\n for (const name of names) { const descriptor = Object.getOwnPropertyDescriptor(input, name); if (!descriptor || !('value' in descriptor)) throw new TypeError(); }\n}\nexport function contextView(input: AnalyzerContextV2): AnalyzerContextV2 {\n assertContextRecord(input);\n const budgets = contextSnapshotBudgets(input.limits);\n const seen = new Map<object, unknown>();\n const view = Object.create(null) as Record<string, unknown>;\n for (const [key, value] of Object.entries({ ...input })) {\n const budget = budgets[key] ?? CONTEXT_SNAPSHOT_FLOOR_V2;\n Object.defineProperty(view, key, {\n value: key === 'limits' ? snapshotLimits(value) : snapshot(value, seen, { nodes: 0, budget }, 0),\n enumerable: true, writable: true, configurable: true,\n });\n }\n return Object.freeze(view) as AnalyzerContextV2;\n}\n\nfunction snapshot(input: unknown, seen: Map<object, unknown>, state: SnapshotState, depth: number): unknown {\n if (typeof input === 'function') throw new TypeError(); if (input === null || typeof input !== 'object') return input;\n if (isParsedSourceDocument(input)) return input;\n const existing = seen.get(input);\n if (existing !== undefined) return existing;\n // The two cumulative budgets stop the walk at the first crossing and cannot know how far past it\n // the document goes, so they publish the bound that fired rather than `maximum + 1`.\n if (depth > state.budget.depth) throw new ContextSnapshotLimitV2(state.budget.depth, state.budget.depth);\n if (state.nodes >= state.budget.objects) throw new ContextSnapshotLimitV2(state.budget.objects, state.budget.objects);\n state.nodes += 1;\n if (input instanceof Map) return snapshotMap(input, seen, state, depth);\n if (Array.isArray(input)) return snapshotArray(input, seen, state, depth);\n return snapshotRecord(input, seen, state, depth);\n}\nfunction snapshotMap(input: ReadonlyMap<unknown, unknown>, seen: Map<object, unknown>, state: SnapshotState, depth: number): ReadonlyMap<unknown, unknown> {\n ownNames(input as object, 0, 1, [Symbol.iterator]);\n // The map's entry count is known before the walk, so the refusal publishes the real collection\n // size and the entries the bound refuses, not the first crossing.\n const size = MAP_SIZE_V2.call(input);\n if (size > state.budget.items) throw new ContextSnapshotLimitV2(size, state.budget.items);\n const target = new Map<unknown, unknown>(); const view = immutableMap(target);\n seen.set(input as object, view);\n Map.prototype.forEach.call(input, (value: unknown, key: unknown) => { target.set(snapshot(key, seen, state, depth + 1), snapshot(value, seen, state, depth + 1)); });\n return view;\n}\nfunction snapshotArray(input: readonly unknown[], seen: Map<object, unknown>, state: SnapshotState, depth: number): readonly unknown[] {\n const length = Object.getOwnPropertyDescriptor(input, 'length');\n if (!length || !('value' in length) || !Number.isSafeInteger(length.value) || length.value < 0) throw new TypeError();\n if (length.value > state.budget.items) throw new ContextSnapshotLimitV2(length.value, state.budget.items);\n const names = ownNames(input, length.value + 1, 0); if (names.length !== length.value + 1 || names.some((name) => name !== 'length' && (!/^(0|[1-9]\\d*)$/.test(name) || Number(name) >= length.value))) throw new TypeError();\n const output = new Array<unknown>(length.value); Object.setPrototypeOf(output, null); seen.set(input as object, output);\n for (let index = 0; index < length.value; index += 1) {\n const descriptor = Object.getOwnPropertyDescriptor(input, String(index));\n if (!descriptor || !('value' in descriptor)) throw new TypeError();\n Object.defineProperty(output, String(index), { value: snapshot(descriptor.value, seen, state, depth + 1), enumerable: descriptor.enumerable, writable: true, configurable: true });\n }\n return Object.freeze(output);\n}\nfunction snapshotLimits(input: unknown): object {\n if (input === null || typeof input !== 'object' || Array.isArray(input)) throw new TypeError();\n const output = Object.create(null) as Record<string, unknown>;\n for (const key of LIMIT_KEYS) {\n const descriptor = Object.getOwnPropertyDescriptor(input, key);\n if (!descriptor || !('value' in descriptor)) throw new TypeError();\n Object.defineProperty(output, key, { value: descriptor.value, enumerable: true, writable: false, configurable: false });\n }\n return Object.freeze(output);\n}\nfunction snapshotRecord(input: object, seen: Map<object, unknown>, state: SnapshotState, depth: number): object {\n const prototype = Object.getPrototypeOf(input);\n const names = ownNames(input, state.budget.items, 0);\n if (prototype !== Object.prototype && prototype !== null) throw new TypeError();\n const output = Object.create(null) as Record<string, unknown>; seen.set(input, output);\n for (const name of names) {\n const descriptor = Object.getOwnPropertyDescriptor(input, name);\n if (!descriptor || !('value' in descriptor)) throw new TypeError();\n Object.defineProperty(output, name, { value: name === 'limits' ? snapshotLimits(descriptor.value) : snapshot(descriptor.value, seen, state, depth + 1), enumerable: true, writable: true, configurable: true });\n }\n return Object.freeze(output);\n}\nfunction immutableMap<K, V>(input: Map<K, V>): ReadonlyMap<K, V> {\n const view = Object.create(null) as ReadonlyMap<K, V> & { set(key: K, value: V): unknown; delete(key: K): boolean; clear(): void };\n Object.defineProperties(view, {\n size: { value: input.size }, get: { value: (key: K) => input.get(key) }, has: { value: (key: K) => input.has(key) },\n entries: { value: () => input.entries() }, keys: { value: () => input.keys() }, values: { value: () => input.values() },\n forEach: { value: (callback: (value: V, key: K, map: ReadonlyMap<K, V>) => void, thisArg?: unknown) => input.forEach((value, key) => callback.call(thisArg, value, key, view)) },\n set: { value: () => view }, delete: { value: () => false }, clear: { value: () => undefined },\n [Symbol.iterator]: { value: () => input.entries() },\n });\n return Object.freeze(view);\n}\nexport function ownNames(input: object, maximum: number, maximumSymbols: number, allowedSymbols: readonly symbol[] | null = []): readonly string[] {\n const names = Object.getOwnPropertyNames(input); if (names.length > maximum) throw new TypeError();\n const symbols = Object.getOwnPropertySymbols(input); if (symbols.length > maximumSymbols) throw new TypeError();\n for (const symbol of symbols) if (allowedSymbols !== null && !allowedSymbols.includes(symbol)) throw new TypeError(); return names;\n}\n", "import type { ScannerLimitsV2 } from '@hub/contracts';\nimport { createDiagnosticId, sortDiagnostics } from '../diagnostics/identity';\nimport { classifyDiagnostic, type AnalysisDiagnosticV2, type DiagnosticCodeV2 } from '../diagnostics/registry';\nimport { isScannerAdmissionSnapshotV2 } from '../admission/snapshot';\nimport { SAFE_FACT_REGISTRY_V2 } from '../facts/safe-fact-registry';\nimport { isParsedSourceDocument } from '../source/source-document-provenance';\nimport type { EdgeRefV2, NodeRefV2, SecurityWorkflowV2 } from '../workflow-v2/security-workflow';\nimport type { ReadonlySourceDocumentV2, SourceMemberRefV2 } from '../source/source-types';\nimport { validateCapabilityCandidate } from './candidate-validator';\nimport { corroboratedCapabilityStatus, type CapabilityOutcomeStatusV2 } from './count-lattice';\nimport { resolveDeclaredRulesV2 } from '../rules-v2/rule-authority';\nimport { PROFILE_MANIFEST_REGISTRY_V2, validateProfileManifest, type ProfileCapabilityV2, type ProfileManifestV2 } from './profile-manifest';\nimport { ContextSnapshotLimitV2, contextView, ownNames, snapshotBound, type SnapshotBoundV2 } from './context-view';\ntype VersionComparatorV2 = Readonly<{ op: 'EQ' | 'LT' | 'LTE' | 'GT' | 'GTE'; version: string }>;\ntype VersionRangeV2 = Readonly<{ clauses: readonly (readonly VersionComparatorV2[])[] }>;\ntype SemanticPathV2 = Readonly<{ pointer: string; valueType: 'ANY' | 'STRING' | 'BOOLEAN' | 'NUMBER' | 'OBJECT' | 'ARRAY'; required: boolean }>;\ntype SemanticEndpointV2 = Readonly<{ path: string; channel: 'DATA' | 'CONTROL' | 'ERROR' | 'MODEL' | 'TOOL' | 'CONTEXT'; direction: 'SOURCE' | 'SINK' | 'SANITIZER'; taint: 'CONFIDENTIALITY' | 'INTEGRITY' | 'BOTH'; scope?: string }>;\ntype ResolvedNodeSemanticsV2 = Readonly<{ semanticId: string; nodeType: string; versionRange: VersionRangeV2; operation: string | null; entry: 'TRIGGER' | 'MANUAL' | 'SUBWORKFLOW' | 'NONE'; parameterPaths: readonly SemanticPathV2[]; authentication: Readonly<{ path: string; noneValues: readonly string[]; authenticatedValues: readonly string[]; unknownValueEffect: 'UNKNOWN' | 'EXPOSED' }> | null; credentialPaths: readonly string[]; destinationPaths: readonly string[]; effects: readonly ('READ_EXTERNAL' | 'WRITE_EXTERNAL' | 'EXECUTE_CODE' | 'EXECUTE_COMMAND' | 'READ_FILE' | 'WRITE_FILE' | 'DATABASE_READ' | 'DATABASE_WRITE' | 'SEND_MESSAGE' | 'CALL_TOOL' | 'START_SUBWORKFLOW')[]; endpoints: readonly SemanticEndpointV2[]; ports: readonly Readonly<{ type: string; index: number; itemMode: 'EACH' | 'ALL' | 'PAIRWISE' | 'UNKNOWN' }>[]; overwritePaths: readonly string[]; errorMode: 'STOP' | 'CONTINUE' | 'OUTPUT' | 'UNKNOWN'; retryMode: 'NONE' | 'BOUNDED' | 'PLATFORM' | 'UNKNOWN'; disabledMode: 'SKIP' | 'UNKNOWN'; provenance: Readonly<{ sourceUrl: string; sourceDigest: string; reviewedAt: string; reviewer: string }> }>;\nexport type AdmittedRuleV2 = Readonly<{ ruleId: string; revision: string; capabilityId: string; effect: 'SCORING' | 'REPORT_ONLY'; severity: 'CRITICAL' | 'HIGH' | 'MEDIUM' | 'LOW' | 'INFO'; confidence: 'HIGH' | 'MEDIUM' | 'LOW'; evidenceSchemaId: string; remediationId: string; cweIds: readonly string[]; owaspAgenticIds: readonly string[]; packDigest: string }>;\nexport type SemanticCatalogueViewV2 = Readonly<{ id: string; version: string; digest: string; resolvedNodeSemantics: ReadonlyMap<string, ResolvedNodeSemanticsV2> }>;\nexport type RuleCatalogueViewV2 = Readonly<{ id: string; version: string; digest: string; rules: ReadonlyMap<string, AdmittedRuleV2> }>;\nexport type SubjectV2 = Readonly<{ kind: 'WORKFLOW' } | { kind: 'NODE'; node: NodeRefV2 } | { kind: 'EDGE'; edge: EdgeRefV2 } | { kind: 'SOURCE'; source: SourceMemberRefV2 }>;\nexport type FindingCandidateV2 = Readonly<{ ruleId: string; evidenceClass: 'CAPABILITY' | 'CONFIGURATION' | 'SUSPICIOUS_SYNTAX' | 'POTENTIAL_DATAFLOW' | 'VERSION_APPLICABILITY'; conclusion: 'OBSERVED' | 'POTENTIAL' | 'UNKNOWN'; applicability: 'APPLICABLE' | 'NOT_APPLICABLE' | 'UNKNOWN'; subject: SubjectV2; factRefs: readonly string[]; traceRefs: readonly string[]; remediationId: string }>;\ntype SafeFactScalarV2 = string | number | boolean | null;\ntype SafeFactValueV2 = SafeFactScalarV2 | readonly SafeFactScalarV2[];\nexport type SafeFactV2 = Readonly<{ factId: string; kind: string; subject: SubjectV2; properties: Readonly<Record<string, SafeFactValueV2>> }>;\ntype TraceStepV2 = Readonly<{ ordinal: number; kind: 'SOURCE' | 'PROPAGATION' | 'SANITIZER' | 'SINK'; subject: SubjectV2; factRefs: readonly string[] }>;\nexport type TraceV2 = Readonly<{ traceId: string; kind: 'CONFIDENTIALITY' | 'INTEGRITY' | 'CONTROL'; steps: readonly TraceStepV2[] }>;\nexport type CapabilityCandidateV2 = Readonly<{ findings: readonly FindingCandidateV2[]; diagnostics: readonly AnalysisDiagnosticV2[]; facts: readonly SafeFactV2[]; traces: readonly TraceV2[]; seen: number; analyzed: number; skipped: number; omitted: number }>;\nexport type CapabilityExecutionV2 = Readonly<{ id: string; version: string; required: boolean; status: CapabilityOutcomeStatusV2; seen: number; analyzed: number; skipped: number; omitted: number; diagnosticIds: readonly string[] }>;\nexport type TargetContextV2 = Readonly<{ n8nVersion?: string; edition: 'COMMUNITY' | 'ENTERPRISE' | 'CLOUD' | 'UNKNOWN'; deployment: 'SELF_HOSTED' | 'CLOUD' | 'UNKNOWN'; role: 'OWNER' | 'ADMIN' | 'MEMBER' | 'UNKNOWN'; taskRunner: 'LEGACY' | 'NATIVE' | 'UNKNOWN'; communityPackages: readonly Readonly<{ name: string; version?: string }>[]; configuration: readonly Readonly<{ key: string; state: 'ENABLED' | 'DISABLED' | 'UNKNOWN' }>[]; contextDigest: string }>;\nexport type AnalyzerContextV2 = Readonly<{ source: ReadonlySourceDocumentV2; workflow: SecurityWorkflowV2; target: TargetContextV2; limits: ScannerLimitsV2; semantics: SemanticCatalogueViewV2; rules: RuleCatalogueViewV2; priorOutcomes: ReadonlyMap<string, CapabilityExecutionV2> }>;\nexport type CapabilitySpecV2 = Readonly<ProfileCapabilityV2 & { run(context: AnalyzerContextV2): CapabilityCandidateV2 }>;\nexport type CapabilityRegistryV2 = ReadonlyMap<string, CapabilitySpecV2>;\nexport type CapabilityScheduleV2 = Readonly<{ executions: readonly CapabilityExecutionV2[]; candidates: readonly CapabilityCandidateV2[]; diagnostics: readonly AnalysisDiagnosticV2[] }>;\nconst SPEC_KEYS = ['id', 'version', 'required', 'dependsOn', 'ruleIds', 'run'] as const;\ntype CounterValues = Readonly<{ seen: number; analyzed: number; skipped: number; omitted: number }>;\ntype MutableExecution = { id: string; version: string; required: boolean; status: CapabilityExecutionV2['status']; seen: number; analyzed: number; skipped: number; omitted: number; diagnosticIds: string[] };\ntype EligibilityUnitScopeV2 = 'SOURCE_DOCUMENT' | 'WORKFLOW' | 'NODE';\n// Keep this parser-owned work contract aligned with the admitted capability registry. Source\n// normalization has one parsed-document unit, node-scoped analyzers inspect the normalized node\n// list, and other workflow-level stages have one unit even when the workflow contains no nodes.\nconst CAPABILITY_ELIGIBILITY_SCOPE_V2: Readonly<Record<string, EligibilityUnitScopeV2>> = Object.freeze({\n 'source-normalization': 'SOURCE_DOCUMENT', 'workflow-insights': 'WORKFLOW', 'structural-policies': 'NODE',\n 'expression-security': 'NODE', 'javascript-security': 'NODE', 'python-security': 'NODE',\n 'graph-semantics': 'NODE', 'taint-confidentiality': 'NODE', 'taint-integrity': 'NODE',\n 'agentic-control': 'NODE', assessment: 'WORKFLOW', 'presentation-facts': 'WORKFLOW',\n});\n\nexport function scheduleCapabilities(context: AnalyzerContextV2, manifest: ProfileManifestV2, registry: CapabilityRegistryV2): CapabilityScheduleV2 {\n const executions: MutableExecution[] = []; const candidates: CapabilityCandidateV2[] = []; const rawDiagnostics: AnalysisDiagnosticV2[] = []; const byId = new Map<string, MutableExecution>();\n const admission = validateProfileManifest(manifest, registry); if (!admission.ok) return closedSchedule(manifest); manifest = admission.manifest;\n const selectedSpecs = snapshotSpecs(manifest, registry);\n // One frozen view serves every capability: the view is deeply frozen and immutable, so a second\n // copy would only repeat the walk. On the D-1 fixtures the copy measured 20.6\u201327.5% of the\n // pipeline across seven shapes (D1-FIX-REVIEW.md), and the beta-default profile runs five\n // capabilities (twelve under beta-hardened) over the same context, so without the cache every\n // capability would pay that share again. It is still built inside the capability loop, so a\n // context the walk refuses fails that capability closed instead of escaping the scheduler.\n let cachedView: AnalyzerContextV2 | undefined;\n for (const capability of manifest.capabilities) {\n const unavailable = capability.dependsOn.find((dependency) => byId.get(dependency)?.status !== 'COMPLETED');\n if (unavailable !== undefined) {\n const execution = failedExecution(capability, 'SKIPPED', { seen: 0, analyzed: 0, skipped: 1, omitted: 0 }, 1);\n executions.push(execution); byId.set(capability.id, execution); rawDiagnostics.push(schedulerDiagnostic('DEPENDENCY_UNAVAILABLE', capability)); continue;\n }\n try {\n const declared = resolveDeclaredRulesV2(capability.ruleIds, context.rules.rules, capability);\n if (!declared.ok) {\n // A declared rule id the catalogue does not admit is refused, never silently filtered out\n // of the registry this capability would run with. The consequence follows the case the\n // authority resolved: a scoring unknown fails the run closed (FAILED, and the registry row\n // is INDETERMINATE/ineligible so no assessment can be published), while a report-only\n // unknown degrades its owner and lets everything else still score.\n const refused = failedExecution(capability, declared.case === 'SCORING' ? 'FAILED' : 'DEGRADED', { seen: 0, analyzed: 0, skipped: 0, omitted: 0 }, 1);\n executions.push(refused); byId.set(capability.id, refused);\n rawDiagnostics.push(schedulerDiagnostic(declared.diagnosticCode, capability));\n continue;\n }\n const spec = selectedSpecs.get(capability.id); if (!spec) throw new TypeError();\n const runnerContext = cachedView ?? contextView(context);\n cachedView = runnerContext;\n const eligibleUnits = capabilityEligibleUnits(capability.id, runnerContext);\n const output: unknown = spec.run(runnerContext);\n if (!isScannerAdmissionSnapshotV2<CapabilityCandidateV2>(output)) throw new TypeError();\n const validation = validateCapabilityCandidate(output, spec, { facts: SAFE_FACT_REGISTRY_V2, rules: declared.rules }, context.limits, eligibleUnits);\n if (!validation.ok) {\n const status = capability.required ? 'FAILED' : 'DEGRADED';\n const execution = failedExecution(capability, status, validation.counters, 1);\n executions.push(execution); byId.set(capability.id, execution);\n const bound = validation.limit === undefined ? undefined : snapshotBound(validation.limit.observed, validation.limit.maximum);\n rawDiagnostics.push(capabilityFailureDiagnostic(capability, bound === undefined ? { limit: validation.reason === 'LIMIT_EXCEEDED' } : { limit: true, bound }));\n continue;\n }\n candidates.push(validation.candidate); const execution = completedExecution(capability, validation.candidate);\n executions.push(execution); byId.set(capability.id, execution);\n } catch (error) {\n const status = capability.required ? 'FAILED' : 'DEGRADED';\n const execution = failedExecution(capability, status, { seen: 0, analyzed: 0, skipped: 0, omitted: 0 }, 1);\n executions.push(execution); byId.set(capability.id, execution);\n const bound = error instanceof ContextSnapshotLimitV2 ? snapshotBound(error.observed, error.maximum) : undefined;\n rawDiagnostics.push(capabilityFailureDiagnostic(capability, bound === undefined ? { limit: false } : { limit: true, bound }));\n }\n }\n return finalizeSchedule(executions, candidates, rawDiagnostics, manifest.capabilities.map(({ id }) => id));\n}\n\nfunction closedSchedule(manifest: ProfileManifestV2): CapabilityScheduleV2 { const capabilities = safeFailureCapabilities(manifest); const executions = capabilities.map((capability) => failedExecution(capability, capability.required ? 'FAILED' : 'DEGRADED', { seen: 0, analyzed: 0, skipped: 0, omitted: 0 }, 1)); return finalizeSchedule(executions, [], capabilities.map((capability) => schedulerDiagnostic(capability.required ? 'REQUIRED_CAPABILITY_FAILED' : 'POLICY_EXECUTION_FAILED', capability)), capabilities.map(({ id }) => id)); }\nfunction capabilityEligibleUnits(capabilityId: string, context: AnalyzerContextV2): number {\n const scope = CAPABILITY_ELIGIBILITY_SCOPE_V2[capabilityId];\n if (scope === undefined || !isParsedSourceDocument(context.source) || !Array.isArray(context.workflow?.nodes)) throw new TypeError();\n return scope === 'NODE' ? context.workflow.nodes.length : 1;\n}\nfunction safeFailureCapabilities(input: unknown): readonly ProfileCapabilityV2[] { try { if (input === null || typeof input !== 'object' || Array.isArray(input)) throw new TypeError(); const id = safeManifestString(input, 'id'); const version = safeManifestString(input, 'version'); if (id === undefined || version === undefined) return []; return PROFILE_MANIFEST_REGISTRY_V2.find((profile) => profile.id === id && profile.version === version)?.capabilities ?? []; } catch { return []; } }\nfunction safeManifestString(input: object, key: 'id' | 'version'): string | undefined { const descriptor = Object.getOwnPropertyDescriptor(input, key); return descriptor && 'value' in descriptor && typeof descriptor.value === 'string' ? descriptor.value : undefined; }\nfunction finalizeSchedule(executions: readonly MutableExecution[], candidates: readonly CapabilityCandidateV2[], rawDiagnostics: readonly AnalysisDiagnosticV2[], capabilityOrder: readonly string[]): CapabilityScheduleV2 { const diagnostics = sortDiagnostics(rawDiagnostics, capabilityOrder); const idsByCapability = new Map<string, string[]>(); for (const diagnostic of diagnostics) (idsByCapability.get(diagnostic.capabilityId) ?? (idsByCapability.set(diagnostic.capabilityId, []), idsByCapability.get(diagnostic.capabilityId)!)).push(diagnostic.id); const frozenExecutions = Object.freeze(executions.map((execution) => Object.freeze({ ...execution, diagnosticIds: Object.freeze(idsByCapability.get(execution.id) ?? []) }))); return Object.freeze({ executions: frozenExecutions, candidates: Object.freeze(candidates), diagnostics: Object.freeze(diagnostics) }); }\n\nfunction snapshotSpecs(manifest: ProfileManifestV2, registry: CapabilityRegistryV2): ReadonlyMap<string, CapabilitySpecV2 | undefined> {\n const snapshots = new Map<string, CapabilitySpecV2 | undefined>();\n for (const capability of manifest.capabilities) {\n try {\n const entry = registryEntry(registry, capability.id);\n snapshots.set(capability.id, entry === undefined ? undefined : snapshotSpec(entry, capability));\n } catch { snapshots.set(capability.id, undefined); }\n }\n return snapshots;\n}\nfunction snapshotSpec(input: unknown, capability: ProfileCapabilityV2): CapabilitySpecV2 {\n const value = record(input, SPEC_KEYS, true);\n if (value.id !== capability.id || value.version !== capability.version || value.required !== capability.required\n || !sameList(value.dependsOn, capability.dependsOn) || !sameList(value.ruleIds, capability.ruleIds) || typeof value.run !== 'function') throw new TypeError();\n return Object.freeze({ ...capability, dependsOn: Object.freeze([...capability.dependsOn]), ruleIds: Object.freeze([...capability.ruleIds]), run: value.run as CapabilitySpecV2['run'] });\n}\n\nfunction registryEntry(registry: CapabilityRegistryV2, id: string): CapabilitySpecV2 | undefined {\n if (!(registry instanceof Map) || Object.getPrototypeOf(registry) !== Map.prototype) throw new TypeError();\n ownNames(registry, 0, 0);\n return Map.prototype.get.call(registry, id) as CapabilitySpecV2 | undefined;\n}\nfunction completedExecution(capability: ProfileCapabilityV2, candidate: CapabilityCandidateV2): MutableExecution {\n return { id: capability.id, version: capability.version, required: capability.required, status: corroboratedCapabilityStatus('COMPLETED', candidate), seen: candidate.seen, analyzed: candidate.analyzed, skipped: candidate.skipped, omitted: candidate.omitted, diagnosticIds: [] };\n}\nfunction failedExecution(capability: ProfileCapabilityV2, status: 'SKIPPED' | 'DEGRADED' | 'FAILED', counters: CounterValues, omission: number): MutableExecution {\n return { id: capability.id, version: capability.version, required: capability.required, status, seen: counters.seen, analyzed: counters.analyzed, skipped: counters.skipped, omitted: safeAdd(counters.omitted, omission), diagnosticIds: [] };\n}\nfunction schedulerDiagnostic(code: DiagnosticCodeV2, capability: ProfileCapabilityV2, bound?: SnapshotBoundV2): AnalysisDiagnosticV2 {\n const classification = classifyDiagnostic(code, capability.required);\n const identity = { code, capabilityId: capability.id, ...classification, ...(bound === undefined ? {} : { observed: bound.observed, maximum: bound.maximum, omitted: bound.omitted }) };\n return Object.freeze({ ...identity, id: createDiagnosticId(identity) });\n}\n/**\n * The diagnostic of a capability that could not publish its result. D-1: both failure branches used\n * to publish `REQUIRED_CAPABILITY_FAILED`/`POLICY_EXECUTION_FAILED` whatever the cause, so an\n * operator could not tell a candidate the validator refused for exceeding a limit from a capability\n * that broke, and a context view the scheduler refused for size from either. The cause now selects\n * the code: a limit refusal is published as the registry's limit code (LIMIT category) and carries\n * the bound's numbers (`observed`/`maximum`/`omitted`), whether the refusal came from the context\n * walk or from `validateCapabilityCandidate` \u2014 the validator requires exactly those numbers of\n * capability-emitted LIMIT diagnostics (`candidate-validator.ts`), so its own refusals report them\n * too. The remaining vocabulary is unchanged, because the diagnostic record is a closed shape pinned by\n * `contracts/scanner-v2-result.ts`: no free-form reason can be added to it without a contract and\n * diagnostic-registry change.\n */\nfunction capabilityFailureDiagnostic(capability: ProfileCapabilityV2, cause: Readonly<{ limit: boolean; bound?: SnapshotBoundV2 }>): AnalysisDiagnosticV2 {\n const code: DiagnosticCodeV2 = cause.limit\n ? capability.required ? 'REQUIRED_LIMIT_EXCEEDED' : 'OPTIONAL_LIMIT_EXCEEDED'\n : capability.required ? 'REQUIRED_CAPABILITY_FAILED' : 'POLICY_EXECUTION_FAILED';\n return schedulerDiagnostic(code, capability, cause.bound);\n}\nfunction record(input: unknown, allowed: readonly string[], allowNullPrototype = false): Record<string, unknown> {\n if (input === null || typeof input !== 'object' || Array.isArray(input)) throw new TypeError();\n const prototype = Object.getPrototypeOf(input); if (prototype !== Object.prototype && (!allowNullPrototype || prototype !== null)) throw new TypeError();\n const names = ownNames(input, allowed.length, 0); const value = Object.create(null) as Record<string, unknown>;\n for (const name of names) { if (!allowed.includes(name)) throw new TypeError(); const descriptor = Object.getOwnPropertyDescriptor(input, name); if (!descriptor || !('value' in descriptor)) throw new TypeError(); value[name] = descriptor.value; }\n for (const name of allowed) if (!Object.prototype.hasOwnProperty.call(value, name)) throw new TypeError(); return value;\n}\nfunction safeAdd(left: number, right: number): number { return left > Number.MAX_SAFE_INTEGER - right ? Number.MAX_SAFE_INTEGER : left + right; }\nfunction sameList(left: unknown, right: readonly string[]): boolean {\n if (!Array.isArray(left) || Object.getPrototypeOf(left) !== Array.prototype) return false;\n const length = Object.getOwnPropertyDescriptor(left, 'length');\n if (!length || !('value' in length) || length.value !== right.length) return false;\n const names = ownNames(left, right.length + 1, 0); if (names.length !== right.length + 1) return false;\n for (let index = 0; index < right.length; index += 1) { const descriptor = Object.getOwnPropertyDescriptor(left, String(index)); if (!descriptor || !('value' in descriptor) || descriptor.value !== right[index]) return false; }\n return true;\n}\n", "import type { ScanFinding, ScanPolicy } from '../policy/policy';\nimport { createBetaDefaultPolicies } from '../policies/beta-policies';\nimport { analyzeWorkflowInsights } from '../scan-insights';\nimport type { AnalysisDiagnosticV2 } from '../diagnostics/registry';\nimport { toNativeWorkflow } from './adapter-workflow';\nimport { candidateFinding, createDiagnostic, emptyCandidate, makeFact, policyFailureDiagnostic, unknownRuleDiagnostic, admitCandidate } from './adapter-evidence';\nimport { scheduleCapabilities, type AnalyzerContextV2, type CapabilityCandidateV2, type CapabilityRegistryV2, type CapabilityScheduleV2, type CapabilitySpecV2, type FindingCandidateV2, type SafeFactV2 } from './scheduler';\nimport { BETA_DEFAULT_PROFILE_MANIFEST, type ProfileCapabilityV2, type ProfileManifestV2 } from './profile-manifest';\nimport type { SecurityNodeV2 } from '../workflow-v2/security-workflow';\n\nexport type BetaDefaultAdapterOptions = Readonly<{ policies?: readonly ScanPolicy[]; maxFindings?: number }>;\n\nexport function createBetaDefaultCapabilityRegistry(options: BetaDefaultAdapterOptions = {}): CapabilityRegistryV2 {\n const policies = options.policies ?? createBetaDefaultPolicies();\n const specs = BETA_DEFAULT_PROFILE_MANIFEST.capabilities.map((capability): readonly [string, CapabilitySpecV2] => [capability.id, {\n ...capability,\n run: capability.id === 'source-normalization' ? (context) => sourceCandidate(context) : capability.id === 'workflow-insights' ? (context) => insightCandidate(context) : capability.id === 'structural-policies' ? (context) => structuralCandidate(context, capability, policies, options.maxFindings) : () => emptyCandidate(1),\n }]);\n return new Map(specs);\n}\n\nexport function scanCapabilitiesV2(context: AnalyzerContextV2, profile: ProfileManifestV2 = BETA_DEFAULT_PROFILE_MANIFEST, registry: CapabilityRegistryV2 = createBetaDefaultCapabilityRegistry()): CapabilityScheduleV2 {\n return scheduleCapabilities(context, profile, registry);\n}\n\nfunction sourceCandidate(context: AnalyzerContextV2): CapabilityCandidateV2 {\n const fact = makeFact('workflow.fingerprint.v1', { kind: 'WORKFLOW' }, { value: context.source.rawSha256 });\n return admitCandidate({ findings: [], diagnostics: [], facts: [fact], traces: [], seen: 1, analyzed: 1, skipped: 0, omitted: 0 });\n}\n\nfunction insightCandidate(context: AnalyzerContextV2): CapabilityCandidateV2 {\n const workflow = toNativeWorkflow(context); const insights = analyzeWorkflowInsights(workflow); const facts: SafeFactV2[] = [];\n const subject = { kind: 'WORKFLOW' as const };\n facts.push(makeFact('workflow.summary.v1', subject, { connectionCount: insights.workflow.connectionCount }));\n facts.push(makeFact('workflow.function.v1', subject, { basicPurpose: insights.functionSummary.basicPurpose, triggerDescription: insights.functionSummary.triggerDescription, dataFlowSummary: insights.functionSummary.dataFlowSummary, businessCategory: insights.functionSummary.businessCategory, confidence: insights.functionSummary.confidence }));\n for (const integration of insights.integrations) facts.push(makeFact('integration.v1', subject, { service: integration.service, usage: integration.usage, nodeTypes: integration.nodeTypes, nodeCount: integration.nodeCount, riskNotes: integration.riskNotes }));\n return admitCandidate({ findings: [], diagnostics: [], facts, traces: [], seen: 1, analyzed: 1, skipped: 0, omitted: 0 });\n}\n\nfunction structuralCandidate(context: AnalyzerContextV2, capability: ProfileCapabilityV2, policies: readonly ScanPolicy[], maxFindings?: number): CapabilityCandidateV2 {\n const workflow = toNativeWorkflow(context); const facts: SafeFactV2[] = []; const findings: FindingCandidateV2[] = []; const diagnostics = []; let omitted = 0;\n for (const policy of policies) {\n let produced: readonly ScanFinding[];\n try { produced = policy.evaluate(workflow); } catch { diagnostics.push(policyFailureDiagnostic(capability)); omitted += 1; continue; }\n for (const finding of produced) {\n const node = findNode(context.workflow.nodes, finding.location.nodeId, finding.location.nodeName);\n if (!node) { diagnostics.push(unknownRuleDiagnostic(capability)); omitted += 1; continue; }\n const candidate = candidateFinding(finding, node, context, capability, facts);\n if (candidate) findings.push(candidate); else { diagnostics.push(unknownRuleDiagnostic(capability)); omitted += 1; }\n }\n }\n const cap = maxFindings === undefined ? findings.length : Math.max(0, Math.min(maxFindings, findings.length));\n if (cap < findings.length) { omitted += findings.length - cap; diagnostics.push(createDiagnostic('REQUIRED_LIMIT_EXCEEDED', capability.id, capability.required, undefined, { observed: findings.length, maximum: cap, omitted: findings.length - cap })); }\n const kept = findings.slice(0, cap); const refs = new Set(kept.flatMap((finding) => finding.factRefs));\n return admitCandidate({ findings: kept, diagnostics: uniqueDiagnostics(diagnostics), facts: facts.filter((fact) => refs.has(fact.factId)), traces: [], seen: workflow.nodes.length, analyzed: workflow.nodes.length, skipped: 0, omitted });\n}\n\nfunction findNode(nodes: readonly SecurityNodeV2[], id: string | undefined, name: string | undefined): SecurityNodeV2 | undefined {\n if (id === undefined && name === undefined) return undefined;\n for (let index = 0; index < nodes.length; index += 1) {\n const node = nodes[index]; if (node && (id === undefined || node.ref.explicitId === id) && (name === undefined || node.ref.name === name)) return node;\n }\n for (let index = 0; index < nodes.length; index += 1) {\n const node = nodes[index]; if (node && ((id !== undefined && node.ref.explicitId === id) || (name !== undefined && node.ref.name === name))) return node;\n }\n return undefined;\n}\n\nfunction uniqueDiagnostics(diagnostics: readonly AnalysisDiagnosticV2[]): AnalysisDiagnosticV2[] {\n const seen = new Set<string>(); return diagnostics.filter((diagnostic) => seen.has(diagnostic.id) ? false : (seen.add(diagnostic.id), true));\n}\n\nexport const BETA_DEFAULT_CAPABILITY_REGISTRY = createBetaDefaultCapabilityRegistry();\n", "// Generated by scripts/generate-diagnostic-registry.mjs; DO NOT EDIT.\n// diagnostic-registry:version=diagnostic-registry-v1\n// diagnostic-registry:source=openspec/changes/world-class-scanner-cli/diagnostic-and-exit-registry.md\n// diagnostic-registry:rows=28\n// diagnostic-registry:digest=f66f90ea2cca06ddccefeff924fcb8abe672050fcee861ceb9b4e66551ddfc3c\n// Regenerate with `npm run generate:diagnostic-registry` after editing the registry table.\n// The result validator reads this instead of keeping its own copy of the vocabulary.\nexport type DiagnosticCodeV2 =\n | 'SOURCE_SPAN_UNAVAILABLE' | 'DUPLICATE_FINDING_COLLAPSED' | 'UNCLASSIFIED_CONNECTION_TYPE'\n | 'DUPLICATE_METADATA_KEY' | 'OPTIONAL_LIMIT_EXCEEDED' | 'UNSUPPORTED_CODE_NODE_VARIANT'\n | 'JAVASCRIPT_PARSE_FAILED' | 'JAVASCRIPT_SOURCE_UNAVAILABLE' | 'PYTHON_SOURCE_UNAVAILABLE'\n | 'PYTHON_PARSE_FAILED' | 'PYTHON_PARSER_UNAVAILABLE' | 'EXPRESSION_PARSE_FAILED'\n | 'GRAPH_ENTRY_UNRESOLVED' | 'GRAPH_WORK_LIMIT_EXCEEDED' | 'GRAPH_ANALYSIS_DEGRADED'\n | 'SEMANTIC_CATALOGUE_MISS' | 'GENERIC_NODE_UNMODELED_CAPABILITY' | 'POLICY_EXECUTION_FAILED'\n | 'DEPENDENCY_UNAVAILABLE' | 'UNKNOWN_REPORT_ONLY_RULE' | 'REQUIRED_LIMIT_EXCEEDED'\n | 'DUPLICATE_SECURITY_KEY' | 'MALFORMED_NODE_PARAMETERS' | 'MALFORMED_CONNECTION_INDEX'\n | 'REQUIRED_CAPABILITY_FAILED' | 'UNKNOWN_SCORING_RULE' | 'COMPATIBILITY_PROJECTION_LOSS'\n | 'REQUIRED_STAGE_FAILURE';\n\nexport type DiagnosticCategoryV2 = 'LIMIT' | 'SOURCE' | 'PARSER' | 'POLICY' | 'GRAPH' | 'CATALOGUE' | 'COMPATIBILITY';\nexport type DiagnosticAggregateEffectModeV2 = 'DEGRADED' | 'INDETERMINATE' | 'BY_CAPABILITY';\nexport type DiagnosticAssessmentEligibilityModeV2 = boolean | 'BY_CAPABILITY';\n\n/** [category, aggregate effect, assessment eligibility], one entry per registered code. */\nexport const DIAGNOSTIC_REGISTRY_V2: Readonly<Record<DiagnosticCodeV2, readonly [DiagnosticCategoryV2, DiagnosticAggregateEffectModeV2, DiagnosticAssessmentEligibilityModeV2]>> = Object.freeze({\n SOURCE_SPAN_UNAVAILABLE: ['SOURCE', 'DEGRADED', true],\n DUPLICATE_FINDING_COLLAPSED: ['POLICY', 'DEGRADED', true],\n UNCLASSIFIED_CONNECTION_TYPE: ['GRAPH', 'DEGRADED', true],\n DUPLICATE_METADATA_KEY: ['PARSER', 'DEGRADED', true],\n OPTIONAL_LIMIT_EXCEEDED: ['LIMIT', 'DEGRADED', true],\n UNSUPPORTED_CODE_NODE_VARIANT: ['PARSER', 'BY_CAPABILITY', 'BY_CAPABILITY'],\n JAVASCRIPT_PARSE_FAILED: ['PARSER', 'BY_CAPABILITY', 'BY_CAPABILITY'],\n JAVASCRIPT_SOURCE_UNAVAILABLE: ['SOURCE', 'BY_CAPABILITY', 'BY_CAPABILITY'],\n PYTHON_SOURCE_UNAVAILABLE: ['SOURCE', 'BY_CAPABILITY', 'BY_CAPABILITY'],\n PYTHON_PARSE_FAILED: ['PARSER', 'BY_CAPABILITY', 'BY_CAPABILITY'],\n PYTHON_PARSER_UNAVAILABLE: ['PARSER', 'BY_CAPABILITY', 'BY_CAPABILITY'],\n EXPRESSION_PARSE_FAILED: ['PARSER', 'BY_CAPABILITY', 'BY_CAPABILITY'],\n GRAPH_ENTRY_UNRESOLVED: ['GRAPH', 'BY_CAPABILITY', 'BY_CAPABILITY'],\n GRAPH_WORK_LIMIT_EXCEEDED: ['GRAPH', 'BY_CAPABILITY', 'BY_CAPABILITY'],\n GRAPH_ANALYSIS_DEGRADED: ['GRAPH', 'BY_CAPABILITY', 'BY_CAPABILITY'],\n SEMANTIC_CATALOGUE_MISS: ['CATALOGUE', 'BY_CAPABILITY', 'BY_CAPABILITY'],\n GENERIC_NODE_UNMODELED_CAPABILITY: ['CATALOGUE', 'DEGRADED', true],\n POLICY_EXECUTION_FAILED: ['POLICY', 'BY_CAPABILITY', 'BY_CAPABILITY'],\n DEPENDENCY_UNAVAILABLE: ['POLICY', 'BY_CAPABILITY', 'BY_CAPABILITY'],\n UNKNOWN_REPORT_ONLY_RULE: ['POLICY', 'DEGRADED', true],\n REQUIRED_LIMIT_EXCEEDED: ['LIMIT', 'INDETERMINATE', false],\n DUPLICATE_SECURITY_KEY: ['PARSER', 'INDETERMINATE', false],\n MALFORMED_NODE_PARAMETERS: ['PARSER', 'INDETERMINATE', false],\n MALFORMED_CONNECTION_INDEX: ['GRAPH', 'INDETERMINATE', false],\n REQUIRED_CAPABILITY_FAILED: ['POLICY', 'INDETERMINATE', false],\n UNKNOWN_SCORING_RULE: ['POLICY', 'INDETERMINATE', false],\n COMPATIBILITY_PROJECTION_LOSS: ['COMPATIBILITY', 'INDETERMINATE', false],\n REQUIRED_STAGE_FAILURE: ['POLICY', 'INDETERMINATE', false],\n});\n\n/** The codes whose effect and eligibility the owning capability's requiredness decides. */\nexport const BY_CAPABILITY_DIAGNOSTIC_CODES_V2: Readonly<Partial<Record<DiagnosticCodeV2, true>>> = Object.freeze({\n 'UNSUPPORTED_CODE_NODE_VARIANT': true,\n 'JAVASCRIPT_PARSE_FAILED': true,\n 'JAVASCRIPT_SOURCE_UNAVAILABLE': true,\n 'PYTHON_SOURCE_UNAVAILABLE': true,\n 'PYTHON_PARSE_FAILED': true,\n 'PYTHON_PARSER_UNAVAILABLE': true,\n 'EXPRESSION_PARSE_FAILED': true,\n 'GRAPH_ENTRY_UNRESOLVED': true,\n 'GRAPH_WORK_LIMIT_EXCEEDED': true,\n 'GRAPH_ANALYSIS_DEGRADED': true,\n 'SEMANTIC_CATALOGUE_MISS': true,\n 'POLICY_EXECUTION_FAILED': true,\n 'DEPENDENCY_UNAVAILABLE': true,\n});\n", "import type { EdgeRefV2, NodeRefV2, SourceMemberRefV2, SubjectV2 } from './scanner-v2-source';\nimport type { AnalysisDiagnosticV2, CapabilityExecutionV2, FindingV2, SafeFactV2, TraceV2 } from './scanner-v2-evidence';\nimport { BY_CAPABILITY_DIAGNOSTIC_CODES_V2, DIAGNOSTIC_REGISTRY_V2, type DiagnosticCodeV2 } from './scanner-v2-diagnostics.generated';\n\nexport type TargetContextV2 = { n8nVersion?: string; edition: 'COMMUNITY' | 'ENTERPRISE' | 'CLOUD' | 'UNKNOWN'; deployment: 'SELF_HOSTED' | 'CLOUD' | 'UNKNOWN'; role: 'OWNER' | 'ADMIN' | 'MEMBER' | 'UNKNOWN'; taskRunner: 'LEGACY' | 'NATIVE' | 'UNKNOWN'; communityPackages: readonly { name: string; version?: string }[]; configuration: readonly { key: string; state: 'ENABLED' | 'DISABLED' | 'UNKNOWN' }[]; contextDigest: string };\nexport type LimitUsageV2 = { id: string; maximum: number; examined: number; omitted: number; exhausted: boolean };\nexport type ScannerResultV2 = {\n schemaVersion: 'scanner-result-v2';\n engine: { id: 'secureflow-scanner'; version: string; buildDigest: string };\n input: { rawSha256: string; semanticSha256: string; ambiguitySha256: string; ambiguityCount: number; utf8Bytes: number };\n profile: { id: string; version: string };\n ruleset: { id: string; version: string; digest: string; signatureStatus: 'VERIFIED' | 'UNVERIFIED' };\n semantics: { id: string; version: string; digest: string };\n target: TargetContextV2;\n limits: { schemaVersion: 'scanner-limits-v2'; digest: string; usage: LimitUsageV2[] };\n analysis: { status: 'COMPLETE' | 'DEGRADED' | 'INDETERMINATE'; capabilities: CapabilityExecutionV2[]; diagnostics: AnalysisDiagnosticV2[] };\n workflow: { name: string | null; nodeCount: number; rawNodeCount: number; annotationNodeCount: number; triggerCount: number; actionCount: number; integrationCount: number; edgeCount: number; resolvedEdgeCount: number; payloadBytes: number; complexity: 'LOW' | 'MEDIUM' | 'HIGH'; isSubWorkflow: boolean };\n facts: SafeFactV2[]; traces: TraceV2[]; findings: FindingV2[];\n assessment: null | { score: number; grade: 'LOW' | 'MEDIUM' | 'HIGH' | 'CRITICAL'; scoringPolicyVersion: string; basisFindingIds: string[]; excludedReportOnlyFindingIds: string[]; excludedUncertainFindingIds: string[]; excludedNotApplicableFindingIds: string[]; unknownEvidenceCount: number };\n stats: { rejectedCandidates: number; collapsedCandidates: number; omittedFindings: number; serializedBytes: number };\n};\nexport type ScannerResultV2Validation = { ok: true; result: ScannerResultV2 } | { ok: false; errors: string[] };\n\nconst TOP = ['schemaVersion', 'engine', 'input', 'profile', 'ruleset', 'semantics', 'target', 'limits', 'analysis', 'workflow', 'facts', 'traces', 'findings', 'assessment', 'stats'] as const;\nconst DIGEST = /^[0-9a-f]{64}$/;\nconst POINTER = /^(?:|(?:\\/(?:[^~/]|~0|~1)*)+)$/;\nconst SECRET = /(?:api[ _-]*key|password|secret|credential|authorization|cookie|bearer|token)\\s*[:=]|\\b(?:sk[-_][\\w-]+|AKIA[0-9A-Z]{16}|eyJ[\\w-]{12,}\\.[\\w-]{8,})\\b/i;\nconst UNSAFE = /(?:https?|ftp):\\/\\/|(?:^|[/\\\\])\\.\\.(?:[/\\\\]|$)|(?:^[/\\\\]|^[A-Za-z]:[/\\\\])|\\b(?:exception|stack trace|traceback|error:| at [A-Za-z]:[/\\\\])/i;\nconst FACT_KINDS = new Set(['workflow.summary.v1', 'workflow.function.v1', 'workflow.risk-summary.v1', 'workflow.fingerprint.v1', 'integration.v1', 'node.capability.v2', 'node.configuration.v2', 'code.indicator.v2', 'dataflow.summary.v2', 'destination.v2', 'ingress.v2', 'advisory.applicability.v2']);\nconst FACT_PROPERTIES: Record<string, readonly string[]> = { 'workflow.summary.v1': ['connectionCount'], 'workflow.function.v1': ['basicPurpose', 'triggerDescription', 'dataFlowSummary', 'businessCategory', 'confidence'], 'workflow.risk-summary.v1': ['topRisks', 'dataExposure', 'complexityDrivers'], 'workflow.fingerprint.v1': ['value'], 'integration.v1': ['service', 'usage', 'nodeTypes', 'nodeCount', 'riskNotes'], 'node.capability.v2': ['nodeType', 'nodePackage', 'namespaceClass', 'capabilities', 'toolCount', 'contextCount'], 'node.configuration.v2': ['observation', 'header', 'literalValue', 'parameterPath', 'secretKind', 'indicator', 'hasLiteralValue'], 'code.indicator.v2': ['language', 'indicator', 'member', 'start', 'end', 'parseState'], 'dataflow.summary.v2': ['flowKind', 'sink', 'parameterPath', 'referenceRoot', 'propertyPath', 'propertyPathComplete', 'sourceNodeId', 'sourceNodeName', 'humanGatePresent', 'humanGateDominates', 'taintLabels'], 'destination.v2': ['parameterPath', 'scheme', 'hostname', 'authorityState', 'valueMode'], 'ingress.v2': ['authentication', 'authenticationState', 'legacyAuthenticated'], 'advisory.applicability.v2': ['advisoryId', 'applicability', 'reviewState', 'matchedPrerequisites', 'unknownPrerequisites'] };\nconst CAPABILITY_ORDER = ['source-normalization', 'workflow-insights', 'structural-policies', 'expression-security', 'javascript-security', 'python-security', 'graph-semantics', 'taint-confidentiality', 'taint-integrity', 'agentic-control', 'assessment', 'presentation-facts'] as const;\n\ntype PlainRecord = Record<string, unknown>;\nconst isRecord = (v: unknown): v is PlainRecord => { try { return v !== null && typeof v === 'object' && !Array.isArray(v) && Object.getPrototypeOf(v) === Object.prototype; } catch { return false; } };\nfunction object(v: unknown, keys: readonly string[], required: readonly string[], errors: string[], path: string): PlainRecord | undefined {\n if (!isRecord(v)) { errors.push(`${path} must be an object`); return undefined; }\n try { if (Object.getOwnPropertySymbols(v).length) { errors.push(`${path} has symbols`); return undefined; } const names = Object.getOwnPropertyNames(v); const out = Object.create(Object.prototype) as PlainRecord;\n for (const name of names) { const d = Object.getOwnPropertyDescriptor(v, name); if (!d || !('value' in d)) { errors.push(`${path}.${name} must be data`); return undefined; } if (!keys.includes(name)) errors.push(`${path}.${name} is unknown`); Object.defineProperty(out, name, { value: d.value, writable: true, enumerable: true, configurable: true }); }\n for (const name of required) if (!names.includes(name)) errors.push(`${path}.${name} is missing`); return out;\n } catch { errors.push(`${path} cannot be inspected`); return undefined; }\n}\nfunction array(v: unknown, errors: string[], path: string, max = 100_000): unknown[] {\n if (!Array.isArray(v)) { errors.push(`${path} must be an array`); return []; }\n try { const length = v.length; if (!Number.isSafeInteger(length) || length < 0 || length > max) { errors.push(`${path} has an unsafe shape`); return []; } if (Object.getPrototypeOf(v) !== Array.prototype) { errors.push(`${path} must be an array`); return []; }\n const names = Object.getOwnPropertyNames(v); if (Object.getOwnPropertySymbols(v).length || names.length !== length + 1) { errors.push(`${path} has an unsafe shape`); return []; } const out = new Array<unknown>(length);\n for (const name of names) { if (name === 'length') continue; if (!/^(?:0|[1-9]\\d*)$/.test(name) || Number(name) >= length) { errors.push(`${path} is sparse`); return []; } const d = Object.getOwnPropertyDescriptor(v, name); if (!d || !('value' in d)) { errors.push(`${path}[${name}] must be data`); return []; } out[Number(name)] = d.value; } return out;\n } catch { errors.push(`${path} cannot be inspected`); return []; }\n}\nfunction text(v: unknown, errors: string[], path: string, unsafe = true, max = 4096): v is string { if (typeof v !== 'string' || v.length > max || v.includes('\\0') || /[\\u0001-\\u0008\\u000b\\u000c\\u000e-\\u001f\\u007f]/.test(v) || /[\\ud800-\\udfff]/.test(v) && !/^[\\u0000-\\ud7ff\\ue000-\\uffff]*(?:[\\ud800-\\udbff][\\udc00-\\udfff][\\u0000-\\ud7ff\\ue000-\\uffff]*)*$/.test(v) || unsafe && (SECRET.test(v) || UNSAFE.test(v))) { errors.push(`${path} has unsafe text`); return false; } return true; }\nfunction digest(v: unknown, errors: string[], path: string): v is string { if (typeof v !== 'string' || !DIGEST.test(v)) { errors.push(`${path} must be lowercase sha256`); return false; } return true; }\nfunction integer(v: unknown, errors: string[], path: string, min = 0): v is number { if (typeof v !== 'number' || !Number.isSafeInteger(v) || v < min) { errors.push(`${path} must be a safe integer`); return false; } return true; }\nfunction en(v: unknown, values: readonly string[], errors: string[], path: string): boolean { if (typeof v !== 'string' || !values.includes(v)) { errors.push(`${path} has an invalid enum`); return false; } return true; }\nfunction refs(v: unknown, errors: string[], path: string): string[] { const out = array(v, errors, path); const seen = new Set<string>(); const result: string[] = []; for (const [i, item] of out.entries()) { if (digest(item, errors, `${path}[${i}]`) && seen.has(item)) errors.push(`${path} has a duplicate reference`); if (typeof item === 'string') { seen.add(item); result.push(item); } } return result; }\nfunction position(v: unknown, errors: string[], path: string): PlainRecord | undefined { const o = object(v, ['line', 'column', 'utf16Offset', 'utf8ByteOffset'], ['line', 'column', 'utf16Offset', 'utf8ByteOffset'], errors, path); if (!o) return; integer(o.line, errors, `${path}.line`, 1); integer(o.column, errors, `${path}.column`, 1); integer(o.utf16Offset, errors, `${path}.utf16Offset`); integer(o.utf8ByteOffset, errors, `${path}.utf8ByteOffset`); return o; }\nfunction source(v: unknown, errors: string[], path: string): void { const o = object(v, ['pointer', 'occurrencePath', 'astNodeId', 'span'], ['pointer', 'occurrencePath', 'astNodeId', 'span'], errors, path); if (!o) return; if (text(o.pointer, errors, `${path}.pointer`, false, 2048) && !POINTER.test(o.pointer as string)) errors.push(`${path}.pointer is not RFC6901`); const p = array(o.occurrencePath, errors, `${path}.occurrencePath`); p.forEach((x, i) => integer(x, errors, `${path}.occurrencePath[${i}]`)); digest(o.astNodeId, errors, `${path}.astNodeId`); if (o.span !== null) { const s = object(o.span, ['start', 'end'], ['start', 'end'], errors, `${path}.span`); if (s) { const a = position(s.start, errors, `${path}.span.start`); const b = position(s.end, errors, `${path}.span.end`); if (a && b && typeof a.utf16Offset === 'number' && typeof b.utf16Offset === 'number' && typeof a.utf8ByteOffset === 'number' && typeof b.utf8ByteOffset === 'number' && typeof a.line === 'number' && typeof b.line === 'number' && typeof a.column === 'number' && typeof b.column === 'number' && (b.utf16Offset <= a.utf16Offset || b.utf8ByteOffset <= a.utf8ByteOffset || b.line < a.line || b.line === a.line && b.column <= a.column)) errors.push(`${path}.span is empty or reversed`); } } }\nfunction node(v: unknown, errors: string[], path: string): void { const o = object(v, ['ordinal', 'source', 'explicitId', 'name', 'identityDigest'], ['ordinal', 'source', 'identityDigest'], errors, path); if (!o) return; integer(o.ordinal, errors, `${path}.ordinal`); source(o.source, errors, `${path}.source`); if ('explicitId' in o) text(o.explicitId, errors, `${path}.explicitId`); if ('name' in o) text(o.name, errors, `${path}.name`); digest(o.identityDigest, errors, `${path}.identityDigest`); }\nfunction edge(v: unknown, errors: string[], path: string): void { const o = object(v, ['ordinal', 'sourceNode', 'targetNode', 'sourceLabel', 'targetLabel', 'connectionType', 'sourcePort', 'targetPort', 'source', 'resolution'], ['ordinal', 'sourceLabel', 'connectionType', 'sourcePort', 'targetPort', 'source', 'resolution'], errors, path); if (!o) return; integer(o.ordinal, errors, `${path}.ordinal`); if ('sourceNode' in o) node(o.sourceNode, errors, `${path}.sourceNode`); if ('targetNode' in o) node(o.targetNode, errors, `${path}.targetNode`); text(o.sourceLabel, errors, `${path}.sourceLabel`); if ('targetLabel' in o) text(o.targetLabel, errors, `${path}.targetLabel`); text(o.connectionType, errors, `${path}.connectionType`); integer(o.sourcePort, errors, `${path}.sourcePort`); integer(o.targetPort, errors, `${path}.targetPort`); source(o.source, errors, `${path}.source`); en(o.resolution, ['RESOLVED', 'AMBIGUOUS', 'UNRESOLVED'], errors, `${path}.resolution`); }\nfunction subject(v: unknown, errors: string[], path: string): void { const o = object(v, ['kind', 'node', 'edge', 'source'], ['kind'], errors, path); if (!o) return; if (o.kind === 'WORKFLOW') { if (Object.getOwnPropertyNames(o).length !== 1) errors.push(`${path} has unknown subject fields`); } else if (o.kind === 'NODE') { const n = object(o, ['kind', 'node'], ['kind', 'node'], errors, path); if (n) node(n.node, errors, `${path}.node`); } else if (o.kind === 'EDGE') { const e = object(o, ['kind', 'edge'], ['kind', 'edge'], errors, path); if (e) edge(e.edge, errors, `${path}.edge`); } else if (o.kind === 'SOURCE') { const s = object(o, ['kind', 'source'], ['kind', 'source'], errors, path); if (s) source(s.source, errors, `${path}.source`); } else errors.push(`${path}.kind has an invalid enum`); }\nfunction propertyObject(v: unknown, errors: string[], path: string): PlainRecord | undefined { if (!isRecord(v)) { errors.push(`${path} must be an object`); return undefined; } try { if (Object.getOwnPropertySymbols(v).length) { errors.push(`${path} has symbols`); return undefined; } const out = Object.create(Object.prototype) as PlainRecord; for (const key of Object.getOwnPropertyNames(v)) { const d = Object.getOwnPropertyDescriptor(v, key); if (!d || !('value' in d)) { errors.push(`${path}.${key} must be data`); return undefined; } Object.defineProperty(out, key, { value: d.value, writable: true, enumerable: true, configurable: true }); } return out; } catch { errors.push(`${path} cannot be inspected`); return undefined; } }\nfunction propertyText(value: unknown, key: string, errors: string[], path: string): value is string {\n const pointerProperty = key === 'parameterPath' || key === 'propertyPath';\n if (!text(value, errors, path, !pointerProperty)) return false;\n if (pointerProperty && !POINTER.test(value)) { errors.push(`${path} is not RFC6901`); return false; }\n return true;\n}\nfunction fact(v: unknown, errors: string[], path: string): string | undefined { const o = object(v, ['factId', 'kind', 'subject', 'properties'], ['factId', 'kind', 'subject', 'properties'], errors, path); if (!o) return; digest(o.factId, errors, `${path}.factId`); if (typeof o.kind !== 'string' || !FACT_KINDS.has(o.kind)) errors.push(`${path}.kind is not registered`); else text(o.kind, errors, `${path}.kind`, false); subject(o.subject, errors, `${path}.subject`); const p = propertyObject(o.properties, errors, `${path}.properties`); if (!p) return typeof o.factId === 'string' ? o.factId : undefined; for (const key of Object.getOwnPropertyNames(p)) { if (!/^[A-Za-z][A-Za-z0-9_.-]{0,127}$/.test(key)) errors.push(`${path}.properties.${key} is invalid`); if (typeof o.kind === 'string' && FACT_PROPERTIES[o.kind] && !FACT_PROPERTIES[o.kind].includes(key)) errors.push(`${path}.properties.${key} is not registered`); const value = p[key]; if (Array.isArray(value)) { const a = array(value, errors, `${path}.properties.${key}`, 1000); a.forEach((x, i) => { if (!(x === null || typeof x === 'boolean' || typeof x === 'number' && Number.isFinite(x) && Number.isSafeInteger(x) || typeof x === 'string' && text(x, errors, `${path}.properties.${key}[${i}]`))) errors.push(`${path}.properties.${key}[${i}] is unsafe`); }); } else if (!(value === null || typeof value === 'boolean' || typeof value === 'number' && Number.isFinite(value) && Number.isSafeInteger(value) || typeof value === 'string' && propertyText(value, key, errors, `${path}.properties.${key}`))) errors.push(`${path}.properties.${key} is unsafe`); } return typeof o.factId === 'string' ? o.factId : undefined; }\nfunction trace(v: unknown, facts: Set<string>, errors: string[], path: string): string | undefined { const o = object(v, ['traceId', 'kind', 'steps'], ['traceId', 'kind', 'steps'], errors, path); if (!o) return; digest(o.traceId, errors, `${path}.traceId`); en(o.kind, ['CONFIDENTIALITY', 'INTEGRITY', 'CONTROL'], errors, `${path}.kind`); const steps = array(o.steps, errors, `${path}.steps`, 10000); const ordinals = new Set<number>(); steps.forEach((item, i) => { const s = object(item, ['ordinal', 'kind', 'subject', 'factRefs'], ['ordinal', 'kind', 'subject', 'factRefs'], errors, `${path}.steps[${i}]`); if (!s) return; integer(s.ordinal, errors, `${path}.steps[${i}].ordinal`); if (typeof s.ordinal === 'number' && ordinals.has(s.ordinal)) errors.push(`${path}.steps has duplicate ordinal`); if (typeof s.ordinal === 'number') ordinals.add(s.ordinal); en(s.kind, ['SOURCE', 'PROPAGATION', 'SANITIZER', 'SINK'], errors, `${path}.steps[${i}].kind`); subject(s.subject, errors, `${path}.steps[${i}].subject`); for (const ref of refs(s.factRefs, errors, `${path}.steps[${i}].factRefs`)) if (!facts.has(ref)) errors.push(`${path}.steps[${i}] has dangling fact reference`); }); return typeof o.traceId === 'string' ? o.traceId : undefined; }\nfunction finding(v: unknown, facts: Set<string>, traces: Set<string>, errors: string[], path: string): string | undefined { const o = object(v, ['findingId', 'ruleId', 'ruleRevision', 'effect', 'severity', 'confidence', 'evidenceClass', 'conclusion', 'applicability', 'subject', 'factRefs', 'traceRefs', 'remediationId'], ['findingId', 'ruleId', 'ruleRevision', 'effect', 'severity', 'confidence', 'evidenceClass', 'conclusion', 'applicability', 'subject', 'factRefs', 'traceRefs', 'remediationId'], errors, path); if (!o) return; digest(o.findingId, errors, `${path}.findingId`); for (const k of ['ruleId', 'ruleRevision', 'remediationId']) text(o[k], errors, `${path}.${k}`); en(o.effect, ['SCORING', 'REPORT_ONLY'], errors, `${path}.effect`); en(o.severity, ['CRITICAL', 'HIGH', 'MEDIUM', 'LOW', 'INFO'], errors, `${path}.severity`); en(o.confidence, ['HIGH', 'MEDIUM', 'LOW'], errors, `${path}.confidence`); en(o.evidenceClass, ['CAPABILITY', 'CONFIGURATION', 'SUSPICIOUS_SYNTAX', 'POTENTIAL_DATAFLOW', 'VERSION_APPLICABILITY'], errors, `${path}.evidenceClass`); en(o.conclusion, ['OBSERVED', 'POTENTIAL', 'UNKNOWN'], errors, `${path}.conclusion`); en(o.applicability, ['APPLICABLE', 'NOT_APPLICABLE', 'UNKNOWN'], errors, `${path}.applicability`); subject(o.subject, errors, `${path}.subject`); for (const ref of refs(o.factRefs, errors, `${path}.factRefs`)) if (!facts.has(ref)) errors.push(`${path} has dangling fact reference`); for (const ref of refs(o.traceRefs, errors, `${path}.traceRefs`)) if (!traces.has(ref)) errors.push(`${path} has dangling trace reference`); return typeof o.findingId === 'string' ? o.findingId : undefined; }\ntype DiagnosticInfo = { id?: string; capabilityId?: string; aggregateEffect?: string; omitted?: number };\nfunction diagnostic(v: unknown, capabilities: Set<string>, errors: string[], path: string): DiagnosticInfo { const o = object(v, ['id', 'code', 'category', 'capabilityId', 'aggregateEffect', 'assessmentEligible', 'location', 'observed', 'maximum', 'omitted'], ['id', 'code', 'category', 'capabilityId', 'aggregateEffect', 'assessmentEligible'], errors, path); if (!o) return {}; digest(o.id, errors, `${path}.id`); if (!en(o.code, Object.keys(DIAGNOSTIC_REGISTRY_V2), errors, `${path}.code`)) return {}; const expected = DIAGNOSTIC_REGISTRY_V2[o.code as DiagnosticCodeV2]; en(o.category, ['LIMIT', 'SOURCE', 'PARSER', 'POLICY', 'GRAPH', 'CATALOGUE', 'COMPATIBILITY'], errors, `${path}.category`); text(o.capabilityId, errors, `${path}.capabilityId`); if (typeof o.capabilityId !== 'string' || !capabilities.has(o.capabilityId)) errors.push(`${path}.capabilityId is dangling`); en(o.aggregateEffect, ['NONE', 'DEGRADED', 'INDETERMINATE'], errors, `${path}.aggregateEffect`); if (typeof o.assessmentEligible !== 'boolean') errors.push(`${path}.assessmentEligible must be boolean`); if (BY_CAPABILITY_DIAGNOSTIC_CODES_V2[o.code as DiagnosticCodeV2] === true) { if (o.category !== expected[0] || !['DEGRADED', 'INDETERMINATE'].includes(String(o.aggregateEffect)) || o.assessmentEligible !== (o.aggregateEffect === 'DEGRADED')) errors.push(`${path} has invalid registry effect`); } else if (o.category !== expected[0] || o.aggregateEffect !== expected[1] || o.assessmentEligible !== expected[2]) errors.push(`${path} disagrees with diagnostic registry`); if ('location' in o) source(o.location, errors, `${path}.location`); for (const k of ['observed', 'maximum', 'omitted']) if (k in o) integer(o[k], errors, `${path}.${k}`); return { id: typeof o.id === 'string' ? o.id : undefined, capabilityId: typeof o.capabilityId === 'string' ? o.capabilityId : undefined, aggregateEffect: typeof o.aggregateEffect === 'string' ? o.aggregateEffect : undefined, omitted: typeof o.omitted === 'number' ? o.omitted : undefined }; }\ntype CapabilityInfo = { id?: string; required?: boolean; status?: string; skipped?: number; omitted?: number; diagnosticIds: string[] };\n/** Exact `total > sum(parts)`, subtracting one part at a time so no intermediate can round past 2^53. */\nfunction exceeds(total: number, parts: readonly [number, number, number]): boolean { let remaining = total; for (const part of parts) { if (remaining <= part) return false; remaining -= part; } return true; }\n/**\n * The count arithmetic of the completeness lattice, restated because `contracts/` cannot import the\n * scanner core; `count-lattice-contract-pin.test.ts` pins this restatement to the producer over every\n * count set. A row cannot analyze units it never accounted for (`UNSEEN_ANALYSIS`) and cannot leave\n * observed units unaccounted for (`UNACCOUNTED_SEEN`): either way a `COMPLETED` row publishes a\n * completeness its own record does not support. The counters are deliberately not required to\n * partition `seen`, because analyzers count in their own units, so only these two directions - which\n * no run can produce - are refused.\n */\nfunction countConsistency(counts: readonly (number | undefined)[], path: string, errors: string[]): void {\n const [seen, analyzed, skipped, omitted] = counts;\n if (seen === undefined || analyzed === undefined || skipped === undefined || omitted === undefined) return;\n if (exceeds(analyzed, [seen, skipped, omitted])) errors.push(`${path} counters record UNSEEN_ANALYSIS: analyzed exceeds seen + skipped + omitted`);\n else if (exceeds(seen, [analyzed, skipped, omitted])) errors.push(`${path} counters record UNACCOUNTED_SEEN: seen exceeds analyzed + skipped + omitted`);\n}\nfunction capability(v: unknown, errors: string[], path: string): CapabilityInfo { const o = object(v, ['id', 'version', 'required', 'status', 'seen', 'analyzed', 'skipped', 'omitted', 'diagnosticIds'], ['id', 'version', 'required', 'status', 'seen', 'analyzed', 'skipped', 'omitted', 'diagnosticIds'], errors, path); if (!o) return { diagnosticIds: [] }; text(o.id, errors, `${path}.id`); text(o.version, errors, `${path}.version`); if (typeof o.required !== 'boolean') errors.push(`${path}.required must be boolean`); en(o.status, ['COMPLETED', 'SKIPPED', 'DEGRADED', 'FAILED'], errors, `${path}.status`); const counts: Array<number | undefined> = []; for (const k of ['seen', 'analyzed', 'skipped', 'omitted']) { const value = o[k]; counts.push(integer(value, errors, `${path}.${k}`) ? value : undefined); } countConsistency(counts, path, errors); const diagnosticIds = refs(o.diagnosticIds, errors, `${path}.diagnosticIds`); return { id: typeof o.id === 'string' ? o.id : undefined, required: typeof o.required === 'boolean' ? o.required : undefined, status: typeof o.status === 'string' ? o.status : undefined, skipped: typeof o.skipped === 'number' ? o.skipped : undefined, omitted: typeof o.omitted === 'number' ? o.omitted : undefined, diagnosticIds }; }\nfunction target(v: unknown, errors: string[]): void { const o = object(v, ['n8nVersion', 'edition', 'deployment', 'role', 'taskRunner', 'communityPackages', 'configuration', 'contextDigest'], ['edition', 'deployment', 'role', 'taskRunner', 'communityPackages', 'configuration', 'contextDigest'], errors, 'target'); if (!o) return; if ('n8nVersion' in o) text(o.n8nVersion, errors, 'target.n8nVersion'); en(o.edition, ['COMMUNITY', 'ENTERPRISE', 'CLOUD', 'UNKNOWN'], errors, 'target.edition'); en(o.deployment, ['SELF_HOSTED', 'CLOUD', 'UNKNOWN'], errors, 'target.deployment'); en(o.role, ['OWNER', 'ADMIN', 'MEMBER', 'UNKNOWN'], errors, 'target.role'); en(o.taskRunner, ['LEGACY', 'NATIVE', 'UNKNOWN'], errors, 'target.taskRunner'); digest(o.contextDigest, errors, 'target.contextDigest'); const packs = array(o.communityPackages, errors, 'target.communityPackages'); const names = new Set<string>(); packs.forEach((v, i) => { const p = object(v, ['name', 'version'], ['name'], errors, `target.communityPackages[${i}]`); if (p) { text(p.name, errors, `target.communityPackages[${i}].name`); if ('version' in p) text(p.version, errors, `target.communityPackages[${i}].version`); if (typeof p.name === 'string' && names.has(p.name)) errors.push('target.communityPackages has duplicates'); if (typeof p.name === 'string') names.add(p.name); } }); const cfg = array(o.configuration, errors, 'target.configuration'); const configKeys = new Set<string>(); cfg.forEach((v, i) => { const p = object(v, ['key', 'state'], ['key', 'state'], errors, `target.configuration[${i}]`); if (p) { text(p.key, errors, `target.configuration[${i}].key`); en(p.state, ['ENABLED', 'DISABLED', 'UNKNOWN'], errors, `target.configuration[${i}].state`); if (typeof p.key === 'string' && configKeys.has(p.key)) errors.push('target.configuration has duplicates'); if (typeof p.key === 'string') configKeys.add(p.key); } }); }\nfunction assessment(v: unknown, findings: Set<string>, errors: string[]): void { if (v === null) return; const o = object(v, ['score', 'grade', 'scoringPolicyVersion', 'basisFindingIds', 'excludedReportOnlyFindingIds', 'excludedUncertainFindingIds', 'excludedNotApplicableFindingIds', 'unknownEvidenceCount'], ['score', 'grade', 'scoringPolicyVersion', 'basisFindingIds', 'excludedReportOnlyFindingIds', 'excludedUncertainFindingIds', 'excludedNotApplicableFindingIds', 'unknownEvidenceCount'], errors, 'assessment'); if (!o) return; integer(o.score, errors, 'assessment.score'); if (typeof o.score === 'number' && o.score > 100) errors.push('assessment.score must be at most 100'); if (typeof o.score === 'number') { const grade = o.score >= 80 ? 'CRITICAL' : o.score >= 55 ? 'HIGH' : o.score >= 25 ? 'MEDIUM' : 'LOW'; if (o.grade !== grade) errors.push('assessment.grade disagrees with score'); } en(o.grade, ['LOW', 'MEDIUM', 'HIGH', 'CRITICAL'], errors, 'assessment.grade'); text(o.scoringPolicyVersion, errors, 'assessment.scoringPolicyVersion'); const all = new Set<string>(); let uncertainCount = 0; for (const k of ['basisFindingIds', 'excludedReportOnlyFindingIds', 'excludedUncertainFindingIds', 'excludedNotApplicableFindingIds']) { const ids = refs(o[k], errors, `assessment.${k}`); if (k === 'excludedUncertainFindingIds') uncertainCount = ids.length; for (const id of ids) { if (!findings.has(id)) errors.push(`assessment.${k} has dangling finding reference`); if (all.has(id)) errors.push('assessment finding classes overlap'); all.add(id); } } integer(o.unknownEvidenceCount, errors, 'assessment.unknownEvidenceCount'); if (typeof o.unknownEvidenceCount === 'number' && o.unknownEvidenceCount !== uncertainCount) errors.push('assessment.unknownEvidenceCount is inconsistent'); if (all.size !== findings.size) errors.push('assessment does not classify every finding'); }\n/**\n * A capability row may claim `COMPLETED` only when its counters record no unperformed units, and the\n * published analysis status must be the strongest effect those rows and the diagnostics impose:\n * a required row that dropped omitted units, failed, or was skipped makes the result indeterminate,\n * while any other recorded skip or omission degrades it.\n */\nfunction analysisStatus(status: unknown, capabilities: readonly CapabilityInfo[], diagnostics: readonly DiagnosticInfo[], resultOmitted: boolean, errors: string[]): void {\n let expected: 'COMPLETE' | 'DEGRADED' | 'INDETERMINATE' = 'COMPLETE';\n capabilities.forEach((item, index) => {\n // `skipped` and `omitted` are the units the row recorded but did not perform.\n const unperformed = (item.skipped ?? 0) > 0 || (item.omitted ?? 0) > 0;\n const unsafeTruncation = item.required === true && (item.omitted ?? 0) > 0;\n if (item.status === 'COMPLETED' && unperformed) errors.push(`analysis.capabilities[${index}] claims COMPLETED while recording skipped or omitted units`);\n if (item.required === true && (item.status === 'FAILED' || item.status === 'SKIPPED')) expected = 'INDETERMINATE';\n else if (unsafeTruncation) expected = 'INDETERMINATE';\n else if (expected === 'COMPLETE' && (item.status !== 'COMPLETED' || unperformed)) expected = 'DEGRADED';\n });\n for (const item of diagnostics) { if (item.aggregateEffect === 'INDETERMINATE') expected = 'INDETERMINATE'; else if (expected === 'COMPLETE' && item.aggregateEffect === 'DEGRADED') expected = 'DEGRADED'; }\n if (resultOmitted && expected === 'COMPLETE') expected = 'DEGRADED';\n if (status !== expected) errors.push('analysis.status disagrees with capability/diagnostic effects');\n}\nfunction resultOmitted(limitsOmitted: boolean, stats: PlainRecord | undefined, diagnostics: readonly DiagnosticInfo[]): boolean { if (limitsOmitted || typeof stats?.omittedFindings === 'number' && stats.omittedFindings > 0) return true; return diagnostics.some((item) => typeof item.omitted === 'number' && item.omitted > 0); }\nconst MAX_CLONE_DEPTH = 128;\nconst MAX_CLONE_NODES = 1_000_000;\nconst MAX_CLONE_PROPERTIES = 5_000_000;\nfunction cloneGraph(root: unknown): unknown {\n const active = new Set<object>(); const copies = new Map<object, PlainRecord | unknown[]>();\n let nodes = 0; let properties = 0;\n const clone = (value: unknown, depth: number): unknown => {\n if (value === null) return null;\n if (typeof value !== 'object') {\n if (typeof value === 'string' || typeof value === 'number' && Number.isFinite(value) || typeof value === 'boolean') return value;\n throw new Error('unsafe scalar');\n }\n if (depth > MAX_CLONE_DEPTH) throw new Error('clone depth exceeded');\n if (copies.has(value)) {\n if (active.has(value)) throw new Error('cyclic graph');\n return copies.get(value);\n }\n if (++nodes > MAX_CLONE_NODES) throw new Error('clone node limit exceeded');\n active.add(value);\n try {\n const isArray = Array.isArray(value);\n if (Object.getPrototypeOf(value) !== (isArray ? Array.prototype : Object.prototype)) throw new Error('unsafe prototype');\n if (Object.getOwnPropertySymbols(value).length) throw new Error('symbols are not supported');\n const names = Object.getOwnPropertyNames(value); properties += names.length;\n if (properties > MAX_CLONE_PROPERTIES) throw new Error('clone property limit exceeded');\n if (isArray) {\n const lengthDescriptor = Object.getOwnPropertyDescriptor(value, 'length');\n if (!lengthDescriptor || !('value' in lengthDescriptor) || !Number.isSafeInteger(lengthDescriptor.value) || lengthDescriptor.value < 0 || lengthDescriptor.value > 100_000 || names.length !== lengthDescriptor.value + 1) throw new Error('unsafe array shape');\n const out = new Array<unknown>(lengthDescriptor.value); copies.set(value, out);\n for (const name of names) {\n if (name === 'length') continue;\n if (!/^(?:0|[1-9]\\d*)$/.test(name) || Number(name) >= lengthDescriptor.value) throw new Error('unsafe array index');\n const descriptor = Object.getOwnPropertyDescriptor(value, name);\n if (!descriptor || !('value' in descriptor)) throw new Error('accessor is not supported');\n Object.defineProperty(out, name, { value: clone(descriptor.value, depth + 1), writable: true, enumerable: true, configurable: true });\n }\n return Object.freeze(out);\n }\n const out = Object.create(Object.prototype) as PlainRecord; copies.set(value, out);\n for (const name of names) {\n const descriptor = Object.getOwnPropertyDescriptor(value, name);\n if (!descriptor || !('value' in descriptor)) throw new Error('accessor is not supported');\n Object.defineProperty(out, name, { value: clone(descriptor.value, depth + 1), writable: true, enumerable: true, configurable: true });\n }\n return Object.freeze(out);\n } finally { active.delete(value); }\n };\n return clone(root, 0);\n}\nexport function validateScannerResultV2(candidate: unknown): ScannerResultV2Validation {\n const errors: string[] = []; let snapshot: unknown; try { snapshot = cloneGraph(candidate); } catch { return { ok: false, errors: ['result cannot be safely copied'] }; } const root = object(snapshot, TOP, TOP, errors, 'result'); if (!root) return { ok: false, errors };\n if (root.schemaVersion !== 'scanner-result-v2') errors.push('result.schemaVersion is unsupported');\n const e = object(root.engine, ['id', 'version', 'buildDigest'], ['id', 'version', 'buildDigest'], errors, 'engine'); if (e) { if (e.id !== 'secureflow-scanner') errors.push('engine.id is unsupported'); text(e.version, errors, 'engine.version'); digest(e.buildDigest, errors, 'engine.buildDigest'); }\n const input = object(root.input, ['rawSha256', 'semanticSha256', 'ambiguitySha256', 'ambiguityCount', 'utf8Bytes'], ['rawSha256', 'semanticSha256', 'ambiguitySha256', 'ambiguityCount', 'utf8Bytes'], errors, 'input'); if (input) { digest(input.rawSha256, errors, 'input.rawSha256'); digest(input.semanticSha256, errors, 'input.semanticSha256'); digest(input.ambiguitySha256, errors, 'input.ambiguitySha256'); integer(input.ambiguityCount, errors, 'input.ambiguityCount'); integer(input.utf8Bytes, errors, 'input.utf8Bytes'); }\n for (const k of ['profile', 'ruleset', 'semantics'] as const) { const o = object(root[k], k === 'profile' ? ['id', 'version'] : ['id', 'version', 'digest', ...(k === 'ruleset' ? ['signatureStatus'] : [])], ['id', 'version', ...(k === 'profile' ? [] : ['digest']), ...(k === 'ruleset' ? ['signatureStatus'] : [])], errors, k); if (o) { text(o.id, errors, `${k}.id`); text(o.version, errors, `${k}.version`); if (k !== 'profile') digest(o.digest, errors, `${k}.digest`); if (k === 'ruleset') en(o.signatureStatus, ['VERIFIED', 'UNVERIFIED'], errors, 'ruleset.signatureStatus'); } }\n target(root.target, errors);\n const lim = object(root.limits, ['schemaVersion', 'digest', 'usage'], ['schemaVersion', 'digest', 'usage'], errors, 'limits'); let limitsOmitted = false; if (lim) { if (lim.schemaVersion !== 'scanner-limits-v2') errors.push('limits.schemaVersion is unsupported'); digest(lim.digest, errors, 'limits.digest'); const ids = new Set<string>(); array(lim.usage, errors, 'limits.usage').forEach((v, i) => { const u = object(v, ['id', 'maximum', 'examined', 'omitted', 'exhausted'], ['id', 'maximum', 'examined', 'omitted', 'exhausted'], errors, `limits.usage[${i}]`); if (u) { text(u.id, errors, `limits.usage[${i}].id`); integer(u.maximum, errors, `limits.usage[${i}].maximum`); integer(u.examined, errors, `limits.usage[${i}].examined`); integer(u.omitted, errors, `limits.usage[${i}].omitted`); if (typeof u.omitted === 'number' && u.omitted > 0) limitsOmitted = true; if (typeof u.maximum === 'number' && typeof u.examined === 'number' && u.examined < u.maximum && u.exhausted === true) errors.push('limits.usage exhausted before maximum'); if (typeof u.id === 'string' && ids.has(u.id)) errors.push('limits.usage has duplicate id'); if (typeof u.id === 'string') ids.add(u.id); if (typeof u.exhausted !== 'boolean') errors.push(`limits.usage[${i}].exhausted must be boolean`); } }); }\n const stats = object(root.stats, ['rejectedCandidates', 'collapsedCandidates', 'omittedFindings', 'serializedBytes'], ['rejectedCandidates', 'collapsedCandidates', 'omittedFindings', 'serializedBytes'], errors, 'stats'); if (stats) for (const k of ['rejectedCandidates', 'collapsedCandidates', 'omittedFindings', 'serializedBytes']) integer(stats[k], errors, `stats.${k}`);\n const facts = new Set<string>(); const factIds = new Set<string>(); array(root.facts, errors, 'facts').forEach((v, i) => { const id = fact(v, errors, `facts[${i}]`); if (id && factIds.has(id)) errors.push('facts has duplicate factId'); if (id) { factIds.add(id); facts.add(id); } });\n const traces = new Set<string>(); const traceIds = new Set<string>(); array(root.traces, errors, 'traces').forEach((v, i) => { const id = trace(v, facts, errors, `traces[${i}]`); if (id && traceIds.has(id)) errors.push('traces has duplicate traceId'); if (id) { traceIds.add(id); traces.add(id); } });\n const findings = new Set<string>(); const findingIds = new Set<string>(); array(root.findings, errors, 'findings').forEach((v, i) => { const id = finding(v, facts, traces, errors, `findings[${i}]`); if (id && findingIds.has(id)) errors.push('findings has duplicate findingId'); if (id) { findingIds.add(id); findings.add(id); } });\n const analysis = object(root.analysis, ['status', 'capabilities', 'diagnostics'], ['status', 'capabilities', 'diagnostics'], errors, 'analysis');\n if (analysis) {\n en(analysis.status, ['COMPLETE', 'DEGRADED', 'INDETERMINATE'], errors, 'analysis.status'); const caps = array(analysis.capabilities, errors, 'analysis.capabilities'); const capIds = new Set<string>(); let lastOrder = -1; const capInfos: CapabilityInfo[] = []; const ownership = new Map<string, string[]>();\n caps.forEach((v, i) => { const x = capability(v, errors, `analysis.capabilities[${i}]`); capInfos.push(x); if (x.id) { if (capIds.has(x.id)) errors.push('analysis.capabilities has duplicate id'); const order = CAPABILITY_ORDER.indexOf(x.id as typeof CAPABILITY_ORDER[number]); if (order < 0) errors.push(`analysis.capabilities[${i}].id is not registered`); else if (order <= lastOrder) errors.push('analysis.capabilities are out of registry order'); else lastOrder = order; capIds.add(x.id); for (const id of x.diagnosticIds) ownership.set(id, [...(ownership.get(id) ?? []), x.id]); } });\n const ds = array(analysis.diagnostics, errors, 'analysis.diagnostics'); const diagInfos: DiagnosticInfo[] = []; const diagIds = new Set<string>(); const diagOwners = new Map<string, string>(); ds.forEach((v, i) => { const info = diagnostic(v, capIds, errors, `analysis.diagnostics[${i}]`); diagInfos.push(info); if (info.id && diagIds.has(info.id)) errors.push('analysis.diagnostics has duplicate id'); if (info.id) { diagIds.add(info.id); if (info.capabilityId) diagOwners.set(info.id, info.capabilityId); } });\n for (const [id, owners] of ownership) { if (!diagIds.has(id)) errors.push('capability diagnostic reference is dangling'); if (owners.length !== 1) errors.push('diagnostic has multiple capability owners'); else if (diagOwners.get(id) !== owners[0]) errors.push('diagnostic ownership disagrees with capabilityId'); }\n for (const id of diagIds) if (!ownership.has(id)) errors.push('diagnostic is unreferenced by capabilities');\n /**\n * A diagnostic that names the units it omitted is the capability's own record of unperformed work, so\n * the row that owns it has to record the same loss. Counters claiming nothing was omitted while their\n * diagnostic records truncation is the reachable form of silent truncation, and it is the one\n * counter/diagnostic pairing no run can produce.\n */\n const omittedByCapability = new Map<string, number>();\n for (const info of capInfos) if (info.id !== undefined && info.omitted !== undefined) omittedByCapability.set(info.id, info.omitted);\n diagInfos.forEach((info, index) => { if (info.capabilityId !== undefined && (info.omitted ?? 0) > 0 && omittedByCapability.get(info.capabilityId) === 0) errors.push(`analysis.diagnostics[${index}] counters record UNRECORDED_OMISSION: omitted exceeds the owning capability omitted count`); });\n analysisStatus(analysis.status, capInfos, diagInfos, resultOmitted(limitsOmitted, stats, diagInfos), errors); if (analysis.status === 'INDETERMINATE' && root.assessment !== null) errors.push('indeterminate analysis must have null assessment'); if (analysis.status === 'COMPLETE' && root.assessment === null) errors.push('complete analysis requires assessment');\n }\n const workflow = object(root.workflow, ['name', 'nodeCount', 'rawNodeCount', 'annotationNodeCount', 'triggerCount', 'actionCount', 'integrationCount', 'edgeCount', 'resolvedEdgeCount', 'payloadBytes', 'complexity', 'isSubWorkflow'], ['name', 'nodeCount', 'rawNodeCount', 'annotationNodeCount', 'triggerCount', 'actionCount', 'integrationCount', 'edgeCount', 'resolvedEdgeCount', 'payloadBytes', 'complexity', 'isSubWorkflow'], errors, 'workflow'); if (workflow) { if (workflow.name !== null) text(workflow.name, errors, 'workflow.name'); for (const k of ['nodeCount', 'rawNodeCount', 'annotationNodeCount', 'triggerCount', 'actionCount', 'integrationCount', 'edgeCount', 'resolvedEdgeCount', 'payloadBytes']) integer(workflow[k], errors, `workflow.${k}`); en(workflow.complexity, ['LOW', 'MEDIUM', 'HIGH'], errors, 'workflow.complexity'); if (typeof workflow.isSubWorkflow !== 'boolean') errors.push('workflow.isSubWorkflow must be boolean'); }\n assessment(root.assessment, findings, errors);\n if (errors.length) return { ok: false, errors }; return { ok: true, result: snapshot as ScannerResultV2 };\n}\nexport type { AnalysisDiagnosticV2, CapabilityExecutionV2, EdgeRefV2, FindingV2, NodeRefV2, SafeFactV2, SourceMemberRefV2, SubjectV2 };", "const encoder = new TextEncoder();\n\n/** Encode secureflow-canonical-json-v1 as deterministic UTF-8 bytes. */\nexport function canonicalBytesV1(value: unknown): Uint8Array {\n return encoder.encode(encodeValue(value, new Set<object>()));\n}\n\nfunction encodeValue(value: unknown, seen: Set<object>): string {\n if (value === null) return 'null';\n switch (typeof value) {\n case 'string': return encodeString(value);\n case 'boolean': return value ? 'true' : 'false';\n case 'number':\n if (!Number.isFinite(value)) throw new TypeError('Invalid canonical JSON number');\n return JSON.stringify(Object.is(value, -0) ? 0 : value) as string;\n case 'object': break;\n default: throw new TypeError('Invalid canonical JSON value');\n }\n if (seen.has(value)) throw new TypeError('Cyclic canonical JSON value');\n seen.add(value);\n try {\n return Array.isArray(value) ? encodeArray(value, seen) : encodeObject(value, seen);\n } finally {\n seen.delete(value);\n }\n}\n\nfunction encodeArray(value: readonly unknown[], seen: Set<object>): string {\n if (Object.getPrototypeOf(value) !== Array.prototype) throw new TypeError('Non-plain canonical JSON array');\n const names = ownNames(value);\n const length = dataDescriptor(value, 'length');\n if (typeof length !== 'number' || !Number.isSafeInteger(length) || length < 0) throw new TypeError('Invalid array length');\n if (names.length !== length + 1 || names.some((name) => name !== 'length' && !isArrayIndex(name, length))) {\n throw new TypeError('Unsafe array properties');\n }\n const items: string[] = [];\n for (let index = 0; index < length; index += 1) {\n const descriptor = Object.getOwnPropertyDescriptor(value, String(index));\n if (!descriptor || !('value' in descriptor)) throw new TypeError('Sparse canonical JSON array');\n items.push(encodeValue(descriptor.value, seen));\n }\n return `[${items.join(',')}]`;\n}\n\nfunction encodeObject(value: object, seen: Set<object>): string {\n let prototype: object | null;\n try { prototype = Object.getPrototypeOf(value); } catch { throw new TypeError('Unsafe canonical JSON object'); }\n if (prototype !== Object.prototype && prototype !== null) throw new TypeError('Non-plain canonical JSON object');\n const names = ownNames(value);\n names.sort(compareCodePointStrings);\n const entries: string[] = [];\n for (const name of names) {\n const descriptor = Object.getOwnPropertyDescriptor(value, name);\n if (!descriptor || !('value' in descriptor) || !descriptor.enumerable) {\n throw new TypeError('Unsafe canonical JSON property');\n }\n entries.push(`${encodeString(name)}:${encodeValue(descriptor.value, seen)}`);\n }\n return `{${entries.join(',')}}`;\n}\nfunction ownNames(value: object): string[] {\n let names: string[];\n let symbols: symbol[];\n try {\n names = Object.getOwnPropertyNames(value);\n symbols = Object.getOwnPropertySymbols(value);\n } catch { throw new TypeError('Unsafe canonical JSON object'); }\n if (symbols.length !== 0) throw new TypeError('Symbol-bearing canonical JSON object');\n return names;\n}\n\nfunction dataDescriptor(value: object, name: string): unknown {\n const descriptor = Object.getOwnPropertyDescriptor(value, name);\n if (!descriptor || !('value' in descriptor)) throw new TypeError('Accessor in canonical JSON value');\n return descriptor.value;\n}\n\nfunction isArrayIndex(name: string, length: number): boolean {\n if (!/^(?:0|[1-9][0-9]*)$/.test(name)) return false;\n const index = Number(name);\n return Number.isSafeInteger(index) && index < length;\n}\n\nfunction encodeString(value: string): string {\n let output = '\"';\n for (let index = 0; index < value.length; index += 1) {\n const code = value.charCodeAt(index);\n if (code === 0x22) output += '\\\\\"';\n else if (code === 0x5c) output += '\\\\\\\\';\n else if (code === 0x08) output += '\\\\b';\n else if (code === 0x09) output += '\\\\t';\n else if (code === 0x0a) output += '\\\\n';\n else if (code === 0x0c) output += '\\\\f';\n else if (code === 0x0d) output += '\\\\r';\n else if (code < 0x20) output += `\\\\u${code.toString(16).padStart(4, '0')}`;\n else if (code >= 0xd800 && code <= 0xdfff) {\n const next = value.charCodeAt(index + 1);\n if (code <= 0xdbff && next >= 0xdc00 && next <= 0xdfff) { output += value[index] + value[index + 1]; index += 1; }\n else output += `\\\\u${code.toString(16).padStart(4, '0')}`;\n } else output += value[index];\n }\n return `${output}\"`;\n}\n\nfunction compareCodePointStrings(left: string, right: string): number {\n const a = Array.from(left, (char) => char.codePointAt(0)!);\n const b = Array.from(right, (char) => char.codePointAt(0)!);\n for (let index = 0; index < Math.min(a.length, b.length); index += 1) {\n if (a[index] !== b[index]) return a[index] - b[index];\n }\n return a.length - b.length;\n}\n", "/**\n * D-6 (2026-10-17). The result contract refuses text that looks like scanner-internal failure\n * output or credential material \u2014 the `SECRET` and `UNSAFE` classes in\n * `contracts/scanner-v2-result.ts`, applied to every text field through `text(value, errors, path)`.\n * That check belongs to the output surface and is deliberately left where it is: it is what keeps a\n * stack trace, a file path or a token out of a published report.\n *\n * A node name is user-chosen display text, though, and `Exception`, `Error: boom` or `Token:` are\n * ordinary labels. Because a label only reaches the result when its node carries a finding, the\n * refusal surfaced as `TOOL_INVARIANT_FAILED` from composition \u2014 the workflow got no verdict at all,\n * for a reason unrelated to its security. Five corpus rows sat in that state.\n *\n * The first repair escaped every match of the vocabulary by inserting a backslash after its first\n * character. That broke the *pattern* rather than the *payload*: `Exception` became `E\\xception`\n * (fine, it is prose, and the five rescued rows grade), but `sk-live-\u2026` became `s\\k-live-\u2026`, which\n * the contract accepts while a reader \u2014 or `replaceAll('\\\\', '')` \u2014 recovers the token. A credential\n * must not survive as a puzzle. So the vocabulary is split by what the match actually is:\n *\n * - `CREDENTIAL_NAME`: a credential's field name and separator (`token:`, `api_key=`) is refused by\n * the gate even with no value behind it, so the whole match is removed. Redacting only values\n * would leave the declaration and the workflow ungradable.\n * - `CREDENTIAL_VALUE`: the payload (`sk-\u2026`, `AKIA\u2026`, a JWT). The span is replaced with\n * `[REDACTED]`; it must never ship, escaped or otherwise.\n * - `FAILURE_SHAPED`: prose such as `Exception`, `Error: boom`, `stack trace`. It carries no\n * payload, but the contract refuses it; it is escaped exactly as before, so the five rescued rows\n * keep grading and the label stays readable. It is not redacted: a blanket redaction would\n * rewrite precisely those rows.\n * - `UNSAFE_SHAPE`: a URL, a `..` run or an absolute/drive path. No payload of its own, so it is\n * escaped exactly as before.\n *\n * The escape is never trusted on its own: `composeScannerResultV2` re-validates the sanitized result\n * against the contract, and fails exactly as it did before whenever the result did not clear it.\n *\n * Locating a finding never depends on the label: every subject carries `ordinal` and\n * `identityDigest`, which are computed before composition and are not touched here, so a redacted\n * name costs a reader nothing but the display text.\n */\nconst REDACTED = '[REDACTED]';\n\n/** Class 1: a credential's field name and separator. Removed whole \u2014 the value is a separate class. */\nconst CREDENTIAL_NAME = /(?:api[ _-]*key|password|secret|credential|authorization|cookie|bearer|token)\\s*[:=]/gi;\n/** Class 2: a credential value. Replaced whole \u2014 the payload must not survive in any form. */\nconst CREDENTIAL_VALUE = /\\b(?:sk[-_][\\w-]+|AKIA[0-9A-Z]{16}|eyJ[\\w-]{12,}\\.[\\w-]{8,})\\b/gi;\n/** Class 3: failure-shaped prose. Escaped, not redacted (see the header). */\nconst FAILURE_SHAPED = /\\b(?:exception|stack trace|traceback|error:| at [A-Za-z]:[/\\\\])/gi;\n/** Class 4: shapes with no payload of their own. Escaped, as before. */\nconst UNSAFE_SHAPE = /(?:https?|ftp):\\/\\/|(?:^|[/\\\\])\\.\\.(?:[/\\\\]|$)|^[/\\\\]|^[A-Za-z]:[/\\\\]/gi;\n\nfunction escapeMatch(match: string): string {\n // A `..` run is escaped dot-by-dot, because inserting a backslash beside a separator only\n // produces another separator that matches again; a one-character match (a leading `/`) is\n // prefixed, because inserting into it cannot remove it.\n if (match.includes('..')) return match.replace(/\\./g, '\\\\.');\n if (match.length === 1) return `_${match}`;\n return `${match[0]}\\\\${match.slice(1)}`;\n}\n\nexport function sanitizeDisplayLabel(value: string): string {\n // Order matters: the credential *value* is redacted on the original string first, before any name\n // removal can delete the character its leading `\\b` depends on (`db_credential:sk-live_\u2026` used to\n // become `db_sk-live_\u2026`, which neither the value pass nor the contract can see). After that, name\n // removal and value redaction run to a fixed point, because removal can also create new matches:\n // it can splice neighbours into a value shape (`sToken:k-live` \u2192 `sk-live`) and it can even\n // recreate a class-1 match (`toToken:ken:` \u2192 `token:`).\n //\n // Termination: a name removal strictly shortens the string, so at most `value.length` iterations\n // remove something; a value redaction cannot create a name match (the `[REDACTED]` marker contains\n // no `:`/`=`, and a value span contains none either) nor another value match (the marker contains\n // `[`/`]`, which no value alternative can span), so the first iteration that removes nothing is\n // followed by a no-op and the loop exits. Idempotence: at the fixed point a second call finds no\n // match on the original (no value: the marker cannot contain one) and no removal, and returns the\n // input unchanged.\n let sanitized = value.replace(CREDENTIAL_VALUE, REDACTED);\n for (;;) {\n const next = sanitized.replace(CREDENTIAL_NAME, '').replace(CREDENTIAL_VALUE, REDACTED);\n if (next === sanitized) break;\n sanitized = next;\n }\n // A label that was nothing but the removed declaration (`Token:`, `Authorization:`) would\n // otherwise publish as the empty string. The contract's `text()` accepts empty (verified through\n // the real gate), but empty text is a reader-visible non-answer and this codebase's other text\n // validators reject it (`advisory-admission.ts:63`, `catalogue-resolver.ts:23`), so a label the\n // passes emptied gets the same visible marker as a redacted value. A label that was already empty\n // or whitespace-only is returned untouched: nothing that used to publish is changed.\n const visible = sanitized !== value && sanitized.trim() === '' ? REDACTED : sanitized;\n // One alternative can hand off to another: escaping a leading `../` leaves the label starting\n // with the separator the leading-separator rule owns, and every pass is idempotent once no match\n // is left. Four passes cover every hand-off the two shape classes can produce, and the caller\n // validates the result against the contract rather than trusting this.\n let escaped = visible;\n for (let pass = 0; pass < 4; pass += 1) {\n const next = escaped.replace(FAILURE_SHAPED, escapeMatch).replace(UNSAFE_SHAPE, escapeMatch);\n if (next === escaped) break;\n escaped = next;\n }\n return escaped;\n}\n", "import { sha256 } from '@noble/hashes/sha2.js';\nimport { bytesToHex } from '@noble/hashes/utils.js';\nimport type { FindingV2, SafeFactV2, TraceStepV2, TraceV2 } from '../../../../contracts/scanner-v2-evidence';\nimport type { SubjectV2 } from '../../../../contracts/scanner-v2-source';\nimport { canonicalBytesV1 } from './canonical-bytes';\nimport { createEdgeIdentityDigest, encodeIdentityTuple } from '../workflow-v2/node-edge-identity';\n\ntype Subject = SubjectV2;\nexport type IdentityContextV2 = Readonly<{ semanticSha256: string }>;\nexport type FactIdentityInputV2 = Readonly<Pick<SafeFactV2, 'kind' | 'subject' | 'properties'>>;\nexport type TraceIdentityInputV2 = Readonly<Pick<TraceV2, 'kind' | 'steps'>>;\nexport type FindingIdentityInputV2 = Readonly<Pick<FindingV2,\n 'ruleId' | 'ruleRevision' | 'evidenceClass' | 'conclusion' | 'applicability' | 'subject' | 'factRefs' | 'traceRefs'>>;\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\nconst DIGEST = /^[0-9a-f]{64}$/;\n\nexport function canonicalSubjectIdentity(subject: Subject, context?: IdentityContextV2): string {\n const record = exactRecord(subject, ['kind', 'node', 'edge', 'source']);\n if (record.kind === 'WORKFLOW') {\n const semanticSha256 = context?.semanticSha256;\n if (!DIGEST.test(semanticSha256 ?? '')) throw new TypeError('Workflow identity needs semanticSha256');\n if (Object.keys(record).length !== 1) throw new TypeError('Invalid workflow subject');\n return `WORKFLOW${semanticSha256}`;\n }\n if (record.kind === 'SOURCE') {\n if (Object.keys(record).length !== 2) throw new TypeError('Invalid source subject');\n const source = exactRecord(record.source, ['pointer', 'occurrencePath', 'astNodeId', 'span']);\n if (typeof source.astNodeId !== 'string' || !DIGEST.test(source.astNodeId)) throw new TypeError('Invalid source identity');\n return `SOURCE${source.astNodeId}`;\n }\n if (record.kind === 'NODE') {\n if (Object.keys(record).length !== 2) throw new TypeError('Invalid node subject');\n const node = exactRecord(record.node, ['ordinal', 'source', 'explicitId', 'name', 'identityDigest']);\n if (typeof node.identityDigest !== 'string' || !DIGEST.test(node.identityDigest)) throw new TypeError('Invalid node identity');\n return `NODE${node.identityDigest}`;\n }\n if (record.kind === 'EDGE') {\n if (Object.keys(record).length !== 2) throw new TypeError('Invalid edge subject');\n const edge = exactRecord(record.edge, ['ordinal', 'sourceNode', 'targetNode', 'sourceLabel', 'targetLabel', 'connectionType', 'sourcePort', 'targetPort', 'source', 'resolution']);\n return `EDGE${createEdgeIdentityDigest(normalizeEdge(edge))}`;\n }\n throw new TypeError('Invalid subject kind');\n}\n\nfunction normalizeEdge(edge: Record<string, unknown>): Parameters<typeof createEdgeIdentityDigest>[0] {\n const source = sourceDigestRecord(edge.source);\n const sourceNode = edge.sourceNode === undefined ? undefined : nodeDigestRecord(edge.sourceNode);\n const targetNode = edge.targetNode === undefined ? undefined : nodeDigestRecord(edge.targetNode);\n if (!Number.isSafeInteger(edge.ordinal) || (edge.ordinal as number) < 0 || typeof edge.sourceLabel !== 'string'\n || edge.targetLabel !== undefined && typeof edge.targetLabel !== 'string' || typeof edge.connectionType !== 'string'\n || !Number.isSafeInteger(edge.sourcePort) || (edge.sourcePort as number) < 0\n || !Number.isSafeInteger(edge.targetPort) || (edge.targetPort as number) < 0\n || !['RESOLVED', 'AMBIGUOUS', 'UNRESOLVED'].includes(edge.resolution as string)) throw new TypeError('Invalid edge identity');\n return { ordinal: edge.ordinal as number, sourceNode, targetNode, sourceLabel: edge.sourceLabel as string,\n targetLabel: edge.targetLabel as string | undefined, connectionType: edge.connectionType as string, sourcePort: edge.sourcePort as number,\n targetPort: edge.targetPort as number, source, resolution: edge.resolution as 'RESOLVED' | 'AMBIGUOUS' | 'UNRESOLVED' };\n}\n\nfunction sourceDigestRecord(value: unknown): Parameters<typeof createEdgeIdentityDigest>[0]['source'] {\n const source = exactRecord(value, ['pointer', 'occurrencePath', 'astNodeId', 'span']);\n if (typeof source.astNodeId !== 'string' || !DIGEST.test(source.astNodeId)) throw new TypeError('Invalid source identity');\n return source as Parameters<typeof createEdgeIdentityDigest>[0]['source'];\n}\n\nfunction nodeDigestRecord(value: unknown): NonNullable<Parameters<typeof createEdgeIdentityDigest>[0]['sourceNode']> {\n const node = exactRecord(value, ['ordinal', 'source', 'explicitId', 'name', 'identityDigest']);\n if (typeof node.identityDigest !== 'string' || !DIGEST.test(node.identityDigest)) throw new TypeError('Invalid node identity');\n return node as NonNullable<Parameters<typeof createEdgeIdentityDigest>[0]['sourceNode']>;\n}\n\nexport function createFactId(input: FactIdentityInputV2, context?: IdentityContextV2): string {\n const value = exactRecord(input, ['factId', 'kind', 'subject', 'properties']);\n if (typeof value.kind !== 'string' || value.kind.length === 0) throw new TypeError('Invalid fact identity');\n const subject = canonicalSubjectIdentity(value.subject as Subject, context);\n const properties = text(canonicalBytesV1(value.properties));\n return digest(['secureflow-fact-id-v2', value.kind, subject, properties]);\n}\n\nexport function createTraceId(input: TraceIdentityInputV2, context?: IdentityContextV2): string {\n const value = exactRecord(input, ['traceId', 'kind', 'steps']);\n if (typeof value.kind !== 'string' || !Array.isArray(value.steps)) throw new TypeError('Invalid trace identity');\n const steps = denseArray(value.steps).map((step) => canonicalTraceStep(step as TraceStepV2, context));\n const encoded = text(canonicalBytesV1(steps));\n return digest(['secureflow-trace-id-v2', value.kind, encoded]);\n}\n\nexport function createFindingId(input: FindingIdentityInputV2, context?: IdentityContextV2): string {\n const value = exactRecord(input, ['findingId', 'ruleId', 'ruleRevision', 'effect', 'severity', 'confidence', 'evidenceClass', 'conclusion', 'applicability', 'subject', 'factRefs', 'traceRefs', 'remediationId']);\n for (const key of ['ruleId', 'ruleRevision', 'evidenceClass', 'conclusion', 'applicability'] as const) if (typeof value[key] !== 'string') throw new TypeError('Invalid finding identity');\n const factRefs = sortedReferences(value.factRefs);\n const traceRefs = sortedReferences(value.traceRefs);\n return digest(['secureflow-finding-id-v2', value.ruleId, value.ruleRevision, value.evidenceClass,\n value.conclusion, value.applicability, canonicalSubjectIdentity(value.subject as Subject, context), ...factRefs, ...traceRefs]);\n}\n\nfunction canonicalTraceStep(step: TraceStepV2, context?: IdentityContextV2): Record<string, unknown> {\n const value = exactRecord(step, ['ordinal', 'kind', 'subject', 'factRefs']);\n if (!Number.isSafeInteger(value.ordinal) || value.ordinal < 0 || typeof value.kind !== 'string') throw new TypeError('Invalid trace step');\n return { ordinal: value.ordinal, kind: value.kind, subject: canonicalSubjectIdentity(value.subject as Subject, context), factRefs: sortedReferences(value.factRefs) };\n}\n\nfunction sortedReferences(value: unknown): string[] {\n const result = denseArray(value);\n if (result.some((item) => typeof item !== 'string' || !DIGEST.test(item as string))) throw new TypeError('Invalid identity reference');\n const strings = result as string[];\n strings.sort();\n for (let index = 1; index < strings.length; index += 1) if (strings[index] === strings[index - 1]) throw new TypeError('Duplicate identity reference');\n return strings;\n}\n\nfunction denseArray(value: unknown): unknown[] {\n if (!Array.isArray(value) || Object.getPrototypeOf(value) !== Array.prototype || Object.getOwnPropertySymbols(value).length !== 0) throw new TypeError('Invalid identity array');\n const length = Object.getOwnPropertyDescriptor(value, 'length');\n if (!length || !('value' in length) || !Number.isSafeInteger(length.value) || length.value < 0) throw new TypeError('Invalid identity array');\n const names = Object.getOwnPropertyNames(value);\n if (names.length !== length.value + 1 || names.some((name) => name !== 'length' && !/^(?:0|[1-9][0-9]*)$/.test(name) || Number(name) >= length.value)) throw new TypeError('Invalid identity array');\n const result: unknown[] = [];\n for (let index = 0; index < length.value; index += 1) {\n const descriptor = Object.getOwnPropertyDescriptor(value, String(index));\n if (!descriptor || !('value' in descriptor)) throw new TypeError('Invalid identity array');\n result.push(descriptor.value);\n }\n return result;\n}\n\nfunction exactRecord(value: unknown, allowed: readonly string[]): Record<string, any> {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) throw new TypeError('Invalid identity record');\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null || Object.getOwnPropertySymbols(value).length !== 0) throw new TypeError('Unsafe identity record');\n const output: Record<string, any> = {};\n for (const name of Object.getOwnPropertyNames(value)) {\n if (!allowed.includes(name)) throw new TypeError('Unknown identity property');\n const descriptor = Object.getOwnPropertyDescriptor(value, name);\n if (!descriptor || !('value' in descriptor) || !descriptor.enumerable) throw new TypeError('Accessor identity property');\n output[name] = descriptor.value;\n }\n return output;\n}\n\nfunction text(bytes: Uint8Array): string {\n return decoder.decode(bytes);\n}\n\nfunction digest(parts: readonly string[]): string {\n return bytesToHex(sha256(encoder.encode(encodeIdentityTuple(parts))));\n}\n", "import { sha256 } from '@noble/hashes/sha2.js';\nimport { bytesToHex } from '@noble/hashes/utils.js';\nimport { DEFAULT_SCANNER_LIMITS_V2 } from '@hub/contracts';\nimport { canonicalJsonBytes, canonicalizeJson } from '../canonical-json';\nimport { encodeIdentityTuple } from '../workflow-v2/node-edge-identity';\nimport { SAFE_FACT_AUTHORITY_DIGEST_V2, SAFE_FACT_EVIDENCE_MAPPINGS_V2 } from '../facts/safe-fact-registry';\nimport { betaHardenedRuleCatalog } from '../policy/rule-catalog';\nimport { RULE_PACK_DIGEST_V2 } from '../capabilities/candidate-validator';\nimport { BETA_DEFAULT_PROFILE_MANIFEST, computeProfileManifestDigest } from '../capabilities/profile-manifest';\nimport { createBetaDefaultCapabilityRegistry } from '../capabilities/beta-default';\nimport { createBetaDefaultPolicies } from '../policies/beta-policies';\nimport { BUILTIN_SEMANTIC_CATALOGUE_V2 } from '../semantics/builtin-catalogue';\nimport { createSemanticCatalogueDigest } from '../semantics/catalogue-admission';\nimport type { ResolvedNodeSemanticsV2 } from '../semantics/catalogue-schema';\nimport type { AdmittedRuleV2, CapabilityRegistryV2, RuleCatalogueViewV2, SemanticCatalogueViewV2 } from '../capabilities/scheduler';\n\nexport const ADMITTED_PROFILE_ID = 'beta-default' as const;\nexport const ADMITTED_PROFILE_VERSION = '2.0.0' as const;\nexport const ADMITTED_ENGINE_ID = 'secureflow-scanner' as const;\nexport const ADMITTED_ENGINE_VERSION = '2.0.0' as const;\nexport const RULESET_ID_V2 = 'scanner-core-builtins' as const;\nexport const RULESET_VERSION_V2 = '2.0.0' as const;\nexport const RULESET_SIGNATURE_STATUS_V2 = 'VERIFIED' as const;\nexport const RULE_KEYS = Object.freeze(SAFE_FACT_EVIDENCE_MAPPINGS_V2.map(({ ruleId }) => ruleId));\n\nconst ruleById = new Map(betaHardenedRuleCatalog.map((entry) => [entry.policyId, entry]));\nconst authorityRules: readonly AdmittedRuleV2[] = Object.freeze(SAFE_FACT_EVIDENCE_MAPPINGS_V2.map((mapping) => {\n const catalog = ruleById.get(mapping.ruleId);\n if (!catalog) throw new TypeError(`Missing built-in rule authority: ${mapping.ruleId}`);\n return Object.freeze({\n ruleId: mapping.ruleId, revision: '1', capabilityId: mapping.ownerCapabilityId,\n effect: mapping.ownerCapabilityId === 'structural-policies' ? 'SCORING' : 'REPORT_ONLY',\n severity: catalog.defaultSeverity, confidence: catalog.defaultConfidence,\n evidenceSchemaId: mapping.evidenceSchemaId, remediationId: 'r', cweIds: Object.freeze([...catalog.cweIds]),\n owaspAgenticIds: Object.freeze([...(catalog.owaspAgenticIds ?? [])]), packDigest: RULE_PACK_DIGEST_V2,\n });\n}));\nconst authorityRuleBody = Object.freeze(authorityRules.map(({ packDigest: _packDigest, ...rule }) => rule).sort((left, right) => left.ruleId < right.ruleId ? -1 : left.ruleId > right.ruleId ? 1 : 0));\n\nexport const PROFILE_MANIFEST_DIGEST_V2 = BETA_DEFAULT_PROFILE_MANIFEST.digest;\nexport { RULE_PACK_DIGEST_V2 };\nexport const RULE_PACK_DIGEST = RULE_PACK_DIGEST_V2;\nexport const LIMITS_AUTHORITY_DIGEST_V2 = bytesToHex(sha256(canonicalJsonBytes(DEFAULT_SCANNER_LIMITS_V2)));\nexport const SEMANTIC_CATALOGUE_DIGEST_V2 = BUILTIN_SEMANTIC_CATALOGUE_V2.digest;\nexport const ENGINE_BUILD_DIGEST_V2 = bytesToHex(sha256(canonicalJsonBytes({\n engine: ADMITTED_ENGINE_ID, version: ADMITTED_ENGINE_VERSION, profile: ADMITTED_PROFILE_ID,\n profileVersion: ADMITTED_PROFILE_VERSION, manifest: PROFILE_MANIFEST_DIGEST_V2,\n ruleset: RULE_PACK_DIGEST_V2, facts: SAFE_FACT_AUTHORITY_DIGEST_V2, semantics: SEMANTIC_CATALOGUE_DIGEST_V2,\n})));\n\nexport const BUILTIN_RULESET_AUTHORITY_V2 = Object.freeze({\n id: RULESET_ID_V2, version: RULESET_VERSION_V2, digest: RULE_PACK_DIGEST_V2,\n signatureStatus: RULESET_SIGNATURE_STATUS_V2,\n});\nexport const BUILTIN_SEMANTICS_AUTHORITY_V2 = Object.freeze({\n id: BUILTIN_SEMANTIC_CATALOGUE_V2.id, version: BUILTIN_SEMANTIC_CATALOGUE_V2.version,\n digest: BUILTIN_SEMANTIC_CATALOGUE_V2.digest,\n});\n/** The engine's own configuration vocabulary, read by the CLI before any item runs. */\nexport const ADMITTED_CONFIGURATION_KEYS_V2 = BUILTIN_SEMANTIC_CATALOGUE_V2.configurationKeys;\n\n/**\n * An empty allowlist is the no-argument path, so a scan that supplies none \u2014 or supplies `[]`, which\n * the request validator treats as absent \u2014 builds exactly the registry it built before the\n * allowlist was admitted, and its result stays byte-identical.\n */\nexport function createAdmittedCapabilityRegistry(approvedDomains: readonly string[] = []): CapabilityRegistryV2 {\n return approvedDomains.length === 0\n ? createBetaDefaultCapabilityRegistry()\n : createBetaDefaultCapabilityRegistry({ policies: createBetaDefaultPolicies({ approvedDomains }) });\n}\nexport function createAdmittedRuleView(): RuleCatalogueViewV2 {\n return Object.freeze({ id: RULESET_ID_V2, version: RULESET_VERSION_V2, digest: RULE_PACK_DIGEST_V2, rules: new Map(authorityRules.map((rule) => [rule.ruleId, rule])) });\n}\nexport function createAdmittedSemanticView(resolved: ReadonlyMap<string, ResolvedNodeSemanticsV2>): SemanticCatalogueViewV2 {\n return Object.freeze({ id: BUILTIN_SEMANTIC_CATALOGUE_V2.id, version: BUILTIN_SEMANTIC_CATALOGUE_V2.version, digest: BUILTIN_SEMANTIC_CATALOGUE_V2.digest, resolvedNodeSemantics: new Map(resolved) });\n}\nexport function authorityIsIntact(): boolean {\n try {\n const { digest, ...manifestBody } = BETA_DEFAULT_PROFILE_MANIFEST;\n const { digest: semanticDigest, ...semanticBody } = BUILTIN_SEMANTIC_CATALOGUE_V2;\n const rulePackDigest = bytesToHex(sha256(new TextEncoder().encode(encodeIdentityTuple(['secureflow-rule-pack-v2', RULESET_VERSION_V2, SAFE_FACT_AUTHORITY_DIGEST_V2, canonicalizeJson(authorityRuleBody)]))));\n return computeProfileManifestDigest(manifestBody) === PROFILE_MANIFEST_DIGEST_V2\n && authorityRules.length === RULE_KEYS.length\n && authorityRules.every((rule, index) => rule.ruleId === RULE_KEYS[index] && rule.packDigest === RULE_PACK_DIGEST_V2)\n && rulePackDigest === RULE_PACK_DIGEST_V2\n && createSemanticCatalogueDigest(semanticBody) === semanticDigest\n && semanticDigest === SEMANTIC_CATALOGUE_DIGEST_V2;\n } catch { return false; }\n}\n", "import { canonicalizeJson } from '../canonical-json';\nimport { createAdmittedRuleView } from '../v2/admitted-registry';\nimport { admittedRuleV2 } from '../rules-v2/rule-authority';\nimport type { AdmittedRuleV2 } from '../capabilities/scheduler';\n\n/**\n * The result boundary resolves every finding's rule against the admitted catalogue.\n *\n * A caller may repeat an admitted rule entry, but it may not introduce one, drop a field, or\n * restate a value: what it supplies is checked against the catalogue instead of trusted, so a\n * downgraded severity, a flipped scoring effect, or a rewritten remediation cannot win silently.\n * A finding whose rule id is not admitted is refused outright \u2014 never published, never scored.\n */\nconst RULE_KEYS = ['ruleId', 'revision', 'capabilityId', 'effect', 'severity', 'confidence', 'evidenceSchemaId', 'remediationId', 'cweIds', 'owaspAgenticIds', 'packDigest'] as const;\nconst RULE_MAP_KEYS = ['size', 'get', 'has', 'entries', 'keys', 'values', 'forEach', 'set', 'delete', 'clear'] as const;\nconst unsafeMap = (): never => { throw new TypeError('Unsafe rules map'); };\nconst plain = (value: unknown): value is object => value !== null && typeof value === 'object' && !Array.isArray(value) && (Object.getPrototypeOf(value) === Object.prototype || Object.getPrototypeOf(value) === null);\nconst data = (value: object, key: string): unknown => { const descriptor = Object.getOwnPropertyDescriptor(value, key); if (!descriptor || !('value' in descriptor)) return unsafeMap(); return descriptor.value; };\n\n/** A closed admitted-rule entry, or a refusal. Unknown properties and accessors never survive. */\nfunction admittedEntry(raw: unknown): AdmittedRuleV2 {\n if (!plain(raw)) return unsafeMap();\n const names = Object.getOwnPropertyNames(raw);\n if (Object.getOwnPropertySymbols(raw).length !== 0 || names.length !== RULE_KEYS.length || names.some((name) => !(RULE_KEYS as readonly string[]).includes(name))) return unsafeMap();\n const value: Record<string, unknown> = {};\n for (const key of RULE_KEYS) value[key] = data(raw, key);\n return value as unknown as AdmittedRuleV2;\n}\n\n/** The entries of a supplied view: a real `Map`, or the scheduler's frozen immutable view. */\nfunction suppliedEntries(rules: object): readonly (readonly [unknown, unknown])[] {\n if (rules instanceof Map && Object.getPrototypeOf(rules) === Map.prototype) {\n if (Object.getOwnPropertyNames(rules).length !== 0 || Object.getOwnPropertySymbols(rules).length !== 0) return unsafeMap();\n return [...(Map.prototype.entries.call(rules) as Iterable<readonly [unknown, unknown]>)];\n }\n if (Object.getPrototypeOf(rules) !== null || !Object.isFrozen(rules)) return unsafeMap();\n const names = Object.getOwnPropertyNames(rules); const symbols = Object.getOwnPropertySymbols(rules);\n if (names.length !== RULE_MAP_KEYS.length || names.some((name) => !(RULE_MAP_KEYS as readonly string[]).includes(name)) || symbols.length !== 1 || symbols[0] !== Symbol.iterator) return unsafeMap();\n for (const name of RULE_MAP_KEYS) {\n const descriptor = Object.getOwnPropertyDescriptor(rules, name);\n if (!descriptor || !('value' in descriptor) || descriptor.enumerable || descriptor.writable || descriptor.configurable || name !== 'size' && typeof descriptor.value !== 'function') return unsafeMap();\n }\n const entries = data(rules, 'entries') as () => Iterable<readonly [unknown, unknown]>;\n try { return [...entries.call(rules)]; } catch { return unsafeMap(); }\n}\n\nexport function admittedFindingRulesV2(supplied: unknown): ReadonlyMap<string, AdmittedRuleV2> {\n const admitted = createAdmittedRuleView().rules;\n if (supplied === undefined) return admitted;\n if (supplied === null || typeof supplied !== 'object' || Array.isArray(supplied)) return unsafeMap();\n const candidates = suppliedEntries(supplied);\n for (const [key, raw] of candidates) {\n if (typeof key !== 'string') return unsafeMap();\n const entry = admittedEntry(raw);\n const authority = admittedRuleV2(admitted, key);\n if (authority === undefined || entry.ruleId !== key || canonicalizeJson(entry) !== canonicalizeJson(authority)) throw new TypeError('Supplied ruleset disagrees with the admitted catalogue');\n }\n return admitted;\n}\n\nexport function findingRuleV2(rules: ReadonlyMap<string, AdmittedRuleV2>, ruleId: unknown): AdmittedRuleV2 {\n if (typeof ruleId !== 'string') throw new TypeError('Invalid rule ID');\n const rule = admittedRuleV2(rules, ruleId);\n if (rule === undefined) throw new TypeError('Finding rule is not admitted');\n return rule;\n}\n", "import type { AnalysisDiagnosticV2, CapabilityExecutionV2, FindingV2, SafeFactV2, TraceV2 } from '../../../../contracts/scanner-v2-evidence';\nimport { validateScannerResultV2, type ScannerResultV2 } from '../../../../contracts/scanner-v2-result';\nimport type { AdmittedRuleV2, CapabilityCandidateV2 } from '../capabilities/scheduler';\nimport { canonicalBytesV1 } from './canonical-bytes';\nimport { sanitizeDisplayLabel } from './display-label';\nimport { canonicalSubjectIdentity, createFactId, createFindingId, createTraceId, type IdentityContextV2 } from './identities';\nimport { admittedFindingRulesV2, findingRuleV2 } from './finding-authority';\nimport { ruleAuthorityMatchesV2, type RuleAuthorityClaimV2 } from '../rules-v2/rule-authority';\nimport { sortDiagnostics } from '../diagnostics/identity';\nimport { corroboratedCapabilityStatus, countLatticeEffect, strongestAnalysisStatus, type CapabilityCountsV2 } from '../capabilities/count-lattice';\n\ntype CandidateFinding = CapabilityCandidateV2['findings'][number];\ntype ResultAssessment = ScannerResultV2['assessment'];\ntype ResultStats = ScannerResultV2['stats'];\ntype ResultLimits = ScannerResultV2['limits'];\ntype ResultRuleset = ScannerResultV2['ruleset'] & Readonly<{ rules?: ReadonlyMap<string, AdmittedRuleV2> }>;\nexport type ComposeScannerResultV2Input = Readonly<{\n engine: ScannerResultV2['engine']; input: ScannerResultV2['input']; profile: ScannerResultV2['profile'];\n ruleset: ResultRuleset; semantics: ScannerResultV2['semantics']; target: ScannerResultV2['target'];\n limits: ResultLimits; analysis: Readonly<{ status?: ScannerResultV2['analysis']['status']; capabilities?: readonly CapabilityExecutionV2[]; executions?: readonly CapabilityExecutionV2[]; diagnostics?: readonly AnalysisDiagnosticV2[]; candidates?: readonly CapabilityCandidateV2[] }>;\n workflow: ScannerResultV2['workflow']; facts?: readonly SafeFactV2[]; traces?: readonly TraceV2[];\n findings?: readonly (FindingV2 | CandidateFinding)[]; candidates?: readonly CapabilityCandidateV2[];\n assessment: ResultAssessment; stats?: Partial<ResultStats>;\n}>;\nexport type ComposeScannerResultV2Result =\n | Readonly<{ ok: true; result: ScannerResultV2 }>\n | Readonly<{ ok: false; code: 'RESULT_COMPOSITION_FAILED'; errors: readonly string[] }>;\n\nconst CAPABILITY_ORDER = ['source-normalization', 'workflow-insights', 'structural-policies', 'expression-security', 'javascript-security', 'python-security', 'graph-semantics', 'taint-confidentiality', 'taint-integrity', 'agentic-control', 'assessment', 'presentation-facts'];\nconst DIGEST = /^[0-9a-f]{64}$/;\nconst MAX_FAILURE_ERRORS = 16;\nconst MAX_FAILURE_ERROR_LENGTH = 256;\nconst FALLBACK_FAILURE_ERROR = 'invalid scanner result v2 composition';\n\nfunction failure(errors: readonly unknown[]): ComposeScannerResultV2Result {\n const safeErrors: string[] = [];\n try {\n const length = Math.min(errors.length, MAX_FAILURE_ERRORS);\n for (let index = 0; index < length; index += 1) {\n const error = errors[index];\n if (typeof error !== 'string' || error.length === 0) continue;\n safeErrors.push(error.length > MAX_FAILURE_ERROR_LENGTH ? error.slice(0, MAX_FAILURE_ERROR_LENGTH) : error);\n }\n } catch {\n safeErrors.length = 0;\n }\n if (safeErrors.length === 0) safeErrors.push(FALLBACK_FAILURE_ERROR);\n return Object.freeze({ ok: false as const, code: 'RESULT_COMPOSITION_FAILED' as const, errors: Object.freeze(safeErrors) });\n}\n\nexport function composeScannerResultV2(input: ComposeScannerResultV2Input): ComposeScannerResultV2Result {\n try {\n const value = exactRecord(input, ['engine', 'input', 'profile', 'ruleset', 'semantics', 'target', 'limits', 'analysis', 'workflow', 'facts', 'traces', 'findings', 'candidates', 'assessment', 'stats']);\n if (!Object.prototype.hasOwnProperty.call(value, 'assessment')) throw new TypeError('Assessment is required');\n const context: IdentityContextV2 = { semanticSha256: readDigest(value.input, 'semanticSha256') };\n const candidates: CapabilityCandidateV2[] = [...readArray(value.candidates), ...readArray(readRecord(value.analysis, ['status', 'capabilities', 'executions', 'diagnostics', 'candidates']).candidates)].map((candidate) => { readRecord(candidate, ['findings', 'diagnostics', 'facts', 'traces', 'seen', 'analyzed', 'skipped', 'omitted']); return candidate as CapabilityCandidateV2; });\n const facts = evidenceFacts([...readArray(value.facts), ...candidates.flatMap((candidate) => readArray(readRecord(candidate, ['findings', 'diagnostics', 'facts', 'traces', 'seen', 'analyzed', 'skipped', 'omitted']).facts))], context);\n const traces = evidenceTraces([...readArray(value.traces), ...candidates.flatMap((candidate) => readArray(readRecord(candidate, ['findings', 'diagnostics', 'facts', 'traces', 'seen', 'analyzed', 'skipped', 'omitted']).traces))], context);\n const findings = evidenceFindings([...readArray(value.findings), ...candidates.flatMap((candidate) => readArray(readRecord(candidate, ['findings', 'diagnostics', 'facts', 'traces', 'seen', 'analyzed', 'skipped', 'omitted']).findings))], context, admittedFindingRulesV2(readRecord(value.ruleset, ['id', 'version', 'digest', 'signatureStatus', 'rules']).rules));\n const limits = closedLimits(value.limits);\n const stats = value.stats === undefined ? undefined : exactRecord(value.stats, ['rejectedCandidates', 'collapsedCandidates', 'omittedFindings', 'serializedBytes']);\n const analysis = composeAnalysis(value.analysis, candidates, limits, stats);\n const result: Record<string, unknown> = {\n schemaVersion: 'scanner-result-v2', engine: value.engine, input: value.input, profile: value.profile,\n ruleset: closedRuleset(value.ruleset), semantics: value.semantics, target: closedTarget(value.target), limits,\n analysis, workflow: value.workflow, facts, traces, findings, assessment: analysis.status === 'INDETERMINATE' ? null : normalizeAssessment(value.assessment, findings),\n stats: { rejectedCandidates: count(stats, 'rejectedCandidates'), collapsedCandidates: count(stats, 'collapsedCandidates'), omittedFindings: count(stats, 'omittedFindings'), serializedBytes: 0 },\n };\n (result.stats as Record<string, number>).serializedBytes = canonicalBytesV1(result).byteLength;\n const validation = validateScannerResultV2(result);\n if (validation.ok) return Object.freeze({ ok: true as const, result: validation.result });\n // D-6: a display label the contract refuses (`Exception`, `Error: boom`) is sanitized at the\n // label seam and the result re-validated, so a node name cannot cost the workflow its verdict.\n // Credential names are removed and credential values redacted; prose and shape-only matches are\n // escaped as before. The contract still decides \u2014 a label that is not a name, or a sanitized\n // label that did not clear the refusal, fails exactly as it did before.\n const republished = sanitizeDisplayLabels(result);\n if (republished !== undefined) {\n (republished.stats as Record<string, number>).serializedBytes = canonicalBytesV1(republished).byteLength;\n const retry = validateScannerResultV2(republished);\n if (retry.ok) return Object.freeze({ ok: true as const, result: retry.result });\n }\n return failure(validation.errors);\n } catch { return failure(['invalid scanner result v2 composition']); }\n}\n\nfunction isRecordObject(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\n/** D-6: one record's published `name` sanitized, or the same record when nothing matched. */\nfunction sanitizeName(value: unknown): unknown {\n if (!isRecordObject(value) || typeof value.name !== 'string') return value;\n const name = sanitizeDisplayLabel(value.name);\n return name === value.name ? value : { ...value, name };\n}\n\n/** The node labels a subject publishes: its own node, or the two ends of its edge. */\nfunction sanitizeSubjectLabels(value: unknown): unknown {\n if (!isRecordObject(value)) return value;\n if (value.kind === 'NODE') {\n const node = sanitizeName(value.node);\n return node === value.node ? value : { ...value, node };\n }\n if (value.kind !== 'EDGE' || !isRecordObject(value.edge)) return value;\n const edge = value.edge;\n const sourceNode = sanitizeName(edge.sourceNode);\n const targetNode = sanitizeName(edge.targetNode);\n if (sourceNode === edge.sourceNode && targetNode === edge.targetNode) return value;\n return { ...value, edge: { ...edge, ...(sourceNode === edge.sourceNode ? {} : { sourceNode }), ...(targetNode === edge.targetNode ? {} : { targetNode }) } };\n}\n\nfunction sanitizeStepLabels(value: unknown): unknown {\n if (!isRecordObject(value)) return value;\n const subject = sanitizeSubjectLabels(value.subject);\n return subject === value.subject ? value : { ...value, subject };\n}\n\nfunction sanitizeTraceSteps(value: unknown): unknown {\n if (!Array.isArray(value)) return value;\n const steps = value.map(sanitizeStepLabels);\n return steps.some((step, index) => step !== value[index]) ? steps : value;\n}\n\n/** A new evidence array with every published label sanitized, or `undefined` when nothing changed. */\nfunction sanitizeEvidenceLabels(value: unknown): unknown[] | undefined {\n if (!Array.isArray(value)) return undefined;\n let changed = false;\n const output = value.map((entry) => {\n if (!isRecordObject(entry)) return entry;\n const subject = sanitizeSubjectLabels(entry.subject);\n const steps = sanitizeTraceSteps(entry.steps);\n if (subject === entry.subject && steps === entry.steps) return entry;\n changed = true;\n return { ...entry, ...(subject === entry.subject ? {} : { subject }), ...(steps === entry.steps ? {} : { steps }) };\n });\n return changed ? output : undefined;\n}\n\n/** D-6: the composed result with every published label sanitized, or `undefined` when none needed it. */\nfunction sanitizeDisplayLabels(result: Record<string, unknown>): Record<string, unknown> | undefined {\n const workflow = sanitizeName(result.workflow);\n const facts = sanitizeEvidenceLabels(result.facts);\n const traces = sanitizeEvidenceLabels(result.traces);\n const findings = sanitizeEvidenceLabels(result.findings);\n if (workflow === result.workflow && facts === undefined && traces === undefined && findings === undefined) return undefined;\n return { ...result, ...(workflow === result.workflow ? {} : { workflow }), ...(facts === undefined ? {} : { facts }), ...(traces === undefined ? {} : { traces }), ...(findings === undefined ? {} : { findings }) };\n}\n\nfunction evidenceFacts(values: readonly unknown[], context: IdentityContextV2): SafeFactV2[] {\n const byId = new Map<string, SafeFactV2>();\n for (const raw of values) { const item = exactRecord(raw, ['factId', 'kind', 'subject', 'properties']); const fact = item as unknown as SafeFactV2; const id = createFactId(fact, context); if (item.factId !== id) throw new TypeError('Fact identity mismatch'); mergeEvidence(byId, id, fact); }\n return [...byId.values()].sort((a, b) => compareStrings(a.factId, b.factId));\n}\n\nfunction evidenceTraces(values: readonly unknown[], context: IdentityContextV2): TraceV2[] {\n const byId = new Map<string, TraceV2>();\n for (const raw of values) { const item = exactRecord(raw, ['traceId', 'kind', 'steps']); const trace = normalizeTrace(item as unknown as TraceV2, context); if (item.traceId !== trace.traceId) throw new TypeError('Trace identity mismatch'); mergeEvidence(byId, trace.traceId, trace); }\n return [...byId.values()].sort((a, b) => compareStrings(a.traceId, b.traceId));\n}\n\nfunction evidenceFindings(values: readonly unknown[], context: IdentityContextV2, rules: ReadonlyMap<string, AdmittedRuleV2>): FindingV2[] {\n const byId = new Map<string, FindingV2>();\n for (const raw of values) { const finding = normalizeFinding(raw, context, rules); mergeEvidence(byId, finding.findingId, finding); }\n return [...byId.values()].sort((a, b) => severityRank(a.severity) - severityRank(b.severity) || compareStrings(a.ruleId, b.ruleId) || compareStrings(canonicalSubjectIdentity(a.subject, context), canonicalSubjectIdentity(b.subject, context)) || compareStrings(a.findingId, b.findingId));\n}\n\nfunction normalizeTrace(value: TraceV2, context: IdentityContextV2): TraceV2 {\n const record = exactRecord(value, ['traceId', 'kind', 'steps']); const steps = readArray(record.steps).map((raw) => { const step = exactRecord(raw, ['ordinal', 'kind', 'subject', 'factRefs']); return { ordinal: step.ordinal, kind: step.kind, subject: step.subject, factRefs: references(step.factRefs) }; });\n const trace = { traceId: createTraceId({ kind: record.kind as TraceV2['kind'], steps }, context), kind: record.kind as TraceV2['kind'], steps };\n return trace;\n}\n\nfunction normalizeFinding(raw: unknown, context: IdentityContextV2, rules: ReadonlyMap<string, AdmittedRuleV2>): FindingV2 {\n const item = exactRecord(raw, ['findingId', 'ruleId', 'ruleRevision', 'effect', 'severity', 'confidence', 'evidenceClass', 'conclusion', 'applicability', 'subject', 'factRefs', 'traceRefs', 'remediationId']);\n const rule = findingRuleV2(rules, item.ruleId);\n if (!ruleAuthorityMatchesV2(rule, item as RuleAuthorityClaimV2)) throw new TypeError('Finding authority mismatch');\n if (item.factRefs === undefined || item.traceRefs === undefined) throw new TypeError('Missing finding references');\n const factRefs = references(item.factRefs); const traceRefs = references(item.traceRefs);\n const body: Omit<FindingV2, 'findingId'> = { ruleId: rule.ruleId, ruleRevision: rule.revision, effect: rule.effect, severity: rule.severity, confidence: rule.confidence, evidenceClass: item.evidenceClass, conclusion: item.conclusion, applicability: item.applicability, subject: item.subject, factRefs, traceRefs, remediationId: rule.remediationId };\n const findingId = createFindingId(body, context);\n if (item.findingId !== undefined && item.findingId !== findingId) throw new TypeError('Finding identity mismatch');\n return { ...body, findingId };\n}\n\nfunction composeAnalysis(raw: unknown, candidates: readonly CapabilityCandidateV2[], limits: ResultLimits, stats: Record<string, unknown> | undefined): ScannerResultV2['analysis'] {\n const input = exactRecord(raw, ['status', 'capabilities', 'executions', 'diagnostics', 'candidates']);\n const capabilities = readCapabilities(input.capabilities ?? input.executions);\n const diagnostics = [...readArray(input.diagnostics), ...candidates.flatMap((candidate) => readArray(readRecord(candidate, ['findings', 'diagnostics', 'facts', 'traces', 'seen', 'analyzed', 'skipped', 'omitted']).diagnostics))] as AnalysisDiagnosticV2[];\n const orderedDiagnostics = [...sortDiagnostics(diagnostics, CAPABILITY_ORDER)];\n const diagnosticOrder = new Map(orderedDiagnostics.map((item, index) => [item.id, index]));\n const normalizedCapabilities = capabilities.map((item) => ({ ...item, diagnosticIds: [...item.diagnosticIds].sort((left, right) => (diagnosticOrder.get(left) ?? Number.MAX_SAFE_INTEGER) - (diagnosticOrder.get(right) ?? Number.MAX_SAFE_INTEGER) || compareStrings(left, right)) }));\n const status = strongestAnalysisStatus(input.status, derivedStatus(normalizedCapabilities, orderedDiagnostics, limits, stats));\n return { status, capabilities: normalizedCapabilities, diagnostics: orderedDiagnostics };\n}\n\nfunction readCapabilities(value: unknown): CapabilityExecutionV2[] {\n const capabilities = readArray(value).map((raw) => {\n const item = exactRecord(raw, ['id', 'version', 'required', 'status', 'seen', 'analyzed', 'skipped', 'omitted', 'diagnosticIds']);\n const counts: CapabilityCountsV2 = { seen: item.seen, analyzed: item.analyzed, skipped: item.skipped, omitted: item.omitted };\n return { id: item.id, version: item.version, required: item.required, ...counts, status: corroboratedCapabilityStatus(item.status, counts), diagnosticIds: references(item.diagnosticIds, false) } as CapabilityExecutionV2;\n });\n return capabilities.sort((a, b) => CAPABILITY_ORDER.indexOf(a.id) - CAPABILITY_ORDER.indexOf(b.id));\n}\n\nfunction normalizeAssessment(value: unknown, findings: readonly FindingV2[]): ResultAssessment {\n if (value === null) return null; const item = exactRecord(value, ['score', 'grade', 'scoringPolicyVersion', 'basisFindingIds', 'excludedReportOnlyFindingIds', 'excludedUncertainFindingIds', 'excludedNotApplicableFindingIds', 'unknownEvidenceCount']); const order = new Map(findings.map((finding, index) => [finding.findingId, index])); const ids = (key: string) => references(item[key]).sort((a, b) => (order.get(a) ?? Number.MAX_SAFE_INTEGER) - (order.get(b) ?? Number.MAX_SAFE_INTEGER)); return { score: item.score, grade: item.grade, scoringPolicyVersion: item.scoringPolicyVersion, basisFindingIds: ids('basisFindingIds'), excludedReportOnlyFindingIds: ids('excludedReportOnlyFindingIds'), excludedUncertainFindingIds: ids('excludedUncertainFindingIds'), excludedNotApplicableFindingIds: ids('excludedNotApplicableFindingIds'), unknownEvidenceCount: item.unknownEvidenceCount } as ResultAssessment;\n}\n\nfunction derivedStatus(caps: readonly CapabilityExecutionV2[], diagnostics: readonly AnalysisDiagnosticV2[], limits: ResultLimits, stats: Record<string, unknown> | undefined): ScannerResultV2['analysis']['status'] { let status: ScannerResultV2['analysis']['status'] = 'COMPLETE'; for (const item of caps) { const effect = countLatticeEffect(item, item.required); if (item.required && (item.status === 'FAILED' || item.status === 'SKIPPED')) status = 'INDETERMINATE'; else if (effect === 'INDETERMINATE') status = 'INDETERMINATE'; else if (status === 'COMPLETE' && (item.status !== 'COMPLETED' || effect === 'DEGRADED')) status = 'DEGRADED'; } for (const item of diagnostics) { if (item.aggregateEffect === 'INDETERMINATE') status = 'INDETERMINATE'; else if (status === 'COMPLETE' && (item.aggregateEffect === 'DEGRADED' || item.omitted !== undefined && item.omitted > 0)) status = 'DEGRADED'; } if (limits.usage.some((usage) => usage.omitted > 0) || (typeof stats?.omittedFindings === 'number' && stats.omittedFindings > 0)) if (status === 'COMPLETE') status = 'DEGRADED'; return status; }\n\nfunction closedRuleset(value: ResultRuleset): ScannerResultV2['ruleset'] { const item = exactRecord(value, ['id', 'version', 'digest', 'signatureStatus', 'rules']); return { id: item.id, version: item.version, digest: item.digest, signatureStatus: item.signatureStatus }; }\nfunction closedTarget(value: ScannerResultV2['target']): ScannerResultV2['target'] {\n const item = exactRecord(value, ['n8nVersion', 'edition', 'deployment', 'role', 'taskRunner', 'communityPackages', 'configuration', 'contextDigest']);\n const packages = readArray(item.communityPackages).map((raw) => { const packageValue = exactRecord(raw, ['name', 'version']); return packageValue.version === undefined ? { name: packageValue.name } : { name: packageValue.name, version: packageValue.version }; }).sort((a, b) => compareStrings(a.name, b.name) || compareStrings(a.version ?? '', b.version ?? ''));\n const configuration = readArray(item.configuration).map((raw) => exactRecord(raw, ['key', 'state']) as ScannerResultV2['target']['configuration'][number]).sort((a, b) => compareStrings(a.key, b.key));\n return { ...(item.n8nVersion === undefined ? {} : { n8nVersion: item.n8nVersion }), edition: item.edition, deployment: item.deployment, role: item.role, taskRunner: item.taskRunner, communityPackages: packages, configuration, contextDigest: item.contextDigest } as ScannerResultV2['target'];\n}\nfunction closedLimits(value: ResultLimits): ResultLimits { const item = exactRecord(value, ['schemaVersion', 'digest', 'usage']); const usage = readArray(item.usage).map((raw) => exactRecord(raw, ['id', 'maximum', 'examined', 'omitted', 'exhausted']) as ResultLimits['usage'][number]).sort((a, b) => compareStrings(a.id, b.id)); return { schemaVersion: item.schemaVersion, digest: item.digest, usage }; }\nfunction references(value: unknown, sort = true): string[] { const result = readArray(value); if (result.some((item) => typeof item !== 'string' || !DIGEST.test(item))) throw new TypeError('Invalid references'); if (sort) result.sort((a, b) => compareStrings(a as string, b as string)); for (let index = 1; index < result.length; index += 1) if (result[index] === result[index - 1]) throw new TypeError('Duplicate references'); return result as string[]; }\nfunction readArray(value: unknown): unknown[] {\n if (value === undefined) return [];\n if (!Array.isArray(value) || Object.getPrototypeOf(value) !== Array.prototype || Object.getOwnPropertySymbols(value).length !== 0) throw new TypeError('Expected dense array');\n const length = Object.getOwnPropertyDescriptor(value, 'length');\n if (!length || !('value' in length) || !Number.isSafeInteger(length.value) || length.value < 0) throw new TypeError('Unsafe array');\n const names = Object.getOwnPropertyNames(value);\n if (names.length !== length.value + 1 || names.some((name) => name !== 'length' && !/^(?:0|[1-9][0-9]*)$/.test(name) || Number(name) >= length.value)) throw new TypeError('Unsafe array');\n const result: unknown[] = [];\n for (let index = 0; index < length.value; index += 1) { const descriptor = Object.getOwnPropertyDescriptor(value, String(index)); if (!descriptor || !('value' in descriptor)) throw new TypeError('Sparse array'); result.push(descriptor.value); }\n return result;\n}\nfunction compareStrings(left: string, right: string): number {\n const a = Array.from(left, (char) => char.codePointAt(0)!);\n const b = Array.from(right, (char) => char.codePointAt(0)!);\n for (let index = 0; index < Math.min(a.length, b.length); index += 1) if (a[index] !== b[index]) return a[index] - b[index];\n return a.length - b.length;\n}\nfunction exactRecord(value: unknown, allowed: readonly string[]): Record<string, any> { if (value === null || typeof value !== 'object' || Array.isArray(value)) throw new TypeError('Expected record'); const prototype = Object.getPrototypeOf(value); if (prototype !== Object.prototype && prototype !== null || Object.getOwnPropertySymbols(value).length) throw new TypeError('Unsafe record'); const output: Record<string, any> = {}; for (const key of Object.getOwnPropertyNames(value)) { if (!allowed.includes(key)) throw new TypeError('Unknown property'); const descriptor = Object.getOwnPropertyDescriptor(value, key); if (!descriptor || !('value' in descriptor) || !descriptor.enumerable) throw new TypeError('Accessor property'); output[key] = descriptor.value; } return output; }\nfunction readRecord(value: unknown, allowed: readonly string[]): Record<string, any> { return exactRecord(value, allowed); }\nfunction readDigest(value: unknown, key: string): string { const item = exactRecord(value, ['rawSha256', 'semanticSha256', 'ambiguitySha256', 'ambiguityCount', 'utf8Bytes']); const digest = item[key]; if (typeof digest !== 'string' || !DIGEST.test(digest)) throw new TypeError('Invalid digest'); return digest; }\nfunction count(value: Record<string, any> | undefined, key: keyof ResultStats): number { const count = value?.[key] ?? 0; if (!Number.isSafeInteger(count) || count < 0) throw new TypeError('Invalid result count'); return count; }\nfunction severityRank(value: FindingV2['severity']): number { return ['CRITICAL', 'HIGH', 'MEDIUM', 'LOW', 'INFO'].indexOf(value); }\nfunction text(value: Uint8Array): string { return new TextDecoder().decode(value); }\nfunction mergeEvidence<T>(map: Map<string, T>, id: string, item: T): void { const prior = map.get(id); if (prior === undefined) { map.set(id, item); return; } const priorBytes = text(canonicalBytesV1(prior)); const itemBytes = text(canonicalBytesV1(item)); if (compareStrings(itemBytes, priorBytes) < 0) map.set(id, item); }\n", "import type { FindingV2 } from '../../../../contracts/scanner-v2-evidence';\nimport type { ScannerResultV2 } from '../../../../contracts/scanner-v2-result';\nimport type { SubjectV2 } from '../../../../contracts/scanner-v2-source';\nimport { canonicalSubjectIdentity } from './identities';\nimport type { WorkflowComplexity } from '../workflow-insights';\n\nexport type AssessmentV2 = NonNullable<ScannerResultV2['assessment']>;\ntype PlainRecord = Record<string, unknown>;\ntype PreparedFinding = { finding: FindingV2; subjectKey: string };\ntype RuleTotal = { base: number; total: number };\n\nconst FINDING_KEYS = ['findingId', 'ruleId', 'ruleRevision', 'effect', 'severity', 'confidence', 'evidenceClass', 'conclusion', 'applicability', 'subject', 'factRefs', 'traceRefs', 'remediationId'] as const;\nconst SEVERITIES = ['CRITICAL', 'HIGH', 'MEDIUM', 'LOW', 'INFO'] as const;\nconst COMPLEXITIES = ['LOW', 'MEDIUM', 'HIGH'] as const;\nconst DIGEST = /^[0-9a-f]{64}$/;\nconst MAX_ARRAY = 100_000;\nconst POLICY = 'secureflow-risk-v2@2.0.0';\nconst WEIGHT: Record<(typeof SEVERITIES)[number], number> = { CRITICAL: 55, HIGH: 35, MEDIUM: 18, LOW: 6, INFO: 1 };\nconst COMPLEXITY_WEIGHT: Record<WorkflowComplexity, number> = { LOW: 0, MEDIUM: 10, HIGH: 20 };\n\nexport function scoreFindingsV2(findings: readonly FindingV2[], complexity: WorkflowComplexity): AssessmentV2 {\n try {\n if (!COMPLEXITIES.includes(complexity as (typeof COMPLEXITIES)[number])) throw new TypeError('Invalid workflow complexity');\n const prepared = dense(findings).map((value, index) => readFinding(value, index));\n const seen = new Set<string>();\n for (const { finding } of prepared) { if (seen.has(finding.findingId)) throw new TypeError('Duplicate finding ID'); seen.add(finding.findingId); }\n prepared.sort(compareFindings);\n const basisFindingIds: string[] = [];\n const excludedReportOnlyFindingIds: string[] = [];\n const excludedUncertainFindingIds: string[] = [];\n const excludedNotApplicableFindingIds: string[] = [];\n const totals = new Map<string, RuleTotal>();\n for (const { finding } of prepared) {\n if (finding.effect === 'REPORT_ONLY') excludedReportOnlyFindingIds.push(finding.findingId);\n else if (finding.applicability === 'NOT_APPLICABLE') excludedNotApplicableFindingIds.push(finding.findingId);\n else if (finding.applicability === 'UNKNOWN' || finding.conclusion === 'POTENTIAL' || finding.conclusion === 'UNKNOWN') excludedUncertainFindingIds.push(finding.findingId);\n else {\n basisFindingIds.push(finding.findingId);\n const base = WEIGHT[finding.severity];\n const prior = totals.get(finding.ruleId);\n if (!prior) totals.set(finding.ruleId, { base, total: base });\n else prior.total = Math.min(prior.base * 2, prior.total + prior.base * 0.25);\n }\n }\n let score = 0;\n for (const item of totals.values()) score += item.total;\n score = Math.floor(Math.min(100, score + COMPLEXITY_WEIGHT[complexity]) + 0.5);\n return { score, grade: score >= 80 ? 'CRITICAL' : score >= 55 ? 'HIGH' : score >= 25 ? 'MEDIUM' : 'LOW', scoringPolicyVersion: POLICY, basisFindingIds, excludedReportOnlyFindingIds, excludedUncertainFindingIds, excludedNotApplicableFindingIds, unknownEvidenceCount: excludedUncertainFindingIds.length };\n } catch (error) {\n if (error instanceof TypeError) throw error;\n throw new TypeError('Invalid scoring input');\n }\n}\n\nfunction readFinding(value: unknown, index: number): PreparedFinding {\n const item = closed(value, FINDING_KEYS, `findings[${index}]`);\n digest(item.findingId, 'findingId'); idText(item.ruleId, 'ruleId'); idText(item.ruleRevision, 'ruleRevision'); idText(item.remediationId, 'remediationId');\n enumValue(item.effect, ['SCORING', 'REPORT_ONLY'], 'effect'); enumValue(item.severity, SEVERITIES, 'severity'); enumValue(item.confidence, ['HIGH', 'MEDIUM', 'LOW'], 'confidence');\n enumValue(item.evidenceClass, ['CAPABILITY', 'CONFIGURATION', 'SUSPICIOUS_SYNTAX', 'POTENTIAL_DATAFLOW', 'VERSION_APPLICABILITY'], 'evidenceClass');\n enumValue(item.conclusion, ['OBSERVED', 'POTENTIAL', 'UNKNOWN'], 'conclusion'); enumValue(item.applicability, ['APPLICABLE', 'NOT_APPLICABLE', 'UNKNOWN'], 'applicability');\n const subjectKey = subject(item.subject); refs(item.factRefs, 'factRefs'); refs(item.traceRefs, 'traceRefs');\n return { finding: item as unknown as FindingV2, subjectKey };\n}\n\nfunction subject(value: unknown): string {\n const item = closed(value, ['kind', 'node', 'edge', 'source'], ['kind']);\n if (item.kind === 'WORKFLOW') { if (Object.keys(item).length !== 1) throw new TypeError('Invalid workflow subject'); return 'WORKFLOW'; }\n if (item.kind === 'SOURCE') member(closed(item.source, ['pointer', 'occurrencePath', 'astNodeId', 'span'], 'source'));\n else if (item.kind === 'NODE') nodeRef(item.node);\n else if (item.kind === 'EDGE') edgeRef(item.edge);\n else throw new TypeError('Invalid subject kind');\n return canonicalSubjectIdentity(value as SubjectV2);\n}\nfunction member(value: PlainRecord): void { text(value.pointer, 'pointer', true); if (!pointer(value.pointer as string)) throw new TypeError('pointer must be RFC6901'); integers(value.occurrencePath, 'occurrencePath'); digest(value.astNodeId, 'astNodeId'); if (value.span !== null) { const span = closed(value.span, ['start', 'end'], 'span'); position(span.start, 'start'); position(span.end, 'end'); } }\nfunction pointer(value: string): boolean { if (value === '') return true; if (value[0] !== '/') return false; for (let index = 1; index < value.length; index += 1) if (value[index] === '~') { const next = value[index + 1]; if (next !== '0' && next !== '1') return false; index += 1; } return true; }\nfunction position(value: unknown, label: string): void { const item = closed(value, ['line', 'column', 'utf16Offset', 'utf8ByteOffset'], label); integer(item.line, `${label}.line`, 1); integer(item.column, `${label}.column`, 1); integer(item.utf16Offset, `${label}.utf16Offset`); integer(item.utf8ByteOffset, `${label}.utf8ByteOffset`); }\nfunction nodeRef(value: unknown): void { const item = closed(value, ['ordinal', 'source', 'explicitId', 'name', 'identityDigest'], ['ordinal', 'source', 'identityDigest']); integer(item.ordinal, 'node.ordinal'); member(closed(item.source, ['pointer', 'occurrencePath', 'astNodeId', 'span'], 'node.source')); if ('explicitId' in item) text(item.explicitId, 'node.explicitId', true); if ('name' in item) text(item.name, 'node.name', true); digest(item.identityDigest, 'node.identityDigest'); }\nfunction edgeRef(value: unknown): void { const item = closed(value, ['ordinal', 'sourceNode', 'targetNode', 'sourceLabel', 'targetLabel', 'connectionType', 'sourcePort', 'targetPort', 'source', 'resolution'], ['ordinal', 'sourceLabel', 'connectionType', 'sourcePort', 'targetPort', 'source', 'resolution']); integer(item.ordinal, 'edge.ordinal'); if ('sourceNode' in item) nodeRef(item.sourceNode); if ('targetNode' in item) nodeRef(item.targetNode); text(item.sourceLabel, 'edge.sourceLabel', true); if ('targetLabel' in item) text(item.targetLabel, 'edge.targetLabel', true); text(item.connectionType, 'edge.connectionType', true); integer(item.sourcePort, 'edge.sourcePort'); integer(item.targetPort, 'edge.targetPort'); member(closed(item.source, ['pointer', 'occurrencePath', 'astNodeId', 'span'], 'edge.source')); enumValue(item.resolution, ['RESOLVED', 'AMBIGUOUS', 'UNRESOLVED'], 'edge.resolution'); }\n\nfunction closed(value: unknown, allowed: readonly string[], path: string | readonly string[]): PlainRecord {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) throw new TypeError(`${path} must be a record`);\n const prototype = Object.getPrototypeOf(value); if (prototype !== Object.prototype && prototype !== null || Object.getOwnPropertySymbols(value).length) throw new TypeError(`${path} has unsafe shape`);\n const item: PlainRecord = Object.create(null); const names = Object.getOwnPropertyNames(value);\n for (const name of names) { if (!allowed.includes(name)) throw new TypeError(`${path} has unknown property`); const descriptor = Object.getOwnPropertyDescriptor(value, name); if (!descriptor || !('value' in descriptor) || !descriptor.enumerable) throw new TypeError(`${path}.${name} is not data`); item[name] = descriptor.value; }\n const required = typeof path === 'string' && allowed === FINDING_KEYS ? FINDING_KEYS : Array.isArray(path) ? path : allowed;\n for (const name of required) if (!Object.prototype.hasOwnProperty.call(item, name)) throw new TypeError(`${path} is missing ${name}`);\n return item;\n}\nfunction dense(value: unknown): unknown[] { if (!Array.isArray(value) || Object.getPrototypeOf(value) !== Array.prototype || Object.getOwnPropertySymbols(value).length) throw new TypeError('Expected dense array'); const length = Object.getOwnPropertyDescriptor(value, 'length'); if (!length || !('value' in length) || !Number.isSafeInteger(length.value) || length.value < 0 || length.value > MAX_ARRAY) throw new TypeError('Unsafe array'); const names = Object.getOwnPropertyNames(value); if (names.length !== length.value + 1 || names.some((name) => name !== 'length' && (!/^(?:0|[1-9][0-9]*)$/.test(name) || Number(name) >= length.value))) throw new TypeError('Unsafe array'); const result: unknown[] = []; for (let index = 0; index < length.value; index += 1) { const descriptor = Object.getOwnPropertyDescriptor(value, String(index)); if (!descriptor || !('value' in descriptor)) throw new TypeError('Sparse array'); result.push(descriptor.value); } return result; }\nfunction refs(value: unknown, path: string): void { const values = dense(value); const seen = new Set<string>(); for (const item of values) { digest(item, path); if (seen.has(item as string)) throw new TypeError(`Duplicate ${path}`); seen.add(item as string); } }\nfunction integers(value: unknown, path: string): void { const values = dense(value); for (const item of values) integer(item, path); }\nfunction digest(value: unknown, path: string): asserts value is string { if (typeof value !== 'string' || !DIGEST.test(value)) throw new TypeError(`${path} must be a digest`); }\nfunction idText(value: unknown, path: string): asserts value is string { text(value, path, false); }\nfunction text(value: unknown, path: string, allowEmpty: boolean): asserts value is string { if (typeof value !== 'string' || !allowEmpty && value.length === 0 || value.length > 4096 || value.includes('\\0') || /[\\u0001-\\u0008\\u000b\\u000c\\u000e-\\u001f\\u007f]/.test(value)) throw new TypeError(`${path} must be safe text`); for (let index = 0; index < value.length; index += 1) { const code = value.charCodeAt(index); if (code >= 0xd800 && code <= 0xdbff) { const next = value.charCodeAt(index + 1); if (!(next >= 0xdc00 && next <= 0xdfff)) throw new TypeError(`${path} has invalid text`); index += 1; } else if (code >= 0xdc00 && code <= 0xdfff) throw new TypeError(`${path} has invalid text`); } }\nfunction integer(value: unknown, path: string, min = 0): asserts value is number { if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < min) throw new TypeError(`${path} must be a safe integer`); }\nfunction enumValue(value: unknown, values: readonly string[], path: string): void { if (typeof value !== 'string' || !values.includes(value)) throw new TypeError(`${path} has an invalid enum`); }\nfunction compareFindings(left: PreparedFinding, right: PreparedFinding): number { return SEVERITIES.indexOf(left.finding.severity) - SEVERITIES.indexOf(right.finding.severity) || compareStrings(left.finding.ruleId, right.finding.ruleId) || compareStrings(left.subjectKey, right.subjectKey) || compareStrings(left.finding.findingId, right.finding.findingId); }\nfunction compareStrings(left: string, right: string): number { const a = Array.from(left, (char) => char.codePointAt(0)!); const b = Array.from(right, (char) => char.codePointAt(0)!); for (let index = 0; index < Math.min(a.length, b.length); index += 1) if (a[index] !== b[index]) return a[index] - b[index]; return a.length - b.length; }\n", "export const BUDGET_KEYS_V2 = Object.freeze([\n 'maxBytes',\n 'maxNodes',\n 'maxEdges',\n 'maxConnectionDepth',\n 'maxParameterDepth',\n 'maxParameterLeaves',\n 'workerDeadlineMs',\n 'maxSyntaxNodes',\n 'maxDocumentDepth',\n 'maxMembersAndElements',\n 'maxRawEdges',\n 'maxDuplicateKeys',\n 'maxDiagnostics',\n 'maxStoredSourceSpans',\n 'maxSourceWork',\n 'maxExpressionTokens',\n 'maxCodeSyntaxNodes',\n 'maxGraphOperations',\n 'maxTaintStates',\n 'maxTraceStepsPerFinding',\n 'maxFindings',\n 'maxRedactionPatches',\n 'maxRedactedArtifactBytes',\n 'maxEvidenceBytes',\n 'maxSerializedResultBytes',\n 'maxRuleOperations',\n] as const);\n\nexport type BudgetKeyV2 = (typeof BUDGET_KEYS_V2)[number];\nexport type BudgetAggregateEffectV2 = 'DEGRADED' | 'INDETERMINATE';\n\nexport type BudgetOutcomeV2 = Readonly<\n | { kind: 'ITEM_ERROR'; code: 'WORKFLOW_TOO_LARGE' | 'WORKFLOW_TOO_COMPLEX' }\n | {\n kind: 'DIAGNOSTIC';\n code: 'OPTIONAL_LIMIT_EXCEEDED' | 'REQUIRED_LIMIT_EXCEEDED' | 'GRAPH_WORK_LIMIT_EXCEEDED';\n aggregateEffect: BudgetAggregateEffectV2;\n assessmentEligible: boolean;\n reservedDiagnosticSlots?: 1;\n }\n | { kind: 'REDACTION_ERROR'; code: 'REDACTION_LIMIT_EXCEEDED' }\n | { kind: 'HOST_ERROR'; code: 'SCAN_TIMEOUT' }\n>;\n\nexport type BudgetOutcomeContextV2 = Readonly<{\n budget: BudgetKeyV2;\n capabilityRequired?: boolean;\n securityRequired?: boolean;\n}>;\n\nconst KNOWN_BUDGETS = new Set<string>(BUDGET_KEYS_V2);\n\nconst SHAPE_BUDGETS = new Set<BudgetKeyV2>([\n 'maxSyntaxNodes', 'maxDocumentDepth', 'maxMembersAndElements', 'maxNodes',\n 'maxRawEdges', 'maxEdges', 'maxConnectionDepth', 'maxParameterDepth',\n 'maxParameterLeaves', 'maxDuplicateKeys', 'maxSerializedResultBytes', 'maxSourceWork',\n]);\n\nconst CAPABILITY_BUDGETS = new Set<BudgetKeyV2>([\n 'maxExpressionTokens', 'maxCodeSyntaxNodes', 'maxTaintStates',\n 'maxTraceStepsPerFinding', 'maxFindings', 'maxEvidenceBytes', 'maxRuleOperations',\n]);\n\nexport function classifyBudgetOutcome(context: BudgetOutcomeContextV2): BudgetOutcomeV2 {\n const { budget } = context;\n if (!KNOWN_BUDGETS.has(budget)) throw new TypeError('Unknown scanner budget');\n if (budget === 'maxBytes') return frozen({ kind: 'ITEM_ERROR', code: 'WORKFLOW_TOO_LARGE' });\n if (SHAPE_BUDGETS.has(budget)) return frozen({ kind: 'ITEM_ERROR', code: 'WORKFLOW_TOO_COMPLEX' });\n if (budget === 'maxDiagnostics') return frozen({\n kind: 'DIAGNOSTIC', code: 'REQUIRED_LIMIT_EXCEEDED', aggregateEffect: 'INDETERMINATE',\n assessmentEligible: false, reservedDiagnosticSlots: 1,\n });\n if (budget === 'maxStoredSourceSpans') {\n return context.securityRequired ? requiredLimit() : optionalLimit();\n }\n if (CAPABILITY_BUDGETS.has(budget)) return byCapability(context.capabilityRequired);\n if (budget === 'maxGraphOperations') {\n const required = requireCapabilityRequired(context.capabilityRequired);\n return frozen({\n kind: 'DIAGNOSTIC', code: 'GRAPH_WORK_LIMIT_EXCEEDED',\n aggregateEffect: required ? 'INDETERMINATE' : 'DEGRADED', assessmentEligible: !required,\n });\n }\n if (budget === 'maxRedactionPatches' || budget === 'maxRedactedArtifactBytes') {\n return frozen({ kind: 'REDACTION_ERROR', code: 'REDACTION_LIMIT_EXCEEDED' });\n }\n return frozen({ kind: 'HOST_ERROR', code: 'SCAN_TIMEOUT' });\n}\n\nexport function diagnosticCapacity(maxDiagnostics: number): number {\n if (!Number.isSafeInteger(maxDiagnostics) || maxDiagnostics < 1) {\n throw new TypeError('maxDiagnostics must reserve at least one diagnostic slot');\n }\n return maxDiagnostics - 1;\n}\n\nfunction byCapability(requiredness: boolean | undefined): BudgetOutcomeV2 {\n return requireCapabilityRequired(requiredness) ? requiredLimit() : optionalLimit();\n}\n\nfunction requireCapabilityRequired(value: boolean | undefined): boolean {\n if (typeof value !== 'boolean') throw new TypeError('capabilityRequired must be fixed before execution');\n return value;\n}\n\nfunction requiredLimit(): BudgetOutcomeV2 {\n return frozen({\n kind: 'DIAGNOSTIC', code: 'REQUIRED_LIMIT_EXCEEDED',\n aggregateEffect: 'INDETERMINATE', assessmentEligible: false,\n });\n}\n\nfunction optionalLimit(): BudgetOutcomeV2 {\n return frozen({\n kind: 'DIAGNOSTIC', code: 'OPTIONAL_LIMIT_EXCEEDED',\n aggregateEffect: 'DEGRADED', assessmentEligible: true,\n });\n}\n\nfunction frozen<const T extends object>(value: T): Readonly<T> {\n return Object.freeze(value);\n}\n", "import type { ProfileManifestV2 } from '../capabilities/profile-manifest';\nimport { SAFE_FACT_EVIDENCE_MAPPINGS_V2 } from '../facts/safe-fact-registry';\n\n/**\n * Whether an omitted stored span is presentation-only or security-required.\n *\n * Identity never depends on a span. `astNodeId` is a structural digest of occurrence path, slot,\n * kind, and a payload that recurses through child ids or the token lexeme; node and edge digests\n * read those ids (`createNodeIdentityDigest`, `createEdgeIdentityDigest`), and fact, finding and\n * trace ids canonicalise the resulting subject. The evidence registry's span policies are `NONE` or\n * `OPTIONAL_HALF_OPEN`, so no fact kind demands a span either \u2014 a fact with a location-less subject\n * is still classified exactly the same way.\n *\n * Trace evidence is the exception, because a trace step states *where* the classification was\n * observed: a step's subject is resolved through the taint subject validator, which refuses a source\n * member without a stored span, and `materializeTraceV2` answers an unresolvable step with an UNKNOWN\n * trace rather than a partial one. A span budget that drops those spans therefore does not leave a\n * location-less record behind; it removes the classification the trace was carrying, which is the\n * result contract's \"identity/security classification depends on an omitted span\" case.\n */\nconst TRACE_EVIDENCE_SCHEMA_IDS: readonly string[] = Object.freeze(['v1.taint', 'v1.agent-control']);\n\nexport function spanLossIsSecurityRequired(manifest: ProfileManifestV2): boolean {\n return manifest.capabilities.some((capability) => capability.ruleIds.some((ruleId) => {\n const mapping = SAFE_FACT_EVIDENCE_MAPPINGS_V2.find((entry) => entry.ruleId === ruleId);\n return mapping !== undefined && TRACE_EVIDENCE_SCHEMA_IDS.includes(mapping.evidenceSchemaId);\n }));\n}\n", "import { sha256 } from '@noble/hashes/sha2.js';\nimport { bytesToHex } from '@noble/hashes/utils.js';\nimport { DEFAULT_SCANNER_LIMITS_V2, MEASURED_LIMIT_IDS, type ScannerLimitsV2 } from '@hub/contracts';\nimport { canonicalJsonBytes } from '../canonical-json';\nimport { parseSourceDocument } from '../source/source-parser';\nimport { resolveScannerLimits } from '../source/scanner-limit-resolution';\nimport type { ReadonlySourceDocumentV2, SourceSpanUsageV2 } from '../source/source-types';\nimport { normalizeSecurityWorkflow } from '../workflow-v2/normalize-security-workflow';\nimport type { SecurityWorkflowResult, SecurityWorkflowV2 } from '../workflow-v2/security-workflow';\nimport { validateTargetContextV2, type TargetContextV2 } from '../semantics/target-context';\nimport { BUILTIN_SEMANTIC_CATALOGUE_V2 } from '../semantics/builtin-catalogue';\nimport { resolveNodeSemanticsForScan } from '../semantics/generic-fallback';\nimport { SemanticCatalogueAdmissionError } from '../semantics/catalogue-admission';\nimport type { ResolvedNodeSemanticsV2 } from '../semantics/catalogue-schema';\nimport { createDiagnostic } from '../capabilities/adapter-evidence';\nimport { EMPTY_ADVISORY_CATALOGUE_V2, resolveAnalyzerSemanticContext, type SemanticContextV2 } from '../capabilities/semantic-context';\nimport { toNativeWorkflow } from '../capabilities/adapter-workflow';\nimport { scanCapabilitiesV2 } from '../capabilities/beta-default';\nimport type { AdmittedRuleV2, AnalyzerContextV2, CapabilityCandidateV2, CapabilityExecutionV2, SemanticCatalogueViewV2 } from '../capabilities/scheduler';\nimport type { SafeFactV2 } from '../capabilities/scheduler';\nimport { composeScannerResultV2 } from '../result-v2/compose-result';\nimport { createFactId, createFindingId, createTraceId } from '../result-v2/identities';\nimport { resolveRuleAuthorityV2 } from '../rules-v2/rule-authority';\nimport { analyzeWorkflowInsights } from '../scan-insights';\nimport { scoreFindingsV2 } from '../result-v2/scoring';\nimport type { FindingV2, AnalysisDiagnosticV2 } from '../../../../contracts/scanner-v2-evidence';\nimport type { ScannerResultV2 } from '../../../../contracts/scanner-v2-result';\nimport {\n ADMITTED_ENGINE_ID, ADMITTED_ENGINE_VERSION, ADMITTED_PROFILE_ID, ADMITTED_PROFILE_VERSION,\n BUILTIN_RULESET_AUTHORITY_V2, BUILTIN_SEMANTICS_AUTHORITY_V2, ENGINE_BUILD_DIGEST_V2,\n authorityIsIntact, createAdmittedCapabilityRegistry, createAdmittedRuleView, createAdmittedSemanticView,\n PROFILE_MANIFEST_DIGEST_V2,\n} from './admitted-registry';\nimport { BETA_DEFAULT_PROFILE_MANIFEST } from '../capabilities/profile-manifest';\nimport { classifyBudgetOutcome } from '../workflow-v2/budget-outcomes';\nimport { spanLossIsSecurityRequired } from './span-loss-classification';\nexport type ScanWorkflowV2FailureCode = 'UTF8_DECODING_FAILED' | 'INVALID_JSON' | 'MALFORMED_WORKFLOW' | 'WORKFLOW_TOO_LARGE' | 'WORKFLOW_TOO_COMPLEX' | 'INVALID_CONFIG' | 'UNKNOWN_CONFIGURATION_KEY' | 'PROFILE_NOT_ADMITTED' | 'SEMANTIC_CATALOGUE_INVALID' | 'SEMANTIC_CATALOGUE_AMBIGUOUS' | 'RULE_PACK_INVALID' | 'RULE_PACK_UNTRUSTED' | 'TOOL_INVARIANT_FAILED' | 'SERIALIZATION_FAILED' | 'SCAN_TIMEOUT' | 'SCAN_CANCELLED';\nexport type ScanWorkflowV2Failure = Readonly<{ ok: false; code: ScanWorkflowV2FailureCode; message: string; cause?: string; errors?: readonly string[] }>;\nexport type ScanWorkflowV2Success = Readonly<{ ok: true; result: ScannerResultV2 }>;\nexport type ScanWorkflowV2Request = Readonly<{ bytes: Uint8Array; profile: Readonly<{ id: string; version: string }>; target?: unknown; limits?: unknown; approvedDomains?: readonly string[] }>;\nexport type ScanWorkflowV2Result = ScanWorkflowV2Success | ScanWorkflowV2Failure;\n\ntype Plain = Record<string, unknown>;\ntype PreparedRequest = { bytes: Uint8Array; target: TargetContextV2; limits: ScannerLimitsV2; approvedDomains: readonly string[] };\ntype NormalizedSuccess = Extract<SecurityWorkflowResult, { ok: true }>;\nconst REQUEST_KEYS = ['bytes', 'profile', 'target', 'limits', 'approvedDomains'] as const;\nconst PROFILE_KEYS = ['id', 'version'] as const;\nconst LIMIT_KEYS = Object.freeze(Object.getOwnPropertyNames(DEFAULT_SCANNER_LIMITS_V2));\n\nconst failure = (code: ScanWorkflowV2FailureCode, message: string, cause?: string): ScanWorkflowV2Failure => Object.freeze({ ok: false, code, message, ...(cause === undefined ? {} : { cause }) });\n\nfunction record(value: unknown, allowed: readonly string[], required: readonly string[] = []): Plain | undefined {\n try {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) return undefined;\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) return undefined;\n if (Object.getOwnPropertySymbols(value).length > 0) return undefined;\n const names = Object.getOwnPropertyNames(value); const output = Object.create(null) as Plain;\n for (const name of names) { if (!allowed.includes(name)) return undefined; const descriptor = Object.getOwnPropertyDescriptor(value, name); if (!descriptor || !('value' in descriptor) || !descriptor.enumerable) return undefined; output[name] = descriptor.value; }\n if (required.some((name) => !names.includes(name))) return undefined;\n return output;\n } catch { return undefined; }\n}\nfunction bytesCopy(value: unknown): Uint8Array | undefined {\n try {\n if (!(value instanceof Uint8Array) || Object.getPrototypeOf(value) !== Uint8Array.prototype || Object.getOwnPropertySymbols(value).length > 0) return undefined;\n for (const name of Object.getOwnPropertyNames(value)) { const descriptor = Object.getOwnPropertyDescriptor(value, name); if (!descriptor || !('value' in descriptor)) return undefined; }\n return Uint8Array.prototype.slice.call(value) as Uint8Array;\n } catch { return undefined; }\n}\n/** A dense array of strings, or `undefined`: a sparse array or any non-string member is malformed. */\nfunction domainList(value: unknown): readonly string[] | undefined {\n try {\n if (!Array.isArray(value) || Object.getPrototypeOf(value) !== Array.prototype || Object.getOwnPropertySymbols(value).length !== 0) return undefined;\n const names = Object.getOwnPropertyNames(value); const length = value.length;\n if (!Number.isSafeInteger(length) || length < 0 || names.length !== length + 1 || !names.includes('length')) return undefined;\n const output: string[] = [];\n for (let index = 0; index < length; index += 1) {\n const descriptor = Object.getOwnPropertyDescriptor(value, String(index));\n if (!descriptor || !('value' in descriptor) || typeof descriptor.value !== 'string') return undefined;\n output.push(descriptor.value);\n }\n return output;\n } catch { return undefined; }\n}\nfunction prepared(input: unknown): PreparedRequest | ScanWorkflowV2Failure {\n const root = record(input, REQUEST_KEYS, ['bytes', 'profile']); if (!root) return failure('INVALID_CONFIG', 'Scanner request is not a closed data object.');\n const profile = record(root.profile, PROFILE_KEYS, ['id', 'version']);\n if (!profile || typeof profile.id !== 'string' || typeof profile.version !== 'string') return failure('INVALID_CONFIG', 'Scanner profile reference is malformed.');\n if (profile.id !== ADMITTED_PROFILE_ID || profile.version !== ADMITTED_PROFILE_VERSION) return failure('PROFILE_NOT_ADMITTED', 'Scanner profile is not admitted.');\n const bytes = bytesCopy(root.bytes); if (!bytes) return failure('INVALID_CONFIG', 'Scanner bytes must be a Uint8Array.');\n const partialLimits = root.limits === undefined ? undefined : record(root.limits, LIMIT_KEYS);\n if (root.limits !== undefined && !partialLimits) return failure('INVALID_CONFIG', 'Scanner limits are malformed.');\n const limits = resolveScannerLimits(partialLimits); if (!limits) return failure('INVALID_CONFIG', 'Scanner limits are invalid.');\n const approvedDomains = root.approvedDomains === undefined ? [] : domainList(root.approvedDomains);\n if (approvedDomains === undefined) return failure('INVALID_CONFIG', 'Scanner approved domains are malformed.');\n const rawTarget = root.target === undefined ? { edition: 'UNKNOWN', deployment: 'UNKNOWN', role: 'UNKNOWN', taskRunner: 'UNKNOWN', communityPackages: [], configuration: [] } : record(root.target, ['n8nVersion', 'edition', 'deployment', 'role', 'taskRunner', 'communityPackages', 'configuration', 'contextDigest']);\n if (!rawTarget) return failure('INVALID_CONFIG', 'Scanner target is malformed.');\n try { return { bytes, limits, approvedDomains, target: validateTargetContextV2(rawTarget, { allowedConfigurationKeys: BUILTIN_SEMANTIC_CATALOGUE_V2.configurationKeys }) }; }\n catch (error) { const reason = error instanceof Error ? error.message : ''; return failure(reason.includes('UNKNOWN_CONFIGURATION_KEY') ? 'UNKNOWN_CONFIGURATION_KEY' : 'INVALID_CONFIG', 'Scanner target is invalid.'); }\n}\nfunction semanticView(workflow: SecurityWorkflowV2): { view: SemanticCatalogueViewV2 } | ScanWorkflowV2Failure {\n const resolved = new Map<string, ResolvedNodeSemanticsV2>();\n try {\n for (const node of workflow.nodes) {\n const resolution = resolveNodeSemanticsForScan(BUILTIN_SEMANTIC_CATALOGUE_V2, node);\n if (resolution) resolved.set(node.ref.identityDigest, resolution.semantics);\n }\n return { view: createAdmittedSemanticView(resolved) };\n } catch (error) { return semanticCatalogueFailure(error); }\n}\nfunction semanticCatalogueFailure(error: unknown): ScanWorkflowV2Failure {\n const ambiguous = error instanceof SemanticCatalogueAdmissionError ? error.code === 'SEMANTIC_CATALOGUE_AMBIGUOUS' : error instanceof Error && error.message.includes('SEMANTIC_CATALOGUE_AMBIGUOUS');\n return failure(ambiguous ? 'SEMANTIC_CATALOGUE_AMBIGUOUS' : 'SEMANTIC_CATALOGUE_INVALID', 'Built-in semantic catalogue admission failed.');\n}\nfunction ambiguityDiagnostics(workflow: SecurityWorkflowV2): readonly AnalysisDiagnosticV2[] {\n return workflow.ambiguities.map((ambiguity) => createDiagnostic(ambiguity.kind === 'UNRESOLVED_EDGE' || ambiguity.kind === 'AMBIGUOUS_EDGE' ? 'MALFORMED_CONNECTION_INDEX' : ambiguity.kind === 'DUPLICATE_MEMBER' && ambiguity.securityImpact === 'METADATA_ONLY' ? 'DUPLICATE_METADATA_KEY' : ambiguity.kind === 'MALFORMED_SECURITY_VALUE' ? 'MALFORMED_NODE_PARAMETERS' : 'DUPLICATE_SECURITY_KEY', 'source-normalization', true, ambiguity.subject));\n}\nfunction addDiagnostics(schedule: { executions: readonly CapabilityExecutionV2[]; candidates: readonly CapabilityCandidateV2[]; diagnostics: readonly AnalysisDiagnosticV2[] }, diagnostics: readonly AnalysisDiagnosticV2[], semanticSha256?: string): typeof schedule {\n const candidates = semanticSha256 === undefined ? schedule.candidates : rekeyCandidates(schedule.candidates, semanticSha256);\n if (diagnostics.length === 0) return { ...schedule, candidates };\n const executions = schedule.executions.map((execution) => { const owned = diagnostics.filter((diagnostic) => diagnostic.capabilityId === execution.id).map(({ id }) => id); return owned.length === 0 ? execution : Object.freeze({ ...execution, diagnosticIds: Object.freeze([...execution.diagnosticIds, ...owned]) }); });\n return { executions: Object.freeze(executions), candidates, diagnostics: Object.freeze([...schedule.diagnostics, ...diagnostics.filter(({ id }) => !schedule.diagnostics.some((prior) => prior.id === id))]) };\n}\n/**\n * The stored-span budget is the one bound a successful run can truncate against, so its loss is\n * classified by the budget registry rather than assumed: a presentation-only loss degrades, while a\n * loss that removed the spans a security classification is stated through withholds the assessment.\n * The outcome classifies; the diagnostic registry supplies the effect the record must carry.\n */\nfunction spanLossDiagnostics(usage: SourceSpanUsageV2): Readonly<{ diagnostics: readonly AnalysisDiagnosticV2[] }> | ScanWorkflowV2Failure {\n if (usage.omitted === 0) return { diagnostics: [] };\n const outcome = classifyBudgetOutcome({ budget: 'maxStoredSourceSpans', securityRequired: spanLossIsSecurityRequired(BETA_DEFAULT_PROFILE_MANIFEST) });\n if (outcome.kind !== 'DIAGNOSTIC') return failure('TOOL_INVARIANT_FAILED', 'Stored-span exhaustion has no diagnostic outcome.');\n return { diagnostics: [createDiagnostic(outcome.code, 'source-normalization', true)] };\n}\nfunction limitUsage(limits: ScannerLimitsV2, source: ReadonlySourceDocumentV2, sourceWorkUnits: number, workflow: NormalizedSuccess, findings: number, diagnostics: number, spanUsage: SourceSpanUsageV2) {\n const examined: Readonly<Record<(typeof MEASURED_LIMIT_IDS)[number], number>> = {\n maxBytes: source.utf8Bytes,\n maxNodes: workflow.counters.nodesExamined,\n maxEdges: workflow.counters.edgesRetained,\n maxConnectionDepth: workflow.counters.connectionDepth,\n maxParameterDepth: workflow.counters.parameterDepth,\n maxParameterLeaves: workflow.counters.parameterLeaves,\n maxSyntaxNodes: source.syntaxNodeCount,\n maxRawEdges: workflow.counters.rawEdgesExamined,\n maxDuplicateKeys: source.duplicateCount,\n maxDiagnostics: diagnostics,\n maxStoredSourceSpans: spanUsage.examined,\n maxSourceWork: sourceWorkUnits,\n maxFindings: findings,\n };\n // Only budgets with a real counter appear. Emitting a row for a dormant, unwired or unmeasured\n // budget would state a maximum it never enforced and an `examined: 0` it never measured. The\n // stored-span row stays the one budget a successful run can truncate against, so it carries the\n // parser's own omitted/exhausted accounting.\n return [...MEASURED_LIMIT_IDS].sort().map((id) => Object.freeze({\n id,\n maximum: limits[id],\n examined: examined[id],\n omitted: id === 'maxStoredSourceSpans' ? spanUsage.omitted : 0,\n exhausted: id === 'maxStoredSourceSpans' && spanUsage.omitted > 0,\n }));\n}\nfunction rekeyCandidates(candidates: readonly CapabilityCandidateV2[], semanticSha256: string): readonly CapabilityCandidateV2[] {\n return candidates.map((candidate) => {\n const factIds = new Map<string, string>();\n const facts = candidate.facts.map((fact) => { const factId = createFactId(fact, { semanticSha256 }); factIds.set(fact.factId, factId); return Object.freeze({ ...fact, factId }); });\n const traceIds = new Map<string, string>();\n const traces = candidate.traces.map((trace) => {\n const steps = trace.steps.map((step) => Object.freeze({ ...step, factRefs: Object.freeze(step.factRefs.map((ref) => factIds.get(ref) ?? ref)) }));\n const traceId = createTraceId({ kind: trace.kind, steps }, { semanticSha256 });\n traceIds.set(trace.traceId, traceId);\n return Object.freeze({ ...trace, traceId, steps: Object.freeze(steps) });\n });\n const findings = candidate.findings.map((finding) => Object.freeze({\n ...finding,\n factRefs: Object.freeze(finding.factRefs.map((ref) => factIds.get(ref) ?? ref)),\n traceRefs: Object.freeze(finding.traceRefs.map((ref) => traceIds.get(ref) ?? ref)),\n }));\n return Object.freeze({ ...candidate, facts: Object.freeze(facts), traces: Object.freeze(traces), findings: Object.freeze(findings) });\n });\n}\nfunction rekeyFacts(facts: readonly SafeFactV2[], semanticSha256: string): readonly SafeFactV2[] {\n return facts.map((fact) => Object.freeze({ ...fact, factId: createFactId(fact, { semanticSha256 }) }));\n}\nfunction safeName(name: string | null): string | null { return name !== null && name.length <= 512 && !/[\\u0000-\\u001f\\u007f]|(?:https?|ftp):\\/\\/|(?:password|secret|token|api[ _-]*key)\\s*[:=]|(?:^|[/\\\\])\\.\\.(?:[/\\\\]|$)/i.test(name) ? name : null; }\nfunction finalFindings(candidates: readonly CapabilityCandidateV2[], rules: ReadonlyMap<string, AdmittedRuleV2>, semanticSha256: string): FindingV2[] {\n const output = new Map<string, FindingV2>();\n for (const candidate of candidates) for (const item of candidate.findings) {\n // A rule the admitted catalogue does not carry is refused here, never dropped: the candidate\n // boundary already rejects such a finding, so reaching this point is a scanner invariant\n // failure, and silently omitting it would publish a clean-looking result over hidden evidence.\n const resolution = resolveRuleAuthorityV2(rules, item.ruleId);\n if (!resolution.ok) throw new TypeError('Unadmitted rule at the finding boundary');\n const rule = resolution.rule;\n const body = { ruleId: item.ruleId, ruleRevision: rule.revision, effect: rule.effect, severity: rule.severity, confidence: rule.confidence, evidenceClass: item.evidenceClass, conclusion: item.conclusion, applicability: item.applicability, subject: item.subject, factRefs: [...item.factRefs], traceRefs: [...item.traceRefs], remediationId: rule.remediationId }; const finding = { ...body, findingId: createFindingId(body, { semanticSha256 }) }; output.set(finding.findingId, finding);\n }\n return [...output.values()];\n}\nexport function scanWorkflowV2(input: unknown): ScanWorkflowV2Result {\n try {\n const request = prepared(input); if ('ok' in request) return request;\n if (!authorityIsIntact() || BETA_DEFAULT_PROFILE_MANIFEST.digest !== PROFILE_MANIFEST_DIGEST_V2) return failure('TOOL_INVARIANT_FAILED', 'Scanner built-in authority is inconsistent.');\n const parsed = parseSourceDocument(request.bytes, request.limits); if (!parsed.ok) return failure(parsed.code, parsed.message, 'cause' in parsed ? parsed.cause : undefined);\n const normalizedResult = normalizeSecurityWorkflow(parsed.document, request.limits); if (!normalizedResult.ok) return failure(normalizedResult.code, normalizedResult.message, 'cause' in normalizedResult ? normalizedResult.cause : undefined);\n const normalized = { ...normalizedResult, semanticSha256: bytesToHex(sha256(canonicalJsonBytes({ workflow: normalizedResult.semanticSha256, target: request.target.contextDigest }))) };\n const semantics = semanticView(normalized.workflow); if ('ok' in semantics) return semantics;\n let semanticContext: SemanticContextV2;\n try {\n semanticContext = resolveAnalyzerSemanticContext({ source: parsed.document, workflow: normalized.workflow, target: request.target, catalogue: BUILTIN_SEMANTIC_CATALOGUE_V2, advisories: EMPTY_ADVISORY_CATALOGUE_V2, capabilityId: 'structural-policies', required: true });\n } catch (error) {\n if (error instanceof SemanticCatalogueAdmissionError) return semanticCatalogueFailure(error);\n throw error;\n }\n const context: AnalyzerContextV2 = Object.freeze({ source: parsed.document, workflow: normalized.workflow, target: request.target, limits: request.limits, semantics: semantics.view, rules: createAdmittedRuleView(), priorOutcomes: new Map() });\n const schedule = scanCapabilitiesV2(context, BETA_DEFAULT_PROFILE_MANIFEST, createAdmittedCapabilityRegistry(request.approvedDomains));\n const spanLoss = spanLossDiagnostics(parsed.sourceSpanUsage); if ('ok' in spanLoss) return spanLoss;\n const extra = [...spanLoss.diagnostics, ...ambiguityDiagnostics(normalized.workflow), ...semanticContext.diagnostics];\n const completed = addDiagnostics(schedule, extra, normalized.semanticSha256);\n const native = awaitableInsights(context);\n const findings = finalFindings(completed.candidates, context.rules.rules, normalized.semanticSha256);\n const assessment = scoreFindingsV2(findings, native.complexity);\n const limits = { schemaVersion: request.limits.schemaVersion, digest: bytesToHex(sha256(canonicalJsonBytes(request.limits))), usage: limitUsage(request.limits, parsed.document, parsed.sourceWorkUnits, normalized, findings.length, completed.diagnostics.length, parsed.sourceSpanUsage) };\n const composed = composeScannerResultV2({ engine: { id: ADMITTED_ENGINE_ID, version: ADMITTED_ENGINE_VERSION, buildDigest: ENGINE_BUILD_DIGEST_V2 }, input: { rawSha256: parsed.document.rawSha256, semanticSha256: normalized.semanticSha256, ambiguitySha256: normalized.ambiguitySha256, ambiguityCount: normalized.ambiguityCount, utf8Bytes: parsed.document.utf8Bytes }, profile: { id: ADMITTED_PROFILE_ID, version: ADMITTED_PROFILE_VERSION }, ruleset: { ...BUILTIN_RULESET_AUTHORITY_V2, rules: context.rules.rules }, semantics: BUILTIN_SEMANTICS_AUTHORITY_V2, target: request.target, limits, analysis: { executions: completed.executions, diagnostics: completed.diagnostics, candidates: completed.candidates }, facts: rekeyFacts(semanticContext.facts, normalized.semanticSha256), workflow: native.workflow, assessment, stats: { rejectedCandidates: 0, collapsedCandidates: 0, omittedFindings: completed.candidates.reduce((sum, candidate) => sum + candidate.omitted, 0) } });\n if (!composed.ok) return failure('TOOL_INVARIANT_FAILED', 'Scanner result composition failed.');\n if (composed.result.stats.serializedBytes > request.limits.maxSerializedResultBytes) return failure('WORKFLOW_TOO_COMPLEX', 'Scanner result exceeds the configured serialization limit.', 'SERIALIZED_RESULT_LIMIT');\n return { ok: true, result: composed.result };\n } catch { return failure('TOOL_INVARIANT_FAILED', 'Scanner encountered an internal invariant failure.'); }\n}\nfunction awaitableInsights(context: AnalyzerContextV2): { workflow: ScannerResultV2['workflow']; complexity: ScannerResultV2['workflow']['complexity'] } {\n const native = toNativeWorkflow(context); const insights = analyzeWorkflowInsights(native);\n const { connectionCount: _connectionCount, ...overview } = insights.workflow;\n return { workflow: { ...overview, name: safeName(insights.workflow.name), edgeCount: context.workflow.edges.length, resolvedEdgeCount: context.workflow.edges.filter((edge) => edge.resolution === 'RESOLVED').length }, complexity: insights.workflow.complexity };\n}\n"],
5
+ "mappings": "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R,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,UACT,QAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAA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",
6
+ "names": ["hex", "data", "record", "records", "id", "field", "compareCanonicalStrings", "text", "identifier", "range", "count", "result", "body", "identifier", "text", "result", "types", "range", "text", "tagged", "path", "node", "count", "text", "text", "member", "node", "field", "result", "text", "encoder", "encodeIdentityPart", "containsLoneSurrogate", "tagged", "source", "edge", "encoder", "source", "member", "refs", "labels", "result", "edge", "refs", "node", "member", "source", "body", "found", "source", "literal", "closed", "count", "member", "childRegion", "result", "id", "nodeRef", "member", "node", "node", "edge", "digest", "field", "member", "source", "membersNamed", "member", "labels", "digest", "effectiveMember", "node", "refs", "unique", "isDigit", "result", "field", "error", "invalid", "result", "error", "freeze", "digest", "invalid", "freeze", "error", "invalid", "ownRecord", "field", "result", "denseArray", "error", "range", "TOP", "DIGEST", "has", "error", "keys", "dense", "enumValue", "unique", "result", "range", "record", "freeze", "body", "records", "body", "TOP", "digest", "DIGEST", "freeze", "error", "DIGEST", "fail", "refs", "provenance", "pointer", "required", "endpoint", "path", "record", "nodeType", "MAX_ITEMS", "fail", "own", "error", "text", "nodeType", "dense", "records", "node", "versionText", "addPrereleaseSamples", "rangeSamples", "range", "comparator", "record", "PROVENANCE", "nodeType", "field", "field", "properties", "fact", "properties", "body", "LIMITS", "fail", "required", "record", "dense", "keys", "safeText", "pointer", "enumValue", "result", "position", "source", "identityDigest", "schema", "auth", "text", "error", "subject", "fact", "required", "encoder", "diagnostic", "unique", "record", "required", "id", "pointer", "path", "capability", "compareCodePoints", "field", "digest", "subject", "properties", "required", "capability", "finding", "node", "subject", "properties", "source", "finding", "node", "pointer", "field", "path", "target", "packageName", "versionText", "node", "record", "paths", "path", "pointer", "field", "authorityEnd", "count", "records", "counters", "source", "keys", "required", "node", "fact", "compareStrings", "subject", "properties", "collectFields", "field", "source", "record", "edge", "target", "result", "node", "record", "node", "source", "member", "field", "pointer", "body", "result", "isRecord", "literal", "authentication", "node", "path", "isRecord", "node", "node", "node", "packageName", "compareCanonicalStrings", "node", "compareCanonicalStrings", "node", "node", "unique", "compactNodeType", "diagnostic", "required", "id", "required", "body", "digest", "body", "invalid", "position", "id", "record", "dense", "stringList", "result", "fail", "limitExceeded", "dense", "has", "text", "subject", "field", "result", "integer", "compare", "digest", "enums", "enumValue", "counters", "ownRecord", "required", "sameList", "authority", "properties", "schemas", "schema", "body", "mapping", "ownNames", "snapshot", "error", "capability", "fact", "id", "unique", "node", "edge", "source", "count", "trace", "finding", "compareDiagnostics", "diagnostic", "utf8Bytes", "arrayValue", "ownNames", "snapshotLimits", "target", "capability", "execution", "error", "id", "diagnostic", "registryEntry", "record", "sameList", "ownNames", "counters", "capability", "fact", "insights", "subject", "finding", "node", "refs", "id", "diagnostic", "TOP", "DIGEST", "SECRET", "isRecord", "keys", "required", "path", "text", "digest", "integer", "refs", "result", "position", "source", "subject", "exceeds", "capability", "v", "assessment", "id", "resultOmitted", "properties", "out", "snapshot", "encoder", "encodeArray", "encodeObject", "ownNames", "encoder", "DIGEST", "subject", "record", "exactRecord", "source", "node", "edge", "properties", "text", "digest", "denseArray", "result", "mapping", "digest", "RULE_KEYS", "data", "authority", "CAPABILITY_ORDER", "DIGEST", "error", "exactRecord", "result", "node", "edge", "subject", "fact", "id", "compareStrings", "trace", "finding", "record", "body", "findingId", "digest", "count", "text", "DIGEST", "prepared", "dense", "finding", "error", "closed", "digest", "enumValue", "subjectKey", "subject", "refs", "nodeRef", "text", "pointer", "position", "integer", "path", "required", "result", "compareStrings", "required", "capability", "mapping", "LIMIT_KEYS", "failure", "record", "required", "error", "node", "diagnostic", "id", "source", "fact", "trace", "traceId", "finding", "body", "assessment", "insights", "edge"]
7
+ }