@timeax/digital-service-engine 0.0.2 → 0.0.3
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 +15 -15
- package/dist/core/index.cjs.map +1 -1
- package/dist/core/index.d.cts +2 -0
- package/dist/core/index.d.ts +2 -0
- package/dist/core/index.js +15 -15
- package/dist/core/index.js.map +1 -1
- package/dist/react/index.cjs +145 -56
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.d.cts +32 -9
- package/dist/react/index.d.ts +32 -9
- package/dist/react/index.js +145 -56
- package/dist/react/index.js.map +1 -1
- package/dist/schema/index.d.cts +1 -0
- package/dist/schema/index.d.ts +1 -0
- package/dist/workspace/index.cjs +100 -23
- package/dist/workspace/index.cjs.map +1 -1
- package/dist/workspace/index.d.cts +25 -1
- package/dist/workspace/index.d.ts +25 -1
- package/dist/workspace/index.js +100 -23
- package/dist/workspace/index.js.map +1 -1
- package/package.json +106 -106
package/dist/react/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/react/canvas/events.ts","../../src/utils/retry-queue.ts","../../src/react/canvas/comments.ts","../../src/react/canvas/editor.ts","../../src/core/normalise.ts","../../src/core/validate/shared.ts","../../src/core/node-map.ts","../../src/core/visibility.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/utils/prune-fallbacks.ts","../../src/utils/util.ts","../../src/utils/build-order-snapshot.ts","../../src/core/policy.ts","../../src/react/canvas/selection.ts","../../src/react/canvas/api.ts","../../src/react/inputs/form-context.tsx","../../src/react/inputs/registry.ts","../../src/react/inputs/provider.tsx","../../src/react/inputs/wrapper.tsx","../../src/react/hooks/use-order-flow.ts","../../src/react/hooks/order-flow-provider.tsx","../../src/react/inputs/entries/text.tsx","../../src/react/inputs/entries/shared.ts","../../src/react/inputs/entries/textarea.tsx","../../src/react/inputs/entries/phone.tsx","../../src/react/inputs/entries/toggle-group.tsx","../../src/react/inputs/entries/number.tsx","../../src/react/inputs/entries/password.tsx","../../src/react/inputs/entries/slider.tsx","../../src/react/inputs/entries/toggle.tsx","../../src/react/inputs/entries/treeselect.tsx","../../src/react/inputs/entries/multiselect.tsx","../../src/react/inputs/entries/select.tsx","../../src/react/inputs/entries/radio.tsx","../../src/react/inputs/entries/checkbox.tsx","../../src/react/inputs/entries/chips.tsx","../../src/react/inputs/entries/color.tsx","../../src/react/inputs/entries/date.tsx","../../src/react/inputs/entries/keyvalue.tsx","../../src/react/inputs/entries/editor.tsx","../../src/react/inputs/entries/lister.tsx","../../src/react/inputs/entries/file.tsx","../../src/react/inputs/entries/index.ts"],"sourcesContent":["// Lightweight, typed event bus\r\nexport type EventMap = Record<string, unknown>;\r\n\r\nexport class EventBus<E extends EventMap> {\r\n private listeners = new Map<keyof E, Set<(p: any) => void>>();\r\n\r\n on<K extends keyof E>(event: K, handler: (payload: E[K]) => void): () => void {\r\n const set = this.listeners.get(event) ?? new Set();\r\n set.add(handler as any);\r\n this.listeners.set(event, set);\r\n return () => {\r\n set.delete(handler as any);\r\n };\r\n }\r\n\r\n once<K extends keyof E>(event: K, handler: (payload: E[K]) => void): () => void {\r\n const off = this.on(event, (p) => {\r\n off();\r\n handler(p);\r\n });\r\n return off;\r\n }\r\n\r\n emit<K extends keyof E>(event: K, payload: E[K]): void {\r\n const set = this.listeners.get(event);\r\n if (!set || set.size === 0) return;\r\n for (const h of Array.from(set)) try {\r\n (h as any)(payload);\r\n } catch { /* swallow */\r\n }\r\n }\r\n\r\n clear(): void {\r\n this.listeners.clear();\r\n }\r\n}","// noinspection JSIgnoredPromiseFromCall\r\n\r\nexport type RetryStatus = 'scheduled' | 'retrying' | 'succeeded' | 'failed' | 'cancelled';\r\n\r\nexport type RetryOptions = {\r\n enabled?: boolean; // default true\r\n maxAttempts?: number; // default 5\r\n baseDelayMs?: number; // default 800\r\n maxDelayMs?: number; // default 20_000\r\n jitter?: boolean; // default true\r\n /** Run the first attempt immediately (no initial delay) */\r\n immediateFirst?: boolean;\r\n};\r\n\r\nexport type RetryJob = {\r\n /** Stable id for de-duplication (e.g., \"comments:create_thread:loc_abc\") */\r\n id: string;\r\n /** Called on each attempt; return true to signal success, false/throw to retry */\r\n perform: (attempt: number) => Promise<boolean>;\r\n onStatus?: (status: RetryStatus, meta?: { attempt: number; nextDelayMs?: number; error?: unknown }) => void;\r\n};\r\n\r\nexport class RetryQueue {\r\n private readonly opts: Required<RetryOptions>;\r\n private jobs = new Map<string, { job: RetryJob; attempt: number; timer?: any; cancelled?: boolean }>();\r\n private paused = false;\r\n\r\n constructor(opts: RetryOptions = {}) {\r\n this.opts = {\r\n enabled: opts.enabled ?? true,\r\n maxAttempts: opts.maxAttempts ?? 5,\r\n baseDelayMs: opts.baseDelayMs ?? 800,\r\n maxDelayMs: opts.maxDelayMs ?? 20_000,\r\n jitter: opts.jitter ?? true,\r\n immediateFirst: opts.immediateFirst ?? false,\r\n };\r\n }\r\n\r\n pause() {\r\n this.paused = true;\r\n }\r\n\r\n resume() {\r\n this.paused = false;\r\n this.flush();\r\n }\r\n\r\n /** Enqueue or no-op if a job with same id already exists */\r\n enqueue(job: RetryJob): boolean {\r\n if (!this.opts.enabled) return false;\r\n if (this.jobs.has(job.id)) return false;\r\n this.jobs.set(job.id, {job, attempt: 0});\r\n job.onStatus?.('scheduled', {attempt: 0});\r\n this.kick(job.id);\r\n return true;\r\n }\r\n\r\n /** Force retry now (resets backoff); returns false if not found */\r\n triggerNow(id: string): boolean {\r\n const rec = this.jobs.get(id);\r\n if (!rec) return false;\r\n if (rec.timer) clearTimeout(rec.timer);\r\n rec.timer = undefined;\r\n this.kick(id, true);\r\n return true;\r\n }\r\n\r\n cancel(id: string): boolean {\r\n const rec = this.jobs.get(id);\r\n if (!rec) return false;\r\n if (rec.timer) clearTimeout(rec.timer);\r\n rec.cancelled = true;\r\n rec.job.onStatus?.('cancelled', {attempt: rec.attempt});\r\n this.jobs.delete(id);\r\n return true;\r\n }\r\n\r\n pendingIds(): string[] {\r\n return Array.from(this.jobs.keys());\r\n }\r\n\r\n size(): number {\r\n return this.jobs.size;\r\n }\r\n\r\n isQueued(id: string): boolean {\r\n return this.jobs.has(id);\r\n }\r\n\r\n drain(): void {\r\n for (const [id, rec] of this.jobs.entries()) {\r\n if (rec.timer) clearTimeout(rec.timer);\r\n rec.cancelled = true;\r\n rec.job.onStatus?.('cancelled', {attempt: rec.attempt});\r\n this.jobs.delete(id);\r\n }\r\n }\r\n\r\n private flush() {\r\n for (const id of this.jobs.keys()) this.kick(id);\r\n }\r\n\r\n private delayFor(attempt: number): number {\r\n const {baseDelayMs, maxDelayMs, jitter} = this.opts;\r\n const exp = Math.min(maxDelayMs, baseDelayMs * Math.pow(2, Math.max(0, attempt - 1)));\r\n if (!jitter) return exp;\r\n const r = Math.random() * 0.4 + 0.8; // 0.8x .. 1.2x\r\n return Math.min(maxDelayMs, Math.floor(exp * r));\r\n }\r\n\r\n private async kick(id: string, immediate = false) {\r\n const rec = this.jobs.get(id);\r\n if (!rec || rec.cancelled) return;\r\n\r\n if (this.paused && !immediate) return;\r\n\r\n const attempt = rec.attempt + 1;\r\n const run = async () => {\r\n if (rec.cancelled) return;\r\n rec.job.onStatus?.('retrying', {attempt});\r\n try {\r\n const ok = await rec.job.perform(attempt);\r\n if (ok) {\r\n rec.job.onStatus?.('succeeded', {attempt});\r\n this.jobs.delete(id);\r\n return;\r\n }\r\n } catch (err) {\r\n // fallthrough to schedule next\r\n rec.job.onStatus?.('failed', {attempt, error: err});\r\n }\r\n\r\n if (attempt >= this.opts.maxAttempts) {\r\n rec.job.onStatus?.('failed', {attempt});\r\n this.jobs.delete(id);\r\n return;\r\n }\r\n\r\n rec.attempt = attempt;\r\n const delay = this.delayFor(attempt);\r\n rec.job.onStatus?.('scheduled', {attempt, nextDelayMs: delay});\r\n rec.timer = setTimeout(() => this.kick(id), delay);\r\n };\r\n\r\n if (immediate) await run();\r\n else {\r\n // First attempt: respect immediateFirst option; otherwise, schedule immediately\r\n const delay = this.opts.immediateFirst && attempt === 1 ? 0 : this.delayFor(attempt);\r\n\r\n if (delay) {\r\n rec.job.onStatus?.('scheduled', {attempt: 0, nextDelayMs: delay});\r\n rec.timer = setTimeout(run, delay);\r\n } else {\r\n void run();\r\n }\r\n }\r\n }\r\n}","// src/react/canvas/comments.ts\nimport type { EventBus } from \"@/react\";\nimport type { CanvasEvents } from \"@/schema/canvas-types\";\nimport type {\n CommentsBackend,\n BackendError,\n BackendScope,\n} from \"../workspace/context/backend\";\nimport {\n RetryQueue,\n type RetryOptions as RetryOpts,\n} from \"../../utils/retry-queue\";\nimport {\n CommentAnchor,\n CommentId,\n CommentMessage,\n CommentThread,\n ThreadId,\n} from \"@/schema/comments\";\n\nlet __seq = 0;\nconst newLocalId = (p = \"loc\"): string =>\n `${p}_${Date.now().toString(36)}_${(++__seq).toString(36)}`;\n\ntype SyncState = \"pending\" | \"synced\" | \"error\";\ntype SyncThread = CommentThread & { _sync?: SyncState };\n\ntype CommentsDeps = {\n backend?: CommentsBackend<CommentThread, CommentMessage, CommentAnchor>;\n getScope?: () => BackendScope | undefined;\n retry?: RetryOpts;\n};\n\nexport class CommentsAPI {\n private threads = new Map<ThreadId, SyncThread>();\n private bus: EventBus<CanvasEvents>;\n private deps: CommentsDeps;\n private retry: RetryQueue;\n\n constructor(bus: EventBus<CanvasEvents>, deps: CommentsDeps = {}) {\n this.bus = bus;\n this.deps = deps;\n this.retry = new RetryQueue(deps.retry);\n }\n\n private scope(): BackendScope | undefined {\n return this.deps.getScope?.();\n }\n\n private emitSync(\n op: CanvasEvents[\"comment:sync\"][\"op\"],\n threadId: string,\n messageId: string | undefined,\n status: CanvasEvents[\"comment:sync\"][\"status\"],\n meta: {\n attempt: number;\n nextDelayMs?: number;\n error?: BackendError | unknown;\n },\n ): void {\n this.bus.emit(\"comment:sync\", {\n op,\n threadId,\n messageId,\n status,\n attempt: meta.attempt,\n nextDelayMs: meta.nextDelayMs,\n error: meta.error,\n });\n }\n\n /* ─── Persistence bridge ───────────────────────────── */\n\n async loadAll(): Promise<void> {\n if (!this.deps.backend) return;\n\n const scope = this.scope();\n if (!scope) return;\n\n const res = await this.deps.backend.listThreads(scope);\n\n if (!res.ok) {\n this.bus.emit(\"error\", {\n message: res.error.message,\n code: res.error.code,\n meta: res.error.meta,\n });\n return;\n }\n\n this.threads.clear();\n for (const th of res.value) {\n this.threads.set(th.id, { ...(th as CommentThread), _sync: \"synced\" });\n }\n\n // signal refresh (kept as-is)\n this.bus.emit(\"comment:thread:update\", { thread: undefined as any });\n }\n\n /* ─── Query ─────────────────────────────────────────── */\n\n list(): CommentThread[] {\n return Array.from(this.threads.values())\n .sort((a, b) => a.createdAt - b.createdAt)\n .map((t) => t as CommentThread);\n }\n\n get(id: ThreadId): CommentThread | undefined {\n return this.threads.get(id) as CommentThread | undefined;\n }\n\n /* ─── Mutations (optimistic if backend present) ─────── */\n\n async create(\n anchor: CommentAnchor,\n initialBody: string,\n meta?: Record<string, unknown>,\n ): Promise<ThreadId> {\n const now = Date.now();\n const localId = newLocalId(\"t\");\n const msgId = newLocalId(\"m\");\n\n const hasBackend = Boolean(this.deps.backend && this.scope());\n\n const local: SyncThread = {\n id: localId,\n anchor,\n resolved: false,\n createdAt: now,\n updatedAt: now,\n messages: [{ id: msgId, body: initialBody, createdAt: now }],\n meta,\n _sync: hasBackend ? \"pending\" : \"synced\",\n };\n\n this.threads.set(localId, local);\n this.bus.emit(\"comment:thread:create\", { thread: local as any });\n\n if (!this.deps.backend) return localId;\n\n const performOnce = async (): Promise<ThreadId> => {\n const scope = this.scope();\n if (!scope) return localId;\n\n const res = await this.deps.backend!.createThread(scope, {\n anchor,\n body: initialBody,\n meta,\n });\n\n if (!res.ok) throw res.error;\n\n // Swap local→server on success (kept behavior)\n this.threads.delete(localId);\n\n const serverTh: SyncThread = {\n ...(res.value as CommentThread),\n _sync: \"synced\",\n };\n\n this.threads.set(serverTh.id, serverTh);\n this.bus.emit(\"comment:thread:update\", { thread: serverTh as any });\n\n return serverTh.id;\n };\n\n try {\n const serverId = await performOnce();\n return serverId;\n } catch (err) {\n const scope = this.scope();\n const branchKey = scope?.branchId ?? \"no_branch\";\n const jobId = `comments:create_thread:${branchKey}:${localId}`;\n\n this.retry.enqueue({\n id: jobId,\n perform: async () => {\n try {\n await performOnce();\n return true;\n } catch {\n return false;\n }\n },\n onStatus: (status, meta2) =>\n this.emitSync(\n \"create_thread\",\n localId,\n undefined,\n status,\n meta2 ?? { attempt: 0 },\n ),\n });\n\n local._sync = \"error\";\n this.bus.emit(\"error\", {\n message: (err as BackendError)?.message ?? \"Create failed\",\n code: (err as BackendError)?.code,\n meta: err,\n });\n this.bus.emit(\"comment:thread:update\", { thread: local as any });\n\n return localId;\n }\n }\n\n async reply(\n threadId: ThreadId,\n body: string,\n meta?: Record<string, unknown>,\n ): Promise<CommentId> {\n const th = this.ensure(threadId);\n const now = Date.now();\n const localMid = newLocalId(\"m\");\n\n const hasBackend = Boolean(this.deps.backend && this.scope());\n\n const localMsg: CommentMessage = {\n id: localMid,\n body,\n createdAt: now,\n meta,\n };\n\n th.messages.push(localMsg);\n th.updatedAt = now;\n th._sync ??= hasBackend ? \"pending\" : \"synced\";\n\n this.bus.emit(\"comment:message:create\", {\n threadId,\n message: localMsg as any,\n });\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n\n if (!this.deps.backend) return localMid;\n\n const performOnce = async (): Promise<CommentId> => {\n const scope = this.scope();\n if (!scope) return localMid;\n\n const res = await this.deps.backend!.addMessage(scope, {\n threadId: th.id,\n body,\n meta,\n });\n\n if (!res.ok) throw res.error;\n\n const serverMsg = res.value as CommentMessage;\n const idx = th.messages.findIndex((m) => m.id === localMid);\n if (idx >= 0) th.messages[idx] = serverMsg;\n\n th._sync = \"synced\";\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n\n return serverMsg.id;\n };\n\n try {\n const serverMid = await performOnce();\n return serverMid;\n } catch (err) {\n const scope = this.scope();\n const branchKey = scope?.branchId ?? \"no_branch\";\n const jobId = `comments:add_message:${branchKey}:${threadId}:${localMid}`;\n\n this.retry.enqueue({\n id: jobId,\n perform: async () => {\n try {\n await performOnce();\n return true;\n } catch {\n return false;\n }\n },\n onStatus: (status, meta2) =>\n this.emitSync(\n \"add_message\",\n threadId,\n localMid,\n status,\n meta2 ?? { attempt: 0 },\n ),\n });\n\n th._sync = \"error\";\n this.bus.emit(\"error\", {\n message: (err as BackendError)?.message ?? \"Reply failed\",\n code: (err as BackendError)?.code,\n meta: err,\n });\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n\n return localMid;\n }\n }\n\n async editMessage(\n threadId: ThreadId,\n messageId: CommentId,\n body: string,\n ): Promise<void> {\n const th = this.ensure(threadId);\n const orig = th.messages.find((m) => m.id === messageId);\n if (!orig) return;\n\n const previous = { ...orig };\n orig.body = body;\n orig.editedAt = Date.now();\n th.updatedAt = orig.editedAt;\n\n const hasBackend = Boolean(this.deps.backend && this.scope());\n th._sync ??= hasBackend ? \"pending\" : \"synced\";\n\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n\n if (!this.deps.backend) return;\n\n const performOnce = async (): Promise<void> => {\n const scope = this.scope();\n if (!scope) return;\n\n const res = await this.deps.backend!.editMessage(scope, {\n threadId: th.id,\n messageId,\n body,\n });\n\n if (!res.ok) throw res.error;\n\n const idx = th.messages.findIndex((m) => m.id === messageId);\n if (idx >= 0) th.messages[idx] = res.value as CommentMessage;\n\n th._sync = \"synced\";\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n };\n\n try {\n await performOnce();\n } catch (err) {\n const scope = this.scope();\n const branchKey = scope?.branchId ?? \"no_branch\";\n const jobId = `comments:edit_message:${branchKey}:${threadId}:${messageId}`;\n\n this.retry.enqueue({\n id: jobId,\n perform: async () => {\n try {\n await performOnce();\n return true;\n } catch {\n return false;\n }\n },\n onStatus: (status, meta2) =>\n this.emitSync(\n \"edit_message\",\n threadId,\n messageId,\n status,\n meta2 ?? { attempt: 0 },\n ),\n });\n\n const idx = th.messages.findIndex((m) => m.id === messageId);\n if (idx >= 0) th.messages[idx] = previous;\n\n th._sync = \"error\";\n this.bus.emit(\"error\", {\n message: (err as BackendError)?.message ?? \"Edit failed\",\n code: (err as BackendError)?.code,\n meta: err,\n });\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n }\n }\n\n async deleteMessage(\n threadId: ThreadId,\n messageId: CommentId,\n ): Promise<void> {\n const th = this.ensure(threadId);\n const backup = [...th.messages];\n\n th.messages = th.messages.filter((m) => m.id !== messageId);\n th.updatedAt = Date.now();\n\n const hasBackend = Boolean(this.deps.backend && this.scope());\n th._sync ??= hasBackend ? \"pending\" : \"synced\";\n\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n\n if (!this.deps.backend) return;\n\n const performOnce = async (): Promise<void> => {\n const scope = this.scope();\n if (!scope) return;\n\n const res = await this.deps.backend!.deleteMessage(scope, {\n threadId: th.id,\n messageId,\n });\n\n if (!res.ok) throw res.error;\n\n th._sync = \"synced\";\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n };\n\n try {\n await performOnce();\n } catch (err) {\n const scope = this.scope();\n const branchKey = scope?.branchId ?? \"no_branch\";\n const jobId = `comments:delete_message:${branchKey}:${threadId}:${messageId}`;\n\n this.retry.enqueue({\n id: jobId,\n perform: async () => {\n try {\n await performOnce();\n return true;\n } catch {\n return false;\n }\n },\n onStatus: (status, meta2) =>\n this.emitSync(\n \"delete_message\",\n threadId,\n messageId,\n status,\n meta2 ?? { attempt: 0 },\n ),\n });\n\n th.messages = backup;\n th._sync = \"error\";\n this.bus.emit(\"error\", {\n message: (err as BackendError)?.message ?? \"Delete failed\",\n code: (err as BackendError)?.code,\n meta: err,\n });\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n }\n }\n\n async move(threadId: ThreadId, anchor: CommentAnchor): Promise<void> {\n const th = this.ensure(threadId);\n const prev = th.anchor;\n\n th.anchor = anchor;\n th.updatedAt = Date.now();\n\n const hasBackend = Boolean(this.deps.backend && this.scope());\n th._sync ??= hasBackend ? \"pending\" : \"synced\";\n\n this.bus.emit(\"comment:move\", { thread: th as any });\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n\n if (!this.deps.backend) return;\n\n const performOnce = async (): Promise<void> => {\n const scope = this.scope();\n if (!scope) return;\n\n const res = await this.deps.backend!.moveThread(scope, {\n threadId: th.id,\n anchor,\n });\n\n if (!res.ok) throw res.error;\n\n this.threads.set(th.id, { ...(res.value as CommentThread), _sync: \"synced\" });\n this.bus.emit(\"comment:thread:update\", {\n thread: this.threads.get(threadId)! as any,\n });\n };\n\n try {\n await performOnce();\n } catch (err) {\n const scope = this.scope();\n const branchKey = scope?.branchId ?? \"no_branch\";\n const jobId = `comments:move_thread:${branchKey}:${threadId}`;\n\n this.retry.enqueue({\n id: jobId,\n perform: async () => {\n try {\n await performOnce();\n return true;\n } catch {\n return false;\n }\n },\n onStatus: (status, meta2) =>\n this.emitSync(\n \"move_thread\",\n threadId,\n undefined,\n status,\n meta2 ?? { attempt: 0 },\n ),\n });\n\n th.anchor = prev;\n th._sync = \"error\";\n this.bus.emit(\"error\", {\n message: (err as BackendError)?.message ?? \"Move failed\",\n code: (err as BackendError)?.code,\n meta: err,\n });\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n }\n }\n\n async resolve(threadId: ThreadId, value = true): Promise<void> {\n const th = this.ensure(threadId);\n const prev = th.resolved;\n\n th.resolved = value;\n th.updatedAt = Date.now();\n\n const hasBackend = Boolean(this.deps.backend && this.scope());\n th._sync ??= hasBackend ? \"pending\" : \"synced\";\n\n this.bus.emit(\"comment:resolve\", { thread: th as any, resolved: value });\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n\n if (!this.deps.backend) return;\n\n const performOnce = async (): Promise<void> => {\n const scope = this.scope();\n if (!scope) return;\n\n const res = await this.deps.backend!.resolveThread(scope, {\n threadId: th.id,\n resolved: value,\n });\n\n if (!res.ok) throw res.error;\n\n this.threads.set(th.id, { ...(res.value as CommentThread), _sync: \"synced\" });\n this.bus.emit(\"comment:thread:update\", {\n thread: this.threads.get(threadId)! as any,\n });\n };\n\n try {\n await performOnce();\n } catch (err) {\n const scope = this.scope();\n const branchKey = scope?.branchId ?? \"no_branch\";\n const jobId = `comments:resolve_thread:${branchKey}:${threadId}`;\n\n this.retry.enqueue({\n id: jobId,\n perform: async () => {\n try {\n await performOnce();\n return true;\n } catch {\n return false;\n }\n },\n onStatus: (status, meta2) =>\n this.emitSync(\n \"resolve_thread\",\n threadId,\n undefined,\n status,\n meta2 ?? { attempt: 0 },\n ),\n });\n\n th.resolved = prev;\n th._sync = \"error\";\n this.bus.emit(\"error\", {\n message: (err as BackendError)?.message ?? \"Resolve failed\",\n code: (err as BackendError)?.code,\n meta: err,\n });\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n }\n }\n\n async deleteThread(threadId: ThreadId): Promise<void> {\n const prev = this.threads.get(threadId);\n if (!prev) return;\n\n this.threads.delete(threadId);\n this.bus.emit(\"comment:thread:delete\", { threadId });\n\n if (!this.deps.backend) return;\n\n const performOnce = async (): Promise<void> => {\n const scope = this.scope();\n if (!scope) return;\n\n const res = await this.deps.backend!.deleteThread(scope, { threadId });\n if (!res.ok) throw res.error;\n };\n\n try {\n await performOnce();\n } catch (err) {\n const scope = this.scope();\n const branchKey = scope?.branchId ?? \"no_branch\";\n const jobId = `comments:delete_thread:${branchKey}:${threadId}`;\n\n this.retry.enqueue({\n id: jobId,\n perform: async () => {\n try {\n await performOnce();\n return true;\n } catch {\n return false;\n }\n },\n onStatus: (status, meta2) =>\n this.emitSync(\n \"delete_thread\",\n threadId,\n undefined,\n status,\n meta2 ?? { attempt: 0 },\n ),\n });\n\n // rollback deletion so user can retry\n this.threads.set(threadId, prev);\n this.bus.emit(\"error\", {\n message: (err as BackendError)?.message ?? \"Delete thread failed\",\n code: (err as BackendError)?.code,\n meta: err,\n });\n this.bus.emit(\"comment:thread:update\", { thread: prev as any });\n }\n }\n\n // Optional helpers for UI controls\n retryJob(jobId: string): boolean {\n return this.retry.triggerNow(jobId);\n }\n\n cancelJob(jobId: string): boolean {\n return this.retry.cancel(jobId);\n }\n\n pendingJobs(): string[] {\n return this.retry.pendingIds();\n }\n\n /* ─── internal ────────────────────────────────────────── */\n private ensure(threadId: ThreadId): SyncThread {\n const th = this.threads.get(threadId);\n if (!th) throw new Error(`Comment thread not found: ${threadId}`);\n return th;\n }\n}","import { cloneDeep } from \"lodash-es\";\nimport type { Builder } from \"@/core\";\nimport { normalise } from \"@/core\";\nimport type {\n Command,\n DgpServiceCapability,\n DgpServiceMap,\n DynamicRule,\n EditorEvents,\n EditorOptions,\n EditorSnapshot,\n FallbackSettings,\n Field,\n ServiceProps,\n Tag,\n} from \"@/schema\";\nimport type { CanvasAPI } from \"./api\";\nimport { compilePolicies, type PolicyDiagnostic } from \"@/core/policy\";\nimport { constraintFitOk, rateOk, toFiniteNumber } from \"@/utils/util\";\n\nconst MAX_LIMIT = 100;\ntype WireKind = \"bind\" | \"include\" | \"exclude\" | \"service\";\n\n// Addressing nodes\nexport type TagRef = { kind: \"tag\"; id: string };\nexport type FieldRef = { kind: \"field\"; id: string };\nexport type OptionRef = { kind: \"option\"; fieldId: string; id: string };\nexport type NodeRef = TagRef | FieldRef | OptionRef;\n\nexport type DuplicateOptions = {\n // tags\n withChildren?: boolean; // default false\n // fields\n copyBindings?: boolean; // default true\n copyIncludesExcludes?: boolean; // default false\n copyOptionMaps?: boolean; // default false\n // all\n id?: string; // force an id instead of auto\n labelStrategy?: (old: string) => string; // override default \"Label (copy)\" logic\n nameStrategy?: (old?: string) => string | undefined; // for fields; default suffix \"_copy\"\n optionIdStrategy?: (old: string) => string; // for options; default add \"_copy\"\n};\n\n// owner lookup (linear, OK for editor; index if you want later)\nfunction ownerOfOption(\n props: ServiceProps,\n optionId: string,\n): { fieldId: string; index: number } | null {\n for (const f of props.fields ?? []) {\n const idx = (f.options ?? []).findIndex((o) => o.id === optionId);\n if (idx >= 0) return { fieldId: f.id, index: idx };\n }\n return null;\n}\n\nfunction ensureServiceExists(opts: EditorOptions, id: any) {\n if (typeof opts.serviceExists === \"function\") {\n if (!opts.serviceExists(id))\n throw new Error(`service_not_found:${String(id)}`);\n return;\n }\n if (opts.serviceMap) {\n if (!Object.prototype.hasOwnProperty.call(opts.serviceMap, id as any)) {\n throw new Error(`service_not_found:${String(id)}`);\n }\n return;\n }\n // Host didn't provide a way to verify — fail so they wire one.\n throw new Error(\"service_checker_missing\");\n}\n\nexport class Editor {\n private builder: Builder;\n private api: CanvasAPI;\n private readonly opts: Required<EditorOptions>;\n private history: EditorSnapshot[] = [];\n private index = -1; // points to current snapshot\n private txnDepth = 0;\n private txnLabel?: string;\n private stagedBefore?: EditorSnapshot;\n private _lastPolicyDiagnostics?: PolicyDiagnostic[];\n constructor(builder: Builder, api: CanvasAPI, opts: EditorOptions = {}) {\n this.builder = builder;\n this.api = api;\n // @ts-ignore\n this.opts = {\n historyLimit: Math.max(\n 1,\n Math.min(opts.historyLimit ?? MAX_LIMIT, 1000),\n ),\n validateAfterEach: opts.validateAfterEach ?? false,\n };\n // seed initial snapshot\n this.pushHistory(this.makeSnapshot(\"init\"));\n }\n\n /* ───────────────────────── Public API ───────────────────────── */\n\n isTagId(id: string) {\n return this.builder.isTagId(id);\n }\n isFieldId(id: string) {\n return this.builder.isFieldId(id);\n }\n isOptionId(id: string) {\n return this.builder.isOptionId(id);\n }\n\n getProps(): ServiceProps {\n return this.builder.getProps();\n }\n\n transact(label: string, fn: () => void): void {\n const wasTop = this.txnDepth === 0;\n let ok = false;\n if (wasTop) {\n this.txnLabel = label;\n this.stagedBefore = this.makeSnapshot(label + \":before\");\n }\n this.txnDepth++;\n try {\n fn();\n ok = true;\n } finally {\n this.txnDepth--;\n if (wasTop) {\n if (ok) {\n this.commit(label); // push one history entry\n } else if (this.stagedBefore) {\n this.loadSnapshot(this.stagedBefore, \"undo\"); // rollback to pre-txn state\n }\n this.txnLabel = undefined;\n this.stagedBefore = undefined;\n }\n }\n }\n\n exec(cmd: Command): void {\n try {\n const before = this.makeSnapshot(cmd.name + \":before\");\n cmd.do();\n this.afterMutation(cmd.name, before);\n } catch (err) {\n this.emit(\"editor:error\", {\n message: (err as Error)?.message ?? String(err),\n code: \"command\",\n });\n throw err;\n }\n }\n\n undo(): boolean {\n if (this.index <= 0) return false;\n this.index--;\n this.loadSnapshot(this.history[this.index], \"undo\");\n this.emit(\"editor:undo\", {\n stackSize: this.history.length,\n index: this.index,\n });\n return true;\n }\n\n redo(): boolean {\n if (this.index >= this.history.length - 1) return false;\n this.index++;\n this.loadSnapshot(this.history[this.index], \"redo\");\n this.emit(\"editor:redo\", {\n stackSize: this.history.length,\n index: this.index,\n });\n return true;\n }\n\n clearService(id: string) {\n this.setService(id, { service_id: undefined });\n }\n\n /* ───────────── Convenience editing ops (command-wrapped) ───────────── */\n duplicate(ref: NodeRef, opts: DuplicateOptions = {}): string {\n const snapBefore = this.makeSnapshot(\"duplicate:before\");\n try {\n let newId = \"\";\n this.transact(\"duplicate\", () => {\n if (ref.kind === \"tag\") {\n newId = this.duplicateTag(ref.id, opts);\n } else if (ref.kind === \"field\") {\n newId = this.duplicateField(ref.id, opts);\n } else {\n newId = this.duplicateOption(ref.fieldId, ref.id, opts);\n }\n });\n return newId;\n } catch (err) {\n // rollback to be safe\n this.loadSnapshot(snapBefore, \"undo\");\n throw err;\n }\n }\n\n /**\n * Update the display label for a node and refresh the graph so node labels stay in sync.\n * Supports: tag (\"t:*\"), field (\"f:*\"), option (\"o:*\").\n * IDs are NOT changed; only the human-readable label.\n */\n reLabel(id: string, nextLabel: string): void {\n const label = String(nextLabel ?? \"\").trim();\n\n this.exec({\n name: \"reLabel\",\n do: () =>\n this.patchProps((p) => {\n // Tag\n if (this.isTagId(id)) {\n const t = (p.filters ?? []).find((x) => x.id === id);\n if (!t) return;\n if ((t.label ?? \"\") === label) return;\n t.label = label;\n // graph nodes mirror builder, so rebuild\n this.api.refreshGraph();\n return;\n }\n\n // Option (find owner field → option)\n if (this.isOptionId(id)) {\n const own = ownerOfOption(p, id);\n if (!own) return;\n const f = (p.fields ?? []).find(\n (x) => x.id === own.fieldId,\n );\n const o = f?.options?.find((x) => x.id === id);\n if (!o) return;\n if ((o.label ?? \"\") === label) return;\n o.label = label;\n this.api.refreshGraph();\n return;\n }\n\n // Field (default)\n const fld = (p.fields ?? []).find((x) => x.id === id);\n if (!fld) return;\n if ((fld.label ?? \"\") === label) return;\n fld.label = label;\n this.api.refreshGraph();\n }),\n undo: () => this.api.undo(),\n });\n }\n\n /**\n * Assign or change a field's `name`. Only allowed when the field (and its options) have NO service mapping.\n * - If `nextName` is empty/blank → removes the `name`.\n * - Emits an error if the field or any of its options carry a `service_id`.\n * - Emits an error if `nextName` collides with an existing field's name (case-sensitive).\n */\n setFieldName(fieldId: string, nextName: string | null | undefined): void {\n const raw = typeof nextName === \"string\" ? nextName : \"\";\n const name = raw.trim();\n\n this.exec({\n name: \"setFieldName\",\n do: () =>\n this.patchProps((p) => {\n const fields = p.fields ?? [];\n const f = fields.find((x) => x.id === fieldId);\n if (!f) {\n this.api.emit(\"error\", {\n code: \"field_not_found\",\n message: `Field not found: ${fieldId}`,\n meta: { fieldId },\n });\n return;\n }\n\n // Disallow if the field itself maps to a service\n const fieldHasService =\n typeof (f as any).service_id === \"number\";\n\n // Disallow if any option maps to a service\n const optionHasService = Array.isArray(f.options)\n ? f.options.some(\n (o) => typeof (o as any).service_id === \"number\",\n )\n : false;\n\n if (fieldHasService || optionHasService) {\n this.api.emit(\"error\", {\n code: \"field_has_service_mapping\",\n message:\n \"Cannot set a name on a field that maps to a service (either the field or one of its options has a service_id).\",\n meta: {\n fieldId,\n fieldHasService,\n optionHasService,\n },\n });\n return;\n }\n\n // If clearing, remove the key to keep payload lean\n if (name.length === 0) {\n if (\"name\" in f) delete (f as any).name;\n return;\n }\n\n // Prevent name collisions with other fields\n const collision = fields.find(\n (x) => x.id !== fieldId && (x.name ?? \"\") === name,\n );\n if (collision) {\n this.api.emit(\"error\", {\n code: \"field_name_collision\",\n message: `Another field already uses the name \"${name}\".`,\n meta: { fieldId, otherFieldId: collision.id },\n });\n return;\n }\n\n // Assign\n (f as any).name = name;\n }),\n undo: () => this.api.undo(),\n });\n }\n getLastPolicyDiagnostics(): PolicyDiagnostic[] | undefined {\n return this._lastPolicyDiagnostics;\n }\n /* ───────────────────── Internals: duplicate impls ───────────────────── */\n\n private duplicateTag(tagId: string, opts: DuplicateOptions): string {\n const props = this.builder.getProps();\n const tags = props.filters ?? [];\n const src = tags.find((t) => t.id === tagId);\n if (!src) throw new Error(`Tag not found: ${tagId}`);\n\n // generate new id + label\n const id = opts.id ?? this.uniqueId(src.id);\n const label = (opts.labelStrategy ?? nextCopyLabel)(src.label ?? id);\n\n if (!opts.withChildren) {\n // shallow copy\n this.patchProps((p) => {\n const clone = { ...src, id, label };\n // keep same parent\n clone.bind_id = src.bind_id;\n // includes/excludes are field ids—copy them as-is\n clone.constraints_overrides = undefined;\n clone.constraints_origin = undefined;\n // insert after original among siblings: we can rebuild array with splice\n const arr = p.filters ?? [];\n const idx = arr.findIndex((t) => t.id === tagId);\n arr.splice(idx + 1, 0, clone);\n p.filters = arr;\n });\n return id;\n }\n\n // deep clone subtree: map oldTagId -> newTagId\n const idMap = new Map<string, string>();\n const collect = (t: typeof src, acc: (typeof src)[]) => {\n acc.push(t);\n for (const child of tags.filter((x) => x.bind_id === t.id))\n collect(child as any, acc);\n };\n const subtree: (typeof src)[] = [];\n collect(src, subtree);\n\n // allocate ids\n for (const n of subtree)\n idMap.set(n.id, n.id === src.id ? id : this.uniqueId(n.id));\n\n // build clones\n const clones = subtree.map((n) => {\n const cloned = { ...n };\n cloned.id = idMap.get(n.id)!;\n cloned.label =\n n.id === src.id\n ? label\n : (opts.labelStrategy ?? nextCopyLabel)(n.label ?? n.id);\n\n // rewire parent if parent is in subtree\n cloned.bind_id = n.bind_id\n ? (idMap.get(n.bind_id) ?? n.bind_id)\n : undefined;\n\n // scrub derived meta (will be re-created by normalise)\n cloned.constraints_origin = undefined;\n cloned.constraints_overrides = undefined;\n return cloned;\n });\n\n this.patchProps((p) => {\n const arr = p.filters ?? [];\n // insert root clone after original\n const rootIdx = arr.findIndex((t) => t.id === tagId);\n arr.splice(rootIdx + 1, 0, clones[0] as any);\n // append other clones (order: parent before children to keep grouping stable)\n for (const c of clones.slice(1)) arr.push(c as any);\n p.filters = arr;\n });\n\n return id;\n }\n\n private duplicateField(fieldId: string, opts: DuplicateOptions): string {\n const props = this.builder.getProps();\n const fields = props.fields ?? [];\n const src = fields.find((f) => f.id === fieldId);\n if (!src) throw new Error(`Field not found: ${fieldId}`);\n\n const id = opts.id ?? this.uniqueId(src.id);\n const label = (opts.labelStrategy ?? nextCopyLabel)(src.label ?? id);\n const name = opts.nameStrategy\n ? opts.nameStrategy(src.name)\n : nextCopyName(src.name);\n\n // helper to create new option ids\n const optId = (old: string) =>\n this.uniqueOptionId(\n id,\n (opts.optionIdStrategy ?? defaultOptionIdStrategy)(old),\n );\n\n // deep copy options with new ids\n const clonedOptions = (src.options ?? []).map((o) => ({\n ...o,\n id: optId(o.id),\n label: (opts.labelStrategy ?? nextCopyLabel)(o.label ?? o.id),\n }));\n\n const cloned = {\n ...src,\n id,\n label,\n name,\n bind_id: (opts.copyBindings ?? true) ? src.bind_id : undefined,\n options: clonedOptions,\n } as typeof src;\n\n // map: oldOptId -> newOptId (only if options exist)\n const optionIdMap = new Map<string, string>();\n (src.options ?? []).forEach((o, i) => {\n const newOptId = clonedOptions[i]?.id ?? o.id;\n optionIdMap.set(o.id, newOptId);\n });\n\n this.patchProps((p) => {\n // insert clone after original\n const arr = p.fields ?? [];\n const idx = arr.findIndex((f) => f.id === fieldId);\n arr.splice(idx + 1, 0, cloned as any);\n p.fields = arr;\n\n // copy tag-level includes/excludes (field ids)\n if (opts.copyIncludesExcludes) {\n for (const t of p.filters ?? []) {\n if (t.includes?.includes(fieldId)) {\n const s = new Set(t.includes);\n s.add(id);\n t.includes = Array.from(s);\n }\n if (t.excludes?.includes(fieldId)) {\n const s = new Set(t.excludes);\n s.add(id);\n t.excludes = Array.from(s);\n }\n }\n }\n\n // copy button maps (keys are only field ids OR option ids)\n if (opts.copyOptionMaps) {\n const maps: Array<\n \"includes_for_buttons\" | \"excludes_for_buttons\"\n > = [\"includes_for_buttons\", \"excludes_for_buttons\"];\n\n for (const mapKey of maps) {\n const srcMap = (p as any)[mapKey] ?? {};\n const nextMap: Record<string, string[]> = { ...srcMap };\n\n for (const [key, targets] of Object.entries(\n srcMap as Record<string, string[]>,\n )) {\n // A) non-option button: key === original field id → duplicate under new field id\n if (key === fieldId) {\n const newKey = id;\n const merged = new Set([\n ...(nextMap[newKey] ?? []),\n ...targets,\n ]);\n nextMap[newKey] = Array.from(merged);\n continue;\n }\n\n // B) option button: key === one of the original option ids → duplicate under new option id\n if (optionIdMap.has(key)) {\n const newKey = optionIdMap.get(key)!;\n const merged = new Set([\n ...(nextMap[newKey] ?? []),\n ...targets,\n ]);\n nextMap[newKey] = Array.from(merged);\n }\n }\n\n (p as any)[mapKey] = nextMap;\n }\n }\n });\n\n return id;\n }\n\n private duplicateOption(\n fieldId: string,\n optionId: string,\n opts: DuplicateOptions,\n ): string {\n const props = this.builder.getProps();\n const fields = props.fields ?? [];\n const f = fields.find((x) => x.id === fieldId);\n if (!f) throw new Error(`Field not found: ${fieldId}`);\n const optIdx = (f.options ?? []).findIndex((o) => o.id === optionId);\n if (optIdx < 0)\n throw new Error(`Option not found: ${fieldId}::${optionId}`);\n const src = (f.options ?? [])[optIdx];\n\n const newId = this.uniqueOptionId(\n fieldId,\n (opts.optionIdStrategy ?? defaultOptionIdStrategy)(src.id),\n );\n const newLabel = (opts.labelStrategy ?? nextCopyLabel)(\n src.label ?? src.id,\n );\n\n this.patchProps((p) => {\n const fld = (p.fields ?? []).find((x) => x.id === fieldId)!;\n const arr = fld.options ?? [];\n const clone = { ...src, id: newId, label: newLabel };\n arr.splice(optIdx + 1, 0, clone);\n fld.options = arr;\n\n // Option-level maps are NOT copied by default (safer)\n if (opts.copyOptionMaps) {\n const oldKey = `${fieldId}::${optionId}`;\n const newKey = `${fieldId}::${newId}`;\n for (const mapKey of [\n \"includes_for_buttons\",\n \"excludes_for_buttons\",\n ] as const) {\n const m = p[mapKey] ?? {};\n if (m[oldKey]) {\n m[newKey] = Array.from(new Set(m[oldKey]));\n p[mapKey] = m as any;\n }\n }\n }\n });\n\n return newId;\n }\n\n /* ───────────────────── Helpers: uniqueness & naming ───────────────────── */\n\n private uniqueId(base: string): string {\n const props = this.builder.getProps();\n const taken = new Set<string>([\n ...(props.filters ?? []).map((t) => t.id),\n ...(props.fields ?? []).map((f) => f.id),\n ]);\n let candidate = nextCopyId(base);\n while (taken.has(candidate)) candidate = bumpSuffix(candidate);\n return candidate;\n }\n\n private uniqueOptionId(fieldId: string, base: string): string {\n const props = this.builder.getProps();\n const fld = (props.fields ?? []).find((f) => f.id === fieldId);\n const taken = new Set((fld?.options ?? []).map((o) => o.id));\n let candidate = base;\n if (taken.has(candidate)) candidate = nextCopyId(candidate);\n while (taken.has(candidate)) candidate = bumpSuffix(candidate);\n return candidate;\n }\n\n //---------\n\n /**\n * Reorder a node:\n * - Tag: among its siblings (same bind_id) inside filters[]\n * - Field: inside order_for_tags[scopeTagId] (you must pass scopeTagId)\n * - Option: use placeOption() instead\n */\n placeNode(\n id: string,\n opts: {\n scopeTagId?: string;\n beforeId?: string;\n afterId?: string;\n index?: number;\n },\n ) {\n if (this.isTagId(id)) {\n // … your existing tag sibling reorder logic …\n this.exec({\n name: \"placeTag\",\n do: () =>\n this.patchProps((p) => {\n const all = p.filters ?? [];\n const cur = all.find((t) => t.id === id);\n if (!cur) return;\n const groupKey = cur.bind_id ?? \"__root__\";\n const siblings = all.filter(\n (t) => (t.bind_id ?? \"__root__\") === groupKey,\n );\n\n const curIdx = siblings.findIndex((t) => t.id === id);\n if (curIdx < 0) return;\n const pulled = siblings.splice(curIdx, 1)[0];\n\n let dest =\n typeof opts.index === \"number\"\n ? opts.index\n : undefined;\n if (opts.beforeId)\n dest = Math.max(\n 0,\n siblings.findIndex(\n (t) => t.id === opts.beforeId,\n ),\n );\n if (opts.afterId)\n dest = Math.min(\n siblings.length,\n siblings.findIndex(\n (t) => t.id === opts.afterId,\n ) + 1,\n );\n if (dest === undefined || Number.isNaN(dest))\n dest = siblings.length;\n\n // stitch back: leave other groups untouched, replace this group in order\n const out: Tag[] = [];\n for (const t of all) {\n const sameGroup =\n (t.bind_id ?? \"__root__\") === groupKey;\n if (!sameGroup) {\n out.push(t);\n }\n // if (!used.has(t.id) && t.id !== id) continue; // skip old group entries\n }\n siblings.splice(dest, 0, pulled);\n p.filters = [...out, ...siblings];\n }),\n undo: () => this.api.undo(),\n });\n } else if (this.isFieldId(id)) {\n if (!opts.scopeTagId)\n throw new Error(\"placeNode(field): scopeTagId is required\");\n const fieldId = id;\n const tagId = opts.scopeTagId;\n\n this.exec({\n name: \"placeField\",\n do: () =>\n this.patchProps((p) => {\n const map = (p.order_for_tags ??= {});\n const arr = (map[tagId] ??= []);\n const curIdx = arr.indexOf(fieldId);\n if (curIdx >= 0) arr.splice(curIdx, 1);\n\n let dest =\n typeof opts.index === \"number\"\n ? opts.index\n : undefined;\n if (opts.beforeId)\n dest = Math.max(0, arr.indexOf(opts.beforeId));\n if (opts.afterId)\n dest = Math.min(\n arr.length,\n arr.indexOf(opts.afterId) + 1,\n );\n if (dest === undefined || Number.isNaN(dest))\n dest = arr.length;\n\n arr.splice(dest, 0, fieldId);\n }),\n undo: () => this.api.undo(),\n });\n } else if (this.isOptionId(id)) {\n // defer to placeOption for options\n this.placeOption(id, opts);\n } else {\n throw new Error(\"placeNode: unknown id prefix\");\n }\n }\n\n placeOption(\n optionId: string,\n opts: { beforeId?: string; afterId?: string; index?: number },\n ) {\n if (!this.isOptionId(optionId))\n throw new Error('placeOption: optionId must start with \"o:\"');\n\n this.exec({\n name: \"placeOption\",\n do: () =>\n this.patchProps((p) => {\n const owner = ownerOfOption(p, optionId);\n if (!owner) return;\n const f = (p.fields ?? []).find(\n (x) => x.id === owner.fieldId,\n );\n if (!f?.options) return;\n\n const curIdx = f.options.findIndex(\n (o) => o.id === optionId,\n );\n if (curIdx < 0) return;\n\n const pulled = f.options.splice(curIdx, 1)[0];\n\n let dest =\n typeof opts.index === \"number\" ? opts.index : undefined;\n if (opts.beforeId)\n dest = Math.max(\n 0,\n f.options.findIndex((o) => o.id === opts.beforeId),\n );\n if (opts.afterId)\n dest = Math.min(\n f.options.length,\n f.options.findIndex((o) => o.id === opts.afterId) +\n 1,\n );\n if (dest === undefined || Number.isNaN(dest))\n dest = f.options.length;\n\n f.options.splice(dest, 0, pulled);\n }),\n undo: () => this.api.undo(),\n });\n }\n\n addOption(\n fieldId: string,\n input: {\n id?: string;\n label: string;\n service_id?: number;\n pricing_role?: \"base\" | \"utility\" | \"addon\";\n [k: string]: any;\n },\n ): string {\n // decide id up-front so we can return synchronously\n const id = input.id ?? this.genId(\"o\");\n\n this.exec({\n name: \"addOption\",\n do: () =>\n this.patchProps((p) => {\n const f = (p.fields ?? []).find((x) => x.id === fieldId);\n if (!f)\n throw new Error(\n `addOption: field '${fieldId}' not found`,\n );\n const list = (f.options ??= []);\n if (list.some((o) => o.id === id))\n throw new Error(`Option id '${id}' already exists`);\n // @ts-ignore\n list.push({ ...input, id });\n }),\n undo: () => this.api.undo(),\n });\n\n return id;\n }\n\n updateOption(\n optionId: string,\n patch: Partial<\n {\n label: string;\n service_id: number;\n pricing_role: \"base\" | \"utility\" | \"addon\";\n } & Record<string, any>\n >,\n ) {\n if (!this.isOptionId(optionId))\n throw new Error('updateOption: optionId must start with \"o:\"');\n this.exec({\n name: \"updateOption\",\n do: () =>\n this.patchProps((p) => {\n const owner = ownerOfOption(p, optionId);\n if (!owner) return;\n const f = (p.fields ?? []).find(\n (x) => x.id === owner.fieldId,\n );\n if (!f?.options) return;\n const o = f.options.find((x) => x.id === optionId);\n if (o) Object.assign(o, patch);\n }),\n undo: () => this.api.undo(),\n });\n }\n\n removeOption(optionId: string) {\n if (!this.isOptionId(optionId))\n throw new Error('removeOption: optionId must start with \"o:\"');\n this.exec({\n name: \"removeOption\",\n do: () =>\n this.patchProps((p) => {\n const owner = ownerOfOption(p, optionId);\n if (!owner) return;\n const f = (p.fields ?? []).find(\n (x) => x.id === owner.fieldId,\n );\n if (!f?.options) return;\n f.options = f.options.filter((o) => o.id !== optionId);\n\n // prune option-level include/exclude maps keyed by the option id\n const maps: Array<\n \"includes_for_options\" | \"excludes_for_options\"\n > = [\"includes_for_options\", \"excludes_for_options\"];\n for (const m of maps) {\n const map = (p as any)[m] as\n | Record<string, string[]>\n | undefined;\n if (!map) continue;\n if (map[optionId]) delete map[optionId];\n if (!Object.keys(map).length) delete (p as any)[m];\n }\n }),\n undo: () => this.api.undo(),\n });\n }\n\n editLabel(id: string, label: string): void {\n const next = (label ?? \"\").trim();\n if (!next) throw new Error(\"Label cannot be empty\");\n\n this.exec({\n name: \"editLabel\",\n do: () =>\n this.patchProps((p) => {\n if (this.isTagId(id)) {\n const t = (p.filters ?? []).find((x) => x.id === id);\n if (t) t.label = next;\n return;\n }\n if (this.isFieldId(id)) {\n const f = (p.fields ?? []).find((x) => x.id === id);\n if (f) f.label = next;\n return;\n }\n if (this.isOptionId(id)) {\n const own = ownerOfOption(p, id);\n if (!own) return;\n const f = (p.fields ?? []).find(\n (x) => x.id === own.fieldId,\n );\n const o = f?.options?.find((x) => x.id === id);\n if (o) o.label = next;\n return;\n }\n throw new Error(\"editLabel: unsupported id\");\n }),\n undo: () => this.api.undo(),\n });\n }\n\n editName(fieldId: string, name: string | undefined) {\n this.exec({\n name: \"editName\",\n do: () =>\n this.patchProps((p) => {\n const f = (p.fields ?? []).find((x) => x.id === fieldId);\n if (!f) return;\n f.name = name;\n }),\n undo: () => this.api.undo(),\n });\n }\n\n setService(\n id: string,\n input: { service_id?: number; pricing_role?: \"base\" | \"utility\" },\n ): void {\n this.exec({\n name: \"setService\",\n do: () =>\n this.patchProps((p) => {\n const hasSidKey = Object.prototype.hasOwnProperty.call(\n input,\n \"service_id\",\n );\n const validId =\n hasSidKey &&\n typeof input.service_id === \"number\" &&\n Number.isFinite(input.service_id);\n const sid: number | undefined = validId\n ? Number(input.service_id)\n : undefined;\n const nextRole = input.pricing_role;\n\n // ── TAG ───────────────────────────────────────────────────\n if (this.isTagId(id)) {\n const t = (p.filters ?? []).find((x) => x.id === id);\n if (!t) return;\n\n // role not applicable for tags\n if (hasSidKey) {\n if (sid === undefined) delete (t as any).service_id;\n else t.service_id = sid;\n }\n return;\n }\n\n // ── OPTION ───────────────────────────────────────────────\n if (this.isOptionId(id)) {\n const own = ownerOfOption(p, id);\n if (!own) return;\n const f = (p.fields ?? []).find(\n (x) => x.id === own.fieldId,\n );\n const o = f?.options?.find((x) => x.id === id);\n if (!o) return;\n\n const currentRole = (o.pricing_role ?? \"base\") as\n | \"base\"\n | \"utility\";\n const role = nextRole ?? currentRole;\n\n if (role === \"utility\") {\n // Utilities cannot have service_id, and if switching to utility, strip any existing sid.\n if (hasSidKey && sid !== undefined) {\n this.api.emit(\"error\", {\n message:\n \"Utilities cannot have service_id (option).\",\n code: \"utility_service_conflict\",\n meta: { id, service_id: sid },\n });\n }\n o.pricing_role = \"utility\";\n if (\"service_id\" in o) delete (o as any).service_id;\n return;\n }\n\n // role === 'base'\n if (nextRole) o.pricing_role = \"base\";\n if (hasSidKey) {\n if (sid === undefined) delete (o as any).service_id;\n else o.service_id = sid;\n }\n return;\n }\n\n // ── FIELD (button-able) ─────────────────────────────────\n // Field ids usually look like \"f:*\" in your project; we’ll treat any non-tag/non-option as field.\n const f = (p.fields ?? []).find((x) => x.id === id);\n if (!f) {\n throw new Error(\n 'setService only supports tag (\"t:*\"), option (\"o:*\"), or field (\"f:*\") ids',\n );\n }\n\n const isOptionBased =\n Array.isArray(f.options) && f.options.length > 0;\n const isButton = !!(f as any).button;\n\n // Move/normalize role at field level if provided\n if (nextRole) {\n f.pricing_role = nextRole;\n }\n const effectiveRole = (f.pricing_role ?? \"base\") as\n | \"base\"\n | \"utility\";\n\n // If the field is option-based, services must live on options, not on the field.\n if (isOptionBased) {\n if (hasSidKey) {\n this.api.emit(\"error\", {\n message:\n \"Cannot set service_id on an option-based field. Assign service_id on its options instead.\",\n code: \"field_option_based_service_forbidden\",\n meta: { id, service_id: sid },\n });\n }\n // Still allow changing pricing_role at field level (acts as a default for options),\n // but never write/keep service_id on the field itself.\n if (\"service_id\" in (f as any))\n delete (f as any).service_id;\n return;\n }\n\n // For non-option fields, only \"button\" fields are allowed to carry a service_id.\n if (!isButton) {\n if (hasSidKey) {\n this.api.emit(\"error\", {\n message:\n \"Only button fields (without options) can have a service_id.\",\n code: \"non_button_field_service_forbidden\",\n meta: { id, service_id: sid },\n });\n }\n // Ensure we don't keep any stray sid\n if (\"service_id\" in (f as any))\n delete (f as any).service_id;\n return;\n }\n\n // Button field + role checks\n if (effectiveRole === \"utility\") {\n // Utilities cannot have service_id at all.\n if (hasSidKey && sid !== undefined) {\n this.api.emit(\"error\", {\n message:\n \"Utilities cannot have service_id (field).\",\n code: \"utility_service_conflict\",\n meta: { id, service_id: sid },\n });\n }\n if (\"service_id\" in (f as any))\n delete (f as any).service_id;\n return;\n }\n\n // Button field with role 'base' → allow setting/clearing sid\n if (hasSidKey) {\n if (sid === undefined) delete (f as any).service_id;\n else (f as any).service_id = sid;\n }\n }),\n undo: () => this.api.undo(),\n });\n }\n\n addTag(\n partial: Omit<Tag, \"id\" | \"label\"> & { id?: string; label: string },\n ) {\n const id = partial.id ?? this.genId(\"t\");\n const payload = { ...partial, id };\n this.exec({\n name: \"addTag\",\n do: () =>\n this.patchProps((p) => {\n p.filters = [...(p.filters ?? []), payload];\n }),\n undo: () =>\n this.patchProps((p) => {\n p.filters = (p.filters ?? []).filter((t) => t.id !== id);\n }),\n });\n }\n\n updateTag(id: string, patch: Partial<Tag>) {\n let prev: Tag | undefined;\n this.exec({\n name: \"updateTag\",\n do: () =>\n this.patchProps((p) => {\n p.filters = (p.filters ?? []).map((t) => {\n if (t.id !== id) return t;\n prev = t;\n return { ...t, ...patch };\n });\n }),\n undo: () =>\n this.patchProps((p) => {\n p.filters = (p.filters ?? []).map((t) =>\n t.id === id && prev ? prev : t,\n );\n }),\n });\n }\n\n removeTag(id: string) {\n let prevSlice!: ServiceProps;\n this.exec({\n name: \"removeTag\",\n do: () =>\n this.patchProps((p) => {\n prevSlice = cloneDeep(p);\n // noinspection DuplicatedCode\n p.filters = (p.filters ?? []).filter((t) => t.id !== id);\n // drop references\n for (const t of p.filters ?? []) {\n if (t.bind_id === id) delete t.bind_id;\n t.includes = (t.includes ?? []).filter((x) => x !== id);\n t.excludes = (t.excludes ?? []).filter((x) => x !== id);\n }\n for (const f of p.fields ?? []) {\n if (Array.isArray(f.bind_id))\n f.bind_id = f.bind_id.filter((x) => x !== id);\n else if (f.bind_id === id) delete f.bind_id;\n }\n }),\n undo: () => this.replaceProps(prevSlice),\n });\n }\n\n addField(\n partial: Omit<Field, \"id\" | \"label\" | \"type\"> & {\n id?: string;\n label: string;\n type: Field[\"type\"];\n },\n ) {\n const id = partial.id ?? this.genId(\"f\");\n const payload = { ...partial, id };\n this.exec({\n name: \"addField\",\n do: () =>\n this.patchProps((p) => {\n p.fields = [...(p.fields ?? []), payload as Field];\n }),\n undo: () =>\n this.patchProps((p) => {\n p.fields = (p.fields ?? []).filter((f) => f.id !== id);\n }),\n });\n }\n\n updateField(id: string, patch: Partial<Field>) {\n let prev: Field | undefined;\n this.exec({\n name: \"updateField\",\n do: () =>\n this.patchProps((p) => {\n // @ts-ignore\n p.fields = (p.fields ?? []).map((f) => {\n if (f.id !== id) return f;\n prev = f;\n return { ...f, ...patch };\n });\n }),\n undo: () =>\n this.patchProps((p) => {\n p.fields = (p.fields ?? []).map((f) =>\n f.id === id && prev ? prev : f,\n );\n }),\n });\n }\n\n removeField(id: string) {\n let prevSlice!: ServiceProps;\n this.exec({\n name: \"removeField\",\n do: () =>\n this.patchProps((p) => {\n prevSlice = cloneDeep(p);\n p.fields = (p.fields ?? []).filter((f) => f.id !== id);\n // prune option maps that reference this field\n for (const mapKey of [\n \"includes_for_buttons\",\n \"excludes_for_buttons\",\n ] as const) {\n const m = p[mapKey];\n if (!m) continue;\n for (const k of Object.keys(m)) {\n m[k] = (m[k] ?? []).filter((fid) => fid !== id);\n if (!m[k]?.length) delete m[k];\n }\n }\n for (const t of p.filters ?? []) {\n t.includes = (t.includes ?? []).filter((x) => x !== id);\n t.excludes = (t.excludes ?? []).filter((x) => x !== id);\n }\n }),\n undo: () => this.replaceProps(prevSlice),\n });\n }\n\n remove(id: string) {\n if (this.isTagId(id)) {\n this.exec({\n name: \"removeTag\",\n do: () =>\n this.patchProps((p) => {\n // noinspection DuplicatedCode\n p.filters = (p.filters ?? []).filter(\n (t) => t.id !== id,\n );\n\n // detach children + prune includes/excludes references\n for (const t of p.filters ?? []) {\n if (t.bind_id === id) delete t.bind_id;\n t.includes = (t.includes ?? []).filter(\n (x) => x !== id,\n );\n t.excludes = (t.excludes ?? []).filter(\n (x) => x !== id,\n );\n }\n\n // remove tag from field.bind_id arrays\n for (const f of p.fields ?? []) {\n if (Array.isArray(f.bind_id))\n f.bind_id = f.bind_id.filter(\n (x) => x !== id,\n ) as any;\n else if (f.bind_id === id) delete f.bind_id;\n }\n\n // prune per-tag ordering entry and stale field ids\n if (p.order_for_tags?.[id]) delete p.order_for_tags[id];\n for (const k of Object.keys(p.order_for_tags ?? {})) {\n p.order_for_tags![k] = (\n p.order_for_tags![k] ?? []\n ).filter((fid) =>\n (p.fields ?? []).some((f) => f.id === fid),\n );\n if (!p.order_for_tags![k].length)\n delete p.order_for_tags![k];\n }\n }),\n undo: () => this.api.undo(),\n });\n return;\n }\n\n if (this.isFieldId(id)) {\n this.exec({\n name: \"removeField\",\n do: () =>\n this.patchProps((p) => {\n p.fields = (p.fields ?? []).filter((f) => f.id !== id);\n\n // prune tag includes/excludes\n for (const t of p.filters ?? []) {\n t.includes = (t.includes ?? []).filter(\n (x) => x !== id,\n );\n t.excludes = (t.excludes ?? []).filter(\n (x) => x !== id,\n );\n }\n\n // prune per-tag ordering\n for (const k of Object.keys(p.order_for_tags ?? {})) {\n p.order_for_tags![k] = (\n p.order_for_tags![k] ?? []\n ).filter((fid) => fid !== id);\n if (!p.order_for_tags![k].length)\n delete p.order_for_tags![k];\n }\n\n // prune option maps that reference this field id\n const maps: Array<\n \"includes_for_options\" | \"excludes_for_options\"\n > = [\"includes_for_options\", \"excludes_for_options\"];\n for (const m of maps) {\n const map = (p as any)[m] as\n | Record<string, string[]>\n | undefined;\n if (!map) continue;\n for (const key of Object.keys(map)) {\n map[key] = (map[key] ?? []).filter(\n (fid) => fid !== id,\n );\n if (!map[key]?.length) delete map[key];\n }\n if (!Object.keys(map).length) delete (p as any)[m];\n }\n }),\n undo: () => this.api.undo(),\n });\n return;\n }\n\n if (this.isOptionId(id)) {\n this.removeOption(id);\n return;\n }\n\n throw new Error(\"remove: unknown id prefix\");\n }\n\n getNode(\n id: string,\n ):\n | { kind: \"tag\"; data?: Tag; owners: { parentTagId?: string } }\n | { kind: \"field\"; data?: Field; owners: { bindTagIds: string[] } }\n | { kind: \"option\"; data?: any; owners: { fieldId?: string } } {\n const props = this.builder.getProps();\n if (this.isTagId(id)) {\n const t = (props.filters ?? []).find((x) => x.id === id);\n return {\n kind: \"tag\",\n data: t,\n owners: { parentTagId: t?.bind_id },\n };\n }\n if (this.isFieldId(id)) {\n const f = (props.fields ?? []).find((x) => x.id === id);\n const bind = Array.isArray(f?.bind_id)\n ? (f!.bind_id as string[])\n : f?.bind_id\n ? [f.bind_id]\n : [];\n return { kind: \"field\", data: f, owners: { bindTagIds: bind } };\n }\n if (this.isOptionId(id)) {\n const own = ownerOfOption(props, id);\n const f = own\n ? (props.fields ?? []).find((x) => x.id === own.fieldId)\n : undefined;\n const o = f?.options?.find((x) => x.id === id);\n return {\n kind: \"option\",\n data: o,\n owners: { fieldId: own?.fieldId },\n };\n }\n // you can extend for service lookup if desired\n return { kind: \"option\", data: undefined, owners: {} };\n }\n\n getFieldQuantityRule(id: string): QuantityRule | undefined {\n const props = this.builder.getProps();\n const f = (props.fields ?? []).find((x) => x.id === id);\n if (!f) return undefined;\n return normalizeQuantityRule((f as any).meta?.quantity);\n }\n\n setFieldQuantityRule(id: string, rule: unknown): void {\n this.exec({\n name: \"setFieldQuantityRule\",\n do: () =>\n this.patchProps((p) => {\n const f = (p.fields ?? []).find((x) => x.id === id);\n if (!f) return;\n\n const normalized = normalizeQuantityRule(rule);\n\n if (!normalized) {\n // Drop invalid shapes entirely\n if ((f as any).meta?.quantity !== undefined) {\n delete (f as any).meta.quantity;\n // Clean up empty meta object\n if (\n (f as any).meta &&\n Object.keys((f as any).meta).length === 0\n ) {\n delete (f as any).meta;\n }\n }\n return;\n }\n\n // Keep other meta keys intact\n (f as any).meta = {\n ...(f as any).meta,\n quantity: normalized,\n };\n }),\n undo: () => this.api.undo(),\n });\n }\n\n clearFieldQuantityRule(id: string): void {\n this.exec({\n name: \"clearFieldQuantityRule\",\n do: () =>\n this.patchProps((p) => {\n const f = (p.fields ?? []).find((x) => x.id === id);\n if (!f || !(f as any).meta?.quantity) return;\n delete (f as any).meta.quantity;\n if (\n (f as any).meta &&\n Object.keys((f as any).meta).length === 0\n ) {\n delete (f as any).meta;\n }\n }),\n undo: () => this.api.undo(),\n });\n }\n\n /** Walk ancestors for a tag and detect if parent→child would create a cycle */\n private wouldCreateTagCycle(\n p: ServiceProps,\n parentId: string,\n childId: string,\n ): boolean {\n if (parentId === childId) return true;\n const tagById = new Map((p.filters ?? []).map((t) => [t.id, t]));\n let cur: string | undefined = parentId;\n const guard = new Set<string>();\n while (cur) {\n if (cur === childId) return true; // child is ancestor of parent → cycle\n if (guard.has(cur)) break;\n guard.add(cur);\n cur = tagById.get(cur)?.bind_id;\n }\n return false;\n }\n\n private wouldCreateIncludeExcludeCycle(\n p: ServiceProps,\n receiverId: string,\n targetId: string,\n ): boolean {\n // Simple case: A includes A or A excludes A\n if (receiverId === targetId) return true;\n\n // We want to prevent A including/excluding B if B includes/excludes A.\n const getDirectRelations = (id: string): string[] => {\n if (this.isTagId(id)) {\n const t = (p.filters ?? []).find((x) => x.id === id);\n return [...(t?.includes ?? []), ...(t?.excludes ?? [])];\n }\n // For buttons and options\n const inc = p.includes_for_buttons?.[id] ?? [];\n const exc = p.excludes_for_buttons?.[id] ?? [];\n return [...inc, ...exc];\n };\n\n const visited = new Set<string>();\n const stack = [targetId];\n\n while (stack.length > 0) {\n const curr = stack.pop()!;\n if (curr === receiverId) return true;\n if (visited.has(curr)) continue;\n visited.add(curr);\n\n stack.push(...getDirectRelations(curr));\n }\n\n return false;\n }\n\n include(receiverId: string, idOrIds: string | string[]) {\n this.exec({\n name: \"include\",\n do: () =>\n this.patchProps((p) => {\n const receiver = this.getNode(receiverId);\n const ids = Array.isArray(idOrIds) ? idOrIds : [idOrIds];\n if (\n receiver.kind === \"tag\" ||\n (receiver.kind === \"field\" &&\n (receiver.data as any)?.button) ||\n receiver.kind === \"option\"\n ) {\n if (receiver.kind === \"tag\") {\n const t = (p.filters ?? []).find(\n (x) => x.id === receiverId,\n );\n if (t) {\n const accepted: string[] = [];\n const next = new Set(t.includes ?? []);\n for (const id of ids) {\n if (\n this.wouldCreateIncludeExcludeCycle(\n p,\n receiverId,\n id,\n )\n ) {\n this.emit(\"editor:error\", {\n message: `Cycle detected: ${receiverId} including ${id} would create a cycle.`,\n code: \"cycle_detected\",\n meta: {\n receiverId,\n targetId: id,\n type: \"include\",\n },\n });\n continue;\n }\n next.add(id);\n accepted.push(id);\n }\n if (\n accepted.length > 0 ||\n (t.includes?.length ?? 0) > 0\n ) {\n t.includes = Array.from(next);\n }\n\n if (t.excludes) {\n t.excludes = t.excludes.filter(\n (x) => !accepted.includes(x),\n );\n if (t.excludes.length === 0) {\n delete t.excludes;\n }\n }\n }\n } else {\n const accepted: string[] = [];\n const current =\n p.includes_for_buttons?.[receiverId] ?? [];\n const next = new Set(current);\n for (const id of ids) {\n if (\n this.wouldCreateIncludeExcludeCycle(\n p,\n receiverId,\n id,\n )\n ) {\n this.emit(\"editor:error\", {\n message: `Cycle detected: ${receiverId} including ${id} would create a cycle.`,\n code: \"cycle_detected\",\n meta: {\n receiverId,\n targetId: id,\n type: \"include\",\n },\n });\n continue;\n }\n next.add(id);\n accepted.push(id);\n }\n if (accepted.length > 0 || current.length > 0) {\n if (!p.includes_for_buttons)\n p.includes_for_buttons = {};\n p.includes_for_buttons[receiverId] =\n Array.from(next);\n }\n\n if (p.excludes_for_buttons?.[receiverId]) {\n p.excludes_for_buttons[receiverId] =\n p.excludes_for_buttons[receiverId].filter(\n (x) => !accepted.includes(x),\n );\n if (\n p.excludes_for_buttons[receiverId]\n .length === 0\n ) {\n delete p.excludes_for_buttons[receiverId];\n }\n }\n }\n\n // ensure normalise doesn't drop it (test environment might not have all nodes)\n if (!p.fields) p.fields = [];\n if (!p.filters) p.filters = [];\n } else {\n throw new Error(\n \"Receiver must be a tag, button field, or option\",\n );\n }\n }),\n undo: () => this.api.undo(),\n });\n }\n\n exclude(receiverId: string, idOrIds: string | string[]) {\n this.exec({\n name: \"exclude\",\n do: () =>\n this.patchProps((p) => {\n const receiver = this.getNode(receiverId);\n const ids = Array.isArray(idOrIds) ? idOrIds : [idOrIds];\n if (\n receiver.kind === \"tag\" ||\n (receiver.kind === \"field\" &&\n (receiver.data as any)?.button) ||\n receiver.kind === \"option\"\n ) {\n if (receiver.kind === \"tag\") {\n const t = (p.filters ?? []).find(\n (x) => x.id === receiverId,\n );\n if (t) {\n const accepted: string[] = [];\n const next = new Set(t.excludes ?? []);\n for (const id of ids) {\n if (\n this.wouldCreateIncludeExcludeCycle(\n p,\n receiverId,\n id,\n )\n ) {\n this.emit(\"editor:error\", {\n message: `Cycle detected: ${receiverId} excluding ${id} would create a cycle.`,\n code: \"cycle_detected\",\n meta: {\n receiverId,\n targetId: id,\n type: \"exclude\",\n },\n });\n continue;\n }\n next.add(id);\n accepted.push(id);\n }\n if (\n accepted.length > 0 ||\n (t.excludes?.length ?? 0) > 0\n ) {\n t.excludes = Array.from(next);\n }\n\n if (t.includes) {\n t.includes = t.includes.filter(\n (x) => !accepted.includes(x),\n );\n if (t.includes.length === 0) {\n delete t.includes;\n }\n }\n }\n } else {\n const accepted: string[] = [];\n const current =\n p.excludes_for_buttons?.[receiverId] ?? [];\n const next = new Set(current);\n for (const id of ids) {\n if (\n this.wouldCreateIncludeExcludeCycle(\n p,\n receiverId,\n id,\n )\n ) {\n this.emit(\"editor:error\", {\n message: `Cycle detected: ${receiverId} excluding ${id} would create a cycle.`,\n code: \"cycle_detected\",\n meta: {\n receiverId,\n targetId: id,\n type: \"exclude\",\n },\n });\n continue;\n }\n next.add(id);\n accepted.push(id);\n }\n if (accepted.length > 0 || current.length > 0) {\n if (!p.excludes_for_buttons)\n p.excludes_for_buttons = {};\n p.excludes_for_buttons[receiverId] =\n Array.from(next);\n }\n\n if (p.includes_for_buttons?.[receiverId]) {\n p.includes_for_buttons[receiverId] =\n p.includes_for_buttons[receiverId].filter(\n (x) => !accepted.includes(x),\n );\n if (\n p.includes_for_buttons[receiverId]\n .length === 0\n ) {\n delete p.includes_for_buttons[receiverId];\n }\n }\n }\n\n // ensure normalise doesn't drop it (test environment might not have all nodes)\n if (!p.fields) p.fields = [];\n if (!p.filters) p.filters = [];\n } else {\n throw new Error(\n \"Receiver must be a tag, button field, or option\",\n );\n }\n }),\n undo: () => this.api.undo(),\n });\n }\n\n /* ──────────────────────────────────────────────────────────────────────────\n * CONNECT\n * ────────────────────────────────────────────────────────────────────────── */\n connect(kind: WireKind, fromId: string, toId: string): void {\n this.exec({\n name: `connect:${kind}`,\n do: () =>\n this.patchProps((p) => {\n /* ── BIND ─────────────────────────────────────────────── */\n if (kind === \"bind\") {\n // Tag → Tag: set child.bind_id = parent (cycle-safe)\n if (this.isTagId(fromId) && this.isTagId(toId)) {\n if (this.wouldCreateTagCycle(p, fromId, toId)) {\n throw new Error(\n `bind would create a cycle: ${fromId} → ${toId}`,\n );\n }\n const child = (p.filters ?? []).find(\n (t) => t.id === toId,\n );\n if (child) child.bind_id = fromId;\n return;\n }\n // Tag → Field (or Field → Tag): ensure field.bind_id contains the tag\n if (\n (this.isTagId(fromId) && this.isFieldId(toId)) ||\n (this.isFieldId(fromId) && this.isTagId(toId))\n ) {\n const fieldId = this.isFieldId(toId) ? toId : fromId;\n const tagId = this.isTagId(fromId) ? fromId : toId;\n const f = (p.fields ?? []).find(\n (x) => x.id === fieldId,\n );\n if (!f) return;\n if (!f.bind_id) {\n f.bind_id = tagId;\n return;\n }\n if (typeof f.bind_id === \"string\") {\n if (f.bind_id !== tagId)\n f.bind_id = [f.bind_id, tagId];\n return;\n }\n if (!f.bind_id.includes(tagId))\n f.bind_id.push(tagId);\n return;\n }\n throw new Error(\n `bind: unsupported route ${fromId} → ${toId}`,\n );\n }\n\n /* ── INCLUDE / EXCLUDE (Tag→Field, Option→Field) ──────── */\n if (kind === \"include\" || kind === \"exclude\") {\n const key =\n kind === \"include\" ? \"includes\" : \"excludes\";\n\n // Tag → Field: mutate tag.includes/excludes\n if (this.isTagId(fromId) && this.isFieldId(toId)) {\n const t = (p.filters ?? []).find(\n (x) => x.id === fromId,\n );\n if (!t) return;\n const arr = (t[key] ??= []);\n if (!arr.includes(toId)) arr.push(toId);\n return;\n }\n\n // Option → Field: mutate includes_for_options / excludes_for_options using optionId\n if (this.isOptionId(fromId) && this.isFieldId(toId)) {\n const mapKey =\n kind === \"include\"\n ? \"includes_for_options\"\n : \"excludes_for_options\";\n const maps = (p as any)[mapKey] as\n | Record<string, string[]>\n | undefined;\n const next = { ...(maps ?? {}) };\n const arr = next[fromId] ?? [];\n if (!arr.includes(toId)) arr.push(toId);\n next[fromId] = arr;\n (p as any)[mapKey] = next;\n return;\n }\n\n throw new Error(\n `${kind}: unsupported route ${fromId} → ${toId}`,\n );\n }\n\n /* ── SERVICE (Service→Tag | Service→Option) ───────────── */\n // inside connect(kind, from, to)\n if (kind === \"service\") {\n // ONLY ensure it exists; no type checks/parsing\n ensureServiceExists(this.opts, fromId);\n\n if (toId.startsWith(\"t:\")) {\n this.exec({\n name: \"connect:service→tag\",\n do: () =>\n this.patchProps((p) => {\n const t = (p.filters ?? []).find(\n (x) => x.id === toId,\n );\n if (t) (t as any).service_id = fromId; // store as-is\n }),\n undo: () => this.api.undo(),\n });\n return;\n }\n\n if (toId.startsWith(\"o:\")) {\n this.exec({\n name: \"connect:service→option\",\n do: () =>\n this.patchProps((p) => {\n for (const f of p.fields ?? []) {\n const o = f.options?.find(\n (x) => x.id === toId,\n );\n if (o) {\n (o as any).service_id = fromId;\n return;\n }\n }\n }),\n undo: () => this.api.undo(),\n });\n return;\n }\n\n throw new Error(\n 'service: to must be a tag (\"t:*\") or option (\"o:*\")',\n );\n }\n\n throw new Error(`Unknown connect kind: ${kind}`);\n }),\n undo: () => this.api.undo(), // snapshot-based undo will restore prior state\n });\n }\n\n /* ──────────────────────────────────────────────────────────────────────────\n * DISCONNECT\n * ────────────────────────────────────────────────────────────────────────── */\n disconnect(kind: WireKind, fromId: string, toId: string): void {\n this.exec({\n name: `disconnect:${kind}`,\n do: () =>\n this.patchProps((p) => {\n /* ── BIND ─────────────────────────────────────────────── */\n if (kind === \"bind\") {\n // Tag → Tag\n if (this.isTagId(fromId) && this.isTagId(toId)) {\n const child = (p.filters ?? []).find(\n (t) => t.id === toId,\n );\n if (child?.bind_id === fromId) delete child.bind_id;\n return;\n }\n // Tag ↔ Field\n if (\n (this.isTagId(fromId) && this.isFieldId(toId)) ||\n (this.isFieldId(fromId) && this.isTagId(toId))\n ) {\n const fieldId = this.isFieldId(toId) ? toId : fromId;\n const tagId = this.isTagId(fromId) ? fromId : toId;\n const f = (p.fields ?? []).find(\n (x) => x.id === fieldId,\n );\n if (!f?.bind_id) return;\n if (typeof f.bind_id === \"string\") {\n if (f.bind_id === tagId) delete f.bind_id;\n return;\n }\n f.bind_id = f.bind_id.filter(\n (x) => x !== tagId,\n ) as any;\n if (f.bind_id?.length === 0) delete f.bind_id;\n return;\n }\n throw new Error(\n `unbind: unsupported route ${fromId} → ${toId}`,\n );\n }\n\n /* ── INCLUDE / EXCLUDE (Tag→Field, Option→Field) ──────── */\n if (kind === \"include\" || kind === \"exclude\") {\n const key =\n kind === \"include\" ? \"includes\" : \"excludes\";\n\n // Tag → Field\n if (this.isTagId(fromId) && this.isFieldId(toId)) {\n const t = (p.filters ?? []).find(\n (x) => x.id === fromId,\n );\n if (!t) return;\n t[key] = (t[key] ?? []).filter((x) => x !== toId);\n if (!t[key]?.length) delete (t as any)[key];\n return;\n }\n\n // Option → Field\n if (this.isOptionId(fromId) && this.isFieldId(toId)) {\n const mapKey =\n kind === \"include\"\n ? \"includes_for_options\"\n : \"excludes_for_options\";\n const maps = (p as any)[mapKey] as\n | Record<string, string[]>\n | undefined;\n if (!maps) return;\n if (maps[fromId]) {\n maps[fromId] = (maps[fromId] ?? []).filter(\n (fid) => fid !== toId,\n );\n if (!maps[fromId]?.length) delete maps[fromId];\n }\n if (!Object.keys(maps).length)\n delete (p as any)[mapKey];\n return;\n }\n\n throw new Error(\n `${kind}: unsupported route ${fromId} → ${toId}`,\n );\n }\n\n /* ── SERVICE (Service→Tag | Service→Option) ───────────── */\n if (kind === \"service\") {\n // STILL only ensure it exists; no type checks/parsing\n ensureServiceExists(this.opts, fromId);\n\n if (toId.startsWith(\"t:\")) {\n this.exec({\n name: \"disconnect:service→tag\",\n do: () =>\n this.patchProps((p) => {\n const t = (p.filters ?? []).find(\n (x) => x.id === toId,\n );\n if (t) delete (t as any).service_id;\n }),\n undo: () => this.api.undo(),\n });\n return;\n }\n\n if (toId.startsWith(\"o:\")) {\n this.exec({\n name: \"disconnect:service→option\",\n do: () =>\n this.patchProps((p) => {\n for (const f of p.fields ?? []) {\n const o = f.options?.find(\n (x) => x.id === toId,\n );\n if (o) {\n delete (o as any).service_id;\n return;\n }\n }\n }),\n undo: () => this.api.undo(),\n });\n return;\n }\n\n throw new Error(\n 'service: to must be a tag (\"t:*\") or option (\"o:*\")',\n );\n }\n\n throw new Error(`Unknown disconnect kind: ${kind}`);\n }),\n undo: () => this.api.undo(),\n });\n }\n\n setConstraint(tagId: string, flag: string, value: boolean | undefined) {\n let prev: boolean | undefined;\n this.exec({\n name: \"setConstraint\",\n do: () =>\n this.patchProps((p) => {\n const t = (p.filters ?? []).find((x) => x.id === tagId);\n if (!t) return;\n prev = t.constraints?.[flag];\n if (!t.constraints) t.constraints = {};\n if (value === undefined) delete t.constraints[flag];\n else t.constraints[flag] = value;\n }),\n undo: () =>\n this.patchProps((p) => {\n const t = (p.filters ?? []).find((x) => x.id === tagId);\n if (!t) return;\n if (!t.constraints) t.constraints = {};\n if (prev === undefined) delete t.constraints[flag];\n else t.constraints[flag] = prev;\n }),\n });\n // After mutation, normalise() will propagate effective constraints & meta\n }\n\n /**\n * Clear a constraint override by removing the local constraint that conflicts with an ancestor.\n */\n clearConstraintOverride(tagId: string, flag: string) {\n let prev: boolean | undefined;\n let prevOverride: any;\n this.exec({\n name: \"clearConstraintOverride\",\n do: () =>\n this.patchProps((p) => {\n const t = (p.filters ?? []).find((x) => x.id === tagId);\n if (!t) return;\n prev = t.constraints?.[flag];\n prevOverride = t.constraints_overrides?.[flag];\n\n if (t.constraints) delete t.constraints[flag];\n if (t.constraints_overrides)\n delete t.constraints_overrides[flag];\n }),\n undo: () =>\n this.patchProps((p) => {\n const t = (p.filters ?? []).find((x) => x.id === tagId);\n if (!t) return;\n if (prev !== undefined) {\n if (!t.constraints) t.constraints = {};\n t.constraints[flag] = prev;\n }\n if (prevOverride !== undefined) {\n if (!t.constraints_overrides)\n t.constraints_overrides = {};\n t.constraints_overrides[flag] = prevOverride;\n }\n }),\n });\n }\n\n /**\n * Clear a constraint from a tag and its descendants.\n * If a descendant has an override, it assigns that override's value as local.\n */\n clearConstraint(tagId: string, flag: string) {\n this.exec({\n name: \"clearConstraint\",\n do: () =>\n this.patchProps((p) => {\n const tags = p.filters ?? [];\n const byId = new Map(tags.map((t) => [t.id, t]));\n const children = new Map<string, string[]>();\n for (const t of tags) {\n if (t.bind_id) {\n if (!children.has(t.bind_id))\n children.set(t.bind_id, []);\n children.get(t.bind_id)!.push(t.id);\n }\n }\n\n const process = (id: string) => {\n const t = byId.get(id);\n if (!t) return;\n\n const override = t.constraints_overrides?.[flag];\n if (override) {\n if (!t.constraints) t.constraints = {};\n t.constraints[flag] = override.from;\n delete t.constraints_overrides![flag];\n if (\n Object.keys(t.constraints_overrides ?? {})\n .length === 0\n ) {\n delete t.constraints_overrides;\n }\n } else {\n if (t.constraints) {\n delete t.constraints[flag];\n if (Object.keys(t.constraints).length === 0) {\n delete t.constraints;\n }\n }\n }\n\n for (const childId of children.get(id) ?? []) {\n process(childId);\n }\n };\n\n process(tagId);\n }),\n undo: () => this.api.undo(),\n });\n }\n\n /* ───────────────────── Internals ───────────────────── */\n\n private replaceProps(next: ServiceProps): void {\n // Ensure canonical shape + constraint propagation\n const norm = normalise(next, {\n constraints: this.builder\n .getConstraints()\n .map((item) => item.label),\n defaultPricingRole: \"base\",\n });\n this.builder.load(norm);\n this.api.refreshGraph();\n }\n\n private patchProps(mut: (p: ServiceProps) => void): void {\n const cur = cloneDeep(this.builder.getProps());\n mut(cur);\n this.replaceProps(cur);\n }\n\n private afterMutation(command: string, _before: EditorSnapshot) {\n if (this.txnDepth > 0) return; // delay until commit()\n this.pushHistory(this.makeSnapshot(command));\n this.emit(\"editor:command\", { name: command });\n if (this.opts.validateAfterEach)\n this.emit(\"editor:change\", {\n props: this.builder.getProps(),\n reason: \"validate\",\n command,\n });\n else\n this.emit(\"editor:change\", {\n props: this.builder.getProps(),\n reason: \"mutation\",\n command,\n });\n }\n\n private commit(label: string) {\n const snap = this.makeSnapshot(label);\n this.pushHistory(snap);\n this.emit(\"editor:change\", {\n props: snap.props,\n reason: \"transaction\",\n command: this.txnLabel,\n });\n }\n\n private makeSnapshot(_why: string): EditorSnapshot {\n const props = cloneDeep(this.builder.getProps());\n const canvas = this.api.snapshot();\n return {\n props,\n layout: {\n canvas,\n },\n };\n }\n\n private loadSnapshot(s: EditorSnapshot, reason: \"undo\" | \"redo\") {\n this.builder.load(cloneDeep(s.props));\n\n const layout = s.layout;\n const canvas = layout?.canvas;\n\n if (canvas) {\n if (canvas.positions) this.api.setPositions(canvas.positions);\n if (canvas.viewport) this.api.setViewport(canvas.viewport);\n if (canvas.selection)\n this.api.select(\n Array.isArray(canvas.selection)\n ? canvas.selection\n : Array.from(canvas.selection),\n );\n } else {\n this.api.refreshGraph();\n }\n this.emit(\"editor:change\", { props: this.builder.getProps(), reason });\n }\n\n private pushHistory(snap: EditorSnapshot) {\n // truncate forward\n if (this.index < this.history.length - 1) {\n this.history = this.history.slice(0, this.index + 1);\n }\n this.history.push(snap);\n // trim from start if beyond limit\n const over = this.history.length - this.opts.historyLimit;\n if (over > 0) {\n this.history.splice(0, over);\n this.index = this.history.length - 1;\n } else {\n this.index = this.history.length - 1;\n }\n }\n\n // IDs like \"t:1\", \"f:2\", \"o:3\" — must be unique across tags, fields, options.\n private genId(prefix: \"t\" | \"f\" | \"o\"): string {\n const props = this.builder.getProps();\n const taken = new Set<string>([\n ...(props.filters ?? []).map((t) => t.id),\n ...(props.fields ?? []).map((f) => f.id),\n ...(props.fields ?? []).flatMap(\n (f) => f.options?.map((o) => o.id) ?? [],\n ),\n ]);\n for (let i = 1; i < 10_000; i++) {\n const id = `${prefix}:${i}`;\n if (!taken.has(id)) return id;\n }\n throw new Error(\"Unable to generate id\");\n }\n\n private emit<K extends keyof (EditorEvents & any)>(\n event: K,\n payload: (EditorEvents & any)[K],\n ) {\n // Reuse CanvasAPI’s bus so consumers have a single stream\n this.api.emit(event as any, payload as any);\n }\n\n /**\n * Suggest/filter candidate services against the current visible-group\n * (single tag) context.\n *\n * - Excludes services already used in this group.\n * - Applies capability presence, tag constraints, rate policy, and compiled policies.\n *\n * @param candidates service ids to evaluate\n * @param ctx\n * @param ctx.tagId active visible-group tag id\n * @param ctx.usedServiceIds services already selected for this visible group (first is treated as \"primary\" for rate policy)\n * @param ctx.effectiveConstraints effective constraints for the active tag (dripfeed/refill/cancel)\n * @param ctx.policies raw JSON policies (will be compiled via compilePolicies)\n * @param ctx.fallback fallback/rate settings (defaults applied if omitted)\n */\n public filterServicesForVisibleGroup(\n candidates: Array<number | string>,\n ctx: {\n tagId: string;\n usedServiceIds: Array<number | string>;\n effectiveConstraints?: Partial<\n Record<\"refill\" | \"cancel\" | \"dripfeed\", boolean>\n >;\n policies?: unknown;\n fallback?: FallbackSettings;\n },\n ): ServiceCheck[] {\n const svcMap: DgpServiceMap =\n (this as any).opts?.serviceMap ??\n (this.builder as any).getServiceMap?.() ??\n {};\n\n const usedSet = new Set(ctx.usedServiceIds.map(String));\n const primary = ctx.usedServiceIds[0]; // group \"primary\" (first used); rate policy compares against this when present\n\n const fb: FallbackSettings = {\n requireConstraintFit: true,\n ratePolicy: { kind: \"lte_primary\" },\n selectionStrategy: \"priority\",\n mode: \"strict\",\n ...(ctx.fallback ?? {}),\n };\n\n // Compile policies once here; you asked for the evaluate path to call compilePolicies.\n const evaluatePoliciesRaw = (\n raw: unknown,\n serviceIds: Array<number | string>,\n tagId: string,\n ) => {\n const { policies } = compilePolicies(raw);\n return evaluateServicePolicies(policies, serviceIds, svcMap, tagId);\n };\n\n const out: ServiceCheck[] = [];\n\n for (const id of candidates) {\n // Skip already-used services in this group\n if (usedSet.has(String(id))) continue;\n\n const cap = svcMap[Number(id)];\n if (!cap) {\n out.push({\n id,\n ok: false,\n fitsConstraints: false,\n passesRate: false,\n passesPolicies: false,\n reasons: [\"missing_capability\"],\n });\n continue;\n }\n\n // Constraints (only flags explicitly true at tag are \"required\")\n const fitsConstraints = constraintFitOk(\n svcMap,\n cap.id,\n ctx.effectiveConstraints ?? {},\n );\n\n // Rate policy vs primary (if any); if no primary, consider pass\n const passesRate =\n primary == null ? true : rateOk(svcMap, id, primary, fb);\n\n // Policies: compile + evaluate with current used + candidate\n const polRes = evaluatePoliciesRaw(\n ctx.policies ?? [],\n [...ctx.usedServiceIds, id],\n ctx.tagId,\n );\n const passesPolicies = polRes.ok;\n\n const reasons: ServiceCheck[\"reasons\"] = [];\n if (!fitsConstraints) reasons.push(\"constraint_mismatch\");\n if (!passesRate) reasons.push(\"rate_policy\");\n if (!passesPolicies) reasons.push(\"policy_error\");\n\n out.push({\n id,\n ok: fitsConstraints && passesRate && passesPolicies,\n fitsConstraints,\n passesRate,\n passesPolicies,\n policyErrors: polRes.errors.length ? polRes.errors : undefined,\n policyWarnings: polRes.warnings.length\n ? polRes.warnings\n : undefined,\n reasons,\n cap,\n rate: toFiniteNumber(cap.rate),\n });\n }\n\n return out;\n }\n}\n\nfunction nextCopyLabel(old: string): string {\n // \"Label\" -> \"Label (copy)\", \"Label (copy)\" -> \"Label (copy 2)\"\n // noinspection RegExpUnnecessaryNonCapturingGroup\n const m = old.match(/^(.*?)(?:\\s*\\(copy(?:\\s+(\\d+))?\\))$/i);\n if (!m) return `${old} (copy)`;\n const stem = m[1].trim();\n const n = m[2] ? parseInt(m[2], 10) + 1 : 2;\n return `${stem} (copy ${n})`;\n}\n\nfunction nextCopyName(old?: string): string | undefined {\n if (!old) return undefined;\n // \"name\" -> \"name_copy\", \"name_copy\" -> \"name_copy2\", \"name_copy2\" -> \"name_copy3\"\n const m = old.match(/^(.*?)(_copy(\\d+)?)$/i);\n if (!m) return `${old}_copy`;\n const stem = m[1];\n const n = m[3] ? parseInt(m[3], 10) + 1 : 2;\n return `${stem}_copy${n}`;\n}\n\nfunction defaultOptionIdStrategy(old: string): string {\n // \"basic\" -> \"basic_copy\" / \"basic_copy2\"…\n return nextCopyId(old);\n}\n\nfunction nextCopyId(old: string): string {\n // \"tag_1\" -> \"tag_1_copy\" or bumps trailing copy N\n // noinspection RegExpUnnecessaryNonCapturingGroup\n const m = old.match(/^(.*?)(?:_copy(\\d+)?)$/i);\n if (!m) return `${old}_copy`;\n const stem = m[1];\n const n = m[2] ? parseInt(m[2], 10) + 1 : 2;\n return `${stem}_copy${n}`;\n}\n\nfunction bumpSuffix(old: string): string {\n // \"foo_copy\" -> \"foo_copy2\", \"foo_copy2\" -> \"foo_copy3\"\n const m = old.match(/^(.*?)(\\d+)$/);\n if (!m) return `${old}2`;\n const stem = m[1];\n return `${stem}${parseInt(m[2], 10) + 1}`;\n}\n\n// Accept only these shapes; drop everything else.\ntype QuantityRule = { valueBy: \"value\" | \"length\" | \"eval\"; code?: string };\n\nfunction normalizeQuantityRule(input: unknown): QuantityRule | undefined {\n if (!input || typeof input !== \"object\") return undefined;\n const v = input as any;\n const vb = v.valueBy;\n if (vb !== \"value\" && vb !== \"length\" && vb !== \"eval\") return undefined;\n\n const out: QuantityRule = { valueBy: vb };\n if (vb === \"eval\" && typeof v.code === \"string\" && v.code.trim()) {\n out.code = v.code;\n }\n // For non-eval, any provided code is dropped.\n return out;\n}\n\n// ---- Policy evaluation (compiled rules) -------------------------------------\n\nfunction evaluateServicePolicies(\n rules: DynamicRule[] | undefined,\n svcIds: (string | number)[],\n svcMap: DgpServiceMap,\n tagId: string,\n): { ok: boolean; errors: string[]; warnings: string[] } {\n const errors: string[] = [];\n const warnings: string[] = [];\n if (!rules || !rules.length) return { ok: true, errors, warnings };\n\n const relevant = rules.filter(\n (r) =>\n r.subject === \"services\" &&\n (r.scope === \"visible_group\" || r.scope === \"global\"),\n );\n\n for (const r of relevant) {\n const ids = svcIds.filter((id) =>\n matchesRuleFilter(svcMap[Number(id)], r, tagId),\n );\n const projection = r.projection || \"service.id\";\n const values = ids.map((id) =>\n policyProjectValue(svcMap[Number(id)], projection),\n );\n\n let ok = true;\n switch (r.op) {\n case \"all_equal\":\n ok = values.length <= 1 || values.every((v) => v === values[0]);\n break;\n case \"unique\": {\n const uniq = new Set(values.map((v) => String(v)));\n ok = uniq.size === values.length;\n break;\n }\n case \"no_mix\": {\n const uniq = new Set(values.map((v) => String(v)));\n ok = uniq.size <= 1;\n break;\n }\n case \"all_true\":\n ok = values.every((v) => !!v);\n break;\n case \"any_true\":\n ok = values.some((v) => !!v);\n break;\n case \"max_count\": {\n const n = typeof r.value === \"number\" ? r.value : NaN;\n ok = Number.isFinite(n) ? values.length <= n : true;\n break;\n }\n case \"min_count\": {\n const n = typeof r.value === \"number\" ? r.value : NaN;\n ok = Number.isFinite(n) ? values.length >= n : true;\n break;\n }\n default:\n ok = true;\n }\n\n if (!ok) {\n if ((r.severity ?? \"error\") === \"error\")\n errors.push(r.id ?? \"policy_error\");\n else warnings.push(r.id ?? \"policy_warning\");\n }\n }\n\n return { ok: errors.length === 0, errors, warnings };\n}\n\nfunction policyProjectValue(\n cap: DgpServiceCapability | undefined,\n projection: string,\n) {\n if (!cap) return undefined;\n const key = projection.startsWith(\"service.\")\n ? projection.slice(8)\n : projection;\n return (cap as any)[key];\n}\n\nfunction matchesRuleFilter(\n cap: DgpServiceCapability | undefined,\n rule: DynamicRule,\n tagId: string,\n): boolean {\n if (!cap) return false;\n const f = rule.filter;\n if (!f) return true;\n\n if (f.tag_id && !toStrSet(f.tag_id).has(String(tagId))) return false;\n // role is intentionally ignored at suggestion-time (unknown), as discussed.\n return true;\n}\n\nfunction toStrSet(v: string | string[] | number | number[]): Set<string> {\n const arr = Array.isArray(v) ? v : [v];\n const s = new Set<string>();\n for (const x of arr) s.add(String(x));\n return s;\n}\n\ntype ServiceCheck = {\n id: number | string;\n ok: boolean;\n fitsConstraints: boolean;\n passesRate: boolean;\n passesPolicies: boolean;\n policyErrors?: string[];\n policyWarnings?: string[];\n reasons: Array<\n | \"constraint_mismatch\"\n | \"rate_policy\"\n | \"policy_error\"\n | \"missing_capability\"\n >;\n cap?: DgpServiceCapability;\n rate?: number;\n};\n","// 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 { Field, ServiceProps, Tag } from \"@/schema\";\nimport type { DgpServiceMap } from \"@/schema/provider\";\nimport type { ValidationError, ValidatorOptions } from \"@/schema/validation\";\nimport { NodeMap } from \"@/core/node-map\";\n\nexport interface ValidationCtx {\n readonly props: ServiceProps;\n readonly nodeMap: NodeMap;\n readonly options: ValidatorOptions;\n\n readonly errors: ValidationError[];\n\n readonly serviceMap: DgpServiceMap;\n 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/node-map.ts\nimport type { Field, FieldOption, ServiceProps, Tag } from \"@/schema\";\n\nexport type NodeKind = \"tag\" | \"field\" | \"option\";\n\nexport type NodeRef =\n | { kind: \"tag\"; id: string; node: Tag }\n | { kind: \"field\"; id: string; node: Field }\n | {\n kind: \"option\";\n id: string;\n node: FieldOption;\n fieldId: string; // parent field id\n };\n\nexport type NodeMap = Map<string, NodeRef>;\n\n/**\n * Build a node map keyed by *actual ids* (no prefix assumptions).\n * Rule: ids are unique across tags/fields/options.\n *\n * If you ever violate uniqueness, the first wins by default; we can hard-throw if you want.\n */\nexport function buildNodeMap(props: ServiceProps): NodeMap {\n const map: NodeMap = new Map();\n\n for (const t of props.filters ?? []) {\n if (!map.has(t.id)) map.set(t.id, { kind: \"tag\", id: t.id, node: t });\n }\n\n for (const f of props.fields ?? []) {\n if (!map.has(f.id)) map.set(f.id, { kind: \"field\", id: f.id, node: f });\n\n for (const o of f.options ?? []) {\n if (!map.has(o.id))\n map.set(o.id, {\n kind: \"option\",\n id: o.id,\n node: o,\n fieldId: f.id,\n });\n }\n }\n\n return map;\n}\n\n/**\n * Resolve a trigger id into either:\n * - a direct node id (tag/field/option)\n * - or a composite \"fieldId::optionId\" trigger (used for maps)\n *\n * IMPORTANT:\n * - We do NOT strip any prefixes like \"o:\".\n * - \"o:on\" is a perfectly valid *option id* if your data uses it.\n */\nexport type TriggerRef =\n | {\n kind: \"composite\";\n triggerKey: string;\n fieldId: string;\n optionId: string;\n }\n | { kind: NodeKind; triggerKey: string; id: string; fieldId?: string };\n\nexport function resolveTrigger(\n trigger: string,\n nodeMap: NodeMap,\n): TriggerRef | undefined {\n // Composite: fieldId::optionId (maps key by composite)\n const idx = trigger.indexOf(\"::\");\n if (idx !== -1) {\n const fieldId = trigger.slice(0, idx);\n const optionId = trigger.slice(idx + 2);\n return { kind: \"composite\", triggerKey: trigger, fieldId, optionId };\n }\n\n // Direct node id (tag/field/option)\n const direct = nodeMap.get(trigger);\n if (!direct) return undefined;\n\n if (direct.kind === \"option\") {\n return {\n kind: \"option\",\n triggerKey: trigger,\n id: direct.id,\n fieldId: direct.fieldId,\n };\n }\n\n return { kind: direct.kind, triggerKey: trigger, id: direct.id };\n}\n","// src/core/visibility.ts\nimport type { Field, ServiceProps, Tag } from \"@/schema\";\nimport { buildNodeMap, type NodeMap, resolveTrigger } from \"./node-map\";\n\nexport type VisibilityOptions = {\n selectedKeys?: Set<string>;\n};\n\n/**\n * Single source of truth: selection-aware + lineage-aware visible field ids under a tag.\n * Returns ordered IDs.\n */\nexport function visibleFieldIdsUnder(\n props: ServiceProps,\n tagId: string,\n opts: VisibilityOptions = {},\n): string[] {\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 // Build node map (id => {kind,node,...})\n const nodeMap: NodeMap = buildNodeMap(props);\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 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 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 ownerDepthForTriggerKey = (\n triggerKey: string,\n ): number | undefined => {\n const t = resolveTrigger(triggerKey, nodeMap);\n if (!t) return undefined;\n\n // Composite trigger: fieldId::optionId\n if (t.kind === \"composite\") {\n const f = fieldById.get(t.fieldId);\n if (!f) return undefined;\n return ownerDepthForField(f);\n }\n\n // Field trigger (button field id)\n if (t.kind === \"field\") {\n const f = fieldById.get(t.id);\n if (!f || f.button !== true) return undefined;\n return ownerDepthForField(f);\n }\n\n // Option trigger (option id)\n if (t.kind === \"option\") {\n const f = t.fieldId ? fieldById.get(t.fieldId) : undefined;\n if (!f) return undefined;\n return ownerDepthForField(f);\n }\n\n // Tag trigger not used as a “button trigger”\n return undefined;\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 = opts.selectedKeys ?? new Set<string>();\n const incMap = props.includes_for_buttons ?? {};\n const excMap = props.excludes_for_buttons ?? {};\n\n // Only apply triggers that belong to (self ∪ ancestors).\n // Preserve insertion order from the Set.\n const relevantTriggersInOrder: string[] = [];\n for (const key of selected) {\n const d = ownerDepthForTriggerKey(key);\n if (d == null) continue;\n relevantTriggersInOrder.push(key);\n }\n\n // ---- base candidates: bound fields inherited + current tag includes\n const visible = new Set<string>();\n\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\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) return void decide.set(fieldId, next);\n\n if (next.depth < prev.depth) return void decide.set(fieldId, next);\n if (next.depth > prev.depth) return;\n\n if (prev.kind === \"include\" && next.kind === \"exclude\") {\n decide.set(fieldId, next);\n }\n };\n\n // determinism: revealed order (in trigger order)\n const revealedOrder: string[] = [];\n const revealedSeen = new Set<string>();\n\n for (const triggerKey of relevantTriggersInOrder) {\n const depth = ownerDepthForTriggerKey(triggerKey);\n if (depth == null) continue;\n\n for (const id of incMap[triggerKey] ?? []) {\n applyDecision(id, { depth, kind: \"include\" });\n\n if (!revealedSeen.has(id)) {\n revealedSeen.add(id);\n revealedOrder.push(id);\n }\n }\n\n for (const id of excMap[triggerKey] ?? []) {\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 order (props.fields order)\n const base = fields.filter((f) => visible.has(f.id)).map((f) => f.id);\n\n // order_for_tags pins first (ordering only)\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 // otherwise: revealed-first (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/** Convenience: returns ordered Field[] instead of ids. */\nexport function visibleFieldsUnder(\n props: ServiceProps,\n tagId: string,\n opts: VisibilityOptions = {},\n): Field[] {\n const ids = visibleFieldIdsUnder(props, tagId, opts);\n const fieldById = new Map((props.fields ?? []).map((f) => [f.id, f]));\n return ids.map((id) => fieldById.get(id)).filter(Boolean) as Field[];\n}\n","// src/core/validate/steps/visibility.ts\n\nimport type { Field, Tag } from \"@/schema\";\nimport type { ValidationCtx } from \"../shared\";\nimport { isFiniteNumber, withAffected } from \"../shared\";\nimport { visibleFieldsUnder } from \"@/core/visibility\";\n\n/**\n * v.selectedKeys is a Set<string> (per your note).\n * We keep the validator's \"fieldsVisibleUnder\" hook, but route all visibility\n * through the core visibility engine (single source of truth).\n */\nexport function createFieldsVisibleUnder(\n v: ValidationCtx,\n): (tagId: string) => Field[] {\n return (tagId: string): Field[] => {\n return visibleFieldsUnder(v.props, tagId, {\n selectedKeys: v.selectedKeys,\n });\n };\n}\n\n/* -------------------------------------------------------------------------- */\n/* Simulation-enabled validateVisibility */\n/* -------------------------------------------------------------------------- */\n\nexport type SimulateVisibilityOptions = {\n /**\n * When true, performs an in-depth selection simulation starting from root tag(s),\n * exploring states by selecting one selectable trigger at a time and re-validating.\n */\n simulate?: boolean;\n\n /**\n * Safety valve: max number of unique selection states validated.\n * Default: 500\n */\n maxStates?: number;\n\n /**\n * Safety valve: max depth of added selections from the base context.\n * Default: 6\n */\n maxDepth?: number;\n\n /**\n * If true, simulate starting from each root tag (tags without bind_id).\n * Otherwise, simulate only the first inferred root.\n */\n simulateAllRoots?: boolean;\n\n /**\n * If true, only simulate triggers that exist in includes_for_buttons/excludes_for_buttons\n * (massive branching reduction). Default: true.\n *\n * NOTE: Only enable this if selecting triggers has no other side effects besides\n * includes/excludes visibility effects.\n */\n onlyEffectfulTriggers?: boolean;\n};\n\nfunction stableKeyOfSelection(keys: Set<string>): string {\n return Array.from(keys).sort().join(\"|\");\n}\n\nfunction resolveRootTags(tags: Tag[]): Tag[] {\n const roots = tags.filter((t) => !(t as any).bind_id);\n return roots.length ? roots : tags.slice(0, 1);\n}\n\nfunction isEffectfulTrigger(v: ValidationCtx, trigger: string): boolean {\n const inc = v.props.includes_for_buttons ?? {};\n const exc = v.props.excludes_for_buttons ?? {};\n return (inc[trigger]?.length ?? 0) > 0 || (exc[trigger]?.length ?? 0) > 0;\n}\n\nfunction collectSelectableTriggersInContext(\n v: ValidationCtx,\n tagId: string,\n selectedKeys: Set<string>,\n onlyEffectful: boolean,\n): string[] {\n const visible = visibleFieldsUnder(v.props, tagId, {\n selectedKeys: selectedKeys,\n });\n\n const triggers: string[] = [];\n\n for (const f of visible) {\n // button-field trigger\n if ((f as any).button === true) {\n const t = f.id;\n if (!onlyEffectful || isEffectfulTrigger(v, t)) triggers.push(t);\n }\n\n // option triggers (canonical: \"fieldId::optionId\")\n for (const o of f.options ?? []) {\n const t = `${f.id}::${o.id}`;\n if (!onlyEffectful || isEffectfulTrigger(v, t)) triggers.push(t);\n }\n }\n\n // deterministic expansion order\n triggers.sort();\n return triggers;\n}\n\n/**\n * The actual visibility rules (your previous validateVisibility body),\n * extracted so we can run it once per simulated selection state.\n */\nfunction runVisibilityRulesOnce(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) (selection-aware)\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 =\n o.pricing_role ?? (f as any).pricing_role ?? \"base\";\n\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\n/**\n * De-dup only the errors added during simulation, so output stays stable.\n */\nfunction dedupeErrorsInPlace(v: ValidationCtx, startIndex: number): void {\n const seen = new Set<string>();\n\n const keyOfErr = (e: any) => {\n const tagId = e?.details?.tagId ?? e?.details?.affected?.tagId ?? \"\";\n const other = e?.details?.other ?? \"\";\n return `${e?.code ?? \"\"}::${e?.nodeId ?? \"\"}::${tagId}::${other}::${e?.message ?? \"\"}`;\n };\n\n const kept: any[] = [];\n for (let i = startIndex; i < v.errors.length; i++) {\n const e = v.errors[i];\n const k = keyOfErr(e);\n if (seen.has(k)) continue;\n seen.add(k);\n kept.push(e);\n }\n\n v.errors.splice(startIndex, v.errors.length - startIndex, ...kept);\n}\n\n/**\n * validateVisibility(v, { simulate: true }) will:\n * - Start from the root tag context\n * - Compute visible fields under that root given current selection\n * - Enumerate selectable triggers (button fields + option triggers)\n * - DFS: add one trigger, re-validate, then from that new context add any\n * newly-visible triggers, repeat… until depth/cap limits.\n */\nexport function validateVisibility(\n v: ValidationCtx,\n options: SimulateVisibilityOptions = {},\n): void {\n const simulate = options.simulate === true;\n\n if (!simulate) {\n runVisibilityRulesOnce(v);\n return;\n }\n\n const maxStates = Math.max(1, options.maxStates ?? 500);\n const maxDepth = Math.max(0, options.maxDepth ?? 6);\n const onlyEffectful = options.onlyEffectfulTriggers !== false; // default true\n\n const roots = resolveRootTags(v.tags);\n const rootTags = options.simulateAllRoots ? roots : roots.slice(0, 1);\n\n // snapshot original selection Set\n const originalSelected = new Set(v.selectedKeys ?? []);\n\n // we only dedupe what simulation adds\n const errorsStart = v.errors.length;\n\n // visited pruning by selection signature\n const visited = new Set<string>();\n\n type State = { rootTagId: string; selected: Set<string>; depth: number };\n const stack: State[] = [];\n\n // seed states (one per simulated root)\n for (const rt of rootTags) {\n stack.push({\n rootTagId: rt.id,\n selected: new Set(originalSelected),\n depth: 0,\n });\n }\n\n let validatedStates = 0;\n\n while (stack.length) {\n if (validatedStates >= maxStates) break;\n\n const state = stack.pop()!;\n const sig = stableKeyOfSelection(state.selected);\n\n if (visited.has(sig)) continue;\n visited.add(sig);\n\n // apply selection for this state\n v.selectedKeys = state.selected;\n\n // validate once under this selection context\n validatedStates++;\n runVisibilityRulesOnce(v);\n\n // stop expanding deeper\n if (state.depth >= maxDepth) continue;\n\n // expand next possible triggers based on current visible context\n const triggers = collectSelectableTriggersInContext(\n v,\n state.rootTagId,\n state.selected,\n onlyEffectful,\n );\n\n // DFS, deterministic: push reverse so earlier triggers explored first\n for (let i = triggers.length - 1; i >= 0; i--) {\n const trig = triggers[i]!;\n if (state.selected.has(trig)) continue;\n\n const next = new Set(state.selected);\n next.add(trig);\n\n stack.push({\n rootTagId: state.rootTagId,\n selected: next,\n depth: state.depth + 1,\n });\n }\n }\n\n // restore original selection\n v.selectedKeys = originalSelected;\n\n // dedupe errors from simulation tail\n dedupeErrorsInPlace(v, errorsStart);\n\n // If you want a diagnostic warning when capped, you can add it here.\n // Example (non-breaking): add a \"warning\" severity error.\n // if (validatedStates >= maxStates) { ... }\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 === \"t: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 ParsedFallback = { fieldId: string; optionId: string };\n\n/** Fallback parser for legacy \"fieldId::optionId\" keys */\nfunction parseFieldOptionKey(key: string): ParsedFallback | null {\n const idx = key.indexOf(\"::\");\n if (idx === -1) return null;\n\n const fieldId = key.slice(0, idx).trim();\n const optionId = key.slice(idx + 2).trim();\n\n if (!fieldId || !optionId) return null;\n return { fieldId, optionId };\n}\n\nfunction hasOption(v: ValidationCtx, 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\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 badKeyMessage = (key: string): string =>\n `Invalid trigger-map key \"${key}\". Expected a known node id (option or button-field), or \"fieldId::optionId\" pointing to an existing option.`;\n\n /**\n * Valid trigger keys:\n * - nodeMap has key:\n * - kind:\"option\" => ok\n * - kind:\"field\" => ok only if field.button === true\n * - kind:\"tag\" => invalid\n * - else fallback: \"fieldId::optionId\" must point to an existing option under that field\n */\n const validateTriggerKey = (\n key: string,\n ): {\n ok: boolean;\n nodeId?: string; // for error anchoring\n affected?: string[]; // for withAffected\n } => {\n const ref = v.nodeMap.get(key);\n\n if (ref) {\n if (ref.kind === \"option\") {\n // option trigger id is ref.id (key), and we know its parent field\n return {\n ok: true,\n nodeId: ref.fieldId,\n affected: [ref.fieldId, ref.id],\n };\n }\n\n if (ref.kind === \"field\") {\n const isButton = (ref.node as any).button === true;\n if (!isButton)\n return { ok: false, nodeId: ref.id, affected: [ref.id] };\n return { ok: true, nodeId: ref.id, affected: [ref.id] };\n }\n\n // tags cannot be triggers\n return { ok: false, nodeId: ref.id, affected: [ref.id] };\n }\n\n // fallback: fieldId::optionId\n const p = parseFieldOptionKey(key);\n if (!p) return { ok: false };\n\n if (!hasOption(v, p.fieldId, p.optionId))\n return {\n ok: false,\n nodeId: p.fieldId,\n affected: [p.fieldId, p.optionId],\n };\n\n return {\n ok: true,\n nodeId: p.fieldId,\n affected: [p.fieldId, p.optionId],\n };\n };\n\n // bad_option_key (keeping the code name for compatibility)\n for (const k of Object.keys(incMap)) {\n const r = validateTriggerKey(k);\n if (!r.ok) {\n v.errors.push({\n code: \"bad_option_key\",\n severity: \"error\",\n message: badKeyMessage(k),\n nodeId: r.nodeId,\n details: withAffected({ key: k }, r.affected),\n });\n }\n }\n\n for (const k of Object.keys(excMap)) {\n const r = validateTriggerKey(k);\n if (!r.ok) {\n v.errors.push({\n code: \"bad_option_key\",\n severity: \"error\",\n message: badKeyMessage(k),\n nodeId: r.nodeId,\n details: withAffected({ key: k }, r.affected),\n });\n }\n }\n\n // option_include_exclude_conflict: SAME RAW KEY in both maps\n for (const k of Object.keys(incMap)) {\n if (!(k in excMap)) continue;\n\n const r = validateTriggerKey(k);\n v.errors.push({\n code: \"option_include_exclude_conflict\",\n severity: \"error\",\n message: `Trigger-map key \"${k}\" appears in both includes_for_buttons and excludes_for_buttons.`,\n nodeId: r.nodeId,\n details: withAffected({ key: k }, r.affected),\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\";\nimport { buildNodeMap } from \"@/core/node-map\";\n\n/**\n * We read simulation options from ctx without changing the public ValidatorOptions type.\n * (So UI can pass these without needing schema/type changes immediately.)\n */\ntype VisibilitySimOpts = Readonly<{\n simulate?: boolean;\n maxStates?: number;\n maxDepth?: number;\n simulateAllRoots?: boolean;\n onlyEffectfulTriggers?: boolean;\n}>;\n\nfunction readVisibilitySimOpts(ctx: ValidatorOptions): VisibilitySimOpts {\n const c = ctx as any;\n\n const simulate =\n c.simulateVisibility === true ||\n c.visibilitySimulate === true ||\n c.simulate === true;\n\n const maxStates =\n typeof c.maxVisibilityStates === \"number\"\n ? c.maxVisibilityStates\n : typeof c.visibilityMaxStates === \"number\"\n ? c.visibilityMaxStates\n : typeof c.maxStates === \"number\"\n ? c.maxStates\n : undefined;\n\n const maxDepth =\n typeof c.maxVisibilityDepth === \"number\"\n ? c.maxVisibilityDepth\n : typeof c.visibilityMaxDepth === \"number\"\n ? c.visibilityMaxDepth\n : typeof c.maxDepth === \"number\"\n ? c.maxDepth\n : undefined;\n\n const simulateAllRoots =\n c.simulateAllRoots === true || c.visibilitySimulateAllRoots === true;\n\n const onlyEffectfulTriggers =\n c.onlyEffectfulTriggers === false\n ? false\n : c.visibilityOnlyEffectfulTriggers !== false; // default true\n\n return {\n simulate,\n maxStates,\n maxDepth,\n simulateAllRoots,\n onlyEffectfulTriggers,\n };\n}\n\n/**\n * Core synchronous validate.\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 nodeMap: ctx.nodeMap ?? buildNodeMap(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 (optionally simulated)\n v.fieldsVisibleUnder = createFieldsVisibleUnder(v);\n\n const visSim = readVisibilitySimOpts(ctx);\n validateVisibility(v, visSim);\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\n/**\n * UI-friendly async wrapper:\n * - yields to microtask queue\n * - then yields to the next animation frame (so paint can happen)\n * - then runs validate()\n */\nexport async function validateAsync(\n props: ServiceProps,\n ctx: ValidatorOptions = {},\n): Promise<ValidationError[]> {\n // microtask yield\n await Promise.resolve();\n\n // next paint/frame yield (browser environments)\n if (typeof requestAnimationFrame === \"function\") {\n await new Promise<void>((resolve) =>\n requestAnimationFrame(() => resolve()),\n );\n } else {\n // non-browser fallback\n await new Promise<void>((resolve) => setTimeout(resolve, 0));\n }\n\n return validate(props, ctx);\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\";\nimport { visibleFieldIdsUnder } from \"@/core/visibility\";\nimport { buildNodeMap, NodeMap } from \"@/core/node-map\";\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 isTagId(id: string): boolean;\n isFieldId(id: string): boolean;\n isOptionId(id: string): boolean;\n getNodeMap(): NodeMap;\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 private _nodemap: NodeMap | null = null;\n\n constructor(opts: BuilderOptions = {}) {\n this.options = { ...opts };\n this.historyLimit = opts.historyLimit ?? 50;\n }\n\n /* ───── lifecycle ─────────────────────────────────────────────────────── */\n isTagId(id: string) {\n return this.tagById.has(id);\n }\n isFieldId(id: string) {\n return this.fieldById.has(id);\n }\n isOptionId(id: string) {\n return this.optionOwnerById.has(id);\n }\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 return visibleFieldIdsUnder(this.props, tagId, {\n selectedKeys: new Set(\n selectedKeys ?? this.options.selectedOptionKeys ?? [],\n ),\n });\n }\n\n getNodeMap(): NodeMap {\n if (!this._nodemap) this._nodemap = buildNodeMap(this.getProps());\n ///--\n return this._nodemap;\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 this._nodemap = null;\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","// src/utils/prune-fallbacks.ts\r\nimport type { ServiceProps, ServiceIdRef } from \"@/schema\";\r\nimport type { DgpServiceMap } from \"@/schema/provider\";\r\nimport type { FallbackSettings } from \"@/schema/validation\";\r\nimport { collectFailedFallbacks } from \"@/core\";\r\n\r\nexport type PrunedFallback = {\r\n nodeId: string;\r\n candidate: ServiceIdRef;\r\n reasons: string[]; // aggregated reasons that caused full-context failure\r\n contexts?: string[]; // tag contexts considered (for option nodes)\r\n};\r\n\r\nexport type PruneResult = {\r\n props: ServiceProps;\r\n removed: PrunedFallback[];\r\n};\r\n\r\n/**\r\n * Remove node-scoped fallback candidates that fail in ALL relevant contexts.\r\n * - Tag node: single context (the tag itself)\r\n * - Option node: contexts = parent field's bind_id tags\r\n * - Global fallbacks are NEVER pruned here (soft by design)\r\n */\r\nexport function pruneInvalidNodeFallbacks(\r\n props: ServiceProps,\r\n services: DgpServiceMap,\r\n settings?: FallbackSettings\r\n): PruneResult {\r\n const fb = props.fallbacks;\r\n if (!fb?.nodes || Object.keys(fb.nodes).length === 0) {\r\n return { props, removed: [] };\r\n }\r\n\r\n // 1) Build node → contexts (tag ids) and primary lookup\r\n const nodeContexts = new Map<string, string[]>();\r\n const nodePrimary = new Map<string, ServiceIdRef | undefined>();\r\n\r\n for (const nodeId of Object.keys(fb.nodes)) {\r\n const tag = props.filters.find(t => t.id === nodeId);\r\n if (tag) {\r\n nodeContexts.set(nodeId, [tag.id]);\r\n nodePrimary.set(nodeId, tag.service_id as any);\r\n continue;\r\n }\r\n // option node: locate parent field\r\n const field = props.fields.find(f => Array.isArray(f.options) && f.options.some(o => o.id === nodeId));\r\n if (field) {\r\n const contexts = toBindArray(field.bind_id);\r\n nodeContexts.set(nodeId, contexts);\r\n const opt = field.options!.find(o => o.id === nodeId)!;\r\n nodePrimary.set(nodeId, opt.service_id as any);\r\n continue;\r\n }\r\n // unknown node id → treat as no contexts & no primary\r\n nodeContexts.set(nodeId, []);\r\n nodePrimary.set(nodeId, undefined);\r\n }\r\n\r\n // 2) Gather diagnostics (per context). We use dev mode collection to get granular reasons.\r\n const diags = collectFailedFallbacks(props, services, { ...settings, mode: 'dev' });\r\n\r\n // 3) Decide which (nodeId, candidate) pairs fail in ALL contexts\r\n const failuresByPair = new Map<string, { reasons: Set<string>; contexts: Set<string> }>();\r\n const totalContextsByNode = new Map<string, number>();\r\n\r\n for (const [nodeId, ctxs] of nodeContexts.entries()) {\r\n totalContextsByNode.set(nodeId, Math.max(1, ctxs.length)); // at least 1 for tag/no-context cases\r\n }\r\n\r\n for (const d of diags) {\r\n if (d.scope !== 'node') continue;\r\n const key = `${d.nodeId}::${String(d.candidate)}`;\r\n let rec = failuresByPair.get(key);\r\n if (!rec) {\r\n rec = { reasons: new Set<string>(), contexts: new Set<string>() };\r\n failuresByPair.set(key, rec);\r\n }\r\n rec.reasons.add(d.reason);\r\n if (d.tagContext) rec.contexts.add(d.tagContext);\r\n // For node-level reasons not tied to a context, mark all contexts as failed by leaving contexts set empty;\r\n // we'll interpret empty-but-has-reasons as global failure later when totals == 1.\r\n }\r\n\r\n // 4) Build a pruned copy of fallbacks.nodes\r\n const prunedNodes: Record<string, ServiceIdRef[]> = {};\r\n const removed: PrunedFallback[] = [];\r\n\r\n for (const [nodeId, list] of Object.entries(fb.nodes)) {\r\n const contexts = nodeContexts.get(nodeId) ?? [];\r\n const totalContexts = Math.max(1, contexts.length);\r\n const keep: ServiceIdRef[] = [];\r\n\r\n for (const cand of list) {\r\n const key = `${nodeId}::${String(cand)}`;\r\n const rec = failuresByPair.get(key);\r\n\r\n // Not present in failures → keep\r\n if (!rec) {\r\n keep.push(cand);\r\n continue;\r\n }\r\n\r\n const failedContextsCount = rec.contexts.size > 0 ? rec.contexts.size : totalContexts;\r\n const failsAll = failedContextsCount >= totalContexts;\r\n\r\n if (failsAll) {\r\n removed.push({\r\n nodeId,\r\n candidate: cand,\r\n reasons: Array.from(rec.reasons),\r\n contexts: contexts.length ? contexts.slice() : undefined,\r\n });\r\n } else {\r\n keep.push(cand); // passes in at least one context\r\n }\r\n }\r\n\r\n if (keep.length) prunedNodes[nodeId] = keep;\r\n }\r\n\r\n const outProps: ServiceProps = {\r\n ...props,\r\n fallbacks: {\r\n ...(props.fallbacks?.global ? { global: props.fallbacks!.global } : {}),\r\n ...(Object.keys(prunedNodes).length ? { nodes: prunedNodes } : {}),\r\n }\r\n };\r\n\r\n return { props: outProps, removed };\r\n}\r\n\r\n/* ───────────────────────── helpers ───────────────────────── */\r\n\r\nfunction toBindArray(bind: string | string[] | undefined): string[] {\r\n if (!bind) return [];\r\n return Array.isArray(bind) ? bind.slice() : [bind];\r\n}","import type { DgpServiceMap, DgpServiceCapability } from \"@/schema/provider\";\r\nimport type { FallbackSettings } from \"@/schema/validation\";\r\n\r\n/**\r\n * Safely convert unknown to a finite number. Returns NaN if not finite.\r\n */\r\nexport function toFiniteNumber(v: unknown): number {\r\n const n = Number(v);\r\n return Number.isFinite(n) ? n : NaN;\r\n}\r\n\r\n/**\r\n * Check if a candidate service satisfies the active tag constraints.\r\n * Only flags explicitly set to true are treated as required.\r\n */\r\nexport function constraintFitOk(\r\n svcMap: DgpServiceMap,\r\n candidate: string | number,\r\n constraints: Partial<Record<\"refill\" | \"cancel\" | \"dripfeed\", boolean>>,\r\n): boolean {\r\n const cap: DgpServiceCapability | undefined = svcMap[Number(candidate)];\r\n if (!cap) return false;\r\n\r\n if (constraints.dripfeed === true && !cap.dripfeed) return false;\r\n if (constraints.refill === true && !cap.refill) return false;\r\n return !(constraints.cancel === true && !cap.cancel);\r\n\r\n}\r\n\r\n/**\r\n * Evaluate candidate rate against primary according to the fallback rate policy.\r\n * If either service is missing or rates are not finite, returns false.\r\n */\r\nexport function rateOk(\r\n svcMap: DgpServiceMap,\r\n candidate: string | number,\r\n primary: string | number,\r\n policy: FallbackSettings,\r\n): boolean {\r\n const cand = svcMap[Number(candidate)];\r\n const prim = svcMap[Number(primary)];\r\n if (!cand || !prim) return false;\r\n\r\n const cRate = toFiniteNumber(cand.rate);\r\n const pRate = toFiniteNumber(prim.rate);\r\n if (!Number.isFinite(cRate) || !Number.isFinite(pRate)) return false;\r\n\r\n const rp = policy.ratePolicy ?? { kind: \"lte_primary\" as const };\r\n switch (rp.kind) {\r\n case \"lte_primary\":\r\n return cRate <= pRate;\r\n case \"within_pct\": {\r\n const pct = Math.max(0, rp.pct ?? 0);\r\n return cRate <= pRate * (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 cRate <= pRate * (1 - pct / 100);\r\n }\r\n default:\r\n return false;\r\n }\r\n}\r\n","// src/utils/build-order-snapshot.ts\n\nimport type {\n FallbackDiagnostics,\n OrderSnapshot,\n QuantityRule,\n Scalar,\n ServiceFallbacks,\n UtilityLineItem,\n UtilityMode,\n} from \"@/schema/order\";\nimport type {\n DgpServiceCapability,\n Field,\n FieldOption,\n ServiceProps,\n Tag,\n} from \"@/schema\";\nimport type { Builder } from \"@/core\";\nimport type { DgpServiceMap } from \"@/schema/provider\";\nimport { isMultiField } from \"./index\";\nimport type { PruneResult } from \"./prune-fallbacks\";\nimport { pruneInvalidNodeFallbacks } from \"./prune-fallbacks\";\nimport type { FallbackSettings } from \"@/schema/validation\";\nimport { constraintFitOk, rateOk } from \"./util\";\n\n/* ───────────────────────── Public types ───────────────────────── */\n\nexport type BuildOrderSnapshotSettings = {\n mode?: \"prod\" | \"dev\";\n hostDefaultQuantity?: number;\n /** Full fallback policy */\n fallback?: FallbackSettings;\n workspaceId?: string;\n builderCommit?: string;\n};\n\nexport type BuildOrderSelection = {\n /** Single active context (one tag) coming from Selection */\n activeTagId: string;\n /** Non-option inputs, keyed by fieldId (will be remapped to field.name in the payload) */\n formValuesByFieldId: Record<string, Scalar | Scalar[]>;\n /** Option selections, keyed by fieldId → optionId[] */\n optionSelectionsByFieldId: Record<string, string[]>;\n /**\n * Selection visit order for options (optional, improves \"first option wins primary\" determinism).\n * If omitted, iteration order falls back to Object.entries(optionSelectionsByFieldId).\n */\n optionTraversalOrder?: Array<{ fieldId: string; optionId: string }>;\n};\n\n/* ───────────────────────── Entry point ───────────────────────── */\n\nexport function buildOrderSnapshot(\n props: ServiceProps,\n builder: Builder,\n selection: BuildOrderSelection,\n services: DgpServiceMap,\n settings: BuildOrderSnapshotSettings = {},\n): OrderSnapshot {\n const mode: \"prod\" | \"dev\" = settings.mode ?? \"prod\";\n const hostDefaultQty: number = Number.isFinite(\n settings.hostDefaultQuantity ?? 1,\n )\n ? (settings.hostDefaultQuantity as number)\n : 1;\n\n // Default fallback policy (strict in prod; diagnostics in dev)\n const fbSettings: FallbackSettings = {\n requireConstraintFit: true,\n ratePolicy: { kind: \"lte_primary\" },\n selectionStrategy: \"priority\",\n mode: mode === \"dev\" ? \"dev\" : \"strict\",\n ...(settings.fallback ?? {}),\n };\n\n const builtAt: string = new Date().toISOString();\n const tagId: string = selection.activeTagId;\n\n // 1) Resolve visible fields for the single context\n const selectedOptionKeys: string[] = toSelectedOptionKeys(\n selection.optionSelectionsByFieldId,\n );\n const visibleFieldIds: string[] = builder.visibleFields(\n tagId,\n selectedOptionKeys,\n );\n\n // Indexes\n const tagById: Map<string, Tag> = new Map(\n (props.filters ?? []).map((t) => [t.id, t]),\n );\n const fieldById: Map<string, Field> = new Map(\n (props.fields ?? []).map((f) => [f.id, f]),\n );\n const tagConstraints:\n | Partial<Record<\"refill\" | \"cancel\" | \"dripfeed\", boolean>>\n | undefined = tagById.get(tagId)?.constraints ?? undefined;\n\n // 2) Selection.fields (id, type, selectedOptions?)\n const selectionFields = visibleFieldIds\n .map((fid) => fieldById.get(fid))\n .filter((f): f is Field => !!f)\n .map((f) => {\n const optIds: string[] | undefined = isOptionBased(f)\n ? (selection.optionSelectionsByFieldId[f.id] ?? [])\n : undefined;\n return {\n id: f.id,\n type: String(f.type),\n ...(optIds && optIds.length ? { selectedOptions: optIds } : {}),\n };\n });\n\n // 3) Inputs (form by field.name, selections by fieldId)\n const { formValues, selections } = buildInputs(\n visibleFieldIds,\n fieldById,\n selection,\n );\n\n // 4) Quantity\n const qtyRes = resolveQuantity(\n visibleFieldIds,\n fieldById,\n selection,\n hostDefaultQty,\n );\n const quantity: number = qtyRes.quantity;\n const quantitySource = qtyRes.source;\n\n // 5) Services and serviceMap (UPDATED behavior: tag default is default; any option with service_id is included; first becomes primary)\n const { serviceMap, servicesList } = resolveServices(\n tagId,\n visibleFieldIds,\n selection,\n tagById,\n fieldById,\n );\n\n const { min, max } = resolveMinMax(servicesList, services);\n\n // 6) Fallbacks — client-side conservative prune (keeps only relevant-to-selection)\n const prunedFallbacks = pruneFallbacksConservative(\n props.fallbacks as unknown as ServiceFallbacks | undefined,\n { tagId, constraints: tagConstraints, serviceMap, servicesList },\n services,\n fbSettings,\n );\n\n // 7) Utilities — line items derived from utility fields/options\n const utilities = collectUtilityLineItems(\n visibleFieldIds,\n fieldById,\n selection,\n quantity,\n );\n\n // 8) Dev warnings (fallback diagnostics + form/utility hints)\n const warnings: OrderSnapshot[\"warnings\"] | undefined =\n mode === \"dev\"\n ? buildDevWarnings(\n props,\n services,\n tagId,\n serviceMap,\n prunedFallbacks.original,\n prunedFallbacks.pruned,\n fieldById,\n visibleFieldIds,\n selection,\n )\n : undefined;\n\n // 9) Meta.context (single-tag effective constraints + nodeContexts)\n const snapshotPolicy = toSnapshotPolicy(fbSettings);\n const meta = {\n schema_version: props.schema_version,\n workspaceId: settings.workspaceId,\n builder: settings.builderCommit\n ? { commit: settings.builderCommit }\n : undefined,\n context: {\n tag: tagId,\n constraints: (tagConstraints ?? {}) as Record<\n \"refill\" | \"cancel\" | \"dripfeed\",\n boolean | undefined\n >,\n nodeContexts: buildNodeContexts(\n tagId,\n visibleFieldIds,\n fieldById,\n selection,\n ),\n policy: snapshotPolicy,\n },\n };\n\n const snapshot: OrderSnapshot = {\n version: \"1\",\n mode,\n builtAt,\n selection: {\n tag: tagId,\n fields: selectionFields,\n },\n inputs: {\n form: formValues,\n selections,\n },\n\n min,\n max: max ?? min,\n\n quantity,\n quantitySource,\n services: servicesList,\n serviceMap,\n ...(prunedFallbacks.pruned\n ? { fallbacks: prunedFallbacks.pruned }\n : {}),\n ...(utilities.length ? { utilities } : {}),\n ...(warnings ? { warnings } : {}),\n meta,\n };\n\n return snapshot;\n}\n\n/* ───────────────────────── Helpers ───────────────────────── */\n\nfunction isOptionBased(f: Field): boolean {\n const hasOptions: boolean =\n Array.isArray(f.options) && f.options.length > 0;\n return hasOptions || isMultiField(f);\n}\n\nfunction toSelectedOptionKeys(byField: Record<string, string[]>): string[] {\n const keys: string[] = [];\n for (const [fieldId, optionIds] of Object.entries(byField ?? {})) {\n for (const optId of optionIds ?? []) {\n keys.push(`${fieldId}::${optId}`);\n }\n }\n return keys;\n}\n\nfunction buildInputs(\n visibleFieldIds: string[],\n fieldById: Map<string, Field>,\n selection: BuildOrderSelection,\n): {\n formValues: Record<string, Scalar | Scalar[]>;\n selections: Record<string, string[]>;\n} {\n const formValues: Record<string, Scalar | Scalar[]> = {};\n const selections: Record<string, string[]> = {};\n\n for (const fid of visibleFieldIds) {\n const f: Field | undefined = fieldById.get(fid);\n if (!f) continue;\n\n const selOptIds: string[] | undefined =\n selection.optionSelectionsByFieldId[fid];\n if (selOptIds && selOptIds.length) {\n selections[fid] = [...selOptIds];\n }\n\n // Only non-option fields contribute to form values; key by field.name\n if (!isOptionBased(f)) {\n const name: string | undefined = f.name;\n const val: Scalar | Scalar[] | undefined =\n selection.formValuesByFieldId[fid];\n if (!name || val === undefined) continue;\n formValues[name] = val;\n }\n }\n\n return { formValues, selections };\n}\n\n/* ───────────────── Quantity ───────────────── */\n\nfunction resolveQuantity(\n visibleFieldIds: string[],\n fieldById: Map<string, Field>,\n selection: BuildOrderSelection,\n hostDefault: number,\n): { quantity: number; source: OrderSnapshot[\"quantitySource\"] } {\n // Precedence:\n // 1) First visible field with a quantity rule -> evaluate\n // 2) (Future) tag/option defaults (not implemented yet)\n // 3) Host default\n for (const fid of visibleFieldIds) {\n const f: Field | undefined = fieldById.get(fid);\n if (!f) continue;\n const rule: QuantityRule | undefined = readQuantityRule(\n (f.meta as any)?.quantity,\n );\n if (!rule) continue;\n\n const raw: Scalar | Scalar[] | undefined =\n selection.formValuesByFieldId[fid];\n const evaluated = evaluateQuantityRule(rule, raw);\n if (Number.isFinite(evaluated) && (evaluated as number) > 0) {\n return {\n quantity: evaluated as number,\n source: { kind: \"field\", id: f.id, rule },\n };\n }\n }\n\n return {\n quantity: hostDefault,\n source: { kind: \"default\", defaultedFromHost: true },\n };\n}\n\nfunction readQuantityRule(v: unknown): QuantityRule | undefined {\n if (!v || typeof v !== \"object\") return undefined;\n const src = v as QuantityRule;\n if (\n src.valueBy !== \"value\" &&\n src.valueBy !== \"length\" &&\n src.valueBy !== \"eval\"\n )\n return undefined;\n const out: QuantityRule = { valueBy: src.valueBy };\n if (src.code && typeof src.code === \"string\") out.code = src.code;\n return out;\n}\n\nfunction evaluateQuantityRule(\n rule: QuantityRule,\n raw: Scalar | Scalar[] | undefined,\n): number {\n switch (rule.valueBy) {\n case \"value\": {\n const n = Number(Array.isArray(raw) ? (raw as Scalar[])[0] : raw);\n return Number.isFinite(n) ? n : NaN;\n }\n case \"length\": {\n if (Array.isArray(raw)) return raw.length;\n if (typeof raw === \"string\") return raw.length;\n return NaN;\n }\n case \"eval\": {\n try {\n if (!rule.code || typeof rule.code !== \"string\") return NaN;\n // eslint-disable-next-line no-new-func\n const fn = new Function(\n \"value\",\n \"values\",\n `return (function(){ ${rule.code}\\n})()`,\n );\n const single = Array.isArray(raw) ? (raw as Scalar[])[0] : raw;\n const values = Array.isArray(raw)\n ? (raw as Scalar[])\n : raw !== undefined\n ? [raw]\n : [];\n const out = fn(single, values);\n const n = Number(out);\n return Number.isFinite(n) ? n : NaN;\n } catch {\n return NaN;\n }\n }\n default:\n return NaN;\n }\n}\n\n/* ───────────────── Services (UPDATED) ───────────────── */\n\nfunction resolveServices(\n tagId: string,\n visibleFieldIds: string[],\n selection: BuildOrderSelection,\n tagById: Map<string, Tag>,\n fieldById: Map<string, Field>,\n): {\n serviceMap: Record<string, Array<string | number>>;\n servicesList: Array<string | number>;\n} {\n const serviceMap: Record<string, Array<string | number>> = {};\n const ordered: Array<string | number> = [];\n\n // 1) Tentative primary from tag default (if any) — default only.\n const tag = tagById.get(tagId);\n let primary: string | number | undefined;\n let primaryOrigin: \"tag\" | \"option\" | undefined;\n\n if (tag?.service_id !== undefined) {\n primary = tag.service_id;\n primaryOrigin = \"tag\";\n // We'll only record it in lists if it survives override.\n }\n\n // 2) Walk option selections in a deterministic order\n const optionVisit = buildOptionVisitOrder(selection, fieldById);\n\n for (const { fieldId, optionId } of optionVisit) {\n // only consider options whose field is visible in this group\n if (!visibleFieldIds.includes(fieldId)) continue;\n\n const f = fieldById.get(fieldId);\n if (!f || !Array.isArray(f.options)) continue;\n\n const opt = f.options.find((o) => o.id === optionId);\n if (!opt) continue;\n\n const role = (opt.pricing_role ?? \"base\") as\n | \"base\"\n | \"utility\"\n | string;\n const sid = opt.service_id;\n\n // Defensive: ignore if a (misconfigured) utility has service_id.\n if (role === \"utility\") continue;\n\n if (sid !== undefined) {\n // First option with service_id overrides tag default primary.\n if (primary === undefined || primaryOrigin === \"tag\") {\n primary = sid;\n primaryOrigin = \"option\";\n // Since primary owns index 0, push it first\n ordered.length = 0; // clear any tentative tag default\n ordered.push(primary);\n } else {\n // Additional option services append\n ordered.push(sid);\n }\n // Map origin node → sid\n pushService(serviceMap, optionId, sid);\n }\n }\n\n // 3) If no option established a primary, use tag default (if present)\n if (primaryOrigin !== \"option\" && primary !== undefined) {\n ordered.unshift(primary);\n pushService(serviceMap, tagId, primary);\n } else {\n // If overridden, we do NOT record tagId→default in serviceMap\n }\n\n const servicesList = dedupeByString(ordered);\n return { serviceMap, servicesList };\n}\n\nfunction buildOptionVisitOrder(\n selection: BuildOrderSelection,\n fieldById: Map<string, Field>,\n): Array<{ fieldId: string; optionId: string }> {\n if (\n selection.optionTraversalOrder &&\n selection.optionTraversalOrder.length\n ) {\n return selection.optionTraversalOrder.slice();\n }\n // fallback: expand optionSelectionsByFieldId in insertion-ish order\n const out: Array<{ fieldId: string; optionId: string }> = [];\n for (const [fid, optIds] of Object.entries(\n selection.optionSelectionsByFieldId ?? {},\n )) {\n const f = fieldById.get(fid);\n if (!f) continue;\n for (const oid of optIds ?? [])\n out.push({ fieldId: fid, optionId: oid });\n }\n return out;\n}\n\nfunction pushService(\n map: Record<string, Array<string | number>>,\n nodeId: string,\n sid: string | number,\n): void {\n if (!map[nodeId]) map[nodeId] = [];\n map[nodeId].push(sid);\n}\n\nfunction dedupeByString<T extends string | number>(arr: T[]): T[] {\n const s = new Set<string>();\n const out: T[] = [];\n for (const v of arr) {\n const key = String(v);\n if (s.has(key)) continue;\n s.add(key);\n out.push(v);\n }\n return out;\n}\n\n/* ───────────── Fallback pruning (client-conservative) ───────────── */\n\ntype PruneEnv = {\n tagId: string;\n constraints?: Partial<Record<\"refill\" | \"cancel\" | \"dripfeed\", boolean>>;\n serviceMap: Record<string, Array<string | number>>;\n servicesList: Array<string | number>;\n};\n\nfunction pruneFallbacksConservative(\n fallbacks: ServiceFallbacks | undefined,\n env: PruneEnv,\n svcMap: DgpServiceMap,\n policy: FallbackSettings,\n): { pruned?: ServiceFallbacks; original?: ServiceFallbacks } {\n if (!fallbacks) return { pruned: undefined, original: undefined };\n\n // Prefer shared helper (keeps behavior consistent with tests)\n try {\n const { props: prunedProps }: PruneResult = pruneInvalidNodeFallbacks(\n {\n filters: [],\n fields: [],\n schema_version: \"1.0\",\n fallbacks,\n } as unknown as ServiceProps,\n svcMap,\n policy,\n );\n return {\n pruned: prunedProps.fallbacks as unknown as\n | ServiceFallbacks\n | undefined,\n original: fallbacks,\n };\n } catch {\n // Minimal inline conservative prune (selection-aware)\n const out: ServiceFallbacks = {};\n const requireFit: boolean = policy.requireConstraintFit ?? true;\n\n // Nodes: keep only for nodes present in env.serviceMap; apply rate & (optional) constraints against tag\n if ((fallbacks as any).nodes) {\n const keptNodes: Record<string, Array<string | number>> = {};\n for (const [nodeId, candidates] of Object.entries(\n (fallbacks as any).nodes as Record<\n string,\n Array<string | number>\n >,\n )) {\n if (!env.serviceMap[nodeId]) continue;\n const primary = (env.serviceMap[nodeId] ?? [])[0];\n const kept: Array<string | number> = [];\n for (const cand of candidates ?? []) {\n if (!rateOk(svcMap, cand, primary, policy)) continue;\n if (\n requireFit &&\n env.constraints &&\n !constraintFitOk(svcMap, cand, env.constraints)\n )\n continue;\n kept.push(cand);\n }\n if (kept.length) keptNodes[nodeId] = kept;\n }\n if (Object.keys(keptNodes).length) (out as any).nodes = keptNodes;\n }\n\n // Global: keep only primaries that are present in selection; apply rate & (optional) constraints\n if ((fallbacks as any).global) {\n const keptGlobal: Record<\n string | number,\n Array<string | number>\n > = {};\n const present = new Set(env.servicesList.map((sid) => String(sid)));\n for (const [primary, cands] of Object.entries(\n (fallbacks as any).global as Record<\n string | number,\n Array<string | number>\n >,\n )) {\n if (!present.has(String(primary))) continue;\n const primId: string | number = isFiniteNumber(primary)\n ? Number(primary)\n : (primary as any);\n const kept: Array<string | number> = [];\n for (const cand of cands ?? []) {\n if (!rateOk(svcMap, cand, primId, policy)) continue;\n if (\n requireFit &&\n env.constraints &&\n !constraintFitOk(svcMap, cand, env.constraints)\n )\n continue;\n kept.push(cand);\n }\n if (kept.length) keptGlobal[primId] = kept;\n }\n if (Object.keys(keptGlobal).length)\n (out as any).global = keptGlobal;\n }\n\n return {\n pruned: Object.keys(out).length ? out : undefined,\n original: fallbacks,\n };\n }\n}\n\nfunction isFiniteNumber(v: unknown): v is number {\n return typeof v === \"number\" && Number.isFinite(v);\n}\n\n/* ───────────────── Utilities collection ───────────────── */\n\ntype UtilityMarker = {\n mode: UtilityMode;\n rate: number;\n valueBy?: \"value\" | \"length\" | \"eval\";\n code?: string;\n};\n\nfunction collectUtilityLineItems(\n visibleFieldIds: string[],\n fieldById: Map<string, Field>,\n selection: BuildOrderSelection,\n quantity: number,\n): UtilityLineItem[] {\n const items: UtilityLineItem[] = [];\n\n for (const fid of visibleFieldIds) {\n const f = fieldById.get(fid);\n if (!f) continue;\n\n const isUtilityField = (f.pricing_role ?? \"base\") === \"utility\";\n const marker = readUtilityMarker((f.meta as any)?.utility);\n\n // Field-based utility\n if (isUtilityField && marker) {\n const val: Scalar | Scalar[] | undefined =\n selection.formValuesByFieldId[f.id];\n const item = buildUtilityItemFromMarker(\n f.id,\n marker,\n quantity,\n val,\n );\n if (item) items.push(item);\n }\n\n // Option-based utility (only if selected)\n if (Array.isArray(f.options) && f.options.length) {\n const selectedOptIds =\n selection.optionSelectionsByFieldId[f.id] ?? [];\n if (selectedOptIds.length) {\n const optById = new Map<string, FieldOption>(\n f.options.map((o) => [o.id, o]),\n );\n for (const oid of selectedOptIds) {\n const opt = optById.get(oid);\n if (!opt) continue;\n if ((opt.pricing_role ?? \"base\") !== \"utility\") continue;\n const om = readUtilityMarker((opt.meta as any)?.utility);\n if (!om) continue;\n // For per_value on options, we use the parent field's value as the base value\n const parentVal: Scalar | Scalar[] | undefined =\n selection.formValuesByFieldId[f.id];\n const item = buildUtilityItemFromMarker(\n opt.id,\n om,\n quantity,\n parentVal,\n );\n if (item) items.push(item);\n }\n }\n }\n }\n\n return items;\n}\n\nfunction readUtilityMarker(v: unknown): UtilityMarker | undefined {\n if (!v || typeof v !== \"object\") return undefined;\n const src = v as UtilityMarker;\n if (!src.mode || typeof src.rate !== \"number\" || !Number.isFinite(src.rate))\n return undefined;\n if (\n src.mode !== \"flat\" &&\n src.mode !== \"per_quantity\" &&\n src.mode !== \"per_value\" &&\n src.mode !== \"percent\"\n )\n return undefined;\n const out: UtilityMarker = { mode: src.mode, rate: src.rate };\n if (\n src.valueBy === \"value\" ||\n src.valueBy === \"length\" ||\n src.valueBy === \"eval\"\n )\n out.valueBy = src.valueBy;\n if (src.code && typeof src.code === \"string\") out.code = src.code;\n return out;\n}\n\nfunction buildUtilityItemFromMarker(\n nodeId: string,\n marker: UtilityMarker,\n quantity: number,\n value: Scalar | Scalar[] | undefined,\n): UtilityLineItem | undefined {\n const base: UtilityLineItem = {\n nodeId,\n mode: marker.mode,\n rate: marker.rate,\n inputs: { quantity },\n };\n if (marker.mode === \"per_value\") {\n base.inputs.valueBy = marker.valueBy ?? \"value\";\n if (marker.valueBy === \"length\") {\n base.inputs.value = Array.isArray(value)\n ? value.length\n : typeof value === \"string\"\n ? value.length\n : 0;\n } else if (marker.valueBy === \"eval\") {\n base.inputs.evalCodeUsed = true; // signal that client used eval\n } else {\n base.inputs.value = Array.isArray(value)\n ? (value[0] ?? null)\n : (value ?? null);\n }\n }\n return base;\n}\n\n/* ───────────────── meta.context helpers ──────────────── */\n\nfunction buildNodeContexts(\n tagId: string,\n visibleFieldIds: string[],\n fieldById: Map<string, Field>,\n selection: BuildOrderSelection,\n): Record<string, string | null> {\n const ctx: Record<string, string | null> = {};\n ctx[tagId] = tagId; // tag maps to itself\n\n for (const fid of visibleFieldIds) {\n const f = fieldById.get(fid);\n if (!f) continue;\n\n const binds = normalizeBindIds(f.bind_id);\n const applicable = binds.has(tagId);\n\n const selectedOptIds = selection.optionSelectionsByFieldId[fid] ?? [];\n for (const oid of selectedOptIds) {\n ctx[oid] = applicable ? tagId : null;\n }\n }\n\n return ctx;\n}\n\nfunction normalizeBindIds(bind: string | string[] | undefined): Set<string> {\n const out = new Set<string>();\n if (!bind) return out;\n if (Array.isArray(bind)) {\n for (const b of bind) if (b) out.add(String(b));\n } else {\n out.add(String(bind));\n }\n return out;\n}\n\n/* ───────────────── Dev warnings ───────────────── */\n\nfunction buildDevWarnings(\n props: ServiceProps,\n svcMap: DgpServiceMap,\n _tagId: string,\n _snapshotServiceMap: Record<string, Array<string | number>>,\n originalFallbacks: ServiceFallbacks | undefined,\n _prunedFallbacks: ServiceFallbacks | undefined,\n fieldById: Map<string, Field>,\n visibleFieldIds: string[],\n selection: BuildOrderSelection,\n): OrderSnapshot[\"warnings\"] | undefined {\n const out: OrderSnapshot[\"warnings\"] = {};\n\n // Fallback diagnostics (non-fatal). Call only if a global helper is present at runtime.\n const maybeCollectFailed:\n | ((\n p: ServiceProps,\n sm: DgpServiceMap,\n s: { mode: \"dev\" },\n ) => FallbackDiagnostics[])\n | undefined = (globalThis as any).collectFailedFallbacks;\n\n try {\n if (maybeCollectFailed && originalFallbacks) {\n const diags = maybeCollectFailed(\n {\n ...props,\n fallbacks: originalFallbacks,\n } as ServiceProps,\n svcMap,\n { mode: \"dev\" },\n );\n if (diags && diags.length) {\n out.fallbacks = diags;\n }\n }\n } catch {\n // ignore diagnostics failures in dev\n }\n\n // Utility/Form warnings: missing field.name while value present (only for non-option fields)\n const utilityWarnings: Array<{ nodeId: string; reason: string }> = [];\n for (const fid of visibleFieldIds) {\n const f = fieldById.get(fid);\n if (!f) continue;\n const hasVal = selection.formValuesByFieldId[fid] !== undefined;\n if (hasVal && !f.name && !isOptionBased(f)) {\n utilityWarnings.push({\n nodeId: fid,\n reason: \"missing_field_name_for_form_value\",\n });\n }\n }\n if (utilityWarnings.length) {\n (out as any).utility = utilityWarnings;\n }\n\n if (!(out as any).fallbacks && !(out as any).utility) return undefined;\n return out;\n}\n\n/* ───────────────── Mapping: internal settings → SnapshotContext.policy ───────────────── */\n\nfunction toSnapshotPolicy(settings: FallbackSettings): {\n ratePolicy: { kind: \"lte_primary\" | \"none\"; thresholdPct?: number };\n requireConstraintFit: boolean;\n} {\n const requireConstraintFit = settings.requireConstraintFit ?? true;\n const rp = settings.ratePolicy ?? { kind: \"lte_primary\" as const };\n\n // Map our richer rate policies to the wire-level policy your server expects\n switch (rp.kind) {\n case \"lte_primary\":\n return {\n ratePolicy: { kind: \"lte_primary\" },\n requireConstraintFit,\n };\n case \"within_pct\":\n return {\n ratePolicy: {\n kind: \"lte_primary\",\n thresholdPct: Math.max(0, rp.pct ?? 0),\n },\n requireConstraintFit,\n };\n case \"at_least_pct_lower\":\n // No direct encoding at wire-level; fall back to strict lte (server can still enforce stronger rule)\n return {\n ratePolicy: { kind: \"lte_primary\" },\n requireConstraintFit,\n };\n default:\n return {\n ratePolicy: { kind: \"lte_primary\" },\n requireConstraintFit,\n };\n }\n}\n\ntype ServiceIdRef = string | number;\n\nfunction getCap(\n map: DgpServiceMap,\n id: ServiceIdRef,\n): DgpServiceCapability | undefined {\n const direct: DgpServiceCapability | undefined = (map as any)[id];\n if (direct) return direct;\n\n const strKey = String(id);\n const byStr: DgpServiceCapability | undefined = (map as any)[strKey];\n if (byStr) return byStr;\n\n const n =\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 resolveMinMax(\n servicesList: Array<string | number>,\n services: DgpServiceMap,\n): { min: number; max?: number } {\n let min: number | undefined = undefined;\n let max: number | undefined = undefined;\n\n for (const sid of servicesList) {\n const cap = getCap(services, sid);\n if (!cap) continue;\n\n if (typeof cap.min === \"number\" && Number.isFinite(cap.min)) {\n min = min === undefined ? cap.min : Math.min(min, cap.min);\n }\n if (typeof cap.max === \"number\" && Number.isFinite(cap.max)) {\n max = max === undefined ? cap.max : Math.max(max, cap.max);\n }\n }\n\n return { min: min ?? 1, ...(max !== undefined ? { max } : {}) };\n}\n","// src/core/policy.ts\nimport type { DynamicRule, ValidatorOptions } from \"@/schema/validation\";\n\nexport type PolicyDiagnostic = {\n ruleIndex: number;\n ruleId?: string;\n severity: \"error\" | \"warning\";\n message: string;\n path?: string; // e.g. \"filter.role\", \"op\"\n};\n\nconst ALLOWED_SCOPES = new Set<DynamicRule[\"scope\"]>([\n \"global\",\n \"visible_group\",\n]);\nconst ALLOWED_SUBJECTS = new Set<DynamicRule[\"subject\"]>([\"services\"]);\nconst ALLOWED_OPS = new Set<DynamicRule[\"op\"]>([\n \"all_equal\",\n \"unique\",\n \"no_mix\",\n \"all_true\",\n \"any_true\",\n \"max_count\",\n \"min_count\",\n]);\nconst ALLOWED_ROLES = new Set<NonNullable<DynamicRule[\"filter\"]>[\"role\"]>([\n \"base\",\n \"utility\",\n \"both\",\n]);\nconst ALLOWED_SEVERITIES = new Set<NonNullable<DynamicRule[\"severity\"]>>([\n \"error\",\n \"warning\",\n]);\n\nconst ALLOWED_WHERE_OPS = new Set<\n NonNullable<NonNullable<DynamicRule[\"filter\"]>[\"where\"]>[number][\"op\"]\n>([\"eq\", \"neq\", \"in\", \"nin\", \"exists\", \"truthy\", \"falsy\"]);\n\ntype WhereClause = NonNullable<\n NonNullable<DynamicRule[\"filter\"]>[\"where\"]\n>[number];\n\nfunction normaliseWhere(\n src: unknown,\n d: PolicyDiagnostic[],\n i: number,\n id: string,\n): WhereClause[] | undefined {\n if (src === undefined) return undefined;\n if (!Array.isArray(src)) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: \"filter.where must be an array; ignored.\",\n path: \"filter.where\",\n });\n return undefined;\n }\n\n const out: WhereClause[] = [];\n\n src.forEach((raw, j) => {\n const obj: any = raw && typeof raw === \"object\" ? raw : null;\n const path: string | undefined =\n typeof obj?.path === \"string\" && obj.path.trim()\n ? obj.path.trim()\n : undefined;\n\n if (!path) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: `filter.where[${j}].path must be a non-empty string; entry ignored.`,\n path: `filter.where[${j}].path`,\n });\n return;\n }\n\n if (!path.startsWith(\"service.\")) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: `filter.where[${j}].path should start with \"service.\" for subject \"services\".`,\n path: `filter.where[${j}].path`,\n });\n }\n\n const opRaw: unknown = obj?.op;\n const op: WhereClause[\"op\"] =\n opRaw === undefined\n ? \"eq\"\n : typeof opRaw === \"string\" &&\n ALLOWED_WHERE_OPS.has(opRaw as any)\n ? (opRaw as any)\n : \"eq\";\n\n if (\n opRaw !== undefined &&\n !(typeof opRaw === \"string\" && ALLOWED_WHERE_OPS.has(opRaw as any))\n ) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: `Unknown filter.where[${j}].op; defaulted to \"eq\".`,\n path: `filter.where[${j}].op`,\n });\n }\n\n const value: unknown = obj?.value;\n\n // validate value requirements lightly (non-fatal)\n if (op === \"exists\" || op === \"truthy\" || op === \"falsy\") {\n if (value !== undefined) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: `filter.where[${j}] op \"${op}\" does not use \"value\".`,\n path: `filter.where[${j}].value`,\n });\n }\n } else if (op === \"in\" || op === \"nin\") {\n if (!Array.isArray(value)) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: `filter.where[${j}] op \"${op}\" expects an array \"value\".`,\n path: `filter.where[${j}].value`,\n });\n }\n }\n\n out.push({ path, op, value });\n });\n\n return out.length ? out : undefined;\n}\n\n/**\n * Compile & validate arbitrary JSON into DynamicRule[] with defaults:\n * - scope: (default) \"visible_group\"\n * - subject: (default) \"services\"\n * - filter.role: (default) \"both\"\n * - severity: (default) \"error\"\n * - projection: (default) \"service.id\"\n *\n * Returns normalized rules + diagnostics (errors/warnings).\n */\nexport function compilePolicies(raw: unknown): {\n policies: DynamicRule[];\n diagnostics: PolicyDiagnostic[];\n} {\n const diagnostics: PolicyDiagnostic[] = [];\n const policies: DynamicRule[] = [];\n\n if (!Array.isArray(raw)) {\n diagnostics.push({\n ruleIndex: -1,\n severity: \"error\",\n message: \"Policies root must be an array.\",\n });\n return { policies, diagnostics };\n }\n\n raw.forEach((entry, i) => {\n const d: PolicyDiagnostic[] = [];\n const src = entry && typeof entry === \"object\" ? (entry as any) : {};\n\n let id: string | undefined =\n typeof src.id === \"string\" && src.id.trim()\n ? src.id.trim()\n : undefined;\n\n // id default\n if (!id) {\n id = `policy_${i + 1}`;\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: 'Missing \"id\"; generated automatically.',\n path: \"id\",\n });\n }\n\n // ✅ label: required by DynamicRule; default to id\n const label: string =\n typeof src.label === \"string\" && src.label.trim()\n ? src.label.trim()\n : id;\n\n if (!(typeof src.label === \"string\" && src.label.trim())) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: 'Missing \"label\"; defaulted to rule id.',\n path: \"label\",\n });\n }\n\n // scope default + validation\n let scope: DynamicRule[\"scope\"] = ALLOWED_SCOPES.has(src.scope)\n ? src.scope\n : src.scope === undefined\n ? \"visible_group\"\n : \"visible_group\";\n if (src.scope !== undefined && !ALLOWED_SCOPES.has(src.scope)) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: 'Unknown \"scope\"; defaulted to \"visible_group\".',\n path: \"scope\",\n });\n }\n\n // subject default + validation\n let subject: DynamicRule[\"subject\"] = ALLOWED_SUBJECTS.has(src.subject)\n ? src.subject\n : \"services\";\n if (src.subject !== undefined && !ALLOWED_SUBJECTS.has(src.subject)) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: 'Unknown \"subject\"; defaulted to \"services\".',\n path: \"subject\",\n });\n }\n\n // op required & valid\n const op: DynamicRule[\"op\"] = src.op;\n if (!ALLOWED_OPS.has(op)) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"error\",\n message: `Invalid \"op\": ${String(op)}.`,\n path: \"op\",\n });\n }\n\n // projection default\n let projection: string | undefined =\n typeof src.projection === \"string\" && src.projection.trim()\n ? src.projection.trim()\n : \"service.id\";\n\n // For services subject, encourage service.* projection\n if (\n subject === \"services\" &&\n projection &&\n !projection.startsWith(\"service.\")\n ) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message:\n 'Projection should start with \"service.\" for subject \"services\".',\n path: \"projection\",\n });\n }\n\n const filterSrc =\n src.filter && typeof src.filter === \"object\"\n ? (src.filter as DynamicRule[\"filter\"])\n : undefined;\n\n const role: NonNullable<DynamicRule[\"filter\"]>[\"role\"] =\n filterSrc?.role && ALLOWED_ROLES.has(filterSrc.role)\n ? filterSrc.role\n : \"both\";\n\n if (filterSrc?.role && !ALLOWED_ROLES.has(filterSrc.role)) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: 'Unknown filter.role; defaulted to \"both\".',\n path: \"filter.role\",\n });\n }\n\n const filter: DynamicRule[\"filter\"] | undefined = {\n role,\n tag_id:\n filterSrc?.tag_id !== undefined\n ? Array.isArray(filterSrc.tag_id)\n ? filterSrc.tag_id\n : [filterSrc.tag_id]\n : undefined,\n field_id:\n filterSrc?.field_id !== undefined\n ? Array.isArray(filterSrc.field_id)\n ? filterSrc.field_id\n : [filterSrc.field_id]\n : undefined,\n where: normaliseWhere((filterSrc as any)?.where, d, i, id),\n };\n\n // severity default\n const severity: NonNullable<DynamicRule[\"severity\"]> =\n ALLOWED_SEVERITIES.has(src.severity) ? src.severity : \"error\";\n if (\n src.severity !== undefined &&\n !ALLOWED_SEVERITIES.has(src.severity)\n ) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: 'Unknown \"severity\"; defaulted to \"error\".',\n path: \"severity\",\n });\n }\n\n // value requirements by op\n const value = src.value;\n if (op === \"max_count\" || op === \"min_count\") {\n if (!(typeof value === \"number\" && Number.isFinite(value))) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"error\",\n message: `\"${op}\" requires numeric \"value\".`,\n path: \"value\",\n });\n }\n } else if (op === \"all_true\" || op === \"any_true\") {\n if (value !== undefined) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: `\"${op}\" ignores \"value\"; it checks all/any true.`,\n path: \"value\",\n });\n }\n } else {\n if (value !== undefined) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: `\"${op}\" does not use \"value\".`,\n path: \"value\",\n });\n }\n }\n\n // assemble rule if no fatal (error-level) diagnostics for op/value\n const hasFatal = d.some((x) => x.severity === \"error\");\n if (!hasFatal) {\n const rule: DynamicRule = {\n id,\n label, // ✅ now always present\n scope,\n subject,\n filter,\n projection,\n op,\n value: value as any,\n severity,\n message:\n typeof src.message === \"string\" ? src.message : undefined,\n };\n policies.push(rule);\n }\n\n diagnostics.push(...d);\n });\n\n return { policies, diagnostics };\n}\n\n/** Split diagnostics for convenience in UI */\nexport function splitPolicyDiagnostics(diags: PolicyDiagnostic[]): {\n errors: PolicyDiagnostic[];\n warnings: PolicyDiagnostic[];\n} {\n return {\n errors: diags.filter((d) => d.severity === \"error\"),\n warnings: diags.filter((d) => d.severity === \"warning\"),\n };\n}\n\n/**\n * Convenience helper: compile policies and pass to validator options.\n * You can use this in your editor before calling validate().\n */\nexport function withCompiledPolicies(\n opts: ValidatorOptions,\n rawPolicies: unknown,\n): { opts: ValidatorOptions; diagnostics: PolicyDiagnostic[] } {\n const { policies, diagnostics } = compilePolicies(rawPolicies);\n return { opts: { ...opts, policies }, diagnostics };\n}\n","// src/react/canvas/selection.ts\nimport type { Builder } from \"@/core\";\nimport type { Field, PricingRole, ServiceProps, Tag } from \"@/schema\";\nimport type { DgpServiceCapability } from \"@/schema/provider\";\n\nexport type Env = \"client\" | \"workspace\";\n\nexport type VisibleGroup = {\n tagId?: string;\n tag?: Tag;\n fields: Field[];\n fieldIds: string[];\n parentTags?: Tag[];\n childrenTags?: Tag[];\n /** In order of selection: tag base (unless overridden) then selected options */\n services?: DgpServiceCapability[];\n};\n\n// Returned by visibleGroup():\nexport type VisibleGroupResult =\n | { kind: \"single\"; group: VisibleGroup }\n | { kind: \"multi\"; groups: string[] };\n\ntype ChangeEvt = { ids: string[]; primary?: string };\ntype Listener = (e: ChangeEvt) => void;\n\nexport type SelectionOptions = {\n env?: Env;\n rootTagId?: string;\n /** Resolve service capability from an id (used for `services` array) */\n resolveService?: (id: any) => DgpServiceCapability | undefined;\n};\n\nexport class Selection {\n private set = new Set<string>();\n private primaryId: string | undefined;\n private currentTagId: string | undefined;\n private onChangeFns: Listener[] = [];\n\n constructor(\n private readonly builder: Builder,\n private readonly opts: SelectionOptions,\n ) {}\n\n // ── Public mutators ──────────────────────────────────────────────────────\n replace(id?: string | null) {\n if (!id) return this.clear();\n this.set.clear();\n this.set.add(id);\n this.primaryId = id;\n this.updateCurrentTagFrom(id);\n this.emit();\n }\n\n add(id: string) {\n this.set.add(id);\n this.primaryId = id;\n this.updateCurrentTagFrom(id);\n this.emit();\n }\n\n remove(id: string) {\n if (!this.set.delete(id)) return;\n if (this.primaryId === id) {\n this.primaryId = this.set.values().next().value;\n if (this.primaryId) this.updateCurrentTagFrom(this.primaryId);\n }\n this.emit();\n }\n\n toggle(id: string) {\n if (this.set.has(id)) this.remove(id);\n else this.add(id);\n }\n\n many(ids: Iterable<string>, primary?: string) {\n this.set = new Set(ids);\n this.primaryId = primary ?? this.set.values().next().value;\n if (this.primaryId) this.updateCurrentTagFrom(this.primaryId);\n this.emit();\n }\n\n clear() {\n if (!this.set.size && !this.primaryId) return;\n this.set.clear();\n this.primaryId = undefined;\n this.emit();\n }\n\n // ── Read APIs ────────────────────────────────────────────────────────────\n all(): ReadonlySet<string> {\n return this.set;\n }\n\n has(id: string): boolean {\n return this.set.has(id);\n }\n\n primary(): string | undefined {\n return this.primaryId;\n }\n\n currentTag(): string | undefined {\n return this.currentTagId;\n }\n\n onChange(fn: Listener): () => void {\n this.onChangeFns.push(fn);\n return () => {\n const i = this.onChangeFns.indexOf(fn);\n if (i >= 0) this.onChangeFns.splice(i, 1);\n };\n }\n\n // ── Main: visible group snapshot (env-aware) ─────────────────────────────\n visibleGroup(): VisibleGroupResult {\n const props = this.builder.getProps() as ServiceProps;\n\n // WORKSPACE: >1 tag selected → return raw selection set\n if ((this.opts.env ?? \"client\") === \"workspace\") {\n const tagIds = Array.from(this.set).filter(this.builder.isTagId.bind(this.builder));\n if (tagIds.length > 1) {\n return { kind: \"multi\", groups: Array.from(this.set) };\n }\n }\n\n const tagId = this.resolveTagContextId(props);\n if (!tagId)\n return { kind: \"single\", group: { fields: [], fieldIds: [] } };\n\n const group = this.computeGroupForTag(props, tagId);\n return { kind: \"single\", group };\n }\n\n // ── Internals ────────────────────────────────────────────────────────────\n private emit() {\n const payload: ChangeEvt = {\n ids: Array.from(this.set),\n primary: this.primaryId,\n };\n for (const fn of this.onChangeFns) fn(payload);\n }\n\n private updateCurrentTagFrom(id: string) {\n const props = this.builder.getProps() as ServiceProps;\n const tags = props.filters ?? [];\n const fields = props.fields ?? [];\n\n if (tags.some((t) => t.id === id)) {\n this.currentTagId = id;\n return;\n }\n const f = fields.find((x) => x.id === id);\n if (f?.bind_id) {\n this.currentTagId = Array.isArray(f.bind_id)\n ? f.bind_id[0]\n : f.bind_id;\n return;\n }\n\n if (this.builder.isOptionId(id)) {\n const host = fields.find((x) =>\n (x.options ?? []).some((o) => o.id === id),\n );\n if (host?.bind_id) {\n this.currentTagId = Array.isArray(host.bind_id)\n ? host.bind_id[0]\n : host.bind_id;\n return;\n }\n }\n\n if (id.includes(\"::\")) {\n const [fid] = id.split(\"::\");\n const host = fields.find((x) => x.id === fid);\n if (host?.bind_id) {\n this.currentTagId = Array.isArray(host.bind_id)\n ? host.bind_id[0]\n : host.bind_id;\n return;\n }\n }\n }\n\n private resolveTagContextId(props: ServiceProps): string | undefined {\n if (this.currentTagId) return this.currentTagId;\n\n for (const id of this.set) if (this.builder.isTagId(id)) return id;\n\n const fields = props.fields ?? [];\n for (const id of this.set) {\n const f = fields.find((x) => x.id === id);\n if (f?.bind_id)\n return Array.isArray(f.bind_id) ? f.bind_id[0] : f.bind_id;\n }\n\n for (const id of this.set) {\n if (this.builder.isOptionId(id)) {\n const host = fields.find((x) =>\n (x.options ?? []).some((o) => o.id === id),\n );\n if (host?.bind_id)\n return Array.isArray(host.bind_id)\n ? host.bind_id[0]\n : host.bind_id;\n }\n if (id.includes(\"::\")) {\n const [fid] = id.split(\"::\");\n const host = fields.find((x) => x.id === fid);\n if (host?.bind_id)\n return Array.isArray(host.bind_id)\n ? host.bind_id[0]\n : host.bind_id;\n }\n }\n\n return this.opts.rootTagId;\n }\n\n private selectedButtonTriggerIds(props: ServiceProps): string[] {\n const fields = props.fields ?? [];\n const fieldById = new Map(fields.map((f) => [f.id, f]));\n\n const out: string[] = [];\n for (const selId of this.set) {\n // option ids are triggers\n if (selId.startsWith(\"o:\")) {\n out.push(selId);\n continue;\n }\n\n // field ids are triggers ONLY if the field is a button\n const f = fieldById.get(selId);\n if (f?.button === true) out.push(selId);\n }\n\n return out;\n }\n\n private computeGroupForTag(\n props: ServiceProps,\n tagId: string,\n ): VisibleGroup {\n const tags = props.filters ?? [];\n const fields = props.fields ?? [];\n const tagById = new Map(tags.map((t) => [t.id, t]));\n const tag = tagById.get(tagId);\n\n // ---- delegate visible fields to builder\n const selectedTriggerIds = this.selectedButtonTriggerIds(props);\n const fieldIds = this.builder.visibleFields(tagId, selectedTriggerIds);\n\n const fieldById = new Map(fields.map((f) => [f.id, f]));\n const visible = fieldIds\n .map((id) => fieldById.get(id))\n .filter(Boolean) as Field[];\n\n // ---- ancestry & immediate children (unchanged)\n const parentTags: Tag[] = [];\n let cur = tag?.bind_id;\n const guard = new Set<string>();\n while (cur && !guard.has(cur)) {\n const t = tagById.get(cur);\n if (!t) break;\n parentTags.push(t);\n guard.add(cur);\n cur = t.bind_id;\n }\n const childrenTags = tags.filter((t) => t.bind_id === tagId);\n\n // ---- services: tag base (unless overridden) → selected OPTIONs + selected BUTTON FIELDs (in insertion order)\n const services: DgpServiceCapability[] = [];\n const resolve = this.opts.resolveService;\n\n // 1) tag base\n let baseAddedFromTag = false;\n if (tag?.service_id != null) {\n services.push(\n resolve?.(tag.service_id) ??\n ({ id: tag.service_id } as DgpServiceCapability),\n );\n baseAddedFromTag = true;\n }\n\n // 2) walk selected ids in insertion order\n let baseOverridden = false;\n for (const selId of this.set) {\n // OPTION selected\n const opt = this.findOptionById(fields, selId);\n if (opt?.service_id != null) {\n const role = (opt.pricing_role ?? \"base\") as PricingRole;\n const cap =\n resolve?.(opt.service_id) ??\n ({ id: opt.service_id } as DgpServiceCapability);\n\n baseOverridden = this.addServiceByRole(\n services,\n cap,\n role,\n baseAddedFromTag,\n baseOverridden,\n );\n continue;\n }\n\n // BUTTON FIELD selected\n const f = fieldById.get(selId);\n if (f?.button === true && f.service_id != null) {\n const role = (f.pricing_role ?? \"base\") as PricingRole;\n const cap =\n resolve?.(f.service_id) ??\n ({ id: f.service_id } as DgpServiceCapability);\n\n baseOverridden = this.addServiceByRole(\n services,\n cap,\n role,\n baseAddedFromTag,\n baseOverridden,\n );\n }\n }\n\n return {\n tagId,\n tag,\n fields: visible,\n fieldIds,\n parentTags,\n childrenTags,\n services,\n };\n }\n\n private addServiceByRole(\n services: DgpServiceCapability[],\n cap: DgpServiceCapability,\n role: PricingRole,\n baseAddedFromTag: boolean,\n baseOverridden: boolean,\n ): boolean {\n if (role === \"base\") {\n if (!baseOverridden) {\n if (baseAddedFromTag && services.length > 0) {\n services[0] = cap;\n } else {\n services.unshift(cap);\n }\n return true;\n } else {\n services.push(cap);\n }\n } else {\n services.push(cap);\n }\n return baseOverridden;\n }\n\n private findOptionById(fields: Field[], selId: string) {\n if (this.builder.isOptionId(selId)) {\n for (const f of fields) {\n const o = f.options?.find((x) => x.id === selId);\n if (o) return o;\n }\n }\n if (selId.includes(\"::\")) {\n const [fid, oid] = selId.split(\"::\");\n const f = fields.find((x) => x.id === fid);\n const o = f?.options?.find((x) => x.id === oid || x.id === selId);\n if (o) return o;\n }\n return undefined;\n }\n}\n","import { EventBus } from \"@/react\";\nimport type {\n CanvasEvents,\n CanvasOptions,\n CanvasState,\n DraftWire,\n NodePositions,\n Viewport,\n} from \"@/schema/canvas-types\";\nimport type { Builder } from \"@/core\";\nimport type { EdgeKind, GraphSnapshot } from \"@/schema/graph\";\nimport { CommentsAPI } from \"./comments\";\nimport { CanvasBackendOptions } from \"./backend\";\nimport { Editor } from \"./editor\";\nimport { Selection } from \"./selection\";\nimport type { BackendScope } from \"@/react/workspace/context/backend\";\n\nexport class CanvasAPI {\n private bus = new EventBus<CanvasEvents>();\n private readonly state: CanvasState;\n public readonly builder: Builder;\n public readonly editor: Editor;\n private readonly autoEmit: boolean;\n readonly comments: CommentsAPI;\n readonly selection: Selection;\n\n constructor(\n builder: Builder,\n opts: CanvasOptions & CanvasBackendOptions = {},\n ) {\n this.builder = builder;\n this.autoEmit = opts.autoEmitState ?? true;\n this.selection = new Selection(builder, {\n env: \"workspace\",\n rootTagId: \"t:root\",\n });\n\n const graph = builder.tree();\n this.state = {\n graph,\n positions: {},\n selection: new Set(),\n highlighted: new Set(),\n viewport: { x: 0, y: 0, zoom: 1, ...opts.initialViewport },\n version: 1,\n };\n\n this.selection.onChange(({ ids }) => {\n // mirror into CanvasState for snapshot/versioning consumers\n this.state.selection = new Set(ids);\n this.bump();\n\n // keep existing event contract\n this.bus.emit(\"selection:change\", { ids });\n\n // keep existing auto-emit behaviour\n if (this.autoEmit) this.bus.emit(\"state:change\", this.snapshot());\n });\n\n // compose comments with backend (if provided)\n const scopeProvider: (() => BackendScope | undefined) | undefined =\n (opts as unknown as { getScope?: () => BackendScope | undefined })\n .getScope ??\n (() => {\n const anyOpts = opts as unknown as Partial<{\n workspaceId: string;\n actorId: string;\n branchId: string;\n }>;\n\n if (\n !anyOpts.workspaceId ||\n !anyOpts.actorId ||\n !anyOpts.branchId\n ) {\n return undefined;\n }\n\n return {\n workspaceId: anyOpts.workspaceId,\n actorId: anyOpts.actorId,\n branchId: anyOpts.branchId,\n };\n });\n\n this.comments = new CommentsAPI(this.bus, {\n backend: opts.backend?.comments,\n getScope: scopeProvider,\n });\n\n this.editor = new Editor(builder, this, {\n serviceMap: builder.getServiceMap(),\n serviceExists: (id) => builder.getServiceMap().hasOwnProperty(id),\n ...opts,\n });\n\n if (this.autoEmit) this.bus.emit(\"state:change\", this.snapshot());\n }\n\n /* ─── Events ─────────────────────────────────────────────── */\n on = this.bus.on.bind(this.bus);\n once = this.bus.once.bind(this.bus);\n\n public emit<K extends keyof CanvasEvents>(\n event: K,\n payload: CanvasEvents[K],\n ): void {\n this.bus.emit(event, payload);\n }\n\n /* ─── State accessors ───────────────────────────────────── */\n snapshot(): CanvasState {\n // return an immutable-looking view\n return {\n ...this.state,\n selection: new Set(this.state.selection),\n highlighted: new Set(this.state.highlighted),\n graph: {\n nodes: [...this.state.graph.nodes],\n edges: [...this.state.graph.edges],\n },\n positions: { ...this.state.positions },\n };\n }\n\n getGraph(): GraphSnapshot {\n return this.state.graph;\n }\n\n getSelection(): string[] {\n return Array.from(this.state.selection);\n }\n\n getViewport(): Viewport {\n return { ...this.state.viewport };\n }\n\n /* ─── Graph lifecycle ───────────────────────────────────── */\n refreshGraph(): void {\n this.state.graph = this.builder.tree();\n this.bump();\n this.bus.emit(\"graph:update\", this.state.graph);\n }\n\n setPositions(pos: NodePositions): void {\n this.state.positions = { ...this.state.positions, ...pos };\n this.bump();\n }\n\n setPosition(id: string, x: number, y: number): void {\n this.state.positions[id] = { x, y };\n this.bump();\n }\n\n /* ─── Selection ─────────────────────────────────────────── */\n select(ids: string[] | Set<string>): void {\n this.selection.many(ids);\n }\n\n addToSelection(ids: string[] | Set<string>): void {\n const next = new Set(this.selection.all());\n let primary: string | undefined;\n\n for (const id of ids as any) {\n next.add(id);\n primary = id;\n }\n\n this.selection.many(next, primary);\n }\n\n toggleSelection(id: string): void {\n this.selection.toggle(id);\n }\n\n clearSelection(): void {\n this.selection.clear();\n }\n\n selectComments(threadId?: string): void {\n this.bus.emit(\"comment:select\", { threadId });\n }\n\n /* ─── Highlight / Hover ─────────────────────────────────── */\n setHighlighted(ids: string[] | Set<string>): void {\n this.state.highlighted = new Set(ids as any);\n this.bump();\n }\n\n setHover(id?: string): void {\n this.state.hoverId = id;\n this.bump();\n this.bus.emit(\"hover:change\", { id });\n }\n\n /* ─── Viewport ──────────────────────────────────────────── */\n setViewport(v: Partial<Viewport>): void {\n this.state.viewport = { ...this.state.viewport, ...v };\n this.bump();\n this.bus.emit(\"viewport:change\", this.getViewport());\n }\n\n /* ─── Wiring draft (for bind/include/exclude UX) ────────── */\n startWire(from: string, kind: DraftWire[\"kind\"]): void {\n this.state.draftWire = { from, kind };\n this.bump();\n this.bus.emit(\"wire:preview\", { from, kind });\n }\n\n previewWire(to?: string): void {\n const dw = this.state.draftWire;\n if (!dw) return;\n this.bus.emit(\"wire:preview\", { from: dw.from, to, kind: dw.kind });\n }\n\n commitWire(to: string): void {\n const dw = this.state.draftWire;\n if (!dw) return;\n // Headless API emits; the adapter/host decides how to mutate Builder\n this.bus.emit(\"wire:commit\", { from: dw.from, to, kind: dw.kind });\n this.state.draftWire = undefined;\n this.bump();\n }\n\n cancelWire(): void {\n const dw = this.state.draftWire;\n if (!dw) return;\n this.bus.emit(\"wire:cancel\", { from: dw.from });\n this.state.draftWire = undefined;\n this.bump();\n }\n\n /* ─── Utilities ─────────────────────────────────────────── */\n private bump(): void {\n this.state.version++;\n if (this.autoEmit) this.bus.emit(\"state:change\", this.snapshot());\n }\n\n dispose(): void {\n this.bus.clear();\n }\n\n undo() {\n this.builder.undo();\n this.refreshGraph();\n }\n\n private edgeRel: EdgeKind = \"bind\";\n\n getEdgeRel(): EdgeKind {\n return this.edgeRel;\n }\n\n public setEdgeRel(rel: EdgeKind) {\n if (this.edgeRel === rel) return; // ← correct: skip only if identical\n this.edgeRel = rel;\n this.bus.emit(\"edge:change\", rel);\n }\n\n /* ─── Option-node visibility (per field) ───────────────────────────────── */\n\n /** Internal mirror of which fields should show their options as nodes. */\n private shownOptionFields = new Set<string>();\n\n /** Return the field ids whose options are currently set to be visible as nodes. */\n getShownOptionFields(): string[] {\n return Array.from(this.shownOptionFields);\n }\n\n /** True if this field’s options are shown as nodes. */\n isFieldOptionsShown(fieldId: string): boolean {\n return this.shownOptionFields.has(String(fieldId));\n }\n\n /**\n * Set visibility of option nodes for a field, then rebuild the graph.\n * When shown = true, the Builder will emit option nodes for this field.\n */\n setFieldOptionsShown(fieldId: string, shown: boolean): void {\n const id = String(fieldId);\n const before = this.shownOptionFields.has(id);\n if (shown && !before) this.shownOptionFields.add(id);\n else if (!shown && before) this.shownOptionFields.delete(id);\n else return; // no-op\n\n // Push to builder options and refresh\n this.builder.setOptions({\n showOptionNodes: new Set(this.shownOptionFields),\n });\n this.refreshGraph();\n }\n\n /** Toggle option-node visibility for a field. Returns the new visibility. */\n toggleFieldOptions(fieldId: string): boolean {\n const next = !this.isFieldOptionsShown(fieldId);\n this.setFieldOptionsShown(fieldId, next);\n return next;\n }\n\n /**\n * Replace the whole set of fields whose options are visible as nodes.\n * Useful for restoring a saved UI state.\n */\n setShownOptionFields(ids: Iterable<string>): void {\n const next = new Set(Array.from(ids, String));\n // Fast-path: if identical set, skip work\n if (\n next.size === this.shownOptionFields.size &&\n Array.from(next).every((id) => this.shownOptionFields.has(id))\n ) {\n return;\n }\n this.shownOptionFields = next;\n this.builder.setOptions({\n showOptionNodes: new Set(this.shownOptionFields),\n });\n this.refreshGraph();\n }\n\n getConstraints() {\n return this.builder.getConstraints();\n }\n\n getServiceProps() {\n return this.builder.getProps();\n }\n}\n","// src/react/inputs/form-context.tsx\nimport type { ReactNode } from \"react\";\nimport * as React from \"react\";\n\nimport type { CoreContext } from \"@timeax/form-palette\";\nimport { Form, useCore } from \"@timeax/form-palette\";\n\ntype Dict = Record<string, unknown>;\n\nexport type FormSnapshot = Dict\n\nexport type FormApi = {\n /** Value by fieldId (Wrapper uses name=field.id) */\n get: (fieldId: string) => unknown;\n /**\n * Programmatic set (NOT used by Wrapper).\n * If the field is mounted, writes into the core.\n * If not mounted, persists into core.bucket (via core.setValue) or local bag fallback.\n */\n set: (fieldId: string, value: unknown) => void;\n\n /** Option selections (legacy; kept for compatibility) */\n getSelections: (fieldId: string) => string[];\n setSelections: (fieldId: string, optionIds: string[]) => void;\n toggleSelection: (fieldId: string, optionId: string) => void;\n removeSelectionToken(token: string): void;\n\n /** Read-only snapshot for debugging (NO validation) */\n snapshot: () => FormSnapshot;\n\n /** Simple subscribe (re-render triggers) */\n subscribe: (fn: () => void) => () => void;\n\n /**\n * Validation gate:\n * local submit runs validation and returns mounted/visible values.\n * (This is NOT “submitting to a server”.)\n */\n submit: () => { values: Dict; valid: boolean };\n};\n\nconst Ctx = React.createContext<FormApi | null>(null);\n\nexport function useFormApi(): FormApi {\n const v = React.useContext(Ctx);\n if (!v) throw new Error(\"useFormApi must be used within <FormProvider />\");\n return v;\n}\n\nexport function useOptionalFormApi(): FormApi | null {\n return React.useContext(Ctx);\n}\n\nexport type FormProviderProps = {\n children: ReactNode;\n\n /** Optional schema (zod/jsonschema/etc, depending on your palette build) */\n schema?: any;\n\n /**\n * Same shape as the old OrderFlowProvider usage.\n * - values: seed values (persisted/rehydrated)\n * - selections: legacy (kept for compatibility)\n */\n initial?: {\n values?: Dict;\n selections?: Record<string, string[]>;\n };\n\n /**\n * Called on every palette update (values bag).\n * Use to persist anywhere (state/localStorage/etc).\n */\n onUpdate?: (vals: Dict) => void;\n};\n\nexport function FormProvider({\n children,\n schema,\n initial,\n onUpdate,\n}: FormProviderProps) {\n // Indefinite memory (we keep values even when fields unmount)\n const [bag, setBag] = React.useState<Dict>(() => ({\n ...(initial?.values ?? {}),\n }));\n\n // Legacy selections (compat only)\n const [selectionsBag, setSelectionsBag] = React.useState<\n Record<string, string[]>\n >(() => ({ ...(initial?.selections ?? {}) }));\n\n // subscribe() support\n const listenersRef = React.useRef(new Set<() => void>());\n const publish = React.useCallback(() => {\n for (const fn of listenersRef.current) fn();\n }, []);\n\n // palette core ref (for submit/values/setValue)\n const coreRef = React.useRef<CoreContext<Dict> | null>(null);\n\n function Bridge() {\n const core = useCore<Dict>();\n\n React.useEffect(() => {\n coreRef.current = core;\n publish();\n return () => {\n coreRef.current = null;\n publish();\n };\n }, [core, publish]);\n\n return null;\n }\n\n const api = React.useMemo<FormApi>(() => {\n return {\n subscribe(fn) {\n listenersRef.current.add(fn);\n return () => listenersRef.current.delete(fn);\n },\n\n get(fieldId) {\n const core = coreRef.current;\n const live =\n (core?.values?.() as Dict | undefined) ?? undefined;\n\n // Prefer live (mounted + bucket), fallback to our indefinite bag\n if (live && fieldId in live) return live[fieldId];\n return bag[fieldId];\n },\n\n set(fieldId, value) {\n const core = coreRef.current;\n\n // Programmatic sets should go through core when possible\n // (core.setValue also persists to bucket when field isn't mounted).\n if (core) {\n core.setValue(fieldId, value);\n return;\n }\n\n // Fallback if core isn't mounted yet\n setBag((prev) => ({ ...prev, [fieldId]: value }));\n publish();\n },\n\n // Legacy selections API (compat; no longer used by the new Wrapper)\n getSelections(fieldId) {\n return selectionsBag[fieldId] ?? [];\n },\n setSelections(fieldId, optionIds) {\n setSelectionsBag((prev) => ({\n ...prev,\n [fieldId]: optionIds ?? [],\n }));\n publish();\n },\n toggleSelection(fieldId, optionId) {\n setSelectionsBag((prev) => {\n const current = new Set(prev[fieldId] ?? []);\n if (current.has(optionId)) current.delete(optionId);\n else current.add(optionId);\n return { ...prev, [fieldId]: Array.from(current) };\n });\n publish();\n },\n removeSelectionToken(token) {\n // token is \"fieldId:optionId\" in the old system; keep best-effort compat\n const [fieldId, optionId] = String(token).split(\":\", 2);\n if (!fieldId || !optionId) return;\n setSelectionsBag((prev) => {\n const current = new Set(prev[fieldId] ?? []);\n current.delete(optionId);\n return { ...prev, [fieldId]: Array.from(current) };\n });\n publish();\n },\n\n snapshot() {\n // IMPORTANT: read-only, NO validation here.\n const core = coreRef.current;\n const live = (core?.values?.() as Dict | undefined) ?? {};\n\n return live\n },\n\n submit() {\n const core = coreRef.current;\n console.log(core);\n if (!core) return { values: {}, valid: false };\n\n // palette submit validates & returns mounted/visible values\n return core.submit() as { values: Dict; valid: boolean };\n },\n };\n }, [bag, selectionsBag, publish]);\n\n return (\n <Ctx.Provider value={api}>\n <Form\n adapter=\"local\"\n schema={schema}\n valueBag={bag}\n formRef={coreRef}\n onUpdate={(vals: any) => {\n const next = (vals ?? {}) as Dict;\n\n // CRITICAL: merge (don’t replace), so unmounted fields keep their values indefinitely\n setBag((prev) => ({ ...prev, ...next }));\n\n onUpdate?.({ ...bag, ...next });\n publish();\n }}\n >\n <Bridge />\n {children}\n </Form>\n </Ctx.Provider>\n );\n}\n","import type React from \"react\";\nimport { Field, ServiceProps, Ui } from \"@/schema\";\n\n/** Matches your InputWrapper’s expectations */\nexport type InputKind = string; // e.g. \"text\", \"number\", \"select\", \"custom:Rating\"\nexport type InputVariant = \"default\" | (string & {});\n/* -------------------------------------------------------------------------- */\n/* Adapter rules (updated meaning) */\n/* - getValue: normalize what host emitted into stored value (for form-palette)*/\n/* - getSelectedOptions: REQUIRED if field.options exists (no guessing) */\n/* - isActive: optional for option-less action buttons */\n/* -------------------------------------------------------------------------- */\n\nexport type AdapterCtx = { field: Field, props: ServiceProps };\n\nexport type Adapter = {\n valueProp?: string;\n changeProp?: string;\n\n /** normalize what the host emitted into what we store in form-palette */\n getValue?: (next: unknown, current: unknown, ctx: AdapterCtx) => unknown;\n\n /** REQUIRED if field.options exists */\n getSelectedOptions?: (\n next: unknown,\n current: unknown,\n ctx: AdapterCtx,\n ) => string[];\n\n /** For option-less action buttons (button: true with no options) */\n isActive?: (stored: unknown, ctx: AdapterCtx) => boolean;\n getInputPropsFromField?: (props: AdapterCtx) => any;\n toValue?: (value: any) => any;\n};\n\nexport type InputDescriptor = {\n Component: React.ComponentType<Record<string, unknown>>;\n adapter?: Adapter;\n defaultProps?: Record<string, unknown>;\n ui?: Record<string, Ui>;\n};\n\ntype VariantMap = Map<InputVariant, InputDescriptor>;\ntype RegistryStore = Map<InputKind, VariantMap>;\n\nexport type Registry = {\n get(kind: InputKind, variant?: InputVariant): InputDescriptor | undefined;\n register(\n kind: InputKind,\n descriptor: InputDescriptor,\n variant?: InputVariant,\n ): void;\n unregister(kind: InputKind, variant?: InputVariant): void;\n registerMany(\n entries: Array<{\n kind: InputKind;\n descriptor: InputDescriptor;\n variant?: InputVariant;\n }>,\n ): void;\n /** low-level escape hatch */\n _store: RegistryStore;\n};\n\nexport function createInputRegistry(): Registry {\n const store: RegistryStore = new Map();\n\n const get = (\n kind: InputKind,\n variant?: InputVariant,\n ): InputDescriptor | undefined => {\n const vm = store.get(kind);\n if (!vm) return undefined;\n const v = (variant ?? \"default\") as InputVariant;\n return vm.get(v) ?? vm.get(\"default\");\n };\n\n const register = (\n kind: InputKind,\n descriptor: InputDescriptor,\n variant?: InputVariant,\n ): void => {\n let vm = store.get(kind);\n if (!vm) {\n vm = new Map<InputVariant, InputDescriptor>();\n store.set(kind, vm);\n }\n vm.set((variant ?? \"default\") as InputVariant, descriptor);\n };\n\n const unregister = (kind: InputKind, variant?: InputVariant): void => {\n const vm = store.get(kind);\n if (!vm) return;\n const key = (variant ?? \"default\") as InputVariant;\n vm.delete(key);\n if (vm.size === 0) store.delete(kind);\n };\n\n const registerMany = (\n entries: Array<{\n kind: InputKind;\n descriptor: InputDescriptor;\n variant?: InputVariant;\n }>,\n ): void => {\n for (const e of entries) register(e.kind, e.descriptor, e.variant);\n };\n\n return { get, register, unregister, registerMany, _store: store };\n}\n\n/** Helper used by InputWrapper */\nexport function resolveInputDescriptor(\n registry: Registry,\n kind: InputKind,\n variant?: InputVariant,\n): InputDescriptor | undefined {\n return registry.get(kind, variant);\n}\n","import React, { createContext, useContext, useMemo } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { createInputRegistry } from \"@/react\";\nimport type {\n Registry,\n InputDescriptor,\n InputKind,\n InputVariant,\n} from \"@/react\";\n\ntype InputsCtxValue = {\n registry: Registry;\n register: (\n kind: InputKind,\n descriptor: InputDescriptor,\n variant?: InputVariant,\n ) => void;\n unregister: (kind: InputKind, variant?: InputVariant) => void;\n registerMany: (\n entries: Array<{\n kind: InputKind;\n descriptor: InputDescriptor;\n variant?: InputVariant;\n }>,\n ) => void;\n};\n\nconst Ctx = createContext<InputsCtxValue | null>(null);\n\nexport function Provider({\n children,\n initialRegistry,\n}: {\n children: ReactNode;\n /** Optional pre-built registry (e.g., you registered built-ins/customs before mounting) */\n initialRegistry?: Registry;\n}) {\n const registry = useMemo(\n () => initialRegistry ?? createInputRegistry(),\n [initialRegistry],\n );\n\n const value = useMemo<InputsCtxValue>(\n () => ({\n registry,\n register: registry.register,\n unregister: registry.unregister,\n registerMany: registry.registerMany,\n }),\n [registry],\n );\n\n return <Ctx.Provider value={value}>{children}</Ctx.Provider>;\n}\n\nexport function useInputs(): InputsCtxValue {\n const v = useContext(Ctx);\n if (!v) throw new Error(\"useInputs() must be used within <InputsProvider>\");\n return v;\n}\n","// src/react/inputs/wrapper.tsx\nimport * as React from \"react\";\nimport { useMemo } from \"react\";\n\nimport { useField } from \"@timeax/form-palette\";\n\nimport type { Field, FieldOption } from \"@/schema\";\nimport type { Scalar } from \"@/schema/order\";\n\nimport type {\n Adapter,\n AdapterCtx,\n InputDescriptor,\n InputKind,\n InputVariant,\n} from \"@/react\";\nimport { resolveInputDescriptor, useInputs } from \"@/react\";\n\nimport { useOrderFlow } from \"@/react/hooks/use-order-flow\";\n\nfunction toKind(field: Field): InputKind {\n return field.type as InputKind;\n}\n\nfunction toVariant(field: Field): InputVariant | undefined {\n const v = (field as any).meta?.variant;\n return typeof v === \"string\" && v.trim() ? (v as InputVariant) : undefined;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Safe templating (no eval) */\n/* -------------------------------------------------------------------------- */\n\nfunction getPath(ctx: Record<string, unknown>, path: string): unknown {\n const parts = path\n .split(\".\")\n .map((p) => p.trim())\n .filter(Boolean);\n\n let cur: any = ctx;\n for (const p of parts) {\n if (cur == null) return undefined;\n cur = cur[p];\n }\n return cur;\n}\n\nfunction parseLiteral(raw: string, ctx: Record<string, unknown>): unknown {\n const s = raw.trim();\n if (!s) return \"\";\n\n if (\n (s.startsWith('\"') && s.endsWith('\"')) ||\n (s.startsWith(\"'\") && s.endsWith(\"'\"))\n ) {\n return s.slice(1, -1);\n }\n\n if (s === \"true\") return true;\n if (s === \"false\") return false;\n\n const n = Number(s);\n if (!Number.isNaN(n) && s !== \"\") return n;\n\n return getPath(ctx, s);\n}\n\nfunction evalMiniExpr(exprRaw: string, ctx: Record<string, unknown>): string {\n const expr = exprRaw.trim();\n\n const idxNullish = expr.indexOf(\"??\");\n const idxOr = expr.indexOf(\"||\");\n\n const splitAt =\n idxNullish >= 0\n ? { idx: idxNullish, op: \"??\" as const }\n : idxOr >= 0\n ? { idx: idxOr, op: \"||\" as const }\n : null;\n\n const left = splitAt ? expr.slice(0, splitAt.idx).trim() : expr;\n const right = splitAt ? expr.slice(splitAt.idx + 2).trim() : \"\";\n\n const leftVal = getPath(ctx, left);\n\n const isTruthy = (v: unknown) => !!v;\n const isNullish = (v: unknown) => v === null || v === undefined;\n\n const chooseFallback =\n splitAt?.op === \"??\"\n ? isNullish(leftVal)\n : splitAt?.op === \"||\"\n ? !isTruthy(leftVal)\n : false;\n\n const chosen = chooseFallback ? parseLiteral(right, ctx) : leftVal;\n\n if (chosen === null || chosen === undefined) return \"\";\n if (\n typeof chosen === \"string\" ||\n typeof chosen === \"number\" ||\n typeof chosen === \"boolean\"\n ) {\n return String(chosen);\n }\n\n try {\n return JSON.stringify(chosen);\n } catch {\n return String(chosen);\n }\n}\n\nfunction templateString(str: string, ctx: Record<string, unknown>): string {\n return str.replace(/\\{([^}]+)}/g, (_m, expr) =>\n evalMiniExpr(String(expr), ctx),\n );\n}\n\nfunction templateDeep<T>(value: T, ctx: Record<string, unknown>): T {\n if (typeof value === \"string\") return templateString(value, ctx) as any;\n if (Array.isArray(value))\n return value.map((v) => templateDeep(v, ctx)) as any;\n\n if (value && typeof value === \"object\") {\n const out: any = {};\n for (const [k, v] of Object.entries(value as any)) {\n out[k] = templateDeep(v, ctx);\n }\n return out;\n }\n\n return value;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Wrapper */\n/* -------------------------------------------------------------------------- */\n\nexport type InputWrapperProps = {\n field: Field;\n disabled?: boolean;\n\n extraProps?: Record<string, unknown>;\n templateStrings?: boolean;\n ctxOverrides?: Record<string, unknown>;\n};\n\nexport function Wrapper({\n field,\n disabled,\n extraProps,\n templateStrings = true,\n ctxOverrides,\n}: InputWrapperProps) {\n const { registry } = useInputs();\n const flow = useOrderFlow();\n\n const kind = toKind(field);\n const variant = toVariant(field);\n\n const descriptor: InputDescriptor | undefined = React.useMemo(\n () => resolveInputDescriptor(registry, kind, variant),\n [kind, registry, variant],\n );\n\n if (!descriptor) {\n // eslint-disable-next-line no-console\n console.warn(\"[Wrapper] No descriptor for\", { kind, variant, field });\n return null;\n }\n\n const Component = descriptor.Component as any;\n const adapter = (descriptor.adapter ?? {}) as Adapter;\n const baseProps = (descriptor.defaultProps ?? {}) as Record<\n string,\n unknown\n >;\n\n const defaultProps = useMemo(() => {\n return { ...baseProps, ...(field.defaults ?? {}) };\n }, [baseProps, field.defaults]);\n\n const valueProp = adapter.valueProp ?? \"value\";\n const changeProp = adapter.changeProp ?? \"onChange\";\n\n const isOptionBased =\n Array.isArray(field.options) && field.options.length > 0;\n\n // action button = option-less button\n const isActionButton = field.button === true && !isOptionBased;\n\n // Register into form-palette:\n // ✅ name is ALWAYS field.id (only name)\n const fp = useField({\n name: field.id,\n required: !!field.required,\n variant: field.type as any,\n defaultValue: field.defaults?.value,\n disabled: !!disabled,\n });\n\n // Option ids allow-list (defensive)\n const optionIds = React.useMemo(() => {\n if (!isOptionBased) return new Set<string>();\n return new Set((field.options ?? []).map((o: FieldOption) => o.id));\n }, [isOptionBased, field.options]);\n\n // Selection syncing bookkeeping\n const prevSelectedRef = React.useRef<string[]>([]);\n React.useEffect(() => {\n prevSelectedRef.current = [];\n }, [field.id]);\n\n const adapterCtx = React.useMemo<AdapterCtx>(\n () => ({ field, props: flow.raw }),\n [field],\n );\n\n const onHostChange = React.useCallback(\n (next: unknown) => {\n const currentStored = (next as any)?.value;\n\n // 1) normalize into stored value\n const stored =\n adapter.getValue?.(next, currentStored, adapterCtx) ??\n currentStored ??\n next;\n\n // 2) write ONLY via form-palette's onChange\n fp.setValue(stored);\n\n // 3) sync visibility triggers to Selection (via order flow)\n if (isOptionBased) {\n if (!adapter.getSelectedOptions) {\n throw new Error(\n `[Wrapper] Adapter for \"${field.id}\" (${field.type}) must implement getSelectedOptions() because this field has options.`,\n );\n }\n\n const rawIds = adapter.getSelectedOptions(\n next,\n stored,\n adapterCtx,\n );\n\n const nextIds = Array.from(\n new Set(\n (rawIds ?? [])\n .map(String)\n .filter((id) => optionIds.has(id)),\n ),\n );\n\n const prev = prevSelectedRef.current;\n prevSelectedRef.current = nextIds;\n\n const prevSet = new Set(prev);\n const nextSet = new Set(nextIds);\n\n // toggle ON\n for (const id of nextIds) {\n if (!prevSet.has(id)) flow.toggleOption(field.id, id);\n }\n\n // toggle OFF\n for (const id of prev) {\n if (!nextSet.has(id)) flow.toggleOption(field.id, id);\n }\n\n return;\n }\n\n if (isActionButton) {\n const isActive =\n adapter.isActive?.(stored, adapterCtx) ?? Boolean(stored);\n if (isActive) flow.toggleOption(field.id);\n else flow.clearField(field.id);\n }\n },\n [\n adapter,\n adapterCtx,\n field.id,\n field.type,\n flow,\n fp,\n isActionButton,\n isOptionBased,\n optionIds,\n ],\n );\n\n // Template context (keep your current behavior)\n const templateCtx = React.useMemo<Record<string, unknown>>(() => {\n const ctxFromInit = (flow as any).init?.ctx ?? {};\n const ctx =\n ctxOverrides && typeof ctxOverrides === \"object\"\n ? { ...(ctxFromInit as any), ...(ctxOverrides as any) }\n : (ctxFromInit as Record<string, unknown>);\n\n return {\n ...ctx,\n field,\n flow,\n value: fp.value,\n error: fp.error,\n };\n }, [ctxOverrides, field, flow, fp.error, fp.value]);\n\n const templatedDefaultProps = React.useMemo(() => {\n if (!templateStrings) return defaultProps;\n return templateDeep(defaultProps as any, templateCtx);\n }, [defaultProps, templateCtx, templateStrings]);\n\n const templatedExtraProps = React.useMemo(() => {\n if (!templateStrings)\n return (extraProps ?? {}) as Record<string, unknown>;\n return templateDeep((extraProps ?? {}) as any, templateCtx);\n }, [extraProps, templateCtx, templateStrings]);\n\n const fieldProps =\n adapter?.getInputPropsFromField?.({ field, props: flow.raw }) ?? {};\n // Build host props\n const hostProps: Record<string, unknown> = {\n id: field.id,\n field,\n disabled: !!disabled || !!fp.disabled,\n\n // DO NOT pass `name` to InputField/entries\n fieldKey: field.id,\n\n ...(fieldProps ?? {}),\n // error channel\n error: fp.error,\n\n ...(templatedDefaultProps ?? {}),\n ...(templatedExtraProps ?? {}),\n };\n\n // value + change wiring\n hostProps[valueProp] = (fp.value ?? null) as Scalar | Scalar[] | null;\n hostProps[changeProp] = onHostChange;\n\n return <Component {...hostProps} />;\n}\n","// src/react/hooks/use-order-flow.ts\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport type { ServiceProps } from \"@/schema\";\nimport type { OrderSnapshot, Scalar } from \"@/schema/order\";\nimport type { FallbackSettings } from \"@/schema/validation\";\n\nimport { buildOrderSnapshot } from \"@/utils/build-order-snapshot\";\nimport {\n type OrderFlowInitializeParams,\n useOrderFlowContext,\n} from \"./order-flow-provider\";\n\nimport type { VisibleGroup, VisibleGroupResult } from \"@/react/canvas/selection\";\n\nconst ROOT_TAG_ID = \"t:root\";\n\ntype NormalizeRateFn = (service: unknown) => number;\n\nexport type PricingPreview = {\n serviceId?: string | number;\n unitRate: number;\n base: number;\n utilities: number;\n total: number;\n utilityBreakdown: Array<{\n nodeId: string;\n mode: string;\n amount: number;\n }>;\n};\n\nexport type UseOrderFlowReturn = {\n ready: boolean;\n initialize: (params: OrderFlowInitializeParams) => void;\n\n activeTagId?: string;\n\n /** raw service props */\n raw: ServiceProps;\n\n /** visibility is Selection-only */\n visibleGroup: VisibleGroup | null;\n\n /**\n * Values are from form-palette (values()) and are already \"visible-only\"\n * because your UI mounts only visible fields.\n */\n formValuesByFieldId: Record<string, Scalar | Scalar[]>;\n\n /**\n * Selections are Selection-only now.\n * We keep this for compatibility with buildOrderSnapshot signature,\n * but we do NOT read it from form anymore.\n */\n optionSelectionsByFieldId: Record<string, string[]>;\n\n quantityPreview: number;\n services: Array<string | number>;\n serviceMap: Record<string, Array<string | number>>;\n\n pricingPreview: PricingPreview;\n\n min: number;\n max: number;\n\n selectTag: (tagId: string) => void;\n toggleOption: (fieldId: string, optionId?: string) => void;\n\n /** programmatic value set (rare; wrapper/field hook should handle most) */\n setValue: (fieldId: string, value: Scalar | Scalar[]) => void;\n clearField: (fieldId: string) => void;\n\n reset: (opts?: { keepTag?: boolean }) => void;\n setSnapshot: (snap: OrderSnapshot, opts?: { clearFirst?: boolean }) => void;\n\n /** VALIDATES via form.submit() */\n buildSnapshot: () => OrderSnapshot;\n\n fallbackPolicy: FallbackSettings;\n setFallbackPolicy: (next: FallbackSettings) => void;\n};\n\nexport function useOrderFlow(): UseOrderFlowReturn {\n const ctx = useOrderFlowContext();\n const ready = ctx.ready();\n\n const initialize = useCallback(\n (params: OrderFlowInitializeParams) => {\n ctx.initialize(params);\n },\n [ctx],\n );\n\n // keep propsRef updated (best-effort; only when ready)\n const propsRef = useRef<ServiceProps | null>(null);\n useEffect(() => {\n if (!ready) return;\n propsRef.current = ctx.ensureReady(\"propsRef\").builder.getProps();\n }, [ctx, ready]);\n\n /**\n * Selection tick: Selection is external, so we force re-render.\n */\n const [selTick, setSelTick] = useState(0);\n useEffect(() => {\n if (!ready) return;\n const sel = ctx.selection;\n if (!sel?.onChange) return;\n return sel.onChange(() => setSelTick((x) => x + 1));\n }, [ready, ctx.selection]);\n\n /**\n * Form tick: form-palette bridge is pub/sub, so we subscribe.\n * On each tick we recompute form.values() or form.submit() where needed.\n */\n const [formTick, setFormTick] = useState(0);\n useEffect(() => {\n return ctx.formApi.subscribe(() => setFormTick((x) => x + 1));\n }, [ctx.formApi]);\n\n /**\n * Visibility is Selection-only. No form-based augmentation.\n */\n const visibleGroup: VisibleGroup | null = useMemo(() => {\n if (!ready) return null;\n\n const sel = ctx.selection;\n if (!sel) return null;\n\n const vg: VisibleGroupResult = sel.visibleGroup();\n if (vg.kind !== \"single\") return null;\n\n return vg.group ?? null;\n }, [ready, ctx.selection, selTick]);\n\n const activeTagId = useMemo(() => {\n if (!ready) return undefined;\n return ctx.selection?.currentTag?.() ?? ctx.activeTagId;\n }, [ready, ctx.selection, ctx.activeTagId, selTick]);\n\n /**\n * Preview values:\n * - NO validation\n * - driven by form.values() (core.values())\n * - already visible-only because only visible fields are mounted.\n */\n const formValuesByFieldId: Record<string, Scalar | Scalar[]> = useMemo(() => {\n const values = (ctx.formApi.snapshot?.() ?? {}) as Record<\n string,\n Scalar | Scalar[]\n >;\n\n return values;\n }, [ctx.formApi, formTick]);\n\n /**\n * Selections are Selection-only now.\n * Keep empty map for snapshot builder signature.\n */\n const optionSelectionsByFieldId = useMemo(() => ({} as Record<string, string[]>), []);\n\n /**\n * Preview snapshot uses form.values() (no validation) + Selection context.\n */\n const previewSnapshot: OrderSnapshot = useMemo(() => {\n if (!ready) {\n return {\n version: \"1\",\n mode: \"prod\",\n builtAt: new Date().toISOString(),\n selection: { tag: \"unknown\", fields: [] },\n inputs: { form: {}, selections: {} },\n quantity: 1,\n quantitySource: { kind: \"default\", defaultedFromHost: true },\n services: [],\n min: 1,\n max: 1,\n serviceMap: {},\n meta: {\n schema_version: propsRef.current?.schema_version,\n context: {\n tag: \"unknown\",\n constraints: {},\n nodeContexts: {},\n policy: {\n ratePolicy: { kind: \"lte_primary\" },\n requireConstraintFit: true,\n },\n },\n },\n };\n }\n\n const { builder, init } = ctx.ensureReady(\"previewSnapshot\");\n const mode: \"prod\" | \"dev\" = init.mode ?? \"prod\";\n const hostDefaultQuantity = Number(init.hostDefaultQuantity ?? 1) || 1;\n\n return buildOrderSnapshot(\n builder.getProps(),\n builder,\n {\n activeTagId: activeTagId ?? ROOT_TAG_ID,\n formValuesByFieldId,\n optionSelectionsByFieldId, // Selection-owned now\n },\n init.services,\n {\n mode,\n hostDefaultQuantity,\n fallback: ctx.fallbackPolicy,\n },\n );\n }, [ready, ctx, activeTagId, formValuesByFieldId, optionSelectionsByFieldId, selTick]);\n\n /**\n * Pricing preview unchanged (driven from previewSnapshot)\n */\n const pricingPreview: PricingPreview = useMemo(() => {\n const empty: PricingPreview = {\n unitRate: 0,\n base: 0,\n utilities: 0,\n total: 0,\n utilityBreakdown: [],\n };\n\n if (!ready) return empty;\n\n const { init } = ctx.ensureReady(\"pricingPreview\");\n const normalizeRate: NormalizeRateFn =\n ((init as unknown as { normalizeRate?: NormalizeRateFn })\n .normalizeRate as NormalizeRateFn) ?? ((s: any) => Number(s?.rate));\n\n const quantity = Number(previewSnapshot.quantity ?? 1) || 1;\n\n let bestId: string | number | undefined;\n let bestRate = 0;\n\n const selectedIds = (previewSnapshot.services ?? []) as Array<string | number>;\n const svcMap = (init as any).services as Record<string | number, unknown>;\n\n for (const id of selectedIds) {\n const svc = svcMap?.[id];\n if (!svc) continue;\n\n const r = Number(normalizeRate(svc));\n if (!Number.isFinite(r)) continue;\n\n if (r > bestRate) {\n bestRate = r;\n bestId = id;\n }\n }\n\n const base = bestRate * quantity;\n\n const breakdown: PricingPreview[\"utilityBreakdown\"] = [];\n let utilitiesTotal = 0;\n\n const utils = ((previewSnapshot as any).utilities ?? []) as Array<any>;\n for (const u of utils) {\n const rate = Number(u?.rate);\n if (!Number.isFinite(rate)) continue;\n\n let amount = 0;\n const mode = String(u?.mode ?? \"\");\n\n switch (mode) {\n case \"flat\":\n amount = rate;\n break;\n case \"per_quantity\":\n amount = rate * quantity;\n break;\n case \"percent\":\n amount = base * (rate / 100);\n break;\n default:\n amount = 0;\n }\n\n if (Number.isFinite(amount) && amount !== 0) {\n utilitiesTotal += amount;\n breakdown.push({\n nodeId: String(u?.nodeId ?? \"\"),\n mode,\n amount,\n });\n }\n }\n\n return {\n serviceId: bestId,\n unitRate: bestRate,\n base,\n utilities: utilitiesTotal,\n total: base + utilitiesTotal,\n utilityBreakdown: breakdown,\n };\n }, [ready, ctx, previewSnapshot]);\n\n const selectTag = useCallback(\n (tagId: string) => {\n ctx.ensureReady(\"selectTag\");\n ctx.selection?.replace?.(tagId);\n ctx.setActiveTag(tagId);\n },\n [ctx],\n );\n\n /**\n * Selection-only toggles.\n * (No form selections.)\n */\n const toggleOption = useCallback(\n (fieldId: string, optionId?: string) => {\n const token = optionId ?? fieldId;\n ctx.selection?.toggle?.(token);\n },\n [ctx],\n );\n\n const setValue = useCallback(\n (fieldId: string, value: Scalar | Scalar[]) => {\n // programmatic, goes into form memory (core bucket)\n ctx.formApi.set(fieldId, value);\n },\n [ctx],\n );\n\n const clearField = useCallback(\n (fieldId: string) => {\n ctx.formApi.set(fieldId, undefined);\n ctx.selection?.remove?.(fieldId);\n },\n [ctx],\n );\n\n const reset = useCallback(\n (opts?: { keepTag?: boolean }) => {\n ctx.ensureReady(\"reset\");\n ctx.reset(opts);\n },\n [ctx],\n );\n\n const setSnapshot = useCallback(\n (snap: OrderSnapshot, opts?: { clearFirst?: boolean }) => {\n ctx.ensureReady(\"setSnapshot\");\n ctx.setSnapshot(snap, opts);\n },\n [ctx],\n );\n\n /**\n * Build snapshot must VALIDATE.\n * This is where form.submit() belongs.\n */\n const buildSnapshot = useCallback((): OrderSnapshot => {\n const { builder, selection, init } = ctx.ensureReady(\"buildSnapshot\");\n\n const tagId = selection.currentTag();\n if (!tagId) throw new Error(\"OrderFlow: no active tag/context selected\");\n\n const mode: \"prod\" | \"dev\" = init.mode ?? \"prod\";\n const hostDefaultQuantity = Number(init.hostDefaultQuantity ?? 1) || 1;\n\n const submitted = ctx.formApi.submit();\n const values = submitted.values as Record<string, Scalar | Scalar[]>;\n\n return buildOrderSnapshot(\n builder.getProps(),\n builder,\n {\n activeTagId: tagId,\n formValuesByFieldId: values,\n optionSelectionsByFieldId, // Selection-owned\n },\n init.services,\n {\n mode,\n hostDefaultQuantity,\n fallback: ctx.fallbackPolicy,\n },\n );\n }, [ctx, optionSelectionsByFieldId]);\n\n const raw = useMemo(() => {\n if (!ready) return (propsRef.current ?? ({} as ServiceProps));\n return ctx.ensureReady(\"raw\").builder.getProps();\n }, [ctx, ready, selTick]);\n\n return {\n ready,\n initialize,\n\n activeTagId,\n raw,\n\n visibleGroup,\n\n formValuesByFieldId,\n optionSelectionsByFieldId,\n\n quantityPreview: previewSnapshot.quantity,\n services: previewSnapshot.services,\n serviceMap: previewSnapshot.serviceMap,\n\n pricingPreview,\n\n min: previewSnapshot.min ?? 1,\n max: previewSnapshot.max ?? previewSnapshot.min ?? 1,\n\n selectTag,\n toggleOption,\n setValue,\n clearField,\n\n reset,\n setSnapshot,\n\n buildSnapshot,\n\n fallbackPolicy: ctx.fallbackPolicy,\n setFallbackPolicy: ctx.setFallbackPolicy,\n };\n}","// src/react/hooks/order-flow-provider.tsx\nimport React, {\n createContext,\n forwardRef,\n ReactNode,\n useCallback,\n useContext,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport { FormProvider, Provider, useFormApi } from \"@/react\";\nimport type { Registry as InputRegistryConfig } from \"../inputs/registry\";\n\nimport { type Builder, type BuilderOptions, createBuilder } from \"@/core\";\n\nimport type { ServiceProps, Tag } from \"@/schema\";\nimport type { DgpServiceCapability, DgpServiceMap } from \"@/schema/provider\";\nimport type { OrderSnapshot, Scalar } from \"@/schema/order\";\nimport type { FallbackSettings } from \"@/schema/validation\";\n\nimport { Selection } from \"../canvas/selection\";\n\nconst ROOT_TAG_ID = \"t:root\";\n\n/* ───────────────────────── Types ───────────────────────── */\n\nexport type OrderFlowInit = {\n mode?: \"prod\" | \"dev\";\n /** required service map used for snapshot building / rules */\n services: DgpServiceMap;\n /** fallback policy overrides */\n fallback?: FallbackSettings;\n /** hydrate initial state from snapshot */\n hydrateFrom?: OrderSnapshot;\n /** initial tag (ignored if hydrateFrom exists and provides tag) */\n initialTagId?: string;\n /** default quantity used by snapshot builder (default 1) */\n hostDefaultQuantity?: number;\n /** selection resolver (optional) */\n resolveService?: (id: number | string) => DgpServiceCapability | undefined;\n /**\n * Host props provided to further enhance the nodes data\n */\n ctx?: Record<string, unknown>;\n};\n\ntype ProviderFlow = {\n builder: Builder;\n selection?: Selection;\n};\n\nexport type OrderFlowProviderProps = {\n /**\n * Optional at mount time.\n * If absent, call initialize(...) later (via ref OR hook API).\n */\n serviceProps?: ServiceProps;\n builder?: Builder;\n flow?: ProviderFlow;\n\n builderOptions?: BuilderOptions;\n\n /** optional selection override (if not passed in flow) */\n selection?: Selection;\n\n /** Host input registry (maps kind/variant → components) */\n registry?: InputRegistryConfig;\n\n /** Optional now (deferred init supported). */\n init?: OrderFlowInit;\n\n children?: ReactNode;\n};\n\nexport type OrderFlowInitializeParams = {\n serviceProps?: ServiceProps;\n builder?: Builder;\n flow?: ProviderFlow;\n\n builderOptions?: BuilderOptions;\n selection?: Selection;\n\n init: OrderFlowInit;\n};\n\nexport type OrderFlowHandle = {\n /** whether provider has enough info to run */\n ready: () => boolean;\n\n /** (re)initialize the provider */\n initialize: (params: OrderFlowInitializeParams) => void;\n\n getActiveTag: () => string | undefined;\n selectTag: (tagId: string) => void;\n\n getVisibleGroup: () => ReturnType<Selection[\"visibleGroup\"]>;\n getSelectionIds: () => string[];\n clearSelection: () => void;\n\n /** Apply snapshot into selection + form values/selections */\n setSnapshot: (snap: OrderSnapshot, opts?: { clearFirst?: boolean }) => void;\n\n /** Reset tag + clear fields */\n reset: (opts?: { keepTag?: boolean }) => void;\n\n refresh: () => void;\n};\n\n/* ───────────────────────── Context ───────────────────────── */\n\ntype NormalizedInit = Required<\n Pick<OrderFlowInit, \"mode\" | \"hostDefaultQuantity\">\n> &\n OrderFlowInit;\n\ntype EnsureReadyResult = {\n builder: Builder;\n selection: Selection;\n init: NormalizedInit;\n};\n\ntype CtxShape = {\n builder: Builder | null;\n selection: Selection | null;\n\n activeTagId?: string;\n setActiveTag: (id: string) => void;\n\n init: NormalizedInit | null;\n\n /** Form API from FormProvider (always available) */\n formApi: ReturnType<typeof useFormApi>;\n\n /** fallback policy (owned here; used by hook) */\n fallbackPolicy: FallbackSettings;\n setFallbackPolicy: (next: FallbackSettings) => void;\n\n /** imperative helpers exposed to hook */\n setSnapshot: (snap: OrderSnapshot, opts?: { clearFirst?: boolean }) => void;\n reset: (opts?: { keepTag?: boolean }) => void;\n\n /** guards */\n ready: () => boolean;\n ensureReady: (op?: string) => EnsureReadyResult;\n\n /** init API */\n initialize: (params: OrderFlowInitializeParams) => void;\n};\n\nconst OrderFlowCtx = createContext<CtxShape | null>(null);\n\nexport function useOrderFlowContext(): CtxShape {\n const ctx = useContext(OrderFlowCtx);\n if (!ctx)\n throw new Error(\n \"useOrderFlowContext must be used within <OrderFlowProvider>\",\n );\n return ctx;\n}\n\n/* ───────────────────────── helpers ───────────────────────── */\n\nfunction findDefaultTagId(tags: Tag[]): string | undefined {\n if (!tags?.length) return undefined;\n const hasRoot = tags.some((t) => t.id === ROOT_TAG_ID);\n return hasRoot ? ROOT_TAG_ID : tags[0]!.id;\n}\n\n/** Snapshot.inputs.form is keyed by field.name; map -> fieldId for FormProvider initial */\nfunction mapSnapshotFormToFieldIds(\n builder: Builder,\n snap: OrderSnapshot,\n): Record<string, Scalar | Scalar[]> {\n const byFieldId: Record<string, Scalar | Scalar[]> = {};\n const form = snap.inputs?.form ?? {};\n const fields = builder.getProps().fields ?? [];\n\n const nameToIds = new Map<string, string[]>();\n for (const f of fields) {\n if (!f.name) continue;\n const arr = nameToIds.get(f.name) ?? [];\n arr.push(f.id);\n nameToIds.set(f.name, arr);\n }\n\n for (const [name, value] of Object.entries(form)) {\n for (const fid of nameToIds.get(name) ?? []) {\n byFieldId[fid] = value as Scalar | Scalar[];\n }\n }\n\n return byFieldId;\n}\n\nfunction makeDefaultFallback(\n mode: \"prod\" | \"dev\",\n patch?: FallbackSettings,\n): FallbackSettings {\n return {\n requireConstraintFit: true,\n ratePolicy: { kind: \"lte_primary\" },\n selectionStrategy: \"priority\",\n mode: mode === \"dev\" ? \"dev\" : \"strict\",\n ...(patch ?? {}),\n };\n}\n\nfunction normalizeInit(init: OrderFlowInit): NormalizedInit {\n const mode: \"prod\" | \"dev\" = init.mode ?? \"prod\";\n const hostDefaultQuantity = Number.isFinite(init.hostDefaultQuantity ?? 1)\n ? Number(init.hostDefaultQuantity ?? 1)\n : 1;\n return { ...init, mode, hostDefaultQuantity };\n}\n\n/* ───────────────────────── Bridge ───────────────────────── */\n/**\n * This component MUST live inside <FormProvider> so it can call useFormApi()\n * and provide OrderFlowCtx synchronously on the first render.\n */\nfunction OrderFlowCtxBridge(props: {\n ctxValue: Omit<CtxShape, \"formApi\">;\n formApiRef: React.MutableRefObject<ReturnType<typeof useFormApi> | null>;\n children?: ReactNode;\n}) {\n const formApi = useFormApi();\n props.formApiRef.current = formApi; // sync (render-time) ref\n\n return (\n <OrderFlowCtx.Provider value={{ ...props.ctxValue, formApi }}>\n {props.children}\n </OrderFlowCtx.Provider>\n );\n}\n\n/* ───────────────────────── Component ───────────────────────── */\n\nexport const OrderFlowProvider = forwardRef<\n OrderFlowHandle,\n OrderFlowProviderProps\n>(function OrderFlowProvider(\n {\n flow,\n builder: builderProp,\n serviceProps,\n builderOptions,\n selection: selectionProp,\n registry,\n init,\n children,\n },\n ref,\n) {\n // deferred init storage\n const builderRef = useRef<Builder | null>(null);\n const selectionRef = useRef<Selection | null>(null);\n const initRef = useRef<NormalizedInit | null>(null);\n const unsubRef = useRef<null | (() => void)>(null);\n\n // Form API ref (render-time set by bridge)\n const formApiRef = useRef<ReturnType<typeof useFormApi> | null>(null);\n\n // active tag tracking\n const [activeTagId, setActiveTagId] = useState<string | undefined>(\n undefined,\n );\n\n // fallback policy state\n const [fallbackPolicy, setFallbackPolicy] = useState<FallbackSettings>(() =>\n makeDefaultFallback(\"prod\"),\n );\n\n // to re-render when initialize() is called\n const [, force] = useState(0);\n const bump = () => force((x) => x + 1);\n\n const resolveBuilder = useCallback(\n (p: {\n flow?: ProviderFlow;\n builder?: Builder;\n serviceProps?: ServiceProps;\n builderOptions?: BuilderOptions;\n }) => {\n if (p.flow?.builder) return p.flow.builder;\n if (p.builder) return p.builder;\n\n if (p.serviceProps) {\n const b = createBuilder(p.builderOptions ?? {});\n b.load(p.serviceProps);\n return b;\n }\n\n return null;\n },\n [],\n );\n\n useEffect(() => {\n return () => {\n if (unsubRef.current) unsubRef.current();\n };\n }, []);\n\n\n const resolveSelection = useCallback(\n (\n b: Builder,\n nInit: NormalizedInit,\n p: { flow?: ProviderFlow; selection?: Selection },\n ) => {\n return (\n p.flow?.selection ??\n p.selection ??\n new Selection(b, {\n env: \"client\",\n rootTagId: ROOT_TAG_ID,\n resolveService: nInit.resolveService,\n })\n );\n },\n [],\n );\n\n const ready = useCallback(\n () =>\n !!builderRef.current && !!selectionRef.current && !!initRef.current,\n [],\n );\n\n const ensureReady = useCallback((op?: string): EnsureReadyResult => {\n const b = builderRef.current;\n const s = selectionRef.current;\n const i = initRef.current;\n\n if (!b || !s || !i) {\n const hint = op ? ` (${op})` : \"\";\n throw new Error(\n `OrderFlowProvider is not initialized${hint}. Call initialize(...) or pass init + serviceProps/builder.`,\n );\n }\n return { builder: b, selection: s, init: i };\n }, []);\n\n const wireSelectionListener = useCallback((sel: Selection) => {\n setActiveTagId(sel.currentTag());\n return sel.onChange(() => setActiveTagId(sel.currentTag()));\n }, []);\n\n const initialize = useCallback(\n (params: OrderFlowInitializeParams) => {\n const b = resolveBuilder(params);\n if (!b) {\n throw new Error(\n \"OrderFlowProvider.initialize: requires `serviceProps` or `builder`/`flow.builder`.\",\n );\n }\n\n const nInit = normalizeInit(params.init);\n const sel = resolveSelection(b, nInit, {\n flow: params.flow,\n selection: params.selection,\n });\n\n builderRef.current = b;\n selectionRef.current = sel;\n initRef.current = nInit;\n\n setFallbackPolicy(makeDefaultFallback(nInit.mode, nInit.fallback));\n\n // ✅ bind listener immediately (and replace any previous listener)\n if (unsubRef.current) unsubRef.current();\n unsubRef.current = sel.onChange(() =>\n setActiveTagId(sel.currentTag()),\n );\n\n // ✅ choose initial tag (hydrate -> init -> root -> first)\n const tags = b.getProps().filters ?? [];\n const hydratedTag = nInit.hydrateFrom?.selection?.tag;\n const initialTag = nInit.hydrateFrom\n ? hydratedTag\n : (nInit.initialTagId ?? findDefaultTagId(tags));\n\n if (initialTag) sel.replace(initialTag);\n else if (tags.length) sel.replace(tags[0]!.id);\n\n // ✅ set activeTagId synchronously right now\n setActiveTagId(sel.currentTag());\n\n // ✅ late-init hydration: MUST be imperative (FormProvider.initial won't re-run)\n const api = formApiRef.current;\n\n if (api && nInit.hydrateFrom) {\n // selections are already fieldId-keyed\n const selMap = nInit.hydrateFrom.inputs?.selections ?? {};\n for (const [fid, oids] of Object.entries(selMap)) {\n api.setSelections(fid, oids ?? []);\n }\n\n // form is keyed by field.name -> map to fieldId(s)\n const valuesByFieldId = mapSnapshotFormToFieldIds(\n b,\n nInit.hydrateFrom,\n );\n for (const [fid, v] of Object.entries(valuesByFieldId)) {\n api.set(fid, v as Scalar | Scalar[]);\n }\n }\n\n bump();\n },\n [resolveBuilder, resolveSelection],\n );\n\n // auto initialize from initial props if possible\n useEffect(() => {\n if (ready()) return;\n if (!init) return;\n\n const b = resolveBuilder({\n flow,\n builder: builderProp,\n serviceProps,\n builderOptions,\n });\n if (!b) return;\n\n initialize({\n flow,\n builder: builderProp,\n serviceProps,\n builderOptions,\n selection: selectionProp,\n init,\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // attach selection listener whenever selection changes\n useEffect(() => {\n const sel = selectionRef.current;\n if (!sel) return;\n return wireSelectionListener(sel);\n }, [wireSelectionListener, force]);\n\n const setActiveTag = useCallback(\n (id: string) => {\n const { selection } = ensureReady(\"setActiveTag\");\n selection.replace(id);\n setActiveTagId(id);\n },\n [ensureReady],\n );\n\n const clearAllFields = useCallback(() => {\n const api = formApiRef.current;\n if (!api) return;\n\n const b = builderRef.current;\n if (!b) return;\n\n const fields = b.getProps().fields ?? [];\n for (const f of fields) {\n api.set(f.id, undefined as unknown as Scalar);\n api.setSelections(f.id, []);\n }\n }, []);\n\n const setSnapshot = useCallback(\n (snap: OrderSnapshot, opts?: { clearFirst?: boolean }) => {\n const api = formApiRef.current;\n if (!api) return;\n\n const { builder, selection } = ensureReady(\"setSnapshot\");\n\n const clearFirst = opts?.clearFirst ?? true;\n\n const tag = snap.selection?.tag;\n if (tag) selection.replace(tag);\n\n if (clearFirst) clearAllFields();\n\n const sel = snap.inputs?.selections ?? {};\n for (const [fid, oids] of Object.entries(sel))\n api.setSelections(fid, oids ?? []);\n\n const valuesByFieldId = mapSnapshotFormToFieldIds(builder, snap);\n for (const [fid, v] of Object.entries(valuesByFieldId))\n api.set(fid, v as Scalar | Scalar[]);\n },\n [clearAllFields, ensureReady],\n );\n\n const reset = useCallback(\n (opts?: { keepTag?: boolean }) => {\n const keepTag = opts?.keepTag ?? false;\n\n const { builder, selection } = ensureReady(\"reset\");\n\n if (!keepTag) {\n const tags = builder.getProps().filters ?? [];\n const def = findDefaultTagId(tags) ?? tags[0]?.id;\n if (def) selection.replace(def);\n }\n\n clearAllFields();\n },\n [clearAllFields, ensureReady],\n );\n\n const getVisibleGroup = useCallback(\n () => ensureReady(\"getVisibleGroup\").selection.visibleGroup(),\n [ensureReady],\n );\n const getSelectionIds = useCallback(\n () => Array.from(ensureReady(\"getSelectionIds\").selection.all()),\n [ensureReady],\n );\n const clearSelection = useCallback(\n () => ensureReady(\"clearSelection\").selection.clear(),\n [ensureReady],\n );\n\n // initial FormProvider state (only if initialized + hydrateFrom exists)\n const initialValues = useMemo(() => {\n const b = builderRef.current;\n const i = initRef.current;\n if (!b || !i?.hydrateFrom) return {};\n return mapSnapshotFormToFieldIds(b, i.hydrateFrom);\n }, [force]);\n\n const initialSelections = useMemo(() => {\n const i = initRef.current;\n if (!i?.hydrateFrom) return {};\n return i.hydrateFrom.inputs?.selections ?? {};\n }, [force]);\n\n useImperativeHandle(\n ref,\n (): OrderFlowHandle => ({\n ready,\n initialize,\n\n getActiveTag: () => activeTagId,\n selectTag: (id: string) => setActiveTag(id),\n\n getVisibleGroup,\n getSelectionIds,\n clearSelection,\n\n setSnapshot,\n reset,\n refresh: () => setActiveTagId(selectionRef.current?.currentTag()),\n }),\n [\n activeTagId,\n clearSelection,\n getSelectionIds,\n getVisibleGroup,\n initialize,\n ready,\n reset,\n setActiveTag,\n setSnapshot,\n ],\n );\n\n return (\n <Provider initialRegistry={registry}>\n <FormProvider\n initial={{\n values: initialValues,\n selections: initialSelections,\n }}\n >\n <OrderFlowCtxBridge\n formApiRef={formApiRef}\n ctxValue={{\n builder: builderRef.current,\n selection: selectionRef.current,\n\n activeTagId,\n setActiveTag,\n\n init: initRef.current,\n\n fallbackPolicy,\n setFallbackPolicy,\n\n setSnapshot,\n reset,\n\n ready,\n ensureReady,\n\n initialize,\n }}\n >\n {children}\n </OrderFlowCtxBridge>\n </FormProvider>\n </Provider>\n );\n});\n","// src/react/inputs/registry/entries/text.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const textDescriptor: InputDescriptor = {\n Component: InputField as any,\n\n defaultProps: {\n variant: \"text\",\n stripPrefix: true,\n stripSuffix: true,\n slotChar: \"_\",\n },\n\n ui: {\n // shared box tuning (text supports these)\n size: sharedUi.size,\n density: sharedUi.density,\n ...sharedUi.padding,\n\n // behavior\n trim: {\n type: \"boolean\",\n label: \"Trim\",\n description: \"If enabled, the value is trimmed before validation.\",\n },\n\n minLength: {\n type: \"number\",\n label: \"Min length\",\n minimum: 0,\n description: \"Minimum allowed string length.\",\n },\n\n maxLength: {\n type: \"number\",\n label: \"Max length\",\n minimum: 0,\n description: \"Maximum allowed string length.\",\n },\n\n // affixes\n prefix: {\n type: \"string\",\n label: \"Prefix\",\n description: \"Fixed prefix rendered as part of the input value.\",\n },\n\n suffix: {\n type: \"string\",\n label: \"Suffix\",\n description: \"Fixed suffix rendered as part of the input value.\",\n },\n\n stripPrefix: {\n type: \"boolean\",\n label: \"Strip prefix\",\n description:\n \"If enabled, remove the prefix from the emitted model value.\",\n },\n\n stripSuffix: {\n type: \"boolean\",\n label: \"Strip suffix\",\n description:\n \"If enabled, remove the suffix from the emitted model value.\",\n },\n\n // shared layout knobs\n joinControls: sharedUi.joinControls,\n extendBoxToControls: sharedUi.extendBoxToControls,\n\n // shared masking knobs\n ...sharedUi.textMask,\n },\n}; \n","// src/react/inputs/registry/shared.ts\nimport type { Ui } from \"@/schema\";\n\nexport const sharedUi = {\n // ─────────────────────────────────────────────\n // Layout: join controls (text + select)\n // ─────────────────────────────────────────────\n joinControls: {\n type: \"boolean\",\n label: \"Join controls\",\n description:\n \"If enabled and there are controls, the input and controls share one visual box (borders, radius, focus states).\",\n } satisfies Ui,\n\n extendBoxToControls: {\n type: \"boolean\",\n label: \"Extend box to controls\",\n description:\n \"When joinControls is enabled: extend the styling over the controls (true) or keep them visually separate (false).\",\n } satisfies Ui,\n\n // ─────────────────────────────────────────────\n // Masking (text family)\n // ─────────────────────────────────────────────\n textMask: {\n mask: {\n type: \"string\",\n label: \"Mask pattern\",\n description:\n 'Mask pattern for formatted input (e.g. \"99/99/9999\", \"(999) 999-9999\").',\n } satisfies Ui,\n\n slotChar: {\n type: \"string\",\n label: \"Slot character\",\n description: 'Mask placeholder character (default is \"_\").',\n minLength: 1,\n maxLength: 1,\n } satisfies Ui,\n\n autoClear: {\n type: \"boolean\",\n label: \"Auto clear\",\n description:\n 'If enabled, empty masked values emit \"\" instead of placeholder slots.',\n } satisfies Ui,\n\n unmask: {\n type: \"anyOf\",\n label: \"Value mode\",\n description:\n \"Controls whether the emitted value is raw (unmasked) or masked.\",\n items: [\n { type: \"string\", title: \"Masked\", value: \"masked\" },\n { type: \"string\", title: \"Raw\", value: \"raw\" },\n ],\n } satisfies Ui,\n\n maskInsertMode: {\n type: \"anyOf\",\n label: \"Mask insert mode\",\n description:\n \"Reserved for future caret-mode logic (kept for compatibility).\",\n items: [\n { type: \"string\", title: \"Stream\", value: \"stream\" },\n { type: \"string\", title: \"Caret\", value: \"caret\" },\n ],\n } satisfies Ui,\n \n maskDefinitions: {\n type: \"object\",\n label: \"Mask definitions\",\n description:\n \"Per-symbol definitions for mask slots. Add a symbol key, then choose the definition shape.\",\n editable: true,\n fields: {},\n\n shape: {\n \"Regex pattern\": {\n type: \"string\",\n label: \"Pattern\",\n description:\n \"A regex pattern describing what this slot accepts.\",\n pattern: \".*\",\n },\n\n \"Boolean toggle\": {\n type: \"boolean\",\n label: \"Enabled\",\n description:\n \"Simple on/off definition (rare, but supported).\",\n },\n\n \"Choice list\": {\n type: \"anyOf\",\n label: \"Allowed values\",\n description: \"Explicit allowed values for this slot.\",\n items: [{ type: \"string\", title: \"Example\", value: \"X\" }],\n },\n },\n } satisfies Ui,\n },\n\n // ─────────────────────────────────────────────\n // Options mapping + search UX (select / multi-select family)\n // ─────────────────────────────────────────────\n optionMapping: {\n options: {\n type: \"array\",\n label: \"Options\",\n description: \"List of options to render.\",\n item: {\n type: \"object\",\n label: \"Option\",\n description: \"Option entry (object).\",\n fields: {},\n } as Ui,\n } satisfies Ui,\n\n autoCap: {\n type: \"boolean\",\n label: \"Auto capitalise\",\n description:\n \"Automatically capitalise the first letter when the resolved label is a string.\",\n } satisfies Ui,\n\n optionLabel: {\n type: \"string\",\n label: \"Option label key\",\n description: \"Key to read the label from option objects.\",\n } satisfies Ui,\n\n optionValue: {\n type: \"string\",\n label: \"Option value key\",\n description: \"Key to read the value from option objects.\",\n } satisfies Ui,\n\n optionDescription: {\n type: \"string\",\n label: \"Option description key\",\n description:\n \"Key to read the description line from option objects.\",\n } satisfies Ui,\n\n optionDisabled: {\n type: \"string\",\n label: \"Option disabled key\",\n description: \"Key to determine if an option is disabled.\",\n } satisfies Ui,\n\n optionIcon: {\n type: \"string\",\n label: \"Option icon key\",\n description:\n 'Key to read the icon from option objects (often \"icon\").',\n } satisfies Ui,\n\n optionKey: {\n type: \"string\",\n label: \"Option key\",\n description: \"Stable key used as the identity for each option.\",\n } satisfies Ui,\n },\n\n searchUx: {\n searchable: {\n type: \"boolean\",\n label: \"Searchable\",\n description: \"Enable searching inside the dropdown.\",\n } satisfies Ui,\n\n searchPlaceholder: {\n type: \"string\",\n label: \"Search placeholder\",\n description: \"Placeholder text for the search input.\",\n } satisfies Ui,\n\n emptySearchText: {\n type: \"string\",\n label: \"Empty search text\",\n description: \"Text shown when the search returns no results.\",\n } satisfies Ui,\n },\n\n pickerCommon: {\n placeholder: {\n type: \"string\",\n label: \"Placeholder\",\n description: \"Placeholder text shown when no value is selected.\",\n } satisfies Ui,\n\n clearable: {\n type: \"boolean\",\n label: \"Clearable\",\n description: \"Allow clearing the current selection.\",\n } satisfies Ui,\n },\n\n // -----------------------------\n // Box sizing / density (text + textarea, etc.)\n // -----------------------------\n size: {\n type: \"anyOf\",\n label: \"Size\",\n description: \"Size preset for the input.\",\n items: [\n { type: \"string\", title: \"Small\", value: \"sm\" },\n { type: \"string\", title: \"Medium\", value: \"md\" },\n { type: \"string\", title: \"Large\", value: \"lg\" },\n ],\n } satisfies Ui,\n\n density: {\n type: \"anyOf\",\n label: \"Density\",\n description: \"Controls vertical compactness / line-height preset.\",\n items: [\n { type: \"string\", title: \"Compact\", value: \"compact\" },\n { type: \"string\", title: \"Normal\", value: \"normal\" },\n { type: \"string\", title: \"Relaxed\", value: \"relaxed\" },\n { type: \"string\", title: \"Dense\", value: \"dense\" },\n { type: \"string\", title: \"Loose\", value: \"loose\" },\n ],\n } satisfies Ui,\n\n // -----------------------------\n // Padding (text + textarea, etc.)\n // -----------------------------\n padding: {\n px: {\n type: \"number\",\n label: \"Padding X\",\n description: \"Horizontal padding override in pixels.\",\n minimum: 0,\n } satisfies Ui,\n py: {\n type: \"number\",\n label: \"Padding Y\",\n description: \"Vertical padding override in pixels.\",\n minimum: 0,\n } satisfies Ui,\n ps: {\n type: \"number\",\n label: \"Padding start\",\n description:\n \"Start-side padding override in pixels (overrides px).\",\n minimum: 0,\n } satisfies Ui,\n pe: {\n type: \"number\",\n label: \"Padding end\",\n description: \"End-side padding override in pixels (overrides px).\",\n minimum: 0,\n } satisfies Ui,\n pb: {\n type: \"number\",\n label: \"Padding bottom\",\n description: \"Bottom padding override in pixels (overrides py).\",\n minimum: 0,\n } satisfies Ui,\n },\n} as const;\n","// src/react/inputs/registry/entries/textarea.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const textareaDescriptor: InputDescriptor = {\n Component: InputField as any,\n defaultProps: {\n variant: \"textarea\",\n },\n ui: {\n // box tuning shared with text\n size: sharedUi.size,\n density: sharedUi.density,\n ...sharedUi.padding,\n \n autoResize: {\n type: \"boolean\",\n label: \"Auto resize\",\n description: \"Automatically grows/shrinks height based on content.\",\n },\n\n rows: {\n type: \"number\",\n label: \"Min rows\",\n description:\n \"Minimum number of visible rows (used when auto-resize is enabled).\",\n minimum: 1,\n },\n\n maxRows: {\n type: \"number\",\n label: \"Max rows\",\n description:\n \"Maximum number of visible rows (leave unset for unlimited).\",\n minimum: 1,\n },\n\n extendBoxToControls: sharedUi.extendBoxToControls,\n\n extendBoxToToolbox: {\n type: \"boolean\",\n label: \"Extend box to toolbox\",\n description:\n \"Extend the textarea box styling to the upper toolbox area when present.\",\n },\n },\n};\n","// src/react/inputs/registry/entries/phone.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const phoneDescriptor: InputDescriptor = {\n Component: InputField as any,\n\n defaultProps: {\n variant: \"phone\", // MUST\n\n // (optional) you can omit these since the component already defaults them:\n // showCountry: true,\n // showFlag: true,\n // showSelectedLabel: false,\n // showSelectedDial: false,\n // showDialInList: true,\n // valueMode: \"e164\",\n // keepCharPositions: false,\n },\n\n ui: {\n // shared text-like tuning supported by phone (since it types against Text props)\n size: sharedUi.size,\n density: sharedUi.density,\n ...sharedUi.padding,\n\n joinControls: sharedUi.joinControls,\n extendBoxToControls: sharedUi.extendBoxToControls,\n\n // ─────────────────────────────────────────────\n // Phone-specific configuration\n // ─────────────────────────────────────────────\n\n defaultCountry: {\n type: \"string\",\n label: \"Default country\",\n description:\n 'ISO 3166-1 alpha-2 code for the initial country (e.g. \"NG\", \"US\", \"GB\").',\n },\n\n // Countries list is optional; if omitted, runtime uses global list.\n // editable=true lets admins add custom countries if you want.\n countries: {\n type: \"array\",\n label: \"Countries\",\n description:\n \"Optional custom country list. If omitted, the global country list is used.\",\n editable: true,\n item: {\n type: \"object\",\n label: \"Country\",\n description:\n \"A single country entry: code, label, dial code, and national mask.\",\n editable: false,\n fields: {\n code: {\n type: \"string\",\n label: \"ISO code\",\n description: 'ISO alpha-2 (e.g. \"NG\").',\n },\n label: {\n type: \"string\",\n label: \"Label\",\n description: 'Display label (e.g. \"Nigeria\").',\n },\n dial: {\n type: \"string\",\n label: \"Dial code\",\n description: 'Dial code without \"+\" (e.g. \"234\").',\n },\n mask: {\n type: \"string\",\n label: \"National mask\",\n description:\n 'Mask for the NATIONAL portion only (no dial). Example: \"999 999 9999\".',\n },\n // flag is ReactNode in the variant; not builder-editable, so excluded.\n },\n order: [\"code\", \"label\", \"dial\", \"mask\"],\n },\n }, \n\n valueMode: {\n type: \"anyOf\",\n label: \"Value mode\",\n description:\n \"Controls how the form value is emitted (masked, e164, or national digits only).\",\n items: [\n {\n type: \"string\",\n title: \"Masked (+234 801 234 5678)\",\n value: \"masked\",\n },\n {\n type: \"string\",\n title: \"E164 (dial+digits, no +)\",\n value: \"e164\",\n },\n {\n type: \"string\",\n title: \"National (digits only)\",\n value: \"national\",\n },\n ],\n },\n\n keepCharPositions: {\n type: \"boolean\",\n label: \"Keep character positions\",\n description:\n \"If enabled, the national mask keeps placeholder characters for not-yet-filled positions.\",\n },\n\n // ─────────────────────────────────────────────\n // Country selector UX (allowed; not InputField placeholder)\n // ─────────────────────────────────────────────\n\n showCountry: {\n type: \"boolean\",\n label: \"Show country selector\",\n description: \"Show or hide the country selector control.\",\n },\n\n countryPlaceholder: {\n type: \"string\",\n label: \"Country placeholder\",\n description:\n \"Placeholder shown on the country selector when nothing is selected.\",\n },\n\n showFlag: {\n type: \"boolean\",\n label: \"Show flag\",\n description: \"Show or hide the country flag in the selector.\",\n },\n\n showSelectedLabel: {\n type: \"boolean\",\n label: \"Show selected label\",\n description: \"Show the selected country label in the trigger.\",\n },\n\n showSelectedDial: {\n type: \"boolean\",\n label: \"Show selected dial code\",\n description: \"Show the selected country dial code in the trigger.\",\n },\n\n showDialInList: {\n type: \"boolean\",\n label: \"Show dial code in list\",\n description:\n \"Show dial codes alongside country names in the dropdown list.\",\n },\n\n // onCountryChange is a callback; not builder-editable, so excluded.\n // country*ClassName props are forbidden; excluded.\n },\n};\n","// src/react/inputs/registry/entries/toggle-group.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const toggleGroupDescriptor: InputDescriptor = {\n Component: InputField as any,\n\n defaultProps: {\n variant: \"toggle-group\", // MUST\n multiple: false,\n variantStyle: \"default\",\n layout: \"horizontal\",\n gridCols: 2,\n fillWidth: false,\n autoCap: false,\n },\n\n ui: {\n // (toggle-group supports these via VariantBaseProps)\n size: sharedUi.size,\n density: sharedUi.density,\n\n /**\n * Options\n * - supports primitive shorthand + objects + option* mapping keys\n */\n options: {\n type: \"array\",\n label: \"Options\",\n description:\n \"Toggle options. Can be primitive values (string/number/boolean) or objects. Uses option* keys when provided.\",\n editable: true,\n item: {\n type: \"object\",\n label: \"Option\",\n description:\n \"Option object (used when you want label/value/icon/disabled/tooltip/meta).\",\n editable: true,\n fields: {\n // Keep this minimal; the variant can also read via option* keys.\n value: {\n type: \"string\",\n label: \"Value\",\n description: \"Unique option value (string).\",\n },\n label: {\n type: \"string\",\n label: \"Label\",\n description: \"Display label for the option.\",\n },\n disabled: {\n type: \"boolean\",\n label: \"Disabled\",\n description: \"Disable this option.\",\n },\n tooltip: {\n type: \"string\",\n label: \"Tooltip\",\n description: \"Optional tooltip text for this option.\",\n },\n },\n } as any,\n },\n\n // option mapping keys (shared)\n autoCap: {\n type: \"boolean\",\n label: \"Auto capitalise\",\n description:\n \"Automatically capitalise labels when the resolved label is a string.\",\n },\n\n optionValue: {\n type: \"string\",\n label: \"Option value key\",\n description:\n \"Property name to read the option value from when using custom option objects.\",\n },\n\n optionLabel: {\n type: \"string\",\n label: \"Option label key\",\n description:\n \"Property name to read the option label from when using custom option objects.\",\n },\n\n optionIcon: {\n type: \"string\",\n label: \"Option icon key\",\n description:\n \"Property name to read an icon from (runtime-only; builder typically won’t author icons).\",\n },\n\n optionDisabled: {\n type: \"string\",\n label: \"Option disabled key\",\n description:\n \"Property name to read the disabled flag from when using custom option objects.\",\n },\n\n optionTooltip: {\n type: \"string\",\n label: \"Option tooltip key\",\n description:\n \"Property name to read tooltip content from when using custom option objects.\",\n },\n\n optionMeta: {\n type: \"string\",\n label: \"Option meta key\",\n description:\n \"Property name to read meta from (opaque payload for host logic).\",\n },\n\n // selection mode\n multiple: {\n type: \"boolean\",\n label: \"Multiple\",\n description:\n \"If enabled, multiple options can be selected (emits a string array).\",\n },\n\n // visuals/layout\n variant: {\n type: \"anyOf\",\n label: \"Variant style\",\n description:\n 'Visual style for the toggle buttons (\"default\" or \"outline\").',\n items: [\n { type: \"string\", title: \"Default\", value: \"default\" },\n { type: \"string\", title: \"Outline\", value: \"outline\" },\n ],\n },\n\n layout: {\n type: \"anyOf\",\n label: \"Layout\",\n description: \"How the toggle items are arranged.\",\n items: [\n { type: \"string\", title: \"Horizontal\", value: \"horizontal\" },\n { type: \"string\", title: \"Vertical\", value: \"vertical\" },\n { type: \"string\", title: \"Grid\", value: \"grid\" },\n ],\n },\n\n gridCols: {\n type: \"number\",\n label: \"Grid columns\",\n description: \"Number of columns when layout is set to grid.\",\n minimum: 1,\n },\n\n fillWidth: {\n type: \"boolean\",\n label: \"Fill width\",\n description:\n \"If enabled, the group stretches to full width and items expand to fill available space.\",\n },\n\n gap: {\n type: \"number\",\n label: \"Item gap\",\n description:\n \"Spacing between items in pixels (applies in grid/horizontal/vertical layouts).\",\n minimum: 0,\n },\n },\n};\n","// src/react/inputs/registry/entries/number.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const numberDescriptor: InputDescriptor = {\n Component: InputField as any,\n\n defaultProps: {\n variant: \"number\", // MUST\n\n // sensible defaults (optional — you can remove if you prefer)\n mode: \"decimal\",\n useGrouping: true,\n format: true,\n allowEmpty: true,\n step: 1,\n\n // for ShadcnNumberVariant\n showButtons: false,\n buttonLayout: \"stacked\",\n },\n\n ui: {\n // shared (supported via text base)\n size: sharedUi.size,\n density: sharedUi.density,\n ...sharedUi.padding,\n joinControls: sharedUi.joinControls,\n extendBoxToControls: sharedUi.extendBoxToControls,\n\n // numeric mode\n mode: {\n type: \"anyOf\",\n label: \"Mode\",\n description: \"Number formatting mode (decimal or currency).\",\n items: [\n { type: \"string\", title: \"Decimal\", value: \"decimal\" },\n { type: \"string\", title: \"Currency\", value: \"currency\" },\n ],\n },\n\n currency: {\n type: \"string\",\n label: \"Currency code\",\n description:\n 'ISO currency code used when mode is \"currency\" (e.g. \"USD\", \"NGN\").',\n },\n\n currencyDisplay: {\n type: \"anyOf\",\n label: \"Currency display\",\n description: \"How currency is displayed when mode is currency.\",\n items: [\n { type: \"string\", title: \"Symbol\", value: \"symbol\" },\n {\n type: \"string\",\n title: \"Narrow symbol\",\n value: \"narrowSymbol\",\n },\n { type: \"string\", title: \"Code\", value: \"code\" },\n { type: \"string\", title: \"Name\", value: \"name\" },\n ],\n },\n\n // locale + grouping\n locale: {\n type: \"string\",\n label: \"Locale\",\n description:\n 'Locale used for formatting (e.g. \"en-US\", \"en-GB\"). If unset, runtime uses browser locale.',\n },\n\n useGrouping: {\n type: \"boolean\",\n label: \"Use grouping\",\n description: \"If enabled, format with thousands separators.\",\n },\n\n // fraction digits\n minFractionDigits: {\n type: \"number\",\n label: \"Min fraction digits\",\n description: \"Minimum number of fractional digits to show.\",\n minimum: 0,\n },\n\n maxFractionDigits: {\n type: \"number\",\n label: \"Max fraction digits\",\n description: \"Maximum number of fractional digits to show.\",\n minimum: 0,\n },\n\n // limits + stepping\n min: {\n type: \"number\",\n label: \"Minimum\",\n description: \"Minimum allowed numeric value.\",\n },\n\n max: {\n type: \"number\",\n label: \"Maximum\",\n description: \"Maximum allowed numeric value.\",\n },\n\n step: {\n type: \"number\",\n label: \"Step\",\n description: \"Step increment used for arrow keys and +/- buttons.\",\n },\n\n // behavior\n allowEmpty: {\n type: \"boolean\",\n label: \"Allow empty\",\n description:\n \"If enabled, the field can be cleared to an empty state (null).\",\n },\n\n format: {\n type: \"boolean\",\n label: \"Format\",\n description:\n \"If enabled, uses Intl formatting (grouping/currency) when blurred. If disabled, shows raw text.\",\n },\n\n // affixes (allowed — not InputField props)\n prefix: {\n type: \"string\",\n label: \"Prefix\",\n description:\n \"Fixed prefix rendered as part of the displayed value.\",\n },\n\n suffix: {\n type: \"string\",\n label: \"Suffix\",\n description:\n \"Fixed suffix rendered as part of the displayed value.\",\n },\n\n // ShadcnNumberVariant extras (buttons)\n showButtons: {\n type: \"boolean\",\n label: \"Show +/- buttons\",\n description:\n \"Show increment/decrement buttons around the number field.\",\n },\n\n buttonLayout: {\n type: \"anyOf\",\n label: \"Button layout\",\n description:\n 'How +/- buttons are arranged when \"Show +/- buttons\" is enabled.',\n items: [\n { type: \"string\", title: \"Inline\", value: \"inline\" },\n { type: \"string\", title: \"Stacked\", value: \"stacked\" },\n ],\n },\n },\n};\n","// src/react/inputs/registry/entries/password.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const passwordDescriptor: InputDescriptor = {\n Component: InputField as any,\n\n defaultProps: {\n variant: \"password\", // MUST\n\n // sensible defaults (optional)\n revealToggle: true,\n meterStyle: \"simple\",\n },\n\n ui: {\n // shared text-like tuning supported by password (it types against text props)\n size: sharedUi.size,\n density: sharedUi.density,\n ...sharedUi.padding,\n joinControls: sharedUi.joinControls,\n extendBoxToControls: sharedUi.extendBoxToControls,\n\n // password-specific\n maxLength: {\n type: \"number\",\n label: \"Max length\",\n minimum: 0,\n description: \"Maximum number of characters permitted.\",\n },\n\n autoComplete: {\n type: \"string\",\n label: \"Autocomplete\",\n description:\n 'Browser autocomplete hint (e.g. \"current-password\", \"new-password\").',\n },\n\n revealToggle: {\n type: \"boolean\",\n label: \"Reveal toggle\",\n description:\n \"Show an eye button to toggle between obscured/plain text.\",\n },\n\n defaultRevealed: {\n type: \"boolean\",\n label: \"Default revealed\",\n description: \"Start in the revealed (plain text) state.\",\n },\n\n meterStyle: {\n type: \"anyOf\",\n label: \"Meter style\",\n description:\n 'Built-in meter style: \"simple\" (bar + label) or \"rules\" (bar + checklist).',\n items: [\n { type: \"string\", title: \"Simple\", value: \"simple\" },\n { type: \"string\", title: \"Rules\", value: \"rules\" },\n ],\n },\n\n /**\n * Strength meter config\n * - Runtime accepts: boolean | StrengthOptions\n * - We expose it as an object; if present (even empty), it enables the meter\n * and merges with defaults.\n *\n * NOTE: we intentionally do NOT expose `calc` (function).\n */\n strengthMeter: {\n type: \"object\",\n label: \"Strength meter\",\n description:\n \"Configure the built-in strength meter. If set (even partially), the meter is enabled and defaults are merged.\",\n editable: false,\n fields: {\n labels: {\n type: \"array\",\n label: \"Labels\",\n description: \"Labels for each score bucket (index 0..4).\",\n editable: true,\n minItems: 5,\n maxItems: 5,\n item: {\n type: \"string\",\n label: \"Label\",\n description: \"Label for a score bucket.\",\n },\n },\n\n thresholds: {\n type: \"array\",\n label: \"Thresholds\",\n description:\n \"Thresholds for score steps using a 0–100 bar (index 0..4).\",\n editable: true,\n minItems: 5,\n maxItems: 5,\n item: {\n type: \"number\",\n label: \"Threshold\",\n description: \"Threshold value (0–100).\",\n minimum: 0,\n maximum: 100,\n },\n },\n\n minScore: {\n type: \"number\",\n label: \"Minimum score\",\n description:\n \"Minimum score required to consider the password acceptable (visual only unless enforced elsewhere).\",\n minimum: 0,\n maximum: 4,\n },\n\n showLabel: {\n type: \"boolean\",\n label: \"Show label\",\n description:\n \"Show the textual label next to/under the bar.\",\n },\n\n display: {\n type: \"anyOf\",\n label: \"Display\",\n description:\n 'Where to render the meter: \"inline\" (compact) or \"block\" (stacked).',\n items: [\n { type: \"string\", title: \"Inline\", value: \"inline\" },\n { type: \"string\", title: \"Block\", value: \"block\" },\n ],\n },\n },\n order: [\"display\", \"showLabel\", \"minScore\", \"labels\", \"thresholds\"],\n },\n\n ruleUses: {\n type: \"array\",\n label: \"Rule uses\",\n description:\n 'Selection of rule aliases to apply. Prefix with \"!\" to mark a rule as important.',\n editable: true,\n item: {\n type: \"string\",\n label: \"Rule\",\n description: 'Rule alias (e.g. \"length\" or \"!length\").',\n },\n },\n },\n};\n","// src/react/inputs/registry/entries/slider.ts\r\nimport { InputField } from \"@timeax/form-palette\";\r\nimport type { InputDescriptor } from \"@/react\";\r\nimport { sharedUi } from \"./shared\";\r\n\r\nexport const sliderDescriptor: InputDescriptor = {\r\n Component: InputField as any,\r\n\r\n defaultProps: {\r\n variant: \"slider\", // MUST\r\n min: 0,\r\n max: 100,\r\n step: 1,\r\n showValue: true,\r\n valuePlacement: \"end\",\r\n joinControls: true,\r\n extendBoxToControls: true,\r\n controlVariant: \"none\",\r\n },\r\n\r\n ui: {\r\n // slider supports size + density but its density enum is compact/comfortable/loose\r\n size: sharedUi.size,\r\n\r\n density: {\r\n type: \"anyOf\",\r\n label: \"Density\",\r\n description: \"Vertical padding preset for the slider container.\",\r\n items: [\r\n { type: \"string\", title: \"Compact\", value: \"compact\" },\r\n { type: \"string\", title: \"Comfortable\", value: \"comfortable\" },\r\n { type: \"string\", title: \"Loose\", value: \"loose\" },\r\n ],\r\n },\r\n\r\n min: {\r\n type: \"number\",\r\n label: \"Minimum\",\r\n description: \"Minimum value for the slider.\",\r\n },\r\n\r\n max: {\r\n type: \"number\",\r\n label: \"Maximum\",\r\n description: \"Maximum value for the slider.\",\r\n },\r\n\r\n step: {\r\n type: \"number\",\r\n label: \"Step\",\r\n description: \"Step between values.\",\r\n },\r\n\r\n showValue: {\r\n type: \"boolean\",\r\n label: \"Show value\",\r\n description: \"Show the current value as text next to the slider.\",\r\n },\r\n\r\n valuePlacement: {\r\n type: \"anyOf\",\r\n label: \"Value placement\",\r\n description: 'Where the value label appears (\"start\" or \"end\").',\r\n items: [\r\n { type: \"string\", title: \"Start\", value: \"start\" },\r\n { type: \"string\", title: \"End\", value: \"end\" },\r\n ],\r\n },\r\n\r\n joinControls: sharedUi.joinControls,\r\n extendBoxToControls: sharedUi.extendBoxToControls,\r\n\r\n controlVariant: {\r\n type: \"anyOf\",\r\n label: \"Built-in +/- controls\",\r\n description:\r\n 'Built-in step buttons around the slider (\"none\", \"boxed\", or \"edge\").',\r\n items: [\r\n { type: \"string\", title: \"None\", value: \"none\" },\r\n { type: \"string\", title: \"Boxed\", value: \"boxed\" },\r\n { type: \"string\", title: \"Edge\", value: \"edge\" },\r\n ],\r\n },\r\n\r\n controlStep: {\r\n type: \"number\",\r\n label: \"Control step\",\r\n description:\r\n \"Step used when clicking the +/- controls. If unset, falls back to Step.\",\r\n },\r\n },\r\n};\r\n","// src/react/inputs/registry/entries/toggle.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const toggleDescriptor: InputDescriptor = {\n Component: InputField as any,\n\n defaultProps: {\n variant: \"toggle\", // MUST\n // optional defaults (the variant already defaults these)\n // size: \"md\",\n // density: \"default\",\n // controlPlacement: \"left\",\n },\n\n ui: {\n // toggle supports the same size union as text\n size: sharedUi.size,\n\n // but density is different from your text density union\n density: {\n type: \"anyOf\",\n label: \"Density\",\n description: \"Row density (vertical padding & gap).\",\n items: [\n { type: \"string\", title: \"Default\", value: \"default\" },\n { type: \"string\", title: \"Dense\", value: \"dense\" },\n ],\n },\n\n controlPlacement: {\n type: \"anyOf\",\n label: \"Control placement\",\n description:\n \"Place the switch on the left or right of the state text.\",\n items: [\n { type: \"string\", title: \"Left\", value: \"left\" },\n { type: \"string\", title: \"Right\", value: \"right\" },\n ],\n },\n },\n};\n","// src/react/inputs/registry/entries/treeselect.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const treeSelectDescriptor: InputDescriptor = {\n Component: InputField as any,\n\n defaultProps: {\n variant: \"treeselect\", // MUST\n\n // sensible defaults (optional; component already has these defaults)\n multiple: true,\n searchable: true,\n clearable: true,\n expandAll: false,\n leafOnly: false,\n\n joinControls: true,\n extendBoxToControls: true,\n },\n\n ui: {\n // shared tuning\n size: sharedUi.size,\n density: sharedUi.density,\n\n // shared: options + mapping (no className-related stuff)\n ...sharedUi.optionMapping,\n\n // treeselect-specific: selection mode\n multiple: {\n type: \"boolean\",\n label: \"Multiple\",\n description:\n \"If enabled, multiple nodes can be selected (emits a string array). If disabled, emits a single string.\",\n },\n\n // shared: search UX\n ...sharedUi.searchUx,\n\n searchPlaceholder: {\n type: \"string\",\n label: \"Search placeholder\",\n description:\n \"Placeholder text for the search input within the tree dropdown.\",\n },\n\n emptySearchText: {\n type: \"string\",\n label: \"Empty search text\",\n description: \"Text shown when search returns no matching nodes.\",\n },\n\n // tree-only UX text (not an InputField placeholder)\n emptyLabel: {\n type: \"string\",\n label: \"Empty label\",\n description:\n \"Text shown when there are no options/nodes available.\",\n },\n\n // shared-ish picker toggle (allowed)\n clearable: {\n type: \"boolean\",\n label: \"Clearable\",\n description: \"Allow clearing the current selection.\",\n },\n\n // tree expansion behavior\n expandAll: {\n type: \"boolean\",\n label: \"Expand all\",\n description:\n \"If enabled, expands all nodes by default when the dropdown opens.\",\n },\n\n defaultExpandedValues: {\n type: \"array\",\n label: \"Default expanded values\",\n description:\n \"List of node values to expand initially (useful when not expanding everything).\",\n editable: true,\n item: {\n type: \"string\",\n label: \"Node value\",\n description: \"The node value to expand on load.\",\n },\n },\n\n leafOnly: {\n type: \"boolean\",\n label: \"Leaf only\",\n description: \"If enabled, only leaf nodes can be selected.\",\n },\n\n // shared layout knobs (default-mode only; we keep them since they're booleans)\n joinControls: sharedUi.joinControls,\n extendBoxToControls: sharedUi.extendBoxToControls,\n },\n};\n","// src/react/inputs/registry/entries/multi-select.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const multiSelectDescriptor: InputDescriptor = {\n Component: InputField as any,\n\n defaultProps: {\n variant: \"multi-select\", // MUST\n\n // sensible defaults (optional)\n searchable: true,\n clearable: true,\n autoCap: false,\n\n joinControls: true,\n extendBoxToControls: true,\n },\n\n ui: {\n // shared tuning\n size: sharedUi.size,\n density: sharedUi.density,\n\n // shared: options mapping\n ...sharedUi.optionMapping,\n\n // shared: search ux\n ...sharedUi.searchUx,\n\n // common picker knobs (allowed)\n clearable: {\n type: \"boolean\",\n label: \"Clearable\",\n description: \"Allow clearing all selected values.\",\n },\n\n // multi-select behavior knobs (safe)\n closeOnSelect: {\n type: \"boolean\",\n label: \"Close on select\",\n description:\n \"If enabled, the dropdown closes after selecting an option.\",\n },\n\n maxSelected: {\n type: \"number\",\n label: \"Max selected\",\n description:\n \"Maximum number of selections allowed (leave unset for unlimited).\",\n minimum: 1,\n },\n\n // shared layout knobs\n joinControls: sharedUi.joinControls,\n extendBoxToControls: sharedUi.extendBoxToControls,\n },\n};\n","// src/react/inputs/registry/entries/select.ts\r\nimport { InputField } from \"@timeax/form-palette\";\r\nimport type { InputDescriptor } from \"@/react\";\r\nimport { sharedUi } from \"./shared\";\r\n\r\nexport const selectDescriptor: InputDescriptor = {\r\n Component: InputField as any,\r\n\r\n defaultProps: {\r\n variant: \"select\", // MUST\r\n\r\n // sensible defaults (optional)\r\n searchable: true,\r\n clearable: true,\r\n autoCap: false,\r\n\r\n joinControls: true,\r\n extendBoxToControls: true,\r\n },\r\n\r\n ui: {\r\n // common tuning\r\n size: sharedUi.size,\r\n density: sharedUi.density,\r\n\r\n // options + mapping\r\n ...sharedUi.optionMapping,\r\n\r\n // search UX\r\n ...sharedUi.searchUx,\r\n\r\n // picker basics (allowed)\r\n clearable: {\r\n type: \"boolean\",\r\n label: \"Clearable\",\r\n description: \"Allow clearing the current selection.\",\r\n },\r\n\r\n // layout knobs (allowed)\r\n joinControls: sharedUi.joinControls,\r\n extendBoxToControls: sharedUi.extendBoxToControls,\r\n },\r\n};\r\n","// src/react/inputs/registry/entries/radio.ts\r\nimport { InputField } from \"@timeax/form-palette\";\r\nimport type { InputDescriptor } from \"@/react\";\r\nimport { sharedUi } from \"./shared\";\r\n\r\nexport const radioDescriptor: InputDescriptor = {\r\n Component: InputField as any,\r\n\r\n defaultProps: {\r\n variant: \"radio\", // MUST\r\n autoCap: false,\r\n },\r\n\r\n ui: {\r\n // common tuning (radio supports these in your palette variants)\r\n size: sharedUi.size,\r\n density: sharedUi.density,\r\n\r\n /**\r\n * Options\r\n * Radio supports primitive shorthands + objects, using option* mapping keys.\r\n */\r\n ...sharedUi.optionMapping,\r\n\r\n // small radio-only behavior knobs (safe)\r\n multiple: {\r\n type: \"boolean\",\r\n label: \"Multiple\",\r\n description:\r\n \"If enabled, behaves like a multi-pick radio group (emits a string array). Leave off for classic single-choice radio.\",\r\n },\r\n\r\n // Note: no placeholder (InputField prop), no className props, no render/callback props.\r\n },\r\n};\r\n","// src/react/inputs/registry/entries/checkbox.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const checkboxDescriptor: InputDescriptor = {\n Component: InputField as any,\n\n defaultProps: {\n variant: \"checkbox\", // MUST\n\n single: false,\n tristate: false,\n layout: \"list\",\n columns: 2,\n itemGapPx: 8,\n size: \"md\",\n density: \"comfortable\",\n autoCap: false,\n },\n adapter: {\n\n },\n\n ui: {\n size: sharedUi.size,\n\n density: {\n type: \"anyOf\",\n label: \"Density\",\n description: \"Vertical density of each option row.\",\n items: [\n { type: \"string\", title: \"Compact\", value: \"compact\" },\n { type: \"string\", title: \"Comfortable\", value: \"comfortable\" },\n { type: \"string\", title: \"Loose\", value: \"loose\" },\n ],\n },\n\n // group vs single behavior\n single: {\n type: \"boolean\",\n label: \"Single\",\n description:\n \"If enabled, behaves like a single checkbox (boolean). Otherwise renders a group (array).\",\n },\n\n tristate: {\n type: \"boolean\",\n label: \"Tri-state\",\n description:\n 'Enable tri-state behaviour (supports an internal \"none\" state).',\n },\n\n // layout\n layout: {\n type: \"anyOf\",\n label: \"Layout\",\n description: \"Arrange options as a vertical list or grid.\",\n items: [\n { type: \"string\", title: \"List\", value: \"list\" },\n { type: \"string\", title: \"Grid\", value: \"grid\" },\n ],\n },\n\n columns: {\n type: \"number\",\n label: \"Columns\",\n description: \"Number of columns when layout is grid.\",\n minimum: 1,\n },\n\n itemGapPx: {\n type: \"number\",\n label: \"Item gap (px)\",\n description: \"Gap between option rows/items in pixels.\",\n minimum: 0,\n },\n\n autoCap: {\n type: \"boolean\",\n label: \"Auto capitalise\",\n description:\n \"Capitalise the first letter of labels (only when label resolves to a string).\",\n },\n\n // options (primitive arrays or object arrays)\n options: {\n type: \"array\",\n label: \"Options\",\n description:\n \"Checkbox options. Can be primitives (string/number/boolean) or objects (label/value/description/disabled/tristate).\",\n editable: true,\n item: {\n type: \"object\",\n label: \"Option\",\n description: \"An option item for group mode.\",\n editable: true,\n fields: {\n value: {\n type: \"string\",\n label: \"Value\",\n description: \"Unique option value (string).\",\n },\n label: {\n type: \"string\",\n label: \"Label\",\n description: \"Display label for the option.\",\n },\n description: {\n type: \"string\",\n label: \"Description\",\n description: \"Optional helper text under the label.\",\n },\n disabled: {\n type: \"boolean\",\n label: \"Disabled\",\n description: \"Disable this option.\",\n },\n tristate: {\n type: \"boolean\",\n label: \"Tri-state override\",\n description:\n \"Override tri-state behaviour for this option (if unset, uses variant tristate).\",\n },\n },\n order: [\n \"value\",\n \"label\",\n \"description\",\n \"disabled\",\n \"tristate\",\n ],\n } as any,\n },\n\n // mapping keys (for custom item shapes)\n optionValue: {\n type: \"string\",\n label: \"Option value key\",\n description:\n \"Property name to read the option value from when using custom option objects.\",\n },\n\n optionLabel: {\n type: \"string\",\n label: \"Option label key\",\n description:\n \"Property name to read the option label from when using custom option objects.\",\n },\n\n // intentionally excluded:\n // - items (alias to options; keeping one is enough for builder)\n // - mappers (functions)\n // - renderOption (function)\n // - singleLabel/singleDescription (ReactNode)\n // - all *ClassName props (not allowed)\n },\n};\n","// src/react/inputs/registry/entries/chips.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const chipsDescriptor: InputDescriptor = {\n Component: InputField as any,\n\n defaultProps: {\n variant: \"chips\", // MUST\n\n // sensible defaults (these match the variant defaults)\n addOnEnter: true,\n addOnTab: true,\n addOnBlur: true,\n allowDuplicates: false,\n backspaceRemovesLast: true,\n clearable: false,\n textareaMode: false,\n placement: \"inline\",\n },\n\n ui: {\n // chips \"also supports most ShadcnTextVariantProps\" (size/density/etc.)\n size: sharedUi.size,\n density: sharedUi.density,\n ...sharedUi.padding,\n joinControls: sharedUi.joinControls,\n extendBoxToControls: sharedUi.extendBoxToControls,\n\n // NOTE: placeholder is an InputField prop in your system — exclude it here.\n\n separators: {\n type: \"array\",\n label: \"Separators\",\n description:\n 'Separators used to split raw input into chips (strings only in builder UI). Runtime default: [\",\", \";\"].',\n editable: true,\n item: {\n type: \"string\",\n label: \"Separator\",\n description: 'A string separator (e.g. \",\" or \";\").',\n },\n },\n\n addOnEnter: {\n type: \"boolean\",\n label: \"Add on Enter\",\n description: \"Commit chips when the user presses Enter.\",\n },\n\n addOnTab: {\n type: \"boolean\",\n label: \"Add on Tab\",\n description: \"Commit chips when the user presses Tab.\",\n },\n\n addOnBlur: {\n type: \"boolean\",\n label: \"Add on blur\",\n description: \"Commit chips when the input loses focus.\",\n },\n\n allowDuplicates: {\n type: \"boolean\",\n label: \"Allow duplicates\",\n description: \"If disabled, duplicate chips are ignored.\",\n },\n\n maxChips: {\n type: \"number\",\n label: \"Max chips\",\n description:\n \"Maximum number of chips allowed. Leave unset for unlimited.\",\n minimum: 1,\n },\n\n backspaceRemovesLast: {\n type: \"boolean\",\n label: \"Backspace removes last\",\n description:\n \"If enabled, Backspace on an empty input removes the last chip.\",\n },\n\n clearable: {\n type: \"boolean\",\n label: \"Clearable\",\n description: \"Show a clear-all button.\",\n },\n\n maxVisibleChips: {\n type: \"number\",\n label: \"Max visible chips\",\n description:\n 'Maximum number of chips to render before summarizing the rest as \"+N more\".',\n minimum: 1,\n },\n\n maxChipChars: {\n type: \"number\",\n label: \"Max chip chars\",\n description:\n \"Soft cap for chip display label length (UI-only; value is not truncated).\",\n minimum: 1,\n },\n\n maxChipWidth: {\n type: \"string\",\n label: \"Max chip width\",\n description:\n 'Soft cap for chip label width (CSS value, e.g. \"160px\" or \"12rem\").',\n },\n\n textareaMode: {\n type: \"boolean\",\n label: \"Textarea mode\",\n description:\n \"Use a textarea entry control instead of a single-line input.\",\n },\n\n placement: {\n type: \"anyOf\",\n label: \"Placement\",\n description:\n \"Where chips are rendered relative to the entry control.\",\n items: [\n { type: \"string\", title: \"Inline\", value: \"inline\" },\n { type: \"string\", title: \"Below\", value: \"below\" },\n ],\n },\n },\n};\n","// src/react/inputs/registry/entries/color.ts\r\nimport { InputField } from \"@timeax/form-palette\";\r\nimport type { InputDescriptor } from \"@/react\";\r\nimport { sharedUi } from \"./shared\";\r\n\r\nexport const colorDescriptor: InputDescriptor = {\r\n Component: InputField as any,\r\n\r\n defaultProps: {\r\n variant: \"color\", // MUST\r\n\r\n // sensible defaults (matches variant defaults)\r\n showPreview: true,\r\n showPickerToggle: true,\r\n previewSize: 18,\r\n\r\n // forwarded from text UI\r\n joinControls: true,\r\n extendBoxToControls: true,\r\n },\r\n\r\n ui: {\r\n // color inherits most text UI props (but we still only expose the shared-safe ones)\r\n size: sharedUi.size,\r\n density: sharedUi.density,\r\n ...sharedUi.padding,\r\n\r\n joinControls: sharedUi.joinControls,\r\n extendBoxToControls: sharedUi.extendBoxToControls,\r\n\r\n showPreview: {\r\n type: \"boolean\",\r\n label: \"Show preview\",\r\n description: \"Show the color swatch preview control.\",\r\n },\r\n\r\n showPickerToggle: {\r\n type: \"boolean\",\r\n label: \"Show picker toggle\",\r\n description: \"Show the picker toggle control/icon.\",\r\n },\r\n\r\n previewSize: {\r\n type: \"number\",\r\n label: \"Preview size\",\r\n description: \"Size of the color swatch in pixels.\",\r\n minimum: 8,\r\n maximum: 64,\r\n },\r\n },\r\n};\r\n","// src/react/inputs/registry/entries/date.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const dateDescriptor: InputDescriptor = {\n Component: InputField as any,\n\n defaultProps: {\n variant: \"date\", // MUST\n\n // sensible defaults (matches the variant defaults shown in code)\n mode: \"single\",\n kind: \"date\",\n clearable: true,\n\n // text-ui bits that date supports\n joinControls: true,\n extendBoxToControls: true,\n },\n\n ui: {\n // shared text-like tuning (date reuses ShadcnTextVariantProps minus value/onValue/etc.)\n size: sharedUi.size,\n density: sharedUi.density,\n ...sharedUi.padding,\n joinControls: sharedUi.joinControls,\n extendBoxToControls: sharedUi.extendBoxToControls,\n\n mode: {\n type: \"anyOf\",\n label: \"Mode\",\n description: \"Single date input or a date range picker.\",\n items: [\n { type: \"string\", title: \"Single\", value: \"single\" },\n { type: \"string\", title: \"Range\", value: \"range\" },\n ],\n },\n\n kind: {\n type: \"anyOf\",\n label: \"Kind\",\n description:\n \"Logical temporal kind. Controls default mask + formatting/parsing.\",\n items: [\n { type: \"string\", title: \"Date\", value: \"date\" },\n { type: \"string\", title: \"Date & time\", value: \"datetime\" },\n { type: \"string\", title: \"Time\", value: \"time\" },\n { type: \"string\", title: \"Hour\", value: \"hour\" },\n { type: \"string\", title: \"Month/Year\", value: \"monthYear\" },\n { type: \"string\", title: \"Year\", value: \"year\" },\n ],\n },\n\n clearable: {\n type: \"boolean\",\n label: \"Clearable\",\n description: \"Show a clear control to remove the selected value.\",\n },\n\n showCalendar: {\n type: \"boolean\",\n label: \"Show calendar\",\n description:\n \"Render the calendar popover. Defaults to true for date/datetime, false for time-only kinds.\",\n },\n\n // Formatting / display\n formatSingle: {\n type: \"string\",\n label: \"Single format\",\n description:\n 'Display pattern for single values (e.g. \"yyyy-MM-dd\", \"yyyy-MM-dd HH:mm\", \"HH:mm\").',\n },\n\n // NOTE: DateVariantProps allows formatRange as function too; builder exposes string only.\n formatRange: {\n type: \"string\",\n label: \"Range format\",\n description:\n \"Pattern applied to both ends of the range (string form only).\",\n },\n\n rangeSeparator: {\n type: \"string\",\n label: \"Range separator\",\n description:\n 'Separator between from/to in range display (default \" – \").',\n },\n\n stayOpenOnSelect: {\n type: \"boolean\",\n label: \"Stay open on select\",\n description:\n \"Keep the calendar open after selection (range stays open until both ends are picked).\",\n },\n\n inputMask: {\n type: \"string\",\n label: \"Input mask\",\n description:\n \"Optional explicit mask for typed input. Uses mask tokens: 9=digit, a=letter, *=alphanumeric.\",\n },\n\n // Intentionally excluded (non-builder-safe / non-serializable):\n // - placeholder (ReactNode)\n // - minDate/maxDate (Date objects)\n // - disabledDays (complex Calendar disabled type)\n // - open/onOpenChange (controlled popover)\n },\n};\n","// src/react/inputs/registry/entries/keyvalue.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const keyValueDescriptor: InputDescriptor = {\n Component: InputField as any,\n\n defaultProps: {\n variant: \"keyvalue\", // MUST\n\n min: 0,\n max: Infinity,\n\n // legacy (optional)\n // minVisible: undefined,\n // maxVisible: undefined,\n\n showValue: false,\n\n // text labels (strings are fine; variant accepts ReactNode)\n dialogTitle: \"Edit Item\",\n keyLabel: \"Key\",\n valueLabel: \"Value\",\n submitLabel: \"Save Changes\",\n emptyLabel: \"No items added\",\n },\n\n ui: {\n // keyvalue has its own density union (compact/comfortable/loose)\n size: sharedUi.size,\n\n density: {\n type: \"anyOf\",\n label: \"Density\",\n description: \"Vertical spacing preset for chips and controls.\",\n items: [\n { type: \"string\", title: \"Compact\", value: \"compact\" },\n { type: \"string\", title: \"Comfortable\", value: \"comfortable\" },\n { type: \"string\", title: \"Loose\", value: \"loose\" },\n ],\n },\n\n min: {\n type: \"number\",\n label: \"Min items\",\n description:\n \"Minimum number of entries allowed (prevents deletion below this).\",\n minimum: 0,\n },\n\n max: {\n type: \"number\",\n label: \"Max items\",\n description:\n \"Maximum number of entries allowed (prevents adding above this).\",\n minimum: 0,\n },\n\n // legacy compatibility knobs\n minVisible: {\n type: \"number\",\n label: \"Min visible (legacy)\",\n description:\n \"Legacy prop kept for compatibility; no longer drives visibility.\",\n minimum: 0,\n },\n\n maxVisible: {\n type: \"number\",\n label: \"Max visible (legacy)\",\n description:\n \"Legacy prop kept for compatibility; no longer drives visibility.\",\n minimum: 0,\n },\n\n showValue: {\n type: \"boolean\",\n label: \"Show value inline\",\n description:\n 'If enabled, inline chips show \"key : value\". In the dropdown, values are still available via info.',\n },\n\n dialogTitle: {\n type: \"string\",\n label: \"Dialog title\",\n description: \"Title shown at the top of the edit dialog.\",\n },\n\n keyLabel: {\n type: \"string\",\n label: \"Key label\",\n description: \"Label for the key input in the dialog.\",\n },\n\n valueLabel: {\n type: \"string\",\n label: \"Value label\",\n description: \"Label for the value input in the dialog.\",\n },\n\n submitLabel: {\n type: \"string\",\n label: \"Submit label\",\n description: \"Text for the dialog submit button.\",\n },\n\n emptyLabel: {\n type: \"string\",\n label: \"Empty label\",\n description: \"Text shown when there are no entries.\",\n },\n\n // intentionally excluded:\n // - placeholder (InputField prop; injected by registry helper)\n // - moreLabel (function)\n // - className/chipsClassName/chipClassName\n // - renderChip (render function)\n },\n};\n","// src/react/inputs/registry/entries/editor.ts\r\nimport { InputField } from \"@timeax/form-palette\";\r\nimport type { InputDescriptor } from \"@/react\";\r\nimport { sharedUi } from \"./shared\";\r\n\r\nexport const editorDescriptor: InputDescriptor = {\r\n Component: InputField as any,\r\n\r\n defaultProps: {\r\n variant: \"editor\", // MUST\r\n\r\n height: \"400px\",\r\n previewStyle: \"vertical\",\r\n editType: \"wysiwyg\",\r\n useCommandShortcut: true,\r\n\r\n // stored value format\r\n format: \"html\",\r\n\r\n // toolbar mode (we only support the safe enum values here)\r\n toolbar: \"default\",\r\n\r\n pastePlainText: false,\r\n },\r\n\r\n ui: {\r\n // editor supports size + density from VariantBaseProps\r\n size: sharedUi.size,\r\n density: sharedUi.density,\r\n\r\n height: {\r\n type: \"string\",\r\n label: \"Height\",\r\n description: 'Editor height (CSS value, e.g. \"400px\", \"60vh\").',\r\n },\r\n\r\n previewStyle: {\r\n type: \"anyOf\",\r\n label: \"Preview style\",\r\n description: \"How the preview is displayed (for markdown mode).\",\r\n items: [\r\n { type: \"string\", title: \"Vertical\", value: \"vertical\" },\r\n { type: \"string\", title: \"Tab\", value: \"tab\" },\r\n ],\r\n },\r\n\r\n editType: {\r\n type: \"anyOf\",\r\n label: \"Edit mode\",\r\n description: \"Initial editor mode.\",\r\n items: [\r\n { type: \"string\", title: \"WYSIWYG\", value: \"wysiwyg\" },\r\n { type: \"string\", title: \"Markdown\", value: \"markdown\" },\r\n ],\r\n },\r\n\r\n useCommandShortcut: {\r\n type: \"boolean\",\r\n label: \"Command shortcuts\",\r\n description: \"Enable editor keyboard shortcuts.\",\r\n },\r\n\r\n format: {\r\n type: \"anyOf\",\r\n label: \"Stored format\",\r\n description: \"Which format is stored in the form value.\",\r\n items: [\r\n { type: \"string\", title: \"HTML\", value: \"html\" },\r\n { type: \"string\", title: \"Markdown\", value: \"markdown\" },\r\n ],\r\n },\r\n\r\n toolbar: {\r\n type: \"anyOf\",\r\n label: \"Toolbar\",\r\n description:\r\n 'Toolbar mode. \"default\" uses built-in tools; \"none\" hides tools and mode switch.',\r\n items: [\r\n { type: \"string\", title: \"Default\", value: \"default\" },\r\n { type: \"string\", title: \"None\", value: \"none\" },\r\n ],\r\n },\r\n\r\n pastePlainText: {\r\n type: \"boolean\",\r\n label: \"Paste as plain text\",\r\n description: \"If enabled, paste is inserted as plain text only.\",\r\n },\r\n\r\n // excluded on purpose:\r\n // - placeholder (InputField prop; injected by registry helper)\r\n // - className (not allowed)\r\n // - toolbar as array (ToastToolbarItem[][] not builder-safe)\r\n },\r\n};\r\n","// src/react/inputs/registry/entries/lister.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\nimport type { Ui } from \"@/schema\";\n\nconst listerUi = {\n // ─────────────────────────────────────────────\n // Selection behaviour\n // ─────────────────────────────────────────────\n mode: {\n type: \"anyOf\",\n label: \"Selection mode\",\n description: 'Whether the lister selects one value (\"single\") or many (\"multiple\").',\n items: [\n { type: \"string\", title: \"Single\", value: \"single\" },\n { type: \"string\", title: \"Multiple\", value: \"multiple\" },\n ],\n } satisfies Ui,\n\n confirm: {\n type: \"boolean\",\n label: \"Confirm\",\n description:\n 'When enabled (single-mode only), require confirmation before committing selection.',\n } satisfies Ui,\n\n remoteDebounceMs: {\n type: \"number\",\n label: \"Remote debounce (ms)\",\n description: \"Debounce duration for remote search requests.\",\n minimum: 0,\n } satisfies Ui,\n\n // permissions?: string[] (primitive array)\n permissions: {\n type: \"array\",\n label: \"Permissions\",\n description: \"Optional permission keys passed to the lister provider/open UI.\",\n editable: true,\n item: {\n type: \"string\",\n label: \"Permission\",\n description: \"One permission key.\",\n } satisfies Ui,\n } satisfies Ui,\n\n // ─────────────────────────────────────────────\n // Inline source (when not using a base `def`)\n // ─────────────────────────────────────────────\n endpoint: {\n type: \"string\",\n label: \"Endpoint\",\n description: \"Inline endpoint for fetching options (standalone mode).\",\n } satisfies Ui,\n\n method: {\n type: \"anyOf\",\n label: \"HTTP method\",\n description: \"HTTP method for inline endpoint requests.\",\n items: [\n { type: \"string\", title: \"GET\", value: \"GET\" },\n { type: \"string\", title: \"POST\", value: \"POST\" },\n ],\n } satisfies Ui,\n\n selector: {\n type: \"string\",\n label: \"Selector\",\n description:\n 'Selector key/path for extracting the list from a response (e.g. \"data\").',\n } satisfies Ui,\n\n // ─────────────────────────────────────────────\n // Mapping (ctx-aware in code, but schema-configurable as keys)\n // ─────────────────────────────────────────────\n optionValue: {\n type: \"string\",\n label: \"Option value key\",\n description: \"Key to read the value/id from each raw option object.\",\n } satisfies Ui,\n\n optionLabel: {\n type: \"string\",\n label: \"Option label key\",\n description: \"Key to read the display label from each raw option object.\",\n } satisfies Ui,\n\n optionDescription: {\n type: \"string\",\n label: \"Option description key\",\n description: \"Key to read the description line from each raw option object.\",\n } satisfies Ui,\n\n optionDisabled: {\n type: \"string\",\n label: \"Option disabled key\",\n description: \"Key to determine if an option is disabled.\",\n } satisfies Ui,\n\n optionIcon: {\n type: \"string\",\n label: \"Option icon key\",\n description: \"Key to read an icon value from each raw option object.\",\n } satisfies Ui,\n\n optionGroup: {\n type: \"string\",\n label: \"Option group key\",\n description: \"Key used to group options (if grouping is supported by the open UI).\",\n } satisfies Ui,\n\n // ─────────────────────────────────────────────\n // Search spec / open options (primitive-friendly subset)\n // ─────────────────────────────────────────────\n title: {\n type: \"string\",\n label: \"Title\",\n description: \"Title shown on the open/picker UI.\",\n } satisfies Ui,\n\n searchMode: {\n type: \"string\",\n label: \"Search mode\",\n description: \"Search behaviour/mode for the open UI (provider-defined).\",\n } satisfies Ui,\n\n initialQuery: {\n type: \"string\",\n label: \"Initial query\",\n description: \"Initial query state for the open UI.\",\n } satisfies Ui,\n\n showRefresh: {\n type: \"boolean\",\n label: \"Show refresh\",\n description: \"Show refresh button in the open UI.\",\n } satisfies Ui,\n\n refreshMode: {\n type: \"string\",\n label: \"Refresh mode\",\n description: \"Refresh behaviour/mode (provider-defined).\",\n } satisfies Ui,\n\n // ─────────────────────────────────────────────\n // Trigger display (primitive subset)\n // ─────────────────────────────────────────────\n placeholder: {\n type: \"string\",\n label: \"Placeholder\",\n description: \"Placeholder text shown when no value is selected.\",\n } satisfies Ui,\n\n maxDisplayItems: {\n type: \"number\",\n label: \"Max display items\",\n description:\n \"Maximum number of selected items to render in the closed trigger summary.\",\n minimum: 0,\n } satisfies Ui,\n\n clearable: {\n type: \"boolean\",\n label: \"Clearable\",\n description: \"Allow clearing the current selection.\",\n } satisfies Ui,\n\n // IMPORTANT: trigger style is documented in README as `mode`,\n // but `mode` is already selection mode in the real prop surface.\n triggerMode: {\n type: \"anyOf\",\n label: \"Trigger style\",\n description: 'Trigger style: \"default\" (input-like) or \"button\" (custom trigger).',\n items: [\n { type: \"string\", title: \"Default\", value: \"default\" },\n { type: \"string\", title: \"Button\", value: \"button\" },\n ],\n } satisfies Ui,\n\n // ─────────────────────────────────────────────\n // Shared layout knobs you *do* want exposed\n // ─────────────────────────────────────────────\n joinControls: sharedUi.joinControls,\n extendBoxToControls: sharedUi.extendBoxToControls,\n size: sharedUi.size,\n density: sharedUi.density,\n padding: {\n type: \"object\",\n label: \"Padding\",\n description: \"Padding overrides.\",\n editable: false,\n fields: {\n px: sharedUi.padding.px,\n py: sharedUi.padding.py,\n ps: sharedUi.padding.ps,\n pe: sharedUi.padding.pe,\n pb: sharedUi.padding.pb,\n },\n } satisfies Ui,\n} as const;\n\nexport const listerDescriptor: InputDescriptor = {\n Component: InputField as any,\n defaultProps: { variant: \"lister\" },\n ui: listerUi,\n};","// src/react/inputs/registry/entries/file.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const fileDescriptor: InputDescriptor = {\n Component: InputField as any,\n\n defaultProps: {\n variant: \"file\", // MUST\n\n // sensible defaults (optional)\n multiple: false,\n mergeMode: \"append\",\n showDropArea: false,\n showCheckboxes: true,\n custom: false,\n // placeholder exists on the variant, but per your rule we DON'T declare it here\n },\n\n ui: {\n size: sharedUi.size,\n\n // file has its own density union\n density: {\n type: \"anyOf\",\n label: \"Density\",\n description: \"Spacing preset for the trigger + list UI.\",\n items: [\n { type: \"string\", title: \"Compact\", value: \"compact\" },\n { type: \"string\", title: \"Comfortable\", value: \"comfortable\" },\n { type: \"string\", title: \"Loose\", value: \"loose\" },\n ],\n },\n\n multiple: {\n type: \"boolean\",\n label: \"Multiple\",\n description: \"Allow selecting multiple files.\",\n },\n\n accept: {\n type: \"array\",\n label: \"Accepted types\",\n description:\n 'Accepted MIME types / extensions (e.g. \"image/*\", \".png\", \"application/pdf\").',\n editable: true,\n item: {\n type: \"string\",\n label: \"Type\",\n description: \"A MIME type or extension.\",\n },\n },\n\n maxFiles: {\n type: \"number\",\n label: \"Max files\",\n description:\n \"Maximum number of files allowed (leave unset for unlimited).\",\n minimum: 1,\n },\n\n maxTotalSize: {\n type: \"number\",\n label: \"Max total size (bytes)\",\n description:\n \"Maximum total size across all selected files in bytes (leave unset for unlimited).\",\n minimum: 1,\n },\n\n mergeMode: {\n type: \"anyOf\",\n label: \"Merge mode\",\n description:\n 'How new picks are merged into the current selection (\"append\" or \"replace\").',\n items: [\n { type: \"string\", title: \"Append\", value: \"append\" },\n { type: \"string\", title: \"Replace\", value: \"replace\" },\n ],\n },\n\n showDropArea: {\n type: \"boolean\",\n label: \"Show drop area\",\n description: \"Show a drag-and-drop area inside the picker.\",\n },\n\n // these are ReactNode in the variant, but strings are safe + useful in builder\n dropTitle: {\n type: \"string\",\n label: \"Drop title\",\n description: \"Title text shown in the drop area.\",\n },\n\n dropDescription: {\n type: \"string\",\n label: \"Drop description\",\n description: \"Supporting text shown in the drop area.\",\n },\n\n custom: {\n type: \"boolean\",\n label: \"Custom loader\",\n description:\n \"Enable a host-provided custom loader (host must wire customLoader at runtime).\",\n },\n\n showCheckboxes: {\n type: \"boolean\",\n label: \"Show checkboxes\",\n description:\n \"Show selection checkboxes for file rows inside the picker.\",\n },\n\n asRaw: {\n type: \"boolean\",\n label: \"As raw (legacy)\",\n description:\n \"Legacy compatibility flag. The submitted value is still File|string; raw items are available via change detail meta.\",\n },\n\n // intentionally excluded:\n // - placeholder (InputField prop, injected by your registry helper)\n // - dropIcon (ReactNode)\n // - renderDropArea / renderFileItem (functions)\n // - customLoader (function)\n // - formatFileName / formatFileSize (functions)\n // - all *ClassName props (not allowed)\n // - button mode trigger props (ReactNode/functions)\n },\n};\n","// src/react/inputs/registry/entries/index.ts\nimport type { InputDescriptor, Registry, Ui } from \"@/react\";\n\nimport { textDescriptor } from \"./text\";\nimport { textareaDescriptor } from \"./textarea\";\nimport { phoneDescriptor } from \"./phone\";\nimport { toggleGroupDescriptor } from \"./toggle-group\";\nimport { numberDescriptor } from \"./number\";\nimport { passwordDescriptor } from \"./password\";\nimport { sliderDescriptor } from \"./slider\";\nimport { toggleDescriptor } from \"./toggle\";\nimport { treeSelectDescriptor } from \"./treeselect\";\nimport { multiSelectDescriptor } from \"./multiselect\";\nimport { selectDescriptor } from \"./select\";\nimport { radioDescriptor } from \"./radio\";\nimport { checkboxDescriptor } from \"./checkbox\";\nimport { chipsDescriptor } from \"./chips\";\nimport { colorDescriptor } from \"./color\";\nimport { dateDescriptor } from \"./date\";\nimport { keyValueDescriptor } from \"./keyvalue\";\nimport { editorDescriptor } from \"./editor\";\nimport { listerDescriptor } from \"./lister\";\nimport { fileDescriptor } from \"./file\";\n\n/**\n * InputField-level UI props (injected for every descriptor at registration time).\n * NOTE: keep this list tight—only props that truly belong to InputField itself.\n */\nconst inputFieldUi: Record<string, Ui> = {\n // --- Chrome / helper text (builder-friendly) ---\n sublabel: {\n type: \"string\",\n label: \"Sublabel\",\n description:\n \"Secondary label text shown near the main label (if supported).\",\n },\n\n description: {\n type: \"string\",\n label: \"Description\",\n description: \"Helper description shown under the label.\",\n },\n\n helpText: {\n type: \"string\",\n label: \"Help text\",\n description: \"Additional helper text shown in the help slot.\",\n },\n\n // --- Placement hints (layout-only; host decides exact behavior) ---\n labelPlacement: {\n type: \"string\",\n label: \"Label placement\",\n description: \"Layout hint for where the label is rendered.\",\n } as Ui,\n\n sublabelPlacement: {\n type: \"string\",\n label: \"Sublabel placement\",\n description: \"Layout hint for where the sublabel is rendered.\",\n } as Ui,\n\n descriptionPlacement: {\n type: \"string\",\n label: \"Description placement\",\n description: \"Layout hint for where the description is rendered.\",\n } as Ui,\n\n helpTextPlacement: {\n type: \"string\",\n label: \"Help text placement\",\n description: \"Layout hint for where the help text is rendered.\",\n } as Ui,\n\n tagPlacement: {\n type: \"string\",\n label: \"Tag placement\",\n description: \"Layout hint for where tags are rendered.\",\n } as Ui,\n\n // --- Tags (builder-safe subset; host maps to FieldTag) ---\n tags: {\n type: \"array\",\n label: \"Tags\",\n description:\n \"Small tag badges shown near the label. Builder-safe subset (label/color/bgColor).\",\n editable: true,\n item: {\n type: \"object\",\n label: \"Tag\",\n description: \"A label tag.\",\n editable: true,\n fields: {\n label: {\n type: \"string\",\n label: \"Label\",\n description: \"Tag text.\",\n },\n color: {\n type: \"string\",\n label: \"Text color\",\n description: 'CSS color value (e.g. \"#fff\" or \"rgb(...)\").',\n },\n bgColor: {\n type: \"string\",\n label: \"Background color\",\n description: 'CSS color value (e.g. \"#111\").',\n },\n },\n order: [\"label\", \"color\", \"bgColor\"],\n } as Ui,\n } satisfies Ui,\n\n disabled: {\n type: \"boolean\",\n label: \"Disabled\",\n description: \"Disable user interaction with the field.\",\n },\n\n readOnly: {\n type: \"boolean\",\n label: \"Read-only\",\n description: \"Prevent edits while still allowing focus/selection.\",\n },\n\n // --- Layout flags ---\n inline: {\n type: \"boolean\",\n label: \"Inline\",\n description:\n \"Render label + input in an inline row layout (if supported).\",\n },\n\n fullWidth: {\n type: \"boolean\",\n label: \"Full width\",\n description:\n \"Stretch the field to fill its container width (if supported).\",\n },\n};\n\nfunction withInputFieldUi(desc: InputDescriptor): InputDescriptor {\n return {\n ...desc,\n adapter: {\n getValue(e: any) {\n return e.value;\n },\n valueProp: \"value\",\n changeProp: \"onChange\",\n getInputPropsFromField({ field, props }) {\n const severityPillClassMap = {\n info: \"border-blue-200 bg-blue-50 text-blue-700 ring-1 ring-inset ring-blue-200\",\n warning:\n \"border-amber-200 bg-amber-50 text-amber-800 ring-1 ring-inset ring-amber-200\",\n error: \"border-red-200 bg-red-50 text-red-700 ring-1 ring-inset ring-red-200\",\n } as const;\n\n const pillBaseClassName =\n \"inline-flex items-center rounded-full border px-2.5 py-1 text-xs font-medium\";\n\n const toTagPill = (tag: any) => ({\n label: tag.title,\n bgColor: tag.color,\n className: `${pillBaseClassName} ${severityPillClassMap[tag.severity as keyof typeof severityPillClassMap] ?? severityPillClassMap.info}`,\n });\n\n const matchesNotice = (\n target: { id?: unknown; service_id?: unknown },\n notice: { id?: unknown },\n ) =>\n notice.id === target.id ||\n (!!target.service_id && target.service_id == notice.id);\n\n const notices = props.notices ?? [];\n\n const fieldNotices = notices.filter((notice) =>\n matchesNotice(field, notice),\n );\n\n return {\n label: field.label,\n tags: fieldNotices.map(toTagPill),\n\n ...(field.options?.length\n ? {\n options: field.options.map((item) => {\n // @ts-ignore\n const optionNotices = notices.filter(\n (notice) => matchesNotice(item, notice),\n );\n\n return {\n ...item,\n tags: optionNotices.map(toTagPill),\n };\n }),\n }\n : {}),\n };\n },\n getSelectedOptions(next, currentt, ctx) {\n return ((next as any)?.selectedOptions ?? [])?.map(\n (item: any) => item.id,\n );\n },\n\n isActive(stored, ctx) {\n return Boolean(stored);\n },\n },\n ui: {\n ...inputFieldUi,\n ...(desc.ui ?? {}),\n },\n };\n}\n\nfunction variantOf(desc: InputDescriptor): string {\n const v = (desc.defaultProps as any)?.variant;\n if (!v || typeof v !== \"string\") {\n throw new Error(\n `[inputs] Descriptor is missing defaultProps.variant: ${String(v)}`,\n );\n }\n return v;\n}\n\n/**\n * Register all built-in entries.\n * - You said \"variant is the only thing necessary\", so we treat kind as a constant.\n */\nexport function registerEntries(registry: Registry): void {\n const entries: InputDescriptor[] = [\n textDescriptor,\n textareaDescriptor,\n phoneDescriptor,\n toggleGroupDescriptor,\n numberDescriptor,\n passwordDescriptor,\n sliderDescriptor,\n toggleDescriptor,\n treeSelectDescriptor,\n multiSelectDescriptor,\n selectDescriptor,\n radioDescriptor,\n checkboxDescriptor,\n chipsDescriptor,\n colorDescriptor,\n dateDescriptor,\n keyValueDescriptor,\n editorDescriptor,\n listerDescriptor,\n fileDescriptor,\n ];\n\n registry.registerMany(\n entries.map((descriptor) => {\n const finalDescriptor = withInputFieldUi(descriptor);\n const variant = variantOf(finalDescriptor);\n\n return {\n kind: variant,\n descriptor: finalDescriptor,\n };\n }),\n );\n}\n\n// re-export entries (optional convenience)\nexport {\n textDescriptor,\n textareaDescriptor,\n phoneDescriptor,\n toggleGroupDescriptor,\n numberDescriptor,\n passwordDescriptor,\n sliderDescriptor,\n toggleDescriptor,\n treeSelectDescriptor,\n multiSelectDescriptor,\n selectDescriptor,\n radioDescriptor,\n checkboxDescriptor,\n chipsDescriptor,\n colorDescriptor,\n dateDescriptor,\n keyValueDescriptor,\n editorDescriptor,\n listerDescriptor,\n fileDescriptor,\n};\n"],"mappings":"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","names":["_a","_b","cloneDeep","rest","_a","out","_a","isFiniteNumber","getCap","_a","_b","_c","_d","_e","_f","_g","f","isOptionBased","cloneDeep","p","passesRate","uniq","_a","createContext","useContext","useMemo","jsx","Ctx","createContext","useMemo","useContext","React","useMemo","useCallback","useEffect","useMemo","useRef","useState","createContext","useCallback","useContext","useEffect","useMemo","useRef","useState","jsx","createContext","useContext","OrderFlowProvider","useRef","useState","useCallback","useEffect","useMemo","ROOT_TAG_ID","useCallback","useRef","useEffect","useState","useMemo","_a","_b","_c","jsx","str","useMemo","_a","isOptionBased","_b","_c","_d","_e","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","_a"]}
|
|
1
|
+
{"version":3,"sources":["../../src/react/canvas/events.ts","../../src/utils/retry-queue.ts","../../src/react/canvas/comments.ts","../../src/react/canvas/editor.ts","../../src/core/normalise.ts","../../src/core/validate/shared.ts","../../src/core/node-map.ts","../../src/core/visibility.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/utils/prune-fallbacks.ts","../../src/utils/util.ts","../../src/utils/build-order-snapshot.ts","../../src/core/policy.ts","../../src/react/canvas/selection.ts","../../src/react/canvas/api.ts","../../src/react/inputs/form-context.tsx","../../src/react/inputs/registry.ts","../../src/react/inputs/provider.tsx","../../src/react/inputs/wrapper.tsx","../../src/react/hooks/use-order-flow.ts","../../src/react/hooks/order-flow-provider.tsx","../../src/react/inputs/entries/text.tsx","../../src/react/inputs/entries/shared.ts","../../src/react/inputs/entries/textarea.tsx","../../src/react/inputs/entries/phone.tsx","../../src/react/inputs/entries/toggle-group.tsx","../../src/react/inputs/entries/number.tsx","../../src/react/inputs/entries/password.tsx","../../src/react/inputs/entries/slider.tsx","../../src/react/inputs/entries/toggle.tsx","../../src/react/inputs/entries/treeselect.tsx","../../src/react/inputs/entries/multiselect.tsx","../../src/react/inputs/entries/select.tsx","../../src/react/inputs/entries/radio.tsx","../../src/react/inputs/entries/checkbox.tsx","../../src/react/inputs/entries/chips.tsx","../../src/react/inputs/entries/color.tsx","../../src/react/inputs/entries/date.tsx","../../src/react/inputs/entries/keyvalue.tsx","../../src/react/inputs/entries/editor.tsx","../../src/react/inputs/entries/lister.tsx","../../src/react/inputs/entries/file.tsx","../../src/react/inputs/entries/index.ts"],"sourcesContent":["// Lightweight, typed event bus\r\nexport type EventMap = Record<string, unknown>;\r\n\r\nexport class EventBus<E extends EventMap> {\r\n private listeners = new Map<keyof E, Set<(p: any) => void>>();\r\n\r\n on<K extends keyof E>(event: K, handler: (payload: E[K]) => void): () => void {\r\n const set = this.listeners.get(event) ?? new Set();\r\n set.add(handler as any);\r\n this.listeners.set(event, set);\r\n return () => {\r\n set.delete(handler as any);\r\n };\r\n }\r\n\r\n once<K extends keyof E>(event: K, handler: (payload: E[K]) => void): () => void {\r\n const off = this.on(event, (p) => {\r\n off();\r\n handler(p);\r\n });\r\n return off;\r\n }\r\n\r\n emit<K extends keyof E>(event: K, payload: E[K]): void {\r\n const set = this.listeners.get(event);\r\n if (!set || set.size === 0) return;\r\n for (const h of Array.from(set)) try {\r\n (h as any)(payload);\r\n } catch { /* swallow */\r\n }\r\n }\r\n\r\n clear(): void {\r\n this.listeners.clear();\r\n }\r\n}","// noinspection JSIgnoredPromiseFromCall\r\n\r\nexport type RetryStatus = 'scheduled' | 'retrying' | 'succeeded' | 'failed' | 'cancelled';\r\n\r\nexport type RetryOptions = {\r\n enabled?: boolean; // default true\r\n maxAttempts?: number; // default 5\r\n baseDelayMs?: number; // default 800\r\n maxDelayMs?: number; // default 20_000\r\n jitter?: boolean; // default true\r\n /** Run the first attempt immediately (no initial delay) */\r\n immediateFirst?: boolean;\r\n};\r\n\r\nexport type RetryJob = {\r\n /** Stable id for de-duplication (e.g., \"comments:create_thread:loc_abc\") */\r\n id: string;\r\n /** Called on each attempt; return true to signal success, false/throw to retry */\r\n perform: (attempt: number) => Promise<boolean>;\r\n onStatus?: (status: RetryStatus, meta?: { attempt: number; nextDelayMs?: number; error?: unknown }) => void;\r\n};\r\n\r\nexport class RetryQueue {\r\n private readonly opts: Required<RetryOptions>;\r\n private jobs = new Map<string, { job: RetryJob; attempt: number; timer?: any; cancelled?: boolean }>();\r\n private paused = false;\r\n\r\n constructor(opts: RetryOptions = {}) {\r\n this.opts = {\r\n enabled: opts.enabled ?? true,\r\n maxAttempts: opts.maxAttempts ?? 5,\r\n baseDelayMs: opts.baseDelayMs ?? 800,\r\n maxDelayMs: opts.maxDelayMs ?? 20_000,\r\n jitter: opts.jitter ?? true,\r\n immediateFirst: opts.immediateFirst ?? false,\r\n };\r\n }\r\n\r\n pause() {\r\n this.paused = true;\r\n }\r\n\r\n resume() {\r\n this.paused = false;\r\n this.flush();\r\n }\r\n\r\n /** Enqueue or no-op if a job with same id already exists */\r\n enqueue(job: RetryJob): boolean {\r\n if (!this.opts.enabled) return false;\r\n if (this.jobs.has(job.id)) return false;\r\n this.jobs.set(job.id, {job, attempt: 0});\r\n job.onStatus?.('scheduled', {attempt: 0});\r\n this.kick(job.id);\r\n return true;\r\n }\r\n\r\n /** Force retry now (resets backoff); returns false if not found */\r\n triggerNow(id: string): boolean {\r\n const rec = this.jobs.get(id);\r\n if (!rec) return false;\r\n if (rec.timer) clearTimeout(rec.timer);\r\n rec.timer = undefined;\r\n this.kick(id, true);\r\n return true;\r\n }\r\n\r\n cancel(id: string): boolean {\r\n const rec = this.jobs.get(id);\r\n if (!rec) return false;\r\n if (rec.timer) clearTimeout(rec.timer);\r\n rec.cancelled = true;\r\n rec.job.onStatus?.('cancelled', {attempt: rec.attempt});\r\n this.jobs.delete(id);\r\n return true;\r\n }\r\n\r\n pendingIds(): string[] {\r\n return Array.from(this.jobs.keys());\r\n }\r\n\r\n size(): number {\r\n return this.jobs.size;\r\n }\r\n\r\n isQueued(id: string): boolean {\r\n return this.jobs.has(id);\r\n }\r\n\r\n drain(): void {\r\n for (const [id, rec] of this.jobs.entries()) {\r\n if (rec.timer) clearTimeout(rec.timer);\r\n rec.cancelled = true;\r\n rec.job.onStatus?.('cancelled', {attempt: rec.attempt});\r\n this.jobs.delete(id);\r\n }\r\n }\r\n\r\n private flush() {\r\n for (const id of this.jobs.keys()) this.kick(id);\r\n }\r\n\r\n private delayFor(attempt: number): number {\r\n const {baseDelayMs, maxDelayMs, jitter} = this.opts;\r\n const exp = Math.min(maxDelayMs, baseDelayMs * Math.pow(2, Math.max(0, attempt - 1)));\r\n if (!jitter) return exp;\r\n const r = Math.random() * 0.4 + 0.8; // 0.8x .. 1.2x\r\n return Math.min(maxDelayMs, Math.floor(exp * r));\r\n }\r\n\r\n private async kick(id: string, immediate = false) {\r\n const rec = this.jobs.get(id);\r\n if (!rec || rec.cancelled) return;\r\n\r\n if (this.paused && !immediate) return;\r\n\r\n const attempt = rec.attempt + 1;\r\n const run = async () => {\r\n if (rec.cancelled) return;\r\n rec.job.onStatus?.('retrying', {attempt});\r\n try {\r\n const ok = await rec.job.perform(attempt);\r\n if (ok) {\r\n rec.job.onStatus?.('succeeded', {attempt});\r\n this.jobs.delete(id);\r\n return;\r\n }\r\n } catch (err) {\r\n // fallthrough to schedule next\r\n rec.job.onStatus?.('failed', {attempt, error: err});\r\n }\r\n\r\n if (attempt >= this.opts.maxAttempts) {\r\n rec.job.onStatus?.('failed', {attempt});\r\n this.jobs.delete(id);\r\n return;\r\n }\r\n\r\n rec.attempt = attempt;\r\n const delay = this.delayFor(attempt);\r\n rec.job.onStatus?.('scheduled', {attempt, nextDelayMs: delay});\r\n rec.timer = setTimeout(() => this.kick(id), delay);\r\n };\r\n\r\n if (immediate) await run();\r\n else {\r\n // First attempt: respect immediateFirst option; otherwise, schedule immediately\r\n const delay = this.opts.immediateFirst && attempt === 1 ? 0 : this.delayFor(attempt);\r\n\r\n if (delay) {\r\n rec.job.onStatus?.('scheduled', {attempt: 0, nextDelayMs: delay});\r\n rec.timer = setTimeout(run, delay);\r\n } else {\r\n void run();\r\n }\r\n }\r\n }\r\n}","// src/react/canvas/comments.ts\nimport type { EventBus } from \"@/react\";\nimport type { CanvasEvents } from \"@/schema/canvas-types\";\nimport type {\n CommentsBackend,\n BackendError,\n BackendScope,\n} from \"../workspace/context/backend\";\nimport {\n RetryQueue,\n type RetryOptions as RetryOpts,\n} from \"../../utils/retry-queue\";\nimport {\n CommentAnchor,\n CommentId,\n CommentMessage,\n CommentThread,\n ThreadId,\n} from \"@/schema/comments\";\n\nlet __seq = 0;\nconst newLocalId = (p = \"loc\"): string =>\n `${p}_${Date.now().toString(36)}_${(++__seq).toString(36)}`;\n\ntype SyncState = \"pending\" | \"synced\" | \"error\";\ntype SyncThread = CommentThread & { _sync?: SyncState };\n\ntype CommentsDeps = {\n backend?: CommentsBackend<CommentThread, CommentMessage, CommentAnchor>;\n getScope?: () => BackendScope | undefined;\n retry?: RetryOpts;\n};\n\nexport class CommentsAPI {\n private threads = new Map<ThreadId, SyncThread>();\n private bus: EventBus<CanvasEvents>;\n private deps: CommentsDeps;\n private retry: RetryQueue;\n\n constructor(bus: EventBus<CanvasEvents>, deps: CommentsDeps = {}) {\n this.bus = bus;\n this.deps = deps;\n this.retry = new RetryQueue(deps.retry);\n }\n\n private scope(): BackendScope | undefined {\n return this.deps.getScope?.();\n }\n\n private emitSync(\n op: CanvasEvents[\"comment:sync\"][\"op\"],\n threadId: string,\n messageId: string | undefined,\n status: CanvasEvents[\"comment:sync\"][\"status\"],\n meta: {\n attempt: number;\n nextDelayMs?: number;\n error?: BackendError | unknown;\n },\n ): void {\n this.bus.emit(\"comment:sync\", {\n op,\n threadId,\n messageId,\n status,\n attempt: meta.attempt,\n nextDelayMs: meta.nextDelayMs,\n error: meta.error,\n });\n }\n\n /* ─── Persistence bridge ───────────────────────────── */\n\n async loadAll(): Promise<void> {\n if (!this.deps.backend) return;\n\n const scope = this.scope();\n if (!scope) return;\n\n const res = await this.deps.backend.listThreads(scope);\n\n if (!res.ok) {\n this.bus.emit(\"error\", {\n message: res.error.message,\n code: res.error.code,\n meta: res.error.meta,\n });\n return;\n }\n\n this.threads.clear();\n for (const th of res.value) {\n this.threads.set(th.id, { ...(th as CommentThread), _sync: \"synced\" });\n }\n\n // signal refresh (kept as-is)\n this.bus.emit(\"comment:thread:update\", { thread: undefined as any });\n }\n\n /* ─── Query ─────────────────────────────────────────── */\n\n list(): CommentThread[] {\n return Array.from(this.threads.values())\n .sort((a, b) => a.createdAt - b.createdAt)\n .map((t) => t as CommentThread);\n }\n\n get(id: ThreadId): CommentThread | undefined {\n return this.threads.get(id) as CommentThread | undefined;\n }\n\n /* ─── Mutations (optimistic if backend present) ─────── */\n\n async create(\n anchor: CommentAnchor,\n initialBody: string,\n meta?: Record<string, unknown>,\n ): Promise<ThreadId> {\n const now = Date.now();\n const localId = newLocalId(\"t\");\n const msgId = newLocalId(\"m\");\n\n const hasBackend = Boolean(this.deps.backend && this.scope());\n\n const local: SyncThread = {\n id: localId,\n anchor,\n resolved: false,\n createdAt: now,\n updatedAt: now,\n messages: [{ id: msgId, body: initialBody, createdAt: now }],\n meta,\n _sync: hasBackend ? \"pending\" : \"synced\",\n };\n\n this.threads.set(localId, local);\n this.bus.emit(\"comment:thread:create\", { thread: local as any });\n\n if (!this.deps.backend) return localId;\n\n const performOnce = async (): Promise<ThreadId> => {\n const scope = this.scope();\n if (!scope) return localId;\n\n const res = await this.deps.backend!.createThread(scope, {\n anchor,\n body: initialBody,\n meta,\n });\n\n if (!res.ok) throw res.error;\n\n // Swap local→server on success (kept behavior)\n this.threads.delete(localId);\n\n const serverTh: SyncThread = {\n ...(res.value as CommentThread),\n _sync: \"synced\",\n };\n\n this.threads.set(serverTh.id, serverTh);\n this.bus.emit(\"comment:thread:update\", { thread: serverTh as any });\n\n return serverTh.id;\n };\n\n try {\n const serverId = await performOnce();\n return serverId;\n } catch (err) {\n const scope = this.scope();\n const branchKey = scope?.branchId ?? \"no_branch\";\n const jobId = `comments:create_thread:${branchKey}:${localId}`;\n\n this.retry.enqueue({\n id: jobId,\n perform: async () => {\n try {\n await performOnce();\n return true;\n } catch {\n return false;\n }\n },\n onStatus: (status, meta2) =>\n this.emitSync(\n \"create_thread\",\n localId,\n undefined,\n status,\n meta2 ?? { attempt: 0 },\n ),\n });\n\n local._sync = \"error\";\n this.bus.emit(\"error\", {\n message: (err as BackendError)?.message ?? \"Create failed\",\n code: (err as BackendError)?.code,\n meta: err,\n });\n this.bus.emit(\"comment:thread:update\", { thread: local as any });\n\n return localId;\n }\n }\n\n async reply(\n threadId: ThreadId,\n body: string,\n meta?: Record<string, unknown>,\n ): Promise<CommentId> {\n const th = this.ensure(threadId);\n const now = Date.now();\n const localMid = newLocalId(\"m\");\n\n const hasBackend = Boolean(this.deps.backend && this.scope());\n\n const localMsg: CommentMessage = {\n id: localMid,\n body,\n createdAt: now,\n meta,\n };\n\n th.messages.push(localMsg);\n th.updatedAt = now;\n th._sync ??= hasBackend ? \"pending\" : \"synced\";\n\n this.bus.emit(\"comment:message:create\", {\n threadId,\n message: localMsg as any,\n });\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n\n if (!this.deps.backend) return localMid;\n\n const performOnce = async (): Promise<CommentId> => {\n const scope = this.scope();\n if (!scope) return localMid;\n\n const res = await this.deps.backend!.addMessage(scope, {\n threadId: th.id,\n body,\n meta,\n });\n\n if (!res.ok) throw res.error;\n\n const serverMsg = res.value as CommentMessage;\n const idx = th.messages.findIndex((m) => m.id === localMid);\n if (idx >= 0) th.messages[idx] = serverMsg;\n\n th._sync = \"synced\";\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n\n return serverMsg.id;\n };\n\n try {\n const serverMid = await performOnce();\n return serverMid;\n } catch (err) {\n const scope = this.scope();\n const branchKey = scope?.branchId ?? \"no_branch\";\n const jobId = `comments:add_message:${branchKey}:${threadId}:${localMid}`;\n\n this.retry.enqueue({\n id: jobId,\n perform: async () => {\n try {\n await performOnce();\n return true;\n } catch {\n return false;\n }\n },\n onStatus: (status, meta2) =>\n this.emitSync(\n \"add_message\",\n threadId,\n localMid,\n status,\n meta2 ?? { attempt: 0 },\n ),\n });\n\n th._sync = \"error\";\n this.bus.emit(\"error\", {\n message: (err as BackendError)?.message ?? \"Reply failed\",\n code: (err as BackendError)?.code,\n meta: err,\n });\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n\n return localMid;\n }\n }\n\n async editMessage(\n threadId: ThreadId,\n messageId: CommentId,\n body: string,\n ): Promise<void> {\n const th = this.ensure(threadId);\n const orig = th.messages.find((m) => m.id === messageId);\n if (!orig) return;\n\n const previous = { ...orig };\n orig.body = body;\n orig.editedAt = Date.now();\n th.updatedAt = orig.editedAt;\n\n const hasBackend = Boolean(this.deps.backend && this.scope());\n th._sync ??= hasBackend ? \"pending\" : \"synced\";\n\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n\n if (!this.deps.backend) return;\n\n const performOnce = async (): Promise<void> => {\n const scope = this.scope();\n if (!scope) return;\n\n const res = await this.deps.backend!.editMessage(scope, {\n threadId: th.id,\n messageId,\n body,\n });\n\n if (!res.ok) throw res.error;\n\n const idx = th.messages.findIndex((m) => m.id === messageId);\n if (idx >= 0) th.messages[idx] = res.value as CommentMessage;\n\n th._sync = \"synced\";\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n };\n\n try {\n await performOnce();\n } catch (err) {\n const scope = this.scope();\n const branchKey = scope?.branchId ?? \"no_branch\";\n const jobId = `comments:edit_message:${branchKey}:${threadId}:${messageId}`;\n\n this.retry.enqueue({\n id: jobId,\n perform: async () => {\n try {\n await performOnce();\n return true;\n } catch {\n return false;\n }\n },\n onStatus: (status, meta2) =>\n this.emitSync(\n \"edit_message\",\n threadId,\n messageId,\n status,\n meta2 ?? { attempt: 0 },\n ),\n });\n\n const idx = th.messages.findIndex((m) => m.id === messageId);\n if (idx >= 0) th.messages[idx] = previous;\n\n th._sync = \"error\";\n this.bus.emit(\"error\", {\n message: (err as BackendError)?.message ?? \"Edit failed\",\n code: (err as BackendError)?.code,\n meta: err,\n });\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n }\n }\n\n async deleteMessage(\n threadId: ThreadId,\n messageId: CommentId,\n ): Promise<void> {\n const th = this.ensure(threadId);\n const backup = [...th.messages];\n\n th.messages = th.messages.filter((m) => m.id !== messageId);\n th.updatedAt = Date.now();\n\n const hasBackend = Boolean(this.deps.backend && this.scope());\n th._sync ??= hasBackend ? \"pending\" : \"synced\";\n\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n\n if (!this.deps.backend) return;\n\n const performOnce = async (): Promise<void> => {\n const scope = this.scope();\n if (!scope) return;\n\n const res = await this.deps.backend!.deleteMessage(scope, {\n threadId: th.id,\n messageId,\n });\n\n if (!res.ok) throw res.error;\n\n th._sync = \"synced\";\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n };\n\n try {\n await performOnce();\n } catch (err) {\n const scope = this.scope();\n const branchKey = scope?.branchId ?? \"no_branch\";\n const jobId = `comments:delete_message:${branchKey}:${threadId}:${messageId}`;\n\n this.retry.enqueue({\n id: jobId,\n perform: async () => {\n try {\n await performOnce();\n return true;\n } catch {\n return false;\n }\n },\n onStatus: (status, meta2) =>\n this.emitSync(\n \"delete_message\",\n threadId,\n messageId,\n status,\n meta2 ?? { attempt: 0 },\n ),\n });\n\n th.messages = backup;\n th._sync = \"error\";\n this.bus.emit(\"error\", {\n message: (err as BackendError)?.message ?? \"Delete failed\",\n code: (err as BackendError)?.code,\n meta: err,\n });\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n }\n }\n\n async move(threadId: ThreadId, anchor: CommentAnchor): Promise<void> {\n const th = this.ensure(threadId);\n const prev = th.anchor;\n\n th.anchor = anchor;\n th.updatedAt = Date.now();\n\n const hasBackend = Boolean(this.deps.backend && this.scope());\n th._sync ??= hasBackend ? \"pending\" : \"synced\";\n\n this.bus.emit(\"comment:move\", { thread: th as any });\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n\n if (!this.deps.backend) return;\n\n const performOnce = async (): Promise<void> => {\n const scope = this.scope();\n if (!scope) return;\n\n const res = await this.deps.backend!.moveThread(scope, {\n threadId: th.id,\n anchor,\n });\n\n if (!res.ok) throw res.error;\n\n this.threads.set(th.id, { ...(res.value as CommentThread), _sync: \"synced\" });\n this.bus.emit(\"comment:thread:update\", {\n thread: this.threads.get(threadId)! as any,\n });\n };\n\n try {\n await performOnce();\n } catch (err) {\n const scope = this.scope();\n const branchKey = scope?.branchId ?? \"no_branch\";\n const jobId = `comments:move_thread:${branchKey}:${threadId}`;\n\n this.retry.enqueue({\n id: jobId,\n perform: async () => {\n try {\n await performOnce();\n return true;\n } catch {\n return false;\n }\n },\n onStatus: (status, meta2) =>\n this.emitSync(\n \"move_thread\",\n threadId,\n undefined,\n status,\n meta2 ?? { attempt: 0 },\n ),\n });\n\n th.anchor = prev;\n th._sync = \"error\";\n this.bus.emit(\"error\", {\n message: (err as BackendError)?.message ?? \"Move failed\",\n code: (err as BackendError)?.code,\n meta: err,\n });\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n }\n }\n\n async resolve(threadId: ThreadId, value = true): Promise<void> {\n const th = this.ensure(threadId);\n const prev = th.resolved;\n\n th.resolved = value;\n th.updatedAt = Date.now();\n\n const hasBackend = Boolean(this.deps.backend && this.scope());\n th._sync ??= hasBackend ? \"pending\" : \"synced\";\n\n this.bus.emit(\"comment:resolve\", { thread: th as any, resolved: value });\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n\n if (!this.deps.backend) return;\n\n const performOnce = async (): Promise<void> => {\n const scope = this.scope();\n if (!scope) return;\n\n const res = await this.deps.backend!.resolveThread(scope, {\n threadId: th.id,\n resolved: value,\n });\n\n if (!res.ok) throw res.error;\n\n this.threads.set(th.id, { ...(res.value as CommentThread), _sync: \"synced\" });\n this.bus.emit(\"comment:thread:update\", {\n thread: this.threads.get(threadId)! as any,\n });\n };\n\n try {\n await performOnce();\n } catch (err) {\n const scope = this.scope();\n const branchKey = scope?.branchId ?? \"no_branch\";\n const jobId = `comments:resolve_thread:${branchKey}:${threadId}`;\n\n this.retry.enqueue({\n id: jobId,\n perform: async () => {\n try {\n await performOnce();\n return true;\n } catch {\n return false;\n }\n },\n onStatus: (status, meta2) =>\n this.emitSync(\n \"resolve_thread\",\n threadId,\n undefined,\n status,\n meta2 ?? { attempt: 0 },\n ),\n });\n\n th.resolved = prev;\n th._sync = \"error\";\n this.bus.emit(\"error\", {\n message: (err as BackendError)?.message ?? \"Resolve failed\",\n code: (err as BackendError)?.code,\n meta: err,\n });\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n }\n }\n\n async deleteThread(threadId: ThreadId): Promise<void> {\n const prev = this.threads.get(threadId);\n if (!prev) return;\n\n this.threads.delete(threadId);\n this.bus.emit(\"comment:thread:delete\", { threadId });\n\n if (!this.deps.backend) return;\n\n const performOnce = async (): Promise<void> => {\n const scope = this.scope();\n if (!scope) return;\n\n const res = await this.deps.backend!.deleteThread(scope, { threadId });\n if (!res.ok) throw res.error;\n };\n\n try {\n await performOnce();\n } catch (err) {\n const scope = this.scope();\n const branchKey = scope?.branchId ?? \"no_branch\";\n const jobId = `comments:delete_thread:${branchKey}:${threadId}`;\n\n this.retry.enqueue({\n id: jobId,\n perform: async () => {\n try {\n await performOnce();\n return true;\n } catch {\n return false;\n }\n },\n onStatus: (status, meta2) =>\n this.emitSync(\n \"delete_thread\",\n threadId,\n undefined,\n status,\n meta2 ?? { attempt: 0 },\n ),\n });\n\n // rollback deletion so user can retry\n this.threads.set(threadId, prev);\n this.bus.emit(\"error\", {\n message: (err as BackendError)?.message ?? \"Delete thread failed\",\n code: (err as BackendError)?.code,\n meta: err,\n });\n this.bus.emit(\"comment:thread:update\", { thread: prev as any });\n }\n }\n\n // Optional helpers for UI controls\n retryJob(jobId: string): boolean {\n return this.retry.triggerNow(jobId);\n }\n\n cancelJob(jobId: string): boolean {\n return this.retry.cancel(jobId);\n }\n\n pendingJobs(): string[] {\n return this.retry.pendingIds();\n }\n\n /* ─── internal ────────────────────────────────────────── */\n private ensure(threadId: ThreadId): SyncThread {\n const th = this.threads.get(threadId);\n if (!th) throw new Error(`Comment thread not found: ${threadId}`);\n return th;\n }\n}","import { cloneDeep } from \"lodash-es\";\nimport type { Builder } from \"@/core\";\nimport { normalise } from \"@/core\";\nimport type {\n Command,\n DgpServiceCapability,\n DgpServiceMap,\n DynamicRule,\n EditorEvents,\n EditorOptions,\n EditorSnapshot,\n FallbackSettings,\n Field,\n ServiceProps,\n Tag,\n} from \"@/schema\";\nimport type { CanvasAPI } from \"./api\";\nimport { compilePolicies, type PolicyDiagnostic } from \"@/core/policy\";\nimport { constraintFitOk, rateOk, toFiniteNumber } from \"@/utils/util\";\n\nconst MAX_LIMIT = 100;\ntype WireKind = \"bind\" | \"include\" | \"exclude\" | \"service\";\n\n// Addressing nodes\nexport type TagRef = { kind: \"tag\"; id: string };\nexport type FieldRef = { kind: \"field\"; id: string };\nexport type OptionRef = { kind: \"option\"; fieldId: string; id: string };\nexport type NodeRef = TagRef | FieldRef | OptionRef;\n\nexport type DuplicateOptions = {\n // tags\n withChildren?: boolean; // default false\n // fields\n copyBindings?: boolean; // default true\n copyIncludesExcludes?: boolean; // default false\n copyOptionMaps?: boolean; // default false\n // all\n id?: string; // force an id instead of auto\n labelStrategy?: (old: string) => string; // override default \"Label (copy)\" logic\n nameStrategy?: (old?: string) => string | undefined; // for fields; default suffix \"_copy\"\n optionIdStrategy?: (old: string) => string; // for options; default add \"_copy\"\n};\n\n// owner lookup (linear, OK for editor; index if you want later)\nfunction ownerOfOption(\n props: ServiceProps,\n optionId: string,\n): { fieldId: string; index: number } | null {\n for (const f of props.fields ?? []) {\n const idx = (f.options ?? []).findIndex((o) => o.id === optionId);\n if (idx >= 0) return { fieldId: f.id, index: idx };\n }\n return null;\n}\n\nfunction ensureServiceExists(opts: EditorOptions, id: any) {\n if (typeof opts.serviceExists === \"function\") {\n if (!opts.serviceExists(id))\n throw new Error(`service_not_found:${String(id)}`);\n return;\n }\n if (opts.serviceMap) {\n if (!Object.prototype.hasOwnProperty.call(opts.serviceMap, id as any)) {\n throw new Error(`service_not_found:${String(id)}`);\n }\n return;\n }\n // Host didn't provide a way to verify — fail so they wire one.\n throw new Error(\"service_checker_missing\");\n}\n\nexport class Editor {\n private builder: Builder;\n private api: CanvasAPI;\n private readonly opts: Required<EditorOptions>;\n private history: EditorSnapshot[] = [];\n private index = -1; // points to current snapshot\n private txnDepth = 0;\n private txnLabel?: string;\n private stagedBefore?: EditorSnapshot;\n private _lastPolicyDiagnostics?: PolicyDiagnostic[];\n constructor(builder: Builder, api: CanvasAPI, opts: EditorOptions = {}) {\n this.builder = builder;\n this.api = api;\n // @ts-ignore\n this.opts = {\n historyLimit: Math.max(\n 1,\n Math.min(opts.historyLimit ?? MAX_LIMIT, 1000),\n ),\n validateAfterEach: opts.validateAfterEach ?? false,\n };\n // seed initial snapshot\n this.pushHistory(this.makeSnapshot(\"init\"));\n }\n\n /* ───────────────────────── Public API ───────────────────────── */\n\n isTagId(id: string) {\n return this.builder.isTagId(id);\n }\n isFieldId(id: string) {\n return this.builder.isFieldId(id);\n }\n isOptionId(id: string) {\n return this.builder.isOptionId(id);\n }\n\n getProps(): ServiceProps {\n return this.builder.getProps();\n }\n\n transact(label: string, fn: () => void): void {\n const wasTop = this.txnDepth === 0;\n let ok = false;\n if (wasTop) {\n this.txnLabel = label;\n this.stagedBefore = this.makeSnapshot(label + \":before\");\n }\n this.txnDepth++;\n try {\n fn();\n ok = true;\n } finally {\n this.txnDepth--;\n if (wasTop) {\n if (ok) {\n this.commit(label); // push one history entry\n } else if (this.stagedBefore) {\n this.loadSnapshot(this.stagedBefore, \"undo\"); // rollback to pre-txn state\n }\n this.txnLabel = undefined;\n this.stagedBefore = undefined;\n }\n }\n }\n\n exec(cmd: Command): void {\n try {\n const before = this.makeSnapshot(cmd.name + \":before\");\n cmd.do();\n this.afterMutation(cmd.name, before);\n } catch (err) {\n this.emit(\"editor:error\", {\n message: (err as Error)?.message ?? String(err),\n code: \"command\",\n });\n throw err;\n }\n }\n\n undo(): boolean {\n if (this.index <= 0) return false;\n this.index--;\n this.loadSnapshot(this.history[this.index], \"undo\");\n this.emit(\"editor:undo\", {\n stackSize: this.history.length,\n index: this.index,\n });\n return true;\n }\n\n redo(): boolean {\n if (this.index >= this.history.length - 1) return false;\n this.index++;\n this.loadSnapshot(this.history[this.index], \"redo\");\n this.emit(\"editor:redo\", {\n stackSize: this.history.length,\n index: this.index,\n });\n return true;\n }\n\n clearService(id: string) {\n this.setService(id, { service_id: undefined });\n }\n\n /* ───────────── Convenience editing ops (command-wrapped) ───────────── */\n duplicate(ref: NodeRef, opts: DuplicateOptions = {}): string {\n const snapBefore = this.makeSnapshot(\"duplicate:before\");\n try {\n let newId = \"\";\n this.transact(\"duplicate\", () => {\n if (ref.kind === \"tag\") {\n newId = this.duplicateTag(ref.id, opts);\n } else if (ref.kind === \"field\") {\n newId = this.duplicateField(ref.id, opts);\n } else {\n newId = this.duplicateOption(ref.fieldId, ref.id, opts);\n }\n });\n return newId;\n } catch (err) {\n // rollback to be safe\n this.loadSnapshot(snapBefore, \"undo\");\n throw err;\n }\n }\n\n /**\n * Update the display label for a node and refresh the graph so node labels stay in sync.\n * Supports: tag (\"t:*\"), field (\"f:*\"), option (\"o:*\").\n * IDs are NOT changed; only the human-readable label.\n */\n reLabel(id: string, nextLabel: string): void {\n const label = String(nextLabel ?? \"\").trim();\n\n this.exec({\n name: \"reLabel\",\n do: () =>\n this.patchProps((p) => {\n // Tag\n if (this.isTagId(id)) {\n const t = (p.filters ?? []).find((x) => x.id === id);\n if (!t) return;\n if ((t.label ?? \"\") === label) return;\n t.label = label;\n // graph nodes mirror builder, so rebuild\n this.api.refreshGraph();\n return;\n }\n\n // Option (find owner field → option)\n if (this.isOptionId(id)) {\n const own = ownerOfOption(p, id);\n if (!own) return;\n const f = (p.fields ?? []).find(\n (x) => x.id === own.fieldId,\n );\n const o = f?.options?.find((x) => x.id === id);\n if (!o) return;\n if ((o.label ?? \"\") === label) return;\n o.label = label;\n this.api.refreshGraph();\n return;\n }\n\n // Field (default)\n const fld = (p.fields ?? []).find((x) => x.id === id);\n if (!fld) return;\n if ((fld.label ?? \"\") === label) return;\n fld.label = label;\n this.api.refreshGraph();\n }),\n undo: () => this.api.undo(),\n });\n }\n\n /**\n * Assign or change a field's `name`. Only allowed when the field (and its options) have NO service mapping.\n * - If `nextName` is empty/blank → removes the `name`.\n * - Emits an error if the field or any of its options carry a `service_id`.\n * - Emits an error if `nextName` collides with an existing field's name (case-sensitive).\n */\n setFieldName(fieldId: string, nextName: string | null | undefined): void {\n const raw = typeof nextName === \"string\" ? nextName : \"\";\n const name = raw.trim();\n\n this.exec({\n name: \"setFieldName\",\n do: () =>\n this.patchProps((p) => {\n const fields = p.fields ?? [];\n const f = fields.find((x) => x.id === fieldId);\n if (!f) {\n this.api.emit(\"error\", {\n code: \"field_not_found\",\n message: `Field not found: ${fieldId}`,\n meta: { fieldId },\n });\n return;\n }\n\n // Disallow if the field itself maps to a service\n const fieldHasService =\n typeof (f as any).service_id === \"number\";\n\n // Disallow if any option maps to a service\n const optionHasService = Array.isArray(f.options)\n ? f.options.some(\n (o) => typeof (o as any).service_id === \"number\",\n )\n : false;\n\n if (fieldHasService || optionHasService) {\n this.api.emit(\"error\", {\n code: \"field_has_service_mapping\",\n message:\n \"Cannot set a name on a field that maps to a service (either the field or one of its options has a service_id).\",\n meta: {\n fieldId,\n fieldHasService,\n optionHasService,\n },\n });\n return;\n }\n\n // If clearing, remove the key to keep payload lean\n if (name.length === 0) {\n if (\"name\" in f) delete (f as any).name;\n return;\n }\n\n // Prevent name collisions with other fields\n const collision = fields.find(\n (x) => x.id !== fieldId && (x.name ?? \"\") === name,\n );\n if (collision) {\n this.api.emit(\"error\", {\n code: \"field_name_collision\",\n message: `Another field already uses the name \"${name}\".`,\n meta: { fieldId, otherFieldId: collision.id },\n });\n return;\n }\n\n // Assign\n (f as any).name = name;\n }),\n undo: () => this.api.undo(),\n });\n }\n getLastPolicyDiagnostics(): PolicyDiagnostic[] | undefined {\n return this._lastPolicyDiagnostics;\n }\n /* ───────────────────── Internals: duplicate impls ───────────────────── */\n\n private duplicateTag(tagId: string, opts: DuplicateOptions): string {\n const props = this.builder.getProps();\n const tags = props.filters ?? [];\n const src = tags.find((t) => t.id === tagId);\n if (!src) throw new Error(`Tag not found: ${tagId}`);\n\n // generate new id + label\n const id = opts.id ?? this.uniqueId(src.id);\n const label = (opts.labelStrategy ?? nextCopyLabel)(src.label ?? id);\n\n if (!opts.withChildren) {\n // shallow copy\n this.patchProps((p) => {\n const clone = { ...src, id, label };\n // keep same parent\n clone.bind_id = src.bind_id;\n // includes/excludes are field ids—copy them as-is\n clone.constraints_overrides = undefined;\n clone.constraints_origin = undefined;\n // insert after original among siblings: we can rebuild array with splice\n const arr = p.filters ?? [];\n const idx = arr.findIndex((t) => t.id === tagId);\n arr.splice(idx + 1, 0, clone);\n p.filters = arr;\n });\n return id;\n }\n\n // deep clone subtree: map oldTagId -> newTagId\n const idMap = new Map<string, string>();\n const collect = (t: typeof src, acc: (typeof src)[]) => {\n acc.push(t);\n for (const child of tags.filter((x) => x.bind_id === t.id))\n collect(child as any, acc);\n };\n const subtree: (typeof src)[] = [];\n collect(src, subtree);\n\n // allocate ids\n for (const n of subtree)\n idMap.set(n.id, n.id === src.id ? id : this.uniqueId(n.id));\n\n // build clones\n const clones = subtree.map((n) => {\n const cloned = { ...n };\n cloned.id = idMap.get(n.id)!;\n cloned.label =\n n.id === src.id\n ? label\n : (opts.labelStrategy ?? nextCopyLabel)(n.label ?? n.id);\n\n // rewire parent if parent is in subtree\n cloned.bind_id = n.bind_id\n ? (idMap.get(n.bind_id) ?? n.bind_id)\n : undefined;\n\n // scrub derived meta (will be re-created by normalise)\n cloned.constraints_origin = undefined;\n cloned.constraints_overrides = undefined;\n return cloned;\n });\n\n this.patchProps((p) => {\n const arr = p.filters ?? [];\n // insert root clone after original\n const rootIdx = arr.findIndex((t) => t.id === tagId);\n arr.splice(rootIdx + 1, 0, clones[0] as any);\n // append other clones (order: parent before children to keep grouping stable)\n for (const c of clones.slice(1)) arr.push(c as any);\n p.filters = arr;\n });\n\n return id;\n }\n\n private duplicateField(fieldId: string, opts: DuplicateOptions): string {\n const props = this.builder.getProps();\n const fields = props.fields ?? [];\n const src = fields.find((f) => f.id === fieldId);\n if (!src) throw new Error(`Field not found: ${fieldId}`);\n\n const id = opts.id ?? this.uniqueId(src.id);\n const label = (opts.labelStrategy ?? nextCopyLabel)(src.label ?? id);\n const name = opts.nameStrategy\n ? opts.nameStrategy(src.name)\n : nextCopyName(src.name);\n\n // helper to create new option ids\n const optId = (old: string) =>\n this.uniqueOptionId(\n id,\n (opts.optionIdStrategy ?? defaultOptionIdStrategy)(old),\n );\n\n // deep copy options with new ids\n const clonedOptions = (src.options ?? []).map((o) => ({\n ...o,\n id: optId(o.id),\n label: (opts.labelStrategy ?? nextCopyLabel)(o.label ?? o.id),\n }));\n\n const cloned = {\n ...src,\n id,\n label,\n name,\n bind_id: (opts.copyBindings ?? true) ? src.bind_id : undefined,\n options: clonedOptions,\n } as typeof src;\n\n // map: oldOptId -> newOptId (only if options exist)\n const optionIdMap = new Map<string, string>();\n (src.options ?? []).forEach((o, i) => {\n const newOptId = clonedOptions[i]?.id ?? o.id;\n optionIdMap.set(o.id, newOptId);\n });\n\n this.patchProps((p) => {\n // insert clone after original\n const arr = p.fields ?? [];\n const idx = arr.findIndex((f) => f.id === fieldId);\n arr.splice(idx + 1, 0, cloned as any);\n p.fields = arr;\n\n // copy tag-level includes/excludes (field ids)\n if (opts.copyIncludesExcludes) {\n for (const t of p.filters ?? []) {\n if (t.includes?.includes(fieldId)) {\n const s = new Set(t.includes);\n s.add(id);\n t.includes = Array.from(s);\n }\n if (t.excludes?.includes(fieldId)) {\n const s = new Set(t.excludes);\n s.add(id);\n t.excludes = Array.from(s);\n }\n }\n }\n\n // copy button maps (keys are only field ids OR option ids)\n if (opts.copyOptionMaps) {\n const maps: Array<\n \"includes_for_buttons\" | \"excludes_for_buttons\"\n > = [\"includes_for_buttons\", \"excludes_for_buttons\"];\n\n for (const mapKey of maps) {\n const srcMap = (p as any)[mapKey] ?? {};\n const nextMap: Record<string, string[]> = { ...srcMap };\n\n for (const [key, targets] of Object.entries(\n srcMap as Record<string, string[]>,\n )) {\n // A) non-option button: key === original field id → duplicate under new field id\n if (key === fieldId) {\n const newKey = id;\n const merged = new Set([\n ...(nextMap[newKey] ?? []),\n ...targets,\n ]);\n nextMap[newKey] = Array.from(merged);\n continue;\n }\n\n // B) option button: key === one of the original option ids → duplicate under new option id\n if (optionIdMap.has(key)) {\n const newKey = optionIdMap.get(key)!;\n const merged = new Set([\n ...(nextMap[newKey] ?? []),\n ...targets,\n ]);\n nextMap[newKey] = Array.from(merged);\n }\n }\n\n (p as any)[mapKey] = nextMap;\n }\n }\n });\n\n return id;\n }\n\n private duplicateOption(\n fieldId: string,\n optionId: string,\n opts: DuplicateOptions,\n ): string {\n const props = this.builder.getProps();\n const fields = props.fields ?? [];\n const f = fields.find((x) => x.id === fieldId);\n if (!f) throw new Error(`Field not found: ${fieldId}`);\n const optIdx = (f.options ?? []).findIndex((o) => o.id === optionId);\n if (optIdx < 0)\n throw new Error(`Option not found: ${fieldId}::${optionId}`);\n const src = (f.options ?? [])[optIdx];\n\n const newId = this.uniqueOptionId(\n fieldId,\n (opts.optionIdStrategy ?? defaultOptionIdStrategy)(src.id),\n );\n const newLabel = (opts.labelStrategy ?? nextCopyLabel)(\n src.label ?? src.id,\n );\n\n this.patchProps((p) => {\n const fld = (p.fields ?? []).find((x) => x.id === fieldId)!;\n const arr = fld.options ?? [];\n const clone = { ...src, id: newId, label: newLabel };\n arr.splice(optIdx + 1, 0, clone);\n fld.options = arr;\n\n // Option-level maps are NOT copied by default (safer)\n if (opts.copyOptionMaps) {\n const oldKey = `${fieldId}::${optionId}`;\n const newKey = `${fieldId}::${newId}`;\n for (const mapKey of [\n \"includes_for_buttons\",\n \"excludes_for_buttons\",\n ] as const) {\n const m = p[mapKey] ?? {};\n if (m[oldKey]) {\n m[newKey] = Array.from(new Set(m[oldKey]));\n p[mapKey] = m as any;\n }\n }\n }\n });\n\n return newId;\n }\n\n /* ───────────────────── Helpers: uniqueness & naming ───────────────────── */\n\n private uniqueId(base: string): string {\n const props = this.builder.getProps();\n const taken = new Set<string>([\n ...(props.filters ?? []).map((t) => t.id),\n ...(props.fields ?? []).map((f) => f.id),\n ]);\n let candidate = nextCopyId(base);\n while (taken.has(candidate)) candidate = bumpSuffix(candidate);\n return candidate;\n }\n\n private uniqueOptionId(fieldId: string, base: string): string {\n const props = this.builder.getProps();\n const fld = (props.fields ?? []).find((f) => f.id === fieldId);\n const taken = new Set((fld?.options ?? []).map((o) => o.id));\n let candidate = base;\n if (taken.has(candidate)) candidate = nextCopyId(candidate);\n while (taken.has(candidate)) candidate = bumpSuffix(candidate);\n return candidate;\n }\n\n //---------\n\n /**\n * Reorder a node:\n * - Tag: among its siblings (same bind_id) inside filters[]\n * - Field: inside order_for_tags[scopeTagId] (you must pass scopeTagId)\n * - Option: use placeOption() instead\n */\n placeNode(\n id: string,\n opts: {\n scopeTagId?: string;\n beforeId?: string;\n afterId?: string;\n index?: number;\n },\n ) {\n if (this.isTagId(id)) {\n // … your existing tag sibling reorder logic …\n this.exec({\n name: \"placeTag\",\n do: () =>\n this.patchProps((p) => {\n const all = p.filters ?? [];\n const cur = all.find((t) => t.id === id);\n if (!cur) return;\n const groupKey = cur.bind_id ?? \"__root__\";\n const siblings = all.filter(\n (t) => (t.bind_id ?? \"__root__\") === groupKey,\n );\n\n const curIdx = siblings.findIndex((t) => t.id === id);\n if (curIdx < 0) return;\n const pulled = siblings.splice(curIdx, 1)[0];\n\n let dest =\n typeof opts.index === \"number\"\n ? opts.index\n : undefined;\n if (opts.beforeId)\n dest = Math.max(\n 0,\n siblings.findIndex(\n (t) => t.id === opts.beforeId,\n ),\n );\n if (opts.afterId)\n dest = Math.min(\n siblings.length,\n siblings.findIndex(\n (t) => t.id === opts.afterId,\n ) + 1,\n );\n if (dest === undefined || Number.isNaN(dest))\n dest = siblings.length;\n\n // stitch back: leave other groups untouched, replace this group in order\n const out: Tag[] = [];\n for (const t of all) {\n const sameGroup =\n (t.bind_id ?? \"__root__\") === groupKey;\n if (!sameGroup) {\n out.push(t);\n }\n // if (!used.has(t.id) && t.id !== id) continue; // skip old group entries\n }\n siblings.splice(dest, 0, pulled);\n p.filters = [...out, ...siblings];\n }),\n undo: () => this.api.undo(),\n });\n } else if (this.isFieldId(id)) {\n if (!opts.scopeTagId)\n throw new Error(\"placeNode(field): scopeTagId is required\");\n const fieldId = id;\n const tagId = opts.scopeTagId;\n\n this.exec({\n name: \"placeField\",\n do: () =>\n this.patchProps((p) => {\n const map = (p.order_for_tags ??= {});\n const arr = (map[tagId] ??= []);\n const curIdx = arr.indexOf(fieldId);\n if (curIdx >= 0) arr.splice(curIdx, 1);\n\n let dest =\n typeof opts.index === \"number\"\n ? opts.index\n : undefined;\n if (opts.beforeId)\n dest = Math.max(0, arr.indexOf(opts.beforeId));\n if (opts.afterId)\n dest = Math.min(\n arr.length,\n arr.indexOf(opts.afterId) + 1,\n );\n if (dest === undefined || Number.isNaN(dest))\n dest = arr.length;\n\n arr.splice(dest, 0, fieldId);\n }),\n undo: () => this.api.undo(),\n });\n } else if (this.isOptionId(id)) {\n // defer to placeOption for options\n this.placeOption(id, opts);\n } else {\n throw new Error(\"placeNode: unknown id prefix\");\n }\n }\n\n placeOption(\n optionId: string,\n opts: { beforeId?: string; afterId?: string; index?: number },\n ) {\n if (!this.isOptionId(optionId))\n throw new Error('placeOption: optionId must start with \"o:\"');\n\n this.exec({\n name: \"placeOption\",\n do: () =>\n this.patchProps((p) => {\n const owner = ownerOfOption(p, optionId);\n if (!owner) return;\n const f = (p.fields ?? []).find(\n (x) => x.id === owner.fieldId,\n );\n if (!f?.options) return;\n\n const curIdx = f.options.findIndex(\n (o) => o.id === optionId,\n );\n if (curIdx < 0) return;\n\n const pulled = f.options.splice(curIdx, 1)[0];\n\n let dest =\n typeof opts.index === \"number\" ? opts.index : undefined;\n if (opts.beforeId)\n dest = Math.max(\n 0,\n f.options.findIndex((o) => o.id === opts.beforeId),\n );\n if (opts.afterId)\n dest = Math.min(\n f.options.length,\n f.options.findIndex((o) => o.id === opts.afterId) +\n 1,\n );\n if (dest === undefined || Number.isNaN(dest))\n dest = f.options.length;\n\n f.options.splice(dest, 0, pulled);\n }),\n undo: () => this.api.undo(),\n });\n }\n\n addOption(\n fieldId: string,\n input: {\n id?: string;\n label: string;\n service_id?: number;\n pricing_role?: \"base\" | \"utility\" | \"addon\";\n [k: string]: any;\n },\n ): string {\n // decide id up-front so we can return synchronously\n const id = input.id ?? this.genId(\"o\");\n\n this.exec({\n name: \"addOption\",\n do: () =>\n this.patchProps((p) => {\n const f = (p.fields ?? []).find((x) => x.id === fieldId);\n if (!f)\n throw new Error(\n `addOption: field '${fieldId}' not found`,\n );\n const list = (f.options ??= []);\n if (list.some((o) => o.id === id))\n throw new Error(`Option id '${id}' already exists`);\n // @ts-ignore\n list.push({ ...input, id });\n }),\n undo: () => this.api.undo(),\n });\n\n return id;\n }\n\n updateOption(\n optionId: string,\n patch: Partial<\n {\n label: string;\n service_id: number;\n pricing_role: \"base\" | \"utility\" | \"addon\";\n } & Record<string, any>\n >,\n ) {\n if (!this.isOptionId(optionId))\n throw new Error('updateOption: optionId must start with \"o:\"');\n this.exec({\n name: \"updateOption\",\n do: () =>\n this.patchProps((p) => {\n const owner = ownerOfOption(p, optionId);\n if (!owner) return;\n const f = (p.fields ?? []).find(\n (x) => x.id === owner.fieldId,\n );\n if (!f?.options) return;\n const o = f.options.find((x) => x.id === optionId);\n if (o) Object.assign(o, patch);\n }),\n undo: () => this.api.undo(),\n });\n }\n\n removeOption(optionId: string) {\n if (!this.isOptionId(optionId))\n throw new Error('removeOption: optionId must start with \"o:\"');\n this.exec({\n name: \"removeOption\",\n do: () =>\n this.patchProps((p) => {\n const owner = ownerOfOption(p, optionId);\n if (!owner) return;\n const f = (p.fields ?? []).find(\n (x) => x.id === owner.fieldId,\n );\n if (!f?.options) return;\n f.options = f.options.filter((o) => o.id !== optionId);\n\n // prune option-level include/exclude maps keyed by the option id\n const maps: Array<\n \"includes_for_options\" | \"excludes_for_options\"\n > = [\"includes_for_options\", \"excludes_for_options\"];\n for (const m of maps) {\n const map = (p as any)[m] as\n | Record<string, string[]>\n | undefined;\n if (!map) continue;\n if (map[optionId]) delete map[optionId];\n if (!Object.keys(map).length) delete (p as any)[m];\n }\n }),\n undo: () => this.api.undo(),\n });\n }\n\n editLabel(id: string, label: string): void {\n const next = (label ?? \"\").trim();\n if (!next) throw new Error(\"Label cannot be empty\");\n\n this.exec({\n name: \"editLabel\",\n do: () =>\n this.patchProps((p) => {\n if (this.isTagId(id)) {\n const t = (p.filters ?? []).find((x) => x.id === id);\n if (t) t.label = next;\n return;\n }\n if (this.isFieldId(id)) {\n const f = (p.fields ?? []).find((x) => x.id === id);\n if (f) f.label = next;\n return;\n }\n if (this.isOptionId(id)) {\n const own = ownerOfOption(p, id);\n if (!own) return;\n const f = (p.fields ?? []).find(\n (x) => x.id === own.fieldId,\n );\n const o = f?.options?.find((x) => x.id === id);\n if (o) o.label = next;\n return;\n }\n throw new Error(\"editLabel: unsupported id\");\n }),\n undo: () => this.api.undo(),\n });\n }\n\n editName(fieldId: string, name: string | undefined) {\n this.exec({\n name: \"editName\",\n do: () =>\n this.patchProps((p) => {\n const f = (p.fields ?? []).find((x) => x.id === fieldId);\n if (!f) return;\n f.name = name;\n }),\n undo: () => this.api.undo(),\n });\n }\n\n setService(\n id: string,\n input: { service_id?: number; pricing_role?: \"base\" | \"utility\" },\n ): void {\n this.exec({\n name: \"setService\",\n do: () =>\n this.patchProps((p) => {\n const hasSidKey = Object.prototype.hasOwnProperty.call(\n input,\n \"service_id\",\n );\n const validId =\n hasSidKey &&\n typeof input.service_id === \"number\" &&\n Number.isFinite(input.service_id);\n const sid: number | undefined = validId\n ? Number(input.service_id)\n : undefined;\n const nextRole = input.pricing_role;\n\n // ── TAG ───────────────────────────────────────────────────\n if (this.isTagId(id)) {\n const t = (p.filters ?? []).find((x) => x.id === id);\n if (!t) return;\n\n // role not applicable for tags\n if (hasSidKey) {\n if (sid === undefined) delete (t as any).service_id;\n else t.service_id = sid;\n }\n return;\n }\n\n // ── OPTION ───────────────────────────────────────────────\n if (this.isOptionId(id)) {\n const own = ownerOfOption(p, id);\n if (!own) return;\n const f = (p.fields ?? []).find(\n (x) => x.id === own.fieldId,\n );\n const o = f?.options?.find((x) => x.id === id);\n if (!o) return;\n\n const currentRole = (o.pricing_role ?? \"base\") as\n | \"base\"\n | \"utility\";\n const role = nextRole ?? currentRole;\n\n if (role === \"utility\") {\n // Utilities cannot have service_id, and if switching to utility, strip any existing sid.\n if (hasSidKey && sid !== undefined) {\n this.api.emit(\"error\", {\n message:\n \"Utilities cannot have service_id (option).\",\n code: \"utility_service_conflict\",\n meta: { id, service_id: sid },\n });\n }\n o.pricing_role = \"utility\";\n if (\"service_id\" in o) delete (o as any).service_id;\n return;\n }\n\n // role === 'base'\n if (nextRole) o.pricing_role = \"base\";\n if (hasSidKey) {\n if (sid === undefined) delete (o as any).service_id;\n else o.service_id = sid;\n }\n return;\n }\n\n // ── FIELD (button-able) ─────────────────────────────────\n // Field ids usually look like \"f:*\" in your project; we’ll treat any non-tag/non-option as field.\n const f = (p.fields ?? []).find((x) => x.id === id);\n if (!f) {\n throw new Error(\n 'setService only supports tag (\"t:*\"), option (\"o:*\"), or field (\"f:*\") ids',\n );\n }\n\n const isOptionBased =\n Array.isArray(f.options) && f.options.length > 0;\n const isButton = !!(f as any).button;\n\n // Move/normalize role at field level if provided\n if (nextRole) {\n f.pricing_role = nextRole;\n }\n const effectiveRole = (f.pricing_role ?? \"base\") as\n | \"base\"\n | \"utility\";\n\n // If the field is option-based, services must live on options, not on the field.\n if (isOptionBased) {\n if (hasSidKey) {\n this.api.emit(\"error\", {\n message:\n \"Cannot set service_id on an option-based field. Assign service_id on its options instead.\",\n code: \"field_option_based_service_forbidden\",\n meta: { id, service_id: sid },\n });\n }\n // Still allow changing pricing_role at field level (acts as a default for options),\n // but never write/keep service_id on the field itself.\n if (\"service_id\" in (f as any))\n delete (f as any).service_id;\n return;\n }\n\n // For non-option fields, only \"button\" fields are allowed to carry a service_id.\n if (!isButton) {\n if (hasSidKey) {\n this.api.emit(\"error\", {\n message:\n \"Only button fields (without options) can have a service_id.\",\n code: \"non_button_field_service_forbidden\",\n meta: { id, service_id: sid },\n });\n }\n // Ensure we don't keep any stray sid\n if (\"service_id\" in (f as any))\n delete (f as any).service_id;\n return;\n }\n\n // Button field + role checks\n if (effectiveRole === \"utility\") {\n // Utilities cannot have service_id at all.\n if (hasSidKey && sid !== undefined) {\n this.api.emit(\"error\", {\n message:\n \"Utilities cannot have service_id (field).\",\n code: \"utility_service_conflict\",\n meta: { id, service_id: sid },\n });\n }\n if (\"service_id\" in (f as any))\n delete (f as any).service_id;\n return;\n }\n\n // Button field with role 'base' → allow setting/clearing sid\n if (hasSidKey) {\n if (sid === undefined) delete (f as any).service_id;\n else (f as any).service_id = sid;\n }\n }),\n undo: () => this.api.undo(),\n });\n }\n\n addTag(\n partial: Omit<Tag, \"id\" | \"label\"> & { id?: string; label: string },\n ) {\n const id = partial.id ?? this.genId(\"t\");\n const payload = { ...partial, id };\n this.exec({\n name: \"addTag\",\n do: () =>\n this.patchProps((p) => {\n p.filters = [...(p.filters ?? []), payload];\n }),\n undo: () =>\n this.patchProps((p) => {\n p.filters = (p.filters ?? []).filter((t) => t.id !== id);\n }),\n });\n }\n\n updateTag(id: string, patch: Partial<Tag>) {\n let prev: Tag | undefined;\n this.exec({\n name: \"updateTag\",\n do: () =>\n this.patchProps((p) => {\n p.filters = (p.filters ?? []).map((t) => {\n if (t.id !== id) return t;\n prev = t;\n return { ...t, ...patch };\n });\n }),\n undo: () =>\n this.patchProps((p) => {\n p.filters = (p.filters ?? []).map((t) =>\n t.id === id && prev ? prev : t,\n );\n }),\n });\n }\n\n removeTag(id: string) {\n let prevSlice!: ServiceProps;\n this.exec({\n name: \"removeTag\",\n do: () =>\n this.patchProps((p) => {\n prevSlice = cloneDeep(p);\n // noinspection DuplicatedCode\n p.filters = (p.filters ?? []).filter((t) => t.id !== id);\n // drop references\n for (const t of p.filters ?? []) {\n if (t.bind_id === id) delete t.bind_id;\n t.includes = (t.includes ?? []).filter((x) => x !== id);\n t.excludes = (t.excludes ?? []).filter((x) => x !== id);\n }\n for (const f of p.fields ?? []) {\n if (Array.isArray(f.bind_id))\n f.bind_id = f.bind_id.filter((x) => x !== id);\n else if (f.bind_id === id) delete f.bind_id;\n }\n }),\n undo: () => this.replaceProps(prevSlice),\n });\n }\n\n addField(\n partial: Omit<Field, \"id\" | \"label\" | \"type\"> & {\n id?: string;\n label: string;\n type: Field[\"type\"];\n },\n ) {\n const id = partial.id ?? this.genId(\"f\");\n const payload = { ...partial, id };\n this.exec({\n name: \"addField\",\n do: () =>\n this.patchProps((p) => {\n p.fields = [...(p.fields ?? []), payload as Field];\n }),\n undo: () =>\n this.patchProps((p) => {\n p.fields = (p.fields ?? []).filter((f) => f.id !== id);\n }),\n });\n }\n\n updateField(id: string, patch: Partial<Field>) {\n let prev: Field | undefined;\n this.exec({\n name: \"updateField\",\n do: () =>\n this.patchProps((p) => {\n // @ts-ignore\n p.fields = (p.fields ?? []).map((f) => {\n if (f.id !== id) return f;\n prev = f;\n return { ...f, ...patch };\n });\n }),\n undo: () =>\n this.patchProps((p) => {\n p.fields = (p.fields ?? []).map((f) =>\n f.id === id && prev ? prev : f,\n );\n }),\n });\n }\n\n removeField(id: string) {\n let prevSlice!: ServiceProps;\n this.exec({\n name: \"removeField\",\n do: () =>\n this.patchProps((p) => {\n prevSlice = cloneDeep(p);\n p.fields = (p.fields ?? []).filter((f) => f.id !== id);\n // prune option maps that reference this field\n for (const mapKey of [\n \"includes_for_buttons\",\n \"excludes_for_buttons\",\n ] as const) {\n const m = p[mapKey];\n if (!m) continue;\n for (const k of Object.keys(m)) {\n m[k] = (m[k] ?? []).filter((fid) => fid !== id);\n if (!m[k]?.length) delete m[k];\n }\n }\n for (const t of p.filters ?? []) {\n t.includes = (t.includes ?? []).filter((x) => x !== id);\n t.excludes = (t.excludes ?? []).filter((x) => x !== id);\n }\n }),\n undo: () => this.replaceProps(prevSlice),\n });\n }\n\n remove(id: string) {\n if (this.isTagId(id)) {\n this.exec({\n name: \"removeTag\",\n do: () =>\n this.patchProps((p) => {\n // noinspection DuplicatedCode\n p.filters = (p.filters ?? []).filter(\n (t) => t.id !== id,\n );\n\n // detach children + prune includes/excludes references\n for (const t of p.filters ?? []) {\n if (t.bind_id === id) delete t.bind_id;\n t.includes = (t.includes ?? []).filter(\n (x) => x !== id,\n );\n t.excludes = (t.excludes ?? []).filter(\n (x) => x !== id,\n );\n }\n\n // remove tag from field.bind_id arrays\n for (const f of p.fields ?? []) {\n if (Array.isArray(f.bind_id))\n f.bind_id = f.bind_id.filter(\n (x) => x !== id,\n ) as any;\n else if (f.bind_id === id) delete f.bind_id;\n }\n\n // prune per-tag ordering entry and stale field ids\n if (p.order_for_tags?.[id]) delete p.order_for_tags[id];\n for (const k of Object.keys(p.order_for_tags ?? {})) {\n p.order_for_tags![k] = (\n p.order_for_tags![k] ?? []\n ).filter((fid) =>\n (p.fields ?? []).some((f) => f.id === fid),\n );\n if (!p.order_for_tags![k].length)\n delete p.order_for_tags![k];\n }\n }),\n undo: () => this.api.undo(),\n });\n return;\n }\n\n if (this.isFieldId(id)) {\n this.exec({\n name: \"removeField\",\n do: () =>\n this.patchProps((p) => {\n p.fields = (p.fields ?? []).filter((f) => f.id !== id);\n\n // prune tag includes/excludes\n for (const t of p.filters ?? []) {\n t.includes = (t.includes ?? []).filter(\n (x) => x !== id,\n );\n t.excludes = (t.excludes ?? []).filter(\n (x) => x !== id,\n );\n }\n\n // prune per-tag ordering\n for (const k of Object.keys(p.order_for_tags ?? {})) {\n p.order_for_tags![k] = (\n p.order_for_tags![k] ?? []\n ).filter((fid) => fid !== id);\n if (!p.order_for_tags![k].length)\n delete p.order_for_tags![k];\n }\n\n // prune option maps that reference this field id\n const maps: Array<\n \"includes_for_options\" | \"excludes_for_options\"\n > = [\"includes_for_options\", \"excludes_for_options\"];\n for (const m of maps) {\n const map = (p as any)[m] as\n | Record<string, string[]>\n | undefined;\n if (!map) continue;\n for (const key of Object.keys(map)) {\n map[key] = (map[key] ?? []).filter(\n (fid) => fid !== id,\n );\n if (!map[key]?.length) delete map[key];\n }\n if (!Object.keys(map).length) delete (p as any)[m];\n }\n }),\n undo: () => this.api.undo(),\n });\n return;\n }\n\n if (this.isOptionId(id)) {\n this.removeOption(id);\n return;\n }\n\n throw new Error(\"remove: unknown id prefix\");\n }\n\n getNode(\n id: string,\n ):\n | { kind: \"tag\"; data?: Tag; owners: { parentTagId?: string } }\n | { kind: \"field\"; data?: Field; owners: { bindTagIds: string[] } }\n | { kind: \"option\"; data?: any; owners: { fieldId?: string } } {\n const props = this.builder.getProps();\n if (this.isTagId(id)) {\n const t = (props.filters ?? []).find((x) => x.id === id);\n return {\n kind: \"tag\",\n data: t,\n owners: { parentTagId: t?.bind_id },\n };\n }\n if (this.isFieldId(id)) {\n const f = (props.fields ?? []).find((x) => x.id === id);\n const bind = Array.isArray(f?.bind_id)\n ? (f!.bind_id as string[])\n : f?.bind_id\n ? [f.bind_id]\n : [];\n return { kind: \"field\", data: f, owners: { bindTagIds: bind } };\n }\n if (this.isOptionId(id)) {\n const own = ownerOfOption(props, id);\n const f = own\n ? (props.fields ?? []).find((x) => x.id === own.fieldId)\n : undefined;\n const o = f?.options?.find((x) => x.id === id);\n return {\n kind: \"option\",\n data: o,\n owners: { fieldId: own?.fieldId },\n };\n }\n // you can extend for service lookup if desired\n return { kind: \"option\", data: undefined, owners: {} };\n }\n\n getFieldQuantityRule(id: string): QuantityRule | undefined {\n const props = this.builder.getProps();\n const f = (props.fields ?? []).find((x) => x.id === id);\n if (!f) return undefined;\n return normalizeQuantityRule((f as any).meta?.quantity);\n }\n\n setFieldQuantityRule(id: string, rule: unknown): void {\n this.exec({\n name: \"setFieldQuantityRule\",\n do: () =>\n this.patchProps((p) => {\n const f = (p.fields ?? []).find((x) => x.id === id);\n if (!f) return;\n\n const normalized = normalizeQuantityRule(rule);\n\n if (!normalized) {\n // Drop invalid shapes entirely\n if ((f as any).meta?.quantity !== undefined) {\n delete (f as any).meta.quantity;\n // Clean up empty meta object\n if (\n (f as any).meta &&\n Object.keys((f as any).meta).length === 0\n ) {\n delete (f as any).meta;\n }\n }\n return;\n }\n\n // Keep other meta keys intact\n (f as any).meta = {\n ...(f as any).meta,\n quantity: normalized,\n };\n }),\n undo: () => this.api.undo(),\n });\n }\n\n clearFieldQuantityRule(id: string): void {\n this.exec({\n name: \"clearFieldQuantityRule\",\n do: () =>\n this.patchProps((p) => {\n const f = (p.fields ?? []).find((x) => x.id === id);\n if (!f || !(f as any).meta?.quantity) return;\n delete (f as any).meta.quantity;\n if (\n (f as any).meta &&\n Object.keys((f as any).meta).length === 0\n ) {\n delete (f as any).meta;\n }\n }),\n undo: () => this.api.undo(),\n });\n }\n\n /** Walk ancestors for a tag and detect if parent→child would create a cycle */\n private wouldCreateTagCycle(\n p: ServiceProps,\n parentId: string,\n childId: string,\n ): boolean {\n if (parentId === childId) return true;\n const tagById = new Map((p.filters ?? []).map((t) => [t.id, t]));\n let cur: string | undefined = parentId;\n const guard = new Set<string>();\n while (cur) {\n if (cur === childId) return true; // child is ancestor of parent → cycle\n if (guard.has(cur)) break;\n guard.add(cur);\n cur = tagById.get(cur)?.bind_id;\n }\n return false;\n }\n\n private wouldCreateIncludeExcludeCycle(\n p: ServiceProps,\n receiverId: string,\n targetId: string,\n ): boolean {\n // Simple case: A includes A or A excludes A\n if (receiverId === targetId) return true;\n\n // We want to prevent A including/excluding B if B includes/excludes A.\n const getDirectRelations = (id: string): string[] => {\n if (this.isTagId(id)) {\n const t = (p.filters ?? []).find((x) => x.id === id);\n return [...(t?.includes ?? []), ...(t?.excludes ?? [])];\n }\n // For buttons and options\n const inc = p.includes_for_buttons?.[id] ?? [];\n const exc = p.excludes_for_buttons?.[id] ?? [];\n return [...inc, ...exc];\n };\n\n const visited = new Set<string>();\n const stack = [targetId];\n\n while (stack.length > 0) {\n const curr = stack.pop()!;\n if (curr === receiverId) return true;\n if (visited.has(curr)) continue;\n visited.add(curr);\n\n stack.push(...getDirectRelations(curr));\n }\n\n return false;\n }\n\n include(receiverId: string, idOrIds: string | string[]) {\n this.exec({\n name: \"include\",\n do: () =>\n this.patchProps((p) => {\n const receiver = this.getNode(receiverId);\n const ids = Array.isArray(idOrIds) ? idOrIds : [idOrIds];\n if (\n receiver.kind === \"tag\" ||\n (receiver.kind === \"field\" &&\n (receiver.data as any)?.button) ||\n receiver.kind === \"option\"\n ) {\n if (receiver.kind === \"tag\") {\n const t = (p.filters ?? []).find(\n (x) => x.id === receiverId,\n );\n if (t) {\n const accepted: string[] = [];\n const next = new Set(t.includes ?? []);\n for (const id of ids) {\n if (\n this.wouldCreateIncludeExcludeCycle(\n p,\n receiverId,\n id,\n )\n ) {\n this.emit(\"editor:error\", {\n message: `Cycle detected: ${receiverId} including ${id} would create a cycle.`,\n code: \"cycle_detected\",\n meta: {\n receiverId,\n targetId: id,\n type: \"include\",\n },\n });\n continue;\n }\n next.add(id);\n accepted.push(id);\n }\n if (\n accepted.length > 0 ||\n (t.includes?.length ?? 0) > 0\n ) {\n t.includes = Array.from(next);\n }\n\n if (t.excludes) {\n t.excludes = t.excludes.filter(\n (x) => !accepted.includes(x),\n );\n if (t.excludes.length === 0) {\n delete t.excludes;\n }\n }\n }\n } else {\n const accepted: string[] = [];\n const current =\n p.includes_for_buttons?.[receiverId] ?? [];\n const next = new Set(current);\n for (const id of ids) {\n if (\n this.wouldCreateIncludeExcludeCycle(\n p,\n receiverId,\n id,\n )\n ) {\n this.emit(\"editor:error\", {\n message: `Cycle detected: ${receiverId} including ${id} would create a cycle.`,\n code: \"cycle_detected\",\n meta: {\n receiverId,\n targetId: id,\n type: \"include\",\n },\n });\n continue;\n }\n next.add(id);\n accepted.push(id);\n }\n if (accepted.length > 0 || current.length > 0) {\n if (!p.includes_for_buttons)\n p.includes_for_buttons = {};\n p.includes_for_buttons[receiverId] =\n Array.from(next);\n }\n\n if (p.excludes_for_buttons?.[receiverId]) {\n p.excludes_for_buttons[receiverId] =\n p.excludes_for_buttons[receiverId].filter(\n (x) => !accepted.includes(x),\n );\n if (\n p.excludes_for_buttons[receiverId]\n .length === 0\n ) {\n delete p.excludes_for_buttons[receiverId];\n }\n }\n }\n\n // ensure normalise doesn't drop it (test environment might not have all nodes)\n if (!p.fields) p.fields = [];\n if (!p.filters) p.filters = [];\n } else {\n throw new Error(\n \"Receiver must be a tag, button field, or option\",\n );\n }\n }),\n undo: () => this.api.undo(),\n });\n }\n\n exclude(receiverId: string, idOrIds: string | string[]) {\n this.exec({\n name: \"exclude\",\n do: () =>\n this.patchProps((p) => {\n const receiver = this.getNode(receiverId);\n const ids = Array.isArray(idOrIds) ? idOrIds : [idOrIds];\n if (\n receiver.kind === \"tag\" ||\n (receiver.kind === \"field\" &&\n (receiver.data as any)?.button) ||\n receiver.kind === \"option\"\n ) {\n if (receiver.kind === \"tag\") {\n const t = (p.filters ?? []).find(\n (x) => x.id === receiverId,\n );\n if (t) {\n const accepted: string[] = [];\n const next = new Set(t.excludes ?? []);\n for (const id of ids) {\n if (\n this.wouldCreateIncludeExcludeCycle(\n p,\n receiverId,\n id,\n )\n ) {\n this.emit(\"editor:error\", {\n message: `Cycle detected: ${receiverId} excluding ${id} would create a cycle.`,\n code: \"cycle_detected\",\n meta: {\n receiverId,\n targetId: id,\n type: \"exclude\",\n },\n });\n continue;\n }\n next.add(id);\n accepted.push(id);\n }\n if (\n accepted.length > 0 ||\n (t.excludes?.length ?? 0) > 0\n ) {\n t.excludes = Array.from(next);\n }\n\n if (t.includes) {\n t.includes = t.includes.filter(\n (x) => !accepted.includes(x),\n );\n if (t.includes.length === 0) {\n delete t.includes;\n }\n }\n }\n } else {\n const accepted: string[] = [];\n const current =\n p.excludes_for_buttons?.[receiverId] ?? [];\n const next = new Set(current);\n for (const id of ids) {\n if (\n this.wouldCreateIncludeExcludeCycle(\n p,\n receiverId,\n id,\n )\n ) {\n this.emit(\"editor:error\", {\n message: `Cycle detected: ${receiverId} excluding ${id} would create a cycle.`,\n code: \"cycle_detected\",\n meta: {\n receiverId,\n targetId: id,\n type: \"exclude\",\n },\n });\n continue;\n }\n next.add(id);\n accepted.push(id);\n }\n if (accepted.length > 0 || current.length > 0) {\n if (!p.excludes_for_buttons)\n p.excludes_for_buttons = {};\n p.excludes_for_buttons[receiverId] =\n Array.from(next);\n }\n\n if (p.includes_for_buttons?.[receiverId]) {\n p.includes_for_buttons[receiverId] =\n p.includes_for_buttons[receiverId].filter(\n (x) => !accepted.includes(x),\n );\n if (\n p.includes_for_buttons[receiverId]\n .length === 0\n ) {\n delete p.includes_for_buttons[receiverId];\n }\n }\n }\n\n // ensure normalise doesn't drop it (test environment might not have all nodes)\n if (!p.fields) p.fields = [];\n if (!p.filters) p.filters = [];\n } else {\n throw new Error(\n \"Receiver must be a tag, button field, or option\",\n );\n }\n }),\n undo: () => this.api.undo(),\n });\n }\n\n /* ──────────────────────────────────────────────────────────────────────────\n * CONNECT\n * ────────────────────────────────────────────────────────────────────────── */\n connect(kind: WireKind, fromId: string, toId: string): void {\n this.exec({\n name: `connect:${kind}`,\n do: () =>\n this.patchProps((p) => {\n /* ── BIND ─────────────────────────────────────────────── */\n if (kind === \"bind\") {\n // Tag → Tag: set child.bind_id = parent (cycle-safe)\n if (this.isTagId(fromId) && this.isTagId(toId)) {\n if (this.wouldCreateTagCycle(p, fromId, toId)) {\n throw new Error(\n `bind would create a cycle: ${fromId} → ${toId}`,\n );\n }\n const child = (p.filters ?? []).find(\n (t) => t.id === toId,\n );\n if (child) child.bind_id = fromId;\n return;\n }\n // Tag → Field (or Field → Tag): ensure field.bind_id contains the tag\n if (\n (this.isTagId(fromId) && this.isFieldId(toId)) ||\n (this.isFieldId(fromId) && this.isTagId(toId))\n ) {\n const fieldId = this.isFieldId(toId) ? toId : fromId;\n const tagId = this.isTagId(fromId) ? fromId : toId;\n const f = (p.fields ?? []).find(\n (x) => x.id === fieldId,\n );\n if (!f) return;\n if (!f.bind_id) {\n f.bind_id = tagId;\n return;\n }\n if (typeof f.bind_id === \"string\") {\n if (f.bind_id !== tagId)\n f.bind_id = [f.bind_id, tagId];\n return;\n }\n if (!f.bind_id.includes(tagId))\n f.bind_id.push(tagId);\n return;\n }\n throw new Error(\n `bind: unsupported route ${fromId} → ${toId}`,\n );\n }\n\n /* ── INCLUDE / EXCLUDE (Tag→Field, Option→Field) ──────── */\n if (kind === \"include\" || kind === \"exclude\") {\n const key =\n kind === \"include\" ? \"includes\" : \"excludes\";\n\n // Tag → Field: mutate tag.includes/excludes\n if (this.isTagId(fromId) && this.isFieldId(toId)) {\n const t = (p.filters ?? []).find(\n (x) => x.id === fromId,\n );\n if (!t) return;\n const arr = (t[key] ??= []);\n if (!arr.includes(toId)) arr.push(toId);\n return;\n }\n\n // Option → Field: mutate includes_for_options / excludes_for_options using optionId\n if (this.isOptionId(fromId) && this.isFieldId(toId)) {\n const mapKey =\n kind === \"include\"\n ? \"includes_for_options\"\n : \"excludes_for_options\";\n const maps = (p as any)[mapKey] as\n | Record<string, string[]>\n | undefined;\n const next = { ...(maps ?? {}) };\n const arr = next[fromId] ?? [];\n if (!arr.includes(toId)) arr.push(toId);\n next[fromId] = arr;\n (p as any)[mapKey] = next;\n return;\n }\n\n throw new Error(\n `${kind}: unsupported route ${fromId} → ${toId}`,\n );\n }\n\n /* ── SERVICE (Service→Tag | Service→Option) ───────────── */\n // inside connect(kind, from, to)\n if (kind === \"service\") {\n // ONLY ensure it exists; no type checks/parsing\n ensureServiceExists(this.opts, fromId);\n\n if (toId.startsWith(\"t:\")) {\n this.exec({\n name: \"connect:service→tag\",\n do: () =>\n this.patchProps((p) => {\n const t = (p.filters ?? []).find(\n (x) => x.id === toId,\n );\n if (t) (t as any).service_id = fromId; // store as-is\n }),\n undo: () => this.api.undo(),\n });\n return;\n }\n\n if (toId.startsWith(\"o:\")) {\n this.exec({\n name: \"connect:service→option\",\n do: () =>\n this.patchProps((p) => {\n for (const f of p.fields ?? []) {\n const o = f.options?.find(\n (x) => x.id === toId,\n );\n if (o) {\n (o as any).service_id = fromId;\n return;\n }\n }\n }),\n undo: () => this.api.undo(),\n });\n return;\n }\n\n throw new Error(\n 'service: to must be a tag (\"t:*\") or option (\"o:*\")',\n );\n }\n\n throw new Error(`Unknown connect kind: ${kind}`);\n }),\n undo: () => this.api.undo(), // snapshot-based undo will restore prior state\n });\n }\n\n /* ──────────────────────────────────────────────────────────────────────────\n * DISCONNECT\n * ────────────────────────────────────────────────────────────────────────── */\n disconnect(kind: WireKind, fromId: string, toId: string): void {\n this.exec({\n name: `disconnect:${kind}`,\n do: () =>\n this.patchProps((p) => {\n /* ── BIND ─────────────────────────────────────────────── */\n if (kind === \"bind\") {\n // Tag → Tag\n if (this.isTagId(fromId) && this.isTagId(toId)) {\n const child = (p.filters ?? []).find(\n (t) => t.id === toId,\n );\n if (child?.bind_id === fromId) delete child.bind_id;\n return;\n }\n // Tag ↔ Field\n if (\n (this.isTagId(fromId) && this.isFieldId(toId)) ||\n (this.isFieldId(fromId) && this.isTagId(toId))\n ) {\n const fieldId = this.isFieldId(toId) ? toId : fromId;\n const tagId = this.isTagId(fromId) ? fromId : toId;\n const f = (p.fields ?? []).find(\n (x) => x.id === fieldId,\n );\n if (!f?.bind_id) return;\n if (typeof f.bind_id === \"string\") {\n if (f.bind_id === tagId) delete f.bind_id;\n return;\n }\n f.bind_id = f.bind_id.filter(\n (x) => x !== tagId,\n ) as any;\n if (f.bind_id?.length === 0) delete f.bind_id;\n return;\n }\n throw new Error(\n `unbind: unsupported route ${fromId} → ${toId}`,\n );\n }\n\n /* ── INCLUDE / EXCLUDE (Tag→Field, Option→Field) ──────── */\n if (kind === \"include\" || kind === \"exclude\") {\n const key =\n kind === \"include\" ? \"includes\" : \"excludes\";\n\n // Tag → Field\n if (this.isTagId(fromId) && this.isFieldId(toId)) {\n const t = (p.filters ?? []).find(\n (x) => x.id === fromId,\n );\n if (!t) return;\n t[key] = (t[key] ?? []).filter((x) => x !== toId);\n if (!t[key]?.length) delete (t as any)[key];\n return;\n }\n\n // Option → Field\n if (this.isOptionId(fromId) && this.isFieldId(toId)) {\n const mapKey =\n kind === \"include\"\n ? \"includes_for_options\"\n : \"excludes_for_options\";\n const maps = (p as any)[mapKey] as\n | Record<string, string[]>\n | undefined;\n if (!maps) return;\n if (maps[fromId]) {\n maps[fromId] = (maps[fromId] ?? []).filter(\n (fid) => fid !== toId,\n );\n if (!maps[fromId]?.length) delete maps[fromId];\n }\n if (!Object.keys(maps).length)\n delete (p as any)[mapKey];\n return;\n }\n\n throw new Error(\n `${kind}: unsupported route ${fromId} → ${toId}`,\n );\n }\n\n /* ── SERVICE (Service→Tag | Service→Option) ───────────── */\n if (kind === \"service\") {\n // STILL only ensure it exists; no type checks/parsing\n ensureServiceExists(this.opts, fromId);\n\n if (toId.startsWith(\"t:\")) {\n this.exec({\n name: \"disconnect:service→tag\",\n do: () =>\n this.patchProps((p) => {\n const t = (p.filters ?? []).find(\n (x) => x.id === toId,\n );\n if (t) delete (t as any).service_id;\n }),\n undo: () => this.api.undo(),\n });\n return;\n }\n\n if (toId.startsWith(\"o:\")) {\n this.exec({\n name: \"disconnect:service→option\",\n do: () =>\n this.patchProps((p) => {\n for (const f of p.fields ?? []) {\n const o = f.options?.find(\n (x) => x.id === toId,\n );\n if (o) {\n delete (o as any).service_id;\n return;\n }\n }\n }),\n undo: () => this.api.undo(),\n });\n return;\n }\n\n throw new Error(\n 'service: to must be a tag (\"t:*\") or option (\"o:*\")',\n );\n }\n\n throw new Error(`Unknown disconnect kind: ${kind}`);\n }),\n undo: () => this.api.undo(),\n });\n }\n\n setConstraint(tagId: string, flag: string, value: boolean | undefined) {\n let prev: boolean | undefined;\n this.exec({\n name: \"setConstraint\",\n do: () =>\n this.patchProps((p) => {\n const t = (p.filters ?? []).find((x) => x.id === tagId);\n if (!t) return;\n prev = t.constraints?.[flag];\n if (!t.constraints) t.constraints = {};\n if (value === undefined) delete t.constraints[flag];\n else t.constraints[flag] = value;\n }),\n undo: () =>\n this.patchProps((p) => {\n const t = (p.filters ?? []).find((x) => x.id === tagId);\n if (!t) return;\n if (!t.constraints) t.constraints = {};\n if (prev === undefined) delete t.constraints[flag];\n else t.constraints[flag] = prev;\n }),\n });\n // After mutation, normalise() will propagate effective constraints & meta\n }\n\n /**\n * Clear a constraint override by removing the local constraint that conflicts with an ancestor.\n */\n clearConstraintOverride(tagId: string, flag: string) {\n let prev: boolean | undefined;\n let prevOverride: any;\n this.exec({\n name: \"clearConstraintOverride\",\n do: () =>\n this.patchProps((p) => {\n const t = (p.filters ?? []).find((x) => x.id === tagId);\n if (!t) return;\n prev = t.constraints?.[flag];\n prevOverride = t.constraints_overrides?.[flag];\n\n if (t.constraints) delete t.constraints[flag];\n if (t.constraints_overrides)\n delete t.constraints_overrides[flag];\n }),\n undo: () =>\n this.patchProps((p) => {\n const t = (p.filters ?? []).find((x) => x.id === tagId);\n if (!t) return;\n if (prev !== undefined) {\n if (!t.constraints) t.constraints = {};\n t.constraints[flag] = prev;\n }\n if (prevOverride !== undefined) {\n if (!t.constraints_overrides)\n t.constraints_overrides = {};\n t.constraints_overrides[flag] = prevOverride;\n }\n }),\n });\n }\n\n /**\n * Clear a constraint from a tag and its descendants.\n * If a descendant has an override, it assigns that override's value as local.\n */\n clearConstraint(tagId: string, flag: string) {\n this.exec({\n name: \"clearConstraint\",\n do: () =>\n this.patchProps((p) => {\n const tags = p.filters ?? [];\n const byId = new Map(tags.map((t) => [t.id, t]));\n const children = new Map<string, string[]>();\n for (const t of tags) {\n if (t.bind_id) {\n if (!children.has(t.bind_id))\n children.set(t.bind_id, []);\n children.get(t.bind_id)!.push(t.id);\n }\n }\n\n const process = (id: string) => {\n const t = byId.get(id);\n if (!t) return;\n\n const override = t.constraints_overrides?.[flag];\n if (override) {\n if (!t.constraints) t.constraints = {};\n t.constraints[flag] = override.from;\n delete t.constraints_overrides![flag];\n if (\n Object.keys(t.constraints_overrides ?? {})\n .length === 0\n ) {\n delete t.constraints_overrides;\n }\n } else {\n if (t.constraints) {\n delete t.constraints[flag];\n if (Object.keys(t.constraints).length === 0) {\n delete t.constraints;\n }\n }\n }\n\n for (const childId of children.get(id) ?? []) {\n process(childId);\n }\n };\n\n process(tagId);\n }),\n undo: () => this.api.undo(),\n });\n }\n\n /* ───────────────────── Internals ───────────────────── */\n\n private replaceProps(next: ServiceProps): void {\n // Ensure canonical shape + constraint propagation\n const norm = normalise(next, {\n constraints: this.builder\n .getConstraints()\n .map((item) => item.label),\n defaultPricingRole: \"base\",\n });\n this.builder.load(norm);\n this.api.refreshGraph();\n }\n\n private patchProps(mut: (p: ServiceProps) => void): void {\n const cur = cloneDeep(this.builder.getProps());\n mut(cur);\n this.replaceProps(cur);\n }\n\n private afterMutation(command: string, _before: EditorSnapshot) {\n if (this.txnDepth > 0) return; // delay until commit()\n this.pushHistory(this.makeSnapshot(command));\n this.emit(\"editor:command\", { name: command });\n if (this.opts.validateAfterEach)\n this.emit(\"editor:change\", {\n props: this.builder.getProps(),\n reason: \"validate\",\n command,\n });\n else\n this.emit(\"editor:change\", {\n props: this.builder.getProps(),\n reason: \"mutation\",\n command,\n });\n }\n\n private commit(label: string) {\n const snap = this.makeSnapshot(label);\n this.pushHistory(snap);\n this.emit(\"editor:change\", {\n props: snap.props,\n reason: \"transaction\",\n command: this.txnLabel,\n });\n }\n\n private makeSnapshot(_why: string): EditorSnapshot {\n const props = cloneDeep(this.builder.getProps());\n const canvas = this.api.snapshot();\n return {\n props,\n layout: {\n canvas,\n },\n };\n }\n\n private loadSnapshot(s: EditorSnapshot, reason: \"undo\" | \"redo\") {\n this.builder.load(cloneDeep(s.props));\n\n const layout = s.layout;\n const canvas = layout?.canvas;\n\n if (canvas) {\n if (canvas.positions) this.api.setPositions(canvas.positions);\n if (canvas.viewport) this.api.setViewport(canvas.viewport);\n if (canvas.selection)\n this.api.select(\n Array.isArray(canvas.selection)\n ? canvas.selection\n : Array.from(canvas.selection),\n );\n } else {\n this.api.refreshGraph();\n }\n this.emit(\"editor:change\", { props: this.builder.getProps(), reason });\n }\n\n private pushHistory(snap: EditorSnapshot) {\n // truncate forward\n if (this.index < this.history.length - 1) {\n this.history = this.history.slice(0, this.index + 1);\n }\n this.history.push(snap);\n // trim from start if beyond limit\n const over = this.history.length - this.opts.historyLimit;\n if (over > 0) {\n this.history.splice(0, over);\n this.index = this.history.length - 1;\n } else {\n this.index = this.history.length - 1;\n }\n }\n\n // IDs like \"t:1\", \"f:2\", \"o:3\" — must be unique across tags, fields, options.\n private genId(prefix: \"t\" | \"f\" | \"o\"): string {\n const props = this.builder.getProps();\n const taken = new Set<string>([\n ...(props.filters ?? []).map((t) => t.id),\n ...(props.fields ?? []).map((f) => f.id),\n ...(props.fields ?? []).flatMap(\n (f) => f.options?.map((o) => o.id) ?? [],\n ),\n ]);\n for (let i = 1; i < 10_000; i++) {\n const id = `${prefix}:${i}`;\n if (!taken.has(id)) return id;\n }\n throw new Error(\"Unable to generate id\");\n }\n\n private emit<K extends keyof (EditorEvents & any)>(\n event: K,\n payload: (EditorEvents & any)[K],\n ) {\n // Reuse CanvasAPI’s bus so consumers have a single stream\n this.api.emit(event as any, payload as any);\n }\n\n /**\n * Suggest/filter candidate services against the current visible-group\n * (single tag) context.\n *\n * - Excludes services already used in this group.\n * - Applies capability presence, tag constraints, rate policy, and compiled policies.\n *\n * @param candidates service ids to evaluate\n * @param ctx\n * @param ctx.tagId active visible-group tag id\n * @param ctx.usedServiceIds services already selected for this visible group (first is treated as \"primary\" for rate policy)\n * @param ctx.effectiveConstraints effective constraints for the active tag (dripfeed/refill/cancel)\n * @param ctx.policies raw JSON policies (will be compiled via compilePolicies)\n * @param ctx.fallback fallback/rate settings (defaults applied if omitted)\n */\n public filterServicesForVisibleGroup(\n candidates: Array<number | string>,\n ctx: {\n tagId: string;\n usedServiceIds: Array<number | string>;\n effectiveConstraints?: Partial<\n Record<\"refill\" | \"cancel\" | \"dripfeed\", boolean>\n >;\n policies?: unknown;\n fallback?: FallbackSettings;\n },\n ): ServiceCheck[] {\n const svcMap: DgpServiceMap =\n (this as any).opts?.serviceMap ??\n (this.builder as any).getServiceMap?.() ??\n {};\n\n const usedSet = new Set(ctx.usedServiceIds.map(String));\n const primary = ctx.usedServiceIds[0]; // group \"primary\" (first used); rate policy compares against this when present\n\n const fb: FallbackSettings = {\n requireConstraintFit: true,\n ratePolicy: { kind: \"lte_primary\" },\n selectionStrategy: \"priority\",\n mode: \"strict\",\n ...(ctx.fallback ?? {}),\n };\n\n // Compile policies once here; you asked for the evaluate path to call compilePolicies.\n const evaluatePoliciesRaw = (\n raw: unknown,\n serviceIds: Array<number | string>,\n tagId: string,\n ) => {\n const { policies } = compilePolicies(raw);\n return evaluateServicePolicies(policies, serviceIds, svcMap, tagId);\n };\n\n const out: ServiceCheck[] = [];\n\n for (const id of candidates) {\n // Skip already-used services in this group\n if (usedSet.has(String(id))) continue;\n\n const cap = svcMap[Number(id)];\n if (!cap) {\n out.push({\n id,\n ok: false,\n fitsConstraints: false,\n passesRate: false,\n passesPolicies: false,\n reasons: [\"missing_capability\"],\n });\n continue;\n }\n\n // Constraints (only flags explicitly true at tag are \"required\")\n const fitsConstraints = constraintFitOk(\n svcMap,\n cap.id,\n ctx.effectiveConstraints ?? {},\n );\n\n // Rate policy vs primary (if any); if no primary, consider pass\n const passesRate =\n primary == null ? true : rateOk(svcMap, id, primary, fb);\n\n // Policies: compile + evaluate with current used + candidate\n const polRes = evaluatePoliciesRaw(\n ctx.policies ?? [],\n [...ctx.usedServiceIds, id],\n ctx.tagId,\n );\n const passesPolicies = polRes.ok;\n\n const reasons: ServiceCheck[\"reasons\"] = [];\n if (!fitsConstraints) reasons.push(\"constraint_mismatch\");\n if (!passesRate) reasons.push(\"rate_policy\");\n if (!passesPolicies) reasons.push(\"policy_error\");\n\n out.push({\n id,\n ok: fitsConstraints && passesRate && passesPolicies,\n fitsConstraints,\n passesRate,\n passesPolicies,\n policyErrors: polRes.errors.length ? polRes.errors : undefined,\n policyWarnings: polRes.warnings.length\n ? polRes.warnings\n : undefined,\n reasons,\n cap,\n rate: toFiniteNumber(cap.rate),\n });\n }\n\n return out;\n }\n}\n\nfunction nextCopyLabel(old: string): string {\n // \"Label\" -> \"Label (copy)\", \"Label (copy)\" -> \"Label (copy 2)\"\n // noinspection RegExpUnnecessaryNonCapturingGroup\n const m = old.match(/^(.*?)(?:\\s*\\(copy(?:\\s+(\\d+))?\\))$/i);\n if (!m) return `${old} (copy)`;\n const stem = m[1].trim();\n const n = m[2] ? parseInt(m[2], 10) + 1 : 2;\n return `${stem} (copy ${n})`;\n}\n\nfunction nextCopyName(old?: string): string | undefined {\n if (!old) return undefined;\n // \"name\" -> \"name_copy\", \"name_copy\" -> \"name_copy2\", \"name_copy2\" -> \"name_copy3\"\n const m = old.match(/^(.*?)(_copy(\\d+)?)$/i);\n if (!m) return `${old}_copy`;\n const stem = m[1];\n const n = m[3] ? parseInt(m[3], 10) + 1 : 2;\n return `${stem}_copy${n}`;\n}\n\nfunction defaultOptionIdStrategy(old: string): string {\n // \"basic\" -> \"basic_copy\" / \"basic_copy2\"…\n return nextCopyId(old);\n}\n\nfunction nextCopyId(old: string): string {\n // \"tag_1\" -> \"tag_1_copy\" or bumps trailing copy N\n // noinspection RegExpUnnecessaryNonCapturingGroup\n const m = old.match(/^(.*?)(?:_copy(\\d+)?)$/i);\n if (!m) return `${old}_copy`;\n const stem = m[1];\n const n = m[2] ? parseInt(m[2], 10) + 1 : 2;\n return `${stem}_copy${n}`;\n}\n\nfunction bumpSuffix(old: string): string {\n // \"foo_copy\" -> \"foo_copy2\", \"foo_copy2\" -> \"foo_copy3\"\n const m = old.match(/^(.*?)(\\d+)$/);\n if (!m) return `${old}2`;\n const stem = m[1];\n return `${stem}${parseInt(m[2], 10) + 1}`;\n}\n\n// Accept only these shapes; drop everything else.\ntype QuantityRule = { valueBy: \"value\" | \"length\" | \"eval\"; code?: string };\n\nfunction normalizeQuantityRule(input: unknown): QuantityRule | undefined {\n if (!input || typeof input !== \"object\") return undefined;\n const v = input as any;\n const vb = v.valueBy;\n if (vb !== \"value\" && vb !== \"length\" && vb !== \"eval\") return undefined;\n\n const out: QuantityRule = { valueBy: vb };\n if (vb === \"eval\" && typeof v.code === \"string\" && v.code.trim()) {\n out.code = v.code;\n }\n // For non-eval, any provided code is dropped.\n return out;\n}\n\n// ---- Policy evaluation (compiled rules) -------------------------------------\n\nfunction evaluateServicePolicies(\n rules: DynamicRule[] | undefined,\n svcIds: (string | number)[],\n svcMap: DgpServiceMap,\n tagId: string,\n): { ok: boolean; errors: string[]; warnings: string[] } {\n const errors: string[] = [];\n const warnings: string[] = [];\n if (!rules || !rules.length) return { ok: true, errors, warnings };\n\n const relevant = rules.filter(\n (r) =>\n r.subject === \"services\" &&\n (r.scope === \"visible_group\" || r.scope === \"global\"),\n );\n\n for (const r of relevant) {\n const ids = svcIds.filter((id) =>\n matchesRuleFilter(svcMap[Number(id)], r, tagId),\n );\n const projection = r.projection || \"service.id\";\n const values = ids.map((id) =>\n policyProjectValue(svcMap[Number(id)], projection),\n );\n\n let ok = true;\n switch (r.op) {\n case \"all_equal\":\n ok = values.length <= 1 || values.every((v) => v === values[0]);\n break;\n case \"unique\": {\n const uniq = new Set(values.map((v) => String(v)));\n ok = uniq.size === values.length;\n break;\n }\n case \"no_mix\": {\n const uniq = new Set(values.map((v) => String(v)));\n ok = uniq.size <= 1;\n break;\n }\n case \"all_true\":\n ok = values.every((v) => !!v);\n break;\n case \"any_true\":\n ok = values.some((v) => !!v);\n break;\n case \"max_count\": {\n const n = typeof r.value === \"number\" ? r.value : NaN;\n ok = Number.isFinite(n) ? values.length <= n : true;\n break;\n }\n case \"min_count\": {\n const n = typeof r.value === \"number\" ? r.value : NaN;\n ok = Number.isFinite(n) ? values.length >= n : true;\n break;\n }\n default:\n ok = true;\n }\n\n if (!ok) {\n if ((r.severity ?? \"error\") === \"error\")\n errors.push(r.id ?? \"policy_error\");\n else warnings.push(r.id ?? \"policy_warning\");\n }\n }\n\n return { ok: errors.length === 0, errors, warnings };\n}\n\nfunction policyProjectValue(\n cap: DgpServiceCapability | undefined,\n projection: string,\n) {\n if (!cap) return undefined;\n const key = projection.startsWith(\"service.\")\n ? projection.slice(8)\n : projection;\n return (cap as any)[key];\n}\n\nfunction matchesRuleFilter(\n cap: DgpServiceCapability | undefined,\n rule: DynamicRule,\n tagId: string,\n): boolean {\n if (!cap) return false;\n const f = rule.filter;\n if (!f) return true;\n\n if (f.tag_id && !toStrSet(f.tag_id).has(String(tagId))) return false;\n // role is intentionally ignored at suggestion-time (unknown), as discussed.\n return true;\n}\n\nfunction toStrSet(v: string | string[] | number | number[]): Set<string> {\n const arr = Array.isArray(v) ? v : [v];\n const s = new Set<string>();\n for (const x of arr) s.add(String(x));\n return s;\n}\n\ntype ServiceCheck = {\n id: number | string;\n ok: boolean;\n fitsConstraints: boolean;\n passesRate: boolean;\n passesPolicies: boolean;\n policyErrors?: string[];\n policyWarnings?: string[];\n reasons: Array<\n | \"constraint_mismatch\"\n | \"rate_policy\"\n | \"policy_error\"\n | \"missing_capability\"\n >;\n cap?: DgpServiceCapability;\n rate?: number;\n};\n","// 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 { Field, ServiceProps, Tag } from \"@/schema\";\nimport type { DgpServiceMap } from \"@/schema/provider\";\nimport type { ValidationError, ValidatorOptions } from \"@/schema/validation\";\nimport { NodeMap } from \"@/core/node-map\";\n\nexport interface ValidationCtx {\n readonly props: ServiceProps;\n readonly nodeMap: NodeMap;\n readonly options: ValidatorOptions;\n\n readonly errors: ValidationError[];\n\n readonly serviceMap: DgpServiceMap;\n 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/node-map.ts\nimport type { Field, FieldOption, ServiceProps, Tag } from \"@/schema\";\n\nexport type NodeKind = \"tag\" | \"field\" | \"option\";\n\nexport type NodeRef =\n | { kind: \"tag\"; id: string; node: Tag }\n | { kind: \"field\"; id: string; node: Field }\n | {\n kind: \"option\";\n id: string;\n node: FieldOption;\n fieldId: string; // parent field id\n };\n\nexport type NodeMap = Map<string, NodeRef>;\n\n/**\n * Build a node map keyed by *actual ids* (no prefix assumptions).\n * Rule: ids are unique across tags/fields/options.\n *\n * If you ever violate uniqueness, the first wins by default; we can hard-throw if you want.\n */\nexport function buildNodeMap(props: ServiceProps): NodeMap {\n const map: NodeMap = new Map();\n\n for (const t of props.filters ?? []) {\n if (!map.has(t.id)) map.set(t.id, { kind: \"tag\", id: t.id, node: t });\n }\n\n for (const f of props.fields ?? []) {\n if (!map.has(f.id)) map.set(f.id, { kind: \"field\", id: f.id, node: f });\n\n for (const o of f.options ?? []) {\n if (!map.has(o.id))\n map.set(o.id, {\n kind: \"option\",\n id: o.id,\n node: o,\n fieldId: f.id,\n });\n }\n }\n\n return map;\n}\n\n/**\n * Resolve a trigger id into either:\n * - a direct node id (tag/field/option)\n * - or a composite \"fieldId::optionId\" trigger (used for maps)\n *\n * IMPORTANT:\n * - We do NOT strip any prefixes like \"o:\".\n * - \"o:on\" is a perfectly valid *option id* if your data uses it.\n */\nexport type TriggerRef =\n | {\n kind: \"composite\";\n triggerKey: string;\n fieldId: string;\n optionId: string;\n }\n | { kind: NodeKind; triggerKey: string; id: string; fieldId?: string };\n\nexport function resolveTrigger(\n trigger: string,\n nodeMap: NodeMap,\n): TriggerRef | undefined {\n // Composite: fieldId::optionId (maps key by composite)\n const idx = trigger.indexOf(\"::\");\n if (idx !== -1) {\n const fieldId = trigger.slice(0, idx);\n const optionId = trigger.slice(idx + 2);\n return { kind: \"composite\", triggerKey: trigger, fieldId, optionId };\n }\n\n // Direct node id (tag/field/option)\n const direct = nodeMap.get(trigger);\n if (!direct) return undefined;\n\n if (direct.kind === \"option\") {\n return {\n kind: \"option\",\n triggerKey: trigger,\n id: direct.id,\n fieldId: direct.fieldId,\n };\n }\n\n return { kind: direct.kind, triggerKey: trigger, id: direct.id };\n}\n","// src/core/visibility.ts\r\nimport type { Field, ServiceProps, Tag } from \"@/schema\";\r\nimport { buildNodeMap, type NodeMap, resolveTrigger } from \"./node-map\";\r\n\r\nexport type VisibilityOptions = {\r\n selectedKeys?: Set<string>;\r\n};\r\n\r\n/**\r\n * Single source of truth: selection-aware + lineage-aware visible field ids under a tag.\r\n * Returns ordered IDs.\r\n */\r\nexport function visibleFieldIdsUnder(\r\n props: ServiceProps,\r\n tagId: string,\r\n opts: VisibilityOptions = {},\r\n): string[] {\r\n const tags = props.filters ?? [];\r\n const fields = props.fields ?? [];\r\n\r\n const tagById = new Map(tags.map((t) => [t.id, t]));\r\n const tag = tagById.get(tagId);\r\n if (!tag) return [];\r\n\r\n // Build node map (id => {kind,node,...})\r\n const nodeMap: NodeMap = buildNodeMap(props);\r\n\r\n // ---- lineage with depth: self=0, parent=1, grandparent=2 ...\r\n const lineageDepth = new Map<string, number>();\r\n {\r\n const guard = new Set<string>();\r\n let cur: Tag | undefined = tag;\r\n let d = 0;\r\n while (cur && !guard.has(cur.id)) {\r\n lineageDepth.set(cur.id, d++);\r\n guard.add(cur.id);\r\n const parentId: string | undefined = cur.bind_id;\r\n cur = parentId ? tagById.get(parentId) : undefined;\r\n }\r\n }\r\n\r\n const isTagInLineage = (id: string) => lineageDepth.has(id);\r\n\r\n const fieldById = new Map(fields.map((f) => [f.id, f]));\r\n\r\n const ownerDepthForField = (f: Field): number | undefined => {\r\n const b = f.bind_id;\r\n if (!b) return undefined;\r\n\r\n if (typeof b === \"string\") return lineageDepth.get(b);\r\n\r\n let best: number | undefined = undefined;\r\n for (const id of b) {\r\n const d = lineageDepth.get(id);\r\n if (d == null) continue;\r\n if (best == null || d < best) best = d;\r\n }\r\n return best;\r\n };\r\n\r\n const ownerDepthForTriggerKey = (\r\n triggerKey: string,\r\n ): number | undefined => {\r\n const t = resolveTrigger(triggerKey, nodeMap);\r\n if (!t) return undefined;\r\n\r\n // Composite trigger: fieldId::optionId\r\n if (t.kind === \"composite\") {\r\n const f = fieldById.get(t.fieldId);\r\n if (!f) return undefined;\r\n return ownerDepthForField(f);\r\n }\r\n\r\n // Field trigger (button field id)\r\n if (t.kind === \"field\") {\r\n const f = fieldById.get(t.id);\r\n if (!f || f.button !== true) return undefined;\r\n return ownerDepthForField(f);\r\n }\r\n\r\n // Option trigger (option id)\r\n if (t.kind === \"option\") {\r\n const f = t.fieldId ? fieldById.get(t.fieldId) : undefined;\r\n if (!f) return undefined;\r\n return ownerDepthForField(f);\r\n }\r\n\r\n // Tag trigger not used as a “button trigger”\r\n return undefined;\r\n };\r\n\r\n // ---- current tag includes/excludes (NOT inherited)\r\n const tagInclude = new Set(tag.includes ?? []);\r\n const tagExclude = new Set(tag.excludes ?? []);\r\n\r\n // ---- selection triggers (buttons + options)\r\n const selected = opts.selectedKeys ?? new Set<string>();\r\n const incMap = props.includes_for_buttons ?? {};\r\n const excMap = props.excludes_for_buttons ?? {};\r\n\r\n // Only apply triggers that belong to (self ∪ ancestors).\r\n // Preserve insertion order from the Set.\r\n const relevantTriggersInOrder: string[] = [];\r\n for (const key of selected) {\r\n const d = ownerDepthForTriggerKey(key);\r\n if (d == null) continue;\r\n relevantTriggersInOrder.push(key);\r\n }\r\n\r\n // ---- base candidates: bound fields inherited + current tag includes\r\n const visible = new Set<string>();\r\n\r\n const isBoundToLineage = (f: Field): boolean => {\r\n const b = f.bind_id;\r\n if (!b) return false;\r\n if (typeof b === \"string\") return isTagInLineage(b);\r\n for (const id of b) if (isTagInLineage(id)) return true;\r\n return false;\r\n };\r\n\r\n for (const f of fields) {\r\n if (isBoundToLineage(f)) visible.add(f.id);\r\n if (tagInclude.has(f.id)) visible.add(f.id);\r\n }\r\n\r\n // apply current tag excludes\r\n for (const id of tagExclude) visible.delete(id);\r\n\r\n // ---- button decisions with precedence:\r\n // closest depth wins; if same depth and conflict => exclude wins\r\n type ButtonDecision = { depth: number; kind: \"include\" | \"exclude\" };\r\n const decide = new Map<string, ButtonDecision>();\r\n\r\n const applyDecision = (fieldId: string, next: ButtonDecision) => {\r\n const prev = decide.get(fieldId);\r\n if (!prev) return void decide.set(fieldId, next);\r\n\r\n if (next.depth < prev.depth) return void decide.set(fieldId, next);\r\n if (next.depth > prev.depth) return;\r\n\r\n if (prev.kind === \"include\" && next.kind === \"exclude\") {\r\n decide.set(fieldId, next);\r\n }\r\n };\r\n\r\n // determinism: revealed order (in trigger order)\r\n const revealedOrder: string[] = [];\r\n const revealedSeen = new Set<string>();\r\n\r\n for (const triggerKey of relevantTriggersInOrder) {\r\n const depth = ownerDepthForTriggerKey(triggerKey);\r\n if (depth == null) continue;\r\n\r\n for (const id of incMap[triggerKey] ?? []) {\r\n applyDecision(id, { depth, kind: \"include\" });\r\n\r\n if (!revealedSeen.has(id)) {\r\n revealedSeen.add(id);\r\n revealedOrder.push(id);\r\n }\r\n }\r\n\r\n for (const id of excMap[triggerKey] ?? []) {\r\n applyDecision(id, { depth, kind: \"exclude\" });\r\n }\r\n }\r\n\r\n // apply button decisions (buttons override tag state)\r\n for (const [fid, d] of decide) {\r\n if (d.kind === \"include\") visible.add(fid);\r\n else visible.delete(fid);\r\n }\r\n\r\n // natural order (props.fields order)\r\n const base = fields.filter((f) => visible.has(f.id)).map((f) => f.id);\r\n\r\n // order_for_tags pins first (ordering only)\r\n const order = props.order_for_tags?.[tagId];\r\n if (order && order.length) {\r\n const ordered = order.filter((fid) => visible.has(fid));\r\n const orderedSet = new Set(ordered);\r\n const rest = base.filter((fid) => !orderedSet.has(fid));\r\n return [...ordered, ...rest];\r\n }\r\n\r\n // otherwise: revealed-first (only final-visible)\r\n return base;\r\n}\r\n\r\n/** Convenience: returns ordered Field[] instead of ids. */\r\nexport function visibleFieldsUnder(\r\n props: ServiceProps,\r\n tagId: string,\r\n opts: VisibilityOptions = {},\r\n): Field[] {\r\n const ids = visibleFieldIdsUnder(props, tagId, opts);\r\n const fieldById = new Map((props.fields ?? []).map((f) => [f.id, f]));\r\n return ids.map((id) => fieldById.get(id)).filter(Boolean) as Field[];\r\n}\r\n","// src/core/validate/steps/visibility.ts\n\nimport type { Field, Tag } from \"@/schema\";\nimport type { ValidationCtx } from \"../shared\";\nimport { isFiniteNumber, withAffected } from \"../shared\";\nimport { visibleFieldsUnder } from \"@/core/visibility\";\n\n/**\n * v.selectedKeys is a Set<string> (per your note).\n * We keep the validator's \"fieldsVisibleUnder\" hook, but route all visibility\n * through the core visibility engine (single source of truth).\n */\nexport function createFieldsVisibleUnder(\n v: ValidationCtx,\n): (tagId: string) => Field[] {\n return (tagId: string): Field[] => {\n return visibleFieldsUnder(v.props, tagId, {\n selectedKeys: v.selectedKeys,\n });\n };\n}\n\n/* -------------------------------------------------------------------------- */\n/* Simulation-enabled validateVisibility */\n/* -------------------------------------------------------------------------- */\n\nexport type SimulateVisibilityOptions = {\n /**\n * When true, performs an in-depth selection simulation starting from root tag(s),\n * exploring states by selecting one selectable trigger at a time and re-validating.\n */\n simulate?: boolean;\n\n /**\n * Safety valve: max number of unique selection states validated.\n * Default: 500\n */\n maxStates?: number;\n\n /**\n * Safety valve: max depth of added selections from the base context.\n * Default: 6\n */\n maxDepth?: number;\n\n /**\n * If true, simulate starting from each root tag (tags without bind_id).\n * Otherwise, simulate only the first inferred root.\n */\n simulateAllRoots?: boolean;\n\n /**\n * If true, only simulate triggers that exist in includes_for_buttons/excludes_for_buttons\n * (massive branching reduction). Default: true.\n *\n * NOTE: Only enable this if selecting triggers has no other side effects besides\n * includes/excludes visibility effects.\n */\n onlyEffectfulTriggers?: boolean;\n};\n\nfunction stableKeyOfSelection(keys: Set<string>): string {\n return Array.from(keys).sort().join(\"|\");\n}\n\nfunction resolveRootTags(tags: Tag[]): Tag[] {\n const roots = tags.filter((t) => !(t as any).bind_id);\n return roots.length ? roots : tags.slice(0, 1);\n}\n\nfunction isEffectfulTrigger(v: ValidationCtx, trigger: string): boolean {\n const inc = v.props.includes_for_buttons ?? {};\n const exc = v.props.excludes_for_buttons ?? {};\n return (inc[trigger]?.length ?? 0) > 0 || (exc[trigger]?.length ?? 0) > 0;\n}\n\nfunction collectSelectableTriggersInContext(\n v: ValidationCtx,\n tagId: string,\n selectedKeys: Set<string>,\n onlyEffectful: boolean,\n): string[] {\n const visible = visibleFieldsUnder(v.props, tagId, {\n selectedKeys: selectedKeys,\n });\n\n const triggers: string[] = [];\n\n for (const f of visible) {\n // button-field trigger\n if ((f as any).button === true) {\n const t = f.id;\n if (!onlyEffectful || isEffectfulTrigger(v, t)) triggers.push(t);\n }\n\n // option triggers (canonical: \"fieldId::optionId\")\n for (const o of f.options ?? []) {\n const t = `${f.id}::${o.id}`;\n if (!onlyEffectful || isEffectfulTrigger(v, t)) triggers.push(t);\n }\n }\n\n // deterministic expansion order\n triggers.sort();\n return triggers;\n}\n\n/**\n * The actual visibility rules (your previous validateVisibility body),\n * extracted so we can run it once per simulated selection state.\n */\nfunction runVisibilityRulesOnce(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) (selection-aware)\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 =\n o.pricing_role ?? (f as any).pricing_role ?? \"base\";\n\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\n/**\n * De-dup only the errors added during simulation, so output stays stable.\n */\nfunction dedupeErrorsInPlace(v: ValidationCtx, startIndex: number): void {\n const seen = new Set<string>();\n\n const keyOfErr = (e: any) => {\n const tagId = e?.details?.tagId ?? e?.details?.affected?.tagId ?? \"\";\n const other = e?.details?.other ?? \"\";\n return `${e?.code ?? \"\"}::${e?.nodeId ?? \"\"}::${tagId}::${other}::${e?.message ?? \"\"}`;\n };\n\n const kept: any[] = [];\n for (let i = startIndex; i < v.errors.length; i++) {\n const e = v.errors[i];\n const k = keyOfErr(e);\n if (seen.has(k)) continue;\n seen.add(k);\n kept.push(e);\n }\n\n v.errors.splice(startIndex, v.errors.length - startIndex, ...kept);\n}\n\n/**\n * validateVisibility(v, { simulate: true }) will:\n * - Start from the root tag context\n * - Compute visible fields under that root given current selection\n * - Enumerate selectable triggers (button fields + option triggers)\n * - DFS: add one trigger, re-validate, then from that new context add any\n * newly-visible triggers, repeat… until depth/cap limits.\n */\nexport function validateVisibility(\n v: ValidationCtx,\n options: SimulateVisibilityOptions = {},\n): void {\n const simulate = options.simulate === true;\n\n if (!simulate) {\n runVisibilityRulesOnce(v);\n return;\n }\n\n const maxStates = Math.max(1, options.maxStates ?? 500);\n const maxDepth = Math.max(0, options.maxDepth ?? 6);\n const onlyEffectful = options.onlyEffectfulTriggers !== false; // default true\n\n const roots = resolveRootTags(v.tags);\n const rootTags = options.simulateAllRoots ? roots : roots.slice(0, 1);\n\n // snapshot original selection Set\n const originalSelected = new Set(v.selectedKeys ?? []);\n\n // we only dedupe what simulation adds\n const errorsStart = v.errors.length;\n\n // visited pruning by selection signature\n const visited = new Set<string>();\n\n type State = { rootTagId: string; selected: Set<string>; depth: number };\n const stack: State[] = [];\n\n // seed states (one per simulated root)\n for (const rt of rootTags) {\n stack.push({\n rootTagId: rt.id,\n selected: new Set(originalSelected),\n depth: 0,\n });\n }\n\n let validatedStates = 0;\n\n while (stack.length) {\n if (validatedStates >= maxStates) break;\n\n const state = stack.pop()!;\n const sig = stableKeyOfSelection(state.selected);\n\n if (visited.has(sig)) continue;\n visited.add(sig);\n\n // apply selection for this state\n v.selectedKeys = state.selected;\n\n // validate once under this selection context\n validatedStates++;\n runVisibilityRulesOnce(v);\n\n // stop expanding deeper\n if (state.depth >= maxDepth) continue;\n\n // expand next possible triggers based on current visible context\n const triggers = collectSelectableTriggersInContext(\n v,\n state.rootTagId,\n state.selected,\n onlyEffectful,\n );\n\n // DFS, deterministic: push reverse so earlier triggers explored first\n for (let i = triggers.length - 1; i >= 0; i--) {\n const trig = triggers[i]!;\n if (state.selected.has(trig)) continue;\n\n const next = new Set(state.selected);\n next.add(trig);\n\n stack.push({\n rootTagId: state.rootTagId,\n selected: next,\n depth: state.depth + 1,\n });\n }\n }\n\n // restore original selection\n v.selectedKeys = originalSelected;\n\n // dedupe errors from simulation tail\n dedupeErrorsInPlace(v, errorsStart);\n\n // If you want a diagnostic warning when capped, you can add it here.\n // Example (non-breaking): add a \"warning\" severity error.\n // if (validatedStates >= maxStates) { ... }\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 === \"t: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 ParsedFallback = { fieldId: string; optionId: string };\n\n/** Fallback parser for legacy \"fieldId::optionId\" keys */\nfunction parseFieldOptionKey(key: string): ParsedFallback | null {\n const idx = key.indexOf(\"::\");\n if (idx === -1) return null;\n\n const fieldId = key.slice(0, idx).trim();\n const optionId = key.slice(idx + 2).trim();\n\n if (!fieldId || !optionId) return null;\n return { fieldId, optionId };\n}\n\nfunction hasOption(v: ValidationCtx, 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\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 badKeyMessage = (key: string): string =>\n `Invalid trigger-map key \"${key}\". Expected a known node id (option or button-field), or \"fieldId::optionId\" pointing to an existing option.`;\n\n /**\n * Valid trigger keys:\n * - nodeMap has key:\n * - kind:\"option\" => ok\n * - kind:\"field\" => ok only if field.button === true\n * - kind:\"tag\" => invalid\n * - else fallback: \"fieldId::optionId\" must point to an existing option under that field\n */\n const validateTriggerKey = (\n key: string,\n ): {\n ok: boolean;\n nodeId?: string; // for error anchoring\n affected?: string[]; // for withAffected\n } => {\n const ref = v.nodeMap.get(key);\n\n if (ref) {\n if (ref.kind === \"option\") {\n // option trigger id is ref.id (key), and we know its parent field\n return {\n ok: true,\n nodeId: ref.fieldId,\n affected: [ref.fieldId, ref.id],\n };\n }\n\n if (ref.kind === \"field\") {\n const isButton = (ref.node as any).button === true;\n if (!isButton)\n return { ok: false, nodeId: ref.id, affected: [ref.id] };\n return { ok: true, nodeId: ref.id, affected: [ref.id] };\n }\n\n // tags cannot be triggers\n return { ok: false, nodeId: ref.id, affected: [ref.id] };\n }\n\n // fallback: fieldId::optionId\n const p = parseFieldOptionKey(key);\n if (!p) return { ok: false };\n\n if (!hasOption(v, p.fieldId, p.optionId))\n return {\n ok: false,\n nodeId: p.fieldId,\n affected: [p.fieldId, p.optionId],\n };\n\n return {\n ok: true,\n nodeId: p.fieldId,\n affected: [p.fieldId, p.optionId],\n };\n };\n\n // bad_option_key (keeping the code name for compatibility)\n for (const k of Object.keys(incMap)) {\n const r = validateTriggerKey(k);\n if (!r.ok) {\n v.errors.push({\n code: \"bad_option_key\",\n severity: \"error\",\n message: badKeyMessage(k),\n nodeId: r.nodeId,\n details: withAffected({ key: k }, r.affected),\n });\n }\n }\n\n for (const k of Object.keys(excMap)) {\n const r = validateTriggerKey(k);\n if (!r.ok) {\n v.errors.push({\n code: \"bad_option_key\",\n severity: \"error\",\n message: badKeyMessage(k),\n nodeId: r.nodeId,\n details: withAffected({ key: k }, r.affected),\n });\n }\n }\n\n // option_include_exclude_conflict: SAME RAW KEY in both maps\n for (const k of Object.keys(incMap)) {\n if (!(k in excMap)) continue;\n\n const r = validateTriggerKey(k);\n v.errors.push({\n code: \"option_include_exclude_conflict\",\n severity: \"error\",\n message: `Trigger-map key \"${k}\" appears in both includes_for_buttons and excludes_for_buttons.`,\n nodeId: r.nodeId,\n details: withAffected({ key: k }, r.affected),\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\";\nimport { buildNodeMap } from \"@/core/node-map\";\n\n/**\n * We read simulation options from ctx without changing the public ValidatorOptions type.\n * (So UI can pass these without needing schema/type changes immediately.)\n */\ntype VisibilitySimOpts = Readonly<{\n simulate?: boolean;\n maxStates?: number;\n maxDepth?: number;\n simulateAllRoots?: boolean;\n onlyEffectfulTriggers?: boolean;\n}>;\n\nfunction readVisibilitySimOpts(ctx: ValidatorOptions): VisibilitySimOpts {\n const c = ctx as any;\n\n const simulate =\n c.simulateVisibility === true ||\n c.visibilitySimulate === true ||\n c.simulate === true;\n\n const maxStates =\n typeof c.maxVisibilityStates === \"number\"\n ? c.maxVisibilityStates\n : typeof c.visibilityMaxStates === \"number\"\n ? c.visibilityMaxStates\n : typeof c.maxStates === \"number\"\n ? c.maxStates\n : undefined;\n\n const maxDepth =\n typeof c.maxVisibilityDepth === \"number\"\n ? c.maxVisibilityDepth\n : typeof c.visibilityMaxDepth === \"number\"\n ? c.visibilityMaxDepth\n : typeof c.maxDepth === \"number\"\n ? c.maxDepth\n : undefined;\n\n const simulateAllRoots =\n c.simulateAllRoots === true || c.visibilitySimulateAllRoots === true;\n\n const onlyEffectfulTriggers =\n c.onlyEffectfulTriggers === false\n ? false\n : c.visibilityOnlyEffectfulTriggers !== false; // default true\n\n return {\n simulate,\n maxStates,\n maxDepth,\n simulateAllRoots,\n onlyEffectfulTriggers,\n };\n}\n\n/**\n * Core synchronous validate.\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 nodeMap: ctx.nodeMap ?? buildNodeMap(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 (optionally simulated)\n v.fieldsVisibleUnder = createFieldsVisibleUnder(v);\n\n const visSim = readVisibilitySimOpts(ctx);\n validateVisibility(v, visSim);\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\n/**\n * UI-friendly async wrapper:\n * - yields to microtask queue\n * - then yields to the next animation frame (so paint can happen)\n * - then runs validate()\n */\nexport async function validateAsync(\n props: ServiceProps,\n ctx: ValidatorOptions = {},\n): Promise<ValidationError[]> {\n // microtask yield\n await Promise.resolve();\n\n // next paint/frame yield (browser environments)\n if (typeof requestAnimationFrame === \"function\") {\n await new Promise<void>((resolve) =>\n requestAnimationFrame(() => resolve()),\n );\n } else {\n // non-browser fallback\n await new Promise<void>((resolve) => setTimeout(resolve, 0));\n }\n\n return validate(props, ctx);\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\";\nimport { visibleFieldIdsUnder } from \"@/core/visibility\";\nimport { buildNodeMap, NodeMap } from \"@/core/node-map\";\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 isTagId(id: string): boolean;\n isFieldId(id: string): boolean;\n isOptionId(id: string): boolean;\n getNodeMap(): NodeMap;\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 private _nodemap: NodeMap | null = null;\n\n constructor(opts: BuilderOptions = {}) {\n this.options = { ...opts };\n this.historyLimit = opts.historyLimit ?? 50;\n }\n\n /* ───── lifecycle ─────────────────────────────────────────────────────── */\n isTagId(id: string) {\n return this.tagById.has(id);\n }\n isFieldId(id: string) {\n return this.fieldById.has(id);\n }\n isOptionId(id: string) {\n return this.optionOwnerById.has(id);\n }\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 return visibleFieldIdsUnder(this.props, tagId, {\n selectedKeys: new Set(\n selectedKeys ?? this.options.selectedOptionKeys ?? [],\n ),\n });\n }\n\n getNodeMap(): NodeMap {\n if (!this._nodemap) this._nodemap = buildNodeMap(this.getProps());\n ///--\n return this._nodemap;\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 this._nodemap = null;\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","// src/utils/prune-fallbacks.ts\r\nimport type { ServiceProps, ServiceIdRef } from \"@/schema\";\r\nimport type { DgpServiceMap } from \"@/schema/provider\";\r\nimport type { FallbackSettings } from \"@/schema/validation\";\r\nimport { collectFailedFallbacks } from \"@/core\";\r\n\r\nexport type PrunedFallback = {\r\n nodeId: string;\r\n candidate: ServiceIdRef;\r\n reasons: string[]; // aggregated reasons that caused full-context failure\r\n contexts?: string[]; // tag contexts considered (for option nodes)\r\n};\r\n\r\nexport type PruneResult = {\r\n props: ServiceProps;\r\n removed: PrunedFallback[];\r\n};\r\n\r\n/**\r\n * Remove node-scoped fallback candidates that fail in ALL relevant contexts.\r\n * - Tag node: single context (the tag itself)\r\n * - Option node: contexts = parent field's bind_id tags\r\n * - Global fallbacks are NEVER pruned here (soft by design)\r\n */\r\nexport function pruneInvalidNodeFallbacks(\r\n props: ServiceProps,\r\n services: DgpServiceMap,\r\n settings?: FallbackSettings\r\n): PruneResult {\r\n const fb = props.fallbacks;\r\n if (!fb?.nodes || Object.keys(fb.nodes).length === 0) {\r\n return { props, removed: [] };\r\n }\r\n\r\n // 1) Build node → contexts (tag ids) and primary lookup\r\n const nodeContexts = new Map<string, string[]>();\r\n const nodePrimary = new Map<string, ServiceIdRef | undefined>();\r\n\r\n for (const nodeId of Object.keys(fb.nodes)) {\r\n const tag = props.filters.find(t => t.id === nodeId);\r\n if (tag) {\r\n nodeContexts.set(nodeId, [tag.id]);\r\n nodePrimary.set(nodeId, tag.service_id as any);\r\n continue;\r\n }\r\n // option node: locate parent field\r\n const field = props.fields.find(f => Array.isArray(f.options) && f.options.some(o => o.id === nodeId));\r\n if (field) {\r\n const contexts = toBindArray(field.bind_id);\r\n nodeContexts.set(nodeId, contexts);\r\n const opt = field.options!.find(o => o.id === nodeId)!;\r\n nodePrimary.set(nodeId, opt.service_id as any);\r\n continue;\r\n }\r\n // unknown node id → treat as no contexts & no primary\r\n nodeContexts.set(nodeId, []);\r\n nodePrimary.set(nodeId, undefined);\r\n }\r\n\r\n // 2) Gather diagnostics (per context). We use dev mode collection to get granular reasons.\r\n const diags = collectFailedFallbacks(props, services, { ...settings, mode: 'dev' });\r\n\r\n // 3) Decide which (nodeId, candidate) pairs fail in ALL contexts\r\n const failuresByPair = new Map<string, { reasons: Set<string>; contexts: Set<string> }>();\r\n const totalContextsByNode = new Map<string, number>();\r\n\r\n for (const [nodeId, ctxs] of nodeContexts.entries()) {\r\n totalContextsByNode.set(nodeId, Math.max(1, ctxs.length)); // at least 1 for tag/no-context cases\r\n }\r\n\r\n for (const d of diags) {\r\n if (d.scope !== 'node') continue;\r\n const key = `${d.nodeId}::${String(d.candidate)}`;\r\n let rec = failuresByPair.get(key);\r\n if (!rec) {\r\n rec = { reasons: new Set<string>(), contexts: new Set<string>() };\r\n failuresByPair.set(key, rec);\r\n }\r\n rec.reasons.add(d.reason);\r\n if (d.tagContext) rec.contexts.add(d.tagContext);\r\n // For node-level reasons not tied to a context, mark all contexts as failed by leaving contexts set empty;\r\n // we'll interpret empty-but-has-reasons as global failure later when totals == 1.\r\n }\r\n\r\n // 4) Build a pruned copy of fallbacks.nodes\r\n const prunedNodes: Record<string, ServiceIdRef[]> = {};\r\n const removed: PrunedFallback[] = [];\r\n\r\n for (const [nodeId, list] of Object.entries(fb.nodes)) {\r\n const contexts = nodeContexts.get(nodeId) ?? [];\r\n const totalContexts = Math.max(1, contexts.length);\r\n const keep: ServiceIdRef[] = [];\r\n\r\n for (const cand of list) {\r\n const key = `${nodeId}::${String(cand)}`;\r\n const rec = failuresByPair.get(key);\r\n\r\n // Not present in failures → keep\r\n if (!rec) {\r\n keep.push(cand);\r\n continue;\r\n }\r\n\r\n const failedContextsCount = rec.contexts.size > 0 ? rec.contexts.size : totalContexts;\r\n const failsAll = failedContextsCount >= totalContexts;\r\n\r\n if (failsAll) {\r\n removed.push({\r\n nodeId,\r\n candidate: cand,\r\n reasons: Array.from(rec.reasons),\r\n contexts: contexts.length ? contexts.slice() : undefined,\r\n });\r\n } else {\r\n keep.push(cand); // passes in at least one context\r\n }\r\n }\r\n\r\n if (keep.length) prunedNodes[nodeId] = keep;\r\n }\r\n\r\n const outProps: ServiceProps = {\r\n ...props,\r\n fallbacks: {\r\n ...(props.fallbacks?.global ? { global: props.fallbacks!.global } : {}),\r\n ...(Object.keys(prunedNodes).length ? { nodes: prunedNodes } : {}),\r\n }\r\n };\r\n\r\n return { props: outProps, removed };\r\n}\r\n\r\n/* ───────────────────────── helpers ───────────────────────── */\r\n\r\nfunction toBindArray(bind: string | string[] | undefined): string[] {\r\n if (!bind) return [];\r\n return Array.isArray(bind) ? bind.slice() : [bind];\r\n}","import type { DgpServiceMap, DgpServiceCapability } from \"@/schema/provider\";\r\nimport type { FallbackSettings } from \"@/schema/validation\";\r\n\r\n/**\r\n * Safely convert unknown to a finite number. Returns NaN if not finite.\r\n */\r\nexport function toFiniteNumber(v: unknown): number {\r\n const n = Number(v);\r\n return Number.isFinite(n) ? n : NaN;\r\n}\r\n\r\n/**\r\n * Check if a candidate service satisfies the active tag constraints.\r\n * Only flags explicitly set to true are treated as required.\r\n */\r\nexport function constraintFitOk(\r\n svcMap: DgpServiceMap,\r\n candidate: string | number,\r\n constraints: Partial<Record<\"refill\" | \"cancel\" | \"dripfeed\", boolean>>,\r\n): boolean {\r\n const cap: DgpServiceCapability | undefined = svcMap[Number(candidate)];\r\n if (!cap) return false;\r\n\r\n if (constraints.dripfeed === true && !cap.dripfeed) return false;\r\n if (constraints.refill === true && !cap.refill) return false;\r\n return !(constraints.cancel === true && !cap.cancel);\r\n\r\n}\r\n\r\n/**\r\n * Evaluate candidate rate against primary according to the fallback rate policy.\r\n * If either service is missing or rates are not finite, returns false.\r\n */\r\nexport function rateOk(\r\n svcMap: DgpServiceMap,\r\n candidate: string | number,\r\n primary: string | number,\r\n policy: FallbackSettings,\r\n): boolean {\r\n const cand = svcMap[Number(candidate)];\r\n const prim = svcMap[Number(primary)];\r\n if (!cand || !prim) return false;\r\n\r\n const cRate = toFiniteNumber(cand.rate);\r\n const pRate = toFiniteNumber(prim.rate);\r\n if (!Number.isFinite(cRate) || !Number.isFinite(pRate)) return false;\r\n\r\n const rp = policy.ratePolicy ?? { kind: \"lte_primary\" as const };\r\n switch (rp.kind) {\r\n case \"lte_primary\":\r\n return cRate <= pRate;\r\n case \"within_pct\": {\r\n const pct = Math.max(0, rp.pct ?? 0);\r\n return cRate <= pRate * (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 cRate <= pRate * (1 - pct / 100);\r\n }\r\n default:\r\n return false;\r\n }\r\n}\r\n","// src/utils/build-order-snapshot.ts\r\n\r\nimport type {\r\n FallbackDiagnostics,\r\n OrderSnapshot,\r\n QuantityRule,\r\n Scalar,\r\n ServiceFallbacks,\r\n UtilityLineItem,\r\n UtilityMode,\r\n} from \"@/schema/order\";\r\nimport type {\r\n DgpServiceCapability,\r\n Field,\r\n FieldOption,\r\n ServiceProps,\r\n Tag,\r\n} from \"@/schema\";\r\nimport type { Builder } from \"@/core\";\r\nimport type { DgpServiceMap } from \"@/schema/provider\";\r\nimport { isMultiField } from \"./index\";\r\nimport type { PruneResult } from \"./prune-fallbacks\";\r\nimport { pruneInvalidNodeFallbacks } from \"./prune-fallbacks\";\r\nimport type { FallbackSettings } from \"@/schema/validation\";\r\nimport { constraintFitOk, rateOk } from \"./util\";\r\n\r\n/* ───────────────────────── Public types ───────────────────────── */\r\n\r\nexport type BuildOrderSnapshotSettings = {\r\n mode?: \"prod\" | \"dev\";\r\n hostDefaultQuantity?: number;\r\n /** Full fallback policy */\r\n fallback?: FallbackSettings;\r\n workspaceId?: string;\r\n builderCommit?: string;\r\n};\r\n\r\nexport type BuildOrderSelection = {\r\n /** Single active context (one tag) coming from Selection */\r\n activeTagId: string;\r\n /** Non-option inputs, keyed by fieldId (will be remapped to field.name in the payload) */\r\n formValuesByFieldId: Record<string, Scalar | Scalar[]>;\r\n /** Option selections, keyed by fieldId → optionId[] */\r\n optionSelectionsByFieldId: Record<string, string[]>;\r\n selectedKeys?: string[];\r\n /**\r\n * Selection visit order for options (optional, improves \"first option wins primary\" determinism).\r\n * If omitted, iteration order falls back to Object.entries(optionSelectionsByFieldId).\r\n */\r\n optionTraversalOrder?: Array<{ fieldId: string; optionId: string }>;\r\n};\r\n\r\n/* ───────────────────────── Entry point ───────────────────────── */\r\n\r\nexport function buildOrderSnapshot(\r\n props: ServiceProps,\r\n builder: Builder,\r\n selection: BuildOrderSelection,\r\n services: DgpServiceMap,\r\n settings: BuildOrderSnapshotSettings = {},\r\n): OrderSnapshot {\r\n const mode: \"prod\" | \"dev\" = settings.mode ?? \"prod\";\r\n const hostDefaultQty: number = Number.isFinite(\r\n settings.hostDefaultQuantity ?? 1,\r\n )\r\n ? (settings.hostDefaultQuantity as number)\r\n : 1;\r\n\r\n // Default fallback policy (strict in prod; diagnostics in dev)\r\n const fbSettings: FallbackSettings = {\r\n requireConstraintFit: true,\r\n ratePolicy: { kind: \"lte_primary\" },\r\n selectionStrategy: \"priority\",\r\n mode: mode === \"dev\" ? \"dev\" : \"strict\",\r\n ...(settings.fallback ?? {}),\r\n };\r\n\r\n const builtAt: string = new Date().toISOString();\r\n const tagId: string = selection.activeTagId;\r\n\r\n // 1) Resolve visible fields for the single context\r\n const selectedButtonKeys: string[] =\r\n selection.selectedKeys ??\r\n toSelectedOptionKeys(selection.optionSelectionsByFieldId);\r\n const visibleFieldIds: string[] = builder.visibleFields(\r\n tagId,\r\n selectedButtonKeys,\r\n );\r\n\r\n // Indexes\r\n const tagById: Map<string, Tag> = new Map(\r\n (props.filters ?? []).map((t) => [t.id, t]),\r\n );\r\n const fieldById: Map<string, Field> = new Map(\r\n (props.fields ?? []).map((f) => [f.id, f]),\r\n );\r\n const tagConstraints:\r\n | Partial<Record<\"refill\" | \"cancel\" | \"dripfeed\", boolean>>\r\n | undefined = tagById.get(tagId)?.constraints ?? undefined;\r\n\r\n // 2) Selection.fields (id, type, selectedOptions?)\r\n const selectionFields = visibleFieldIds\r\n .map((fid) => fieldById.get(fid))\r\n .filter((f): f is Field => !!f)\r\n .map((f) => {\r\n const optIds: string[] | undefined = isOptionBased(f)\r\n ? (selection.optionSelectionsByFieldId[f.id] ?? [])\r\n : undefined;\r\n return {\r\n id: f.id,\r\n type: String(f.type),\r\n ...(optIds && optIds.length ? { selectedOptions: optIds } : {}),\r\n };\r\n });\r\n\r\n // 3) Inputs (form by field.name, selections by fieldId)\r\n const { formValues, selections } = buildInputs(\r\n visibleFieldIds,\r\n fieldById,\r\n selection,\r\n );\r\n\r\n // 4) Quantity\r\n const qtyRes = resolveQuantity(\r\n visibleFieldIds,\r\n fieldById,\r\n selection,\r\n hostDefaultQty,\r\n );\r\n const quantity: number = qtyRes.quantity;\r\n const quantitySource = qtyRes.source;\r\n\r\n // 5) Services and serviceMap (UPDATED behavior: tag default is default; any option with service_id is included; first becomes primary)\r\n const { serviceMap, servicesList } = resolveServices(\r\n tagId,\r\n visibleFieldIds,\r\n selection,\r\n tagById,\r\n fieldById,\r\n );\r\n\r\n const { min, max } = resolveMinMax(servicesList, services);\r\n\r\n // 6) Fallbacks — client-side conservative prune (keeps only relevant-to-selection)\r\n const prunedFallbacks = pruneFallbacksConservative(\r\n props.fallbacks as unknown as ServiceFallbacks | undefined,\r\n { tagId, constraints: tagConstraints, serviceMap, servicesList },\r\n services,\r\n fbSettings,\r\n );\r\n\r\n // 7) Utilities — line items derived from utility fields/options\r\n const utilities = collectUtilityLineItems(\r\n visibleFieldIds,\r\n fieldById,\r\n selection,\r\n quantity,\r\n );\r\n\r\n // 8) Dev warnings (fallback diagnostics + form/utility hints)\r\n const warnings: OrderSnapshot[\"warnings\"] | undefined =\r\n mode === \"dev\"\r\n ? buildDevWarnings(\r\n props,\r\n services,\r\n tagId,\r\n serviceMap,\r\n prunedFallbacks.original,\r\n prunedFallbacks.pruned,\r\n fieldById,\r\n visibleFieldIds,\r\n selection,\r\n )\r\n : undefined;\r\n\r\n // 9) Meta.context (single-tag effective constraints + nodeContexts)\r\n const snapshotPolicy = toSnapshotPolicy(fbSettings);\r\n const meta = {\r\n schema_version: props.schema_version,\r\n workspaceId: settings.workspaceId,\r\n builder: settings.builderCommit\r\n ? { commit: settings.builderCommit }\r\n : undefined,\r\n context: {\r\n tag: tagId,\r\n constraints: (tagConstraints ?? {}) as Record<\r\n \"refill\" | \"cancel\" | \"dripfeed\",\r\n boolean | undefined\r\n >,\r\n nodeContexts: buildNodeContexts(\r\n tagId,\r\n visibleFieldIds,\r\n fieldById,\r\n selection,\r\n ),\r\n policy: snapshotPolicy,\r\n },\r\n };\r\n\r\n const snapshot: OrderSnapshot = {\r\n version: \"1\",\r\n mode,\r\n builtAt,\r\n selection: {\r\n tag: tagId,\r\n buttons: selectedButtonKeys,\r\n fields: selectionFields,\r\n },\r\n inputs: {\r\n form: formValues,\r\n selections,\r\n },\r\n\r\n min,\r\n max: max ?? min,\r\n\r\n quantity,\r\n quantitySource,\r\n services: servicesList,\r\n serviceMap,\r\n ...(prunedFallbacks.pruned\r\n ? { fallbacks: prunedFallbacks.pruned }\r\n : {}),\r\n ...(utilities.length ? { utilities } : {}),\r\n ...(warnings ? { warnings } : {}),\r\n meta,\r\n };\r\n\r\n return snapshot;\r\n}\r\n\r\n/* ───────────────────────── Helpers ───────────────────────── */\r\n\r\nfunction isOptionBased(f: Field): boolean {\r\n const hasOptions: boolean =\r\n Array.isArray(f.options) && f.options.length > 0;\r\n return hasOptions || isMultiField(f);\r\n}\r\n\r\nfunction toSelectedOptionKeys(byField: Record<string, string[]>): string[] {\r\n const keys: string[] = [];\r\n for (const [fieldId, optionIds] of Object.entries(byField ?? {})) {\r\n for (const optId of optionIds ?? []) {\r\n keys.push(`${fieldId}::${optId}`);\r\n }\r\n }\r\n return keys;\r\n}\r\n\r\nfunction isServicedBased(field: Field) {\r\n if (field.service_id) return true;\r\n return !!(field.options && field.options.some((item) => item.service_id));\r\n}\r\n\r\nfunction buildInputs(\r\n visibleFieldIds: string[],\r\n fieldById: Map<string, Field>,\r\n selection: BuildOrderSelection,\r\n): {\r\n formValues: Record<string, Scalar | Scalar[]>;\r\n selections: Record<string, string[]>;\r\n} {\r\n const formValues: Record<string, Scalar | Scalar[]> = {};\r\n const selections: Record<string, string[]> = {};\r\n\r\n for (const fid of visibleFieldIds) {\r\n const f: Field | undefined = fieldById.get(fid);\r\n if (!f) continue;\r\n\r\n const selOptIds: string[] | undefined =\r\n selection.optionSelectionsByFieldId[fid];\r\n if (selOptIds && selOptIds.length) {\r\n selections[fid] = [...selOptIds];\r\n }\r\n\r\n // Only non-option fields contribute to form values; key by field.name\r\n if (!isServicedBased(f)) {\r\n const name: string | undefined = f.name;\r\n const val: Scalar | Scalar[] | undefined =\r\n selection.formValuesByFieldId[fid];\r\n if (!name || val === undefined) continue;\r\n formValues[name] = val;\r\n }\r\n }\r\n\r\n return { formValues, selections };\r\n}\r\n\r\n/* ───────────────── Quantity ───────────────── */\r\n\r\nfunction resolveQuantity(\r\n visibleFieldIds: string[],\r\n fieldById: Map<string, Field>,\r\n selection: BuildOrderSelection,\r\n hostDefault: number,\r\n): { quantity: number; source: OrderSnapshot[\"quantitySource\"] } {\r\n // Precedence:\r\n // 1) First visible field with a quantity rule -> evaluate\r\n // 2) (Future) tag/option defaults (not implemented yet)\r\n // 3) Host default\r\n for (const fid of visibleFieldIds) {\r\n const f: Field | undefined = fieldById.get(fid);\r\n if (!f) continue;\r\n const rule: QuantityRule | undefined = readQuantityRule(\r\n (f.meta as any)?.quantity,\r\n );\r\n if (!rule) continue;\r\n\r\n const raw: Scalar | Scalar[] | undefined =\r\n selection.formValuesByFieldId[fid];\r\n const evaluated = evaluateQuantityRule(rule, raw);\r\n if (Number.isFinite(evaluated) && (evaluated as number) > 0) {\r\n return {\r\n quantity: evaluated as number,\r\n source: { kind: \"field\", id: f.id, rule },\r\n };\r\n }\r\n }\r\n\r\n return {\r\n quantity: hostDefault,\r\n source: { kind: \"default\", defaultedFromHost: true },\r\n };\r\n}\r\n\r\nfunction readQuantityRule(v: unknown): QuantityRule | undefined {\r\n if (!v || typeof v !== \"object\") return undefined;\r\n const src = v as QuantityRule;\r\n if (\r\n src.valueBy !== \"value\" &&\r\n src.valueBy !== \"length\" &&\r\n src.valueBy !== \"eval\"\r\n )\r\n return undefined;\r\n const out: QuantityRule = { valueBy: src.valueBy };\r\n if (src.code && typeof src.code === \"string\") out.code = src.code;\r\n return out;\r\n}\r\n\r\nfunction evaluateQuantityRule(\r\n rule: QuantityRule,\r\n raw: Scalar | Scalar[] | undefined,\r\n): number {\r\n switch (rule.valueBy) {\r\n case \"value\": {\r\n const n = Number(Array.isArray(raw) ? (raw as Scalar[])[0] : raw);\r\n return Number.isFinite(n) ? n : NaN;\r\n }\r\n case \"length\": {\r\n if (Array.isArray(raw)) return raw.length;\r\n if (typeof raw === \"string\") return raw.length;\r\n return NaN;\r\n }\r\n case \"eval\": {\r\n try {\r\n if (!rule.code || typeof rule.code !== \"string\") return NaN;\r\n // eslint-disable-next-line no-new-func\r\n const fn = new Function(\r\n \"value\",\r\n \"values\",\r\n `return (function(){ ${rule.code}\\n})()`,\r\n );\r\n const single = Array.isArray(raw) ? (raw as Scalar[])[0] : raw;\r\n const values = Array.isArray(raw)\r\n ? (raw as Scalar[])\r\n : raw !== undefined\r\n ? [raw]\r\n : [];\r\n const out = fn(single, values);\r\n const n = Number(out);\r\n return Number.isFinite(n) ? n : NaN;\r\n } catch {\r\n return NaN;\r\n }\r\n }\r\n default:\r\n return NaN;\r\n }\r\n}\r\n\r\n/* ───────────────── Services (UPDATED) ───────────────── */\r\n\r\nfunction resolveServices(\r\n tagId: string,\r\n visibleFieldIds: string[],\r\n selection: BuildOrderSelection,\r\n tagById: Map<string, Tag>,\r\n fieldById: Map<string, Field>,\r\n): {\r\n serviceMap: Record<string, Array<string | number>>;\r\n servicesList: Array<string | number>;\r\n} {\r\n const serviceMap: Record<string, Array<string | number>> = {};\r\n const ordered: Array<string | number> = [];\r\n\r\n // 1) Tentative primary from tag default (if any) — default only.\r\n const tag = tagById.get(tagId);\r\n let primary: string | number | undefined;\r\n let primaryOrigin: \"tag\" | \"option\" | undefined;\r\n\r\n if (tag?.service_id !== undefined) {\r\n primary = tag.service_id;\r\n primaryOrigin = \"tag\";\r\n // We'll only record it in lists if it survives override.\r\n }\r\n\r\n // 2) Walk option selections in a deterministic order\r\n const optionVisit = buildOptionVisitOrder(selection, fieldById);\r\n\r\n for (const { fieldId, optionId } of optionVisit) {\r\n // only consider options whose field is visible in this group\r\n if (!visibleFieldIds.includes(fieldId)) continue;\r\n\r\n const f = fieldById.get(fieldId);\r\n if (!f || !Array.isArray(f.options)) continue;\r\n\r\n const opt = f.options.find((o) => o.id === optionId);\r\n if (!opt) continue;\r\n\r\n const role = (opt.pricing_role ?? \"base\") as\r\n | \"base\"\r\n | \"utility\"\r\n | string;\r\n const sid = opt.service_id;\r\n\r\n // Defensive: ignore if a (misconfigured) utility has service_id.\r\n if (role === \"utility\") continue;\r\n\r\n if (sid !== undefined) {\r\n // First option with service_id overrides tag default primary.\r\n if (primary === undefined || primaryOrigin === \"tag\") {\r\n primary = sid;\r\n primaryOrigin = \"option\";\r\n // Since primary owns index 0, push it first\r\n ordered.length = 0; // clear any tentative tag default\r\n ordered.push(primary);\r\n } else {\r\n // Additional option services append\r\n ordered.push(sid);\r\n }\r\n // Map origin node → sid\r\n pushService(serviceMap, optionId, sid);\r\n }\r\n }\r\n\r\n // 3) If no option established a primary, use tag default (if present)\r\n if (primaryOrigin !== \"option\" && primary !== undefined) {\r\n ordered.unshift(primary);\r\n pushService(serviceMap, tagId, primary);\r\n } else {\r\n // If overridden, we do NOT record tagId→default in serviceMap\r\n }\r\n\r\n const servicesList = dedupeByString(ordered);\r\n return { serviceMap, servicesList };\r\n}\r\n\r\nfunction buildOptionVisitOrder(\r\n selection: BuildOrderSelection,\r\n fieldById: Map<string, Field>,\r\n): Array<{ fieldId: string; optionId: string }> {\r\n if (\r\n selection.optionTraversalOrder &&\r\n selection.optionTraversalOrder.length\r\n ) {\r\n return selection.optionTraversalOrder.slice();\r\n }\r\n // fallback: expand optionSelectionsByFieldId in insertion-ish order\r\n const out: Array<{ fieldId: string; optionId: string }> = [];\r\n for (const [fid, optIds] of Object.entries(\r\n selection.optionSelectionsByFieldId ?? {},\r\n )) {\r\n const f = fieldById.get(fid);\r\n if (!f) continue;\r\n for (const oid of optIds ?? [])\r\n out.push({ fieldId: fid, optionId: oid });\r\n }\r\n return out;\r\n}\r\n\r\nfunction pushService(\r\n map: Record<string, Array<string | number>>,\r\n nodeId: string,\r\n sid: string | number,\r\n): void {\r\n if (!map[nodeId]) map[nodeId] = [];\r\n map[nodeId].push(sid);\r\n}\r\n\r\nfunction dedupeByString<T extends string | number>(arr: T[]): T[] {\r\n const s = new Set<string>();\r\n const out: T[] = [];\r\n for (const v of arr) {\r\n const key = String(v);\r\n if (s.has(key)) continue;\r\n s.add(key);\r\n out.push(v);\r\n }\r\n return out;\r\n}\r\n\r\n/* ───────────── Fallback pruning (client-conservative) ───────────── */\r\n\r\ntype PruneEnv = {\r\n tagId: string;\r\n constraints?: Partial<Record<\"refill\" | \"cancel\" | \"dripfeed\", boolean>>;\r\n serviceMap: Record<string, Array<string | number>>;\r\n servicesList: Array<string | number>;\r\n};\r\n\r\nfunction pruneFallbacksConservative(\r\n fallbacks: ServiceFallbacks | undefined,\r\n env: PruneEnv,\r\n svcMap: DgpServiceMap,\r\n policy: FallbackSettings,\r\n): { pruned?: ServiceFallbacks; original?: ServiceFallbacks } {\r\n if (!fallbacks) return { pruned: undefined, original: undefined };\r\n\r\n // Prefer shared helper (keeps behavior consistent with tests)\r\n try {\r\n const { props: prunedProps }: PruneResult = pruneInvalidNodeFallbacks(\r\n {\r\n filters: [],\r\n fields: [],\r\n schema_version: \"1.0\",\r\n fallbacks,\r\n } as unknown as ServiceProps,\r\n svcMap,\r\n policy,\r\n );\r\n return {\r\n pruned: prunedProps.fallbacks as unknown as\r\n | ServiceFallbacks\r\n | undefined,\r\n original: fallbacks,\r\n };\r\n } catch {\r\n // Minimal inline conservative prune (selection-aware)\r\n const out: ServiceFallbacks = {};\r\n const requireFit: boolean = policy.requireConstraintFit ?? true;\r\n\r\n // Nodes: keep only for nodes present in env.serviceMap; apply rate & (optional) constraints against tag\r\n if ((fallbacks as any).nodes) {\r\n const keptNodes: Record<string, Array<string | number>> = {};\r\n for (const [nodeId, candidates] of Object.entries(\r\n (fallbacks as any).nodes as Record<\r\n string,\r\n Array<string | number>\r\n >,\r\n )) {\r\n if (!env.serviceMap[nodeId]) continue;\r\n const primary = (env.serviceMap[nodeId] ?? [])[0];\r\n const kept: Array<string | number> = [];\r\n for (const cand of candidates ?? []) {\r\n if (!rateOk(svcMap, cand, primary, policy)) continue;\r\n if (\r\n requireFit &&\r\n env.constraints &&\r\n !constraintFitOk(svcMap, cand, env.constraints)\r\n )\r\n continue;\r\n kept.push(cand);\r\n }\r\n if (kept.length) keptNodes[nodeId] = kept;\r\n }\r\n if (Object.keys(keptNodes).length) (out as any).nodes = keptNodes;\r\n }\r\n\r\n // Global: keep only primaries that are present in selection; apply rate & (optional) constraints\r\n if ((fallbacks as any).global) {\r\n const keptGlobal: Record<\r\n string | number,\r\n Array<string | number>\r\n > = {};\r\n const present = new Set(env.servicesList.map((sid) => String(sid)));\r\n for (const [primary, cands] of Object.entries(\r\n (fallbacks as any).global as Record<\r\n string | number,\r\n Array<string | number>\r\n >,\r\n )) {\r\n if (!present.has(String(primary))) continue;\r\n const primId: string | number = isFiniteNumber(primary)\r\n ? Number(primary)\r\n : (primary as any);\r\n const kept: Array<string | number> = [];\r\n for (const cand of cands ?? []) {\r\n if (!rateOk(svcMap, cand, primId, policy)) continue;\r\n if (\r\n requireFit &&\r\n env.constraints &&\r\n !constraintFitOk(svcMap, cand, env.constraints)\r\n )\r\n continue;\r\n kept.push(cand);\r\n }\r\n if (kept.length) keptGlobal[primId] = kept;\r\n }\r\n if (Object.keys(keptGlobal).length)\r\n (out as any).global = keptGlobal;\r\n }\r\n\r\n return {\r\n pruned: Object.keys(out).length ? out : undefined,\r\n original: fallbacks,\r\n };\r\n }\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\n/* ───────────────── Utilities collection ───────────────── */\r\n\r\ntype UtilityMarker = {\r\n mode: UtilityMode;\r\n rate: number;\r\n valueBy?: \"value\" | \"length\" | \"eval\";\r\n code?: string;\r\n};\r\n\r\nfunction collectUtilityLineItems(\r\n visibleFieldIds: string[],\r\n fieldById: Map<string, Field>,\r\n selection: BuildOrderSelection,\r\n quantity: number,\r\n): UtilityLineItem[] {\r\n const items: UtilityLineItem[] = [];\r\n\r\n for (const fid of visibleFieldIds) {\r\n const f = fieldById.get(fid);\r\n if (!f) continue;\r\n\r\n const isUtilityField = (f.pricing_role ?? \"base\") === \"utility\";\r\n const marker = readUtilityMarker((f.meta as any)?.utility);\r\n\r\n // Field-based utility\r\n if (isUtilityField && marker) {\r\n const val: Scalar | Scalar[] | undefined =\r\n selection.formValuesByFieldId[f.id];\r\n const item = buildUtilityItemFromMarker(\r\n f.id,\r\n marker,\r\n quantity,\r\n val,\r\n );\r\n if (item) items.push(item);\r\n }\r\n\r\n // Option-based utility (only if selected)\r\n if (Array.isArray(f.options) && f.options.length) {\r\n const selectedOptIds =\r\n selection.optionSelectionsByFieldId[f.id] ?? [];\r\n if (selectedOptIds.length) {\r\n const optById = new Map<string, FieldOption>(\r\n f.options.map((o) => [o.id, o]),\r\n );\r\n for (const oid of selectedOptIds) {\r\n const opt = optById.get(oid);\r\n if (!opt) continue;\r\n if ((opt.pricing_role ?? \"base\") !== \"utility\") continue;\r\n const om = readUtilityMarker((opt.meta as any)?.utility);\r\n if (!om) continue;\r\n // For per_value on options, we use the parent field's value as the base value\r\n const parentVal: Scalar | Scalar[] | undefined =\r\n selection.formValuesByFieldId[f.id];\r\n const item = buildUtilityItemFromMarker(\r\n opt.id,\r\n om,\r\n quantity,\r\n parentVal,\r\n );\r\n if (item) items.push(item);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return items;\r\n}\r\n\r\nfunction readUtilityMarker(v: unknown): UtilityMarker | undefined {\r\n if (!v || typeof v !== \"object\") return undefined;\r\n const src = v as UtilityMarker;\r\n if (!src.mode || typeof src.rate !== \"number\" || !Number.isFinite(src.rate))\r\n return undefined;\r\n if (\r\n src.mode !== \"flat\" &&\r\n src.mode !== \"per_quantity\" &&\r\n src.mode !== \"per_value\" &&\r\n src.mode !== \"percent\"\r\n )\r\n return undefined;\r\n const out: UtilityMarker = { mode: src.mode, rate: src.rate };\r\n if (\r\n src.valueBy === \"value\" ||\r\n src.valueBy === \"length\" ||\r\n src.valueBy === \"eval\"\r\n )\r\n out.valueBy = src.valueBy;\r\n if (src.code && typeof src.code === \"string\") out.code = src.code;\r\n return out;\r\n}\r\n\r\nfunction buildUtilityItemFromMarker(\r\n nodeId: string,\r\n marker: UtilityMarker,\r\n quantity: number,\r\n value: Scalar | Scalar[] | undefined,\r\n): UtilityLineItem | undefined {\r\n const base: UtilityLineItem = {\r\n nodeId,\r\n mode: marker.mode,\r\n rate: marker.rate,\r\n inputs: { quantity },\r\n };\r\n if (marker.mode === \"per_value\") {\r\n base.inputs.valueBy = marker.valueBy ?? \"value\";\r\n if (marker.valueBy === \"length\") {\r\n base.inputs.value = Array.isArray(value)\r\n ? value.length\r\n : typeof value === \"string\"\r\n ? value.length\r\n : 0;\r\n } else if (marker.valueBy === \"eval\") {\r\n base.inputs.evalCodeUsed = true; // signal that client used eval\r\n } else {\r\n base.inputs.value = Array.isArray(value)\r\n ? (value[0] ?? null)\r\n : (value ?? null);\r\n }\r\n }\r\n return base;\r\n}\r\n\r\n/* ───────────────── meta.context helpers ──────────────── */\r\n\r\nfunction buildNodeContexts(\r\n tagId: string,\r\n visibleFieldIds: string[],\r\n fieldById: Map<string, Field>,\r\n selection: BuildOrderSelection,\r\n): Record<string, string | null> {\r\n const ctx: Record<string, string | null> = {};\r\n ctx[tagId] = tagId; // tag maps to itself\r\n\r\n for (const fid of visibleFieldIds) {\r\n const f = fieldById.get(fid);\r\n if (!f) continue;\r\n\r\n const binds = normalizeBindIds(f.bind_id);\r\n const applicable = binds.has(tagId);\r\n\r\n const selectedOptIds = selection.optionSelectionsByFieldId[fid] ?? [];\r\n for (const oid of selectedOptIds) {\r\n ctx[oid] = applicable ? tagId : null;\r\n }\r\n }\r\n\r\n return ctx;\r\n}\r\n\r\nfunction normalizeBindIds(bind: string | string[] | undefined): Set<string> {\r\n const out = new Set<string>();\r\n if (!bind) return out;\r\n if (Array.isArray(bind)) {\r\n for (const b of bind) if (b) out.add(String(b));\r\n } else {\r\n out.add(String(bind));\r\n }\r\n return out;\r\n}\r\n\r\n/* ───────────────── Dev warnings ───────────────── */\r\n\r\nfunction buildDevWarnings(\r\n props: ServiceProps,\r\n svcMap: DgpServiceMap,\r\n _tagId: string,\r\n _snapshotServiceMap: Record<string, Array<string | number>>,\r\n originalFallbacks: ServiceFallbacks | undefined,\r\n _prunedFallbacks: ServiceFallbacks | undefined,\r\n fieldById: Map<string, Field>,\r\n visibleFieldIds: string[],\r\n selection: BuildOrderSelection,\r\n): OrderSnapshot[\"warnings\"] | undefined {\r\n const out: OrderSnapshot[\"warnings\"] = {};\r\n\r\n // Fallback diagnostics (non-fatal). Call only if a global helper is present at runtime.\r\n const maybeCollectFailed:\r\n | ((\r\n p: ServiceProps,\r\n sm: DgpServiceMap,\r\n s: { mode: \"dev\" },\r\n ) => FallbackDiagnostics[])\r\n | undefined = (globalThis as any).collectFailedFallbacks;\r\n\r\n try {\r\n if (maybeCollectFailed && originalFallbacks) {\r\n const diags = maybeCollectFailed(\r\n {\r\n ...props,\r\n fallbacks: originalFallbacks,\r\n } as ServiceProps,\r\n svcMap,\r\n { mode: \"dev\" },\r\n );\r\n if (diags && diags.length) {\r\n out.fallbacks = diags;\r\n }\r\n }\r\n } catch {\r\n // ignore diagnostics failures in dev\r\n }\r\n\r\n // Utility/Form warnings: missing field.name while value present (only for non-option fields)\r\n const utilityWarnings: Array<{ nodeId: string; reason: string }> = [];\r\n for (const fid of visibleFieldIds) {\r\n const f = fieldById.get(fid);\r\n if (!f) continue;\r\n const hasVal = selection.formValuesByFieldId[fid] !== undefined;\r\n if (hasVal && !f.name && !isOptionBased(f)) {\r\n utilityWarnings.push({\r\n nodeId: fid,\r\n reason: \"missing_field_name_for_form_value\",\r\n });\r\n }\r\n }\r\n if (utilityWarnings.length) {\r\n (out as any).utility = utilityWarnings;\r\n }\r\n\r\n if (!(out as any).fallbacks && !(out as any).utility) return undefined;\r\n return out;\r\n}\r\n\r\n/* ───────────────── Mapping: internal settings → SnapshotContext.policy ───────────────── */\r\n\r\nfunction toSnapshotPolicy(settings: FallbackSettings): {\r\n ratePolicy: { kind: \"lte_primary\" | \"none\"; thresholdPct?: number };\r\n requireConstraintFit: boolean;\r\n} {\r\n const requireConstraintFit = settings.requireConstraintFit ?? true;\r\n const rp = settings.ratePolicy ?? { kind: \"lte_primary\" as const };\r\n\r\n // Map our richer rate policies to the wire-level policy your server expects\r\n switch (rp.kind) {\r\n case \"lte_primary\":\r\n return {\r\n ratePolicy: { kind: \"lte_primary\" },\r\n requireConstraintFit,\r\n };\r\n case \"within_pct\":\r\n return {\r\n ratePolicy: {\r\n kind: \"lte_primary\",\r\n thresholdPct: Math.max(0, rp.pct ?? 0),\r\n },\r\n requireConstraintFit,\r\n };\r\n case \"at_least_pct_lower\":\r\n // No direct encoding at wire-level; fall back to strict lte (server can still enforce stronger rule)\r\n return {\r\n ratePolicy: { kind: \"lte_primary\" },\r\n requireConstraintFit,\r\n };\r\n default:\r\n return {\r\n ratePolicy: { kind: \"lte_primary\" },\r\n requireConstraintFit,\r\n };\r\n }\r\n}\r\n\r\ntype ServiceIdRef = string | number;\r\n\r\nfunction getCap(\r\n map: DgpServiceMap,\r\n id: ServiceIdRef,\r\n): DgpServiceCapability | undefined {\r\n const direct: DgpServiceCapability | undefined = (map as any)[id];\r\n if (direct) return direct;\r\n\r\n const strKey = String(id);\r\n const byStr: DgpServiceCapability | undefined = (map as any)[strKey];\r\n if (byStr) return byStr;\r\n\r\n const n =\r\n typeof id === \"number\"\r\n ? id\r\n : typeof id === \"string\"\r\n ? Number(id)\r\n : Number.NaN;\r\n\r\n if (Number.isFinite(n)) {\r\n const byNum: DgpServiceCapability | undefined = (map as any)[n];\r\n if (byNum) return byNum;\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nfunction resolveMinMax(\r\n servicesList: Array<string | number>,\r\n services: DgpServiceMap,\r\n): { min: number; max?: number } {\r\n let min: number | undefined = undefined;\r\n let max: number | undefined = undefined;\r\n\r\n for (const sid of servicesList) {\r\n const cap = getCap(services, sid);\r\n if (!cap) continue;\r\n\r\n if (typeof cap.min === \"number\" && Number.isFinite(cap.min)) {\r\n min = min === undefined ? cap.min : Math.min(min, cap.min);\r\n }\r\n if (typeof cap.max === \"number\" && Number.isFinite(cap.max)) {\r\n max = max === undefined ? cap.max : Math.max(max, cap.max);\r\n }\r\n }\r\n\r\n return { min: min ?? 1, ...(max !== undefined ? { max } : {}) };\r\n}\r\n","// src/core/policy.ts\nimport type { DynamicRule, ValidatorOptions } from \"@/schema/validation\";\n\nexport type PolicyDiagnostic = {\n ruleIndex: number;\n ruleId?: string;\n severity: \"error\" | \"warning\";\n message: string;\n path?: string; // e.g. \"filter.role\", \"op\"\n};\n\nconst ALLOWED_SCOPES = new Set<DynamicRule[\"scope\"]>([\n \"global\",\n \"visible_group\",\n]);\nconst ALLOWED_SUBJECTS = new Set<DynamicRule[\"subject\"]>([\"services\"]);\nconst ALLOWED_OPS = new Set<DynamicRule[\"op\"]>([\n \"all_equal\",\n \"unique\",\n \"no_mix\",\n \"all_true\",\n \"any_true\",\n \"max_count\",\n \"min_count\",\n]);\nconst ALLOWED_ROLES = new Set<NonNullable<DynamicRule[\"filter\"]>[\"role\"]>([\n \"base\",\n \"utility\",\n \"both\",\n]);\nconst ALLOWED_SEVERITIES = new Set<NonNullable<DynamicRule[\"severity\"]>>([\n \"error\",\n \"warning\",\n]);\n\nconst ALLOWED_WHERE_OPS = new Set<\n NonNullable<NonNullable<DynamicRule[\"filter\"]>[\"where\"]>[number][\"op\"]\n>([\"eq\", \"neq\", \"in\", \"nin\", \"exists\", \"truthy\", \"falsy\"]);\n\ntype WhereClause = NonNullable<\n NonNullable<DynamicRule[\"filter\"]>[\"where\"]\n>[number];\n\nfunction normaliseWhere(\n src: unknown,\n d: PolicyDiagnostic[],\n i: number,\n id: string,\n): WhereClause[] | undefined {\n if (src === undefined) return undefined;\n if (!Array.isArray(src)) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: \"filter.where must be an array; ignored.\",\n path: \"filter.where\",\n });\n return undefined;\n }\n\n const out: WhereClause[] = [];\n\n src.forEach((raw, j) => {\n const obj: any = raw && typeof raw === \"object\" ? raw : null;\n const path: string | undefined =\n typeof obj?.path === \"string\" && obj.path.trim()\n ? obj.path.trim()\n : undefined;\n\n if (!path) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: `filter.where[${j}].path must be a non-empty string; entry ignored.`,\n path: `filter.where[${j}].path`,\n });\n return;\n }\n\n if (!path.startsWith(\"service.\")) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: `filter.where[${j}].path should start with \"service.\" for subject \"services\".`,\n path: `filter.where[${j}].path`,\n });\n }\n\n const opRaw: unknown = obj?.op;\n const op: WhereClause[\"op\"] =\n opRaw === undefined\n ? \"eq\"\n : typeof opRaw === \"string\" &&\n ALLOWED_WHERE_OPS.has(opRaw as any)\n ? (opRaw as any)\n : \"eq\";\n\n if (\n opRaw !== undefined &&\n !(typeof opRaw === \"string\" && ALLOWED_WHERE_OPS.has(opRaw as any))\n ) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: `Unknown filter.where[${j}].op; defaulted to \"eq\".`,\n path: `filter.where[${j}].op`,\n });\n }\n\n const value: unknown = obj?.value;\n\n // validate value requirements lightly (non-fatal)\n if (op === \"exists\" || op === \"truthy\" || op === \"falsy\") {\n if (value !== undefined) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: `filter.where[${j}] op \"${op}\" does not use \"value\".`,\n path: `filter.where[${j}].value`,\n });\n }\n } else if (op === \"in\" || op === \"nin\") {\n if (!Array.isArray(value)) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: `filter.where[${j}] op \"${op}\" expects an array \"value\".`,\n path: `filter.where[${j}].value`,\n });\n }\n }\n\n out.push({ path, op, value });\n });\n\n return out.length ? out : undefined;\n}\n\n/**\n * Compile & validate arbitrary JSON into DynamicRule[] with defaults:\n * - scope: (default) \"visible_group\"\n * - subject: (default) \"services\"\n * - filter.role: (default) \"both\"\n * - severity: (default) \"error\"\n * - projection: (default) \"service.id\"\n *\n * Returns normalized rules + diagnostics (errors/warnings).\n */\nexport function compilePolicies(raw: unknown): {\n policies: DynamicRule[];\n diagnostics: PolicyDiagnostic[];\n} {\n const diagnostics: PolicyDiagnostic[] = [];\n const policies: DynamicRule[] = [];\n\n if (!Array.isArray(raw)) {\n diagnostics.push({\n ruleIndex: -1,\n severity: \"error\",\n message: \"Policies root must be an array.\",\n });\n return { policies, diagnostics };\n }\n\n raw.forEach((entry, i) => {\n const d: PolicyDiagnostic[] = [];\n const src = entry && typeof entry === \"object\" ? (entry as any) : {};\n\n let id: string | undefined =\n typeof src.id === \"string\" && src.id.trim()\n ? src.id.trim()\n : undefined;\n\n // id default\n if (!id) {\n id = `policy_${i + 1}`;\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: 'Missing \"id\"; generated automatically.',\n path: \"id\",\n });\n }\n\n // ✅ label: required by DynamicRule; default to id\n const label: string =\n typeof src.label === \"string\" && src.label.trim()\n ? src.label.trim()\n : id;\n\n if (!(typeof src.label === \"string\" && src.label.trim())) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: 'Missing \"label\"; defaulted to rule id.',\n path: \"label\",\n });\n }\n\n // scope default + validation\n let scope: DynamicRule[\"scope\"] = ALLOWED_SCOPES.has(src.scope)\n ? src.scope\n : src.scope === undefined\n ? \"visible_group\"\n : \"visible_group\";\n if (src.scope !== undefined && !ALLOWED_SCOPES.has(src.scope)) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: 'Unknown \"scope\"; defaulted to \"visible_group\".',\n path: \"scope\",\n });\n }\n\n // subject default + validation\n let subject: DynamicRule[\"subject\"] = ALLOWED_SUBJECTS.has(src.subject)\n ? src.subject\n : \"services\";\n if (src.subject !== undefined && !ALLOWED_SUBJECTS.has(src.subject)) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: 'Unknown \"subject\"; defaulted to \"services\".',\n path: \"subject\",\n });\n }\n\n // op required & valid\n const op: DynamicRule[\"op\"] = src.op;\n if (!ALLOWED_OPS.has(op)) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"error\",\n message: `Invalid \"op\": ${String(op)}.`,\n path: \"op\",\n });\n }\n\n // projection default\n let projection: string | undefined =\n typeof src.projection === \"string\" && src.projection.trim()\n ? src.projection.trim()\n : \"service.id\";\n\n // For services subject, encourage service.* projection\n if (\n subject === \"services\" &&\n projection &&\n !projection.startsWith(\"service.\")\n ) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message:\n 'Projection should start with \"service.\" for subject \"services\".',\n path: \"projection\",\n });\n }\n\n const filterSrc =\n src.filter && typeof src.filter === \"object\"\n ? (src.filter as DynamicRule[\"filter\"])\n : undefined;\n\n const role: NonNullable<DynamicRule[\"filter\"]>[\"role\"] =\n filterSrc?.role && ALLOWED_ROLES.has(filterSrc.role)\n ? filterSrc.role\n : \"both\";\n\n if (filterSrc?.role && !ALLOWED_ROLES.has(filterSrc.role)) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: 'Unknown filter.role; defaulted to \"both\".',\n path: \"filter.role\",\n });\n }\n\n const filter: DynamicRule[\"filter\"] | undefined = {\n role,\n tag_id:\n filterSrc?.tag_id !== undefined\n ? Array.isArray(filterSrc.tag_id)\n ? filterSrc.tag_id\n : [filterSrc.tag_id]\n : undefined,\n field_id:\n filterSrc?.field_id !== undefined\n ? Array.isArray(filterSrc.field_id)\n ? filterSrc.field_id\n : [filterSrc.field_id]\n : undefined,\n where: normaliseWhere((filterSrc as any)?.where, d, i, id),\n };\n\n // severity default\n const severity: NonNullable<DynamicRule[\"severity\"]> =\n ALLOWED_SEVERITIES.has(src.severity) ? src.severity : \"error\";\n if (\n src.severity !== undefined &&\n !ALLOWED_SEVERITIES.has(src.severity)\n ) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: 'Unknown \"severity\"; defaulted to \"error\".',\n path: \"severity\",\n });\n }\n\n // value requirements by op\n const value = src.value;\n if (op === \"max_count\" || op === \"min_count\") {\n if (!(typeof value === \"number\" && Number.isFinite(value))) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"error\",\n message: `\"${op}\" requires numeric \"value\".`,\n path: \"value\",\n });\n }\n } else if (op === \"all_true\" || op === \"any_true\") {\n if (value !== undefined) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: `\"${op}\" ignores \"value\"; it checks all/any true.`,\n path: \"value\",\n });\n }\n } else {\n if (value !== undefined) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: `\"${op}\" does not use \"value\".`,\n path: \"value\",\n });\n }\n }\n\n // assemble rule if no fatal (error-level) diagnostics for op/value\n const hasFatal = d.some((x) => x.severity === \"error\");\n if (!hasFatal) {\n const rule: DynamicRule = {\n id,\n label, // ✅ now always present\n scope,\n subject,\n filter,\n projection,\n op,\n value: value as any,\n severity,\n message:\n typeof src.message === \"string\" ? src.message : undefined,\n };\n policies.push(rule);\n }\n\n diagnostics.push(...d);\n });\n\n return { policies, diagnostics };\n}\n\n/** Split diagnostics for convenience in UI */\nexport function splitPolicyDiagnostics(diags: PolicyDiagnostic[]): {\n errors: PolicyDiagnostic[];\n warnings: PolicyDiagnostic[];\n} {\n return {\n errors: diags.filter((d) => d.severity === \"error\"),\n warnings: diags.filter((d) => d.severity === \"warning\"),\n };\n}\n\n/**\n * Convenience helper: compile policies and pass to validator options.\n * You can use this in your editor before calling validate().\n */\nexport function withCompiledPolicies(\n opts: ValidatorOptions,\n rawPolicies: unknown,\n): { opts: ValidatorOptions; diagnostics: PolicyDiagnostic[] } {\n const { policies, diagnostics } = compilePolicies(rawPolicies);\n return { opts: { ...opts, policies }, diagnostics };\n}\n","// src/react/canvas/selection.ts\r\nimport type { Builder } from \"@/core\";\r\nimport type { Field, PricingRole, ServiceProps, Tag } from \"@/schema\";\r\nimport type { DgpServiceCapability } from \"@/schema/provider\";\r\n\r\nexport type Env = \"client\" | \"workspace\";\r\n\r\nexport type VisibleGroup = {\r\n tagId?: string;\r\n tag?: Tag;\r\n fields: Field[];\r\n fieldIds: string[];\r\n parentTags?: Tag[];\r\n childrenTags?: Tag[];\r\n /** In order of selection: tag base (unless overridden) then selected options */\r\n services?: DgpServiceCapability[];\r\n};\r\n\r\n// Returned by visibleGroup():\r\nexport type VisibleGroupResult =\r\n | { kind: \"single\"; group: VisibleGroup }\r\n | { kind: \"multi\"; groups: string[] };\r\n\r\ntype ChangeEvt = { ids: string[]; primary?: string };\r\ntype Listener = (e: ChangeEvt) => void;\r\n\r\nexport type SelectionOptions = {\r\n env?: Env;\r\n rootTagId?: string;\r\n /** Resolve service capability from an id (used for `services` array) */\r\n resolveService?: (id: any) => DgpServiceCapability | undefined;\r\n};\r\n\r\nexport class Selection {\r\n private set = new Set<string>();\r\n private primaryId: string | undefined;\r\n private currentTagId: string | undefined;\r\n private onChangeFns: Listener[] = [];\r\n\r\n constructor(\r\n private readonly builder: Builder,\r\n private readonly opts: SelectionOptions,\r\n ) {}\r\n\r\n // ── Public mutators ──────────────────────────────────────────────────────\r\n replace(id?: string | null) {\r\n if (!id) return this.clear();\r\n this.set.clear();\r\n this.set.add(id);\r\n this.primaryId = id;\r\n this.updateCurrentTagFrom(id);\r\n this.emit();\r\n }\r\n\r\n add(id: string) {\r\n // maintain \"most-recent\" selection order:\r\n // Set keeps insertion order, but re-adding an existing id does NOT move it.\r\n // So we delete+add to bump it to the end every time this is called.\r\n if (this.set.has(id)) this.set.delete(id);\r\n this.set.add(id);\r\n\r\n this.primaryId = id;\r\n this.updateCurrentTagFrom(id);\r\n this.emit();\r\n }\r\n\r\n remove(id: string) {\r\n if (!this.set.delete(id)) return;\r\n if (this.primaryId === id) {\r\n this.primaryId = this.set.values().next().value;\r\n if (this.primaryId) this.updateCurrentTagFrom(this.primaryId);\r\n }\r\n this.emit();\r\n }\r\n\r\n toggle(id: string) {\r\n if (this.set.has(id)) this.remove(id);\r\n else this.add(id);\r\n }\r\n\r\n many(ids: Iterable<string>, primary?: string) {\r\n this.set = new Set(ids);\r\n this.primaryId = primary ?? this.set.values().next().value;\r\n if (this.primaryId) this.updateCurrentTagFrom(this.primaryId);\r\n this.emit();\r\n }\r\n\r\n clear() {\r\n if (!this.set.size && !this.primaryId) return;\r\n this.set.clear();\r\n this.primaryId = undefined;\r\n this.emit();\r\n }\r\n\r\n // ── Read APIs ────────────────────────────────────────────────────────────\r\n all(): ReadonlySet<string> {\r\n return this.set;\r\n }\r\n\r\n has(id: string): boolean {\r\n return this.set.has(id);\r\n }\r\n\r\n primary(): string | undefined {\r\n return this.primaryId;\r\n }\r\n\r\n currentTag(): string | undefined {\r\n return this.currentTagId;\r\n }\r\n\r\n onChange(fn: Listener): () => void {\r\n this.onChangeFns.push(fn);\r\n return () => {\r\n const i = this.onChangeFns.indexOf(fn);\r\n if (i >= 0) this.onChangeFns.splice(i, 1);\r\n };\r\n }\r\n\r\n // ── Main: visible group snapshot (env-aware) ─────────────────────────────\r\n visibleGroup(): VisibleGroupResult {\r\n const props = this.builder.getProps() as ServiceProps;\r\n\r\n // WORKSPACE: >1 tag selected → return raw selection set\r\n if ((this.opts.env ?? \"client\") === \"workspace\") {\r\n const tagIds = Array.from(this.set).filter(\r\n this.builder.isTagId.bind(this.builder),\r\n );\r\n if (tagIds.length > 1) {\r\n return { kind: \"multi\", groups: Array.from(this.set) };\r\n }\r\n }\r\n\r\n const tagId = this.resolveTagContextId(props);\r\n if (!tagId)\r\n return { kind: \"single\", group: { fields: [], fieldIds: [] } };\r\n\r\n const group = this.computeGroupForTag(props, tagId);\r\n return { kind: \"single\", group };\r\n }\r\n\r\n /**\r\n * Build a fieldId -> triggerKeys[] map from the current selection set.\r\n *\r\n * What counts as a \"button selection\" (trigger key):\r\n * - field key where the field has button === true (e.g. \"f:dripfeed\")\r\n * - option key (e.g. \"o:fast\")\r\n * - composite key \"fieldId::optionId\" (e.g. \"f:speed::o:fast\")\r\n *\r\n * Grouping:\r\n * - button-field trigger groups under its own fieldId\r\n * - option/composite groups under the option's owning fieldId (from nodeMap)\r\n *\r\n * Deterministic:\r\n * - preserves selection insertion order\r\n * - de-dupes per field\r\n */\r\n buttonSelectionsByFieldId(): Record<string, string[]> {\r\n const nodeMap = this.builder.getNodeMap();\r\n const out: Record<string, string[]> = {};\r\n\r\n const push = (fieldId: string, triggerKey: string) => {\r\n const arr = (out[fieldId] ??= []);\r\n if (!arr.includes(triggerKey)) arr.push(triggerKey);\r\n };\r\n\r\n for (const key of this.set) {\r\n if (!key) continue;\r\n\r\n // composite: \"fieldId::optionId\" => validate optionId; group by option.owner fieldId\r\n const idx = key.indexOf(\"::\");\r\n if (idx !== -1) {\r\n const optionId = key.slice(idx + 2);\r\n const optRef = nodeMap.get(optionId) as any;\r\n if (\r\n optRef?.kind === \"option\" &&\r\n typeof optRef.fieldId === \"string\"\r\n ) {\r\n push(optRef.fieldId, key); // keep composite as the trigger key\r\n }\r\n continue;\r\n }\r\n\r\n const ref = nodeMap.get(key) as any;\r\n if (!ref) continue;\r\n\r\n // option trigger => group by owning fieldId\r\n if (ref.kind === \"option\" && typeof ref.fieldId === \"string\") {\r\n push(ref.fieldId, ref.id ?? key);\r\n continue;\r\n }\r\n\r\n // field trigger => only if it's a button field; group by itself\r\n if (ref.kind === \"field\") {\r\n const field = ref.node ?? ref.field ?? ref;\r\n const fieldId = ref.id ?? field?.id ?? key;\r\n if (field?.button === true && typeof fieldId === \"string\") {\r\n push(fieldId, fieldId);\r\n }\r\n }\r\n }\r\n\r\n return out;\r\n }\r\n\r\n /**\r\n * Returns only selection keys that are valid \"trigger buttons\":\r\n * - field keys where field.button === true\r\n * - option keys\r\n * - composite keys \"fieldId::optionId\" (validated by optionId)\r\n * Excludes tags and non-button fields.\r\n */\r\n selectedButtons(): string[] {\r\n const nodeMap = this.builder.getNodeMap();\r\n const out: string[] = [];\r\n const seen = new Set<string>();\r\n\r\n const push = (k: string) => {\r\n if (!seen.has(k)) {\r\n seen.add(k);\r\n out.push(k);\r\n }\r\n };\r\n\r\n for (const key of this.set) {\r\n if (!key) continue;\r\n\r\n // composite: validate optionId part\r\n const idx = key.indexOf(\"::\");\r\n if (idx !== -1) {\r\n const optionId = key.slice(idx + 2);\r\n const optRef = nodeMap.get(optionId) as any;\r\n if (optRef?.kind === \"option\") push(key);\r\n continue;\r\n }\r\n\r\n const ref = nodeMap.get(key) as any;\r\n if (!ref) continue;\r\n\r\n // option trigger\r\n if (ref.kind === \"option\") {\r\n push(key);\r\n continue;\r\n }\r\n\r\n // field trigger only if it's a button field\r\n if (ref.kind === \"field\") {\r\n const field = ref.node ?? ref.field ?? ref;\r\n if (field?.button === true) push(key);\r\n }\r\n }\r\n\r\n return out;\r\n }\r\n\r\n // ── Internals ────────────────────────────────────────────────────────────\r\n private emit() {\r\n const payload: ChangeEvt = {\r\n ids: Array.from(this.set),\r\n primary: this.primaryId,\r\n };\r\n for (const fn of this.onChangeFns) fn(payload);\r\n }\r\n\r\n private updateCurrentTagFrom(id: string) {\r\n const props = this.builder.getProps() as ServiceProps;\r\n const tags = props.filters ?? [];\r\n const fields = props.fields ?? [];\r\n\r\n if (tags.some((t) => t.id === id)) {\r\n this.currentTagId = id;\r\n return;\r\n }\r\n const f = fields.find((x) => x.id === id);\r\n if (f?.bind_id) {\r\n this.currentTagId = Array.isArray(f.bind_id)\r\n ? f.bind_id[0]\r\n : f.bind_id;\r\n return;\r\n }\r\n\r\n if (this.builder.isOptionId(id)) {\r\n const host = fields.find((x) =>\r\n (x.options ?? []).some((o) => o.id === id),\r\n );\r\n if (host?.bind_id) {\r\n this.currentTagId = Array.isArray(host.bind_id)\r\n ? host.bind_id[0]\r\n : host.bind_id;\r\n return;\r\n }\r\n }\r\n\r\n if (id.includes(\"::\")) {\r\n const [fid] = id.split(\"::\");\r\n const host = fields.find((x) => x.id === fid);\r\n if (host?.bind_id) {\r\n this.currentTagId = Array.isArray(host.bind_id)\r\n ? host.bind_id[0]\r\n : host.bind_id;\r\n return;\r\n }\r\n }\r\n }\r\n\r\n private resolveTagContextId(props: ServiceProps): string | undefined {\r\n if (this.currentTagId) return this.currentTagId;\r\n\r\n for (const id of this.set) if (this.builder.isTagId(id)) return id;\r\n\r\n const fields = props.fields ?? [];\r\n for (const id of this.set) {\r\n const f = fields.find((x) => x.id === id);\r\n if (f?.bind_id)\r\n return Array.isArray(f.bind_id) ? f.bind_id[0] : f.bind_id;\r\n }\r\n\r\n for (const id of this.set) {\r\n if (this.builder.isOptionId(id)) {\r\n const host = fields.find((x) =>\r\n (x.options ?? []).some((o) => o.id === id),\r\n );\r\n if (host?.bind_id)\r\n return Array.isArray(host.bind_id)\r\n ? host.bind_id[0]\r\n : host.bind_id;\r\n }\r\n if (id.includes(\"::\")) {\r\n const [fid] = id.split(\"::\");\r\n const host = fields.find((x) => x.id === fid);\r\n if (host?.bind_id)\r\n return Array.isArray(host.bind_id)\r\n ? host.bind_id[0]\r\n : host.bind_id;\r\n }\r\n }\r\n\r\n return this.opts.rootTagId;\r\n }\r\n\r\n private computeGroupForTag(\r\n props: ServiceProps,\r\n tagId: string,\r\n ): VisibleGroup {\r\n const tags = props.filters ?? [];\r\n const fields = props.fields ?? [];\r\n const tagById = new Map(tags.map((t) => [t.id, t]));\r\n const tag = tagById.get(tagId);\r\n\r\n // ---- delegate visible fields to builder\r\n const selectedTriggerIds = this.selectedButtons();\r\n const fieldIds = this.builder.visibleFields(tagId, selectedTriggerIds);\r\n\r\n const fieldById = new Map(fields.map((f) => [f.id, f]));\r\n const visible = fieldIds\r\n .map((id) => fieldById.get(id))\r\n .filter(Boolean) as Field[];\r\n\r\n // ---- ancestry & immediate children (unchanged)\r\n const parentTags: Tag[] = [];\r\n let cur = tag?.bind_id;\r\n const guard = new Set<string>();\r\n while (cur && !guard.has(cur)) {\r\n const t = tagById.get(cur);\r\n if (!t) break;\r\n parentTags.push(t);\r\n guard.add(cur);\r\n cur = t.bind_id;\r\n }\r\n const childrenTags = tags.filter((t) => t.bind_id === tagId);\r\n\r\n // ---- services: tag base (unless overridden) → selected OPTIONs + selected BUTTON FIELDs (in insertion order)\r\n const services: DgpServiceCapability[] = [];\r\n const resolve = this.opts.resolveService;\r\n\r\n // 1) tag base\r\n let baseAddedFromTag = false;\r\n if (tag?.service_id != null) {\r\n services.push(\r\n resolve?.(tag.service_id) ??\r\n ({ id: tag.service_id } as DgpServiceCapability),\r\n );\r\n baseAddedFromTag = true;\r\n }\r\n\r\n // 2) walk selected ids in insertion order\r\n let baseOverridden = false;\r\n for (const selId of this.set) {\r\n // OPTION selected\r\n const opt = this.findOptionById(fields, selId);\r\n if (opt?.service_id != null) {\r\n const role = (opt.pricing_role ?? \"base\") as PricingRole;\r\n const cap =\r\n resolve?.(opt.service_id) ??\r\n ({ id: opt.service_id } as DgpServiceCapability);\r\n\r\n baseOverridden = this.addServiceByRole(\r\n services,\r\n cap,\r\n role,\r\n baseAddedFromTag,\r\n baseOverridden,\r\n );\r\n continue;\r\n }\r\n\r\n // BUTTON FIELD selected\r\n const f = fieldById.get(selId);\r\n if (f?.button === true && f.service_id != null) {\r\n const role = (f.pricing_role ?? \"base\") as PricingRole;\r\n const cap =\r\n resolve?.(f.service_id) ??\r\n ({ id: f.service_id } as DgpServiceCapability);\r\n\r\n baseOverridden = this.addServiceByRole(\r\n services,\r\n cap,\r\n role,\r\n baseAddedFromTag,\r\n baseOverridden,\r\n );\r\n }\r\n }\r\n\r\n return {\r\n tagId,\r\n tag,\r\n fields: visible,\r\n fieldIds,\r\n parentTags,\r\n childrenTags,\r\n services,\r\n };\r\n }\r\n\r\n private addServiceByRole(\r\n services: DgpServiceCapability[],\r\n cap: DgpServiceCapability,\r\n role: PricingRole,\r\n baseAddedFromTag: boolean,\r\n baseOverridden: boolean,\r\n ): boolean {\r\n if (role === \"base\") {\r\n if (!baseOverridden) {\r\n if (baseAddedFromTag && services.length > 0) {\r\n services[0] = cap;\r\n } else {\r\n services.unshift(cap);\r\n }\r\n return true;\r\n } else {\r\n services.push(cap);\r\n }\r\n } else {\r\n services.push(cap);\r\n }\r\n return baseOverridden;\r\n }\r\n\r\n private findOptionById(fields: Field[], selId: string) {\r\n if (this.builder.isOptionId(selId)) {\r\n for (const f of fields) {\r\n const o = f.options?.find((x) => x.id === selId);\r\n if (o) return o;\r\n }\r\n }\r\n if (selId.includes(\"::\")) {\r\n const [fid, oid] = selId.split(\"::\");\r\n const f = fields.find((x) => x.id === fid);\r\n const o = f?.options?.find((x) => x.id === oid || x.id === selId);\r\n if (o) return o;\r\n }\r\n return undefined;\r\n }\r\n}\r\n","import { EventBus } from \"@/react\";\nimport type {\n CanvasEvents,\n CanvasOptions,\n CanvasState,\n DraftWire,\n NodePositions,\n Viewport,\n} from \"@/schema/canvas-types\";\nimport type { Builder } from \"@/core\";\nimport type { EdgeKind, GraphSnapshot } from \"@/schema/graph\";\nimport { CommentsAPI } from \"./comments\";\nimport { CanvasBackendOptions } from \"./backend\";\nimport { Editor } from \"./editor\";\nimport { Selection } from \"./selection\";\nimport type { BackendScope } from \"@/react/workspace/context/backend\";\n\nexport class CanvasAPI {\n private bus = new EventBus<CanvasEvents>();\n private readonly state: CanvasState;\n public readonly builder: Builder;\n public readonly editor: Editor;\n private readonly autoEmit: boolean;\n readonly comments: CommentsAPI;\n readonly selection: Selection;\n\n constructor(\n builder: Builder,\n opts: CanvasOptions & CanvasBackendOptions = {},\n ) {\n this.builder = builder;\n this.autoEmit = opts.autoEmitState ?? true;\n this.selection = new Selection(builder, {\n env: \"workspace\",\n rootTagId: \"t:root\",\n });\n\n const graph = builder.tree();\n this.state = {\n graph,\n positions: {},\n selection: new Set(),\n highlighted: new Set(),\n viewport: { x: 0, y: 0, zoom: 1, ...opts.initialViewport },\n version: 1,\n };\n\n this.selection.onChange(({ ids }) => {\n // mirror into CanvasState for snapshot/versioning consumers\n this.state.selection = new Set(ids);\n this.bump();\n\n // keep existing event contract\n this.bus.emit(\"selection:change\", { ids });\n\n // keep existing auto-emit behaviour\n if (this.autoEmit) this.bus.emit(\"state:change\", this.snapshot());\n });\n\n // compose comments with backend (if provided)\n const scopeProvider: (() => BackendScope | undefined) | undefined =\n (opts as unknown as { getScope?: () => BackendScope | undefined })\n .getScope ??\n (() => {\n const anyOpts = opts as unknown as Partial<{\n workspaceId: string;\n actorId: string;\n branchId: string;\n }>;\n\n if (\n !anyOpts.workspaceId ||\n !anyOpts.actorId ||\n !anyOpts.branchId\n ) {\n return undefined;\n }\n\n return {\n workspaceId: anyOpts.workspaceId,\n actorId: anyOpts.actorId,\n branchId: anyOpts.branchId,\n };\n });\n\n this.comments = new CommentsAPI(this.bus, {\n backend: opts.backend?.comments,\n getScope: scopeProvider,\n });\n\n this.editor = new Editor(builder, this, {\n serviceMap: builder.getServiceMap(),\n serviceExists: (id) => builder.getServiceMap().hasOwnProperty(id),\n ...opts,\n });\n\n if (this.autoEmit) this.bus.emit(\"state:change\", this.snapshot());\n }\n\n /* ─── Events ─────────────────────────────────────────────── */\n on = this.bus.on.bind(this.bus);\n once = this.bus.once.bind(this.bus);\n\n public emit<K extends keyof CanvasEvents>(\n event: K,\n payload: CanvasEvents[K],\n ): void {\n this.bus.emit(event, payload);\n }\n\n /* ─── State accessors ───────────────────────────────────── */\n snapshot(): CanvasState {\n // return an immutable-looking view\n return {\n ...this.state,\n selection: new Set(this.state.selection),\n highlighted: new Set(this.state.highlighted),\n graph: {\n nodes: [...this.state.graph.nodes],\n edges: [...this.state.graph.edges],\n },\n positions: { ...this.state.positions },\n };\n }\n\n getGraph(): GraphSnapshot {\n return this.state.graph;\n }\n\n getSelection(): string[] {\n return Array.from(this.state.selection);\n }\n\n getViewport(): Viewport {\n return { ...this.state.viewport };\n }\n\n /* ─── Graph lifecycle ───────────────────────────────────── */\n refreshGraph(): void {\n this.state.graph = this.builder.tree();\n this.bump();\n this.bus.emit(\"graph:update\", this.state.graph);\n }\n\n setPositions(pos: NodePositions): void {\n this.state.positions = { ...this.state.positions, ...pos };\n this.bump();\n }\n\n setPosition(id: string, x: number, y: number): void {\n this.state.positions[id] = { x, y };\n this.bump();\n }\n\n /* ─── Selection ─────────────────────────────────────────── */\n select(ids: string[] | Set<string>): void {\n this.selection.many(ids);\n }\n\n addToSelection(ids: string[] | Set<string>): void {\n const next = new Set(this.selection.all());\n let primary: string | undefined;\n\n for (const id of ids as any) {\n next.add(id);\n primary = id;\n }\n\n this.selection.many(next, primary);\n }\n\n toggleSelection(id: string): void {\n this.selection.toggle(id);\n }\n\n clearSelection(): void {\n this.selection.clear();\n }\n\n selectComments(threadId?: string): void {\n this.bus.emit(\"comment:select\", { threadId });\n }\n\n /* ─── Highlight / Hover ─────────────────────────────────── */\n setHighlighted(ids: string[] | Set<string>): void {\n this.state.highlighted = new Set(ids as any);\n this.bump();\n }\n\n setHover(id?: string): void {\n this.state.hoverId = id;\n this.bump();\n this.bus.emit(\"hover:change\", { id });\n }\n\n /* ─── Viewport ──────────────────────────────────────────── */\n setViewport(v: Partial<Viewport>): void {\n this.state.viewport = { ...this.state.viewport, ...v };\n this.bump();\n this.bus.emit(\"viewport:change\", this.getViewport());\n }\n\n /* ─── Wiring draft (for bind/include/exclude UX) ────────── */\n startWire(from: string, kind: DraftWire[\"kind\"]): void {\n this.state.draftWire = { from, kind };\n this.bump();\n this.bus.emit(\"wire:preview\", { from, kind });\n }\n\n previewWire(to?: string): void {\n const dw = this.state.draftWire;\n if (!dw) return;\n this.bus.emit(\"wire:preview\", { from: dw.from, to, kind: dw.kind });\n }\n\n commitWire(to: string): void {\n const dw = this.state.draftWire;\n if (!dw) return;\n // Headless API emits; the adapter/host decides how to mutate Builder\n this.bus.emit(\"wire:commit\", { from: dw.from, to, kind: dw.kind });\n this.state.draftWire = undefined;\n this.bump();\n }\n\n cancelWire(): void {\n const dw = this.state.draftWire;\n if (!dw) return;\n this.bus.emit(\"wire:cancel\", { from: dw.from });\n this.state.draftWire = undefined;\n this.bump();\n }\n\n /* ─── Utilities ─────────────────────────────────────────── */\n private bump(): void {\n this.state.version++;\n if (this.autoEmit) this.bus.emit(\"state:change\", this.snapshot());\n }\n\n dispose(): void {\n this.bus.clear();\n }\n\n undo() {\n this.builder.undo();\n this.refreshGraph();\n }\n\n private edgeRel: EdgeKind = \"bind\";\n\n getEdgeRel(): EdgeKind {\n return this.edgeRel;\n }\n\n public setEdgeRel(rel: EdgeKind) {\n if (this.edgeRel === rel) return; // ← correct: skip only if identical\n this.edgeRel = rel;\n this.bus.emit(\"edge:change\", rel);\n }\n\n /* ─── Option-node visibility (per field) ───────────────────────────────── */\n\n /** Internal mirror of which fields should show their options as nodes. */\n private shownOptionFields = new Set<string>();\n\n /** Return the field ids whose options are currently set to be visible as nodes. */\n getShownOptionFields(): string[] {\n return Array.from(this.shownOptionFields);\n }\n\n /** True if this field’s options are shown as nodes. */\n isFieldOptionsShown(fieldId: string): boolean {\n return this.shownOptionFields.has(String(fieldId));\n }\n\n /**\n * Set visibility of option nodes for a field, then rebuild the graph.\n * When shown = true, the Builder will emit option nodes for this field.\n */\n setFieldOptionsShown(fieldId: string, shown: boolean): void {\n const id = String(fieldId);\n const before = this.shownOptionFields.has(id);\n if (shown && !before) this.shownOptionFields.add(id);\n else if (!shown && before) this.shownOptionFields.delete(id);\n else return; // no-op\n\n // Push to builder options and refresh\n this.builder.setOptions({\n showOptionNodes: new Set(this.shownOptionFields),\n });\n this.refreshGraph();\n }\n\n /** Toggle option-node visibility for a field. Returns the new visibility. */\n toggleFieldOptions(fieldId: string): boolean {\n const next = !this.isFieldOptionsShown(fieldId);\n this.setFieldOptionsShown(fieldId, next);\n return next;\n }\n\n /**\n * Replace the whole set of fields whose options are visible as nodes.\n * Useful for restoring a saved UI state.\n */\n setShownOptionFields(ids: Iterable<string>): void {\n const next = new Set(Array.from(ids, String));\n // Fast-path: if identical set, skip work\n if (\n next.size === this.shownOptionFields.size &&\n Array.from(next).every((id) => this.shownOptionFields.has(id))\n ) {\n return;\n }\n this.shownOptionFields = next;\n this.builder.setOptions({\n showOptionNodes: new Set(this.shownOptionFields),\n });\n this.refreshGraph();\n }\n\n getConstraints() {\n return this.builder.getConstraints();\n }\n\n getServiceProps() {\n return this.builder.getProps();\n }\n}\n","// src/react/inputs/form-context.tsx\r\nimport type { ReactNode } from \"react\";\r\nimport * as React from \"react\";\r\n\r\nimport type { CoreContext } from \"@timeax/form-palette\";\r\nimport { Form, useCore } from \"@timeax/form-palette\";\r\n\r\ntype Dict = Record<string, unknown>;\r\n\r\nexport type FormSnapshot = Dict;\r\n\r\nexport type FormApi = {\r\n /** Value by fieldId (Wrapper uses name=field.id) */\r\n get: (fieldId: string) => unknown;\r\n /**\r\n * Programmatic set (NOT used by Wrapper).\r\n * If the field is mounted, writes into the core.\r\n * If not mounted, persists into core.bucket (via core.setValue) or local bag fallback.\r\n */\r\n set: (fieldId: string, value: unknown) => void;\r\n\r\n /** Option selections (legacy; kept for compatibility) */\r\n getSelections: (fieldId: string) => string[];\r\n setSelections: (fieldId: string, optionIds: string[]) => void;\r\n toggleSelection: (fieldId: string, optionId: string) => void;\r\n removeSelectionToken(token: string): void;\r\n\r\n /** Read-only snapshot for debugging (NO validation) */\r\n snapshot: () => FormSnapshot;\r\n\r\n /** Simple subscribe (re-render triggers) */\r\n subscribe: (fn: () => void) => () => void;\r\n\r\n /**\r\n * Validation gate:\r\n * local submit runs validation and returns mounted/visible values.\r\n * (This is NOT “submitting to a server”.)\r\n */\r\n submit: () => { values: Dict; valid: boolean };\r\n};\r\n\r\nconst Ctx = React.createContext<FormApi | null>(null);\r\n\r\nexport function useFormApi(): FormApi {\r\n const v = React.useContext(Ctx);\r\n if (!v) throw new Error(\"useFormApi must be used within <FormProvider />\");\r\n return v;\r\n}\r\n\r\nexport function useOptionalFormApi(): FormApi | null {\r\n return React.useContext(Ctx);\r\n}\r\n\r\nexport type FormProviderProps = {\r\n children: ReactNode;\r\n\r\n /** Optional schema (zod/jsonschema/etc, depending on your palette build) */\r\n schema?: any;\r\n\r\n /**\r\n * Same shape as the old OrderFlowProvider usage.\r\n * - values: seed values (persisted/rehydrated)\r\n * - selections: legacy (kept for compatibility)\r\n */\r\n initial?: {\r\n values?: Dict;\r\n selections?: Record<string, string[]>;\r\n };\r\n};\r\n\r\nexport function FormProvider({ children, schema, initial }: FormProviderProps) {\r\n // Indefinite memory (we keep values even when fields unmount)\r\n const [bag, setBag] = React.useState<Dict>(() => ({\r\n ...(initial?.values ?? {}),\r\n }));\r\n\r\n // Legacy selections (compat only)\r\n const [selectionsBag, setSelectionsBag] = React.useState<\r\n Record<string, string[]>\r\n >(() => ({ ...(initial?.selections ?? {}) }));\r\n\r\n // subscribe() support\r\n const listenersRef = React.useRef(new Set<() => void>());\r\n const publish = React.useCallback(() => {\r\n for (const fn of listenersRef.current) fn();\r\n }, []);\r\n\r\n // palette core ref (for submit/values/setValue)\r\n const coreRef = React.useRef<CoreContext<Dict> | null>(null);\r\n\r\n function Bridge() {\r\n const core = useCore<Dict>();\r\n\r\n React.useEffect(() => {\r\n coreRef.current = core;\r\n publish();\r\n return () => {\r\n coreRef.current = null;\r\n publish();\r\n };\r\n }, [core, publish]);\r\n\r\n return null;\r\n }\r\n\r\n const api = React.useMemo<FormApi>(() => {\r\n return {\r\n subscribe(fn) {\r\n listenersRef.current.add(fn);\r\n return () => listenersRef.current.delete(fn);\r\n },\r\n\r\n get(fieldId) {\r\n const core = coreRef.current;\r\n const live =\r\n (core?.values?.() as Dict | undefined) ?? undefined;\r\n\r\n // Prefer live (mounted + bucket), fallback to our indefinite bag\r\n if (live && fieldId in live) return live[fieldId];\r\n return bag[fieldId];\r\n },\r\n\r\n set(fieldId, value) {\r\n const core = coreRef.current;\r\n\r\n // Programmatic sets should go through core when possible\r\n // (core.setValue also persists to bucket when field isn't mounted).\r\n if (core) {\r\n core.setValue(fieldId, value);\r\n return;\r\n }\r\n\r\n // Fallback if core isn't mounted yet\r\n setBag((prev) => ({ ...prev, [fieldId]: value }));\r\n publish();\r\n },\r\n\r\n // Legacy selections API (compat; no longer used by the new Wrapper)\r\n getSelections(fieldId) {\r\n return selectionsBag[fieldId] ?? [];\r\n },\r\n setSelections(fieldId, optionIds) {\r\n setSelectionsBag((prev) => ({\r\n ...prev,\r\n [fieldId]: optionIds ?? [],\r\n }));\r\n publish();\r\n },\r\n toggleSelection(fieldId, optionId) {\r\n setSelectionsBag((prev) => {\r\n const current = new Set(prev[fieldId] ?? []);\r\n if (current.has(optionId)) current.delete(optionId);\r\n else current.add(optionId);\r\n return { ...prev, [fieldId]: Array.from(current) };\r\n });\r\n publish();\r\n },\r\n removeSelectionToken(token) {\r\n // token is \"fieldId:optionId\" in the old system; keep best-effort compat\r\n const [fieldId, optionId] = String(token).split(\":\", 2);\r\n if (!fieldId || !optionId) return;\r\n setSelectionsBag((prev) => {\r\n const current = new Set(prev[fieldId] ?? []);\r\n current.delete(optionId);\r\n return { ...prev, [fieldId]: Array.from(current) };\r\n });\r\n publish();\r\n },\r\n\r\n snapshot() {\r\n // IMPORTANT: read-only, NO validation here.\r\n const core = coreRef.current;\r\n const live = (core?.values?.() as Dict | undefined) ?? {};\r\n\r\n return live;\r\n },\r\n\r\n submit() {\r\n const core = coreRef.current;\r\n if (!core) return { values: {}, valid: false };\r\n\r\n // palette submit validates & returns mounted/visible values\r\n return core.submit() as { values: Dict; valid: boolean };\r\n },\r\n };\r\n }, [bag, selectionsBag, publish]);\r\n\r\n return (\r\n <Ctx.Provider value={api}>\r\n <Form\r\n adapter=\"local\"\r\n schema={schema}\r\n valueBag={bag}\r\n formRef={coreRef}\r\n onChange={() => publish()}\r\n >\r\n <Bridge />\r\n {children}\r\n </Form>\r\n </Ctx.Provider>\r\n );\r\n}\r\n","import type React from \"react\";\r\nimport { Field, ServiceProps, Ui } from \"@/schema\";\r\n\r\n/** Matches your InputWrapper’s expectations */\r\nexport type InputKind = string; // e.g. \"text\", \"number\", \"select\", \"custom:Rating\"\r\nexport type InputVariant = \"default\" | (string & {});\r\n/* -------------------------------------------------------------------------- */\r\n/* Adapter rules (updated meaning) */\r\n/* - getValue: normalize what host emitted into stored value (for form-palette)*/\r\n/* - getSelectedOptions: REQUIRED if field.options exists (no guessing) */\r\n/* - isActive: optional for option-less action buttons */\r\n/* -------------------------------------------------------------------------- */\r\n\r\nexport type AdapterCtx = { field: Field; props: ServiceProps };\r\n\r\nexport type Adapter = {\r\n valueProp?: string;\r\n changeProp?: string;\r\n errorProp?: string;\r\n\r\n /** normalize what the host emitted into what we store in form-palette */\r\n getValue?: (next: unknown, current: unknown, ctx: AdapterCtx) => unknown;\r\n\r\n /** REQUIRED if field.options exists */\r\n getSelectedOptions?: (\r\n next: unknown,\r\n current: unknown,\r\n ctx: AdapterCtx,\r\n ) => string[];\r\n\r\n /** For option-less action buttons (button: true with no options) */\r\n isActive?: (stored: unknown, ctx: AdapterCtx) => boolean;\r\n getInputPropsFromField?: (props: AdapterCtx) => any;\r\n toValue?: (value: any) => any;\r\n};\r\n\r\nexport type InputDescriptor = {\r\n Component: React.ComponentType<Record<string, unknown>>;\r\n adapter?: Adapter;\r\n defaultProps?: Record<string, unknown>;\r\n ui?: Record<string, Ui>;\r\n};\r\n\r\ntype VariantMap = Map<InputVariant, InputDescriptor>;\r\ntype RegistryStore = Map<InputKind, VariantMap>;\r\n\r\nexport type Registry = {\r\n get(kind: InputKind, variant?: InputVariant): InputDescriptor | undefined;\r\n register(\r\n kind: InputKind,\r\n descriptor: InputDescriptor,\r\n variant?: InputVariant,\r\n ): void;\r\n unregister(kind: InputKind, variant?: InputVariant): void;\r\n registerMany(\r\n entries: Array<{\r\n kind: InputKind;\r\n descriptor: InputDescriptor;\r\n variant?: InputVariant;\r\n }>,\r\n ): void;\r\n /** low-level escape hatch */\r\n _store: RegistryStore;\r\n};\r\n\r\nexport function createInputRegistry(): Registry {\r\n const store: RegistryStore = new Map();\r\n\r\n const get = (\r\n kind: InputKind,\r\n variant?: InputVariant,\r\n ): InputDescriptor | undefined => {\r\n const vm = store.get(kind);\r\n if (!vm) return undefined;\r\n const v = (variant ?? \"default\") as InputVariant;\r\n return vm.get(v) ?? vm.get(\"default\");\r\n };\r\n\r\n const register = (\r\n kind: InputKind,\r\n descriptor: InputDescriptor,\r\n variant?: InputVariant,\r\n ): void => {\r\n let vm = store.get(kind);\r\n if (!vm) {\r\n vm = new Map<InputVariant, InputDescriptor>();\r\n store.set(kind, vm);\r\n }\r\n vm.set((variant ?? \"default\") as InputVariant, descriptor);\r\n };\r\n\r\n const unregister = (kind: InputKind, variant?: InputVariant): void => {\r\n const vm = store.get(kind);\r\n if (!vm) return;\r\n const key = (variant ?? \"default\") as InputVariant;\r\n vm.delete(key);\r\n if (vm.size === 0) store.delete(kind);\r\n };\r\n\r\n const registerMany = (\r\n entries: Array<{\r\n kind: InputKind;\r\n descriptor: InputDescriptor;\r\n variant?: InputVariant;\r\n }>,\r\n ): void => {\r\n for (const e of entries) register(e.kind, e.descriptor, e.variant);\r\n };\r\n\r\n return { get, register, unregister, registerMany, _store: store };\r\n}\r\n\r\n/** Helper used by InputWrapper */\r\nexport function resolveInputDescriptor(\r\n registry: Registry,\r\n kind: InputKind,\r\n variant?: InputVariant,\r\n): InputDescriptor | undefined {\r\n return registry.get(kind, variant);\r\n}\r\n","import React, { createContext, useContext, useMemo } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { createInputRegistry } from \"@/react\";\nimport type {\n Registry,\n InputDescriptor,\n InputKind,\n InputVariant,\n} from \"@/react\";\n\ntype InputsCtxValue = {\n registry: Registry;\n register: (\n kind: InputKind,\n descriptor: InputDescriptor,\n variant?: InputVariant,\n ) => void;\n unregister: (kind: InputKind, variant?: InputVariant) => void;\n registerMany: (\n entries: Array<{\n kind: InputKind;\n descriptor: InputDescriptor;\n variant?: InputVariant;\n }>,\n ) => void;\n};\n\nconst Ctx = createContext<InputsCtxValue | null>(null);\n\nexport function Provider({\n children,\n initialRegistry,\n}: {\n children: ReactNode;\n /** Optional pre-built registry (e.g., you registered built-ins/customs before mounting) */\n initialRegistry?: Registry;\n}) {\n const registry = useMemo(\n () => initialRegistry ?? createInputRegistry(),\n [initialRegistry],\n );\n\n const value = useMemo<InputsCtxValue>(\n () => ({\n registry,\n register: registry.register,\n unregister: registry.unregister,\n registerMany: registry.registerMany,\n }),\n [registry],\n );\n\n return <Ctx.Provider value={value}>{children}</Ctx.Provider>;\n}\n\nexport function useInputs(): InputsCtxValue {\n const v = useContext(Ctx);\n if (!v) throw new Error(\"useInputs() must be used within <InputsProvider>\");\n return v;\n}\n","// src/react/inputs/wrapper.tsx\r\nimport * as React from \"react\";\r\nimport { useMemo } from \"react\";\r\n\r\nimport { useField } from \"@timeax/form-palette\";\r\n\r\nimport type { Field, FieldOption } from \"@/schema\";\r\nimport type { Scalar } from \"@/schema/order\";\r\n\r\nimport type {\r\n Adapter,\r\n AdapterCtx,\r\n InputDescriptor,\r\n InputKind,\r\n InputVariant,\r\n} from \"@/react\";\r\nimport { resolveInputDescriptor, useInputs } from \"@/react\";\r\n\r\nimport { useOrderFlow } from \"@/react/hooks/use-order-flow\";\r\n\r\nfunction toKind(field: Field): InputKind {\r\n return field.type as InputKind;\r\n}\r\n\r\nfunction toVariant(field: Field): InputVariant | undefined {\r\n const v = (field as any).meta?.variant;\r\n return typeof v === \"string\" && v.trim() ? (v as InputVariant) : undefined;\r\n}\r\n\r\n/* -------------------------------------------------------------------------- */\r\n/* Safe templating (no eval) */\r\n/* -------------------------------------------------------------------------- */\r\n\r\nfunction getPath(ctx: Record<string, unknown>, path: string): unknown {\r\n const parts = path\r\n .split(\".\")\r\n .map((p) => p.trim())\r\n .filter(Boolean);\r\n\r\n let cur: any = ctx;\r\n for (const p of parts) {\r\n if (cur == null) return undefined;\r\n cur = cur[p];\r\n }\r\n return cur;\r\n}\r\n\r\nfunction parseLiteral(raw: string, ctx: Record<string, unknown>): unknown {\r\n const s = raw.trim();\r\n if (!s) return \"\";\r\n\r\n if (\r\n (s.startsWith('\"') && s.endsWith('\"')) ||\r\n (s.startsWith(\"'\") && s.endsWith(\"'\"))\r\n ) {\r\n return s.slice(1, -1);\r\n }\r\n\r\n if (s === \"true\") return true;\r\n if (s === \"false\") return false;\r\n\r\n const n = Number(s);\r\n if (!Number.isNaN(n) && s !== \"\") return n;\r\n\r\n return getPath(ctx, s);\r\n}\r\n\r\nfunction evalMiniExpr(exprRaw: string, ctx: Record<string, unknown>): string {\r\n const expr = exprRaw.trim();\r\n\r\n const idxNullish = expr.indexOf(\"??\");\r\n const idxOr = expr.indexOf(\"||\");\r\n\r\n const splitAt =\r\n idxNullish >= 0\r\n ? { idx: idxNullish, op: \"??\" as const }\r\n : idxOr >= 0\r\n ? { idx: idxOr, op: \"||\" as const }\r\n : null;\r\n\r\n const left = splitAt ? expr.slice(0, splitAt.idx).trim() : expr;\r\n const right = splitAt ? expr.slice(splitAt.idx + 2).trim() : \"\";\r\n\r\n const leftVal = getPath(ctx, left);\r\n\r\n const isTruthy = (v: unknown) => !!v;\r\n const isNullish = (v: unknown) => v === null || v === undefined;\r\n\r\n const chooseFallback =\r\n splitAt?.op === \"??\"\r\n ? isNullish(leftVal)\r\n : splitAt?.op === \"||\"\r\n ? !isTruthy(leftVal)\r\n : false;\r\n\r\n const chosen = chooseFallback ? parseLiteral(right, ctx) : leftVal;\r\n\r\n if (chosen === null || chosen === undefined) return \"\";\r\n if (\r\n typeof chosen === \"string\" ||\r\n typeof chosen === \"number\" ||\r\n typeof chosen === \"boolean\"\r\n ) {\r\n return String(chosen);\r\n }\r\n\r\n try {\r\n return JSON.stringify(chosen);\r\n } catch {\r\n return String(chosen);\r\n }\r\n}\r\n\r\nfunction templateString(str: string, ctx: Record<string, unknown>): string {\r\n return str.replace(/\\{([^}]+)}/g, (_m, expr) =>\r\n evalMiniExpr(String(expr), ctx),\r\n );\r\n}\r\n\r\nfunction templateDeep<T>(value: T, ctx: Record<string, unknown>): T {\r\n if (typeof value === \"string\") return templateString(value, ctx) as any;\r\n if (Array.isArray(value))\r\n return value.map((v) => templateDeep(v, ctx)) as any;\r\n\r\n if (value && typeof value === \"object\") {\r\n const out: any = {};\r\n for (const [k, v] of Object.entries(value as any)) {\r\n out[k] = templateDeep(v, ctx);\r\n }\r\n return out;\r\n }\r\n\r\n return value;\r\n}\r\n\r\n/* -------------------------------------------------------------------------- */\r\n/* Wrapper */\r\n/* -------------------------------------------------------------------------- */\r\n\r\nexport type InputWrapperProps = {\r\n field: Field;\r\n disabled?: boolean;\r\n\r\n extraProps?: Record<string, unknown>;\r\n templateStrings?: boolean;\r\n ctxOverrides?: Record<string, unknown>;\r\n className?: string;\r\n};\r\n\r\nexport function Wrapper({\r\n field,\r\n disabled,\r\n extraProps,\r\n templateStrings = true,\r\n ctxOverrides,\r\n className = \"\",\r\n}: InputWrapperProps) {\r\n const { registry } = useInputs();\r\n const flow = useOrderFlow();\r\n\r\n const kind = toKind(field);\r\n const variant = toVariant(field);\r\n\r\n const descriptor: InputDescriptor | undefined = React.useMemo(\r\n () => resolveInputDescriptor(registry, kind, variant),\r\n [kind, registry, variant],\r\n );\r\n\r\n if (!descriptor) {\r\n // eslint-disable-next-line no-console\r\n console.warn(\"[Wrapper] No descriptor for\", { kind, variant, field });\r\n return null;\r\n }\r\n\r\n const Component = descriptor.Component as any;\r\n const adapter = (descriptor.adapter ?? {}) as Adapter;\r\n const baseProps = (descriptor.defaultProps ?? {}) as Record<\r\n string,\r\n unknown\r\n >;\r\n\r\n const defaultProps = useMemo(() => {\r\n return { ...baseProps, ...(field.defaults ?? {}) };\r\n }, [baseProps, field.defaults]);\r\n\r\n const valueProp = adapter.valueProp ?? \"value\";\r\n const changeProp = adapter.changeProp ?? \"onChange\";\r\n const errorProp = adapter.errorProp ?? \"errorText\";\r\n\r\n const isOptionBased =\r\n Array.isArray(field.options) && field.options.length > 0;\r\n\r\n // action button = option-less button\r\n const isActionButton = field.button === true && !isOptionBased;\r\n\r\n // Register into form-palette:\r\n // ✅ name is ALWAYS field.id (only name)\r\n const fp = useField({\r\n name: field.id,\r\n required: !!field.required,\r\n variant: field.type as any,\r\n defaultValue: field.defaults?.value,\r\n disabled: !!disabled,\r\n });\r\n\r\n // Option ids allow-list (defensive)\r\n const optionIds = React.useMemo(() => {\r\n if (!isOptionBased) return new Set<string>();\r\n return new Set((field.options ?? []).map((o: FieldOption) => o.id));\r\n }, [isOptionBased, field.options]);\r\n\r\n // Selection syncing bookkeeping\r\n const prevSelectedRef = React.useRef<string[]>([]);\r\n React.useEffect(() => {\r\n prevSelectedRef.current = [];\r\n }, [field.id]);\r\n\r\n const adapterCtx = React.useMemo<AdapterCtx>(\r\n () => ({ field, props: flow.raw }),\r\n [field],\r\n );\r\n\r\n const onHostChange = React.useCallback(\r\n (next: unknown) => {\r\n const currentStored = (next as any)?.value;\r\n\r\n // 1) normalize into stored value\r\n const stored =\r\n adapter.getValue?.(next, currentStored, adapterCtx) ??\r\n currentStored ??\r\n next;\r\n\r\n // 2) write ONLY via form-palette's onChange\r\n fp.setValue(stored);\r\n\r\n // 3) sync visibility triggers to Selection (via order flow)\r\n if (isOptionBased) {\r\n if (!adapter.getSelectedOptions) {\r\n throw new Error(\r\n `[Wrapper] Adapter for \"${field.id}\" (${field.type}) must implement getSelectedOptions() because this field has options.`,\r\n );\r\n }\r\n\r\n const rawIds = adapter.getSelectedOptions(\r\n next,\r\n stored,\r\n adapterCtx,\r\n );\r\n\r\n const nextIds = Array.from(\r\n new Set(\r\n (rawIds ?? [])\r\n .map(String)\r\n .filter((id) => optionIds.has(id)),\r\n ),\r\n );\r\n\r\n const prev = prevSelectedRef.current;\r\n prevSelectedRef.current = nextIds;\r\n\r\n const prevSet = new Set(prev);\r\n const nextSet = new Set(nextIds);\r\n\r\n // toggle ON\r\n for (const id of nextIds) {\r\n if (!prevSet.has(id)) flow.toggleOption(field.id, id);\r\n }\r\n\r\n // toggle OFF\r\n for (const id of prev) {\r\n if (!nextSet.has(id)) flow.toggleOption(field.id, id);\r\n }\r\n\r\n return;\r\n }\r\n\r\n if (isActionButton) {\r\n const isActive =\r\n adapter.isActive?.(stored, adapterCtx) ?? Boolean(stored);\r\n if (isActive) flow.toggleOption(field.id);\r\n else flow.clearField(field.id);\r\n }\r\n },\r\n [\r\n adapter,\r\n adapterCtx,\r\n field.id,\r\n field.type,\r\n flow,\r\n fp,\r\n isActionButton,\r\n isOptionBased,\r\n optionIds,\r\n ],\r\n );\r\n\r\n // Template context (keep your current behavior)\r\n const templateCtx = React.useMemo<Record<string, unknown>>(() => {\r\n const ctxFromInit = (flow as any).init?.ctx ?? {};\r\n const ctx =\r\n ctxOverrides && typeof ctxOverrides === \"object\"\r\n ? { ...(ctxFromInit as any), ...(ctxOverrides as any) }\r\n : (ctxFromInit as Record<string, unknown>);\r\n\r\n return {\r\n ...ctx,\r\n field,\r\n flow,\r\n value: fp.value,\r\n error: fp.error,\r\n };\r\n }, [ctxOverrides, field, flow, fp.error, fp.value]);\r\n\r\n const templatedDefaultProps = React.useMemo(() => {\r\n if (!templateStrings) return defaultProps;\r\n return templateDeep(defaultProps as any, templateCtx);\r\n }, [defaultProps, templateCtx, templateStrings]);\r\n\r\n const templatedExtraProps = React.useMemo(() => {\r\n if (!templateStrings)\r\n return (extraProps ?? {}) as Record<string, unknown>;\r\n return templateDeep((extraProps ?? {}) as any, templateCtx);\r\n }, [extraProps, templateCtx, templateStrings]);\r\n\r\n const fieldProps =\r\n adapter?.getInputPropsFromField?.({ field, props: flow.raw }) ?? {};\r\n // Build host props\r\n const hostProps: Record<string, unknown> = {\r\n id: field.id,\r\n field,\r\n disabled: !!disabled || !!fp.disabled,\r\n required: field.required,\r\n\r\n // DO NOT pass `name` to InputField/entries\r\n fieldKey: field.id,\r\n\r\n ...(fieldProps ?? {}),\r\n // error channel\r\n error: fp.error,\r\n\r\n ...(templatedDefaultProps ?? {}),\r\n ...(templatedExtraProps ?? {}),\r\n };\r\n\r\n // value + change wiring\r\n hostProps[valueProp] = (fp.value ?? null) as Scalar | Scalar[] | null;\r\n hostProps[changeProp] = onHostChange;\r\n hostProps[errorProp] = fp.error;\r\n\r\n return (\r\n <div ref={fp.ref as any} className={className}>\r\n <Component {...hostProps} />\r\n </div>\r\n );\r\n}\r\n","// src/react/hooks/use-order-flow.ts\r\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\r\n\r\nimport type { ServiceProps } from \"@/schema\";\r\nimport type { OrderSnapshot, Scalar } from \"@/schema/order\";\r\nimport type { FallbackSettings } from \"@/schema/validation\";\r\n\r\nimport { buildOrderSnapshot } from \"@/utils/build-order-snapshot\";\r\nimport {\r\n type OrderFlowInitializeParams,\r\n useOrderFlowContext,\r\n} from \"./order-flow-provider\";\r\n\r\nimport type {\r\n VisibleGroup,\r\n VisibleGroupResult,\r\n} from \"@/react/canvas/selection\";\r\n\r\nconst ROOT_TAG_ID = \"t:root\";\r\n\r\ntype NormalizeRateFn = (service: unknown) => number;\r\n\r\nexport type PricingPreview = {\r\n serviceId?: string | number;\r\n unitRate: number;\r\n base: number;\r\n utilities: number;\r\n total: number;\r\n utilityBreakdown: Array<{\r\n nodeId: string;\r\n mode: string;\r\n amount: number;\r\n }>;\r\n};\r\n\r\nexport type UseOrderFlowReturn = {\r\n ready: boolean;\r\n initialize: (params: OrderFlowInitializeParams) => void;\r\n\r\n activeTagId?: string;\r\n\r\n /** raw service props */\r\n raw: ServiceProps;\r\n\r\n /** visibility is Selection-only */\r\n visibleGroup: VisibleGroup | null;\r\n\r\n /**\r\n * Values are from form-palette (values()) and are already \"visible-only\"\r\n * because your UI mounts only visible fields.\r\n */\r\n formValuesByFieldId: Record<string, Scalar | Scalar[]>;\r\n\r\n /**\r\n * Selections are Selection-only now.\r\n * We keep this for compatibility with buildOrderSnapshot signature,\r\n * but we do NOT read it from form anymore.\r\n */\r\n optionSelectionsByFieldId: Record<string, string[]>;\r\n\r\n quantityPreview: number;\r\n services: Array<string | number>;\r\n serviceMap: Record<string, Array<string | number>>;\r\n\r\n pricingPreview: PricingPreview;\r\n\r\n min: number;\r\n max: number;\r\n\r\n selectTag: (tagId: string) => void;\r\n toggleOption: (fieldId: string, optionId?: string) => void;\r\n\r\n /** programmatic value set (rare; wrapper/field hook should handle most) */\r\n setValue: (fieldId: string, value: Scalar | Scalar[]) => void;\r\n clearField: (fieldId: string) => void;\r\n\r\n reset: (opts?: { keepTag?: boolean }) => void;\r\n setSnapshot: (snap: OrderSnapshot, opts?: { clearFirst?: boolean }) => void;\r\n\r\n /** VALIDATES via form.submit() */\r\n buildSnapshot: () => OrderSnapshot | undefined;\r\n\r\n fallbackPolicy: FallbackSettings;\r\n setFallbackPolicy: (next: FallbackSettings) => void;\r\n};\r\n\r\nexport function useOrderFlow(): UseOrderFlowReturn {\r\n const ctx = useOrderFlowContext();\r\n const ready = ctx.ready();\r\n\r\n const initialize = useCallback(\r\n (params: OrderFlowInitializeParams) => {\r\n ctx.initialize(params);\r\n },\r\n [ctx],\r\n );\r\n\r\n // keep propsRef updated (best-effort; only when ready)\r\n const propsRef = useRef<ServiceProps | null>(null);\r\n useEffect(() => {\r\n if (!ready) return;\r\n propsRef.current = ctx.ensureReady(\"propsRef\").builder.getProps();\r\n }, [ctx, ready]);\r\n\r\n /**\r\n * Selection tick: Selection is external, so we force re-render.\r\n */\r\n const [selTick, setSelTick] = useState(0);\r\n useEffect(() => {\r\n if (!ready) return;\r\n const sel = ctx.selection;\r\n if (!sel?.onChange) return;\r\n return sel.onChange(() => setSelTick((x) => x + 1));\r\n }, [ready, ctx.selection]);\r\n\r\n /**\r\n * Form tick: form-palette bridge is pub/sub, so we subscribe.\r\n * On each tick we recompute form.values() or form.submit() where needed.\r\n */\r\n const [formTick, setFormTick] = useState(0);\r\n useEffect(() => {\r\n return ctx.formApi.subscribe(() => setFormTick((x) => x + 1));\r\n }, [ctx.formApi]);\r\n\r\n /**\r\n * Visibility is Selection-only. No form-based augmentation.\r\n */\r\n const visibleGroup: VisibleGroup | null = useMemo(() => {\r\n if (!ready) return null;\r\n\r\n const sel = ctx.selection;\r\n if (!sel) return null;\r\n\r\n const vg: VisibleGroupResult = sel.visibleGroup();\r\n if (vg.kind !== \"single\") return null;\r\n\r\n return vg.group ?? null;\r\n }, [ready, ctx.selection, selTick]);\r\n\r\n const activeTagId = useMemo(() => {\r\n if (!ready) return undefined;\r\n return ctx.selection?.currentTag?.() ?? ctx.activeTagId;\r\n }, [ready, ctx.selection, ctx.activeTagId, selTick]);\r\n\r\n /**\r\n * Preview values:\r\n * - NO validation\r\n * - driven by form.values() (core.values())\r\n * - already visible-only because only visible fields are mounted.\r\n */\r\n const formValuesByFieldId: Record<string, Scalar | Scalar[]> =\r\n useMemo(() => {\r\n const values = (ctx.formApi.snapshot?.() ?? {}) as Record<\r\n string,\r\n Scalar | Scalar[]\r\n >;\r\n\r\n return values;\r\n }, [ctx.formApi, formTick]);\r\n\r\n /**\r\n * Selections are Selection-only now.\r\n * Keep empty map for snapshot builder signature.\r\n */\r\n const optionSelectionsByFieldId = useMemo(\r\n () => ({}) as Record<string, string[]>,\r\n [],\r\n );\r\n\r\n /**\r\n * Preview snapshot uses form.values() (no validation) + Selection context.\r\n */\r\n const previewSnapshot: OrderSnapshot = useMemo(() => {\r\n if (!ready) {\r\n return {\r\n version: \"1\",\r\n mode: \"prod\",\r\n builtAt: new Date().toISOString(),\r\n selection: { tag: \"unknown\", fields: [], buttons: [] },\r\n inputs: { form: {}, selections: {} },\r\n quantity: 1,\r\n quantitySource: { kind: \"default\", defaultedFromHost: true },\r\n services: [],\r\n min: 1,\r\n max: 1,\r\n serviceMap: {},\r\n meta: {\r\n schema_version: propsRef.current?.schema_version,\r\n context: {\r\n tag: \"unknown\",\r\n constraints: {},\r\n nodeContexts: {},\r\n policy: {\r\n ratePolicy: { kind: \"lte_primary\" },\r\n requireConstraintFit: true,\r\n },\r\n },\r\n },\r\n };\r\n }\r\n\r\n const { builder, init, selection } = ctx.ensureReady(\"previewSnapshot\");\r\n const mode: \"prod\" | \"dev\" = init.mode ?? \"prod\";\r\n const hostDefaultQuantity = Number(init.hostDefaultQuantity ?? 1) || 1;\r\n\r\n /// console.log(formValuesByFieldId)\r\n return buildOrderSnapshot(\r\n builder.getProps(),\r\n builder,\r\n {\r\n activeTagId: activeTagId ?? ROOT_TAG_ID,\r\n formValuesByFieldId,\r\n selectedKeys: selection.selectedButtons(),\r\n optionSelectionsByFieldId, // Selection-owned now\r\n },\r\n init.services,\r\n {\r\n mode,\r\n hostDefaultQuantity,\r\n fallback: ctx.fallbackPolicy,\r\n },\r\n );\r\n }, [\r\n ready,\r\n ctx,\r\n activeTagId,\r\n formValuesByFieldId,\r\n optionSelectionsByFieldId,\r\n selTick,\r\n ]);\r\n\r\n /**\r\n * Pricing preview unchanged (driven from previewSnapshot)\r\n */\r\n const pricingPreview: PricingPreview = useMemo(() => {\r\n const empty: PricingPreview = {\r\n unitRate: 0,\r\n base: 0,\r\n utilities: 0,\r\n total: 0,\r\n utilityBreakdown: [],\r\n };\r\n\r\n if (!ready) return empty;\r\n\r\n const { init } = ctx.ensureReady(\"pricingPreview\");\r\n const normalizeRate: NormalizeRateFn =\r\n ((init as unknown as { normalizeRate?: NormalizeRateFn })\r\n .normalizeRate as NormalizeRateFn) ??\r\n ((s: any) => Number(s?.rate));\r\n\r\n const quantity = Number(previewSnapshot.quantity ?? 1) || 1;\r\n\r\n let bestId: string | number | undefined;\r\n let bestRate = 0;\r\n\r\n const selectedIds = (previewSnapshot.services ?? []) as Array<\r\n string | number\r\n >;\r\n const svcMap = (init as any).services as Record<\r\n string | number,\r\n unknown\r\n >;\r\n\r\n for (const id of selectedIds) {\r\n const svc = svcMap?.[id];\r\n if (!svc) continue;\r\n\r\n const r = Number(normalizeRate(svc));\r\n if (!Number.isFinite(r)) continue;\r\n\r\n if (r > bestRate) {\r\n bestRate = r;\r\n bestId = id;\r\n }\r\n }\r\n\r\n const base = bestRate * quantity;\r\n\r\n const breakdown: PricingPreview[\"utilityBreakdown\"] = [];\r\n let utilitiesTotal = 0;\r\n\r\n const utils = ((previewSnapshot as any).utilities ?? []) as Array<any>;\r\n for (const u of utils) {\r\n const rate = Number(u?.rate);\r\n if (!Number.isFinite(rate)) continue;\r\n\r\n let amount = 0;\r\n const mode = String(u?.mode ?? \"\");\r\n\r\n switch (mode) {\r\n case \"flat\":\r\n amount = rate;\r\n break;\r\n case \"per_quantity\":\r\n amount = rate * quantity;\r\n break;\r\n case \"percent\":\r\n amount = base * (rate / 100);\r\n break;\r\n default:\r\n amount = 0;\r\n }\r\n\r\n if (Number.isFinite(amount) && amount !== 0) {\r\n utilitiesTotal += amount;\r\n breakdown.push({\r\n nodeId: String(u?.nodeId ?? \"\"),\r\n mode,\r\n amount,\r\n });\r\n }\r\n }\r\n\r\n return {\r\n serviceId: bestId,\r\n unitRate: bestRate,\r\n base,\r\n utilities: utilitiesTotal,\r\n total: base + utilitiesTotal,\r\n utilityBreakdown: breakdown,\r\n };\r\n }, [ready, ctx, previewSnapshot]);\r\n\r\n const selectTag = useCallback(\r\n (tagId: string) => {\r\n ctx.ensureReady(\"selectTag\");\r\n ctx.selection?.replace?.(tagId);\r\n ctx.setActiveTag(tagId);\r\n },\r\n [ctx],\r\n );\r\n\r\n /**\r\n * Selection-only toggles.\r\n * (No form selections.)\r\n */\r\n const toggleOption = useCallback(\r\n (fieldId: string, optionId?: string) => {\r\n const token = optionId ?? fieldId;\r\n ctx.selection?.toggle?.(token);\r\n },\r\n [ctx],\r\n );\r\n\r\n const setValue = useCallback(\r\n (fieldId: string, value: Scalar | Scalar[]) => {\r\n // programmatic, goes into form memory (core bucket)\r\n ctx.formApi.set(fieldId, value);\r\n },\r\n [ctx],\r\n );\r\n\r\n const clearField = useCallback(\r\n (fieldId: string) => {\r\n ctx.formApi.set(fieldId, undefined);\r\n ctx.selection?.remove?.(fieldId);\r\n },\r\n [ctx],\r\n );\r\n\r\n const reset = useCallback(\r\n (opts?: { keepTag?: boolean }) => {\r\n ctx.ensureReady(\"reset\");\r\n ctx.reset(opts);\r\n },\r\n [ctx],\r\n );\r\n\r\n const setSnapshot = useCallback(\r\n (snap: OrderSnapshot, opts?: { clearFirst?: boolean }) => {\r\n ctx.ensureReady(\"setSnapshot\");\r\n ctx.setSnapshot(snap, opts);\r\n },\r\n [ctx],\r\n );\r\n\r\n /**\r\n * Build snapshot must VALIDATE.\r\n * This is where form.submit() belongs.\r\n */\r\n const buildSnapshot = useCallback((): OrderSnapshot | undefined => {\r\n const { builder, selection, init } = ctx.ensureReady(\"buildSnapshot\");\r\n\r\n const tagId = selection.currentTag();\r\n const selectedKeys = selection.selectedButtons();\r\n if (!tagId)\r\n throw new Error(\"OrderFlow: no active tag/context selected\");\r\n\r\n const mode: \"prod\" | \"dev\" = init.mode ?? \"prod\";\r\n const hostDefaultQuantity = Number(init.hostDefaultQuantity ?? 1) || 1;\r\n\r\n const submitted = ctx.formApi.submit();\r\n const values = submitted.values as Record<string, Scalar | Scalar[]>;\r\n\r\n if (!submitted.valid) return;\r\n\r\n return buildOrderSnapshot(\r\n builder.getProps(),\r\n builder,\r\n {\r\n activeTagId: tagId,\r\n formValuesByFieldId: values,\r\n selectedKeys,\r\n optionSelectionsByFieldId, // Selection-owned\r\n },\r\n init.services,\r\n {\r\n mode,\r\n hostDefaultQuantity,\r\n fallback: ctx.fallbackPolicy,\r\n },\r\n );\r\n }, [ctx, optionSelectionsByFieldId]);\r\n\r\n const raw = useMemo(() => {\r\n if (!ready) return propsRef.current ?? ({} as ServiceProps);\r\n return ctx.ensureReady(\"raw\").builder.getProps();\r\n }, [ctx, ready, selTick]);\r\n\r\n return {\r\n ready,\r\n initialize,\r\n\r\n activeTagId,\r\n raw,\r\n\r\n visibleGroup,\r\n\r\n formValuesByFieldId,\r\n optionSelectionsByFieldId,\r\n\r\n quantityPreview: previewSnapshot.quantity,\r\n services: previewSnapshot.services,\r\n serviceMap: previewSnapshot.serviceMap,\r\n\r\n pricingPreview,\r\n\r\n min: previewSnapshot.min ?? 1,\r\n max: previewSnapshot.max ?? previewSnapshot.min ?? 1,\r\n\r\n selectTag,\r\n toggleOption,\r\n setValue,\r\n clearField,\r\n\r\n reset,\r\n setSnapshot,\r\n\r\n buildSnapshot,\r\n\r\n fallbackPolicy: ctx.fallbackPolicy,\r\n setFallbackPolicy: ctx.setFallbackPolicy,\r\n };\r\n}\r\n","// src/react/hooks/order-flow-provider.tsx\nimport React, {\n createContext,\n forwardRef,\n ReactNode,\n useCallback,\n useContext,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport { FormProvider, Provider, useFormApi } from \"@/react\";\nimport type { Registry as InputRegistryConfig } from \"../inputs/registry\";\n\nimport { type Builder, type BuilderOptions, createBuilder } from \"@/core\";\n\nimport type { ServiceProps, Tag } from \"@/schema\";\nimport type { DgpServiceCapability, DgpServiceMap } from \"@/schema/provider\";\nimport type { OrderSnapshot, Scalar } from \"@/schema/order\";\nimport type { FallbackSettings } from \"@/schema/validation\";\n\nimport { Selection } from \"../canvas/selection\";\n\nconst ROOT_TAG_ID = \"t:root\";\n\n/* ───────────────────────── Types ───────────────────────── */\n\nexport type OrderFlowInit = {\n mode?: \"prod\" | \"dev\";\n /** required service map used for snapshot building / rules */\n services: DgpServiceMap;\n /** fallback policy overrides */\n fallback?: FallbackSettings;\n /** hydrate initial state from snapshot */\n hydrateFrom?: OrderSnapshot;\n /** initial tag (ignored if hydrateFrom exists and provides tag) */\n initialTagId?: string;\n /** default quantity used by snapshot builder (default 1) */\n hostDefaultQuantity?: number;\n /** selection resolver (optional) */\n resolveService?: (id: number | string) => DgpServiceCapability | undefined;\n /**\n * Host props provided to further enhance the nodes data\n */\n ctx?: Record<string, unknown>;\n\n normalizeRate?(svc: DgpServiceCapability): number;\n};\n\ntype ProviderFlow = {\n builder: Builder;\n selection?: Selection;\n};\n\nexport type OrderFlowProviderProps = {\n /**\n * Optional at mount time.\n * If absent, call initialize(...) later (via ref OR hook API).\n */\n serviceProps?: ServiceProps;\n builder?: Builder;\n flow?: ProviderFlow;\n\n builderOptions?: BuilderOptions;\n\n /** optional selection override (if not passed in flow) */\n selection?: Selection;\n\n /** Host input registry (maps kind/variant → components) */\n registry?: InputRegistryConfig;\n\n /** Optional now (deferred init supported). */\n init?: OrderFlowInit;\n\n children?: ReactNode;\n};\n\nexport type OrderFlowInitializeParams = {\n serviceProps?: ServiceProps;\n builder?: Builder;\n flow?: ProviderFlow;\n\n builderOptions?: BuilderOptions;\n selection?: Selection;\n\n init: OrderFlowInit;\n};\n\nexport type OrderFlowHandle = {\n /** whether provider has enough info to run */\n ready: () => boolean;\n\n /** (re)initialize the provider */\n initialize: (params: OrderFlowInitializeParams) => void;\n\n getActiveTag: () => string | undefined;\n selectTag: (tagId: string) => void;\n\n getVisibleGroup: () => ReturnType<Selection[\"visibleGroup\"]>;\n getSelectionIds: () => string[];\n clearSelection: () => void;\n\n /** Apply snapshot into selection + form values/selections */\n setSnapshot: (snap: OrderSnapshot, opts?: { clearFirst?: boolean }) => void;\n\n /** Reset tag + clear fields */\n reset: (opts?: { keepTag?: boolean }) => void;\n\n refresh: () => void;\n};\n\n/* ───────────────────────── Context ───────────────────────── */\n\ntype NormalizedInit = Required<\n Pick<OrderFlowInit, \"mode\" | \"hostDefaultQuantity\">\n> &\n OrderFlowInit;\n\ntype EnsureReadyResult = {\n builder: Builder;\n selection: Selection;\n init: NormalizedInit;\n};\n\ntype CtxShape = {\n builder: Builder | null;\n selection: Selection | null;\n\n activeTagId?: string;\n setActiveTag: (id: string) => void;\n\n init: NormalizedInit | null;\n\n /** Form API from FormProvider (always available) */\n formApi: ReturnType<typeof useFormApi>;\n\n /** fallback policy (owned here; used by hook) */\n fallbackPolicy: FallbackSettings;\n setFallbackPolicy: (next: FallbackSettings) => void;\n\n /** imperative helpers exposed to hook */\n setSnapshot: (snap: OrderSnapshot, opts?: { clearFirst?: boolean }) => void;\n reset: (opts?: { keepTag?: boolean }) => void;\n\n /** guards */\n ready: () => boolean;\n ensureReady: (op?: string) => EnsureReadyResult;\n\n /** init API */\n initialize: (params: OrderFlowInitializeParams) => void;\n};\n\nconst OrderFlowCtx = createContext<CtxShape | null>(null);\n\nexport function useOrderFlowContext(): CtxShape {\n const ctx = useContext(OrderFlowCtx);\n if (!ctx)\n throw new Error(\n \"useOrderFlowContext must be used within <OrderFlowProvider>\",\n );\n return ctx;\n}\n\n/* ───────────────────────── helpers ───────────────────────── */\n\nfunction findDefaultTagId(tags: Tag[]): string | undefined {\n if (!tags?.length) return undefined;\n const hasRoot = tags.some((t) => t.id === ROOT_TAG_ID);\n return hasRoot ? ROOT_TAG_ID : tags[0]!.id;\n}\n\n/** Snapshot.inputs.form is keyed by field.name; map -> fieldId for FormProvider initial */\nfunction mapSnapshotFormToFieldIds(\n builder: Builder,\n snap: OrderSnapshot,\n): Record<string, Scalar | Scalar[]> {\n const byFieldId: Record<string, Scalar | Scalar[]> = {};\n const form = snap.inputs?.form ?? {};\n const fields = builder.getProps().fields ?? [];\n\n const nameToIds = new Map<string, string[]>();\n for (const f of fields) {\n if (!f.name) continue;\n const arr = nameToIds.get(f.name) ?? [];\n arr.push(f.id);\n nameToIds.set(f.name, arr);\n }\n\n for (const [name, value] of Object.entries(form)) {\n for (const fid of nameToIds.get(name) ?? []) {\n byFieldId[fid] = value as Scalar | Scalar[];\n }\n }\n\n return byFieldId;\n}\n\nfunction makeDefaultFallback(\n mode: \"prod\" | \"dev\",\n patch?: FallbackSettings,\n): FallbackSettings {\n return {\n requireConstraintFit: true,\n ratePolicy: { kind: \"lte_primary\" },\n selectionStrategy: \"priority\",\n mode: mode === \"dev\" ? \"dev\" : \"strict\",\n ...(patch ?? {}),\n };\n}\n\nfunction normalizeInit(init: OrderFlowInit): NormalizedInit {\n const mode: \"prod\" | \"dev\" = init.mode ?? \"prod\";\n const hostDefaultQuantity = Number.isFinite(init.hostDefaultQuantity ?? 1)\n ? Number(init.hostDefaultQuantity ?? 1)\n : 1;\n return { ...init, mode, hostDefaultQuantity };\n}\n\n/* ───────────────────────── Bridge ───────────────────────── */\n/**\n * This component MUST live inside <FormProvider> so it can call useFormApi()\n * and provide OrderFlowCtx synchronously on the first render.\n */\nfunction OrderFlowCtxBridge(props: {\n ctxValue: Omit<CtxShape, \"formApi\">;\n formApiRef: React.MutableRefObject<ReturnType<typeof useFormApi> | null>;\n children?: ReactNode;\n}) {\n const formApi = useFormApi();\n props.formApiRef.current = formApi; // sync (render-time) ref\n\n return (\n <OrderFlowCtx.Provider value={{ ...props.ctxValue, formApi }}>\n {props.children}\n </OrderFlowCtx.Provider>\n );\n}\n\n/* ───────────────────────── Component ───────────────────────── */\n\nexport const OrderFlowProvider = forwardRef<\n OrderFlowHandle,\n OrderFlowProviderProps\n>(function OrderFlowProvider(\n {\n flow,\n builder: builderProp,\n serviceProps,\n builderOptions,\n selection: selectionProp,\n registry,\n init,\n children,\n },\n ref,\n) {\n // deferred init storage\n const builderRef = useRef<Builder | null>(null);\n const selectionRef = useRef<Selection | null>(null);\n const initRef = useRef<NormalizedInit | null>(null);\n const unsubRef = useRef<null | (() => void)>(null);\n\n // Form API ref (render-time set by bridge)\n const formApiRef = useRef<ReturnType<typeof useFormApi> | null>(null);\n\n // active tag tracking\n const [activeTagId, setActiveTagId] = useState<string | undefined>(\n undefined,\n );\n\n // fallback policy state\n const [fallbackPolicy, setFallbackPolicy] = useState<FallbackSettings>(() =>\n makeDefaultFallback(\"prod\"),\n );\n\n // to re-render when initialize() is called\n const [, force] = useState(0);\n const bump = () => force((x) => x + 1);\n\n const resolveBuilder = useCallback(\n (p: {\n flow?: ProviderFlow;\n builder?: Builder;\n serviceProps?: ServiceProps;\n builderOptions?: BuilderOptions;\n }) => {\n if (p.flow?.builder) return p.flow.builder;\n if (p.builder) return p.builder;\n\n if (p.serviceProps) {\n const b = createBuilder(p.builderOptions ?? {});\n b.load(p.serviceProps);\n return b;\n }\n\n return null;\n },\n [],\n );\n\n useEffect(() => {\n return () => {\n if (unsubRef.current) unsubRef.current();\n };\n }, []);\n\n const resolveSelection = useCallback(\n (\n b: Builder,\n nInit: NormalizedInit,\n p: { flow?: ProviderFlow; selection?: Selection },\n ) => {\n return (\n p.flow?.selection ??\n p.selection ??\n new Selection(b, {\n env: \"client\",\n rootTagId: ROOT_TAG_ID,\n resolveService: nInit.resolveService,\n })\n );\n },\n [],\n );\n\n const ready = useCallback(\n () =>\n !!builderRef.current && !!selectionRef.current && !!initRef.current,\n [],\n );\n\n const ensureReady = useCallback((op?: string): EnsureReadyResult => {\n const b = builderRef.current;\n const s = selectionRef.current;\n const i = initRef.current;\n\n if (!b || !s || !i) {\n const hint = op ? ` (${op})` : \"\";\n throw new Error(\n `OrderFlowProvider is not initialized${hint}. Call initialize(...) or pass init + serviceProps/builder.`,\n );\n }\n return { builder: b, selection: s, init: i };\n }, []);\n\n const wireSelectionListener = useCallback((sel: Selection) => {\n setActiveTagId(sel.currentTag());\n return sel.onChange(() => setActiveTagId(sel.currentTag()));\n }, []);\n\n const initialize = useCallback(\n (params: OrderFlowInitializeParams) => {\n const b = resolveBuilder(params);\n if (!b) {\n throw new Error(\n \"OrderFlowProvider.initialize: requires `serviceProps` or `builder`/`flow.builder`.\",\n );\n }\n\n const nInit = normalizeInit(params.init);\n const sel = resolveSelection(b, nInit, {\n flow: params.flow,\n selection: params.selection,\n });\n\n builderRef.current = b;\n selectionRef.current = sel;\n initRef.current = nInit;\n\n setFallbackPolicy(makeDefaultFallback(nInit.mode, nInit.fallback));\n\n // ✅ bind listener immediately (and replace any previous listener)\n if (unsubRef.current) unsubRef.current();\n unsubRef.current = sel.onChange(() =>\n setActiveTagId(sel.currentTag()),\n );\n\n // ✅ choose initial tag (hydrate -> init -> root -> first)\n const tags = b.getProps().filters ?? [];\n const hydratedTag = nInit.hydrateFrom?.selection?.tag;\n const initialTag = nInit.hydrateFrom\n ? hydratedTag\n : (nInit.initialTagId ?? findDefaultTagId(tags));\n\n if (initialTag) sel.replace(initialTag);\n else if (tags.length) sel.replace(tags[0]!.id);\n\n // ✅ set activeTagId synchronously right now\n setActiveTagId(sel.currentTag());\n\n // ✅ late-init hydration: MUST be imperative (FormProvider.initial won't re-run)\n const api = formApiRef.current;\n\n if (api && nInit.hydrateFrom) {\n // selections are already fieldId-keyed\n const selMap = nInit.hydrateFrom.inputs?.selections ?? {};\n for (const [fid, oids] of Object.entries(selMap)) {\n api.setSelections(fid, oids ?? []);\n }\n\n // form is keyed by field.name -> map to fieldId(s)\n const valuesByFieldId = mapSnapshotFormToFieldIds(\n b,\n nInit.hydrateFrom,\n );\n for (const [fid, v] of Object.entries(valuesByFieldId)) {\n api.set(fid, v as Scalar | Scalar[]);\n }\n }\n\n bump();\n },\n [resolveBuilder, resolveSelection],\n );\n\n // auto initialize from initial props if possible\n useEffect(() => {\n if (ready()) return;\n if (!init) return;\n\n const b = resolveBuilder({\n flow,\n builder: builderProp,\n serviceProps,\n builderOptions,\n });\n if (!b) return;\n\n initialize({\n flow,\n builder: builderProp,\n serviceProps,\n builderOptions,\n selection: selectionProp,\n init,\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // attach selection listener whenever selection changes\n useEffect(() => {\n const sel = selectionRef.current;\n if (!sel) return;\n return wireSelectionListener(sel);\n }, [wireSelectionListener, force]);\n\n const setActiveTag = useCallback(\n (id: string) => {\n const { selection } = ensureReady(\"setActiveTag\");\n selection.replace(id);\n setActiveTagId(id);\n },\n [ensureReady],\n );\n\n const clearAllFields = useCallback(() => {\n const api = formApiRef.current;\n if (!api) return;\n\n const b = builderRef.current;\n if (!b) return;\n\n const fields = b.getProps().fields ?? [];\n for (const f of fields) {\n api.set(f.id, undefined as unknown as Scalar);\n api.setSelections(f.id, []);\n }\n }, []);\n\n const setSnapshot = useCallback(\n (snap: OrderSnapshot, opts?: { clearFirst?: boolean }) => {\n const api = formApiRef.current;\n if (!api) return;\n\n const { builder, selection } = ensureReady(\"setSnapshot\");\n\n const clearFirst = opts?.clearFirst ?? true;\n\n const tag = snap.selection?.tag;\n if (tag) selection.replace(tag);\n\n if (clearFirst) clearAllFields();\n\n const sel = snap.inputs?.selections ?? {};\n for (const [fid, oids] of Object.entries(sel))\n api.setSelections(fid, oids ?? []);\n\n const valuesByFieldId = mapSnapshotFormToFieldIds(builder, snap);\n for (const [fid, v] of Object.entries(valuesByFieldId))\n api.set(fid, v as Scalar | Scalar[]);\n },\n [clearAllFields, ensureReady],\n );\n\n const reset = useCallback(\n (opts?: { keepTag?: boolean }) => {\n const keepTag = opts?.keepTag ?? false;\n\n const { builder, selection } = ensureReady(\"reset\");\n\n if (!keepTag) {\n const tags = builder.getProps().filters ?? [];\n const def = findDefaultTagId(tags) ?? tags[0]?.id;\n if (def) selection.replace(def);\n }\n\n clearAllFields();\n },\n [clearAllFields, ensureReady],\n );\n\n const getVisibleGroup = useCallback(\n () => ensureReady(\"getVisibleGroup\").selection.visibleGroup(),\n [ensureReady],\n );\n const getSelectionIds = useCallback(\n () => Array.from(ensureReady(\"getSelectionIds\").selection.all()),\n [ensureReady],\n );\n const clearSelection = useCallback(\n () => ensureReady(\"clearSelection\").selection.clear(),\n [ensureReady],\n );\n\n // initial FormProvider state (only if initialized + hydrateFrom exists)\n const initialValues = useMemo(() => {\n const b = builderRef.current;\n const i = initRef.current;\n if (!b || !i?.hydrateFrom) return {};\n return mapSnapshotFormToFieldIds(b, i.hydrateFrom);\n }, [force]);\n\n const initialSelections = useMemo(() => {\n const i = initRef.current;\n if (!i?.hydrateFrom) return {};\n return i.hydrateFrom.inputs?.selections ?? {};\n }, [force]);\n\n useImperativeHandle(\n ref,\n (): OrderFlowHandle => ({\n ready,\n initialize,\n\n getActiveTag: () => activeTagId,\n selectTag: (id: string) => setActiveTag(id),\n\n getVisibleGroup,\n getSelectionIds,\n clearSelection,\n\n setSnapshot,\n reset,\n refresh: () => setActiveTagId(selectionRef.current?.currentTag()),\n }),\n [\n activeTagId,\n clearSelection,\n getSelectionIds,\n getVisibleGroup,\n initialize,\n ready,\n reset,\n setActiveTag,\n setSnapshot,\n ],\n );\n\n return (\n <Provider initialRegistry={registry}>\n <FormProvider\n initial={{\n values: initialValues,\n selections: initialSelections,\n }}\n >\n <OrderFlowCtxBridge\n formApiRef={formApiRef}\n ctxValue={{\n builder: builderRef.current,\n selection: selectionRef.current,\n\n activeTagId,\n setActiveTag,\n\n init: initRef.current,\n\n fallbackPolicy,\n setFallbackPolicy,\n\n setSnapshot,\n reset,\n\n ready,\n ensureReady,\n\n initialize,\n }}\n >\n {children}\n </OrderFlowCtxBridge>\n </FormProvider>\n </Provider>\n );\n});\n","// src/react/inputs/registry/entries/text.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const textDescriptor: InputDescriptor = {\n Component: InputField as any,\n\n defaultProps: {\n variant: \"text\",\n stripPrefix: true,\n stripSuffix: true,\n slotChar: \"_\",\n },\n\n ui: {\n // shared box tuning (text supports these)\n size: sharedUi.size,\n density: sharedUi.density,\n ...sharedUi.padding,\n\n // behavior\n trim: {\n type: \"boolean\",\n label: \"Trim\",\n description: \"If enabled, the value is trimmed before validation.\",\n },\n\n minLength: {\n type: \"number\",\n label: \"Min length\",\n minimum: 0,\n description: \"Minimum allowed string length.\",\n },\n\n maxLength: {\n type: \"number\",\n label: \"Max length\",\n minimum: 0,\n description: \"Maximum allowed string length.\",\n },\n\n // affixes\n prefix: {\n type: \"string\",\n label: \"Prefix\",\n description: \"Fixed prefix rendered as part of the input value.\",\n },\n\n suffix: {\n type: \"string\",\n label: \"Suffix\",\n description: \"Fixed suffix rendered as part of the input value.\",\n },\n\n stripPrefix: {\n type: \"boolean\",\n label: \"Strip prefix\",\n description:\n \"If enabled, remove the prefix from the emitted model value.\",\n },\n\n stripSuffix: {\n type: \"boolean\",\n label: \"Strip suffix\",\n description:\n \"If enabled, remove the suffix from the emitted model value.\",\n },\n\n // shared layout knobs\n joinControls: sharedUi.joinControls,\n extendBoxToControls: sharedUi.extendBoxToControls,\n\n // shared masking knobs\n ...sharedUi.textMask,\n },\n}; \n","// src/react/inputs/registry/shared.ts\nimport type { Ui } from \"@/schema\";\n\nexport const sharedUi = {\n // ─────────────────────────────────────────────\n // Layout: join controls (text + select)\n // ─────────────────────────────────────────────\n joinControls: {\n type: \"boolean\",\n label: \"Join controls\",\n description:\n \"If enabled and there are controls, the input and controls share one visual box (borders, radius, focus states).\",\n } satisfies Ui,\n\n extendBoxToControls: {\n type: \"boolean\",\n label: \"Extend box to controls\",\n description:\n \"When joinControls is enabled: extend the styling over the controls (true) or keep them visually separate (false).\",\n } satisfies Ui,\n\n // ─────────────────────────────────────────────\n // Masking (text family)\n // ─────────────────────────────────────────────\n textMask: {\n mask: {\n type: \"string\",\n label: \"Mask pattern\",\n description:\n 'Mask pattern for formatted input (e.g. \"99/99/9999\", \"(999) 999-9999\").',\n } satisfies Ui,\n\n slotChar: {\n type: \"string\",\n label: \"Slot character\",\n description: 'Mask placeholder character (default is \"_\").',\n minLength: 1,\n maxLength: 1,\n } satisfies Ui,\n\n autoClear: {\n type: \"boolean\",\n label: \"Auto clear\",\n description:\n 'If enabled, empty masked values emit \"\" instead of placeholder slots.',\n } satisfies Ui,\n\n unmask: {\n type: \"anyOf\",\n label: \"Value mode\",\n description:\n \"Controls whether the emitted value is raw (unmasked) or masked.\",\n items: [\n { type: \"string\", title: \"Masked\", value: \"masked\" },\n { type: \"string\", title: \"Raw\", value: \"raw\" },\n ],\n } satisfies Ui,\n\n maskInsertMode: {\n type: \"anyOf\",\n label: \"Mask insert mode\",\n description:\n \"Reserved for future caret-mode logic (kept for compatibility).\",\n items: [\n { type: \"string\", title: \"Stream\", value: \"stream\" },\n { type: \"string\", title: \"Caret\", value: \"caret\" },\n ],\n } satisfies Ui,\n \n maskDefinitions: {\n type: \"object\",\n label: \"Mask definitions\",\n description:\n \"Per-symbol definitions for mask slots. Add a symbol key, then choose the definition shape.\",\n editable: true,\n fields: {},\n\n shape: {\n \"Regex pattern\": {\n type: \"string\",\n label: \"Pattern\",\n description:\n \"A regex pattern describing what this slot accepts.\",\n pattern: \".*\",\n },\n\n \"Boolean toggle\": {\n type: \"boolean\",\n label: \"Enabled\",\n description:\n \"Simple on/off definition (rare, but supported).\",\n },\n\n \"Choice list\": {\n type: \"anyOf\",\n label: \"Allowed values\",\n description: \"Explicit allowed values for this slot.\",\n items: [{ type: \"string\", title: \"Example\", value: \"X\" }],\n },\n },\n } satisfies Ui,\n },\n\n // ─────────────────────────────────────────────\n // Options mapping + search UX (select / multi-select family)\n // ─────────────────────────────────────────────\n optionMapping: {\n options: {\n type: \"array\",\n label: \"Options\",\n description: \"List of options to render.\",\n item: {\n type: \"object\",\n label: \"Option\",\n description: \"Option entry (object).\",\n fields: {},\n } as Ui,\n } satisfies Ui,\n\n autoCap: {\n type: \"boolean\",\n label: \"Auto capitalise\",\n description:\n \"Automatically capitalise the first letter when the resolved label is a string.\",\n } satisfies Ui,\n\n optionLabel: {\n type: \"string\",\n label: \"Option label key\",\n description: \"Key to read the label from option objects.\",\n } satisfies Ui,\n\n optionValue: {\n type: \"string\",\n label: \"Option value key\",\n description: \"Key to read the value from option objects.\",\n } satisfies Ui,\n\n optionDescription: {\n type: \"string\",\n label: \"Option description key\",\n description:\n \"Key to read the description line from option objects.\",\n } satisfies Ui,\n\n optionDisabled: {\n type: \"string\",\n label: \"Option disabled key\",\n description: \"Key to determine if an option is disabled.\",\n } satisfies Ui,\n\n optionIcon: {\n type: \"string\",\n label: \"Option icon key\",\n description:\n 'Key to read the icon from option objects (often \"icon\").',\n } satisfies Ui,\n\n optionKey: {\n type: \"string\",\n label: \"Option key\",\n description: \"Stable key used as the identity for each option.\",\n } satisfies Ui,\n },\n\n searchUx: {\n searchable: {\n type: \"boolean\",\n label: \"Searchable\",\n description: \"Enable searching inside the dropdown.\",\n } satisfies Ui,\n\n searchPlaceholder: {\n type: \"string\",\n label: \"Search placeholder\",\n description: \"Placeholder text for the search input.\",\n } satisfies Ui,\n\n emptySearchText: {\n type: \"string\",\n label: \"Empty search text\",\n description: \"Text shown when the search returns no results.\",\n } satisfies Ui,\n },\n\n pickerCommon: {\n placeholder: {\n type: \"string\",\n label: \"Placeholder\",\n description: \"Placeholder text shown when no value is selected.\",\n } satisfies Ui,\n\n clearable: {\n type: \"boolean\",\n label: \"Clearable\",\n description: \"Allow clearing the current selection.\",\n } satisfies Ui,\n },\n\n // -----------------------------\n // Box sizing / density (text + textarea, etc.)\n // -----------------------------\n size: {\n type: \"anyOf\",\n label: \"Size\",\n description: \"Size preset for the input.\",\n items: [\n { type: \"string\", title: \"Small\", value: \"sm\" },\n { type: \"string\", title: \"Medium\", value: \"md\" },\n { type: \"string\", title: \"Large\", value: \"lg\" },\n ],\n } satisfies Ui,\n\n density: {\n type: \"anyOf\",\n label: \"Density\",\n description: \"Controls vertical compactness / line-height preset.\",\n items: [\n { type: \"string\", title: \"Compact\", value: \"compact\" },\n { type: \"string\", title: \"Normal\", value: \"normal\" },\n { type: \"string\", title: \"Relaxed\", value: \"relaxed\" },\n { type: \"string\", title: \"Dense\", value: \"dense\" },\n { type: \"string\", title: \"Loose\", value: \"loose\" },\n ],\n } satisfies Ui,\n\n // -----------------------------\n // Padding (text + textarea, etc.)\n // -----------------------------\n padding: {\n px: {\n type: \"number\",\n label: \"Padding X\",\n description: \"Horizontal padding override in pixels.\",\n minimum: 0,\n } satisfies Ui,\n py: {\n type: \"number\",\n label: \"Padding Y\",\n description: \"Vertical padding override in pixels.\",\n minimum: 0,\n } satisfies Ui,\n ps: {\n type: \"number\",\n label: \"Padding start\",\n description:\n \"Start-side padding override in pixels (overrides px).\",\n minimum: 0,\n } satisfies Ui,\n pe: {\n type: \"number\",\n label: \"Padding end\",\n description: \"End-side padding override in pixels (overrides px).\",\n minimum: 0,\n } satisfies Ui,\n pb: {\n type: \"number\",\n label: \"Padding bottom\",\n description: \"Bottom padding override in pixels (overrides py).\",\n minimum: 0,\n } satisfies Ui,\n },\n} as const;\n","// src/react/inputs/registry/entries/textarea.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const textareaDescriptor: InputDescriptor = {\n Component: InputField as any,\n defaultProps: {\n variant: \"textarea\",\n },\n ui: {\n // box tuning shared with text\n size: sharedUi.size,\n density: sharedUi.density,\n ...sharedUi.padding,\n \n autoResize: {\n type: \"boolean\",\n label: \"Auto resize\",\n description: \"Automatically grows/shrinks height based on content.\",\n },\n\n rows: {\n type: \"number\",\n label: \"Min rows\",\n description:\n \"Minimum number of visible rows (used when auto-resize is enabled).\",\n minimum: 1,\n },\n\n maxRows: {\n type: \"number\",\n label: \"Max rows\",\n description:\n \"Maximum number of visible rows (leave unset for unlimited).\",\n minimum: 1,\n },\n\n extendBoxToControls: sharedUi.extendBoxToControls,\n\n extendBoxToToolbox: {\n type: \"boolean\",\n label: \"Extend box to toolbox\",\n description:\n \"Extend the textarea box styling to the upper toolbox area when present.\",\n },\n },\n};\n","// src/react/inputs/registry/entries/phone.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const phoneDescriptor: InputDescriptor = {\n Component: InputField as any,\n\n defaultProps: {\n variant: \"phone\", // MUST\n\n // (optional) you can omit these since the component already defaults them:\n // showCountry: true,\n // showFlag: true,\n // showSelectedLabel: false,\n // showSelectedDial: false,\n // showDialInList: true,\n // valueMode: \"e164\",\n // keepCharPositions: false,\n },\n\n ui: {\n // shared text-like tuning supported by phone (since it types against Text props)\n size: sharedUi.size,\n density: sharedUi.density,\n ...sharedUi.padding,\n\n joinControls: sharedUi.joinControls,\n extendBoxToControls: sharedUi.extendBoxToControls,\n\n // ─────────────────────────────────────────────\n // Phone-specific configuration\n // ─────────────────────────────────────────────\n\n defaultCountry: {\n type: \"string\",\n label: \"Default country\",\n description:\n 'ISO 3166-1 alpha-2 code for the initial country (e.g. \"NG\", \"US\", \"GB\").',\n },\n\n // Countries list is optional; if omitted, runtime uses global list.\n // editable=true lets admins add custom countries if you want.\n countries: {\n type: \"array\",\n label: \"Countries\",\n description:\n \"Optional custom country list. If omitted, the global country list is used.\",\n editable: true,\n item: {\n type: \"object\",\n label: \"Country\",\n description:\n \"A single country entry: code, label, dial code, and national mask.\",\n editable: false,\n fields: {\n code: {\n type: \"string\",\n label: \"ISO code\",\n description: 'ISO alpha-2 (e.g. \"NG\").',\n },\n label: {\n type: \"string\",\n label: \"Label\",\n description: 'Display label (e.g. \"Nigeria\").',\n },\n dial: {\n type: \"string\",\n label: \"Dial code\",\n description: 'Dial code without \"+\" (e.g. \"234\").',\n },\n mask: {\n type: \"string\",\n label: \"National mask\",\n description:\n 'Mask for the NATIONAL portion only (no dial). Example: \"999 999 9999\".',\n },\n // flag is ReactNode in the variant; not builder-editable, so excluded.\n },\n order: [\"code\", \"label\", \"dial\", \"mask\"],\n },\n }, \n\n valueMode: {\n type: \"anyOf\",\n label: \"Value mode\",\n description:\n \"Controls how the form value is emitted (masked, e164, or national digits only).\",\n items: [\n {\n type: \"string\",\n title: \"Masked (+234 801 234 5678)\",\n value: \"masked\",\n },\n {\n type: \"string\",\n title: \"E164 (dial+digits, no +)\",\n value: \"e164\",\n },\n {\n type: \"string\",\n title: \"National (digits only)\",\n value: \"national\",\n },\n ],\n },\n\n keepCharPositions: {\n type: \"boolean\",\n label: \"Keep character positions\",\n description:\n \"If enabled, the national mask keeps placeholder characters for not-yet-filled positions.\",\n },\n\n // ─────────────────────────────────────────────\n // Country selector UX (allowed; not InputField placeholder)\n // ─────────────────────────────────────────────\n\n showCountry: {\n type: \"boolean\",\n label: \"Show country selector\",\n description: \"Show or hide the country selector control.\",\n },\n\n countryPlaceholder: {\n type: \"string\",\n label: \"Country placeholder\",\n description:\n \"Placeholder shown on the country selector when nothing is selected.\",\n },\n\n showFlag: {\n type: \"boolean\",\n label: \"Show flag\",\n description: \"Show or hide the country flag in the selector.\",\n },\n\n showSelectedLabel: {\n type: \"boolean\",\n label: \"Show selected label\",\n description: \"Show the selected country label in the trigger.\",\n },\n\n showSelectedDial: {\n type: \"boolean\",\n label: \"Show selected dial code\",\n description: \"Show the selected country dial code in the trigger.\",\n },\n\n showDialInList: {\n type: \"boolean\",\n label: \"Show dial code in list\",\n description:\n \"Show dial codes alongside country names in the dropdown list.\",\n },\n\n // onCountryChange is a callback; not builder-editable, so excluded.\n // country*ClassName props are forbidden; excluded.\n },\n};\n","// src/react/inputs/registry/entries/toggle-group.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const toggleGroupDescriptor: InputDescriptor = {\n Component: InputField as any,\n\n defaultProps: {\n variant: \"toggle-group\", // MUST\n multiple: false,\n variantStyle: \"default\",\n layout: \"horizontal\",\n gridCols: 2,\n fillWidth: false,\n autoCap: false,\n },\n\n ui: {\n // (toggle-group supports these via VariantBaseProps)\n size: sharedUi.size,\n density: sharedUi.density,\n\n /**\n * Options\n * - supports primitive shorthand + objects + option* mapping keys\n */\n options: {\n type: \"array\",\n label: \"Options\",\n description:\n \"Toggle options. Can be primitive values (string/number/boolean) or objects. Uses option* keys when provided.\",\n editable: true,\n item: {\n type: \"object\",\n label: \"Option\",\n description:\n \"Option object (used when you want label/value/icon/disabled/tooltip/meta).\",\n editable: true,\n fields: {\n // Keep this minimal; the variant can also read via option* keys.\n value: {\n type: \"string\",\n label: \"Value\",\n description: \"Unique option value (string).\",\n },\n label: {\n type: \"string\",\n label: \"Label\",\n description: \"Display label for the option.\",\n },\n disabled: {\n type: \"boolean\",\n label: \"Disabled\",\n description: \"Disable this option.\",\n },\n tooltip: {\n type: \"string\",\n label: \"Tooltip\",\n description: \"Optional tooltip text for this option.\",\n },\n },\n } as any,\n },\n\n // option mapping keys (shared)\n autoCap: {\n type: \"boolean\",\n label: \"Auto capitalise\",\n description:\n \"Automatically capitalise labels when the resolved label is a string.\",\n },\n\n optionValue: {\n type: \"string\",\n label: \"Option value key\",\n description:\n \"Property name to read the option value from when using custom option objects.\",\n },\n\n optionLabel: {\n type: \"string\",\n label: \"Option label key\",\n description:\n \"Property name to read the option label from when using custom option objects.\",\n },\n\n optionIcon: {\n type: \"string\",\n label: \"Option icon key\",\n description:\n \"Property name to read an icon from (runtime-only; builder typically won’t author icons).\",\n },\n\n optionDisabled: {\n type: \"string\",\n label: \"Option disabled key\",\n description:\n \"Property name to read the disabled flag from when using custom option objects.\",\n },\n\n optionTooltip: {\n type: \"string\",\n label: \"Option tooltip key\",\n description:\n \"Property name to read tooltip content from when using custom option objects.\",\n },\n\n optionMeta: {\n type: \"string\",\n label: \"Option meta key\",\n description:\n \"Property name to read meta from (opaque payload for host logic).\",\n },\n\n // selection mode\n multiple: {\n type: \"boolean\",\n label: \"Multiple\",\n description:\n \"If enabled, multiple options can be selected (emits a string array).\",\n },\n\n // visuals/layout\n variant: {\n type: \"anyOf\",\n label: \"Variant style\",\n description:\n 'Visual style for the toggle buttons (\"default\" or \"outline\").',\n items: [\n { type: \"string\", title: \"Default\", value: \"default\" },\n { type: \"string\", title: \"Outline\", value: \"outline\" },\n ],\n },\n\n layout: {\n type: \"anyOf\",\n label: \"Layout\",\n description: \"How the toggle items are arranged.\",\n items: [\n { type: \"string\", title: \"Horizontal\", value: \"horizontal\" },\n { type: \"string\", title: \"Vertical\", value: \"vertical\" },\n { type: \"string\", title: \"Grid\", value: \"grid\" },\n ],\n },\n\n gridCols: {\n type: \"number\",\n label: \"Grid columns\",\n description: \"Number of columns when layout is set to grid.\",\n minimum: 1,\n },\n\n fillWidth: {\n type: \"boolean\",\n label: \"Fill width\",\n description:\n \"If enabled, the group stretches to full width and items expand to fill available space.\",\n },\n\n gap: {\n type: \"number\",\n label: \"Item gap\",\n description:\n \"Spacing between items in pixels (applies in grid/horizontal/vertical layouts).\",\n minimum: 0,\n },\n },\n};\n","// src/react/inputs/registry/entries/number.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const numberDescriptor: InputDescriptor = {\n Component: InputField as any,\n\n defaultProps: {\n variant: \"number\", // MUST\n\n // sensible defaults (optional — you can remove if you prefer)\n mode: \"decimal\",\n useGrouping: true,\n format: true,\n allowEmpty: true,\n step: 1,\n\n // for ShadcnNumberVariant\n showButtons: false,\n buttonLayout: \"stacked\",\n },\n\n ui: {\n // shared (supported via text base)\n size: sharedUi.size,\n density: sharedUi.density,\n ...sharedUi.padding,\n joinControls: sharedUi.joinControls,\n extendBoxToControls: sharedUi.extendBoxToControls,\n\n // numeric mode\n mode: {\n type: \"anyOf\",\n label: \"Mode\",\n description: \"Number formatting mode (decimal or currency).\",\n items: [\n { type: \"string\", title: \"Decimal\", value: \"decimal\" },\n { type: \"string\", title: \"Currency\", value: \"currency\" },\n ],\n },\n\n currency: {\n type: \"string\",\n label: \"Currency code\",\n description:\n 'ISO currency code used when mode is \"currency\" (e.g. \"USD\", \"NGN\").',\n },\n\n currencyDisplay: {\n type: \"anyOf\",\n label: \"Currency display\",\n description: \"How currency is displayed when mode is currency.\",\n items: [\n { type: \"string\", title: \"Symbol\", value: \"symbol\" },\n {\n type: \"string\",\n title: \"Narrow symbol\",\n value: \"narrowSymbol\",\n },\n { type: \"string\", title: \"Code\", value: \"code\" },\n { type: \"string\", title: \"Name\", value: \"name\" },\n ],\n },\n\n // locale + grouping\n locale: {\n type: \"string\",\n label: \"Locale\",\n description:\n 'Locale used for formatting (e.g. \"en-US\", \"en-GB\"). If unset, runtime uses browser locale.',\n },\n\n useGrouping: {\n type: \"boolean\",\n label: \"Use grouping\",\n description: \"If enabled, format with thousands separators.\",\n },\n\n // fraction digits\n minFractionDigits: {\n type: \"number\",\n label: \"Min fraction digits\",\n description: \"Minimum number of fractional digits to show.\",\n minimum: 0,\n },\n\n maxFractionDigits: {\n type: \"number\",\n label: \"Max fraction digits\",\n description: \"Maximum number of fractional digits to show.\",\n minimum: 0,\n },\n\n // limits + stepping\n min: {\n type: \"number\",\n label: \"Minimum\",\n description: \"Minimum allowed numeric value.\",\n },\n\n max: {\n type: \"number\",\n label: \"Maximum\",\n description: \"Maximum allowed numeric value.\",\n },\n\n step: {\n type: \"number\",\n label: \"Step\",\n description: \"Step increment used for arrow keys and +/- buttons.\",\n },\n\n // behavior\n allowEmpty: {\n type: \"boolean\",\n label: \"Allow empty\",\n description:\n \"If enabled, the field can be cleared to an empty state (null).\",\n },\n\n format: {\n type: \"boolean\",\n label: \"Format\",\n description:\n \"If enabled, uses Intl formatting (grouping/currency) when blurred. If disabled, shows raw text.\",\n },\n\n // affixes (allowed — not InputField props)\n prefix: {\n type: \"string\",\n label: \"Prefix\",\n description:\n \"Fixed prefix rendered as part of the displayed value.\",\n },\n\n suffix: {\n type: \"string\",\n label: \"Suffix\",\n description:\n \"Fixed suffix rendered as part of the displayed value.\",\n },\n\n // ShadcnNumberVariant extras (buttons)\n showButtons: {\n type: \"boolean\",\n label: \"Show +/- buttons\",\n description:\n \"Show increment/decrement buttons around the number field.\",\n },\n\n buttonLayout: {\n type: \"anyOf\",\n label: \"Button layout\",\n description:\n 'How +/- buttons are arranged when \"Show +/- buttons\" is enabled.',\n items: [\n { type: \"string\", title: \"Inline\", value: \"inline\" },\n { type: \"string\", title: \"Stacked\", value: \"stacked\" },\n ],\n },\n },\n};\n","// src/react/inputs/registry/entries/password.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const passwordDescriptor: InputDescriptor = {\n Component: InputField as any,\n\n defaultProps: {\n variant: \"password\", // MUST\n\n // sensible defaults (optional)\n revealToggle: true,\n meterStyle: \"simple\",\n },\n\n ui: {\n // shared text-like tuning supported by password (it types against text props)\n size: sharedUi.size,\n density: sharedUi.density,\n ...sharedUi.padding,\n joinControls: sharedUi.joinControls,\n extendBoxToControls: sharedUi.extendBoxToControls,\n\n // password-specific\n maxLength: {\n type: \"number\",\n label: \"Max length\",\n minimum: 0,\n description: \"Maximum number of characters permitted.\",\n },\n\n autoComplete: {\n type: \"string\",\n label: \"Autocomplete\",\n description:\n 'Browser autocomplete hint (e.g. \"current-password\", \"new-password\").',\n },\n\n revealToggle: {\n type: \"boolean\",\n label: \"Reveal toggle\",\n description:\n \"Show an eye button to toggle between obscured/plain text.\",\n },\n\n defaultRevealed: {\n type: \"boolean\",\n label: \"Default revealed\",\n description: \"Start in the revealed (plain text) state.\",\n },\n\n meterStyle: {\n type: \"anyOf\",\n label: \"Meter style\",\n description:\n 'Built-in meter style: \"simple\" (bar + label) or \"rules\" (bar + checklist).',\n items: [\n { type: \"string\", title: \"Simple\", value: \"simple\" },\n { type: \"string\", title: \"Rules\", value: \"rules\" },\n ],\n },\n\n /**\n * Strength meter config\n * - Runtime accepts: boolean | StrengthOptions\n * - We expose it as an object; if present (even empty), it enables the meter\n * and merges with defaults.\n *\n * NOTE: we intentionally do NOT expose `calc` (function).\n */\n strengthMeter: {\n type: \"object\",\n label: \"Strength meter\",\n description:\n \"Configure the built-in strength meter. If set (even partially), the meter is enabled and defaults are merged.\",\n editable: false,\n fields: {\n labels: {\n type: \"array\",\n label: \"Labels\",\n description: \"Labels for each score bucket (index 0..4).\",\n editable: true,\n minItems: 5,\n maxItems: 5,\n item: {\n type: \"string\",\n label: \"Label\",\n description: \"Label for a score bucket.\",\n },\n },\n\n thresholds: {\n type: \"array\",\n label: \"Thresholds\",\n description:\n \"Thresholds for score steps using a 0–100 bar (index 0..4).\",\n editable: true,\n minItems: 5,\n maxItems: 5,\n item: {\n type: \"number\",\n label: \"Threshold\",\n description: \"Threshold value (0–100).\",\n minimum: 0,\n maximum: 100,\n },\n },\n\n minScore: {\n type: \"number\",\n label: \"Minimum score\",\n description:\n \"Minimum score required to consider the password acceptable (visual only unless enforced elsewhere).\",\n minimum: 0,\n maximum: 4,\n },\n\n showLabel: {\n type: \"boolean\",\n label: \"Show label\",\n description:\n \"Show the textual label next to/under the bar.\",\n },\n\n display: {\n type: \"anyOf\",\n label: \"Display\",\n description:\n 'Where to render the meter: \"inline\" (compact) or \"block\" (stacked).',\n items: [\n { type: \"string\", title: \"Inline\", value: \"inline\" },\n { type: \"string\", title: \"Block\", value: \"block\" },\n ],\n },\n },\n order: [\"display\", \"showLabel\", \"minScore\", \"labels\", \"thresholds\"],\n },\n\n ruleUses: {\n type: \"array\",\n label: \"Rule uses\",\n description:\n 'Selection of rule aliases to apply. Prefix with \"!\" to mark a rule as important.',\n editable: true,\n item: {\n type: \"string\",\n label: \"Rule\",\n description: 'Rule alias (e.g. \"length\" or \"!length\").',\n },\n },\n },\n};\n","// src/react/inputs/registry/entries/slider.ts\r\nimport { InputField } from \"@timeax/form-palette\";\r\nimport type { InputDescriptor } from \"@/react\";\r\nimport { sharedUi } from \"./shared\";\r\n\r\nexport const sliderDescriptor: InputDescriptor = {\r\n Component: InputField as any,\r\n\r\n defaultProps: {\r\n variant: \"slider\", // MUST\r\n min: 0,\r\n max: 100,\r\n step: 1,\r\n showValue: true,\r\n valuePlacement: \"end\",\r\n joinControls: true,\r\n extendBoxToControls: true,\r\n controlVariant: \"none\",\r\n },\r\n\r\n ui: {\r\n // slider supports size + density but its density enum is compact/comfortable/loose\r\n size: sharedUi.size,\r\n\r\n density: {\r\n type: \"anyOf\",\r\n label: \"Density\",\r\n description: \"Vertical padding preset for the slider container.\",\r\n items: [\r\n { type: \"string\", title: \"Compact\", value: \"compact\" },\r\n { type: \"string\", title: \"Comfortable\", value: \"comfortable\" },\r\n { type: \"string\", title: \"Loose\", value: \"loose\" },\r\n ],\r\n },\r\n\r\n min: {\r\n type: \"number\",\r\n label: \"Minimum\",\r\n description: \"Minimum value for the slider.\",\r\n },\r\n\r\n max: {\r\n type: \"number\",\r\n label: \"Maximum\",\r\n description: \"Maximum value for the slider.\",\r\n },\r\n\r\n step: {\r\n type: \"number\",\r\n label: \"Step\",\r\n description: \"Step between values.\",\r\n },\r\n\r\n showValue: {\r\n type: \"boolean\",\r\n label: \"Show value\",\r\n description: \"Show the current value as text next to the slider.\",\r\n },\r\n\r\n valuePlacement: {\r\n type: \"anyOf\",\r\n label: \"Value placement\",\r\n description: 'Where the value label appears (\"start\" or \"end\").',\r\n items: [\r\n { type: \"string\", title: \"Start\", value: \"start\" },\r\n { type: \"string\", title: \"End\", value: \"end\" },\r\n ],\r\n },\r\n\r\n joinControls: sharedUi.joinControls,\r\n extendBoxToControls: sharedUi.extendBoxToControls,\r\n\r\n controlVariant: {\r\n type: \"anyOf\",\r\n label: \"Built-in +/- controls\",\r\n description:\r\n 'Built-in step buttons around the slider (\"none\", \"boxed\", or \"edge\").',\r\n items: [\r\n { type: \"string\", title: \"None\", value: \"none\" },\r\n { type: \"string\", title: \"Boxed\", value: \"boxed\" },\r\n { type: \"string\", title: \"Edge\", value: \"edge\" },\r\n ],\r\n },\r\n\r\n controlStep: {\r\n type: \"number\",\r\n label: \"Control step\",\r\n description:\r\n \"Step used when clicking the +/- controls. If unset, falls back to Step.\",\r\n },\r\n },\r\n};\r\n","// src/react/inputs/registry/entries/toggle.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const toggleDescriptor: InputDescriptor = {\n Component: InputField as any,\n\n defaultProps: {\n variant: \"toggle\", // MUST\n // optional defaults (the variant already defaults these)\n // size: \"md\",\n // density: \"default\",\n // controlPlacement: \"left\",\n },\n\n ui: {\n // toggle supports the same size union as text\n size: sharedUi.size,\n\n // but density is different from your text density union\n density: {\n type: \"anyOf\",\n label: \"Density\",\n description: \"Row density (vertical padding & gap).\",\n items: [\n { type: \"string\", title: \"Default\", value: \"default\" },\n { type: \"string\", title: \"Dense\", value: \"dense\" },\n ],\n },\n\n controlPlacement: {\n type: \"anyOf\",\n label: \"Control placement\",\n description:\n \"Place the switch on the left or right of the state text.\",\n items: [\n { type: \"string\", title: \"Left\", value: \"left\" },\n { type: \"string\", title: \"Right\", value: \"right\" },\n ],\n },\n },\n};\n","// src/react/inputs/registry/entries/treeselect.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const treeSelectDescriptor: InputDescriptor = {\n Component: InputField as any,\n\n defaultProps: {\n variant: \"treeselect\", // MUST\n\n // sensible defaults (optional; component already has these defaults)\n multiple: true,\n searchable: true,\n clearable: true,\n expandAll: false,\n leafOnly: false,\n\n joinControls: true,\n extendBoxToControls: true,\n },\n\n ui: {\n // shared tuning\n size: sharedUi.size,\n density: sharedUi.density,\n\n // shared: options + mapping (no className-related stuff)\n ...sharedUi.optionMapping,\n\n // treeselect-specific: selection mode\n multiple: {\n type: \"boolean\",\n label: \"Multiple\",\n description:\n \"If enabled, multiple nodes can be selected (emits a string array). If disabled, emits a single string.\",\n },\n\n // shared: search UX\n ...sharedUi.searchUx,\n\n searchPlaceholder: {\n type: \"string\",\n label: \"Search placeholder\",\n description:\n \"Placeholder text for the search input within the tree dropdown.\",\n },\n\n emptySearchText: {\n type: \"string\",\n label: \"Empty search text\",\n description: \"Text shown when search returns no matching nodes.\",\n },\n\n // tree-only UX text (not an InputField placeholder)\n emptyLabel: {\n type: \"string\",\n label: \"Empty label\",\n description:\n \"Text shown when there are no options/nodes available.\",\n },\n\n // shared-ish picker toggle (allowed)\n clearable: {\n type: \"boolean\",\n label: \"Clearable\",\n description: \"Allow clearing the current selection.\",\n },\n\n // tree expansion behavior\n expandAll: {\n type: \"boolean\",\n label: \"Expand all\",\n description:\n \"If enabled, expands all nodes by default when the dropdown opens.\",\n },\n\n defaultExpandedValues: {\n type: \"array\",\n label: \"Default expanded values\",\n description:\n \"List of node values to expand initially (useful when not expanding everything).\",\n editable: true,\n item: {\n type: \"string\",\n label: \"Node value\",\n description: \"The node value to expand on load.\",\n },\n },\n\n leafOnly: {\n type: \"boolean\",\n label: \"Leaf only\",\n description: \"If enabled, only leaf nodes can be selected.\",\n },\n\n // shared layout knobs (default-mode only; we keep them since they're booleans)\n joinControls: sharedUi.joinControls,\n extendBoxToControls: sharedUi.extendBoxToControls,\n },\n};\n","// src/react/inputs/registry/entries/multi-select.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const multiSelectDescriptor: InputDescriptor = {\n Component: InputField as any,\n\n defaultProps: {\n variant: \"multi-select\", // MUST\n\n // sensible defaults (optional)\n searchable: true,\n clearable: true,\n autoCap: false,\n\n joinControls: true,\n extendBoxToControls: true,\n },\n\n ui: {\n // shared tuning\n size: sharedUi.size,\n density: sharedUi.density,\n\n // shared: options mapping\n ...sharedUi.optionMapping,\n\n // shared: search ux\n ...sharedUi.searchUx,\n\n // common picker knobs (allowed)\n clearable: {\n type: \"boolean\",\n label: \"Clearable\",\n description: \"Allow clearing all selected values.\",\n },\n\n // multi-select behavior knobs (safe)\n closeOnSelect: {\n type: \"boolean\",\n label: \"Close on select\",\n description:\n \"If enabled, the dropdown closes after selecting an option.\",\n },\n\n maxSelected: {\n type: \"number\",\n label: \"Max selected\",\n description:\n \"Maximum number of selections allowed (leave unset for unlimited).\",\n minimum: 1,\n },\n\n // shared layout knobs\n joinControls: sharedUi.joinControls,\n extendBoxToControls: sharedUi.extendBoxToControls,\n },\n};\n","// src/react/inputs/registry/entries/select.ts\r\nimport { InputField } from \"@timeax/form-palette\";\r\nimport type { InputDescriptor } from \"@/react\";\r\nimport { sharedUi } from \"./shared\";\r\n\r\nexport const selectDescriptor: InputDescriptor = {\r\n Component: InputField as any,\r\n\r\n defaultProps: {\r\n variant: \"select\", // MUST\r\n\r\n // sensible defaults (optional)\r\n searchable: true,\r\n clearable: true,\r\n autoCap: false,\r\n\r\n joinControls: true,\r\n extendBoxToControls: true,\r\n },\r\n\r\n ui: {\r\n // common tuning\r\n size: sharedUi.size,\r\n density: sharedUi.density,\r\n\r\n // options + mapping\r\n ...sharedUi.optionMapping,\r\n\r\n // search UX\r\n ...sharedUi.searchUx,\r\n\r\n // picker basics (allowed)\r\n clearable: {\r\n type: \"boolean\",\r\n label: \"Clearable\",\r\n description: \"Allow clearing the current selection.\",\r\n },\r\n\r\n // layout knobs (allowed)\r\n joinControls: sharedUi.joinControls,\r\n extendBoxToControls: sharedUi.extendBoxToControls,\r\n },\r\n};\r\n","// src/react/inputs/registry/entries/radio.ts\r\nimport { InputField } from \"@timeax/form-palette\";\r\nimport type { InputDescriptor } from \"@/react\";\r\nimport { sharedUi } from \"./shared\";\r\n\r\nexport const radioDescriptor: InputDescriptor = {\r\n Component: InputField as any,\r\n\r\n defaultProps: {\r\n variant: \"radio\", // MUST\r\n autoCap: false,\r\n },\r\n\r\n ui: {\r\n // common tuning (radio supports these in your palette variants)\r\n size: sharedUi.size,\r\n density: sharedUi.density,\r\n\r\n /**\r\n * Options\r\n * Radio supports primitive shorthands + objects, using option* mapping keys.\r\n */\r\n ...sharedUi.optionMapping,\r\n\r\n // small radio-only behavior knobs (safe)\r\n multiple: {\r\n type: \"boolean\",\r\n label: \"Multiple\",\r\n description:\r\n \"If enabled, behaves like a multi-pick radio group (emits a string array). Leave off for classic single-choice radio.\",\r\n },\r\n\r\n // Note: no placeholder (InputField prop), no className props, no render/callback props.\r\n },\r\n};\r\n","// src/react/inputs/registry/entries/checkbox.ts\r\nimport { InputField } from \"@timeax/form-palette\";\r\nimport type { InputDescriptor } from \"@/react\";\r\nimport { sharedUi } from \"./shared\";\r\n\r\nexport const checkboxDescriptor: InputDescriptor = {\r\n Component: InputField as any,\r\n\r\n defaultProps: {\r\n variant: \"checkbox\", // MUST\r\n\r\n single: false,\r\n tristate: false,\r\n layout: \"list\",\r\n columns: 2,\r\n itemGapPx: 8,\r\n size: \"md\",\r\n density: \"comfortable\",\r\n autoCap: false,\r\n },\r\n adapter: {\r\n\r\n },\r\n\r\n ui: {\r\n size: sharedUi.size,\r\n\r\n density: {\r\n type: \"anyOf\",\r\n label: \"Density\",\r\n description: \"Vertical density of each option row.\",\r\n items: [\r\n { type: \"string\", title: \"Compact\", value: \"compact\" },\r\n { type: \"string\", title: \"Comfortable\", value: \"comfortable\" },\r\n { type: \"string\", title: \"Loose\", value: \"loose\" },\r\n ],\r\n },\r\n\r\n // group vs single behavior\r\n single: {\r\n type: \"boolean\",\r\n label: \"Single\",\r\n description:\r\n \"If enabled, behaves like a single checkbox (boolean). Otherwise renders a group (array).\",\r\n },\r\n\r\n tristate: {\r\n type: \"boolean\",\r\n label: \"Tri-state\",\r\n description:\r\n 'Enable tri-state behaviour (supports an internal \"none\" state).',\r\n },\r\n\r\n // layout\r\n layout: {\r\n type: \"anyOf\",\r\n label: \"Layout\",\r\n description: \"Arrange options as a vertical list or grid.\",\r\n items: [\r\n { type: \"string\", title: \"List\", value: \"list\" },\r\n { type: \"string\", title: \"Grid\", value: \"grid\" },\r\n ],\r\n },\r\n\r\n columns: {\r\n type: \"number\",\r\n label: \"Columns\",\r\n description: \"Number of columns when layout is grid.\",\r\n minimum: 1,\r\n },\r\n\r\n itemGapPx: {\r\n type: \"number\",\r\n label: \"Item gap (px)\",\r\n description: \"Gap between option rows/items in pixels.\",\r\n minimum: 0,\r\n },\r\n\r\n autoCap: {\r\n type: \"boolean\",\r\n label: \"Auto capitalise\",\r\n description:\r\n \"Capitalise the first letter of labels (only when label resolves to a string).\",\r\n },\r\n\r\n // options (primitive arrays or object arrays)\r\n options: {\r\n type: \"array\",\r\n label: \"Options\",\r\n description:\r\n \"Checkbox options. Can be primitives (string/number/boolean) or objects (label/value/description/disabled/tristate).\",\r\n editable: true,\r\n item: {\r\n type: \"object\",\r\n label: \"Option\",\r\n description: \"An option item for group mode.\",\r\n editable: true,\r\n fields: {\r\n value: {\r\n type: \"string\",\r\n label: \"Value\",\r\n description: \"Unique option value (string).\",\r\n },\r\n label: {\r\n type: \"string\",\r\n label: \"Label\",\r\n description: \"Display label for the option.\",\r\n },\r\n description: {\r\n type: \"string\",\r\n label: \"Description\",\r\n description: \"Optional helper text under the label.\",\r\n },\r\n disabled: {\r\n type: \"boolean\",\r\n label: \"Disabled\",\r\n description: \"Disable this option.\",\r\n },\r\n tristate: {\r\n type: \"boolean\",\r\n label: \"Tri-state override\",\r\n description:\r\n \"Override tri-state behaviour for this option (if unset, uses variant tristate).\",\r\n },\r\n },\r\n order: [\r\n \"value\",\r\n \"label\",\r\n \"description\",\r\n \"disabled\",\r\n \"tristate\",\r\n ],\r\n } as any,\r\n },\r\n\r\n // mapping keys (for custom item shapes)\r\n optionValue: {\r\n type: \"string\",\r\n label: \"Option value key\",\r\n description:\r\n \"Property name to read the option value from when using custom option objects.\",\r\n },\r\n\r\n optionLabel: {\r\n type: \"string\",\r\n label: \"Option label key\",\r\n description:\r\n \"Property name to read the option label from when using custom option objects.\",\r\n },\r\n\r\n // intentionally excluded:\r\n // - items (alias to options; keeping one is enough for builder)\r\n // - mappers (functions)\r\n // - renderOption (function)\r\n // - singleLabel/singleDescription (ReactNode)\r\n // - all *ClassName props (not allowed)\r\n },\r\n};\r\n","// src/react/inputs/registry/entries/chips.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const chipsDescriptor: InputDescriptor = {\n Component: InputField as any,\n\n defaultProps: {\n variant: \"chips\", // MUST\n\n // sensible defaults (these match the variant defaults)\n addOnEnter: true,\n addOnTab: true,\n addOnBlur: true,\n allowDuplicates: false,\n backspaceRemovesLast: true,\n clearable: false,\n textareaMode: false,\n placement: \"inline\",\n },\n\n ui: {\n // chips \"also supports most ShadcnTextVariantProps\" (size/density/etc.)\n size: sharedUi.size,\n density: sharedUi.density,\n ...sharedUi.padding,\n joinControls: sharedUi.joinControls,\n extendBoxToControls: sharedUi.extendBoxToControls,\n\n // NOTE: placeholder is an InputField prop in your system — exclude it here.\n\n separators: {\n type: \"array\",\n label: \"Separators\",\n description:\n 'Separators used to split raw input into chips (strings only in builder UI). Runtime default: [\",\", \";\"].',\n editable: true,\n item: {\n type: \"string\",\n label: \"Separator\",\n description: 'A string separator (e.g. \",\" or \";\").',\n },\n },\n\n addOnEnter: {\n type: \"boolean\",\n label: \"Add on Enter\",\n description: \"Commit chips when the user presses Enter.\",\n },\n\n addOnTab: {\n type: \"boolean\",\n label: \"Add on Tab\",\n description: \"Commit chips when the user presses Tab.\",\n },\n\n addOnBlur: {\n type: \"boolean\",\n label: \"Add on blur\",\n description: \"Commit chips when the input loses focus.\",\n },\n\n allowDuplicates: {\n type: \"boolean\",\n label: \"Allow duplicates\",\n description: \"If disabled, duplicate chips are ignored.\",\n },\n\n maxChips: {\n type: \"number\",\n label: \"Max chips\",\n description:\n \"Maximum number of chips allowed. Leave unset for unlimited.\",\n minimum: 1,\n },\n\n backspaceRemovesLast: {\n type: \"boolean\",\n label: \"Backspace removes last\",\n description:\n \"If enabled, Backspace on an empty input removes the last chip.\",\n },\n\n clearable: {\n type: \"boolean\",\n label: \"Clearable\",\n description: \"Show a clear-all button.\",\n },\n\n maxVisibleChips: {\n type: \"number\",\n label: \"Max visible chips\",\n description:\n 'Maximum number of chips to render before summarizing the rest as \"+N more\".',\n minimum: 1,\n },\n\n maxChipChars: {\n type: \"number\",\n label: \"Max chip chars\",\n description:\n \"Soft cap for chip display label length (UI-only; value is not truncated).\",\n minimum: 1,\n },\n\n maxChipWidth: {\n type: \"string\",\n label: \"Max chip width\",\n description:\n 'Soft cap for chip label width (CSS value, e.g. \"160px\" or \"12rem\").',\n },\n\n textareaMode: {\n type: \"boolean\",\n label: \"Textarea mode\",\n description:\n \"Use a textarea entry control instead of a single-line input.\",\n },\n\n placement: {\n type: \"anyOf\",\n label: \"Placement\",\n description:\n \"Where chips are rendered relative to the entry control.\",\n items: [\n { type: \"string\", title: \"Inline\", value: \"inline\" },\n { type: \"string\", title: \"Below\", value: \"below\" },\n ],\n },\n },\n};\n","// src/react/inputs/registry/entries/color.ts\r\nimport { InputField } from \"@timeax/form-palette\";\r\nimport type { InputDescriptor } from \"@/react\";\r\nimport { sharedUi } from \"./shared\";\r\n\r\nexport const colorDescriptor: InputDescriptor = {\r\n Component: InputField as any,\r\n\r\n defaultProps: {\r\n variant: \"color\", // MUST\r\n\r\n // sensible defaults (matches variant defaults)\r\n showPreview: true,\r\n showPickerToggle: true,\r\n previewSize: 18,\r\n\r\n // forwarded from text UI\r\n joinControls: true,\r\n extendBoxToControls: true,\r\n },\r\n\r\n ui: {\r\n // color inherits most text UI props (but we still only expose the shared-safe ones)\r\n size: sharedUi.size,\r\n density: sharedUi.density,\r\n ...sharedUi.padding,\r\n\r\n joinControls: sharedUi.joinControls,\r\n extendBoxToControls: sharedUi.extendBoxToControls,\r\n\r\n showPreview: {\r\n type: \"boolean\",\r\n label: \"Show preview\",\r\n description: \"Show the color swatch preview control.\",\r\n },\r\n\r\n showPickerToggle: {\r\n type: \"boolean\",\r\n label: \"Show picker toggle\",\r\n description: \"Show the picker toggle control/icon.\",\r\n },\r\n\r\n previewSize: {\r\n type: \"number\",\r\n label: \"Preview size\",\r\n description: \"Size of the color swatch in pixels.\",\r\n minimum: 8,\r\n maximum: 64,\r\n },\r\n },\r\n};\r\n","// src/react/inputs/registry/entries/date.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const dateDescriptor: InputDescriptor = {\n Component: InputField as any,\n\n defaultProps: {\n variant: \"date\", // MUST\n\n // sensible defaults (matches the variant defaults shown in code)\n mode: \"single\",\n kind: \"date\",\n clearable: true,\n\n // text-ui bits that date supports\n joinControls: true,\n extendBoxToControls: true,\n },\n\n ui: {\n // shared text-like tuning (date reuses ShadcnTextVariantProps minus value/onValue/etc.)\n size: sharedUi.size,\n density: sharedUi.density,\n ...sharedUi.padding,\n joinControls: sharedUi.joinControls,\n extendBoxToControls: sharedUi.extendBoxToControls,\n\n mode: {\n type: \"anyOf\",\n label: \"Mode\",\n description: \"Single date input or a date range picker.\",\n items: [\n { type: \"string\", title: \"Single\", value: \"single\" },\n { type: \"string\", title: \"Range\", value: \"range\" },\n ],\n },\n\n kind: {\n type: \"anyOf\",\n label: \"Kind\",\n description:\n \"Logical temporal kind. Controls default mask + formatting/parsing.\",\n items: [\n { type: \"string\", title: \"Date\", value: \"date\" },\n { type: \"string\", title: \"Date & time\", value: \"datetime\" },\n { type: \"string\", title: \"Time\", value: \"time\" },\n { type: \"string\", title: \"Hour\", value: \"hour\" },\n { type: \"string\", title: \"Month/Year\", value: \"monthYear\" },\n { type: \"string\", title: \"Year\", value: \"year\" },\n ],\n },\n\n clearable: {\n type: \"boolean\",\n label: \"Clearable\",\n description: \"Show a clear control to remove the selected value.\",\n },\n\n showCalendar: {\n type: \"boolean\",\n label: \"Show calendar\",\n description:\n \"Render the calendar popover. Defaults to true for date/datetime, false for time-only kinds.\",\n },\n\n // Formatting / display\n formatSingle: {\n type: \"string\",\n label: \"Single format\",\n description:\n 'Display pattern for single values (e.g. \"yyyy-MM-dd\", \"yyyy-MM-dd HH:mm\", \"HH:mm\").',\n },\n\n // NOTE: DateVariantProps allows formatRange as function too; builder exposes string only.\n formatRange: {\n type: \"string\",\n label: \"Range format\",\n description:\n \"Pattern applied to both ends of the range (string form only).\",\n },\n\n rangeSeparator: {\n type: \"string\",\n label: \"Range separator\",\n description:\n 'Separator between from/to in range display (default \" – \").',\n },\n\n stayOpenOnSelect: {\n type: \"boolean\",\n label: \"Stay open on select\",\n description:\n \"Keep the calendar open after selection (range stays open until both ends are picked).\",\n },\n\n inputMask: {\n type: \"string\",\n label: \"Input mask\",\n description:\n \"Optional explicit mask for typed input. Uses mask tokens: 9=digit, a=letter, *=alphanumeric.\",\n },\n\n // Intentionally excluded (non-builder-safe / non-serializable):\n // - placeholder (ReactNode)\n // - minDate/maxDate (Date objects)\n // - disabledDays (complex Calendar disabled type)\n // - open/onOpenChange (controlled popover)\n },\n};\n","// src/react/inputs/registry/entries/keyvalue.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const keyValueDescriptor: InputDescriptor = {\n Component: InputField as any,\n\n defaultProps: {\n variant: \"keyvalue\", // MUST\n\n min: 0,\n max: Infinity,\n\n // legacy (optional)\n // minVisible: undefined,\n // maxVisible: undefined,\n\n showValue: false,\n\n // text labels (strings are fine; variant accepts ReactNode)\n dialogTitle: \"Edit Item\",\n keyLabel: \"Key\",\n valueLabel: \"Value\",\n submitLabel: \"Save Changes\",\n emptyLabel: \"No items added\",\n },\n\n ui: {\n // keyvalue has its own density union (compact/comfortable/loose)\n size: sharedUi.size,\n\n density: {\n type: \"anyOf\",\n label: \"Density\",\n description: \"Vertical spacing preset for chips and controls.\",\n items: [\n { type: \"string\", title: \"Compact\", value: \"compact\" },\n { type: \"string\", title: \"Comfortable\", value: \"comfortable\" },\n { type: \"string\", title: \"Loose\", value: \"loose\" },\n ],\n },\n\n min: {\n type: \"number\",\n label: \"Min items\",\n description:\n \"Minimum number of entries allowed (prevents deletion below this).\",\n minimum: 0,\n },\n\n max: {\n type: \"number\",\n label: \"Max items\",\n description:\n \"Maximum number of entries allowed (prevents adding above this).\",\n minimum: 0,\n },\n\n // legacy compatibility knobs\n minVisible: {\n type: \"number\",\n label: \"Min visible (legacy)\",\n description:\n \"Legacy prop kept for compatibility; no longer drives visibility.\",\n minimum: 0,\n },\n\n maxVisible: {\n type: \"number\",\n label: \"Max visible (legacy)\",\n description:\n \"Legacy prop kept for compatibility; no longer drives visibility.\",\n minimum: 0,\n },\n\n showValue: {\n type: \"boolean\",\n label: \"Show value inline\",\n description:\n 'If enabled, inline chips show \"key : value\". In the dropdown, values are still available via info.',\n },\n\n dialogTitle: {\n type: \"string\",\n label: \"Dialog title\",\n description: \"Title shown at the top of the edit dialog.\",\n },\n\n keyLabel: {\n type: \"string\",\n label: \"Key label\",\n description: \"Label for the key input in the dialog.\",\n },\n\n valueLabel: {\n type: \"string\",\n label: \"Value label\",\n description: \"Label for the value input in the dialog.\",\n },\n\n submitLabel: {\n type: \"string\",\n label: \"Submit label\",\n description: \"Text for the dialog submit button.\",\n },\n\n emptyLabel: {\n type: \"string\",\n label: \"Empty label\",\n description: \"Text shown when there are no entries.\",\n },\n\n // intentionally excluded:\n // - placeholder (InputField prop; injected by registry helper)\n // - moreLabel (function)\n // - className/chipsClassName/chipClassName\n // - renderChip (render function)\n },\n};\n","// src/react/inputs/registry/entries/editor.ts\r\nimport { InputField } from \"@timeax/form-palette\";\r\nimport type { InputDescriptor } from \"@/react\";\r\nimport { sharedUi } from \"./shared\";\r\n\r\nexport const editorDescriptor: InputDescriptor = {\r\n Component: InputField as any,\r\n\r\n defaultProps: {\r\n variant: \"editor\", // MUST\r\n\r\n height: \"400px\",\r\n previewStyle: \"vertical\",\r\n editType: \"wysiwyg\",\r\n useCommandShortcut: true,\r\n\r\n // stored value format\r\n format: \"html\",\r\n\r\n // toolbar mode (we only support the safe enum values here)\r\n toolbar: \"default\",\r\n\r\n pastePlainText: false,\r\n },\r\n\r\n ui: {\r\n // editor supports size + density from VariantBaseProps\r\n size: sharedUi.size,\r\n density: sharedUi.density,\r\n\r\n height: {\r\n type: \"string\",\r\n label: \"Height\",\r\n description: 'Editor height (CSS value, e.g. \"400px\", \"60vh\").',\r\n },\r\n\r\n previewStyle: {\r\n type: \"anyOf\",\r\n label: \"Preview style\",\r\n description: \"How the preview is displayed (for markdown mode).\",\r\n items: [\r\n { type: \"string\", title: \"Vertical\", value: \"vertical\" },\r\n { type: \"string\", title: \"Tab\", value: \"tab\" },\r\n ],\r\n },\r\n\r\n editType: {\r\n type: \"anyOf\",\r\n label: \"Edit mode\",\r\n description: \"Initial editor mode.\",\r\n items: [\r\n { type: \"string\", title: \"WYSIWYG\", value: \"wysiwyg\" },\r\n { type: \"string\", title: \"Markdown\", value: \"markdown\" },\r\n ],\r\n },\r\n\r\n useCommandShortcut: {\r\n type: \"boolean\",\r\n label: \"Command shortcuts\",\r\n description: \"Enable editor keyboard shortcuts.\",\r\n },\r\n\r\n format: {\r\n type: \"anyOf\",\r\n label: \"Stored format\",\r\n description: \"Which format is stored in the form value.\",\r\n items: [\r\n { type: \"string\", title: \"HTML\", value: \"html\" },\r\n { type: \"string\", title: \"Markdown\", value: \"markdown\" },\r\n ],\r\n },\r\n\r\n toolbar: {\r\n type: \"anyOf\",\r\n label: \"Toolbar\",\r\n description:\r\n 'Toolbar mode. \"default\" uses built-in tools; \"none\" hides tools and mode switch.',\r\n items: [\r\n { type: \"string\", title: \"Default\", value: \"default\" },\r\n { type: \"string\", title: \"None\", value: \"none\" },\r\n ],\r\n },\r\n\r\n pastePlainText: {\r\n type: \"boolean\",\r\n label: \"Paste as plain text\",\r\n description: \"If enabled, paste is inserted as plain text only.\",\r\n },\r\n\r\n // excluded on purpose:\r\n // - placeholder (InputField prop; injected by registry helper)\r\n // - className (not allowed)\r\n // - toolbar as array (ToastToolbarItem[][] not builder-safe)\r\n },\r\n};\r\n","// src/react/inputs/registry/entries/lister.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\nimport type { Ui } from \"@/schema\";\n\nconst listerUi = {\n // ─────────────────────────────────────────────\n // Selection behaviour\n // ─────────────────────────────────────────────\n mode: {\n type: \"anyOf\",\n label: \"Selection mode\",\n description: 'Whether the lister selects one value (\"single\") or many (\"multiple\").',\n items: [\n { type: \"string\", title: \"Single\", value: \"single\" },\n { type: \"string\", title: \"Multiple\", value: \"multiple\" },\n ],\n } satisfies Ui,\n\n confirm: {\n type: \"boolean\",\n label: \"Confirm\",\n description:\n 'When enabled (single-mode only), require confirmation before committing selection.',\n } satisfies Ui,\n\n remoteDebounceMs: {\n type: \"number\",\n label: \"Remote debounce (ms)\",\n description: \"Debounce duration for remote search requests.\",\n minimum: 0,\n } satisfies Ui,\n\n // permissions?: string[] (primitive array)\n permissions: {\n type: \"array\",\n label: \"Permissions\",\n description: \"Optional permission keys passed to the lister provider/open UI.\",\n editable: true,\n item: {\n type: \"string\",\n label: \"Permission\",\n description: \"One permission key.\",\n } satisfies Ui,\n } satisfies Ui,\n\n // ─────────────────────────────────────────────\n // Inline source (when not using a base `def`)\n // ─────────────────────────────────────────────\n endpoint: {\n type: \"string\",\n label: \"Endpoint\",\n description: \"Inline endpoint for fetching options (standalone mode).\",\n } satisfies Ui,\n\n method: {\n type: \"anyOf\",\n label: \"HTTP method\",\n description: \"HTTP method for inline endpoint requests.\",\n items: [\n { type: \"string\", title: \"GET\", value: \"GET\" },\n { type: \"string\", title: \"POST\", value: \"POST\" },\n ],\n } satisfies Ui,\n\n selector: {\n type: \"string\",\n label: \"Selector\",\n description:\n 'Selector key/path for extracting the list from a response (e.g. \"data\").',\n } satisfies Ui,\n\n // ─────────────────────────────────────────────\n // Mapping (ctx-aware in code, but schema-configurable as keys)\n // ─────────────────────────────────────────────\n optionValue: {\n type: \"string\",\n label: \"Option value key\",\n description: \"Key to read the value/id from each raw option object.\",\n } satisfies Ui,\n\n optionLabel: {\n type: \"string\",\n label: \"Option label key\",\n description: \"Key to read the display label from each raw option object.\",\n } satisfies Ui,\n\n optionDescription: {\n type: \"string\",\n label: \"Option description key\",\n description: \"Key to read the description line from each raw option object.\",\n } satisfies Ui,\n\n optionDisabled: {\n type: \"string\",\n label: \"Option disabled key\",\n description: \"Key to determine if an option is disabled.\",\n } satisfies Ui,\n\n optionIcon: {\n type: \"string\",\n label: \"Option icon key\",\n description: \"Key to read an icon value from each raw option object.\",\n } satisfies Ui,\n\n optionGroup: {\n type: \"string\",\n label: \"Option group key\",\n description: \"Key used to group options (if grouping is supported by the open UI).\",\n } satisfies Ui,\n\n // ─────────────────────────────────────────────\n // Search spec / open options (primitive-friendly subset)\n // ─────────────────────────────────────────────\n title: {\n type: \"string\",\n label: \"Title\",\n description: \"Title shown on the open/picker UI.\",\n } satisfies Ui,\n\n searchMode: {\n type: \"string\",\n label: \"Search mode\",\n description: \"Search behaviour/mode for the open UI (provider-defined).\",\n } satisfies Ui,\n\n initialQuery: {\n type: \"string\",\n label: \"Initial query\",\n description: \"Initial query state for the open UI.\",\n } satisfies Ui,\n\n showRefresh: {\n type: \"boolean\",\n label: \"Show refresh\",\n description: \"Show refresh button in the open UI.\",\n } satisfies Ui,\n\n refreshMode: {\n type: \"string\",\n label: \"Refresh mode\",\n description: \"Refresh behaviour/mode (provider-defined).\",\n } satisfies Ui,\n\n // ─────────────────────────────────────────────\n // Trigger display (primitive subset)\n // ─────────────────────────────────────────────\n placeholder: {\n type: \"string\",\n label: \"Placeholder\",\n description: \"Placeholder text shown when no value is selected.\",\n } satisfies Ui,\n\n maxDisplayItems: {\n type: \"number\",\n label: \"Max display items\",\n description:\n \"Maximum number of selected items to render in the closed trigger summary.\",\n minimum: 0,\n } satisfies Ui,\n\n clearable: {\n type: \"boolean\",\n label: \"Clearable\",\n description: \"Allow clearing the current selection.\",\n } satisfies Ui,\n\n // IMPORTANT: trigger style is documented in README as `mode`,\n // but `mode` is already selection mode in the real prop surface.\n triggerMode: {\n type: \"anyOf\",\n label: \"Trigger style\",\n description: 'Trigger style: \"default\" (input-like) or \"button\" (custom trigger).',\n items: [\n { type: \"string\", title: \"Default\", value: \"default\" },\n { type: \"string\", title: \"Button\", value: \"button\" },\n ],\n } satisfies Ui,\n\n // ─────────────────────────────────────────────\n // Shared layout knobs you *do* want exposed\n // ─────────────────────────────────────────────\n joinControls: sharedUi.joinControls,\n extendBoxToControls: sharedUi.extendBoxToControls,\n size: sharedUi.size,\n density: sharedUi.density,\n padding: {\n type: \"object\",\n label: \"Padding\",\n description: \"Padding overrides.\",\n editable: false,\n fields: {\n px: sharedUi.padding.px,\n py: sharedUi.padding.py,\n ps: sharedUi.padding.ps,\n pe: sharedUi.padding.pe,\n pb: sharedUi.padding.pb,\n },\n } satisfies Ui,\n} as const;\n\nexport const listerDescriptor: InputDescriptor = {\n Component: InputField as any,\n defaultProps: { variant: \"lister\" },\n ui: listerUi,\n};","// src/react/inputs/registry/entries/file.ts\nimport { InputField } from \"@timeax/form-palette\";\nimport type { InputDescriptor } from \"@/react\";\nimport { sharedUi } from \"./shared\";\n\nexport const fileDescriptor: InputDescriptor = {\n Component: InputField as any,\n\n defaultProps: {\n variant: \"file\", // MUST\n\n // sensible defaults (optional)\n multiple: false,\n mergeMode: \"append\",\n showDropArea: false,\n showCheckboxes: true,\n custom: false,\n // placeholder exists on the variant, but per your rule we DON'T declare it here\n },\n\n ui: {\n size: sharedUi.size,\n\n // file has its own density union\n density: {\n type: \"anyOf\",\n label: \"Density\",\n description: \"Spacing preset for the trigger + list UI.\",\n items: [\n { type: \"string\", title: \"Compact\", value: \"compact\" },\n { type: \"string\", title: \"Comfortable\", value: \"comfortable\" },\n { type: \"string\", title: \"Loose\", value: \"loose\" },\n ],\n },\n\n multiple: {\n type: \"boolean\",\n label: \"Multiple\",\n description: \"Allow selecting multiple files.\",\n },\n\n accept: {\n type: \"array\",\n label: \"Accepted types\",\n description:\n 'Accepted MIME types / extensions (e.g. \"image/*\", \".png\", \"application/pdf\").',\n editable: true,\n item: {\n type: \"string\",\n label: \"Type\",\n description: \"A MIME type or extension.\",\n },\n },\n\n maxFiles: {\n type: \"number\",\n label: \"Max files\",\n description:\n \"Maximum number of files allowed (leave unset for unlimited).\",\n minimum: 1,\n },\n\n maxTotalSize: {\n type: \"number\",\n label: \"Max total size (bytes)\",\n description:\n \"Maximum total size across all selected files in bytes (leave unset for unlimited).\",\n minimum: 1,\n },\n\n mergeMode: {\n type: \"anyOf\",\n label: \"Merge mode\",\n description:\n 'How new picks are merged into the current selection (\"append\" or \"replace\").',\n items: [\n { type: \"string\", title: \"Append\", value: \"append\" },\n { type: \"string\", title: \"Replace\", value: \"replace\" },\n ],\n },\n\n showDropArea: {\n type: \"boolean\",\n label: \"Show drop area\",\n description: \"Show a drag-and-drop area inside the picker.\",\n },\n\n // these are ReactNode in the variant, but strings are safe + useful in builder\n dropTitle: {\n type: \"string\",\n label: \"Drop title\",\n description: \"Title text shown in the drop area.\",\n },\n\n dropDescription: {\n type: \"string\",\n label: \"Drop description\",\n description: \"Supporting text shown in the drop area.\",\n },\n\n custom: {\n type: \"boolean\",\n label: \"Custom loader\",\n description:\n \"Enable a host-provided custom loader (host must wire customLoader at runtime).\",\n },\n\n showCheckboxes: {\n type: \"boolean\",\n label: \"Show checkboxes\",\n description:\n \"Show selection checkboxes for file rows inside the picker.\",\n },\n\n asRaw: {\n type: \"boolean\",\n label: \"As raw (legacy)\",\n description:\n \"Legacy compatibility flag. The submitted value is still File|string; raw items are available via change detail meta.\",\n },\n\n // intentionally excluded:\n // - placeholder (InputField prop, injected by your registry helper)\n // - dropIcon (ReactNode)\n // - renderDropArea / renderFileItem (functions)\n // - customLoader (function)\n // - formatFileName / formatFileSize (functions)\n // - all *ClassName props (not allowed)\n // - button mode trigger props (ReactNode/functions)\n },\n};\n","// src/react/inputs/registry/entries/index.ts\r\nimport type { InputDescriptor, Registry, Ui } from \"@/react\";\r\n\r\nimport { textDescriptor } from \"./text\";\r\nimport { textareaDescriptor } from \"./textarea\";\r\nimport { phoneDescriptor } from \"./phone\";\r\nimport { toggleGroupDescriptor } from \"./toggle-group\";\r\nimport { numberDescriptor } from \"./number\";\r\nimport { passwordDescriptor } from \"./password\";\r\nimport { sliderDescriptor } from \"./slider\";\r\nimport { toggleDescriptor } from \"./toggle\";\r\nimport { treeSelectDescriptor } from \"./treeselect\";\r\nimport { multiSelectDescriptor } from \"./multiselect\";\r\nimport { selectDescriptor } from \"./select\";\r\nimport { radioDescriptor } from \"./radio\";\r\nimport { checkboxDescriptor } from \"./checkbox\";\r\nimport { chipsDescriptor } from \"./chips\";\r\nimport { colorDescriptor } from \"./color\";\r\nimport { dateDescriptor } from \"./date\";\r\nimport { keyValueDescriptor } from \"./keyvalue\";\r\nimport { editorDescriptor } from \"./editor\";\r\nimport { listerDescriptor } from \"./lister\";\r\nimport { fileDescriptor } from \"./file\";\r\n\r\n/**\r\n * InputField-level UI props (injected for every descriptor at registration time).\r\n * NOTE: keep this list tight—only props that truly belong to InputField itself.\r\n */\r\nconst inputFieldUi: Record<string, Ui> = {\r\n // --- Chrome / helper text (builder-friendly) ---\r\n sublabel: {\r\n type: \"string\",\r\n label: \"Sublabel\",\r\n description:\r\n \"Secondary label text shown near the main label (if supported).\",\r\n },\r\n\r\n description: {\r\n type: \"string\",\r\n label: \"Description\",\r\n description: \"Helper description shown under the label.\",\r\n },\r\n\r\n helpText: {\r\n type: \"string\",\r\n label: \"Help text\",\r\n description: \"Additional helper text shown in the help slot.\",\r\n },\r\n\r\n // --- Placement hints (layout-only; host decides exact behavior) ---\r\n labelPlacement: {\r\n type: \"string\",\r\n label: \"Label placement\",\r\n description: \"Layout hint for where the label is rendered.\",\r\n } as Ui,\r\n\r\n sublabelPlacement: {\r\n type: \"string\",\r\n label: \"Sublabel placement\",\r\n description: \"Layout hint for where the sublabel is rendered.\",\r\n } as Ui,\r\n\r\n descriptionPlacement: {\r\n type: \"string\",\r\n label: \"Description placement\",\r\n description: \"Layout hint for where the description is rendered.\",\r\n } as Ui,\r\n\r\n helpTextPlacement: {\r\n type: \"string\",\r\n label: \"Help text placement\",\r\n description: \"Layout hint for where the help text is rendered.\",\r\n } as Ui,\r\n\r\n tagPlacement: {\r\n type: \"string\",\r\n label: \"Tag placement\",\r\n description: \"Layout hint for where tags are rendered.\",\r\n } as Ui,\r\n\r\n // --- Tags (builder-safe subset; host maps to FieldTag) ---\r\n tags: {\r\n type: \"array\",\r\n label: \"Tags\",\r\n description:\r\n \"Small tag badges shown near the label. Builder-safe subset (label/color/bgColor).\",\r\n editable: true,\r\n item: {\r\n type: \"object\",\r\n label: \"Tag\",\r\n description: \"A label tag.\",\r\n editable: true,\r\n fields: {\r\n label: {\r\n type: \"string\",\r\n label: \"Label\",\r\n description: \"Tag text.\",\r\n },\r\n color: {\r\n type: \"string\",\r\n label: \"Text color\",\r\n description: 'CSS color value (e.g. \"#fff\" or \"rgb(...)\").',\r\n },\r\n bgColor: {\r\n type: \"string\",\r\n label: \"Background color\",\r\n description: 'CSS color value (e.g. \"#111\").',\r\n },\r\n },\r\n order: [\"label\", \"color\", \"bgColor\"],\r\n } as Ui,\r\n } satisfies Ui,\r\n\r\n disabled: {\r\n type: \"boolean\",\r\n label: \"Disabled\",\r\n description: \"Disable user interaction with the field.\",\r\n },\r\n\r\n readOnly: {\r\n type: \"boolean\",\r\n label: \"Read-only\",\r\n description: \"Prevent edits while still allowing focus/selection.\",\r\n },\r\n\r\n // --- Layout flags ---\r\n inline: {\r\n type: \"boolean\",\r\n label: \"Inline\",\r\n description:\r\n \"Render label + input in an inline row layout (if supported).\",\r\n },\r\n\r\n fullWidth: {\r\n type: \"boolean\",\r\n label: \"Full width\",\r\n description:\r\n \"Stretch the field to fill its container width (if supported).\",\r\n },\r\n};\r\n\r\nfunction withInputFieldUi(desc: InputDescriptor): InputDescriptor {\r\n return {\r\n ...desc,\r\n adapter: {\r\n getValue(e: any) {\r\n return e.value;\r\n },\r\n valueProp: \"value\",\r\n changeProp: \"onChange\",\r\n getInputPropsFromField({ field, props }) {\r\n const severityPillClassMap = {\r\n info: \"border-blue-200 bg-blue-50 text-blue-700 ring-1 ring-inset ring-blue-200\",\r\n warning:\r\n \"border-amber-200 bg-amber-50 text-amber-800 ring-1 ring-inset ring-amber-200\",\r\n error: \"border-red-200 bg-red-50 text-red-700 ring-1 ring-inset ring-red-200\",\r\n } as const;\r\n\r\n const pillBaseClassName =\r\n \"inline-flex items-center rounded-full border px-2.5 py-1 text-xs font-medium\";\r\n\r\n const toTagPill = (tag: any) => ({\r\n label: tag.title,\r\n bgColor: tag.color,\r\n className: `${pillBaseClassName} ${severityPillClassMap[tag.severity as keyof typeof severityPillClassMap] ?? severityPillClassMap.info}`,\r\n });\r\n\r\n const matchesNotice = (\r\n target: { id?: unknown; service_id?: unknown },\r\n notice: { id?: unknown },\r\n ) =>\r\n notice.id === target.id ||\r\n (!!target.service_id && target.service_id == notice.id);\r\n\r\n const notices = props.notices ?? [];\r\n\r\n const fieldNotices = notices.filter((notice) =>\r\n matchesNotice(field, notice),\r\n );\r\n\r\n return {\r\n label: field.label,\r\n tags: fieldNotices.map(toTagPill),\r\n required: field.required,\r\n\r\n ...(field.options?.length\r\n ? {\r\n options: field.options.map((item) => {\r\n // @ts-ignore\r\n const optionNotices = notices.filter(\r\n (notice) => matchesNotice(item, notice),\r\n );\r\n\r\n return {\r\n ...item,\r\n tags: optionNotices.map(toTagPill),\r\n };\r\n }),\r\n }\r\n : {}),\r\n };\r\n },\r\n getSelectedOptions(next, currentt, ctx) {\r\n return ((next as any)?.selectedOptions ?? [])?.map(\r\n (item: any) => item.id,\r\n );\r\n },\r\n\r\n isActive(stored, ctx) {\r\n return Boolean(stored);\r\n },\r\n },\r\n ui: {\r\n ...inputFieldUi,\r\n ...(desc.ui ?? {}),\r\n },\r\n };\r\n}\r\n\r\nfunction variantOf(desc: InputDescriptor): string {\r\n const v = (desc.defaultProps as any)?.variant;\r\n if (!v || typeof v !== \"string\") {\r\n throw new Error(\r\n `[inputs] Descriptor is missing defaultProps.variant: ${String(v)}`,\r\n );\r\n }\r\n return v;\r\n}\r\n\r\n/**\r\n * Register all built-in entries.\r\n * - You said \"variant is the only thing necessary\", so we treat kind as a constant.\r\n */\r\nexport function registerEntries(registry: Registry): void {\r\n const entries: InputDescriptor[] = [\r\n textDescriptor,\r\n textareaDescriptor,\r\n phoneDescriptor,\r\n toggleGroupDescriptor,\r\n numberDescriptor,\r\n passwordDescriptor,\r\n sliderDescriptor,\r\n toggleDescriptor,\r\n treeSelectDescriptor,\r\n multiSelectDescriptor,\r\n selectDescriptor,\r\n radioDescriptor,\r\n checkboxDescriptor,\r\n chipsDescriptor,\r\n colorDescriptor,\r\n dateDescriptor,\r\n keyValueDescriptor,\r\n editorDescriptor,\r\n listerDescriptor,\r\n fileDescriptor,\r\n ];\r\n\r\n registry.registerMany(\r\n entries.map((descriptor) => {\r\n const finalDescriptor = withInputFieldUi(descriptor);\r\n const variant = variantOf(finalDescriptor);\r\n\r\n return {\r\n kind: variant,\r\n descriptor: finalDescriptor,\r\n };\r\n }),\r\n );\r\n}\r\n\r\n// re-export entries (optional convenience)\r\nexport {\r\n textDescriptor,\r\n textareaDescriptor,\r\n phoneDescriptor,\r\n toggleGroupDescriptor,\r\n numberDescriptor,\r\n passwordDescriptor,\r\n sliderDescriptor,\r\n toggleDescriptor,\r\n treeSelectDescriptor,\r\n multiSelectDescriptor,\r\n selectDescriptor,\r\n radioDescriptor,\r\n checkboxDescriptor,\r\n chipsDescriptor,\r\n colorDescriptor,\r\n dateDescriptor,\r\n keyValueDescriptor,\r\n editorDescriptor,\r\n listerDescriptor,\r\n fileDescriptor,\r\n};\r\n"],"mappings":"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","names":["_a","_b","cloneDeep","_a","out","_a","isFiniteNumber","getCap","_a","_b","_c","_d","_e","_f","_g","f","isOptionBased","cloneDeep","p","passesRate","uniq","_a","createContext","useContext","useMemo","jsx","Ctx","createContext","useMemo","useContext","React","useMemo","useCallback","useEffect","useMemo","useRef","useState","createContext","useCallback","useContext","useEffect","useMemo","useRef","useState","jsx","createContext","useContext","OrderFlowProvider","useRef","useState","useCallback","useEffect","useMemo","ROOT_TAG_ID","useCallback","useRef","useEffect","useState","useMemo","_a","_b","_c","jsx","str","useMemo","_a","isOptionBased","_b","_c","_d","_e","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","InputField","_a"]}
|