@timeax/digital-service-engine 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/index.cjs +2933 -0
- package/dist/core/index.cjs.map +1 -0
- package/dist/core/index.d.cts +507 -0
- package/dist/core/index.d.ts +507 -0
- package/dist/core/index.js +2899 -0
- package/dist/core/index.js.map +1 -0
- package/dist/react/index.cjs +4015 -0
- package/dist/react/index.cjs.map +1 -0
- package/dist/react/index.d.cts +1572 -0
- package/dist/react/index.d.ts +1572 -0
- package/dist/react/index.js +3984 -0
- package/dist/react/index.js.map +1 -0
- package/dist/schema/index.cjs +19 -0
- package/dist/schema/index.cjs.map +1 -0
- package/dist/schema/index.d.cts +671 -0
- package/dist/schema/index.d.ts +671 -0
- package/dist/schema/index.js +1 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/workspace/index.cjs +9755 -0
- package/dist/workspace/index.cjs.map +1 -0
- package/dist/workspace/index.d.cts +1995 -0
- package/dist/workspace/index.d.ts +1995 -0
- package/dist/workspace/index.js +9711 -0
- package/dist/workspace/index.js.map +1 -0
- package/package.json +97 -0
- package/schema/editor-snapshot.schema.json +1138 -0
- package/schema/policies.schema.json +148 -0
- package/schema/service-props.schema.json +772 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/core/normalise.ts","../../src/core/validate/shared.ts","../../src/core/validate/steps/visibility.ts","../../src/core/validate/steps/structure.ts","../../src/core/validate/steps/identity.ts","../../src/core/validate/steps/option-maps.ts","../../src/core/validate/steps/service-vs-input.ts","../../src/core/validate/steps/utility.ts","../../src/utils/index.ts","../../src/core/validate/steps/rates.ts","../../src/core/validate/steps/constraints.ts","../../src/core/validate/steps/custom.ts","../../src/core/validate/steps/global-utility-guard.ts","../../src/core/validate/steps/unbound.ts","../../src/core/validate/steps/fallbacks.ts","../../src/core/validate/policies/collect-service-items.ts","../../src/core/validate/policies/ops.ts","../../src/core/validate/policies/apply-policies.ts","../../src/core/validate/index.ts","../../src/core/builder.ts","../../src/core/fallback.ts","../../src/core/rate-coherence.ts","../../src/core/tag-relations.ts"],"sourcesContent":["// src/core/normalise.ts\n\nimport { cloneDeep } from \"lodash-es\";\nimport type {\n Field,\n FieldOption,\n PricingRole,\n ServiceFallback,\n ServiceIdRef,\n ServiceProps,\n Tag,\n} from \"@/schema\";\n\nexport type NormaliseOptions = {\n /** default pricing role for fields/options when missing */\n defaultPricingRole?: PricingRole; // default: 'base',\n constraints?: string[];\n};\n\nexport function normalise(\n input: unknown,\n opts: NormaliseOptions = {},\n): ServiceProps {\n const defRole: PricingRole = opts.defaultPricingRole ?? \"base\";\n const constraints = opts.constraints ?? [\"refill\", \"cancel\", \"dripfeed\"];\n const obj = toObject(input);\n\n // ── Canonical top-level keys only\n const rawFilters = Array.isArray((obj as any).filters)\n ? (obj as any).filters\n : [];\n const rawFields = Array.isArray((obj as any).fields)\n ? (obj as any).fields\n : [];\n\n const includes_for_buttons = toStringArrayMap(\n (obj as any).includes_for_buttons,\n );\n const excludes_for_buttons = toStringArrayMap(\n (obj as any).excludes_for_buttons,\n );\n\n // Tags & fields\n let filters: Tag[] = rawFilters.map((t: any) => coerceTag(t, constraints));\n const fields: Field[] = rawFields.map((f: any) => coerceField(f, defRole));\n\n // ── Ensure a root tag exists (id: 't:root')\n if (!filters.some((t) => t.id === \"t:root\")) {\n filters = [{ id: \"t:root\", label: \"Root\" }, ...filters];\n }\n\n // Canonical fallbacks only\n const fallbacks = coerceFallbacks((obj as any).fallbacks);\n\n const out: ServiceProps = {\n filters,\n fields,\n order_for_tags: (obj as any).order_for_tags,\n ...(isNonEmpty(includes_for_buttons) && { includes_for_buttons }),\n ...(isNonEmpty(excludes_for_buttons) && { excludes_for_buttons }),\n ...(fallbacks &&\n (isNonEmpty(fallbacks.nodes) || isNonEmpty(fallbacks.global)) && {\n fallbacks,\n }),\n schema_version:\n typeof (obj as any).schema_version === \"string\"\n ? (obj as any).schema_version\n : \"1.0\",\n };\n\n propagateConstraints(out, constraints);\n return out;\n}\n\n/* ───────────────────────── Constraint propagation ───────────────────────── */\n\n/**\n * Propagate constraint flags down the tag tree:\n * - Any flag defined on an ancestor overrides the child's local value.\n * - Writes back the effective value to each tag.constraints.\n * - Records provenance in tag.constraints_origin[flag] = <originTagId>.\n * - Records child overrides in tag.constraints_overrides[flag] = { from, to, origin }.\n *\n * IMPORTANT: Children inherit the **effective** value from their parent,\n * not the parent's raw local. This ensures overridden values keep propagating.\n */\nfunction propagateConstraints(props: ServiceProps, flagKeys: string[]): void {\n const tags = Array.isArray(props.filters) ? props.filters : [];\n if (!tags.length) return;\n\n const byId = new Map(tags.map((t) => [t.id, t]));\n const children = new Map<string, Tag[]>();\n\n for (const t of tags) {\n const pid = t.bind_id;\n if (!pid || !byId.has(pid)) continue;\n if (!children.has(pid)) children.set(pid, []);\n children.get(pid)!.push(t);\n }\n\n const roots = tags.filter((t) => !t.bind_id || !byId.has(t.bind_id));\n const starts = roots.length ? roots : tags;\n\n type Inherited = Partial<Record<string, { val: boolean; origin: string }>>;\n const visited = new Set<string>();\n\n const visit = (tag: Tag, inherited: Inherited) => {\n if (visited.has(tag.id)) return;\n visited.add(tag.id);\n\n // If the tag already has overrides, it means it was already normalised once.\n // We should use the 'from' value as our local baseline for this pass\n // so that we don't lose the original local intent.\n const local = cloneDeep(tag.constraints ?? {});\n if (tag.constraints_overrides) {\n for (const [k, over] of Object.entries(tag.constraints_overrides)) {\n if (over) local[k] = over.from;\n }\n }\n\n const next: Partial<Record<string, boolean>> = {};\n const origin: Partial<Record<string, string>> = {};\n const overrides: NonNullable<Tag[\"constraints_overrides\"]> = {};\n\n for (const k of flagKeys) {\n const inh = inherited[k];\n const prev = local[k];\n\n if (inh) {\n if (prev === undefined || prev === inh.val) {\n next[k] = inh.val;\n origin[k] = inh.origin;\n } else {\n next[k] = inh.val;\n origin[k] = inh.origin;\n overrides[k] = {\n from: prev as boolean,\n to: inh.val,\n origin: inh.origin,\n };\n }\n } else if (prev !== undefined) {\n next[k] = prev as boolean;\n origin[k] = tag.id;\n }\n }\n\n tag.constraints = Object.keys(next).length ? next : undefined;\n tag.constraints_origin = Object.keys(origin).length ? origin : undefined;\n tag.constraints_overrides = Object.keys(overrides).length ? overrides : undefined;\n\n const passDown: Inherited = { ...inherited };\n for (const k of flagKeys) {\n if (next[k] !== undefined && origin[k] !== undefined) {\n passDown[k] = { val: next[k] as boolean, origin: origin[k]! };\n }\n }\n for (const c of children.get(tag.id) ?? []) visit(c, passDown);\n };\n\n for (const r of starts) visit(r, {});\n}\n\n/* ───────────────────────────── coercers ───────────────────────────── */\n\nfunction coerceTag(src: any, flagKeys: string[]): Tag {\n if (!src || typeof src !== \"object\") src = {};\n const id = str(src.id);\n const label = str(src.label);\n const bind_id = str(src.bind_id) || (id == \"t:root\" ? undefined : \"t:root\");\n const service_id = toNumberOrUndefined(src.service_id);\n\n const includes = toStringArray(src.includes);\n const excludes = toStringArray(src.excludes);\n\n let constraints: Record<string, boolean> | undefined = undefined;\n if (src.constraints && typeof src.constraints === \"object\") {\n constraints = {};\n for (const k of flagKeys) {\n const v = (src.constraints as any)[k];\n if (v !== undefined) {\n constraints[k] = bool(v)!;\n }\n }\n if (Object.keys(constraints).length === 0) {\n constraints = undefined;\n }\n }\n\n const constraints_overrides =\n src.constraints_overrides && typeof src.constraints_overrides === \"object\"\n ? (src.constraints_overrides as Tag[\"constraints_overrides\"])\n : undefined;\n\n const meta =\n src.meta && typeof src.meta === \"object\"\n ? (src.meta as Record<string, unknown>)\n : undefined;\n\n const tag: Tag = {\n id: \"\",\n label: \"\",\n ...(id && { id }),\n ...(label && { label }),\n ...(bind_id && { bind_id }),\n ...(service_id !== undefined && { service_id }),\n ...(constraints && { constraints }),\n ...(constraints_overrides && { constraints_overrides }),\n ...(includes.length && { includes: dedupe(includes) }),\n ...(excludes.length && { excludes: dedupe(excludes) }),\n ...(meta && { meta }),\n };\n return tag;\n}\nfunction coerceField(src: any, defRole: PricingRole): Field {\n if (!src || typeof src !== \"object\") src = {};\n\n const bind_id = normaliseBindId(src.bind_id);\n const type = str(src.type) || \"text\";\n const id = str(src.id);\n const name = typeof src.name === \"string\" ? src.name : undefined;\n\n // BaseFieldUI (trimmed)\n const label = str(src.label) || \"\";\n const required = !!src.required;\n\n // host-defined UI schema + defaults (pass-through if objects)\n const ui =\n src.ui && typeof src.ui === \"object\"\n ? (src.ui as Record<string, unknown>)\n : undefined;\n const defaults =\n src.defaults && typeof src.defaults === \"object\"\n ? (src.defaults as Record<string, unknown>)\n : undefined;\n\n // field-level role (used as default for options)\n const pricing_role: PricingRole =\n src.pricing_role === \"utility\" || src.pricing_role === \"base\"\n ? src.pricing_role\n : defRole;\n\n // options\n const srcHasOptions = Array.isArray(src.options) && src.options.length > 0;\n const options = srcHasOptions\n ? (src.options as any[]).map((o) => coerceOption(o, pricing_role))\n : undefined;\n\n // custom component (only for type === 'custom')\n const component =\n type === \"custom\" ? str(src.component) || undefined : undefined;\n\n // meta (pass-through)\n const meta =\n src.meta && typeof src.meta === \"object\"\n ? { ...(src.meta as any) }\n : undefined;\n\n // button rule:\n // - option-based fields are always buttons\n // - otherwise, respect explicit boolean true\n const button: boolean = srcHasOptions ? true : src.button === true;\n\n // field-level service_id is allowed only for *buttons* with base role\n const field_service_id_raw = toNumberOrUndefined(src.service_id);\n const field_service_id =\n button &&\n pricing_role !== \"utility\" &&\n field_service_id_raw !== undefined\n ? field_service_id_raw\n : undefined;\n\n const field: Field = {\n id,\n type,\n ...(bind_id !== undefined && { bind_id }),\n ...(name && { name }),\n ...(options && options.length && { options }),\n ...(component && { component }),\n pricing_role,\n label,\n required,\n ...(ui && { ui: ui as any }),\n ...(defaults && { defaults }),\n ...(meta && { meta }),\n ...(button ? { button } : {}),\n ...(field_service_id !== undefined && { service_id: field_service_id }),\n };\n\n return field;\n}\n\nfunction coerceOption(src: any, inheritRole: PricingRole): FieldOption {\n if (!src || typeof src !== \"object\") src = {};\n const id = str(src.id);\n const label = str(src.label);\n const service_id = toNumberOrUndefined(src.service_id);\n const value =\n typeof src.value === \"string\" || typeof src.value === \"number\"\n ? (src.value as string | number)\n : undefined;\n\n const pricing_role: PricingRole =\n src.pricing_role === \"utility\" || src.pricing_role === \"base\"\n ? src.pricing_role\n : inheritRole;\n\n const meta =\n src.meta && typeof src.meta === \"object\"\n ? (src.meta as Record<string, unknown>)\n : undefined;\n\n const option: FieldOption = {\n id: \"\",\n label: \"\",\n ...(id && { id }),\n ...(label && { label }),\n ...(value !== undefined && { value }),\n ...(service_id !== undefined && { service_id }),\n pricing_role,\n ...(meta && { meta }),\n };\n return option;\n}\n\n/* ───────────────────────── fallbacks (canonical only) ───────────────────────── */\n\nfunction coerceFallbacks(src: any): ServiceFallback | undefined {\n if (!src || typeof src !== \"object\") return undefined;\n\n const out: ServiceFallback = {};\n const g = (src as any).global;\n const n = (src as any).nodes;\n\n if (g && typeof g === \"object\") {\n const rg: Record<string, ServiceIdRef[]> = {};\n for (const [k, v] of Object.entries(g)) {\n const key = String(k);\n const arr = toServiceIdArray(v);\n const clean = dedupe(arr.filter((x) => String(x) !== key));\n if (clean.length) rg[key] = clean;\n }\n if (Object.keys(rg).length) out.global = rg;\n }\n\n if (n && typeof n === \"object\") {\n const rn: Record<string, ServiceIdRef[]> = {};\n for (const [nodeId, v] of Object.entries(n)) {\n const key = String(nodeId);\n const arr = toServiceIdArray(v);\n const clean = dedupe(arr.filter((x) => String(x) !== key));\n if (clean.length) rn[key] = clean;\n }\n if (Object.keys(rn).length) out.nodes = rn;\n }\n\n return out.nodes || out.global ? out : undefined;\n}\n\n/* ───────────────────────── utilities ───────────────────────── */\n\nfunction toObject(input: unknown): Record<string, unknown> {\n if (input && typeof input === \"object\")\n return input as Record<string, unknown>;\n throw new TypeError(\"normalise(): expected an object payload\");\n}\n\nfunction normaliseBindId(bind: unknown): string | string[] | undefined {\n if (typeof bind === \"string\" && bind.trim()) return bind.trim();\n if (Array.isArray(bind)) {\n const arr = dedupe(bind.map((b) => String(b).trim()).filter(Boolean));\n if (arr.length === 0) return undefined;\n if (arr.length === 1) return arr[0];\n return arr;\n }\n return undefined;\n}\n\nfunction toStringArrayMap(src: any): Record<string, string[]> | undefined {\n if (!src || typeof src !== \"object\") return undefined;\n const out: Record<string, string[]> = {};\n for (const [k, v] of Object.entries(src)) {\n if (!k) continue;\n const arr = toStringArray(v);\n if (arr.length) out[k] = dedupe(arr);\n }\n return Object.keys(out).length ? out : undefined;\n}\n\nfunction toStringArray(v: any): string[] {\n if (!Array.isArray(v)) return [];\n return v.map((x) => String(x)).filter((s) => !!s && s.trim().length > 0);\n}\n\nfunction toNumberOrUndefined(v: any): number | undefined {\n if (v === null || v === undefined) return undefined;\n const n = Number(v);\n return Number.isFinite(n) ? n : undefined;\n}\n\nfunction str(v: any): string | undefined {\n if (typeof v === \"string\" && v.trim().length > 0) return v.trim();\n return undefined;\n}\n\nfunction bool(v: any): boolean | undefined {\n if (v === undefined) return undefined;\n return !!v;\n}\n\nfunction dedupe<T>(arr: T[]): T[] {\n return Array.from(new Set(arr));\n}\n\nfunction isNonEmpty<T extends Record<string, any> | undefined>(\n obj: T,\n): obj is NonNullable<T> {\n return !!obj && Object.keys(obj).length > 0;\n}\n\nfunction toServiceIdArray(v: any): ServiceIdRef[] {\n if (!Array.isArray(v)) return [];\n return v\n .map((x) =>\n typeof x === \"number\" || typeof x === \"string\" ? x : String(x),\n )\n .filter(\n (x) => x !== \"\" && x !== null && x !== undefined,\n ) as ServiceIdRef[];\n}\n","// src/core/validate/shared.ts\nimport type { ServiceProps, Tag, Field } from \"@/schema\";\nimport type { DgpServiceMap } from \"@/schema/provider\";\nimport type { ValidationError, ValidatorOptions } from \"@/schema/validation\";\n\nexport interface ValidationCtx {\n readonly props: ServiceProps;\n readonly options: ValidatorOptions;\n\n readonly errors: ValidationError[];\n\n readonly serviceMap: DgpServiceMap;\n readonly selectedKeys: Set<string>;\n\n readonly tags: Tag[];\n readonly fields: Field[];\n\n readonly tagById: Map<string, Tag>;\n readonly fieldById: Map<string, Field>;\n\n fieldsVisibleUnder: (tagId: string) => Field[];\n}\n\nexport function isFiniteNumber(v: unknown): v is number {\n return typeof v === \"number\" && Number.isFinite(v);\n}\n\nexport function hasAnyServiceOption(f: Field): boolean {\n return (f.options ?? []).some((o) => isFiniteNumber(o.service_id));\n}\n\nexport function isBoundTo(f: Field, tagId: string): boolean {\n const b: string | string[] | undefined = f.bind_id;\n if (!b) return false;\n return Array.isArray(b) ? b.includes(tagId) : b === tagId;\n}\n\nexport function getByPath(obj: unknown, path: string | undefined): unknown {\n if (!path) return undefined;\n\n const parts: string[] = path.split(\".\");\n let cur: any = obj;\n\n for (const p of parts) {\n if (cur == null) return undefined;\n cur = cur[p];\n }\n\n return cur;\n}\n\nexport type WhereClause = NonNullable<\n NonNullable<import(\"@/schema/validation\").DynamicRule[\"filter\"]>[\"where\"]\n>[number];\n\nexport function jsonStable(v: unknown): string {\n try {\n return JSON.stringify(v);\n } catch {\n return String(v);\n }\n}\n\nexport function eqValue(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true;\n return jsonStable(a) === jsonStable(b);\n}\n\nexport function includesValue(\n arr: readonly unknown[],\n needle: unknown,\n): boolean {\n for (const v of arr) {\n if (eqValue(v, needle)) return true;\n }\n return false;\n}\n\nexport function matchesWhere(\n svc: Record<string, unknown>,\n where: readonly WhereClause[] | undefined,\n): boolean {\n if (!where || where.length === 0) return true;\n\n const root: Record<string, unknown> = { service: svc };\n\n for (const clause of where) {\n const path: string = clause.path;\n const op: string = clause.op ?? \"eq\";\n const value: unknown = clause.value;\n\n const cur: unknown = getByPath(root, path);\n\n if (op === \"exists\") {\n if (cur === undefined || cur === null) return false;\n continue;\n }\n if (op === \"truthy\") {\n if (!cur) return false;\n continue;\n }\n if (op === \"falsy\") {\n if (cur) return false;\n continue;\n }\n\n if (op === \"in\" || op === \"nin\") {\n const list: unknown[] = Array.isArray(value) ? value : [];\n const hit: boolean = includesValue(list, cur);\n if (op === \"in\" && !hit) return false;\n if (op === \"nin\" && hit) return false;\n continue;\n }\n\n if (op === \"neq\") {\n if (eqValue(cur, value)) return false;\n continue;\n }\n\n if (op === \"sw\") {\n const s: string = String(cur ?? \"\");\n const prefix: string = String(value ?? \"\");\n if (!s.startsWith(prefix)) return false;\n continue;\n }\n\n // default \"eq\"\n if (!eqValue(cur, value)) return false;\n }\n\n return true;\n}\n\nexport function serviceFlagState(\n svc: Record<string, unknown>,\n flagId: string,\n): boolean | undefined {\n const flags: unknown = (svc as any).flags;\n const entry: unknown =\n flags && typeof flags === \"object\" ? (flags as any)[flagId] : undefined;\n\n const enabled: unknown =\n entry && typeof entry === \"object\" ? (entry as any).enabled : undefined;\n\n if (enabled === true) return true;\n if (enabled === false) return false;\n\n return undefined;\n}\n\nexport function isServiceFlagEnabled(\n svc: Record<string, unknown>,\n flagId: string,\n): boolean {\n return serviceFlagState(svc, flagId) === true;\n}\n\n// src/core/validate/error.ts\nexport function withAffected(\n details: Record<string, unknown> | undefined,\n ids: string[] | undefined,\n): Record<string, unknown> | undefined {\n if (!ids || ids.length <= 1) return details;\n return { ...(details ?? {}), affectedIds: ids };\n}\n","// src/core/validate/steps/visibility.ts\nimport type { Field } from \"@/schema\";\nimport type { ValidationCtx } from \"../shared\";\nimport { isBoundTo, isFiniteNumber, withAffected } from \"../shared\";\n\nexport function createFieldsVisibleUnder(\n v: ValidationCtx,\n): (tagId: string) => Field[] {\n return (tagId: string): Field[] => {\n const tag = v.tagById.get(tagId);\n const includesTag: Set<string> = new Set<string>(tag?.includes ?? []);\n const excludesTag: Set<string> = new Set<string>(tag?.excludes ?? []);\n\n const incForOpt: Record<string, string[]> =\n v.props.includes_for_buttons ?? {};\n const excForOpt: Record<string, string[]> =\n v.props.excludes_for_buttons ?? {};\n\n const includesOpt: Set<string> = new Set<string>();\n const excludesOpt: Set<string> = new Set<string>();\n\n for (const key of v.selectedKeys) {\n for (const id of incForOpt[key] ?? []) includesOpt.add(id);\n for (const id of excForOpt[key] ?? []) excludesOpt.add(id);\n }\n\n const merged: Map<string, Field> = new Map<string, Field>();\n\n for (const f of v.fields) {\n if (isBoundTo(f, tagId)) merged.set(f.id, f);\n if (includesTag.has(f.id)) merged.set(f.id, f);\n if (includesOpt.has(f.id)) merged.set(f.id, f);\n }\n\n for (const id of excludesTag) merged.delete(id);\n for (const id of excludesOpt) merged.delete(id);\n\n return Array.from(merged.values());\n };\n}\n\nexport function validateVisibility(v: ValidationCtx): void {\n // duplicate visible labels (selection-aware)\n for (const t of v.tags) {\n const visible: Field[] = v.fieldsVisibleUnder(t.id);\n const seen: Map<string, string> = new Map<string, string>();\n\n for (const f of visible) {\n const label: string = (f.label ?? \"\").trim();\n if (!label) continue;\n\n if (seen.has(label)) {\n const otherId: string | undefined = seen.get(label);\n\n v.errors.push({\n code: \"duplicate_visible_label\",\n severity: \"error\",\n message: `Duplicate visible label \"${label}\" under tag \"${t.id}\".`,\n nodeId: f.id,\n details: withAffected(\n { tagId: t.id, other: otherId, label },\n otherId ? [t.id, f.id, otherId] : [t.id, f.id],\n ),\n });\n } else {\n seen.set(label, f.id);\n }\n }\n }\n\n // Quantity marker rule: at most one marker per visible group (tag)\n for (const t of v.tags) {\n const visible: Field[] = v.fieldsVisibleUnder(t.id);\n const markers: string[] = [];\n\n for (const f of visible) {\n const q: unknown = (f.meta as any)?.quantity;\n if (q) markers.push(f.id);\n }\n\n if (markers.length > 1) {\n v.errors.push({\n code: \"quantity_multiple_markers\",\n severity: \"error\",\n message: `Multiple quantity markers found under tag \"${t.id}\". Only one is allowed per visible group.`,\n nodeId: t.id,\n details: withAffected({ tagId: t.id, markers }, [\n t.id,\n ...markers,\n ]),\n });\n }\n }\n\n // utility_without_base per visible tag group (selection-aware)\n for (const t of v.tags) {\n const visible: Field[] = v.fieldsVisibleUnder(t.id);\n\n let hasBase: boolean = false;\n let hasUtility: boolean = false;\n const utilityOptionIds: string[] = [];\n\n for (const f of visible) {\n for (const o of f.options ?? []) {\n if (!isFiniteNumber(o.service_id)) continue;\n\n const role: string = o.pricing_role ?? f.pricing_role ?? \"base\";\n if (role === \"base\") hasBase = true;\n else if (role === \"utility\") {\n hasUtility = true;\n utilityOptionIds.push(o.id);\n }\n }\n }\n\n if (hasUtility && !hasBase) {\n v.errors.push({\n code: \"utility_without_base\",\n severity: \"error\",\n message: `Utility-priced options exist under tag \"${t.id}\" but no base-priced options were found in the same visible group.`,\n nodeId: t.id,\n details: withAffected({ tagId: t.id, utilityOptionIds }, [\n t.id,\n ...utilityOptionIds,\n ]),\n });\n }\n }\n}\n","// src/core/validate/steps/structure.ts\nimport type { ValidationCtx } from \"../shared\";\nimport { withAffected } from \"../shared\";\nimport { isFiniteNumber } from \"../shared\";\n\nexport function validateStructure(v: ValidationCtx): void {\n const tags = v.tags;\n const fields = v.fields;\n\n // root present\n if (!tags.some((t) => t.id === \"root\")) {\n v.errors.push({\n code: \"root_missing\",\n severity: \"error\",\n message: 'Missing required root tag with id \"root\".',\n });\n }\n\n // cycles in tag parentage\n const visiting: Set<string> = new Set<string>();\n const visited: Set<string> = new Set<string>();\n\n const hasCycleFrom = (id: string): boolean => {\n if (visiting.has(id)) return true;\n if (visited.has(id)) return false;\n\n visiting.add(id);\n\n const parent: string | undefined = v.tagById.get(id)?.bind_id;\n if (parent && v.tagById.has(parent) && hasCycleFrom(parent))\n return true;\n\n visiting.delete(id);\n visited.add(id);\n return false;\n };\n\n for (const t of tags) {\n if (hasCycleFrom(t.id)) {\n v.errors.push({\n code: \"cycle_in_tags\",\n severity: \"error\",\n message: `Cycle detected in tag parentage starting at tag \"${t.id}\".`,\n nodeId: t.id,\n details: { tagId: t.id },\n });\n break;\n }\n }\n\n // tag.bind_id must point to existing tag (if present)\n for (const t of tags) {\n if (t.bind_id && !v.tagById.has(t.bind_id)) {\n v.errors.push({\n code: \"bad_bind_reference\",\n severity: \"error\",\n message: `Tag \"${t.id}\" binds to missing parent tag \"${t.bind_id}\".`,\n nodeId: t.id,\n details: withAffected({ ref: t.bind_id }, [t.id]),\n });\n }\n }\n\n // field.bind_id must reference tags\n for (const f of fields) {\n const b = f.bind_id;\n\n if (Array.isArray(b)) {\n for (const id of b) {\n if (!v.tagById.has(id)) {\n v.errors.push({\n code: \"bad_bind_reference\",\n severity: \"error\",\n message: `Field \"${f.id}\" binds to missing tag \"${id}\".`,\n nodeId: f.id,\n details: withAffected({ ref: id }, [f.id]),\n });\n }\n }\n } else if (typeof b === \"string\") {\n if (!v.tagById.has(b)) {\n v.errors.push({\n code: \"bad_bind_reference\",\n severity: \"error\",\n message: `Field \"${f.id}\" binds to missing tag \"${b}\".`,\n nodeId: f.id,\n details: withAffected({ ref: b }, [f.id]),\n });\n }\n }\n }\n\n void isFiniteNumber; // keeps parity if you had helper usage in the original file\n}\n","// src/core/validate/steps/identity.ts\nimport type { ValidationCtx } from \"../shared\";\nimport { hasAnyServiceOption, withAffected } from \"../shared\";\n\nexport function validateIdentity(v: ValidationCtx): void {\n const tags = v.tags;\n const fields = v.fields;\n\n // duplicate ids across tags + fields\n {\n const firstSeen: Map<string, string> = new Map<string, string>(); // id -> first kind (\"tag\"|\"field\")\n const seen: Set<string> = new Set<string>();\n\n for (const t of tags) {\n if (seen.has(t.id)) {\n v.errors.push({\n code: \"duplicate_id\",\n severity: \"error\",\n message: `Duplicate id \"${t.id}\" found (tag).`,\n nodeId: t.id,\n // we only know the id itself; no other id to point at\n });\n } else {\n seen.add(t.id);\n firstSeen.set(t.id, \"tag\");\n }\n }\n\n for (const f of fields) {\n if (seen.has(f.id)) {\n const kind: string = firstSeen.get(f.id) ?? \"tag/field\";\n v.errors.push({\n code: \"duplicate_id\",\n severity: \"error\",\n message: `Duplicate id \"${f.id}\" found (field) — already used by a ${kind}.`,\n nodeId: f.id,\n });\n } else {\n seen.add(f.id);\n firstSeen.set(f.id, \"field\");\n }\n }\n }\n\n // tag labels unique + required\n {\n const seen: Map<string, string> = new Map<string, string>(); // label -> tagId\n\n for (const t of tags) {\n if (!t.label || !t.label.trim()) {\n v.errors.push({\n code: \"label_missing\",\n severity: \"error\",\n message: `Tag \"${t.id}\" is missing a label.`,\n nodeId: t.id,\n details: { kind: \"tag\" },\n });\n continue;\n }\n\n const k: string = t.label;\n\n if (seen.has(k)) {\n const otherId: string | undefined = seen.get(k);\n v.errors.push({\n code: \"duplicate_tag_label\",\n severity: \"error\",\n message: `Duplicate tag label \"${k}\" found on tag \"${t.id}\".`,\n nodeId: t.id,\n details: withAffected(\n { other: otherId, label: k },\n otherId ? [t.id, otherId] : undefined,\n ),\n });\n } else {\n seen.set(k, t.id);\n }\n }\n }\n\n // field labels required; names unique among user-input fields\n {\n const seenNames: Map<string, string> = new Map<string, string>(); // name -> fieldId\n\n for (const f of fields) {\n if (!f.label || !f.label.trim()) {\n v.errors.push({\n code: \"label_missing\",\n severity: \"error\",\n message: `Field \"${f.id}\" is missing a label.`,\n nodeId: f.id,\n details: { kind: \"field\" },\n });\n }\n\n const isUserInput: boolean = !!f.name && !hasAnyServiceOption(f);\n\n if (isUserInput && f.name) {\n const k: string = f.name;\n\n if (seenNames.has(k)) {\n const otherId: string | undefined = seenNames.get(k);\n v.errors.push({\n code: \"duplicate_field_name\",\n severity: \"error\",\n message: `Duplicate field name \"${k}\" found on field \"${f.id}\".`,\n nodeId: f.id,\n details: withAffected(\n { other: otherId, name: k },\n otherId ? [f.id, otherId] : undefined,\n ),\n });\n } else {\n seenNames.set(k, f.id);\n }\n }\n }\n }\n\n // option labels required\n for (const f of fields) {\n for (const o of f.options ?? []) {\n if (!o.label || !o.label.trim()) {\n v.errors.push({\n code: \"label_missing\",\n severity: \"error\",\n message: `Option \"${o.id}\" (field \"${f.id}\") is missing a label.`,\n nodeId: o.id,\n details: { kind: \"option\", fieldId: f.id },\n });\n }\n }\n }\n}\n","// src/core/validate/steps/option-maps.ts\nimport type { ValidationCtx } from \"../shared\";\nimport { withAffected } from \"../shared\";\n\ntype ParsedKey = { fieldId: string; optionId: string };\n\nexport function validateOptionMaps(v: ValidationCtx): void {\n const incMap: Record<string, string[]> = v.props.includes_for_buttons ?? {};\n const excMap: Record<string, string[]> = v.props.excludes_for_buttons ?? {};\n\n const parseKey = (key: string): ParsedKey | null => {\n const parts: string[] = key.split(\"::\");\n const fid: string | undefined = parts[0];\n const oid: string | undefined = parts[1];\n if (!fid || !oid) return null;\n return { fieldId: fid, optionId: oid };\n };\n\n const hasOption = (fid: string, oid: string): boolean => {\n const f = v.fieldById.get(fid);\n if (!f) return false;\n return !!(f.options ?? []).find((o) => o.id === oid);\n };\n\n const badKeyMessage = (key: string): string =>\n `Invalid option-map key \"${key}\". Expected \"fieldId::optionId\" pointing to an existing option.`;\n\n // bad_option_key\n for (const k of Object.keys(incMap)) {\n const p = parseKey(k);\n if (!p || !hasOption(p.fieldId, p.optionId)) {\n v.errors.push({\n code: \"bad_option_key\",\n severity: \"error\",\n message: badKeyMessage(k),\n details: { key: k },\n });\n }\n }\n for (const k of Object.keys(excMap)) {\n const p = parseKey(k);\n if (!p || !hasOption(p.fieldId, p.optionId)) {\n v.errors.push({\n code: \"bad_option_key\",\n severity: \"error\",\n message: badKeyMessage(k),\n details: { key: k },\n });\n }\n }\n\n // option_include_exclude_conflict\n for (const k of Object.keys(incMap)) {\n if (k in excMap) {\n const p = parseKey(k);\n const affected: string[] | undefined = p\n ? [p.fieldId, p.optionId]\n : undefined;\n\n v.errors.push({\n code: \"option_include_exclude_conflict\",\n severity: \"error\",\n message: `Option-map key \"${k}\" appears in both includes_for_buttons and excludes_for_buttons.`,\n nodeId: p?.fieldId,\n details: withAffected({ key: k }, affected),\n });\n }\n }\n}\n","// src/core/validate/steps/service-vs-input.ts\nimport type { ValidationCtx } from \"../shared\";\nimport { hasAnyServiceOption } from \"../shared\";\n\nexport function validateServiceVsUserInput(v: ValidationCtx): void {\n for (const f of v.fields) {\n const anySvc: boolean = hasAnyServiceOption(f);\n const hasName: boolean = !!(f.name && f.name.trim());\n\n if (f.type === \"custom\" && anySvc) {\n v.errors.push({\n code: \"user_input_field_has_service_option\",\n severity: \"error\",\n message: `Custom field \"${f.id}\" cannot map service options.`,\n nodeId: f.id,\n details: { reason: \"custom_cannot_map_service\" },\n });\n }\n\n if (!hasName) {\n // treated as service-backed → require at least one service option\n if (!anySvc) {\n v.errors.push({\n code: \"service_field_missing_service_id\",\n severity: \"error\",\n message: `Service-backed field \"${f.id}\" has no \"name\" and must provide at least one option with a service_id.`,\n nodeId: f.id,\n });\n }\n } else {\n // user-input → options must not carry service_id\n if (anySvc) {\n v.errors.push({\n code: \"user_input_field_has_service_option\",\n severity: \"error\",\n message: `User-input field \"${f.id}\" has a name and must not include any options with service_id.`,\n nodeId: f.id,\n });\n }\n }\n }\n}\n","// src/core/validate/steps/utility.ts\nimport type { ValidationCtx } from \"../shared\";\nimport { isFiniteNumber, withAffected } from \"../shared\";\n\nexport function validateUtilityMarkers(v: ValidationCtx): void {\n const ALLOWED_UTILITY_MODES: Set<string> = new Set<string>([\n \"flat\",\n \"per_quantity\",\n \"per_value\",\n \"percent\",\n ]);\n\n // option-level\n for (const f of v.fields) {\n const optsArr = Array.isArray(f.options) ? f.options : [];\n for (const o of optsArr) {\n const role: string = o.pricing_role ?? f.pricing_role ?? \"base\";\n const hasService: boolean = isFiniteNumber(o.service_id);\n const util: unknown = (o.meta as any)?.utility;\n\n if (role === \"utility\" && hasService) {\n v.errors.push({\n code: \"utility_with_service_id\",\n severity: \"error\",\n message: `Utility-priced option \"${o.id}\" (field \"${f.id}\") must not reference a service_id.`,\n nodeId: o.id,\n details: withAffected(\n {\n fieldId: f.id,\n optionId: o.id,\n service_id: o.service_id,\n },\n [f.id, o.id],\n ),\n });\n }\n\n if (util) {\n const mode: unknown = (util as any).mode;\n const rate: unknown = (util as any).rate;\n\n if (!isFiniteNumber(rate)) {\n v.errors.push({\n code: \"utility_missing_rate\",\n severity: \"error\",\n message: `Utility definition for option \"${o.id}\" (field \"${f.id}\") is missing a valid rate.`,\n nodeId: o.id,\n details: withAffected(\n { fieldId: f.id, optionId: o.id },\n [f.id, o.id],\n ),\n });\n }\n\n if (!ALLOWED_UTILITY_MODES.has(String(mode))) {\n v.errors.push({\n code: \"utility_invalid_mode\",\n severity: \"error\",\n message: `Utility definition for option \"${o.id}\" (field \"${f.id}\") has invalid mode \"${String(\n mode,\n )}\".`,\n nodeId: o.id,\n details: withAffected(\n { fieldId: f.id, optionId: o.id, mode },\n [f.id, o.id],\n ),\n });\n }\n }\n }\n }\n\n // field-level\n for (const f of v.fields) {\n const util: unknown = (f.meta as any)?.utility;\n if (!util) continue;\n\n const mode: unknown = (util as any).mode;\n const rate: unknown = (util as any).rate;\n\n if (!isFiniteNumber(rate)) {\n v.errors.push({\n code: \"utility_missing_rate\",\n severity: \"error\",\n message: `Utility definition for field \"${f.id}\" is missing a valid rate.`,\n nodeId: f.id,\n details: withAffected({ fieldId: f.id }, [f.id]),\n });\n }\n\n if (!ALLOWED_UTILITY_MODES.has(String(mode))) {\n v.errors.push({\n code: \"utility_invalid_mode\",\n severity: \"error\",\n message: `Utility definition for field \"${f.id}\" has invalid mode \"${String(\n mode,\n )}\".`,\n nodeId: f.id,\n details: withAffected({ fieldId: f.id, mode }, [f.id]),\n });\n }\n }\n}\n","import { Field } from \"@/schema\";\n\n/**\n * Heuristic: multi-select if type hints ('multiselect'|'checkbox') or meta.multi === true.\n * Hosts can rely on meta.multi if using custom type strings.\n */\nexport function isMultiField(f: Field): boolean {\n const t = (f.type || \"\").toLowerCase();\n const metaMulti = !!f.meta?.multi;\n return t === \"multiselect\" || t === \"checkbox\" || metaMulti;\n}\n","// src/core/validate/steps/rates.ts\nimport type { ValidationCtx } from \"../shared\";\nimport { isFiniteNumber, withAffected } from \"../shared\";\nimport { isMultiField } from \"@/utils\";\n\nexport function validateRates(v: ValidationCtx): void {\n for (const f of v.fields) {\n if (!isMultiField(f)) continue;\n\n const baseRates: Set<number> = new Set<number>();\n const contributingOptionIds: Set<string> = new Set<string>();\n\n for (const o of f.options ?? []) {\n const role: string = o.pricing_role ?? f.pricing_role ?? \"base\";\n if (role !== \"base\") continue;\n\n const sid: unknown = o.service_id;\n if (!isFiniteNumber(sid)) continue;\n\n const rate: unknown = (v.serviceMap as any)[sid]?.rate;\n if (isFiniteNumber(rate)) {\n baseRates.add(Number(rate));\n contributingOptionIds.add(o.id);\n }\n }\n\n if (baseRates.size > 1) {\n const affectedIds: string[] = [\n f.id,\n ...Array.from(contributingOptionIds),\n ];\n\n v.errors.push({\n code: \"rate_mismatch_across_base\",\n severity: \"error\",\n message: `Base options under field \"${f.id}\" resolve to different service rates.`,\n nodeId: f.id,\n details: withAffected(\n {\n fieldId: f.id,\n rates: Array.from(baseRates.values()),\n optionIds: Array.from(contributingOptionIds.values()),\n },\n affectedIds.length > 1 ? affectedIds : undefined,\n ),\n });\n }\n }\n}\n","// src/core/validate/steps/constraints.ts\nimport type { ValidationCtx } from \"../shared\";\nimport {\n isFiniteNumber,\n isServiceFlagEnabled,\n withAffected, // <-- your helper (adjust name/import if you named it differently)\n} from \"../shared\";\n\ntype ConstraintBag = Record<string, boolean | undefined>;\n\nfunction constraintKeysInChain(v: ValidationCtx, tagId: string): string[] {\n const keys: string[] = [];\n const seenKeys: Set<string> = new Set<string>();\n\n let cur: string | undefined = tagId;\n const seenTags: Set<string> = new Set<string>();\n\n while (cur && !seenTags.has(cur)) {\n seenTags.add(cur);\n\n const t = v.tagById.get(cur);\n const c: unknown = t?.constraints;\n\n if (c && typeof c === \"object\") {\n for (const k of Object.keys(c as any)) {\n if (!seenKeys.has(k)) {\n seenKeys.add(k);\n keys.push(k);\n }\n }\n }\n\n cur = t?.bind_id;\n }\n\n return keys;\n}\n\nfunction effectiveConstraints(v: ValidationCtx, tagId: string): ConstraintBag {\n const out: ConstraintBag = {};\n const keys: string[] = constraintKeysInChain(v, tagId);\n\n for (const key of keys) {\n let cur: string | undefined = tagId;\n const seen: Set<string> = new Set<string>();\n\n while (cur && !seen.has(cur)) {\n seen.add(cur);\n\n const t = v.tagById.get(cur);\n const val: unknown = (t?.constraints as any)?.[key];\n\n if (val === true || val === false) {\n out[key] = val;\n break;\n }\n\n cur = t?.bind_id;\n }\n }\n\n return out;\n}\n\nexport function validateConstraints(v: ValidationCtx): void {\n // Enforce tag constraints on visible options' services\n for (const t of v.tags) {\n const eff: ConstraintBag = effectiveConstraints(v, t.id);\n const hasAnyRequired: boolean = Object.values(eff).some(\n (x) => x === true,\n );\n if (!hasAnyRequired) continue;\n\n const visible = v.fieldsVisibleUnder(t.id);\n\n for (const f of visible) {\n for (const o of f.options ?? []) {\n if (!isFiniteNumber(o.service_id)) continue;\n\n const svc: unknown = (v.serviceMap as any)[o.service_id];\n if (!svc || typeof svc !== \"object\") continue;\n\n for (const [k, val] of Object.entries(eff)) {\n if (val === true && !isServiceFlagEnabled(svc as any, k)) {\n v.errors.push({\n code: \"unsupported_constraint\",\n severity: \"error\",\n message: `Service option \"${o.id}\" under tag \"${t.id}\" does not support required constraint \"${k}\".`,\n nodeId: t.id,\n details: withAffected(\n {\n flag: k,\n serviceId: o.service_id,\n fieldId: f.id,\n optionId: o.id,\n },\n [t.id, f.id, o.id],\n ),\n });\n }\n }\n }\n }\n }\n\n // Unsupported constraint vs tag's mapped service capabilities\n for (const t of v.tags) {\n const sid: unknown = t.service_id;\n if (!isFiniteNumber(sid)) continue;\n\n const svc: unknown = (v.serviceMap as any)[Number(sid)];\n if (!svc || typeof svc !== \"object\") continue;\n\n const eff: ConstraintBag = effectiveConstraints(v, t.id);\n\n for (const [k, val] of Object.entries(eff)) {\n if (val === true && !isServiceFlagEnabled(svc as any, k)) {\n v.errors.push({\n code: \"unsupported_constraint\",\n severity: \"error\",\n message: `Tag \"${t.id}\" maps to service \"${String(\n sid,\n )}\" which does not support required constraint \"${k}\".`,\n nodeId: t.id,\n details: { flag: k, serviceId: sid },\n });\n }\n }\n }\n\n // constraint_overridden diagnostics\n for (const t of v.tags) {\n const ov: unknown = t.constraints_overrides;\n if (!ov || typeof ov !== \"object\") continue;\n\n for (const k of Object.keys(ov as Record<string, unknown>)) {\n const row: any = (ov as any)[k];\n if (!row) continue;\n\n const from: boolean = row.from === true;\n const to: boolean = row.to === true;\n const origin: string = String(row.origin ?? \"\");\n\n v.errors.push({\n code: \"constraint_overridden\",\n severity: \"warning\",\n message: origin\n ? `Constraint \"${k}\" on tag \"${t.id}\" was overridden by ancestor \"${origin}\" (${String(from)} → ${String(\n to,\n )}).`\n : `Constraint \"${k}\" on tag \"${t.id}\" was overridden by an ancestor (${String(from)} → ${String(to)}).`,\n nodeId: t.id,\n details: withAffected(\n { flag: k, from, to, origin },\n origin ? [t.id, origin] : undefined,\n ),\n });\n }\n }\n}\n","// src/core/validate/steps/custom.ts\nimport type { ValidationCtx } from \"../shared\";\n\nexport function validateCustomFields(v: ValidationCtx): void {\n for (const f of v.fields) {\n if (f.type !== \"custom\") continue;\n\n if (!f.component || !String(f.component).trim()) {\n v.errors.push({\n code: \"custom_component_missing\",\n severity: \"error\",\n message: `Custom field \"${f.id}\" is missing a valid component reference.`,\n nodeId: f.id,\n });\n }\n }\n}\n","// src/core/validate/steps/global-utility-guard.ts\nimport type { ValidationCtx } from \"../shared\";\nimport { isFiniteNumber } from \"../shared\";\n\nexport function validateGlobalUtilityGuard(v: ValidationCtx): void {\n if (!v.options.globalUtilityGuard) return;\n\n let hasUtility: boolean = false;\n let hasBase: boolean = false;\n\n for (const f of v.fields) {\n for (const o of f.options ?? []) {\n if (!isFiniteNumber(o.service_id)) continue;\n\n const role: string = o.pricing_role ?? f.pricing_role ?? \"base\";\n if (role === \"base\") hasBase = true;\n else if (role === \"utility\") hasUtility = true;\n\n if (hasUtility && hasBase) break;\n }\n\n if (hasUtility && hasBase) break;\n }\n\n if (hasUtility && !hasBase) {\n v.errors.push({\n code: \"utility_without_base\",\n severity: \"warning\",\n message:\n \"Global utility guard: utility-priced options exist but no base-priced options were found.\",\n nodeId: \"global\",\n details: { scope: \"global\" },\n });\n }\n}\n","// src/core/validate/steps/unbound.ts\nimport type { ValidationCtx } from \"../shared\";\nimport { withAffected } from \"../shared\";\n\nexport function validateUnboundFields(v: ValidationCtx): void {\n const boundFieldIds: Set<string> = new Set<string>();\n\n for (const f of v.fields) {\n if (f.bind_id) boundFieldIds.add(f.id);\n }\n\n const includedByTag: Set<string> = new Set<string>();\n for (const t of v.tags) {\n for (const id of t.includes ?? []) includedByTag.add(id);\n }\n\n const includedByOption: Set<string> = new Set<string>();\n for (const arr of Object.values(v.props.includes_for_buttons ?? {})) {\n for (const id of arr ?? []) includedByOption.add(id);\n }\n\n for (const f of v.fields) {\n if (\n !boundFieldIds.has(f.id) &&\n !includedByTag.has(f.id) &&\n !includedByOption.has(f.id)\n ) {\n v.errors.push({\n code: \"field_unbound\",\n severity: \"error\",\n message: `Field \"${f.id}\" is unbound: it is not bound to any tag and not included by tags or option maps.`,\n nodeId: f.id,\n details: withAffected(\n {\n fieldId: f.id,\n bound: false,\n // exposing these helps editors explain \"why\"\n includedByTag: includedByTag.has(f.id),\n includedByOption: includedByOption.has(f.id),\n },\n [f.id],\n ),\n });\n }\n }\n}\n","// src/core/validate/steps/fallbacks.ts\nimport type { ValidationCtx } from \"../shared\";\nimport { withAffected } from \"../shared\";\nimport { collectFailedFallbacks } from \"@/core\";\n\nfunction codeForReason(\n reason: string,\n):\n | \"fallback_unknown_service\"\n | \"fallback_no_primary\"\n | \"fallback_rate_violation\"\n | \"fallback_constraint_mismatch\"\n | \"fallback_cycle\"\n | \"fallback_bad_node\" {\n switch (reason) {\n case \"unknown_service\":\n return \"fallback_unknown_service\";\n case \"no_primary\":\n return \"fallback_no_primary\";\n case \"rate_violation\":\n return \"fallback_rate_violation\";\n case \"constraint_mismatch\":\n return \"fallback_constraint_mismatch\";\n case \"cycle\":\n return \"fallback_cycle\";\n default:\n return \"fallback_bad_node\";\n }\n}\n\nfunction messageFor(\n code:\n | \"fallback_unknown_service\"\n | \"fallback_no_primary\"\n | \"fallback_rate_violation\"\n | \"fallback_constraint_mismatch\"\n | \"fallback_cycle\"\n | \"fallback_bad_node\",\n d: {\n nodeId?: string;\n primary?: unknown;\n candidate?: unknown;\n tagContext?: unknown;\n scope?: unknown;\n },\n): string {\n const n = d.nodeId ? `node \"${String(d.nodeId)}\"` : \"node\";\n switch (code) {\n case \"fallback_unknown_service\":\n return `Fallback candidate \"${String(\n d.candidate,\n )}\" is unknown for ${n}.`;\n case \"fallback_no_primary\":\n return `Fallback rule has no primary service for ${n}.`;\n case \"fallback_rate_violation\":\n return `Fallback candidate \"${String(\n d.candidate,\n )}\" violates the base-rate rules for ${n}.`;\n case \"fallback_constraint_mismatch\":\n return `Fallback candidate \"${String(\n d.candidate,\n )}\" does not satisfy required constraints for ${n}.`;\n case \"fallback_cycle\":\n return `Fallback rules contain a cycle for ${n}.`;\n default:\n return `Fallback rule is invalid for ${n}.`;\n }\n}\n\nexport function validateFallbacks(v: ValidationCtx): void {\n const mode: string = v.options.fallbackSettings?.mode ?? \"strict\";\n if (!v.props.fallbacks) return;\n\n // collect non-fatal diagnostics first\n const diags = collectFailedFallbacks(v.props, v.options.serviceMap ?? {}, {\n ...v.options.fallbackSettings,\n mode: \"dev\",\n });\n\n if (mode !== \"strict\") return;\n\n for (const d of diags) {\n if (d.scope === \"global\") continue;\n\n const code = codeForReason(\n String((d as any).reason ?? \"fallback_bad_node\"),\n );\n\n const nodeId: string | undefined = (d as any).nodeId\n ? String((d as any).nodeId)\n : undefined;\n\n // Best-effort affected ids:\n // - Always include nodeId (if present)\n // - Include tagContext if it looks like a tag id (string)\n const tagContext: unknown = (d as any).tagContext;\n const affectedIds: string[] = [];\n if (nodeId) affectedIds.push(nodeId);\n if (\n typeof tagContext === \"string\" &&\n tagContext &&\n tagContext !== nodeId\n )\n affectedIds.push(tagContext);\n\n v.errors.push({\n code,\n severity: \"error\",\n message: messageFor(code, {\n nodeId,\n primary: (d as any).primary,\n candidate: (d as any).candidate,\n tagContext,\n scope: (d as any).scope,\n }),\n nodeId,\n details: withAffected(\n {\n primary: (d as any).primary,\n candidate: (d as any).candidate,\n tagContext,\n scope: (d as any).scope,\n },\n affectedIds.length > 1 ? affectedIds : undefined,\n ),\n });\n }\n}\n","// src/core/validate/policies/collect-service-items.ts\nimport type { ServiceProps, Tag, Field } from \"@/schema\";\nimport type {\n DgpServiceCapability,\n DgpServiceMap,\n IdType,\n} from \"@/schema/provider\";\nimport type { DynamicRule } from \"@/schema/validation\";\n\nimport { matchesWhere } from \"../shared\";\n\nexport type ServiceItem = Readonly<{\n /** Scope tag context (only meaningful for visible_group / tag-filtered global) */\n tagId?: string;\n\n /** Reference metadata (used for affectedIds + debugging) */\n fieldId?: string;\n optionId?: string;\n nodeId?: string;\n\n /** Canonical service id reference */\n serviceId: IdType;\n\n /** Pricing role context */\n role: \"base\" | \"utility\";\n\n /** Projection target (always present with at least { id }) */\n service: Record<string, unknown>;\n\n /** Aggregated affected ids (node/service refs that contributed to this item) */\n affectedIds: string[];\n}>;\n\ntype WhereClause = NonNullable<\n NonNullable<DynamicRule[\"filter\"]>[\"where\"]\n>[number];\n\ntype CollectMode = \"global\" | \"visible_group\";\n\nexport type CollectServiceItemsArgs = Readonly<{\n mode: CollectMode;\n\n props: ServiceProps;\n serviceMap: DgpServiceMap;\n\n /** For global: pass all tags, and usually props.fields */\n tags?: readonly Tag[];\n fields?: readonly Field[];\n\n /** For visible_group */\n tag?: Tag;\n tagId?: string;\n\n /** Host-defined filter surface */\n filter?: DynamicRule[\"filter\"];\n\n /**\n * visible_group fallbacks:\n * - include node-scoped fallbacks for these node ids (tag.id, option.id, etc.)\n */\n visibleNodeIds?: readonly string[];\n\n /**\n * visible_group fallbacks:\n * - include global fallbacks for these primary ids (services in the group)\n */\n visiblePrimaries?: readonly IdType[];\n}>;\n\nfunction asArray<T>(v: T | readonly T[] | undefined): readonly T[] | undefined {\n if (v === undefined) return undefined;\n return Array.isArray(v) ? v : [v as any];\n}\n\nfunction isServiceIdRef(v: unknown): v is IdType {\n return (\n typeof v === \"string\" || (typeof v === \"number\" && Number.isFinite(v))\n );\n}\n\nfunction svcSnapshot(\n serviceMap: DgpServiceMap,\n sid: IdType,\n): Record<string, unknown> {\n const svc: DgpServiceCapability | undefined = (serviceMap as any)[sid];\n if (!svc) return { id: sid };\n\n const meta: Record<string, unknown> =\n svc.meta && typeof svc.meta === \"object\" ? (svc.meta as any) : {};\n\n return {\n ...svc,\n id: sid,\n ...meta,\n } as unknown as Record<string, unknown>;\n}\n\nfunction pushItem(\n out: Map<string, ServiceItem>,\n next: Readonly<{\n tagId?: string;\n fieldId?: string;\n optionId?: string;\n nodeId?: string;\n serviceId: IdType;\n role: \"base\" | \"utility\";\n affectedIds: readonly string[];\n service: Record<string, unknown>;\n }>,\n): void {\n // dedupe by (serviceId, role) to preserve role semantics\n const key: string = `${String(next.serviceId)}|${next.role}`;\n\n const existing: ServiceItem | undefined = out.get(key);\n if (!existing) {\n out.set(key, {\n tagId: next.tagId,\n fieldId: next.fieldId,\n optionId: next.optionId,\n nodeId: next.nodeId,\n serviceId: next.serviceId,\n role: next.role,\n service: next.service,\n affectedIds: Array.from(new Set(next.affectedIds)),\n });\n return;\n }\n\n const mergedIds: string[] = Array.from(\n new Set<string>([...existing.affectedIds, ...next.affectedIds]),\n );\n\n // Prefer preserving an existing tagId if present; otherwise use new\n out.set(key, {\n ...existing,\n tagId: existing.tagId ?? next.tagId,\n affectedIds: mergedIds,\n });\n}\n\nfunction fieldRoleOf(\n f: Field,\n o?: { pricing_role?: string | undefined },\n): \"base\" | \"utility\" {\n const roleRaw: string | undefined =\n (o?.pricing_role as any) ?? (f.pricing_role as any) ?? \"base\";\n return roleRaw === \"utility\" ? \"utility\" : \"base\";\n}\n\nfunction applyFilterAllowLists(\n tagId: string | undefined,\n fieldId: string | undefined,\n filter: DynamicRule[\"filter\"] | undefined,\n): boolean {\n const tagAllow: readonly string[] | undefined = asArray(filter?.tag_id);\n const fieldAllow: readonly string[] | undefined = asArray(filter?.field_id);\n\n if (tagAllow) {\n if (!tagId) return false;\n if (!tagAllow.includes(tagId)) return false;\n }\n\n if (fieldAllow) {\n if (!fieldId) return false;\n if (!fieldAllow.includes(fieldId)) return false;\n }\n\n return true;\n}\n\nexport function collectServiceItems(\n args: CollectServiceItemsArgs,\n): ServiceItem[] {\n const filter: DynamicRule[\"filter\"] | undefined = args.filter;\n const roleFilter: NonNullable<DynamicRule[\"filter\"]>[\"role\"] =\n (filter?.role as any) ?? \"both\";\n const where: readonly WhereClause[] | undefined = filter?.where;\n\n const out: Map<string, ServiceItem> = new Map<string, ServiceItem>();\n\n const addServiceRef = (\n ref: Readonly<{\n tagId?: string;\n fieldId?: string;\n optionId?: string;\n nodeId?: string;\n\n serviceId: IdType;\n role: \"base\" | \"utility\";\n\n affectedIds: readonly string[];\n }>,\n ): void => {\n if (roleFilter !== \"both\" && ref.role !== roleFilter) return;\n if (!applyFilterAllowLists(ref.tagId, ref.fieldId, filter)) return;\n\n const svc: DgpServiceCapability | undefined = (args.serviceMap as any)[\n ref.serviceId\n ];\n\n // IMPORTANT (per your 1:A): unknown services are INCLUDED; where-filter only applies when svc exists.\n if (where && svc && !matchesWhere(svc as any, where)) return;\n\n pushItem(out, {\n ...ref,\n service: svcSnapshot(args.serviceMap, ref.serviceId),\n });\n };\n\n // ────────────────────────────────────────────────────────────────\n // 1) TAG SERVICES (tag.service_id)\n // ────────────────────────────────────────────────────────────────\n if (args.mode === \"global\") {\n for (const t of args.tags ?? []) {\n const sid: unknown = (t as any).service_id;\n if (!isServiceIdRef(sid)) continue;\n\n addServiceRef({\n tagId: t.id,\n serviceId: sid,\n role: \"base\",\n affectedIds: [`tag:${t.id}`, `service:${String(sid)}`],\n });\n }\n } else if (args.mode === \"visible_group\") {\n const t: Tag | undefined = args.tag;\n const sid: unknown = t ? (t as any).service_id : undefined;\n\n if (t && isServiceIdRef(sid)) {\n addServiceRef({\n tagId: t.id,\n serviceId: sid,\n role: \"base\",\n affectedIds: [`tag:${t.id}`, `service:${String(sid)}`],\n });\n }\n }\n\n // ────────────────────────────────────────────────────────────────\n // 2) FIELD SERVICES (field.service_id) + OPTION SERVICES\n // - fields can be button fields with service_id\n // - multi-field options can map to services\n // ────────────────────────────────────────────────────────────────\n const fields: readonly Field[] = args.fields ?? [];\n\n for (const f of fields) {\n // field.service_id (button field)\n const fSid: unknown = (f as any).service_id;\n if (isServiceIdRef(fSid)) {\n addServiceRef({\n tagId: args.tagId,\n fieldId: f.id,\n serviceId: fSid,\n role: \"base\",\n affectedIds: [`field:${f.id}`, `service:${String(fSid)}`],\n });\n }\n\n // option services\n for (const o of f.options ?? []) {\n const oSid: unknown = (o as any).service_id;\n if (!isServiceIdRef(oSid)) continue;\n\n const role: \"base\" | \"utility\" = fieldRoleOf(f, o);\n\n addServiceRef({\n tagId: args.tagId,\n fieldId: f.id,\n optionId: o.id,\n serviceId: oSid,\n role,\n affectedIds: [\n `field:${f.id}`,\n `option:${o.id}`,\n `service:${String(oSid)}`,\n ],\n });\n }\n }\n\n // ────────────────────────────────────────────────────────────────\n // 3) FALLBACK SERVICES (node + global)\n // Global: include ALL fallbacks everywhere\n // Visible group: include:\n // - nodes fallbacks for visibleNodeIds (tag + visible option ids)\n // - global fallbacks for visiblePrimaries (primary ids in group)\n // ────────────────────────────────────────────────────────────────\n const fb: ServiceProps[\"fallbacks\"] | undefined = args.props.fallbacks;\n if (!fb) return Array.from(out.values());\n\n const addFallbackNode = (nodeId: string, list: unknown): void => {\n const arr: readonly unknown[] = Array.isArray(list) ? list : [];\n for (const cand of arr) {\n if (!isServiceIdRef(cand)) continue;\n\n addServiceRef({\n tagId: args.tagId,\n nodeId,\n serviceId: cand,\n role: \"base\",\n affectedIds: [`fallback-node:${nodeId}`, `service:${String(cand)}`],\n });\n }\n };\n\n const addFallbackGlobal = (primaryKey: string, list: unknown): void => {\n const primaryId: IdType = primaryKey;\n\n addServiceRef({\n tagId: args.tagId,\n nodeId: primaryKey,\n serviceId: primaryId,\n role: \"base\",\n affectedIds: [\n `fallback-global-primary:${primaryKey}`,\n `service:${String(primaryId)}`,\n ],\n });\n\n const arr: readonly unknown[] = Array.isArray(list) ? list : [];\n for (const cand of arr) {\n if (!isServiceIdRef(cand)) continue;\n\n addServiceRef({\n tagId: args.tagId,\n nodeId: primaryKey,\n serviceId: cand,\n role: \"base\",\n affectedIds: [\n `fallback-global:${primaryKey}`,\n `service:${String(cand)}`,\n ],\n });\n }\n };\n\n const includeAllFallbacks: boolean = args.mode === \"global\";\n const includeGroupFallbacks: boolean = args.mode === \"visible_group\";\n\n // node-scoped fallbacks\n const nodes: Record<string, IdType[] | undefined> | undefined =\n fb.nodes && typeof fb.nodes === \"object\"\n ? (fb.nodes as any)\n : undefined;\n\n if (nodes) {\n if (includeAllFallbacks) {\n for (const [nodeId, list] of Object.entries(nodes)) {\n addFallbackNode(nodeId, list);\n }\n } else if (includeGroupFallbacks) {\n const allowNodes: Set<string> = new Set<string>(\n Array.isArray(args.visibleNodeIds)\n ? (args.visibleNodeIds as string[])\n : [],\n );\n\n for (const nodeId of allowNodes) {\n addFallbackNode(nodeId, (nodes as any)[nodeId]);\n }\n }\n }\n\n // global fallbacks: primary -> candidates\n const globalFb: Record<string, IdType[] | undefined> | undefined =\n fb.global && typeof fb.global === \"object\"\n ? (fb.global as any)\n : undefined;\n\n if (globalFb) {\n if (includeAllFallbacks) {\n for (const [primaryKey, list] of Object.entries(globalFb)) {\n addFallbackGlobal(primaryKey, list);\n }\n } else if (includeGroupFallbacks) {\n const allowPrimaries: Set<string> = new Set<string>(\n (args.visiblePrimaries ?? []).map((x) => String(x)),\n );\n\n for (const primaryKey of allowPrimaries) {\n const list: unknown = (globalFb as any)[primaryKey];\n if (list === undefined) continue;\n addFallbackGlobal(primaryKey, list);\n }\n }\n }\n\n return Array.from(out.values());\n}\n","// src/core/validate/policies/ops.ts\nimport type { DynamicRule } from \"@/schema/validation\";\n\nexport function evalPolicyOp(\n op: DynamicRule[\"op\"],\n values: unknown[],\n rule: DynamicRule,\n): boolean {\n switch (op) {\n case \"all_equal\": {\n const set: Set<string> = new Set<string>(\n values.map((v) => JSON.stringify(v)),\n );\n return set.size <= 1;\n }\n case \"no_mix\": {\n const set: Set<string> = new Set<string>(\n values.map((v) => JSON.stringify(v)),\n );\n return set.size <= 1;\n }\n case \"unique\": {\n const seen: Set<string> = new Set<string>();\n for (const v of values) {\n const k: string = JSON.stringify(v);\n if (seen.has(k)) return false;\n seen.add(k);\n }\n return true;\n }\n case \"all_true\": {\n return values.every((v) => v === true);\n }\n case \"any_true\": {\n return values.some((v) => v === true);\n }\n case \"max_count\": {\n const limit: number =\n typeof rule.value === \"number\" ? rule.value : Infinity;\n return values.length <= limit;\n }\n case \"min_count\": {\n const min: number = typeof rule.value === \"number\" ? rule.value : 0;\n return values.length >= min;\n }\n default:\n return true;\n }\n}\n","// src/core/validate/policies/apply-policies.ts\nimport type { ServiceProps, Tag, Field } from \"@/schema\";\nimport type { DgpServiceMap, IdType } from \"@/schema/provider\";\nimport type { DynamicRule, ValidationError } from \"@/schema/validation\";\n\nimport { getByPath } from \"../shared\";\nimport { collectServiceItems, type ServiceItem } from \"./collect-service-items\";\nimport { evalPolicyOp } from \"./ops\";\n\nfunction uniq<T>(arr: readonly T[]): T[] {\n return Array.from(new Set<T>(arr));\n}\n\nfunction stableSeverity(\n s: DynamicRule[\"severity\"] | undefined,\n): \"error\" | \"warning\" | \"info\" {\n if (s === \"warning\") return \"warning\";\n if (s === \"error\") return \"error\";\n return \"error\";\n}\n\nfunction defaultPolicyMessage(rule: DynamicRule): string {\n if (typeof rule.message === \"string\" && rule.message.trim())\n return rule.message;\n if (typeof rule.label === \"string\" && rule.label.trim())\n return rule.label.trim();\n return `Policy \"${rule.id}\" violated`;\n}\n\nfunction affectedFromItems(items: readonly ServiceItem[]): string[] {\n const ids: string[] = [];\n for (const it of items) {\n for (const x of it.affectedIds ?? []) ids.push(x);\n ids.push(`service:${String(it.serviceId)}`);\n }\n return uniq(ids);\n}\n\nfunction visibleGroupNodeIds(tag: Tag, fields: readonly Field[]): string[] {\n const ids: string[] = [tag.id];\n\n for (const f of fields) {\n for (const o of f.options ?? []) {\n ids.push(o.id);\n }\n }\n\n return uniq(ids);\n}\n\nfunction visibleGroupPrimaries(tag: Tag, fields: readonly Field[]): IdType[] {\n const prim: IdType[] = [];\n\n const tagSid: unknown = (tag as any).service_id;\n if (\n typeof tagSid === \"string\" ||\n (typeof tagSid === \"number\" && Number.isFinite(tagSid))\n ) {\n prim.push(tagSid);\n }\n\n for (const f of fields) {\n const fsid: unknown = (f as any).service_id;\n if (\n typeof fsid === \"string\" ||\n (typeof fsid === \"number\" && Number.isFinite(fsid))\n ) {\n prim.push(fsid);\n }\n\n for (const o of f.options ?? []) {\n const osid: unknown = (o as any).service_id;\n if (\n typeof osid === \"string\" ||\n (typeof osid === \"number\" && Number.isFinite(osid))\n ) {\n prim.push(osid);\n }\n }\n }\n\n return uniq(prim);\n}\n\nexport function applyPolicies(\n errors: ValidationError[],\n props: ServiceProps,\n serviceMap: DgpServiceMap,\n policies: DynamicRule[] | undefined,\n fieldsVisibleUnder: (tagId: string) => Field[],\n tags: Tag[],\n): void {\n if (!policies?.length) return;\n\n const tagById: Map<string, Tag> = new Map<string, Tag>();\n for (const t of tags) tagById.set(t.id, t);\n\n for (const rule of policies) {\n const projPath: string = rule.projection ?? \"service.id\";\n const severity: \"error\" | \"warning\" | \"info\" = stableSeverity(\n rule.severity,\n );\n const message: string = defaultPolicyMessage(rule);\n\n // ────────────────────────────────────────────────────────────────\n // GLOBAL: \"all services - everywhere, anywhere\"\n // - includes tags, fields (field.service_id + option.service_id), fallbacks (nodes + global)\n // - if rule.filter.tag_id is present, global becomes \"union of those visible groups\"\n // (still strict within the selected universe)\n // ────────────────────────────────────────────────────────────────\n if (rule.scope === \"global\") {\n const tagAllow: readonly string[] | undefined = Array.isArray(\n rule.filter?.tag_id,\n )\n ? (rule.filter?.tag_id as string[])\n : rule.filter?.tag_id\n ? [rule.filter.tag_id as string]\n : undefined;\n\n let items: ServiceItem[] = [];\n\n if (tagAllow && tagAllow.length) {\n // Union of selected visible-groups (including tag itself + group fallbacks)\n const merged: Map<string, ServiceItem> = new Map<\n string,\n ServiceItem\n >();\n\n for (const id of tagAllow) {\n const t: Tag | undefined = tagById.get(id);\n if (!t) continue;\n\n const visibleFields: Field[] = fieldsVisibleUnder(t.id);\n const nodeIds: string[] = visibleGroupNodeIds(\n t,\n visibleFields,\n );\n const primaries: IdType[] = visibleGroupPrimaries(\n t,\n visibleFields,\n );\n\n const sub: ServiceItem[] = collectServiceItems({\n mode: \"visible_group\",\n props,\n serviceMap,\n tag: t,\n tagId: t.id,\n fields: visibleFields,\n filter: rule.filter,\n visibleNodeIds: nodeIds,\n visiblePrimaries: primaries,\n });\n\n for (const it of sub) {\n const k: string = `${String(it.serviceId)}|${it.role}`;\n const existing: ServiceItem | undefined = merged.get(k);\n if (!existing) {\n merged.set(k, it);\n } else {\n merged.set(k, {\n ...existing,\n affectedIds: uniq([\n ...existing.affectedIds,\n ...it.affectedIds,\n ]),\n });\n }\n }\n }\n\n items = Array.from(merged.values());\n } else {\n // Truly everything, anywhere:\n const allFields: Field[] = props.fields ?? [];\n\n items = collectServiceItems({\n mode: \"global\",\n props,\n serviceMap,\n tags,\n fields: allFields,\n filter: rule.filter,\n });\n }\n\n const values: unknown[] = items.map((it) =>\n getByPath(it as any, projPath),\n );\n\n if (!evalPolicyOp(rule.op, values, rule)) {\n errors.push({\n code: \"policy_violation\",\n severity,\n message,\n nodeId: \"global\",\n details: {\n ruleId: rule.id,\n scope: \"global\",\n op: rule.op,\n projection: projPath,\n count: items.length,\n affectedIds: affectedFromItems(items),\n },\n });\n }\n\n continue;\n }\n\n // ────────────────────────────────────────────────────────────────\n // VISIBLE GROUP: \"all current visible nodes under tagId including the tag\"\n // + include node-scoped fallbacks for the tag + visible option ids\n // + include global fallbacks for primaries present in that group\n // ────────────────────────────────────────────────────────────────\n for (const t of tags) {\n const visibleFields: Field[] = fieldsVisibleUnder(t.id);\n\n const nodeIds: string[] = visibleGroupNodeIds(t, visibleFields);\n const primaries: IdType[] = visibleGroupPrimaries(t, visibleFields);\n\n const items: ServiceItem[] = collectServiceItems({\n mode: \"visible_group\",\n props,\n serviceMap,\n tag: t,\n tagId: t.id,\n fields: visibleFields,\n filter: rule.filter,\n visibleNodeIds: nodeIds,\n visiblePrimaries: primaries,\n });\n\n if (!items.length) continue;\n\n const values: unknown[] = items.map((it) =>\n getByPath(it as any, projPath),\n );\n\n if (!evalPolicyOp(rule.op, values, rule)) {\n errors.push({\n code: \"policy_violation\",\n severity,\n message,\n nodeId: t.id,\n details: {\n ruleId: rule.id,\n scope: \"visible_group\",\n op: rule.op,\n projection: projPath,\n count: items.length,\n affectedIds: affectedFromItems(items),\n },\n });\n }\n }\n }\n}\n","// src/core/validate/index.ts\nimport type { ServiceProps, Tag, Field } from \"@/schema\";\nimport type { DgpServiceMap } from \"@/schema/provider\";\nimport type { ValidationError, ValidatorOptions } from \"@/schema/validation\";\n\nimport {\n createFieldsVisibleUnder,\n validateVisibility,\n} from \"./steps/visibility\";\nimport { validateStructure } from \"./steps/structure\";\nimport { validateIdentity } from \"./steps/identity\";\nimport { validateOptionMaps } from \"./steps/option-maps\";\nimport { validateServiceVsUserInput } from \"./steps/service-vs-input\";\nimport { validateUtilityMarkers } from \"./steps/utility\";\nimport { validateRates } from \"./steps/rates\";\nimport { validateConstraints } from \"./steps/constraints\";\nimport { validateCustomFields } from \"./steps/custom\";\nimport { validateGlobalUtilityGuard } from \"./steps/global-utility-guard\";\nimport { validateUnboundFields } from \"./steps/unbound\";\nimport { validateFallbacks } from \"./steps/fallbacks\";\n\nimport { applyPolicies } from \"./policies/apply-policies\";\nimport type { ValidationCtx } from \"./shared\";\n\nexport function validate(\n props: ServiceProps,\n ctx: ValidatorOptions = {},\n): ValidationError[] {\n const errors: ValidationError[] = [];\n const serviceMap: DgpServiceMap = ctx.serviceMap ?? {};\n const selectedKeys: Set<string> = new Set<string>(\n ctx.selectedOptionKeys ?? [],\n );\n\n const tags: Tag[] = Array.isArray(props.filters) ? props.filters : [];\n const fields: Field[] = Array.isArray(props.fields) ? props.fields : [];\n\n const tagById: Map<string, Tag> = new Map<string, Tag>();\n const fieldById: Map<string, Field> = new Map<string, Field>();\n\n for (const t of tags) tagById.set(t.id, t);\n for (const f of fields) fieldById.set(f.id, f);\n\n const v: ValidationCtx = {\n props,\n options: ctx,\n errors,\n serviceMap,\n selectedKeys,\n tags,\n fields,\n tagById,\n fieldById,\n fieldsVisibleUnder: (_tagId: string): Field[] => [],\n };\n\n // 1) structure\n validateStructure(v);\n\n // 2) identity + labels\n validateIdentity(v);\n\n // 3) option maps\n validateOptionMaps(v);\n\n // 4) visibility helpers + visibility rules\n v.fieldsVisibleUnder = createFieldsVisibleUnder(v);\n validateVisibility(v);\n\n // --------- Dynamic policies (super-admin) --------------------------\n applyPolicies(\n v.errors,\n v.props,\n v.serviceMap,\n v.options.policies,\n v.fieldsVisibleUnder,\n v.tags,\n );\n\n // 5) service vs user-input rules\n validateServiceVsUserInput(v);\n\n // 6) utility marker rules\n validateUtilityMarkers(v);\n\n // 7) rates & pricing roles\n validateRates(v);\n\n // 8) constraints vs capabilities + inheritance\n validateConstraints(v);\n\n // 9) custom field rules\n validateCustomFields(v);\n\n // 10) optional global utility guard\n validateGlobalUtilityGuard(v);\n\n // 11) unbound fields\n validateUnboundFields(v);\n\n // 12) fallbacks strict-mode conversion\n validateFallbacks(v);\n\n return v.errors;\n}\n","// src/core/builder.ts\nimport { normalise } from \"./normalise\";\nimport { validate } from \"./validate\";\n\nimport type {\n DgpServiceMap,\n EdgeKind,\n Field,\n GraphEdge,\n GraphNode,\n GraphSnapshot,\n NodeKind,\n ServiceProps,\n Tag,\n ValidationError,\n ValidatorOptions\n} from \"@/schema\";\n\n/** Options you can set on the builder (used for validation/visibility) */\nexport type BuilderOptions = Omit<ValidatorOptions, \"serviceMap\"> & {\n serviceMap?: DgpServiceMap;\n /** max history entries for undo/redo */\n historyLimit?: number;\n /**\n * Field ids whose options should be shown as nodes in the graph.\n * If a field id is NOT in this set, its options are not materialized as nodes:\n * - include/exclude wires keyed by an option id will be drawn from the FIELD instead.\n */\n showOptionNodes?: Set<string> | string[];\n};\n\nexport interface Builder {\n /** Replace current payload (injects root if missing, rebuilds indexes) */\n load(props: ServiceProps): void;\n\n /** Graph for visualisation */\n tree(): GraphSnapshot;\n\n /** Deterministic save payload (drops unbound utility fields, prunes dead maps) */\n cleanedProps(): ServiceProps;\n\n /** Validation errors for current state */\n errors(): ValidationError[];\n\n /**\n * Compute IDs of fields visible under a tag.\n * If selectedOptionKeys provided, applies option-level include/exclude.\n * NOTE: keys are “button ids”: either option.id or field.id for option-less buttons.\n */\n visibleFields(tagId: string, selectedOptionKeys?: string[]): string[];\n\n /** Update builder options (validator context etc.) */\n setOptions(patch: Partial<BuilderOptions>): void;\n\n /** History */\n undo(): boolean;\n redo(): boolean;\n\n /** Access the current props (already normalised) */\n getProps(): ServiceProps;\n\n /** Service map for validation/rules */\n getServiceMap(): DgpServiceMap;\n\n getConstraints(): {\n id: string;\n label: string;\n description: string;\n value: string;\n }[];\n}\n\nexport function createBuilder(opts: BuilderOptions = {}): Builder {\n return new BuilderImpl(opts);\n}\n\n/* ────────────────────────────────────────────────────────────────────────── */\n\nclass BuilderImpl implements Builder {\n private props: ServiceProps = {\n filters: [],\n fields: [],\n schema_version: \"1.0\",\n };\n private tagById = new Map<string, Tag>();\n private fieldById = new Map<string, Field>();\n private optionOwnerById = new Map<string, { fieldId: string }>(); // option.id → fieldId\n\n private options: BuilderOptions;\n private readonly history: ServiceProps[] = [];\n private readonly future: ServiceProps[] = [];\n private readonly historyLimit: number;\n\n constructor(opts: BuilderOptions = {}) {\n this.options = { ...opts };\n this.historyLimit = opts.historyLimit ?? 50;\n }\n\n /* ───── lifecycle ─────────────────────────────────────────────────────── */\n\n load(raw: ServiceProps): void {\n const next = normalise(raw, {\n defaultPricingRole: \"base\",\n constraints: this.getConstraints().map((item) => item.label),\n });\n this.pushHistory(this.props);\n this.future.length = 0; // clear redo stack\n this.props = next;\n this.rebuildIndexes();\n }\n\n getProps(): ServiceProps {\n return this.props;\n }\n\n setOptions(patch: Partial<BuilderOptions>): void {\n this.options = { ...this.options, ...patch };\n }\n\n getServiceMap(): DgpServiceMap {\n return this.options.serviceMap ?? {};\n }\n\n getConstraints() {\n const serviceMap = this.getServiceMap();\n\n const out = new Set<{\n label: string;\n id: string;\n value: string;\n description: string;\n }>();\n const guard = new Set<string>();\n\n for (const svc of Object.values(serviceMap)) {\n const flags = svc.flags ?? {};\n for (const flagId of Object.keys(flags)) {\n if (guard.has(flagId)) continue;\n guard.add(flagId);\n out.add({\n id: flagId,\n value: flagId,\n label: flagId,\n description: flags[flagId].description,\n });\n }\n }\n\n // if you want deterministic ordering in UI:\n return Array.from(out);\n }\n\n /* ───── querying ─────────────────────────────────────────────────────── */\n\n tree(): GraphSnapshot {\n const nodes: GraphNode[] = [];\n const edges: GraphEdge[] = [];\n\n const showSet = toStringSet(this.options.showOptionNodes);\n\n // 1) tags as nodes\n for (const t of this.props.filters) {\n nodes.push({ id: t.id, kind: \"tag\" as NodeKind, label: t.label });\n }\n\n // 2) tag hierarchy edges\n for (const t of this.props.filters) {\n if (t.bind_id) {\n edges.push({\n from: t.bind_id,\n to: t.id,\n kind: \"child\" as EdgeKind,\n });\n }\n }\n\n // 3) fields as nodes\n for (const f of this.props.fields) {\n nodes.push({\n id: f.id,\n kind: \"field\" as NodeKind,\n label: f.label,\n bind_type:\n f.pricing_role === \"utility\"\n ? \"utility\"\n : f.bind_id\n ? \"bound\"\n : null,\n });\n }\n\n // 4) field bind edges\n for (const f of this.props.fields) {\n const b = f.bind_id;\n if (Array.isArray(b)) {\n for (const tagId of b)\n edges.push({\n from: tagId,\n to: f.id,\n kind: \"bind\" as EdgeKind,\n });\n } else if (typeof b === \"string\") {\n edges.push({ from: b, to: f.id, kind: \"bind\" as EdgeKind });\n }\n }\n\n // 5) Option nodes (only for fields in showOptionNodes)\n for (const f of this.props.fields) {\n const showOptions = showSet.has(f.id);\n if (!showOptions) continue;\n if (!Array.isArray(f.options)) continue;\n\n for (const o of f.options) {\n nodes.push({\n id: o.id,\n kind: \"option\",\n label: o.label,\n });\n // field → option edge\n const e: any = {\n from: f.id,\n to: o.id,\n kind: \"option\" as EdgeKind,\n meta: { ownerField: f.id },\n };\n edges.push(e as GraphEdge);\n }\n }\n\n // 6) tag includes/excludes\n for (const t of this.props.filters) {\n for (const id of t.includes ?? []) {\n edges.push({ from: t.id, to: id, kind: \"include\" as EdgeKind });\n }\n for (const id of t.excludes ?? []) {\n edges.push({ from: t.id, to: id, kind: \"exclude\" as EdgeKind });\n }\n }\n\n // 7) button-level includes/excludes (keys are button IDs: option.id OR field.id)\n const incMap = this.props.includes_for_buttons ?? {};\n const excMap = this.props.excludes_for_buttons ?? {};\n\n const pushButtonEdge = (\n keyId: string,\n targetFieldId: string,\n kind: EdgeKind,\n ) => {\n const owner = this.optionOwnerById.get(keyId);\n const ownerFieldId =\n owner?.fieldId ??\n (this.fieldById.has(keyId) ? keyId : undefined);\n if (!ownerFieldId) return; // dangling key, ignore\n\n // If the key is an option AND its field is being shown, draw from the option\n const fromNode =\n owner && showSet.has(owner.fieldId)\n ? keyId // option node → visible, draw from option\n : ownerFieldId; // else draw from the field\n\n const meta: any = owner\n ? showSet.has(owner.fieldId)\n ? {\n via: \"option-visible\",\n ownerField: owner.fieldId,\n sourceOption: keyId,\n }\n : {\n via: \"option-hidden\",\n ownerField: owner.fieldId,\n sourceOption: keyId,\n }\n : { via: \"field-button\" };\n\n const e: any = { from: fromNode, to: targetFieldId, kind, meta };\n edges.push(e as GraphEdge);\n };\n\n for (const [keyId, arr] of Object.entries(incMap)) {\n for (const fid of arr ?? [])\n pushButtonEdge(keyId, fid, \"include\" as EdgeKind);\n }\n for (const [keyId, arr] of Object.entries(excMap)) {\n for (const fid of arr ?? [])\n pushButtonEdge(keyId, fid, \"exclude\" as EdgeKind);\n }\n\n return { nodes, edges };\n }\n\n cleanedProps(): ServiceProps {\n // Build quick indexes\n const fieldIds = new Set(this.props.fields.map((f) => f.id));\n const optionIds = new Set<string>();\n this.optionOwnerById.forEach((_v, oid) => optionIds.add(oid));\n\n // 1) drop utility fields that are truly \"orphaned\"\n // (unbound + not included by tag or button includes + not referenced as a key)\n const includedByTag = new Set<string>();\n const excludedAnywhere = new Set<string>();\n for (const t of this.props.filters) {\n for (const id of t.includes ?? []) includedByTag.add(id);\n for (const id of t.excludes ?? []) excludedAnywhere.add(id);\n }\n\n const incMap = this.props.includes_for_buttons ?? {};\n const excMap = this.props.excludes_for_buttons ?? {};\n const includedByButtons = new Set<string>(); // field ids that might be pulled in\n const referencedKeys = new Set<string>(); // keys in maps (field button or option id)\n const referencedOwnerFields = new Set<string>();\n\n for (const [key, arr] of Object.entries(incMap)) {\n referencedKeys.add(key);\n const owner = this.optionOwnerById.get(key);\n if (owner) referencedOwnerFields.add(owner.fieldId);\n for (const fid of arr ?? []) {\n includedByButtons.add(fid);\n }\n }\n for (const [key, arr] of Object.entries(excMap)) {\n referencedKeys.add(key);\n const owner = this.optionOwnerById.get(key);\n if (owner) referencedOwnerFields.add(owner.fieldId);\n for (const fid of arr ?? []) {\n // exclusion targets don’t “include”, but record that these field ids are referenced\n // (so we don’t accidentally drop something host intentionally excludes/controls)\n // not strictly necessary, but conservative:\n void fid;\n }\n }\n\n const boundIds = new Set<string>();\n for (const f of this.props.fields) {\n const b = f.bind_id;\n if (Array.isArray(b)) b.forEach((id) => boundIds.add(id));\n else if (typeof b === \"string\") boundIds.add(b);\n }\n\n const fields = this.props.fields.filter((f) => {\n const isUtility = (f.pricing_role ?? \"base\") === \"utility\";\n if (!isUtility) return true;\n\n const bound = !!f.bind_id;\n const included =\n includedByTag.has(f.id) || includedByButtons.has(f.id);\n const referenced =\n referencedOwnerFields.has(f.id) || referencedKeys.has(f.id);\n const excluded = excludedAnywhere.has(f.id);\n\n // keep if bound OR included OR referenced by maps; drop if truly orphaned or globally excluded\n return bound || included || referenced || !excluded;\n });\n\n // 2) prune button maps: keep only valid keys and existing field targets\n const allowedTargets = new Set(fields.map((f) => f.id)); // targets must be existing fields\n\n const pruneButtons = (src?: Record<string, string[]>) => {\n if (!src) return undefined;\n const out: Record<string, string[]> = {};\n for (const [key, arr] of Object.entries(src)) {\n // key must be an existing option.id OR field.id\n const keyIsValid = optionIds.has(key) || fieldIds.has(key);\n if (!keyIsValid) continue;\n\n const cleaned = (arr ?? []).filter((fid) =>\n allowedTargets.has(fid),\n );\n if (cleaned.length) out[key] = Array.from(new Set(cleaned));\n }\n return Object.keys(out).length ? out : undefined;\n };\n\n const includes_for_buttons = pruneButtons(\n this.props.includes_for_buttons,\n );\n const excludes_for_buttons = pruneButtons(\n this.props.excludes_for_buttons,\n );\n\n // 3) return canonical object\n const out: ServiceProps = {\n filters: this.props.filters.slice(),\n fields,\n ...(includes_for_buttons && { includes_for_buttons }),\n ...(excludes_for_buttons && { excludes_for_buttons }),\n schema_version: this.props.schema_version ?? \"1.0\",\n // keep fallbacks & other maps as-is\n ...(this.props.fallbacks\n ? { fallbacks: this.props.fallbacks }\n : {}),\n };\n return out;\n }\n\n errors(): ValidationError[] {\n return validate(this.props, this.options);\n }\n\n visibleFields(tagId: string, selectedKeys?: string[]): string[] {\n const props = this.props;\n const tags = props.filters ?? [];\n const fields = props.fields ?? [];\n\n const tagById = new Map(tags.map((t) => [t.id, t]));\n const tag = tagById.get(tagId);\n if (!tag) return [];\n\n // ---- lineage with depth: self=0, parent=1, grandparent=2 ...\n const lineageDepth = new Map<string, number>();\n {\n const guard = new Set<string>();\n let cur: Tag | undefined = tag;\n let d = 0;\n while (cur && !guard.has(cur.id)) {\n lineageDepth.set(cur.id, d++);\n guard.add(cur.id);\n const parentId: string | undefined = cur.bind_id;\n cur = parentId ? tagById.get(parentId) : undefined;\n }\n }\n\n const isTagInLineage = (id: string) => lineageDepth.has(id);\n\n const fieldById = new Map(fields.map((f) => [f.id, f]));\n\n // Build optionId -> owner field (so we can infer what tag group the option belongs to)\n const optionOwnerFieldId = new Map<string, string>();\n for (const f of fields) {\n for (const o of f.options ?? []) optionOwnerFieldId.set(o.id, f.id);\n }\n\n const ownerDepthForField = (f: Field): number | undefined => {\n const b = f.bind_id;\n if (!b) return undefined;\n\n if (typeof b === \"string\") return lineageDepth.get(b);\n\n // if multiple binds, take closest in the lineage\n let best: number | undefined = undefined;\n for (const id of b) {\n const d = lineageDepth.get(id);\n if (d == null) continue;\n if (best == null || d < best) best = d;\n }\n return best;\n };\n\n const ownerDepthForTrigger = (\n triggerId: string,\n ): number | undefined => {\n // option trigger -> use owner field bind(s)\n if (triggerId.startsWith(\"o:\")) {\n const fid = optionOwnerFieldId.get(triggerId);\n if (!fid) return undefined;\n const f = fieldById.get(fid);\n if (!f) return undefined;\n return ownerDepthForField(f);\n }\n\n // field trigger (button field id) -> use field bind(s)\n const f = fieldById.get(triggerId);\n if (!f || f.button !== true) return undefined;\n return ownerDepthForField(f);\n };\n\n // ---- current tag includes/excludes (NOT inherited)\n const tagInclude = new Set(tag.includes ?? []);\n const tagExclude = new Set(tag.excludes ?? []);\n\n // ---- selection triggers (buttons + options)\n const selected = new Set(\n selectedKeys ?? this.options.selectedOptionKeys ?? [],\n );\n const incMap = props.includes_for_buttons ?? {};\n const excMap = props.excludes_for_buttons ?? {};\n\n // We only apply triggers that belong to (self ∪ ancestors), so their effects inherit down.\n // Also keep reveal order (determinism) but only among relevant triggers.\n const relevantTriggersInOrder: string[] = [];\n for (const key of selected) {\n const d = ownerDepthForTrigger(key);\n if (d == null) continue; // cannot place it in a tag group => ignore\n // d exists means it belongs to lineage => inherited down\n relevantTriggersInOrder.push(key);\n }\n\n // ---- base candidates: bound fields inherited + current tag includes\n const visible = new Set<string>();\n const isBoundToLineage = (f: Field): boolean => {\n const b = f.bind_id;\n if (!b) return false;\n if (typeof b === \"string\") return isTagInLineage(b);\n for (const id of b) if (isTagInLineage(id)) return true;\n return false;\n };\n\n for (const f of fields) {\n if (isBoundToLineage(f)) visible.add(f.id);\n if (tagInclude.has(f.id)) visible.add(f.id);\n }\n\n // apply current tag excludes (tag-level only)\n for (const id of tagExclude) visible.delete(id);\n\n // ---- button decisions with precedence:\n // closest depth wins; if same depth and conflict => exclude wins\n type ButtonDecision = { depth: number; kind: \"include\" | \"exclude\" };\n const decide = new Map<string, ButtonDecision>();\n\n const applyDecision = (fieldId: string, next: ButtonDecision) => {\n const prev = decide.get(fieldId);\n if (!prev) {\n decide.set(fieldId, next);\n return;\n }\n // closer (smaller depth) overrides farther\n if (next.depth < prev.depth) {\n decide.set(fieldId, next);\n return;\n }\n if (next.depth > prev.depth) return;\n\n // same depth: exclude wins\n if (prev.kind === \"include\" && next.kind === \"exclude\") {\n decide.set(fieldId, next);\n }\n };\n\n // also track reveal order (first time a field is included by buttons, at the best known depth)\n const revealedOrder: string[] = [];\n const revealedSeen = new Set<string>();\n\n for (const triggerId of relevantTriggersInOrder) {\n const depth = ownerDepthForTrigger(triggerId);\n if (depth == null) continue;\n\n for (const id of incMap[triggerId] ?? []) {\n applyDecision(id, { depth, kind: \"include\" });\n\n // determinism: record reveal attempt in trigger order (not final visibility)\n if (!revealedSeen.has(id)) {\n revealedSeen.add(id);\n revealedOrder.push(id);\n }\n }\n\n for (const id of excMap[triggerId] ?? []) {\n applyDecision(id, { depth, kind: \"exclude\" });\n }\n }\n\n // apply button decisions (buttons override tag state)\n for (const [fid, d] of decide) {\n if (d.kind === \"include\") visible.add(fid);\n else visible.delete(fid);\n }\n\n // ---- natural visible ids (props.fields order)\n const base = fields.filter((f) => visible.has(f.id)).map((f) => f.id);\n\n // ---- order_for_tags: pin-first ordering (ordering-only; never adds invisible)\n const order = props.order_for_tags?.[tagId];\n if (order && order.length) {\n const ordered = order.filter((fid) => visible.has(fid));\n const orderedSet = new Set(ordered);\n const rest = base.filter((fid) => !orderedSet.has(fid));\n return [...ordered, ...rest];\n }\n\n // no explicit order: revealed-first (but only final-visible)\n const promoted = revealedOrder.filter((fid) => visible.has(fid));\n const promotedSet = new Set(promoted);\n const rest = base.filter((fid) => !promotedSet.has(fid));\n return [...promoted, ...rest];\n }\n\n /* ───── history ─────────────────────────────────────────────────────── */\n\n undo(): boolean {\n if (this.history.length === 0) return false;\n const prev = this.history.pop()!;\n this.future.push(structuredCloneSafe(this.props));\n this.props = prev;\n this.rebuildIndexes();\n return true;\n }\n\n redo(): boolean {\n if (this.future.length === 0) return false;\n const next = this.future.pop()!;\n this.pushHistory(this.props);\n this.props = next;\n this.rebuildIndexes();\n return true;\n }\n\n /* ───── internals ──────────────────────────────────────────────────── */\n\n private rebuildIndexes(): void {\n this.tagById.clear();\n this.fieldById.clear();\n this.optionOwnerById.clear();\n\n for (const t of this.props.filters) this.tagById.set(t.id, t);\n for (const f of this.props.fields) {\n this.fieldById.set(f.id, f);\n if (Array.isArray(f.options)) {\n for (const o of f.options)\n this.optionOwnerById.set(o.id, { fieldId: f.id });\n }\n }\n }\n\n private pushHistory(state: ServiceProps): void {\n // avoid pushing initial empty state on the very first load\n if (!state || (!state.filters.length && !state.fields.length)) return;\n this.history.push(structuredCloneSafe(state));\n if (this.history.length > this.historyLimit) this.history.shift();\n }\n}\n\n/* ───────────────────────── helpers ───────────────────────── */\nfunction structuredCloneSafe<T>(v: T): T {\n if (typeof (globalThis as any).structuredClone === \"function\") {\n return (globalThis as any).structuredClone(v);\n }\n return JSON.parse(JSON.stringify(v));\n}\n\nfunction toStringSet(v: Set<string> | string[] | undefined): Set<string> {\n if (!v) return new Set();\n if (v instanceof Set) return new Set(Array.from(v).map(String));\n return new Set((v as string[]).map(String));\n}\n","// src/core/utils/fallback.ts\nimport type {\n ServiceProps,\n ServiceFallback,\n ServiceIdRef,\n NodeIdRef,\n} from \"@/schema\";\nimport type { DgpServiceCapability, DgpServiceMap } from \"@/schema/provider\";\nimport type { FallbackSettings } from \"@/schema/validation\";\n\nexport type FailedFallbackContext = {\n scope: \"node\" | \"global\";\n nodeId?: string; // when scope='node'\n primary: ServiceIdRef;\n candidate: ServiceIdRef;\n tagContext?: string; // tag.id when evaluating constraints\n reason:\n | \"unknown_service\"\n | \"no_primary\"\n | \"rate_violation\"\n | \"constraint_mismatch\"\n | \"cycle\"\n | \"no_tag_context\";\n details?: Record<string, unknown>;\n};\n\nconst DEFAULT_SETTINGS: Required<FallbackSettings> = {\n requireConstraintFit: true,\n ratePolicy: { kind: \"lte_primary\" },\n selectionStrategy: \"priority\",\n mode: \"strict\",\n};\n\nexport function resolveServiceFallback(params: {\n primary: ServiceIdRef;\n nodeId?: NodeIdRef; // prefer node-scoped first if provided\n tagId?: string; // constraints context (if known)\n services: DgpServiceMap;\n fallbacks?: ServiceFallback;\n settings?: FallbackSettings;\n props: ServiceProps;\n}): ServiceIdRef | null {\n const s = { ...DEFAULT_SETTINGS, ...(params.settings ?? {}) };\n const { primary, nodeId, tagId, services } = params;\n const fb = params.fallbacks ?? {};\n const tried: ServiceIdRef[] = [];\n\n const lists: ServiceIdRef[][] = [];\n if (nodeId && fb.nodes?.[nodeId]) lists.push(fb.nodes[nodeId]);\n if (fb.global?.[primary]) lists.push(fb.global[primary]);\n\n const primaryRate = rateOf(services, primary);\n\n for (const list of lists) {\n for (const cand of list) {\n if (tried.includes(cand)) continue;\n tried.push(cand);\n\n const candCap = services[Number(cand)] ?? services[cand as any];\n if (!candCap) continue;\n\n if (!passesRate(s.ratePolicy, primaryRate, candCap.rate)) continue;\n if (s.requireConstraintFit && tagId) {\n const ok = satisfiesTagConstraints(tagId, params, candCap);\n if (!ok) continue;\n }\n return cand;\n }\n }\n return null;\n}\n\nexport function collectFailedFallbacks(\n props: ServiceProps,\n services: DgpServiceMap,\n settings?: FallbackSettings,\n): FailedFallbackContext[] {\n const s = { ...DEFAULT_SETTINGS, ...(settings ?? {}) };\n const out: FailedFallbackContext[] = [];\n const fb = props.fallbacks ?? {};\n const primaryRate = (p: ServiceIdRef) => rateOf(services, p);\n\n // Node-scoped (tags or options)\n for (const [nodeId, list] of Object.entries(fb.nodes ?? {})) {\n const { primary, tagContexts } = primaryForNode(props, nodeId);\n if (!primary) {\n out.push({\n scope: \"node\",\n nodeId,\n primary: \"\" as any,\n candidate: \"\" as any,\n reason: \"no_primary\",\n });\n continue;\n }\n for (const cand of list) {\n const cap = getCap(services, cand);\n if (!cap) {\n out.push({\n scope: \"node\",\n nodeId,\n primary,\n candidate: cand,\n reason: \"unknown_service\",\n });\n continue;\n }\n if (String(cand) === String(primary)) {\n out.push({\n scope: \"node\",\n nodeId,\n primary,\n candidate: cand,\n reason: \"cycle\",\n });\n continue;\n }\n if (!passesRate(s.ratePolicy, primaryRate(primary), cap.rate)) {\n out.push({\n scope: \"node\",\n nodeId,\n primary,\n candidate: cand,\n reason: \"rate_violation\",\n });\n continue;\n }\n // Tag contexts\n if (tagContexts.length === 0) {\n out.push({\n scope: \"node\",\n nodeId,\n primary,\n candidate: cand,\n reason: \"no_tag_context\",\n });\n continue;\n }\n let anyPass = false;\n let anyFail = false;\n for (const tagId of tagContexts) {\n const ok = s.requireConstraintFit\n ? satisfiesTagConstraints(tagId, { services, props }, cap)\n : true;\n if (ok) anyPass = true;\n else {\n anyFail = true;\n out.push({\n scope: \"node\",\n nodeId,\n primary,\n candidate: cand,\n tagContext: tagId,\n reason: \"constraint_mismatch\",\n });\n }\n }\n // If none passed, we already added per-context mismatches above\n void anyPass;\n void anyFail;\n }\n }\n\n // Global (soft; no tag context)\n for (const [primary, list] of Object.entries(fb.global ?? {})) {\n for (const cand of list) {\n const cap = getCap(services, cand);\n if (!cap) {\n out.push({\n scope: \"global\",\n primary,\n candidate: cand,\n reason: \"unknown_service\",\n });\n continue;\n }\n if (String(cand) === String(primary)) {\n out.push({\n scope: \"global\",\n primary,\n candidate: cand,\n reason: \"cycle\",\n });\n continue;\n }\n if (!passesRate(s.ratePolicy, primaryRate(primary), cap.rate)) {\n out.push({\n scope: \"global\",\n primary,\n candidate: cand,\n reason: \"rate_violation\",\n });\n }\n }\n }\n return out;\n}\n\n/* ───────────────────────── helpers ───────────────────────── */\n\nfunction rateOf(\n map: DgpServiceMap,\n id: ServiceIdRef | undefined,\n): number | undefined {\n if (id === undefined || id === null) return undefined;\n const c = getCap(map, id);\n return c?.rate ?? undefined;\n}\n\nfunction passesRate(\n policy: Required<FallbackSettings>[\"ratePolicy\"],\n primaryRate?: number,\n candRate?: number,\n): boolean {\n if (typeof candRate !== \"number\" || !Number.isFinite(candRate))\n return false;\n if (typeof primaryRate !== \"number\" || !Number.isFinite(primaryRate))\n return false;\n switch (policy.kind) {\n case \"lte_primary\":\n return candRate <= primaryRate;\n case \"within_pct\":\n return candRate <= primaryRate * (1 + policy.pct / 100);\n case \"at_least_pct_lower\":\n return candRate <= primaryRate * (1 - policy.pct / 100);\n }\n}\n\nfunction getCap(\n map: DgpServiceMap,\n id: ServiceIdRef,\n): DgpServiceCapability | undefined {\n // Keep the old behavior, but avoid NaN poisoning lookups.\n const direct: DgpServiceCapability | undefined = (map as any)[id];\n if (direct) return direct;\n\n const strKey: string = String(id);\n const byStr: DgpServiceCapability | undefined = (map as any)[strKey];\n if (byStr) return byStr;\n\n const n: number =\n typeof id === \"number\"\n ? id\n : typeof id === \"string\"\n ? Number(id)\n : Number.NaN;\n\n if (Number.isFinite(n)) {\n const byNum: DgpServiceCapability | undefined = (map as any)[n];\n if (byNum) return byNum;\n }\n\n return undefined;\n}\n\nfunction isCapFlagEnabled(cap: DgpServiceCapability, flagId: string): boolean {\n // New structure: flags[flagId].enabled\n const fromFlags: boolean | undefined = cap.flags?.[flagId]?.enabled;\n if (fromFlags === true) return true;\n if (fromFlags === false) return false;\n\n // Soft-compat during migration: if legacy boolean exists on cap, respect it.\n const legacy: unknown = (cap as any)[flagId];\n return legacy === true;\n}\n\nfunction satisfiesTagConstraints(\n tagId: string,\n ctx: Readonly<{ props: ServiceProps; services: DgpServiceMap }>,\n cap: DgpServiceCapability,\n): boolean {\n const tag = ctx.props.filters.find((t) => t.id === tagId);\n const eff: Record<string, unknown> | undefined = tag?.constraints as any; // effective constraints (propagated)\n if (!eff) return true;\n\n // Enforce only keys explicitly set TRUE at the tag; false/undefined => no requirement.\n for (const [key, value] of Object.entries(eff)) {\n if (value === true && !isCapFlagEnabled(cap, key)) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction primaryForNode(\n props: ServiceProps,\n nodeId: string,\n): {\n primary?: ServiceIdRef;\n tagContexts: string[];\n reasonNoPrimary?: string;\n} {\n // Tag node?\n const tag = props.filters.find((t) => t.id === nodeId);\n if (tag) {\n return { primary: tag.service_id as any, tagContexts: [tag.id] };\n }\n // Option node: locate its parent field\n const field = props.fields.find(\n (f) =>\n Array.isArray(f.options) && f.options.some((o) => o.id === nodeId),\n );\n if (!field) return { tagContexts: [], reasonNoPrimary: \"no_parent_field\" };\n const opt = field.options!.find((o) => o.id === nodeId)!;\n const contexts = bindIdsToArray(field.bind_id);\n return { primary: opt.service_id as any, tagContexts: contexts };\n}\n\nfunction bindIdsToArray(bind: string | string[] | undefined): string[] {\n if (!bind) return [];\n return Array.isArray(bind) ? bind.slice() : [bind];\n}\n\n/**\n * Return all fallback candidates that are eligible for the given primary,\n * respecting:\n * - node-scoped list first (if nodeId provided), then global list for `primary`\n * - rate policy vs. primary\n * - (optional) tag constraint fit, only when tagId is provided and requireConstraintFit=true\n * - excludes (including primary automatically)\n * - selectionStrategy: 'priority' keeps list order, 'cheapest' sorts by rate asc\n * - unique (dedupe) and optional limit\n */\nexport function getEligibleFallbacks(params: {\n primary: ServiceIdRef;\n nodeId?: NodeIdRef; // prefer node-scoped list first\n tagId?: string; // constraints context (if known)\n services: DgpServiceMap;\n fallbacks?: ServiceFallback;\n settings?: FallbackSettings;\n props: ServiceProps;\n exclude?: Array<ServiceIdRef>; // additional ids to ignore\n unique?: boolean; // default true\n limit?: number; // optional cap\n}): ServiceIdRef[] {\n const s = { ...DEFAULT_SETTINGS, ...(params.settings ?? {}) };\n const { primary, nodeId, tagId, services } = params;\n const fb = params.fallbacks ?? {};\n const excludes = new Set<string>((params.exclude ?? []).map(String));\n excludes.add(String(primary)); // never return the primary itself\n const unique = params.unique ?? true;\n\n // Gather source lists: node → global\n const lists: ServiceIdRef[][] = [];\n if (nodeId && fb.nodes?.[nodeId]) lists.push(fb.nodes[nodeId]);\n if (fb.global?.[primary]) lists.push(fb.global[primary]);\n\n if (!lists.length) return [];\n\n const primaryRate = rateOf(services, primary);\n const seen = new Set<string>();\n const eligible: ServiceIdRef[] = [];\n\n for (const list of lists) {\n for (const cand of list) {\n const key = String(cand);\n if (excludes.has(key)) continue;\n if (unique && seen.has(key)) continue;\n seen.add(key);\n\n const cap = getCap(services, cand);\n if (!cap) continue;\n\n // Rate policy must pass\n if (!passesRate(s.ratePolicy, primaryRate, cap.rate)) continue;\n\n // Tag constraint fit is only enforced if we know tagId and setting requires it\n if (s.requireConstraintFit && tagId) {\n const ok = satisfiesTagConstraints(\n tagId,\n { props: params.props, services },\n cap,\n );\n if (!ok) continue;\n }\n\n eligible.push(cand);\n }\n }\n\n // Selection strategy\n if (s.selectionStrategy === \"cheapest\") {\n eligible.sort((a, b) => {\n const ra = rateOf(services, a) ?? Infinity;\n const rb = rateOf(services, b) ?? Infinity;\n return ra - rb;\n });\n }\n // 'priority' keeps original order\n\n // Optional limit\n if (typeof params.limit === \"number\" && params.limit >= 0) {\n return eligible.slice(0, params.limit);\n }\n return eligible;\n}\n","import { RatePolicy } from \"@/schema/validation\";\r\nimport { Builder } from \"./builder\";\r\nimport { DgpServiceCapability, DgpServiceMap } from \"@/schema/provider\";\r\nimport { Field, PricingRole, ServiceProps, Tag } from \"@/schema\";\r\n\r\ntype BaseCandidate = {\r\n kind: \"field\" | \"option\";\r\n id: string;\r\n label?: string;\r\n service_id: number;\r\n rate: number;\r\n};\r\n\r\n/** Result for each violation discovered during deep simulation. */\r\nexport type RateCoherenceDiagnostic = {\r\n scope: \"visible_group\";\r\n tagId: string;\r\n /** The “primary” used for comparison in this simulation:\r\n * anchor service if present; otherwise, the first base service among simulated candidates.\r\n * (Tag service is never used as primary.)\r\n */\r\n primary: BaseCandidate;\r\n /** The item that violated the policy against the primary. */\r\n offender: {\r\n kind: \"field\" | \"option\";\r\n id: string;\r\n label?: string;\r\n service_id: number;\r\n rate: number;\r\n };\r\n policy: RatePolicy[\"kind\"];\r\n policyPct?: number; // for within_pct / at_least_pct_lower\r\n message: string;\r\n /** Which button triggered this simulation */\r\n simulationAnchor: {\r\n kind: \"field\" | \"option\";\r\n id: string;\r\n fieldId: string;\r\n label?: string;\r\n };\r\n};\r\n\r\n/** Run deep rate-coherence validation by simulating each button selection in the active tag. */\r\nexport function validateRateCoherenceDeep(params: {\r\n builder: Builder;\r\n services: DgpServiceMap;\r\n tagId: string;\r\n /** Optional rate policy (defaults to { kind: 'lte_primary' }) */\r\n ratePolicy?: RatePolicy;\r\n}): RateCoherenceDiagnostic[] {\r\n const { builder, services, tagId } = params;\r\n const ratePolicy: RatePolicy = params.ratePolicy ?? { kind: \"lte_primary\" };\r\n const props = builder.getProps() as ServiceProps;\r\n\r\n // Indexes\r\n const fields = props.fields ?? [];\r\n const fieldById = new Map(fields.map((f) => [f.id, f]));\r\n const tagById = new Map((props.filters ?? []).map((t) => [t.id, t]));\r\n const tag: Tag | undefined = tagById.get(tagId);\r\n\r\n // Baseline visible fields (no selection)\r\n const baselineFieldIds = builder.visibleFields(tagId, []);\r\n const baselineFields = baselineFieldIds\r\n .map((fid) => fieldById.get(fid))\r\n .filter(Boolean) as Field[];\r\n\r\n // Build the list of *simulation anchors* = every button in the baseline group\r\n const anchors: Array<{\r\n kind: \"field\" | \"option\";\r\n id: string;\r\n fieldId: string;\r\n label?: string;\r\n service_id?: number;\r\n }> = [];\r\n\r\n for (const f of baselineFields) {\r\n if (!isButton(f)) continue;\r\n\r\n if (Array.isArray(f.options) && f.options.length) {\r\n // Option buttons → every option becomes an anchor (even if it has no base service)\r\n for (const o of f.options) {\r\n anchors.push({\r\n kind: \"option\",\r\n id: o.id,\r\n fieldId: f.id,\r\n label: o.label ?? o.id,\r\n service_id: numberOrUndefined((o as any).service_id),\r\n });\r\n }\r\n } else {\r\n // Non-option button → the field itself is an anchor (even if it has no base service)\r\n anchors.push({\r\n kind: \"field\",\r\n id: f.id,\r\n fieldId: f.id,\r\n label: f.label ?? f.id,\r\n service_id: numberOrUndefined((f as any).service_id),\r\n });\r\n }\r\n }\r\n\r\n const diags: RateCoherenceDiagnostic[] = [];\r\n const seen = new Set<string>(); // dedupe across simulations\r\n\r\n for (const anchor of anchors) {\r\n // Build the simulated “selected keys” (how includes_for_buttons is addressed)\r\n const selectedKeys =\r\n anchor.kind === \"option\"\r\n ? [`${anchor.fieldId}::${anchor.id}`]\r\n : [anchor.fieldId];\r\n\r\n // Recompute the visible group under this simulation\r\n const vgFieldIds = builder.visibleFields(tagId, selectedKeys);\r\n const vgFields = vgFieldIds\r\n .map((fid) => fieldById.get(fid))\r\n .filter(Boolean) as Field[];\r\n\r\n // Collect base service candidates in this simulated group\r\n const baseCandidates: Array<BaseCandidate> = [];\r\n\r\n for (const f of vgFields) {\r\n if (!isButton(f)) continue;\r\n\r\n if (Array.isArray(f.options) && f.options.length) {\r\n for (const o of f.options) {\r\n const sid = numberOrUndefined((o as any).service_id);\r\n const role = normalizeRole(o.pricing_role, \"base\");\r\n if (sid == null || role !== \"base\") continue;\r\n const r = rateOf(services, sid);\r\n if (!isFiniteNumber(r)) continue;\r\n baseCandidates.push({\r\n kind: \"option\",\r\n id: o.id,\r\n label: o.label ?? o.id,\r\n service_id: sid,\r\n rate: r!,\r\n });\r\n }\r\n } else {\r\n const sid = numberOrUndefined((f as any).service_id);\r\n const role = normalizeRole((f as any).pricing_role, \"base\");\r\n if (sid == null || role !== \"base\") continue;\r\n const r = rateOf(services, sid);\r\n if (!isFiniteNumber(r)) continue;\r\n baseCandidates.push({\r\n kind: \"field\",\r\n id: f.id,\r\n label: f.label ?? f.id,\r\n service_id: sid,\r\n rate: r!,\r\n });\r\n }\r\n }\r\n\r\n if (baseCandidates.length === 0) continue;\r\n\r\n // Choose the “primary” for this simulation:\r\n // 1) Anchor’s base service (if present),\r\n // 2) else first base candidate (deterministic).\r\n const anchorPrimary =\r\n anchor.service_id != null\r\n ? pickByServiceId(baseCandidates, anchor.service_id)\r\n : undefined;\r\n\r\n const primary = anchorPrimary ? anchorPrimary : baseCandidates[0]!;\r\n\r\n // Compare every *other* candidate against the primary using the configured policy\r\n for (const cand of baseCandidates) {\r\n if (sameService(primary, cand)) continue;\r\n\r\n if (!rateOkWithPolicy(ratePolicy, cand.rate, primary.rate)) {\r\n const key = dedupeKey(tagId, anchor, primary, cand, ratePolicy);\r\n if (seen.has(key)) continue;\r\n seen.add(key);\r\n\r\n diags.push({\r\n scope: \"visible_group\",\r\n tagId,\r\n primary,\r\n offender: {\r\n kind: cand.kind,\r\n id: cand.id,\r\n label: cand.label,\r\n service_id: cand.service_id,\r\n rate: cand.rate,\r\n },\r\n policy: ratePolicy.kind,\r\n policyPct: \"pct\" in ratePolicy ? ratePolicy.pct : undefined,\r\n message: explainRateMismatch(\r\n ratePolicy,\r\n primary.rate,\r\n cand.rate,\r\n describeLabel(tag),\r\n ),\r\n simulationAnchor: {\r\n kind: anchor.kind,\r\n id: anchor.id,\r\n fieldId: anchor.fieldId,\r\n label: anchor.label,\r\n },\r\n });\r\n }\r\n }\r\n }\r\n\r\n return diags;\r\n}\r\n\r\n/* ───────────────────────── helpers ───────────────────────── */\r\n\r\nfunction isButton(f: Field): boolean {\r\n // Buttons = explicit flag OR any option-based field\r\n if ((f as any).button === true) return true;\r\n return Array.isArray(f.options) && f.options.length > 0;\r\n}\r\n\r\nfunction normalizeRole(\r\n role: PricingRole | undefined,\r\n d: PricingRole,\r\n): PricingRole {\r\n return role === \"utility\" || role === \"base\" ? role : d;\r\n}\r\n\r\nfunction numberOrUndefined(v: unknown): number | undefined {\r\n const n = Number(v);\r\n return Number.isFinite(n) ? n : undefined;\r\n}\r\n\r\nfunction isFiniteNumber(v: unknown): v is number {\r\n return typeof v === \"number\" && Number.isFinite(v);\r\n}\r\n\r\nfunction rateOf(\r\n map: DgpServiceMap,\r\n id: number | string | undefined,\r\n): number | undefined {\r\n if (id === undefined || id === null) return undefined;\r\n const cap: DgpServiceCapability | undefined =\r\n map[Number(id)] ?? (map as any)[id];\r\n return cap?.rate;\r\n}\r\n\r\nfunction pickByServiceId<T extends BaseCandidate>(\r\n arr: T[],\r\n sid: number,\r\n): T | undefined {\r\n return arr.find((x) => x.service_id === sid);\r\n}\r\n\r\nfunction sameService(a: { service_id: number }, b: { service_id: number }) {\r\n return a.service_id === b.service_id;\r\n}\r\n\r\nfunction rateOkWithPolicy(\r\n policy: RatePolicy,\r\n candRate: number,\r\n primaryRate: number,\r\n): boolean {\r\n const rp = policy ?? { kind: \"lte_primary\" as const };\r\n switch (rp.kind) {\r\n case \"lte_primary\":\r\n return candRate <= primaryRate;\r\n case \"within_pct\": {\r\n const pct = Math.max(0, rp.pct ?? 0);\r\n return candRate <= primaryRate * (1 + pct / 100);\r\n }\r\n case \"at_least_pct_lower\": {\r\n const pct = Math.max(0, rp.pct ?? 0);\r\n return candRate <= primaryRate * (1 - pct / 100);\r\n }\r\n default:\r\n return candRate <= primaryRate;\r\n }\r\n}\r\n\r\nfunction describeLabel(tag?: Tag): string {\r\n const tagName = tag?.label ?? tag?.id ?? \"tag\";\r\n return `${tagName}`;\r\n}\r\n\r\nfunction explainRateMismatch(\r\n policy: RatePolicy,\r\n primary: number,\r\n candidate: number,\r\n where: string,\r\n): string {\r\n switch (policy.kind) {\r\n case \"lte_primary\":\r\n return `Rate coherence failed (${where}): candidate ${candidate} must be ≤ primary ${primary}.`;\r\n case \"within_pct\":\r\n return `Rate coherence failed (${where}): candidate ${candidate} must be within ${policy.pct}% of primary ${primary}.`;\r\n case \"at_least_pct_lower\":\r\n return `Rate coherence failed (${where}): candidate ${candidate} must be at least ${policy.pct}% lower than primary ${primary}.`;\r\n default:\r\n return `Rate coherence failed (${where}): candidate ${candidate} mismatches primary ${primary}.`;\r\n }\r\n}\r\n\r\nfunction dedupeKey(\r\n tagId: string,\r\n anchor: { kind: \"field\" | \"option\"; id: string },\r\n primary: { service_id: number },\r\n cand: { service_id: number; id: string },\r\n rp: RatePolicy,\r\n) {\r\n const rpKey =\r\n rp.kind +\r\n (\"pct\" in rp && typeof rp.pct === \"number\" ? `:${rp.pct}` : \"\");\r\n return `${tagId}|${anchor.kind}:${anchor.id}|p${primary.service_id}|c${cand.service_id}:${cand.id}|${rpKey}`;\r\n}\r\n","import type { Field, FieldOption, Tag } from \"@/schema\";\nimport { Builder } from \"@/core/builder\";\n\nexport type NodeKind = \"tag\" | \"field\" | \"option\" | \"unknown\";\n\nexport type RelKind = \"self\" | \"ancestor\" | \"descendant\" | \"unrelated\";\n\nexport interface AncestryHit {\n kind: RelKind;\n node: TagNode;\n index: number;\n direct: boolean;\n path: string[];\n}\n\nexport interface WithAncestry {\n ancestry(baseTag: string | TagNode): readonly AncestryHit[];\n isAncestorOf(baseTag: string | TagNode): boolean;\n isDescendantOf(baseTag: string | TagNode): boolean;\n isWithin(baseTag: string | TagNode): boolean;\n}\n\nexport interface TagNode extends WithAncestry {\n kind: \"tag\";\n id: string;\n raw: Tag;\n\n includes: ReadonlySet<string>;\n excludes: ReadonlySet<string>;\n isInherited?: boolean;\n\n parent(): TagNode | undefined;\n children(): readonly TagNode[];\n ancestors(): readonly {\n node: TagNode;\n direct: boolean;\n index: number;\n path: string[];\n }[];\n pathTo(descendant: string | TagNode): string[] | null;\n isBoundTo(tagId: string | TagNode): boolean;\n getDescendant(id: string): FieldNode | undefined;\n getDescendants(): readonly FieldNode[];\n}\n\nexport interface FieldNode extends WithAncestry {\n kind: \"field\";\n id: string;\n raw: Field;\n\n includes: ReadonlySet<string>;\n excludes: ReadonlySet<string>;\n isInherited?: boolean;\n\n bindIds(): readonly string[];\n ownerTags(): readonly TagNode[];\n isBoundTo(tagId: string | TagNode): boolean;\n getDescendant(id: string, contextId?: string): FieldNode | undefined;\n getDescendants(tagId?: string): readonly FieldNode[];\n}\n\nexport interface OptionNode extends WithAncestry {\n kind: \"option\";\n id: string;\n raw: FieldOption;\n\n includes: ReadonlySet<string>;\n excludes: ReadonlySet<string>;\n isInherited?: boolean;\n\n field(): FieldNode;\n ownerTags(): readonly TagNode[];\n isBoundTo(tagId: string | TagNode): boolean;\n getDescendant(id: string, contextId?: string): FieldNode | undefined;\n getDescendants(tagId?: string): readonly FieldNode[];\n}\n\nexport interface UnknownNode extends WithAncestry {\n kind: \"unknown\";\n id: string;\n\n includes: ReadonlySet<string>;\n excludes: ReadonlySet<string>;\n isInherited?: boolean;\n}\n\nexport type AnyNode = TagNode | FieldNode | OptionNode | UnknownNode;\n\nexport interface NodeIndex {\n getNode(input: string | Tag | Field | FieldOption): AnyNode;\n getTag(id: string): TagNode | undefined;\n getField(id: string): FieldNode | undefined;\n getOption(id: string): OptionNode | undefined;\n}\n\nconst toId = (x: string | { id: string }) => (typeof x === \"string\" ? x : x.id);\n\nconst toBindList = (b: Field[\"bind_id\"]): string[] => {\n if (!b) return [];\n return typeof b === \"string\" ? [b] : [...b];\n};\n\nexport function createNodeIndex(\n builder: Builder\n): NodeIndex {\n const props = builder.getProps();\n //---\n const tags = props.filters ?? [];\n const fields = props.fields ?? [];\n\n const tagById = new Map<string, Tag>(tags.map((t) => [t.id, t]));\n const fieldById = new Map<string, Field>(fields.map((f) => [f.id, f]));\n\n const optionById = new Map<string, FieldOption>();\n const optionOwnerFieldId = new Map<string, string>();\n for (const f of fields) {\n for (const o of f.options ?? []) {\n optionById.set(o.id, o);\n optionOwnerFieldId.set(o.id, f.id);\n }\n }\n\n const parentById = new Map<string, string | undefined>();\n const childrenById = new Map<string, string[]>();\n for (const t of tags) {\n parentById.set(t.id, t.bind_id);\n if (t.bind_id) {\n const arr = childrenById.get(t.bind_id) ?? [];\n arr.push(t.id);\n childrenById.set(t.bind_id, arr);\n }\n }\n\n // --- caches\n const nodeCache = new Map<string, AnyNode>();\n const tagNodeCache = new Map<string, TagNode>();\n const fieldNodeCache = new Map<string, FieldNode>();\n const optionNodeCache = new Map<string, OptionNode>();\n\n const tagAncestorsCache = new Map<\n string,\n readonly {\n node: TagNode;\n direct: boolean;\n index: number;\n path: string[];\n }[]\n >();\n const tagChildrenCache = new Map<string, readonly TagNode[]>();\n const lineageIdsCache = new Map<string, ReadonlySet<string>>();\n\n const fieldBindIdsCache = new Map<string, readonly string[]>();\n const fieldOwnerTagsCache = new Map<string, readonly TagNode[]>();\n\n const emptySet = Object.freeze(new Set<string>());\n\n const isFieldBoundDirectToTag = (fieldId: string, tagId: string): boolean => {\n const field = fieldById.get(fieldId);\n if (!field) return false;\n const bind = field.bind_id;\n if (!bind) return false;\n if (typeof bind === \"string\") return bind === tagId;\n return bind.includes(tagId);\n };\n\n const resolveDescendants = (\n id: string,\n includes: ReadonlySet<string>,\n tagId?: string,\n forceSimple?: boolean\n ): readonly FieldNode[] => {\n if (!tagId || forceSimple) {\n const results: FieldNode[] = [];\n for (const incId of includes) {\n const node = getField(incId);\n if (node) results.push(node);\n }\n return Object.freeze(results);\n }\n\n const results: FieldNode[] = [];\n const visible = builder.visibleFields(tagId, [id]);\n\n for (const fieldId of visible) {\n const node = getField(fieldId);\n if (!node) continue;\n const explicit =\n includes.has(fieldId) ||\n isFieldBoundDirectToTag(fieldId, tagId);\n results.push(explicit ? node : { ...node, isInherited: true });\n }\n\n return Object.freeze(results);\n };\n\n // ---- core graph helpers\n const lineageIds = (tagId: string): ReadonlySet<string> => {\n const cached = lineageIdsCache.get(tagId);\n if (cached) return cached;\n\n const out = new Set<string>();\n const guard = new Set<string>();\n let cur: string | undefined = tagId;\n\n while (cur && !guard.has(cur)) {\n out.add(cur);\n guard.add(cur);\n cur = parentById.get(cur);\n }\n\n lineageIdsCache.set(tagId, out);\n return out;\n };\n\n const pathBetween = (fromId: string, toId: string): string[] | null => {\n if (fromId === toId) return [fromId];\n\n const guard = new Set<string>();\n const stack: string[] = [];\n let cur: string | undefined = toId;\n\n while (cur && !guard.has(cur)) {\n stack.push(cur);\n if (cur === fromId) return stack.reverse(); // from -> ... -> to\n guard.add(cur);\n cur = parentById.get(cur);\n }\n return null;\n };\n\n const relationBetween = (\n baseId: string,\n otherId: string,\n ): { kind: RelKind; path: string[]; index: number; direct: boolean } => {\n if (baseId === otherId)\n return { kind: \"self\", path: [baseId], index: 0, direct: false };\n\n // base -> other ? => descendant\n const down = pathBetween(baseId, otherId);\n if (down)\n return {\n kind: \"descendant\",\n path: down,\n index: down.length - 1,\n direct: down.length === 2,\n };\n\n // other -> base ? => ancestor\n const up = pathBetween(otherId, baseId);\n if (up) {\n // want base -> other path; we can just reverse \"up\"\n const p = up.slice().reverse();\n return {\n kind: \"ancestor\",\n path: p,\n index: p.length - 1,\n direct: p.length === 2,\n };\n }\n\n return { kind: \"unrelated\", path: [], index: -1, direct: false };\n };\n\n // ---- shared ancestry impl builder\n const makeAncestry = (selfOwnerTagIds: readonly string[]) => {\n return (baseTag: string | TagNode): readonly AncestryHit[] => {\n const baseId = toId(baseTag);\n const hits: AncestryHit[] = [];\n\n for (const ownerId of selfOwnerTagIds) {\n const owner = getTag(ownerId);\n if (!owner) continue;\n\n const rel = relationBetween(baseId, ownerId);\n hits.push({\n kind: rel.kind,\n node: owner,\n index: rel.index,\n direct: rel.direct,\n path: rel.path,\n });\n }\n\n return hits;\n };\n };\n\n const makeAncestryFns = (\n ancestryFn: (baseTag: string | TagNode) => readonly AncestryHit[],\n ) => ({\n ancestry: ancestryFn,\n\n isAncestorOf(baseTag: string | TagNode): boolean {\n return ancestryFn(baseTag).some((h) => h.kind === \"ancestor\");\n },\n\n isDescendantOf(baseTag: string | TagNode): boolean {\n return ancestryFn(baseTag).some((h) => h.kind === \"descendant\");\n },\n\n isWithin(baseTag: string | TagNode): boolean {\n return ancestryFn(baseTag).some(\n (h) => h.kind === \"self\" || h.kind === \"descendant\",\n );\n },\n });\n\n // ---- node factories\n const getTag = (id: string): TagNode | undefined => {\n const cached = tagNodeCache.get(id);\n if (cached) return cached;\n\n const raw = tagById.get(id);\n if (!raw) return undefined;\n\n const includes = Object.freeze(new Set(raw.includes ?? []));\n const excludes = Object.freeze(new Set(raw.excludes ?? []));\n\n const ancestryFn = makeAncestry([id]);\n\n const node: TagNode = {\n kind: \"tag\",\n id,\n raw,\n\n includes,\n excludes,\n\n ...makeAncestryFns(ancestryFn),\n\n parent() {\n const pid = parentById.get(id);\n return pid ? getTag(pid) : undefined;\n },\n\n children() {\n const cachedChildren = tagChildrenCache.get(id);\n if (cachedChildren) return cachedChildren;\n\n const childIds = childrenById.get(id) ?? [];\n const arr = childIds\n .map((cid) => getTag(cid))\n .filter(Boolean) as TagNode[];\n const frozen = Object.freeze(arr);\n tagChildrenCache.set(id, frozen);\n return frozen;\n },\n\n ancestors() {\n const cachedAnc = tagAncestorsCache.get(id);\n if (cachedAnc) return cachedAnc;\n\n const rows: Array<{\n node: TagNode;\n direct: boolean;\n index: number;\n path: string[];\n }> = [];\n const guard = new Set<string>();\n let cur = parentById.get(id);\n let index = 1;\n\n while (cur && !guard.has(cur)) {\n const n = getTag(cur);\n if (!n) break;\n const p = pathBetween(id, cur) ?? [id, cur];\n\n rows.push({ node: n, direct: index === 1, index, path: p });\n\n guard.add(cur);\n cur = parentById.get(cur);\n index++;\n }\n\n const frozen = Object.freeze(rows);\n tagAncestorsCache.set(id, frozen);\n return frozen;\n },\n\n pathTo(descendant) {\n const to = toId(descendant);\n return pathBetween(id, to);\n },\n\n isBoundTo(tagId) {\n const tid = toId(tagId);\n if (tid === id) return true;\n // A tag is bound to tagId if tagId is its DIRECT parent.\n return parentById.get(id) === tid;\n },\n\n getDescendant(descendantId) {\n return this.getDescendants().find(item => item.id == descendantId)\n },\n\n getDescendants() {\n const results: FieldNode[] = [];\n const visible = builder.visibleFields(id);\n\n for (const fieldId of visible) {\n const node = getField(fieldId);\n if (!node) continue;\n const explicit =\n includes.has(fieldId) ||\n isFieldBoundDirectToTag(fieldId, id);\n results.push(explicit ? node : { ...node, isInherited: true });\n }\n\n return Object.freeze(results);\n },\n };\n\n tagNodeCache.set(id, node);\n nodeCache.set(id, node);\n return node;\n };\n\n const getField = (id: string): FieldNode | undefined => {\n const cached = fieldNodeCache.get(id);\n if (cached) return cached;\n\n const raw = fieldById.get(id);\n if (!raw) return undefined;\n\n const isButton = (raw as any).button === true;\n const includes = isButton\n ? Object.freeze(new Set(props.includes_for_buttons?.[id] ?? []))\n : emptySet;\n const excludes = isButton\n ? Object.freeze(new Set(props.excludes_for_buttons?.[id] ?? []))\n : emptySet;\n\n const bindIds = (): readonly string[] => {\n const cachedBind = fieldBindIdsCache.get(id);\n if (cachedBind) return cachedBind;\n const res = Object.freeze(toBindList(raw.bind_id));\n fieldBindIdsCache.set(id, res);\n return res;\n };\n\n const ancestryFn = makeAncestry(bindIds());\n\n const node: FieldNode = {\n kind: \"field\",\n id,\n raw,\n\n includes,\n excludes,\n\n ...makeAncestryFns(ancestryFn),\n\n bindIds,\n\n ownerTags() {\n const cachedOwners = fieldOwnerTagsCache.get(id);\n if (cachedOwners) return cachedOwners;\n\n const owners = bindIds()\n .map((tid) => getTag(tid))\n .filter(Boolean) as TagNode[];\n\n const frozen = Object.freeze(owners);\n fieldOwnerTagsCache.set(id, frozen);\n return frozen;\n },\n\n isBoundTo(tagId) {\n const tid = toId(tagId);\n const lin = lineageIds(tid); // self + ancestors\n for (const b of bindIds()) if (lin.has(b)) return true;\n return false;\n },\n\n getDescendant(descendantId, context) {\n return this.getDescendants(context).find(item => item.id == descendantId);\n },\n\n getDescendants(tagId?: string) {\n return resolveDescendants(id, includes, tagId, !isButton);\n },\n };\n\n fieldNodeCache.set(id, node);\n nodeCache.set(id, node);\n return node;\n };\n\n const getOption = (id: string): OptionNode | undefined => {\n const cached = optionNodeCache.get(id);\n if (cached) return cached;\n\n const raw = optionById.get(id);\n const ownerFieldId = optionOwnerFieldId.get(id);\n if (!raw || !ownerFieldId) return undefined;\n\n const owner = getField(ownerFieldId);\n if (!owner) return undefined;\n\n const includes = Object.freeze(\n new Set(props.includes_for_buttons?.[id] ?? []),\n );\n const excludes = Object.freeze(\n new Set(props.excludes_for_buttons?.[id] ?? []),\n );\n\n // option shares ancestry with its owning field\n const node: OptionNode = {\n kind: \"option\",\n id,\n raw,\n\n includes,\n excludes,\n\n ...makeAncestryFns((baseTag) => owner.ancestry(baseTag)),\n\n field() {\n return owner;\n },\n\n ownerTags() {\n return owner.ownerTags();\n },\n\n isBoundTo(tagId) {\n return owner.isBoundTo(tagId);\n },\n\n getDescendant(descendantId, context) {\n return this.getDescendants(context).find(item => item.id == descendantId);\n },\n\n getDescendants(tagId?: string) {\n return resolveDescendants(id, includes, tagId);\n },\n };\n\n optionNodeCache.set(id, node);\n nodeCache.set(id, node);\n return node;\n };\n\n const getNode = (input: string | Tag | Field | FieldOption): AnyNode => {\n if (typeof input !== \"string\") {\n if (\"bind_id\" in input && !(\"type\" in input))\n return getTag(input.id) ?? mkUnknown(input.id);\n if (\"type\" in input)\n return getField(input.id) ?? mkUnknown(input.id);\n return getOption(input.id) ?? mkUnknown((input as FieldOption).id);\n }\n\n const cached = nodeCache.get(input);\n if (cached) return cached;\n\n const id = input;\n\n if (id.startsWith(\"t:\")) return getTag(id) ?? mkUnknown(id);\n if (id.startsWith(\"f:\")) return getField(id) ?? mkUnknown(id);\n if (id.startsWith(\"o:\")) return getOption(id) ?? mkUnknown(id);\n\n return getTag(id) ?? getField(id) ?? getOption(id) ?? mkUnknown(id);\n };\n\n const mkUnknown = (id: string): UnknownNode => {\n const u: UnknownNode = {\n kind: \"unknown\",\n id,\n includes: emptySet,\n excludes: emptySet,\n ...makeAncestryFns(() => []),\n };\n nodeCache.set(id, u);\n return u;\n };\n\n return {\n getNode,\n getTag,\n getField,\n getOption,\n };\n}\n"],"mappings":"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","names":["_a","_a","out","f","rest","_a","_b","rateOf","isFiniteNumber","results","toId","_a","_b","node","_c","_d","isButton"]}
|